libgo: update to Go 1.13beta1 release
authorIan Lance Taylor <iant@golang.org>
Fri, 6 Sep 2019 18:12:46 +0000 (18:12 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Sep 2019 18:12:46 +0000 (18:12 +0000)
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/193497

From-SVN: r275473

2056 files changed:
gcc/go/gofrontend/MERGE
gcc/testsuite/ChangeLog
gcc/testsuite/go.test/test/fixedbugs/bug369.go
gotools/ChangeLog
gotools/Makefile.am
gotools/Makefile.in
libgo/MERGE
libgo/Makefile.am
libgo/Makefile.in
libgo/VERSION
libgo/check-packages.txt
libgo/configure
libgo/configure.ac
libgo/go/archive/tar/strconv.go
libgo/go/archive/tar/strconv_test.go
libgo/go/archive/zip/struct.go
libgo/go/archive/zip/zip_test.go
libgo/go/bufio/bufio.go
libgo/go/bufio/bufio_test.go
libgo/go/bufio/example_test.go
libgo/go/bufio/scan.go
libgo/go/builtin/builtin.go
libgo/go/bytes/buffer.go
libgo/go/bytes/buffer_test.go
libgo/go/bytes/bytes.go
libgo/go/bytes/bytes_test.go
libgo/go/bytes/example_test.go
libgo/go/bytes/export_test.go
libgo/go/cmd/cgo/doc.go
libgo/go/cmd/cgo/gcc.go
libgo/go/cmd/cgo/godefs.go
libgo/go/cmd/cgo/out.go
libgo/go/cmd/go/alldocs.go
libgo/go/cmd/go/go_test.go
libgo/go/cmd/go/go_windows_test.go
libgo/go/cmd/go/help_test.go
libgo/go/cmd/go/init_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/auth/auth.go [new file with mode: 0644]
libgo/go/cmd/go/internal/auth/netrc.go [new file with mode: 0644]
libgo/go/cmd/go/internal/auth/netrc_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/base/base.go
libgo/go/cmd/go/internal/base/env.go
libgo/go/cmd/go/internal/base/goflags.go
libgo/go/cmd/go/internal/bug/bug.go
libgo/go/cmd/go/internal/cache/cache.go
libgo/go/cmd/go/internal/cache/cache_test.go
libgo/go/cmd/go/internal/cache/default.go
libgo/go/cmd/go/internal/cfg/cfg.go
libgo/go/cmd/go/internal/clean/clean.go
libgo/go/cmd/go/internal/envcmd/env.go
libgo/go/cmd/go/internal/generate/generate.go
libgo/go/cmd/go/internal/generate/generate_test.go
libgo/go/cmd/go/internal/get/get.go
libgo/go/cmd/go/internal/get/path.go
libgo/go/cmd/go/internal/get/vcs.go
libgo/go/cmd/go/internal/get/vcs_test.go
libgo/go/cmd/go/internal/help/help.go
libgo/go/cmd/go/internal/help/helpdoc.go
libgo/go/cmd/go/internal/imports/build.go
libgo/go/cmd/go/internal/imports/scan.go
libgo/go/cmd/go/internal/imports/scan_test.go
libgo/go/cmd/go/internal/imports/tags.go
libgo/go/cmd/go/internal/imports/testdata/android/a_android.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/b_android_arm64.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/c_linux.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/d_linux_arm64.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/e.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/f.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/android/g.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/a_illumos.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/b_illumos_amd64.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/c_solaris.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/d_solaris_amd64.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/e.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/f.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/illumos/g.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/import1/x.go [deleted file]
libgo/go/cmd/go/internal/imports/testdata/import1/x1.go [deleted file]
libgo/go/cmd/go/internal/imports/testdata/import1/x_darwin.go [deleted file]
libgo/go/cmd/go/internal/imports/testdata/import1/x_windows.go [deleted file]
libgo/go/cmd/go/internal/imports/testdata/star/x.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/star/x1.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/star/x_darwin.go [new file with mode: 0644]
libgo/go/cmd/go/internal/imports/testdata/star/x_windows.go [new file with mode: 0644]
libgo/go/cmd/go/internal/list/list.go
libgo/go/cmd/go/internal/load/path.go
libgo/go/cmd/go/internal/load/pkg.go
libgo/go/cmd/go/internal/load/pkg_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/load/test.go
libgo/go/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
libgo/go/cmd/go/internal/lockedfile/mutex.go
libgo/go/cmd/go/internal/modcmd/download.go
libgo/go/cmd/go/internal/modcmd/edit.go
libgo/go/cmd/go/internal/modcmd/graph.go
libgo/go/cmd/go/internal/modcmd/init.go
libgo/go/cmd/go/internal/modcmd/vendor.go
libgo/go/cmd/go/internal/modcmd/verify.go
libgo/go/cmd/go/internal/modconv/convert.go
libgo/go/cmd/go/internal/modconv/convert_test.go
libgo/go/cmd/go/internal/modconv/dep.go
libgo/go/cmd/go/internal/modconv/glide.go
libgo/go/cmd/go/internal/modconv/glock.go
libgo/go/cmd/go/internal/modconv/modconv_test.go
libgo/go/cmd/go/internal/modconv/tsv.go
libgo/go/cmd/go/internal/modconv/vconf.go
libgo/go/cmd/go/internal/modconv/vyml.go
libgo/go/cmd/go/internal/modfetch/bootstrap.go [new file with mode: 0644]
libgo/go/cmd/go/internal/modfetch/cache.go
libgo/go/cmd/go/internal/modfetch/codehost/codehost.go
libgo/go/cmd/go/internal/modfetch/codehost/git.go
libgo/go/cmd/go/internal/modfetch/codehost/vcs.go
libgo/go/cmd/go/internal/modfetch/coderepo.go
libgo/go/cmd/go/internal/modfetch/coderepo_test.go
libgo/go/cmd/go/internal/modfetch/fetch.go
libgo/go/cmd/go/internal/modfetch/key.go [new file with mode: 0644]
libgo/go/cmd/go/internal/modfetch/noweb.go [deleted file]
libgo/go/cmd/go/internal/modfetch/proxy.go
libgo/go/cmd/go/internal/modfetch/pseudo.go
libgo/go/cmd/go/internal/modfetch/pseudo_test.go
libgo/go/cmd/go/internal/modfetch/repo.go
libgo/go/cmd/go/internal/modfetch/sumdb.go [new file with mode: 0644]
libgo/go/cmd/go/internal/modfetch/web.go [deleted file]
libgo/go/cmd/go/internal/modfile/rule.go
libgo/go/cmd/go/internal/modget/get.go
libgo/go/cmd/go/internal/modinfo/info.go
libgo/go/cmd/go/internal/modload/build.go
libgo/go/cmd/go/internal/modload/help.go
libgo/go/cmd/go/internal/modload/import.go
libgo/go/cmd/go/internal/modload/import_test.go
libgo/go/cmd/go/internal/modload/init.go
libgo/go/cmd/go/internal/modload/init_test.go [deleted file]
libgo/go/cmd/go/internal/modload/list.go
libgo/go/cmd/go/internal/modload/load.go
libgo/go/cmd/go/internal/modload/query.go
libgo/go/cmd/go/internal/modload/query_test.go
libgo/go/cmd/go/internal/modload/search.go
libgo/go/cmd/go/internal/module/module.go
libgo/go/cmd/go/internal/module/module_test.go
libgo/go/cmd/go/internal/mvs/mvs.go
libgo/go/cmd/go/internal/mvs/mvs_test.go
libgo/go/cmd/go/internal/note/example_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/note/note.go [new file with mode: 0644]
libgo/go/cmd/go/internal/note/note_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/par/work.go
libgo/go/cmd/go/internal/renameio/renameio.go
libgo/go/cmd/go/internal/renameio/renameio_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/renameio/umask_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/robustio/robustio.go [new file with mode: 0644]
libgo/go/cmd/go/internal/robustio/robustio_other.go [new file with mode: 0644]
libgo/go/cmd/go/internal/robustio/robustio_windows.go [new file with mode: 0644]
libgo/go/cmd/go/internal/run/run.go
libgo/go/cmd/go/internal/search/search.go
libgo/go/cmd/go/internal/str/path.go
libgo/go/cmd/go/internal/sumweb/cache.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/client.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/client_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/encode.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/encode_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/server.go [new file with mode: 0644]
libgo/go/cmd/go/internal/sumweb/test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/test/test.go
libgo/go/cmd/go/internal/test/testflag.go
libgo/go/cmd/go/internal/tlog/ct_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tlog/note.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tlog/note_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tlog/tile.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tlog/tlog.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tlog/tlog_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/tool/tool.go
libgo/go/cmd/go/internal/version/exe.go [new file with mode: 0644]
libgo/go/cmd/go/internal/version/version.go
libgo/go/cmd/go/internal/vet/vet.go
libgo/go/cmd/go/internal/web/api.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/bootstrap.go
libgo/go/cmd/go/internal/web/file_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/http.go
libgo/go/cmd/go/internal/web/security.go [deleted file]
libgo/go/cmd/go/internal/web/url.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/url_other.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/url_other_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/url_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/url_windows.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web/url_windows_test.go [new file with mode: 0644]
libgo/go/cmd/go/internal/web2/web.go [deleted file]
libgo/go/cmd/go/internal/web2/web_test.go [deleted file]
libgo/go/cmd/go/internal/webtest/test.go [deleted file]
libgo/go/cmd/go/internal/work/action.go
libgo/go/cmd/go/internal/work/build.go
libgo/go/cmd/go/internal/work/build_test.go
libgo/go/cmd/go/internal/work/buildid.go
libgo/go/cmd/go/internal/work/exec.go
libgo/go/cmd/go/internal/work/gc.go
libgo/go/cmd/go/internal/work/gccgo.go
libgo/go/cmd/go/internal/work/init.go
libgo/go/cmd/go/internal/work/security.go
libgo/go/cmd/go/internal/work/security_test.go
libgo/go/cmd/go/main.go
libgo/go/cmd/go/note_test.go
libgo/go/cmd/go/proxy_test.go
libgo/go/cmd/go/script_test.go
libgo/go/cmd/go/testdata/addmod.go
libgo/go/cmd/go/testdata/flag_test.go
libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_invalidpath_v1_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_nest_sub_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_nest_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_nest_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_newcycle_b_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_notags_v0.0.0-20190507143103-cc8cbe209b64.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_printversion_v0.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_printversion_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.0.0-20190430073000-30950c05d534.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.1-0.20190429073117-b5426c86b553.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/example.com_version_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.0.0-20190619020302-197a620e0c9a.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.0.20190619023908-3da23a9deb9e.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/mod/rsc.io_badzip_v1.0.0.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/README
libgo/go/cmd/go/testdata/script/binary_only.txt [deleted file]
libgo/go/cmd/go/testdata/script/bug.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_GOTMPDIR.txt
libgo/go/cmd/go/testdata/script/build_acl_windows.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_cache_compile.txt
libgo/go/cmd/go/testdata/script/build_cache_gomips.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_cache_link.txt
libgo/go/cmd/go/testdata/script/build_cache_output.txt
libgo/go/cmd/go/testdata/script/build_cache_trimpath.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_multi_main.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_nocache.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_relative_pkgdir.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_relative_tmpdir.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_runtime_gcflags.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/build_trimpath.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/cache_unix.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/cgo_syso_issue29253.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/clean_testcache.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/cover_atomic_pkgall.txt
libgo/go/cmd/go/testdata/script/cover_pkgall_runtime.txt
libgo/go/cmd/go/testdata/script/cpu_profile_twice.txt
libgo/go/cmd/go/testdata/script/env_write.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/fileline.txt
libgo/go/cmd/go/testdata/script/gcflags_patterns.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_404_meta.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_brace.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_dotfiles.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_insecure_redirect.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_tilde.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_unicode.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/get_with_git_trace.txt
libgo/go/cmd/go/testdata/script/goflags.txt
libgo/go/cmd/go/testdata/script/gopath_std_vendor.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/help.txt
libgo/go/cmd/go/testdata/script/install_cleans_build.txt
libgo/go/cmd/go/testdata/script/install_cmd_gobin.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/install_cross_gobin.txt
libgo/go/cmd/go/testdata/script/install_rebuild_gopath.txt
libgo/go/cmd/go/testdata/script/install_rebuild_removed.txt
libgo/go/cmd/go/testdata/script/linkname.txt
libgo/go/cmd/go/testdata/script/list_bad_import.txt
libgo/go/cmd/go/testdata/script/list_compiled_imports.txt
libgo/go/cmd/go/testdata/script/list_find.txt
libgo/go/cmd/go/testdata/script/list_importmap.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/list_std.txt
libgo/go/cmd/go/testdata/script/list_tags.txt
libgo/go/cmd/go/testdata/script/list_test_e.txt
libgo/go/cmd/go/testdata/script/list_test_err.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/list_test_imports.txt
libgo/go/cmd/go/testdata/script/list_test_non_go_files.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_alt_goroot.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_auth.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_build_tags.txt
libgo/go/cmd/go/testdata/script/mod_build_versioned.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_clean_cache.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_concurrent.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_convert_dep.txt
libgo/go/cmd/go/testdata/script/mod_convert_git.txt
libgo/go/cmd/go/testdata/script/mod_convert_glide.txt
libgo/go/cmd/go/testdata/script/mod_convert_glockfile.txt
libgo/go/cmd/go/testdata/script/mod_convert_godeps.txt
libgo/go/cmd/go/testdata/script/mod_convert_tsv.txt
libgo/go/cmd/go/testdata/script/mod_convert_vendor_conf.txt
libgo/go/cmd/go/testdata/script/mod_convert_vendor_json.txt
libgo/go/cmd/go/testdata/script/mod_convert_vendor_manifest.txt
libgo/go/cmd/go/testdata/script/mod_convert_vendor_yml.txt
libgo/go/cmd/go/testdata/script/mod_dir.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_doc.txt
libgo/go/cmd/go/testdata/script/mod_download.txt
libgo/go/cmd/go/testdata/script/mod_download_hash.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_edit.txt
libgo/go/cmd/go/testdata/script/mod_edit_go.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_enabled.txt
libgo/go/cmd/go/testdata/script/mod_file_proxy.txt
libgo/go/cmd/go/testdata/script/mod_find.txt
libgo/go/cmd/go/testdata/script/mod_get_cmd.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_commit.txt
libgo/go/cmd/go/testdata/script/mod_get_downgrade.txt
libgo/go/cmd/go/testdata/script/mod_get_hash.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_indirect.txt
libgo/go/cmd/go/testdata/script/mod_get_latest_pseudo.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_local.txt
libgo/go/cmd/go/testdata/script/mod_get_main.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_moved.txt
libgo/go/cmd/go/testdata/script/mod_get_newcycle.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_patterns.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_private_vcs.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_pseudo.txt
libgo/go/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_pseudo_prefix.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_svn.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_tags.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_test.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_upgrade.txt
libgo/go/cmd/go/testdata/script/mod_get_upgrade_pseudo.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_get_warning.txt [deleted file]
libgo/go/cmd/go/testdata/script/mod_getmode_vendor.txt
libgo/go/cmd/go/testdata/script/mod_git_export_subst.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_gobuild_import.txt
libgo/go/cmd/go/testdata/script/mod_gonoproxy.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_gopkg_unstable.txt
libgo/go/cmd/go/testdata/script/mod_help.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_import_v1suffix.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_init_dep.txt
libgo/go/cmd/go/testdata/script/mod_init_empty.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_init_glide.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_init_path.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_internal.txt
libgo/go/cmd/go/testdata/script/mod_invalid_version.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_list.txt
libgo/go/cmd/go/testdata/script/mod_list_dir.txt
libgo/go/cmd/go/testdata/script/mod_list_pseudo.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_list_replace_dir.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_list_std.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_list_test.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_list_upgrade_pseudo.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_load_badchain.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_load_badzip.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_missingpkg_prerelease.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_modinfo.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_off.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_off_init.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_outside.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_patterns.txt
libgo/go/cmd/go/testdata/script/mod_patterns_vendor.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_proxy_https.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_proxy_list.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_pseudo_cache.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_query.txt
libgo/go/cmd/go/testdata/script/mod_query_empty.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_query_exclude.txt
libgo/go/cmd/go/testdata/script/mod_readonly.txt
libgo/go/cmd/go/testdata/script/mod_replace.txt
libgo/go/cmd/go/testdata/script/mod_replace_import.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_run_internal.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_run_path.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_std_vendor.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_string_alias.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sum_replaced.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sumdb.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sumdb_cache.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sumdb_file_path.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sumdb_golang.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_sumdb_proxy.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_symlink.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_test.txt
libgo/go/cmd/go/testdata/script/mod_test_files.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_tidy_replace.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_tidy_sum.txt
libgo/go/cmd/go/testdata/script/mod_upgrade_patch.txt
libgo/go/cmd/go/testdata/script/mod_vcs_missing.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_vendor.txt
libgo/go/cmd/go/testdata/script/mod_vendor_build.txt
libgo/go/cmd/go/testdata/script/mod_vendor_replace.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/mod_verify.txt
libgo/go/cmd/go/testdata/script/mod_why.txt
libgo/go/cmd/go/testdata/script/pattern_syntax_error.txt
libgo/go/cmd/go/testdata/script/prevent_sys_unix_import.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/run_hello.txt
libgo/go/cmd/go/testdata/script/run_set_executable_name.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/run_wildcard.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/script_wait.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/std_vendor.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/sum_readonly.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/test_badtest.txt
libgo/go/cmd/go/testdata/script/test_compile_binary.txt
libgo/go/cmd/go/testdata/script/test_devnull.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/test_generated_main.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/test_init.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/test_status.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/test_timeout.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/vendor_complex.txt
libgo/go/cmd/go/testdata/script/version.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/vet_asm.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/script/vet_deps.txt [new file with mode: 0644]
libgo/go/cmd/go/testdata/testcover/pkg4/a.go [new file with mode: 0644]
libgo/go/cmd/go/testdata/testcover/pkg4/a_test.go [new file with mode: 0644]
libgo/go/cmd/go/testdata/vendormod.txt
libgo/go/cmd/go/vendor_test.go
libgo/go/cmd/gofmt/gofmt.go
libgo/go/cmd/internal/objabi/funcdata.go
libgo/go/cmd/internal/objabi/head.go
libgo/go/cmd/internal/objabi/line.go
libgo/go/cmd/internal/objabi/line_test.go [new file with mode: 0644]
libgo/go/cmd/internal/objabi/reloctype.go
libgo/go/cmd/internal/objabi/reloctype_string.go
libgo/go/cmd/internal/objabi/typekind.go
libgo/go/cmd/internal/objabi/util.go
libgo/go/cmd/internal/sys/supported.go
libgo/go/cmd/vet/all/main.go [deleted file]
libgo/go/cmd/vet/main.go
libgo/go/cmd/vet/testdata/asm/asm.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/assign/assign.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/atomic/atomic.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/bool/bool.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/buildtag/buildtag.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/cgo/cgo.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/composite/composite.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/copylock/copylock.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/deadcode/deadcode.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/httpresponse/httpresponse.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/lostcancel/lostcancel.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/method/method.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/nilfunc/nilfunc.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/print/print.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/rangeloop/rangeloop.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/shift/shift.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/src/asm/asm.go [deleted file]
libgo/go/cmd/vet/testdata/src/assign/assign.go [deleted file]
libgo/go/cmd/vet/testdata/src/atomic/atomic.go [deleted file]
libgo/go/cmd/vet/testdata/src/bool/bool.go [deleted file]
libgo/go/cmd/vet/testdata/src/buildtag/buildtag.go [deleted file]
libgo/go/cmd/vet/testdata/src/cgo/cgo.go [deleted file]
libgo/go/cmd/vet/testdata/src/composite/composite.go [deleted file]
libgo/go/cmd/vet/testdata/src/copylock/copylock.go [deleted file]
libgo/go/cmd/vet/testdata/src/deadcode/deadcode.go [deleted file]
libgo/go/cmd/vet/testdata/src/httpresponse/httpresponse.go [deleted file]
libgo/go/cmd/vet/testdata/src/lostcancel/lostcancel.go [deleted file]
libgo/go/cmd/vet/testdata/src/method/method.go [deleted file]
libgo/go/cmd/vet/testdata/src/nilfunc/nilfunc.go [deleted file]
libgo/go/cmd/vet/testdata/src/print/print.go [deleted file]
libgo/go/cmd/vet/testdata/src/rangeloop/rangeloop.go [deleted file]
libgo/go/cmd/vet/testdata/src/shift/shift.go [deleted file]
libgo/go/cmd/vet/testdata/src/structtag/structtag.go [deleted file]
libgo/go/cmd/vet/testdata/src/tagtest/file1.go [deleted file]
libgo/go/cmd/vet/testdata/src/tagtest/file2.go [deleted file]
libgo/go/cmd/vet/testdata/src/testingpkg/tests.go [deleted file]
libgo/go/cmd/vet/testdata/src/testingpkg/tests_test.go [deleted file]
libgo/go/cmd/vet/testdata/src/unmarshal/unmarshal.go [deleted file]
libgo/go/cmd/vet/testdata/src/unsafeptr/unsafeptr.go [deleted file]
libgo/go/cmd/vet/testdata/src/unused/unused.go [deleted file]
libgo/go/cmd/vet/testdata/structtag/structtag.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/tagtest/file1.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/tagtest/file2.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/testingpkg/tests.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/testingpkg/tests_test.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/unmarshal/unmarshal.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/unsafeptr/unsafeptr.go [new file with mode: 0644]
libgo/go/cmd/vet/testdata/unused/unused.go [new file with mode: 0644]
libgo/go/cmd/vet/vet_test.go
libgo/go/compress/flate/deflate_test.go
libgo/go/compress/flate/huffman_bit_writer.go
libgo/go/compress/gzip/gunzip.go
libgo/go/compress/gzip/gzip_test.go
libgo/go/container/ring/ring_test.go
libgo/go/context/context.go
libgo/go/context/context_test.go
libgo/go/context/example_test.go
libgo/go/crypto/cipher/cfb_test.go
libgo/go/crypto/cipher/xor_test.go
libgo/go/crypto/des/block.go
libgo/go/crypto/ecdsa/ecdsa.go
libgo/go/crypto/ecdsa/ecdsa_noasm.go [new file with mode: 0644]
libgo/go/crypto/ecdsa/ecdsa_s390x.go [new file with mode: 0644]
libgo/go/crypto/ecdsa/ecdsa_s390x_test.go [new file with mode: 0644]
libgo/go/crypto/ed25519/ed25519.go [new file with mode: 0644]
libgo/go/crypto/ed25519/ed25519_test.go [new file with mode: 0644]
libgo/go/crypto/ed25519/internal/edwards25519/const.go [new file with mode: 0644]
libgo/go/crypto/ed25519/internal/edwards25519/edwards25519.go [new file with mode: 0644]
libgo/go/crypto/ed25519/testdata/sign.input.gz [new file with mode: 0644]
libgo/go/crypto/elliptic/fuzz_test.go
libgo/go/crypto/elliptic/p256_s390x.go
libgo/go/crypto/md5/md5_test.go
libgo/go/crypto/rand/rand_js.go
libgo/go/crypto/rand/util_test.go
libgo/go/crypto/rsa/pkcs1v15_test.go
libgo/go/crypto/sha1/sha1.go
libgo/go/crypto/sha1/sha1_test.go
libgo/go/crypto/sha1/sha1block.go
libgo/go/crypto/sha256/sha256.go
libgo/go/crypto/sha256/sha256_test.go
libgo/go/crypto/sha256/sha256block.go
libgo/go/crypto/sha512/sha512.go
libgo/go/crypto/sha512/sha512_test.go
libgo/go/crypto/sha512/sha512block.go
libgo/go/crypto/tls/auth.go
libgo/go/crypto/tls/auth_test.go
libgo/go/crypto/tls/cipher_suites.go
libgo/go/crypto/tls/common.go
libgo/go/crypto/tls/conn.go
libgo/go/crypto/tls/generate_cert.go
libgo/go/crypto/tls/handshake_client.go
libgo/go/crypto/tls/handshake_client_test.go
libgo/go/crypto/tls/handshake_client_tls13.go
libgo/go/crypto/tls/handshake_messages.go
libgo/go/crypto/tls/handshake_server.go
libgo/go/crypto/tls/handshake_server_test.go
libgo/go/crypto/tls/handshake_server_tls13.go
libgo/go/crypto/tls/handshake_test.go
libgo/go/crypto/tls/key_agreement.go
libgo/go/crypto/tls/key_schedule.go
libgo/go/crypto/tls/prf.go
libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv10-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv10-ExportKeyingMaterial
libgo/go/crypto/tls/testdata/Client-TLSv10-RSA-RC4
libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv11-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv11-RSA-RC4
libgo/go/crypto/tls/testdata/Client-TLSv12-AES128-GCM-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv12-AES128-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv12-AES256-GCM-SHA384
libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled [deleted file]
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled-512 [deleted file]
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPKCS1v15
libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPSS
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES128-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-CHACHA20-POLY1305
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES128-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-CHACHA20-POLY1305
libgo/go/crypto/tls/testdata/Client-TLSv12-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv12-ExportKeyingMaterial
libgo/go/crypto/tls/testdata/Client-TLSv12-P256-ECDHE
libgo/go/crypto/tls/testdata/Client-TLSv12-RSA-RC4
libgo/go/crypto/tls/testdata/Client-TLSv12-RenegotiateOnce
libgo/go/crypto/tls/testdata/Client-TLSv12-RenegotiateTwice
libgo/go/crypto/tls/testdata/Client-TLSv12-RenegotiateTwiceRejected
libgo/go/crypto/tls/testdata/Client-TLSv12-RenegotiationRejected
libgo/go/crypto/tls/testdata/Client-TLSv12-SCT
libgo/go/crypto/tls/testdata/Client-TLSv12-X25519-ECDHE
libgo/go/crypto/tls/testdata/Client-TLSv13-AES128-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv13-AES256-SHA384
libgo/go/crypto/tls/testdata/Client-TLSv13-ALPN
libgo/go/crypto/tls/testdata/Client-TLSv13-CHACHA20-SHA256
libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled [deleted file]
libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-RSAPSS
libgo/go/crypto/tls/testdata/Client-TLSv13-ECDSA
libgo/go/crypto/tls/testdata/Client-TLSv13-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Client-TLSv13-ExportKeyingMaterial
libgo/go/crypto/tls/testdata/Client-TLSv13-HelloRetryRequest
libgo/go/crypto/tls/testdata/Client-TLSv13-KeyUpdate
libgo/go/crypto/tls/testdata/Client-TLSv13-P256-ECDHE
libgo/go/crypto/tls/testdata/Client-TLSv13-X25519-ECDHE
libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN
libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN-NoMatch
libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceECDSA
libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceRSA
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled [deleted file]
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required [deleted file]
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndPKCS1v15Given
libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
libgo/go/crypto/tls/testdata/Server-TLSv12-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Server-TLSv12-ExportKeyingMaterial
libgo/go/crypto/tls/testdata/Server-TLSv12-P256
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-3DES
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled [deleted file]
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required [deleted file]
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RC4
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RSAPKCS1v15
libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RSAPSS
libgo/go/crypto/tls/testdata/Server-TLSv12-SNI
libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
libgo/go/crypto/tls/testdata/Server-TLSv12-X25519
libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndECDSAGiven
libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven
libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled [deleted file]
libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedNotGiven
libgo/go/crypto/tls/testdata/Server-TLSv13-Ed25519 [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled [deleted file]
libgo/go/crypto/tls/ticket.go
libgo/go/crypto/tls/tls.go
libgo/go/crypto/tls/tls_test.go
libgo/go/crypto/x509/name_constraints_test.go
libgo/go/crypto/x509/pem_decrypt_test.go
libgo/go/crypto/x509/pkcs1.go
libgo/go/crypto/x509/pkcs8.go
libgo/go/crypto/x509/pkcs8_test.go
libgo/go/crypto/x509/root_cgo_darwin.go
libgo/go/crypto/x509/root_darwin.go
libgo/go/crypto/x509/root_linux.go
libgo/go/crypto/x509/root_windows.go
libgo/go/crypto/x509/sec1.go
libgo/go/crypto/x509/sec1_test.go
libgo/go/crypto/x509/verify.go
libgo/go/crypto/x509/x509.go
libgo/go/crypto/x509/x509_test.go
libgo/go/crypto/x509/x509_test_import.go
libgo/go/database/sql/convert.go
libgo/go/database/sql/convert_test.go
libgo/go/database/sql/driver/driver.go
libgo/go/database/sql/driver/types.go
libgo/go/database/sql/driver/types_test.go
libgo/go/database/sql/fakedb_test.go
libgo/go/database/sql/sql.go
libgo/go/database/sql/sql_test.go
libgo/go/debug/dwarf/testdata/cppunsuptypes.cc [new file with mode: 0644]
libgo/go/debug/dwarf/testdata/cppunsuptypes.elf [new file with mode: 0644]
libgo/go/debug/dwarf/type.go
libgo/go/debug/dwarf/type_test.go
libgo/go/debug/elf/file.go
libgo/go/debug/elf/file_test.go
libgo/go/debug/gosym/pclntab.go
libgo/go/debug/gosym/pclntab_test.go
libgo/go/debug/gosym/symtab.go
libgo/go/debug/gosym/symtab_test.go
libgo/go/debug/macho/file_test.go
libgo/go/debug/macho/macho.go
libgo/go/debug/pe/file.go
libgo/go/debug/pe/file_test.go
libgo/go/encoding/base32/base32.go
libgo/go/encoding/base32/base32_test.go
libgo/go/encoding/base64/base64.go
libgo/go/encoding/base64/base64_test.go
libgo/go/encoding/csv/fuzz.go [new file with mode: 0644]
libgo/go/encoding/csv/reader.go
libgo/go/encoding/csv/writer.go
libgo/go/encoding/gob/codec_test.go
libgo/go/encoding/gob/decgen.go
libgo/go/encoding/gob/doc.go
libgo/go/encoding/gob/encgen.go
libgo/go/encoding/gob/encode.go
libgo/go/encoding/hex/hex.go
libgo/go/encoding/hex/hex_test.go
libgo/go/encoding/json/bench_test.go
libgo/go/encoding/json/decode.go
libgo/go/encoding/json/decode_test.go
libgo/go/encoding/json/encode.go
libgo/go/encoding/json/encode_test.go
libgo/go/encoding/json/fuzz.go [new file with mode: 0644]
libgo/go/encoding/json/indent.go
libgo/go/encoding/json/stream.go
libgo/go/encoding/json/stream_test.go
libgo/go/encoding/pem/pem.go
libgo/go/encoding/pem/pem_test.go
libgo/go/errors/wrap.go [new file with mode: 0644]
libgo/go/errors/wrap_test.go [new file with mode: 0644]
libgo/go/expvar/expvar.go
libgo/go/expvar/expvar_test.go
libgo/go/flag/flag.go
libgo/go/fmt/doc.go
libgo/go/fmt/errors.go [new file with mode: 0644]
libgo/go/fmt/errors_test.go [new file with mode: 0644]
libgo/go/fmt/example_test.go
libgo/go/fmt/fmt_test.go
libgo/go/fmt/format.go
libgo/go/fmt/print.go
libgo/go/fmt/scan.go
libgo/go/fmt/scan_test.go
libgo/go/go/ast/ast.go
libgo/go/go/ast/import.go
libgo/go/go/build/build.go
libgo/go/go/build/build_test.go
libgo/go/go/build/deps_test.go
libgo/go/go/build/doc.go
libgo/go/go/build/syslist.go
libgo/go/go/constant/example_test.go
libgo/go/go/constant/value.go
libgo/go/go/constant/value_test.go
libgo/go/go/doc/comment.go
libgo/go/go/doc/comment_test.go
libgo/go/go/doc/example.go
libgo/go/go/doc/exports.go
libgo/go/go/doc/headscan.go
libgo/go/go/doc/lazyre.go [deleted file]
libgo/go/go/doc/reader.go
libgo/go/go/doc/testdata/issue10858.0.golden [new file with mode: 0644]
libgo/go/go/doc/testdata/issue10858.1.golden [new file with mode: 0644]
libgo/go/go/doc/testdata/issue10858.2.golden [new file with mode: 0644]
libgo/go/go/doc/testdata/issue10858.go [new file with mode: 0644]
libgo/go/go/importer/importer.go
libgo/go/go/internal/gccgoimporter/importer_test.go
libgo/go/go/internal/gccgoimporter/parser.go
libgo/go/go/internal/gccgoimporter/testdata/issue30628.go [new file with mode: 0644]
libgo/go/go/internal/gccgoimporter/testdata/issue30628.gox [new file with mode: 0644]
libgo/go/go/internal/gccgoimporter/testdata/issue31540.go [new file with mode: 0644]
libgo/go/go/internal/gccgoimporter/testdata/issue31540.gox [new file with mode: 0644]
libgo/go/go/internal/gcimporter/bimport.go
libgo/go/go/internal/gcimporter/testdata/exports.go
libgo/go/go/internal/srcimporter/srcimporter_test.go
libgo/go/go/parser/parser.go
libgo/go/go/printer/nodes.go
libgo/go/go/printer/printer_test.go
libgo/go/go/scanner/scanner.go
libgo/go/go/scanner/scanner_test.go
libgo/go/go/token/token.go
libgo/go/go/token/token_test.go [new file with mode: 0644]
libgo/go/go/types/call.go
libgo/go/go/types/check_test.go
libgo/go/go/types/eval.go
libgo/go/go/types/eval_test.go
libgo/go/go/types/expr.go
libgo/go/go/types/gccgosizes.go [new file with mode: 0644]
libgo/go/go/types/object.go
libgo/go/go/types/resolver.go
libgo/go/go/types/stdlib_test.go
libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/cryptobyte/asn1.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/cryptobyte/asn1/asn1.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/cryptobyte/builder.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/cryptobyte/string.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/curve25519/curve25519.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/curve25519/doc.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/curve25519/mont25519_amd64.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/hkdf/hkdf.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/chacha_arm64.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/chacha_generic.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/chacha_noasm.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/chacha_s390x.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/chacha20/xor.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/subtle/aliasing.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/internal/subtle/aliasing_appengine.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/mac_noasm.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/poly1305.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_amd64.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_arm.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_generic.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_noasm.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_ppc64le.go [new file with mode: 0644]
libgo/go/golang.org/x/crypto/poly1305/sum_s390x.go [new file with mode: 0644]
libgo/go/golang.org/x/net/dns/dnsmessage/message.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http/httpguts/guts.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http/httpguts/httplex.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http/httpproxy/proxy.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http2/hpack/encode.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http2/hpack/hpack.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http2/hpack/huffman.go [new file with mode: 0644]
libgo/go/golang.org/x/net/http2/hpack/tables.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/idna10.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/idna9.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/punycode.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/tables10.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/tables11.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/tables9.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/trie.go [new file with mode: 0644]
libgo/go/golang.org/x/net/idna/trieval.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/address.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/binary.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/lif.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/link.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/sys.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/syscall.go [new file with mode: 0644]
libgo/go/golang.org/x/net/lif/zsys_solaris_amd64.go [new file with mode: 0644]
libgo/go/golang.org/x/net/nettest/conntest.go [new file with mode: 0644]
libgo/go/golang.org/x/net/nettest/nettest.go [new file with mode: 0644]
libgo/go/golang.org/x/net/nettest/nettest_stub.go [new file with mode: 0644]
libgo/go/golang.org/x/net/nettest/nettest_unix.go [new file with mode: 0644]
libgo/go/golang.org/x/net/nettest/nettest_windows.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/address.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/binary.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface_announce.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface_classic.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface_freebsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface_multicast.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/interface_openbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/message.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/route.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/route_classic.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/route_openbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys_darwin.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys_dragonfly.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys_freebsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys_netbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/sys_openbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/syscall.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/syscall_go1_11_darwin.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/syscall_go1_12_darwin.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_darwin.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_dragonfly.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_freebsd_386.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_freebsd_amd64.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_freebsd_arm.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_freebsd_arm64.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_netbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/net/route/zsys_openbsd.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/byteorder.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_aix_ppc64.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_arm.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_gc_s390x.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_gc_x86.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_gccgo.c [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_gccgo.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_gccgo_s390x.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_linux.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_linux_arm64.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_linux_ppc64x.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_linux_s390x.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_mips64x.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_mipsx.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_other_arm64.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_wasm.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/cpu_x86.go [new file with mode: 0644]
libgo/go/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go [new file with mode: 0644]
libgo/go/golang.org/x/text/secure/bidirule/bidirule.go [new file with mode: 0644]
libgo/go/golang.org/x/text/secure/bidirule/bidirule10.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/secure/bidirule/bidirule9.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/transform/transform.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/bidi.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/bracket.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/core.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/prop.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/tables10.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/tables11.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/tables9.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/bidi/trieval.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/composition.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/forminfo.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/input.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/iter.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/normalize.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/readwriter.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/tables10.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/tables11.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/tables9.0.0.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/transform.go [new file with mode: 0644]
libgo/go/golang.org/x/text/unicode/norm/trie.go [new file with mode: 0644]
libgo/go/golang.org/x/tools/go/analysis/analysis.go
libgo/go/golang.org/x/tools/go/analysis/doc.go
libgo/go/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go
libgo/go/golang.org/x/tools/go/analysis/internal/analysisflags/help.go
libgo/go/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go [deleted file]
libgo/go/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
libgo/go/golang.org/x/tools/go/analysis/passes/bools/bools.go
libgo/go/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go
libgo/go/golang.org/x/tools/go/analysis/passes/composite/composite.go
libgo/go/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go [new file with mode: 0644]
libgo/go/golang.org/x/tools/go/analysis/passes/inspect/inspect.go
libgo/go/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go
libgo/go/golang.org/x/tools/go/analysis/passes/printf/printf.go
libgo/go/golang.org/x/tools/go/analysis/passes/printf/types.go
libgo/go/golang.org/x/tools/go/analysis/passes/shift/shift.go
libgo/go/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go
libgo/go/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
libgo/go/golang.org/x/tools/go/analysis/passes/tests/tests.go
libgo/go/golang.org/x/tools/go/analysis/passes/unmarshal/unmarshal.go
libgo/go/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
libgo/go/golang.org/x/tools/go/ast/inspector/inspector.go
libgo/go/html/fuzz.go [new file with mode: 0644]
libgo/go/html/template/context.go
libgo/go/html/template/css.go
libgo/go/html/template/escape_test.go
libgo/go/html/template/html.go
libgo/go/html/template/js.go
libgo/go/html/template/js_test.go
libgo/go/html/template/template.go
libgo/go/html/template/template_test.go
libgo/go/image/decode_test.go
libgo/go/image/draw/draw.go
libgo/go/image/geom.go
libgo/go/image/gif/writer.go
libgo/go/image/gif/writer_test.go
libgo/go/image/jpeg/fdct.go
libgo/go/image/jpeg/idct.go
libgo/go/image/png/fuzz.go [new file with mode: 0644]
libgo/go/image/png/reader.go
libgo/go/image/png/reader_test.go
libgo/go/image/png/testdata/invalid-palette.png [new file with mode: 0644]
libgo/go/image/png/writer.go
libgo/go/index/suffixarray/gen.go [new file with mode: 0644]
libgo/go/index/suffixarray/qsufsort.go [deleted file]
libgo/go/index/suffixarray/sais.go [new file with mode: 0644]
libgo/go/index/suffixarray/sais2.go [new file with mode: 0644]
libgo/go/index/suffixarray/suffixarray.go
libgo/go/index/suffixarray/suffixarray_test.go
libgo/go/internal/bytealg/bytealg.c
libgo/go/internal/bytealg/count_generic.go
libgo/go/internal/bytealg/count_native.go
libgo/go/internal/bytealg/equal_generic.go [new file with mode: 0644]
libgo/go/internal/bytealg/equal_native.go
libgo/go/internal/bytealg/index_arm64.go
libgo/go/internal/cpu/cpu.go
libgo/go/internal/cpu/cpu_s390x.go
libgo/go/internal/goversion/goversion.go [new file with mode: 0644]
libgo/go/internal/lazyregexp/lazyre.go [new file with mode: 0644]
libgo/go/internal/lazytemplate/lazytemplate.go [new file with mode: 0644]
libgo/go/internal/oserror/errors.go [new file with mode: 0644]
libgo/go/internal/oserror/errors_test.go [new file with mode: 0644]
libgo/go/internal/poll/errno_unix.go [new file with mode: 0644]
libgo/go/internal/poll/errno_windows.go [new file with mode: 0644]
libgo/go/internal/poll/error_linux_test.go [new file with mode: 0644]
libgo/go/internal/poll/error_stub_test.go [new file with mode: 0644]
libgo/go/internal/poll/error_test.go [new file with mode: 0644]
libgo/go/internal/poll/fd.go
libgo/go/internal/poll/fd_opendir_darwin.go [new file with mode: 0644]
libgo/go/internal/poll/fd_opendir_ios.go [deleted file]
libgo/go/internal/poll/fd_poll_runtime.go
libgo/go/internal/poll/fd_windows.go
libgo/go/internal/poll/read_test.go [new file with mode: 0644]
libgo/go/internal/poll/sendfile_windows.go
libgo/go/internal/poll/writev.go
libgo/go/internal/reflectlite/all_test.go [new file with mode: 0644]
libgo/go/internal/reflectlite/export_test.go [new file with mode: 0644]
libgo/go/internal/reflectlite/set_test.go [new file with mode: 0644]
libgo/go/internal/reflectlite/swapper.go [new file with mode: 0644]
libgo/go/internal/reflectlite/tostring_test.go [new file with mode: 0644]
libgo/go/internal/reflectlite/type.go [new file with mode: 0644]
libgo/go/internal/reflectlite/value.go [new file with mode: 0644]
libgo/go/internal/syscall/windows/mksyscall.go
libgo/go/internal/syscall/windows/registry/mksyscall.go
libgo/go/internal/syscall/windows/reparse_windows.go
libgo/go/internal/syscall/windows/syscall_windows.go
libgo/go/internal/syscall/windows/sysdll/sysdll.go
libgo/go/internal/syscall/windows/zsyscall_windows.go
libgo/go/internal/testenv/testenv.go
libgo/go/internal/trace/gc_test.go
libgo/go/internal/trace/parser_test.go
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305.go [deleted file]
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go [deleted file]
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go [deleted file]
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go [deleted file]
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go [deleted file]
libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/asn1.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/asn1/asn1.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/asn1_test.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/builder.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/cryptobyte_test.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/example_test.go [deleted file]
libgo/go/internal/x/crypto/cryptobyte/string.go [deleted file]
libgo/go/internal/x/crypto/curve25519/curve25519.go [deleted file]
libgo/go/internal/x/crypto/curve25519/curve25519_test.go [deleted file]
libgo/go/internal/x/crypto/curve25519/doc.go [deleted file]
libgo/go/internal/x/crypto/curve25519/mont25519_amd64.go [deleted file]
libgo/go/internal/x/crypto/hkdf/example_test.go [deleted file]
libgo/go/internal/x/crypto/hkdf/hkdf.go [deleted file]
libgo/go/internal/x/crypto/hkdf/hkdf_test.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/chacha_generic.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/chacha_noasm.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/chacha_s390x.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/chacha_test.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/vectors_test.go [deleted file]
libgo/go/internal/x/crypto/internal/chacha20/xor.go [deleted file]
libgo/go/internal/x/crypto/poly1305/poly1305.go [deleted file]
libgo/go/internal/x/crypto/poly1305/poly1305_test.go [deleted file]
libgo/go/internal/x/crypto/poly1305/sum_amd64.go [deleted file]
libgo/go/internal/x/crypto/poly1305/sum_arm.go [deleted file]
libgo/go/internal/x/crypto/poly1305/sum_noasm.go [deleted file]
libgo/go/internal/x/crypto/poly1305/sum_ref.go [deleted file]
libgo/go/internal/x/crypto/poly1305/sum_s390x.go [deleted file]
libgo/go/internal/x/crypto/poly1305/vectors_test.go [deleted file]
libgo/go/internal/x/net/dns/dnsmessage/example_test.go [deleted file]
libgo/go/internal/x/net/dns/dnsmessage/message.go [deleted file]
libgo/go/internal/x/net/dns/dnsmessage/message_test.go [deleted file]
libgo/go/internal/x/net/http/httpguts/guts.go [deleted file]
libgo/go/internal/x/net/http/httpguts/httplex.go [deleted file]
libgo/go/internal/x/net/http/httpguts/httplex_test.go [deleted file]
libgo/go/internal/x/net/http/httpproxy/export_test.go [deleted file]
libgo/go/internal/x/net/http/httpproxy/proxy.go [deleted file]
libgo/go/internal/x/net/http/httpproxy/proxy_test.go [deleted file]
libgo/go/internal/x/net/http2/hpack/encode.go [deleted file]
libgo/go/internal/x/net/http2/hpack/encode_test.go [deleted file]
libgo/go/internal/x/net/http2/hpack/hpack.go [deleted file]
libgo/go/internal/x/net/http2/hpack/hpack_test.go [deleted file]
libgo/go/internal/x/net/http2/hpack/huffman.go [deleted file]
libgo/go/internal/x/net/http2/hpack/tables.go [deleted file]
libgo/go/internal/x/net/http2/hpack/tables_test.go [deleted file]
libgo/go/internal/x/net/idna/idna.go [deleted file]
libgo/go/internal/x/net/idna/punycode.go [deleted file]
libgo/go/internal/x/net/idna/punycode_test.go [deleted file]
libgo/go/internal/x/net/idna/tables.go [deleted file]
libgo/go/internal/x/net/idna/trie.go [deleted file]
libgo/go/internal/x/net/idna/trieval.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_bsd.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_nobsd.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_posix.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_stub.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_unix.go [deleted file]
libgo/go/internal/x/net/internal/nettest/helper_windows.go [deleted file]
libgo/go/internal/x/net/internal/nettest/interface.go [deleted file]
libgo/go/internal/x/net/internal/nettest/rlimit.go [deleted file]
libgo/go/internal/x/net/internal/nettest/stack.go [deleted file]
libgo/go/internal/x/net/lif/address.go [deleted file]
libgo/go/internal/x/net/lif/address_test.go [deleted file]
libgo/go/internal/x/net/lif/binary.go [deleted file]
libgo/go/internal/x/net/lif/defs_solaris.go [deleted file]
libgo/go/internal/x/net/lif/lif.go [deleted file]
libgo/go/internal/x/net/lif/link.go [deleted file]
libgo/go/internal/x/net/lif/link_test.go [deleted file]
libgo/go/internal/x/net/lif/sys.go [deleted file]
libgo/go/internal/x/net/lif/syscall.go [deleted file]
libgo/go/internal/x/net/lif/zsys_solaris.go [deleted file]
libgo/go/internal/x/net/nettest/conntest.go [deleted file]
libgo/go/internal/x/net/nettest/conntest_go16.go [deleted file]
libgo/go/internal/x/net/nettest/conntest_go17.go [deleted file]
libgo/go/internal/x/net/nettest/conntest_test.go [deleted file]
libgo/go/internal/x/net/route/address.go [deleted file]
libgo/go/internal/x/net/route/address_darwin_test.go [deleted file]
libgo/go/internal/x/net/route/address_test.go [deleted file]
libgo/go/internal/x/net/route/binary.go [deleted file]
libgo/go/internal/x/net/route/defs_darwin.go [deleted file]
libgo/go/internal/x/net/route/defs_dragonfly.go [deleted file]
libgo/go/internal/x/net/route/defs_freebsd.go [deleted file]
libgo/go/internal/x/net/route/defs_netbsd.go [deleted file]
libgo/go/internal/x/net/route/defs_openbsd.go [deleted file]
libgo/go/internal/x/net/route/interface.go [deleted file]
libgo/go/internal/x/net/route/interface_announce.go [deleted file]
libgo/go/internal/x/net/route/interface_classic.go [deleted file]
libgo/go/internal/x/net/route/interface_freebsd.go [deleted file]
libgo/go/internal/x/net/route/interface_multicast.go [deleted file]
libgo/go/internal/x/net/route/interface_openbsd.go [deleted file]
libgo/go/internal/x/net/route/message.go [deleted file]
libgo/go/internal/x/net/route/message_darwin_test.go [deleted file]
libgo/go/internal/x/net/route/message_freebsd_test.go [deleted file]
libgo/go/internal/x/net/route/message_test.go [deleted file]
libgo/go/internal/x/net/route/route.go [deleted file]
libgo/go/internal/x/net/route/route_classic.go [deleted file]
libgo/go/internal/x/net/route/route_openbsd.go [deleted file]
libgo/go/internal/x/net/route/route_test.go [deleted file]
libgo/go/internal/x/net/route/sys.go [deleted file]
libgo/go/internal/x/net/route/sys_darwin.go [deleted file]
libgo/go/internal/x/net/route/sys_dragonfly.go [deleted file]
libgo/go/internal/x/net/route/sys_freebsd.go [deleted file]
libgo/go/internal/x/net/route/sys_netbsd.go [deleted file]
libgo/go/internal/x/net/route/sys_openbsd.go [deleted file]
libgo/go/internal/x/net/route/syscall.go [deleted file]
libgo/go/internal/x/net/route/syscall_go1_11_darwin.go [deleted file]
libgo/go/internal/x/net/route/syscall_go1_12_darwin.go [deleted file]
libgo/go/internal/x/net/route/zsys_darwin.go [deleted file]
libgo/go/internal/x/net/route/zsys_dragonfly.go [deleted file]
libgo/go/internal/x/net/route/zsys_freebsd_386.go [deleted file]
libgo/go/internal/x/net/route/zsys_freebsd_amd64.go [deleted file]
libgo/go/internal/x/net/route/zsys_freebsd_arm.go [deleted file]
libgo/go/internal/x/net/route/zsys_netbsd.go [deleted file]
libgo/go/internal/x/net/route/zsys_openbsd.go [deleted file]
libgo/go/internal/x/text/secure/bidirule/bidirule.go [deleted file]
libgo/go/internal/x/text/secure/doc.go [deleted file]
libgo/go/internal/x/text/transform/examples_test.go [deleted file]
libgo/go/internal/x/text/transform/transform.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/bidi.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/bracket.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/core.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/example_test.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/prop.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/tables.go [deleted file]
libgo/go/internal/x/text/unicode/bidi/trieval.go [deleted file]
libgo/go/internal/x/text/unicode/doc.go [deleted file]
libgo/go/internal/x/text/unicode/norm/composition.go [deleted file]
libgo/go/internal/x/text/unicode/norm/example_iter_test.go [deleted file]
libgo/go/internal/x/text/unicode/norm/example_test.go [deleted file]
libgo/go/internal/x/text/unicode/norm/forminfo.go [deleted file]
libgo/go/internal/x/text/unicode/norm/input.go [deleted file]
libgo/go/internal/x/text/unicode/norm/iter.go [deleted file]
libgo/go/internal/x/text/unicode/norm/normalize.go [deleted file]
libgo/go/internal/x/text/unicode/norm/readwriter.go [deleted file]
libgo/go/internal/x/text/unicode/norm/tables.go [deleted file]
libgo/go/internal/x/text/unicode/norm/transform.go [deleted file]
libgo/go/internal/x/text/unicode/norm/trie.go [deleted file]
libgo/go/internal/x/text/unicode/norm/triegen.go [deleted file]
libgo/go/internal/xcoff/ar_test.go
libgo/go/internal/xcoff/file.go
libgo/go/io/multi_test.go
libgo/go/log/log.go
libgo/go/log/log_test.go
libgo/go/math/all_test.go
libgo/go/math/big/arith.go
libgo/go/math/big/arith_decl_pure.go
libgo/go/math/big/arith_test.go
libgo/go/math/big/floatconv.go
libgo/go/math/big/floatconv_test.go
libgo/go/math/big/floatmarsh_test.go
libgo/go/math/big/ftoa.go
libgo/go/math/big/int.go
libgo/go/math/big/int_test.go
libgo/go/math/big/intconv.go
libgo/go/math/big/intconv_test.go
libgo/go/math/big/nat.go
libgo/go/math/big/natconv.go
libgo/go/math/big/natconv_test.go
libgo/go/math/big/prime_test.go
libgo/go/math/big/rat.go
libgo/go/math/big/rat_test.go
libgo/go/math/big/ratconv.go
libgo/go/math/big/ratconv_test.go
libgo/go/math/big/sqrt_test.go
libgo/go/math/bits/bits.go
libgo/go/math/bits/bits_errors.go [new file with mode: 0644]
libgo/go/math/bits/bits_errors_bootstrap.go [new file with mode: 0644]
libgo/go/math/bits/bits_test.go
libgo/go/math/bits/example_test.go
libgo/go/math/cmplx/cmath_test.go
libgo/go/math/cmplx/pow.go
libgo/go/math/cmplx/tan.go
libgo/go/math/example_test.go
libgo/go/math/j0.go
libgo/go/math/j1.go
libgo/go/math/jn.go
libgo/go/math/rand/rand_test.go
libgo/go/math/remainder.go
libgo/go/math/sin.go
libgo/go/math/sincos.go
libgo/go/math/tan.go
libgo/go/math/tanh.go
libgo/go/mime/mediatype.go
libgo/go/mime/mediatype_test.go
libgo/go/mime/multipart/formdata_test.go
libgo/go/mime/multipart/multipart_test.go
libgo/go/mime/quotedprintable/reader_test.go
libgo/go/mime/type.go
libgo/go/net/cgo_unix.go
libgo/go/net/dial.go
libgo/go/net/dial_test.go
libgo/go/net/dnsclient.go
libgo/go/net/dnsclient_unix.go
libgo/go/net/dnsclient_unix_test.go
libgo/go/net/dnsconfig_unix.go
libgo/go/net/dnsconfig_unix_test.go
libgo/go/net/error_test.go
libgo/go/net/fd_unix.go
libgo/go/net/file_plan9.go
libgo/go/net/file_unix.go
libgo/go/net/http/cgi/child.go
libgo/go/net/http/client.go
libgo/go/net/http/client_test.go
libgo/go/net/http/clientserver_test.go
libgo/go/net/http/clone.go [new file with mode: 0644]
libgo/go/net/http/cookie.go
libgo/go/net/http/cookie_test.go
libgo/go/net/http/export_test.go
libgo/go/net/http/fs.go
libgo/go/net/http/h2_bundle.go
libgo/go/net/http/header.go
libgo/go/net/http/http.go
libgo/go/net/http/httptest/recorder.go
libgo/go/net/http/httputil/dump_test.go
libgo/go/net/http/httputil/persist.go
libgo/go/net/http/httputil/reverseproxy.go
libgo/go/net/http/httputil/reverseproxy_test.go
libgo/go/net/http/internal/testcert.go
libgo/go/net/http/request.go
libgo/go/net/http/request_test.go
libgo/go/net/http/response.go
libgo/go/net/http/response_test.go
libgo/go/net/http/roundtrip_js.go
libgo/go/net/http/serve_test.go
libgo/go/net/http/server.go
libgo/go/net/http/sniff.go
libgo/go/net/http/sniff_test.go
libgo/go/net/http/status.go
libgo/go/net/http/transfer.go
libgo/go/net/http/transfer_test.go
libgo/go/net/http/transport.go
libgo/go/net/http/transport_test.go
libgo/go/net/interface_aix.go
libgo/go/net/interface_bsd.go
libgo/go/net/interface_bsdvar.go
libgo/go/net/interface_darwin.go
libgo/go/net/interface_freebsd.go
libgo/go/net/interface_plan9.go
libgo/go/net/interface_solaris.go
libgo/go/net/interface_test.go
libgo/go/net/ip.go
libgo/go/net/listen_test.go
libgo/go/net/lookup.go
libgo/go/net/lookup_plan9.go
libgo/go/net/lookup_test.go
libgo/go/net/lookup_unix.go
libgo/go/net/lookup_windows.go
libgo/go/net/mac.go
libgo/go/net/mac_test.go
libgo/go/net/mail/message.go
libgo/go/net/mail/message_test.go
libgo/go/net/net.go
libgo/go/net/pipe.go
libgo/go/net/pipe_test.go
libgo/go/net/platform_test.go
libgo/go/net/rpc/client_test.go
libgo/go/net/rpc/server.go
libgo/go/net/sendfile_unix_alt.go
libgo/go/net/smtp/smtp_test.go
libgo/go/net/splice_test.go
libgo/go/net/tcpsock.go
libgo/go/net/tcpsock_plan9.go
libgo/go/net/tcpsock_posix.go
libgo/go/net/tcpsock_test.go
libgo/go/net/tcpsockopt_darwin.go
libgo/go/net/testdata/freebsd-usevc-resolv.conf [new file with mode: 0644]
libgo/go/net/testdata/linux-use-vc-resolv.conf [new file with mode: 0644]
libgo/go/net/testdata/openbsd-tcp-resolv.conf [new file with mode: 0644]
libgo/go/net/testdata/single-request-reopen-resolv.conf [new file with mode: 0644]
libgo/go/net/testdata/single-request-resolv.conf [new file with mode: 0644]
libgo/go/net/textproto/reader.go
libgo/go/net/textproto/reader_test.go
libgo/go/net/textproto/writer.go
libgo/go/net/textproto/writer_test.go
libgo/go/net/timeout_test.go
libgo/go/net/url/url.go
libgo/go/net/url/url_test.go
libgo/go/os/dir_ios.go [deleted file]
libgo/go/os/env_default.go [new file with mode: 0644]
libgo/go/os/env_windows.go [new file with mode: 0644]
libgo/go/os/error.go
libgo/go/os/error_plan9.go [deleted file]
libgo/go/os/error_test.go
libgo/go/os/error_unix.go [deleted file]
libgo/go/os/error_windows.go [deleted file]
libgo/go/os/example_test.go
libgo/go/os/exec/bench_test.go [new file with mode: 0644]
libgo/go/os/exec/exec.go
libgo/go/os/exec/exec_posix_test.go
libgo/go/os/exec/exec_test.go
libgo/go/os/exec_plan9.go
libgo/go/os/exec_posix.go
libgo/go/os/export_test.go
libgo/go/os/export_unix_test.go [new file with mode: 0644]
libgo/go/os/file.go
libgo/go/os/file_plan9.go
libgo/go/os/file_posix.go
libgo/go/os/file_unix.go
libgo/go/os/os_test.go
libgo/go/os/os_unix_test.go
libgo/go/os/path.go
libgo/go/os/path_unix.go
libgo/go/os/pipe_test.go
libgo/go/os/proc.go
libgo/go/os/removeall_at.go
libgo/go/os/removeall_noat.go
libgo/go/os/removeall_test.go
libgo/go/os/signal/internal/pty/pty.go
libgo/go/os/signal/signal_cgo_test.go
libgo/go/os/sticky_bsd.go
libgo/go/os/sticky_notbsd.go
libgo/go/os/timeout_test.go
libgo/go/os/types_windows.go
libgo/go/os/user/lookup_stubs.go
libgo/go/os/user/user_test.go
libgo/go/path/filepath/example_unix_test.go
libgo/go/path/filepath/path_test.go
libgo/go/path/filepath/symlink.go
libgo/go/path/filepath/symlink_unix.go
libgo/go/path/filepath/symlink_windows.go
libgo/go/plugin/plugin_dlopen.go
libgo/go/reflect/all_test.go
libgo/go/reflect/makefunc_ffi.go
libgo/go/reflect/swapper.go
libgo/go/reflect/type.go
libgo/go/reflect/value.go
libgo/go/regexp/all_test.go
libgo/go/regexp/exec.go
libgo/go/regexp/exec_test.go
libgo/go/regexp/find_test.go
libgo/go/regexp/onepass_test.go
libgo/go/regexp/regexp.go
libgo/go/regexp/syntax/parse_test.go
libgo/go/regexp/syntax/regexp.go
libgo/go/runtime/alg.go
libgo/go/runtime/auxv_none.go
libgo/go/runtime/cgocall.go
libgo/go/runtime/cgocheck.go
libgo/go/runtime/chan.go
libgo/go/runtime/cpuprof.go
libgo/go/runtime/crash_cgo_test.go
libgo/go/runtime/crash_unix_test.go
libgo/go/runtime/debug.go
libgo/go/runtime/debug/mod.go
libgo/go/runtime/debuglog.go [new file with mode: 0644]
libgo/go/runtime/debuglog_off.go [new file with mode: 0644]
libgo/go/runtime/debuglog_on.go [new file with mode: 0644]
libgo/go/runtime/debuglog_test.go [new file with mode: 0644]
libgo/go/runtime/export_debuglog_test.go [new file with mode: 0644]
libgo/go/runtime/export_mmap_test.go
libgo/go/runtime/export_test.go
libgo/go/runtime/extern.go
libgo/go/runtime/gc_test.go
libgo/go/runtime/heapdump.go
libgo/go/runtime/iface.go
libgo/go/runtime/internal/atomic/atomic_test.go
libgo/go/runtime/lock_js.go
libgo/go/runtime/lock_sema.go
libgo/go/runtime/malloc.go
libgo/go/runtime/map.go
libgo/go/runtime/map_fast32.go
libgo/go/runtime/map_fast64.go
libgo/go/runtime/map_faststr.go
libgo/go/runtime/mbarrier.go
libgo/go/runtime/mbitmap.go
libgo/go/runtime/mcache.go
libgo/go/runtime/mcentral.go
libgo/go/runtime/mem_gccgo.go
libgo/go/runtime/memmove_test.go
libgo/go/runtime/mfinal.go
libgo/go/runtime/mgc.go
libgo/go/runtime/mgclarge.go
libgo/go/runtime/mgcscavenge.go [new file with mode: 0644]
libgo/go/runtime/mgcsweep.go
libgo/go/runtime/mheap.go
libgo/go/runtime/mksizeclasses.go
libgo/go/runtime/mstats.go
libgo/go/runtime/netpoll.go
libgo/go/runtime/netpoll_aix.go
libgo/go/runtime/netpoll_epoll.go
libgo/go/runtime/netpoll_kqueue.go
libgo/go/runtime/netpoll_solaris.go
libgo/go/runtime/os_darwin.go
libgo/go/runtime/os_freebsd.go
libgo/go/runtime/os_hurd.go
libgo/go/runtime/os_linux.go
libgo/go/runtime/os_netbsd.go
libgo/go/runtime/os_netbsd_arm64.go [new file with mode: 0644]
libgo/go/runtime/os_openbsd.go
libgo/go/runtime/os_openbsd_arm64.go [new file with mode: 0644]
libgo/go/runtime/os_solaris.go
libgo/go/runtime/panic.go
libgo/go/runtime/pprof/internal/profile/profile.go
libgo/go/runtime/pprof/label.go
libgo/go/runtime/pprof/pprof_test.go
libgo/go/runtime/pprof/proto_test.go
libgo/go/runtime/pprof/testdata/mappingtest/main.go
libgo/go/runtime/proc.go
libgo/go/runtime/proc_test.go
libgo/go/runtime/runtime-lldb_test.go
libgo/go/runtime/runtime1.go
libgo/go/runtime/runtime2.go
libgo/go/runtime/runtime_mmap_test.go
libgo/go/runtime/runtime_test.go
libgo/go/runtime/sema.go
libgo/go/runtime/semasleep_test.go
libgo/go/runtime/signal_sighandler.go
libgo/go/runtime/signal_unix.go
libgo/go/runtime/sizeclasses.go
libgo/go/runtime/slice.go
libgo/go/runtime/stack_test.go
libgo/go/runtime/string.go
libgo/go/runtime/stubs.go
libgo/go/runtime/symtab.go
libgo/go/runtime/testdata/testprog/deadlock.go
libgo/go/runtime/testdata/testprog/gc.go
libgo/go/runtime/testdata/testprog/sleep.go [new file with mode: 0644]
libgo/go/runtime/testdata/testprogcgo/dll_windows.go
libgo/go/runtime/testdata/testprogcgo/sigstack.go
libgo/go/runtime/trace/trace_test.go
libgo/go/runtime/treap_test.go [new file with mode: 0644]
libgo/go/runtime/type.go
libgo/go/runtime/typekind.go
libgo/go/runtime/unaligned1.go [deleted file]
libgo/go/runtime/unaligned2.go [deleted file]
libgo/go/runtime/write_err_android.go
libgo/go/sort/slice.go
libgo/go/sort/slice_go113.go [new file with mode: 0644]
libgo/go/sort/slice_go14.go [new file with mode: 0644]
libgo/go/sort/slice_go18.go [new file with mode: 0644]
libgo/go/sort/sort_test.go
libgo/go/strconv/atof.go
libgo/go/strconv/atof_test.go
libgo/go/strconv/atoi.go
libgo/go/strconv/atoi_test.go
libgo/go/strconv/example_test.go
libgo/go/strconv/extfloat.go
libgo/go/strconv/ftoa.go
libgo/go/strconv/ftoa_test.go
libgo/go/strconv/isprint.go
libgo/go/strconv/quote.go
libgo/go/strconv/strconv_test.go
libgo/go/strings/example_test.go
libgo/go/strings/replace.go
libgo/go/strings/strings.go
libgo/go/strings/strings_test.go
libgo/go/sync/export_test.go
libgo/go/sync/mutex.go
libgo/go/sync/mutex_test.go
libgo/go/sync/once.go
libgo/go/sync/pool.go
libgo/go/sync/pool_test.go
libgo/go/sync/poolqueue.go [new file with mode: 0644]
libgo/go/sync/runtime.go
libgo/go/sync/runtime_sema_test.go
libgo/go/sync/rwmutex.go
libgo/go/sync/waitgroup.go
libgo/go/syscall/dirent_bsd_test.go
libgo/go/syscall/exec_bsd.go
libgo/go/syscall/exec_darwin.go
libgo/go/syscall/exec_linux.go
libgo/go/syscall/exec_linux_test.go
libgo/go/syscall/exec_unix.go
libgo/go/syscall/exec_windows.go
libgo/go/syscall/fs_js.go
libgo/go/syscall/getdirentries_test.go [new file with mode: 0644]
libgo/go/syscall/js/js.go
libgo/go/syscall/js/js_test.go
libgo/go/syscall/js/typedarray.go [deleted file]
libgo/go/syscall/sockcmsg_unix.go
libgo/go/syscall/socket.go
libgo/go/syscall/syscall_errno.go
libgo/go/syscall/syscall_js.go
libgo/go/syscall/syscall_linux_s390x.go
libgo/go/syscall/syscall_netbsd_arm64.go [new file with mode: 0644]
libgo/go/syscall/syscall_openbsd_arm64.go [new file with mode: 0644]
libgo/go/syscall/syscall_ptrace_test.go [new file with mode: 0644]
libgo/go/syscall/syscall_unix.go
libgo/go/syscall/syscall_unix_test.go
libgo/go/testing/benchmark.go
libgo/go/testing/benchmark_test.go
libgo/go/testing/cover.go
libgo/go/testing/example.go
libgo/go/testing/export_test.go
libgo/go/testing/internal/testdeps/deps.go
libgo/go/testing/quick/quick.go
libgo/go/testing/quick/quick_test.go
libgo/go/testing/run_example.go [new file with mode: 0644]
libgo/go/testing/run_example_js.go [new file with mode: 0644]
libgo/go/testing/sub_test.go
libgo/go/testing/testing.go
libgo/go/text/scanner/scanner.go
libgo/go/text/scanner/scanner_test.go
libgo/go/text/tabwriter/tabwriter.go
libgo/go/text/tabwriter/tabwriter_test.go
libgo/go/text/template/doc.go
libgo/go/text/template/exec.go
libgo/go/text/template/exec_test.go
libgo/go/text/template/funcs.go
libgo/go/text/template/helper.go
libgo/go/text/template/parse/lex.go
libgo/go/text/template/parse/lex_test.go
libgo/go/text/template/parse/node.go
libgo/go/text/template/parse/parse_test.go
libgo/go/text/template/template.go
libgo/go/time/example_test.go
libgo/go/time/export_test.go
libgo/go/time/format.go
libgo/go/time/format_test.go
libgo/go/time/time.go
libgo/go/time/time_test.go
libgo/go/time/zoneinfo_ios.go
libgo/go/time/zoneinfo_read.go
libgo/go/time/zoneinfo_test.go
libgo/go/unicode/letter.go
libgo/go/unicode/script_test.go
libgo/go/unicode/tables.go
libgo/go/unicode/utf8/utf8.go
libgo/goarch.sh
libgo/gotool-packages.txt
libgo/libgo-packages.txt
libgo/match.sh
libgo/misc/cgo/errors/errors_test.go
libgo/misc/cgo/errors/ptr_test.go
libgo/misc/cgo/errors/src/err1.go [deleted file]
libgo/misc/cgo/errors/src/err2.go [deleted file]
libgo/misc/cgo/errors/src/err3.go [deleted file]
libgo/misc/cgo/errors/src/err4.go [deleted file]
libgo/misc/cgo/errors/src/issue11097a.go [deleted file]
libgo/misc/cgo/errors/src/issue11097b.go [deleted file]
libgo/misc/cgo/errors/src/issue13129.go [deleted file]
libgo/misc/cgo/errors/src/issue13423.go [deleted file]
libgo/misc/cgo/errors/src/issue13467.go [deleted file]
libgo/misc/cgo/errors/src/issue13635.go [deleted file]
libgo/misc/cgo/errors/src/issue13830.go [deleted file]
libgo/misc/cgo/errors/src/issue14669.go [deleted file]
libgo/misc/cgo/errors/src/issue16116.go [deleted file]
libgo/misc/cgo/errors/src/issue16591.go [deleted file]
libgo/misc/cgo/errors/src/issue18452.go [deleted file]
libgo/misc/cgo/errors/src/issue18889.go [deleted file]
libgo/misc/cgo/errors/src/issue26745.go [deleted file]
libgo/misc/cgo/errors/src/issue28069.go [deleted file]
libgo/misc/cgo/errors/src/issue28721.go [deleted file]
libgo/misc/cgo/errors/src/issue7757.go [deleted file]
libgo/misc/cgo/errors/src/issue8442.go [deleted file]
libgo/misc/cgo/errors/src/long_double_size.go [deleted file]
libgo/misc/cgo/errors/src/malloc.go [deleted file]
libgo/misc/cgo/errors/testdata/err1.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/err2.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/err4.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue11097a.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue11097b.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue14669.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue18452.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue18889.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue28069.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/issue28721.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/long_double_size.go [new file with mode: 0644]
libgo/misc/cgo/errors/testdata/malloc.go [new file with mode: 0644]
libgo/misc/cgo/fortran/test.bash
libgo/misc/cgo/life/c-life.c [deleted file]
libgo/misc/cgo/life/life.go [deleted file]
libgo/misc/cgo/life/life.h [deleted file]
libgo/misc/cgo/life/life_test.go [new file with mode: 0644]
libgo/misc/cgo/life/main.go [deleted file]
libgo/misc/cgo/life/main.out [deleted file]
libgo/misc/cgo/life/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/life/testdata/c-life.c [new file with mode: 0644]
libgo/misc/cgo/life/testdata/life.go [new file with mode: 0644]
libgo/misc/cgo/life/testdata/life.h [new file with mode: 0644]
libgo/misc/cgo/life/testdata/main.go [new file with mode: 0644]
libgo/misc/cgo/life/testdata/main.out [new file with mode: 0644]
libgo/misc/cgo/stdio/chain.go [deleted file]
libgo/misc/cgo/stdio/chain.out [deleted file]
libgo/misc/cgo/stdio/fib.go [deleted file]
libgo/misc/cgo/stdio/fib.out [deleted file]
libgo/misc/cgo/stdio/file.go [deleted file]
libgo/misc/cgo/stdio/hello.go [deleted file]
libgo/misc/cgo/stdio/hello.out [deleted file]
libgo/misc/cgo/stdio/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/stdio/run.out [deleted file]
libgo/misc/cgo/stdio/stdio.go [deleted file]
libgo/misc/cgo/stdio/stdio_test.go [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/chain.go [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/chain.out [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/fib.go [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/fib.out [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/hello.go [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/hello.out [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/run.out [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/stdio/file.go [new file with mode: 0644]
libgo/misc/cgo/stdio/testdata/stdio/stdio.go [new file with mode: 0644]
libgo/misc/cgo/test/align.go [deleted file]
libgo/misc/cgo/test/api.go [deleted file]
libgo/misc/cgo/test/basic.go [deleted file]
libgo/misc/cgo/test/callback.go
libgo/misc/cgo/test/cflags.go [deleted file]
libgo/misc/cgo/test/cgo_linux_test.go
libgo/misc/cgo/test/cgo_stubs_android_test.go
libgo/misc/cgo/test/cgo_test.go
libgo/misc/cgo/test/checkconst.go [deleted file]
libgo/misc/cgo/test/complex.go [deleted file]
libgo/misc/cgo/test/cthread.go [deleted file]
libgo/misc/cgo/test/duplicate_symbol.go [deleted file]
libgo/misc/cgo/test/env.go [deleted file]
libgo/misc/cgo/test/exports.go [deleted file]
libgo/misc/cgo/test/fpvar.go [deleted file]
libgo/misc/cgo/test/gcc68255.go [deleted file]
libgo/misc/cgo/test/gcc68255/a.go [deleted file]
libgo/misc/cgo/test/gcc68255/c.c [deleted file]
libgo/misc/cgo/test/gcc68255/c.h [deleted file]
libgo/misc/cgo/test/helpers.go [deleted file]
libgo/misc/cgo/test/issue10303.go [deleted file]
libgo/misc/cgo/test/issue11925.go [deleted file]
libgo/misc/cgo/test/issue12030.go [deleted file]
libgo/misc/cgo/test/issue1222.go [deleted file]
libgo/misc/cgo/test/issue1328.go [deleted file]
libgo/misc/cgo/test/issue13402.go [deleted file]
libgo/misc/cgo/test/issue13930.go [deleted file]
libgo/misc/cgo/test/issue14838.go [deleted file]
libgo/misc/cgo/test/issue1560.go [deleted file]
libgo/misc/cgo/test/issue1635.go [deleted file]
libgo/misc/cgo/test/issue17065.go [deleted file]
libgo/misc/cgo/test/issue17537.go [deleted file]
libgo/misc/cgo/test/issue18126.go [deleted file]
libgo/misc/cgo/test/issue18146.go
libgo/misc/cgo/test/issue18720.go [deleted file]
libgo/misc/cgo/test/issue20129.go [deleted file]
libgo/misc/cgo/test/issue20266.go [deleted file]
libgo/misc/cgo/test/issue20266/issue20266.h [deleted file]
libgo/misc/cgo/test/issue20369.go [deleted file]
libgo/misc/cgo/test/issue20910.go [deleted file]
libgo/misc/cgo/test/issue21668.go [deleted file]
libgo/misc/cgo/test/issue21708.go [deleted file]
libgo/misc/cgo/test/issue21809.go [deleted file]
libgo/misc/cgo/test/issue22958.go [deleted file]
libgo/misc/cgo/test/issue23356.go [deleted file]
libgo/misc/cgo/test/issue23555.go [deleted file]
libgo/misc/cgo/test/issue23555a/a.go [deleted file]
libgo/misc/cgo/test/issue23555b/a.go [deleted file]
libgo/misc/cgo/test/issue23720.go [deleted file]
libgo/misc/cgo/test/issue24161_darwin_test.go [deleted file]
libgo/misc/cgo/test/issue24161arg/def.go [deleted file]
libgo/misc/cgo/test/issue24161arg/use.go [deleted file]
libgo/misc/cgo/test/issue24161e0/main.go [deleted file]
libgo/misc/cgo/test/issue24161e1/main.go [deleted file]
libgo/misc/cgo/test/issue24161e2/main.go [deleted file]
libgo/misc/cgo/test/issue24161res/restype.go [deleted file]
libgo/misc/cgo/test/issue24206.go [deleted file]
libgo/misc/cgo/test/issue24206_generic.go [deleted file]
libgo/misc/cgo/test/issue2462.go [deleted file]
libgo/misc/cgo/test/issue25143.go [deleted file]
libgo/misc/cgo/test/issue26066.go [deleted file]
libgo/misc/cgo/test/issue26213/jni.h [deleted file]
libgo/misc/cgo/test/issue26213/test26213.go [deleted file]
libgo/misc/cgo/test/issue26430.go [deleted file]
libgo/misc/cgo/test/issue26430/a.go [deleted file]
libgo/misc/cgo/test/issue26430/b.go [deleted file]
libgo/misc/cgo/test/issue26517.go [deleted file]
libgo/misc/cgo/test/issue26743.go [deleted file]
libgo/misc/cgo/test/issue26743/a.go [deleted file]
libgo/misc/cgo/test/issue26743/b.go [deleted file]
libgo/misc/cgo/test/issue27054/egl.h [deleted file]
libgo/misc/cgo/test/issue27054/test27054.go [deleted file]
libgo/misc/cgo/test/issue27340.go [deleted file]
libgo/misc/cgo/test/issue27340/a.go [deleted file]
libgo/misc/cgo/test/issue28545.go [deleted file]
libgo/misc/cgo/test/issue28772.go [deleted file]
libgo/misc/cgo/test/issue28896.go [deleted file]
libgo/misc/cgo/test/issue29383.go [deleted file]
libgo/misc/cgo/test/issue29748.go [deleted file]
libgo/misc/cgo/test/issue29781.go [deleted file]
libgo/misc/cgo/test/issue30065.go [deleted file]
libgo/misc/cgo/test/issue3250.go [deleted file]
libgo/misc/cgo/test/issue3250w.go [deleted file]
libgo/misc/cgo/test/issue3261.go [deleted file]
libgo/misc/cgo/test/issue3729.go [deleted file]
libgo/misc/cgo/test/issue3729w.go [deleted file]
libgo/misc/cgo/test/issue3741.go [deleted file]
libgo/misc/cgo/test/issue3775.go [deleted file]
libgo/misc/cgo/test/issue3945.go [deleted file]
libgo/misc/cgo/test/issue4054a.go [deleted file]
libgo/misc/cgo/test/issue4054b.go [deleted file]
libgo/misc/cgo/test/issue4339.go [deleted file]
libgo/misc/cgo/test/issue4417.go [deleted file]
libgo/misc/cgo/test/issue4857.go [deleted file]
libgo/misc/cgo/test/issue5227.go [deleted file]
libgo/misc/cgo/test/issue5242.go [deleted file]
libgo/misc/cgo/test/issue5337.go [deleted file]
libgo/misc/cgo/test/issue5337w.go [deleted file]
libgo/misc/cgo/test/issue5548.go [deleted file]
libgo/misc/cgo/test/issue5603.go [deleted file]
libgo/misc/cgo/test/issue5740.go [deleted file]
libgo/misc/cgo/test/issue5986.go [deleted file]
libgo/misc/cgo/test/issue6128.go [deleted file]
libgo/misc/cgo/test/issue6390.go [deleted file]
libgo/misc/cgo/test/issue6472.go [deleted file]
libgo/misc/cgo/test/issue6506.go [deleted file]
libgo/misc/cgo/test/issue6612.go [deleted file]
libgo/misc/cgo/test/issue6833.go [deleted file]
libgo/misc/cgo/test/issue6907.go [deleted file]
libgo/misc/cgo/test/issue6907export.go [deleted file]
libgo/misc/cgo/test/issue7560.go [deleted file]
libgo/misc/cgo/test/issue7665.go [deleted file]
libgo/misc/cgo/test/issue7786.go [deleted file]
libgo/misc/cgo/test/issue7978.go [deleted file]
libgo/misc/cgo/test/issue8092.go [deleted file]
libgo/misc/cgo/test/issue8331a.go [deleted file]
libgo/misc/cgo/test/issue8331b.go [deleted file]
libgo/misc/cgo/test/issue8428.go [deleted file]
libgo/misc/cgo/test/issue8441.go [deleted file]
libgo/misc/cgo/test/issue8756.go [deleted file]
libgo/misc/cgo/test/issue8756/issue8756.go [deleted file]
libgo/misc/cgo/test/issue8811.go [deleted file]
libgo/misc/cgo/test/issue8828.go [deleted file]
libgo/misc/cgo/test/issue8828/issue8828.c [deleted file]
libgo/misc/cgo/test/issue8828/trivial.go [deleted file]
libgo/misc/cgo/test/issue9026.go [deleted file]
libgo/misc/cgo/test/issue9026/issue9026.go [deleted file]
libgo/misc/cgo/test/issue9400/asm_386.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_amd64x.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_arm.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_arm64.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_mips64x.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_mipsx.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_ppc64x.s [deleted file]
libgo/misc/cgo/test/issue9400/asm_s390x.s [deleted file]
libgo/misc/cgo/test/issue9400/gccgo.go [deleted file]
libgo/misc/cgo/test/issue9400/stubs.go [deleted file]
libgo/misc/cgo/test/issue9400_linux.go [deleted file]
libgo/misc/cgo/test/issue9510.go [deleted file]
libgo/misc/cgo/test/issue9510a/a.go [deleted file]
libgo/misc/cgo/test/issue9510b/b.go [deleted file]
libgo/misc/cgo/test/issue9557.go [deleted file]
libgo/misc/cgo/test/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/test/pkg_test.go [new file with mode: 0644]
libgo/misc/cgo/test/sigaltstack.go
libgo/misc/cgo/test/test.go [new file with mode: 0644]
libgo/misc/cgo/test/test22906.go [deleted file]
libgo/misc/cgo/test/test26213.go [deleted file]
libgo/misc/cgo/test/test27660.go [deleted file]
libgo/misc/cgo/test/test_unix.go [new file with mode: 0644]
libgo/misc/cgo/test/test_windows.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/cgo_linux_test.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/cgo_test.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/gcc68255.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/gcc68255/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/gcc68255/c.c [new file with mode: 0644]
libgo/misc/cgo/test/testdata/gcc68255/c.h [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue20266.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue20266/issue20266.h [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue23555.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue23555a/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue23555b/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161_darwin_test.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161arg/def.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161arg/use.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161e0/main.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161e1/main.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161e2/main.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue24161res/restype.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26213/jni.h [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26213/test26213.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26430.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26430/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26430/b.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26743.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26743/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue26743/b.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue27054/egl.h [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue27054/test27054.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue27340.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue27340/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue29563.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue29563/weak.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue29563/weak1.c [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue29563/weak2.c [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue8756.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue8756/issue8756.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue8828.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue8828/issue8828.c [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue8828/trivial.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9026.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9026/issue9026.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_386.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_arm.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/gccgo.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400/stubs.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9400_linux.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9510.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9510a/a.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/issue9510b/b.go [new file with mode: 0644]
libgo/misc/cgo/test/testdata/test26213.go [new file with mode: 0644]
libgo/misc/cgo/test/testx.go [new file with mode: 0644]
libgo/misc/cgo/test/twoargs.go [deleted file]
libgo/misc/cgo/testcarchive/carchive_test.go
libgo/misc/cgo/testcarchive/main.c [deleted file]
libgo/misc/cgo/testcarchive/main2.c [deleted file]
libgo/misc/cgo/testcarchive/main3.c [deleted file]
libgo/misc/cgo/testcarchive/main4.c [deleted file]
libgo/misc/cgo/testcarchive/main5.c [deleted file]
libgo/misc/cgo/testcarchive/main6.c [deleted file]
libgo/misc/cgo/testcarchive/main_unix.c [deleted file]
libgo/misc/cgo/testcarchive/main_windows.c [deleted file]
libgo/misc/cgo/testcarchive/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/src/libgo/libgo.go [deleted file]
libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go [deleted file]
libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go [deleted file]
libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go [deleted file]
libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go [deleted file]
libgo/misc/cgo/testcarchive/src/p/p.go [deleted file]
libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main2.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main3.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main4.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main5.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main6.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main_unix.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/main_windows.c [new file with mode: 0644]
libgo/misc/cgo/testcarchive/testdata/p/p.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/cshared_test.go
libgo/misc/cgo/testcshared/main0.c [deleted file]
libgo/misc/cgo/testcshared/main1.c [deleted file]
libgo/misc/cgo/testcshared/main2.c [deleted file]
libgo/misc/cgo/testcshared/main3.c [deleted file]
libgo/misc/cgo/testcshared/main4.c [deleted file]
libgo/misc/cgo/testcshared/main5.c [deleted file]
libgo/misc/cgo/testcshared/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go [deleted file]
libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c [deleted file]
libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go [deleted file]
libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo/libgo.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo2/dup2.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo2/dup3.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo2/libgo2.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo4/libgo4.go [deleted file]
libgo/misc/cgo/testcshared/src/libgo5/libgo5.go [deleted file]
libgo/misc/cgo/testcshared/src/p/p.go [deleted file]
libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo/libgo.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main0.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main1.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main2.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main3.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main4.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/main5.c [new file with mode: 0644]
libgo/misc/cgo/testcshared/testdata/p/p.go [new file with mode: 0644]
libgo/misc/cgo/testgodefs/anonunion.go [deleted file]
libgo/misc/cgo/testgodefs/fieldtypedef.go [deleted file]
libgo/misc/cgo/testgodefs/issue8478.go [deleted file]
libgo/misc/cgo/testgodefs/main.go [deleted file]
libgo/misc/cgo/testgodefs/test.bash
libgo/misc/cgo/testgodefs/testdata/anonunion.go [new file with mode: 0644]
libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go [new file with mode: 0644]
libgo/misc/cgo/testgodefs/testdata/issue8478.go [new file with mode: 0644]
libgo/misc/cgo/testgodefs/testdata/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/altpath/src/common/common.go [deleted file]
libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go [deleted file]
libgo/misc/cgo/testplugin/altpath/testdata/common/common.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/plugin_test.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/src/checkdwarf/main.go [deleted file]
libgo/misc/cgo/testplugin/src/common/common.go [deleted file]
libgo/misc/cgo/testplugin/src/host/host.go [deleted file]
libgo/misc/cgo/testplugin/src/iface/main.go [deleted file]
libgo/misc/cgo/testplugin/src/iface_a/a.go [deleted file]
libgo/misc/cgo/testplugin/src/iface_b/b.go [deleted file]
libgo/misc/cgo/testplugin/src/iface_i/i.go [deleted file]
libgo/misc/cgo/testplugin/src/issue18584/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue18584/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go [deleted file]
libgo/misc/cgo/testplugin/src/issue18676/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue18676/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue19418/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue19418/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue19529/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue19534/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue19534/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue22175/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue22175/plugin1.go [deleted file]
libgo/misc/cgo/testplugin/src/issue22175/plugin2.go [deleted file]
libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue24351/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue24351/plugin.go [deleted file]
libgo/misc/cgo/testplugin/src/issue25756/main.go [deleted file]
libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c [deleted file]
libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go [deleted file]
libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h [deleted file]
libgo/misc/cgo/testplugin/src/plugin1/plugin1.go [deleted file]
libgo/misc/cgo/testplugin/src/plugin2/plugin2.go [deleted file]
libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go [deleted file]
libgo/misc/cgo/testplugin/test.bash [deleted file]
libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/common/common.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/host/host.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/iface/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/iface_a/a.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/iface_b/b.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/iface_i/i.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue18584/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue18676/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue19418/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue19534/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue22175/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue24351/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue25756/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/unnamed1/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/testdata/unnamed2/main.go [new file with mode: 0644]
libgo/misc/cgo/testplugin/unnamed1/main.go [deleted file]
libgo/misc/cgo/testplugin/unnamed2/main.go [deleted file]
libgo/misc/cgo/testsanitizers/cc_test.go
libgo/misc/cgo/testsanitizers/src/msan.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan2.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan3.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan4.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan5.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan6.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan_fail.go [deleted file]
libgo/misc/cgo/testsanitizers/src/msan_shared.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan10.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan11.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan12.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan2.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan3.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan4.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan5.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan6.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan7.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan8.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan9.go [deleted file]
libgo/misc/cgo/testsanitizers/src/tsan_shared.go [deleted file]
libgo/misc/cgo/testsanitizers/testdata/msan.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan2.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan3.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan4.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan5.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan6.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan_fail.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/msan_shared.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan10.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan11.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan12.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan2.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan3.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan4.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan5.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan6.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan7.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan8.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan9.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go [new file with mode: 0644]
libgo/misc/cgo/testsanitizers/tsan_test.go
libgo/misc/cgo/testshared/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testshared/shared_test.go
libgo/misc/cgo/testshared/src/dep2/dep2.go [deleted file]
libgo/misc/cgo/testshared/src/dep3/dep3.go [deleted file]
libgo/misc/cgo/testshared/src/depBase/asm.s [deleted file]
libgo/misc/cgo/testshared/src/depBase/dep.go [deleted file]
libgo/misc/cgo/testshared/src/depBase/gccgo.go [deleted file]
libgo/misc/cgo/testshared/src/depBase/stubs.go [deleted file]
libgo/misc/cgo/testshared/src/division/division.go [deleted file]
libgo/misc/cgo/testshared/src/exe/exe.go [deleted file]
libgo/misc/cgo/testshared/src/exe2/exe2.go [deleted file]
libgo/misc/cgo/testshared/src/exe3/exe3.go [deleted file]
libgo/misc/cgo/testshared/src/execgo/exe.go [deleted file]
libgo/misc/cgo/testshared/src/explicit/explicit.go [deleted file]
libgo/misc/cgo/testshared/src/global/main.go [deleted file]
libgo/misc/cgo/testshared/src/globallib/global.go [deleted file]
libgo/misc/cgo/testshared/src/iface/main.go [deleted file]
libgo/misc/cgo/testshared/src/iface_a/a.go [deleted file]
libgo/misc/cgo/testshared/src/iface_b/b.go [deleted file]
libgo/misc/cgo/testshared/src/iface_i/i.go [deleted file]
libgo/misc/cgo/testshared/src/implicit/implicit.go [deleted file]
libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go [deleted file]
libgo/misc/cgo/testshared/src/issue25065/a.go [deleted file]
libgo/misc/cgo/testshared/src/trivial/trivial.go [deleted file]
libgo/misc/cgo/testshared/testdata/dep2/dep2.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/dep3/dep3.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/depBase/asm.s [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/depBase/dep.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/depBase/gccgo.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/depBase/stubs.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/division/division.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/exe/exe.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/exe2/exe2.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/exe3/exe3.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/execgo/exe.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/explicit/explicit.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/global/main.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/globallib/global.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/iface/main.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/iface_a/a.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/iface_b/b.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/iface_i/i.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/implicit/implicit.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/issue25065/a.go [new file with mode: 0644]
libgo/misc/cgo/testshared/testdata/trivial/trivial.go [new file with mode: 0644]
libgo/misc/cgo/testso/cgoso.c [deleted file]
libgo/misc/cgo/testso/cgoso.go [deleted file]
libgo/misc/cgo/testso/cgoso_c.c [deleted file]
libgo/misc/cgo/testso/cgoso_unix.go [deleted file]
libgo/misc/cgo/testso/main.go [deleted file]
libgo/misc/cgo/testso/noso_test.go [new file with mode: 0644]
libgo/misc/cgo/testso/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testso/so_test.go [new file with mode: 0644]
libgo/misc/cgo/testso/testdata/cgoso.c [new file with mode: 0644]
libgo/misc/cgo/testso/testdata/cgoso.go [new file with mode: 0644]
libgo/misc/cgo/testso/testdata/cgoso_c.c [new file with mode: 0644]
libgo/misc/cgo/testso/testdata/cgoso_unix.go [new file with mode: 0644]
libgo/misc/cgo/testso/testdata/main.go [new file with mode: 0644]
libgo/misc/cgo/testsovar/cgoso.go [deleted file]
libgo/misc/cgo/testsovar/cgoso_c.c [deleted file]
libgo/misc/cgo/testsovar/cgoso_c.h [deleted file]
libgo/misc/cgo/testsovar/main.go [deleted file]
libgo/misc/cgo/testsovar/noso_test.go [new file with mode: 0644]
libgo/misc/cgo/testsovar/overlaydir_test.go [new file with mode: 0644]
libgo/misc/cgo/testsovar/so_test.go [new file with mode: 0644]
libgo/misc/cgo/testsovar/testdata/cgoso.go [new file with mode: 0644]
libgo/misc/cgo/testsovar/testdata/cgoso_c.c [new file with mode: 0644]
libgo/misc/cgo/testsovar/testdata/cgoso_c.h [new file with mode: 0644]
libgo/misc/cgo/testsovar/testdata/main.go [new file with mode: 0644]
libgo/mkrsysinfo.sh
libgo/runtime/go-fieldtrack.c
libgo/runtime/panic.c
libgo/runtime/runtime.h
libgo/runtime/runtime_c.c
libgo/testsuite/gotest

index b334136cab8687620a2f9c5cb82c05672fb907b7..7b2d17e56d9c8196ae764f94e3916940be5fe2ab 100644 (file)
@@ -1,4 +1,4 @@
-ca0fdb4c7735a648b8f10f1248631adf9afb8454
+8f2b844acda70330f7c50b360f8c983d2676ecbb
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index ab4b2dcd461f5e4138cf6871b19628d1c595f0ea..c910555071fd745cbc3c0bff51e88f0dee710829 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-06  Ian Lance Taylor  <iant@golang.org>
+
+       * go.test/test/fixedbugs/bug369.go: Update to match libgo update
+       to Go 1.13beta1.
+
 2019-09-06  David Edelsohn  <dje.gcc@gmail.com>
 
        * gcc.dg/torture/inf-compare-1.c: Skip AIX.
index 6d526228b8a62f7c6a130b2d10f3e2f07ba486da..7c9583a5888decc6ef70904be9138845d79922c0 100644 (file)
@@ -38,6 +38,7 @@ func BenchmarkSlowNonASCII(b *testing.B) {
 }
 
 func main() {
+       testing.Init()
        os.Args = []string{os.Args[0], "-test.benchtime=100ms"}
        flag.Parse()
 
index f5639057d7b0ee42cc4e5ac4728f161e3d7f9a31..b0e612daae4c90b754ba26afa50a945f1ffca529 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-06  Ian Lance Taylor  <iant@golang.org>
+
+       * Makefile.am (check-carchive-test): Just run "go test", not "go
+       test carchive_test.go".
+       * Makefile.in: Regenerate.
+
 2019-05-27  Ian Lance Taylor  <iant@golang.org>
 
        * Makefile.am (check-go-tool): Only chmod check-go-dir if it
index 4fd07c27b19713c938d83d890ac6f68b405e2901..d36b61ca88e8c95a49672548d62fa6902ea5f8f2 100644 (file)
@@ -248,7 +248,7 @@ check-runtime: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
        $(SHELL) $(libgosrcdir)/../testsuite/gotest --goarch=$${GOARCH} --goos=$${GOOS} --basedir=$(libgosrcdir)/.. --srcdir=$(libgosrcdir)/runtime --pkgpath=runtime --pkgfiles="$${files}" $(GOTESTFLAGS) -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v >> runtime-testlog 2>&1 || echo "--- $${fl}: go test runtime (0.00s)" >> runtime-testlog
        grep '^--- ' runtime-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
-# check-cgo-test runs `go test misc/cgo/test` in our environment.
+# check-cgo-test runs `go test` in misc/cgo/test.
 check-cgo-test: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
        rm -rf cgo-test-dir cgo-testlog
        $(MKDIR_P) cgo-test-dir/misc/cgo
@@ -261,18 +261,18 @@ check-cgo-test: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
        (cd cgo-test-dir/misc/cgo/test && $(abs_builddir)/go$(EXEEXT) test -test.short -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v) >> cgo-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/test (0.00s)" >> cgo-testlog
        grep '^--- ' cgo-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
-# check-carchive-test runs `go test misc/cgo/testcarchive/carchive_test.go`
+# check-carchive-test runs `go test` in misc/cgo/testcarchive.
 # in our environment.
 check-carchive-test: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
        rm -rf carchive-test-dir carchive-testlog
        $(MKDIR_P) carchive-test-dir/misc/cgo
        cp -r $(libgomiscdir)/cgo/testcarchive carchive-test-dir/misc/cgo/
        @abs_libgodir=`cd $(libgodir) && $(PWD_COMMAND)`; \
-       echo "cd carchive-test-dir/misc/cgo/testcarchive && $(ECHO_ENV) LIBRARY_PATH=`echo $${abs_libgodir}/.libs` $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v carchive_test.go" > carchive-testlog
+       echo "cd carchive-test-dir/misc/cgo/testcarchive && $(ECHO_ENV) LIBRARY_PATH=`echo $${abs_libgodir}/.libs` $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v" > carchive-testlog
        $(CHECK_ENV) \
        LIBRARY_PATH=`echo $${abs_libgodir}/.libs:$${LIBRARY_PATH} | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; \
        export LIBRARY_PATH; \
-       (cd carchive-test-dir/misc/cgo/testcarchive && $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v carchive_test.go) >> carchive-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/testcarchive (0.00s)" >> carchive-testlog
+       (cd carchive-test-dir/misc/cgo/testcarchive && $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v) >> carchive-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/testcarchive (0.00s)" >> carchive-testlog
        grep '^--- ' carchive-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
 # check-vet runs `go test cmd/vet` in our environment.
index 1c2237cca9b19bea54ce72daf5fc4fb012906c86..b36dbfbde1b5b0df411166fb69409637367b30c8 100644 (file)
@@ -919,7 +919,7 @@ mostlyclean-local:
 @NATIVE_TRUE@  $(SHELL) $(libgosrcdir)/../testsuite/gotest --goarch=$${GOARCH} --goos=$${GOOS} --basedir=$(libgosrcdir)/.. --srcdir=$(libgosrcdir)/runtime --pkgpath=runtime --pkgfiles="$${files}" $(GOTESTFLAGS) -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v >> runtime-testlog 2>&1 || echo "--- $${fl}: go test runtime (0.00s)" >> runtime-testlog
 @NATIVE_TRUE@  grep '^--- ' runtime-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
-# check-cgo-test runs `go test misc/cgo/test` in our environment.
+# check-cgo-test runs `go test` in misc/cgo/test.
 @NATIVE_TRUE@check-cgo-test: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
 @NATIVE_TRUE@  rm -rf cgo-test-dir cgo-testlog
 @NATIVE_TRUE@  $(MKDIR_P) cgo-test-dir/misc/cgo
@@ -932,18 +932,18 @@ mostlyclean-local:
 @NATIVE_TRUE@  (cd cgo-test-dir/misc/cgo/test && $(abs_builddir)/go$(EXEEXT) test -test.short -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v) >> cgo-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/test (0.00s)" >> cgo-testlog
 @NATIVE_TRUE@  grep '^--- ' cgo-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
-# check-carchive-test runs `go test misc/cgo/testcarchive/carchive_test.go`
+# check-carchive-test runs `go test` in misc/cgo/testcarchive.
 # in our environment.
 @NATIVE_TRUE@check-carchive-test: go$(EXEEXT) $(noinst_PROGRAMS) check-head check-gccgo check-gcc
 @NATIVE_TRUE@  rm -rf carchive-test-dir carchive-testlog
 @NATIVE_TRUE@  $(MKDIR_P) carchive-test-dir/misc/cgo
 @NATIVE_TRUE@  cp -r $(libgomiscdir)/cgo/testcarchive carchive-test-dir/misc/cgo/
 @NATIVE_TRUE@  @abs_libgodir=`cd $(libgodir) && $(PWD_COMMAND)`; \
-@NATIVE_TRUE@  echo "cd carchive-test-dir/misc/cgo/testcarchive && $(ECHO_ENV) LIBRARY_PATH=`echo $${abs_libgodir}/.libs` $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v carchive_test.go" > carchive-testlog
+@NATIVE_TRUE@  echo "cd carchive-test-dir/misc/cgo/testcarchive && $(ECHO_ENV) LIBRARY_PATH=`echo $${abs_libgodir}/.libs` $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v" > carchive-testlog
 @NATIVE_TRUE@  $(CHECK_ENV) \
 @NATIVE_TRUE@  LIBRARY_PATH=`echo $${abs_libgodir}/.libs:$${LIBRARY_PATH} | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; \
 @NATIVE_TRUE@  export LIBRARY_PATH; \
-@NATIVE_TRUE@  (cd carchive-test-dir/misc/cgo/testcarchive && $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v carchive_test.go) >> carchive-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/testcarchive (0.00s)" >> carchive-testlog
+@NATIVE_TRUE@  (cd carchive-test-dir/misc/cgo/testcarchive && $(abs_builddir)/go$(EXEEXT) test -test.timeout=$(GOTOOLS_TEST_TIMEOUT)s -test.v) >> carchive-testlog 2>&1 || echo "--- $${fl}: go test misc/cgo/testcarchive (0.00s)" >> carchive-testlog
 @NATIVE_TRUE@  grep '^--- ' carchive-testlog | sed -e 's/^--- \(.*\) ([^)]*)$$/\1/' | sort -k 2
 
 # check-vet runs `go test cmd/vet` in our environment.
index 37b7480a6716bf92b1efef8db95304e1c997a034..533c99da98483052171040c22b2ef7a3cc76d59e 100644 (file)
@@ -1,4 +1,4 @@
-ac02fdec7cd16ea8d3de1fc33def9cfabec5170d
+60f14fddfee107dedd76c0be6b422a3d8ccc841a
 
 The first line of this file holds the git revision number of the
 last merge done from the master library sources.
index 341bac021ee7f1d69ae7e946cc4ac77634bc4e66..7bdfaa9851369b84a95577ebcc486dc1917aedaa 100644 (file)
@@ -187,6 +187,7 @@ toolexeclibgocrypto_DATA = \
        crypto/des.gox \
        crypto/dsa.gox \
        crypto/ecdsa.gox \
+       crypto/ed25519.gox \
        crypto/elliptic.gox \
        crypto/hmac.gox \
        crypto/md5.gox \
@@ -399,8 +400,7 @@ toolexeclibgounicode_DATA = \
 # internal packages nothing will explicitly depend on them.
 # Force them to be built.
 noinst_DATA = \
-       internal/x/net/internal/nettest.gox \
-       internal/x/net/nettest.gox \
+       golang.org/x/net/nettest.gox \
        internal/testenv.gox \
        internal/trace.gox \
        net/internal/socktest.gox \
@@ -482,7 +482,6 @@ s-version: Makefile
        echo "  BigEndian = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) bigendian`" >> version.go.tmp
        echo "  CacheLineSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) cachelinesize`" >> version.go.tmp
        echo "  DefaultPhysPageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) defaultphyspagesize`" >> version.go.tmp
-       echo "  HugePageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) hugepagesize`" >> version.go.tmp
        echo "  Int64Align = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) int64align`" >> version.go.tmp
        echo "  MinFrameSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) minframesize`" >> version.go.tmp
        echo "  PCQuantum = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) pcquantum`" >> version.go.tmp
@@ -516,14 +515,16 @@ s-objabi: Makefile
        rm -f objabi.go.tmp
        echo "package objabi" > objabi.go.tmp
        echo "import \"runtime\"" >> objabi.go.tmp
-       echo 'func init() { defaultGOROOT = `$(prefix)` }' >> objabi.go.tmp
+       echo 'func defaultGOROOTValue() string { return `$(prefix)` }' >> objabi.go.tmp
        echo 'const defaultGO386 = `sse2`' >> objabi.go.tmp
        echo 'const defaultGOARM = `5`' >> objabi.go.tmp
        echo 'const defaultGOMIPS = `hardfloat`' >> objabi.go.tmp
        echo 'const defaultGOMIPS64 = `hardfloat`' >> objabi.go.tmp
+       echo 'const defaultGOPPC64 = `power8`' >> objabi.go.tmp
        echo 'const defaultGOOS = runtime.GOOS' >> objabi.go.tmp
        echo 'const defaultGOARCH = runtime.GOARCH' >> objabi.go.tmp
        echo 'const defaultGO_EXTLINK_ENABLED = ``' >> objabi.go.tmp
+       echo 'const defaultGO_LDSO = ``' >> objabi.go.tmp
        echo 'const version = `'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'`' >> objabi.go.tmp
        echo 'const stackGuardMultiplierDefault = 1' >> objabi.go.tmp
        echo 'const goexperiment = ``' >> objabi.go.tmp
@@ -591,7 +592,7 @@ s-zstdpkglist: Makefile
        echo 'package goroot' > zstdpkglist.go.tmp
        echo "" >> zstdpkglist.go.tmp
        echo 'var stdpkg = map[string]bool{' >> zstdpkglist.go.tmp
-       echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's|[a-z0-9_/]*_c\.lo||g' | sed 's|\([a-z0-9_/]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp
+       echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's|[a-z0-9_./]*_c\.lo||g' | sed 's|\([a-z0-9_./]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp
        echo '}' >> zstdpkglist.go.tmp
        $(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go
        $(STAMP) $@
@@ -692,13 +693,14 @@ libgo_go_objs = \
        syscall/errno.lo \
        syscall/signame.lo \
        syscall/wait.lo \
-       $(internal_x_net_lif_lo) \
-       $(internal_x_net_route_lo) \
+       $(golangorg_x_net_lif_lo) \
+       $(golangorg_x_net_route_lo) \
        log/syslog/syslog_c.lo \
        $(os_lib_inotify_lo) \
        runtime/internal/atomic_c.lo \
        sync/atomic_c.lo \
-       internal/cpu/cpu_gccgo.lo
+       internal/cpu/cpu_gccgo.lo \
+       golang.org/x/sys/cpu_gccgo.lo
 
 libgo_ldflags = \
        -version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
@@ -1020,6 +1022,11 @@ internal/cpu/cpu_gccgo.lo: go/internal/cpu/cpu_gccgo.c runtime.inc
        @$(MKDIR_P) internal/cpu
        $(LTCOMPILE) -c -o $@ $(srcdir)/go/internal/cpu/cpu_gccgo.c
 
+# Similarly, golang.org/x/sys/cpu needs some C code.
+golang.org/x/sys/cpu_gccgo.lo: go/golang.org/x/sys/cpu/cpu_gccgo.c runtime.inc
+       @$(MKDIR_P) golang.org/x/sys
+       $(LTCOMPILE) -c -o $@ $(srcdir)/go/golang.org/x/sys/cpu/cpu_gccgo.c
+
 # Solaris 11.4 changed the type of fields in struct stat.
 # Use a build tag, based on a configure check, to cope.
 if LIBGO_IS_SOLARIS
@@ -1038,10 +1045,10 @@ if LIBGO_IS_BSD
 
 $(eval $(call PACKAGE_template,internal/x/net/route))
 
-internal_x_net_route_lo = \
-       internal/x/net/route.lo
-internal_x_net_route_check = \
-       internal/x/net/route/check
+golangorg_x_net_route_lo = \
+       golang.org/net/route.lo
+golangorg_x_net_route_check = \
+       golang.org/x/net/route/check
 
 endif
 
@@ -1051,17 +1058,17 @@ if LIBGO_IS_SOLARIS
 
 $(eval $(call PACKAGE_template,internal/x/net/lif))
 
-internal_x_net_lif_lo = \
-       internal/x/net/lif.lo
-internal_x_net_lif_check = \
-       internal/x/net/lif/check
+golangorg_x_net_lif_lo = \
+       golang.org/x/net/lif.lo
+golangorg_x_net_lif_check = \
+       golang.org/x/net/lif/check
 
 endif
 
 TPACKAGES = $(shell cat $(srcdir)/check-packages.txt)
 TEST_PACKAGES = $(addsuffix /check,$(TPACKAGES)) \
-       $(internal_x_net_lif_check) \
-       $(internal_x_net_route_check)
+       $(golangorg_x_net_lif_check) \
+       $(golangorg_x_net_route_check)
 
 check: check-tail
 check-recursive: check-head
index f415ca601167a8673e64848dcfce4f109b57b1a7..751683887a3feb5fe41ad8c02bb5e6c0ea7c2eea 100644 (file)
@@ -218,10 +218,10 @@ LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
 am__DEPENDENCIES_2 = $(addsuffix .lo,$(PACKAGES)) \
        internal/bytealg/bytealg.lo reflect/makefunc_ffi_c.lo \
        $(am__DEPENDENCIES_1) syscall/errno.lo syscall/signame.lo \
-       syscall/wait.lo $(internal_x_net_lif_lo) \
-       $(internal_x_net_route_lo) log/syslog/syslog_c.lo \
+       syscall/wait.lo $(golangorg_x_net_lif_lo) \
+       $(golangorg_x_net_route_lo) log/syslog/syslog_c.lo \
        runtime/internal/atomic_c.lo sync/atomic_c.lo \
-       internal/cpu/cpu_gccgo.lo
+       internal/cpu/cpu_gccgo.lo golang.org/x/sys/cpu_gccgo.lo
 am__DEPENDENCIES_3 =
 am__DEPENDENCIES_4 = $(am__DEPENDENCIES_2) \
        ../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_3) \
@@ -670,6 +670,7 @@ toolexeclibgocrypto_DATA = \
        crypto/des.gox \
        crypto/dsa.gox \
        crypto/ecdsa.gox \
+       crypto/ed25519.gox \
        crypto/elliptic.gox \
        crypto/hmac.gox \
        crypto/md5.gox \
@@ -854,8 +855,7 @@ toolexeclibgounicode_DATA = \
 # Some packages are only needed for tests, so unlike the other
 # internal packages nothing will explicitly depend on them.
 # Force them to be built.
-noinst_DATA = internal/x/net/internal/nettest.gox \
-       internal/x/net/nettest.gox internal/testenv.gox \
+noinst_DATA = golang.org/x/net/nettest.gox internal/testenv.gox \
        internal/trace.gox net/internal/socktest.gox \
        os/signal/internal/pty.gox runtime/pprof/internal/profile.gox \
        zdefaultcc.go
@@ -915,13 +915,14 @@ libgo_go_objs = \
        syscall/errno.lo \
        syscall/signame.lo \
        syscall/wait.lo \
-       $(internal_x_net_lif_lo) \
-       $(internal_x_net_route_lo) \
+       $(golangorg_x_net_lif_lo) \
+       $(golangorg_x_net_route_lo) \
        log/syslog/syslog_c.lo \
        $(os_lib_inotify_lo) \
        runtime/internal/atomic_c.lo \
        sync/atomic_c.lo \
-       internal/cpu/cpu_gccgo.lo
+       internal/cpu/cpu_gccgo.lo \
+       golang.org/x/sys/cpu_gccgo.lo
 
 libgo_ldflags = \
        -version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
@@ -1114,22 +1115,22 @@ extra_check_libs_cmd_vet_internal_cfg = $(abs_builddir)/libgotool.a
 # Use a build tag, based on a configure check, to cope.
 @HAVE_STAT_TIMESPEC_TRUE@@LIBGO_IS_SOLARIS_TRUE@matchargs_os = --tag=solaristag
 @LIBGO_IS_SOLARIS_FALSE@matchargs_os = 
-@LIBGO_IS_BSD_TRUE@internal_x_net_route_lo = \
-@LIBGO_IS_BSD_TRUE@    internal/x/net/route.lo
+@LIBGO_IS_BSD_TRUE@golangorg_x_net_route_lo = \
+@LIBGO_IS_BSD_TRUE@    golang.org/net/route.lo
 
-@LIBGO_IS_BSD_TRUE@internal_x_net_route_check = \
-@LIBGO_IS_BSD_TRUE@    internal/x/net/route/check
+@LIBGO_IS_BSD_TRUE@golangorg_x_net_route_check = \
+@LIBGO_IS_BSD_TRUE@    golang.org/x/net/route/check
 
-@LIBGO_IS_SOLARIS_TRUE@internal_x_net_lif_lo = \
-@LIBGO_IS_SOLARIS_TRUE@        internal/x/net/lif.lo
+@LIBGO_IS_SOLARIS_TRUE@golangorg_x_net_lif_lo = \
+@LIBGO_IS_SOLARIS_TRUE@        golang.org/x/net/lif.lo
 
-@LIBGO_IS_SOLARIS_TRUE@internal_x_net_lif_check = \
-@LIBGO_IS_SOLARIS_TRUE@        internal/x/net/lif/check
+@LIBGO_IS_SOLARIS_TRUE@golangorg_x_net_lif_check = \
+@LIBGO_IS_SOLARIS_TRUE@        golang.org/x/net/lif/check
 
 TPACKAGES = $(shell cat $(srcdir)/check-packages.txt)
 TEST_PACKAGES = $(addsuffix /check,$(TPACKAGES)) \
-       $(internal_x_net_lif_check) \
-       $(internal_x_net_route_check)
+       $(golangorg_x_net_lif_check) \
+       $(golangorg_x_net_route_check)
 
 MOSTLYCLEANFILES = \
        s-runtime_sysinfo s-sigtab s-runtime-inc s-zstdpkglist \
@@ -2597,7 +2598,6 @@ s-version: Makefile
        echo "  BigEndian = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) bigendian`" >> version.go.tmp
        echo "  CacheLineSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) cachelinesize`" >> version.go.tmp
        echo "  DefaultPhysPageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) defaultphyspagesize`" >> version.go.tmp
-       echo "  HugePageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) hugepagesize`" >> version.go.tmp
        echo "  Int64Align = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) int64align`" >> version.go.tmp
        echo "  MinFrameSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) minframesize`" >> version.go.tmp
        echo "  PCQuantum = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) pcquantum`" >> version.go.tmp
@@ -2631,14 +2631,16 @@ s-objabi: Makefile
        rm -f objabi.go.tmp
        echo "package objabi" > objabi.go.tmp
        echo "import \"runtime\"" >> objabi.go.tmp
-       echo 'func init() { defaultGOROOT = `$(prefix)` }' >> objabi.go.tmp
+       echo 'func defaultGOROOTValue() string { return `$(prefix)` }' >> objabi.go.tmp
        echo 'const defaultGO386 = `sse2`' >> objabi.go.tmp
        echo 'const defaultGOARM = `5`' >> objabi.go.tmp
        echo 'const defaultGOMIPS = `hardfloat`' >> objabi.go.tmp
        echo 'const defaultGOMIPS64 = `hardfloat`' >> objabi.go.tmp
+       echo 'const defaultGOPPC64 = `power8`' >> objabi.go.tmp
        echo 'const defaultGOOS = runtime.GOOS' >> objabi.go.tmp
        echo 'const defaultGOARCH = runtime.GOARCH' >> objabi.go.tmp
        echo 'const defaultGO_EXTLINK_ENABLED = ``' >> objabi.go.tmp
+       echo 'const defaultGO_LDSO = ``' >> objabi.go.tmp
        echo 'const version = `'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'`' >> objabi.go.tmp
        echo 'const stackGuardMultiplierDefault = 1' >> objabi.go.tmp
        echo 'const goexperiment = ``' >> objabi.go.tmp
@@ -2700,7 +2702,7 @@ s-zstdpkglist: Makefile
        echo 'package goroot' > zstdpkglist.go.tmp
        echo "" >> zstdpkglist.go.tmp
        echo 'var stdpkg = map[string]bool{' >> zstdpkglist.go.tmp
-       echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's|[a-z0-9_/]*_c\.lo||g' | sed 's|\([a-z0-9_/]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp
+       echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's|[a-z0-9_./]*_c\.lo||g' | sed 's|\([a-z0-9_./]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp
        echo '}' >> zstdpkglist.go.tmp
        $(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go
        $(STAMP) $@
@@ -2876,6 +2878,11 @@ internal/cpu/cpu_gccgo.lo: go/internal/cpu/cpu_gccgo.c runtime.inc
        @$(MKDIR_P) internal/cpu
        $(LTCOMPILE) -c -o $@ $(srcdir)/go/internal/cpu/cpu_gccgo.c
 
+# Similarly, golang.org/x/sys/cpu needs some C code.
+golang.org/x/sys/cpu_gccgo.lo: go/golang.org/x/sys/cpu/cpu_gccgo.c runtime.inc
+       @$(MKDIR_P) golang.org/x/sys
+       $(LTCOMPILE) -c -o $@ $(srcdir)/go/golang.org/x/sys/cpu/cpu_gccgo.c
+
 # Build internal/x/net/route only on BSD systems.
 
 @LIBGO_IS_BSD_TRUE@$(eval $(call PACKAGE_template,internal/x/net/route))
index b9c64397147ebc5dfbbde432a6bb43f9e7448f8b..a49377394febbccc7622f9baadcf636ae37747e9 100644 (file)
@@ -1 +1 @@
-go1.12.2
+go1.13beta1
index 298f9e06261c4248796711f800f9b34b2eb2a092..a13624303dde9fb5d03473b94800508aa9e139e0 100644 (file)
@@ -21,7 +21,6 @@ cmd/go/internal/par
 cmd/go/internal/search
 cmd/go/internal/semver
 cmd/go/internal/txtar
-cmd/go/internal/web2
 cmd/go/internal/work
 cmd/internal/buildid
 cmd/internal/edit
@@ -42,6 +41,7 @@ crypto/cipher
 crypto/des
 crypto/dsa
 crypto/ecdsa
+crypto/ed25519
 crypto/elliptic
 crypto/hmac
 crypto/internal/subtle
@@ -106,20 +106,11 @@ image/png
 index/suffixarray
 internal/cpu
 internal/fmtsort
+internal/oserror
 internal/poll
+internal/reflectlite
 internal/singleflight
 internal/trace
-internal/x/crypto/chacha20poly1305
-internal/x/crypto/cryptobyte
-internal/x/crypto/curve25519
-internal/x/crypto/hkdf
-internal/x/crypto/internal/chacha20
-internal/x/crypto/poly1305
-internal/x/net/dns/dnsmessage
-internal/x/net/http/httpguts
-internal/x/net/http/httpproxy
-internal/x/net/http2/hpack
-internal/x/net/idna
 internal/xcoff
 io
 io/ioutil
index 22ef79c5118008e22785dc197dff990710a78902..ebdffa88437e558fad55b8f4cc1467b246c58853 100755 (executable)
@@ -2542,7 +2542,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 ac_config_headers="$ac_config_headers config.h"
 
 
-libtool_VERSION=14:0:0
+libtool_VERSION=15:0:0
 
 
 # Default to --enable-multilib
@@ -13887,7 +13887,7 @@ go_include="-include"
 # All known GOOS values.  This is the union of all operating systems
 # supported by the gofrontend and all operating systems supported by
 # the gc toolchain.
-ALLGOOS="aix android darwin dragonfly freebsd hurd irix js linux netbsd openbsd plan9 rtems solaris windows"
+ALLGOOS="aix android darwin dragonfly freebsd hurd illumos irix js linux netbsd openbsd plan9 rtems solaris windows"
 
 is_darwin=no
 is_freebsd=no
index 0ae8162a1bafce4cfa633ed8a63e961b1857561a..8a0a04f77ab36779de1ac61ac344a00c66fc8c35 100644 (file)
@@ -10,7 +10,7 @@ AC_INIT(package-unused, version-unused,, libgo)
 AC_CONFIG_SRCDIR(Makefile.am)
 AC_CONFIG_HEADER(config.h)
 
-libtool_VERSION=14:0:0
+libtool_VERSION=15:0:0
 AC_SUBST(libtool_VERSION)
 
 AM_ENABLE_MULTILIB(, ..)
@@ -154,7 +154,7 @@ AC_SUBST(go_include)
 # All known GOOS values.  This is the union of all operating systems
 # supported by the gofrontend and all operating systems supported by
 # the gc toolchain.
-ALLGOOS="aix android darwin dragonfly freebsd hurd irix js linux netbsd openbsd plan9 rtems solaris windows"
+ALLGOOS="aix android darwin dragonfly freebsd hurd illumos irix js linux netbsd openbsd plan9 rtems solaris windows"
 
 is_darwin=no
 is_freebsd=no
index d144485a492496def9c647d2ecdfe9674b06cd72..0a910f33b9d68746e19992bf66bcb2091410b0cf 100644 (file)
@@ -244,7 +244,7 @@ func formatPAXTime(ts time.Time) (s string) {
        if secs < 0 {
                sign = "-"             // Remember sign
                secs = -(secs + 1)     // Add a second to secs
-               nsecs = -(nsecs - 1E9) // Take that second away from nsecs
+               nsecs = -(nsecs - 1e9) // Take that second away from nsecs
        }
        return strings.TrimRight(fmt.Sprintf("%s%d.%09d", sign, secs, nsecs), "0")
 }
index 4cc388cb0f269b88268c3f283f09d86a966dc626..dd3505a758af8d5d17ceae4ecd1c11652952f6b0 100644 (file)
@@ -303,27 +303,27 @@ func TestFormatPAXTime(t *testing.T) {
                {1350244992, 300000000, "1350244992.3"},
                {1350244992, 23960100, "1350244992.0239601"},
                {1350244992, 23960108, "1350244992.023960108"},
-               {+1, +1E9 - 1E0, "1.999999999"},
-               {+1, +1E9 - 1E3, "1.999999"},
-               {+1, +1E9 - 1E6, "1.999"},
-               {+1, +0E0 - 0E0, "1"},
-               {+1, +1E6 - 0E0, "1.001"},
-               {+1, +1E3 - 0E0, "1.000001"},
-               {+1, +1E0 - 0E0, "1.000000001"},
-               {0, 1E9 - 1E0, "0.999999999"},
-               {0, 1E9 - 1E3, "0.999999"},
-               {0, 1E9 - 1E6, "0.999"},
-               {0, 0E0, "0"},
-               {0, 1E6 + 0E0, "0.001"},
-               {0, 1E3 + 0E0, "0.000001"},
-               {0, 1E0 + 0E0, "0.000000001"},
-               {-1, -1E9 + 1E0, "-1.999999999"},
-               {-1, -1E9 + 1E3, "-1.999999"},
-               {-1, -1E9 + 1E6, "-1.999"},
-               {-1, -0E0 + 0E0, "-1"},
-               {-1, -1E6 + 0E0, "-1.001"},
-               {-1, -1E3 + 0E0, "-1.000001"},
-               {-1, -1E0 + 0E0, "-1.000000001"},
+               {+1, +1e9 - 1e0, "1.999999999"},
+               {+1, +1e9 - 1e3, "1.999999"},
+               {+1, +1e9 - 1e6, "1.999"},
+               {+1, +0e0 - 0e0, "1"},
+               {+1, +1e6 - 0e0, "1.001"},
+               {+1, +1e3 - 0e0, "1.000001"},
+               {+1, +1e0 - 0e0, "1.000000001"},
+               {0, 1e9 - 1e0, "0.999999999"},
+               {0, 1e9 - 1e3, "0.999999"},
+               {0, 1e9 - 1e6, "0.999"},
+               {0, 0e0, "0"},
+               {0, 1e6 + 0e0, "0.001"},
+               {0, 1e3 + 0e0, "0.000001"},
+               {0, 1e0 + 0e0, "0.000000001"},
+               {-1, -1e9 + 1e0, "-1.999999999"},
+               {-1, -1e9 + 1e3, "-1.999999"},
+               {-1, -1e9 + 1e6, "-1.999"},
+               {-1, -0e0 + 0e0, "-1"},
+               {-1, -1e6 + 0e0, "-1.001"},
+               {-1, -1e3 + 0e0, "-1.000001"},
+               {-1, -1e0 + 0e0, "-1.000000001"},
                {-1350244992, 0, "-1350244992"},
                {-1350244992, -300000000, "-1350244992.3"},
                {-1350244992, -23960100, "-1350244992.0239601"},
index bd637d185b743c2f75a2e561eeb4854ca2d12abb..686e79781acb69bcefd5017829d12fcf8ccd29a9 100644 (file)
@@ -154,10 +154,15 @@ func (fi headerFileInfo) Size() int64 {
        }
        return int64(fi.fh.UncompressedSize)
 }
-func (fi headerFileInfo) IsDir() bool        { return fi.Mode().IsDir() }
-func (fi headerFileInfo) ModTime() time.Time { return fi.fh.ModTime() }
-func (fi headerFileInfo) Mode() os.FileMode  { return fi.fh.Mode() }
-func (fi headerFileInfo) Sys() interface{}   { return fi.fh }
+func (fi headerFileInfo) IsDir() bool { return fi.Mode().IsDir() }
+func (fi headerFileInfo) ModTime() time.Time {
+       if fi.fh.Modified.IsZero() {
+               return fi.fh.ModTime()
+       }
+       return fi.fh.Modified.UTC()
+}
+func (fi headerFileInfo) Mode() os.FileMode { return fi.fh.Mode() }
+func (fi headerFileInfo) Sys() interface{}  { return fi.fh }
 
 // FileInfoHeader creates a partially-populated FileHeader from an
 // os.FileInfo.
index 3d5c759851a3a4fe0bbfe5e67c057215778ae85f..b3a7caac7f2948d511d180d8c0163ab0aab45977 100644 (file)
@@ -11,7 +11,6 @@ import (
        "errors"
        "fmt"
        "hash"
-       "internal/race"
        "internal/testenv"
        "io"
        "io/ioutil"
@@ -114,6 +113,47 @@ func TestFileHeaderRoundTrip64(t *testing.T) {
        testHeaderRoundTrip(fh, uint32max, fh.UncompressedSize64, t)
 }
 
+func TestFileHeaderRoundTripModified(t *testing.T) {
+       fh := &FileHeader{
+               Name:             "foo.txt",
+               UncompressedSize: 987654321,
+               Modified:         time.Now().Local(),
+               ModifiedTime:     1234,
+               ModifiedDate:     5678,
+       }
+       fi := fh.FileInfo()
+       fh2, err := FileInfoHeader(fi)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if got, want := fh2.Modified, fh.Modified.UTC(); got != want {
+               t.Errorf("Modified: got %s, want %s\n", got, want)
+       }
+       if got, want := fi.ModTime(), fh.Modified.UTC(); got != want {
+               t.Errorf("Modified: got %s, want %s\n", got, want)
+       }
+}
+
+func TestFileHeaderRoundTripWithoutModified(t *testing.T) {
+       fh := &FileHeader{
+               Name:             "foo.txt",
+               UncompressedSize: 987654321,
+               ModifiedTime:     1234,
+               ModifiedDate:     5678,
+       }
+       fi := fh.FileInfo()
+       fh2, err := FileInfoHeader(fi)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if got, want := fh2.ModTime(), fh.ModTime(); got != want {
+               t.Errorf("Modified: got %s, want %s\n", got, want)
+       }
+       if got, want := fi.ModTime(), fh.ModTime(); got != want {
+               t.Errorf("Modified: got %s, want %s\n", got, want)
+       }
+}
+
 type repeatedByte struct {
        off int64
        b   byte
@@ -268,7 +308,7 @@ func TestZip64EdgeCase(t *testing.T) {
 // Tests that we generate a zip64 file if the directory at offset
 // 0xFFFFFFFF, but not before.
 func TestZip64DirectoryOffset(t *testing.T) {
-       if testing.Short() && race.Enabled {
+       if testing.Short() {
                t.Skip("skipping in short mode")
        }
        t.Parallel()
@@ -313,7 +353,7 @@ func TestZip64DirectoryOffset(t *testing.T) {
 
 // At 16k records, we need to generate a zip64 file.
 func TestZip64ManyRecords(t *testing.T) {
-       if testing.Short() && race.Enabled {
+       if testing.Short() {
                t.Skip("skipping in short mode")
        }
        t.Parallel()
index 0125d729d1b31e679ab390d122e1c927c8d5a313..0f05d3b32211ea45417fd159d1817fcb82038d1b 100644 (file)
@@ -197,6 +197,9 @@ func (b *Reader) Discard(n int) (discarded int, err error) {
 func (b *Reader) Read(p []byte) (n int, err error) {
        n = len(p)
        if n == 0 {
+               if b.Buffered() > 0 {
+                       return 0, nil
+               }
                return 0, b.readErr()
        }
        if b.r == b.w {
index f7a0682e7033dd2f4c6b6664b98fd7d1df9fea06..782ca2149aa57bc68aee7221435a57d102fe3e31 100644 (file)
@@ -1481,6 +1481,60 @@ func newScriptedReader(steps ...func(p []byte) (n int, err error)) io.Reader {
        return &sr
 }
 
+// eofReader returns the number of bytes read and io.EOF for the read that consumes the last of the content.
+type eofReader struct {
+       buf []byte
+}
+
+func (r *eofReader) Read(p []byte) (int, error) {
+       read := copy(p, r.buf)
+       r.buf = r.buf[read:]
+
+       switch read {
+       case 0, len(r.buf):
+               // As allowed in the documentation, this will return io.EOF
+               // in the same call that consumes the last of the data.
+               // https://godoc.org/io#Reader
+               return read, io.EOF
+       }
+
+       return read, nil
+}
+
+func TestPartialReadEOF(t *testing.T) {
+       src := make([]byte, 10)
+       eofR := &eofReader{buf: src}
+       r := NewReader(eofR)
+
+       // Start by reading 5 of the 10 available bytes.
+       dest := make([]byte, 5)
+       read, err := r.Read(dest)
+       if err != nil {
+               t.Fatalf("unexpected error: %v", err)
+       }
+       if n := len(dest); read != n {
+               t.Fatalf("read %d bytes; wanted %d bytes", read, n)
+       }
+
+       // The Reader should have buffered all the content from the io.Reader.
+       if n := len(eofR.buf); n != 0 {
+               t.Fatalf("got %d bytes left in bufio.Reader source; want 0 bytes", n)
+       }
+       // To prove the point, check that there are still 5 bytes available to read.
+       if n := r.Buffered(); n != 5 {
+               t.Fatalf("got %d bytes buffered in bufio.Reader; want 5 bytes", n)
+       }
+
+       // This is the second read of 0 bytes.
+       read, err = r.Read([]byte{})
+       if err != nil {
+               t.Fatalf("unexpected error: %v", err)
+       }
+       if read != 0 {
+               t.Fatalf("read %d bytes; want 0 bytes", read)
+       }
+}
+
 func BenchmarkReaderCopyOptimal(b *testing.B) {
        // Optimal case is where the underlying reader implements io.WriterTo
        srcBuf := bytes.NewBuffer(make([]byte, 8192))
index 4666e6d985561c565ba95c016cda2149cc00373a..8885d40549f1532010a320d00964f19bffbb5846 100644 (file)
@@ -31,6 +31,19 @@ func ExampleScanner_lines() {
        }
 }
 
+// Return the most recent call to Scan as a []byte.
+func ExampleScanner_Bytes() {
+       scanner := bufio.NewScanner(strings.NewReader("gopher"))
+       for scanner.Scan() {
+               fmt.Println(len(scanner.Bytes()) == 6)
+       }
+       if err := scanner.Err(); err != nil {
+               fmt.Fprintln(os.Stderr, "shouldn't see an error scanning a string")
+       }
+       // Output:
+       // true
+}
+
 // Use a Scanner to implement a simple word-count utility by scanning the
 // input as a sequence of space-delimited tokens.
 func ExampleScanner_words() {
@@ -94,6 +107,9 @@ func ExampleScanner_emptyFinalToken() {
                                return i + 1, data[:i], nil
                        }
                }
+               if !atEOF {
+                       return 0, nil, nil
+               }
                // There is one final token to be delivered, which may be the empty string.
                // Returning bufio.ErrFinalToken here tells Scan there are no more tokens after this
                // but does not trigger an error to be returned from Scan itself.
index cefd26146479ebf7b3c1074640c955133d9db3a6..4e787c4b0a427669527376127ea4140f1386bce5 100644 (file)
@@ -73,7 +73,7 @@ var (
 
 const (
        // MaxScanTokenSize is the maximum size used to buffer a token
-       // unless the user provides an explicit buffer with Scan.Buffer.
+       // unless the user provides an explicit buffer with Scanner.Buffer.
        // The actual maximum token size may be smaller as the buffer
        // may need to include, for instance, a newline.
        MaxScanTokenSize = 64 * 1024
index c78fe09ea66022cceff857fb883aa93e4f342f59..01190e99002d441da5a477fa9ec7c8f36a0df44b 100644 (file)
@@ -151,7 +151,7 @@ func delete(m map[Type]Type1, key Type)
 //     Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
 //     String: the number of bytes in v.
 //     Channel: the number of elements queued (unread) in the channel buffer;
-//     if v is nil, len(v) is zero.
+//              if v is nil, len(v) is zero.
 // For some arguments, such as a string literal or a simple array expression, the
 // result can be a constant. See the Go language specification's "Length and
 // capacity" section for details.
@@ -226,10 +226,9 @@ func close(c chan<- Type)
 // invocation of F then behaves like a call to panic, terminating G's
 // execution and running any deferred functions. This continues until all
 // functions in the executing goroutine have stopped, in reverse order. At
-// that point, the program is terminated and the error condition is reported,
-// including the value of the argument to panic. This termination sequence
-// is called panicking and can be controlled by the built-in function
-// recover.
+// that point, the program is terminated with a non-zero exit code. This
+// termination sequence is called panicking and can be controlled by the
+// built-in function recover.
 func panic(v interface{})
 
 // The recover built-in function allows a program to manage behavior of a
index aff2db5084f11e20657f9e61897f278b26e626fc..f19a4cfff0926c7eba61cead788062b074b1a091 100644 (file)
@@ -21,9 +21,6 @@ type Buffer struct {
        buf      []byte // contents are the bytes buf[off : len(buf)]
        off      int    // read at &buf[off], write at &buf[len(buf)]
        lastRead readOp // last read operation, so that Unread* can work correctly.
-
-       // FIXME: it would be advisable to align Buffer to cachelines to avoid false
-       // sharing.
 }
 
 // The readOp constants describe the last action performed on
@@ -385,13 +382,15 @@ func (b *Buffer) UnreadRune() error {
        return nil
 }
 
+var errUnreadByte = errors.New("bytes.Buffer: UnreadByte: previous operation was not a successful read")
+
 // UnreadByte unreads the last byte returned by the most recent successful
 // read operation that read at least one byte. If a write has happened since
 // the last read, if the last read returned an error, or if the read read zero
 // bytes, UnreadByte returns an error.
 func (b *Buffer) UnreadByte() error {
        if b.lastRead == opInvalid {
-               return errors.New("bytes.Buffer: UnreadByte: previous operation was not a successful read")
+               return errUnreadByte
        }
        b.lastRead = opInvalid
        if b.off > 0 {
index 6e9d6952a51a588f8627a6bd4fbba291040dc98d..7626d277d4f489251303a53022ac258db89fdf13 100644 (file)
@@ -131,11 +131,8 @@ func TestBasicOperations(t *testing.T) {
                check(t, "TestBasicOperations (3)", &buf, "")
 
                n, err := buf.Write(testBytes[0:1])
-               if n != 1 {
-                       t.Errorf("wrote 1 byte, but n == %d", n)
-               }
-               if err != nil {
-                       t.Errorf("err should always be nil, but err == %s", err)
+               if want := 1; err != nil || n != want {
+                       t.Errorf("Write: got (%d, %v), want (%d, %v)", n, err, want, nil)
                }
                check(t, "TestBasicOperations (4)", &buf, "a")
 
@@ -143,8 +140,8 @@ func TestBasicOperations(t *testing.T) {
                check(t, "TestBasicOperations (5)", &buf, "ab")
 
                n, err = buf.Write(testBytes[2:26])
-               if n != 24 {
-                       t.Errorf("wrote 24 bytes, but n == %d", n)
+               if want := 24; err != nil || n != want {
+                       t.Errorf("Write: got (%d, %v), want (%d, %v)", n, err, want, nil)
                }
                check(t, "TestBasicOperations (6)", &buf, testString[0:26])
 
@@ -159,15 +156,12 @@ func TestBasicOperations(t *testing.T) {
 
                buf.WriteByte(testString[1])
                c, err := buf.ReadByte()
-               if err != nil {
-                       t.Error("ReadByte unexpected eof")
-               }
-               if c != testString[1] {
-                       t.Errorf("ReadByte wrong value c=%v", c)
+               if want := testString[1]; err != nil || c != want {
+                       t.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c, err, want, nil)
                }
                c, err = buf.ReadByte()
-               if err == nil {
-                       t.Error("ReadByte unexpected not eof")
+               if err != io.EOF {
+                       t.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c, err, byte(0), io.EOF)
                }
        }
 }
index daf4a32f26f29e25159ba1ec1c64f785536f1835..eb13212384954a772dba3083612b3069e0fe60f4 100644 (file)
@@ -12,23 +12,12 @@ import (
        "unicode/utf8"
 )
 
-// Equal returns a boolean reporting whether a and b
+// Equal reports whether a and b
 // are the same length and contain the same bytes.
 // A nil argument is equivalent to an empty slice.
 func Equal(a, b []byte) bool {
-       return bytealg.Equal(a, b)
-}
-
-func equalPortable(a, b []byte) bool {
-       if len(a) != len(b) {
-               return false
-       }
-       for i, c := range a {
-               if c != b[i] {
-                       return false
-               }
-       }
-       return true
+       // Neither cmd/compile nor gccgo allocates for these string conversions.
+       return string(a) == string(b)
 }
 
 // Compare returns an integer comparing two byte slices lexicographically.
@@ -114,12 +103,34 @@ func indexBytePortable(s []byte, c byte) int {
 // LastIndex returns the index of the last instance of sep in s, or -1 if sep is not present in s.
 func LastIndex(s, sep []byte) int {
        n := len(sep)
-       if n == 0 {
+       switch {
+       case n == 0:
                return len(s)
+       case n == 1:
+               return LastIndexByte(s, sep[0])
+       case n == len(s):
+               if Equal(s, sep) {
+                       return 0
+               }
+               return -1
+       case n > len(s):
+               return -1
        }
-       c := sep[0]
-       for i := len(s) - n; i >= 0; i-- {
-               if s[i] == c && (n == 1 || Equal(s[i:i+n], sep)) {
+       // Rabin-Karp search from the end of the string
+       hashss, pow := hashStrRev(sep)
+       last := len(s) - n
+       var h uint32
+       for i := len(s) - 1; i >= last; i-- {
+               h = h*primeRK + uint32(s[i])
+       }
+       if h == hashss && Equal(s[last:], sep) {
+               return last
+       }
+       for i := last - 1; i >= 0; i-- {
+               h *= primeRK
+               h += uint32(s[i])
+               h -= pow * uint32(s[i+n])
+               if h == hashss && Equal(s[i:i+n], sep) {
                        return i
                }
        }
@@ -477,13 +488,16 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
 // It panics if count is negative or if
 // the result of (len(b) * count) overflows.
 func Repeat(b []byte, count int) []byte {
+       if count == 0 {
+               return []byte{}
+       }
        // Since we cannot return an error on overflow,
        // we should panic if the repeat will generate
        // an overflow.
        // See Issue golang.org/issue/16237.
        if count < 0 {
                panic("bytes: negative Repeat count")
-       } else if count > 0 && len(b)*count/count != len(b) {
+       } else if len(b)*count/count != len(b) {
                panic("bytes: Repeat count causes overflow")
        }
 
@@ -496,11 +510,66 @@ func Repeat(b []byte, count int) []byte {
        return nb
 }
 
-// ToUpper treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters within it mapped to their upper case.
-func ToUpper(s []byte) []byte { return Map(unicode.ToUpper, s) }
+// ToUpper returns a copy of the byte slice s with all Unicode letters mapped to
+// their upper case.
+func ToUpper(s []byte) []byte {
+       isASCII, hasLower := true, false
+       for i := 0; i < len(s); i++ {
+               c := s[i]
+               if c >= utf8.RuneSelf {
+                       isASCII = false
+                       break
+               }
+               hasLower = hasLower || ('a' <= c && c <= 'z')
+       }
+
+       if isASCII { // optimize for ASCII-only byte slices.
+               if !hasLower {
+                       // Just return a copy.
+                       return append([]byte(""), s...)
+               }
+               b := make([]byte, len(s))
+               for i := 0; i < len(s); i++ {
+                       c := s[i]
+                       if 'a' <= c && c <= 'z' {
+                               c -= 'a' - 'A'
+                       }
+                       b[i] = c
+               }
+               return b
+       }
+       return Map(unicode.ToUpper, s)
+}
 
-// ToLower treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters mapped to their lower case.
-func ToLower(s []byte) []byte { return Map(unicode.ToLower, s) }
+// ToLower returns a copy of the byte slice s with all Unicode letters mapped to
+// their lower case.
+func ToLower(s []byte) []byte {
+       isASCII, hasUpper := true, false
+       for i := 0; i < len(s); i++ {
+               c := s[i]
+               if c >= utf8.RuneSelf {
+                       isASCII = false
+                       break
+               }
+               hasUpper = hasUpper || ('A' <= c && c <= 'Z')
+       }
+
+       if isASCII { // optimize for ASCII-only byte slices.
+               if !hasUpper {
+                       return append([]byte(""), s...)
+               }
+               b := make([]byte, len(s))
+               for i := 0; i < len(s); i++ {
+                       c := s[i]
+                       if 'A' <= c && c <= 'Z' {
+                               c += 'a' - 'A'
+                       }
+                       b[i] = c
+               }
+               return b
+       }
+       return Map(unicode.ToLower, s)
+}
 
 // ToTitle treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters mapped to their title case.
 func ToTitle(s []byte) []byte { return Map(unicode.ToTitle, s) }
@@ -523,6 +592,35 @@ func ToTitleSpecial(c unicode.SpecialCase, s []byte) []byte {
        return Map(c.ToTitle, s)
 }
 
+// ToValidUTF8 treats s as UTF-8-encoded bytes and returns a copy with each run of bytes
+// representing invalid UTF-8 replaced with the bytes in replacement, which may be empty.
+func ToValidUTF8(s, replacement []byte) []byte {
+       b := make([]byte, 0, len(s)+len(replacement))
+       invalid := false // previous byte was from an invalid UTF-8 sequence
+       for i := 0; i < len(s); {
+               c := s[i]
+               if c < utf8.RuneSelf {
+                       i++
+                       invalid = false
+                       b = append(b, byte(c))
+                       continue
+               }
+               _, wid := utf8.DecodeRune(s[i:])
+               if wid == 1 {
+                       i++
+                       if !invalid {
+                               invalid = true
+                               b = append(b, replacement...)
+                       }
+                       continue
+               }
+               invalid = false
+               b = append(b, s[i:i+wid]...)
+               i += wid
+       }
+       return b
+}
+
 // isSeparator reports whether the rune could mark a word boundary.
 // TODO: update when package unicode captures more of the properties.
 func isSeparator(r rune) bool {
@@ -734,7 +832,41 @@ func TrimRight(s []byte, cutset string) []byte {
 // TrimSpace returns a subslice of s by slicing off all leading and
 // trailing white space, as defined by Unicode.
 func TrimSpace(s []byte) []byte {
-       return TrimFunc(s, unicode.IsSpace)
+       // Fast path for ASCII: look for the first ASCII non-space byte
+       start := 0
+       for ; start < len(s); start++ {
+               c := s[start]
+               if c >= utf8.RuneSelf {
+                       // If we run into a non-ASCII byte, fall back to the
+                       // slower unicode-aware method on the remaining bytes
+                       return TrimFunc(s[start:], unicode.IsSpace)
+               }
+               if asciiSpace[c] == 0 {
+                       break
+               }
+       }
+
+       // Now look for the first ASCII non-space byte from the end
+       stop := len(s)
+       for ; stop > start; stop-- {
+               c := s[stop-1]
+               if c >= utf8.RuneSelf {
+                       return TrimFunc(s[start:stop], unicode.IsSpace)
+               }
+               if asciiSpace[c] == 0 {
+                       break
+               }
+       }
+
+       // At this point s[start:stop] starts and ends with an ASCII
+       // non-space bytes, so we're done. Non-ASCII cases have already
+       // been handled above.
+       if start == stop {
+               // Special case to preserve previous TrimLeftFunc behavior,
+               // returning nil instead of empty slice if all spaces.
+               return nil
+       }
+       return s[start:stop]
 }
 
 // Runes interprets s as a sequence of UTF-8-encoded code points.
@@ -987,3 +1119,20 @@ func hashStr(sep []byte) (uint32, uint32) {
        }
        return hash, pow
 }
+
+// hashStrRev returns the hash of the reverse of sep and the
+// appropriate multiplicative factor for use in Rabin-Karp algorithm.
+func hashStrRev(sep []byte) (uint32, uint32) {
+       hash := uint32(0)
+       for i := len(sep) - 1; i >= 0; i-- {
+               hash = hash*primeRK + uint32(sep[i])
+       }
+       var pow, sq uint32 = 1, primeRK
+       for i := len(sep); i > 0; i >>= 1 {
+               if i&1 != 0 {
+                       pow *= sq
+               }
+               sq *= sq
+       }
+       return hash, pow
+}
index ec4ecf31032c525373af1900abd3bcdc1355b202..ebff5f00e58054d587f7c0f9e51399b25455d670 100644 (file)
@@ -52,15 +52,17 @@ type BinOpTest struct {
 }
 
 func TestEqual(t *testing.T) {
-       for _, tt := range compareTests {
-               eql := Equal(tt.a, tt.b)
-               if eql != (tt.i == 0) {
-                       t.Errorf(`Equal(%q, %q) = %v`, tt.a, tt.b, eql)
-               }
-               eql = EqualPortable(tt.a, tt.b)
-               if eql != (tt.i == 0) {
-                       t.Errorf(`EqualPortable(%q, %q) = %v`, tt.a, tt.b, eql)
+       // Run the tests and check for allocation at the same time.
+       allocs := testing.AllocsPerRun(10, func() {
+               for _, tt := range compareTests {
+                       eql := Equal(tt.a, tt.b)
+                       if eql != (tt.i == 0) {
+                               t.Errorf(`Equal(%q, %q) = %v`, tt.a, tt.b, eql)
+                       }
                }
+       })
+       if allocs > 0 {
+               t.Errorf("Equal allocated %v times", allocs)
        }
 }
 
@@ -577,11 +579,6 @@ func BenchmarkEqual(b *testing.B) {
        benchBytes(b, sizes, bmEqual(Equal))
 }
 
-func BenchmarkEqualPort(b *testing.B) {
-       sizes := []int{1, 6, 32, 4 << 10, 4 << 20, 64 << 20}
-       benchBytes(b, sizes, bmEqual(EqualPortable))
-}
-
 func bmEqual(equal func([]byte, []byte) bool) func(b *testing.B, n int) {
        return func(b *testing.B, n int) {
                if len(bmbuf) < 2*n {
@@ -682,34 +679,6 @@ func BenchmarkCountSingle(b *testing.B) {
        })
 }
 
-type ExplodeTest struct {
-       s string
-       n int
-       a []string
-}
-
-var explodetests = []ExplodeTest{
-       {"", -1, []string{}},
-       {abcd, -1, []string{"a", "b", "c", "d"}},
-       {faces, -1, []string{"☺", "☻", "☹"}},
-       {abcd, 2, []string{"a", "bcd"}},
-}
-
-func TestExplode(t *testing.T) {
-       for _, tt := range explodetests {
-               a := SplitN([]byte(tt.s), nil, tt.n)
-               result := sliceOfString(a)
-               if !eq(result, tt.a) {
-                       t.Errorf(`Explode("%s", %d) = %v; want %v`, tt.s, tt.n, result, tt.a)
-                       continue
-               }
-               s := Join(a, []byte{})
-               if string(s) != tt.s {
-                       t.Errorf(`Join(Explode("%s", %d), "") = "%s"`, tt.s, tt.n, s)
-               }
-       }
-}
-
 type SplitTest struct {
        s   string
        sep string
@@ -718,7 +687,9 @@ type SplitTest struct {
 }
 
 var splittests = []SplitTest{
+       {"", "", -1, []string{}},
        {abcd, "a", 0, nil},
+       {abcd, "", 2, []string{"a", "bcd"}},
        {abcd, "a", -1, []string{"", "bcd"}},
        {abcd, "z", -1, []string{"abcd"}},
        {abcd, "", -1, []string{"a", "b", "c", "d"}},
@@ -748,7 +719,7 @@ func TestSplit(t *testing.T) {
                        t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a)
                        continue
                }
-               if tt.n == 0 {
+               if tt.n == 0 || len(a) == 0 {
                        continue
                }
 
@@ -914,54 +885,72 @@ func TestFieldsFunc(t *testing.T) {
 }
 
 // Test case for any function which accepts and returns a byte slice.
-// For ease of creation, we write the byte slices as strings.
+// For ease of creation, we write the input byte slice as a string.
 type StringTest struct {
-       in, out string
+       in  string
+       out []byte
 }
 
 var upperTests = []StringTest{
-       {"", ""},
-       {"abc", "ABC"},
-       {"AbC123", "ABC123"},
-       {"azAZ09_", "AZAZ09_"},
-       {"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char
+       {"", []byte("")},
+       {"ONLYUPPER", []byte("ONLYUPPER")},
+       {"abc", []byte("ABC")},
+       {"AbC123", []byte("ABC123")},
+       {"azAZ09_", []byte("AZAZ09_")},
+       {"longStrinGwitHmixofsmaLLandcAps", []byte("LONGSTRINGWITHMIXOFSMALLANDCAPS")},
+       {"long\u0250string\u0250with\u0250nonascii\u2C6Fchars", []byte("LONG\u2C6FSTRING\u2C6FWITH\u2C6FNONASCII\u2C6FCHARS")},
+       {"\u0250\u0250\u0250\u0250\u0250", []byte("\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F")}, // grows one byte per char
+       {"a\u0080\U0010FFFF", []byte("A\u0080\U0010FFFF")},                           // test utf8.RuneSelf and utf8.MaxRune
 }
 
 var lowerTests = []StringTest{
-       {"", ""},
-       {"abc", "abc"},
-       {"AbC123", "abc123"},
-       {"azAZ09_", "azaz09_"},
-       {"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", "\u0251\u0251\u0251\u0251\u0251"}, // shrinks one byte per char
+       {"", []byte("")},
+       {"abc", []byte("abc")},
+       {"AbC123", []byte("abc123")},
+       {"azAZ09_", []byte("azaz09_")},
+       {"longStrinGwitHmixofsmaLLandcAps", []byte("longstringwithmixofsmallandcaps")},
+       {"LONG\u2C6FSTRING\u2C6FWITH\u2C6FNONASCII\u2C6FCHARS", []byte("long\u0250string\u0250with\u0250nonascii\u0250chars")},
+       {"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", []byte("\u0251\u0251\u0251\u0251\u0251")}, // shrinks one byte per char
+       {"A\u0080\U0010FFFF", []byte("a\u0080\U0010FFFF")},                           // test utf8.RuneSelf and utf8.MaxRune
 }
 
 const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000"
 
 var trimSpaceTests = []StringTest{
-       {"", ""},
-       {"abc", "abc"},
-       {space + "abc" + space, "abc"},
-       {" ", ""},
-       {" \t\r\n \t\t\r\r\n\n ", ""},
-       {" \t\r\n x\t\t\r\r\n\n ", "x"},
-       {" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"},
-       {"1 \t\r\n2", "1 \t\r\n2"},
-       {" x\x80", "x\x80"},
-       {" x\xc0", "x\xc0"},
-       {"x \xc0\xc0 ", "x \xc0\xc0"},
-       {"x \xc0", "x \xc0"},
-       {"x \xc0 ", "x \xc0"},
-       {"x \xc0\xc0 ", "x \xc0\xc0"},
-       {"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"},
-       {"x ☺ ", "x ☺"},
+       {"", nil},
+       {"  a", []byte("a")},
+       {"b  ", []byte("b")},
+       {"abc", []byte("abc")},
+       {space + "abc" + space, []byte("abc")},
+       {" ", nil},
+       {"\u3000 ", nil},
+       {" \u3000", nil},
+       {" \t\r\n \t\t\r\r\n\n ", nil},
+       {" \t\r\n x\t\t\r\r\n\n ", []byte("x")},
+       {" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", []byte("x\t\t\r\r\ny")},
+       {"1 \t\r\n2", []byte("1 \t\r\n2")},
+       {" x\x80", []byte("x\x80")},
+       {" x\xc0", []byte("x\xc0")},
+       {"x \xc0\xc0 ", []byte("x \xc0\xc0")},
+       {"x \xc0", []byte("x \xc0")},
+       {"x \xc0 ", []byte("x \xc0")},
+       {"x \xc0\xc0 ", []byte("x \xc0\xc0")},
+       {"x ☺\xc0\xc0 ", []byte("x ☺\xc0\xc0")},
+       {"x ☺ ", []byte("x ☺")},
 }
 
 // Execute f on each test case.  funcName should be the name of f; it's used
 // in failure reports.
 func runStringTests(t *testing.T, f func([]byte) []byte, funcName string, testCases []StringTest) {
        for _, tc := range testCases {
-               actual := string(f([]byte(tc.in)))
-               if actual != tc.out {
+               actual := f([]byte(tc.in))
+               if actual == nil && tc.out != nil {
+                       t.Errorf("%s(%q) = nil; want %q", funcName, tc.in, tc.out)
+               }
+               if actual != nil && tc.out == nil {
+                       t.Errorf("%s(%q) = %q; want nil", funcName, tc.in, actual)
+               }
+               if !Equal(actual, tc.out) {
                        t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out)
                }
        }
@@ -1049,6 +1038,64 @@ func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTest
 
 func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) }
 
+func BenchmarkToUpper(b *testing.B) {
+       for _, tc := range upperTests {
+               tin := []byte(tc.in)
+               b.Run(tc.in, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               actual := ToUpper(tin)
+                               if !Equal(actual, tc.out) {
+                                       b.Errorf("ToUpper(%q) = %q; want %q", tc.in, actual, tc.out)
+                               }
+                       }
+               })
+       }
+}
+
+func BenchmarkToLower(b *testing.B) {
+       for _, tc := range lowerTests {
+               tin := []byte(tc.in)
+               b.Run(tc.in, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               actual := ToLower(tin)
+                               if !Equal(actual, tc.out) {
+                                       b.Errorf("ToLower(%q) = %q; want %q", tc.in, actual, tc.out)
+                               }
+                       }
+               })
+       }
+}
+
+var toValidUTF8Tests = []struct {
+       in   string
+       repl string
+       out  string
+}{
+       {"", "\uFFFD", ""},
+       {"abc", "\uFFFD", "abc"},
+       {"\uFDDD", "\uFFFD", "\uFDDD"},
+       {"a\xffb", "\uFFFD", "a\uFFFDb"},
+       {"a\xffb\uFFFD", "X", "aXb\uFFFD"},
+       {"a☺\xffb☺\xC0\xAFc☺\xff", "", "a☺b☺c☺"},
+       {"a☺\xffb☺\xC0\xAFc☺\xff", "日本語", "a☺日本語b☺日本語c☺日本語"},
+       {"\xC0\xAF", "\uFFFD", "\uFFFD"},
+       {"\xE0\x80\xAF", "\uFFFD", "\uFFFD"},
+       {"\xed\xa0\x80", "abc", "abc"},
+       {"\xed\xbf\xbf", "\uFFFD", "\uFFFD"},
+       {"\xF0\x80\x80\xaf", "☺", "☺"},
+       {"\xF8\x80\x80\x80\xAF", "\uFFFD", "\uFFFD"},
+       {"\xFC\x80\x80\x80\x80\xAF", "\uFFFD", "\uFFFD"},
+}
+
+func TestToValidUTF8(t *testing.T) {
+       for _, tc := range toValidUTF8Tests {
+               got := ToValidUTF8([]byte(tc.in), []byte(tc.repl))
+               if !Equal(got, []byte(tc.out)) {
+                       t.Errorf("ToValidUTF8(%q, %q) = %q; want %q", tc.in, tc.repl, got, tc.out)
+               }
+       }
+}
+
 func TestTrimSpace(t *testing.T) { runStringTests(t, TrimSpace, "TrimSpace", trimSpaceTests) }
 
 type RepeatTest struct {
@@ -1255,8 +1302,11 @@ var isValidRune = predicate{
 }
 
 type TrimFuncTest struct {
-       f       predicate
-       in, out string
+       f        predicate
+       in       string
+       trimOut  []byte
+       leftOut  []byte
+       rightOut []byte
 }
 
 func not(p predicate) predicate {
@@ -1269,20 +1319,68 @@ func not(p predicate) predicate {
 }
 
 var trimFuncTests = []TrimFuncTest{
-       {isSpace, space + " hello " + space, "hello"},
-       {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"},
-       {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"},
-       {not(isSpace), "hello" + space + "hello", space},
-       {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"},
-       {isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"},
-       {not(isValidRune), "\xc0a\xc0", "a"},
+       {isSpace, space + " hello " + space,
+               []byte("hello"),
+               []byte("hello " + space),
+               []byte(space + " hello")},
+       {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51",
+               []byte("hello"),
+               []byte("hello34\u0e50\u0e51"),
+               []byte("\u0e50\u0e5212hello")},
+       {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F",
+               []byte("hello"),
+               []byte("helloEF\u2C6F\u2C6FGH\u2C6F\u2C6F"),
+               []byte("\u2C6F\u2C6F\u2C6F\u2C6FABCDhello")},
+       {not(isSpace), "hello" + space + "hello",
+               []byte(space),
+               []byte(space + "hello"),
+               []byte("hello" + space)},
+       {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo",
+               []byte("\u0e50\u0e521234\u0e50\u0e51"),
+               []byte("\u0e50\u0e521234\u0e50\u0e51helo"),
+               []byte("hello\u0e50\u0e521234\u0e50\u0e51")},
+       {isValidRune, "ab\xc0a\xc0cd",
+               []byte("\xc0a\xc0"),
+               []byte("\xc0a\xc0cd"),
+               []byte("ab\xc0a\xc0")},
+       {not(isValidRune), "\xc0a\xc0",
+               []byte("a"),
+               []byte("a\xc0"),
+               []byte("\xc0a")},
+       // The nils returned by TrimLeftFunc are odd behavior, but we need
+       // to preserve backwards compatibility.
+       {isSpace, "",
+               nil,
+               nil,
+               []byte("")},
+       {isSpace, " ",
+               nil,
+               nil,
+               []byte("")},
 }
 
 func TestTrimFunc(t *testing.T) {
        for _, tc := range trimFuncTests {
-               actual := string(TrimFunc([]byte(tc.in), tc.f.f))
-               if actual != tc.out {
-                       t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out)
+               trimmers := []struct {
+                       name string
+                       trim func(s []byte, f func(r rune) bool) []byte
+                       out  []byte
+               }{
+                       {"TrimFunc", TrimFunc, tc.trimOut},
+                       {"TrimLeftFunc", TrimLeftFunc, tc.leftOut},
+                       {"TrimRightFunc", TrimRightFunc, tc.rightOut},
+               }
+               for _, trimmer := range trimmers {
+                       actual := trimmer.trim([]byte(tc.in), tc.f.f)
+                       if actual == nil && trimmer.out != nil {
+                               t.Errorf("%s(%q, %q) = nil; want %q", trimmer.name, tc.in, tc.f.name, trimmer.out)
+                       }
+                       if actual != nil && trimmer.out == nil {
+                               t.Errorf("%s(%q, %q) = %q; want nil", trimmer.name, tc.in, tc.f.name, actual)
+                       }
+                       if !Equal(actual, trimmer.out) {
+                               t.Errorf("%s(%q, %q) = %q; want %q", trimmer.name, tc.in, tc.f.name, actual, trimmer.out)
+                       }
                }
        }
 }
@@ -1622,9 +1720,41 @@ func BenchmarkFieldsFunc(b *testing.B) {
 }
 
 func BenchmarkTrimSpace(b *testing.B) {
-       s := []byte("  Some text.  \n")
-       for i := 0; i < b.N; i++ {
-               TrimSpace(s)
+       tests := []struct {
+               name  string
+               input []byte
+       }{
+               {"NoTrim", []byte("typical")},
+               {"ASCII", []byte("  foo bar  ")},
+               {"SomeNonASCII", []byte("    \u2000\t\r\n x\t\t\r\r\ny\n \u3000    ")},
+               {"JustNonASCII", []byte("\u2000\u2000\u2000☺☺☺☺\u3000\u3000\u3000")},
+       }
+       for _, test := range tests {
+               b.Run(test.name, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               TrimSpace(test.input)
+                       }
+               })
+       }
+}
+
+func BenchmarkToValidUTF8(b *testing.B) {
+       tests := []struct {
+               name  string
+               input []byte
+       }{
+               {"Valid", []byte("typical")},
+               {"InvalidASCII", []byte("foo\xffbar")},
+               {"InvalidNonASCII", []byte("日本語\xff日本語")},
+       }
+       replacement := []byte("\uFFFD")
+       b.ResetTimer()
+       for _, test := range tests {
+               b.Run(test.name, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               ToValidUTF8(test.input, replacement)
+                       }
+               })
        }
 }
 
@@ -1647,6 +1777,39 @@ func makeBenchInputHard() []byte {
 
 var benchInputHard = makeBenchInputHard()
 
+func benchmarkIndexHard(b *testing.B, sep []byte) {
+       for i := 0; i < b.N; i++ {
+               Index(benchInputHard, sep)
+       }
+}
+
+func benchmarkLastIndexHard(b *testing.B, sep []byte) {
+       for i := 0; i < b.N; i++ {
+               LastIndex(benchInputHard, sep)
+       }
+}
+
+func benchmarkCountHard(b *testing.B, sep []byte) {
+       for i := 0; i < b.N; i++ {
+               Count(benchInputHard, sep)
+       }
+}
+
+func BenchmarkIndexHard1(b *testing.B) { benchmarkIndexHard(b, []byte("<>")) }
+func BenchmarkIndexHard2(b *testing.B) { benchmarkIndexHard(b, []byte("</pre>")) }
+func BenchmarkIndexHard3(b *testing.B) { benchmarkIndexHard(b, []byte("<b>hello world</b>")) }
+func BenchmarkIndexHard4(b *testing.B) {
+       benchmarkIndexHard(b, []byte("<pre><b>hello</b><strong>world</strong></pre>"))
+}
+
+func BenchmarkLastIndexHard1(b *testing.B) { benchmarkLastIndexHard(b, []byte("<>")) }
+func BenchmarkLastIndexHard2(b *testing.B) { benchmarkLastIndexHard(b, []byte("</pre>")) }
+func BenchmarkLastIndexHard3(b *testing.B) { benchmarkLastIndexHard(b, []byte("<b>hello world</b>")) }
+
+func BenchmarkCountHard1(b *testing.B) { benchmarkCountHard(b, []byte("<>")) }
+func BenchmarkCountHard2(b *testing.B) { benchmarkCountHard(b, []byte("</pre>")) }
+func BenchmarkCountHard3(b *testing.B) { benchmarkCountHard(b, []byte("<b>hello world</b>")) }
+
 func BenchmarkSplitEmptySeparator(b *testing.B) {
        for i := 0; i < b.N; i++ {
                Split(benchInputHard, nil)
index 6d328378fabdc48a99aff201905487aa12131521..5ba7077c1de8532ada65dbef0980f501bcd17e2d 100644 (file)
@@ -365,6 +365,16 @@ func ExampleToTitle() {
        // ХЛЕБ
 }
 
+func ExampleToTitleSpecial() {
+       str := []byte("ahoj vývojári golang")
+       totitle := bytes.ToTitleSpecial(unicode.AzeriCase, str)
+       fmt.Println("Original : " + string(str))
+       fmt.Println("ToTitle : " + string(totitle))
+       // Output:
+       // Original : ahoj vývojári golang
+       // ToTitle : AHOJ VÝVOJÁRİ GOLANG
+}
+
 func ExampleTrim() {
        fmt.Printf("[%q]", bytes.Trim([]byte(" !!! Achtung! Achtung! !!! "), "! "))
        // Output: ["Achtung! Achtung"]
@@ -438,11 +448,31 @@ func ExampleToUpper() {
        // Output: GOPHER
 }
 
+func ExampleToUpperSpecial() {
+       str := []byte("ahoj vývojári golang")
+       totitle := bytes.ToUpperSpecial(unicode.AzeriCase, str)
+       fmt.Println("Original : " + string(str))
+       fmt.Println("ToUpper : " + string(totitle))
+       // Output:
+       // Original : ahoj vývojári golang
+       // ToUpper : AHOJ VÝVOJÁRİ GOLANG
+}
+
 func ExampleToLower() {
        fmt.Printf("%s", bytes.ToLower([]byte("Gopher")))
        // Output: gopher
 }
 
+func ExampleToLowerSpecial() {
+       str := []byte("AHOJ VÝVOJÁRİ GOLANG")
+       totitle := bytes.ToLowerSpecial(unicode.AzeriCase, str)
+       fmt.Println("Original : " + string(str))
+       fmt.Println("ToLower : " + string(totitle))
+       // Output:
+       // Original : AHOJ VÝVOJÁRİ GOLANG
+       // ToLower : ahoj vývojári golang
+}
+
 func ExampleReader_Len() {
        fmt.Println(bytes.NewReader([]byte("Hi!")).Len())
        fmt.Println(bytes.NewReader([]byte("こんにちは!")).Len())
index f61523e60bbb3fd209594912ebcaa76cde9acd20..b65428d9ce84894e05ecd063fa2a53b803a2c9f8 100644 (file)
@@ -6,4 +6,3 @@ package bytes
 
 // Export func for testing
 var IndexBytePortable = indexBytePortable
-var EqualPortable = equalPortable
index cceb33edbdb738e39bf8ff0ee1e4af9797f26562..f227d7f85026ab4cc4fd87116fc682cb9aa2d9a3 100644 (file)
@@ -296,7 +296,7 @@ Go functions can be exported for use by C code in the following way:
 
 They will be available in the C code as:
 
-       extern int64 MyFunction(int arg1, int arg2, GoString arg3);
+       extern GoInt64 MyFunction(int arg1, int arg2, GoString arg3);
        extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);
 
 found in the _cgo_export.h generated header, after any preambles
@@ -710,7 +710,7 @@ _cgo_main.c:
 
        int main() { return 0; }
        void crosscall2(void(*fn)(void*, int, uintptr_t), void *a, int c, uintptr_t ctxt) { }
-       uintptr_t _cgo_wait_runtime_init_done() { return 0; }
+       uintptr_t _cgo_wait_runtime_init_done(void) { return 0; }
        void _cgo_release_context(uintptr_t ctxt) { }
        char* _cgo_topofstack(void) { return (char*)0; }
        void _cgo_allocate(void *a, int c) { }
index e56207acaa7f32daf9c719b9396b41b87950b239..70be6dc9a921f26ecbbaeedfefd9552cd7e59880 100644 (file)
@@ -1274,6 +1274,8 @@ func (p *Package) isVariable(x ast.Expr) bool {
                return true
        case *ast.SelectorExpr:
                return p.isVariable(x.X)
+       case *ast.IndexExpr:
+               return true
        }
        return false
 }
@@ -1609,6 +1611,7 @@ func (p *Package) gccCmd() []string {
        c = append(c, p.gccMachine()...)
        if goos == "aix" {
                c = append(c, "-maix64")
+               c = append(c, "-mcmodel=large")
        }
        c = append(c, "-") //read input from standard input
        return c
index 64384a606b261f03874bb6e48b1bd5fe898c9690..b4fd9c5a6e326661b0383d77f80319b0a6bebac6 100644 (file)
@@ -136,21 +136,31 @@ func gofmt(n interface{}) string {
 // (due to the printer possibly inserting newlines because of position
 // information) operators.
 var gofmtLineReplacer = strings.NewReplacer(
-       "{\n", "{",
-       ",\n", ",",
+       // Want to replace \n without ; after everything from
+       // https://golang.org/ref/spec#Operators_and_punctuation
+       // EXCEPT ++ -- ) ] }
        "++\n", "++;",
        "--\n", "--;",
-       "+\n", "+",
-       "-\n", "-",
-       "*\n", "*",
-       "/\n", "/",
-       "%\n", "%",
-       "&\n", "&",
-       "|\n", "|",
-       "^\n", "^",
-       "<\n", "<",
-       ">\n", ">",
-       "=\n", "=",
+
+       "+\n", "+ ",
+       "-\n", "- ",
+       "*\n", "* ",
+       "/\n", "/ ",
+       "%\n", "% ",
+       "&\n", "& ",
+       "|\n", "| ",
+       "^\n", "^ ",
+       "<\n", "< ",
+       ">\n", "> ",
+       "=\n", "= ",
+       "!\n", "! ", // not possible in gofmt today
+       "(\n", "(",
+       "[\n", "[", // not possible in gofmt today
+       "{\n", "{",
+       ",\n", ",",
+       ".\n", ". ",
+       ":\n", ": ", // not possible in gofmt today
+
        "\n", ";",
 )
 
index 9e6fe6f1d01e75774d993f1469c307a706d74a30..77e9108dd23061343c30463117956522571f559f 100644 (file)
@@ -64,14 +64,14 @@ func (p *Package) writeDefs() {
        fmt.Fprintf(fm, "int main() { return 0; }\n")
        if *importRuntimeCgo {
                fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int, __SIZE_TYPE__), void *a, int c, __SIZE_TYPE__ ctxt) { }\n")
-               fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done() { return 0; }\n")
+               fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void) { return 0; }\n")
                fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__ ctxt) { }\n")
                fmt.Fprintf(fm, "char* _cgo_topofstack(void) { return (char*)0; }\n")
        } else {
                // If we're not importing runtime/cgo, we *are* runtime/cgo,
                // which provides these functions. We just need a prototype.
                fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int, __SIZE_TYPE__), void *a, int c, __SIZE_TYPE__ ctxt);\n")
-               fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done();\n")
+               fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
                fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__);\n")
        }
        fmt.Fprintf(fm, "void _cgo_allocate(void *a, int c) { }\n")
@@ -341,6 +341,12 @@ func dynimport(obj string) {
                        fatalf("cannot load imported symbols from XCOFF file %s: %v", obj, err)
                }
                for _, s := range sym {
+                       if s.Name == "runtime_rt0_go" || s.Name == "_rt0_ppc64_aix_lib" {
+                               // These symbols are imported by runtime/cgo but
+                               // must not be added to _cgo_import.go as there are
+                               // Go symbols.
+                               continue
+                       }
                        fmt.Fprintf(stdout, "//go:cgo_import_dynamic %s %s %q\n", s.Name, s.Name, s.Library)
                }
                lib, err := f.ImportedLibraries()
@@ -782,14 +788,14 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
        fmt.Fprintf(fgcc, "#include \"_cgo_export.h\"\n\n")
 
        // We use packed structs, but they are always aligned.
-       // The pragmas and address-of-packed-member are not recognized as warning groups in clang 3.4.1, so ignore unknown pragmas first.
-       // remove as part of #27619 (all: drop support for FreeBSD 10).
+       // The pragmas and address-of-packed-member are only recognized as
+       // warning groups in clang 4.0+, so ignore unknown pragmas first.
        fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n")
        fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wpragmas\"\n")
        fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Waddress-of-packed-member\"\n")
 
        fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *, int, __SIZE_TYPE__), void *, int, __SIZE_TYPE__);\n")
-       fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done();\n")
+       fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
        fmt.Fprintf(fgcc, "extern void _cgo_release_context(__SIZE_TYPE__);\n\n")
        fmt.Fprintf(fgcc, "extern char* _cgo_topofstack(void);")
        fmt.Fprintf(fgcc, "%s\n", tsanProlog)
@@ -1485,10 +1491,11 @@ __cgo_size_assert(double, 8)
 
 extern char* _cgo_topofstack(void);
 
-/* We use packed structs, but they are always aligned.  */
-/* The pragmas and address-of-packed-member are not recognized as warning groups in clang 3.4.1, so ignore unknown pragmas first. */
-/* remove as part of #27619 (all: drop support for FreeBSD 10). */
-
+/*
+  We use packed structs, but they are always aligned.
+  The pragmas and address-of-packed-member are only recognized as warning
+  groups in clang 4.0+, so ignore unknown pragmas first.
+*/
 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
 #pragma GCC diagnostic ignored "-Wpragmas"
 #pragma GCC diagnostic ignored "-Waddress-of-packed-member"
@@ -1929,5 +1936,5 @@ static void GoInit(void) {
                runtime_iscgo = 1;
 }
 
-extern __SIZE_TYPE__ _cgo_wait_runtime_init_done() __attribute__ ((weak));
+extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void) __attribute__ ((weak));
 `
index 186f42156a2efd2ed2273ab49f718153bcbcf09b..fa60fb63b57cb1e2954a2c8a3b7154c41d4e9243 100644 (file)
@@ -21,7 +21,7 @@
 //     fix         update packages to use new APIs
 //     fmt         gofmt (reformat) package sources
 //     generate    generate Go files by processing source
-//     get         download and install packages and dependencies
+//     get         add dependencies to current module and install them
 //     install     compile and install packages and dependencies
 //     list        list packages or modules
 //     mod         module maintenance
@@ -47,6 +47,8 @@
 //     importpath  import path syntax
 //     modules     modules, module versions, and more
 //     module-get  module-aware go get
+//     module-auth module authentication using go.sum
+//     module-private module configuration for non-public modules
 //     packages    package lists and patterns
 //     testflag    testing flags
 //     testfunc    testing functions
@@ -73,8 +75,8 @@
 // Build compiles the packages named by the import paths,
 // along with their dependencies, but it does not install the results.
 //
-// If the arguments to build are a list of .go files, build treats
-// them as a list of source files specifying a single package.
+// If the arguments to build are a list of .go files from a single directory,
+// build treats them as a list of source files specifying a single package.
 //
 // When compiling a single main package, build writes
 // the resulting executable to an output file named after
 //
 // When compiling packages, build ignores files that end in '_test.go'.
 //
-// The -o flag, only allowed when compiling a single package,
-// forces build to write the resulting executable or object
-// to the named output file, instead of the default behavior described
-// in the last two paragraphs.
+// The -o flag forces build to write the resulting executable or object
+// to the named output file or directory, instead of the default behavior described
+// in the last two paragraphs. If the named output is a directory that exists,
+// then any resulting executables will be written to that directory.
 //
 // The -i flag installs the packages that are dependencies of the target.
 //
 //             install and load all packages from dir instead of the usual locations.
 //             For example, when building with a non-standard configuration,
 //             use -pkgdir to keep generated packages in a separate location.
-//     -tags 'tag list'
-//             a space-separated list of build tags to consider satisfied during the
+//     -tags tag,list
+//             a comma-separated list of build tags to consider satisfied during the
 //             build. For more information about build tags, see the description of
 //             build constraints in the documentation for the go/build package.
+//             (Earlier versions of Go used a space-separated list, and that form
+//             is deprecated but still recognized.)
+//     -trimpath
+//             remove all file system paths from the resulting executable.
+//             Instead of absolute file system paths, the recorded file names
+//             will begin with either "go" (for the standard library),
+//             or a module path@version (when using modules),
+//             or a plain import path (when using GOPATH).
 //     -toolexec 'cmd args'
 //             a program to use to invoke toolchain programs like vet and asm.
 //             For example, instead of running asm, the go command will run
 // so go clean is mainly concerned with object files left by other
 // tools or by manual invocations of go build.
 //
-// Specifically, clean removes the following files from each of the
+// If a package argument is given or the -i or -r flag is set,
+// clean removes the following files from each of the
 // source directories corresponding to the import paths:
 //
 //     _obj/            old object directory, left from Makefiles
 //
 // Usage:
 //
-//     go env [-json] [var ...]
+//     go env [-json] [-u] [-w] [var ...]
 //
 // Env prints Go environment information.
 //
 // The -json flag prints the environment in JSON format
 // instead of as a shell script.
 //
+// The -u flag requires one or more arguments and unsets
+// the default setting for the named environment variables,
+// if one has been set with 'go env -w'.
+//
+// The -w flag requires one or more arguments of the
+// form NAME=VALUE and changes the default settings
+// of the named environment variables to the given values.
+//
 // For more about environment variables, see 'go help environment'.
 //
 //
 // "go tool foo".
 //
 // Generate processes packages in the order given on the command line,
-// one at a time. If the command line lists .go files, they are treated
-// as a single package. Within a package, generate processes the
+// one at a time. If the command line lists .go files from a single directory,
+// they are treated as a single package. Within a package, generate processes the
 // source files in a package in file name order, one at a time. Within
 // a source file, generate runs generators in the order they appear
-// in the file, one at a time.
+// in the file, one at a time. The go generate tool also sets the build
+// tag "generate" so that files may be examined by go generate but ignored
+// during build.
 //
 // If any generator returns an error exit status, "go generate" skips
 // all further processing for that package.
 // For more about specifying packages, see 'go help packages'.
 //
 //
-// Download and install packages and dependencies
+// Add dependencies to current module and install them
 //
 // Usage:
 //
-//     go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]
+//     go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]
 //
-// Get downloads the packages named by the import paths, along with their
-// dependencies. It then installs the named packages, like 'go install'.
+// Get resolves and adds dependencies to the current development module
+// and then builds and installs them.
 //
-// The -d flag instructs get to stop after downloading the packages; that is,
-// it instructs get not to install the packages.
+// The first step is to resolve which dependencies to add.
 //
-// The -f flag, valid only when -u is set, forces get -u not to verify that
-// each package has been checked out from the source control repository
-// implied by its import path. This can be useful if the source is a local fork
-// of the original.
+// For each named package or package pattern, get must decide which version of
+// the corresponding module to use. By default, get chooses the latest tagged
+// release version, such as v0.4.5 or v1.2.3. If there are no tagged release
+// versions, get chooses the latest tagged pre-release version, such as
+// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest
+// known commit.
 //
-// The -fix flag instructs get to run the fix tool on the downloaded packages
-// before resolving dependencies or building the code.
+// This default version selection can be overridden by adding an @version
+// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'.
+// For modules stored in source control repositories, the version suffix can
+// also be a commit hash, branch identifier, or other syntax known to the
+// source control system, as in 'go get golang.org/x/text@master'.
 //
-// The -insecure flag permits fetching from repositories and resolving
-// custom domains using insecure schemes such as HTTP. Use with caution.
+// If a module under consideration is already a dependency of the current
+// development module, then get will update the required version.
+// Specifying a version earlier than the current required version is valid and
+// downgrades the dependency. The version suffix @none indicates that the
+// dependency should be removed entirely, downgrading or removing modules
+// depending on it as needed.
 //
-// The -t flag instructs get to also download the packages required to build
-// the tests for the specified packages.
+// The version suffix @latest explicitly requests the latest minor release of the
+// given path. The suffix @patch requests the latest patch release: if the path
+// is already in the build list, the selected version will have the same minor
+// version. If the path is not already in the build list, @patch is equivalent
+// to @latest. Neither @latest nor @patch will cause 'go get' to downgrade a module
+// in the build list if it is required at a newer pre-release version that is
+// newer than the latest released version.
 //
-// The -u flag instructs get to use the network to update the named packages
-// and their dependencies. By default, get uses the network to check out
-// missing packages but does not use it to look for updates to existing packages.
+// Although get defaults to using the latest version of the module containing
+// a named package, it does not use the latest version of that module's
+// dependencies. Instead it prefers to use the specific dependency versions
+// requested by that module. For example, if the latest A requires module
+// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A'
+// will use the latest A but then use B v1.2.3, as requested by A. (If there
+// are competing requirements for a particular module, then 'go get' resolves
+// those requirements by taking the maximum requested version.)
 //
-// The -v flag enables verbose progress and debug output.
+// The -t flag instructs get to consider modules needed to build tests of
+// packages specified on the command line.
 //
-// Get also accepts build flags to control the installation. See 'go help build'.
+// The -u flag instructs get to update modules providing dependencies
+// of packages named on the command line to use newer minor or patch
+// releases when available. Continuing the previous example, 'go get -u A'
+// will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C,
+// but C does not provide any packages needed to build packages in A
+// (not including tests), then C will not be updated.
 //
-// When checking out a new package, get creates the target directory
-// GOPATH/src/<import-path>. If the GOPATH contains multiple entries,
-// get uses the first one. For more details see: 'go help gopath'.
+// The -u=patch flag (not -u patch) also instructs get to update dependencies,
+// but changes the default to select patch releases.
+// Continuing the previous example,
+// 'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
+// while 'go get -u=patch A' will use a patch release of A instead.
 //
-// When checking out or updating a package, get looks for a branch or tag
-// that matches the locally installed version of Go. The most important
-// rule is that if the local installation is running version "go1", get
-// searches for a branch or tag named "go1". If no such version exists
-// it retrieves the default branch of the package.
+// When the -t and -u flags are used together, get will update
+// test dependencies as well.
 //
-// When go get checks out or updates a Git repository,
-// it also updates any git submodules referenced by the repository.
+// In general, adding a new dependency may require upgrading
+// existing dependencies to keep a working build, and 'go get' does
+// this automatically. Similarly, downgrading one dependency may
+// require downgrading other dependencies, and 'go get' does
+// this automatically as well.
 //
-// Get never checks out or updates code stored in vendor directories.
+// The -insecure flag permits fetching from repositories and resolving
+// custom domains using insecure schemes such as HTTP. Use with caution.
 //
-// For more about specifying packages, see 'go help packages'.
+// The second step is to download (if needed), build, and install
+// the named packages.
 //
-// For more about how 'go get' finds source code to
-// download, see 'go help importpath'.
+// If an argument names a module but not a package (because there is no
+// Go source code in the module's root directory), then the install step
+// is skipped for that argument, instead of causing a build failure.
+// For example 'go get golang.org/x/perf' succeeds even though there
+// is no code corresponding to that import path.
 //
-// This text describes the behavior of get when using GOPATH
-// to manage source code and dependencies.
-// If instead the go command is running in module-aware mode,
-// the details of get's flags and effects change, as does 'go help get'.
-// See 'go help modules' and 'go help module-get'.
+// Note that package patterns are allowed and are expanded after resolving
+// the module versions. For example, 'go get golang.org/x/perf/cmd/...'
+// adds the latest golang.org/x/perf and then installs the commands in that
+// latest version.
 //
-// See also: go build, go install, go clean.
+// The -d flag instructs get to download the source code needed to build
+// the named packages, including downloading necessary dependencies,
+// but not to build and install them.
+//
+// With no package arguments, 'go get' applies to Go package in the
+// current directory, if any. In particular, 'go get -u' and
+// 'go get -u=patch' update all the dependencies of that package.
+// With no package arguments and also without -u, 'go get' is not much more
+// than 'go install', and 'go get -d' not much more than 'go list'.
+//
+// For more about modules, see 'go help modules'.
+//
+// For more about specifying packages, see 'go help packages'.
+//
+// This text describes the behavior of get using modules to manage source
+// code and dependencies. If instead the go command is running in GOPATH
+// mode, the details of get's flags and effects change, as does 'go help get'.
+// See 'go help modules' and 'go help gopath-get'.
+//
+// See also: go build, go install, go clean, go mod.
 //
 //
 // Compile and install packages and dependencies
 //
 // Install compiles and installs the packages named by the import paths.
 //
+// Executables are installed in the directory named by the GOBIN environment
+// variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH
+// environment variable is not set. Executables in $GOROOT
+// are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN.
+//
+// When module-aware mode is disabled, other packages are installed in the
+// directory $GOPATH/pkg/$GOOS_$GOARCH. When module-aware mode is enabled,
+// other packages are built and cached but not installed.
+//
 // The -i flag installs the dependencies of the named packages as well.
 //
 // For more about the build flags, see 'go help build'.
 //         StaleReason   string   // explanation for Stale==true
 //         Root          string   // Go root or Go path dir containing this package
 //         ConflictDir   string   // this directory shadows Dir in $GOPATH
-//         BinaryOnly    bool     // binary-only package: cannot be recompiled from sources
+//         BinaryOnly    bool     // binary-only package (no longer supported)
 //         ForTest       string   // package is only for use in named test
 //         Export        string   // file containing export data (when using -export)
 //         Module        *Module  // info about package's containing module, if any (can be nil)
 // applied to a Go struct, but now a Module struct:
 //
 //     type Module struct {
-//         Path     string       // module path
-//         Version  string       // module version
-//         Versions []string     // available module versions (with -versions)
-//         Replace  *Module      // replaced by this module
-//         Time     *time.Time   // time version was created
-//         Update   *Module      // available update, if any (with -u)
-//         Main     bool         // is this the main module?
-//         Indirect bool         // is this module only an indirect dependency of main module?
-//         Dir      string       // directory holding files for this module, if any
-//         GoMod    string       // path to go.mod file for this module, if any
-//         Error    *ModuleError // error loading module
+//         Path      string       // module path
+//         Version   string       // module version
+//         Versions  []string     // available module versions (with -versions)
+//         Replace   *Module      // replaced by this module
+//         Time      *time.Time   // time version was created
+//         Update    *Module      // available update, if any (with -u)
+//         Main      bool         // is this the main module?
+//         Indirect  bool         // is this module only an indirect dependency of main module?
+//         Dir       string       // directory holding files for this module, if any
+//         GoMod     string       // path to go.mod file for this module, if any
+//         GoVersion string       // go version used in module
+//         Error     *ModuleError // error loading module
 //     }
 //
 //     type ModuleError struct {
 //     go run [build flags] [-exec xprog] package [arguments...]
 //
 // Run compiles and runs the named main Go package.
-// Typically the package is specified as a list of .go source files,
+// Typically the package is specified as a list of .go source files from a single directory,
 // but it may also be an import path, file system path, or pattern
 // matching a single known package, as in 'go run .' or 'go run my/cmd'.
 //
 // line. If a package test fails, go test prints the full test output.
 // If invoked with the -bench or -v flag, go test prints the full
 // output even for passing package tests, in order to display the
-// requested benchmark results or verbose logging.
+// requested benchmark results or verbose logging. After the package
+// tests for all of the listed packages finish, and their output is
+// printed, go test prints a final 'FAIL' status if any package test
+// has failed.
 //
 // In package list mode only, go test caches successful package test
 // results to avoid unnecessary repeated running of tests. When the
 //
 // Usage:
 //
-//     go version
+//     go version [-m] [-v] [file ...]
+//
+// Version prints the build information for Go executables.
+//
+// Go version reports the Go version used to build each of the named
+// executable files.
+//
+// If no files are named on the command line, go version prints its own
+// version information.
+//
+// If a directory is named, go version walks that directory, recursively,
+// looking for recognized Go binaries and reporting their versions.
+// By default, go version does not report unrecognized files found
+// during a directory scan. The -v flag causes it to report unrecognized files.
 //
-// Version prints the Go version, as reported by runtime.Version.
+// The -m flag causes go version to print each executable's embedded
+// module version information, when available. In the output, the module
+// information consists of multiple lines following the version line, each
+// indented by a leading tab character.
+//
+// See also: go doc runtime/debug.BuildInfo.
 //
 //
 // Report likely mistakes in packages
 //             Build the listed main packages, plus all packages that they
 //             import, into a Go plugin. Packages not named main are ignored.
 //
+// On AIX, when linking a C program that uses a Go archive built with
+// -buildmode=c-archive, you must pass -Wl,-bnoobjreorder to the C compiler.
+//
 //
 // Calling between Go and C
 //
 //
 // Environment variables
 //
-// The go command, and the tools it invokes, examine a few different
-// environment variables. For many of these, you can see the default
-// value of on your system by running 'go env NAME', where NAME is the
-// name of the variable.
+// The go command and the tools it invokes consult environment variables
+// for configuration. If an environment variable is unset, the go command
+// uses a sensible default setting. To see the effective setting of the
+// variable <NAME>, run 'go env <NAME>'. To change the default setting,
+// run 'go env -w <NAME>=<VALUE>'. Defaults changed using 'go env -w'
+// are recorded in a Go environment configuration file stored in the
+// per-user configuration directory, as reported by os.UserConfigDir.
+// The location of the configuration file can be changed by setting
+// the environment variable GOENV, and 'go env GOENV' prints the
+// effective location, but 'go env -w' cannot change the default location.
+// See 'go help env' for details.
 //
 // General-purpose environment variables:
 //
 //     GOCACHE
 //             The directory where the go command will store cached
 //             information for reuse in future builds.
+//     GOENV
+//             The location of the Go environment configuration file.
+//             Cannot be set using 'go env -w'.
 //     GOFLAGS
 //             A space-separated list of -flag=value settings to apply
 //             to go commands by default, when the given flag is known by
-//             the current command. Flags listed on the command-line
+//             the current command. Each entry must be a standalone flag.
+//             Because the entries are space-separated, flag values must
+//             not contain spaces. Flags listed on the command line
 //             are applied after this list and therefore override it.
 //     GOOS
 //             The operating system for which to compile code.
 //     GOPATH
 //             For more details see: 'go help gopath'.
 //     GOPROXY
-//             URL of Go module proxy. See 'go help goproxy'.
-//     GORACE
-//             Options for the race detector.
-//             See https://golang.org/doc/articles/race_detector.html.
+//             URL of Go module proxy. See 'go help modules'.
+//     GOPRIVATE, GONOPROXY, GONOSUMDB
+//             Comma-separated list of glob patterns (in the syntax of Go's path.Match)
+//             of module path prefixes that should always be fetched directly
+//             or that should not be compared against the checksum database.
+//             See 'go help module-private'.
 //     GOROOT
 //             The root of the go tree.
+//     GOSUMDB
+//             The name of checksum database to use and optionally its public key and
+//             URL. See 'go help module-auth'.
 //     GOTMPDIR
 //             The directory where the go command will write
 //             temporary source files, packages, and binaries.
 //
-// Each entry in the GOFLAGS list must be a standalone flag.
-// Because the entries are space-separated, flag values must
-// not contain spaces.
-//
 // Environment variables for use with cgo:
 //
+//     AR
+//             The command to use to manipulate library archives when
+//             building with the gccgo compiler.
+//             The default is 'ar'.
 //     CC
 //             The command to use to compile C code.
 //     CGO_ENABLED
 //             but for the linker.
 //     CXX
 //             The command to use to compile C++ code.
+//     FC
+//             The command to use to compile Fortran code.
 //     PKG_CONFIG
 //             Path to pkg-config tool.
-//     AR
-//             The command to use to manipulate library archives when
-//             building with the gccgo compiler.
-//             The default is 'ar'.
 //
 // Architecture-specific environment variables:
 //
 //     GOMIPS64
 //             For GOARCH=mips64{,le}, whether to use floating point instructions.
 //             Valid values are hardfloat (default), softfloat.
+//     GOWASM
+//             For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use.
+//             Valid values are satconv, signext.
 //
 // Special-purpose environment variables:
 //
 //             when using -linkmode=auto with code that uses cgo.
 //             Set to 0 to disable external linking mode, 1 to enable it.
 //     GIT_ALLOW_PROTOCOL
-//             Defined by Git. A colon-separated list of schemes that are allowed to be used
-//             with git fetch/clone. If set, any scheme not explicitly mentioned will be
-//             considered insecure by 'go get'.
+//             Defined by Git. A colon-separated list of schemes that are allowed
+//             to be used with git fetch/clone. If set, any scheme not explicitly
+//             mentioned will be considered insecure by 'go get'.
+//             Because the variable is defined by Git, the default value cannot
+//             be set using 'go env -w'.
 //
 // Additional information available from 'go env' but not read from the environment:
 //
 //     GOEXE
 //             The executable file name suffix (".exe" on Windows, "" on other systems).
+//     GOGCCFLAGS
+//             A space-separated list of arguments supplied to the CC command.
 //     GOHOSTARCH
 //             The architecture (GOARCH) of the Go toolchain binaries.
 //     GOHOSTOS
 // line comment. See the go/build package documentation for
 // more details.
 //
-// Through the Go 1.12 release, non-test Go source files can also include
-// a //go:binary-only-package comment, indicating that the package
-// sources are included for documentation only and must not be used to
-// build the package binary. This enables distribution of Go packages in
-// their compiled form alone. Even binary-only packages require accurate
-// import blocks listing required dependencies, so that those
-// dependencies can be supplied when linking the resulting command.
-// Note that this feature is scheduled to be removed after the Go 1.12 release.
-//
 //
 // The go.mod file
 //
 // including go build, go get, go install, go list, go test, go mod graph,
 // go mod tidy, and go mod why.
 //
+// The expected language version, set by the go directive, determines
+// which language features are available when compiling the module.
+// Language features available in that version will be available for use.
+// Language features removed in earlier versions, or added in later versions,
+// will not be available. Note that the language version does not affect
+// build tags, which are determined by the Go release being used.
+//
 //
 // GOPATH environment variable
 //
 // See https://golang.org/s/go15vendor for details.
 //
 //
-// Module proxy protocol
+// Legacy GOPATH go get
+//
+// The 'go get' command changes behavior depending on whether the
+// go command is running in module-aware mode or legacy GOPATH mode.
+// This help text, accessible as 'go help gopath-get' even in module-aware mode,
+// describes 'go get' as it operates in legacy GOPATH mode.
+//
+// Usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]
+//
+// Get downloads the packages named by the import paths, along with their
+// dependencies. It then installs the named packages, like 'go install'.
 //
-// The go command by default downloads modules from version control systems
-// directly, just as 'go get' always has. The GOPROXY environment variable allows
-// further control over the download source. If GOPROXY is unset, is the empty string,
-// or is the string "direct", downloads use the default direct connection to version
-// control systems. Setting GOPROXY to "off" disallows downloading modules from
-// any source. Otherwise, GOPROXY is expected to be the URL of a module proxy,
-// in which case the go command will fetch all modules from that proxy.
-// No matter the source of the modules, downloaded modules must match existing
-// entries in go.sum (see 'go help modules' for discussion of verification).
+// The -d flag instructs get to stop after downloading the packages; that is,
+// it instructs get not to install the packages.
+//
+// The -f flag, valid only when -u is set, forces get -u not to verify that
+// each package has been checked out from the source control repository
+// implied by its import path. This can be useful if the source is a local fork
+// of the original.
+//
+// The -fix flag instructs get to run the fix tool on the downloaded packages
+// before resolving dependencies or building the code.
+//
+// The -insecure flag permits fetching from repositories and resolving
+// custom domains using insecure schemes such as HTTP. Use with caution.
+//
+// The -t flag instructs get to also download the packages required to build
+// the tests for the specified packages.
+//
+// The -u flag instructs get to use the network to update the named packages
+// and their dependencies. By default, get uses the network to check out
+// missing packages but does not use it to look for updates to existing packages.
+//
+// The -v flag enables verbose progress and debug output.
+//
+// Get also accepts build flags to control the installation. See 'go help build'.
+//
+// When checking out a new package, get creates the target directory
+// GOPATH/src/<import-path>. If the GOPATH contains multiple entries,
+// get uses the first one. For more details see: 'go help gopath'.
+//
+// When checking out or updating a package, get looks for a branch or tag
+// that matches the locally installed version of Go. The most important
+// rule is that if the local installation is running version "go1", get
+// searches for a branch or tag named "go1". If no such version exists
+// it retrieves the default branch of the package.
+//
+// When go get checks out or updates a Git repository,
+// it also updates any git submodules referenced by the repository.
+//
+// Get never checks out or updates code stored in vendor directories.
+//
+// For more about specifying packages, see 'go help packages'.
+//
+// For more about how 'go get' finds source code to
+// download, see 'go help importpath'.
+//
+// This text describes the behavior of get when using GOPATH
+// to manage source code and dependencies.
+// If instead the go command is running in module-aware mode,
+// the details of get's flags and effects change, as does 'go help get'.
+// See 'go help modules' and 'go help module-get'.
+//
+// See also: go build, go install, go clean.
+//
+//
+// Module proxy protocol
 //
 // A Go module proxy is any web server that can respond to GET requests for
 // URLs of a specified form. The requests have no query parameters, so even
 // Modules replace the old GOPATH-based approach to specifying
 // which source files are used in a given build.
 //
-// Preliminary module support
+// Module support
 //
-// Go 1.11 includes preliminary support for Go modules,
-// including a new module-aware 'go get' command.
-// We intend to keep revising this support, while preserving compatibility,
-// until it can be declared official (no longer preliminary),
-// and then at a later point we may remove support for work
-// in GOPATH and the old 'go get' command.
+// Go 1.13 includes support for Go modules. Module-aware mode is active by default
+// whenever a go.mod file is found in, or in a parent of, the current directory.
 //
-// The quickest way to take advantage of the new Go 1.11 module support
-// is to check out your repository into a directory outside GOPATH/src,
-// create a go.mod file (described in the next section) there, and run
+// The quickest way to take advantage of module support is to check out your
+// repository, create a go.mod file (described in the next section) there, and run
 // go commands from within that file tree.
 //
-// For more fine-grained control, the module support in Go 1.11 respects
+// For more fine-grained control, Go 1.13 continues to respect
 // a temporary environment variable, GO111MODULE, which can be set to one
 // of three string values: off, on, or auto (the default).
-// If GO111MODULE=off, then the go command never uses the
-// new module support. Instead it looks in vendor directories and GOPATH
-// to find dependencies; we now refer to this as "GOPATH mode."
 // If GO111MODULE=on, then the go command requires the use of modules,
-// never consulting GOPATH. We refer to this as the command being
-// module-aware or running in "module-aware mode".
-// If GO111MODULE=auto or is unset, then the go command enables or
-// disables module support based on the current directory.
-// Module support is enabled only when the current directory is outside
-// GOPATH/src and itself contains a go.mod file or is below a directory
-// containing a go.mod file.
+// never consulting GOPATH. We refer to this as the command
+// being module-aware or running in "module-aware mode".
+// If GO111MODULE=off, then the go command never uses
+// module support. Instead it looks in vendor directories and GOPATH
+// to find dependencies; we now refer to this as "GOPATH mode."
+// If GO111MODULE=auto or is unset, then the go command enables or disables
+// module support based on the current directory.
+// Module support is enabled only when the current directory contains a
+// go.mod file or is below a directory containing a go.mod file.
 //
 // In module-aware mode, GOPATH no longer defines the meaning of imports
 // during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod)
 //
 // Module downloading and verification
 //
-// The go command maintains, in the main module's root directory alongside
-// go.mod, a file named go.sum containing the expected cryptographic checksums
-// of the content of specific module versions. Each time a dependency is
-// used, its checksum is added to go.sum if missing or else required to match
-// the existing entry in go.sum.
-//
-// The go command maintains a cache of downloaded packages and computes
-// and records the cryptographic checksum of each package at download time.
-// In normal operation, the go command checks these pre-computed checksums
-// against the main module's go.sum file, instead of recomputing them on
-// each command invocation. The 'go mod verify' command checks that
-// the cached copies of module downloads still match both their recorded
-// checksums and the entries in go.sum.
-//
-// The go command can fetch modules from a proxy instead of connecting
-// to source control systems directly, according to the setting of the GOPROXY
-// environment variable.
-//
-// See 'go help goproxy' for details about the proxy and also the format of
-// the cached downloaded packages.
+// The go command can fetch modules from a proxy or connect to source control
+// servers directly, according to the setting of the GOPROXY environment
+// variable (see 'go help env'). The default setting for GOPROXY is
+// "https://proxy.golang.org,direct", which means to try the
+// Go module mirror run by Google and fall back to a direct connection
+// if the proxy reports that it does not have the module (HTTP error 404 or 410).
+// See https://proxy.golang.org/privacy for the service's privacy policy.
+// If GOPROXY is set to the string "direct", downloads use a direct connection
+// to source control servers. Setting GOPROXY to "off" disallows downloading
+// modules from any source. Otherwise, GOPROXY is expected to be a comma-separated
+// list of the URLs of module proxies, in which case the go command will fetch
+// modules from those proxies. For each request, the go command tries each proxy
+// in sequence, only moving to the next if the current proxy returns a 404 or 410
+// HTTP response. The string "direct" may appear in the proxy list,
+// to cause a direct connection to be attempted at that point in the search.
+// Any proxies listed after "direct" are never consulted.
+//
+// The GOPRIVATE and GONOPROXY environment variables allow bypassing
+// the proxy for selected modules. See 'go help module-private' for details.
+//
+// No matter the source of the modules, the go command checks downloads against
+// known checksums, to detect unexpected changes in the content of any specific
+// module version from one day to the next. This check first consults the current
+// module's go.sum file but falls back to the Go checksum database, controlled by
+// the GOSUMDB and GONOSUMDB environment variables. See 'go help module-auth'
+// for details.
+//
+// See 'go help goproxy' for details about the proxy protocol and also
+// the format of the cached downloaded packages.
 //
 // Modules and vendoring
 //
 // are still ignored.
 //
 //
-// Module-aware go get
-//
-// The 'go get' command changes behavior depending on whether the
-// go command is running in module-aware mode or legacy GOPATH mode.
-// This help text, accessible as 'go help module-get' even in legacy GOPATH mode,
-// describes 'go get' as it operates in module-aware mode.
-//
-// Usage: go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages]
-//
-// Get resolves and adds dependencies to the current development module
-// and then builds and installs them.
+// Module authentication using go.sum
 //
-// The first step is to resolve which dependencies to add.
+// The go command tries to authenticate every downloaded module,
+// checking that the bits downloaded for a specific module version today
+// match bits downloaded yesterday. This ensures repeatable builds
+// and detects introduction of unexpected changes, malicious or not.
 //
-// For each named package or package pattern, get must decide which version of
-// the corresponding module to use. By default, get chooses the latest tagged
-// release version, such as v0.4.5 or v1.2.3. If there are no tagged release
-// versions, get chooses the latest tagged prerelease version, such as
-// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest
-// known commit.
+// In each module's root, alongside go.mod, the go command maintains
+// a file named go.sum containing the cryptographic checksums of the
+// module's dependencies.
 //
-// This default version selection can be overridden by adding an @version
-// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'.
-// For modules stored in source control repositories, the version suffix can
-// also be a commit hash, branch identifier, or other syntax known to the
-// source control system, as in 'go get golang.org/x/text@master'.
-// The version suffix @latest explicitly requests the default behavior
-// described above.
+// The form of each line in go.sum is three fields:
 //
-// If a module under consideration is already a dependency of the current
-// development module, then get will update the required version.
-// Specifying a version earlier than the current required version is valid and
-// downgrades the dependency. The version suffix @none indicates that the
-// dependency should be removed entirely, downgrading or removing modules
-// depending on it as needed.
+//     <module> <version>[/go.mod] <hash>
 //
-// Although get defaults to using the latest version of the module containing
-// a named package, it does not use the latest version of that module's
-// dependencies. Instead it prefers to use the specific dependency versions
-// requested by that module. For example, if the latest A requires module
-// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A'
-// will use the latest A but then use B v1.2.3, as requested by A. (If there
-// are competing requirements for a particular module, then 'go get' resolves
-// those requirements by taking the maximum requested version.)
+// Each known module version results in two lines in the go.sum file.
+// The first line gives the hash of the module version's file tree.
+// The second line appends "/go.mod" to the version and gives the hash
+// of only the module version's (possibly synthesized) go.mod file.
+// The go.mod-only hash allows downloading and authenticating a
+// module version's go.mod file, which is needed to compute the
+// dependency graph, without also downloading all the module's source code.
 //
-// The -u flag instructs get to update dependencies to use newer minor or
-// patch releases when available. Continuing the previous example,
-// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3).
+// The hash begins with an algorithm prefix of the form "h<N>:".
+// The only defined algorithm prefix is "h1:", which uses SHA-256.
 //
-// The -u=patch flag (not -u patch) instructs get to update dependencies
-// to use newer patch releases when available. Continuing the previous example,
-// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3).
+// Module authentication failures
 //
-// In general, adding a new dependency may require upgrading
-// existing dependencies to keep a working build, and 'go get' does
-// this automatically. Similarly, downgrading one dependency may
-// require downgrading other dependencies, and 'go get' does
-// this automatically as well.
-//
-// The -m flag instructs get to stop here, after resolving, upgrading,
-// and downgrading modules and updating go.mod. When using -m,
-// each specified package path must be a module path as well,
-// not the import path of a package below the module root.
-//
-// The -insecure flag permits fetching from repositories and resolving
-// custom domains using insecure schemes such as HTTP. Use with caution.
+// The go command maintains a cache of downloaded packages and computes
+// and records the cryptographic checksum of each package at download time.
+// In normal operation, the go command checks the main module's go.sum file
+// against these precomputed checksums instead of recomputing them on
+// each command invocation. The 'go mod verify' command checks that
+// the cached copies of module downloads still match both their recorded
+// checksums and the entries in go.sum.
 //
-// The second step is to download (if needed), build, and install
-// the named packages.
+// In day-to-day development, the checksum of a given module version
+// should never change. Each time a dependency is used by a given main
+// module, the go command checks its local cached copy, freshly
+// downloaded or not, against the main module's go.sum. If the checksums
+// don't match, the go command reports the mismatch as a security error
+// and refuses to run the build. When this happens, proceed with caution:
+// code changing unexpectedly means today's build will not match
+// yesterday's, and the unexpected change may not be beneficial.
+//
+// If the go command reports a mismatch in go.sum, the downloaded code
+// for the reported module version does not match the one used in a
+// previous build of the main module. It is important at that point
+// to find out what the right checksum should be, to decide whether
+// go.sum is wrong or the downloaded code is wrong. Usually go.sum is right:
+// you want to use the same code you used yesterday.
+//
+// If a downloaded module is not yet included in go.sum and it is a publicly
+// available module, the go command consults the Go checksum database to fetch
+// the expected go.sum lines. If the downloaded code does not match those
+// lines, the go command reports the mismatch and exits. Note that the
+// database is not consulted for module versions already listed in go.sum.
+//
+// If a go.sum mismatch is reported, it is always worth investigating why
+// the code downloaded today differs from what was downloaded yesterday.
+//
+// The GOSUMDB environment variable identifies the name of checksum database
+// to use and optionally its public key and URL, as in:
+//
+//     GOSUMDB="sum.golang.org"
+//     GOSUMDB="sum.golang.org+<publickey>"
+//     GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
+//
+// The go command knows the public key of sum.golang.org; use of any other
+// database requires giving the public key explicitly. The URL defaults to
+// "https://" followed by the database name.
+//
+// GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google.
+// See https://sum.golang.org/privacy for the service's privacy policy.
+//
+// If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag,
+// the checksum database is not consulted, and all unrecognized modules are
+// accepted, at the cost of giving up the security guarantee of verified repeatable
+// downloads for all modules. A better way to bypass the checksum database
+// for specific modules is to use the GOPRIVATE or GONOSUMDB environment
+// variables. See 'go help module-private' for details.
+//
+// The 'go env -w' command (see 'go help env') can be used to set these variables
+// for future go command invocations.
+//
+//
+// Module configuration for non-public modules
+//
+// The go command defaults to downloading modules from the public Go module
+// mirror at proxy.golang.org. It also defaults to validating downloaded modules,
+// regardless of source, against the public Go checksum database at sum.golang.org.
+// These defaults work well for publicly available source code.
+//
+// The GOPRIVATE environment variable controls which modules the go command
+// considers to be private (not available publicly) and should therefore not use the
+// proxy or checksum database. The variable is a comma-separated list of
+// glob patterns (in the syntax of Go's path.Match) of module path prefixes.
+// For example,
 //
-// If an argument names a module but not a package (because there is no
-// Go source code in the module's root directory), then the install step
-// is skipped for that argument, instead of causing a build failure.
-// For example 'go get golang.org/x/perf' succeeds even though there
-// is no code corresponding to that import path.
+//     GOPRIVATE=*.corp.example.com,rsc.io/private
 //
-// Note that package patterns are allowed and are expanded after resolving
-// the module versions. For example, 'go get golang.org/x/perf/cmd/...'
-// adds the latest golang.org/x/perf and then installs the commands in that
-// latest version.
+// causes the go command to treat as private any module with a path prefix
+// matching either pattern, including git.corp.example.com/xyzzy, rsc.io/private,
+// and rsc.io/private/quux.
 //
-// The -d flag instructs get to download the source code needed to build
-// the named packages, including downloading necessary dependencies,
-// but not to build and install them.
+// The GOPRIVATE environment variable may be used by other tools as well to
+// identify non-public modules. For example, an editor could use GOPRIVATE
+// to decide whether to hyperlink a package import to a godoc.org page.
 //
-// With no package arguments, 'go get' applies to the main module,
-// and to the Go package in the current directory, if any. In particular,
-// 'go get -u' and 'go get -u=patch' update all the dependencies of the
-// main module. With no package arguments and also without -u,
-// 'go get' is not much more than 'go install', and 'go get -d' not much
-// more than 'go list'.
+// For fine-grained control over module download and validation, the GONOPROXY
+// and GONOSUMDB environment variables accept the same kind of glob list
+// and override GOPRIVATE for the specific decision of whether to use the proxy
+// and checksum database, respectively.
 //
-// For more about modules, see 'go help modules'.
+// For example, if a company ran a module proxy serving private modules,
+// users would configure go using:
 //
-// For more about specifying packages, see 'go help packages'.
+//     GOPRIVATE=*.corp.example.com
+//     GOPROXY=proxy.example.com
+//     GONOPROXY=none
 //
-// This text describes the behavior of get using modules to manage source
-// code and dependencies. If instead the go command is running in GOPATH
-// mode, the details of get's flags and effects change, as does 'go help get'.
-// See 'go help modules' and 'go help gopath-get'.
+// This would tell the go command and other tools that modules beginning with
+// a corp.example.com subdomain are private but that the company proxy should
+// be used for downloading both public and private modules, because
+// GONOPROXY has been set to a pattern that won't match any modules,
+// overriding GOPRIVATE.
 //
-// See also: go build, go install, go clean, go mod.
+// The 'go env -w' command (see 'go help env') can be used to set these variables
+// for future go command invocations.
 //
 //
 // Package lists and patterns
index d1166b1ed15fc0122bb48d1a32acd1628b3937c0..0ae2fa297eb02a34fe64a42c64063c33db538685 100644 (file)
@@ -6,7 +6,6 @@ package main_test
 
 import (
        "bytes"
-       "cmd/internal/sys"
        "context"
        "debug/elf"
        "debug/macho"
@@ -27,6 +26,11 @@ import (
        "strings"
        "testing"
        "time"
+
+       "cmd/go/internal/cache"
+       "cmd/go/internal/cfg"
+       "cmd/go/internal/robustio"
+       "cmd/internal/sys"
 )
 
 var (
@@ -118,6 +122,8 @@ var testCtx = context.Background()
 // The TestMain function creates a go command for testing purposes and
 // deletes it after the tests have been run.
 func TestMain(m *testing.M) {
+       // $GO_GCFLAGS a compiler debug flag known to cmd/dist, make.bash, etc.
+       // It is not a standard go command flag; use os.Getenv, not cfg.Getenv.
        if os.Getenv("GO_GCFLAGS") != "" {
                fmt.Fprintf(os.Stderr, "testing: warning: no tests to run\n") // magic string for cmd/go
                fmt.Printf("cmd/go test is not compatible with $GO_GCFLAGS being set\n")
@@ -166,6 +172,7 @@ func TestMain(m *testing.M) {
                defer removeAll(testTmpDir)
        }
 
+       testGOCACHE = cache.DefaultDir()
        if canRun {
                testBin = filepath.Join(testTmpDir, "testbin")
                if err := os.Mkdir(testBin, 0777); err != nil {
@@ -212,7 +219,9 @@ func TestMain(m *testing.M) {
                        return
                }
 
-               out, err := exec.Command(gotool, args...).CombinedOutput()
+               buildCmd := exec.Command(gotool, args...)
+               buildCmd.Env = append(os.Environ(), "GOFLAGS=-mod=vendor")
+               out, err := buildCmd.CombinedOutput()
                if err != nil {
                        fmt.Fprintf(os.Stderr, "building testgo failed: %v\n%s", err, out)
                        os.Exit(2)
@@ -252,6 +261,7 @@ func TestMain(m *testing.M) {
                }
        }
        // Don't let these environment variables confuse the test.
+       os.Setenv("GOENV", "off")
        os.Unsetenv("GOBIN")
        os.Unsetenv("GOPATH")
        os.Unsetenv("GIT_ALLOW_PROTOCOL")
@@ -260,7 +270,7 @@ func TestMain(m *testing.M) {
        // Setting HOME to a non-existent directory will break
        // those systems. Disable ccache and use real compiler. Issue 17668.
        os.Setenv("CCACHE_DISABLE", "1")
-       if os.Getenv("GOCACHE") == "" {
+       if cfg.Getenv("GOCACHE") == "" {
                os.Setenv("GOCACHE", testGOCACHE) // because $HOME is gone
        }
 
@@ -422,6 +432,7 @@ func (tg *testgoData) setenv(name, val string) {
 func (tg *testgoData) unsetenv(name string) {
        if tg.env == nil {
                tg.env = append([]string(nil), os.Environ()...)
+               tg.env = append(tg.env, "GO111MODULE=off")
        }
        for i, v := range tg.env {
                if strings.HasPrefix(v, name+"=") {
@@ -675,7 +686,7 @@ func (tg *testgoData) creatingTemp(path string) {
        if tg.wd != "" && !filepath.IsAbs(path) {
                path = filepath.Join(tg.pwd(), path)
        }
-       tg.must(os.RemoveAll(path))
+       tg.must(robustio.RemoveAll(path))
        tg.temps = append(tg.temps, path)
 }
 
@@ -877,7 +888,7 @@ func removeAll(dir string) error {
                }
                return nil
        })
-       return os.RemoveAll(dir)
+       return robustio.RemoveAll(dir)
 }
 
 // failSSH puts an ssh executable in the PATH that always fails.
@@ -1171,7 +1182,7 @@ func testMove(t *testing.T, vcs, url, base, config string) {
        case "svn":
                // SVN doesn't believe in text files so we can't just edit the config.
                // Check out a different repo into the wrong place.
-               tg.must(os.RemoveAll(tg.path("src/code.google.com/p/rsc-svn")))
+               tg.must(robustio.RemoveAll(tg.path("src/code.google.com/p/rsc-svn")))
                tg.run("get", "-d", "-u", "code.google.com/p/rsc-svn2/trunk")
                tg.must(os.Rename(tg.path("src/code.google.com/p/rsc-svn2"), tg.path("src/code.google.com/p/rsc-svn")))
        default:
@@ -1212,10 +1223,12 @@ func TestInternalCache(t *testing.T) {
 }
 
 func TestMoveGit(t *testing.T) {
+       testenv.MustHaveExecPath(t, "git")
        testMove(t, "git", "rsc.io/pdf", "pdf", "rsc.io/pdf/.git/config")
 }
 
 func TestMoveHG(t *testing.T) {
+       testenv.MustHaveExecPath(t, "hg")
        testMove(t, "hg", "vcs-test.golang.org/go/custom-hg-hello", "custom-hg-hello", "vcs-test.golang.org/go/custom-hg-hello/.hg/hgrc")
 }
 
@@ -1277,9 +1290,7 @@ func TestImportCycle(t *testing.T) {
 // cmd/go: custom import path checking should not apply to Go packages without import comment.
 func TestIssue10952(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
-       if _, err := exec.LookPath("git"); err != nil {
-               t.Skip("skipping because git binary not found")
-       }
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1295,9 +1306,7 @@ func TestIssue10952(t *testing.T) {
 
 func TestIssue16471(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
-       if _, err := exec.LookPath("git"); err != nil {
-               t.Skip("skipping because git binary not found")
-       }
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1313,9 +1322,7 @@ func TestIssue16471(t *testing.T) {
 // Test git clone URL that uses SCP-like syntax and custom import path checking.
 func TestIssue11457(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
-       if _, err := exec.LookPath("git"); err != nil {
-               t.Skip("skipping because git binary not found")
-       }
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1340,9 +1347,7 @@ func TestIssue11457(t *testing.T) {
 
 func TestGetGitDefaultBranch(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
-       if _, err := exec.LookPath("git"); err != nil {
-               t.Skip("skipping because git binary not found")
-       }
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1368,9 +1373,7 @@ func TestGetGitDefaultBranch(t *testing.T) {
 // Security issue. Don't disable. See golang.org/issue/22125.
 func TestAccidentalGitCheckout(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
-       if _, err := exec.LookPath("git"); err != nil {
-               t.Skip("skipping because git binary not found")
-       }
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1644,6 +1647,7 @@ func TestInstallToGOBINCommandLinePackage(t *testing.T) {
 
 func TestGoGetNonPkg(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1660,6 +1664,7 @@ func TestGoGetNonPkg(t *testing.T) {
 
 func TestGoGetTestOnlyPkg(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -1690,7 +1695,7 @@ func TestInstalls(t *testing.T) {
        goarch := strings.TrimSpace(tg.getStdout())
        tg.setenv("GOARCH", goarch)
        fixbin := filepath.Join(goroot, "pkg", "tool", goos+"_"+goarch, "fix") + exeSuffix
-       tg.must(os.RemoveAll(fixbin))
+       tg.must(robustio.RemoveAll(fixbin))
        tg.run("install", "cmd/fix")
        tg.wantExecutable(fixbin, "did not install cmd/fix to $GOROOT/pkg/tool")
        tg.must(os.Remove(fixbin))
@@ -1884,11 +1889,12 @@ func TestGoListTest(t *testing.T) {
        tg.grepStdout(`^runtime/cgo$`, "missing runtime/cgo")
 
        tg.run("list", "-deps", "-f", "{{if .DepOnly}}{{.ImportPath}}{{end}}", "sort")
-       tg.grepStdout(`^reflect$`, "missing reflect")
+       tg.grepStdout(`^internal/reflectlite$`, "missing internal/reflectlite")
        tg.grepStdoutNot(`^sort`, "unexpected sort")
 }
 
 func TestGoListCompiledCgo(t *testing.T) {
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -2048,6 +2054,7 @@ func TestDefaultGOPATH(t *testing.T) {
 
 func TestDefaultGOPATHGet(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -2060,13 +2067,13 @@ func TestDefaultGOPATHGet(t *testing.T) {
        tg.grepStderr("created GOPATH="+regexp.QuoteMeta(tg.path("home/go"))+"; see 'go help gopath'", "did not create GOPATH")
 
        // no warning if directory already exists
-       tg.must(os.RemoveAll(tg.path("home/go")))
+       tg.must(robustio.RemoveAll(tg.path("home/go")))
        tg.tempDir("home/go")
        tg.run("get", "github.com/golang/example/hello")
        tg.grepStderrNot(".", "expected no output on standard error")
 
        // error if $HOME/go is a file
-       tg.must(os.RemoveAll(tg.path("home/go")))
+       tg.must(robustio.RemoveAll(tg.path("home/go")))
        tg.tempFile("home/go", "")
        tg.runFail("get", "github.com/golang/example/hello")
        tg.grepStderr(`mkdir .*[/\\]go: .*(not a directory|cannot find the path)`, "expected error because $HOME/go is a file")
@@ -2429,6 +2436,7 @@ func TestSymlinkWarning(t *testing.T) {
 // Issue 8181.
 func TestGoGetDashTIssue8181(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -2443,6 +2451,7 @@ func TestGoGetDashTIssue8181(t *testing.T) {
 func TestIssue11307(t *testing.T) {
        // go get -u was not working except in checkout directory
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -2528,6 +2537,7 @@ func TestCoverageRuns(t *testing.T) {
 
 func TestCoverageDotImport(t *testing.T) {
        skipIfGccgo(t, "gccgo has no cover tool")
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -2610,6 +2620,14 @@ func TestCoverageDepLoop(t *testing.T) {
        tg.grepStdout("coverage: 100.0% of statements", "expected 100.0% coverage")
 }
 
+func TestCoverageNoStatements(t *testing.T) {
+       tooSlow(t)
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.run("test", "-cover", "./testdata/testcover/pkg4")
+       tg.grepStdout("[no statements]", "expected [no statements] for pkg4")
+}
+
 func TestCoverageImportMainLoop(t *testing.T) {
        skipIfGccgo(t, "gccgo has no cover tool")
        tg := testgo(t)
@@ -2699,6 +2717,7 @@ func TestCoverageFunc(t *testing.T) {
 // Issue 24588.
 func TestCoverageDashC(t *testing.T) {
        skipIfGccgo(t, "gccgo has no cover tool")
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -2855,7 +2874,7 @@ func TestCgoDependsOnSyscall(t *testing.T) {
        files, err := filepath.Glob(filepath.Join(runtime.GOROOT(), "pkg", "*_race"))
        tg.must(err)
        for _, file := range files {
-               tg.check(os.RemoveAll(file))
+               tg.check(robustio.RemoveAll(file))
        }
        tg.tempFile("src/foo/foo.go", `
                package foo
@@ -2911,6 +2930,7 @@ func TestCgoPkgConfig(t *testing.T) {
 
        tg.run("env", "PKG_CONFIG")
        pkgConfig := strings.TrimSpace(tg.getStdout())
+       testenv.MustHaveExecPath(t, pkgConfig)
        if out, err := exec.Command(pkgConfig, "--atleast-pkgconfig-version", "0.24").CombinedOutput(); err != nil {
                t.Skipf("%s --atleast-pkgconfig-version 0.24: %v\n%s", pkgConfig, err, out)
        }
@@ -3013,9 +3033,7 @@ func TestIssue7573(t *testing.T) {
        if !canCgo {
                t.Skip("skipping because cgo not enabled")
        }
-       if _, err := exec.LookPath("gccgo"); err != nil {
-               t.Skip("skipping because no gccgo compiler found")
-       }
+       testenv.MustHaveExecPath(t, "gccgo")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3304,6 +3322,7 @@ func TestGoGenerateBadImports(t *testing.T) {
 
 func TestGoGetCustomDomainWildcard(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3315,6 +3334,7 @@ func TestGoGetCustomDomainWildcard(t *testing.T) {
 
 func TestGoGetInternalWildcard(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3374,6 +3394,7 @@ func TestVetWithOnlyCgoFiles(t *testing.T) {
        if !canCgo {
                t.Skip("skipping because cgo not enabled")
        }
+       tooSlow(t)
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3386,6 +3407,7 @@ func TestVetWithOnlyCgoFiles(t *testing.T) {
 // Issue 9767, 19769.
 func TestGoGetDotSlashDownload(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3395,22 +3417,6 @@ func TestGoGetDotSlashDownload(t *testing.T) {
        tg.run("get", "./pprof_mac_fix")
 }
 
-// Issue 13037: Was not parsing <meta> tags in 404 served over HTTPS
-func TestGoGetHTTPS404(t *testing.T) {
-       testenv.MustHaveExternalNetwork(t)
-       switch runtime.GOOS {
-       case "darwin", "linux", "freebsd":
-       default:
-               t.Skipf("test case does not work on %s", runtime.GOOS)
-       }
-
-       tg := testgo(t)
-       defer tg.cleanup()
-       tg.tempDir("src")
-       tg.setenv("GOPATH", tg.path("."))
-       tg.run("get", "bazil.org/fuse/fs/fstestutil")
-}
-
 // Test that you cannot import a main package.
 // See golang.org/issue/4210 and golang.org/issue/17475.
 func TestImportMain(t *testing.T) {
@@ -3625,7 +3631,7 @@ func TestImportLocal(t *testing.T) {
                var _ = x.X
        `)
        tg.runFail("build", "dir/x")
-       tg.grepStderr("local import.*in non-local package", "did not diagnose local import")
+       tg.grepStderr("cannot import current directory", "did not diagnose import current directory")
 
        // ... even in a test.
        tg.tempFile("src/dir/x/xx.go", `package x
@@ -3638,7 +3644,7 @@ func TestImportLocal(t *testing.T) {
        `)
        tg.run("build", "dir/x")
        tg.runFail("test", "dir/x")
-       tg.grepStderr("local import.*in non-local package", "did not diagnose local import")
+       tg.grepStderr("cannot import current directory", "did not diagnose import current directory")
 
        // ... even in an xtest.
        tg.tempFile("src/dir/x/xx.go", `package x
@@ -3651,12 +3657,13 @@ func TestImportLocal(t *testing.T) {
        `)
        tg.run("build", "dir/x")
        tg.runFail("test", "dir/x")
-       tg.grepStderr("local import.*in non-local package", "did not diagnose local import")
+       tg.grepStderr("cannot import current directory", "did not diagnose import current directory")
 }
 
 func TestGoGetInsecure(t *testing.T) {
        test := func(t *testing.T, modules bool) {
                testenv.MustHaveExternalNetwork(t)
+               testenv.MustHaveExecPath(t, "git")
 
                tg := testgo(t)
                defer tg.cleanup()
@@ -3668,6 +3675,7 @@ func TestGoGetInsecure(t *testing.T) {
                        tg.tempFile("go.mod", "module m")
                        tg.cd(tg.path("."))
                        tg.setenv("GO111MODULE", "on")
+                       tg.setenv("GOPROXY", "")
                } else {
                        tg.setenv("GOPATH", tg.path("."))
                        tg.setenv("GO111MODULE", "off")
@@ -3696,6 +3704,7 @@ func TestGoGetInsecure(t *testing.T) {
 
 func TestGoGetUpdateInsecure(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3720,6 +3729,7 @@ func TestGoGetUpdateInsecure(t *testing.T) {
 
 func TestGoGetUpdateUnknownProtocol(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3754,6 +3764,7 @@ func TestGoGetUpdateUnknownProtocol(t *testing.T) {
 
 func TestGoGetInsecureCustomDomain(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3856,6 +3867,7 @@ func TestGoGetUpdate(t *testing.T) {
        // former dependencies, not current ones.
 
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3883,6 +3895,7 @@ func TestGoGetUpdate(t *testing.T) {
 // Issue #20512.
 func TestGoGetRace(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
        if !canRace {
                t.Skip("skipping because race detector not supported")
        }
@@ -3899,6 +3912,7 @@ func TestGoGetDomainRoot(t *testing.T) {
        // go get foo.io (not foo.io/subdir) was not working consistently.
 
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -3913,10 +3927,10 @@ func TestGoGetDomainRoot(t *testing.T) {
        tg.run("get", "go-get-issue-9357.appspot.com")
        tg.run("get", "-u", "go-get-issue-9357.appspot.com")
 
-       tg.must(os.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
+       tg.must(robustio.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
        tg.run("get", "go-get-issue-9357.appspot.com")
 
-       tg.must(os.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
+       tg.must(robustio.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
        tg.run("get", "-u", "go-get-issue-9357.appspot.com")
 }
 
@@ -4131,7 +4145,7 @@ func TestCgoConsistentResults(t *testing.T) {
                t.Skip("skipping because cgo not enabled")
        }
        switch runtime.GOOS {
-       case "solaris":
+       case "solaris", "illumos":
                testenv.SkipFlaky(t, 13247)
        }
 
@@ -4203,9 +4217,9 @@ func TestBinaryOnlyPackages(t *testing.T) {
 
                package p1
        `)
-       tg.wantStale("p1", "missing or invalid binary-only package", "p1 is binary-only but has no binary, should be stale")
+       tg.wantStale("p1", "binary-only packages are no longer supported", "p1 is binary-only, and this message should always be printed")
        tg.runFail("install", "p1")
-       tg.grepStderr("missing or invalid binary-only package", "did not report attempt to compile binary-only package")
+       tg.grepStderr("binary-only packages are no longer supported", "did not report attempt to compile binary-only package")
 
        tg.tempFile("src/p1/p1.go", `
                package p1
@@ -4231,48 +4245,13 @@ func TestBinaryOnlyPackages(t *testing.T) {
                import _ "fmt"
                func G()
        `)
-       tg.wantNotStale("p1", "binary-only package", "should NOT want to rebuild p1 (first)")
-       tg.run("install", "-x", "p1") // no-op, up to date
-       tg.grepBothNot(`[\\/]compile`, "should not have run compiler")
-       tg.run("install", "p2") // does not rebuild p1 (or else p2 will fail)
-       tg.wantNotStale("p2", "", "should NOT want to rebuild p2")
-
-       // changes to the non-source-code do not matter,
-       // and only one file needs the special comment.
-       tg.tempFile("src/p1/missing2.go", `
-               package p1
-               func H()
-       `)
-       tg.wantNotStale("p1", "binary-only package", "should NOT want to rebuild p1 (second)")
-       tg.wantNotStale("p2", "", "should NOT want to rebuild p2")
-
-       tg.tempFile("src/p3/p3.go", `
-               package main
-               import (
-                       "p1"
-                       "p2"
-               )
-               func main() {
-                       p1.F(false)
-                       p2.F()
-               }
-       `)
-       tg.run("install", "p3")
-
-       tg.run("run", tg.path("src/p3/p3.go"))
-       tg.grepStdout("hello from p1", "did not see message from p1")
-
-       tg.tempFile("src/p4/p4.go", `package main`)
-       // The odd string split below avoids vet complaining about
-       // a // +build line appearing too late in this source file.
-       tg.tempFile("src/p4/p4not.go", `//go:binary-only-package
-
-               /`+`/ +build asdf
+       tg.wantStale("p1", "binary-only package", "should NOT want to rebuild p1 (first)")
+       tg.runFail("install", "p2")
+       tg.grepStderr("p1: binary-only packages are no longer supported", "did not report error for binary-only p1")
 
-               package main
-       `)
-       tg.run("list", "-f", "{{.BinaryOnly}}", "p4")
-       tg.grepStdout("false", "did not see BinaryOnly=false for p4")
+       tg.run("list", "-deps", "-f", "{{.ImportPath}}: {{.BinaryOnly}}", "p2")
+       tg.grepStdout("p1: true", "p1 not listed as BinaryOnly")
+       tg.grepStdout("p2: false", "p2 listed as BinaryOnly")
 }
 
 // Issue 16050.
@@ -4324,6 +4303,7 @@ func TestGenerateUsesBuildContext(t *testing.T) {
 // Issue 14450: go get -u .../ tried to import not downloaded package
 func TestGoGetUpdateWithWildcard(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -4535,8 +4515,9 @@ func TestLinkXImportPathEscape(t *testing.T) {
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
+       tg.makeTempdir()
        tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-       exe := "./linkx" + exeSuffix
+       exe := tg.path("linkx" + exeSuffix)
        tg.creatingTemp(exe)
        tg.run("build", "-o", exe, "-ldflags", "-X=my.pkg.Text=linkXworked", "my.pkg/main")
        out, err := exec.Command(exe).CombinedOutput()
@@ -4677,7 +4658,7 @@ func TestBuildTagsNoComma(t *testing.T) {
        tg.makeTempdir()
        tg.setenv("GOPATH", tg.path("go"))
        tg.run("build", "-tags", "tag1 tag2", "math")
-       tg.runFail("build", "-tags", "tag1,tag2", "math")
+       tg.runFail("build", "-tags", "tag1,tag2 tag3", "math")
        tg.grepBoth("space-separated list contains comma", "-tags with a comma-separated list didn't error")
 }
 
@@ -4772,7 +4753,7 @@ func TestExecutableGOROOT(t *testing.T) {
                check(t, symGoTool, newRoot)
        })
 
-       tg.must(os.RemoveAll(tg.path("new/pkg")))
+       tg.must(robustio.RemoveAll(tg.path("new/pkg")))
 
        // Binaries built in the new tree should report the
        // new tree when they call runtime.GOROOT.
@@ -4969,14 +4950,14 @@ func TestTestRegexps(t *testing.T) {
     x_test.go:15: LOG: Y running N=10000
     x_test.go:15: LOG: Y running N=1000000
     x_test.go:15: LOG: Y running N=100000000
-    x_test.go:15: LOG: Y running N=2000000000
+    x_test.go:15: LOG: Y running N=1000000000
 --- BENCH: BenchmarkX/Y
     x_test.go:15: LOG: Y running N=1
     x_test.go:15: LOG: Y running N=100
     x_test.go:15: LOG: Y running N=10000
     x_test.go:15: LOG: Y running N=1000000
     x_test.go:15: LOG: Y running N=100000000
-    x_test.go:15: LOG: Y running N=2000000000
+    x_test.go:15: LOG: Y running N=1000000000
 --- BENCH: BenchmarkX
     x_test.go:13: LOG: X running N=1
 --- BENCH: BenchmarkXX
@@ -5072,9 +5053,8 @@ func TestExecBuildX(t *testing.T) {
                t.Skip("skipping because cgo not enabled")
        }
 
-       if runtime.GOOS == "plan9" || runtime.GOOS == "windows" {
-               t.Skipf("skipping because unix shell is not supported on %s", runtime.GOOS)
-       }
+       testenv.MustHaveExecPath(t, "/usr/bin/env")
+       testenv.MustHaveExecPath(t, "bash")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -5082,6 +5062,11 @@ func TestExecBuildX(t *testing.T) {
        tg.tempDir("cache")
        tg.setenv("GOCACHE", tg.path("cache"))
 
+       // Before building our test main.go, ensure that an up-to-date copy of
+       // runtime/cgo is present in the cache. If it isn't, the 'go build' step below
+       // will fail with "can't open import". See golang.org/issue/29004.
+       tg.run("build", "runtime/cgo")
+
        tg.tempFile("main.go", `package main; import "C"; func main() { print("hello") }`)
        src := tg.path("main.go")
        obj := tg.path("main")
@@ -5124,7 +5109,7 @@ func TestExecBuildX(t *testing.T) {
        if len(matches) == 0 {
                t.Fatal("no WORK directory")
        }
-       tg.must(os.RemoveAll(matches[1]))
+       tg.must(robustio.RemoveAll(matches[1]))
 }
 
 func TestParallelNumber(t *testing.T) {
@@ -5155,9 +5140,10 @@ func TestUpxCompression(t *testing.T) {
                t.Skipf("skipping upx test on %s/%s", runtime.GOOS, runtime.GOARCH)
        }
 
+       testenv.MustHaveExecPath(t, "upx")
        out, err := exec.Command("upx", "--version").CombinedOutput()
        if err != nil {
-               t.Skip("skipping because upx is not available")
+               t.Fatalf("upx --version failed: %v", err)
        }
 
        // upx --version prints `upx <version>` in the first line of output:
@@ -5166,13 +5152,13 @@ func TestUpxCompression(t *testing.T) {
        re := regexp.MustCompile(`([[:digit:]]+)\.([[:digit:]]+)`)
        upxVersion := re.FindStringSubmatch(string(out))
        if len(upxVersion) != 3 {
-               t.Errorf("bad upx version string: %s", upxVersion)
+               t.Fatalf("bad upx version string: %s", upxVersion)
        }
 
        major, err1 := strconv.Atoi(upxVersion[1])
        minor, err2 := strconv.Atoi(upxVersion[2])
        if err1 != nil || err2 != nil {
-               t.Errorf("bad upx version string: %s", upxVersion[0])
+               t.Fatalf("bad upx version string: %s", upxVersion[0])
        }
 
        // Anything below 3.94 is known not to work with go binaries
@@ -5225,26 +5211,29 @@ func TestQEMUUserMode(t *testing.T) {
        src, obj := tg.path("main.go"), tg.path("main")
 
        for _, arch := range testArchs {
-               out, err := exec.Command("qemu-"+arch.qemu, "--version").CombinedOutput()
-               if err != nil {
-                       t.Logf("Skipping %s test (qemu-%s not available)", arch.g, arch.qemu)
-                       continue
-               }
+               arch := arch
+               t.Run(arch.g, func(t *testing.T) {
+                       qemu := "qemu-" + arch.qemu
+                       testenv.MustHaveExecPath(t, qemu)
 
-               tg.setenv("GOARCH", arch.g)
-               tg.run("build", "-o", obj, src)
+                       out, err := exec.Command(qemu, "--version").CombinedOutput()
+                       if err != nil {
+                               t.Fatalf("%s --version failed: %v", qemu, err)
+                       }
 
-               out, err = exec.Command("qemu-"+arch.qemu, obj).CombinedOutput()
-               if err != nil {
-                       t.Logf("qemu-%s output:\n%s\n", arch.qemu, out)
-                       t.Errorf("qemu-%s failed with %v", arch.qemu, err)
-                       continue
-               }
-               if want := "hello qemu-user"; string(out) != want {
-                       t.Errorf("bad output from qemu-%s:\ngot %s; want %s", arch.qemu, out, want)
-               }
-       }
+                       tg.setenv("GOARCH", arch.g)
+                       tg.run("build", "-o", obj, src)
 
+                       out, err = exec.Command(qemu, obj).CombinedOutput()
+                       if err != nil {
+                               t.Logf("%s output:\n%s\n", qemu, out)
+                               t.Fatalf("%s failed with %v", qemu, err)
+                       }
+                       if want := "hello qemu-user"; string(out) != want {
+                               t.Errorf("bad output from %s:\ngot %s; want %s", qemu, out, want)
+                       }
+               })
+       }
 }
 
 func TestCacheListStale(t *testing.T) {
@@ -5296,8 +5285,14 @@ func TestCacheVet(t *testing.T) {
        if strings.Contains(os.Getenv("GODEBUG"), "gocacheverify") {
                t.Skip("GODEBUG gocacheverify")
        }
-       if os.Getenv("GOCACHE") == "off" {
-               tooSlow(t)
+       if testing.Short() {
+               // In short mode, reuse cache.
+               // Test failures may be masked if the cache has just the right entries already
+               // (not a concern during all.bash, which runs in a clean cache).
+               if cfg.Getenv("GOCACHE") == "off" {
+                       tooSlow(t)
+               }
+       } else {
                tg.makeTempdir()
                tg.setenv("GOCACHE", tg.path("cache"))
        }
@@ -5681,6 +5676,7 @@ func TestTestSkipVetAfterFailedBuild(t *testing.T) {
 }
 
 func TestTestVetRebuild(t *testing.T) {
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -5960,6 +5956,7 @@ func TestBadCgoDirectives(t *testing.T) {
        if !canCgo {
                t.Skip("no cgo")
        }
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
 
@@ -5992,7 +5989,7 @@ func TestBadCgoDirectives(t *testing.T) {
        if runtime.Compiler == "gc" {
                tg.runFail("build", tg.path("src/x/_cgo_yy.go")) // ... but if forced, the comment is rejected
                // Actually, today there is a separate issue that _ files named
-               // on the command-line are ignored. Once that is fixed,
+               // on the command line are ignored. Once that is fixed,
                // we want to see the cgo_ldflag error.
                tg.grepStderr("//go:cgo_ldflag only allowed in cgo-generated code|no Go files", "did not reject //go:cgo_ldflag directive")
        }
@@ -6074,6 +6071,7 @@ func TestTwoPkgConfigs(t *testing.T) {
        if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
                t.Skipf("no shell scripts on %s", runtime.GOOS)
        }
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -6104,6 +6102,8 @@ func TestCgoCache(t *testing.T) {
        if !canCgo {
                t.Skip("no cgo")
        }
+       tooSlow(t)
+
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -6154,6 +6154,7 @@ func TestLinkerTmpDirIsDeleted(t *testing.T) {
        if !canCgo {
                t.Skip("skipping because cgo not enabled")
        }
+       tooSlow(t)
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -6243,6 +6244,7 @@ func TestGoTestWithoutTests(t *testing.T) {
 
 // Issue 25579.
 func TestGoBuildDashODevNull(t *testing.T) {
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
@@ -6255,6 +6257,7 @@ func TestGoBuildDashODevNull(t *testing.T) {
 // Issue 25093.
 func TestCoverpkgTestOnly(t *testing.T) {
        skipIfGccgo(t, "gccgo has no cover tool")
+       tooSlow(t)
        tg := testgo(t)
        defer tg.cleanup()
        tg.parallel()
index 99af3d43dccb431a2828a4f086454e3656b910f6..3999166ed98c72ecae268e18143c8ff007a501c6 100644 (file)
@@ -5,7 +5,6 @@
 package main
 
 import (
-       "fmt"
        "internal/testenv"
        "io/ioutil"
        "os"
@@ -13,14 +12,18 @@ import (
        "path/filepath"
        "strings"
        "testing"
+
+       "cmd/go/internal/robustio"
 )
 
 func TestAbsolutePath(t *testing.T) {
+       t.Parallel()
+
        tmp, err := ioutil.TempDir("", "TestAbsolutePath")
        if err != nil {
                t.Fatal(err)
        }
-       defer os.RemoveAll(tmp)
+       defer robustio.RemoveAll(tmp)
 
        file := filepath.Join(tmp, "a.go")
        err = ioutil.WriteFile(file, []byte{}, 0644)
@@ -33,21 +36,11 @@ func TestAbsolutePath(t *testing.T) {
                t.Fatal(err)
        }
 
-       wd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(wd)
-
-       // Chdir so current directory and a.go reside on the same drive.
-       err = os.Chdir(dir)
-       if err != nil {
-               t.Fatal(err)
-       }
-
        noVolume := file[len(filepath.VolumeName(file)):]
        wrongPath := filepath.Join(dir, noVolume)
-       output, err := exec.Command(testenv.GoToolPath(t), "build", noVolume).CombinedOutput()
+       cmd := exec.Command(testenv.GoToolPath(t), "build", noVolume)
+       cmd.Dir = dir
+       output, err := cmd.CombinedOutput()
        if err == nil {
                t.Fatal("build should fail")
        }
@@ -55,69 +48,3 @@ func TestAbsolutePath(t *testing.T) {
                t.Fatalf("wrong output found: %v %v", err, string(output))
        }
 }
-
-func runIcacls(t *testing.T, args ...string) string {
-       t.Helper()
-       out, err := exec.Command("icacls", args...).CombinedOutput()
-       if err != nil {
-               t.Fatalf("icacls failed: %v\n%v", err, string(out))
-       }
-       return string(out)
-}
-
-func runGetACL(t *testing.T, path string) string {
-       t.Helper()
-       cmd := fmt.Sprintf(`Get-Acl "%s" | Select -expand AccessToString`, path)
-       out, err := exec.Command("powershell", "-Command", cmd).CombinedOutput()
-       if err != nil {
-               t.Fatalf("Get-Acl failed: %v\n%v", err, string(out))
-       }
-       return string(out)
-}
-
-// For issue 22343: verify that executable file created by "go build" command
-// has discretionary access control list (DACL) set as if the file
-// was created in the destination directory.
-func TestACL(t *testing.T) {
-       tmpdir, err := ioutil.TempDir("", "TestACL")
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.RemoveAll(tmpdir)
-
-       newtmpdir := filepath.Join(tmpdir, "tmp")
-       err = os.Mkdir(newtmpdir, 0777)
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       // When TestACL/tmp directory is created, it will have
-       // the same security attributes as TestACL.
-       // Add Guest account full access to TestACL/tmp - this
-       // will make all files created in TestACL/tmp have different
-       // security attributes to the files created in TestACL.
-       runIcacls(t, newtmpdir,
-               "/grant", "*S-1-5-32-546:(oi)(ci)f", // add Guests group to have full access
-       )
-
-       src := filepath.Join(tmpdir, "main.go")
-       err = ioutil.WriteFile(src, []byte("package main; func main() { }\n"), 0644)
-       if err != nil {
-               t.Fatal(err)
-       }
-       exe := filepath.Join(tmpdir, "main.exe")
-       cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, src)
-       cmd.Env = append(os.Environ(),
-               "TMP="+newtmpdir,
-               "TEMP="+newtmpdir,
-       )
-       out, err := cmd.CombinedOutput()
-       if err != nil {
-               t.Fatalf("go command failed: %v\n%v", err, string(out))
-       }
-
-       // exe file is expected to have the same security attributes as the src.
-       if got, expected := runGetACL(t, exe), runGetACL(t, src); got != expected {
-               t.Fatalf("expected Get-Acl output of \n%v\n, got \n%v\n", expected, got)
-       }
-}
index ec6a9d11cbe2e0ed649ae56e6676a4fb7c9f427b..9c0fa8411ee13ab4bad8e51457f2b414b41ecb6a 100644 (file)
@@ -12,9 +12,14 @@ import (
        "testing"
 
        "cmd/go/internal/help"
+       "cmd/go/internal/modload"
 )
 
 func TestDocsUpToDate(t *testing.T) {
+       if !modload.Enabled() {
+               t.Skipf("help.Help in GOPATH mode is configured by main.main")
+       }
+
        buf := new(bytes.Buffer)
        // Match the command in mkalldocs.sh that generates alldocs.go.
        help.Help(buf, []string{"documentation"})
diff --git a/libgo/go/cmd/go/init_test.go b/libgo/go/cmd/go/init_test.go
new file mode 100644 (file)
index 0000000..ed90a77
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main_test
+
+import (
+       "internal/testenv"
+       "os/exec"
+       "testing"
+)
+
+// BenchmarkExecGoEnv measures how long it takes for 'go env GOARCH' to run.
+// Since 'go' is executed, remember to run 'go install cmd/go' before running
+// the benchmark if any changes were done.
+func BenchmarkExecGoEnv(b *testing.B) {
+       testenv.MustHaveExec(b)
+       b.StopTimer()
+       gotool, err := testenv.GoTool()
+       if err != nil {
+               b.Fatal(err)
+       }
+       for i := 0; i < b.N; i++ {
+               cmd := exec.Command(gotool, "env", "GOARCH")
+
+               b.StartTimer()
+               err := cmd.Run()
+               b.StopTimer()
+
+               if err != nil {
+                       b.Fatal(err)
+               }
+       }
+}
diff --git a/libgo/go/cmd/go/internal/auth/auth.go b/libgo/go/cmd/go/internal/auth/auth.go
new file mode 100644 (file)
index 0000000..12e3c74
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package auth provides access to user-provided authentication credentials.
+package auth
+
+import "net/http"
+
+// AddCredentials fills in the user's credentials for req, if any.
+// The return value reports whether any matching credentials were found.
+func AddCredentials(req *http.Request) (added bool) {
+       // TODO(golang.org/issue/26232): Support arbitrary user-provided credentials.
+       netrcOnce.Do(readNetrc)
+       for _, l := range netrc {
+               if l.machine == req.URL.Host {
+                       req.SetBasicAuth(l.login, l.password)
+                       return true
+               }
+       }
+
+       return false
+}
diff --git a/libgo/go/cmd/go/internal/auth/netrc.go b/libgo/go/cmd/go/internal/auth/netrc.go
new file mode 100644 (file)
index 0000000..7a9bdbb
--- /dev/null
@@ -0,0 +1,111 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package auth
+
+import (
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "sync"
+)
+
+type netrcLine struct {
+       machine  string
+       login    string
+       password string
+}
+
+var (
+       netrcOnce sync.Once
+       netrc     []netrcLine
+       netrcErr  error
+)
+
+func parseNetrc(data string) []netrcLine {
+       // See https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html
+       // for documentation on the .netrc format.
+       var nrc []netrcLine
+       var l netrcLine
+       inMacro := false
+       for _, line := range strings.Split(data, "\n") {
+               if inMacro {
+                       if line == "" {
+                               inMacro = false
+                       }
+                       continue
+               }
+
+               f := strings.Fields(line)
+               i := 0
+               for ; i < len(f)-1; i += 2 {
+                       // Reset at each "machine" token.
+                       // “The auto-login process searches the .netrc file for a machine token
+                       // that matches […]. Once a match is made, the subsequent .netrc tokens
+                       // are processed, stopping when the end of file is reached or another
+                       // machine or a default token is encountered.”
+                       switch f[i] {
+                       case "machine":
+                               l = netrcLine{machine: f[i+1]}
+                       case "default":
+                               break
+                       case "login":
+                               l.login = f[i+1]
+                       case "password":
+                               l.password = f[i+1]
+                       case "macdef":
+                               // “A macro is defined with the specified name; its contents begin with
+                               // the next .netrc line and continue until a null line (consecutive
+                               // new-line characters) is encountered.”
+                               inMacro = true
+                       }
+                       if l.machine != "" && l.login != "" && l.password != "" {
+                               nrc = append(nrc, l)
+                               l = netrcLine{}
+                       }
+               }
+
+               if i < len(f) && f[i] == "default" {
+                       // “There can be only one default token, and it must be after all machine tokens.”
+                       break
+               }
+       }
+
+       return nrc
+}
+
+func netrcPath() (string, error) {
+       if env := os.Getenv("NETRC"); env != "" {
+               return env, nil
+       }
+       dir, err := os.UserHomeDir()
+       if err != nil {
+               return "", err
+       }
+       base := ".netrc"
+       if runtime.GOOS == "windows" {
+               base = "_netrc"
+       }
+       return filepath.Join(dir, base), nil
+}
+
+func readNetrc() {
+       path, err := netrcPath()
+       if err != nil {
+               netrcErr = err
+               return
+       }
+
+       data, err := ioutil.ReadFile(path)
+       if err != nil {
+               if !os.IsNotExist(err) {
+                       netrcErr = err
+               }
+               return
+       }
+
+       netrc = parseNetrc(string(data))
+}
diff --git a/libgo/go/cmd/go/internal/auth/netrc_test.go b/libgo/go/cmd/go/internal/auth/netrc_test.go
new file mode 100644 (file)
index 0000000..e06c545
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package auth
+
+import (
+       "reflect"
+       "testing"
+)
+
+var testNetrc = `
+machine incomplete
+password none
+
+machine api.github.com
+  login user
+  password pwd
+
+machine incomlete.host
+  login justlogin
+
+machine test.host
+login user2
+password pwd2
+
+machine oneline login user3 password pwd3
+
+machine ignore.host macdef ignore
+  login nobody
+  password nothing
+
+machine hasmacro.too macdef ignore-next-lines login user4 password pwd4
+  login nobody
+  password nothing
+
+default
+login anonymous
+password gopher@golang.org
+
+machine after.default
+login oops
+password too-late-in-file
+`
+
+func TestParseNetrc(t *testing.T) {
+       lines := parseNetrc(testNetrc)
+       want := []netrcLine{
+               {"api.github.com", "user", "pwd"},
+               {"test.host", "user2", "pwd2"},
+               {"oneline", "user3", "pwd3"},
+               {"hasmacro.too", "user4", "pwd4"},
+       }
+
+       if !reflect.DeepEqual(lines, want) {
+               t.Errorf("parseNetrc:\nhave %q\nwant %q", lines, want)
+       }
+}
index bf810ff7622ac7ba7bcfaf1f9ed9bdaddcb48606..272da55681258dff961bb67a6f1c13dbf36ba1e5 100644 (file)
@@ -30,7 +30,7 @@ type Command struct {
        Run func(cmd *Command, args []string)
 
        // UsageLine is the one-line usage message.
-       // The first word in the line is taken to be the command name.
+       // The words between "go" and the first flag or argument in the line are taken to be the command name.
        UsageLine string
 
        // Short is the short description shown in the 'go help' output.
@@ -132,6 +132,10 @@ func SetExitStatus(n int) {
        exitMu.Unlock()
 }
 
+func GetExitStatus() int {
+       return exitStatus
+}
+
 // Run runs the command, with stdout and stderr
 // connected to the go command's own stdout and stderr.
 // If the command fails, Run reports the error using Errorf.
index fcade9d84e228400547fe3d9532b42ad8b655d32..077295e0effcee5656192c2a39a0f4824be49f0b 100644 (file)
@@ -4,34 +4,12 @@
 
 package base
 
-import "strings"
-
-// EnvForDir returns a copy of the environment
-// suitable for running in the given directory.
-// The environment is the current process's environment
-// but with an updated $PWD, so that an os.Getwd in the
-// child will be faster.
+// EnvForDir returns a modified environment suitable for running in the given
+// directory.
+// The environment is the supplied base environment but with an updated $PWD, so
+// that an os.Getwd in the child will be faster.
 func EnvForDir(dir string, base []string) []string {
        // Internally we only use rooted paths, so dir is rooted.
        // Even if dir is not rooted, no harm done.
-       return MergeEnvLists([]string{"PWD=" + dir}, base)
-}
-
-// MergeEnvLists merges the two environment lists such that
-// variables with the same name in "in" replace those in "out".
-// This always returns a newly allocated slice.
-func MergeEnvLists(in, out []string) []string {
-       out = append([]string(nil), out...)
-NextVar:
-       for _, inkv := range in {
-               k := strings.SplitAfterN(inkv, "=", 2)[0]
-               for i, outkv := range out {
-                       if strings.HasPrefix(outkv, k) {
-                               out[i] = inkv
-                               continue NextVar
-                       }
-               }
-               out = append(out, inkv)
-       }
-       return out
+       return append(base, "PWD="+dir)
 }
index 2f50b50bfcf368d1c1d911759b76ff1c398c38fd..187c2a1472734ca3a6cb0a162c187e165304c9a1 100644 (file)
@@ -7,7 +7,6 @@ package base
 import (
        "flag"
        "fmt"
-       "os"
        "runtime"
        "strings"
 
@@ -62,7 +61,7 @@ func InitGOFLAGS() {
        // (Both will show the GOFLAGS setting if let succeed.)
        hideErrors := cfg.CmdName == "env" || cfg.CmdName == "bug"
 
-       goflags = strings.Fields(os.Getenv("GOFLAGS"))
+       goflags = strings.Fields(cfg.Getenv("GOFLAGS"))
        if goflags == nil {
                goflags = []string{} // avoid work on later InitGOFLAGS call
        }
index e701f6eac9c943c4429956e4b89c5b4cece5ea4a..fe71281ef054ebebf4a3f51c0f267acbdc4aa999 100644 (file)
@@ -10,6 +10,7 @@ import (
        "fmt"
        "io"
        "io/ioutil"
+       urlpkg "net/url"
        "os"
        "os/exec"
        "path/filepath"
@@ -19,7 +20,6 @@ import (
 
        "cmd/go/internal/base"
        "cmd/go/internal/cfg"
-       "cmd/go/internal/envcmd"
        "cmd/go/internal/web"
 )
 
@@ -43,48 +43,60 @@ func runBug(cmd *base.Command, args []string) {
        }
        var buf bytes.Buffer
        buf.WriteString(bugHeader)
-       inspectGoVersion(&buf)
-       fmt.Fprint(&buf, "#### System details\n\n")
-       fmt.Fprintln(&buf, "```")
-       fmt.Fprintf(&buf, "go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
-       env := cfg.CmdEnv
-       env = append(env, envcmd.ExtraEnvVars()...)
-       for _, e := range env {
-               // Hide the TERM environment variable from "go bug".
-               // See issue #18128
-               if e.Name != "TERM" {
-                       fmt.Fprintf(&buf, "%s=\"%s\"\n", e.Name, e.Value)
-               }
-       }
-       printGoDetails(&buf)
-       printOSDetails(&buf)
-       printCDetails(&buf)
-       fmt.Fprintln(&buf, "```")
+       printGoVersion(&buf)
+       buf.WriteString("### Does this issue reproduce with the latest release?\n\n\n")
+       printEnvDetails(&buf)
+       buf.WriteString(bugFooter)
 
        body := buf.String()
-       url := "https://github.com/golang/go/issues/new?body=" + web.QueryEscape(body)
+       url := "https://github.com/golang/go/issues/new?body=" + urlpkg.QueryEscape(body)
        if !web.OpenBrowser(url) {
                fmt.Print("Please file a new issue at golang.org/issue/new using this template:\n\n")
                fmt.Print(body)
        }
 }
 
-const bugHeader = `Please answer these questions before submitting your issue. Thanks!
+const bugHeader = `<!-- Please answer these questions before submitting your issue. Thanks! -->
+
+`
+const bugFooter = `### What did you do?
 
-#### What did you do?
+<!--
 If possible, provide a recipe for reproducing the error.
 A complete runnable program is good.
 A link on play.golang.org is best.
+-->
+
 
 
-#### What did you expect to see?
+### What did you expect to see?
 
 
-#### What did you see instead?
 
+### What did you see instead?
 
 `
 
+func printGoVersion(w io.Writer) {
+       fmt.Fprintf(w, "### What version of Go are you using (`go version`)?\n\n")
+       fmt.Fprintf(w, "<pre>\n")
+       fmt.Fprintf(w, "$ go version\n")
+       printCmdOut(w, "", "go", "version")
+       fmt.Fprintf(w, "</pre>\n")
+       fmt.Fprintf(w, "\n")
+}
+
+func printEnvDetails(w io.Writer) {
+       fmt.Fprintf(w, "### What operating system and processor architecture are you using (`go env`)?\n\n")
+       fmt.Fprintf(w, "<details><summary><code>go env</code> Output</summary><br><pre>\n")
+       fmt.Fprintf(w, "$ go env\n")
+       printCmdOut(w, "", "go", "env")
+       printGoDetails(w)
+       printOSDetails(w)
+       printCDetails(w)
+       fmt.Fprintf(w, "</pre></details>\n\n")
+}
+
 func printGoDetails(w io.Writer) {
        printCmdOut(w, "GOROOT/bin/go version: ", filepath.Join(runtime.GOROOT(), "bin/go"), "version")
        printCmdOut(w, "GOROOT/bin/go tool compile -V: ", filepath.Join(runtime.GOROOT(), "bin/go"), "tool", "compile", "-V")
@@ -101,7 +113,9 @@ func printOSDetails(w io.Writer) {
                printGlibcVersion(w)
        case "openbsd", "netbsd", "freebsd", "dragonfly":
                printCmdOut(w, "uname -v: ", "uname", "-v")
-       case "solaris":
+       case "illumos", "solaris":
+               // Be sure to use the OS-supplied uname, in "/usr/bin":
+               printCmdOut(w, "uname -srv: ", "/usr/bin/uname", "-srv")
                out, err := ioutil.ReadFile("/etc/release")
                if err == nil {
                        fmt.Fprintf(w, "/etc/release: %s\n", out)
@@ -129,30 +143,6 @@ func printCDetails(w io.Writer) {
        }
 }
 
-func inspectGoVersion(w io.Writer) {
-       data, err := web.Get("https://golang.org/VERSION?m=text")
-       if err != nil {
-               if cfg.BuildV {
-                       fmt.Printf("failed to read from golang.org/VERSION: %v\n", err)
-               }
-               return
-       }
-
-       // golang.org/VERSION currently returns a whitespace-free string,
-       // but just in case, protect against that changing.
-       // Similarly so for runtime.Version.
-       release := string(bytes.TrimSpace(data))
-       vers := strings.TrimSpace(runtime.Version())
-
-       if vers == release {
-               // Up to date
-               return
-       }
-
-       // Devel version or outdated release. Either way, this request is apropos.
-       fmt.Fprintf(w, "#### Does this issue reproduce with the latest release (%s)?\n\n\n", release)
-}
-
 // printCmdOut prints the output of running the given command.
 // It ignores failures; 'go bug' is best effort.
 func printCmdOut(w io.Writer, prefix, path string, args ...string) {
index ab84cf6302c0d1ec952db6dc0a53bfb7a84aad8e..116279c977d466041b4da1014d23e64e359b7e40 100644 (file)
@@ -33,7 +33,6 @@ type OutputID [HashSize]byte
 // A Cache is a package cache, backed by a file system directory tree.
 type Cache struct {
        dir string
-       log *os.File
        now func() time.Time
 }
 
@@ -63,13 +62,8 @@ func Open(dir string) (*Cache, error) {
                        return nil, err
                }
        }
-       f, err := os.OpenFile(filepath.Join(dir, "log.txt"), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
-       if err != nil {
-               return nil, err
-       }
        c := &Cache{
                dir: dir,
-               log: f,
                now: time.Now,
        }
        return c, nil
@@ -141,7 +135,6 @@ type Entry struct {
 // get is Get but does not respect verify mode, so that Put can use it.
 func (c *Cache) get(id ActionID) (Entry, error) {
        missing := func() (Entry, error) {
-               fmt.Fprintf(c.log, "%d miss %x\n", c.now().Unix(), id)
                return Entry{}, errMissing
        }
        f, err := os.Open(c.fileName(id, "a"))
@@ -184,8 +177,6 @@ func (c *Cache) get(id ActionID) (Entry, error) {
                return missing()
        }
 
-       fmt.Fprintf(c.log, "%d get %x\n", c.now().Unix(), id)
-
        c.used(c.fileName(id, "a"))
 
        return Entry{buf, size, time.Unix(0, tm)}, nil
@@ -270,7 +261,7 @@ func (c *Cache) Trim() {
        // We maintain in dir/trim.txt the time of the last completed cache trim.
        // If the cache has been trimmed recently enough, do nothing.
        // This is the common case.
-       data, _ := ioutil.ReadFile(filepath.Join(c.dir, "trim.txt"))
+       data, _ := renameio.ReadFile(filepath.Join(c.dir, "trim.txt"))
        t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64)
        if err == nil && now.Sub(time.Unix(t, 0)) < trimInterval {
                return
@@ -287,7 +278,7 @@ func (c *Cache) Trim() {
 
        // Ignore errors from here: if we don't write the complete timestamp, the
        // cache will appear older than it is, and we'll trim it again next time.
-       renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix())))
+       renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix())), 0666)
 }
 
 // trimSubdir trims a single cache subdirectory.
@@ -349,7 +340,6 @@ func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify
        }
        os.Chtimes(file, c.now(), c.now()) // mainly for tests
 
-       fmt.Fprintf(c.log, "%d put %x %x %d\n", c.now().Unix(), id, out, size)
        return nil
 }
 
index d3dafccd137f2116c228862f08179a4bea3162e5..1988c3450234e3c80a8d86701fc536710f2837d9 100644 (file)
@@ -78,7 +78,7 @@ func TestGrowth(t *testing.T) {
 
        n := 10000
        if testing.Short() {
-               n = 1000
+               n = 10
        }
 
        for i := 0; i < n; i++ {
@@ -144,55 +144,6 @@ func TestVerifyPanic(t *testing.T) {
        t.Fatal("mismatched Put did not panic in verify mode")
 }
 
-func TestCacheLog(t *testing.T) {
-       dir, err := ioutil.TempDir("", "cachetest-")
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.RemoveAll(dir)
-
-       c, err := Open(dir)
-       if err != nil {
-               t.Fatalf("Open: %v", err)
-       }
-       c.now = func() time.Time { return time.Unix(1e9, 0) }
-
-       id := ActionID(dummyID(1))
-       c.Get(id)
-       c.PutBytes(id, []byte("abc"))
-       c.Get(id)
-
-       c, err = Open(dir)
-       if err != nil {
-               t.Fatalf("Open #2: %v", err)
-       }
-       c.now = func() time.Time { return time.Unix(1e9+1, 0) }
-       c.Get(id)
-
-       id2 := ActionID(dummyID(2))
-       c.Get(id2)
-       c.PutBytes(id2, []byte("abc"))
-       c.Get(id2)
-       c.Get(id)
-
-       data, err := ioutil.ReadFile(filepath.Join(dir, "log.txt"))
-       if err != nil {
-               t.Fatal(err)
-       }
-       want := `1000000000 miss 0100000000000000000000000000000000000000000000000000000000000000
-1000000000 put 0100000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3
-1000000000 get 0100000000000000000000000000000000000000000000000000000000000000
-1000000001 get 0100000000000000000000000000000000000000000000000000000000000000
-1000000001 miss 0200000000000000000000000000000000000000000000000000000000000000
-1000000001 put 0200000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3
-1000000001 get 0200000000000000000000000000000000000000000000000000000000000000
-1000000001 get 0100000000000000000000000000000000000000000000000000000000000000
-`
-       if string(data) != want {
-               t.Fatalf("log:\n%s\nwant:\n%s", string(data), want)
-       }
-}
-
 func dummyID(x int) [HashSize]byte {
        var out [HashSize]byte
        binary.LittleEndian.PutUint64(out[:], uint64(x))
index 7d389c3c1af9f13b16429480924f6d1709b9aa42..9f8dd8af4b6b2dc02586c7bc19debab92c5ff6d2 100644 (file)
@@ -12,6 +12,7 @@ import (
        "sync"
 
        "cmd/go/internal/base"
+       "cmd/go/internal/cfg"
 )
 
 // Default returns the default cache to use, or nil if no cache should be used.
@@ -73,7 +74,7 @@ func DefaultDir() string {
        // otherwise distinguish between an explicit "off" and a UserCacheDir error.
 
        defaultDirOnce.Do(func() {
-               defaultDir = os.Getenv("GOCACHE")
+               defaultDir = cfg.Getenv("GOCACHE")
                if filepath.IsAbs(defaultDir) || defaultDir == "off" {
                        return
                }
index 8dc4d1fbd2989575d9ad6e76c3bacb6bbd5fd72f..a0b51a72c33d12cdcd5c3b8f7de5c82f8bb37233 100644 (file)
@@ -7,11 +7,15 @@
 package cfg
 
 import (
+       "bytes"
        "fmt"
        "go/build"
+       "io/ioutil"
        "os"
        "path/filepath"
        "runtime"
+       "strings"
+       "sync"
 
        "cmd/internal/objabi"
 )
@@ -34,11 +38,12 @@ var (
        BuildToolchainName     string
        BuildToolchainCompiler func() string
        BuildToolchainLinker   func() string
+       BuildTrimpath          bool // -trimpath flag
        BuildV                 bool // -v flag
        BuildWork              bool // -work flag
        BuildX                 bool // -x flag
 
-       CmdName string // "build", "install", "list", etc.
+       CmdName string // "build", "install", "list", "mod tidy", etc.
 
        DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable)
 )
@@ -46,6 +51,50 @@ var (
 func defaultContext() build.Context {
        ctxt := build.Default
        ctxt.JoinPath = filepath.Join // back door to say "do not use go command"
+
+       ctxt.GOROOT = findGOROOT()
+       if runtime.Compiler != "gccgo" {
+               // Note that we must use runtime.GOOS and runtime.GOARCH here,
+               // as the tool directory does not move based on environment
+               // variables. This matches the initialization of ToolDir in
+               // go/build, except for using ctxt.GOROOT rather than
+               // runtime.GOROOT.
+               build.ToolDir = filepath.Join(ctxt.GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)
+       }
+
+       ctxt.GOPATH = envOr("GOPATH", ctxt.GOPATH)
+
+       // Override defaults computed in go/build with defaults
+       // from go environment configuration file, if known.
+       ctxt.GOOS = envOr("GOOS", ctxt.GOOS)
+       ctxt.GOARCH = envOr("GOARCH", ctxt.GOARCH)
+
+       // The go/build rule for whether cgo is enabled is:
+       //      1. If $CGO_ENABLED is set, respect it.
+       //      2. Otherwise, if this is a cross-compile, disable cgo.
+       //      3. Otherwise, use built-in default for GOOS/GOARCH.
+       // Recreate that logic here with the new GOOS/GOARCH setting.
+       if v := Getenv("CGO_ENABLED"); v == "0" || v == "1" {
+               ctxt.CgoEnabled = v[0] == '1'
+       } else if ctxt.GOOS != runtime.GOOS || ctxt.GOARCH != runtime.GOARCH {
+               ctxt.CgoEnabled = false
+       } else {
+               // Use built-in default cgo setting for GOOS/GOARCH.
+               // Note that ctxt.GOOS/GOARCH are derived from the preference list
+               // (1) environment, (2) go/env file, (3) runtime constants,
+               // while go/build.Default.GOOS/GOARCH are derived from the preference list
+               // (1) environment, (2) runtime constants.
+               // We know ctxt.GOOS/GOARCH == runtime.GOOS/GOARCH;
+               // no matter how that happened, go/build.Default will make the
+               // same decision (either the environment variables are set explicitly
+               // to match the runtime constants, or else they are unset, in which
+               // case go/build falls back to the runtime constants), so
+               // go/build.Default.GOOS/GOARCH == runtime.GOOS/GOARCH.
+               // So ctxt.CgoEnabled (== go/build.Default.CgoEnabled) is correct
+               // as is and can be left unmodified.
+               // Nothing to do here.
+       }
+
        return ctxt
 }
 
@@ -70,54 +119,215 @@ var CmdEnv []EnvVar
 
 // Global build parameters (used during package load)
 var (
-       Goarch    = BuildContext.GOARCH
-       Goos      = BuildContext.GOOS
-       ExeSuffix string
-       Gopath    = filepath.SplitList(BuildContext.GOPATH)
+       Goarch = BuildContext.GOARCH
+       Goos   = BuildContext.GOOS
+
+       ExeSuffix = exeSuffix()
 
        // ModulesEnabled specifies whether the go command is running
        // in module-aware mode (as opposed to GOPATH mode).
        // It is equal to modload.Enabled, but not all packages can import modload.
        ModulesEnabled bool
-
-       // GoModInGOPATH records whether we've found a go.mod in GOPATH/src
-       // in GO111MODULE=auto mode. In that case, we don't use modules
-       // but people might expect us to, so 'go get' warns.
-       GoModInGOPATH string
 )
 
-func init() {
+func exeSuffix() string {
        if Goos == "windows" {
-               ExeSuffix = ".exe"
+               return ".exe"
+       }
+       return ""
+}
+
+var envCache struct {
+       once sync.Once
+       m    map[string]string
+}
+
+// EnvFile returns the name of the Go environment configuration file.
+func EnvFile() (string, error) {
+       if file := os.Getenv("GOENV"); file != "" {
+               if file == "off" {
+                       return "", fmt.Errorf("GOENV=off")
+               }
+               return file, nil
+       }
+       dir, err := os.UserConfigDir()
+       if err != nil {
+               return "", err
+       }
+       if dir == "" {
+               return "", fmt.Errorf("missing user-config dir")
+       }
+       return filepath.Join(dir, "go/env"), nil
+}
+
+func initEnvCache() {
+       envCache.m = make(map[string]string)
+       file, _ := EnvFile()
+       if file == "" {
+               return
+       }
+       data, err := ioutil.ReadFile(file)
+       if err != nil {
+               return
+       }
+
+       for len(data) > 0 {
+               // Get next line.
+               line := data
+               i := bytes.IndexByte(data, '\n')
+               if i >= 0 {
+                       line, data = line[:i], data[i+1:]
+               } else {
+                       data = nil
+               }
+
+               i = bytes.IndexByte(line, '=')
+               if i < 0 || line[0] < 'A' || 'Z' < line[0] {
+                       // Line is missing = (or empty) or a comment or not a valid env name. Ignore.
+                       // (This should not happen, since the file should be maintained almost
+                       // exclusively by "go env -w", but better to silently ignore than to make
+                       // the go command unusable just because somehow the env file has
+                       // gotten corrupted.)
+                       continue
+               }
+               key, val := line[:i], line[i+1:]
+               envCache.m[string(key)] = string(val)
+       }
+}
+
+// Getenv gets the value for the configuration key.
+// It consults the operating system environment
+// and then the go/env file.
+// If Getenv is called for a key that cannot be set
+// in the go/env file (for example GODEBUG), it panics.
+// This ensures that CanGetenv is accurate, so that
+// 'go env -w' stays in sync with what Getenv can retrieve.
+func Getenv(key string) string {
+       if !CanGetenv(key) {
+               switch key {
+               case "CGO_TEST_ALLOW", "CGO_TEST_DISALLOW", "CGO_test_ALLOW", "CGO_test_DISALLOW":
+                       // used by internal/work/security_test.go; allow
+               default:
+                       panic("internal error: invalid Getenv " + key)
+               }
+       }
+       val := os.Getenv(key)
+       if val != "" {
+               return val
        }
+       envCache.once.Do(initEnvCache)
+       return envCache.m[key]
 }
 
+// CanGetenv reports whether key is a valid go/env configuration key.
+func CanGetenv(key string) bool {
+       return strings.Contains(knownEnv, "\t"+key+"\n")
+}
+
+var knownEnv = `
+       AR
+       CC
+       CGO_CFLAGS
+       CGO_CFLAGS_ALLOW
+       CGO_CFLAGS_DISALLOW
+       CGO_CPPFLAGS
+       CGO_CPPFLAGS_ALLOW
+       CGO_CPPFLAGS_DISALLOW
+       CGO_CXXFLAGS
+       CGO_CXXFLAGS_ALLOW
+       CGO_CXXFLAGS_DISALLOW
+       CGO_ENABLED
+       CGO_FFLAGS
+       CGO_FFLAGS_ALLOW
+       CGO_FFLAGS_DISALLOW
+       CGO_LDFLAGS
+       CGO_LDFLAGS_ALLOW
+       CGO_LDFLAGS_DISALLOW
+       CXX
+       FC
+       GCCGO
+       GO111MODULE
+       GO386
+       GOARCH
+       GOARM
+       GOBIN
+       GOCACHE
+       GOENV
+       GOEXE
+       GOFLAGS
+       GOGCCFLAGS
+       GOHOSTARCH
+       GOHOSTOS
+       GOMIPS
+       GOMIPS64
+       GONOPROXY
+       GONOSUMDB
+       GOOS
+       GOPATH
+       GOPPC64
+       GOPRIVATE
+       GOPROXY
+       GOROOT
+       GOSUMDB
+       GOTMPDIR
+       GOTOOLDIR
+       GOWASM
+       GO_EXTLINK_ENABLED
+       PKG_CONFIG
+`
+
 var (
-       GOROOT       = findGOROOT()
-       GOBIN        = os.Getenv("GOBIN")
+       GOROOT       = BuildContext.GOROOT
+       GOBIN        = Getenv("GOBIN")
        GOROOTbin    = filepath.Join(GOROOT, "bin")
        GOROOTpkg    = filepath.Join(GOROOT, "pkg")
        GOROOTsrc    = filepath.Join(GOROOT, "src")
        GOROOT_FINAL = findGOROOT_FINAL()
 
        // Used in envcmd.MkEnv and build ID computations.
-       GOARM    = fmt.Sprint(objabi.GOARM)
-       GO386    = objabi.GO386
-       GOMIPS   = objabi.GOMIPS
-       GOMIPS64 = objabi.GOMIPS64
+       GOARM    = envOr("GOARM", fmt.Sprint(objabi.GOARM))
+       GO386    = envOr("GO386", objabi.GO386)
+       GOMIPS   = envOr("GOMIPS", objabi.GOMIPS)
+       GOMIPS64 = envOr("GOMIPS64", objabi.GOMIPS64)
+       GOPPC64  = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", objabi.GOPPC64))
+       GOWASM   = envOr("GOWASM", fmt.Sprint(objabi.GOWASM))
+
+       GOPROXY   = envOr("GOPROXY", "https://proxy.golang.org,direct")
+       GOSUMDB   = envOr("GOSUMDB", "sum.golang.org")
+       GOPRIVATE = Getenv("GOPRIVATE")
+       GONOPROXY = envOr("GONOPROXY", GOPRIVATE)
+       GONOSUMDB = envOr("GONOSUMDB", GOPRIVATE)
 )
 
-// Update build context to use our computed GOROOT.
-func init() {
-       BuildContext.GOROOT = GOROOT
-       if runtime.Compiler != "gccgo" {
-               // Note that we must use runtime.GOOS and runtime.GOARCH here,
-               // as the tool directory does not move based on environment
-               // variables. This matches the initialization of ToolDir in
-               // go/build, except for using GOROOT rather than
-               // runtime.GOROOT.
-               build.ToolDir = filepath.Join(GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)
+// GetArchEnv returns the name and setting of the
+// GOARCH-specific architecture environment variable.
+// If the current architecture has no GOARCH-specific variable,
+// GetArchEnv returns empty key and value.
+func GetArchEnv() (key, val string) {
+       switch Goarch {
+       case "arm":
+               return "GOARM", GOARM
+       case "386":
+               return "GO386", GO386
+       case "mips", "mipsle":
+               return "GOMIPS", GOMIPS
+       case "mips64", "mips64le":
+               return "GOMIPS64", GOMIPS64
+       case "ppc64", "ppc64le":
+               return "GOPPC64", GOPPC64
+       case "wasm":
+               return "GOWASM", GOWASM
+       }
+       return "", ""
+}
+
+// envOr returns Getenv(key) if set, or else def.
+func envOr(key, def string) string {
+       val := Getenv(key)
+       if val == "" {
+               val = def
        }
+       return val
 }
 
 // There is a copy of findGOROOT, isSameDir, and isGOROOT in
@@ -131,7 +341,7 @@ func init() {
 //
 // There is a copy of this code in x/tools/cmd/godoc/goroot.go.
 func findGOROOT() string {
-       if env := os.Getenv("GOROOT"); env != "" {
+       if env := Getenv("GOROOT"); env != "" {
                return filepath.Clean(env)
        }
        def := filepath.Clean(runtime.GOROOT())
@@ -167,6 +377,8 @@ func findGOROOT() string {
 }
 
 func findGOROOT_FINAL() string {
+       // $GOROOT_FINAL is only for use during make.bash
+       // so it is not settable using go/env, so we use os.Getenv here.
        def := GOROOT
        if env := os.Getenv("GOROOT_FINAL"); env != "" {
                def = filepath.Clean(env)
index 27121ed2ae679b1cfc155852065aca41622bfd3c..f7d80ff6dc8a13074110e28408dc54268dccbf66 100644 (file)
@@ -33,7 +33,8 @@ The go command builds most objects in a temporary directory,
 so go clean is mainly concerned with object files left by other
 tools or by manual invocations of go build.
 
-Specifically, clean removes the following files from each of the
+If a package argument is given or the -i or -r flag is set,
+clean removes the following files from each of the
 source directories corresponding to the import paths:
 
        _obj/            old object directory, left from Makefiles
@@ -105,7 +106,16 @@ func init() {
 }
 
 func runClean(cmd *base.Command, args []string) {
-       if len(args) > 0 || !modload.Enabled() || modload.HasModRoot() {
+       // golang.org/issue/29925: only load packages before cleaning if
+       // either the flags and arguments explicitly imply a package,
+       // or no other target (such as a cache) was requested to be cleaned.
+       cleanPkg := len(args) > 0 || cleanI || cleanR
+       if (!modload.Enabled() || modload.HasModRoot()) &&
+               !cleanCache && !cleanModcache && !cleanTestcache {
+               cleanPkg = true
+       }
+
+       if cleanPkg {
                for _, pkg := range load.PackagesAndErrors(args) {
                        clean(pkg)
                }
@@ -122,11 +132,11 @@ func runClean(cmd *base.Command, args []string) {
                        // and not something that we want to remove. Also, we'd like to preserve
                        // the access log for future analysis, even if the cache is cleared.
                        subdirs, _ := filepath.Glob(filepath.Join(dir, "[0-9a-f][0-9a-f]"))
+                       printedErrors := false
                        if len(subdirs) > 0 {
                                if cfg.BuildN || cfg.BuildX {
                                        b.Showcmd("", "rm -r %s", strings.Join(subdirs, " "))
                                }
-                               printedErrors := false
                                for _, d := range subdirs {
                                        // Only print the first error - there may be many.
                                        // This also mimics what os.RemoveAll(dir) would do.
@@ -136,6 +146,12 @@ func runClean(cmd *base.Command, args []string) {
                                        }
                                }
                        }
+
+                       logFile := filepath.Join(dir, "log.txt")
+                       if err := os.RemoveAll(logFile); err != nil && !printedErrors {
+                               printedErrors = true
+                               base.Errorf("go clean -cache: %v", err)
+                       }
                }
        }
 
index ae98d3999a1fa429c8105aa0968b00d3a2812545..17852deed1e703a52118539316af10cb859c2629 100644 (file)
@@ -8,10 +8,13 @@ package envcmd
 import (
        "encoding/json"
        "fmt"
+       "io/ioutil"
        "os"
        "path/filepath"
        "runtime"
+       "sort"
        "strings"
+       "unicode/utf8"
 
        "cmd/go/internal/base"
        "cmd/go/internal/cache"
@@ -22,7 +25,7 @@ import (
 )
 
 var CmdEnv = &base.Command{
-       UsageLine: "go env [-json] [var ...]",
+       UsageLine: "go env [-json] [-u] [-w] [var ...]",
        Short:     "print Go environment information",
        Long: `
 Env prints Go environment information.
@@ -35,6 +38,14 @@ each named variable on its own line.
 The -json flag prints the environment in JSON format
 instead of as a shell script.
 
+The -u flag requires one or more arguments and unsets
+the default setting for the named environment variables,
+if one has been set with 'go env -w'.
+
+The -w flag requires one or more arguments of the
+form NAME=VALUE and changes the default settings
+of the named environment variables to the given values.
+
 For more about environment variables, see 'go help environment'.
        `,
 }
@@ -43,26 +54,36 @@ func init() {
        CmdEnv.Run = runEnv // break init cycle
 }
 
-var envJson = CmdEnv.Flag.Bool("json", false, "")
+var (
+       envJson = CmdEnv.Flag.Bool("json", false, "")
+       envU    = CmdEnv.Flag.Bool("u", false, "")
+       envW    = CmdEnv.Flag.Bool("w", false, "")
+)
 
 func MkEnv() []cfg.EnvVar {
        var b work.Builder
        b.Init()
 
+       envFile, _ := cfg.EnvFile()
        env := []cfg.EnvVar{
+               {Name: "GO111MODULE", Value: cfg.Getenv("GO111MODULE")},
                {Name: "GOARCH", Value: cfg.Goarch},
                {Name: "GOBIN", Value: cfg.GOBIN},
                {Name: "GOCACHE", Value: cache.DefaultDir()},
+               {Name: "GOENV", Value: envFile},
                {Name: "GOEXE", Value: cfg.ExeSuffix},
-               {Name: "GOFLAGS", Value: os.Getenv("GOFLAGS")},
+               {Name: "GOFLAGS", Value: cfg.Getenv("GOFLAGS")},
                {Name: "GOHOSTARCH", Value: runtime.GOARCH},
                {Name: "GOHOSTOS", Value: runtime.GOOS},
+               {Name: "GONOPROXY", Value: cfg.GONOPROXY},
+               {Name: "GONOSUMDB", Value: cfg.GONOSUMDB},
                {Name: "GOOS", Value: cfg.Goos},
                {Name: "GOPATH", Value: cfg.BuildContext.GOPATH},
-               {Name: "GOPROXY", Value: os.Getenv("GOPROXY")},
-               {Name: "GORACE", Value: os.Getenv("GORACE")},
+               {Name: "GOPRIVATE", Value: cfg.GOPRIVATE},
+               {Name: "GOPROXY", Value: cfg.GOPROXY},
                {Name: "GOROOT", Value: cfg.GOROOT},
-               {Name: "GOTMPDIR", Value: os.Getenv("GOTMPDIR")},
+               {Name: "GOSUMDB", Value: cfg.GOSUMDB},
+               {Name: "GOTMPDIR", Value: cfg.Getenv("GOTMPDIR")},
                {Name: "GOTOOLDIR", Value: base.ToolDir},
        }
 
@@ -72,25 +93,20 @@ func MkEnv() []cfg.EnvVar {
                env = append(env, cfg.EnvVar{Name: "GCCGO", Value: work.GccgoName})
        }
 
-       switch cfg.Goarch {
-       case "arm":
-               env = append(env, cfg.EnvVar{Name: "GOARM", Value: cfg.GOARM})
-       case "386":
-               env = append(env, cfg.EnvVar{Name: "GO386", Value: cfg.GO386})
-       case "mips", "mipsle":
-               env = append(env, cfg.EnvVar{Name: "GOMIPS", Value: cfg.GOMIPS})
-       case "mips64", "mips64le":
-               env = append(env, cfg.EnvVar{Name: "GOMIPS64", Value: cfg.GOMIPS64})
+       key, val := cfg.GetArchEnv()
+       if key != "" {
+               env = append(env, cfg.EnvVar{Name: key, Value: val})
        }
 
        cc := cfg.DefaultCC(cfg.Goos, cfg.Goarch)
-       if env := strings.Fields(os.Getenv("CC")); len(env) > 0 {
+       if env := strings.Fields(cfg.Getenv("CC")); len(env) > 0 {
                cc = env[0]
        }
        cxx := cfg.DefaultCXX(cfg.Goos, cfg.Goarch)
-       if env := strings.Fields(os.Getenv("CXX")); len(env) > 0 {
+       if env := strings.Fields(cfg.Getenv("CXX")); len(env) > 0 {
                cxx = env[0]
        }
+       env = append(env, cfg.EnvVar{Name: "AR", Value: envOr("AR", "ar")})
        env = append(env, cfg.EnvVar{Name: "CC", Value: cc})
        env = append(env, cfg.EnvVar{Name: "CXX", Value: cxx})
 
@@ -103,6 +119,14 @@ func MkEnv() []cfg.EnvVar {
        return env
 }
 
+func envOr(name, def string) string {
+       val := cfg.Getenv(name)
+       if val != "" {
+               return val
+       }
+       return def
+}
+
 func findEnv(env []cfg.EnvVar, name string) string {
        for _, e := range env {
                if e.Name == name {
@@ -150,7 +174,25 @@ func ExtraEnvVarsCostly() []cfg.EnvVar {
        }
 }
 
+// argKey returns the KEY part of the arg KEY=VAL, or else arg itself.
+func argKey(arg string) string {
+       i := strings.Index(arg, "=")
+       if i < 0 {
+               return arg
+       }
+       return arg[:i]
+}
+
 func runEnv(cmd *base.Command, args []string) {
+       if *envJson && *envU {
+               base.Fatalf("go env: cannot use -json with -u")
+       }
+       if *envJson && *envW {
+               base.Fatalf("go env: cannot use -json with -w")
+       }
+       if *envU && *envW {
+               base.Fatalf("go env: cannot use -u with -w")
+       }
        env := cfg.CmdEnv
        env = append(env, ExtraEnvVars()...)
 
@@ -161,7 +203,7 @@ func runEnv(cmd *base.Command, args []string) {
        if len(args) > 0 {
                needCostly = false
                for _, arg := range args {
-                       switch arg {
+                       switch argKey(arg) {
                        case "CGO_CFLAGS",
                                "CGO_CPPFLAGS",
                                "CGO_CXXFLAGS",
@@ -177,6 +219,55 @@ func runEnv(cmd *base.Command, args []string) {
                env = append(env, ExtraEnvVarsCostly()...)
        }
 
+       if *envW {
+               // Process and sanity-check command line.
+               if len(args) == 0 {
+                       base.Fatalf("go env -w: no KEY=VALUE arguments given")
+               }
+               osEnv := make(map[string]string)
+               for _, e := range cfg.OrigEnv {
+                       if i := strings.Index(e, "="); i >= 0 {
+                               osEnv[e[:i]] = e[i+1:]
+                       }
+               }
+               add := make(map[string]string)
+               for _, arg := range args {
+                       i := strings.Index(arg, "=")
+                       if i < 0 {
+                               base.Fatalf("go env -w: arguments must be KEY=VALUE: invalid argument: %s", arg)
+                       }
+                       key, val := arg[:i], arg[i+1:]
+                       if err := checkEnvWrite(key, val, env); err != nil {
+                               base.Fatalf("go env -w: %v", err)
+                       }
+                       if _, ok := add[key]; ok {
+                               base.Fatalf("go env -w: multiple values for key: %s", key)
+                       }
+                       add[key] = val
+                       if osVal := osEnv[key]; osVal != "" && osVal != val {
+                               fmt.Fprintf(os.Stderr, "warning: go env -w %s=... does not override conflicting OS environment variable\n", key)
+                       }
+               }
+               updateEnvFile(add, nil)
+               return
+       }
+
+       if *envU {
+               // Process and sanity-check command line.
+               if len(args) == 0 {
+                       base.Fatalf("go env -u: no arguments given")
+               }
+               del := make(map[string]bool)
+               for _, arg := range args {
+                       if err := checkEnvWrite(arg, "", env); err != nil {
+                               base.Fatalf("go env -u: %v", err)
+                       }
+                       del[arg] = true
+               }
+               updateEnvFile(nil, del)
+               return
+       }
+
        if len(args) > 0 {
                if *envJson {
                        var es []cfg.EnvVar
@@ -235,6 +326,118 @@ func printEnvAsJSON(env []cfg.EnvVar) {
        enc := json.NewEncoder(os.Stdout)
        enc.SetIndent("", "\t")
        if err := enc.Encode(m); err != nil {
-               base.Fatalf("%s", err)
+               base.Fatalf("go env -json: %s", err)
+       }
+}
+
+func checkEnvWrite(key, val string, env []cfg.EnvVar) error {
+       switch key {
+       case "GOEXE", "GOGCCFLAGS", "GOHOSTARCH", "GOHOSTOS", "GOMOD", "GOTOOLDIR":
+               return fmt.Errorf("%s cannot be modified", key)
+       case "GOENV":
+               return fmt.Errorf("%s can only be set using the OS environment", key)
+       }
+
+       // To catch typos and the like, check that we know the variable.
+       if !cfg.CanGetenv(key) {
+               return fmt.Errorf("unknown go command variable %s", key)
+       }
+
+       if !utf8.ValidString(val) {
+               return fmt.Errorf("invalid UTF-8 in %s=... value", key)
+       }
+       if strings.Contains(val, "\x00") {
+               return fmt.Errorf("invalid NUL in %s=... value", key)
+       }
+       if strings.ContainsAny(val, "\v\r\n") {
+               return fmt.Errorf("invalid newline in %s=... value", key)
+       }
+       return nil
+}
+
+func updateEnvFile(add map[string]string, del map[string]bool) {
+       file, err := cfg.EnvFile()
+       if file == "" {
+               base.Fatalf("go env: cannot find go env config: %v", err)
+       }
+       data, err := ioutil.ReadFile(file)
+       if err != nil && (!os.IsNotExist(err) || len(add) == 0) {
+               base.Fatalf("go env: reading go env config: %v", err)
        }
+
+       lines := strings.SplitAfter(string(data), "\n")
+       if lines[len(lines)-1] == "" {
+               lines = lines[:len(lines)-1]
+       } else {
+               lines[len(lines)-1] += "\n"
+       }
+
+       // Delete all but last copy of any duplicated variables,
+       // since the last copy is the one that takes effect.
+       prev := make(map[string]int)
+       for l, line := range lines {
+               if key := lineToKey(line); key != "" {
+                       if p, ok := prev[key]; ok {
+                               lines[p] = ""
+                       }
+                       prev[key] = l
+               }
+       }
+
+       // Add variables (go env -w). Update existing lines in file if present, add to end otherwise.
+       for key, val := range add {
+               if p, ok := prev[key]; ok {
+                       lines[p] = key + "=" + val + "\n"
+                       delete(add, key)
+               }
+       }
+       for key, val := range add {
+               lines = append(lines, key+"="+val+"\n")
+       }
+
+       // Delete requested variables (go env -u).
+       for key := range del {
+               if p, ok := prev[key]; ok {
+                       lines[p] = ""
+               }
+       }
+
+       // Sort runs of KEY=VALUE lines
+       // (that is, blocks of lines where blocks are separated
+       // by comments, blank lines, or invalid lines).
+       start := 0
+       for i := 0; i <= len(lines); i++ {
+               if i == len(lines) || lineToKey(lines[i]) == "" {
+                       sortKeyValues(lines[start:i])
+                       start = i + 1
+               }
+       }
+
+       data = []byte(strings.Join(lines, ""))
+       err = ioutil.WriteFile(file, data, 0666)
+       if err != nil {
+               // Try creating directory.
+               os.MkdirAll(filepath.Dir(file), 0777)
+               err = ioutil.WriteFile(file, data, 0666)
+               if err != nil {
+                       base.Fatalf("go env: writing go env config: %v", err)
+               }
+       }
+}
+
+// lineToKey returns the KEY part of the line KEY=VALUE or else an empty string.
+func lineToKey(line string) string {
+       i := strings.Index(line, "=")
+       if i < 0 || strings.Contains(line[:i], "#") {
+               return ""
+       }
+       return line[:i]
+}
+
+// sortKeyValues sorts a sequence of lines by key.
+// It differs from sort.Strings in that GO386= sorts after GO=.
+func sortKeyValues(lines []string) {
+       sort.Slice(lines, func(i, j int) bool {
+               return lineToKey(lines[i]) < lineToKey(lines[j])
+       })
 }
index 124dbc05f5d8f3fa6eee4ce6e7ee0b40ce9fce8f..f2ae80e5dc68f5e2764c07e6f2226fba743108ee 100644 (file)
@@ -110,11 +110,13 @@ specifies that the command "foo" represents the generator
 "go tool foo".
 
 Generate processes packages in the order given on the command line,
-one at a time. If the command line lists .go files, they are treated
-as a single package. Within a package, generate processes the
+one at a time. If the command line lists .go files from a single directory,
+they are treated as a single package. Within a package, generate processes the
 source files in a package in file name order, one at a time. Within
 a source file, generate runs generators in the order they appear
-in the file, one at a time.
+in the file, one at a time. The go generate tool also sets the build
+tag "generate" so that files may be examined by go generate but ignored
+during build.
 
 If any generator returns an error exit status, "go generate" skips
 all further processing for that package.
@@ -161,6 +163,9 @@ func runGenerate(cmd *base.Command, args []string) {
                        log.Fatalf("generate: %s", err)
                }
        }
+
+       cfg.BuildContext.BuildTags = append(cfg.BuildContext.BuildTags, "generate")
+
        // Even if the arguments are .go files, this loop suffices.
        printed := false
        for _, pkg := range load.Packages(args) {
@@ -374,7 +379,12 @@ Words:
        // Substitute command if required.
        if len(words) > 0 && g.commands[words[0]] != nil {
                // Replace 0th word by command substitution.
-               words = append(g.commands[words[0]], words[1:]...)
+               //
+               // Force a copy of the command definition to
+               // ensure words doesn't end up as a reference
+               // to the g.commands content.
+               tmpCmdWords := append([]string(nil), (g.commands[words[0]])...)
+               words = append(tmpCmdWords, words[1:]...)
        }
        // Substitute environment variables.
        for i, word := range words {
@@ -428,7 +438,7 @@ func (g *Generator) exec(words []string) {
        cmd.Stderr = os.Stderr
        // Run the command in the package directory.
        cmd.Dir = g.dir
-       cmd.Env = base.MergeEnvLists(g.env, cfg.OrigEnv)
+       cmd.Env = append(cfg.OrigEnv, g.env...)
        err := cmd.Run()
        if err != nil {
                g.errorf("running %q: %s", words[0], err)
index defc15387f39a30b6111e4482cb8ab1f746883bb..b546218a3c589f3c1da6566a38b7677a5407083d 100644 (file)
@@ -5,6 +5,7 @@
 package generate
 
 import (
+       "os"
        "reflect"
        "runtime"
        "testing"
@@ -15,6 +16,15 @@ type splitTest struct {
        out []string
 }
 
+// Same as above, except including source line number to set
+type splitTestWithLine struct {
+       in         string
+       out        []string
+       lineNumber int
+}
+
+const anyLineNo = 0
+
 var splitTests = []splitTest{
        {"", nil},
        {"x", []string{"x"}},
@@ -54,3 +64,191 @@ func TestGenerateCommandParse(t *testing.T) {
                }
        }
 }
+
+// These environment variables will be undefined before the splitTestWithLine tests
+var undefEnvList = []string{
+       "_XYZZY_",
+}
+
+// These environment variables will be defined before the splitTestWithLine tests
+var defEnvMap = map[string]string{
+       "_PLUGH_": "SomeVal",
+       "_X":      "Y",
+}
+
+// TestGenerateCommandShortHand - similar to TestGenerateCommandParse,
+// except:
+//    1. if the result starts with -command, record that shorthand
+//       before moving on to the next test.
+//    2. If a source line number is specified, set that in the parser
+//       before executing the test.  i.e., execute the split as if it
+//       processing that source line.
+func TestGenerateCommandShorthand(t *testing.T) {
+       g := &Generator{
+               r:        nil, // Unused here.
+               path:     "/usr/ken/sys/proc.go",
+               dir:      "/usr/ken/sys",
+               file:     "proc.go",
+               pkg:      "sys",
+               commands: make(map[string][]string),
+       }
+
+       var inLine string
+       var expected, got []string
+
+       g.setEnv()
+
+       // Set up the system environment variables
+       for i := range undefEnvList {
+               os.Unsetenv(undefEnvList[i])
+       }
+       for k := range defEnvMap {
+               os.Setenv(k, defEnvMap[k])
+       }
+
+       // simple command from environment variable
+       inLine = "//go:generate -command CMD0 \"ab${_X}cd\""
+       expected = []string{"-command", "CMD0", "abYcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       // try again, with an extra level of indirection (should leave variable in command)
+       inLine = "//go:generate -command CMD0 \"ab${DOLLAR}{_X}cd\""
+       expected = []string{"-command", "CMD0", "ab${_X}cd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       // Now the interesting part, record that output as a command
+       g.setShorthand(got)
+
+       // see that the command still substitutes correctly from env. variable
+       inLine = "//go:generate CMD0"
+       expected = []string{"abYcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       // Now change the value of $X and see if the recorded definition is
+       // still intact (vs. having the $_X already substituted out)
+
+       os.Setenv("_X", "Z")
+       inLine = "//go:generate CMD0"
+       expected = []string{"abZcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       // What if the variable is now undefined?  Should be empty substitution.
+
+       os.Unsetenv("_X")
+       inLine = "//go:generate CMD0"
+       expected = []string{"abcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       // Try another undefined variable as an extra check
+       os.Unsetenv("_Z")
+       inLine = "//go:generate -command CMD1 \"ab${_Z}cd\""
+       expected = []string{"-command", "CMD1", "abcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       g.setShorthand(got)
+
+       inLine = "//go:generate CMD1"
+       expected = []string{"abcd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       const val = "someNewValue"
+       os.Setenv("_Z", val)
+
+       // try again with the properly-escaped variable.
+
+       inLine = "//go:generate -command CMD2 \"ab${DOLLAR}{_Z}cd\""
+       expected = []string{"-command", "CMD2", "ab${_Z}cd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+
+       g.setShorthand(got)
+
+       inLine = "//go:generate CMD2"
+       expected = []string{"ab" + val + "cd"}
+       got = g.split(inLine + "\n")
+
+       if !reflect.DeepEqual(got, expected) {
+               t.Errorf("split(%q): got %q expected %q", inLine, got, expected)
+       }
+}
+
+// Command-related tests for TestGenerateCommandShortHand2
+// -- Note line numbers included to check substitutions from "build-in" variable - $GOLINE
+var splitTestsLines = []splitTestWithLine{
+       {"-command TEST1 $GOLINE", []string{"-command", "TEST1", "22"}, 22},
+       {"-command TEST2 ${DOLLAR}GOLINE", []string{"-command", "TEST2", "$GOLINE"}, 26},
+       {"TEST1", []string{"22"}, 33},
+       {"TEST2", []string{"66"}, 66},
+       {"TEST1 ''", []string{"22", "''"}, 99},
+       {"TEST2 ''", []string{"44", "''"}, 44},
+}
+
+// TestGenerateCommandShortHand - similar to TestGenerateCommandParse,
+// except:
+//    1. if the result starts with -command, record that shorthand
+//       before moving on to the next test.
+//    2. If a source line number is specified, set that in the parser
+//       before executing the test.  i.e., execute the split as if it
+//       processing that source line.
+func TestGenerateCommandShortHand2(t *testing.T) {
+       g := &Generator{
+               r:        nil, // Unused here.
+               path:     "/usr/ken/sys/proc.go",
+               dir:      "/usr/ken/sys",
+               file:     "proc.go",
+               pkg:      "sys",
+               commands: make(map[string][]string),
+       }
+       g.setEnv()
+       for _, test := range splitTestsLines {
+               // if the test specified a line number, reflect that
+               if test.lineNumber != anyLineNo {
+                       g.lineNum = test.lineNumber
+                       g.setEnv()
+               }
+               // First with newlines.
+               got := g.split("//go:generate " + test.in + "\n")
+               if !reflect.DeepEqual(got, test.out) {
+                       t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
+               }
+               // Then with CRLFs, thank you Windows.
+               got = g.split("//go:generate " + test.in + "\r\n")
+               if !reflect.DeepEqual(got, test.out) {
+                       t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
+               }
+               if got[0] == "-command" { // record commands
+                       g.setShorthand(got)
+               }
+       }
+}
index a314c57160b396203d8db3638c150d31ea908392..e4945fe14404b7c69c640d743659af07a9c7479d 100644 (file)
@@ -118,11 +118,6 @@ func runGet(cmd *base.Command, args []string) {
                // Should not happen: main.go should install the separate module-enabled get code.
                base.Fatalf("go get: modules not implemented")
        }
-       if cfg.GoModInGOPATH != "" {
-               // Warn about not using modules with GO111MODULE=auto when go.mod exists.
-               // To silence the warning, users can set GO111MODULE=off.
-               fmt.Fprintf(os.Stderr, "go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src;\n\tignoring %s;\n\tsee 'go help modules'\n", base.ShortPath(cfg.GoModInGOPATH))
-       }
 
        work.BuildInit()
 
@@ -177,12 +172,6 @@ func runGet(cmd *base.Command, args []string) {
        // everything.
        load.ClearPackageCache()
 
-       // In order to rebuild packages information completely,
-       // we need to clear commands cache. Command packages are
-       // referring to evicted packages from the package cache.
-       // This leads to duplicated loads of the standard packages.
-       load.ClearCmdCache()
-
        pkgs := load.PackagesForBuild(args)
 
        // Phase 3. Install.
@@ -240,7 +229,8 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int)
        }
        load1 := func(path string, mode int) *load.Package {
                if parent == nil {
-                       return load.LoadPackageNoFlags(path, stk)
+                       mode := 0 // don't do module or vendor resolution
+                       return load.LoadImport(path, base.Cwd, nil, stk, nil, mode)
                }
                return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule)
        }
@@ -397,7 +387,7 @@ func downloadPackage(p *load.Package) error {
                blindRepo      bool // set if the repo has unusual configuration
        )
 
-       security := web.Secure
+       security := web.SecureOnly
        if Insecure {
                security = web.Insecure
        }
index d443bd28a9656fb86f78e63921d0c6054c4b1f5a..67d7b8a47c2957e8745e38ed6e123f88a32e3584 100644 (file)
@@ -41,6 +41,9 @@ func checkPath(path string, fileName bool) error {
        if path == "" {
                return fmt.Errorf("empty string")
        }
+       if path[0] == '-' {
+               return fmt.Errorf("leading dash")
+       }
        if strings.Contains(path, "..") {
                return fmt.Errorf("double dot")
        }
index a7a2ba32cc33cbe0baebb7152cbe78a646abf8ae..fca78b515fd8ecb829f00b1edd818ca5e5fca7a7 100644 (file)
@@ -8,9 +8,10 @@ import (
        "encoding/json"
        "errors"
        "fmt"
+       "internal/lazyregexp"
        "internal/singleflight"
        "log"
-       "net/url"
+       urlpkg "net/url"
        "os"
        "os/exec"
        "path/filepath"
@@ -53,7 +54,7 @@ var defaultSecureScheme = map[string]bool{
 }
 
 func (v *vcsCmd) isSecure(repo string) bool {
-       u, err := url.Parse(repo)
+       u, err := urlpkg.Parse(repo)
        if err != nil {
                // If repo is not a URL, it's not secure.
                return false
@@ -111,7 +112,7 @@ var vcsHg = &vcsCmd{
        name: "Mercurial",
        cmd:  "hg",
 
-       createCmd:   []string{"clone -U {repo} {dir}"},
+       createCmd:   []string{"clone -U -- {repo} {dir}"},
        downloadCmd: []string{"pull"},
 
        // We allow both tag and branch names as 'tags'
@@ -127,7 +128,7 @@ var vcsHg = &vcsCmd{
        tagSyncDefault: []string{"update default"},
 
        scheme:     []string{"https", "http", "ssh"},
-       pingCmd:    "identify {scheme}://{repo}",
+       pingCmd:    "identify -- {scheme}://{repo}",
        remoteRepo: hgRemoteRepo,
 }
 
@@ -144,7 +145,7 @@ var vcsGit = &vcsCmd{
        name: "Git",
        cmd:  "git",
 
-       createCmd:   []string{"clone {repo} {dir}", "-go-internal-cd {dir} submodule update --init --recursive"},
+       createCmd:   []string{"clone -- {repo} {dir}", "-go-internal-cd {dir} submodule update --init --recursive"},
        downloadCmd: []string{"pull --ff-only", "submodule update --init --recursive"},
 
        tagCmd: []tagCmd{
@@ -164,13 +165,13 @@ var vcsGit = &vcsCmd{
        tagSyncDefault: []string{"submodule update --init --recursive"},
 
        scheme:     []string{"git", "https", "http", "git+ssh", "ssh"},
-       pingCmd:    "ls-remote {scheme}://{repo}",
+       pingCmd:    "ls-remote -- {scheme}://{repo}",
        remoteRepo: gitRemoteRepo,
 }
 
 // scpSyntaxRe matches the SCP-like addresses used by Git to access
 // repositories by SSH.
-var scpSyntaxRe = regexp.MustCompile(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`)
+var scpSyntaxRe = lazyregexp.New(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`)
 
 func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error) {
        cmd := "config remote.origin.url"
@@ -187,19 +188,19 @@ func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error
        }
        out := strings.TrimSpace(string(outb))
 
-       var repoURL *url.URL
+       var repoURL *urlpkg.URL
        if m := scpSyntaxRe.FindStringSubmatch(out); m != nil {
                // Match SCP-like syntax and convert it to a URL.
                // Eg, "git@github.com:user/repo" becomes
                // "ssh://git@github.com/user/repo".
-               repoURL = &url.URL{
+               repoURL = &urlpkg.URL{
                        Scheme: "ssh",
-                       User:   url.User(m[1]),
+                       User:   urlpkg.User(m[1]),
                        Host:   m[2],
                        Path:   m[3],
                }
        } else {
-               repoURL, err = url.Parse(out)
+               repoURL, err = urlpkg.Parse(out)
                if err != nil {
                        return "", err
                }
@@ -221,7 +222,7 @@ var vcsBzr = &vcsCmd{
        name: "Bazaar",
        cmd:  "bzr",
 
-       createCmd: []string{"branch {repo} {dir}"},
+       createCmd: []string{"branch -- {repo} {dir}"},
 
        // Without --overwrite bzr will not pull tags that changed.
        // Replace by --overwrite-tags after http://pad.lv/681792 goes in.
@@ -232,7 +233,7 @@ var vcsBzr = &vcsCmd{
        tagSyncDefault: []string{"update -r revno:-1"},
 
        scheme:      []string{"https", "http", "bzr", "bzr+ssh"},
-       pingCmd:     "info {scheme}://{repo}",
+       pingCmd:     "info -- {scheme}://{repo}",
        remoteRepo:  bzrRemoteRepo,
        resolveRepo: bzrResolveRepo,
 }
@@ -283,14 +284,14 @@ var vcsSvn = &vcsCmd{
        name: "Subversion",
        cmd:  "svn",
 
-       createCmd:   []string{"checkout {repo} {dir}"},
+       createCmd:   []string{"checkout -- {repo} {dir}"},
        downloadCmd: []string{"update"},
 
        // There is no tag command in subversion.
        // The branch information is all in the path names.
 
        scheme:     []string{"https", "http", "svn", "svn+ssh"},
-       pingCmd:    "info {scheme}://{repo}",
+       pingCmd:    "info -- {scheme}://{repo}",
        remoteRepo: svnRemoteRepo,
 }
 
@@ -333,7 +334,7 @@ var vcsFossil = &vcsCmd{
        name: "Fossil",
        cmd:  "fossil",
 
-       createCmd:   []string{"-go-internal-mkdir {dir} clone {repo} " + filepath.Join("{dir}", fossilRepoName), "-go-internal-cd {dir} open .fossil"},
+       createCmd:   []string{"-go-internal-mkdir {dir} clone -- {repo} " + filepath.Join("{dir}", fossilRepoName), "-go-internal-cd {dir} open .fossil"},
        downloadCmd: []string{"up"},
 
        tagCmd:         []tagCmd{{"tag ls", `(.*)`}},
@@ -424,8 +425,8 @@ func (v *vcsCmd) run1(dir string, cmdline string, keyval []string, verbose bool)
        cmd.Dir = dir
        cmd.Env = base.EnvForDir(cmd.Dir, os.Environ())
        if cfg.BuildX {
-               fmt.Printf("cd %s\n", dir)
-               fmt.Printf("%s %s\n", v.cmd, strings.Join(args, " "))
+               fmt.Fprintf(os.Stderr, "cd %s\n", dir)
+               fmt.Fprintf(os.Stderr, "%s %s\n", v.cmd, strings.Join(args, " "))
        }
        out, err := cmd.Output()
        if err != nil {
@@ -525,13 +526,11 @@ func (v *vcsCmd) tagSync(dir, tag string) error {
 // version control system and repository name.
 type vcsPath struct {
        prefix string                              // prefix this description applies to
-       re     string                              // pattern for import path
+       regexp *lazyregexp.Regexp                  // compiled pattern for import path
        repo   string                              // repository to use (expand with match of re)
        vcs    string                              // version control system to use (expand with match of re)
        check  func(match map[string]string) error // additional checks
        ping   bool                                // ping for scheme to use to download repo
-
-       regexp *regexp.Regexp // cached compiled form of re
 }
 
 // vcsFromDir inspects dir and its parents to determine the
@@ -632,7 +631,14 @@ type RepoRoot struct {
        vcs *vcsCmd // internal: vcs command access
 }
 
-var httpPrefixRE = regexp.MustCompile(`^https?:`)
+func httpPrefix(s string) string {
+       for _, prefix := range [...]string{"http:", "https:"} {
+               if strings.HasPrefix(s, prefix) {
+                       return prefix
+               }
+       }
+       return ""
+}
 
 // ModuleMode specifies whether to prefer modules when looking up code sources.
 type ModuleMode int
@@ -677,10 +683,10 @@ var errUnknownSite = errors.New("dynamic lookup required to find mapping")
 func repoRootFromVCSPaths(importPath, scheme string, security web.SecurityMode, vcsPaths []*vcsPath) (*RepoRoot, error) {
        // A common error is to use https://packagepath because that's what
        // hg and git require. Diagnose this helpfully.
-       if loc := httpPrefixRE.FindStringIndex(importPath); loc != nil {
+       if prefix := httpPrefix(importPath); prefix != "" {
                // The importPath has been cleaned, so has only one slash. The pattern
                // ignores the slashes; the error message puts them back on the RHS at least.
-               return nil, fmt.Errorf("%q not allowed in import path", importPath[loc[0]:loc[1]]+"//")
+               return nil, fmt.Errorf("%q not allowed in import path", prefix+"//")
        }
        for _, srv := range vcsPaths {
                if !strings.HasPrefix(importPath, srv.prefix) {
@@ -724,7 +730,7 @@ func repoRootFromVCSPaths(importPath, scheme string, security web.SecurityMode,
                                match["repo"] = scheme + "://" + match["repo"]
                        } else {
                                for _, scheme := range vcs.scheme {
-                                       if security == web.Secure && !vcs.isSecureScheme(scheme) {
+                                       if security == web.SecureOnly && !vcs.isSecureScheme(scheme) {
                                                continue
                                        }
                                        if vcs.pingCmd != "" && vcs.ping(scheme, match["repo"]) == nil {
@@ -748,20 +754,35 @@ func repoRootFromVCSPaths(importPath, scheme string, security web.SecurityMode,
        return nil, errUnknownSite
 }
 
-// repoRootForImportDynamic finds a *RepoRoot for a custom domain that's not
-// statically known by repoRootForImportPathStatic.
+// urlForImportPath returns a partially-populated URL for the given Go import path.
 //
-// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
-func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error) {
+// The URL leaves the Scheme field blank so that web.Get will try any scheme
+// allowed by the selected security mode.
+func urlForImportPath(importPath string) (*urlpkg.URL, error) {
        slash := strings.Index(importPath, "/")
        if slash < 0 {
                slash = len(importPath)
        }
-       host := importPath[:slash]
+       host, path := importPath[:slash], importPath[slash:]
        if !strings.Contains(host, ".") {
                return nil, errors.New("import path does not begin with hostname")
        }
-       urlStr, body, err := web.GetMaybeInsecure(importPath, security)
+       if len(path) == 0 {
+               path = "/"
+       }
+       return &urlpkg.URL{Host: host, Path: path, RawQuery: "go-get=1"}, nil
+}
+
+// repoRootForImportDynamic finds a *RepoRoot for a custom domain that's not
+// statically known by repoRootForImportPathStatic.
+//
+// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
+func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error) {
+       url, err := urlForImportPath(importPath)
+       if err != nil {
+               return nil, err
+       }
+       resp, err := web.Get(security, url)
        if err != nil {
                msg := "https fetch: %v"
                if security == web.Insecure {
@@ -769,6 +790,7 @@ func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.Se
                }
                return nil, fmt.Errorf(msg, err)
        }
+       body := resp.Body
        defer body.Close()
        imports, err := parseMetaGoImports(body, mod)
        if err != nil {
@@ -778,12 +800,12 @@ func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.Se
        mmi, err := matchGoImport(imports, importPath)
        if err != nil {
                if _, ok := err.(ImportMismatchError); !ok {
-                       return nil, fmt.Errorf("parse %s: %v", urlStr, err)
+                       return nil, fmt.Errorf("parse %s: %v", url, err)
                }
-               return nil, fmt.Errorf("parse %s: no go-import meta tags (%s)", urlStr, err)
+               return nil, fmt.Errorf("parse %s: no go-import meta tags (%s)", resp.URL, err)
        }
        if cfg.BuildV {
-               log.Printf("get %q: found meta tag %#v at %s", importPath, mmi, urlStr)
+               log.Printf("get %q: found meta tag %#v at %s", importPath, mmi, url)
        }
        // If the import was "uni.edu/bob/project", which said the
        // prefix was "uni.edu" and the RepoRoot was "evilroot.com",
@@ -795,24 +817,23 @@ func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.Se
                if cfg.BuildV {
                        log.Printf("get %q: verifying non-authoritative meta tag", importPath)
                }
-               urlStr0 := urlStr
                var imports []metaImport
-               urlStr, imports, err = metaImportsForPrefix(mmi.Prefix, mod, security)
+               url, imports, err = metaImportsForPrefix(mmi.Prefix, mod, security)
                if err != nil {
                        return nil, err
                }
                metaImport2, err := matchGoImport(imports, importPath)
                if err != nil || mmi != metaImport2 {
-                       return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, mmi.Prefix)
+                       return nil, fmt.Errorf("%s and %s disagree about go-import for %s", resp.URL, url, mmi.Prefix)
                }
        }
 
        if err := validateRepoRoot(mmi.RepoRoot); err != nil {
-               return nil, fmt.Errorf("%s: invalid repo root %q: %v", urlStr, mmi.RepoRoot, err)
+               return nil, fmt.Errorf("%s: invalid repo root %q: %v", resp.URL, mmi.RepoRoot, err)
        }
        vcs := vcsByCmd(mmi.VCS)
        if vcs == nil && mmi.VCS != "mod" {
-               return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, mmi.VCS)
+               return nil, fmt.Errorf("%s: unknown vcs %q", resp.URL, mmi.VCS)
        }
 
        rr := &RepoRoot{
@@ -828,13 +849,16 @@ func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.Se
 // validateRepoRoot returns an error if repoRoot does not seem to be
 // a valid URL with scheme.
 func validateRepoRoot(repoRoot string) error {
-       url, err := url.Parse(repoRoot)
+       url, err := urlpkg.Parse(repoRoot)
        if err != nil {
                return err
        }
        if url.Scheme == "" {
                return errors.New("no scheme")
        }
+       if url.Scheme == "file" {
+               return errors.New("file scheme disallowed")
+       }
        return nil
 }
 
@@ -850,9 +874,9 @@ var (
 //
 // The importPath is of the form "golang.org/x/tools".
 // It is an error if no imports are found.
-// urlStr will still be valid if err != nil.
-// The returned urlStr will be of the form "https://golang.org/x/tools?go-get=1"
-func metaImportsForPrefix(importPrefix string, mod ModuleMode, security web.SecurityMode) (urlStr string, imports []metaImport, err error) {
+// url will still be valid if err != nil.
+// The returned url will be of the form "https://golang.org/x/tools?go-get=1"
+func metaImportsForPrefix(importPrefix string, mod ModuleMode, security web.SecurityMode) (*urlpkg.URL, []metaImport, error) {
        setCache := func(res fetchResult) (fetchResult, error) {
                fetchCacheMu.Lock()
                defer fetchCacheMu.Unlock()
@@ -868,25 +892,31 @@ func metaImportsForPrefix(importPrefix string, mod ModuleMode, security web.Secu
                }
                fetchCacheMu.Unlock()
 
-               urlStr, body, err := web.GetMaybeInsecure(importPrefix, security)
+               url, err := urlForImportPath(importPrefix)
+               if err != nil {
+                       return setCache(fetchResult{err: err})
+               }
+               resp, err := web.Get(security, url)
                if err != nil {
-                       return setCache(fetchResult{urlStr: urlStr, err: fmt.Errorf("fetch %s: %v", urlStr, err)})
+                       return setCache(fetchResult{url: url, err: fmt.Errorf("fetch %s: %v", resp.URL, err)})
                }
+               body := resp.Body
+               defer body.Close()
                imports, err := parseMetaGoImports(body, mod)
                if err != nil {
-                       return setCache(fetchResult{urlStr: urlStr, err: fmt.Errorf("parsing %s: %v", urlStr, err)})
+                       return setCache(fetchResult{url: url, err: fmt.Errorf("parsing %s: %v", resp.URL, err)})
                }
                if len(imports) == 0 {
-                       err = fmt.Errorf("fetch %s: no go-import meta tag", urlStr)
+                       err = fmt.Errorf("fetch %s: no go-import meta tag", url)
                }
-               return setCache(fetchResult{urlStr: urlStr, imports: imports, err: err})
+               return setCache(fetchResult{url: url, imports: imports, err: err})
        })
        res := resi.(fetchResult)
-       return res.urlStr, res.imports, res.err
+       return res.url, res.imports, res.err
 }
 
 type fetchResult struct {
-       urlStr  string // e.g. "https://foo.com/x/bar?go-get=1"
+       url     *urlpkg.URL
        imports []metaImport
        err     error
 }
@@ -975,7 +1005,7 @@ var vcsPaths = []*vcsPath{
        // Github
        {
                prefix: "github.com/",
-               re:     `^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`),
                vcs:    "git",
                repo:   "https://{root}",
                check:  noVCSSuffix,
@@ -984,7 +1014,7 @@ var vcsPaths = []*vcsPath{
        // Bitbucket
        {
                prefix: "bitbucket.org/",
-               re:     `^(?P<root>bitbucket\.org/(?P<bitname>[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>bitbucket\.org/(?P<bitname>[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`),
                repo:   "https://{root}",
                check:  bitbucketVCS,
        },
@@ -992,7 +1022,7 @@ var vcsPaths = []*vcsPath{
        // IBM DevOps Services (JazzHub)
        {
                prefix: "hub.jazz.net/git/",
-               re:     `^(?P<root>hub\.jazz\.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>hub\.jazz\.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`),
                vcs:    "git",
                repo:   "https://{root}",
                check:  noVCSSuffix,
@@ -1001,7 +1031,7 @@ var vcsPaths = []*vcsPath{
        // Git at Apache
        {
                prefix: "git.apache.org/",
-               re:     `^(?P<root>git\.apache\.org/[a-z0-9_.\-]+\.git)(/[A-Za-z0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>git\.apache\.org/[a-z0-9_.\-]+\.git)(/[A-Za-z0-9_.\-]+)*$`),
                vcs:    "git",
                repo:   "https://{root}",
        },
@@ -1009,7 +1039,7 @@ var vcsPaths = []*vcsPath{
        // Git at OpenStack
        {
                prefix: "git.openstack.org/",
-               re:     `^(?P<root>git\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>git\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`),
                vcs:    "git",
                repo:   "https://{root}",
        },
@@ -1017,7 +1047,7 @@ var vcsPaths = []*vcsPath{
        // chiselapp.com for fossil
        {
                prefix: "chiselapp.com/",
-               re:     `^(?P<root>chiselapp\.com/user/[A-Za-z0-9]+/repository/[A-Za-z0-9_.\-]+)$`,
+               regexp: lazyregexp.New(`^(?P<root>chiselapp\.com/user/[A-Za-z0-9]+/repository/[A-Za-z0-9_.\-]+)$`),
                vcs:    "fossil",
                repo:   "https://{root}",
        },
@@ -1025,8 +1055,8 @@ var vcsPaths = []*vcsPath{
        // General syntax for any server.
        // Must be last.
        {
-               re:   `^(?P<root>(?P<repo>([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\-]+)+?)\.(?P<vcs>bzr|fossil|git|hg|svn))(/~?[A-Za-z0-9_.\-]+)*$`,
-               ping: true,
+               regexp: lazyregexp.New(`(?P<root>(?P<repo>([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\-]+)+?)\.(?P<vcs>bzr|fossil|git|hg|svn))(/~?[A-Za-z0-9_.\-]+)*$`),
+               ping:   true,
        },
 }
 
@@ -1038,25 +1068,13 @@ var vcsPathsAfterDynamic = []*vcsPath{
        // Launchpad. See golang.org/issue/11436.
        {
                prefix: "launchpad.net/",
-               re:     `^(?P<root>launchpad\.net/((?P<project>[A-Za-z0-9_.\-]+)(?P<series>/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
+               regexp: lazyregexp.New(`^(?P<root>launchpad\.net/((?P<project>[A-Za-z0-9_.\-]+)(?P<series>/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`),
                vcs:    "bzr",
                repo:   "https://{root}",
                check:  launchpadVCS,
        },
 }
 
-func init() {
-       // fill in cached regexps.
-       // Doing this eagerly discovers invalid regexp syntax
-       // without having to run a command that needs that regexp.
-       for _, srv := range vcsPaths {
-               srv.regexp = regexp.MustCompile(srv.re)
-       }
-       for _, srv := range vcsPathsAfterDynamic {
-               srv.regexp = regexp.MustCompile(srv.re)
-       }
-}
-
 // noVCSSuffix checks that the repository name does not
 // end in .foo for any version control system foo.
 // The usual culprit is ".git".
@@ -1080,8 +1098,13 @@ func bitbucketVCS(match map[string]string) error {
        var resp struct {
                SCM string `json:"scm"`
        }
-       url := expand(match, "https://api.bitbucket.org/2.0/repositories/{bitname}?fields=scm")
-       data, err := web.Get(url)
+       url := &urlpkg.URL{
+               Scheme:   "https",
+               Host:     "api.bitbucket.org",
+               Path:     expand(match, "/2.0/repositories/{bitname}"),
+               RawQuery: "fields=scm",
+       }
+       data, err := web.GetBytes(url)
        if err != nil {
                if httpErr, ok := err.(*web.HTTPError); ok && httpErr.StatusCode == 403 {
                        // this may be a private repository. If so, attempt to determine which
@@ -1123,7 +1146,12 @@ func launchpadVCS(match map[string]string) error {
        if match["project"] == "" || match["series"] == "" {
                return nil
        }
-       _, err := web.Get(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format"))
+       url := &urlpkg.URL{
+               Scheme: "https",
+               Host:   "code.launchpad.net",
+               Path:   expand(match, "/{project}{series}/.bzr/branch-format"),
+       }
+       _, err := web.GetBytes(url)
        if err != nil {
                match["root"] = expand(match, "launchpad.net/{project}")
                match["repo"] = expand(match, "https://{root}")
index d13721bed1a489b3ab974c364b4cef6d6e79a0f9..91800baa83d216ce8ef82bc0228615aaa62b104b 100644 (file)
@@ -181,7 +181,7 @@ func TestRepoRootForImportPath(t *testing.T) {
        }
 
        for _, test := range tests {
-               got, err := RepoRootForImportPath(test.path, IgnoreMod, web.Secure)
+               got, err := RepoRootForImportPath(test.path, IgnoreMod, web.SecureOnly)
                want := test.want
 
                if want == nil {
index 121deb70a58904a72226b4c4bafdd225d5fba266..d373771ab5a74789e3691dc36fd6f38f02aefac1 100644 (file)
@@ -17,6 +17,7 @@ import (
        "unicode/utf8"
 
        "cmd/go/internal/base"
+       "cmd/go/internal/modload"
 )
 
 // Help implements the 'help' command.
@@ -35,8 +36,10 @@ func Help(w io.Writer, args []string) {
                usage := &base.Command{Long: buf.String()}
                cmds := []*base.Command{usage}
                for _, cmd := range base.Go.Commands {
-                       if cmd.UsageLine == "gopath-get" {
-                               // Avoid duplication of the "get" documentation.
+                       // Avoid duplication of the "get" documentation.
+                       if cmd.UsageLine == "module-get" && modload.Enabled() {
+                               continue
+                       } else if cmd.UsageLine == "gopath-get" && !modload.Enabled() {
                                continue
                        }
                        cmds = append(cmds, cmd)
index c219a45d74948004b1c9f1febc591ce13cb0d1b4..c2b5fb4b83071048221136d6cf3d581b37e8c288 100644 (file)
@@ -469,10 +469,17 @@ var HelpEnvironment = &base.Command{
        Short:     "environment variables",
        Long: `
 
-The go command, and the tools it invokes, examine a few different
-environment variables. For many of these, you can see the default
-value of on your system by running 'go env NAME', where NAME is the
-name of the variable.
+The go command and the tools it invokes consult environment variables
+for configuration. If an environment variable is unset, the go command
+uses a sensible default setting. To see the effective setting of the
+variable <NAME>, run 'go env <NAME>'. To change the default setting,
+run 'go env -w <NAME>=<VALUE>'. Defaults changed using 'go env -w'
+are recorded in a Go environment configuration file stored in the
+per-user configuration directory, as reported by os.UserConfigDir.
+The location of the configuration file can be changed by setting
+the environment variable GOENV, and 'go env GOENV' prints the
+effective location, but 'go env -w' cannot change the default location.
+See 'go help env' for details.
 
 General-purpose environment variables:
 
@@ -486,10 +493,15 @@ General-purpose environment variables:
        GOCACHE
                The directory where the go command will store cached
                information for reuse in future builds.
+       GOENV
+               The location of the Go environment configuration file.
+               Cannot be set using 'go env -w'.
        GOFLAGS
                A space-separated list of -flag=value settings to apply
                to go commands by default, when the given flag is known by
-               the current command. Flags listed on the command-line
+               the current command. Each entry must be a standalone flag.
+               Because the entries are space-separated, flag values must
+               not contain spaces. Flags listed on the command line
                are applied after this list and therefore override it.
        GOOS
                The operating system for which to compile code.
@@ -497,22 +509,27 @@ General-purpose environment variables:
        GOPATH
                For more details see: 'go help gopath'.
        GOPROXY
-               URL of Go module proxy. See 'go help goproxy'.
-       GORACE
-               Options for the race detector.
-               See https://golang.org/doc/articles/race_detector.html.
+               URL of Go module proxy. See 'go help modules'.
+       GOPRIVATE, GONOPROXY, GONOSUMDB
+               Comma-separated list of glob patterns (in the syntax of Go's path.Match)
+               of module path prefixes that should always be fetched directly
+               or that should not be compared against the checksum database.
+               See 'go help module-private'.
        GOROOT
                The root of the go tree.
+       GOSUMDB
+               The name of checksum database to use and optionally its public key and
+               URL. See 'go help module-auth'.
        GOTMPDIR
                The directory where the go command will write
                temporary source files, packages, and binaries.
 
-Each entry in the GOFLAGS list must be a standalone flag.
-Because the entries are space-separated, flag values must
-not contain spaces.
-
 Environment variables for use with cgo:
 
+       AR
+               The command to use to manipulate library archives when
+               building with the gccgo compiler.
+               The default is 'ar'.
        CC
                The command to use to compile C code.
        CGO_ENABLED
@@ -542,12 +559,10 @@ Environment variables for use with cgo:
                but for the linker.
        CXX
                The command to use to compile C++ code.
+       FC
+               The command to use to compile Fortran code.
        PKG_CONFIG
                Path to pkg-config tool.
-       AR
-               The command to use to manipulate library archives when
-               building with the gccgo compiler.
-               The default is 'ar'.
 
 Architecture-specific environment variables:
 
@@ -563,6 +578,9 @@ Architecture-specific environment variables:
        GOMIPS64
                For GOARCH=mips64{,le}, whether to use floating point instructions.
                Valid values are hardfloat (default), softfloat.
+       GOWASM
+               For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use.
+               Valid values are satconv, signext.
 
 Special-purpose environment variables:
 
@@ -579,14 +597,18 @@ Special-purpose environment variables:
                when using -linkmode=auto with code that uses cgo.
                Set to 0 to disable external linking mode, 1 to enable it.
        GIT_ALLOW_PROTOCOL
-               Defined by Git. A colon-separated list of schemes that are allowed to be used
-               with git fetch/clone. If set, any scheme not explicitly mentioned will be
-               considered insecure by 'go get'.
+               Defined by Git. A colon-separated list of schemes that are allowed
+               to be used with git fetch/clone. If set, any scheme not explicitly
+               mentioned will be considered insecure by 'go get'.
+               Because the variable is defined by Git, the default value cannot
+               be set using 'go env -w'.
 
 Additional information available from 'go env' but not read from the environment:
 
        GOEXE
                The executable file name suffix (".exe" on Windows, "" on other systems).
+       GOGCCFLAGS
+               A space-separated list of arguments supplied to the CC command.
        GOHOSTARCH
                The architecture (GOARCH) of the Go toolchain binaries.
        GOHOSTOS
@@ -635,15 +657,6 @@ constraints, but the go command stops scanning for build constraints
 at the first item in the file that is not a blank line or //-style
 line comment. See the go/build package documentation for
 more details.
-
-Through the Go 1.12 release, non-test Go source files can also include
-a //go:binary-only-package comment, indicating that the package
-sources are included for documentation only and must not be used to
-build the package binary. This enables distribution of Go packages in
-their compiled form alone. Even binary-only packages require accurate
-import blocks listing required dependencies, so that those
-dependencies can be supplied when linking the resulting command.
-Note that this feature is scheduled to be removed after the Go 1.12 release.
        `,
 }
 
@@ -693,6 +706,9 @@ are:
        -buildmode=plugin
                Build the listed main packages, plus all packages that they
                import, into a Go plugin. Packages not named main are ignored.
+
+On AIX, when linking a C program that uses a Go archive built with
+-buildmode=c-archive, you must pass -Wl,-bnoobjreorder to the C compiler.
 `,
 }
 
index ddf425b0204dcf6885ef7bd33a91d49f536040b4..3e9fe357e0792b7dc03ded1a6d93265d80b4c5cb 100644 (file)
@@ -138,6 +138,9 @@ func matchTag(name string, tags map[string]bool, want bool) bool {
        if name == "linux" {
                have = have || tags["android"]
        }
+       if name == "solaris" {
+               have = have || tags["illumos"]
+       }
        return have == want
 }
 
@@ -152,7 +155,9 @@ func matchTag(name string, tags map[string]bool, want bool) bool {
 //     name_$(GOARCH)_test.*
 //     name_$(GOOS)_$(GOARCH)_test.*
 //
-// An exception: if GOOS=android, then files with GOOS=linux are also matched.
+// Exceptions:
+//     if GOOS=android, then files with GOOS=linux are also matched.
+//     if GOOS=illumos, then files with GOOS=solaris are also matched.
 //
 // If tags["*"] is true, then MatchFile will consider all possible
 // GOOS and GOARCH to be available and will consequently
@@ -184,28 +189,58 @@ func MatchFile(name string, tags map[string]bool) bool {
        }
        n := len(l)
        if n >= 2 && KnownOS[l[n-2]] && KnownArch[l[n-1]] {
-               return tags[l[n-2]] && tags[l[n-1]]
+               return matchTag(l[n-2], tags, true) && matchTag(l[n-1], tags, true)
        }
        if n >= 1 && KnownOS[l[n-1]] {
-               return tags[l[n-1]]
+               return matchTag(l[n-1], tags, true)
        }
        if n >= 1 && KnownArch[l[n-1]] {
-               return tags[l[n-1]]
+               return matchTag(l[n-1], tags, true)
        }
        return true
 }
 
-var KnownOS = make(map[string]bool)
-var KnownArch = make(map[string]bool)
-
-func init() {
-       for _, v := range strings.Fields(goosList) {
-               KnownOS[v] = true
-       }
-       for _, v := range strings.Fields(goarchList) {
-               KnownArch[v] = true
-       }
+var KnownOS = map[string]bool{
+       "aix":       true,
+       "android":   true,
+       "darwin":    true,
+       "dragonfly": true,
+       "freebsd":   true,
+       "hurd":      true,
+       "illumos":   true,
+       "js":        true,
+       "linux":     true,
+       "nacl":      true,
+       "netbsd":    true,
+       "openbsd":   true,
+       "plan9":     true,
+       "solaris":   true,
+       "windows":   true,
+       "zos":       true,
 }
 
-const goosList = "aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9 solaris windows zos "
-const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm "
+var KnownArch = map[string]bool{
+       "386":         true,
+       "amd64":       true,
+       "amd64p32":    true,
+       "arm":         true,
+       "armbe":       true,
+       "arm64":       true,
+       "arm64be":     true,
+       "ppc64":       true,
+       "ppc64le":     true,
+       "mips":        true,
+       "mipsle":      true,
+       "mips64":      true,
+       "mips64le":    true,
+       "mips64p32":   true,
+       "mips64p32le": true,
+       "ppc":         true,
+       "riscv":       true,
+       "riscv64":     true,
+       "s390":        true,
+       "s390x":       true,
+       "sparc":       true,
+       "sparc64":     true,
+       "wasm":        true,
+}
index 966a38cfef3adf2ad353ba0c6eab85b9493f46a2..3d9b6132b121b3d8cbab28f8c46547c1692d600e 100644 (file)
@@ -26,7 +26,7 @@ func ScanDir(dir string, tags map[string]bool) ([]string, []string, error) {
                // If the directory entry is a symlink, stat it to obtain the info for the
                // link target instead of the link itself.
                if info.Mode()&os.ModeSymlink != 0 {
-                       info, err = os.Stat(name)
+                       info, err = os.Stat(filepath.Join(dir, name))
                        if err != nil {
                                continue // Ignore broken symlinks.
                        }
index 6a2ff62ba758936089e2e1cf7fe6e9756a2a49b9..e424656cae2ebd4a0262b7c75166bd95cfcb0221 100644 (file)
@@ -5,10 +5,13 @@
 package imports
 
 import (
+       "bytes"
        "internal/testenv"
+       "io/ioutil"
+       "path"
        "path/filepath"
-       "reflect"
        "runtime"
+       "strings"
        "testing"
 )
 
@@ -51,17 +54,41 @@ func TestScan(t *testing.T) {
                t.Errorf("json missing test import net/http (%q)", testImports)
        }
 }
-
-func TestScanStar(t *testing.T) {
+func TestScanDir(t *testing.T) {
        testenv.MustHaveGoBuild(t)
 
-       imports, _, err := ScanDir("testdata/import1", map[string]bool{"*": true})
+       dirs, err := ioutil.ReadDir("testdata")
        if err != nil {
                t.Fatal(err)
        }
+       for _, dir := range dirs {
+               if !dir.IsDir() || strings.HasPrefix(dir.Name(), ".") {
+                       continue
+               }
+               t.Run(dir.Name(), func(t *testing.T) {
+                       tagsData, err := ioutil.ReadFile(filepath.Join("testdata", dir.Name(), "tags.txt"))
+                       if err != nil {
+                               t.Fatalf("error reading tags: %v", err)
+                       }
+                       tags := make(map[string]bool)
+                       for _, t := range strings.Fields(string(tagsData)) {
+                               tags[t] = true
+                       }
+
+                       wantData, err := ioutil.ReadFile(filepath.Join("testdata", dir.Name(), "want.txt"))
+                       if err != nil {
+                               t.Fatalf("error reading want: %v", err)
+                       }
+                       want := string(bytes.TrimSpace(wantData))
 
-       want := []string{"import1", "import2", "import3", "import4"}
-       if !reflect.DeepEqual(imports, want) {
-               t.Errorf("ScanDir testdata/import1:\nhave %v\nwant %v", imports, want)
+                       imports, _, err := ScanDir(path.Join("testdata", dir.Name()), tags)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       got := strings.Join(imports, "\n")
+                       if got != want {
+                               t.Errorf("ScanDir: got imports:\n%s\n\nwant:\n%s", got, want)
+                       }
+               })
        }
 }
index 1c22a472b80d3ff5f5a855fb64b19947d7750be0..14b4e21a0244feb6c598c18ddb8f0c7de78125b9 100644 (file)
@@ -8,6 +8,9 @@ import "cmd/go/internal/cfg"
 
 var tags map[string]bool
 
+// Tags returns a set of build tags that are true for the target platform.
+// It includes GOOS, GOARCH, the compiler, possibly "cgo",
+// release tags like "go1.13", and user-specified build tags.
 func Tags() map[string]bool {
        if tags == nil {
                tags = loadTags()
@@ -32,3 +35,15 @@ func loadTags() map[string]bool {
        }
        return tags
 }
+
+var anyTags map[string]bool
+
+// AnyTags returns a special set of build tags that satisfy nearly all
+// build tag expressions. Only "ignore" and malformed build tag requirements
+// are considered false.
+func AnyTags() map[string]bool {
+       if anyTags == nil {
+               anyTags = map[string]bool{"*": true}
+       }
+       return anyTags
+}
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/a_android.go b/libgo/go/cmd/go/internal/imports/testdata/android/a_android.go
new file mode 100644 (file)
index 0000000..2ed972e
--- /dev/null
@@ -0,0 +1,3 @@
+package android
+
+import _ "a"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/b_android_arm64.go b/libgo/go/cmd/go/internal/imports/testdata/android/b_android_arm64.go
new file mode 100644 (file)
index 0000000..ee9c312
--- /dev/null
@@ -0,0 +1,3 @@
+package android
+
+import _ "b"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/c_linux.go b/libgo/go/cmd/go/internal/imports/testdata/android/c_linux.go
new file mode 100644 (file)
index 0000000..91624ce
--- /dev/null
@@ -0,0 +1,3 @@
+package android
+
+import _ "c"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/d_linux_arm64.go b/libgo/go/cmd/go/internal/imports/testdata/android/d_linux_arm64.go
new file mode 100644 (file)
index 0000000..34e07df
--- /dev/null
@@ -0,0 +1,3 @@
+package android
+
+import _ "d"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/e.go b/libgo/go/cmd/go/internal/imports/testdata/android/e.go
new file mode 100644 (file)
index 0000000..d9b2db7
--- /dev/null
@@ -0,0 +1,5 @@
+// +build android
+
+package android
+
+import _ "e"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/f.go b/libgo/go/cmd/go/internal/imports/testdata/android/f.go
new file mode 100644 (file)
index 0000000..281e4dd
--- /dev/null
@@ -0,0 +1,5 @@
+// +build linux
+
+package android
+
+import _ "f"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/android/g.go b/libgo/go/cmd/go/internal/imports/testdata/android/g.go
new file mode 100644 (file)
index 0000000..66a789c
--- /dev/null
@@ -0,0 +1,5 @@
+// +build !android
+
+package android
+
+import _ "g"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/a_illumos.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/a_illumos.go
new file mode 100644 (file)
index 0000000..2e6cb50
--- /dev/null
@@ -0,0 +1,3 @@
+package illumos
+
+import _ "a"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/b_illumos_amd64.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/b_illumos_amd64.go
new file mode 100644 (file)
index 0000000..2834d80
--- /dev/null
@@ -0,0 +1,3 @@
+package illumos
+
+import _ "b"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/c_solaris.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/c_solaris.go
new file mode 100644 (file)
index 0000000..d7f9462
--- /dev/null
@@ -0,0 +1,3 @@
+package illumos
+
+import _ "c"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/d_solaris_amd64.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/d_solaris_amd64.go
new file mode 100644 (file)
index 0000000..0f52c2b
--- /dev/null
@@ -0,0 +1,3 @@
+package illumos
+
+import _ "d"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/e.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/e.go
new file mode 100644 (file)
index 0000000..5e1ed3c
--- /dev/null
@@ -0,0 +1,5 @@
+// +build illumos
+
+package illumos
+
+import _ "e"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/f.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/f.go
new file mode 100644 (file)
index 0000000..f3e3f72
--- /dev/null
@@ -0,0 +1,5 @@
+// +build solaris
+
+package illumos
+
+import _ "f"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/illumos/g.go b/libgo/go/cmd/go/internal/imports/testdata/illumos/g.go
new file mode 100644 (file)
index 0000000..b30f1eb
--- /dev/null
@@ -0,0 +1,5 @@
+// +build !illumos
+
+package illumos
+
+import _ "g"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/import1/x.go b/libgo/go/cmd/go/internal/imports/testdata/import1/x.go
deleted file mode 100644 (file)
index 98f9191..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-package x
-
-import "import1"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/import1/x1.go b/libgo/go/cmd/go/internal/imports/testdata/import1/x1.go
deleted file mode 100644 (file)
index 6a9594a..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build blahblh
-// +build linux
-// +build !linux
-// +build windows
-// +build darwin
-
-package x
-
-import "import4"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/import1/x_darwin.go b/libgo/go/cmd/go/internal/imports/testdata/import1/x_darwin.go
deleted file mode 100644 (file)
index a0c3fdd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-package xxxx
-
-import "import3"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/import1/x_windows.go b/libgo/go/cmd/go/internal/imports/testdata/import1/x_windows.go
deleted file mode 100644 (file)
index 63c5082..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-package x
-
-import "import2"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/star/x.go b/libgo/go/cmd/go/internal/imports/testdata/star/x.go
new file mode 100644 (file)
index 0000000..98f9191
--- /dev/null
@@ -0,0 +1,3 @@
+package x
+
+import "import1"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/star/x1.go b/libgo/go/cmd/go/internal/imports/testdata/star/x1.go
new file mode 100644 (file)
index 0000000..6a9594a
--- /dev/null
@@ -0,0 +1,9 @@
+// +build blahblh
+// +build linux
+// +build !linux
+// +build windows
+// +build darwin
+
+package x
+
+import "import4"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/star/x_darwin.go b/libgo/go/cmd/go/internal/imports/testdata/star/x_darwin.go
new file mode 100644 (file)
index 0000000..a0c3fdd
--- /dev/null
@@ -0,0 +1,3 @@
+package xxxx
+
+import "import3"
diff --git a/libgo/go/cmd/go/internal/imports/testdata/star/x_windows.go b/libgo/go/cmd/go/internal/imports/testdata/star/x_windows.go
new file mode 100644 (file)
index 0000000..63c5082
--- /dev/null
@@ -0,0 +1,3 @@
+package x
+
+import "import2"
index b3ba4edc65001c852582e788ea1f6673ca7ab6f4..e7e78e7c597a097e48f21b16d9f4a925345b1590 100644 (file)
@@ -60,7 +60,7 @@ to -f '{{.ImportPath}}'. The struct being passed to the template is:
         StaleReason   string   // explanation for Stale==true
         Root          string   // Go root or Go path dir containing this package
         ConflictDir   string   // this directory shadows Dir in $GOPATH
-        BinaryOnly    bool     // binary-only package: cannot be recompiled from sources
+        BinaryOnly    bool     // binary-only package (no longer supported)
         ForTest       string   // package is only for use in named test
         Export        string   // file containing export data (when using -export)
         Module        *Module  // info about package's containing module, if any (can be nil)
@@ -202,17 +202,18 @@ When listing modules, the -f flag still specifies a format template
 applied to a Go struct, but now a Module struct:
 
     type Module struct {
-        Path     string       // module path
-        Version  string       // module version
-        Versions []string     // available module versions (with -versions)
-        Replace  *Module      // replaced by this module
-        Time     *time.Time   // time version was created
-        Update   *Module      // available update, if any (with -u)
-        Main     bool         // is this the main module?
-        Indirect bool         // is this module only an indirect dependency of main module?
-        Dir      string       // directory holding files for this module, if any
-        GoMod    string       // path to go.mod file for this module, if any
-        Error    *ModuleError // error loading module
+        Path      string       // module path
+        Version   string       // module version
+        Versions  []string     // available module versions (with -versions)
+        Replace   *Module      // replaced by this module
+        Time      *time.Time   // time version was created
+        Update    *Module      // available update, if any (with -u)
+        Main      bool         // is this the main module?
+        Indirect  bool         // is this module only an indirect dependency of main module?
+        Dir       string       // directory holding files for this module, if any
+        GoMod     string       // path to go.mod file for this module, if any
+        GoVersion string       // go version used in module
+        Error     *ModuleError // error loading module
     }
 
     type ModuleError struct {
@@ -446,37 +447,34 @@ func runList(cmd *base.Command, args []string) {
                                continue
                        }
                        if len(p.TestGoFiles)+len(p.XTestGoFiles) > 0 {
-                               pmain, ptest, pxtest, err := load.GetTestPackagesFor(p, nil)
-                               if err != nil {
-                                       if *listE {
-                                               pkgs = append(pkgs, &load.Package{
-                                                       PackagePublic: load.PackagePublic{
-                                                               ImportPath: p.ImportPath + ".test",
-                                                               Error:      &load.PackageError{Err: err.Error()},
-                                                       },
-                                               })
-                                               continue
+                               var pmain, ptest, pxtest *load.Package
+                               var err error
+                               if *listE {
+                                       pmain, ptest, pxtest = load.TestPackagesAndErrors(p, nil)
+                               } else {
+                                       pmain, ptest, pxtest, err = load.TestPackagesFor(p, nil)
+                                       if err != nil {
+                                               base.Errorf("can't load test package: %s", err)
                                        }
-                                       base.Errorf("can't load test package: %s", err)
-                                       continue
                                }
-                               pkgs = append(pkgs, pmain)
-                               if ptest != nil {
+                               if pmain != nil {
+                                       pkgs = append(pkgs, pmain)
+                                       data := pmain.Internal.TestmainGo
+                                       h := cache.NewHash("testmain")
+                                       h.Write([]byte("testmain\n"))
+                                       h.Write(data)
+                                       out, _, err := c.Put(h.Sum(), bytes.NewReader(data))
+                                       if err != nil {
+                                               base.Fatalf("%s", err)
+                                       }
+                                       pmain.GoFiles[0] = c.OutputFile(out)
+                               }
+                               if ptest != nil && ptest != p {
                                        pkgs = append(pkgs, ptest)
                                }
                                if pxtest != nil {
                                        pkgs = append(pkgs, pxtest)
                                }
-
-                               data := *pmain.Internal.TestmainGo
-                               h := cache.NewHash("testmain")
-                               h.Write([]byte("testmain\n"))
-                               h.Write(data)
-                               out, _, err := c.Put(h.Sum(), bytes.NewReader(data))
-                               if err != nil {
-                                       base.Fatalf("%s", err)
-                               }
-                               pmain.GoFiles[0] = c.OutputFile(out)
                        }
                }
        }
index 0211b284a407a2b612299570f1db7380aa05cb31..584cdff89163253c02dbc76ee34b72587e0f798f 100644 (file)
@@ -6,32 +6,8 @@ package load
 
 import (
        "path/filepath"
-       "strings"
 )
 
-// hasSubdir reports whether dir is a subdirectory of
-// (possibly multiple levels below) root.
-// If so, it sets rel to the path fragment that must be
-// appended to root to reach dir.
-func hasSubdir(root, dir string) (rel string, ok bool) {
-       if p, err := filepath.EvalSymlinks(root); err == nil {
-               root = p
-       }
-       if p, err := filepath.EvalSymlinks(dir); err == nil {
-               dir = p
-       }
-       const sep = string(filepath.Separator)
-       root = filepath.Clean(root)
-       if !strings.HasSuffix(root, sep) {
-               root += sep
-       }
-       dir = filepath.Clean(dir)
-       if !strings.HasPrefix(dir, root) {
-               return "", false
-       }
-       return filepath.ToSlash(dir[len(root):]), true
-}
-
 // expandPath returns the symlink-expanded form of path.
 func expandPath(p string) string {
        x, err := filepath.EvalSymlinks(p)
index 5e511dbdbd3623392a81ea87d0e7ca6dae3d278c..958356070c514331c43ea99e75429056326fe698 100644 (file)
@@ -7,6 +7,7 @@ package load
 
 import (
        "bytes"
+       "errors"
        "fmt"
        "go/build"
        "go/token"
@@ -14,6 +15,7 @@ import (
        "os"
        pathpkg "path"
        "path/filepath"
+       "runtime"
        "sort"
        "strconv"
        "strings"
@@ -23,6 +25,7 @@ import (
        "cmd/go/internal/base"
        "cmd/go/internal/cfg"
        "cmd/go/internal/modinfo"
+       "cmd/go/internal/par"
        "cmd/go/internal/search"
        "cmd/go/internal/str"
 )
@@ -32,14 +35,14 @@ var (
        ModInit func()
 
        // module hooks; nil if module use is disabled
-       ModBinDir            func() string                                       // return effective bin directory
-       ModLookup            func(path string) (dir, realPath string, err error) // lookup effective meaning of import
-       ModPackageModuleInfo func(path string) *modinfo.ModulePublic             // return module info for Package struct
-       ModImportPaths       func(args []string) []*search.Match                 // expand import paths
-       ModPackageBuildInfo  func(main string, deps []string) string             // return module info to embed in binary
-       ModInfoProg          func(info string) []byte                            // wrap module info in .go code for binary
-       ModImportFromFiles   func([]string)                                      // update go.mod to add modules for imports in these files
-       ModDirImportPath     func(string) string                                 // return effective import path for directory
+       ModBinDir            func() string                                                                            // return effective bin directory
+       ModLookup            func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import
+       ModPackageModuleInfo func(path string) *modinfo.ModulePublic                                                  // return module info for Package struct
+       ModImportPaths       func(args []string) []*search.Match                                                      // expand import paths
+       ModPackageBuildInfo  func(main string, deps []string) string                                                  // return module info to embed in binary
+       ModInfoProg          func(info string) []byte                                                                 // wrap module info in .go code for binary
+       ModImportFromFiles   func([]string)                                                                           // update go.mod to add modules for imports in these files
+       ModDirImportPath     func(string) string                                                                      // return effective import path for directory
 )
 
 var IgnoreImports bool // control whether we ignore imports in packages
@@ -174,7 +177,8 @@ type PackageInternal struct {
        OmitDebug         bool                 // tell linker not to write debug information
        GobinSubdir       bool                 // install target would be subdir of GOBIN
        BuildInfo         string               // add this info to package main
-       TestmainGo        *[]byte              // content for _testmain.go
+       TestinginitGo     []byte               // content for _testinginit.go
+       TestmainGo        []byte               // content for _testmain.go
 
        Asmflags   []string // -asmflags for this package
        Gcflags    []string // -gcflags for this package
@@ -356,38 +360,56 @@ func (sp *ImportStack) shorterThan(t []string) bool {
        return false // they are equal
 }
 
-// packageCache is a lookup cache for loadPackage,
+// packageCache is a lookup cache for LoadImport,
 // so that if we look up a package multiple times
 // we return the same pointer each time.
 var packageCache = map[string]*Package{}
 
+// ClearPackageCache clears the in-memory package cache and the preload caches.
+// It is only for use by GOPATH-based "go get".
+// TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function.
 func ClearPackageCache() {
        for name := range packageCache {
                delete(packageCache, name)
        }
+       resolvedImportCache.Clear()
+       packageDataCache.Clear()
 }
 
+// ClearPackageCachePartial clears packages with the given import paths from the
+// in-memory package cache and the preload caches. It is only for use by
+// GOPATH-based "go get".
+// TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function.
 func ClearPackageCachePartial(args []string) {
+       shouldDelete := make(map[string]bool)
        for _, arg := range args {
-               p := packageCache[arg]
-               if p != nil {
-                       delete(packageCache, p.Dir)
-                       delete(packageCache, p.ImportPath)
+               shouldDelete[arg] = true
+               if p := packageCache[arg]; p != nil {
+                       delete(packageCache, arg)
                }
        }
+       resolvedImportCache.DeleteIf(func(key interface{}) bool {
+               return shouldDelete[key.(importSpec).path]
+       })
+       packageDataCache.DeleteIf(func(key interface{}) bool {
+               return shouldDelete[key.(string)]
+       })
 }
 
-// ReloadPackageNoFlags is like LoadPackageNoFlags but makes sure
+// ReloadPackageNoFlags is like LoadImport but makes sure
 // not to use the package cache.
 // It is only for use by GOPATH-based "go get".
 // TODO(rsc): When GOPATH-based "go get" is removed, delete this function.
 func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package {
        p := packageCache[arg]
        if p != nil {
-               delete(packageCache, p.Dir)
-               delete(packageCache, p.ImportPath)
+               delete(packageCache, arg)
+               resolvedImportCache.DeleteIf(func(key interface{}) bool {
+                       return key.(importSpec).path == p.ImportPath
+               })
+               packageDataCache.Delete(p.ImportPath)
        }
-       return LoadPackageNoFlags(arg, stk)
+       return LoadImport(arg, base.Cwd, nil, stk, nil, 0)
 }
 
 // dirToImportPath returns the pseudo-import path we use for a package
@@ -440,6 +462,10 @@ const (
 // this package, as part of a bigger load operation, and by GOPATH-based "go get".
 // TODO(rsc): When GOPATH-based "go get" is removed, unexport this function.
 func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
+       return loadImport(nil, path, srcDir, parent, stk, importPos, mode)
+}
+
+func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
        if path == "" {
                panic("LoadImport called with empty package path")
        }
@@ -447,125 +473,51 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo
        stk.Push(path)
        defer stk.Pop()
 
-       if strings.HasPrefix(path, "mod/") {
-               // Paths beginning with "mod/" might accidentally
-               // look in the module cache directory tree in $GOPATH/pkg/mod/.
-               // This prefix is owned by the Go core for possible use in the
-               // standard library (since it does not begin with a domain name),
-               // so it's OK to disallow entirely.
-               return &Package{
-                       PackagePublic: PackagePublic{
-                               ImportPath: path,
-                               Error: &PackageError{
-                                       ImportStack: stk.Copy(),
-                                       Err:         fmt.Sprintf("disallowed import path %q", path),
-                               },
-                       },
-               }
+       var parentPath, parentRoot string
+       parentIsStd := false
+       if parent != nil {
+               parentPath = parent.ImportPath
+               parentRoot = parent.Root
+               parentIsStd = parent.Standard
        }
-
-       if strings.Contains(path, "@") {
-               var text string
-               if cfg.ModulesEnabled {
-                       text = "can only use path@version syntax with 'go get'"
-               } else {
-                       text = "cannot use path@version syntax in GOPATH mode"
-               }
+       bp, loaded, err := loadPackageData(path, parentPath, srcDir, parentRoot, parentIsStd, mode)
+       if loaded && pre != nil && !IgnoreImports {
+               pre.preloadImports(bp.Imports, bp)
+       }
+       if bp == nil {
                return &Package{
                        PackagePublic: PackagePublic{
                                ImportPath: path,
                                Error: &PackageError{
                                        ImportStack: stk.Copy(),
-                                       Err:         text,
+                                       Err:         err.Error(),
                                },
                        },
                }
        }
 
-       parentPath := ""
-       if parent != nil {
-               parentPath = parent.ImportPath
-       }
-
-       // Determine canonical identifier for this package.
-       // For a local import the identifier is the pseudo-import path
-       // we create from the full directory to the package.
-       // Otherwise it is the usual import path.
-       // For vendored imports, it is the expanded form.
-       importPath := path
-       origPath := path
-       isLocal := build.IsLocalImport(path)
-       var modDir string
-       var modErr error
-       if isLocal {
-               importPath = dirToImportPath(filepath.Join(srcDir, path))
-       } else if cfg.ModulesEnabled {
-               var p string
-               modDir, p, modErr = ModLookup(path)
-               if modErr == nil {
-                       importPath = p
-               }
-       } else if mode&ResolveImport != 0 {
-               // We do our own path resolution, because we want to
-               // find out the key to use in packageCache without the
-               // overhead of repeated calls to buildContext.Import.
-               // The code is also needed in a few other places anyway.
-               path = ResolveImportPath(parent, path)
-               importPath = path
-       } else if mode&ResolveModule != 0 {
-               path = ModuleImportPath(parent, path)
-               importPath = path
-       }
-
+       importPath := bp.ImportPath
        p := packageCache[importPath]
        if p != nil {
                p = reusePackage(p, stk)
        } else {
                p = new(Package)
-               p.Internal.Local = isLocal
+               p.Internal.Local = build.IsLocalImport(path)
                p.ImportPath = importPath
                packageCache[importPath] = p
 
                // Load package.
-               // Import always returns bp != nil, even if an error occurs,
+               // loadPackageData may return bp != nil even if an error occurs,
                // in order to return partial information.
-               var bp *build.Package
-               var err error
-               if modDir != "" {
-                       bp, err = cfg.BuildContext.ImportDir(modDir, 0)
-               } else if modErr != nil {
-                       bp = new(build.Package)
-                       err = fmt.Errorf("unknown import path %q: %v", importPath, modErr)
-               } else if cfg.ModulesEnabled && path != "unsafe" {
-                       bp = new(build.Package)
-                       err = fmt.Errorf("unknown import path %q: internal error: module loader did not resolve import", importPath)
-               } else {
-                       buildMode := build.ImportComment
-                       if mode&ResolveImport == 0 || path != origPath {
-                               // Not vendoring, or we already found the vendored path.
-                               buildMode |= build.IgnoreVendor
-                       }
-                       bp, err = cfg.BuildContext.Import(path, srcDir, buildMode)
-               }
-               bp.ImportPath = importPath
-               if cfg.GOBIN != "" {
-                       bp.BinDir = cfg.GOBIN
-               } else if cfg.ModulesEnabled {
-                       bp.BinDir = ModBinDir()
-               }
-               if modDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
-                       !strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") {
-                       err = fmt.Errorf("code in directory %s expects import %q", bp.Dir, bp.ImportComment)
-               }
                p.load(stk, bp, err)
                if p.Error != nil && p.Error.Pos == "" {
                        p = setErrorPos(p, importPos)
                }
 
-               if modDir == "" && origPath != cleanImport(origPath) {
+               if !cfg.ModulesEnabled && path != cleanImport(path) {
                        p.Error = &PackageError{
                                ImportStack: stk.Copy(),
-                               Err:         fmt.Sprintf("non-canonical import path: %q should be %q", origPath, pathpkg.Clean(origPath)),
+                               Err:         fmt.Sprintf("non-canonical import path: %q should be %q", path, pathpkg.Clean(path)),
                        }
                        p.Incomplete = true
                }
@@ -576,7 +528,7 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo
                return setErrorPos(perr, importPos)
        }
        if mode&ResolveImport != 0 {
-               if perr := disallowVendor(srcDir, parent, parentPath, origPath, p, stk); perr != p {
+               if perr := disallowVendor(srcDir, parent, parentPath, path, p, stk); perr != p {
                        return setErrorPos(perr, importPos)
                }
        }
@@ -592,9 +544,13 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo
 
        if p.Internal.Local && parent != nil && !parent.Internal.Local {
                perr := *p
+               errMsg := fmt.Sprintf("local import %q in non-local package", path)
+               if path == "." {
+                       errMsg = "cannot import current directory"
+               }
                perr.Error = &PackageError{
                        ImportStack: stk.Copy(),
-                       Err:         fmt.Sprintf("local import %q in non-local package", path),
+                       Err:         errMsg,
                }
                return setErrorPos(&perr, importPos)
        }
@@ -611,6 +567,250 @@ func setErrorPos(p *Package, importPos []token.Position) *Package {
        return p
 }
 
+// loadPackageData loads information needed to construct a *Package. The result
+// is cached, and later calls to loadPackageData for the same package will return
+// the same data.
+//
+// loadPackageData returns a non-nil package even if err is non-nil unless
+// the package path is malformed (for example, the path contains "mod/" or "@").
+//
+// loadPackageData returns a boolean, loaded, which is true if this is the
+// first time the package was loaded. Callers may preload imports in this case.
+func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd bool, mode int) (bp *build.Package, loaded bool, err error) {
+       if path == "" {
+               panic("loadPackageData called with empty package path")
+       }
+
+       if strings.HasPrefix(path, "mod/") {
+               // Paths beginning with "mod/" might accidentally
+               // look in the module cache directory tree in $GOPATH/pkg/mod/.
+               // This prefix is owned by the Go core for possible use in the
+               // standard library (since it does not begin with a domain name),
+               // so it's OK to disallow entirely.
+               return nil, false, fmt.Errorf("disallowed import path %q", path)
+       }
+
+       if strings.Contains(path, "@") {
+               if cfg.ModulesEnabled {
+                       return nil, false, errors.New("can only use path@version syntax with 'go get'")
+               } else {
+                       return nil, false, errors.New("cannot use path@version syntax in GOPATH mode")
+               }
+       }
+
+       // Determine canonical package path and directory.
+       // For a local import the identifier is the pseudo-import path
+       // we create from the full directory to the package.
+       // Otherwise it is the usual import path.
+       // For vendored imports, it is the expanded form.
+       importKey := importSpec{
+               path:        path,
+               parentPath:  parentPath,
+               parentDir:   parentDir,
+               parentRoot:  parentRoot,
+               parentIsStd: parentIsStd,
+               mode:        mode,
+       }
+       r := resolvedImportCache.Do(importKey, func() interface{} {
+               var r resolvedImport
+               if build.IsLocalImport(path) {
+                       r.dir = filepath.Join(parentDir, path)
+                       r.path = dirToImportPath(r.dir)
+               } else if cfg.ModulesEnabled {
+                       r.dir, r.path, r.err = ModLookup(parentPath, parentIsStd, path)
+               } else if mode&ResolveImport != 0 {
+                       // We do our own path resolution, because we want to
+                       // find out the key to use in packageCache without the
+                       // overhead of repeated calls to buildContext.Import.
+                       // The code is also needed in a few other places anyway.
+                       r.path = resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd)
+               } else if mode&ResolveModule != 0 {
+                       r.path = moduleImportPath(path, parentPath, parentDir, parentRoot)
+               }
+               if r.path == "" {
+                       r.path = path
+               }
+               return r
+       }).(resolvedImport)
+       // Invariant: r.path is set to the resolved import path. If the path cannot
+       // be resolved, r.path is set to path, the source import path.
+       // r.path is never empty.
+
+       // Load the package from its directory. If we already found the package's
+       // directory when resolving its import path, use that.
+       data := packageDataCache.Do(r.path, func() interface{} {
+               loaded = true
+               var data packageData
+               if r.dir != "" {
+                       var buildMode build.ImportMode
+                       if !cfg.ModulesEnabled {
+                               buildMode = build.ImportComment
+                       }
+                       data.p, data.err = cfg.BuildContext.ImportDir(r.dir, buildMode)
+               } else if r.err != nil {
+                       data.p = new(build.Package)
+                       data.err = fmt.Errorf("unknown import path %q: %v", r.path, r.err)
+               } else if cfg.ModulesEnabled && path != "unsafe" {
+                       data.p = new(build.Package)
+                       data.err = fmt.Errorf("unknown import path %q: internal error: module loader did not resolve import", r.path)
+               } else {
+                       buildMode := build.ImportComment
+                       if mode&ResolveImport == 0 || r.path != path {
+                               // Not vendoring, or we already found the vendored path.
+                               buildMode |= build.IgnoreVendor
+                       }
+                       data.p, data.err = cfg.BuildContext.Import(r.path, parentDir, buildMode)
+               }
+               data.p.ImportPath = r.path
+
+               // Set data.p.BinDir in cases where go/build.Context.Import
+               // may give us a path we don't want.
+               if !data.p.Goroot {
+                       if cfg.GOBIN != "" {
+                               data.p.BinDir = cfg.GOBIN
+                       } else if cfg.ModulesEnabled {
+                               data.p.BinDir = ModBinDir()
+                       }
+               }
+
+               if !cfg.ModulesEnabled && data.err == nil &&
+                       data.p.ImportComment != "" && data.p.ImportComment != path &&
+                       !strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") {
+                       data.err = fmt.Errorf("code in directory %s expects import %q", data.p.Dir, data.p.ImportComment)
+               }
+               return data
+       }).(packageData)
+
+       return data.p, loaded, data.err
+}
+
+// importSpec describes an import declaration in source code. It is used as a
+// cache key for resolvedImportCache.
+type importSpec struct {
+       path                              string
+       parentPath, parentDir, parentRoot string
+       parentIsStd                       bool
+       mode                              int
+}
+
+// resolvedImport holds a canonical identifier for a package. It may also contain
+// a path to the package's directory and an error if one occurred. resolvedImport
+// is the value type in resolvedImportCache.
+type resolvedImport struct {
+       path, dir string
+       err       error
+}
+
+// packageData holds information loaded from a package. It is the value type
+// in packageDataCache.
+type packageData struct {
+       p   *build.Package
+       err error
+}
+
+// resolvedImportCache maps import strings (importSpec) to canonical package names
+// (resolvedImport).
+var resolvedImportCache par.Cache
+
+// packageDataCache maps canonical package names (string) to package metadata
+// (packageData).
+var packageDataCache par.Cache
+
+// preloadWorkerCount is the number of concurrent goroutines that can load
+// packages. Experimentally, there are diminishing returns with more than
+// 4 workers. This was measured on the following machines.
+//
+// * MacBookPro with a 4-core Intel Core i7 CPU
+// * Linux workstation with 6-core Intel Xeon CPU
+// * Linux workstation with 24-core Intel Xeon CPU
+//
+// It is very likely (though not confirmed) that this workload is limited
+// by memory bandwidth. We don't have a good way to determine the number of
+// workers that would saturate the bus though, so runtime.GOMAXPROCS
+// seems like a reasonable default.
+var preloadWorkerCount = runtime.GOMAXPROCS(0)
+
+// preload holds state for managing concurrent preloading of package data.
+//
+// A preload should be created with newPreload before loading a large
+// package graph. flush must be called when package loading is complete
+// to ensure preload goroutines are no longer active. This is necessary
+// because of global mutable state that cannot safely be read and written
+// concurrently. In particular, packageDataCache may be cleared by "go get"
+// in GOPATH mode, and modload.loaded (accessed via ModLookup) may be
+// modified by modload.ImportPaths (ModImportPaths).
+type preload struct {
+       cancel chan struct{}
+       sema   chan struct{}
+}
+
+// newPreload creates a new preloader. flush must be called later to avoid
+// accessing global state while it is being modified.
+func newPreload() *preload {
+       pre := &preload{
+               cancel: make(chan struct{}),
+               sema:   make(chan struct{}, preloadWorkerCount),
+       }
+       return pre
+}
+
+// preloadMatches loads data for package paths matched by patterns.
+// When preloadMatches returns, some packages may not be loaded yet, but
+// loadPackageData and loadImport are always safe to call.
+func (pre *preload) preloadMatches(matches []*search.Match) {
+       for _, m := range matches {
+               for _, pkg := range m.Pkgs {
+                       select {
+                       case <-pre.cancel:
+                               return
+                       case pre.sema <- struct{}{}:
+                               go func(pkg string) {
+                                       mode := 0 // don't use vendoring or module import resolution
+                                       bp, loaded, err := loadPackageData(pkg, "", base.Cwd, "", false, mode)
+                                       <-pre.sema
+                                       if bp != nil && loaded && err == nil && !IgnoreImports {
+                                               pre.preloadImports(bp.Imports, bp)
+                                       }
+                               }(pkg)
+                       }
+               }
+       }
+}
+
+// preloadImports queues a list of imports for preloading.
+// When preloadImports returns, some packages may not be loaded yet,
+// but loadPackageData and loadImport are always safe to call.
+func (pre *preload) preloadImports(imports []string, parent *build.Package) {
+       parentIsStd := parent.Goroot && parent.ImportPath != "" && search.IsStandardImportPath(parent.ImportPath)
+       for _, path := range imports {
+               if path == "C" || path == "unsafe" {
+                       continue
+               }
+               select {
+               case <-pre.cancel:
+                       return
+               case pre.sema <- struct{}{}:
+                       go func(path string) {
+                               bp, loaded, err := loadPackageData(path, parent.ImportPath, parent.Dir, parent.Root, parentIsStd, ResolveImport)
+                               <-pre.sema
+                               if bp != nil && loaded && err == nil && !IgnoreImports {
+                                       pre.preloadImports(bp.Imports, bp)
+                               }
+                       }(path)
+               }
+       }
+}
+
+// flush stops pending preload operations. flush blocks until preload calls to
+// loadPackageData have completed. The preloader will not make any new calls
+// to loadPackageData.
+func (pre *preload) flush() {
+       close(pre.cancel)
+       for i := 0; i < preloadWorkerCount; i++ {
+               pre.sema <- struct{}{}
+       }
+}
+
 func cleanImport(path string) string {
        orig := path
        path = pathpkg.Clean(path)
@@ -620,18 +820,13 @@ func cleanImport(path string) string {
        return path
 }
 
-var isDirCache = map[string]bool{}
+var isDirCache par.Cache
 
 func isDir(path string) bool {
-       result, ok := isDirCache[path]
-       if ok {
-               return result
-       }
-
-       fi, err := os.Stat(path)
-       result = err == nil && fi.IsDir()
-       isDirCache[path] = result
-       return result
+       return isDirCache.Do(path, func() interface{} {
+               fi, err := os.Stat(path)
+               return err == nil && fi.IsDir()
+       }).(bool)
 }
 
 // ResolveImportPath returns the true meaning of path when it appears in parent.
@@ -640,31 +835,44 @@ func isDir(path string) bool {
 // If vendor expansion doesn't trigger, then the path is also subject to
 // Go 1.11 module legacy conversion (golang.org/issue/25069).
 func ResolveImportPath(parent *Package, path string) (found string) {
+       var parentPath, parentDir, parentRoot string
+       parentIsStd := false
+       if parent != nil {
+               parentPath = parent.ImportPath
+               parentDir = parent.Dir
+               parentRoot = parent.Root
+               parentIsStd = parent.Standard
+       }
+       return resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd)
+}
+
+func resolveImportPath(path, parentPath, parentDir, parentRoot string, parentIsStd bool) (found string) {
        if cfg.ModulesEnabled {
-               if _, p, e := ModLookup(path); e == nil {
+               if _, p, e := ModLookup(parentPath, parentIsStd, path); e == nil {
                        return p
                }
                return path
        }
-       found = VendoredImportPath(parent, path)
+       found = vendoredImportPath(path, parentPath, parentDir, parentRoot)
        if found != path {
                return found
        }
-       return ModuleImportPath(parent, path)
+       return moduleImportPath(path, parentPath, parentDir, parentRoot)
 }
 
 // dirAndRoot returns the source directory and workspace root
 // for the package p, guaranteeing that root is a path prefix of dir.
-func dirAndRoot(p *Package) (dir, root string) {
-       dir = filepath.Clean(p.Dir)
-       root = filepath.Join(p.Root, "src")
-       if !str.HasFilePathPrefix(dir, root) || p.ImportPath != "command-line-arguments" && filepath.Join(root, p.ImportPath) != dir {
+func dirAndRoot(path string, dir, root string) (string, string) {
+       origDir, origRoot := dir, root
+       dir = filepath.Clean(dir)
+       root = filepath.Join(root, "src")
+       if !str.HasFilePathPrefix(dir, root) || path != "command-line-arguments" && filepath.Join(root, path) != dir {
                // Look for symlinks before reporting error.
                dir = expandPath(dir)
                root = expandPath(root)
        }
 
-       if !str.HasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || p.ImportPath != "command-line-arguments" && !p.Internal.Local && filepath.Join(root, p.ImportPath) != dir {
+       if !str.HasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || path != "command-line-arguments" && !build.IsLocalImport(path) && filepath.Join(root, path) != dir {
                base.Fatalf("unexpected directory layout:\n"+
                        "       import path: %s\n"+
                        "       root: %s\n"+
@@ -672,27 +880,27 @@ func dirAndRoot(p *Package) (dir, root string) {
                        "       expand root: %s\n"+
                        "       expand dir: %s\n"+
                        "       separator: %s",
-                       p.ImportPath,
-                       filepath.Join(p.Root, "src"),
-                       filepath.Clean(p.Dir),
-                       root,
-                       dir,
+                       path,
+                       filepath.Join(origRoot, "src"),
+                       filepath.Clean(origDir),
+                       origRoot,
+                       origDir,
                        string(filepath.Separator))
        }
 
        return dir, root
 }
 
-// VendoredImportPath returns the vendor-expansion of path when it appears in parent.
+// vendoredImportPath returns the vendor-expansion of path when it appears in parent.
 // If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path,
 // x/vendor/path, vendor/path, or else stay path if none of those exist.
-// VendoredImportPath returns the expanded path or, if no expansion is found, the original.
-func VendoredImportPath(parent *Package, path string) (found string) {
-       if parent == nil || parent.Root == "" {
+// vendoredImportPath returns the expanded path or, if no expansion is found, the original.
+func vendoredImportPath(path, parentPath, parentDir, parentRoot string) (found string) {
+       if parentRoot == "" {
                return path
        }
 
-       dir, root := dirAndRoot(parent)
+       dir, root := dirAndRoot(parentPath, parentDir, parentRoot)
 
        vpath := "vendor/" + path
        for i := len(dir); i >= len(root); i-- {
@@ -708,7 +916,7 @@ func VendoredImportPath(parent *Package, path string) (found string) {
                }
                targ := filepath.Join(dir[:i], vpath)
                if isDir(targ) && hasGoFiles(targ) {
-                       importPath := parent.ImportPath
+                       importPath := parentPath
                        if importPath == "command-line-arguments" {
                                // If parent.ImportPath is 'command-line-arguments'.
                                // set to relative directory to root (also chopped root directory)
@@ -738,54 +946,48 @@ func VendoredImportPath(parent *Package, path string) (found string) {
 
 var (
        modulePrefix   = []byte("\nmodule ")
-       goModPathCache = make(map[string]string)
+       goModPathCache par.Cache
 )
 
 // goModPath returns the module path in the go.mod in dir, if any.
 func goModPath(dir string) (path string) {
-       path, ok := goModPathCache[dir]
-       if ok {
-               return path
-       }
-       defer func() {
-               goModPathCache[dir] = path
-       }()
-
-       data, err := ioutil.ReadFile(filepath.Join(dir, "go.mod"))
-       if err != nil {
-               return ""
-       }
-       var i int
-       if bytes.HasPrefix(data, modulePrefix[1:]) {
-               i = 0
-       } else {
-               i = bytes.Index(data, modulePrefix)
-               if i < 0 {
+       return goModPathCache.Do(dir, func() interface{} {
+               data, err := ioutil.ReadFile(filepath.Join(dir, "go.mod"))
+               if err != nil {
                        return ""
                }
-               i++
-       }
-       line := data[i:]
+               var i int
+               if bytes.HasPrefix(data, modulePrefix[1:]) {
+                       i = 0
+               } else {
+                       i = bytes.Index(data, modulePrefix)
+                       if i < 0 {
+                               return ""
+                       }
+                       i++
+               }
+               line := data[i:]
 
-       // Cut line at \n, drop trailing \r if present.
-       if j := bytes.IndexByte(line, '\n'); j >= 0 {
-               line = line[:j]
-       }
-       if line[len(line)-1] == '\r' {
-               line = line[:len(line)-1]
-       }
-       line = line[len("module "):]
+               // Cut line at \n, drop trailing \r if present.
+               if j := bytes.IndexByte(line, '\n'); j >= 0 {
+                       line = line[:j]
+               }
+               if line[len(line)-1] == '\r' {
+                       line = line[:len(line)-1]
+               }
+               line = line[len("module "):]
 
-       // If quoted, unquote.
-       path = strings.TrimSpace(string(line))
-       if path != "" && path[0] == '"' {
-               s, err := strconv.Unquote(path)
-               if err != nil {
-                       return ""
+               // If quoted, unquote.
+               path = strings.TrimSpace(string(line))
+               if path != "" && path[0] == '"' {
+                       s, err := strconv.Unquote(path)
+                       if err != nil {
+                               return ""
+                       }
+                       path = s
                }
-               path = s
-       }
-       return path
+               return path
+       }).(string)
 }
 
 // findVersionElement returns the slice indices of the final version element /vN in path.
@@ -794,7 +996,7 @@ func findVersionElement(path string) (i, j int) {
        j = len(path)
        for i = len(path) - 1; i >= 0; i-- {
                if path[i] == '/' {
-                       if isVersionElement(path[i:j]) {
+                       if isVersionElement(path[i+1 : j]) {
                                return i, j
                        }
                        j = i
@@ -806,10 +1008,10 @@ func findVersionElement(path string) (i, j int) {
 // isVersionElement reports whether s is a well-formed path version element:
 // v2, v3, v10, etc, but not v0, v05, v1.
 func isVersionElement(s string) bool {
-       if len(s) < 3 || s[0] != '/' || s[1] != 'v' || s[2] == '0' || s[2] == '1' && len(s) == 3 {
+       if len(s) < 2 || s[0] != 'v' || s[1] == '0' || s[1] == '1' && len(s) == 2 {
                return false
        }
-       for i := 2; i < len(s); i++ {
+       for i := 1; i < len(s); i++ {
                if s[i] < '0' || '9' < s[i] {
                        return false
                }
@@ -817,7 +1019,7 @@ func isVersionElement(s string) bool {
        return true
 }
 
-// ModuleImportPath translates import paths found in go modules
+// moduleImportPath translates import paths found in go modules
 // back down to paths that can be resolved in ordinary builds.
 //
 // Define “new” code as code with a go.mod file in the same directory
@@ -825,8 +1027,8 @@ func isVersionElement(s string) bool {
 // x/y/v2/z does not exist and x/y/go.mod says “module x/y/v2”,
 // then go build will read the import as x/y/z instead.
 // See golang.org/issue/25069.
-func ModuleImportPath(parent *Package, path string) (found string) {
-       if parent == nil || parent.Root == "" {
+func moduleImportPath(path, parentPath, parentDir, parentRoot string) (found string) {
+       if parentRoot == "" {
                return path
        }
 
@@ -838,7 +1040,7 @@ func ModuleImportPath(parent *Package, path string) (found string) {
                return path
        }
 
-       dir, root := dirAndRoot(parent)
+       dir, root := dirAndRoot(parentPath, parentDir, parentRoot)
 
        // Consider dir and parents, up to and including root.
        for i := len(dir); i >= len(root); i-- {
@@ -967,6 +1169,13 @@ func disallowInternal(srcDir string, importer *Package, importerPath string, p *
                }
        }
 
+       // The sort package depends on internal/reflectlite, but during bootstrap
+       // the path rewriting causes the normal internal checks to fail.
+       // Instead, just ignore the internal rules during bootstrap.
+       if p.Standard && strings.HasPrefix(importerPath, "bootstrap/") {
+               return p
+       }
+
        // The stack includes p.ImportPath.
        // If that's the only thing on the stack, we started
        // with a name given on the command line, not an
@@ -1188,26 +1397,16 @@ var foldPath = make(map[string]string)
 // for a package with the import path importPath.
 //
 // The default executable name is the last element of the import path.
-// In module-aware mode, an additional rule is used. If the last element
-// is a vN path element specifying the major version, then the second last
-// element of the import path is used instead.
+// In module-aware mode, an additional rule is used on import paths
+// consisting of two or more path elements. If the last element is
+// a vN path element specifying the major version, then the
+// second last element of the import path is used instead.
 func DefaultExecName(importPath string) string {
        _, elem := pathpkg.Split(importPath)
        if cfg.ModulesEnabled {
-               // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2.
-               // See golang.org/issue/24667.
-               isVersion := func(v string) bool {
-                       if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] {
-                               return false
-                       }
-                       for i := 2; i < len(v); i++ {
-                               if c := v[i]; c < '0' || '9' < c {
-                                       return false
-                               }
-                       }
-                       return true
-               }
-               if isVersion(elem) {
+               // If this is example.com/mycmd/v2, it's more useful to
+               // install it as mycmd than as v2. See golang.org/issue/24667.
+               if elem != importPath && isVersionElement(elem) {
                        _, elem = pathpkg.Split(pathpkg.Dir(importPath))
                }
        }
@@ -1254,21 +1453,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
                        p.Error = &PackageError{Err: e}
                        return
                }
-               _, elem := filepath.Split(p.Dir)
-               if cfg.ModulesEnabled {
-                       // NOTE(rsc,dmitshur): Using p.ImportPath instead of p.Dir
-                       // makes sure we install a package in the root of a
-                       // cached module directory as that package name
-                       // not name@v1.2.3.
-                       // Using p.ImportPath instead of p.Dir
-                       // is probably correct all the time,
-                       // even for non-module-enabled code,
-                       // but I'm not brave enough to change the
-                       // non-module behavior this late in the
-                       // release cycle. Can be done for Go 1.13.
-                       // See golang.org/issue/26869.
-                       elem = DefaultExecName(p.ImportPath)
-               }
+               elem := DefaultExecName(p.ImportPath)
                full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem
                if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH {
                        // Install cross-compiled binaries to subdirectories of bin.
@@ -1420,16 +1605,6 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
                        continue
                }
                p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport)
-               if p.Standard && p.Error == nil && !p1.Standard && p1.Error == nil {
-                       p.Error = &PackageError{
-                               ImportStack: stk.Copy(),
-                               Err:         fmt.Sprintf("non-standard import %q in standard package %q", path, p.ImportPath),
-                       }
-                       pos := p.Internal.Build.ImportPos[path]
-                       if len(pos) > 0 {
-                               p.Error.Pos = pos[0].String()
-                       }
-               }
 
                path = p1.ImportPath
                importPaths[i] = path
@@ -1443,41 +1618,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
                }
        }
        p.Internal.Imports = imports
-
-       deps := make(map[string]*Package)
-       var q []*Package
-       q = append(q, imports...)
-       for i := 0; i < len(q); i++ {
-               p1 := q[i]
-               path := p1.ImportPath
-               // The same import path could produce an error or not,
-               // depending on what tries to import it.
-               // Prefer to record entries with errors, so we can report them.
-               p0 := deps[path]
-               if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
-                       deps[path] = p1
-                       for _, p2 := range p1.Internal.Imports {
-                               if deps[p2.ImportPath] != p2 {
-                                       q = append(q, p2)
-                               }
-                       }
-               }
-       }
-
-       p.Deps = make([]string, 0, len(deps))
-       for dep := range deps {
-               p.Deps = append(p.Deps, dep)
-       }
-       sort.Strings(p.Deps)
-       for _, dep := range p.Deps {
-               p1 := deps[dep]
-               if p1 == nil {
-                       panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath)
-               }
-               if p1.Error != nil {
-                       p.DepsErrors = append(p.DepsErrors, p1.Error)
-               }
-       }
+       p.collectDeps()
 
        // unsafe is a fake package.
        if p.Standard && (p.ImportPath == "unsafe" || cfg.BuildContext.Compiler == "gccgo") {
@@ -1547,6 +1688,48 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
        }
 }
 
+// collectDeps populates p.Deps and p.DepsErrors by iterating over
+// p.Internal.Imports.
+//
+// TODO(jayconrod): collectDeps iterates over transitive imports for every
+// package. We should only need to visit direct imports.
+func (p *Package) collectDeps() {
+       deps := make(map[string]*Package)
+       var q []*Package
+       q = append(q, p.Internal.Imports...)
+       for i := 0; i < len(q); i++ {
+               p1 := q[i]
+               path := p1.ImportPath
+               // The same import path could produce an error or not,
+               // depending on what tries to import it.
+               // Prefer to record entries with errors, so we can report them.
+               p0 := deps[path]
+               if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
+                       deps[path] = p1
+                       for _, p2 := range p1.Internal.Imports {
+                               if deps[p2.ImportPath] != p2 {
+                                       q = append(q, p2)
+                               }
+                       }
+               }
+       }
+
+       p.Deps = make([]string, 0, len(deps))
+       for dep := range deps {
+               p.Deps = append(p.Deps, dep)
+       }
+       sort.Strings(p.Deps)
+       for _, dep := range p.Deps {
+               p1 := deps[dep]
+               if p1 == nil {
+                       panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath)
+               }
+               if p1.Error != nil {
+                       p.DepsErrors = append(p.DepsErrors, p1.Error)
+               }
+       }
+}
+
 // SafeArg reports whether arg is a "safe" command-line argument,
 // meaning that when it appears in a command-line, it probably
 // doesn't have some special meaning other than its own name.
@@ -1700,7 +1883,7 @@ func PackageList(roots []*Package) []*Package {
 // TestPackageList returns the list of packages in the dag rooted at roots
 // as visited in a depth-first post-order traversal, including the test
 // imports of the roots. This ignores errors in test packages.
-func GetTestPackageList(roots []*Package) []*Package {
+func TestPackageList(roots []*Package) []*Package {
        seen := map[*Package]bool{}
        all := []*Package{}
        var walk func(*Package)
@@ -1733,99 +1916,17 @@ func GetTestPackageList(roots []*Package) []*Package {
        return all
 }
 
-var cmdCache = map[string]*Package{}
-
-func ClearCmdCache() {
-       for name := range cmdCache {
-               delete(cmdCache, name)
-       }
-}
-
-// LoadPackage loads the package named by arg.
-func LoadPackage(arg string, stk *ImportStack) *Package {
-       p := loadPackage(arg, stk)
+// LoadImportWithFlags loads the package with the given import path and
+// sets tool flags on that package. This function is useful loading implicit
+// dependencies (like sync/atomic for coverage).
+// TODO(jayconrod): delete this function and set flags automatically
+// in LoadImport instead.
+func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
+       p := LoadImport(path, srcDir, parent, stk, importPos, mode)
        setToolFlags(p)
        return p
 }
 
-// LoadPackageNoFlags is like LoadPackage
-// but does not guarantee that the build tool flags are set in the result.
-// It is only for use by GOPATH-based "go get"
-// and is only appropriate for preliminary loading of packages.
-// A real load using LoadPackage or (more likely)
-// Packages, PackageAndErrors, or PackagesForBuild
-// must be done before passing the package to any build
-// steps, so that the tool flags can be set properly.
-// TODO(rsc): When GOPATH-based "go get" is removed, delete this function.
-func LoadPackageNoFlags(arg string, stk *ImportStack) *Package {
-       return loadPackage(arg, stk)
-}
-
-// loadPackage is like loadImport but is used for command-line arguments,
-// not for paths found in import statements. In addition to ordinary import paths,
-// loadPackage accepts pseudo-paths beginning with cmd/ to denote commands
-// in the Go command directory, as well as paths to those directories.
-func loadPackage(arg string, stk *ImportStack) *Package {
-       if arg == "" {
-               panic("loadPackage called with empty package path")
-       }
-       if build.IsLocalImport(arg) {
-               dir := arg
-               if !filepath.IsAbs(dir) {
-                       if abs, err := filepath.Abs(dir); err == nil {
-                               // interpret relative to current directory
-                               dir = abs
-                       }
-               }
-               if sub, ok := hasSubdir(cfg.GOROOTsrc, dir); ok && strings.HasPrefix(sub, "cmd/") && !strings.Contains(sub[4:], "/") {
-                       arg = sub
-               }
-       }
-       if strings.HasPrefix(arg, "cmd/") && !strings.Contains(arg[4:], "/") {
-               if p := cmdCache[arg]; p != nil {
-                       return p
-               }
-               stk.Push(arg)
-               defer stk.Pop()
-
-               bp, err := cfg.BuildContext.ImportDir(filepath.Join(cfg.GOROOTsrc, arg), 0)
-               bp.ImportPath = arg
-               bp.Goroot = true
-               bp.BinDir = cfg.GOROOTbin
-               bp.Root = cfg.GOROOT
-               bp.SrcRoot = cfg.GOROOTsrc
-               p := new(Package)
-               cmdCache[arg] = p
-               p.load(stk, bp, err)
-               if p.Error == nil && p.Name != "main" {
-                       p.Error = &PackageError{
-                               ImportStack: stk.Copy(),
-                               Err:         fmt.Sprintf("expected package main but found package %s in %s", p.Name, p.Dir),
-                       }
-               }
-               return p
-       }
-
-       // Wasn't a command; must be a package.
-       // If it is a local import path but names a standard package,
-       // we treat it as if the user specified the standard package.
-       // This lets you run go test ./ioutil in package io and be
-       // referring to io/ioutil rather than a hypothetical import of
-       // "./ioutil".
-       if build.IsLocalImport(arg) || filepath.IsAbs(arg) {
-               dir := arg
-               if !filepath.IsAbs(arg) {
-                       dir = filepath.Join(base.Cwd, arg)
-               }
-               bp, _ := cfg.BuildContext.ImportDir(dir, build.FindOnly)
-               if bp.ImportPath != "" && bp.ImportPath != "." {
-                       arg = bp.ImportPath
-               }
-       }
-
-       return LoadImport(arg, base.Cwd, nil, stk, nil, 0)
-}
-
 // Packages returns the packages named by the
 // command line arguments 'args'. If a named package
 // cannot be loaded at all (for example, if the directory does not exist),
@@ -1851,8 +1952,12 @@ func Packages(args []string) []*Package {
 // cannot be loaded at all.
 // The packages that fail to load will have p.Error != nil.
 func PackagesAndErrors(patterns []string) []*Package {
-       if len(patterns) > 0 && strings.HasSuffix(patterns[0], ".go") {
-               return []*Package{GoFilesPackage(patterns)}
+       if len(patterns) > 0 {
+               for _, p := range patterns {
+                       if strings.HasSuffix(p, ".go") {
+                               return []*Package{GoFilesPackage(patterns)}
+                       }
+               }
        }
 
        matches := ImportPaths(patterns)
@@ -1862,12 +1967,16 @@ func PackagesAndErrors(patterns []string) []*Package {
                seenPkg = make(map[*Package]bool)
        )
 
+       pre := newPreload()
+       defer pre.flush()
+       pre.preloadMatches(matches)
+
        for _, m := range matches {
                for _, pkg := range m.Pkgs {
                        if pkg == "" {
                                panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern))
                        }
-                       p := loadPackage(pkg, &stk)
+                       p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0)
                        p.Match = append(p.Match, m.Pattern)
                        p.Internal.CmdlinePkg = true
                        if m.Literal {
@@ -1960,7 +2069,14 @@ func GoFilesPackage(gofiles []string) *Package {
 
        for _, f := range gofiles {
                if !strings.HasSuffix(f, ".go") {
-                       base.Fatalf("named files must be .go files")
+                       pkg := new(Package)
+                       pkg.Internal.Local = true
+                       pkg.Internal.CmdlineFiles = true
+                       pkg.Name = f
+                       pkg.Error = &PackageError{
+                               Err: fmt.Sprintf("named files must be .go files: %s", pkg.Name),
+                       }
+                       return pkg
                }
        }
 
diff --git a/libgo/go/cmd/go/internal/load/pkg_test.go b/libgo/go/cmd/go/internal/load/pkg_test.go
new file mode 100644 (file)
index 0000000..9ddc20d
--- /dev/null
@@ -0,0 +1,68 @@
+package load
+
+import (
+       "cmd/go/internal/cfg"
+       "testing"
+)
+
+func TestDefaultExecName(t *testing.T) {
+       oldModulesEnabled := cfg.ModulesEnabled
+       defer func() { cfg.ModulesEnabled = oldModulesEnabled }()
+       for _, tt := range []struct {
+               in         string
+               wantMod    string
+               wantGopath string
+       }{
+               {"example.com/mycmd", "mycmd", "mycmd"},
+               {"example.com/mycmd/v0", "v0", "v0"},
+               {"example.com/mycmd/v1", "v1", "v1"},
+               {"example.com/mycmd/v2", "mycmd", "v2"}, // Semantic import versioning, use second last element in module mode.
+               {"example.com/mycmd/v3", "mycmd", "v3"}, // Semantic import versioning, use second last element in module mode.
+               {"mycmd", "mycmd", "mycmd"},
+               {"mycmd/v0", "v0", "v0"},
+               {"mycmd/v1", "v1", "v1"},
+               {"mycmd/v2", "mycmd", "v2"}, // Semantic import versioning, use second last element in module mode.
+               {"v0", "v0", "v0"},
+               {"v1", "v1", "v1"},
+               {"v2", "v2", "v2"},
+       } {
+               {
+                       cfg.ModulesEnabled = true
+                       gotMod := DefaultExecName(tt.in)
+                       if gotMod != tt.wantMod {
+                               t.Errorf("DefaultExecName(%q) in module mode = %v; want %v", tt.in, gotMod, tt.wantMod)
+                       }
+               }
+               {
+                       cfg.ModulesEnabled = false
+                       gotGopath := DefaultExecName(tt.in)
+                       if gotGopath != tt.wantGopath {
+                               t.Errorf("DefaultExecName(%q) in gopath mode = %v; want %v", tt.in, gotGopath, tt.wantGopath)
+                       }
+               }
+       }
+}
+
+func TestIsVersionElement(t *testing.T) {
+       t.Parallel()
+       for _, tt := range []struct {
+               in   string
+               want bool
+       }{
+               {"v0", false},
+               {"v05", false},
+               {"v1", false},
+               {"v2", true},
+               {"v3", true},
+               {"v9", true},
+               {"v10", true},
+               {"v11", true},
+               {"v", false},
+               {"vx", false},
+       } {
+               got := isVersionElement(tt.in)
+               if got != tt.want {
+                       t.Errorf("isVersionElement(%q) = %v; want %v", tt.in, got, tt.want)
+               }
+       }
+}
index 7385c4e5030ec1b35ffc4603c7507d96701c49f2..c247d56c8127f5624c9610b6fcab94a9c36bc372 100644 (file)
@@ -15,10 +15,10 @@ import (
        "go/doc"
        "go/parser"
        "go/token"
+       "internal/lazytemplate"
        "path/filepath"
        "sort"
        "strings"
-       "text/template"
        "unicode"
        "unicode/utf8"
 )
@@ -39,10 +39,43 @@ type TestCover struct {
        DeclVars func(*Package, ...string) map[string]*CoverVar
 }
 
-// TestPackagesFor returns three packages:
+// TestPackagesFor is like TestPackagesAndErrors but it returns
+// an error if the test packages or their dependencies have errors.
+// Only test packages without errors are returned.
+func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) {
+       pmain, ptest, pxtest = TestPackagesAndErrors(p, cover)
+       for _, p1 := range []*Package{ptest, pxtest, pmain} {
+               if p1 == nil {
+                       // pxtest may be nil
+                       continue
+               }
+               if p1.Error != nil {
+                       err = p1.Error
+                       break
+               }
+               if len(p1.DepsErrors) > 0 {
+                       perr := p1.DepsErrors[0]
+                       perr.Pos = "" // show full import stack
+                       err = perr
+                       break
+               }
+       }
+       if pmain.Error != nil || len(pmain.DepsErrors) > 0 {
+               pmain = nil
+       }
+       if ptest.Error != nil || len(ptest.DepsErrors) > 0 {
+               ptest = nil
+       }
+       if pxtest != nil && (pxtest.Error != nil || len(pxtest.DepsErrors) > 0) {
+               pxtest = nil
+       }
+       return pmain, ptest, pxtest, err
+}
+
+// TestPackagesAndErrors returns three packages:
+//     - pmain, the package main corresponding to the test binary (running tests in ptest and pxtest).
 //     - ptest, the package p compiled with added "package p" test files.
 //     - pxtest, the result of compiling any "package p_test" (external) test files.
-//     - pmain, the package main corresponding to the test binary (running tests in ptest and pxtest).
 //
 // If the package has no "package p_test" test files, pxtest will be nil.
 // If the non-test compilation of package p can be reused
@@ -50,57 +83,59 @@ type TestCover struct {
 // package p need not be instrumented for coverage or any other reason),
 // then the returned ptest == p.
 //
+// An error is returned if the testmain source cannot be completely generated
+// (for example, due to a syntax error in a test file). No error will be
+// returned for errors loading packages, but the Error or DepsError fields
+// of the returned packages may be set.
+//
 // The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0,
 // or else there's no point in any of this.
-func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) {
+func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) {
+       pre := newPreload()
+       defer pre.flush()
+       allImports := append([]string{}, p.TestImports...)
+       allImports = append(allImports, p.XTestImports...)
+       pre.preloadImports(allImports, p.Internal.Build)
+
+       var ptestErr, pxtestErr *PackageError
        var imports, ximports []*Package
        var stk ImportStack
        stk.Push(p.ImportPath + " (test)")
        rawTestImports := str.StringList(p.TestImports)
+       var ptestImportsTesting, pxtestImportsTesting bool
        for i, path := range p.TestImports {
-               p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport)
-               if p1.Error != nil {
-                       return nil, nil, nil, p1.Error
-               }
-               if len(p1.DepsErrors) > 0 {
-                       err := p1.DepsErrors[0]
-                       err.Pos = "" // show full import stack
-                       return nil, nil, nil, err
-               }
+               p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport)
                if str.Contains(p1.Deps, p.ImportPath) || p1.ImportPath == p.ImportPath {
                        // Same error that loadPackage returns (via reusePackage) in pkg.go.
                        // Can't change that code, because that code is only for loading the
                        // non-test copy of a package.
-                       err := &PackageError{
+                       ptestErr = &PackageError{
                                ImportStack:   testImportStack(stk[0], p1, p.ImportPath),
                                Err:           "import cycle not allowed in test",
                                IsImportCycle: true,
                        }
-                       return nil, nil, nil, err
                }
                p.TestImports[i] = p1.ImportPath
                imports = append(imports, p1)
+               if path == "testing" {
+                       ptestImportsTesting = true
+               }
        }
        stk.Pop()
        stk.Push(p.ImportPath + "_test")
        pxtestNeedsPtest := false
        rawXTestImports := str.StringList(p.XTestImports)
        for i, path := range p.XTestImports {
-               p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport)
-               if p1.Error != nil {
-                       return nil, nil, nil, p1.Error
-               }
-               if len(p1.DepsErrors) > 0 {
-                       err := p1.DepsErrors[0]
-                       err.Pos = "" // show full import stack
-                       return nil, nil, nil, err
-               }
+               p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport)
                if p1.ImportPath == p.ImportPath {
                        pxtestNeedsPtest = true
                } else {
                        ximports = append(ximports, p1)
                }
                p.XTestImports[i] = p1.ImportPath
+               if path == "testing" {
+                       pxtestImportsTesting = true
+               }
        }
        stk.Pop()
 
@@ -108,7 +143,11 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
        if len(p.TestGoFiles) > 0 || p.Name == "main" || cover != nil && cover.Local {
                ptest = new(Package)
                *ptest = *p
+               ptest.Error = ptestErr
                ptest.ForTest = p.ImportPath
+               if ptestImportsTesting {
+                       ptest.Internal.TestinginitGo = formatTestinginit(p)
+               }
                ptest.GoFiles = nil
                ptest.GoFiles = append(ptest.GoFiles, p.GoFiles...)
                ptest.GoFiles = append(ptest.GoFiles, p.TestGoFiles...)
@@ -140,6 +179,7 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
                        m[k] = append(m[k], v...)
                }
                ptest.Internal.Build.ImportPos = m
+               ptest.collectDeps()
        } else {
                ptest = p
        }
@@ -152,9 +192,11 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
                                ImportPath: p.ImportPath + "_test",
                                Root:       p.Root,
                                Dir:        p.Dir,
+                               Goroot:     p.Goroot,
                                GoFiles:    p.XTestGoFiles,
                                Imports:    p.XTestImports,
                                ForTest:    p.ImportPath,
+                               Error:      pxtestErr,
                        },
                        Internal: PackageInternal{
                                LocalPrefix: p.Internal.LocalPrefix,
@@ -170,9 +212,13 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
                                Gccgoflags: p.Internal.Gccgoflags,
                        },
                }
+               if pxtestImportsTesting {
+                       pxtest.Internal.TestinginitGo = formatTestinginit(pxtest)
+               }
                if pxtestNeedsPtest {
                        pxtest.Internal.Imports = append(pxtest.Internal.Imports, ptest)
                }
+               pxtest.collectDeps()
        }
 
        // Build main package.
@@ -206,10 +252,7 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
                if dep == ptest.ImportPath {
                        pmain.Internal.Imports = append(pmain.Internal.Imports, ptest)
                } else {
-                       p1 := LoadImport(dep, "", nil, &stk, nil, 0)
-                       if p1.Error != nil {
-                               return nil, nil, nil, p1.Error
-                       }
+                       p1 := loadImport(pre, dep, "", nil, &stk, nil, 0)
                        pmain.Internal.Imports = append(pmain.Internal.Imports, p1)
                }
        }
@@ -240,8 +283,8 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
        // The list of imports is used by recompileForTest and by the loop
        // afterward that gathers t.Cover information.
        t, err := loadTestFuncs(ptest)
-       if err != nil {
-               return nil, nil, nil, err
+       if err != nil && pmain.Error == nil {
+               pmain.Error = &PackageError{Err: err.Error()}
        }
        t.Cover = cover
        if len(ptest.GoFiles)+len(ptest.CgoFiles) > 0 {
@@ -254,6 +297,7 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
                pmain.Imports = append(pmain.Imports, pxtest.ImportPath)
                t.ImportXtest = true
        }
+       pmain.collectDeps()
 
        // Sort and dedup pmain.Imports.
        // Only matters for go list -test output.
@@ -290,12 +334,12 @@ func GetTestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Pac
        }
 
        data, err := formatTestmain(t)
-       if err != nil {
-               return nil, nil, nil, err
+       if err != nil && pmain.Error == nil {
+               pmain.Error = &PackageError{Err: err.Error()}
        }
-       pmain.Internal.TestmainGo = &data
+       pmain.Internal.TestmainGo = data
 
-       return pmain, ptest, pxtest, nil
+       return pmain, ptest, pxtest
 }
 
 func testImportStack(top string, p *Package, target string) []string {
@@ -321,9 +365,10 @@ Search:
 // preal, packages that import the package under test should get ptest instead
 // of preal. This is particularly important if pxtest depends on functionality
 // exposed in test sources in ptest. Second, if there is a main package
-// (other than pmain) anywhere, we need to clear p.Internal.BuildInfo in
-// the test copy to prevent link conflicts. This may happen if both -coverpkg
-// and the command line patterns include multiple main packages.
+// (other than pmain) anywhere, we need to set p.Internal.ForceLibrary and
+// clear p.Internal.BuildInfo in the test copy to prevent link conflicts.
+// This may happen if both -coverpkg and the command line patterns include
+// multiple main packages.
 func recompileForTest(pmain, preal, ptest, pxtest *Package) {
        // The "test copy" of preal is ptest.
        // For each package that depends on preal, make a "test copy"
@@ -354,6 +399,7 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) {
                        p = p1
                        p.Target = ""
                        p.Internal.BuildInfo = ""
+                       p.Internal.ForceLibrary = true
                }
 
                // Update p.Internal.Imports to use test copies.
@@ -419,21 +465,33 @@ type coverInfo struct {
 }
 
 // loadTestFuncs returns the testFuncs describing the tests that will be run.
+// The returned testFuncs is always non-nil, even if an error occurred while
+// processing test files.
 func loadTestFuncs(ptest *Package) (*testFuncs, error) {
        t := &testFuncs{
                Package: ptest,
        }
+       var err error
        for _, file := range ptest.TestGoFiles {
-               if err := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); err != nil {
-                       return nil, err
+               if lerr := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); lerr != nil && err == nil {
+                       err = lerr
                }
        }
        for _, file := range ptest.XTestGoFiles {
-               if err := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); err != nil {
-                       return nil, err
+               if lerr := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); lerr != nil && err == nil {
+                       err = lerr
                }
        }
-       return t, nil
+       return t, err
+}
+
+// formatTestinginit returns the content of the _testinginit.go file for p.
+func formatTestinginit(p *Package) []byte {
+       var buf bytes.Buffer
+       if err := testinginitTmpl.Execute(&buf, p); err != nil {
+               panic("testinginit template execution failed") // shouldn't be possible
+       }
+       return buf.Bytes()
 }
 
 // formatTestmain returns the content of the _testmain.go file for t.
@@ -565,7 +623,26 @@ func checkTestFunc(fn *ast.FuncDecl, arg string) error {
        return nil
 }
 
-var testmainTmpl = template.Must(template.New("main").Parse(`
+var testinginitTmpl = lazytemplate.New("init", `
+package {{.Name}}
+
+import _go_testing "testing"
+
+{{/*
+Call testing.Init before any other user initialization code runs.
+(This file is passed to the compiler first.)
+This provides the illusion of the old behavior where testing flags
+were registered as part of the testing package's initialization.
+*/}}
+var _ = func() bool {
+       _go_testing.Init()
+       return true
+}()
+`)
+
+var testmainTmpl = lazytemplate.New("main", `
+// Code generated by 'go test'. DO NOT EDIT.
+
 package main
 
 import (
@@ -666,4 +743,4 @@ func main() {
 {{end}}
 }
 
-`))
+`)
index aa67093a48aad68cb7adff8dc99c718a3032d88f..581a978ef8e632b7aa7a4eb75ceb305866be05a5 100644 (file)
@@ -159,7 +159,9 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
        f2 := mustOpen(t, f.Name())
        defer f2.Close()
 
-       if runtime.GOOS == "solaris" || runtime.GOOS == "aix" {
+       doUnlockTF := false
+       switch runtime.GOOS {
+       case "aix", "illumos", "solaris":
                // When using POSIX locks (as on Solaris), we can't safely read-lock the
                // same inode through two different descriptors at the same time: when the
                // first descriptor is closed, the second descriptor would still be open but
@@ -167,8 +169,9 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
                lockF2 := mustBlock(t, "RLock", f2)
                unlock(t, f)
                lockF2(t)
-       } else {
+       default:
                rLock(t, f2)
+               doUnlockTF = true
        }
 
        other := mustOpen(t, f.Name())
@@ -176,7 +179,7 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
        lockOther := mustBlock(t, "Lock", other)
 
        unlock(t, f2)
-       if runtime.GOOS != "solaris" && runtime.GOOS != "aix" {
+       if doUnlockTF {
                unlock(t, f)
        }
        lockOther(t)
index 17f3751c371694d60001bc13775129d557198316..180a36c62016ba045f1829680e91182ac6d716a7 100644 (file)
@@ -7,6 +7,7 @@ package lockedfile
 import (
        "fmt"
        "os"
+       "sync"
 )
 
 // A Mutex provides mutual exclusion within and across processes by locking a
@@ -21,7 +22,8 @@ import (
 // must not be copied after first use. The Path field must be set before first
 // use and must not be change thereafter.
 type Mutex struct {
-       Path string // The path to the well-known lock file. Must be non-empty.
+       Path string     // The path to the well-known lock file. Must be non-empty.
+       mu   sync.Mutex // A redundant mutex. The race detector doesn't know about file locking, so in tests we may need to lock something that it understands.
 }
 
 // MutexAt returns a new Mutex with Path set to the given non-empty path.
@@ -56,5 +58,10 @@ func (mu *Mutex) Lock() (unlock func(), err error) {
        if err != nil {
                return nil, err
        }
-       return func() { f.Close() }, nil
+       mu.mu.Lock()
+
+       return func() {
+               mu.mu.Unlock()
+               f.Close()
+       }, nil
 }
index bbaba444f507f64c5ca647f559894a08b10eae5d..71b660d6fde326e7f468794db4a5f1c8673fff43 100644 (file)
@@ -5,13 +5,15 @@
 package modcmd
 
 import (
+       "cmd/go/internal/cfg"
+       "encoding/json"
+       "os"
+
        "cmd/go/internal/base"
        "cmd/go/internal/modfetch"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
-       "encoding/json"
-       "os"
 )
 
 var cmdDownload = &base.Command{
@@ -66,6 +68,13 @@ type moduleJSON struct {
 }
 
 func runDownload(cmd *base.Command, args []string) {
+       // Check whether modules are enabled and whether we're in a module.
+       if cfg.Getenv("GO111MODULE") == "off" {
+               base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'")
+       }
+       if !modload.HasModRoot() && len(args) == 0 {
+               base.Fatalf("go mod download: no modules specified (see 'go help mod download')")
+       }
        if len(args) == 0 {
                args = []string{"all"}
        }
index 5066e4ddf75f97394c44549dda8113f72f7ca32e..1be8b7cb2fbbdf41d1277c7d338ec6787ca65c55 100644 (file)
@@ -385,7 +385,9 @@ type replaceJSON struct {
 // editPrintJSON prints the -json output.
 func editPrintJSON(modFile *modfile.File) {
        var f fileJSON
-       f.Module = modFile.Module.Mod
+       if modFile.Module != nil {
+               f.Module = modFile.Module.Mod
+       }
        if modFile.Go != nil {
                f.Go = modFile.Go.Version
        }
index 5825c6d8ca8e0b5478e8db2337278dd1f0811a96..8fcb84f2801e658a7441e186b207a72d5c9685a6 100644 (file)
@@ -8,6 +8,7 @@ package modcmd
 
 import (
        "bufio"
+       "cmd/go/internal/cfg"
        "os"
        "sort"
 
@@ -33,6 +34,14 @@ func runGraph(cmd *base.Command, args []string) {
        if len(args) > 0 {
                base.Fatalf("go mod graph: graph takes no arguments")
        }
+       // Checks go mod expected behavior
+       if !modload.Enabled() {
+               if cfg.Getenv("GO111MODULE") == "off" {
+                       base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'")
+               } else {
+                       base.Fatalf("go: cannot find main module; see 'go help modules'")
+               }
+       }
        modload.LoadBuildList()
 
        reqs := modload.MinReqs()
index 0f7421e5849f2f934c94ece4e58ff1793e1161f1..b94453bab0cf623208524f6c79c3e15c52515cdc 100644 (file)
@@ -35,6 +35,9 @@ func runInit(cmd *base.Command, args []string) {
        if len(args) == 1 {
                modload.CmdModModule = args[0]
        }
+       if os.Getenv("GO111MODULE") == "off" {
+               base.Fatalf("go mod init: modules disabled by GO111MODULE=off; see 'go help modules'")
+       }
        if _, err := os.Stat("go.mod"); err == nil {
                base.Fatalf("go mod init: go.mod already exists")
        }
index b70f25cec3952f6a515d82d08f45a8e3e58cb4a0..75513f1d9ca99138ada1f9bc7167dd5bfa2a5a78 100644 (file)
@@ -11,10 +11,12 @@ import (
        "io/ioutil"
        "os"
        "path/filepath"
+       "sort"
        "strings"
 
        "cmd/go/internal/base"
        "cmd/go/internal/cfg"
+       "cmd/go/internal/imports"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
 )
@@ -71,6 +73,7 @@ func runVendor(cmd *base.Command, args []string) {
                        if cfg.BuildV {
                                fmt.Fprintf(os.Stderr, "# %s %s%s\n", m.Path, m.Version, repl)
                        }
+                       sort.Strings(pkgs)
                        for _, pkg := range pkgs {
                                fmt.Fprintf(&buf, "%s\n", pkg)
                                if cfg.BuildV {
@@ -100,7 +103,7 @@ func vendorPkg(vdir, pkg string) {
        if src == "" {
                fmt.Fprintf(os.Stderr, "internal error: no pkg for %s -> %s\n", pkg, realPath)
        }
-       copyDir(dst, src, matchNonTest)
+       copyDir(dst, src, matchPotentialSourceFile)
        if m := modload.PackageModule(realPath); m.Path != "" {
                copyMetadata(m.Path, realPath, dst, src)
        }
@@ -153,7 +156,7 @@ var metaPrefixes = []string{
 }
 
 // matchMetadata reports whether info is a metadata file.
-func matchMetadata(info os.FileInfo) bool {
+func matchMetadata(dir string, info os.FileInfo) bool {
        name := info.Name()
        for _, p := range metaPrefixes {
                if strings.HasPrefix(name, p) {
@@ -163,13 +166,34 @@ func matchMetadata(info os.FileInfo) bool {
        return false
 }
 
-// matchNonTest reports whether info is any non-test file (including non-Go files).
-func matchNonTest(info os.FileInfo) bool {
-       return !strings.HasSuffix(info.Name(), "_test.go")
+// matchPotentialSourceFile reports whether info may be relevant to a build operation.
+func matchPotentialSourceFile(dir string, info os.FileInfo) bool {
+       if strings.HasSuffix(info.Name(), "_test.go") {
+               return false
+       }
+       if strings.HasSuffix(info.Name(), ".go") {
+               f, err := os.Open(filepath.Join(dir, info.Name()))
+               if err != nil {
+                       base.Fatalf("go mod vendor: %v", err)
+               }
+               defer f.Close()
+
+               content, err := imports.ReadImports(f, false, nil)
+               if err == nil && !imports.ShouldBuild(content, imports.AnyTags()) {
+                       // The file is explicitly tagged "ignore", so it can't affect the build.
+                       // Leave it out.
+                       return false
+               }
+               return true
+       }
+
+       // We don't know anything about this file, so optimistically assume that it is
+       // needed.
+       return true
 }
 
 // copyDir copies all regular files satisfying match(info) from src to dst.
-func copyDir(dst, src string, match func(os.FileInfo) bool) {
+func copyDir(dst, src string, match func(dir string, info os.FileInfo) bool) {
        files, err := ioutil.ReadDir(src)
        if err != nil {
                base.Fatalf("go mod vendor: %v", err)
@@ -178,7 +202,7 @@ func copyDir(dst, src string, match func(os.FileInfo) bool) {
                base.Fatalf("go mod vendor: %v", err)
        }
        for _, file := range files {
-               if file.IsDir() || !file.Mode().IsRegular() || !match(file) {
+               if file.IsDir() || !file.Mode().IsRegular() || !match(src, file) {
                        continue
                }
                r, err := os.Open(filepath.Join(src, file.Name()))
index 381c18d58f1f607590599271160ffa0b42a37409..81fc44dc97ae609cffc8e43b56ddaa1d9435f9e4 100644 (file)
@@ -6,6 +6,7 @@ package modcmd
 
 import (
        "bytes"
+       "cmd/go/internal/cfg"
        "fmt"
        "io/ioutil"
        "os"
@@ -36,6 +37,14 @@ func runVerify(cmd *base.Command, args []string) {
                // NOTE(rsc): Could take a module pattern.
                base.Fatalf("go mod verify: verify takes no arguments")
        }
+       // Checks go mod expected behavior
+       if !modload.Enabled() {
+               if cfg.Getenv("GO111MODULE") == "off" {
+                       base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'")
+               } else {
+                       base.Fatalf("go: cannot find main module; see 'go help modules'")
+               }
+       }
        ok := true
        for _, mod := range modload.LoadBuildList()[1:] {
                ok = verifyMod(mod) && ok
index 6fc6718e4733aee72208614e68e2382cf1ba0273..558664a8b38616753203316b0e259716ac38bfc5 100644 (file)
@@ -41,19 +41,29 @@ func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error {
 
        // Convert requirements block, which may use raw SHA1 hashes as versions,
        // to valid semver requirement list, respecting major versions.
-       var work par.Work
+       var (
+               work    par.Work
+               mu      sync.Mutex
+               need    = make(map[string]string)
+               replace = make(map[string]*modfile.Replace)
+       )
+
+       for _, r := range mf.Replace {
+               replace[r.New.Path] = r
+               replace[r.Old.Path] = r
+       }
        for _, r := range mf.Require {
                m := r.Mod
                if m.Path == "" {
                        continue
                }
+               if re, ok := replace[m.Path]; ok {
+                       work.Add(re.New)
+                       continue
+               }
                work.Add(r.Mod)
        }
 
-       var (
-               mu   sync.Mutex
-               need = make(map[string]string)
-       )
        work.Do(10, func(item interface{}) {
                r := item.(module.Version)
                repo, info, err := modfetch.ImportRepoRev(r.Path, r.Version)
@@ -76,15 +86,15 @@ func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error {
        }
        sort.Strings(paths)
        for _, path := range paths {
+               if re, ok := replace[path]; ok {
+                       err := f.AddReplace(re.Old.Path, re.Old.Version, path, need[path])
+                       if err != nil {
+                               return fmt.Errorf("add replace: %v", err)
+                       }
+               }
                f.AddNewRequire(path, need[path], false)
        }
 
-       for _, r := range mf.Replace {
-               err := f.AddReplace(r.Old.Path, r.Old.Version, r.New.Path, r.New.Version)
-               if err != nil {
-                       return fmt.Errorf("add replace: %v", err)
-               }
-       }
        f.Cleanup()
        return nil
 }
index 4d55d73f21423646a8f0f57d0d84389348d4eaa6..8ff229bd148578c2a557da7827d963eed2269af2 100644 (file)
@@ -28,6 +28,8 @@ func TestMain(m *testing.M) {
 }
 
 func testMain(m *testing.M) int {
+       cfg.GOPROXY = "direct"
+
        if _, err := exec.LookPath("git"); err != nil {
                fmt.Fprintln(os.Stderr, "skipping because git binary not found")
                fmt.Println("PASS")
@@ -104,11 +106,11 @@ func TestConvertLegacyConfig(t *testing.T) {
                                github.com/AdRoll/goamz v0.0.0-20150130162828-d3664b76d905
                                github.com/MSOpenTech/azure-sdk-for-go v0.0.0-20150323223030-d90753bcad2e
                                github.com/Sirupsen/logrus v0.7.3
-                               github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd
+                               github.com/bugsnag/bugsnag-go v1.0.3-0.20141110184014-b1d153021fcd
                                github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b
                                github.com/bugsnag/panicwrap v0.0.0-20141110184334-e5f9854865b9
-                               github.com/codegangsta/cli v0.0.0-20150131031259-6086d7927ec3
-                               github.com/docker/docker v0.0.0-20150204013315-165ea5c158cf
+                               github.com/codegangsta/cli v1.4.2-0.20150131031259-6086d7927ec3
+                               github.com/docker/docker v1.4.2-0.20150204013315-165ea5c158cf
                                github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1
                                github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7
                                github.com/gorilla/context v0.0.0-20140604161150-14f550f51af5
@@ -116,7 +118,7 @@ func TestConvertLegacyConfig(t *testing.T) {
                                github.com/gorilla/mux v0.0.0-20140926153814-e444e69cbd2e
                                github.com/jlhawn/go-crypto v0.0.0-20150401213827-cd738dde20f0
                                github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43
-                               github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50
+                               github.com/yvasiyarov/gorelic v0.0.7-0.20141212073537-a9bba5b9ab50
                                github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f
                                golang.org/x/net v0.0.0-20150202051010-1dfe7915deaf
                                gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789
@@ -126,7 +128,7 @@ func TestConvertLegacyConfig(t *testing.T) {
 
                {
                        // golang.org/issue/24585 - confusion about v2.0.0 tag in legacy non-v2 module
-                       "github.com/fishy/gcsbucket", "v0.0.0-20150410205453-618d60fe84e0",
+                       "github.com/fishy/gcsbucket", "v0.0.0-20180217031846-618d60fe84e0",
                        `module github.com/fishy/gcsbucket
 
                        require (
@@ -136,7 +138,7 @@ func TestConvertLegacyConfig(t *testing.T) {
                                github.com/googleapis/gax-go v2.0.0+incompatible
                                golang.org/x/net v0.0.0-20180216171745-136a25c244d3
                                golang.org/x/oauth2 v0.0.0-20180207181906-543e37812f10
-                               golang.org/x/text v0.0.0-20180208041248-4e4a3210bb54
+                               golang.org/x/text v0.3.1-0.20180208041248-4e4a3210bb54
                                google.golang.org/api v0.0.0-20180217000815-c7a403bb5fe1
                                google.golang.org/appengine v1.0.0
                                google.golang.org/genproto v0.0.0-20180206005123-2b5a72b8730b
index 690c206a1364e829e263096ae5422162b0fd41d7..ccd1fc7b7594ff6af0e2d2d90c207cbcb7afed94 100644 (file)
@@ -6,6 +6,9 @@ package modconv
 
 import (
        "fmt"
+       "internal/lazyregexp"
+       "net/url"
+       "path"
        "strconv"
        "strings"
 
@@ -15,9 +18,14 @@ import (
 )
 
 func ParseGopkgLock(file string, data []byte) (*modfile.File, error) {
+       type pkg struct {
+               Path    string
+               Version string
+               Source  string
+       }
        mf := new(modfile.File)
-       var list []module.Version
-       var r *module.Version
+       var list []pkg
+       var r *pkg
        for lineno, line := range strings.Split(string(data), "\n") {
                lineno++
                if i := strings.Index(line, "#"); i >= 0 {
@@ -25,7 +33,7 @@ func ParseGopkgLock(file string, data []byte) (*modfile.File, error) {
                }
                line = strings.TrimSpace(line)
                if line == "[[projects]]" {
-                       list = append(list, module.Version{})
+                       list = append(list, pkg{})
                        r = &list[len(list)-1]
                        continue
                }
@@ -52,6 +60,8 @@ func ParseGopkgLock(file string, data []byte) (*modfile.File, error) {
                switch key {
                case "name":
                        r.Path = val
+               case "source":
+                       r.Source = val
                case "revision", "version":
                        // Note: key "version" should take priority over "revision",
                        // and it does, because dep writes toml keys in alphabetical order,
@@ -68,7 +78,55 @@ func ParseGopkgLock(file string, data []byte) (*modfile.File, error) {
                if r.Path == "" || r.Version == "" {
                        return nil, fmt.Errorf("%s: empty [[projects]] stanza (%s)", file, r.Path)
                }
-               mf.Require = append(mf.Require, &modfile.Require{Mod: r})
+               mf.Require = append(mf.Require, &modfile.Require{Mod: module.Version{Path: r.Path, Version: r.Version}})
+
+               if r.Source != "" {
+                       // Convert "source" to import path, such as
+                       // git@test.com:x/y.git and https://test.com/x/y.git.
+                       // We get "test.com/x/y" at last.
+                       source, err := decodeSource(r.Source)
+                       if err != nil {
+                               return nil, err
+                       }
+                       old := module.Version{Path: r.Path, Version: r.Version}
+                       new := module.Version{Path: source, Version: r.Version}
+                       mf.Replace = append(mf.Replace, &modfile.Replace{Old: old, New: new})
+               }
        }
        return mf, nil
 }
+
+var scpSyntaxReg = lazyregexp.New(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`)
+
+func decodeSource(source string) (string, error) {
+       var u *url.URL
+       var p string
+       if m := scpSyntaxReg.FindStringSubmatch(source); m != nil {
+               // Match SCP-like syntax and convert it to a URL.
+               // Eg, "git@github.com:user/repo" becomes
+               // "ssh://git@github.com/user/repo".
+               u = &url.URL{
+                       Scheme: "ssh",
+                       User:   url.User(m[1]),
+                       Host:   m[2],
+                       Path:   "/" + m[3],
+               }
+       } else {
+               var err error
+               u, err = url.Parse(source)
+               if err != nil {
+                       return "", fmt.Errorf("%q is not a valid URI", source)
+               }
+       }
+
+       // If no scheme was passed, then the entire path will have been put into
+       // u.Path. Either way, construct the normalized path correctly.
+       if u.Host == "" {
+               p = source
+       } else {
+               p = path.Join(u.Host, u.Path)
+       }
+       p = strings.TrimSuffix(p, ".git")
+       p = strings.TrimSuffix(p, ".hg")
+       return p, nil
+}
index 3bc675fcc0eb4bad6455ef14367659b118d6348a..18ab57814deb595e49714a6448de64d8b0ca1a71 100644 (file)
@@ -15,8 +15,7 @@ func ParseGlideLock(file string, data []byte) (*modfile.File, error) {
        mf := new(modfile.File)
        imports := false
        name := ""
-       for lineno, line := range strings.Split(string(data), "\n") {
-               lineno++
+       for _, line := range strings.Split(string(data), "\n") {
                if line == "" {
                        continue
                }
index 1b786a939c760cf2aff39544c96698fae9c5e37a..164a8e70d995541c83c616946a01ec2ba7f9a377 100644 (file)
@@ -13,8 +13,7 @@ import (
 
 func ParseGLOCKFILE(file string, data []byte) (*modfile.File, error) {
        mf := new(modfile.File)
-       for lineno, line := range strings.Split(string(data), "\n") {
-               lineno++
+       for _, line := range strings.Split(string(data), "\n") {
                f := strings.Fields(line)
                if len(f) >= 2 && f[0] != "cmd" {
                        mf.Require = append(mf.Require, &modfile.Require{Mod: module.Version{Path: f[0], Version: f[1]}})
index 353161bc5a3c613182daa9cc6416c86729ef647f..ccc4f3d576f6c591ab9db5f1f92a53e566e8bfb9 100644 (file)
@@ -58,6 +58,9 @@ func Test(t *testing.T) {
                        for _, r := range out.Require {
                                fmt.Fprintf(&buf, "%s %s\n", r.Mod.Path, r.Mod.Version)
                        }
+                       for _, r := range out.Replace {
+                               fmt.Fprintf(&buf, "replace: %s %s %s %s\n", r.Old.Path, r.Old.Version, r.New.Path, r.New.Version)
+                       }
                        if !bytes.Equal(buf.Bytes(), want) {
                                t.Errorf("have:\n%s\nwant:\n%s", buf.Bytes(), want)
                        }
index feba181e052252ed2b2c8cbe7e032080792b802f..106cddedd395760e3a061dbedf96ba81b2304abf 100644 (file)
@@ -13,8 +13,7 @@ import (
 
 func ParseDependenciesTSV(file string, data []byte) (*modfile.File, error) {
        mf := new(modfile.File)
-       for lineno, line := range strings.Split(string(data), "\n") {
-               lineno++
+       for _, line := range strings.Split(string(data), "\n") {
                f := strings.Split(line, "\t")
                if len(f) >= 3 {
                        mf.Require = append(mf.Require, &modfile.Require{Mod: module.Version{Path: f[0], Version: f[2]}})
index a9a8e62518f279e546300a6503f78e4b4cf30e51..f62eba77621d20c215b8ff267c23bb4fc39929dd 100644 (file)
@@ -13,8 +13,7 @@ import (
 
 func ParseVendorConf(file string, data []byte) (*modfile.File, error) {
        mf := new(modfile.File)
-       for lineno, line := range strings.Split(string(data), "\n") {
-               lineno++
+       for _, line := range strings.Split(string(data), "\n") {
                if i := strings.Index(line, "#"); i >= 0 {
                        line = line[:i]
                }
index 0f017a3c7a6b3109c0cd20c862e0436a3ff1812e..8a06519932c294deaa0f4bbf6a9189fc1ec3824f 100644 (file)
@@ -15,8 +15,7 @@ func ParseVendorYML(file string, data []byte) (*modfile.File, error) {
        mf := new(modfile.File)
        vendors := false
        path := ""
-       for lineno, line := range strings.Split(string(data), "\n") {
-               lineno++
+       for _, line := range strings.Split(string(data), "\n") {
                if line == "" {
                        continue
                }
diff --git a/libgo/go/cmd/go/internal/modfetch/bootstrap.go b/libgo/go/cmd/go/internal/modfetch/bootstrap.go
new file mode 100644 (file)
index 0000000..8f31589
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build cmd_go_bootstrap
+
+package modfetch
+
+import "cmd/go/internal/module"
+
+func useSumDB(mod module.Version) bool {
+       return false
+}
+
+func lookupSumDB(mod module.Version) (string, []string, error) {
+       panic("bootstrap")
+}
index 1ccd43dc2ae845d859f2c2d9447c00ed8003ca1a..c0062809d172de0008125120bd7ffbd05da8abf3 100644 (file)
@@ -15,6 +15,7 @@ import (
        "strings"
 
        "cmd/go/internal/base"
+       "cmd/go/internal/cfg"
        "cmd/go/internal/lockedfile"
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/module"
@@ -215,29 +216,21 @@ func (r *cachingRepo) Latest() (*RevInfo, error) {
        return &info, nil
 }
 
-func (r *cachingRepo) GoMod(rev string) ([]byte, error) {
+func (r *cachingRepo) GoMod(version string) ([]byte, error) {
        type cached struct {
                text []byte
                err  error
        }
-       c := r.cache.Do("gomod:"+rev, func() interface{} {
-               file, text, err := readDiskGoMod(r.path, rev)
+       c := r.cache.Do("gomod:"+version, func() interface{} {
+               file, text, err := readDiskGoMod(r.path, version)
                if err == nil {
                        // Note: readDiskGoMod already called checkGoMod.
                        return cached{text, nil}
                }
 
-               // Convert rev to canonical version
-               // so that we use the right identifier in the go.sum check.
-               info, err := r.Stat(rev)
-               if err != nil {
-                       return cached{nil, err}
-               }
-               rev = info.Version
-
-               text, err = r.r.GoMod(rev)
+               text, err = r.r.GoMod(version)
                if err == nil {
-                       checkGoMod(r.path, rev, text)
+                       checkGoMod(r.path, version, text)
                        if err := writeDiskGoMod(file, text); err != nil {
                                fmt.Fprintf(os.Stderr, "go: writing go.mod cache: %v\n", err)
                        }
@@ -258,12 +251,12 @@ func (r *cachingRepo) Zip(dst io.Writer, version string) error {
 // Stat is like Lookup(path).Stat(rev) but avoids the
 // repository path resolution in Lookup if the result is
 // already cached on local disk.
-func Stat(path, rev string) (*RevInfo, error) {
+func Stat(proxy, path, rev string) (*RevInfo, error) {
        _, info, err := readDiskStat(path, rev)
        if err == nil {
                return info, nil
        }
-       repo, err := Lookup(path)
+       repo, err := Lookup(proxy, path)
        if err != nil {
                return nil, err
        }
@@ -276,9 +269,22 @@ func InfoFile(path, version string) (string, error) {
        if !semver.IsValid(version) {
                return "", fmt.Errorf("invalid version %q", version)
        }
-       if _, err := Stat(path, version); err != nil {
+
+       if file, _, err := readDiskStat(path, version); err == nil {
+               return file, nil
+       }
+
+       err := TryProxies(func(proxy string) error {
+               repo, err := Lookup(proxy, path)
+               if err == nil {
+                       _, err = repo.Stat(version)
+               }
+               return err
+       })
+       if err != nil {
                return "", err
        }
+
        // Stat should have populated the disk cache for us.
        file, _, err := readDiskStat(path, version)
        if err != nil {
@@ -294,21 +300,39 @@ func GoMod(path, rev string) ([]byte, error) {
        // Convert commit hash to pseudo-version
        // to increase cache hit rate.
        if !semver.IsValid(rev) {
-               info, err := Stat(path, rev)
-               if err != nil {
-                       return nil, err
+               if _, info, err := readDiskStat(path, rev); err == nil {
+                       rev = info.Version
+               } else {
+                       err := TryProxies(func(proxy string) error {
+                               repo, err := Lookup(proxy, path)
+                               if err != nil {
+                                       return err
+                               }
+                               info, err := repo.Stat(rev)
+                               if err == nil {
+                                       rev = info.Version
+                               }
+                               return err
+                       })
+                       if err != nil {
+                               return nil, err
+                       }
                }
-               rev = info.Version
        }
+
        _, data, err := readDiskGoMod(path, rev)
        if err == nil {
                return data, nil
        }
-       repo, err := Lookup(path)
-       if err != nil {
-               return nil, err
-       }
-       return repo.GoMod(rev)
+
+       err = TryProxies(func(proxy string) error {
+               repo, err := Lookup(proxy, path)
+               if err == nil {
+                       data, err = repo.GoMod(rev)
+               }
+               return err
+       })
+       return data, err
 }
 
 // GoModFile is like GoMod but returns the name of the file containing
@@ -354,8 +378,29 @@ var errNotCached = fmt.Errorf("not in cache")
 func readDiskStat(path, rev string) (file string, info *RevInfo, err error) {
        file, data, err := readDiskCache(path, rev, "info")
        if err != nil {
-               if file, info, err := readDiskStatByHash(path, rev); err == nil {
-                       return file, info, nil
+               // If the cache already contains a pseudo-version with the given hash, we
+               // would previously return that pseudo-version without checking upstream.
+               // However, that produced an unfortunate side-effect: if the author added a
+               // tag to the repository, 'go get' would not pick up the effect of that new
+               // tag on the existing commits, and 'go' commands that referred to those
+               // commits would use the previous name instead of the new one.
+               //
+               // That's especially problematic if the original pseudo-version starts with
+               // v0.0.0-, as was the case for all pseudo-versions during vgo development,
+               // since a v0.0.0- pseudo-version has lower precedence than pretty much any
+               // tagged version.
+               //
+               // In practice, we're only looking up by hash during initial conversion of a
+               // legacy config and during an explicit 'go get', and a little extra latency
+               // for those operations seems worth the benefit of picking up more accurate
+               // versions.
+               //
+               // Fall back to this resolution scheme only if the GOPROXY setting prohibits
+               // us from resolving upstream tags.
+               if cfg.GOPROXY == "off" {
+                       if file, info, err := readDiskStatByHash(path, rev); err == nil {
+                               return file, info, nil
+                       }
                }
                return file, nil, err
        }
@@ -405,13 +450,23 @@ func readDiskStatByHash(path, rev string) (file string, info *RevInfo, err error
        if err != nil {
                return "", nil, errNotCached
        }
+
+       // A given commit hash may map to more than one pseudo-version,
+       // depending on which tags are present on the repository.
+       // Take the highest such version.
+       var maxVersion string
        suffix := "-" + rev + ".info"
+       err = errNotCached
        for _, name := range names {
-               if strings.HasSuffix(name, suffix) && IsPseudoVersion(strings.TrimSuffix(name, ".info")) {
-                       return readDiskStat(path, strings.TrimSuffix(name, ".info"))
+               if strings.HasSuffix(name, suffix) {
+                       v := strings.TrimSuffix(name, ".info")
+                       if IsPseudoVersion(v) && semver.Max(maxVersion, v) == v {
+                               maxVersion = v
+                               file, info, err = readDiskStat(path, strings.TrimSuffix(name, ".info"))
+                       }
                }
        }
-       return "", nil, errNotCached
+       return file, info, err
 }
 
 // oldVgoPrefix is the prefix in the old auto-generated cached go.mod files.
@@ -451,7 +506,7 @@ func readDiskCache(path, rev, suffix string) (file string, data []byte, err erro
        if err != nil {
                return "", nil, errNotCached
        }
-       data, err = ioutil.ReadFile(file)
+       data, err = renameio.ReadFile(file)
        if err != nil {
                return file, nil, errNotCached
        }
@@ -488,7 +543,7 @@ func writeDiskCache(file string, data []byte) error {
                return err
        }
 
-       if err := renameio.WriteFile(file, data); err != nil {
+       if err := renameio.WriteFile(file, data, 0666); err != nil {
                return err
        }
 
@@ -545,12 +600,12 @@ func rewriteVersionList(dir string) {
                buf.WriteString(v)
                buf.WriteString("\n")
        }
-       old, _ := ioutil.ReadFile(listFile)
+       old, _ := renameio.ReadFile(listFile)
        if bytes.Equal(buf.Bytes(), old) {
                return
        }
 
-       if err := renameio.WriteFile(listFile, buf.Bytes()); err != nil {
+       if err := renameio.WriteFile(listFile, buf.Bytes(), 0666); err != nil {
                base.Fatalf("go: failed to write version list: %v", err)
        }
 }
index 6c17f7886f19e5aea14f17675eb6772dd28156ae..a4e50d692a329c8ada084dd93b30af9993b59f3b 100644 (file)
@@ -79,14 +79,16 @@ type Repo interface {
        // nested in a single top-level directory, whose name is not specified.
        ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, actualSubdir string, err error)
 
-       // RecentTag returns the most recent tag at or before the given rev
-       // with the given prefix. It should make a best-effort attempt to
-       // find a tag that is a valid semantic version (following the prefix),
-       // or else the result is not useful to the caller, but it need not
-       // incur great expense in doing so. For example, the git implementation
-       // of RecentTag limits git's search to tags matching the glob expression
-       // "v[0-9]*.[0-9]*.[0-9]*" (after the prefix).
-       RecentTag(rev, prefix string) (tag string, err error)
+       // RecentTag returns the most recent tag on rev or one of its predecessors
+       // with the given prefix and major version.
+       // An empty major string matches any major version.
+       RecentTag(rev, prefix, major string) (tag string, err error)
+
+       // DescendsFrom reports whether rev or any of its ancestors has the given tag.
+       //
+       // DescendsFrom must return true for any tag returned by RecentTag for the
+       // same revision.
+       DescendsFrom(rev, tag string) (bool, error)
 }
 
 // A Rev describes a single revision in a source code repository.
@@ -105,6 +107,32 @@ type FileRev struct {
        Err  error  // error if any; os.IsNotExist(Err)==true if rev exists but file does not exist in that rev
 }
 
+// UnknownRevisionError is an error equivalent to os.ErrNotExist, but for a
+// revision rather than a file.
+type UnknownRevisionError struct {
+       Rev string
+}
+
+func (e *UnknownRevisionError) Error() string {
+       return "unknown revision " + e.Rev
+}
+func (UnknownRevisionError) Is(err error) bool {
+       return err == os.ErrNotExist
+}
+
+// ErrNoCommits is an error equivalent to os.ErrNotExist indicating that a given
+// repository or module contains no commits.
+var ErrNoCommits error = noCommitsError{}
+
+type noCommitsError struct{}
+
+func (noCommitsError) Error() string {
+       return "no commits"
+}
+func (noCommitsError) Is(err error) bool {
+       return err == os.ErrNotExist
+}
+
 // AllHex reports whether the revision rev is entirely lower-case hexadecimal digits.
 func AllHex(rev string) bool {
        for i := 0; i < len(rev); i++ {
index 588e7496cc50362ddbce4304d84fc36a8311d970..d382e8ac9a9232c7ff5f7ac006eb39918ccabf66 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io"
        "io/ioutil"
        "os"
+       "os/exec"
        "path/filepath"
        "sort"
        "strconv"
@@ -19,6 +20,7 @@ import (
 
        "cmd/go/internal/lockedfile"
        "cmd/go/internal/par"
+       "cmd/go/internal/semver"
 )
 
 // GitRepo returns the code repository at the given Git remote reference.
@@ -32,7 +34,7 @@ func LocalGitRepo(remote string) (Repo, error) {
        return newGitRepoCached(remote, true)
 }
 
-const gitWorkDirType = "git2"
+const gitWorkDirType = "git3"
 
 var gitRepoCache par.Cache
 
@@ -79,7 +81,7 @@ func newGitRepo(remote string, localOK bool) (Repo, error) {
                        // but this lets us say git fetch origin instead, which
                        // is a little nicer. More importantly, using a named remote
                        // avoids a problem with Git LFS. See golang.org/issue/25605.
-                       if _, err := Run(r.dir, "git", "remote", "add", "origin", r.remote); err != nil {
+                       if _, err := Run(r.dir, "git", "remote", "add", "origin", "--", r.remote); err != nil {
                                os.RemoveAll(r.dir)
                                return nil, err
                        }
@@ -122,8 +124,10 @@ type gitRepo struct {
        statCache par.Cache
 
        refsOnce sync.Once
-       refs     map[string]string
-       refsErr  error
+       // refs maps branch and tag refs (e.g., "HEAD", "refs/heads/master")
+       // to commits (e.g., "37ffd2e798afde829a34e8955b716ab730b2a6d6")
+       refs    map[string]string
+       refsErr error
 
        localTagsOnce sync.Once
        localTags     map[string]bool
@@ -166,7 +170,7 @@ func (r *gitRepo) loadRefs() {
        if err != nil {
                if rerr, ok := err.(*RunError); ok {
                        if bytes.Contains(rerr.Stderr, []byte("fatal: could not read Username")) {
-                               rerr.HelpText = "If this is a private repository, see https://golang.org/doc/faq#git_https for additional information."
+                               rerr.HelpText = "Confirm the import path was entered correctly.\nIf this is a private repository, see https://golang.org/doc/faq#git_https for additional information."
                        }
                }
                r.refsErr = err
@@ -218,7 +222,7 @@ func (r *gitRepo) Latest() (*RevInfo, error) {
                return nil, r.refsErr
        }
        if r.refs["HEAD"] == "" {
-               return nil, fmt.Errorf("no commits")
+               return nil, ErrNoCommits
        }
        return r.Stat(r.refs["HEAD"])
 }
@@ -315,7 +319,7 @@ func (r *gitRepo) stat(rev string) (*RevInfo, error) {
                        hash = rev
                }
        } else {
-               return nil, fmt.Errorf("unknown revision %s", rev)
+               return nil, &UnknownRevisionError{Rev: rev}
        }
 
        // Protect r.fetchLevel and the "fetch more and more" sequence.
@@ -339,8 +343,14 @@ func (r *gitRepo) stat(rev string) (*RevInfo, error) {
                }
        }
 
-       // If we know a specific commit we need, fetch it.
-       if r.fetchLevel <= fetchSome && hash != "" && !r.local {
+       // If we know a specific commit we need and its ref, fetch it.
+       // We do NOT fetch arbitrary hashes (when we don't know the ref)
+       // because we want to avoid ever importing a commit that isn't
+       // reachable from refs/tags/* or refs/heads/* or HEAD.
+       // Both Gerrit and GitHub expose every CL/PR as a named ref,
+       // and we don't want those commits masquerading as being real
+       // pseudo-versions in the main repo.
+       if r.fetchLevel <= fetchSome && ref != "" && hash != "" && !r.local {
                r.fetchLevel = fetchSome
                var refspec string
                if ref != "" && ref != "HEAD" {
@@ -369,17 +379,30 @@ func (r *gitRepo) stat(rev string) (*RevInfo, error) {
 
        // Last resort.
        // Fetch all heads and tags and hope the hash we want is in the history.
+       if err := r.fetchRefsLocked(); err != nil {
+               return nil, err
+       }
+
+       return r.statLocal(rev, rev)
+}
+
+// fetchRefsLocked fetches all heads and tags from the origin, along with the
+// ancestors of those commits.
+//
+// We only fetch heads and tags, not arbitrary other commits: we don't want to
+// pull in off-branch commits (such as rejected GitHub pull requests) that the
+// server may be willing to provide. (See the comments within the stat method
+// for more detail.)
+//
+// fetchRefsLocked requires that r.mu remain locked for the duration of the call.
+func (r *gitRepo) fetchRefsLocked() error {
        if r.fetchLevel < fetchAll {
-               // TODO(bcmills): should we wait to upgrade fetchLevel until after we check
-               // err? If there is a temporary server error, we want subsequent fetches to
-               // try again instead of proceeding with an incomplete repo.
-               r.fetchLevel = fetchAll
                if err := r.fetchUnshallow("refs/heads/*:refs/heads/*", "refs/tags/*:refs/tags/*"); err != nil {
-                       return nil, err
+                       return err
                }
+               r.fetchLevel = fetchAll
        }
-
-       return r.statLocal(rev, rev)
+       return nil
 }
 
 func (r *gitRepo) fetchUnshallow(refSpecs ...string) error {
@@ -400,9 +423,9 @@ func (r *gitRepo) fetchUnshallow(refSpecs ...string) error {
 // statLocal returns a RevInfo describing rev in the local git repository.
 // It uses version as info.Version.
 func (r *gitRepo) statLocal(version, rev string) (*RevInfo, error) {
-       out, err := Run(r.dir, "git", "-c", "log.showsignature=false", "log", "-n1", "--format=format:%H %ct %D", rev)
+       out, err := Run(r.dir, "git", "-c", "log.showsignature=false", "log", "-n1", "--format=format:%H %ct %D", rev, "--")
        if err != nil {
-               return nil, fmt.Errorf("unknown revision %s", rev)
+               return nil, &UnknownRevisionError{Rev: rev}
        }
        f := strings.Fields(string(out))
        if len(f) < 2 {
@@ -639,23 +662,48 @@ func (r *gitRepo) readFileRevs(tags []string, file string, fileMap map[string]*F
        return missing, nil
 }
 
-func (r *gitRepo) RecentTag(rev, prefix string) (tag string, err error) {
+func (r *gitRepo) RecentTag(rev, prefix, major string) (tag string, err error) {
        info, err := r.Stat(rev)
        if err != nil {
                return "", err
        }
        rev = info.Name // expand hash prefixes
 
-       // describe sets tag and err using 'git describe' and reports whether the
+       // describe sets tag and err using 'git for-each-ref' and reports whether the
        // result is definitive.
        describe := func() (definitive bool) {
                var out []byte
-               out, err = Run(r.dir, "git", "describe", "--first-parent", "--always", "--abbrev=0", "--match", prefix+"v[0-9]*.[0-9]*.[0-9]*", "--tags", rev)
+               out, err = Run(r.dir, "git", "for-each-ref", "--format", "%(refname)", "refs/tags", "--merged", rev)
                if err != nil {
-                       return true // Because we use "--always", describe should never fail.
+                       return true
+               }
+
+               // prefixed tags aren't valid semver tags so compare without prefix, but only tags with correct prefix
+               var highest string
+               for _, line := range strings.Split(string(out), "\n") {
+                       line = strings.TrimSpace(line)
+                       // git do support lstrip in for-each-ref format, but it was added in v2.13.0. Stripping here
+                       // instead gives support for git v2.7.0.
+                       if !strings.HasPrefix(line, "refs/tags/") {
+                               continue
+                       }
+                       line = line[len("refs/tags/"):]
+
+                       if !strings.HasPrefix(line, prefix) {
+                               continue
+                       }
+
+                       semtag := line[len(prefix):]
+                       // Consider only tags that are valid and complete (not just major.minor prefixes).
+                       if c := semver.Canonical(semtag); c != "" && strings.HasPrefix(semtag, c) && (major == "" || semver.Major(c) == major) {
+                               highest = semver.Max(highest, semtag)
+                       }
+               }
+
+               if highest != "" {
+                       tag = prefix + highest
                }
 
-               tag = string(bytes.TrimSpace(out))
                return tag != "" && !AllHex(tag)
        }
 
@@ -682,12 +730,8 @@ func (r *gitRepo) RecentTag(rev, prefix string) (tag string, err error) {
        }
        defer unlock()
 
-       if r.fetchLevel < fetchAll {
-               // Fetch all heads and tags and see if that gives us enough history.
-               if err := r.fetchUnshallow("refs/heads/*:refs/heads/*", "refs/tags/*:refs/tags/*"); err != nil {
-                       return "", err
-               }
-               r.fetchLevel = fetchAll
+       if err := r.fetchRefsLocked(); err != nil {
+               return "", err
        }
 
        // If we've reached this point, we have all of the commits that are reachable
@@ -704,6 +748,67 @@ func (r *gitRepo) RecentTag(rev, prefix string) (tag string, err error) {
        return tag, err
 }
 
+func (r *gitRepo) DescendsFrom(rev, tag string) (bool, error) {
+       // The "--is-ancestor" flag was added to "git merge-base" in version 1.8.0, so
+       // this won't work with Git 1.7.1. According to golang.org/issue/28550, cmd/go
+       // already doesn't work with Git 1.7.1, so at least it's not a regression.
+       //
+       // git merge-base --is-ancestor exits with status 0 if rev is an ancestor, or
+       // 1 if not.
+       _, err := Run(r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
+
+       // Git reports "is an ancestor" with exit code 0 and "not an ancestor" with
+       // exit code 1.
+       // Unfortunately, if we've already fetched rev with a shallow history, git
+       // merge-base has been observed to report a false-negative, so don't stop yet
+       // even if the exit code is 1!
+       if err == nil {
+               return true, nil
+       }
+
+       // See whether the tag and rev even exist.
+       tags, err := r.Tags(tag)
+       if err != nil {
+               return false, err
+       }
+       if len(tags) == 0 {
+               return false, nil
+       }
+
+       // NOTE: r.stat is very careful not to fetch commits that we shouldn't know
+       // about, like rejected GitHub pull requests, so don't try to short-circuit
+       // that here.
+       if _, err = r.stat(rev); err != nil {
+               return false, err
+       }
+
+       // Now fetch history so that git can search for a path.
+       unlock, err := r.mu.Lock()
+       if err != nil {
+               return false, err
+       }
+       defer unlock()
+
+       if r.fetchLevel < fetchAll {
+               // Fetch the complete history for all refs and heads. It would be more
+               // efficient to only fetch the history from rev to tag, but that's much more
+               // complicated, and any kind of shallow fetch is fairly likely to trigger
+               // bugs in JGit servers and/or the go command anyway.
+               if err := r.fetchRefsLocked(); err != nil {
+                       return false, err
+               }
+       }
+
+       _, err = Run(r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
+       if err == nil {
+               return true, nil
+       }
+       if ee, ok := err.(*RunError).Err.(*exec.ExitError); ok && ee.ExitCode() == 1 {
+               return false, nil
+       }
+       return false, err
+}
+
 func (r *gitRepo) ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, actualSubdir string, err error) {
        // TODO: Use maxSize or drop it.
        args := []string{}
index 59c2b15d19a06c4fb6b525f45ca3cf7db68be201..b1845f5c65067691ee6edc3bcd2f107c7c3e420e 100644 (file)
@@ -7,11 +7,11 @@ package codehost
 import (
        "encoding/xml"
        "fmt"
+       "internal/lazyregexp"
        "io"
        "io/ioutil"
        "os"
        "path/filepath"
-       "regexp"
        "sort"
        "strconv"
        "strings"
@@ -29,8 +29,9 @@ import (
 // The caller should report this error instead of continuing to probe
 // other possible module paths.
 //
-// TODO(bcmills): See if we can invert this. (Return a distinguished error for
-// “repo not found” and treat everything else as terminal.)
+// TODO(golang.org/issue/31730): See if we can invert this. (Return a
+// distinguished error for “repo not found” and treat everything else
+// as terminal.)
 type VCSError struct {
        Err error
 }
@@ -124,10 +125,10 @@ type vcsCmd struct {
        vcs           string                                            // vcs name "hg"
        init          func(remote string) []string                      // cmd to init repo to track remote
        tags          func(remote string) []string                      // cmd to list local tags
-       tagRE         *regexp.Regexp                                    // regexp to extract tag names from output of tags cmd
+       tagRE         *lazyregexp.Regexp                                // regexp to extract tag names from output of tags cmd
        branches      func(remote string) []string                      // cmd to list local branches
-       branchRE      *regexp.Regexp                                    // regexp to extract branch names from output of tags cmd
-       badLocalRevRE *regexp.Regexp                                    // regexp of names that must not be served out of local cache without doing fetch first
+       branchRE      *lazyregexp.Regexp                                // regexp to extract branch names from output of tags cmd
+       badLocalRevRE *lazyregexp.Regexp                                // regexp of names that must not be served out of local cache without doing fetch first
        statLocal     func(rev, remote string) []string                 // cmd to stat local rev
        parseStat     func(rev, out string) (*RevInfo, error)           // cmd to parse output of statLocal
        fetch         []string                                          // cmd to fetch everything from remote
@@ -136,13 +137,13 @@ type vcsCmd struct {
        readZip       func(rev, subdir, remote, target string) []string // cmd to read rev's subdir as zip file
 }
 
-var re = regexp.MustCompile
+var re = lazyregexp.New
 
 var vcsCmds = map[string]*vcsCmd{
        "hg": {
                vcs: "hg",
                init: func(remote string) []string {
-                       return []string{"hg", "clone", "-U", remote, "."}
+                       return []string{"hg", "clone", "-U", "--", remote, "."}
                },
                tags: func(remote string) []string {
                        return []string{"hg", "tags", "-q"}
@@ -167,7 +168,7 @@ var vcsCmds = map[string]*vcsCmd{
                        if subdir != "" {
                                pattern = []string{"-I", subdir + "/**"}
                        }
-                       return str.StringList("hg", "archive", "-t", "zip", "--no-decode", "-r", rev, "--prefix=prefix/", pattern, target)
+                       return str.StringList("hg", "archive", "-t", "zip", "--no-decode", "-r", rev, "--prefix=prefix/", pattern, "--", target)
                },
        },
 
@@ -175,7 +176,7 @@ var vcsCmds = map[string]*vcsCmd{
                vcs:  "svn",
                init: nil, // no local checkout
                tags: func(remote string) []string {
-                       return []string{"svn", "list", strings.TrimSuffix(remote, "/trunk") + "/tags"}
+                       return []string{"svn", "list", "--", strings.TrimSuffix(remote, "/trunk") + "/tags"}
                },
                tagRE: re(`(?m)^(.*?)/?$`),
                statLocal: func(rev, remote string) []string {
@@ -183,12 +184,12 @@ var vcsCmds = map[string]*vcsCmd{
                        if rev == "latest" {
                                suffix = ""
                        }
-                       return []string{"svn", "log", "-l1", "--xml", remote + suffix}
+                       return []string{"svn", "log", "-l1", "--xml", "--", remote + suffix}
                },
                parseStat: svnParseStat,
                latest:    "latest",
                readFile: func(rev, file, remote string) []string {
-                       return []string{"svn", "cat", remote + "/" + file + "@" + rev}
+                       return []string{"svn", "cat", "--", remote + "/" + file + "@" + rev}
                },
                // TODO: zip
        },
@@ -196,7 +197,7 @@ var vcsCmds = map[string]*vcsCmd{
        "bzr": {
                vcs: "bzr",
                init: func(remote string) []string {
-                       return []string{"bzr", "branch", "--use-existing-dir", remote, "."}
+                       return []string{"bzr", "branch", "--use-existing-dir", "--", remote, "."}
                },
                fetch: []string{
                        "bzr", "pull", "--overwrite-tags",
@@ -219,14 +220,14 @@ var vcsCmds = map[string]*vcsCmd{
                        if subdir != "" {
                                extra = []string{"./" + subdir}
                        }
-                       return str.StringList("bzr", "export", "--format=zip", "-r", rev, "--root=prefix/", target, extra)
+                       return str.StringList("bzr", "export", "--format=zip", "-r", rev, "--root=prefix/", "--", target, extra)
                },
        },
 
        "fossil": {
                vcs: "fossil",
                init: func(remote string) []string {
-                       return []string{"fossil", "clone", remote, ".fossil"}
+                       return []string{"fossil", "clone", "--", remote, ".fossil"}
                },
                fetch: []string{"fossil", "pull", "-R", ".fossil"},
                tags: func(remote string) []string {
@@ -248,7 +249,7 @@ var vcsCmds = map[string]*vcsCmd{
                        }
                        // Note that vcsRepo.ReadZip below rewrites this command
                        // to run in a different directory, to work around a fossil bug.
-                       return str.StringList("fossil", "zip", "-R", ".fossil", "--name", "prefix", extra, rev, target)
+                       return str.StringList("fossil", "zip", "-R", ".fossil", "--name", "prefix", extra, "--", rev, target)
                },
        },
 }
@@ -346,7 +347,7 @@ func (r *vcsRepo) fetch() {
 func (r *vcsRepo) statLocal(rev string) (*RevInfo, error) {
        out, err := Run(r.dir, r.cmd.statLocal(rev, r.remote))
        if err != nil {
-               return nil, vcsErrorf("unknown revision %s", rev)
+               return nil, &UnknownRevisionError{Rev: rev}
        }
        return r.cmd.parseStat(rev, string(out))
 }
@@ -391,7 +392,7 @@ func (r *vcsRepo) ReadFileRevs(revs []string, file string, maxSize int64) (map[s
        return nil, vcsErrorf("ReadFileRevs not implemented")
 }
 
-func (r *vcsRepo) RecentTag(rev, prefix string) (tag string, err error) {
+func (r *vcsRepo) RecentTag(rev, prefix, major string) (tag string, err error) {
        // We don't technically need to lock here since we're returning an error
        // uncondititonally, but doing so anyway will help to avoid baking in
        // lock-inversion bugs.
@@ -404,6 +405,16 @@ func (r *vcsRepo) RecentTag(rev, prefix string) (tag string, err error) {
        return "", vcsErrorf("RecentTag not implemented")
 }
 
+func (r *vcsRepo) DescendsFrom(rev, tag string) (bool, error) {
+       unlock, err := r.mu.Lock()
+       if err != nil {
+               return false, err
+       }
+       defer unlock()
+
+       return false, vcsErrorf("DescendsFrom not implemented")
+}
+
 func (r *vcsRepo) ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, actualSubdir string, err error) {
        if r.cmd.readZip == nil {
                return nil, "", vcsErrorf("ReadZip not implemented for %s", r.cmd.vcs)
index da9f63fec9c0fb4d1efe81ea3035abc125032181..267b76349dd49b2590a140fe4843adecc4ec5326 100644 (file)
@@ -6,12 +6,14 @@ package modfetch
 
 import (
        "archive/zip"
+       "errors"
        "fmt"
        "io"
        "io/ioutil"
        "os"
        "path"
        "strings"
+       "time"
 
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/modfile"
@@ -42,12 +44,10 @@ type codeRepo struct {
        // It is used only for logging.
        pathPrefix string
 
-       // pseudoMajor is the major version prefix to use when generating
-       // pseudo-versions for this module, derived from the module path.
-       //
-       // TODO(golang.org/issue/29262): We can't distinguish v0 from v1 using the
-       // path alone: we have to compute it by examining the tags at a particular
-       // revision.
+       // pseudoMajor is the major version prefix to require when generating
+       // pseudo-versions for this module, derived from the module path. pseudoMajor
+       // is empty if the module path does not include a version suffix (that is,
+       // accepts either v0 or v1).
        pseudoMajor string
 }
 
@@ -65,10 +65,7 @@ func newCodeRepo(code codehost.Repo, codeRoot, path string) (Repo, error) {
        if codeRoot == path {
                pathPrefix = path
        }
-       pseudoMajor := "v0"
-       if pathMajor != "" {
-               pseudoMajor = pathMajor[1:]
-       }
+       pseudoMajor := module.PathMajorPrefix(pathMajor)
 
        // Compute codeDir = bar, the subdirectory within the repo
        // corresponding to the module root.
@@ -159,7 +156,7 @@ func (r *codeRepo) Versions(prefix string) ([]string, error) {
                if v == "" || v != module.CanonicalVersion(v) || IsPseudoVersion(v) {
                        continue
                }
-               if !module.MatchPathMajor(v, r.pathMajor) {
+               if err := module.MatchPathMajor(v, r.pathMajor); err != nil {
                        if r.codeDir == "" && r.pathMajor == "" && semver.Major(v) > "v1" {
                                incompatible = append(incompatible, v)
                        }
@@ -208,6 +205,11 @@ func (r *codeRepo) Latest() (*RevInfo, error) {
        return r.convert(info, "")
 }
 
+// convert converts a version as reported by the code host to a version as
+// interpreted by the module system.
+//
+// If statVers is a valid module version, it is used for the Version field.
+// Otherwise, the Version is derived from the passed-in info and recent tags.
 func (r *codeRepo) convert(info *codehost.RevInfo, statVers string) (*RevInfo, error) {
        info2 := &RevInfo{
                Name:  info.Name,
@@ -215,79 +217,328 @@ func (r *codeRepo) convert(info *codehost.RevInfo, statVers string) (*RevInfo, e
                Time:  info.Time,
        }
 
-       // Determine version.
-       if module.CanonicalVersion(statVers) == statVers && module.MatchPathMajor(statVers, r.pathMajor) {
-               // The original call was repo.Stat(statVers), and requestedVersion is OK, so use it.
-               info2.Version = statVers
-       } else {
-               // Otherwise derive a version from a code repo tag.
-               // Tag must have a prefix matching codeDir.
-               p := ""
-               if r.codeDir != "" {
-                       p = r.codeDir + "/"
-               }
-
-               // If this is a plain tag (no dir/ prefix)
-               // and the module path is unversioned,
-               // and if the underlying file tree has no go.mod,
-               // then allow using the tag with a +incompatible suffix.
-               canUseIncompatible := false
+       // If this is a plain tag (no dir/ prefix)
+       // and the module path is unversioned,
+       // and if the underlying file tree has no go.mod,
+       // then allow using the tag with a +incompatible suffix.
+       var canUseIncompatible func() bool
+       canUseIncompatible = func() bool {
+               var ok bool
                if r.codeDir == "" && r.pathMajor == "" {
                        _, errGoMod := r.code.ReadFile(info.Name, "go.mod", codehost.MaxGoMod)
                        if errGoMod != nil {
-                               canUseIncompatible = true
+                               ok = true
+                       }
+               }
+               canUseIncompatible = func() bool { return ok }
+               return ok
+       }
+
+       invalidf := func(format string, args ...interface{}) error {
+               return &module.ModuleError{
+                       Path: r.modPath,
+                       Err: &module.InvalidVersionError{
+                               Version: info2.Version,
+                               Err:     fmt.Errorf(format, args...),
+                       },
+               }
+       }
+
+       // checkGoMod verifies that the go.mod file for the module exists or does not
+       // exist as required by info2.Version and the module path represented by r.
+       checkGoMod := func() (*RevInfo, error) {
+               // If r.codeDir is non-empty, then the go.mod file must exist: the module
+               // author, not the module consumer, gets to decide how to carve up the repo
+               // into modules.
+               if r.codeDir != "" {
+                       _, _, _, err := r.findDir(info2.Version)
+                       if err != nil {
+                               // TODO: It would be nice to return an error like "not a module".
+                               // Right now we return "missing go.mod", which is a little confusing.
+                               return nil, &module.ModuleError{
+                                       Path: r.modPath,
+                                       Err: &module.InvalidVersionError{
+                                               Version: info2.Version,
+                                               Err:     notExistError(err.Error()),
+                                       },
+                               }
                        }
                }
 
-               tagToVersion := func(v string) string {
-                       if !strings.HasPrefix(v, p) {
-                               return ""
+               // If the version is +incompatible, then the go.mod file must not exist:
+               // +incompatible is not an ongoing opt-out from semantic import versioning.
+               if strings.HasSuffix(info2.Version, "+incompatible") {
+                       if !canUseIncompatible() {
+                               if r.pathMajor != "" {
+                                       return nil, invalidf("+incompatible suffix not allowed: module path includes a major version suffix, so major version must match")
+                               } else {
+                                       return nil, invalidf("+incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required")
+                               }
                        }
-                       v = v[len(p):]
-                       if module.CanonicalVersion(v) != v || IsPseudoVersion(v) {
-                               return ""
+
+                       if err := module.MatchPathMajor(strings.TrimSuffix(info2.Version, "+incompatible"), r.pathMajor); err == nil {
+                               return nil, invalidf("+incompatible suffix not allowed: major version %s is compatible", semver.Major(info2.Version))
                        }
-                       if module.MatchPathMajor(v, r.pathMajor) {
-                               return v
+               }
+
+               return info2, nil
+       }
+
+       // Determine version.
+       //
+       // If statVers is canonical, then the original call was repo.Stat(statVers).
+       // Since the version is canonical, we must not resolve it to anything but
+       // itself, possibly with a '+incompatible' annotation: we do not need to do
+       // the work required to look for an arbitrary pseudo-version.
+       if statVers != "" && statVers == module.CanonicalVersion(statVers) {
+               info2.Version = statVers
+
+               if IsPseudoVersion(info2.Version) {
+                       if err := r.validatePseudoVersion(info, info2.Version); err != nil {
+                               return nil, err
                        }
-                       if canUseIncompatible {
-                               return v + "+incompatible"
+                       return checkGoMod()
+               }
+
+               if err := module.MatchPathMajor(info2.Version, r.pathMajor); err != nil {
+                       if canUseIncompatible() {
+                               info2.Version += "+incompatible"
+                               return checkGoMod()
+                       } else {
+                               if vErr, ok := err.(*module.InvalidVersionError); ok {
+                                       // We're going to describe why the version is invalid in more detail,
+                                       // so strip out the existing “invalid version” wrapper.
+                                       err = vErr.Err
+                               }
+                               return nil, invalidf("module contains a go.mod file, so major version must be compatible: %v", err)
                        }
-                       return ""
                }
 
-               // If info.Version is OK, use it.
-               if v := tagToVersion(info.Version); v != "" {
-                       info2.Version = v
-               } else {
-                       // Otherwise look through all known tags for latest in semver ordering.
-                       for _, tag := range info.Tags {
-                               if v := tagToVersion(tag); v != "" && semver.Compare(info2.Version, v) < 0 {
+               return checkGoMod()
+       }
+
+       // statVers is empty or non-canonical, so we need to resolve it to a canonical
+       // version or pseudo-version.
+
+       // Derive or verify a version from a code repo tag.
+       // Tag must have a prefix matching codeDir.
+       tagPrefix := ""
+       if r.codeDir != "" {
+               tagPrefix = r.codeDir + "/"
+       }
+
+       // tagToVersion returns the version obtained by trimming tagPrefix from tag.
+       // If the tag is invalid or a pseudo-version, tagToVersion returns an empty
+       // version.
+       tagToVersion := func(tag string) (v string, tagIsCanonical bool) {
+               if !strings.HasPrefix(tag, tagPrefix) {
+                       return "", false
+               }
+               trimmed := tag[len(tagPrefix):]
+               // Tags that look like pseudo-versions would be confusing. Ignore them.
+               if IsPseudoVersion(tag) {
+                       return "", false
+               }
+
+               v = semver.Canonical(trimmed) // Not module.Canonical: we don't want to pick up an explicit "+incompatible" suffix from the tag.
+               if v == "" || !strings.HasPrefix(trimmed, v) {
+                       return "", false // Invalid or incomplete version (just vX or vX.Y).
+               }
+               if v == trimmed {
+                       tagIsCanonical = true
+               }
+
+               if err := module.MatchPathMajor(v, r.pathMajor); err != nil {
+                       if canUseIncompatible() {
+                               return v + "+incompatible", tagIsCanonical
+                       }
+                       return "", false
+               }
+
+               return v, tagIsCanonical
+       }
+
+       // If the VCS gave us a valid version, use that.
+       if v, tagIsCanonical := tagToVersion(info.Version); tagIsCanonical {
+               info2.Version = v
+               return checkGoMod()
+       }
+
+       // Look through the tags on the revision for either a usable canonical version
+       // or an appropriate base for a pseudo-version.
+       var pseudoBase string
+       for _, pathTag := range info.Tags {
+               v, tagIsCanonical := tagToVersion(pathTag)
+               if tagIsCanonical {
+                       if statVers != "" && semver.Compare(v, statVers) == 0 {
+                               // The user requested a non-canonical version, but the tag for the
+                               // canonical equivalent refers to the same revision. Use it.
+                               info2.Version = v
+                               return checkGoMod()
+                       } else {
+                               // Save the highest canonical tag for the revision. If we don't find a
+                               // better match, we'll use it as the canonical version.
+                               //
+                               // NOTE: Do not replace this with semver.Max. Despite the name,
+                               // semver.Max *also* canonicalizes its arguments, which uses
+                               // semver.Canonical instead of module.CanonicalVersion and thereby
+                               // strips our "+incompatible" suffix.
+                               if semver.Compare(info2.Version, v) < 0 {
                                        info2.Version = v
                                }
                        }
-                       // Otherwise make a pseudo-version.
-                       if info2.Version == "" {
-                               tag, _ := r.code.RecentTag(statVers, p)
-                               v = tagToVersion(tag)
-                               // TODO: Check that v is OK for r.pseudoMajor or else is OK for incompatible.
-                               info2.Version = PseudoVersion(r.pseudoMajor, v, info.Time, info.Short)
+               } else if v != "" && semver.Compare(v, statVers) == 0 {
+                       // The user explicitly requested something equivalent to this tag. We
+                       // can't use the version from the tag directly: since the tag is not
+                       // canonical, it could be ambiguous. For example, tags v0.0.1+a and
+                       // v0.0.1+b might both exist and refer to different revisions.
+                       //
+                       // The tag is otherwise valid for the module, so we can at least use it as
+                       // the base of an unambiguous pseudo-version.
+                       //
+                       // If multiple tags match, tagToVersion will canonicalize them to the same
+                       // base version.
+                       pseudoBase = v
+               }
+       }
+
+       // If we found any canonical tag for the revision, return it.
+       // Even if we found a good pseudo-version base, a canonical version is better.
+       if info2.Version != "" {
+               return checkGoMod()
+       }
+
+       if pseudoBase == "" {
+               var tag string
+               if r.pseudoMajor != "" || canUseIncompatible() {
+                       tag, _ = r.code.RecentTag(info.Name, tagPrefix, r.pseudoMajor)
+               } else {
+                       // Allow either v1 or v0, but not incompatible higher versions.
+                       tag, _ = r.code.RecentTag(info.Name, tagPrefix, "v1")
+                       if tag == "" {
+                               tag, _ = r.code.RecentTag(info.Name, tagPrefix, "v0")
                        }
                }
+               pseudoBase, _ = tagToVersion(tag) // empty if the tag is invalid
        }
 
-       // Do not allow a successful stat of a pseudo-version for a subdirectory
-       // unless the subdirectory actually does have a go.mod.
-       if IsPseudoVersion(info2.Version) && r.codeDir != "" {
-               _, _, _, err := r.findDir(info2.Version)
+       info2.Version = PseudoVersion(r.pseudoMajor, pseudoBase, info.Time, info.Short)
+       return checkGoMod()
+}
+
+// validatePseudoVersion checks that version has a major version compatible with
+// r.modPath and encodes a base version and commit metadata that agrees with
+// info.
+//
+// Note that verifying a nontrivial base version in particular may be somewhat
+// expensive: in order to do so, r.code.DescendsFrom will need to fetch at least
+// enough of the commit history to find a path between version and its base.
+// Fortunately, many pseudo-versions — such as those for untagged repositories —
+// have trivial bases!
+func (r *codeRepo) validatePseudoVersion(info *codehost.RevInfo, version string) (err error) {
+       defer func() {
                if err != nil {
-                       // TODO: It would be nice to return an error like "not a module".
-                       // Right now we return "missing go.mod", which is a little confusing.
-                       return nil, err
+                       if _, ok := err.(*module.ModuleError); !ok {
+                               if _, ok := err.(*module.InvalidVersionError); !ok {
+                                       err = &module.InvalidVersionError{Version: version, Pseudo: true, Err: err}
+                               }
+                               err = &module.ModuleError{Path: r.modPath, Err: err}
+                       }
+               }
+       }()
+
+       if err := module.MatchPathMajor(version, r.pathMajor); err != nil {
+               return err
+       }
+
+       rev, err := PseudoVersionRev(version)
+       if err != nil {
+               return err
+       }
+       if rev != info.Short {
+               switch {
+               case strings.HasPrefix(rev, info.Short):
+                       return fmt.Errorf("revision is longer than canonical (%s)", info.Short)
+               case strings.HasPrefix(info.Short, rev):
+                       return fmt.Errorf("revision is shorter than canonical (%s)", info.Short)
+               default:
+                       return fmt.Errorf("does not match short name of revision (%s)", info.Short)
+               }
+       }
+
+       t, err := PseudoVersionTime(version)
+       if err != nil {
+               return err
+       }
+       if !t.Equal(info.Time.Truncate(time.Second)) {
+               return fmt.Errorf("does not match version-control timestamp (%s)", info.Time.UTC().Format(time.RFC3339))
+       }
+
+       // A pseudo-version should have a precedence just above its parent revisions,
+       // and no higher. Otherwise, it would be possible for library authors to "pin"
+       // dependency versions (and bypass the usual minimum version selection) by
+       // naming an extremely high pseudo-version rather than an accurate one.
+       //
+       // Moreover, if we allow a pseudo-version to use any arbitrary pre-release
+       // tag, we end up with infinitely many possible names for each commit. Each
+       // name consumes resources in the module cache and proxies, so we want to
+       // restrict them to a finite set under control of the module author.
+       //
+       // We address both of these issues by requiring the tag upon which the
+       // pseudo-version is based to refer to some ancestor of the revision. We
+       // prefer the highest such tag when constructing a new pseudo-version, but do
+       // not enforce that property when resolving existing pseudo-versions: we don't
+       // know when the parent tags were added, and the highest-tagged parent may not
+       // have existed when the pseudo-version was first resolved.
+       base, err := PseudoVersionBase(strings.TrimSuffix(version, "+incompatible"))
+       if err != nil {
+               return err
+       }
+       if base == "" {
+               if r.pseudoMajor == "" && semver.Major(version) == "v1" {
+                       return fmt.Errorf("major version without preceding tag must be v0, not v1")
                }
+               return nil
+       }
+
+       tagPrefix := ""
+       if r.codeDir != "" {
+               tagPrefix = r.codeDir + "/"
+       }
+
+       tags, err := r.code.Tags(tagPrefix + base)
+       if err != nil {
+               return err
+       }
+
+       var lastTag string // Prefer to log some real tag rather than a canonically-equivalent base.
+       ancestorFound := false
+       for _, tag := range tags {
+               versionOnly := strings.TrimPrefix(tag, tagPrefix)
+               if semver.Compare(versionOnly, base) == 0 {
+                       lastTag = tag
+                       ancestorFound, err = r.code.DescendsFrom(info.Name, tag)
+                       if ancestorFound {
+                               break
+                       }
+               }
+       }
+
+       if lastTag == "" {
+               return fmt.Errorf("preceding tag (%s) not found", base)
        }
 
-       return info2, nil
+       if !ancestorFound {
+               if err != nil {
+                       return err
+               }
+               rev, err := PseudoVersionRev(version)
+               if err != nil {
+                       return fmt.Errorf("not a descendent of preceding tag (%s)", lastTag)
+               }
+               return fmt.Errorf("revision %s is not a descendent of preceding tag (%s)", rev, lastTag)
+       }
+       return nil
 }
 
 func (r *codeRepo) revToRev(rev string) string {
@@ -309,7 +560,13 @@ func (r *codeRepo) revToRev(rev string) string {
 
 func (r *codeRepo) versionToRev(version string) (rev string, err error) {
        if !semver.IsValid(version) {
-               return "", fmt.Errorf("malformed semantic version %q", version)
+               return "", &module.ModuleError{
+                       Path: r.modPath,
+                       Err: &module.InvalidVersionError{
+                               Version: version,
+                               Err:     errors.New("syntax error"),
+                       },
+               }
        }
        return r.revToRev(version), nil
 }
@@ -419,6 +676,21 @@ func isMajor(mpath, pathMajor string) bool {
 }
 
 func (r *codeRepo) GoMod(version string) (data []byte, err error) {
+       if version != module.CanonicalVersion(version) {
+               return nil, fmt.Errorf("version %s is not canonical", version)
+       }
+
+       if IsPseudoVersion(version) {
+               // findDir ignores the metadata encoded in a pseudo-version,
+               // only using the revision at the end.
+               // Invoke Stat to verify the metadata explicitly so we don't return
+               // a bogus file for an invalid version.
+               _, err := r.Stat(version)
+               if err != nil {
+                       return nil, err
+               }
+       }
+
        rev, dir, gomod, err := r.findDir(version)
        if err != nil {
                return nil, err
@@ -452,6 +724,21 @@ func (r *codeRepo) modPrefix(rev string) string {
 }
 
 func (r *codeRepo) Zip(dst io.Writer, version string) error {
+       if version != module.CanonicalVersion(version) {
+               return fmt.Errorf("version %s is not canonical", version)
+       }
+
+       if IsPseudoVersion(version) {
+               // findDir ignores the metadata encoded in a pseudo-version,
+               // only using the revision at the end.
+               // Invoke Stat to verify the metadata explicitly so we don't return
+               // a bogus file for an invalid version.
+               _, err := r.Stat(version)
+               if err != nil {
+                       return err
+               }
+       }
+
        rev, dir, _, err := r.findDir(version)
        if err != nil {
                return err
@@ -585,6 +872,9 @@ func (r *codeRepo) Zip(dst io.Writer, version string) error {
                        return err
                }
                w, err := zw.Create(r.modPrefix(version) + "/" + name)
+               if err != nil {
+                       return err
+               }
                lr := &io.LimitedReader{R: rc, N: size + 1}
                if _, err := io.Copy(w, lr); err != nil {
                        return err
@@ -631,6 +921,19 @@ func isVendoredPackage(name string) bool {
        if strings.HasPrefix(name, "vendor/") {
                i += len("vendor/")
        } else if j := strings.Index(name, "/vendor/"); j >= 0 {
+               // This offset looks incorrect; this should probably be
+               //
+               //      i = j + len("/vendor/")
+               //
+               // (See https://golang.org/issue/31562.)
+               //
+               // Unfortunately, we can't fix it without invalidating checksums.
+               // Fortunately, the error appears to be strictly conservative: we'll retain
+               // vendored packages that we should have pruned, but we won't prune
+               // non-vendored packages that we should have retained.
+               //
+               // Since this defect doesn't seem to break anything, it's not worth fixing
+               // for now.
                i += len("/vendor/")
        } else {
                return false
index 7a419576ced03ce767259e03a374ce19931d615b..5fc9bc3439722abf9db56a4236c659462a959398 100644 (file)
@@ -7,7 +7,6 @@ package modfetch
 import (
        "archive/zip"
        "internal/testenv"
-       "io"
        "io/ioutil"
        "log"
        "os"
@@ -16,6 +15,7 @@ import (
        "testing"
        "time"
 
+       "cmd/go/internal/cfg"
        "cmd/go/internal/modfetch/codehost"
 )
 
@@ -24,6 +24,14 @@ func TestMain(m *testing.M) {
 }
 
 func testMain(m *testing.M) int {
+       cfg.GOPROXY = "direct"
+
+       // The sum database is populated using a released version of the go command,
+       // but this test may include fixes for additional modules that previously
+       // could not be fetched. Since this test isn't executing any of the resolved
+       // code, bypass the sum database.
+       cfg.GOSUMDB = "off"
+
        dir, err := ioutil.TempDir("", "gitrepo-test-")
        if err != nil {
                log.Fatal(err)
@@ -39,11 +47,12 @@ const (
        vgotest1hg  = "vcs-test.golang.org/hg/vgotest1.hg"
 )
 
-var altVgotests = []string{
-       vgotest1hg,
+var altVgotests = map[string]string{
+       "hg": vgotest1hg,
 }
 
-var codeRepoTests = []struct {
+type codeRepoTest struct {
+       vcs      string
        path     string
        lookerr  string
        mpath    string
@@ -57,8 +66,11 @@ var codeRepoTests = []struct {
        gomoderr string
        zip      []string
        ziperr   string
-}{
+}
+
+var codeRepoTests = []codeRepoTest{
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                rev:     "v0.0.0",
                version: "v0.0.0",
@@ -72,6 +84,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                rev:     "v1.0.0",
                version: "v1.0.0",
@@ -85,6 +98,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1/v2",
                rev:     "v2.0.0",
                version: "v2.0.0",
@@ -94,6 +108,7 @@ var codeRepoTests = []struct {
                ziperr:  "missing github.com/rsc/vgotest1/go.mod and .../v2/go.mod at revision v2.0.0",
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                rev:     "80d85c5",
                version: "v1.0.0",
@@ -107,6 +122,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                rev:     "mytag",
                version: "v1.0.0",
@@ -120,6 +136,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1/v2",
                rev:      "45f53230a",
                version:  "v2.0.0",
@@ -130,6 +147,7 @@ var codeRepoTests = []struct {
                ziperr:   "missing github.com/rsc/vgotest1/go.mod and .../v2/go.mod at revision v2.0.0",
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1/v54321",
                rev:     "80d85c5",
                version: "v54321.0.0-20180219231006-80d85c5d4d17",
@@ -139,16 +157,19 @@ var codeRepoTests = []struct {
                ziperr:  "missing github.com/rsc/vgotest1/go.mod and .../v54321/go.mod at revision 80d85c5d4d17",
        },
        {
+               vcs:  "git",
                path: "github.com/rsc/vgotest1/submod",
                rev:  "v1.0.0",
                err:  "unknown revision submod/v1.0.0",
        },
        {
+               vcs:  "git",
                path: "github.com/rsc/vgotest1/submod",
                rev:  "v1.0.3",
                err:  "unknown revision submod/v1.0.3",
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1/submod",
                rev:     "v1.0.4",
                version: "v1.0.4",
@@ -163,6 +184,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                rev:     "v1.1.0",
                version: "v1.1.0",
@@ -178,6 +200,7 @@ var codeRepoTests = []struct {
                },
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1/v2",
                rev:     "v2.0.1",
                version: "v2.0.1",
@@ -187,6 +210,7 @@ var codeRepoTests = []struct {
                gomod:   "module \"github.com/rsc/vgotest1/v2\" // root go.mod\n",
        },
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1/v2",
                rev:      "v2.0.3",
                version:  "v2.0.3",
@@ -196,6 +220,7 @@ var codeRepoTests = []struct {
                gomoderr: "github.com/rsc/vgotest1/v2/go.mod has non-.../v2 module path \"github.com/rsc/vgotest\" at revision v2.0.3",
        },
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1/v2",
                rev:      "v2.0.4",
                version:  "v2.0.4",
@@ -205,6 +230,7 @@ var codeRepoTests = []struct {
                gomoderr: "github.com/rsc/vgotest1/go.mod and .../v2/go.mod both have .../v2 module paths at revision v2.0.4",
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1/v2",
                rev:     "v2.0.5",
                version: "v2.0.5",
@@ -215,6 +241,7 @@ var codeRepoTests = []struct {
        },
        {
                // redirect to github
+               vcs:     "git",
                path:    "rsc.io/quote",
                rev:     "v1.0.0",
                version: "v1.0.0",
@@ -225,6 +252,7 @@ var codeRepoTests = []struct {
        },
        {
                // redirect to static hosting proxy
+               vcs:     "mod",
                path:    "swtch.com/testmod",
                rev:     "v1.0.0",
                version: "v1.0.0",
@@ -234,6 +262,7 @@ var codeRepoTests = []struct {
        },
        {
                // redirect to googlesource
+               vcs:     "git",
                path:    "golang.org/x/text",
                rev:     "4e4a3210bb",
                version: "v0.3.1-0.20180208041248-4e4a3210bb54",
@@ -242,6 +271,7 @@ var codeRepoTests = []struct {
                time:    time.Date(2018, 2, 8, 4, 12, 48, 0, time.UTC),
        },
        {
+               vcs:     "git",
                path:    "github.com/pkg/errors",
                rev:     "v0.8.0",
                version: "v0.8.0",
@@ -253,17 +283,20 @@ var codeRepoTests = []struct {
                // package in subdirectory - custom domain
                // In general we can't reject these definitively in Lookup,
                // but gopkg.in is special.
+               vcs:     "git",
                path:    "gopkg.in/yaml.v2/abc",
                lookerr: "invalid module path \"gopkg.in/yaml.v2/abc\"",
        },
        {
                // package in subdirectory - github
                // Because it's a package, Stat should fail entirely.
+               vcs:  "git",
                path: "github.com/rsc/quote/buggy",
                rev:  "c4d4236f",
                err:  "missing github.com/rsc/quote/buggy/go.mod at revision c4d4236f9242",
        },
        {
+               vcs:     "git",
                path:    "gopkg.in/yaml.v2",
                rev:     "d670f940",
                version: "v2.0.0",
@@ -273,6 +306,7 @@ var codeRepoTests = []struct {
                gomod:   "module gopkg.in/yaml.v2\n",
        },
        {
+               vcs:     "git",
                path:    "gopkg.in/check.v1",
                rev:     "20d25e280405",
                version: "v1.0.0-20161208181325-20d25e280405",
@@ -282,15 +316,17 @@ var codeRepoTests = []struct {
                gomod:   "module gopkg.in/check.v1\n",
        },
        {
+               vcs:     "git",
                path:    "gopkg.in/yaml.v2",
                rev:     "v2",
-               version: "v2.2.2",
-               name:    "51d6538a90f86fe93ac480b35f37b2be17fef232",
-               short:   "51d6538a90f8",
-               time:    time.Date(2018, 11, 15, 11, 05, 04, 0, time.UTC),
+               version: "v2.2.3-0.20190319135612-7b8349ac747c",
+               name:    "7b8349ac747c6a24702b762d2c4fd9266cf4f1d6",
+               short:   "7b8349ac747c",
+               time:    time.Date(2019, 03, 19, 13, 56, 12, 0, time.UTC),
                gomod:   "module \"gopkg.in/yaml.v2\"\n\nrequire (\n\t\"gopkg.in/check.v1\" v0.0.0-20161208181325-20d25e280405\n)\n",
        },
        {
+               vcs:     "git",
                path:    "vcs-test.golang.org/go/mod/gitrepo1",
                rev:     "master",
                version: "v1.2.4-annotated",
@@ -300,6 +336,7 @@ var codeRepoTests = []struct {
                gomod:   "module vcs-test.golang.org/go/mod/gitrepo1\n",
        },
        {
+               vcs:     "git",
                path:    "gopkg.in/natefinch/lumberjack.v2",
                rev:     "latest",
                version: "v2.0.0-20170531160350-a96e63847dc3",
@@ -309,6 +346,7 @@ var codeRepoTests = []struct {
                gomod:   "module gopkg.in/natefinch/lumberjack.v2\n",
        },
        {
+               vcs:  "git",
                path: "gopkg.in/natefinch/lumberjack.v2",
                // This repo has a v2.1 tag.
                // We only allow semver references to tags that are fully qualified, as in v2.1.0.
@@ -324,144 +362,156 @@ var codeRepoTests = []struct {
                gomod:   "module gopkg.in/natefinch/lumberjack.v2\n",
        },
        {
-               path:    "nanomsg.org/go/mangos/v2",
-               rev:     "v2.0.2",
-               version: "v2.0.2",
-               name:    "63f66a65137b9a648ac9f7bf0160b4a4d17d7999",
-               short:   "63f66a65137b",
-               time:    time.Date(2018, 12, 1, 15, 7, 40, 0, time.UTC),
-               gomod:   "module nanomsg.org/go/mangos/v2\n\nrequire (\n\tgithub.com/Microsoft/go-winio v0.4.11\n\tgithub.com/droundy/goopt v0.0.0-20170604162106-0b8effe182da\n\tgithub.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect\n\tgithub.com/gorilla/websocket v1.4.0\n\tgithub.com/jtolds/gls v4.2.1+incompatible // indirect\n\tgithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect\n\tgithub.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c\n\tgolang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect\n)\n",
+               vcs:     "git",
+               path:    "vcs-test.golang.org/go/v2module/v2",
+               rev:     "v2.0.0",
+               version: "v2.0.0",
+               name:    "203b91c896acd173aa719e4cdcb7d463c4b090fa",
+               short:   "203b91c896ac",
+               time:    time.Date(2019, 4, 3, 15, 52, 15, 0, time.UTC),
+               gomod:   "module vcs-test.golang.org/go/v2module/v2\n\ngo 1.12\n",
        },
 }
 
 func TestCodeRepo(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
 
-       tmpdir, err := ioutil.TempDir("", "vgo-modfetch-test-")
+       tmpdir, err := ioutil.TempDir("", "modfetch-test-")
        if err != nil {
                t.Fatal(err)
        }
        defer os.RemoveAll(tmpdir)
-       for _, tt := range codeRepoTests {
-               f := func(t *testing.T) {
-                       repo, err := Lookup(tt.path)
-                       if tt.lookerr != "" {
-                               if err != nil && err.Error() == tt.lookerr {
-                                       return
-                               }
-                               t.Errorf("Lookup(%q): %v, want error %q", tt.path, err, tt.lookerr)
-                       }
-                       if err != nil {
-                               t.Fatalf("Lookup(%q): %v", tt.path, err)
-                       }
-                       if tt.mpath == "" {
-                               tt.mpath = tt.path
-                       }
-                       if mpath := repo.ModulePath(); mpath != tt.mpath {
-                               t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath)
-                       }
-                       info, err := repo.Stat(tt.rev)
-                       if err != nil {
-                               if tt.err != "" {
-                                       if !strings.Contains(err.Error(), tt.err) {
-                                               t.Fatalf("repoStat(%q): %v, wanted %q", tt.rev, err, tt.err)
+
+       t.Run("parallel", func(t *testing.T) {
+               for _, tt := range codeRepoTests {
+                       f := func(tt codeRepoTest) func(t *testing.T) {
+                               return func(t *testing.T) {
+                                       t.Parallel()
+                                       if tt.vcs != "mod" {
+                                               testenv.MustHaveExecPath(t, tt.vcs)
                                        }
-                                       return
-                               }
-                               t.Fatalf("repo.Stat(%q): %v", tt.rev, err)
-                       }
-                       if tt.err != "" {
-                               t.Errorf("repo.Stat(%q): success, wanted error", tt.rev)
-                       }
-                       if info.Version != tt.version {
-                               t.Errorf("info.Version = %q, want %q", info.Version, tt.version)
-                       }
-                       if info.Name != tt.name {
-                               t.Errorf("info.Name = %q, want %q", info.Name, tt.name)
-                       }
-                       if info.Short != tt.short {
-                               t.Errorf("info.Short = %q, want %q", info.Short, tt.short)
-                       }
-                       if !info.Time.Equal(tt.time) {
-                               t.Errorf("info.Time = %v, want %v", info.Time, tt.time)
-                       }
-                       if tt.gomod != "" || tt.gomoderr != "" {
-                               data, err := repo.GoMod(tt.version)
-                               if err != nil && tt.gomoderr == "" {
-                                       t.Errorf("repo.GoMod(%q): %v", tt.version, err)
-                               } else if err != nil && tt.gomoderr != "" {
-                                       if err.Error() != tt.gomoderr {
-                                               t.Errorf("repo.GoMod(%q): %v, want %q", tt.version, err, tt.gomoderr)
+
+                                       repo, err := Lookup("direct", tt.path)
+                                       if tt.lookerr != "" {
+                                               if err != nil && err.Error() == tt.lookerr {
+                                                       return
+                                               }
+                                               t.Errorf("Lookup(%q): %v, want error %q", tt.path, err, tt.lookerr)
                                        }
-                               } else if tt.gomoderr != "" {
-                                       t.Errorf("repo.GoMod(%q) = %q, want error %q", tt.version, data, tt.gomoderr)
-                               } else if string(data) != tt.gomod {
-                                       t.Errorf("repo.GoMod(%q) = %q, want %q", tt.version, data, tt.gomod)
-                               }
-                       }
-                       if tt.zip != nil || tt.ziperr != "" {
-                               f, err := ioutil.TempFile(tmpdir, tt.version+".zip.")
-                               if err != nil {
-                                       t.Fatalf("ioutil.TempFile: %v", err)
-                               }
-                               zipfile := f.Name()
-                               err = repo.Zip(f, tt.version)
-                               f.Close()
-                               if err != nil {
-                                       if tt.ziperr != "" {
-                                               if err.Error() == tt.ziperr {
+                                       if err != nil {
+                                               t.Fatalf("Lookup(%q): %v", tt.path, err)
+                                       }
+                                       if tt.mpath == "" {
+                                               tt.mpath = tt.path
+                                       }
+                                       if mpath := repo.ModulePath(); mpath != tt.mpath {
+                                               t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath)
+                                       }
+                                       info, err := repo.Stat(tt.rev)
+                                       if err != nil {
+                                               if tt.err != "" {
+                                                       if !strings.Contains(err.Error(), tt.err) {
+                                                               t.Fatalf("repoStat(%q): %v, wanted %q", tt.rev, err, tt.err)
+                                                       }
                                                        return
                                                }
-                                               t.Fatalf("repo.Zip(%q): %v, want error %q", tt.version, err, tt.ziperr)
+                                               t.Fatalf("repo.Stat(%q): %v", tt.rev, err)
                                        }
-                                       t.Fatalf("repo.Zip(%q): %v", tt.version, err)
-                               }
-                               if tt.ziperr != "" {
-                                       t.Errorf("repo.Zip(%q): success, want error %q", tt.version, tt.ziperr)
-                               }
-                               prefix := tt.path + "@" + tt.version + "/"
-                               z, err := zip.OpenReader(zipfile)
-                               if err != nil {
-                                       t.Fatalf("open zip %s: %v", zipfile, err)
-                               }
-                               var names []string
-                               for _, file := range z.File {
-                                       if !strings.HasPrefix(file.Name, prefix) {
-                                               t.Errorf("zip entry %v does not start with prefix %v", file.Name, prefix)
-                                               continue
+                                       if tt.err != "" {
+                                               t.Errorf("repo.Stat(%q): success, wanted error", tt.rev)
+                                       }
+                                       if info.Version != tt.version {
+                                               t.Errorf("info.Version = %q, want %q", info.Version, tt.version)
+                                       }
+                                       if info.Name != tt.name {
+                                               t.Errorf("info.Name = %q, want %q", info.Name, tt.name)
+                                       }
+                                       if info.Short != tt.short {
+                                               t.Errorf("info.Short = %q, want %q", info.Short, tt.short)
+                                       }
+                                       if !info.Time.Equal(tt.time) {
+                                               t.Errorf("info.Time = %v, want %v", info.Time, tt.time)
+                                       }
+                                       if tt.gomod != "" || tt.gomoderr != "" {
+                                               data, err := repo.GoMod(tt.version)
+                                               if err != nil && tt.gomoderr == "" {
+                                                       t.Errorf("repo.GoMod(%q): %v", tt.version, err)
+                                               } else if err != nil && tt.gomoderr != "" {
+                                                       if err.Error() != tt.gomoderr {
+                                                               t.Errorf("repo.GoMod(%q): %v, want %q", tt.version, err, tt.gomoderr)
+                                                       }
+                                               } else if tt.gomoderr != "" {
+                                                       t.Errorf("repo.GoMod(%q) = %q, want error %q", tt.version, data, tt.gomoderr)
+                                               } else if string(data) != tt.gomod {
+                                                       t.Errorf("repo.GoMod(%q) = %q, want %q", tt.version, data, tt.gomod)
+                                               }
+                                       }
+                                       if tt.zip != nil || tt.ziperr != "" {
+                                               f, err := ioutil.TempFile(tmpdir, tt.version+".zip.")
+                                               if err != nil {
+                                                       t.Fatalf("ioutil.TempFile: %v", err)
+                                               }
+                                               zipfile := f.Name()
+                                               err = repo.Zip(f, tt.version)
+                                               f.Close()
+                                               if err != nil {
+                                                       if tt.ziperr != "" {
+                                                               if err.Error() == tt.ziperr {
+                                                                       return
+                                                               }
+                                                               t.Fatalf("repo.Zip(%q): %v, want error %q", tt.version, err, tt.ziperr)
+                                                       }
+                                                       t.Fatalf("repo.Zip(%q): %v", tt.version, err)
+                                               }
+                                               if tt.ziperr != "" {
+                                                       t.Errorf("repo.Zip(%q): success, want error %q", tt.version, tt.ziperr)
+                                               }
+                                               prefix := tt.path + "@" + tt.version + "/"
+                                               z, err := zip.OpenReader(zipfile)
+                                               if err != nil {
+                                                       t.Fatalf("open zip %s: %v", zipfile, err)
+                                               }
+                                               var names []string
+                                               for _, file := range z.File {
+                                                       if !strings.HasPrefix(file.Name, prefix) {
+                                                               t.Errorf("zip entry %v does not start with prefix %v", file.Name, prefix)
+                                                               continue
+                                                       }
+                                                       names = append(names, file.Name[len(prefix):])
+                                               }
+                                               z.Close()
+                                               if !reflect.DeepEqual(names, tt.zip) {
+                                                       t.Fatalf("zip = %v\nwant %v\n", names, tt.zip)
+                                               }
                                        }
-                                       names = append(names, file.Name[len(prefix):])
-                               }
-                               z.Close()
-                               if !reflect.DeepEqual(names, tt.zip) {
-                                       t.Fatalf("zip = %v\nwant %v\n", names, tt.zip)
                                }
                        }
-               }
-               t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f)
-               if strings.HasPrefix(tt.path, vgotest1git) {
-                       for _, alt := range altVgotests {
-                               // Note: Communicating with f through tt; should be cleaned up.
-                               old := tt
-                               tt.path = alt + strings.TrimPrefix(tt.path, vgotest1git)
-                               if strings.HasPrefix(tt.mpath, vgotest1git) {
-                                       tt.mpath = alt + strings.TrimPrefix(tt.mpath, vgotest1git)
-                               }
-                               var m map[string]string
-                               if alt == vgotest1hg {
-                                       m = hgmap
+                       t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f(tt))
+                       if strings.HasPrefix(tt.path, vgotest1git) {
+                               for vcs, alt := range altVgotests {
+                                       // Note: Communicating with f through tt; should be cleaned up.
+                                       old := tt
+                                       tt.vcs = vcs
+                                       tt.path = alt + strings.TrimPrefix(tt.path, vgotest1git)
+                                       if strings.HasPrefix(tt.mpath, vgotest1git) {
+                                               tt.mpath = alt + strings.TrimPrefix(tt.mpath, vgotest1git)
+                                       }
+                                       var m map[string]string
+                                       if alt == vgotest1hg {
+                                               m = hgmap
+                                       }
+                                       tt.version = remap(tt.version, m)
+                                       tt.name = remap(tt.name, m)
+                                       tt.short = remap(tt.short, m)
+                                       tt.rev = remap(tt.rev, m)
+                                       tt.gomoderr = remap(tt.gomoderr, m)
+                                       tt.ziperr = remap(tt.ziperr, m)
+                                       t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f(tt))
+                                       tt = old
                                }
-                               tt.version = remap(tt.version, m)
-                               tt.name = remap(tt.name, m)
-                               tt.short = remap(tt.short, m)
-                               tt.rev = remap(tt.rev, m)
-                               tt.gomoderr = remap(tt.gomoderr, m)
-                               tt.ziperr = remap(tt.ziperr, m)
-                               t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f)
-                               tt = old
                        }
                }
-       }
+       })
 }
 
 var hgmap = map[string]string{
@@ -497,32 +547,39 @@ func remap(name string, m map[string]string) string {
 }
 
 var codeRepoVersionsTests = []struct {
+       vcs      string
        path     string
        prefix   string
        versions []string
 }{
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1",
                versions: []string{"v0.0.0", "v0.0.1", "v1.0.0", "v1.0.1", "v1.0.2", "v1.0.3", "v1.1.0", "v2.0.0+incompatible"},
        },
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1",
                prefix:   "v1.0",
                versions: []string{"v1.0.0", "v1.0.1", "v1.0.2", "v1.0.3"},
        },
        {
+               vcs:      "git",
                path:     "github.com/rsc/vgotest1/v2",
                versions: []string{"v2.0.0", "v2.0.1", "v2.0.2", "v2.0.3", "v2.0.4", "v2.0.5", "v2.0.6"},
        },
        {
+               vcs:      "mod",
                path:     "swtch.com/testmod",
                versions: []string{"v1.0.0", "v1.1.1"},
        },
        {
+               vcs:      "git",
                path:     "gopkg.in/russross/blackfriday.v2",
                versions: []string{"v2.0.0", "v2.0.1"},
        },
        {
+               vcs:      "git",
                path:     "gopkg.in/natefinch/lumberjack.v2",
                versions: []string{"v2.0.0"},
        },
@@ -536,41 +593,55 @@ func TestCodeRepoVersions(t *testing.T) {
                t.Fatal(err)
        }
        defer os.RemoveAll(tmpdir)
-       for _, tt := range codeRepoVersionsTests {
-               t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) {
-                       repo, err := Lookup(tt.path)
-                       if err != nil {
-                               t.Fatalf("Lookup(%q): %v", tt.path, err)
-                       }
-                       list, err := repo.Versions(tt.prefix)
-                       if err != nil {
-                               t.Fatalf("Versions(%q): %v", tt.prefix, err)
-                       }
-                       if !reflect.DeepEqual(list, tt.versions) {
-                               t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions)
-                       }
-               })
-       }
+
+       t.Run("parallel", func(t *testing.T) {
+               for _, tt := range codeRepoVersionsTests {
+                       t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) {
+                               tt := tt
+                               t.Parallel()
+                               if tt.vcs != "mod" {
+                                       testenv.MustHaveExecPath(t, tt.vcs)
+                               }
+
+                               repo, err := Lookup("direct", tt.path)
+                               if err != nil {
+                                       t.Fatalf("Lookup(%q): %v", tt.path, err)
+                               }
+                               list, err := repo.Versions(tt.prefix)
+                               if err != nil {
+                                       t.Fatalf("Versions(%q): %v", tt.prefix, err)
+                               }
+                               if !reflect.DeepEqual(list, tt.versions) {
+                                       t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions)
+                               }
+                       })
+               }
+       })
 }
 
 var latestTests = []struct {
+       vcs     string
        path    string
        version string
        err     string
 }{
        {
+               vcs:  "git",
                path: "github.com/rsc/empty",
                err:  "no commits",
        },
        {
+               vcs:     "git",
                path:    "github.com/rsc/vgotest1",
                version: "v0.0.0-20180219223237-a08abb797a67",
        },
        {
+               vcs:  "git",
                path: "github.com/rsc/vgotest1/subdir",
-               err:  "missing github.com/rsc/vgotest1/subdir/go.mod at revision a08abb797a67",
+               err:  "github.com/rsc/vgotest1/subdir@v0.0.0-20180219223237-a08abb797a67: invalid version: missing github.com/rsc/vgotest1/subdir/go.mod at revision a08abb797a67",
        },
        {
+               vcs:     "mod",
                path:    "swtch.com/testmod",
                version: "v1.1.1",
        },
@@ -584,51 +655,49 @@ func TestLatest(t *testing.T) {
                t.Fatal(err)
        }
        defer os.RemoveAll(tmpdir)
-       for _, tt := range latestTests {
-               name := strings.ReplaceAll(tt.path, "/", "_")
-               t.Run(name, func(t *testing.T) {
-                       repo, err := Lookup(tt.path)
-                       if err != nil {
-                               t.Fatalf("Lookup(%q): %v", tt.path, err)
-                       }
-                       info, err := repo.Latest()
-                       if err != nil {
-                               if tt.err != "" {
-                                       if err.Error() == tt.err {
-                                               return
+
+       t.Run("parallel", func(t *testing.T) {
+               for _, tt := range latestTests {
+                       name := strings.ReplaceAll(tt.path, "/", "_")
+                       t.Run(name, func(t *testing.T) {
+                               tt := tt
+                               t.Parallel()
+                               if tt.vcs != "mod" {
+                                       testenv.MustHaveExecPath(t, tt.vcs)
+                               }
+
+                               repo, err := Lookup("direct", tt.path)
+                               if err != nil {
+                                       t.Fatalf("Lookup(%q): %v", tt.path, err)
+                               }
+                               info, err := repo.Latest()
+                               if err != nil {
+                                       if tt.err != "" {
+                                               if err.Error() == tt.err {
+                                                       return
+                                               }
+                                               t.Fatalf("Latest(): %v, want %q", err, tt.err)
                                        }
-                                       t.Fatalf("Latest(): %v, want %q", err, tt.err)
+                                       t.Fatalf("Latest(): %v", err)
                                }
-                               t.Fatalf("Latest(): %v", err)
-                       }
-                       if tt.err != "" {
-                               t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err)
-                       }
-                       if info.Version != tt.version {
-                               t.Fatalf("Latest() = %v, want %v", info.Version, tt.version)
-                       }
-               })
-       }
+                               if tt.err != "" {
+                                       t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err)
+                               }
+                               if info.Version != tt.version {
+                                       t.Fatalf("Latest() = %v, want %v", info.Version, tt.version)
+                               }
+                       })
+               }
+       })
 }
 
 // fixedTagsRepo is a fake codehost.Repo that returns a fixed list of tags
 type fixedTagsRepo struct {
        tags []string
+       codehost.Repo
 }
 
-func (ch *fixedTagsRepo) Tags(string) ([]string, error)                  { return ch.tags, nil }
-func (ch *fixedTagsRepo) Latest() (*codehost.RevInfo, error)             { panic("not impl") }
-func (ch *fixedTagsRepo) ReadFile(string, string, int64) ([]byte, error) { panic("not impl") }
-func (ch *fixedTagsRepo) ReadFileRevs([]string, string, int64) (map[string]*codehost.FileRev, error) {
-       panic("not impl")
-}
-func (ch *fixedTagsRepo) ReadZip(string, string, int64) (io.ReadCloser, string, error) {
-       panic("not impl")
-}
-func (ch *fixedTagsRepo) RecentTag(string, string) (string, error) {
-       panic("not impl")
-}
-func (ch *fixedTagsRepo) Stat(string) (*codehost.RevInfo, error) { panic("not impl") }
+func (ch *fixedTagsRepo) Tags(string) ([]string, error) { return ch.tags, nil }
 
 func TestNonCanonicalSemver(t *testing.T) {
        root := "golang.org/x/issue24476"
index 81a6c843abccf5c3fb211b934fb00ad56506c39d..74e36cc6fc1579cb2d3f2cf49a81abd0eedef72c 100644 (file)
@@ -48,7 +48,7 @@ func Download(mod module.Version) (dir string, err error) {
                if err := download(mod, dir); err != nil {
                        return cached{"", err}
                }
-               checkSum(mod)
+               checkMod(mod)
                return cached{dir, nil}
        }).(cached)
        return c.dir, c.err
@@ -205,13 +205,16 @@ func downloadZip(mod module.Version, zipfile string) (err error) {
                }
        }()
 
-       repo, err := Lookup(mod.Path)
+       err = TryProxies(func(proxy string) error {
+               repo, err := Lookup(proxy, mod.Path)
+               if err != nil {
+                       return err
+               }
+               return repo.Zip(f, mod.Version)
+       })
        if err != nil {
                return err
        }
-       if err := repo.Zip(f, mod.Version); err != nil {
-               return err
-       }
 
        // Double-check that the paths within the zip file are well-formed.
        //
@@ -246,9 +249,9 @@ func downloadZip(mod module.Version, zipfile string) (err error) {
        if err != nil {
                return err
        }
-       checkOneSum(mod, hash)
+       checkModSum(mod, hash)
 
-       if err := renameio.WriteFile(zipfile+"hash", []byte(hash)); err != nil {
+       if err := renameio.WriteFile(zipfile+"hash", []byte(hash), 0666); err != nil {
                return err
        }
        if err := os.Rename(f.Name(), zipfile); err != nil {
@@ -290,7 +293,7 @@ func initGoSum() bool {
 
        goSum.m = make(map[module.Version][]string)
        goSum.checked = make(map[modSum]bool)
-       data, err := ioutil.ReadFile(GoSumFile)
+       data, err := renameio.ReadFile(GoSumFile)
        if err != nil && !os.IsNotExist(err) {
                base.Fatalf("go: %v", err)
        }
@@ -300,12 +303,12 @@ func initGoSum() bool {
        // Add old go.modverify file.
        // We'll delete go.modverify in WriteGoSum.
        alt := strings.TrimSuffix(GoSumFile, ".sum") + ".modverify"
-       if data, err := ioutil.ReadFile(alt); err == nil {
+       if data, err := renameio.ReadFile(alt); err == nil {
                migrate := make(map[module.Version][]string)
                readGoSum(migrate, alt, data)
                for mod, sums := range migrate {
                        for _, sum := range sums {
-                               checkOneSumLocked(mod, sum)
+                               addModSumLocked(mod, sum)
                        }
                }
                goSum.modverify = alt
@@ -348,8 +351,8 @@ func readGoSum(dst map[module.Version][]string, file string, data []byte) {
        }
 }
 
-// checkSum checks the given module's checksum.
-func checkSum(mod module.Version) {
+// checkMod checks the given module's checksum.
+func checkMod(mod module.Version) {
        if PkgMod == "" {
                // Do not use current directory.
                return
@@ -360,7 +363,7 @@ func checkSum(mod module.Version) {
        if err != nil {
                base.Fatalf("verifying %s@%s: %v", mod.Path, mod.Version, err)
        }
-       data, err := ioutil.ReadFile(ziphash)
+       data, err := renameio.ReadFile(ziphash)
        if err != nil {
                if os.IsNotExist(err) {
                        // This can happen if someone does rm -rf GOPATH/src/cache/download. So it goes.
@@ -373,7 +376,7 @@ func checkSum(mod module.Version) {
                base.Fatalf("verifying %s@%s: unexpected ziphash: %q", mod.Path, mod.Version, h)
        }
 
-       checkOneSum(mod, h)
+       checkModSum(mod, h)
 }
 
 // goModSum returns the checksum for the go.mod contents.
@@ -391,36 +394,90 @@ func checkGoMod(path, version string, data []byte) {
                base.Fatalf("verifying %s %s go.mod: %v", path, version, err)
        }
 
-       checkOneSum(module.Version{Path: path, Version: version + "/go.mod"}, h)
+       checkModSum(module.Version{Path: path, Version: version + "/go.mod"}, h)
 }
 
-// checkOneSum checks that the recorded hash for mod is h.
-func checkOneSum(mod module.Version, h string) {
+// checkModSum checks that the recorded checksum for mod is h.
+func checkModSum(mod module.Version, h string) {
+       // We lock goSum when manipulating it,
+       // but we arrange to release the lock when calling checkSumDB,
+       // so that parallel calls to checkModHash can execute parallel calls
+       // to checkSumDB.
+
+       // Check whether mod+h is listed in go.sum already. If so, we're done.
        goSum.mu.Lock()
-       defer goSum.mu.Unlock()
-       if initGoSum() {
-               checkOneSumLocked(mod, h)
+       inited := initGoSum()
+       done := inited && haveModSumLocked(mod, h)
+       goSum.mu.Unlock()
+
+       if done {
+               return
+       }
+
+       // Not listed, so we want to add them.
+       // Consult checksum database if appropriate.
+       if useSumDB(mod) {
+               // Calls base.Fatalf if mismatch detected.
+               checkSumDB(mod, h)
+       }
+
+       // Add mod+h to go.sum, if it hasn't appeared already.
+       if inited {
+               goSum.mu.Lock()
+               addModSumLocked(mod, h)
+               goSum.mu.Unlock()
        }
 }
 
-func checkOneSumLocked(mod module.Version, h string) {
+// haveModSumLocked reports whether the pair mod,h is already listed in go.sum.
+// If it finds a conflicting pair instead, it calls base.Fatalf.
+// goSum.mu must be locked.
+func haveModSumLocked(mod module.Version, h string) bool {
        goSum.checked[modSum{mod, h}] = true
-
        for _, vh := range goSum.m[mod] {
                if h == vh {
-                       return
+                       return true
                }
                if strings.HasPrefix(vh, "h1:") {
-                       base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\tgo.sum:     %v", mod.Path, mod.Version, h, vh)
+                       base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\tgo.sum:     %v"+goSumMismatch, mod.Path, mod.Version, h, vh)
                }
        }
+       return false
+}
+
+// addModSumLocked adds the pair mod,h to go.sum.
+// goSum.mu must be locked.
+func addModSumLocked(mod module.Version, h string) {
+       if haveModSumLocked(mod, h) {
+               return
+       }
        if len(goSum.m[mod]) > 0 {
-               fmt.Fprintf(os.Stderr, "warning: verifying %s@%s: unknown hashes in go.sum: %v; adding %v", mod.Path, mod.Version, strings.Join(goSum.m[mod], ", "), h)
+               fmt.Fprintf(os.Stderr, "warning: verifying %s@%s: unknown hashes in go.sum: %v; adding %v"+hashVersionMismatch, mod.Path, mod.Version, strings.Join(goSum.m[mod], ", "), h)
        }
        goSum.m[mod] = append(goSum.m[mod], h)
        goSum.dirty = true
 }
 
+// checkSumDB checks the mod, h pair against the Go checksum database.
+// It calls base.Fatalf if the hash is to be rejected.
+func checkSumDB(mod module.Version, h string) {
+       db, lines, err := lookupSumDB(mod)
+       if err != nil {
+               base.Fatalf("verifying %s@%s: %v", mod.Path, mod.Version, err)
+       }
+
+       have := mod.Path + " " + mod.Version + " " + h
+       prefix := mod.Path + " " + mod.Version + " h1:"
+       for _, line := range lines {
+               if line == have {
+                       return
+               }
+               if strings.HasPrefix(line, prefix) {
+                       base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\t%s: %v"+sumdbMismatch, mod.Path, mod.Version, h, db, line[len(prefix)-len("h1:"):])
+               }
+       }
+}
+
 // Sum returns the checksum for the downloaded copy of the given module,
 // if present in the download cache.
 func Sum(mod module.Version) string {
@@ -433,7 +490,7 @@ func Sum(mod module.Version) string {
        if err != nil {
                return ""
        }
-       data, err := ioutil.ReadFile(ziphash)
+       data, err := renameio.ReadFile(ziphash)
        if err != nil {
                return ""
        }
@@ -455,6 +512,9 @@ func WriteGoSum() {
                // Don't bother opening the go.sum file if we don't have anything to add.
                return
        }
+       if cfg.BuildMod == "readonly" {
+               base.Fatalf("go: updates to go.sum needed, disabled by -mod=readonly")
+       }
 
        // We want to avoid races between creating the lockfile and deleting it, but
        // we also don't want to leave a permanent lockfile in the user's repository.
@@ -478,7 +538,7 @@ func WriteGoSum() {
        if !goSum.overwrite {
                // Re-read the go.sum file to incorporate any sums added by other processes
                // in the meantime.
-               data, err := ioutil.ReadFile(GoSumFile)
+               data, err := renameio.ReadFile(GoSumFile)
                if err != nil && !os.IsNotExist(err) {
                        base.Fatalf("go: re-reading go.sum: %v", err)
                }
@@ -489,7 +549,8 @@ func WriteGoSum() {
                goSum.m = make(map[module.Version][]string, len(goSum.m))
                readGoSum(goSum.m, GoSumFile, data)
                for ms := range goSum.checked {
-                       checkOneSumLocked(ms.mod, ms.sum)
+                       addModSumLocked(ms.mod, ms.sum)
+                       goSum.dirty = true
                }
        }
 
@@ -507,7 +568,7 @@ func WriteGoSum() {
                }
        }
 
-       if err := renameio.WriteFile(GoSumFile, buf.Bytes()); err != nil {
+       if err := renameio.WriteFile(GoSumFile, buf.Bytes(), 0666); err != nil {
                base.Fatalf("go: writing go.sum: %v", err)
        }
 
@@ -539,3 +600,170 @@ func TrimGoSum(keep map[module.Version]bool) {
                }
        }
 }
+
+const goSumMismatch = `
+
+SECURITY ERROR
+This download does NOT match an earlier download recorded in go.sum.
+The bits may have been replaced on the origin server, or an attacker may
+have intercepted the download attempt.
+
+For more information, see 'go help module-auth'.
+`
+
+const sumdbMismatch = `
+
+SECURITY ERROR
+This download does NOT match the one reported by the checksum server.
+The bits may have been replaced on the origin server, or an attacker may
+have intercepted the download attempt.
+
+For more information, see 'go help module-auth'.
+`
+
+const hashVersionMismatch = `
+
+SECURITY WARNING
+This download is listed in go.sum, but using an unknown hash algorithm.
+The download cannot be verified.
+
+For more information, see 'go help module-auth'.
+
+`
+
+var HelpModuleAuth = &base.Command{
+       UsageLine: "module-auth",
+       Short:     "module authentication using go.sum",
+       Long: `
+The go command tries to authenticate every downloaded module,
+checking that the bits downloaded for a specific module version today
+match bits downloaded yesterday. This ensures repeatable builds
+and detects introduction of unexpected changes, malicious or not.
+
+In each module's root, alongside go.mod, the go command maintains
+a file named go.sum containing the cryptographic checksums of the
+module's dependencies.
+
+The form of each line in go.sum is three fields:
+
+       <module> <version>[/go.mod] <hash>
+
+Each known module version results in two lines in the go.sum file.
+The first line gives the hash of the module version's file tree.
+The second line appends "/go.mod" to the version and gives the hash
+of only the module version's (possibly synthesized) go.mod file.
+The go.mod-only hash allows downloading and authenticating a
+module version's go.mod file, which is needed to compute the
+dependency graph, without also downloading all the module's source code.
+
+The hash begins with an algorithm prefix of the form "h<N>:".
+The only defined algorithm prefix is "h1:", which uses SHA-256.
+
+Module authentication failures
+
+The go command maintains a cache of downloaded packages and computes
+and records the cryptographic checksum of each package at download time.
+In normal operation, the go command checks the main module's go.sum file
+against these precomputed checksums instead of recomputing them on
+each command invocation. The 'go mod verify' command checks that
+the cached copies of module downloads still match both their recorded
+checksums and the entries in go.sum.
+
+In day-to-day development, the checksum of a given module version
+should never change. Each time a dependency is used by a given main
+module, the go command checks its local cached copy, freshly
+downloaded or not, against the main module's go.sum. If the checksums
+don't match, the go command reports the mismatch as a security error
+and refuses to run the build. When this happens, proceed with caution:
+code changing unexpectedly means today's build will not match
+yesterday's, and the unexpected change may not be beneficial.
+
+If the go command reports a mismatch in go.sum, the downloaded code
+for the reported module version does not match the one used in a
+previous build of the main module. It is important at that point
+to find out what the right checksum should be, to decide whether
+go.sum is wrong or the downloaded code is wrong. Usually go.sum is right:
+you want to use the same code you used yesterday.
+
+If a downloaded module is not yet included in go.sum and it is a publicly
+available module, the go command consults the Go checksum database to fetch
+the expected go.sum lines. If the downloaded code does not match those
+lines, the go command reports the mismatch and exits. Note that the
+database is not consulted for module versions already listed in go.sum.
+
+If a go.sum mismatch is reported, it is always worth investigating why
+the code downloaded today differs from what was downloaded yesterday.
+
+The GOSUMDB environment variable identifies the name of checksum database
+to use and optionally its public key and URL, as in:
+
+       GOSUMDB="sum.golang.org"
+       GOSUMDB="sum.golang.org+<publickey>"
+       GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
+
+The go command knows the public key of sum.golang.org; use of any other
+database requires giving the public key explicitly. The URL defaults to
+"https://" followed by the database name.
+
+GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google.
+See https://sum.golang.org/privacy for the service's privacy policy.
+
+If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag,
+the checksum database is not consulted, and all unrecognized modules are
+accepted, at the cost of giving up the security guarantee of verified repeatable
+downloads for all modules. A better way to bypass the checksum database
+for specific modules is to use the GOPRIVATE or GONOSUMDB environment
+variables. See 'go help module-private' for details.
+
+The 'go env -w' command (see 'go help env') can be used to set these variables
+for future go command invocations.
+`,
+}
+
+var HelpModulePrivate = &base.Command{
+       UsageLine: "module-private",
+       Short:     "module configuration for non-public modules",
+       Long: `
+The go command defaults to downloading modules from the public Go module
+mirror at proxy.golang.org. It also defaults to validating downloaded modules,
+regardless of source, against the public Go checksum database at sum.golang.org.
+These defaults work well for publicly available source code.
+
+The GOPRIVATE environment variable controls which modules the go command
+considers to be private (not available publicly) and should therefore not use the
+proxy or checksum database. The variable is a comma-separated list of
+glob patterns (in the syntax of Go's path.Match) of module path prefixes.
+For example,
+
+       GOPRIVATE=*.corp.example.com,rsc.io/private
+
+causes the go command to treat as private any module with a path prefix
+matching either pattern, including git.corp.example.com/xyzzy, rsc.io/private,
+and rsc.io/private/quux.
+
+The GOPRIVATE environment variable may be used by other tools as well to
+identify non-public modules. For example, an editor could use GOPRIVATE
+to decide whether to hyperlink a package import to a godoc.org page.
+
+For fine-grained control over module download and validation, the GONOPROXY
+and GONOSUMDB environment variables accept the same kind of glob list
+and override GOPRIVATE for the specific decision of whether to use the proxy
+and checksum database, respectively.
+
+For example, if a company ran a module proxy serving private modules,
+users would configure go using:
+
+       GOPRIVATE=*.corp.example.com
+       GOPROXY=proxy.example.com
+       GONOPROXY=none
+
+This would tell the go command and other tools that modules beginning with
+a corp.example.com subdomain are private but that the company proxy should
+be used for downloading both public and private modules, because
+GONOPROXY has been set to a pattern that won't match any modules,
+overriding GOPRIVATE.
+
+The 'go env -w' command (see 'go help env') can be used to set these variables
+for future go command invocations.
+`,
+}
diff --git a/libgo/go/cmd/go/internal/modfetch/key.go b/libgo/go/cmd/go/internal/modfetch/key.go
new file mode 100644 (file)
index 0000000..06f9989
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package modfetch
+
+var knownGOSUMDB = map[string]string{
+       "sum.golang.org": "sum.golang.org+033de0ae+Ac4zctda0e5eza+HJyk9SxEdh+s3Ux18htTTAD8OuAn8",
+}
diff --git a/libgo/go/cmd/go/internal/modfetch/noweb.go b/libgo/go/cmd/go/internal/modfetch/noweb.go
deleted file mode 100644 (file)
index 9d713dc..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cmd_go_bootstrap
-
-package modfetch
-
-import (
-       "fmt"
-       "io"
-)
-
-func webGetGoGet(url string, body *io.ReadCloser) error {
-       return fmt.Errorf("no network in go_bootstrap")
-}
-
-func webGetBytes(url string, body *[]byte) error {
-       return fmt.Errorf("no network in go_bootstrap")
-}
-
-func webGetBody(url string, body *io.ReadCloser) error {
-       return fmt.Errorf("no network in go_bootstrap")
-}
index 60ed2a37966067dc9f9647facbe9c6aed9749a00..6049ccfd30a5bc26abf6140173e71aabbeb84d09 100644 (file)
@@ -6,33 +6,31 @@ package modfetch
 
 import (
        "encoding/json"
+       "errors"
        "fmt"
        "io"
+       "io/ioutil"
        "net/url"
        "os"
+       "path"
+       pathpkg "path"
+       "path/filepath"
        "strings"
+       "sync"
        "time"
 
        "cmd/go/internal/base"
+       "cmd/go/internal/cfg"
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/module"
        "cmd/go/internal/semver"
+       "cmd/go/internal/web"
 )
 
 var HelpGoproxy = &base.Command{
        UsageLine: "goproxy",
        Short:     "module proxy protocol",
        Long: `
-The go command by default downloads modules from version control systems
-directly, just as 'go get' always has. The GOPROXY environment variable allows
-further control over the download source. If GOPROXY is unset, is the empty string,
-or is the string "direct", downloads use the default direct connection to version
-control systems. Setting GOPROXY to "off" disallows downloading modules from
-any source. Otherwise, GOPROXY is expected to be the URL of a module proxy,
-in which case the go command will fetch all modules from that proxy.
-No matter the source of the modules, downloaded modules must match existing
-entries in go.sum (see 'go help modules' for discussion of verification).
-
 A Go module proxy is any web server that can respond to GET requests for
 URLs of a specified form. The requests have no query parameters, so even
 a site serving from a fixed file system (including a file:/// URL)
@@ -85,47 +83,175 @@ cached module versions with GOPROXY=https://example.com/proxy.
 `,
 }
 
-var proxyURL = os.Getenv("GOPROXY")
+var proxyOnce struct {
+       sync.Once
+       list []string
+       err  error
+}
+
+func proxyURLs() ([]string, error) {
+       proxyOnce.Do(func() {
+               if cfg.GONOPROXY != "" && cfg.GOPROXY != "direct" {
+                       proxyOnce.list = append(proxyOnce.list, "noproxy")
+               }
+               for _, proxyURL := range strings.Split(cfg.GOPROXY, ",") {
+                       proxyURL = strings.TrimSpace(proxyURL)
+                       if proxyURL == "" {
+                               continue
+                       }
+                       if proxyURL == "off" {
+                               // "off" always fails hard, so can stop walking list.
+                               proxyOnce.list = append(proxyOnce.list, "off")
+                               break
+                       }
+                       if proxyURL == "direct" {
+                               proxyOnce.list = append(proxyOnce.list, "direct")
+                               // For now, "direct" is the end of the line. We may decide to add some
+                               // sort of fallback behavior for them in the future, so ignore
+                               // subsequent entries for forward-compatibility.
+                               break
+                       }
+
+                       // Single-word tokens are reserved for built-in behaviors, and anything
+                       // containing the string ":/" or matching an absolute file path must be a
+                       // complete URL. For all other paths, implicitly add "https://".
+                       if strings.ContainsAny(proxyURL, ".:/") && !strings.Contains(proxyURL, ":/") && !filepath.IsAbs(proxyURL) && !path.IsAbs(proxyURL) {
+                               proxyURL = "https://" + proxyURL
+                       }
+
+                       // Check that newProxyRepo accepts the URL.
+                       // It won't do anything with the path.
+                       _, err := newProxyRepo(proxyURL, "golang.org/x/text")
+                       if err != nil {
+                               proxyOnce.err = err
+                               return
+                       }
+                       proxyOnce.list = append(proxyOnce.list, proxyURL)
+               }
+       })
+
+       return proxyOnce.list, proxyOnce.err
+}
 
-func lookupProxy(path string) (Repo, error) {
-       if strings.Contains(proxyURL, ",") {
-               return nil, fmt.Errorf("invalid $GOPROXY setting: cannot have comma")
+// TryProxies iterates f over each configured proxy (including "noproxy" and
+// "direct" if applicable) until f returns an error that is not
+// equivalent to os.ErrNotExist.
+//
+// TryProxies then returns that final error.
+//
+// If GOPROXY is set to "off", TryProxies invokes f once with the argument
+// "off".
+func TryProxies(f func(proxy string) error) error {
+       proxies, err := proxyURLs()
+       if err != nil {
+               return err
        }
-       u, err := url.Parse(proxyURL)
-       if err != nil || u.Scheme != "http" && u.Scheme != "https" && u.Scheme != "file" {
-               // Don't echo $GOPROXY back in case it has user:password in it (sigh).
-               return nil, fmt.Errorf("invalid $GOPROXY setting: malformed URL or invalid scheme (must be http, https, file)")
+       if len(proxies) == 0 {
+               return f("off")
+       }
+
+       for _, proxy := range proxies {
+               err = f(proxy)
+               if !errors.Is(err, os.ErrNotExist) {
+                       break
+               }
        }
-       return newProxyRepo(u.String(), path)
+       return err
 }
 
 type proxyRepo struct {
-       url  string
+       url  *url.URL
        path string
 }
 
 func newProxyRepo(baseURL, path string) (Repo, error) {
+       base, err := url.Parse(baseURL)
+       if err != nil {
+               return nil, err
+       }
+       switch base.Scheme {
+       case "http", "https":
+               // ok
+       case "file":
+               if *base != (url.URL{Scheme: base.Scheme, Path: base.Path, RawPath: base.RawPath}) {
+                       return nil, fmt.Errorf("invalid file:// proxy URL with non-path elements: %s", web.Redacted(base))
+               }
+       case "":
+               return nil, fmt.Errorf("invalid proxy URL missing scheme: %s", web.Redacted(base))
+       default:
+               return nil, fmt.Errorf("invalid proxy URL scheme (must be https, http, file): %s", web.Redacted(base))
+       }
+
        enc, err := module.EncodePath(path)
        if err != nil {
                return nil, err
        }
-       return &proxyRepo{strings.TrimSuffix(baseURL, "/") + "/" + pathEscape(enc), path}, nil
+
+       base.Path = strings.TrimSuffix(base.Path, "/") + "/" + enc
+       base.RawPath = strings.TrimSuffix(base.RawPath, "/") + "/" + pathEscape(enc)
+       return &proxyRepo{base, path}, nil
 }
 
 func (p *proxyRepo) ModulePath() string {
        return p.path
 }
 
-func (p *proxyRepo) Versions(prefix string) ([]string, error) {
-       var data []byte
-       err := webGetBytes(p.url+"/@v/list", &data)
+// versionError returns err wrapped in a ModuleError for p.path.
+func (p *proxyRepo) versionError(version string, err error) error {
+       if version != "" && version != module.CanonicalVersion(version) {
+               return &module.ModuleError{
+                       Path: p.path,
+                       Err: &module.InvalidVersionError{
+                               Version: version,
+                               Pseudo:  IsPseudoVersion(version),
+                               Err:     err,
+                       },
+               }
+       }
+
+       return &module.ModuleError{
+               Path:    p.path,
+               Version: version,
+               Err:     err,
+       }
+}
+
+func (p *proxyRepo) getBytes(path string) ([]byte, error) {
+       body, err := p.getBody(path)
        if err != nil {
                return nil, err
        }
+       defer body.Close()
+       return ioutil.ReadAll(body)
+}
+
+func (p *proxyRepo) getBody(path string) (io.ReadCloser, error) {
+       fullPath := pathpkg.Join(p.url.Path, path)
+
+       target := *p.url
+       target.Path = fullPath
+       target.RawPath = pathpkg.Join(target.RawPath, pathEscape(path))
+
+       resp, err := web.Get(web.DefaultSecurity, &target)
+       if err != nil {
+               return nil, err
+       }
+       if err := resp.Err(); err != nil {
+               resp.Body.Close()
+               return nil, err
+       }
+       return resp.Body, nil
+}
+
+func (p *proxyRepo) Versions(prefix string) ([]string, error) {
+       data, err := p.getBytes("@v/list")
+       if err != nil {
+               return nil, p.versionError("", err)
+       }
        var list []string
        for _, line := range strings.Split(string(data), "\n") {
                f := strings.Fields(line)
-               if len(f) >= 1 && semver.IsValid(f[0]) && strings.HasPrefix(f[0], prefix) {
+               if len(f) >= 1 && semver.IsValid(f[0]) && strings.HasPrefix(f[0], prefix) && !IsPseudoVersion(f[0]) {
                        list = append(list, f[0])
                }
        }
@@ -134,98 +260,138 @@ func (p *proxyRepo) Versions(prefix string) ([]string, error) {
 }
 
 func (p *proxyRepo) latest() (*RevInfo, error) {
-       var data []byte
-       err := webGetBytes(p.url+"/@v/list", &data)
+       data, err := p.getBytes("@v/list")
        if err != nil {
-               return nil, err
+               return nil, p.versionError("", err)
        }
-       var best time.Time
-       var bestVersion string
+
+       var (
+               bestTime             time.Time
+               bestTimeIsFromPseudo bool
+               bestVersion          string
+       )
+
        for _, line := range strings.Split(string(data), "\n") {
                f := strings.Fields(line)
-               if len(f) >= 2 && semver.IsValid(f[0]) {
-                       ft, err := time.Parse(time.RFC3339, f[1])
-                       if err == nil && best.Before(ft) {
-                               best = ft
+               if len(f) >= 1 && semver.IsValid(f[0]) {
+                       // If the proxy includes timestamps, prefer the timestamp it reports.
+                       // Otherwise, derive the timestamp from the pseudo-version.
+                       var (
+                               ft             time.Time
+                               ftIsFromPseudo = false
+                       )
+                       if len(f) >= 2 {
+                               ft, _ = time.Parse(time.RFC3339, f[1])
+                       } else if IsPseudoVersion(f[0]) {
+                               ft, _ = PseudoVersionTime(f[0])
+                               ftIsFromPseudo = true
+                       } else {
+                               // Repo.Latest promises that this method is only called where there are
+                               // no tagged versions. Ignore any tagged versions that were added in the
+                               // meantime.
+                               continue
+                       }
+                       if bestTime.Before(ft) {
+                               bestTime = ft
+                               bestTimeIsFromPseudo = ftIsFromPseudo
                                bestVersion = f[0]
                        }
                }
        }
        if bestVersion == "" {
-               return nil, fmt.Errorf("no commits")
+               return nil, p.versionError("", codehost.ErrNoCommits)
+       }
+
+       if bestTimeIsFromPseudo {
+               // We parsed bestTime from the pseudo-version, but that's in UTC and we're
+               // supposed to report the timestamp as reported by the VCS.
+               // Stat the selected version to canonicalize the timestamp.
+               //
+               // TODO(bcmills): Should we also stat other versions to ensure that we
+               // report the correct Name and Short for the revision?
+               return p.Stat(bestVersion)
        }
-       info := &RevInfo{
+
+       return &RevInfo{
                Version: bestVersion,
                Name:    bestVersion,
                Short:   bestVersion,
-               Time:    best,
-       }
-       return info, nil
+               Time:    bestTime,
+       }, nil
 }
 
 func (p *proxyRepo) Stat(rev string) (*RevInfo, error) {
-       var data []byte
        encRev, err := module.EncodeVersion(rev)
        if err != nil {
-               return nil, err
+               return nil, p.versionError(rev, err)
        }
-       err = webGetBytes(p.url+"/@v/"+pathEscape(encRev)+".info", &data)
+       data, err := p.getBytes("@v/" + encRev + ".info")
        if err != nil {
-               return nil, err
+               return nil, p.versionError(rev, err)
        }
        info := new(RevInfo)
        if err := json.Unmarshal(data, info); err != nil {
-               return nil, err
+               return nil, p.versionError(rev, err)
+       }
+       if info.Version != rev && rev == module.CanonicalVersion(rev) && module.Check(p.path, rev) == nil {
+               // If we request a correct, appropriate version for the module path, the
+               // proxy must return either exactly that version or an error — not some
+               // arbitrary other version.
+               return nil, p.versionError(rev, fmt.Errorf("proxy returned info for version %s instead of requested version", info.Version))
        }
        return info, nil
 }
 
 func (p *proxyRepo) Latest() (*RevInfo, error) {
-       var data []byte
-       u := p.url + "/@latest"
-       err := webGetBytes(u, &data)
+       data, err := p.getBytes("@latest")
        if err != nil {
                // TODO return err if not 404
                return p.latest()
        }
        info := new(RevInfo)
        if err := json.Unmarshal(data, info); err != nil {
-               return nil, err
+               return nil, p.versionError("", err)
        }
        return info, nil
 }
 
 func (p *proxyRepo) GoMod(version string) ([]byte, error) {
-       var data []byte
+       if version != module.CanonicalVersion(version) {
+               return nil, p.versionError(version, fmt.Errorf("internal error: version passed to GoMod is not canonical"))
+       }
+
        encVer, err := module.EncodeVersion(version)
        if err != nil {
-               return nil, err
+               return nil, p.versionError(version, err)
        }
-       err = webGetBytes(p.url+"/@v/"+pathEscape(encVer)+".mod", &data)
+       data, err := p.getBytes("@v/" + encVer + ".mod")
        if err != nil {
-               return nil, err
+               return nil, p.versionError(version, err)
        }
        return data, nil
 }
 
 func (p *proxyRepo) Zip(dst io.Writer, version string) error {
-       var body io.ReadCloser
+       if version != module.CanonicalVersion(version) {
+               return p.versionError(version, fmt.Errorf("internal error: version passed to Zip is not canonical"))
+       }
+
        encVer, err := module.EncodeVersion(version)
        if err != nil {
-               return err
+               return p.versionError(version, err)
        }
-       err = webGetBody(p.url+"/@v/"+pathEscape(encVer)+".zip", &body)
+       body, err := p.getBody("@v/" + encVer + ".zip")
        if err != nil {
-               return err
+               return p.versionError(version, err)
        }
        defer body.Close()
 
        lr := &io.LimitedReader{R: body, N: codehost.MaxZipFile + 1}
        if _, err := io.Copy(dst, lr); err != nil {
-               return err
+               return p.versionError(version, err)
        }
        if lr.N <= 0 {
-               return fmt.Errorf("downloaded zip file too large")
+               return p.versionError(version, fmt.Errorf("downloaded zip file too large"))
        }
        return nil
 }
index 32c7bf883becd471344061028757e777f8d3c8a0..8c063b9107f968c7f1f121c4add2356454a0ce9f 100644 (file)
 package modfetch
 
 import (
-       "cmd/go/internal/semver"
+       "errors"
        "fmt"
-       "regexp"
        "strings"
        "time"
+
+       "cmd/go/internal/module"
+       "cmd/go/internal/semver"
+       "internal/lazyregexp"
 )
 
+var pseudoVersionRE = lazyregexp.New(`^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)\d{14}-[A-Za-z0-9]+(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$`)
+
 // PseudoVersion returns a pseudo-version for the given major version ("v1")
 // preexisting older tagged version ("" or "v1.2.3" or "v1.2.3-pre"), revision time,
 // and revision identifier (usually a 12-byte commit hash prefix).
@@ -49,7 +54,6 @@ func PseudoVersion(major, older string, t time.Time, rev string) string {
        if major == "" {
                major = "v0"
        }
-       major = strings.TrimSuffix(major, "-unstable") // make gopkg.in/macaroon-bakery.v2-unstable use "v2"
        segment := fmt.Sprintf("%s-%s", t.UTC().Format("20060102150405"), rev)
        build := semver.Build(older)
        older = semver.Canonical(older)
@@ -62,15 +66,19 @@ func PseudoVersion(major, older string, t time.Time, rev string) string {
 
        // Form (2), (3).
        // Extract patch from vMAJOR.MINOR.PATCH
-       v := older[:len(older)]
-       i := strings.LastIndex(v, ".") + 1
-       v, patch := v[:i], v[i:]
-
-       // Increment PATCH by adding 1 to decimal:
-       // scan right to left turning 9s to 0s until you find a digit to increment.
-       // (Number might exceed int64, but math/big is overkill.)
-       digits := []byte(patch)
-       for i = len(digits) - 1; i >= 0 && digits[i] == '9'; i-- {
+       i := strings.LastIndex(older, ".") + 1
+       v, patch := older[:i], older[i:]
+
+       // Reassemble.
+       return v + incDecimal(patch) + "-0." + segment + build
+}
+
+// incDecimal returns the decimal string incremented by 1.
+func incDecimal(decimal string) string {
+       // Scan right to left turning 9s to 0s until you find a digit to increment.
+       digits := []byte(decimal)
+       i := len(digits) - 1
+       for ; i >= 0 && digits[i] == '9'; i-- {
                digits[i] = '0'
        }
        if i >= 0 {
@@ -80,13 +88,29 @@ func PseudoVersion(major, older string, t time.Time, rev string) string {
                digits[0] = '1'
                digits = append(digits, '0')
        }
-       patch = string(digits)
-
-       // Reassemble.
-       return v + patch + "-0." + segment + build
+       return string(digits)
 }
 
-var pseudoVersionRE = regexp.MustCompile(`^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)\d{14}-[A-Za-z0-9]+(\+incompatible)?$`)
+// decDecimal returns the decimal string decremented by 1, or the empty string
+// if the decimal is all zeroes.
+func decDecimal(decimal string) string {
+       // Scan right to left turning 0s to 9s until you find a digit to decrement.
+       digits := []byte(decimal)
+       i := len(digits) - 1
+       for ; i >= 0 && digits[i] == '0'; i-- {
+               digits[i] = '9'
+       }
+       if i < 0 {
+               // decimal is all zeros
+               return ""
+       }
+       if i == 0 && digits[i] == '1' && len(digits) > 1 {
+               digits = digits[1:]
+       } else {
+               digits[i]--
+       }
+       return string(digits)
+}
 
 // IsPseudoVersion reports whether v is a pseudo-version.
 func IsPseudoVersion(v string) bool {
@@ -97,10 +121,17 @@ func IsPseudoVersion(v string) bool {
 // It returns an error if v is not a pseudo-version or if the time stamp
 // embedded in the pseudo-version is not a valid time.
 func PseudoVersionTime(v string) (time.Time, error) {
-       timestamp, _, err := parsePseudoVersion(v)
+       _, timestamp, _, _, err := parsePseudoVersion(v)
+       if err != nil {
+               return time.Time{}, err
+       }
        t, err := time.Parse("20060102150405", timestamp)
        if err != nil {
-               return time.Time{}, fmt.Errorf("pseudo-version with malformed time %s: %q", timestamp, v)
+               return time.Time{}, &module.InvalidVersionError{
+                       Version: v,
+                       Pseudo:  true,
+                       Err:     fmt.Errorf("malformed time %q", timestamp),
+               }
        }
        return t, nil
 }
@@ -108,22 +139,99 @@ func PseudoVersionTime(v string) (time.Time, error) {
 // PseudoVersionRev returns the revision identifier of the pseudo-version v.
 // It returns an error if v is not a pseudo-version.
 func PseudoVersionRev(v string) (rev string, err error) {
-       _, rev, err = parsePseudoVersion(v)
+       _, _, rev, _, err = parsePseudoVersion(v)
        return
 }
 
-func parsePseudoVersion(v string) (timestamp, rev string, err error) {
+// PseudoVersionBase returns the canonical parent version, if any, upon which
+// the pseudo-version v is based.
+//
+// If v has no parent version (that is, if it is "vX.0.0-[…]"),
+// PseudoVersionBase returns the empty string and a nil error.
+func PseudoVersionBase(v string) (string, error) {
+       base, _, _, build, err := parsePseudoVersion(v)
+       if err != nil {
+               return "", err
+       }
+
+       switch pre := semver.Prerelease(base); pre {
+       case "":
+               // vX.0.0-yyyymmddhhmmss-abcdef123456 → ""
+               if build != "" {
+                       // Pseudo-versions of the form vX.0.0-yyyymmddhhmmss-abcdef123456+incompatible
+                       // are nonsensical: the "vX.0.0-" prefix implies that there is no parent tag,
+                       // but the "+incompatible" suffix implies that the major version of
+                       // the parent tag is not compatible with the module's import path.
+                       //
+                       // There are a few such entries in the index generated by proxy.golang.org,
+                       // but we believe those entries were generated by the proxy itself.
+                       return "", &module.InvalidVersionError{
+                               Version: v,
+                               Pseudo:  true,
+                               Err:     fmt.Errorf("lacks base version, but has build metadata %q", build),
+                       }
+               }
+               return "", nil
+
+       case "-0":
+               // vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456 → vX.Y.Z
+               // vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456+incompatible → vX.Y.Z+incompatible
+               base = strings.TrimSuffix(base, pre)
+               i := strings.LastIndexByte(base, '.')
+               if i < 0 {
+                       panic("base from parsePseudoVersion missing patch number: " + base)
+               }
+               patch := decDecimal(base[i+1:])
+               if patch == "" {
+                       // vX.0.0-0 is invalid, but has been observed in the wild in the index
+                       // generated by requests to proxy.golang.org.
+                       //
+                       // NOTE(bcmills): I cannot find a historical bug that accounts for
+                       // pseudo-versions of this form, nor have I seen such versions in any
+                       // actual go.mod files. If we find actual examples of this form and a
+                       // reasonable theory of how they came into existence, it seems fine to
+                       // treat them as equivalent to vX.0.0 (especially since the invalid
+                       // pseudo-versions have lower precedence than the real ones). For now, we
+                       // reject them.
+                       return "", &module.InvalidVersionError{
+                               Version: v,
+                               Pseudo:  true,
+                               Err:     fmt.Errorf("version before %s would have negative patch number", base),
+                       }
+               }
+               return base[:i+1] + patch + build, nil
+
+       default:
+               // vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456 → vX.Y.Z-pre
+               // vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456+incompatible → vX.Y.Z-pre+incompatible
+               if !strings.HasSuffix(base, ".0") {
+                       panic(`base from parsePseudoVersion missing ".0" before date: ` + base)
+               }
+               return strings.TrimSuffix(base, ".0") + build, nil
+       }
+}
+
+var errPseudoSyntax = errors.New("syntax error")
+
+func parsePseudoVersion(v string) (base, timestamp, rev, build string, err error) {
        if !IsPseudoVersion(v) {
-               return "", "", fmt.Errorf("malformed pseudo-version %q", v)
+               return "", "", "", "", &module.InvalidVersionError{
+                       Version: v,
+                       Pseudo:  true,
+                       Err:     errPseudoSyntax,
+               }
        }
-       v = strings.TrimSuffix(v, "+incompatible")
+       build = semver.Build(v)
+       v = strings.TrimSuffix(v, build)
        j := strings.LastIndex(v, "-")
        v, rev = v[:j], v[j+1:]
        i := strings.LastIndex(v, "-")
        if j := strings.LastIndex(v, "."); j > i {
+               base = v[:j] // "vX.Y.Z-pre.0" or "vX.Y.(Z+1)-0"
                timestamp = v[j+1:]
        } else {
+               base = v[:i] // "vX.0.0"
                timestamp = v[i+1:]
        }
-       return timestamp, rev, nil
+       return base, timestamp, rev, build, nil
 }
index 3c2fa5146890eaa3e59d2fbbabbb4109706a1d44..4483f8e962fa5212ea2ae65e1eac66e5117a15ed 100644 (file)
@@ -23,6 +23,10 @@ var pseudoTests = []struct {
        {"unused", "v1.2.99999999999999999", "v1.2.100000000000000000-0.20060102150405-hash"},
        {"unused", "v1.2.3-pre", "v1.2.3-pre.0.20060102150405-hash"},
        {"unused", "v1.3.0-pre", "v1.3.0-pre.0.20060102150405-hash"},
+       {"unused", "v0.0.0--", "v0.0.0--.0.20060102150405-hash"},
+       {"unused", "v1.0.0+metadata", "v1.0.1-0.20060102150405-hash+metadata"},
+       {"unused", "v2.0.0+incompatible", "v2.0.1-0.20060102150405-hash+incompatible"},
+       {"unused", "v2.3.0-pre+incompatible", "v2.3.0-pre.0.20060102150405-hash+incompatible"},
 }
 
 var pseudoTime = time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)
@@ -60,6 +64,13 @@ func TestPseudoVersionTime(t *testing.T) {
        }
 }
 
+func TestInvalidPseudoVersionTime(t *testing.T) {
+       const v = "---"
+       if _, err := PseudoVersionTime(v); err == nil {
+               t.Error("expected error, got nil instead")
+       }
+}
+
 func TestPseudoVersionRev(t *testing.T) {
        for _, tt := range pseudoTests {
                rev, err := PseudoVersionRev(tt.version)
@@ -72,3 +83,72 @@ func TestPseudoVersionRev(t *testing.T) {
                }
        }
 }
+
+func TestPseudoVersionBase(t *testing.T) {
+       for _, tt := range pseudoTests {
+               base, err := PseudoVersionBase(tt.version)
+               if err != nil {
+                       t.Errorf("PseudoVersionBase(%q): %v", tt.version, err)
+               } else if base != tt.older {
+                       t.Errorf("PseudoVersionBase(%q) = %q; want %q", tt.version, base, tt.older)
+               }
+       }
+}
+
+func TestInvalidPseudoVersionBase(t *testing.T) {
+       for _, in := range []string{
+               "v0.0.0",
+               "v0.0.0-",                                 // malformed: empty prerelease
+               "v0.0.0-0.20060102150405-hash",            // Z+1 == 0
+               "v0.1.0-0.20060102150405-hash",            // Z+1 == 0
+               "v1.0.0-0.20060102150405-hash",            // Z+1 == 0
+               "v0.0.0-20060102150405-hash+incompatible", // "+incompatible without base version
+               "v0.0.0-20060102150405-hash+metadata",     // other metadata without base version
+       } {
+               base, err := PseudoVersionBase(in)
+               if err == nil || base != "" {
+                       t.Errorf(`PseudoVersionBase(%q) = %q, %v; want "", error`, in, base, err)
+               }
+       }
+}
+
+func TestIncDecimal(t *testing.T) {
+       cases := []struct {
+               in, want string
+       }{
+               {"0", "1"},
+               {"1", "2"},
+               {"99", "100"},
+               {"100", "101"},
+               {"101", "102"},
+       }
+
+       for _, tc := range cases {
+               got := incDecimal(tc.in)
+               if got != tc.want {
+                       t.Fatalf("incDecimal(%q) = %q; want %q", tc.in, tc.want, got)
+               }
+       }
+}
+
+func TestDecDecimal(t *testing.T) {
+       cases := []struct {
+               in, want string
+       }{
+               {"", ""},
+               {"0", ""},
+               {"00", ""},
+               {"1", "0"},
+               {"2", "1"},
+               {"99", "98"},
+               {"100", "99"},
+               {"101", "100"},
+       }
+
+       for _, tc := range cases {
+               got := decDecimal(tc.in)
+               if got != tc.want {
+                       t.Fatalf("decDecimal(%q) = %q; want %q", tc.in, tc.want, got)
+               }
+       }
+}
index c63f6b04221dd570a7e4e8d34a79a83b27995e18..95351269dbec8c79b82e8e0c12a7249740b5f01a 100644 (file)
@@ -5,6 +5,7 @@
 package modfetch
 
 import (
+       "errors"
        "fmt"
        "io"
        "os"
@@ -17,6 +18,7 @@ import (
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/par"
        "cmd/go/internal/semver"
+       "cmd/go/internal/str"
        web "cmd/go/internal/web"
 )
 
@@ -160,12 +162,6 @@ type RevInfo struct {
 // To avoid version control access except when absolutely necessary,
 // Lookup does not attempt to connect to the repository itself.
 //
-// The Import function takes an import path found in source code and
-// determines which module to add to the requirement list to satisfy
-// that import. It checks successive truncations of the import path
-// to determine possible modules and stops when it finds a module
-// in which the latest version satisfies the import path.
-//
 // The ImportRepoRev function is a variant of Import which is limited
 // to code in a source code repository at a particular revision identifier
 // (usually a commit hash or source code repository tag, not necessarily
@@ -177,20 +173,32 @@ type RevInfo struct {
 
 var lookupCache par.Cache
 
-// Lookup returns the module with the given module path.
+type lookupCacheKey struct {
+       proxy, path string
+}
+
+// Lookup returns the module with the given module path,
+// fetched through the given proxy.
+//
+// The distinguished proxy "direct" indicates that the path should be fetched
+// from its origin, and "noproxy" indicates that the patch should be fetched
+// directly only if GONOPROXY matches the given path.
+//
+// For the distinguished proxy "off", Lookup always returns a non-nil error.
+//
 // A successful return does not guarantee that the module
 // has any defined versions.
-func Lookup(path string) (Repo, error) {
+func Lookup(proxy, path string) (Repo, error) {
        if traceRepo {
-               defer logCall("Lookup(%q)", path)()
+               defer logCall("Lookup(%q, %q)", proxy, path)()
        }
 
        type cached struct {
                r   Repo
                err error
        }
-       c := lookupCache.Do(path, func() interface{} {
-               r, err := lookup(path)
+       c := lookupCache.Do(lookupCacheKey{proxy, path}, func() interface{} {
+               r, err := lookup(proxy, path)
                if err == nil {
                        if traceRepo {
                                r = newLoggingRepo(r)
@@ -204,25 +212,48 @@ func Lookup(path string) (Repo, error) {
 }
 
 // lookup returns the module with the given module path.
-func lookup(path string) (r Repo, err error) {
+func lookup(proxy, path string) (r Repo, err error) {
        if cfg.BuildMod == "vendor" {
-               return nil, fmt.Errorf("module lookup disabled by -mod=%s", cfg.BuildMod)
+               return nil, errModVendor
        }
-       if proxyURL == "off" {
-               return nil, fmt.Errorf("module lookup disabled by GOPROXY=%s", proxyURL)
+
+       if str.GlobsMatchPath(cfg.GONOPROXY, path) {
+               switch proxy {
+               case "noproxy", "direct":
+                       return lookupDirect(path)
+               default:
+                       return nil, errNoproxy
+               }
        }
-       if proxyURL != "" && proxyURL != "direct" {
-               return lookupProxy(path)
+
+       switch proxy {
+       case "off":
+               return nil, errProxyOff
+       case "direct":
+               return lookupDirect(path)
+       case "noproxy":
+               return nil, errUseProxy
+       default:
+               return newProxyRepo(proxy, path)
        }
+}
+
+var (
+       errModVendor       = errors.New("module lookup disabled by -mod=vendor")
+       errProxyOff        = errors.New("module lookup disabled by GOPROXY=off")
+       errNoproxy   error = notExistError("disabled by GOPRIVATE/GONOPROXY")
+       errUseProxy  error = notExistError("path does not match GOPRIVATE/GONOPROXY")
+)
 
-       security := web.Secure
+func lookupDirect(path string) (Repo, error) {
+       security := web.SecureOnly
        if get.Insecure {
                security = web.Insecure
        }
        rr, err := get.RepoRootForImportPath(path, get.PreferMod, security)
        if err != nil {
                // We don't know where to find code for a module with this path.
-               return nil, err
+               return nil, notExistError(err.Error())
        }
 
        if rr.VCS == "mod" {
@@ -260,7 +291,7 @@ func ImportRepoRev(path, rev string) (Repo, *RevInfo, error) {
        // Note: Because we are converting a code reference from a legacy
        // version control system, we ignore meta tags about modules
        // and use only direct source control entries (get.IgnoreMod).
-       security := web.Secure
+       security := web.SecureOnly
        if get.Insecure {
                security = web.Insecure
        }
@@ -288,7 +319,7 @@ func ImportRepoRev(path, rev string) (Repo, *RevInfo, error) {
                return nil, nil, err
        }
 
-       info, err := repo.(*codeRepo).convert(revInfo, "")
+       info, err := repo.(*codeRepo).convert(revInfo, rev)
        if err != nil {
                return nil, nil, err
        }
@@ -364,3 +395,13 @@ func (l *loggingRepo) Zip(dst io.Writer, version string) error {
        defer logCall("Repo[%s]: Zip(%s, %q)", l.r.ModulePath(), dstName, version)()
        return l.r.Zip(dst, version)
 }
+
+// A notExistError is like os.ErrNotExist, but with a custom message
+type notExistError string
+
+func (e notExistError) Error() string {
+       return string(e)
+}
+func (notExistError) Is(target error) bool {
+       return target == os.ErrNotExist
+}
diff --git a/libgo/go/cmd/go/internal/modfetch/sumdb.go b/libgo/go/cmd/go/internal/modfetch/sumdb.go
new file mode 100644 (file)
index 0000000..66a09d3
--- /dev/null
@@ -0,0 +1,263 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Go checksum database lookup
+
+// +build !cmd_go_bootstrap
+
+package modfetch
+
+import (
+       "bytes"
+       "errors"
+       "fmt"
+       "io/ioutil"
+       "net/url"
+       "os"
+       "path/filepath"
+       "strings"
+       "sync"
+       "time"
+
+       "cmd/go/internal/base"
+       "cmd/go/internal/cfg"
+       "cmd/go/internal/get"
+       "cmd/go/internal/lockedfile"
+       "cmd/go/internal/module"
+       "cmd/go/internal/note"
+       "cmd/go/internal/str"
+       "cmd/go/internal/sumweb"
+       "cmd/go/internal/web"
+)
+
+// useSumDB reports whether to use the Go checksum database for the given module.
+func useSumDB(mod module.Version) bool {
+       return cfg.GOSUMDB != "off" && !get.Insecure && !str.GlobsMatchPath(cfg.GONOSUMDB, mod.Path)
+}
+
+// lookupSumDB returns the Go checksum database's go.sum lines for the given module,
+// along with the name of the database.
+func lookupSumDB(mod module.Version) (dbname string, lines []string, err error) {
+       dbOnce.Do(func() {
+               dbName, db, dbErr = dbDial()
+       })
+       if dbErr != nil {
+               return "", nil, dbErr
+       }
+       lines, err = db.Lookup(mod.Path, mod.Version)
+       return dbName, lines, err
+}
+
+var (
+       dbOnce sync.Once
+       dbName string
+       db     *sumweb.Conn
+       dbErr  error
+)
+
+func dbDial() (dbName string, db *sumweb.Conn, err error) {
+       // $GOSUMDB can be "key" or "key url",
+       // and the key can be a full verifier key
+       // or a host on our list of known keys.
+       key := strings.Fields(cfg.GOSUMDB)
+       if len(key) >= 1 {
+               if k := knownGOSUMDB[key[0]]; k != "" {
+                       key[0] = k
+               }
+       }
+       if len(key) == 0 {
+               return "", nil, fmt.Errorf("missing GOSUMDB")
+       }
+       if len(key) > 2 {
+               return "", nil, fmt.Errorf("invalid GOSUMDB: too many fields")
+       }
+       vkey, err := note.NewVerifier(key[0])
+       if err != nil {
+               return "", nil, fmt.Errorf("invalid GOSUMDB: %v", err)
+       }
+       name := vkey.Name()
+
+       // No funny business in the database name.
+       direct, err := url.Parse("https://" + name)
+       if err != nil || strings.HasSuffix(name, "/") || *direct != (url.URL{Scheme: "https", Host: direct.Host, Path: direct.Path, RawPath: direct.RawPath}) || direct.RawPath != "" || direct.Host == "" {
+               return "", nil, fmt.Errorf("invalid sumdb name (must be host[/path]): %s %+v", name, *direct)
+       }
+
+       // Determine how to get to database.
+       var base *url.URL
+       if len(key) >= 2 {
+               // Use explicit alternate URL listed in $GOSUMDB,
+               // bypassing both the default URL derivation and any proxies.
+               u, err := url.Parse(key[1])
+               if err != nil {
+                       return "", nil, fmt.Errorf("invalid GOSUMDB URL: %v", err)
+               }
+               base = u
+       }
+
+       return name, sumweb.NewConn(&dbClient{key: key[0], name: name, direct: direct, base: base}), nil
+}
+
+type dbClient struct {
+       key    string
+       name   string
+       direct *url.URL
+
+       once    sync.Once
+       base    *url.URL
+       baseErr error
+}
+
+func (c *dbClient) ReadRemote(path string) ([]byte, error) {
+       c.once.Do(c.initBase)
+       if c.baseErr != nil {
+               return nil, c.baseErr
+       }
+
+       var data []byte
+       start := time.Now()
+       targ := web.Join(c.base, path)
+       data, err := web.GetBytes(targ)
+       if false {
+               fmt.Fprintf(os.Stderr, "%.3fs %s\n", time.Since(start).Seconds(), web.Redacted(targ))
+       }
+       return data, err
+}
+
+// initBase determines the base URL for connecting to the database.
+// Determining the URL requires sending network traffic to proxies,
+// so this work is delayed until we need to download something from
+// the database. If everything we need is in the local cache and
+// c.ReadRemote is never called, we will never do this work.
+func (c *dbClient) initBase() {
+       if c.base != nil {
+               return
+       }
+
+       // Try proxies in turn until we find out how to connect to this database.
+       urls, err := proxyURLs()
+       if err != nil {
+               c.baseErr = err
+               return
+       }
+       for _, proxyURL := range urls {
+               if proxyURL == "noproxy" {
+                       continue
+               }
+               if proxyURL == "direct" || proxyURL == "off" {
+                       break
+               }
+               proxy, err := url.Parse(proxyURL)
+               if err != nil {
+                       c.baseErr = err
+                       return
+               }
+               // Quoting https://golang.org/design/25530-sumdb#proxying-a-checksum-database:
+               //
+               // Before accessing any checksum database URL using a proxy,
+               // the proxy client should first fetch <proxyURL>/sumdb/<sumdb-name>/supported.
+               // If that request returns a successful (HTTP 200) response, then the proxy supports
+               // proxying checksum database requests. In that case, the client should use
+               // the proxied access method only, never falling back to a direct connection to the database.
+               // If the /sumdb/<sumdb-name>/supported check fails with a “not found” (HTTP 404)
+               // or “gone” (HTTP 410) response, the proxy is unwilling to proxy the checksum database,
+               // and the client should connect directly to the database.
+               // Any other response is treated as the database being unavailable.
+               _, err = web.GetBytes(web.Join(proxy, "sumdb/"+c.name+"/supported"))
+               if err == nil {
+                       // Success! This proxy will help us.
+                       c.base = web.Join(proxy, "sumdb/"+c.name)
+                       return
+               }
+               // If the proxy serves a non-404/410, give up.
+               if !errors.Is(err, os.ErrNotExist) {
+                       c.baseErr = err
+                       return
+               }
+       }
+
+       // No proxies, or all proxies said 404, or we reached an explicit "direct".
+       c.base = c.direct
+}
+
+// ReadConfig reads the key from c.key
+// and otherwise reads the config (a latest tree head) from GOPATH/pkg/sumdb/<file>.
+func (c *dbClient) ReadConfig(file string) (data []byte, err error) {
+       if file == "key" {
+               return []byte(c.key), nil
+       }
+
+       // GOPATH/pkg is PkgMod/..
+       targ := filepath.Join(PkgMod, "../sumdb/"+file)
+       data, err = lockedfile.Read(targ)
+       if errors.Is(err, os.ErrNotExist) {
+               // Treat non-existent as empty, to bootstrap the "latest" file
+               // the first time we connect to a given database.
+               return []byte{}, nil
+       }
+       return data, err
+}
+
+// WriteConfig rewrites the latest tree head.
+func (*dbClient) WriteConfig(file string, old, new []byte) error {
+       if file == "key" {
+               // Should not happen.
+               return fmt.Errorf("cannot write key")
+       }
+       targ := filepath.Join(PkgMod, "../sumdb/"+file)
+       os.MkdirAll(filepath.Dir(targ), 0777)
+       f, err := lockedfile.Edit(targ)
+       if err != nil {
+               return err
+       }
+       defer f.Close()
+       data, err := ioutil.ReadAll(f)
+       if err != nil {
+               return err
+       }
+       if len(data) > 0 && !bytes.Equal(data, old) {
+               return sumweb.ErrWriteConflict
+       }
+       if _, err := f.Seek(0, 0); err != nil {
+               return err
+       }
+       if err := f.Truncate(0); err != nil {
+               return err
+       }
+       if _, err := f.Write(new); err != nil {
+               return err
+       }
+       return f.Close()
+}
+
+// ReadCache reads cached lookups or tiles from
+// GOPATH/pkg/mod/download/cache/sumdb,
+// which will be deleted by "go clean -modcache".
+func (*dbClient) ReadCache(file string) ([]byte, error) {
+       targ := filepath.Join(PkgMod, "download/cache/sumdb", file)
+       data, err := lockedfile.Read(targ)
+       // lockedfile.Write does not atomically create the file with contents.
+       // There is a moment between file creation and locking the file for writing,
+       // during which the empty file can be locked for reading.
+       // Treat observing an empty file as file not found.
+       if err == nil && len(data) == 0 {
+               err = &os.PathError{Op: "read", Path: targ, Err: os.ErrNotExist}
+       }
+       return data, err
+}
+
+// WriteCache updates cached lookups or tiles.
+func (*dbClient) WriteCache(file string, data []byte) {
+       targ := filepath.Join(PkgMod, "download/cache/sumdb", file)
+       os.MkdirAll(filepath.Dir(targ), 0777)
+       lockedfile.Write(targ, bytes.NewReader(data), 0666)
+}
+
+func (*dbClient) Log(msg string) {
+       // nothing for now
+}
+
+func (*dbClient) SecurityError(msg string) {
+       base.Fatalf("%s", msg)
+}
diff --git a/libgo/go/cmd/go/internal/modfetch/web.go b/libgo/go/cmd/go/internal/modfetch/web.go
deleted file mode 100644 (file)
index b327bf2..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cmd_go_bootstrap
-
-package modfetch
-
-import (
-       "io"
-
-       web "cmd/go/internal/web2"
-)
-
-// webGetGoGet fetches a go-get=1 URL and returns the body in *body.
-// It allows non-200 responses, as usual for these URLs.
-func webGetGoGet(url string, body *io.ReadCloser) error {
-       return web.Get(url, web.Non200OK(), web.Body(body))
-}
-
-// webGetBytes returns the body returned by an HTTP GET, as a []byte.
-// It insists on a 200 response.
-func webGetBytes(url string, body *[]byte) error {
-       return web.Get(url, web.ReadAllBody(body))
-}
-
-// webGetBody returns the body returned by an HTTP GET, as a io.ReadCloser.
-// It insists on a 200 response.
-func webGetBody(url string, body *io.ReadCloser) error {
-       return web.Get(url, web.Body(body))
-}
index 7f9a18c6c2a6c02c9aa90beb1bd32b8d95ccabc9..6e1a22f3caa821ac2bc050d8c7054cd48357aac1 100644 (file)
@@ -8,15 +8,14 @@ import (
        "bytes"
        "errors"
        "fmt"
+       "internal/lazyregexp"
        "path/filepath"
-       "regexp"
        "sort"
        "strconv"
        "strings"
        "unicode"
 
        "cmd/go/internal/module"
-       "cmd/go/internal/semver"
 )
 
 // A File is the parsed, interpreted form of a go.mod file.
@@ -154,7 +153,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File
        return f, nil
 }
 
-var GoVersionRE = regexp.MustCompile(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`)
+var GoVersionRE = lazyregexp.New(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`)
 
 func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, fix VersionFixer, strict bool) {
        // If strict is false, this module is a dependency.
@@ -195,7 +194,7 @@ func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, f
                f.Module = &Module{Syntax: line}
                if len(args) != 1 {
 
-                       fmt.Fprintf(errs, "%s:%d: usage: module module/path [version]\n", f.Syntax.Name, line.Start.Line)
+                       fmt.Fprintf(errs, "%s:%d: usage: module module/path\n", f.Syntax.Name, line.Start.Line)
                        return
                }
                s, err := parseString(&args[0])
@@ -214,10 +213,9 @@ func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, f
                        fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err)
                        return
                }
-               old := args[1]
-               v, err := parseVersion(s, &args[1], fix)
+               v, err := parseVersion(verb, s, &args[1], fix)
                if err != nil {
-                       fmt.Fprintf(errs, "%s:%d: invalid module version %q: %v\n", f.Syntax.Name, line.Start.Line, old, err)
+                       fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err)
                        return
                }
                pathMajor, err := modulePathMajor(s)
@@ -225,11 +223,8 @@ func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, f
                        fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err)
                        return
                }
-               if !module.MatchPathMajor(v, pathMajor) {
-                       if pathMajor == "" {
-                               pathMajor = "v0 or v1"
-                       }
-                       fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v)
+               if err := module.MatchPathMajor(v, pathMajor); err != nil {
+                       fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, &Error{Verb: verb, ModPath: s, Err: err})
                        return
                }
                if verb == "require" {
@@ -265,17 +260,13 @@ func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, f
                }
                var v string
                if arrow == 2 {
-                       old := args[1]
-                       v, err = parseVersion(s, &args[1], fix)
+                       v, err = parseVersion(verb, s, &args[1], fix)
                        if err != nil {
-                               fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err)
+                               fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err)
                                return
                        }
-                       if !module.MatchPathMajor(v, pathMajor) {
-                               if pathMajor == "" {
-                                       pathMajor = "v0 or v1"
-                               }
-                               fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v)
+                       if err := module.MatchPathMajor(v, pathMajor); err != nil {
+                               fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, &Error{Verb: verb, ModPath: s, Err: err})
                                return
                        }
                }
@@ -296,10 +287,9 @@ func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, f
                        }
                }
                if len(args) == arrow+3 {
-                       old := args[arrow+1]
-                       nv, err = parseVersion(ns, &args[arrow+2], fix)
+                       nv, err = parseVersion(verb, ns, &args[arrow+2], fix)
                        if err != nil {
-                               fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err)
+                               fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err)
                                return
                        }
                        if IsDirectoryPath(ns) {
@@ -411,15 +401,41 @@ func parseString(s *string) (string, error) {
        return t, nil
 }
 
-func parseVersion(path string, s *string, fix VersionFixer) (string, error) {
+type Error struct {
+       Verb    string
+       ModPath string
+       Err     error
+}
+
+func (e *Error) Error() string {
+       return fmt.Sprintf("%s %s: %v", e.Verb, e.ModPath, e.Err)
+}
+
+func (e *Error) Unwrap() error { return e.Err }
+
+func parseVersion(verb string, path string, s *string, fix VersionFixer) (string, error) {
        t, err := parseString(s)
        if err != nil {
-               return "", err
+               return "", &Error{
+                       Verb:    verb,
+                       ModPath: path,
+                       Err: &module.InvalidVersionError{
+                               Version: *s,
+                               Err:     err,
+                       },
+               }
        }
        if fix != nil {
                var err error
                t, err = fix(path, t)
                if err != nil {
+                       if err, ok := err.(*module.ModuleError); ok {
+                               return "", &Error{
+                                       Verb:    verb,
+                                       ModPath: path,
+                                       Err:     err.Err,
+                               }
+                       }
                        return "", err
                }
        }
@@ -427,7 +443,14 @@ func parseVersion(path string, s *string, fix VersionFixer) (string, error) {
                *s = v
                return *s, nil
        }
-       return "", fmt.Errorf("version must be of the form v1.2.3")
+       return "", &Error{
+               Verb:    verb,
+               ModPath: path,
+               Err: &module.InvalidVersionError{
+                       Version: t,
+                       Err:     errors.New("must be of the form v1.2.3"),
+               },
+       }
 }
 
 func modulePathMajor(path string) (string, error) {
index 17a0ed45e21b4ed780d763bf03a639e0b0674bd6..491d2891c7ea0fb8eb5846e74e766f12da03bbce 100644 (file)
@@ -9,27 +9,28 @@ import (
        "cmd/go/internal/base"
        "cmd/go/internal/cfg"
        "cmd/go/internal/get"
+       "cmd/go/internal/imports"
        "cmd/go/internal/load"
-       "cmd/go/internal/modfetch"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
        "cmd/go/internal/mvs"
        "cmd/go/internal/par"
        "cmd/go/internal/search"
        "cmd/go/internal/semver"
-       "cmd/go/internal/str"
        "cmd/go/internal/work"
+       "errors"
        "fmt"
        "os"
-       pathpkg "path"
        "path/filepath"
+       "sort"
        "strings"
+       "sync"
 )
 
 var CmdGet = &base.Command{
-       // Note: -d -m -u are listed explicitly because they are the most common get flags.
+       // Note: -d -u are listed explicitly because they are the most common get flags.
        // Do not send CLs removing them because they're covered by [get flags].
-       UsageLine: "go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages]",
+       UsageLine: "go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]",
        Short:     "add dependencies to current module and install them",
        Long: `
 Get resolves and adds dependencies to the current development module
@@ -40,7 +41,7 @@ The first step is to resolve which dependencies to add.
 For each named package or package pattern, get must decide which version of
 the corresponding module to use. By default, get chooses the latest tagged
 release version, such as v0.4.5 or v1.2.3. If there are no tagged release
-versions, get chooses the latest tagged prerelease version, such as
+versions, get chooses the latest tagged pre-release version, such as
 v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest
 known commit.
 
@@ -49,8 +50,6 @@ suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'.
 For modules stored in source control repositories, the version suffix can
 also be a commit hash, branch identifier, or other syntax known to the
 source control system, as in 'go get golang.org/x/text@master'.
-The version suffix @latest explicitly requests the default behavior
-described above.
 
 If a module under consideration is already a dependency of the current
 development module, then get will update the required version.
@@ -59,6 +58,14 @@ downgrades the dependency. The version suffix @none indicates that the
 dependency should be removed entirely, downgrading or removing modules
 depending on it as needed.
 
+The version suffix @latest explicitly requests the latest minor release of the
+given path. The suffix @patch requests the latest patch release: if the path
+is already in the build list, the selected version will have the same minor
+version. If the path is not already in the build list, @patch is equivalent
+to @latest. Neither @latest nor @patch will cause 'go get' to downgrade a module
+in the build list if it is required at a newer pre-release version that is
+newer than the latest released version.
+
 Although get defaults to using the latest version of the module containing
 a named package, it does not use the latest version of that module's
 dependencies. Instead it prefers to use the specific dependency versions
@@ -68,13 +75,24 @@ will use the latest A but then use B v1.2.3, as requested by A. (If there
 are competing requirements for a particular module, then 'go get' resolves
 those requirements by taking the maximum requested version.)
 
-The -u flag instructs get to update dependencies to use newer minor or
-patch releases when available. Continuing the previous example,
-'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3).
+The -t flag instructs get to consider modules needed to build tests of
+packages specified on the command line.
+
+The -u flag instructs get to update modules providing dependencies
+of packages named on the command line to use newer minor or patch
+releases when available. Continuing the previous example, 'go get -u A'
+will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C,
+but C does not provide any packages needed to build packages in A
+(not including tests), then C will not be updated.
+
+The -u=patch flag (not -u patch) also instructs get to update dependencies,
+but changes the default to select patch releases.
+Continuing the previous example,
+'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
+while 'go get -u=patch A' will use a patch release of A instead.
 
-The -u=patch flag (not -u patch) instructs get to update dependencies
-to use newer patch releases when available. Continuing the previous example,
-'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3).
+When the -t and -u flags are used together, get will update
+test dependencies as well.
 
 In general, adding a new dependency may require upgrading
 existing dependencies to keep a working build, and 'go get' does
@@ -82,11 +100,6 @@ this automatically. Similarly, downgrading one dependency may
 require downgrading other dependencies, and 'go get' does
 this automatically as well.
 
-The -m flag instructs get to stop here, after resolving, upgrading,
-and downgrading modules and updating go.mod. When using -m,
-each specified package path must be a module path as well,
-not the import path of a package below the module root.
-
 The -insecure flag permits fetching from repositories and resolving
 custom domains using insecure schemes such as HTTP. Use with caution.
 
@@ -108,12 +121,11 @@ The -d flag instructs get to download the source code needed to build
 the named packages, including downloading necessary dependencies,
 but not to build and install them.
 
-With no package arguments, 'go get' applies to the main module,
-and to the Go package in the current directory, if any. In particular,
-'go get -u' and 'go get -u=patch' update all the dependencies of the
-main module. With no package arguments and also without -u,
-'go get' is not much more than 'go install', and 'go get -d' not much
-more than 'go list'.
+With no package arguments, 'go get' applies to Go package in the
+current directory, if any. In particular, 'go get -u' and
+'go get -u=patch' update all the dependencies of that package.
+With no package arguments and also without -u, 'go get' is not much more
+than 'go install', and 'go get -d' not much more than 'go list'.
 
 For more about modules, see 'go help modules'.
 
@@ -165,6 +177,9 @@ func (v *upgradeFlag) Set(s string) error {
        if s == "false" {
                s = ""
        }
+       if s == "true" {
+               s = "latest"
+       }
        *v = upgradeFlag(s)
        return nil
 }
@@ -178,15 +193,53 @@ func init() {
        CmdGet.Flag.Var(&getU, "u", "")
 }
 
-// A task holds the state for processing a single get argument (path@vers).
-type task struct {
-       arg             string // original argument
-       index           int
-       path            string           // package path part of arg
-       forceModulePath bool             // path must be interpreted as a module path
-       vers            string           // version part of arg
-       m               module.Version   // module version indicated by argument
-       req             []module.Version // m's requirement list (not upgraded)
+// A getArg holds a parsed positional argument for go get (path@vers).
+type getArg struct {
+       // raw is the original argument, to be printed in error messages.
+       raw string
+
+       // path is the part of the argument before "@" (or the whole argument
+       // if there is no "@"). path specifies the modules or packages to get.
+       path string
+
+       // vers is the part of the argument after "@" (or "" if there is no "@").
+       // vers specifies the module version to get.
+       vers string
+}
+
+// querySpec describes a query for a specific module. path may be a
+// module path, package path, or package pattern. vers is a version
+// query string from a command line argument.
+type querySpec struct {
+       // path is a module path, package path, or package pattern that
+       // specifies which module to query.
+       path string
+
+       // vers specifies what version of the module to get.
+       vers string
+
+       // forceModulePath is true if path should be interpreted as a module path.
+       // If forceModulePath is true, prevM must be set.
+       forceModulePath bool
+
+       // prevM is the previous version of the module. prevM is needed
+       // to determine the minor version number if vers is "patch". It's also
+       // used to avoid downgrades from prerelease versions newer than
+       // "latest" and "patch". If prevM is set, forceModulePath must be true.
+       prevM module.Version
+}
+
+// query holds the state for a query made for a specific module.
+// After a query is performed, we know the actual module path and
+// version and whether any packages were matched by the query path.
+type query struct {
+       querySpec
+
+       // arg is the command line argument that matched the specified module.
+       arg string
+
+       // m is the module path and version found by the query.
+       m module.Version
 }
 
 func runGet(cmd *base.Command, args []string) {
@@ -196,7 +249,7 @@ func runGet(cmd *base.Command, args []string) {
        }
 
        switch getU {
-       case "", "patch", "true":
+       case "", "latest", "patch":
                // ok
        default:
                base.Fatalf("go get: unknown upgrade flag -u=%s", getU)
@@ -207,29 +260,32 @@ func runGet(cmd *base.Command, args []string) {
        if *getFix {
                fmt.Fprintf(os.Stderr, "go get: -fix flag is a no-op when using modules\n")
        }
-       if *getT {
-               fmt.Fprintf(os.Stderr, "go get: -t flag is a no-op when using modules\n")
+       if *getM {
+               base.Fatalf("go get: -m flag is no longer supported; consider -d to skip building packages")
        }
+       modload.LoadTests = *getT
 
        if cfg.BuildMod == "vendor" {
                base.Fatalf("go get: disabled by -mod=%s", cfg.BuildMod)
        }
 
-       modload.LoadBuildList()
+       buildList := modload.LoadBuildList()
+       buildList = buildList[:len(buildList):len(buildList)] // copy on append
+       versionByPath := make(map[string]string)
+       for _, m := range buildList {
+               versionByPath[m.Path] = m.Version
+       }
 
        // Do not allow any updating of go.mod until we've applied
        // all the requested changes and checked that the result matches
        // what was requested.
        modload.DisallowWriteGoMod()
 
-       // Build task and install lists.
-       // The command-line arguments are of the form path@version
-       // or simply path, with implicit @latest. path@none is "downgrade away".
-       // At the end of the loop, we've resolved the list of arguments into
-       // a list of tasks (a path@vers that needs further processing)
-       // and a list of install targets (for the "go install" at the end).
-       var tasks []*task
-       var install []string
+       // Parse command-line arguments and report errors. The command-line
+       // arguments are of the form path@version or simply path, with implicit
+       // @latest. path@none is "downgrade away".
+       var gets []getArg
+       var queries []*query
        for _, arg := range search.CleanPatterns(args) {
                // Argument is module query path@vers, or else path with implicit @latest.
                path := arg
@@ -241,226 +297,306 @@ func runGet(cmd *base.Command, args []string) {
                        base.Errorf("go get %s: invalid module version syntax", arg)
                        continue
                }
-               if vers != "none" {
-                       install = append(install, path)
-               }
-
-               // Deciding which module to upgrade/downgrade for a particular argument is difficult.
-               // Patterns only make it more difficult.
-               // We impose restrictions to avoid needing to interlace pattern expansion,
-               // like in modload.ImportPaths.
-               // Specifically, these patterns are supported:
-               //
-               //      - Relative paths like ../../foo or ../../foo... are restricted to matching directories
-               //        in the current module and therefore map to the current module.
-               //        It's possible that the pattern matches no packages, but we will still treat it
-               //        as mapping to the current module.
-               //        TODO: In followup, could just expand the full list and remove the discrepancy.
-               //      - The pattern "all" has its usual package meaning and maps to the list of modules
-               //        from which the matched packages are drawn. This is potentially a subset of the
-               //        module pattern "all". If module A requires B requires C but A does not import
-               //        the parts of B that import C, the packages matched by "all" are only from A and B,
-               //        so only A and B end up on the tasks list.
-               //        TODO: Even in -m mode?
-               //      - The patterns "std" and "cmd" expand to packages in the standard library,
-               //        which aren't upgradable, so we skip over those.
-               //        In -m mode they expand to non-module-paths, so they are disallowed.
-               //      - Import path patterns like foo/bar... are matched against the module list,
-               //        assuming any package match would imply a module pattern match.
-               //        TODO: What about -m mode?
-               //      - Import paths without patterns are left as is, for resolution by getQuery (eventually modload.Import).
-               //
-               if search.IsRelativePath(path) {
-                       // Check that this relative pattern only matches directories in the current module,
-                       // and then record the current module as the target.
-                       dir := path
-                       if i := strings.Index(path, "..."); i >= 0 {
-                               dir, _ = pathpkg.Split(path[:i])
-                       }
-                       abs, err := filepath.Abs(dir)
-                       if err != nil {
-                               base.Errorf("go get %s: %v", arg, err)
-                               continue
-                       }
-                       if !str.HasFilePathPrefix(abs, modload.ModRoot()) {
-                               base.Errorf("go get %s: directory %s is outside module root %s", arg, abs, modload.ModRoot())
-                               continue
-                       }
-                       // TODO: Check if abs is inside a nested module.
-                       tasks = append(tasks, &task{arg: arg, path: modload.Target.Path, vers: ""})
-                       continue
+
+               // If the user runs 'go get -u=patch some/module', update some/module to a
+               // patch release, not a minor version.
+               if vers == "" && getU != "" {
+                       vers = string(getU)
                }
-               if path == "all" {
-                       // TODO: If *getM, should this be the module pattern "all"?
-
-                       // This is the package pattern "all" not the module pattern "all":
-                       // enumerate all the modules actually needed by builds of the packages
-                       // in the main module, not incidental modules that happen to be
-                       // in the package graph (and therefore build list).
-                       // Note that LoadALL may add new modules to the build list to
-                       // satisfy new imports, but vers == "latest" implicitly anyway,
-                       // so we'll assume that's OK.
-                       seen := make(map[module.Version]bool)
-                       pkgs := modload.LoadALL()
-                       for _, pkg := range pkgs {
-                               m := modload.PackageModule(pkg)
-                               if m.Path != "" && !seen[m] {
-                                       seen[m] = true
-                                       tasks = append(tasks, &task{arg: arg, path: m.Path, vers: "latest", forceModulePath: true})
+
+               gets = append(gets, getArg{raw: arg, path: path, vers: vers})
+
+               // Determine the modules that path refers to, and create queries
+               // to lookup modules at target versions before loading packages.
+               // This is an imprecise process, but it helps reduce unnecessary
+               // queries and package loading. It's also necessary for handling
+               // patterns like golang.org/x/tools/..., which can't be expanded
+               // during package loading until they're in the build list.
+               switch {
+               case search.IsRelativePath(path):
+                       // Relative paths like ../../foo or ../../foo... are restricted to
+                       // matching packages in the main module. If the path is explicit and
+                       // contains no wildcards (...), check that it is a package in
+                       // the main module. If the path contains wildcards but matches no
+                       // packages, we'll warn after package loading.
+                       if !strings.Contains(path, "...") {
+                               pkgPath := modload.DirImportPath(filepath.FromSlash(path))
+                               if pkgs := modload.TargetPackages(pkgPath); len(pkgs) == 0 {
+                                       abs, err := filepath.Abs(path)
+                                       if err != nil {
+                                               abs = path
+                                       }
+                                       base.Errorf("go get %s: path %s is not a package in module rooted at %s", arg, abs, modload.ModRoot())
+                                       continue
                                }
                        }
-                       continue
-               }
-               if search.IsMetaPackage(path) {
-                       // Already handled "all", so this must be "std" or "cmd",
-                       // which are entirely in the standard library.
+
                        if path != arg {
-                               base.Errorf("go get %s: cannot use pattern %q with explicit version", arg, arg)
-                       }
-                       if *getM {
-                               base.Errorf("go get %s: cannot use pattern %q with -m", arg, arg)
+                               base.Errorf("go get %s: can't request explicit version of path in main module", arg)
                                continue
                        }
+
+               case strings.Contains(path, "..."):
+                       // Wait until we load packages to look up modules.
+                       // We don't know yet whether any modules in the build list provide
+                       // packages matching the pattern. For example, suppose
+                       // golang.org/x/tools and golang.org/x/tools/playground are separate
+                       // modules, and only golang.org/x/tools is in the build list. If the
+                       // user runs 'go get golang.org/x/tools/playground/...', we should
+                       // add a requirement for golang.org/x/tools/playground. We should not
+                       // upgrade golang.org/x/tools.
+
+               case path == "all":
+                       // Don't query modules until we load packages. We'll automatically
+                       // look up any missing modules.
+
+               case search.IsMetaPackage(path):
+                       base.Errorf("go get %s: explicit requirement on standard-library module %s not allowed", path, path)
                        continue
-               }
-               if strings.Contains(path, "...") {
-                       // Apply to modules in build list matched by pattern (golang.org/x/...), if any.
-                       match := search.MatchPattern(path)
-                       matched := false
-                       for _, m := range modload.BuildList() {
-                               if match(m.Path) || str.HasPathPrefix(path, m.Path) {
-                                       tasks = append(tasks, &task{arg: arg, path: m.Path, vers: vers, forceModulePath: true})
-                                       matched = true
+
+               default:
+                       // The argument is a package path.
+                       if pkgs := modload.TargetPackages(path); len(pkgs) != 0 {
+                               // The path is in the main module. Nothing to query.
+                               if vers != "" && vers != "latest" && vers != "patch" {
+                                       base.Errorf("go get %s: can't request explicit version of path in main module", arg)
                                }
-                       }
-                       // If matched, we're done.
-                       // Otherwise assume pattern is inside a single module
-                       // (golang.org/x/text/unicode/...) and leave for usual lookup.
-                       // Unless we're using -m.
-                       if matched {
                                continue
                        }
-                       if *getM {
-                               base.Errorf("go get %s: pattern matches no modules in build list", arg)
+
+                       first := path
+                       if i := strings.IndexByte(first, '/'); i >= 0 {
+                               first = path
+                       }
+                       if !strings.Contains(first, ".") {
+                               // The path doesn't have a dot in the first component and cannot be
+                               // queried as a module. It may be a package in the standard library,
+                               // which is fine, so don't report an error unless we encounter
+                               // a problem loading packages below.
                                continue
                        }
+
+                       // If we're querying "latest" or "patch", we need to know the current
+                       // version of the module. For "latest", we want to avoid accidentally
+                       // downgrading from a newer prerelease. For "patch", we need to query
+                       // the correct minor version.
+                       // Here, we check if "path" is the name of a module in the build list
+                       // (other than the main module) and set prevM if so. If "path" isn't
+                       // a module in the build list, the current version doesn't matter
+                       // since it's either an unknown module or a package within a module
+                       // that we'll discover later.
+                       q := &query{querySpec: querySpec{path: path, vers: vers}, arg: arg}
+                       if v, ok := versionByPath[path]; ok && path != modload.Target.Path {
+                               q.prevM = module.Version{Path: path, Version: v}
+                               q.forceModulePath = true
+                       }
+                       queries = append(queries, q)
                }
-               tasks = append(tasks, &task{arg: arg, path: path, vers: vers})
        }
        base.ExitIfErrors()
 
-       // Now we've reduced the upgrade/downgrade work to a list of path@vers pairs (tasks).
-       // Resolve each one in parallel.
-       reqs := modload.Reqs()
-       var lookup par.Work
-       for _, t := range tasks {
-               lookup.Add(t)
-       }
-       lookup.Do(10, func(item interface{}) {
-               t := item.(*task)
-               if t.vers == "none" {
-                       // Wait for downgrade step.
-                       t.m = module.Version{Path: t.path, Version: "none"}
-                       return
+       // Query modules referenced by command line arguments at requested versions.
+       // We need to do this before loading packages since patterns that refer to
+       // packages in unknown modules can't be expanded. This also avoids looking
+       // up new modules while loading packages, only to downgrade later.
+       queryCache := make(map[querySpec]*query)
+       byPath := runQueries(queryCache, queries, nil)
+
+       // Add missing modules to the build list.
+       // We call SetBuildList here and elsewhere, since newUpgrader,
+       // ImportPathsQuiet, and other functions read the global build list.
+       for _, q := range queries {
+               if _, ok := versionByPath[q.m.Path]; !ok && q.m.Version != "none" {
+                       buildList = append(buildList, q.m)
                }
-               m, err := getQuery(t.path, t.vers, t.forceModulePath)
-               if err != nil {
-                       base.Errorf("go get %v: %v", t.arg, err)
-                       return
+       }
+       versionByPath = nil // out of date now; rebuilt later when needed
+       modload.SetBuildList(buildList)
+
+       // Upgrade modules specifically named on the command line. This is our only
+       // chance to upgrade modules without root packages (modOnly below).
+       // This also skips loading packages at an old version, only to upgrade
+       // and reload at a new version.
+       upgrade := make(map[string]*query)
+       for path, q := range byPath {
+               if q.path == q.m.Path && q.m.Version != "none" {
+                       upgrade[path] = q
                }
-               t.m = m
-       })
+       }
+       buildList, err := mvs.UpgradeAll(modload.Target, newUpgrader(upgrade, nil))
+       if err != nil {
+               base.Fatalf("go get: %v", err)
+       }
+       modload.SetBuildList(buildList)
        base.ExitIfErrors()
-
-       // Now we know the specific version of each path@vers.
-       // The final build list will be the union of three build lists:
-       //      1. the original build list
-       //      2. the modules named on the command line (other than @none)
-       //      3. the upgraded requirements of those modules (if upgrading)
-       // Start building those lists.
-       // This loop collects (2).
-       // Also, because the list of paths might have named multiple packages in a single module
-       // (or even the same package multiple times), now that we know the module for each
-       // package, this loop deduplicates multiple references to a given module.
-       // (If a module is mentioned multiple times, the listed target version must be the same each time.)
-       var named []module.Version
-       byPath := make(map[string]*task)
-       for _, t := range tasks {
-               prev, ok := byPath[t.m.Path]
-               if prev != nil && prev.m != t.m {
-                       base.Errorf("go get: conflicting versions for module %s: %s and %s", t.m.Path, prev.m.Version, t.m.Version)
-                       byPath[t.m.Path] = nil // sentinel to stop errors
+       prevBuildList := buildList
+
+       // Build a set of module paths that we don't plan to load packages from.
+       // This includes explicitly requested modules that don't have a root package
+       // and modules with a target version of "none".
+       var wg sync.WaitGroup
+       modOnly := make(map[string]*query)
+       for _, q := range queries {
+               if q.m.Version == "none" {
+                       modOnly[q.m.Path] = q
                        continue
                }
-               if ok {
-                       continue // already added
-               }
-               byPath[t.m.Path] = t
-               if t.m.Version != "none" {
-                       named = append(named, t.m)
+               if q.path == q.m.Path {
+                       wg.Add(1)
+                       go func(q *query) {
+                               if hasPkg, err := modload.ModuleHasRootPackage(q.m); err != nil {
+                                       base.Errorf("go get: %v", err)
+                               } else if !hasPkg {
+                                       modOnly[q.m.Path] = q
+                               }
+                               wg.Done()
+                       }(q)
                }
        }
+       wg.Wait()
        base.ExitIfErrors()
 
-       // If the modules named on the command line have any dependencies
-       // and we're supposed to upgrade dependencies,
-       // chase down the full list of upgraded dependencies.
-       // This turns required from a not-yet-upgraded (3) to the final (3).
-       // (See list above.)
-       var required []module.Version
-       if getU != "" {
-               upgraded, err := mvs.UpgradeAll(upgradeTarget, &upgrader{
-                       Reqs:    modload.Reqs(),
-                       targets: named,
-                       patch:   getU == "patch",
-                       tasks:   byPath,
-               })
+       // Build a list of arguments that may refer to packages.
+       var pkgPatterns []string
+       var pkgGets []getArg
+       for _, arg := range gets {
+               if modOnly[arg.path] == nil && arg.vers != "none" {
+                       pkgPatterns = append(pkgPatterns, arg.path)
+                       pkgGets = append(pkgGets, arg)
+               }
+       }
+
+       // Load packages and upgrade the modules that provide them. We do this until
+       // we reach a fixed point, since modules providing packages may change as we
+       // change versions. This must terminate because the module graph is finite,
+       // and the load and upgrade operations may only add and upgrade modules
+       // in the build list.
+       var matches []*search.Match
+       for {
+               var seenPkgs map[string]bool
+               seenQuery := make(map[querySpec]bool)
+               var queries []*query
+               addQuery := func(q *query) {
+                       if !seenQuery[q.querySpec] {
+                               seenQuery[q.querySpec] = true
+                               queries = append(queries, q)
+                       }
+               }
+
+               if len(pkgPatterns) > 0 {
+                       // Don't load packages if pkgPatterns is empty. Both
+                       // modload.ImportPathsQuiet and ModulePackages convert an empty list
+                       // of patterns to []string{"."}, which is not what we want.
+                       matches = modload.ImportPathsQuiet(pkgPatterns, imports.AnyTags())
+                       seenPkgs = make(map[string]bool)
+                       for i, match := range matches {
+                               arg := pkgGets[i]
+
+                               if len(match.Pkgs) == 0 {
+                                       // If the pattern did not match any packages, look up a new module.
+                                       // If the pattern doesn't match anything on the last iteration,
+                                       // we'll print a warning after the outer loop.
+                                       if !search.IsRelativePath(arg.path) && !match.Literal && arg.path != "all" {
+                                               addQuery(&query{querySpec: querySpec{path: arg.path, vers: arg.vers}, arg: arg.raw})
+                                       }
+                                       continue
+                               }
+
+                               allStd := true
+                               for _, pkg := range match.Pkgs {
+                                       if !seenPkgs[pkg] {
+                                               seenPkgs[pkg] = true
+                                               if _, _, err := modload.Lookup("", false, pkg); err != nil {
+                                                       allStd = false
+                                                       base.Errorf("go get %s: %v", arg.raw, err)
+                                                       continue
+                                               }
+                                       }
+                                       m := modload.PackageModule(pkg)
+                                       if m.Path == "" {
+                                               // pkg is in the standard library.
+                                               continue
+                                       }
+                                       allStd = false
+                                       if m.Path == modload.Target.Path {
+                                               // pkg is in the main module.
+                                               continue
+                                       }
+                                       addQuery(&query{querySpec: querySpec{path: m.Path, vers: arg.vers, forceModulePath: true, prevM: m}, arg: arg.raw})
+                               }
+                               if allStd && arg.path != arg.raw {
+                                       base.Errorf("go get %s: cannot use pattern %q with explicit version", arg.raw, arg.raw)
+                               }
+                       }
+               }
+               base.ExitIfErrors()
+
+               // Query target versions for modules providing packages matched by
+               // command line arguments.
+               byPath = runQueries(queryCache, queries, modOnly)
+
+               // Handle upgrades. This is needed for arguments that didn't match
+               // modules or matched different modules from a previous iteration. It
+               // also upgrades modules providing package dependencies if -u is set.
+               buildList, err := mvs.UpgradeAll(modload.Target, newUpgrader(byPath, seenPkgs))
                if err != nil {
                        base.Fatalf("go get: %v", err)
                }
-               required = upgraded[1:] // slice off upgradeTarget
+               modload.SetBuildList(buildList)
                base.ExitIfErrors()
-       }
 
-       // Put together the final build list as described above (1) (2) (3).
-       // If we're not using -u, then len(required) == 0 and ReloadBuildList
-       // chases down the dependencies of all the named module versions
-       // in one operation.
-       var list []module.Version
-       list = append(list, modload.BuildList()...)
-       list = append(list, named...)
-       list = append(list, required...)
-       modload.SetBuildList(list)
-       modload.ReloadBuildList() // note: does not update go.mod
-       base.ExitIfErrors()
+               // Stop if no changes have been made to the build list.
+               buildList = modload.BuildList()
+               eq := len(buildList) == len(prevBuildList)
+               for i := 0; eq && i < len(buildList); i++ {
+                       eq = buildList[i] == prevBuildList[i]
+               }
+               if eq {
+                       break
+               }
+               prevBuildList = buildList
+       }
+       if !*getD {
+               // Only print warnings after the last iteration,
+               // and only if we aren't going to build.
+               search.WarnUnmatched(matches)
+       }
 
-       // Scan for and apply any needed downgrades.
+       // Handle downgrades.
        var down []module.Version
        for _, m := range modload.BuildList() {
-               t := byPath[m.Path]
-               if t != nil && semver.Compare(m.Version, t.m.Version) > 0 {
-                       down = append(down, module.Version{Path: m.Path, Version: t.m.Version})
+               q := byPath[m.Path]
+               if q != nil && semver.Compare(m.Version, q.m.Version) > 0 {
+                       down = append(down, module.Version{Path: m.Path, Version: q.m.Version})
                }
        }
        if len(down) > 0 {
-               list, err := mvs.Downgrade(modload.Target, modload.Reqs(), down...)
+               buildList, err := mvs.Downgrade(modload.Target, modload.Reqs(), down...)
                if err != nil {
-                       base.Fatalf("go get: %v", err)
+                       base.Fatalf("go: %v", err)
                }
-               modload.SetBuildList(list)
+               modload.SetBuildList(buildList)
                modload.ReloadBuildList() // note: does not update go.mod
+               base.ExitIfErrors()
        }
-       base.ExitIfErrors()
 
        // Scan for any upgrades lost by the downgrades.
-       lost := make(map[string]string)
-       for _, m := range modload.BuildList() {
-               t := byPath[m.Path]
-               if t != nil && semver.Compare(m.Version, t.m.Version) != 0 {
-                       lost[m.Path] = m.Version
+       var lostUpgrades []*query
+       if len(down) > 0 {
+               versionByPath = make(map[string]string)
+               for _, m := range modload.BuildList() {
+                       versionByPath[m.Path] = m.Version
+               }
+               for _, q := range byPath {
+                       if v, ok := versionByPath[q.m.Path]; q.m.Version != "none" && (!ok || semver.Compare(v, q.m.Version) != 0) {
+                               lostUpgrades = append(lostUpgrades, q)
+                       }
                }
+               sort.Slice(lostUpgrades, func(i, j int) bool {
+                       return lostUpgrades[i].m.Path < lostUpgrades[j].m.Path
+               })
        }
-       if len(lost) > 0 {
+       if len(lostUpgrades) > 0 {
                desc := func(m module.Version) string {
                        s := m.Path + "@" + m.Version
                        t := byPath[m.Path]
@@ -473,23 +609,22 @@ func runGet(cmd *base.Command, args []string) {
                for _, d := range down {
                        downByPath[d.Path] = d
                }
+
                var buf strings.Builder
                fmt.Fprintf(&buf, "go get: inconsistent versions:")
-               for _, t := range tasks {
-                       if lost[t.m.Path] == "" {
-                               continue
-                       }
-                       // We lost t because its build list requires a newer version of something in down.
+               reqs := modload.Reqs()
+               for _, q := range lostUpgrades {
+                       // We lost q because its build list requires a newer version of something in down.
                        // Figure out exactly what.
                        // Repeatedly constructing the build list is inefficient
                        // if there are MANY command-line arguments,
                        // but at least all the necessary requirement lists are cached at this point.
-                       list, err := mvs.BuildList(t.m, reqs)
+                       list, err := buildListForLostUpgrade(q.m, reqs)
                        if err != nil {
-                               base.Fatalf("go get: %v", err)
+                               base.Fatalf("go: %v", err)
                        }
 
-                       fmt.Fprintf(&buf, "\n\t%s", desc(t.m))
+                       fmt.Fprintf(&buf, "\n\t%s", desc(q.m))
                        sep := " requires"
                        for _, m := range list {
                                if down, ok := downByPath[m.Path]; ok && semver.Compare(down.Version, m.Version) < 0 {
@@ -500,7 +635,12 @@ func runGet(cmd *base.Command, args []string) {
                        if sep != "," {
                                // We have no idea why this happened.
                                // At least report the problem.
-                               fmt.Fprintf(&buf, " ended up at %v unexpectedly (please report at golang.org/issue/new)", lost[t.m.Path])
+                               if v := versionByPath[q.m.Path]; v == "" {
+                                       fmt.Fprintf(&buf, " removed unexpectedly")
+                               } else {
+                                       fmt.Fprintf(&buf, " ended up at %s unexpectedly", v)
+                               }
+                               fmt.Fprintf(&buf, " (please report at golang.org/issue/new)")
                        }
                }
                base.Fatalf("%v", buf.String())
@@ -510,126 +650,253 @@ func runGet(cmd *base.Command, args []string) {
        modload.AllowWriteGoMod()
        modload.WriteGoMod()
 
-       // If -m was specified, we're done after the module work. No download, no build.
-       if *getM {
+       // If -d was specified, we're done after the module work.
+       // We've already downloaded modules by loading packages above.
+       // Otherwise, we need to build and install the packages matched by
+       // command line arguments. This may be a different set of packages,
+       // since we only build packages for the target platform.
+       // Note that 'go get -u' without arguments is equivalent to
+       // 'go get -u .', so we'll typically build the package in the current
+       // directory.
+       if *getD || len(pkgPatterns) == 0 {
                return
        }
+       work.BuildInit()
+       pkgs := load.PackagesForBuild(pkgPatterns)
+       work.InstallPackages(pkgPatterns, pkgs)
+}
 
-       if len(install) > 0 {
-               // All requested versions were explicitly @none.
-               // Note that 'go get -u' without any arguments results in len(install) == 1:
-               // search.CleanImportPaths returns "." for empty args.
-               work.BuildInit()
-               pkgs := load.PackagesAndErrors(install)
-               var todo []*load.Package
-               for _, p := range pkgs {
-                       // Ignore "no Go source files" errors for 'go get' operations on modules.
-                       if p.Error != nil {
-                               if len(args) == 0 && getU != "" && strings.HasPrefix(p.Error.Err, "no Go files") {
-                                       // Upgrading modules: skip the implicitly-requested package at the
-                                       // current directory, even if it is not tho module root.
-                                       continue
-                               }
-                               if strings.Contains(p.Error.Err, "cannot find module providing") && modload.ModuleInfo(p.ImportPath) != nil {
-                                       // Explicitly-requested module, but it doesn't contain a package at the
-                                       // module root.
-                                       continue
-                               }
-                               base.Errorf("%s", p.Error)
-                       }
-                       todo = append(todo, p)
+// runQueries looks up modules at target versions in parallel. Results will be
+// cached. If the same module is referenced by multiple queries at different
+// versions (including earlier queries in the modOnly map), an error will be
+// reported. A map from module paths to queries is returned, which includes
+// queries and modOnly.
+func runQueries(cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query {
+       var lookup par.Work
+       for _, q := range queries {
+               if cached := cache[q.querySpec]; cached != nil {
+                       *q = *cached
+               } else {
+                       cache[q.querySpec] = q
+                       lookup.Add(q)
                }
-               base.ExitIfErrors()
+       }
+
+       lookup.Do(10, func(item interface{}) {
+               q := item.(*query)
+               if q.vers == "none" {
+                       // Wait for downgrade step.
+                       q.m = module.Version{Path: q.path, Version: "none"}
+                       return
+               }
+               m, err := getQuery(q.path, q.vers, q.prevM, q.forceModulePath)
+               if err != nil {
+                       base.Errorf("go get %s: %v", q.arg, err)
+               }
+               q.m = m
+       })
+       base.ExitIfErrors()
 
-               // If -d was specified, we're done after the download: no build.
-               // (The load.PackagesAndErrors is what did the download
-               // of the named packages and their dependencies.)
-               if len(todo) > 0 && !*getD {
-                       work.InstallPackages(install, todo)
+       byPath := make(map[string]*query)
+       check := func(q *query) {
+               if prev, ok := byPath[q.m.Path]; prev != nil && prev.m != q.m {
+                       base.Errorf("go get: conflicting versions for module %s: %s and %s", q.m.Path, prev.m.Version, q.m.Version)
+                       byPath[q.m.Path] = nil // sentinel to stop errors
+                       return
+               } else if !ok {
+                       byPath[q.m.Path] = q
                }
        }
+       for _, q := range queries {
+               check(q)
+       }
+       for _, q := range modOnly {
+               check(q)
+       }
+       base.ExitIfErrors()
+
+       return byPath
 }
 
 // getQuery evaluates the given package path, version pair
 // to determine the underlying module version being requested.
 // If forceModulePath is set, getQuery must interpret path
 // as a module path.
-func getQuery(path, vers string, forceModulePath bool) (module.Version, error) {
-       if vers == "" {
+func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) {
+       if (prevM.Version != "") != forceModulePath {
+               // We resolve package patterns by calling QueryPattern, which does not
+               // accept a previous version and therefore cannot take it into account for
+               // the "latest" or "patch" queries.
+               // If we are resolving a package path or pattern, the caller has already
+               // resolved any existing packages to their containing module(s), and
+               // will set both prevM.Version and forceModulePath for those modules.
+               // The only remaining package patterns are those that are not already
+               // provided by the build list, which are indicated by
+               // an empty prevM.Version.
+               base.Fatalf("go get: internal error: prevM may be set if and only if forceModulePath is set")
+       }
+
+       if vers == "" || vers == "patch" && prevM.Version == "" {
                vers = "latest"
        }
 
-       // First choice is always to assume path is a module path.
-       // If that works out, we're done.
-       info, err := modload.Query(path, vers, modload.Allowed)
-       if err == nil {
-               return module.Version{Path: path, Version: info.Version}, nil
+       if forceModulePath || !strings.Contains(path, "...") {
+               if path == modload.Target.Path {
+                       if vers != "latest" {
+                               return module.Version{}, fmt.Errorf("can't get a specific version of the main module")
+                       }
+               }
+
+               // If the path doesn't contain a wildcard, try interpreting it as a module path.
+               info, err := modload.Query(path, vers, prevM.Version, modload.Allowed)
+               if err == nil {
+                       return module.Version{Path: path, Version: info.Version}, nil
+               }
+
+               // If the query fails, and the path must be a real module, report the query error.
+               if forceModulePath {
+                       return module.Version{}, err
+               }
        }
 
-       // Even if the query fails, if the path must be a real module, then report the query error.
-       if forceModulePath || *getM {
+       // Otherwise, try a package path or pattern.
+       results, err := modload.QueryPattern(path, vers, modload.Allowed)
+       if err != nil {
                return module.Version{}, err
        }
-
-       // Otherwise, try a package path.
-       m, _, err := modload.QueryPackage(path, vers, modload.Allowed)
-       return m, err
+       return results[0].Mod, nil
 }
 
 // An upgrader adapts an underlying mvs.Reqs to apply an
 // upgrade policy to a list of targets and their dependencies.
-// If patch=false, the upgrader implements "get -u".
-// If patch=true, the upgrader implements "get -u=patch".
 type upgrader struct {
        mvs.Reqs
-       targets []module.Version
-       patch   bool
-       tasks   map[string]*task
+
+       // cmdline maps a module path to a query made for that module at a
+       // specific target version. Each query corresponds to a module
+       // matched by a command line argument.
+       cmdline map[string]*query
+
+       // upgrade is a set of modules providing dependencies of packages
+       // matched by command line arguments. If -u or -u=patch is set,
+       // these modules are upgraded accordingly.
+       upgrade map[string]bool
 }
 
-// upgradeTarget is a fake "target" requiring all the modules to be upgraded.
-var upgradeTarget = module.Version{Path: "upgrade target", Version: ""}
+// newUpgrader creates an upgrader. cmdline contains queries made at
+// specific versions for modules matched by command line arguments. pkgs
+// is the set of packages matched by command line arguments. If -u or -u=patch
+// is set, modules providing dependencies of pkgs are upgraded accordingly.
+func newUpgrader(cmdline map[string]*query, pkgs map[string]bool) *upgrader {
+       u := &upgrader{
+               Reqs:    modload.Reqs(),
+               cmdline: cmdline,
+       }
+       if getU != "" {
+               u.upgrade = make(map[string]bool)
+
+               // Traverse package import graph.
+               // Initialize work queue with root packages.
+               seen := make(map[string]bool)
+               var work []string
+               add := func(path string) {
+                       if !seen[path] {
+                               seen[path] = true
+                               work = append(work, path)
+                       }
+               }
+               for pkg := range pkgs {
+                       add(pkg)
+               }
+               for len(work) > 0 {
+                       pkg := work[0]
+                       work = work[1:]
+                       m := modload.PackageModule(pkg)
+                       u.upgrade[m.Path] = true
+
+                       // testImports is empty unless test imports were actually loaded,
+                       // i.e., -t was set or "all" was one of the arguments.
+                       imports, testImports := modload.PackageImports(pkg)
+                       for _, imp := range imports {
+                               add(imp)
+                       }
+                       for _, imp := range testImports {
+                               add(imp)
+                       }
+               }
+       }
+       return u
+}
 
 // Required returns the requirement list for m.
-// Other than the upgradeTarget, we defer to u.Reqs.
+// For the main module, we override requirements with the modules named
+// one the command line, and we include new requirements. Otherwise,
+// we defer to u.Reqs.
 func (u *upgrader) Required(m module.Version) ([]module.Version, error) {
-       if m == upgradeTarget {
-               return u.targets, nil
+       rs, err := u.Reqs.Required(m)
+       if err != nil {
+               return nil, err
+       }
+       if m != modload.Target {
+               return rs, nil
+       }
+
+       overridden := make(map[string]bool)
+       for i, m := range rs {
+               if q := u.cmdline[m.Path]; q != nil && q.m.Version != "none" {
+                       rs[i] = q.m
+                       overridden[q.m.Path] = true
+               }
+       }
+       for _, q := range u.cmdline {
+               if !overridden[q.m.Path] && q.m.Path != modload.Target.Path && q.m.Version != "none" {
+                       rs = append(rs, q.m)
+               }
        }
-       return u.Reqs.Required(m)
+       return rs, nil
 }
 
 // Upgrade returns the desired upgrade for m.
-// If m is a tagged version, then Upgrade returns the latest tagged version.
+//
+// If m was requested at a specific version on the command line, then
+// Upgrade returns that version.
+//
+// If -u is set and m provides a dependency of a package matched by
+// command line arguments, then Upgrade may provider a newer tagged version.
+// If m is a tagged version, then Upgrade will return the latest tagged
+// version (with the same minor version number if -u=patch).
 // If m is a pseudo-version, then Upgrade returns the latest tagged version
-// when that version has a time-stamp newer than m.
-// Otherwise Upgrade returns m (preserving the pseudo-version).
-// This special case prevents accidental downgrades
-// when already using a pseudo-version newer than the latest tagged version.
+// only if that version has a time-stamp newer than m. This special case
+// prevents accidental downgrades when already using a pseudo-version
+// newer than the latest tagged version.
+//
+// If none of the above cases apply, then Upgrade returns m.
 func (u *upgrader) Upgrade(m module.Version) (module.Version, error) {
        // Allow pkg@vers on the command line to override the upgrade choice v.
-       // If t's version is < v, then we're going to downgrade anyway,
+       // If q's version is < m.Version, then we're going to downgrade anyway,
        // and it's cleaner to avoid moving back and forth and picking up
        // extraneous other newer dependencies.
-       // If t's version is > v, then we're going to upgrade past v anyway,
-       // and again it's cleaner to avoid moving back and forth picking up
-       // extraneous other newer dependencies.
-       if t := u.tasks[m.Path]; t != nil {
-               return t.m, nil
-       }
-
-       // Note that query "latest" is not the same as
-       // using repo.Latest.
-       // The query only falls back to untagged versions
-       // if nothing is tagged. The Latest method
-       // only ever returns untagged versions,
-       // which is not what we want.
-       query := "latest"
-       if u.patch {
-               // For patch upgrade, query "v1.2".
-               query = semver.MajorMinor(m.Version)
-       }
-       info, err := modload.Query(m.Path, query, modload.Allowed)
+       // If q's version is > m.Version, then we're going to upgrade past
+       // m.Version anyway, and again it's cleaner to avoid moving back and forth
+       // picking up extraneous other newer dependencies.
+       if q := u.cmdline[m.Path]; q != nil {
+               return q.m, nil
+       }
+
+       if !u.upgrade[m.Path] {
+               // Not involved in upgrade. Leave alone.
+               return m, nil
+       }
+
+       // Run query required by upgrade semantics.
+       // Note that Query "latest" is not the same as using repo.Latest,
+       // which may return a pseudoversion for the latest commit.
+       // Query "latest" returns the newest tagged version or the newest
+       // prerelease version if there are no non-prereleases, or repo.Latest
+       // if there aren't any tagged versions. Since we're providing the previous
+       // version, Query will confirm the latest version is actually newer
+       // and will return the current version if not.
+       info, err := modload.Query(m.Path, string(getU), m.Version, modload.Allowed)
        if err != nil {
                // Report error but return m, to let version selection continue.
                // (Reporting the error will fail the command at the next base.ExitIfErrors.)
@@ -637,23 +904,38 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) {
                // even report the error. Because Query does not consider pseudo-versions,
                // it may happen that we have a pseudo-version but during -u=patch
                // the query v0.0 matches no versions (not even the one we're using).
-               if !strings.Contains(err.Error(), "no matching versions") {
+               var noMatch *modload.NoMatchingVersionError
+               if !errors.As(err, &noMatch) {
                        base.Errorf("go get: upgrading %s@%s: %v", m.Path, m.Version, err)
                }
                return m, nil
        }
 
-       // If we're on a later prerelease, keep using it,
-       // even though normally an Upgrade will ignore prereleases.
-       if semver.Compare(info.Version, m.Version) < 0 {
-               return m, nil
-       }
+       return module.Version{Path: m.Path, Version: info.Version}, nil
+}
 
-       // If we're on a pseudo-version chronologically after the latest tagged version, keep using it.
-       // This avoids some accidental downgrades.
-       if mTime, err := modfetch.PseudoVersionTime(m.Version); err == nil && info.Time.Before(mTime) {
-               return m, nil
-       }
+// buildListForLostUpgrade returns the build list for the module graph
+// rooted at lost. Unlike mvs.BuildList, the target module (lost) is not
+// treated specially. The returned build list may contain a newer version
+// of lost.
+//
+// buildListForLostUpgrade is used after a downgrade has removed a module
+// requested at a specific version. This helps us understand the requirements
+// implied by each downgrade.
+func buildListForLostUpgrade(lost module.Version, reqs mvs.Reqs) ([]module.Version, error) {
+       return mvs.BuildList(lostUpgradeRoot, &lostUpgradeReqs{Reqs: reqs, lost: lost})
+}
 
-       return module.Version{Path: m.Path, Version: info.Version}, nil
+var lostUpgradeRoot = module.Version{Path: "lost-upgrade-root", Version: ""}
+
+type lostUpgradeReqs struct {
+       mvs.Reqs
+       lost module.Version
+}
+
+func (r *lostUpgradeReqs) Required(mod module.Version) ([]module.Version, error) {
+       if mod == lostUpgradeRoot {
+               return []module.Version{r.lost}, nil
+       }
+       return r.Reqs.Required(mod)
 }
index 7341ce44d20ae01bd1876a27f1d2eafd5ec616da..07248d1a61cb837be4d1cc7e6574407f6eb651a1 100644 (file)
@@ -20,8 +20,8 @@ type ModulePublic struct {
        Indirect  bool          `json:",omitempty"` // module is only indirectly needed by main module
        Dir       string        `json:",omitempty"` // directory holding local copy of files, if any
        GoMod     string        `json:",omitempty"` // path to go.mod file describing module, if any
-       Error     *ModuleError  `json:",omitempty"` // error loading module
        GoVersion string        `json:",omitempty"` // go version used in module
+       Error     *ModuleError  `json:",omitempty"` // error loading module
 }
 
 type ModuleError struct {
index 6103545ea65cb934f5f6ea3688b113ab2844d88b..17a65216c2a21c9302a090c06cf3888697ea2e80 100644 (file)
@@ -12,6 +12,7 @@ import (
        "cmd/go/internal/modinfo"
        "cmd/go/internal/module"
        "cmd/go/internal/search"
+       "cmd/go/internal/semver"
        "encoding/hex"
        "fmt"
        "internal/goroot"
@@ -38,9 +39,6 @@ func findStandardImportPath(path string) string {
                if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) {
                        return filepath.Join(cfg.GOROOT, "src", path)
                }
-               if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, "vendor/"+path) {
-                       return filepath.Join(cfg.GOROOT, "src/vendor", path)
-               }
        }
        return ""
 }
@@ -77,13 +75,15 @@ func ModuleInfo(path string) *modinfo.ModulePublic {
 
 // addUpdate fills in m.Update if an updated version is available.
 func addUpdate(m *modinfo.ModulePublic) {
-       if m.Version != "" {
-               if info, err := Query(m.Path, "latest", Allowed); err == nil && info.Version != m.Version {
-                       m.Update = &modinfo.ModulePublic{
-                               Path:    m.Path,
-                               Version: info.Version,
-                               Time:    &info.Time,
-                       }
+       if m.Version == "" {
+               return
+       }
+
+       if info, err := Query(m.Path, "latest", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 {
+               m.Update = &modinfo.ModulePublic{
+                       Path:    m.Path,
+                       Version: info.Version,
+                       Time:    &info.Time,
                }
        }
 }
@@ -127,7 +127,7 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic {
        // complete fills in the extra fields in m.
        complete := func(m *modinfo.ModulePublic) {
                if m.Version != "" {
-                       if q, err := Query(m.Path, m.Version, nil); err != nil {
+                       if q, err := Query(m.Path, m.Version, "", nil); err != nil {
                                m.Error = &modinfo.ModuleError{Err: err.Error()}
                        } else {
                                m.Version = q.Version
@@ -219,7 +219,7 @@ func PackageBuildInfo(path string, deps []string) string {
                if r.Path == "" {
                        h = "\t" + modfetch.Sum(mod)
                }
-               fmt.Fprintf(&buf, "dep\t%s\t%s%s\n", mod.Path, mod.Version, h)
+               fmt.Fprintf(&buf, "dep\t%s\t%s%s\n", mod.Path, mv, h)
                if r.Path != "" {
                        fmt.Fprintf(&buf, "=>\t%s\t%s\t%s\n", r.Path, r.Version, modfetch.Sum(r))
                }
@@ -250,20 +250,16 @@ func findModule(target, path string) module.Version {
 }
 
 func ModInfoProg(info string) []byte {
-       // Inject a variable with the debug information as runtime/debug.modinfo,
+       // Inject a variable with the debug information as runtime.modinfo,
        // but compile it in package main so that it is specific to the binary.
-       //
        // The variable must be a literal so that it will have the correct value
        // before the initializer for package main runs.
        //
-       // We also want the value to be present even if runtime/debug.modinfo is
-       // otherwise unused in the rest of the program. Reading it in an init function
-       // suffices for now.
-
+       // The runtime startup code refers to the variable, which keeps it live in all binaries.
        return []byte(fmt.Sprintf(`package main
 import _ "unsafe"
-//go:linkname __set_debug_modinfo__ runtime..z2fdebug.setmodinfo
-func __set_debug_modinfo__(string)
-func init() { __set_debug_modinfo__(%q) }
+//go:linkname __set_modinfo__ runtime.setmodinfo
+func __set_modinfo__(string)
+func init() { __set_modinfo__(%q) }
        `, string(infoStart)+info+string(infoEnd)))
 }
index d9c8ae40d88f39a80109a31f3116210d6e6b9127..788544c2c85177ca10ff36240c1da424e22323ae 100644 (file)
@@ -19,34 +19,28 @@ including recording and resolving dependencies on other modules.
 Modules replace the old GOPATH-based approach to specifying
 which source files are used in a given build.
 
-Preliminary module support
-
-Go 1.11 includes preliminary support for Go modules,
-including a new module-aware 'go get' command.
-We intend to keep revising this support, while preserving compatibility,
-until it can be declared official (no longer preliminary),
-and then at a later point we may remove support for work
-in GOPATH and the old 'go get' command.
-
-The quickest way to take advantage of the new Go 1.11 module support
-is to check out your repository into a directory outside GOPATH/src,
-create a go.mod file (described in the next section) there, and run
+Module support
+
+Go 1.13 includes support for Go modules. Module-aware mode is active by default
+whenever a go.mod file is found in, or in a parent of, the current directory.
+
+The quickest way to take advantage of module support is to check out your
+repository, create a go.mod file (described in the next section) there, and run
 go commands from within that file tree.
 
-For more fine-grained control, the module support in Go 1.11 respects
+For more fine-grained control, Go 1.13 continues to respect
 a temporary environment variable, GO111MODULE, which can be set to one
 of three string values: off, on, or auto (the default).
-If GO111MODULE=off, then the go command never uses the
-new module support. Instead it looks in vendor directories and GOPATH
-to find dependencies; we now refer to this as "GOPATH mode."
 If GO111MODULE=on, then the go command requires the use of modules,
-never consulting GOPATH. We refer to this as the command being
-module-aware or running in "module-aware mode".
-If GO111MODULE=auto or is unset, then the go command enables or
-disables module support based on the current directory.
-Module support is enabled only when the current directory is outside
-GOPATH/src and itself contains a go.mod file or is below a directory
-containing a go.mod file.
+never consulting GOPATH. We refer to this as the command
+being module-aware or running in "module-aware mode".
+If GO111MODULE=off, then the go command never uses
+module support. Instead it looks in vendor directories and GOPATH
+to find dependencies; we now refer to this as "GOPATH mode."
+If GO111MODULE=auto or is unset, then the go command enables or disables
+module support based on the current directory.
+Module support is enabled only when the current directory contains a
+go.mod file or is below a directory containing a go.mod file.
 
 In module-aware mode, GOPATH no longer defines the meaning of imports
 during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod)
@@ -337,26 +331,35 @@ module file trees.
 
 Module downloading and verification
 
-The go command maintains, in the main module's root directory alongside
-go.mod, a file named go.sum containing the expected cryptographic checksums
-of the content of specific module versions. Each time a dependency is
-used, its checksum is added to go.sum if missing or else required to match
-the existing entry in go.sum.
-
-The go command maintains a cache of downloaded packages and computes
-and records the cryptographic checksum of each package at download time.
-In normal operation, the go command checks these pre-computed checksums
-against the main module's go.sum file, instead of recomputing them on
-each command invocation. The 'go mod verify' command checks that
-the cached copies of module downloads still match both their recorded
-checksums and the entries in go.sum.
-
-The go command can fetch modules from a proxy instead of connecting
-to source control systems directly, according to the setting of the GOPROXY
-environment variable.
-
-See 'go help goproxy' for details about the proxy and also the format of
-the cached downloaded packages.
+The go command can fetch modules from a proxy or connect to source control
+servers directly, according to the setting of the GOPROXY environment
+variable (see 'go help env'). The default setting for GOPROXY is
+"https://proxy.golang.org,direct", which means to try the
+Go module mirror run by Google and fall back to a direct connection
+if the proxy reports that it does not have the module (HTTP error 404 or 410).
+See https://proxy.golang.org/privacy for the service's privacy policy.
+If GOPROXY is set to the string "direct", downloads use a direct connection
+to source control servers. Setting GOPROXY to "off" disallows downloading
+modules from any source. Otherwise, GOPROXY is expected to be a comma-separated
+list of the URLs of module proxies, in which case the go command will fetch
+modules from those proxies. For each request, the go command tries each proxy
+in sequence, only moving to the next if the current proxy returns a 404 or 410
+HTTP response. The string "direct" may appear in the proxy list,
+to cause a direct connection to be attempted at that point in the search.
+Any proxies listed after "direct" are never consulted.
+
+The GOPRIVATE and GONOPROXY environment variables allow bypassing
+the proxy for selected modules. See 'go help module-private' for details.
+
+No matter the source of the modules, the go command checks downloads against
+known checksums, to detect unexpected changes in the content of any specific
+module version from one day to the next. This check first consults the current
+module's go.sum file but falls back to the Go checksum database, controlled by
+the GOSUMDB and GONOSUMDB environment variables. See 'go help module-auth'
+for details.
+
+See 'go help goproxy' for details about the proxy protocol and also
+the format of the cached downloaded packages.
 
 Modules and vendoring
 
@@ -461,5 +464,12 @@ Because the module graph defines the meaning of import statements, any
 commands that load packages also use and therefore update go.mod,
 including go build, go get, go install, go list, go test, go mod graph,
 go mod tidy, and go mod why.
+
+The expected language version, set by the go directive, determines
+which language features are available when compiling the module.
+Language features available in that version will be available for use.
+Language features removed in earlier versions, or added in later versions,
+will not be available. Note that the language version does not affect
+build tags, which are determined by the Go release being used.
        `,
 }
index 3210e16c25b084be98d6066a0dbc2c0a18e5dc35..dacc876701a0cad75c44d5ce386f63c9add98e99 100644 (file)
@@ -18,7 +18,6 @@ import (
 
        "cmd/go/internal/cfg"
        "cmd/go/internal/modfetch"
-       "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
        "cmd/go/internal/search"
@@ -28,6 +27,10 @@ import (
 type ImportMissingError struct {
        ImportPath string
        Module     module.Version
+
+       // newMissingVersion is set to a newer version of Module if one is present
+       // in the build list. When set, we can't automatically upgrade.
+       newMissingVersion string
 }
 
 func (e *ImportMissingError) Error() string {
@@ -61,17 +64,21 @@ func Import(path string) (m module.Version, dir string, err error) {
        }
 
        // Is the package in the standard library?
-       if search.IsStandardImportPath(path) {
-               if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) {
-                       dir := filepath.Join(cfg.GOROOT, "src", path)
-                       return module.Version{}, dir, nil
+       if search.IsStandardImportPath(path) &&
+               goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) {
+               if targetInGorootSrc {
+                       if dir, ok := dirInModule(path, targetPrefix, ModRoot(), true); ok {
+                               return Target, dir, nil
+                       }
                }
+               dir := filepath.Join(cfg.GOROOT, "src", path)
+               return module.Version{}, dir, nil
        }
 
        // -mod=vendor is special.
        // Everything must be in the main module or the main module's vendor directory.
        if cfg.BuildMod == "vendor" {
-               mainDir, mainOK := dirInModule(path, Target.Path, ModRoot(), true)
+               mainDir, mainOK := dirInModule(path, targetPrefix, ModRoot(), true)
                vendorDir, vendorOK := dirInModule(path, "", filepath.Join(ModRoot(), "vendor"), false)
                if mainOK && vendorOK {
                        return module.Version{}, "", fmt.Errorf("ambiguous import: found %s in multiple directories:\n\t%s\n\t%s", path, mainDir, vendorDir)
@@ -178,14 +185,37 @@ func Import(path string) (m module.Version, dir string, err error) {
                }
        }
 
-       m, _, err = QueryPackage(path, "latest", Allowed)
+       candidates, err := QueryPackage(path, "latest", Allowed)
        if err != nil {
-               if _, ok := err.(*codehost.VCSError); ok {
+               if errors.Is(err, os.ErrNotExist) {
+                       // Return "cannot find module providing package […]" instead of whatever
+                       // low-level error QueryPackage produced.
+                       return module.Version{}, "", &ImportMissingError{ImportPath: path}
+               } else {
                        return module.Version{}, "", err
                }
-               return module.Version{}, "", &ImportMissingError{ImportPath: path}
        }
-       return m, "", &ImportMissingError{ImportPath: path, Module: m}
+       m = candidates[0].Mod
+       newMissingVersion := ""
+       for _, c := range candidates {
+               cm := c.Mod
+               for _, bm := range buildList {
+                       if bm.Path == cm.Path && semver.Compare(bm.Version, cm.Version) > 0 {
+                               // QueryPackage proposed that we add module cm to provide the package,
+                               // but we already depend on a newer version of that module (and we don't
+                               // have the package).
+                               //
+                               // This typically happens when a package is present at the "@latest"
+                               // version (e.g., v1.0.0) of a module, but we have a newer version
+                               // of the same module in the build list (e.g., v1.0.1-beta), and
+                               // the package is not present there.
+                               m = cm
+                               newMissingVersion = bm.Version
+                               break
+                       }
+               }
+       }
+       return m, "", &ImportMissingError{ImportPath: path, Module: m, newMissingVersion: newMissingVersion}
 }
 
 // maybeInModule reports whether, syntactically,
@@ -229,8 +259,8 @@ func dirInModule(path, mpath, mdir string, isLocal bool) (dir string, haveGoFile
        if isLocal {
                for d := dir; d != mdir && len(d) > len(mdir); {
                        haveGoMod := haveGoModCache.Do(d, func() interface{} {
-                               _, err := os.Stat(filepath.Join(d, "go.mod"))
-                               return err == nil
+                               fi, err := os.Stat(filepath.Join(d, "go.mod"))
+                               return err == nil && !fi.IsDir()
                        }).(bool)
 
                        if haveGoMod {
index 9422a3d960c16278fad5df23576a4f6a2603cd5b..c6ade5d17f4e00a38a3b78d1bceb8a3a46d79fee 100644 (file)
@@ -21,7 +21,7 @@ var importTests = []struct {
        },
        {
                path: "golang.org/x/net",
-               err:  "cannot find module providing package golang.org/x/net",
+               err:  "module golang.org/x/net@.* found, but does not contain package golang.org/x/net",
        },
        {
                path: "golang.org/x/text",
@@ -43,6 +43,7 @@ var importTests = []struct {
 
 func TestImport(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        for _, tt := range importTests {
                t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) {
index 22d14ccce78b241d780ee526754bd3ca8510144a..807ce8d5dc5fe290d6ee66f2a17d0e03ca0a3488 100644 (file)
@@ -6,6 +6,18 @@ package modload
 
 import (
        "bytes"
+       "encoding/json"
+       "fmt"
+       "go/build"
+       "internal/lazyregexp"
+       "io/ioutil"
+       "os"
+       "path"
+       "path/filepath"
+       "runtime/debug"
+       "strconv"
+       "strings"
+
        "cmd/go/internal/base"
        "cmd/go/internal/cache"
        "cmd/go/internal/cfg"
@@ -18,22 +30,11 @@ import (
        "cmd/go/internal/mvs"
        "cmd/go/internal/renameio"
        "cmd/go/internal/search"
-       "encoding/json"
-       "fmt"
-       "go/build"
-       "io/ioutil"
-       "os"
-       "path"
-       "path/filepath"
-       "regexp"
-       "runtime/debug"
-       "strconv"
-       "strings"
 )
 
 var (
        cwd            string // TODO(bcmills): Is this redundant with base.Cwd?
-       MustUseModules = mustUseModules()
+       mustUseModules = false
        initialized    bool
 
        modRoot     string
@@ -42,6 +43,15 @@ var (
        excluded    map[module.Version]bool
        Target      module.Version
 
+       // targetPrefix is the path prefix for packages in Target, without a trailing
+       // slash. For most modules, targetPrefix is just Target.Path, but the
+       // standard-library module "std" has an empty prefix.
+       targetPrefix string
+
+       // targetInGorootSrc caches whether modRoot is within GOROOT/src.
+       // The "std" module is special within GOROOT/src, but not otherwise.
+       targetInGorootSrc bool
+
        gopath string
 
        CmdModInit   bool   // running 'go mod init'
@@ -69,18 +79,6 @@ func BinDir() string {
        return filepath.Join(gopath, "bin")
 }
 
-// mustUseModules reports whether we are invoked as vgo
-// (as opposed to go).
-// If so, we only support builds with go.mod files.
-func mustUseModules() bool {
-       name := os.Args[0]
-       name = name[strings.LastIndex(name, "/")+1:]
-       name = name[strings.LastIndex(name, `\`)+1:]
-       return strings.HasPrefix(name, "vgo")
-}
-
-var inGOPATH bool // running in GOPATH/src
-
 // Init determines whether module mode is enabled, locates the root of the
 // current module (if any), sets environment variables for Git subprocesses, and
 // configures the cfg, codehost, load, modfetch, and search packages for use
@@ -91,18 +89,17 @@ func Init() {
        }
        initialized = true
 
-       env := os.Getenv("GO111MODULE")
+       env := cfg.Getenv("GO111MODULE")
        switch env {
        default:
                base.Fatalf("go: unknown environment setting GO111MODULE=%s", env)
-       case "", "auto":
-               // leave MustUseModules alone
+       case "auto", "":
+               mustUseModules = false
        case "on":
-               MustUseModules = true
+               mustUseModules = true
        case "off":
-               if !MustUseModules {
-                       return
-               }
+               mustUseModules = false
+               return
        }
 
        // Disable any prompting for passwords by Git.
@@ -138,36 +135,14 @@ func Init() {
                base.Fatalf("go: %v", err)
        }
 
-       inGOPATH = false
-       for _, gopath := range filepath.SplitList(cfg.BuildContext.GOPATH) {
-               if gopath == "" {
-                       continue
-               }
-               if search.InDir(cwd, filepath.Join(gopath, "src")) != "" {
-                       inGOPATH = true
-                       break
-               }
-       }
-
-       if inGOPATH && !MustUseModules {
-               if CmdModInit {
-                       die() // Don't init a module that we're just going to ignore.
-               }
-               // No automatic enabling in GOPATH.
-               if root, _ := FindModuleRoot(cwd, "", false); root != "" {
-                       cfg.GoModInGOPATH = filepath.Join(root, "go.mod")
-               }
-               return
-       }
-
        if CmdModInit {
                // Running 'go mod init': go.mod will be created in current directory.
                modRoot = cwd
        } else {
-               modRoot, _ = FindModuleRoot(cwd, "", MustUseModules)
+               modRoot = findModuleRoot(cwd)
                if modRoot == "" {
-                       if !MustUseModules {
-                               // GO111MODULE is 'auto' (or unset), and we can't find a module root.
+                       if !mustUseModules {
+                               // GO111MODULE is 'auto', and we can't find a module root.
                                // Stay in GOPATH mode.
                                return
                        }
@@ -254,9 +229,11 @@ func Init() {
 func init() {
        load.ModInit = Init
 
-       // Set modfetch.PkgMod unconditionally, so that go clean -modcache can run even without modules enabled.
+       // Set modfetch.PkgMod and codehost.WorkRoot unconditionally,
+       // so that go clean -modcache and go mod download can run even without modules enabled.
        if list := filepath.SplitList(cfg.BuildContext.GOPATH); len(list) > 0 && list[0] != "" {
                modfetch.PkgMod = filepath.Join(list[0], "pkg/mod")
+               codehost.WorkRoot = filepath.Join(list[0], "pkg/mod/cache/vcs")
        }
 }
 
@@ -266,7 +243,7 @@ func init() {
 // (usually through MustModRoot).
 func Enabled() bool {
        Init()
-       return modRoot != "" || MustUseModules
+       return modRoot != "" || mustUseModules
 }
 
 // ModRoot returns the root of the main module.
@@ -296,11 +273,21 @@ func die() {
        if printStackInDie {
                debug.PrintStack()
        }
-       if os.Getenv("GO111MODULE") == "off" {
+       if cfg.Getenv("GO111MODULE") == "off" {
                base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'")
        }
-       if inGOPATH && !MustUseModules {
-               base.Fatalf("go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'")
+       if cwd != "" {
+               if dir, name := findAltConfig(cwd); dir != "" {
+                       rel, err := filepath.Rel(cwd, dir)
+                       if err != nil {
+                               rel = dir
+                       }
+                       cdCmd := ""
+                       if rel != "." {
+                               cdCmd = fmt.Sprintf("cd %s && ", rel)
+                       }
+                       base.Fatalf("go: cannot find main module, but found %s in %s\n\tto create a module there, run:\n\t%sgo mod init", name, dir, cdCmd)
+               }
        }
        base.Fatalf("go: cannot find main module; see 'go help modules'")
 }
@@ -315,6 +302,7 @@ func InitMod() {
        Init()
        if modRoot == "" {
                Target = module.Version{Path: "command-line-arguments"}
+               targetPrefix = "command-line-arguments"
                buildList = []module.Version{Target}
                return
        }
@@ -328,14 +316,8 @@ func InitMod() {
        }
 
        gomod := filepath.Join(modRoot, "go.mod")
-       data, err := ioutil.ReadFile(gomod)
+       data, err := renameio.ReadFile(gomod)
        if err != nil {
-               if os.IsNotExist(err) {
-                       legacyModInit()
-                       modFileToBuildList()
-                       WriteGoMod()
-                       return
-               }
                base.Fatalf("go: %v", err)
        }
 
@@ -349,7 +331,7 @@ func InitMod() {
 
        if len(f.Syntax.Stmt) == 0 || f.Module == nil {
                // Empty mod file. Must add module path.
-               path, err := FindModulePath(modRoot)
+               path, err := findModulePath(modRoot)
                if err != nil {
                        base.Fatalf("go: %v", err)
                }
@@ -367,12 +349,21 @@ func InitMod() {
                excluded[x.Mod] = true
        }
        modFileToBuildList()
+       stdVendorMode()
        WriteGoMod()
 }
 
 // modFileToBuildList initializes buildList from the modFile.
 func modFileToBuildList() {
        Target = modFile.Module.Mod
+       targetPrefix = Target.Path
+       if rel := search.InDir(cwd, cfg.GOROOTsrc); rel != "" {
+               targetInGorootSrc = true
+               if Target.Path == "std" {
+                       targetPrefix = ""
+               }
+       }
+
        list := []module.Version{Target}
        for _, r := range modFile.Require {
                list = append(list, r.Mod)
@@ -380,6 +371,42 @@ func modFileToBuildList() {
        buildList = list
 }
 
+// stdVendorMode applies inside $GOROOT/src.
+// It checks that the go.mod matches vendor/modules.txt
+// and then sets -mod=vendor unless this is a command
+// that has to do explicitly with modules.
+func stdVendorMode() {
+       if !targetInGorootSrc {
+               return
+       }
+       if cfg.CmdName == "get" || strings.HasPrefix(cfg.CmdName, "mod ") {
+               return
+       }
+
+       readVendorList()
+BuildList:
+       for _, m := range buildList {
+               if m.Path == "cmd" || m.Path == "std" {
+                       continue
+               }
+               for _, v := range vendorList {
+                       if m.Path == v.Path {
+                               if m.Version != v.Version {
+                                       base.Fatalf("go: inconsistent vendoring in %s:\n"+
+                                               "\tgo.mod requires %s %s but vendor/modules.txt has %s.\n"+
+                                               "\trun 'go mod tidy; go mod vendor' to sync",
+                                               modRoot, m.Path, m.Version, v.Version)
+                               }
+                               continue BuildList
+                       }
+               }
+               base.Fatalf("go: inconsistent vendoring in %s:\n"+
+                       "\tgo.mod requires %s %s but vendor/modules.txt does not include it.\n"+
+                       "\trun 'go mod tidy; go mod vendor' to sync", modRoot, m.Path, m.Version)
+       }
+       cfg.BuildMod = "vendor"
+}
+
 // Allowed reports whether module m is allowed (not excluded) by the main module's go.mod.
 func Allowed(m module.Version) bool {
        return !excluded[m]
@@ -387,17 +414,16 @@ func Allowed(m module.Version) bool {
 
 func legacyModInit() {
        if modFile == nil {
-               path, err := FindModulePath(modRoot)
+               path, err := findModulePath(modRoot)
                if err != nil {
                        base.Fatalf("go: %v", err)
                }
                fmt.Fprintf(os.Stderr, "go: creating new go.mod: module %s\n", path)
                modFile = new(modfile.File)
                modFile.AddModuleStmt(path)
+               addGoStmt() // Add the go directive before converted module requirements.
        }
 
-       addGoStmt()
-
        for _, name := range altConfigs {
                cfg := filepath.Join(modRoot, name)
                data, err := ioutil.ReadFile(cfg)
@@ -420,15 +446,12 @@ func legacyModInit() {
        }
 }
 
-// InitGoStmt adds a go statement, unless there already is one.
-func InitGoStmt() {
-       if modFile.Go == nil {
-               addGoStmt()
-       }
-}
-
-// addGoStmt adds a go statement referring to the current version.
+// addGoStmt adds a go directive to the go.mod file if it does not already include one.
+// The 'go' version added, if any, is the latest version supported by this toolchain.
 func addGoStmt() {
+       if modFile.Go != nil && modFile.Go.Version != "" {
+               return
+       }
        tags := build.Default.ReleaseTags
        version := tags[len(tags)-1]
        if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) {
@@ -454,19 +477,13 @@ var altConfigs = []string{
        ".git/config",
 }
 
-// Exported only for testing.
-func FindModuleRoot(dir, limit string, legacyConfigOK bool) (root, file string) {
+func findModuleRoot(dir string) (root string) {
        dir = filepath.Clean(dir)
-       dir1 := dir
-       limit = filepath.Clean(limit)
 
        // Look for enclosing go.mod.
        for {
                if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() {
-                       return dir, "go.mod"
-               }
-               if dir == limit {
-                       break
+                       return dir
                }
                d := filepath.Dir(dir)
                if d == dir {
@@ -474,37 +491,45 @@ func FindModuleRoot(dir, limit string, legacyConfigOK bool) (root, file string)
                }
                dir = d
        }
+       return ""
+}
 
-       // Failing that, look for enclosing alternate version config.
-       if legacyConfigOK {
-               dir = dir1
-               for {
-                       for _, name := range altConfigs {
-                               if fi, err := os.Stat(filepath.Join(dir, name)); err == nil && !fi.IsDir() {
-                                       return dir, name
+func findAltConfig(dir string) (root, name string) {
+       dir = filepath.Clean(dir)
+       for {
+               for _, name := range altConfigs {
+                       if fi, err := os.Stat(filepath.Join(dir, name)); err == nil && !fi.IsDir() {
+                               if rel := search.InDir(dir, cfg.BuildContext.GOROOT); rel == "." {
+                                       // Don't suggest creating a module from $GOROOT/.git/config.
+                                       return "", ""
                                }
+                               return dir, name
                        }
-                       if dir == limit {
-                               break
-                       }
-                       d := filepath.Dir(dir)
-                       if d == dir {
-                               break
-                       }
-                       dir = d
                }
+               d := filepath.Dir(dir)
+               if d == dir {
+                       break
+               }
+               dir = d
        }
-
        return "", ""
 }
 
-// Exported only for testing.
-func FindModulePath(dir string) (string, error) {
+func findModulePath(dir string) (string, error) {
        if CmdModModule != "" {
                // Running go mod init x/y/z; return x/y/z.
+               if err := module.CheckImportPath(CmdModModule); err != nil {
+                       return "", err
+               }
                return CmdModModule, nil
        }
 
+       // TODO(bcmills): once we have located a plausible module path, we should
+       // query version control (if available) to verify that it matches the major
+       // version of the most recent tag.
+       // See https://golang.org/issue/29433, https://golang.org/issue/27009, and
+       // https://golang.org/issue/31549.
+
        // Cast about for import comments,
        // first in top-level directory, then in subdirectories.
        list, _ := ioutil.ReadDir(dir)
@@ -554,18 +579,19 @@ func FindModulePath(dir string) (string, error) {
                }
        }
 
-       // Look for .git/config with github origin as last resort.
-       data, _ = ioutil.ReadFile(filepath.Join(dir, ".git/config"))
-       if m := gitOriginRE.FindSubmatch(data); m != nil {
-               return "github.com/" + string(m[1]), nil
-       }
+       msg := `cannot determine module path for source directory %s (outside GOPATH, module path must be specified)
+
+Example usage:
+       'go mod init example.com/m' to initialize a v0 or v1 module
+       'go mod init example.com/m/v2' to initialize a v2 module
 
-       return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, no import comments)", dir)
+Run 'go help mod init' for more information.
+`
+       return "", fmt.Errorf(msg, dir)
 }
 
 var (
-       gitOriginRE     = regexp.MustCompile(`(?m)^\[remote "origin"\]\r?\n\turl = (?:https://github.com/|git@github.com:|gh:)([^/]+/[^/]+?)(\.git)?\r?\n`)
-       importCommentRE = regexp.MustCompile(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`)
+       importCommentRE = lazyregexp.New(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`)
 )
 
 func findImportComment(file string) string {
@@ -629,6 +655,8 @@ func WriteGoMod() {
                return
        }
 
+       addGoStmt()
+
        if loaded != nil {
                reqs := MinReqs()
                min, err := reqs.Required(Target)
@@ -651,24 +679,27 @@ func WriteGoMod() {
                base.Fatalf("go: %v", err)
        }
 
+       dirty := !bytes.Equal(new, modFileData)
+       if dirty && cfg.BuildMod == "readonly" {
+               // If we're about to fail due to -mod=readonly,
+               // prefer to report a dirty go.mod over a dirty go.sum
+               base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly")
+       }
        // Always update go.sum, even if we didn't change go.mod: we may have
        // downloaded modules that we didn't have before.
        modfetch.WriteGoSum()
 
-       if bytes.Equal(new, modFileData) {
+       if !dirty {
                // We don't need to modify go.mod from what we read previously.
                // Ignore any intervening edits.
                return
        }
-       if cfg.BuildMod == "readonly" {
-               base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly")
-       }
 
        unlock := modfetch.SideLock()
        defer unlock()
 
        file := filepath.Join(modRoot, "go.mod")
-       old, err := ioutil.ReadFile(file)
+       old, err := renameio.ReadFile(file)
        if !bytes.Equal(old, modFileData) {
                if bytes.Equal(old, new) {
                        // Some other process wrote the same go.mod file that we were about to write.
@@ -688,7 +719,7 @@ func WriteGoMod() {
 
        }
 
-       if err := renameio.WriteFile(file, new); err != nil {
+       if err := renameio.WriteFile(file, new, 0666); err != nil {
                base.Fatalf("error writing go.mod: %v", err)
        }
        modFileData = new
@@ -705,13 +736,21 @@ func fixVersion(path, vers string) (string, error) {
        // Avoid the query if it looks OK.
        _, pathMajor, ok := module.SplitPathVersion(path)
        if !ok {
-               return "", fmt.Errorf("malformed module path: %s", path)
+               return "", &module.ModuleError{
+                       Path: path,
+                       Err: &module.InvalidVersionError{
+                               Version: vers,
+                               Err:     fmt.Errorf("malformed module path %q", path),
+                       },
+               }
        }
-       if vers != "" && module.CanonicalVersion(vers) == vers && module.MatchPathMajor(vers, pathMajor) {
-               return vers, nil
+       if vers != "" && module.CanonicalVersion(vers) == vers {
+               if err := module.MatchPathMajor(vers, pathMajor); err == nil {
+                       return vers, nil
+               }
        }
 
-       info, err := Query(path, vers, nil)
+       info, err := Query(path, vers, "", nil)
        if err != nil {
                return "", err
        }
diff --git a/libgo/go/cmd/go/internal/modload/init_test.go b/libgo/go/cmd/go/internal/modload/init_test.go
deleted file mode 100644 (file)
index 2df9d8a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package modload
-
-import (
-       "io/ioutil"
-       "os"
-       "path/filepath"
-       "testing"
-)
-
-func TestFindModuleRootIgnoreDir(t *testing.T) {
-       // In Plan 9, directories are automatically created in /n.
-       // For example, /n/go.mod always exist, but it's a directory.
-       // Test that we ignore directories when trying to find go.mod and other config files.
-
-       dir, err := ioutil.TempDir("", "gotest")
-       if err != nil {
-               t.Fatalf("failed to create temporary directory: %v", err)
-       }
-       defer os.RemoveAll(dir)
-       if err := os.Mkdir(filepath.Join(dir, "go.mod"), os.ModeDir|0755); err != nil {
-               t.Fatalf("Mkdir failed: %v", err)
-       }
-       for _, name := range altConfigs {
-               if err := os.MkdirAll(filepath.Join(dir, name), os.ModeDir|0755); err != nil {
-                       t.Fatalf("MkdirAll failed: %v", err)
-               }
-       }
-       p := filepath.Join(dir, "example")
-       if err := os.Mkdir(p, os.ModeDir|0755); err != nil {
-               t.Fatalf("Mkdir failed: %v", err)
-       }
-       if root, _ := FindModuleRoot(p, "", false); root != "" {
-               t.Errorf("FindModuleRoot(%q, \"\", false): %q, want empty string", p, root)
-       }
-       if root, _ := FindModuleRoot(p, "", true); root != "" {
-               t.Errorf("FindModuleRoot(%q, \"\", true): %q, want empty string", p, root)
-       }
-}
index 2f1a3c24d223cf007299bf5a049b139e9ba97b04..c571ddc5f5423cc40b2308d396b8b6e1de7291a1 100644 (file)
@@ -55,18 +55,28 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic {
                        base.Fatalf("go: cannot use relative path %s to specify module", arg)
                }
                if i := strings.Index(arg, "@"); i >= 0 {
-                       info, err := Query(arg[:i], arg[i+1:], nil)
+                       path := arg[:i]
+                       vers := arg[i+1:]
+                       var current string
+                       for _, m := range buildList {
+                               if m.Path == path {
+                                       current = m.Version
+                                       break
+                               }
+                       }
+
+                       info, err := Query(path, vers, current, nil)
                        if err != nil {
                                mods = append(mods, &modinfo.ModulePublic{
-                                       Path:    arg[:i],
-                                       Version: arg[i+1:],
+                                       Path:    path,
+                                       Version: vers,
                                        Error: &modinfo.ModuleError{
                                                Err: err.Error(),
                                        },
                                })
                                continue
                        }
-                       mods = append(mods, moduleInfo(module.Version{Path: arg[:i], Version: info.Version}, false))
+                       mods = append(mods, moduleInfo(module.Version{Path: path, Version: info.Version}, false))
                        continue
                }
 
@@ -101,11 +111,18 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic {
                                        // Don't make the user provide an explicit '@latest' when they're
                                        // explicitly asking what the available versions are.
                                        // Instead, resolve the module, even if it isn't an existing dependency.
-                                       info, err := Query(arg, "latest", nil)
+                                       info, err := Query(arg, "latest", "", nil)
                                        if err == nil {
                                                mods = append(mods, moduleInfo(module.Version{Path: arg, Version: info.Version}, false))
-                                               continue
+                                       } else {
+                                               mods = append(mods, &modinfo.ModulePublic{
+                                                       Path: arg,
+                                                       Error: &modinfo.ModuleError{
+                                                               Err: err.Error(),
+                                                       },
+                                               })
                                        }
+                                       continue
                                }
                                mods = append(mods, &modinfo.ModulePublic{
                                        Path: arg,
index 9a1fb76bb9566cfde5fb27be44a5fb0946337ff3..a9d6c21b0e3d63bd36506b0eaf626a932f1e0dca 100644 (file)
@@ -12,6 +12,7 @@ import (
        "io/ioutil"
        "os"
        "path"
+       pathpkg "path"
        "path/filepath"
        "sort"
        "strings"
@@ -50,29 +51,28 @@ var buildList []module.Version
 var loaded *loader
 
 // ImportPaths returns the set of packages matching the args (patterns),
-// adding modules to the build list as needed to satisfy new imports.
+// on the target platform. Modules may be added to the build list
+// to satisfy new imports.
 func ImportPaths(patterns []string) []*search.Match {
-       InitMod()
-
-       var matches []*search.Match
-       for _, pattern := range search.CleanPatterns(patterns) {
-               m := &search.Match{
-                       Pattern: pattern,
-                       Literal: !strings.Contains(pattern, "...") && !search.IsMetaPackage(pattern),
-               }
-               if m.Literal {
-                       m.Pkgs = []string{pattern}
-               }
-               matches = append(matches, m)
-       }
+       matches := ImportPathsQuiet(patterns, imports.Tags())
+       search.WarnUnmatched(matches)
+       return matches
+}
 
-       fsDirs := make([][]string, len(matches))
-       loaded = newLoader()
-       updateMatches := func(iterating bool) {
+// ImportPathsQuiet is like ImportPaths but does not warn about patterns with
+// no matches. It also lets the caller specify a set of build tags to match
+// packages. The build tags should typically be imports.Tags() or
+// imports.AnyTags(); a nil map has no special meaning.
+func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match {
+       var fsDirs [][]string
+       updateMatches := func(matches []*search.Match, iterating bool) {
                for i, m := range matches {
                        switch {
                        case build.IsLocalImport(m.Pattern) || filepath.IsAbs(m.Pattern):
                                // Evaluate list of file system directories on first iteration.
+                               if fsDirs == nil {
+                                       fsDirs = make([][]string, len(matches))
+                               }
                                if fsDirs[i] == nil {
                                        var dirs []string
                                        if m.Literal {
@@ -90,7 +90,9 @@ func ImportPaths(patterns []string) []*search.Match {
                                // the exact version of a particular module increases during
                                // the loader iterations.
                                m.Pkgs = str.StringList(fsDirs[i])
-                               for j, pkg := range m.Pkgs {
+                               pkgs := m.Pkgs
+                               m.Pkgs = m.Pkgs[:0]
+                               for _, pkg := range pkgs {
                                        dir := pkg
                                        if !filepath.IsAbs(dir) {
                                                dir = filepath.Join(cwd, pkg)
@@ -108,10 +110,20 @@ func ImportPaths(patterns []string) []*search.Match {
                                                if strings.HasPrefix(suffix, "/vendor/") {
                                                        // TODO getmode vendor check
                                                        pkg = strings.TrimPrefix(suffix, "/vendor/")
+                                               } else if targetInGorootSrc && Target.Path == "std" {
+                                                       // Don't add the prefix "std/" to packages in the "std" module.
+                                                       // It's the one module path that isn't a prefix of its packages.
+                                                       pkg = strings.TrimPrefix(suffix, "/")
+                                                       if pkg == "builtin" {
+                                                               // "builtin" is a pseudo-package with a real source file.
+                                                               // It's not included in "std", so it shouldn't be included in
+                                                               // "./..." within module "std" either.
+                                                               continue
+                                                       }
                                                } else {
                                                        pkg = Target.Path + suffix
                                                }
-                                       } else if sub := search.InDir(dir, cfg.GOROOTsrc); sub != "" && !strings.Contains(sub, "@") {
+                                       } else if sub := search.InDir(dir, cfg.GOROOTsrc); sub != "" && sub != "." && !strings.Contains(sub, "@") {
                                                pkg = filepath.ToSlash(sub)
                                        } else if path := pathInModuleCache(dir); path != "" {
                                                pkg = path
@@ -129,10 +141,10 @@ func ImportPaths(patterns []string) []*search.Match {
                                                // After loader is done iterating, we still need to return the
                                                // path, so that "go list -e" produces valid output.
                                                if iterating {
-                                                       pkg = ""
+                                                       continue
                                                }
                                        }
-                                       m.Pkgs[j] = pkg
+                                       m.Pkgs = append(m.Pkgs, pkg)
                                }
 
                        case strings.Contains(m.Pattern, "..."):
@@ -154,25 +166,35 @@ func ImportPaths(patterns []string) []*search.Match {
                                if len(m.Pkgs) == 0 {
                                        m.Pkgs = search.MatchPackages(m.Pattern).Pkgs
                                }
+
+                       default:
+                               m.Pkgs = []string{m.Pattern}
                        }
                }
        }
 
+       InitMod()
+
+       var matches []*search.Match
+       for _, pattern := range search.CleanPatterns(patterns) {
+               matches = append(matches, &search.Match{
+                       Pattern: pattern,
+                       Literal: !strings.Contains(pattern, "...") && !search.IsMetaPackage(pattern),
+               })
+       }
+
+       loaded = newLoader(tags)
        loaded.load(func() []string {
                var roots []string
-               updateMatches(true)
+               updateMatches(matches, true)
                for _, m := range matches {
-                       for _, pkg := range m.Pkgs {
-                               if pkg != "" {
-                                       roots = append(roots, pkg)
-                               }
-                       }
+                       roots = append(roots, m.Pkgs...)
                }
                return roots
        })
 
        // One last pass to finalize wildcards.
-       updateMatches(false)
+       updateMatches(matches, false)
 
        // A given module path may be used as itself or as a replacement for another
        // module, but not both at the same time. Otherwise, the aliasing behavior is
@@ -193,7 +215,6 @@ func ImportPaths(patterns []string) []*search.Match {
        base.ExitIfErrors()
        WriteGoMod()
 
-       search.WarnUnmatched(matches)
        return matches
 }
 
@@ -201,7 +222,18 @@ func ImportPaths(patterns []string) []*search.Match {
 // if dir is in the module cache copy of a module in our build list.
 func pathInModuleCache(dir string) string {
        for _, m := range buildList[1:] {
-               root, err := modfetch.DownloadDir(m)
+               var root string
+               var err error
+               if repl := Replacement(m); repl.Path != "" && repl.Version == "" {
+                       root = repl.Path
+                       if !filepath.IsAbs(root) {
+                               root = filepath.Join(ModRoot(), root)
+                       }
+               } else if repl.Path != "" {
+                       root, err = modfetch.DownloadDir(repl)
+               } else {
+                       root, err = modfetch.DownloadDir(m)
+               }
                if err != nil {
                        continue
                }
@@ -230,12 +262,13 @@ func warnPattern(pattern string, list []string) []string {
 func ImportFromFiles(gofiles []string) {
        InitMod()
 
-       imports, testImports, err := imports.ScanFiles(gofiles, imports.Tags())
+       tags := imports.Tags()
+       imports, testImports, err := imports.ScanFiles(gofiles, tags)
        if err != nil {
                base.Fatalf("go: %v", err)
        }
 
-       loaded = newLoader()
+       loaded = newLoader(tags)
        loaded.load(func() []string {
                var roots []string
                roots = append(roots, imports...)
@@ -259,14 +292,14 @@ func DirImportPath(dir string) string {
        }
 
        if dir == modRoot {
-               return Target.Path
+               return targetPrefix
        }
        if strings.HasPrefix(dir, modRoot+string(filepath.Separator)) {
                suffix := filepath.ToSlash(dir[len(modRoot):])
                if strings.HasPrefix(suffix, "/vendor/") {
                        return strings.TrimPrefix(suffix, "/vendor/")
                }
-               return Target.Path + suffix
+               return targetPrefix + suffix
        }
        return "."
 }
@@ -284,7 +317,7 @@ func LoadBuildList() []module.Version {
 }
 
 func ReloadBuildList() []module.Version {
-       loaded = newLoader()
+       loaded = newLoader(imports.Tags())
        loaded.load(func() []string { return nil })
        return buildList
 }
@@ -310,14 +343,13 @@ func LoadVendor() []string {
 func loadAll(testAll bool) []string {
        InitMod()
 
-       loaded = newLoader()
+       loaded = newLoader(imports.AnyTags())
        loaded.isALL = true
-       loaded.tags = anyTags
        loaded.testAll = testAll
        if !testAll {
                loaded.testRoots = true
        }
-       all := TargetPackages()
+       all := TargetPackages("...")
        loaded.load(func() []string { return all })
        WriteGoMod()
 
@@ -331,14 +363,11 @@ func loadAll(testAll bool) []string {
        return paths
 }
 
-// anyTags is a special tags map that satisfies nearly all build tag expressions.
-// Only "ignore" and malformed build tag requirements are considered false.
-var anyTags = map[string]bool{"*": true}
-
-// TargetPackages returns the list of packages in the target (top-level) module,
-// under all build tag settings.
-func TargetPackages() []string {
-       return matchPackages("...", anyTags, false, []module.Version{Target})
+// TargetPackages returns the list of packages in the target (top-level) module
+// matching pattern, which may be relative to the working directory, under all
+// build tag settings.
+func TargetPackages(pattern string) []string {
+       return matchPackages(pattern, imports.AnyTags(), false, []module.Version{Target})
 }
 
 // BuildList returns the module build list,
@@ -387,6 +416,29 @@ func PackageModule(path string) module.Version {
        return pkg.mod
 }
 
+// PackageImports returns the imports for the package named by the import path.
+// Test imports will be returned as well if tests were loaded for the package
+// (i.e., if "all" was loaded or if LoadTests was set and the path was matched
+// by a command line argument). PackageImports will return nil for
+// unknown package paths.
+func PackageImports(path string) (imports, testImports []string) {
+       pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
+       if !ok {
+               return nil, nil
+       }
+       imports = make([]string, len(pkg.imports))
+       for i, p := range pkg.imports {
+               imports[i] = p.path
+       }
+       if pkg.test != nil {
+               testImports = make([]string, len(pkg.test.imports))
+               for i, p := range pkg.test.imports {
+                       testImports[i] = p.path
+               }
+       }
+       return imports, testImports
+}
+
 // ModuleUsedDirectly reports whether the main module directly imports
 // some package in the module with the given path.
 func ModuleUsedDirectly(path string) bool {
@@ -394,13 +446,17 @@ func ModuleUsedDirectly(path string) bool {
 }
 
 // Lookup returns the source directory, import path, and any loading error for
-// the package at path.
+// the package at path as imported from the package in parentDir.
 // Lookup requires that one of the Load functions in this package has already
 // been called.
-func Lookup(path string) (dir, realPath string, err error) {
+func Lookup(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) {
        if path == "" {
                panic("Lookup called with empty package path")
        }
+
+       if parentIsStd {
+               path = loaded.stdVendor(parentPath, path)
+       }
        pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
        if !ok {
                // The loader should have found all the relevant paths.
@@ -434,10 +490,11 @@ func Lookup(path string) (dir, realPath string, err error) {
 // TODO(rsc): It might be nice to make the loader take and return
 // a buildList rather than hard-coding use of the global.
 type loader struct {
-       tags      map[string]bool // tags for scanDir
-       testRoots bool            // include tests for roots
-       isALL     bool            // created with LoadALL
-       testAll   bool            // include tests for all packages
+       tags           map[string]bool // tags for scanDir
+       testRoots      bool            // include tests for roots
+       isALL          bool            // created with LoadALL
+       testAll        bool            // include tests for all packages
+       forceStdVendor bool            // if true, load standard-library dependencies from the vendor subtree
 
        // reset on each iteration
        roots    []*loadPkg
@@ -453,10 +510,17 @@ type loader struct {
 // LoadTests controls whether the loaders load tests of the root packages.
 var LoadTests bool
 
-func newLoader() *loader {
+func newLoader(tags map[string]bool) *loader {
        ld := new(loader)
-       ld.tags = imports.Tags()
+       ld.tags = tags
        ld.testRoots = LoadTests
+
+       // Inside the "std" and "cmd" modules, we prefer to use the vendor directory
+       // unless the command explicitly changes the module graph.
+       if !targetInGorootSrc || (cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ")) {
+               ld.forceStdVendor = true
+       }
+
        return ld
 }
 
@@ -511,8 +575,12 @@ func (ld *loader) load(roots func() []string) {
                for _, m := range buildList {
                        haveMod[m] = true
                }
+               modAddedBy := make(map[module.Version]*loadPkg)
                for _, pkg := range ld.pkgs {
                        if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" {
+                               if err.newMissingVersion != "" {
+                                       base.Fatalf("go: %s: package provided by %s at latest version %s but not at required version %s", pkg.stackText(), err.Module.Path, err.Module.Version, err.newMissingVersion)
+                               }
                                if added[pkg.path] {
                                        base.Fatalf("go: %s: looping trying to add package", pkg.stackText())
                                }
@@ -520,6 +588,7 @@ func (ld *loader) load(roots func() []string) {
                                numAdded++
                                if !haveMod[err.Module] {
                                        haveMod[err.Module] = true
+                                       modAddedBy[err.Module] = pkg
                                        buildList = append(buildList, err.Module)
                                }
                                continue
@@ -535,6 +604,14 @@ func (ld *loader) load(roots func() []string) {
                reqs = Reqs()
                buildList, err = mvs.BuildList(Target, reqs)
                if err != nil {
+                       // If an error was found in a newly added module, report the package
+                       // import stack instead of the module requirement stack. Packages
+                       // are more descriptive.
+                       if err, ok := err.(*mvs.BuildListError); ok {
+                               if pkg := modAddedBy[err.Module()]; pkg != nil {
+                                       base.Fatalf("go: %s: %v", pkg.stackText(), err.Err)
+                               }
+                       }
                        base.Fatalf("go: %v", err)
                }
        }
@@ -635,7 +712,11 @@ func (ld *loader) doPkg(item interface{}) {
                }
        }
 
+       inStd := (search.IsStandardImportPath(pkg.path) && search.InDir(pkg.dir, cfg.GOROOTsrc) != "")
        for _, path := range imports {
+               if inStd {
+                       path = ld.stdVendor(pkg.path, path)
+               }
                pkg.imports = append(pkg.imports, ld.pkg(path, false))
        }
 
@@ -646,6 +727,31 @@ func (ld *loader) doPkg(item interface{}) {
        }
 }
 
+// stdVendor returns the canonical import path for the package with the given
+// path when imported from the standard-library package at parentPath.
+func (ld *loader) stdVendor(parentPath, path string) string {
+       if search.IsStandardImportPath(path) {
+               return path
+       }
+
+       if str.HasPathPrefix(parentPath, "cmd") {
+               if ld.forceStdVendor || Target.Path != "cmd" {
+                       vendorPath := pathpkg.Join("cmd", "vendor", path)
+                       if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil {
+                               return vendorPath
+                       }
+               }
+       } else if ld.forceStdVendor || Target.Path != "std" {
+               vendorPath := pathpkg.Join("vendor", path)
+               if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil {
+                       return vendorPath
+               }
+       }
+
+       // Not vendored: resolve from modules.
+       return path
+}
+
 // computePatternAll returns the list of packages matching pattern "all",
 // starting with a list of the import paths for the packages in the main module.
 func (ld *loader) computePatternAll(paths []string) []string {
@@ -741,27 +847,33 @@ func (ld *loader) buildStacks() {
 // stackText builds the import stack text to use when
 // reporting an error in pkg. It has the general form
 //
-//     import root ->
-//             import other ->
-//             import other2 ->
-//             import pkg
+//     root imports
+//             other imports
+//             other2 tested by
+//             other2.test imports
+//             pkg
 //
 func (pkg *loadPkg) stackText() string {
        var stack []*loadPkg
-       for p := pkg.stack; p != nil; p = p.stack {
+       for p := pkg; p != nil; p = p.stack {
                stack = append(stack, p)
        }
 
        var buf bytes.Buffer
        for i := len(stack) - 1; i >= 0; i-- {
                p := stack[i]
+               fmt.Fprint(&buf, p.path)
                if p.testOf != nil {
-                       fmt.Fprintf(&buf, "test ->\n\t")
-               } else {
-                       fmt.Fprintf(&buf, "import %q ->\n\t", p.path)
+                       fmt.Fprint(&buf, ".test")
+               }
+               if i > 0 {
+                       if stack[i-1].testOf == p {
+                               fmt.Fprint(&buf, " tested by\n\t")
+                       } else {
+                               fmt.Fprint(&buf, " imports\n\t")
+                       }
                }
        }
-       fmt.Fprintf(&buf, "import %q", pkg.path)
        return buf.String()
 }
 
@@ -913,27 +1025,40 @@ func readVendorList() {
 }
 
 func (r *mvsReqs) modFileToList(f *modfile.File) []module.Version {
-       var list []module.Version
+       list := make([]module.Version, 0, len(f.Require))
        for _, r := range f.Require {
                list = append(list, r.Mod)
        }
        return list
 }
 
+// required returns a unique copy of the requirements of mod.
 func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) {
        if mod == Target {
                if modFile != nil && modFile.Go != nil {
                        r.versions.LoadOrStore(mod, modFile.Go.Version)
                }
-               var list []module.Version
-               return append(list, r.buildList[1:]...), nil
+               return append([]module.Version(nil), r.buildList[1:]...), nil
        }
 
        if cfg.BuildMod == "vendor" {
                // For every module other than the target,
                // return the full list of modules from modules.txt.
                readVendorList()
-               return vendorList, nil
+               return append([]module.Version(nil), vendorList...), nil
+       }
+
+       if targetInGorootSrc {
+               // When inside "std" or "cmd", only fetch and read go.mod files if we're
+               // explicitly running a command that can change the module graph. If we have
+               // to resolve a new dependency, we might pick the wrong version, but 'go mod
+               // tidy' will fix it — and new standard-library dependencies should be rare
+               // anyway.
+               //
+               // TODO(golang.org/issue/30240): Drop this special-case.
+               if cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ") {
+                       return nil, nil
+               }
        }
 
        origPath := mod.Path
@@ -947,13 +1072,11 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) {
                        gomod := filepath.Join(dir, "go.mod")
                        data, err := ioutil.ReadFile(gomod)
                        if err != nil {
-                               base.Errorf("go: parsing %s: %v", base.ShortPath(gomod), err)
-                               return nil, ErrRequire
+                               return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err)
                        }
                        f, err := modfile.ParseLax(gomod, data, nil)
                        if err != nil {
-                               base.Errorf("go: parsing %s: %v", base.ShortPath(gomod), err)
-                               return nil, ErrRequire
+                               return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err)
                        }
                        if f.Go != nil {
                                r.versions.LoadOrStore(mod, f.Go.Version)
@@ -974,22 +1097,18 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) {
 
        data, err := modfetch.GoMod(mod.Path, mod.Version)
        if err != nil {
-               base.Errorf("go: %s@%s: %v\n", mod.Path, mod.Version, err)
-               return nil, ErrRequire
+               return nil, err
        }
        f, err := modfile.ParseLax("go.mod", data, nil)
        if err != nil {
-               base.Errorf("go: %s@%s: parsing go.mod: %v", mod.Path, mod.Version, err)
-               return nil, ErrRequire
+               return nil, module.VersionError(mod, fmt.Errorf("parsing go.mod: %v", err))
        }
 
        if f.Module == nil {
-               base.Errorf("go: %s@%s: parsing go.mod: missing module line", mod.Path, mod.Version)
-               return nil, ErrRequire
+               return nil, module.VersionError(mod, errors.New("parsing go.mod: missing module line"))
        }
        if mpath := f.Module.Mod.Path; mpath != origPath && mpath != mod.Path {
-               base.Errorf("go: %s@%s: parsing go.mod: unexpected module path %q", mod.Path, mod.Version, mpath)
-               return nil, ErrRequire
+               return nil, module.VersionError(mod, fmt.Errorf("parsing go.mod: unexpected module path %q", mpath))
        }
        if f.Go != nil {
                r.versions.LoadOrStore(mod, f.Go.Version)
@@ -998,11 +1117,6 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) {
        return r.modFileToList(f), nil
 }
 
-// ErrRequire is the sentinel error returned when Require encounters problems.
-// It prints the problems directly to standard error, so that multiple errors
-// can be displayed easily.
-var ErrRequire = errors.New("error loading module requirements")
-
 func (*mvsReqs) Max(v1, v2 string) string {
        if v1 != "" && semver.Compare(v1, v2) == -1 {
                return v2
@@ -1019,11 +1133,15 @@ func (*mvsReqs) Upgrade(m module.Version) (module.Version, error) {
 func versions(path string) ([]string, error) {
        // Note: modfetch.Lookup and repo.Versions are cached,
        // so there's no need for us to add extra caching here.
-       repo, err := modfetch.Lookup(path)
-       if err != nil {
-               return nil, err
-       }
-       return repo.Versions("")
+       var versions []string
+       err := modfetch.TryProxies(func(proxy string) error {
+               repo, err := modfetch.Lookup(proxy, path)
+               if err == nil {
+                       versions, err = repo.Versions("")
+               }
+               return err
+       })
+       return versions, err
 }
 
 // Previous returns the tagged version of m.Path immediately prior to
index 0856486c212c237e81be477c660e5f1ee8c28b24..8ce61c0a1d6657e525e2989a5160cd2dfda4ffb2 100644 (file)
@@ -5,35 +5,64 @@
 package modload
 
 import (
-       "cmd/go/internal/modfetch"
-       "cmd/go/internal/modfetch/codehost"
-       "cmd/go/internal/module"
-       "cmd/go/internal/semver"
+       "errors"
        "fmt"
+       "os"
        pathpkg "path"
        "strings"
+       "sync"
+
+       "cmd/go/internal/imports"
+       "cmd/go/internal/modfetch"
+       "cmd/go/internal/module"
+       "cmd/go/internal/search"
+       "cmd/go/internal/semver"
+       "cmd/go/internal/str"
 )
 
 // Query looks up a revision of a given module given a version query string.
 // The module must be a complete module path.
 // The version must take one of the following forms:
 //
-//     - the literal string "latest", denoting the latest available, allowed tagged version,
-//       with non-prereleases preferred over prereleases.
-//       If there are no tagged versions in the repo, latest returns the most recent commit.
-//     - v1, denoting the latest available tagged version v1.x.x.
-//     - v1.2, denoting the latest available tagged version v1.2.x.
-//     - v1.2.3, a semantic version string denoting that tagged version.
-//     - <v1.2.3, <=v1.2.3, >v1.2.3, >=v1.2.3,
-//        denoting the version closest to the target and satisfying the given operator,
-//        with non-prereleases preferred over prereleases.
-//     - a repository commit identifier, denoting that commit.
+// - the literal string "latest", denoting the latest available, allowed
+//   tagged version, with non-prereleases preferred over prereleases.
+//   If there are no tagged versions in the repo, latest returns the most
+//   recent commit.
+// - the literal string "patch", denoting the latest available tagged version
+//   with the same major and minor number as current. If current is "",
+//   "patch" is equivalent to "latest".
+// - v1, denoting the latest available tagged version v1.x.x.
+// - v1.2, denoting the latest available tagged version v1.2.x.
+// - v1.2.3, a semantic version string denoting that tagged version.
+// - <v1.2.3, <=v1.2.3, >v1.2.3, >=v1.2.3,
+//   denoting the version closest to the target and satisfying the given operator,
+//   with non-prereleases preferred over prereleases.
+// - a repository commit identifier or tag, denoting that commit.
+//
+// current is optional, denoting the current version of the module.
+// If query is "latest" or "patch", current will be returned if it is a newer
+// semantic version or if it is a chronologically later pseudoversion. This
+// prevents accidental downgrades from newer prerelease or development
+// versions.
 //
-// If the allowed function is non-nil, Query excludes any versions for which allowed returns false.
+// If the allowed function is non-nil, Query excludes any versions for which
+// allowed returns false.
 //
 // If path is the path of the main module and the query is "latest",
 // Query returns Target.Version as the version.
-func Query(path, query string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) {
+func Query(path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) {
+       var info *modfetch.RevInfo
+       err := modfetch.TryProxies(func(proxy string) (err error) {
+               info, err = queryProxy(proxy, path, query, current, allowed)
+               return err
+       })
+       return info, err
+}
+
+func queryProxy(proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) {
+       if current != "" && !semver.IsValid(current) {
+               return nil, fmt.Errorf("invalid previous version %q", current)
+       }
        if allowed == nil {
                allowed = func(module.Version) bool { return true }
        }
@@ -46,9 +75,22 @@ func Query(path, query string, allowed func(module.Version) bool) (*modfetch.Rev
        var ok func(module.Version) bool
        var prefix string
        var preferOlder bool
+       var mayUseLatest bool
        switch {
        case query == "latest":
                ok = allowed
+               mayUseLatest = true
+
+       case query == "patch":
+               if current == "" {
+                       ok = allowed
+                       mayUseLatest = true
+               } else {
+                       prefix = semver.MajorMinor(current)
+                       ok = func(m module.Version) bool {
+                               return matchSemverPrefix(prefix, m.Version) && allowed(m)
+                       }
+               }
 
        case strings.HasPrefix(query, "<="):
                v := query[len("<="):]
@@ -102,18 +144,27 @@ func Query(path, query string, allowed func(module.Version) bool) (*modfetch.Rev
                }
                prefix = query + "."
 
-       case semver.IsValid(query):
-               vers := module.CanonicalVersion(query)
-               if !allowed(module.Version{Path: path, Version: vers}) {
-                       return nil, fmt.Errorf("%s@%s excluded", path, vers)
-               }
-               return modfetch.Stat(path, vers)
-
        default:
                // Direct lookup of semantic version or commit identifier.
-               info, err := modfetch.Stat(path, query)
+               //
+               // If the identifier is not a canonical semver tag — including if it's a
+               // semver tag with a +metadata suffix — then modfetch.Stat will populate
+               // info.Version with a suitable pseudo-version.
+               info, err := modfetch.Stat(proxy, path, query)
                if err != nil {
-                       return nil, err
+                       queryErr := err
+                       // The full query doesn't correspond to a tag. If it is a semantic version
+                       // with a +metadata suffix, see if there is a tag without that suffix:
+                       // semantic versioning defines them to be equivalent.
+                       if vers := module.CanonicalVersion(query); vers != "" && vers != query {
+                               info, err = modfetch.Stat(proxy, path, vers)
+                               if !errors.Is(err, os.ErrNotExist) {
+                                       return info, err
+                               }
+                       }
+                       if err != nil {
+                               return nil, queryErr
+                       }
                }
                if !allowed(module.Version{Path: path, Version: info.Version}) {
                        return nil, fmt.Errorf("%s@%s excluded", path, info.Version)
@@ -131,8 +182,12 @@ func Query(path, query string, allowed func(module.Version) bool) (*modfetch.Rev
                return &modfetch.RevInfo{Version: Target.Version}, nil
        }
 
+       if str.HasPathPrefix(path, "std") || str.HasPathPrefix(path, "cmd") {
+               return nil, fmt.Errorf("explicit requirement on standard-library module %s not allowed", path)
+       }
+
        // Load versions and execute query.
-       repo, err := modfetch.Lookup(path)
+       repo, err := modfetch.Lookup(proxy, path)
        if err != nil {
                return nil, err
        }
@@ -141,44 +196,67 @@ func Query(path, query string, allowed func(module.Version) bool) (*modfetch.Rev
                return nil, err
        }
 
+       lookup := func(v string) (*modfetch.RevInfo, error) {
+               rev, err := repo.Stat(v)
+               if err != nil {
+                       return nil, err
+               }
+
+               // For "latest" and "patch", make sure we don't accidentally downgrade
+               // from a newer prerelease or from a chronologically newer pseudoversion.
+               if current != "" && (query == "latest" || query == "patch") {
+                       currentTime, err := modfetch.PseudoVersionTime(current)
+                       if semver.Compare(rev.Version, current) < 0 || (err == nil && rev.Time.Before(currentTime)) {
+                               return repo.Stat(current)
+                       }
+               }
+
+               return rev, nil
+       }
+
        if preferOlder {
                for _, v := range versions {
                        if semver.Prerelease(v) == "" && ok(module.Version{Path: path, Version: v}) {
-                               return repo.Stat(v)
+                               return lookup(v)
                        }
                }
                for _, v := range versions {
                        if semver.Prerelease(v) != "" && ok(module.Version{Path: path, Version: v}) {
-                               return repo.Stat(v)
+                               return lookup(v)
                        }
                }
        } else {
                for i := len(versions) - 1; i >= 0; i-- {
                        v := versions[i]
                        if semver.Prerelease(v) == "" && ok(module.Version{Path: path, Version: v}) {
-                               return repo.Stat(v)
+                               return lookup(v)
                        }
                }
                for i := len(versions) - 1; i >= 0; i-- {
                        v := versions[i]
                        if semver.Prerelease(v) != "" && ok(module.Version{Path: path, Version: v}) {
-                               return repo.Stat(v)
+                               return lookup(v)
                        }
                }
        }
 
-       if query == "latest" {
+       if mayUseLatest {
                // Special case for "latest": if no tags match, use latest commit in repo,
                // provided it is not excluded.
-               if info, err := repo.Latest(); err == nil && allowed(module.Version{Path: path, Version: info.Version}) {
-                       return info, nil
+               latest, err := repo.Latest()
+               if err == nil {
+                       if allowed(module.Version{Path: path, Version: latest.Version}) {
+                               return lookup(latest.Version)
+                       }
+               } else if !errors.Is(err, os.ErrNotExist) {
+                       return nil, err
                }
        }
 
-       return nil, fmt.Errorf("no matching versions for query %q", query)
+       return nil, &NoMatchingVersionError{query: query, current: current}
 }
 
-// isSemverPrefix reports whether v is a semantic version prefix: v1 or  v1.2 (not v1.2.3).
+// isSemverPrefix reports whether v is a semantic version prefix: v1 or v1.2 (not v1.2.3).
 // The caller is assumed to have checked that semver.IsValid(v) is true.
 func isSemverPrefix(v string) bool {
        dots := 0
@@ -199,53 +277,271 @@ func isSemverPrefix(v string) bool {
 // matchSemverPrefix reports whether the shortened semantic version p
 // matches the full-width (non-shortened) semantic version v.
 func matchSemverPrefix(p, v string) bool {
-       return len(v) > len(p) && v[len(p)] == '.' && v[:len(p)] == p
+       return len(v) > len(p) && v[len(p)] == '.' && v[:len(p)] == p && semver.Prerelease(v) == ""
+}
+
+type QueryResult struct {
+       Mod      module.Version
+       Rev      *modfetch.RevInfo
+       Packages []string
+}
+
+// QueryPackage looks up the module(s) containing path at a revision matching
+// query. The results are sorted by module path length in descending order.
+//
+// If the package is in the main module, QueryPackage considers only the main
+// module and only the version "latest", without checking for other possible
+// modules.
+func QueryPackage(path, query string, allowed func(module.Version) bool) ([]QueryResult, error) {
+       if search.IsMetaPackage(path) || strings.Contains(path, "...") {
+               return nil, fmt.Errorf("pattern %s is not an importable package", path)
+       }
+       return QueryPattern(path, query, allowed)
 }
 
-// QueryPackage looks up a revision of a module containing path.
+// QueryPattern looks up the module(s) containing at least one package matching
+// the given pattern at the given version. The results are sorted by module path
+// length in descending order.
 //
-// If multiple modules with revisions matching the query provide the requested
-// package, QueryPackage picks the one with the longest module path.
+// QueryPattern queries modules with package paths up to the first "..."
+// in the pattern. For the pattern "example.com/a/b.../c", QueryPattern would
+// consider prefixes of "example.com/a". If multiple modules have versions
+// that match the query and packages that match the pattern, QueryPattern
+// picks the one with the longest module path.
 //
-// If the path is in the main module and the query is "latest",
-// QueryPackage returns Target as the version.
-func QueryPackage(path, query string, allowed func(module.Version) bool) (module.Version, *modfetch.RevInfo, error) {
+// If any matching package is in the main module, QueryPattern considers only
+// the main module and only the version "latest", without checking for other
+// possible modules.
+func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) {
+       base := pattern
+       var match func(m module.Version, root string, isLocal bool) (pkgs []string)
+
+       if i := strings.Index(pattern, "..."); i >= 0 {
+               base = pathpkg.Dir(pattern[:i+3])
+               match = func(m module.Version, root string, isLocal bool) []string {
+                       return matchPackages(pattern, imports.AnyTags(), false, []module.Version{m})
+               }
+       } else {
+               match = func(m module.Version, root string, isLocal bool) []string {
+                       prefix := m.Path
+                       if m == Target {
+                               prefix = targetPrefix
+                       }
+                       if _, ok := dirInModule(pattern, prefix, root, isLocal); ok {
+                               return []string{pattern}
+                       } else {
+                               return nil
+                       }
+               }
+       }
+
        if HasModRoot() {
-               if _, ok := dirInModule(path, Target.Path, modRoot, true); ok {
+               pkgs := match(Target, modRoot, true)
+               if len(pkgs) > 0 {
                        if query != "latest" {
-                               return module.Version{}, nil, fmt.Errorf("can't query specific version (%q) for package %s in the main module (%s)", query, path, Target.Path)
+                               return nil, fmt.Errorf("can't query specific version for package %s in the main module (%s)", pattern, Target.Path)
                        }
                        if !allowed(Target) {
-                               return module.Version{}, nil, fmt.Errorf("internal error: package %s is in the main module (%s), but version is not allowed", path, Target.Path)
+                               return nil, fmt.Errorf("internal error: package %s is in the main module (%s), but version is not allowed", pattern, Target.Path)
                        }
-                       return Target, &modfetch.RevInfo{Version: Target.Version}, nil
+                       return []QueryResult{{
+                               Mod:      Target,
+                               Rev:      &modfetch.RevInfo{Version: Target.Version},
+                               Packages: pkgs,
+                       }}, nil
                }
        }
 
-       finalErr := errMissing
-       for p := path; p != "." && p != "/"; p = pathpkg.Dir(p) {
-               info, err := Query(p, query, allowed)
-               if err != nil {
-                       if _, ok := err.(*codehost.VCSError); ok {
-                               // A VCSError means we know where to find the code,
-                               // we just can't. Abort search.
-                               return module.Version{}, nil, err
+       var (
+               results          []QueryResult
+               candidateModules = modulePrefixesExcludingTarget(base)
+       )
+       if len(candidateModules) == 0 {
+               return nil, fmt.Errorf("package %s is not in the main module (%s)", pattern, Target.Path)
+       }
+
+       err := modfetch.TryProxies(func(proxy string) error {
+               queryModule := func(path string) (r QueryResult, err error) {
+                       r.Mod.Path = path
+                       r.Rev, err = queryProxy(proxy, path, query, "", allowed)
+                       if err != nil {
+                               return r, err
+                       }
+                       r.Mod.Version = r.Rev.Version
+                       root, isLocal, err := fetch(r.Mod)
+                       if err != nil {
+                               return r, err
                        }
-                       if finalErr == errMissing {
-                               finalErr = err
+                       r.Packages = match(r.Mod, root, isLocal)
+                       if len(r.Packages) == 0 {
+                               return r, &packageNotInModuleError{
+                                       mod:     r.Mod,
+                                       query:   query,
+                                       pattern: pattern,
+                               }
                        }
-                       continue
+                       return r, nil
                }
-               m := module.Version{Path: p, Version: info.Version}
-               root, isLocal, err := fetch(m)
-               if err != nil {
-                       return module.Version{}, nil, err
+
+               var err error
+               results, err = queryPrefixModules(candidateModules, queryModule)
+               return err
+       })
+
+       return results, err
+}
+
+// modulePrefixesExcludingTarget returns all prefixes of path that may plausibly
+// exist as a module, excluding targetPrefix but otherwise including path
+// itself, sorted by descending length.
+func modulePrefixesExcludingTarget(path string) []string {
+       prefixes := make([]string, 0, strings.Count(path, "/")+1)
+
+       for {
+               if path != targetPrefix {
+                       if _, _, ok := module.SplitPathVersion(path); ok {
+                               prefixes = append(prefixes, path)
+                       }
                }
-               _, ok := dirInModule(path, m.Path, root, isLocal)
-               if ok {
-                       return m, info, nil
+
+               j := strings.LastIndexByte(path, '/')
+               if j < 0 {
+                       break
+               }
+               path = path[:j]
+       }
+
+       return prefixes
+}
+
+type prefixResult struct {
+       QueryResult
+       err error
+}
+
+func queryPrefixModules(candidateModules []string, queryModule func(path string) (QueryResult, error)) (found []QueryResult, err error) {
+       // If the path we're attempting is not in the module cache and we don't have a
+       // fetch result cached either, we'll end up making a (potentially slow)
+       // request to the proxy or (often even slower) the origin server.
+       // To minimize latency, execute all of those requests in parallel.
+       type result struct {
+               QueryResult
+               err error
+       }
+       results := make([]result, len(candidateModules))
+       var wg sync.WaitGroup
+       wg.Add(len(candidateModules))
+       for i, p := range candidateModules {
+               go func(p string, r *result) {
+                       r.QueryResult, r.err = queryModule(p)
+                       wg.Done()
+               }(p, &results[i])
+       }
+       wg.Wait()
+
+       // Classify the results. In case of failure, identify the error that the user
+       // is most likely to find helpful.
+       var (
+               noVersion   *NoMatchingVersionError
+               noPackage   *packageNotInModuleError
+               notExistErr error
+       )
+       for _, r := range results {
+               switch rErr := r.err.(type) {
+               case nil:
+                       found = append(found, r.QueryResult)
+               case *NoMatchingVersionError:
+                       if noVersion == nil {
+                               noVersion = rErr
+                       }
+               case *packageNotInModuleError:
+                       if noPackage == nil {
+                               noPackage = rErr
+                       }
+               default:
+                       if errors.Is(rErr, os.ErrNotExist) {
+                               if notExistErr == nil {
+                                       notExistErr = rErr
+                               }
+                       } else {
+                               err = r.err
+                       }
                }
        }
 
-       return module.Version{}, nil, finalErr
+       // TODO(#26232): If len(found) == 0 and some of the errors are 4xx HTTP
+       // codes, have the auth package recheck the failed paths.
+       // If we obtain new credentials for any of them, re-run the above loop.
+
+       if len(found) == 0 && err == nil {
+               switch {
+               case noPackage != nil:
+                       err = noPackage
+               case noVersion != nil:
+                       err = noVersion
+               case notExistErr != nil:
+                       err = notExistErr
+               default:
+                       panic("queryPrefixModules: no modules found, but no error detected")
+               }
+       }
+
+       return found, err
+}
+
+// A NoMatchingVersionError indicates that Query found a module at the requested
+// path, but not at any versions satisfying the query string and allow-function.
+//
+// NOTE: NoMatchingVersionError MUST NOT implement Is(os.ErrNotExist).
+//
+// If the module came from a proxy, that proxy had to return a successful status
+// code for the versions it knows about, and thus did not have the opportunity
+// to return a non-400 status code to suppress fallback.
+type NoMatchingVersionError struct {
+       query, current string
+}
+
+func (e *NoMatchingVersionError) Error() string {
+       currentSuffix := ""
+       if (e.query == "latest" || e.query == "patch") && e.current != "" {
+               currentSuffix = fmt.Sprintf(" (current version is %s)", e.current)
+       }
+       return fmt.Sprintf("no matching versions for query %q", e.query) + currentSuffix
+}
+
+// A packageNotInModuleError indicates that QueryPattern found a candidate
+// module at the requested version, but that module did not contain any packages
+// matching the requested pattern.
+//
+// NOTE: packageNotInModuleError MUST NOT implement Is(os.ErrNotExist).
+//
+// If the module came from a proxy, that proxy had to return a successful status
+// code for the versions it knows about, and thus did not have the opportunity
+// to return a non-400 status code to suppress fallback.
+type packageNotInModuleError struct {
+       mod     module.Version
+       query   string
+       pattern string
+}
+
+func (e *packageNotInModuleError) Error() string {
+       found := ""
+       if e.query != e.mod.Version {
+               found = fmt.Sprintf(" (%s)", e.mod.Version)
+       }
+
+       if strings.Contains(e.pattern, "...") {
+               return fmt.Sprintf("module %s@%s%s found, but does not contain packages matching %s", e.mod.Path, e.query, found, e.pattern)
+       }
+       return fmt.Sprintf("module %s@%s%s found, but does not contain package %s", e.mod.Path, e.query, found, e.pattern)
+}
+
+// ModuleHasRootPackage returns whether module m contains a package m.Path.
+func ModuleHasRootPackage(m module.Version) (bool, error) {
+       root, isLocal, err := fetch(m)
+       if err != nil {
+               return false, err
+       }
+       _, ok := dirInModule(m.Path, m.Path, root, isLocal)
+       return ok, nil
 }
index 9b07383217175cafb4eee83c7db5b4cec2b22faf..5c0527d40c947bef096c2ea7c373e0d25eda3cde 100644 (file)
@@ -14,6 +14,7 @@ import (
        "strings"
        "testing"
 
+       "cmd/go/internal/cfg"
        "cmd/go/internal/modfetch"
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/module"
@@ -24,11 +25,16 @@ func TestMain(m *testing.M) {
 }
 
 func testMain(m *testing.M) int {
+       cfg.GOPROXY = "direct"
+
        dir, err := ioutil.TempDir("", "modload-test-")
        if err != nil {
                log.Fatal(err)
        }
        defer os.RemoveAll(dir)
+
+       os.Setenv("GOPATH", dir)
+       cfg.BuildContext.GOPATH = dir
        modfetch.PkgMod = filepath.Join(dir, "pkg/mod")
        codehost.WorkRoot = filepath.Join(dir, "codework")
        return m.Run()
@@ -44,11 +50,12 @@ var (
 )
 
 var queryTests = []struct {
-       path  string
-       query string
-       allow string
-       vers  string
-       err   string
+       path    string
+       query   string
+       current string
+       allow   string
+       vers    string
+       err     string
 }{
        /*
                git init
@@ -56,7 +63,7 @@ var queryTests = []struct {
                git add go.mod
                git commit -m v1 go.mod
                git tag start
-               for i in v0.0.0-pre1 v0.0.0 v0.0.1 v0.0.2 v0.0.3 v0.1.0 v0.1.1 v0.1.2 v0.3.0 v1.0.0 v1.1.0 v1.9.0 v1.9.9 v1.9.10-pre1; do
+               for i in v0.0.0-pre1 v0.0.0 v0.0.1 v0.0.2 v0.0.3 v0.1.0 v0.1.1 v0.1.2 v0.3.0 v1.0.0 v1.1.0 v1.9.0 v1.9.9 v1.9.10-pre1 v1.9.10-pre2+metadata; do
                        echo before $i >status
                        git add status
                        git commit -m "before $i" status
@@ -70,7 +77,7 @@ var queryTests = []struct {
                git checkout v2
                echo module vcs-test.golang.org/git/querytest.git/v2 >go.mod
                git commit -m v2 go.mod
-               for i in v2.0.0 v2.1.0 v2.2.0 v2.5.5; do
+               for i in v2.0.0 v2.1.0 v2.2.0 v2.5.5 v2.6.0-pre1; do
                        echo before $i >status
                        git add status
                        git commit -m "before $i" status
@@ -78,6 +85,7 @@ var queryTests = []struct {
                        git commit -m "at $i" status
                        git tag $i
                done
+               git checkout v2.5.5
                echo after v2.5.5 >status
                git commit -m 'after v2.5.5' status
                git checkout master
@@ -97,22 +105,61 @@ var queryTests = []struct {
        {path: queryRepo, query: "v0.1", vers: "v0.1.2"},
        {path: queryRepo, query: "v0.2", err: `no matching versions for query "v0.2"`},
        {path: queryRepo, query: "v0.0", vers: "v0.0.3"},
+       {path: queryRepo, query: "v1.9.10-pre2+metadata", vers: "v1.9.10-pre2.0.20190513201126-42abcb6df8ee"},
+
+       // golang.org/issue/29262: The major version for for a module without a suffix
+       // should be based on the most recent tag (v1 as appropriate, not v0
+       // unconditionally).
+       {path: queryRepo, query: "42abcb6df8ee", vers: "v1.9.10-pre2.0.20190513201126-42abcb6df8ee"},
+
+       {path: queryRepo, query: "v1.9.10-pre2+wrongmetadata", err: `unknown revision v1.9.10-pre2+wrongmetadata`},
+       {path: queryRepo, query: "v1.9.10-pre2", err: `unknown revision v1.9.10-pre2`},
        {path: queryRepo, query: "latest", vers: "v1.9.9"},
+       {path: queryRepo, query: "latest", current: "v1.9.10-pre1", vers: "v1.9.10-pre1"},
+       {path: queryRepo, query: "latest", current: "v1.9.10-pre2+metadata", vers: "v1.9.10-pre2.0.20190513201126-42abcb6df8ee"},
+       {path: queryRepo, query: "latest", current: "v0.0.0-20190513201126-42abcb6df8ee", vers: "v0.0.0-20190513201126-42abcb6df8ee"},
        {path: queryRepo, query: "latest", allow: "NOMATCH", err: `no matching versions for query "latest"`},
+       {path: queryRepo, query: "latest", current: "v1.9.9", allow: "NOMATCH", err: `no matching versions for query "latest" (current version is v1.9.9)`},
+       {path: queryRepo, query: "latest", current: "v1.99.99", err: `unknown revision v1.99.99`},
+       {path: queryRepo, query: "patch", current: "", vers: "v1.9.9"},
+       {path: queryRepo, query: "patch", current: "v0.1.0", vers: "v0.1.2"},
+       {path: queryRepo, query: "patch", current: "v1.9.0", vers: "v1.9.9"},
+       {path: queryRepo, query: "patch", current: "v1.9.10-pre1", vers: "v1.9.10-pre1"},
+       {path: queryRepo, query: "patch", current: "v1.9.10-pre2+metadata", vers: "v1.9.10-pre2.0.20190513201126-42abcb6df8ee"},
+       {path: queryRepo, query: "patch", current: "v1.99.99", err: `no matching versions for query "patch" (current version is v1.99.99)`},
        {path: queryRepo, query: ">v1.9.9", vers: "v1.9.10-pre1"},
        {path: queryRepo, query: ">v1.10.0", err: `no matching versions for query ">v1.10.0"`},
        {path: queryRepo, query: ">=v1.10.0", err: `no matching versions for query ">=v1.10.0"`},
        {path: queryRepo, query: "6cf84eb", vers: "v0.0.2-0.20180704023347-6cf84ebaea54"},
+
+       // golang.org/issue/27173: A pseudo-version may be based on the highest tag on
+       // any parent commit, or any existing semantically-lower tag: a given commit
+       // could have been a pre-release for a backport tag at any point.
+       {path: queryRepo, query: "3ef0cec634e0", vers: "v0.1.2-0.20180704023347-3ef0cec634e0"},
+       {path: queryRepo, query: "v0.1.2-0.20180704023347-3ef0cec634e0", vers: "v0.1.2-0.20180704023347-3ef0cec634e0"},
+       {path: queryRepo, query: "v0.1.1-0.20180704023347-3ef0cec634e0", vers: "v0.1.1-0.20180704023347-3ef0cec634e0"},
+       {path: queryRepo, query: "v0.0.4-0.20180704023347-3ef0cec634e0", vers: "v0.0.4-0.20180704023347-3ef0cec634e0"},
+
+       // Invalid tags are tested in cmd/go/testdata/script/mod_pseudo_invalid.txt.
+
        {path: queryRepo, query: "start", vers: "v0.0.0-20180704023101-5e9e31667ddf"},
+       {path: queryRepo, query: "5e9e31667ddf", vers: "v0.0.0-20180704023101-5e9e31667ddf"},
+       {path: queryRepo, query: "v0.0.0-20180704023101-5e9e31667ddf", vers: "v0.0.0-20180704023101-5e9e31667ddf"},
+
        {path: queryRepo, query: "7a1b6bf", vers: "v0.1.0"},
 
        {path: queryRepoV2, query: "<v0.0.0", err: `no matching versions for query "<v0.0.0"`},
        {path: queryRepoV2, query: "<=v0.0.0", err: `no matching versions for query "<=v0.0.0"`},
        {path: queryRepoV2, query: ">v0.0.0", vers: "v2.0.0"},
        {path: queryRepoV2, query: ">=v0.0.0", vers: "v2.0.0"},
-       {path: queryRepoV2, query: "v0.0.1+foo", vers: "v2.0.0-20180704023347-179bc86b1be3"},
+
+       {path: queryRepoV2, query: "v2", vers: "v2.5.5"},
+       {path: queryRepoV2, query: "v2.5", vers: "v2.5.5"},
+       {path: queryRepoV2, query: "v2.6", err: `no matching versions for query "v2.6"`},
+       {path: queryRepoV2, query: "v2.6.0-pre1", vers: "v2.6.0-pre1"},
        {path: queryRepoV2, query: "latest", vers: "v2.5.5"},
 
+       {path: queryRepoV3, query: "e0cf3de987e6", vers: "v3.0.0-20180704024501-e0cf3de987e6"},
        {path: queryRepoV3, query: "latest", vers: "v3.0.0-20180704024501-e0cf3de987e6"},
 
        {path: emptyRepo, query: "latest", vers: "v0.0.0-20180704023549-7bb914627242"},
@@ -122,6 +169,7 @@ var queryTests = []struct {
 
 func TestQuery(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        for _, tt := range queryTests {
                allow := tt.allow
@@ -132,13 +180,15 @@ func TestQuery(t *testing.T) {
                        ok, _ := path.Match(allow, m.Version)
                        return ok
                }
-               t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+allow, func(t *testing.T) {
-                       info, err := Query(tt.path, tt.query, allowed)
+               t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+tt.current+"/"+allow, func(t *testing.T) {
+                       info, err := Query(tt.path, tt.query, tt.current, allowed)
                        if tt.err != "" {
-                               if err != nil && err.Error() == tt.err {
-                                       return
+                               if err == nil {
+                                       t.Errorf("Query(%q, %q, %v) = %v, want error %q", tt.path, tt.query, allow, info.Version, tt.err)
+                               } else if err.Error() != tt.err {
+                                       t.Errorf("Query(%q, %q, %v): %v, want error %q", tt.path, tt.query, allow, err, tt.err)
                                }
-                               t.Fatalf("Query(%q, %q, %v): %v, want error %q", tt.path, tt.query, allow, err, tt.err)
+                               return
                        }
                        if err != nil {
                                t.Fatalf("Query(%q, %q, %v): %v", tt.path, tt.query, allow, err)
index 7d8852d01d7f7e172d3800b643ebfbf637c103e1..d82386eca30538511800a4cd408a0004cdd4665e 100644 (file)
@@ -35,12 +35,14 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules []
        }
        var pkgs []string
 
-       walkPkgs := func(root, importPathRoot string) {
+       type pruning int8
+       const (
+               pruneVendor = pruning(1 << iota)
+               pruneGoMod
+       )
+
+       walkPkgs := func(root, importPathRoot string, prune pruning) {
                root = filepath.Clean(root)
-               var cmd string
-               if root == cfg.GOROOTsrc {
-                       cmd = filepath.Join(root, "cmd")
-               }
                filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
                        if err != nil {
                                return nil
@@ -51,14 +53,6 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules []
                                return nil
                        }
 
-                       // GOROOT/src/cmd makes use of GOROOT/src/cmd/vendor,
-                       // which module mode can't deal with. Eventually we'll stop using
-                       // that vendor directory, and then we can remove this exclusion.
-                       // golang.org/issue/26924.
-                       if path == cmd {
-                               return filepath.SkipDir
-                       }
-
                        want := true
                        // Avoid .foo, _foo, and testdata directory trees.
                        _, elem := filepath.Split(path)
@@ -86,8 +80,9 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules []
                        if !want {
                                return filepath.SkipDir
                        }
-                       if path != root {
-                               if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil {
+                       // Stop at module boundaries.
+                       if (prune&pruneGoMod != 0) && path != root {
+                               if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() {
                                        return filepath.SkipDir
                                }
                        }
@@ -101,7 +96,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules []
                                }
                        }
 
-                       if elem == "vendor" {
+                       if elem == "vendor" && (prune&pruneVendor != 0) {
                                return filepath.SkipDir
                        }
                        return nil
@@ -109,28 +104,51 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules []
        }
 
        if useStd {
-               walkPkgs(cfg.GOROOTsrc, "")
+               walkPkgs(cfg.GOROOTsrc, "", pruneGoMod)
+               if treeCanMatch("cmd") {
+                       walkPkgs(filepath.Join(cfg.GOROOTsrc, "cmd"), "cmd", pruneGoMod)
+               }
+       }
+
+       if cfg.BuildMod == "vendor" {
+               if HasModRoot() {
+                       walkPkgs(ModRoot(), targetPrefix, pruneGoMod|pruneVendor)
+                       walkPkgs(filepath.Join(ModRoot(), "vendor"), "", pruneVendor)
+               }
+               return pkgs
        }
 
        for _, mod := range modules {
                if !treeCanMatch(mod.Path) {
                        continue
                }
-               var root string
-               if mod.Version == "" {
+
+               var (
+                       root, modPrefix string
+                       isLocal         bool
+               )
+               if mod == Target {
                        if !HasModRoot() {
                                continue // If there is no main module, we can't search in it.
                        }
                        root = ModRoot()
+                       modPrefix = targetPrefix
+                       isLocal = true
                } else {
                        var err error
-                       root, _, err = fetch(mod)
+                       root, isLocal, err = fetch(mod)
                        if err != nil {
                                base.Errorf("go: %v", err)
                                continue
                        }
+                       modPrefix = mod.Path
+               }
+
+               prune := pruneVendor
+               if isLocal {
+                       prune |= pruneGoMod
                }
-               walkPkgs(root, mod.Path)
+               walkPkgs(root, modPrefix, prune)
        }
 
        return pkgs
index 481a90b1c46d3548545f0be070fe7cca22160ccf..3e0baba15b3ec81a2ed681a4daf35aa5ed3f9dce 100644 (file)
@@ -18,6 +18,7 @@ package module
 // Changes to the semantics in this file require approval from rsc.
 
 import (
+       "errors"
        "fmt"
        "sort"
        "strings"
@@ -40,6 +41,60 @@ type Version struct {
        Version string `json:",omitempty"`
 }
 
+// A ModuleError indicates an error specific to a module.
+type ModuleError struct {
+       Path    string
+       Version string
+       Err     error
+}
+
+// VersionError returns a ModuleError derived from a Version and error.
+func VersionError(v Version, err error) error {
+       return &ModuleError{
+               Path:    v.Path,
+               Version: v.Version,
+               Err:     err,
+       }
+}
+
+func (e *ModuleError) Error() string {
+       if v, ok := e.Err.(*InvalidVersionError); ok {
+               return fmt.Sprintf("%s@%s: invalid %s: %v", e.Path, v.Version, v.noun(), v.Err)
+       }
+       if e.Version != "" {
+               return fmt.Sprintf("%s@%s: %v", e.Path, e.Version, e.Err)
+       }
+       return fmt.Sprintf("module %s: %v", e.Path, e.Err)
+}
+
+func (e *ModuleError) Unwrap() error { return e.Err }
+
+// An InvalidVersionError indicates an error specific to a version, with the
+// module path unknown or specified externally.
+//
+// A ModuleError may wrap an InvalidVersionError, but an InvalidVersionError
+// must not wrap a ModuleError.
+type InvalidVersionError struct {
+       Version string
+       Pseudo  bool
+       Err     error
+}
+
+// noun returns either "version" or "pseudo-version", depending on whether
+// e.Version is a pseudo-version.
+func (e *InvalidVersionError) noun() string {
+       if e.Pseudo {
+               return "pseudo-version"
+       }
+       return "version"
+}
+
+func (e *InvalidVersionError) Error() string {
+       return fmt.Sprintf("%s %q invalid: %s", e.noun(), e.Version, e.Err)
+}
+
+func (e *InvalidVersionError) Unwrap() error { return e.Err }
+
 // Check checks that a given module path, version pair is valid.
 // In addition to the path being a valid module path
 // and the version being a valid semantic version,
@@ -51,17 +106,14 @@ func Check(path, version string) error {
                return err
        }
        if !semver.IsValid(version) {
-               return fmt.Errorf("malformed semantic version %v", version)
+               return &ModuleError{
+                       Path: path,
+                       Err:  &InvalidVersionError{Version: version, Err: errors.New("not a semantic version")},
+               }
        }
        _, pathMajor, _ := SplitPathVersion(path)
-       if !MatchPathMajor(version, pathMajor) {
-               if pathMajor == "" {
-                       pathMajor = "v0 or v1"
-               }
-               if pathMajor[0] == '.' { // .v1
-                       pathMajor = pathMajor[1:]
-               }
-               return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor)
+       if err := MatchPathMajor(version, pathMajor); err != nil {
+               return &ModuleError{Path: path, Err: err}
        }
        return nil
 }
@@ -169,6 +221,9 @@ func checkPath(path string, fileName bool) error {
        if path == "" {
                return fmt.Errorf("empty string")
        }
+       if path[0] == '-' {
+               return fmt.Errorf("leading dash")
+       }
        if strings.Contains(path, "..") {
                return fmt.Errorf("double dot")
        }
@@ -317,22 +372,56 @@ func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) {
        return prefix, pathMajor, true
 }
 
-// MatchPathMajor reports whether the semantic version v
-// matches the path major version pathMajor.
-func MatchPathMajor(v, pathMajor string) bool {
+// MatchPathMajor returns a non-nil error if the semantic version v
+// does not match the path major version pathMajor.
+func MatchPathMajor(v, pathMajor string) error {
        if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") {
                pathMajor = strings.TrimSuffix(pathMajor, "-unstable")
        }
        if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" {
                // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1.
                // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405.
-               return true
+               return nil
        }
        m := semver.Major(v)
        if pathMajor == "" {
-               return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible"
+               if m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" {
+                       return nil
+               }
+               pathMajor = "v0 or v1"
+       } else if pathMajor[0] == '/' || pathMajor[0] == '.' {
+               if m == pathMajor[1:] {
+                       return nil
+               }
+               pathMajor = pathMajor[1:]
+       }
+       return &InvalidVersionError{
+               Version: v,
+               Err:     fmt.Errorf("should be %s, not %s", pathMajor, semver.Major(v)),
        }
-       return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:]
+}
+
+// PathMajorPrefix returns the major-version tag prefix implied by pathMajor.
+// An empty PathMajorPrefix allows either v0 or v1.
+//
+// Note that MatchPathMajor may accept some versions that do not actually begin
+// with this prefix: namely, it accepts a 'v0.0.0-' prefix for a '.v1'
+// pathMajor, even though that pathMajor implies 'v1' tagging.
+func PathMajorPrefix(pathMajor string) string {
+       if pathMajor == "" {
+               return ""
+       }
+       if pathMajor[0] != '/' && pathMajor[0] != '.' {
+               panic("pathMajor suffix " + pathMajor + " passed to PathMajorPrefix lacks separator")
+       }
+       if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") {
+               pathMajor = strings.TrimSuffix(pathMajor, "-unstable")
+       }
+       m := pathMajor[1:]
+       if m != semver.Major(m) {
+               panic("pathMajor suffix " + pathMajor + "passed to PathMajorPrefix is not a valid major version")
+       }
+       return m
 }
 
 // CanonicalVersion returns the canonical form of the version string v.
@@ -447,7 +536,10 @@ func EncodePath(path string) (encoding string, err error) {
 // and not contain exclamation marks.
 func EncodeVersion(v string) (encoding string, err error) {
        if err := checkElem(v, true); err != nil || strings.Contains(v, "!") {
-               return "", fmt.Errorf("disallowed version string %q", v)
+               return "", &InvalidVersionError{
+                       Version: v,
+                       Err:     fmt.Errorf("disallowed version string"),
+               }
        }
        return encodeString(v)
 }
index b40bd03dfa65bc679c3f9044b4ca723a57da98d2..b9f07bf57d549c6509d29d601c7f8d2fb33a41f6 100644 (file)
@@ -79,7 +79,7 @@ var checkPathTests = []struct {
        {"/x.y/z", false, false, false},
        {"x./z", false, false, false},
        {".x/z", false, false, true},
-       {"-x/z", false, true, true},
+       {"-x/z", false, false, false},
        {"x..y/z", false, false, false},
        {"x.y/z/../../w", false, false, false},
        {"x.y//z", false, false, false},
index aa109693f307e5b30e6deae93c81f1e238bc818e..568efbd8b2663a5c0ea0893c546882c8d05befa6 100644 (file)
@@ -9,9 +9,10 @@ package mvs
 import (
        "fmt"
        "sort"
+       "strings"
        "sync"
+       "sync/atomic"
 
-       "cmd/go/internal/base"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
 )
@@ -34,7 +35,7 @@ type Reqs interface {
        // Max returns the maximum of v1 and v2 (it returns either v1 or v2).
        //
        // For all versions v, Max(v, "none") must be v,
-       // and for the tanget passed as the first argument to MVS functions,
+       // and for the target passed as the first argument to MVS functions,
        // Max(target, v) must be target.
        //
        // Note that v1 < v2 can be written Max(v1, v2) != v1
@@ -59,12 +60,57 @@ type Reqs interface {
        Previous(m module.Version) (module.Version, error)
 }
 
-type MissingModuleError struct {
-       Module module.Version
+// BuildListError decorates an error that occurred gathering requirements
+// while constructing a build list. BuildListError prints the chain
+// of requirements to the module where the error occurred.
+type BuildListError struct {
+       Err   error
+       stack []buildListErrorElem
 }
 
-func (e *MissingModuleError) Error() string {
-       return fmt.Sprintf("missing module: %v", e.Module)
+type buildListErrorElem struct {
+       m module.Version
+
+       // nextReason is the reason this module depends on the next module in the
+       // stack. Typically either "requires", or "upgraded to".
+       nextReason string
+}
+
+// Module returns the module where the error occurred. If the module stack
+// is empty, this returns a zero value.
+func (e *BuildListError) Module() module.Version {
+       if len(e.stack) == 0 {
+               return module.Version{}
+       }
+       return e.stack[0].m
+}
+
+func (e *BuildListError) Error() string {
+       b := &strings.Builder{}
+       stack := e.stack
+
+       // Don't print modules at the beginning of the chain without a
+       // version. These always seem to be the main module or a
+       // synthetic module ("target@").
+       for len(stack) > 0 && stack[len(stack)-1].m.Version == "" {
+               stack = stack[:len(stack)-1]
+       }
+
+       for i := len(stack) - 1; i >= 1; i-- {
+               fmt.Fprintf(b, "%s@%s %s\n\t", stack[i].m.Path, stack[i].m.Version, stack[i].nextReason)
+       }
+       if len(stack) == 0 {
+               b.WriteString(e.Err.Error())
+       } else {
+               // Ensure that the final module path and version are included as part of the
+               // error message.
+               if _, ok := e.Err.(*module.ModuleError); ok {
+                       fmt.Fprintf(b, "%v", e.Err)
+               } else {
+                       fmt.Fprintf(b, "%v", module.VersionError(stack[0].m, e.Err))
+               }
+       }
+       return b.String()
 }
 
 // BuildList returns the build list for the target module.
@@ -73,66 +119,119 @@ func BuildList(target module.Version, reqs Reqs) ([]module.Version, error) {
        return buildList(target, reqs, nil)
 }
 
-func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) module.Version) ([]module.Version, error) {
+func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) (module.Version, error)) ([]module.Version, error) {
        // Explore work graph in parallel in case reqs.Required
        // does high-latency network operations.
-       var work par.Work
-       work.Add(target)
+       type modGraphNode struct {
+               m        module.Version
+               required []module.Version
+               upgrade  module.Version
+               err      error
+       }
        var (
                mu       sync.Mutex
-               min      = map[string]string{target.Path: target.Version}
-               firstErr error
+               modGraph = map[module.Version]*modGraphNode{}
+               min      = map[string]string{} // maps module path to minimum required version
+               haveErr  int32
        )
+       setErr := func(n *modGraphNode, err error) {
+               n.err = err
+               atomic.StoreInt32(&haveErr, 1)
+       }
+
+       var work par.Work
+       work.Add(target)
        work.Do(10, func(item interface{}) {
                m := item.(module.Version)
-               required, err := reqs.Required(m)
 
+               node := &modGraphNode{m: m}
                mu.Lock()
-               if err != nil && firstErr == nil {
-                       firstErr = err
-               }
-               if firstErr != nil {
-                       mu.Unlock()
-                       return
-               }
+               modGraph[m] = node
                if v, ok := min[m.Path]; !ok || reqs.Max(v, m.Version) != v {
                        min[m.Path] = m.Version
                }
                mu.Unlock()
 
-               for _, r := range required {
-                       if r.Path == "" {
-                               base.Errorf("Required(%v) returned zero module in list", m)
-                               continue
-                       }
+               required, err := reqs.Required(m)
+               if err != nil {
+                       setErr(node, err)
+                       return
+               }
+               node.required = required
+               for _, r := range node.required {
                        work.Add(r)
                }
 
                if upgrade != nil {
-                       u := upgrade(m)
-                       if u.Path == "" {
-                               base.Errorf("Upgrade(%v) returned zero module", m)
+                       u, err := upgrade(m)
+                       if err != nil {
+                               setErr(node, err)
                                return
                        }
-                       work.Add(u)
+                       if u != m {
+                               node.upgrade = u
+                               work.Add(u)
+                       }
                }
        })
 
-       if firstErr != nil {
-               return nil, firstErr
+       // If there was an error, find the shortest path from the target to the
+       // node where the error occurred so we can report a useful error message.
+       if haveErr != 0 {
+               // neededBy[a] = b means a was added to the module graph by b.
+               neededBy := make(map[*modGraphNode]*modGraphNode)
+               q := make([]*modGraphNode, 0, len(modGraph))
+               q = append(q, modGraph[target])
+               for len(q) > 0 {
+                       node := q[0]
+                       q = q[1:]
+
+                       if node.err != nil {
+                               err := &BuildListError{
+                                       Err:   node.err,
+                                       stack: []buildListErrorElem{{m: node.m}},
+                               }
+                               for n, prev := neededBy[node], node; n != nil; n, prev = neededBy[n], n {
+                                       reason := "requires"
+                                       if n.upgrade == prev.m {
+                                               reason = "updating to"
+                                       }
+                                       err.stack = append(err.stack, buildListErrorElem{m: n.m, nextReason: reason})
+                               }
+                               return nil, err
+                       }
+
+                       neighbors := node.required
+                       if node.upgrade.Path != "" {
+                               neighbors = append(neighbors, node.upgrade)
+                       }
+                       for _, neighbor := range neighbors {
+                               nn := modGraph[neighbor]
+                               if neededBy[nn] != nil {
+                                       continue
+                               }
+                               neededBy[nn] = node
+                               q = append(q, nn)
+                       }
+               }
        }
+
+       // Construct the list by traversing the graph again, replacing older
+       // modules with required minimum versions.
        if v := min[target.Path]; v != target.Version {
+               // TODO(jayconrod): there is a special case in modload.mvsReqs.Max
+               // that prevents us from selecting a newer version of a module
+               // when the module has no version. This may only be the case for target.
+               // Should we always panic when target has a version?
+               // See golang.org/issue/31491, golang.org/issue/29773.
                panic(fmt.Sprintf("mistake: chose version %q instead of target %+v", v, target)) // TODO: Don't panic.
        }
 
        list := []module.Version{target}
        listed := map[string]bool{target.Path: true}
        for i := 0; i < len(list); i++ {
-               m := list[i]
-               required, err := reqs.Required(m)
-               if err != nil {
-                       return nil, err
-               }
+               n := modGraph[list[i]]
+               required := n.required
                for _, r := range required {
                        v := min[r.Path]
                        if r.Path != target.Path && reqs.Max(v, r.Version) != v {
@@ -237,17 +336,12 @@ func Req(target module.Version, list []module.Version, base []string, reqs Reqs)
 // UpgradeAll returns a build list for the target module
 // in which every module is upgraded to its latest version.
 func UpgradeAll(target module.Version, reqs Reqs) ([]module.Version, error) {
-       return buildList(target, reqs, func(m module.Version) module.Version {
+       return buildList(target, reqs, func(m module.Version) (module.Version, error) {
                if m.Path == target.Path {
-                       return target
+                       return target, nil
                }
 
-               latest, err := reqs.Upgrade(m)
-               if err != nil {
-                       panic(err) // TODO
-               }
-               m.Version = latest.Version
-               return m
+               return reqs.Upgrade(m)
        })
 }
 
@@ -256,7 +350,7 @@ func UpgradeAll(target module.Version, reqs Reqs) ([]module.Version, error) {
 func Upgrade(target module.Version, reqs Reqs, upgrade ...module.Version) ([]module.Version, error) {
        list, err := reqs.Required(target)
        if err != nil {
-               panic(err) // TODO
+               return nil, err
        }
        // TODO: Maybe if an error is given,
        // rerun with BuildList(upgrade[0], reqs) etc
@@ -275,7 +369,7 @@ func Upgrade(target module.Version, reqs Reqs, upgrade ...module.Version) ([]mod
 func Downgrade(target module.Version, reqs Reqs, downgrade ...module.Version) ([]module.Version, error) {
        list, err := reqs.Required(target)
        if err != nil {
-               panic(err) // TODO
+               return nil, err
        }
        max := make(map[string]string)
        for _, r := range list {
@@ -314,7 +408,17 @@ func Downgrade(target module.Version, reqs Reqs, downgrade ...module.Version) ([
                }
                list, err := reqs.Required(m)
                if err != nil {
-                       panic(err) // TODO
+                       // If we can't load the requirements, we couldn't load the go.mod file.
+                       // There are a number of reasons this can happen, but this usually
+                       // means an older version of the module had a missing or invalid
+                       // go.mod file. For example, if example.com/mod released v2.0.0 before
+                       // migrating to modules (v2.0.0+incompatible), then added a valid go.mod
+                       // in v2.0.1, downgrading from v2.0.1 would cause this error.
+                       //
+                       // TODO(golang.org/issue/31730, golang.org/issue/30134): if the error
+                       // is transient (we couldn't download go.mod), return the error from
+                       // Downgrade. Currently, we can't tell what kind of error it is.
+                       exclude(m)
                }
                for _, r := range list {
                        add(r)
@@ -334,7 +438,12 @@ List:
                for excluded[r] {
                        p, err := reqs.Previous(r)
                        if err != nil {
-                               return nil, err // TODO
+                               // This is likely a transient error reaching the repository,
+                               // rather than a permanent error with the retrieved version.
+                               //
+                               // TODO(golang.org/issue/31730, golang.org/issue/30134):
+                               // decode what to do based on the actual error.
+                               return nil, err
                        }
                        // If the target version is a pseudo-version, it may not be
                        // included when iterating over prior versions using reqs.Previous.
index 2a27dfb28890d99ea24bd95313cbddcd89d324ae..cab4bb241bc701fcee70af4712e4285db2eef1e8 100644 (file)
@@ -5,6 +5,7 @@
 package mvs
 
 import (
+       "fmt"
        "reflect"
        "strings"
        "testing"
@@ -446,7 +447,7 @@ func (r reqsMap) Upgrade(m module.Version) (module.Version, error) {
                }
        }
        if u.Path == "" {
-               return module.Version{}, &MissingModuleError{module.Version{Path: m.Path, Version: ""}}
+               return module.Version{}, fmt.Errorf("missing module: %v", module.Version{Path: m.Path})
        }
        return u, nil
 }
@@ -467,7 +468,7 @@ func (r reqsMap) Previous(m module.Version) (module.Version, error) {
 func (r reqsMap) Required(m module.Version) ([]module.Version, error) {
        rr, ok := r[m]
        if !ok {
-               return nil, &MissingModuleError{m}
+               return nil, fmt.Errorf("missing module: %v", m)
        }
        return rr, nil
 }
diff --git a/libgo/go/cmd/go/internal/note/example_test.go b/libgo/go/cmd/go/internal/note/example_test.go
new file mode 100644 (file)
index 0000000..53554b4
--- /dev/null
@@ -0,0 +1,128 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package note_test
+
+import (
+       "fmt"
+       "io"
+       "os"
+
+       "cmd/go/internal/note"
+)
+
+func ExampleSign() {
+       skey := "PRIVATE+KEY+PeterNeumann+c74f20a3+AYEKFALVFGyNhPJEMzD1QIDr+Y7hfZx09iUvxdXHKDFz"
+       text := "If you think cryptography is the answer to your problem,\n" +
+               "then you don't know what your problem is.\n"
+
+       signer, err := note.NewSigner(skey)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+
+       msg, err := note.Sign(&note.Note{Text: text}, signer)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       os.Stdout.Write(msg)
+
+       // Output:
+       // If you think cryptography is the answer to your problem,
+       // then you don't know what your problem is.
+       //
+       // — PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=
+}
+
+func ExampleOpen() {
+       vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       msg := []byte("If you think cryptography is the answer to your problem,\n" +
+               "then you don't know what your problem is.\n" +
+               "\n" +
+               "— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=\n")
+
+       verifier, err := note.NewVerifier(vkey)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       verifiers := note.VerifierList(verifier)
+
+       n, err := note.Open(msg, verifiers)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       fmt.Printf("%s (%08x):\n%s", n.Sigs[0].Name, n.Sigs[0].Hash, n.Text)
+
+       // Output:
+       // PeterNeumann (c74f20a3):
+       // If you think cryptography is the answer to your problem,
+       // then you don't know what your problem is.
+}
+
+var rand = struct {
+       Reader io.Reader
+}{
+       zeroReader{},
+}
+
+type zeroReader struct{}
+
+func (zeroReader) Read(buf []byte) (int, error) {
+       for i := range buf {
+               buf[i] = 0
+       }
+       return len(buf), nil
+}
+
+func ExampleSign_add_signatures() {
+       vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       msg := []byte("If you think cryptography is the answer to your problem,\n" +
+               "then you don't know what your problem is.\n" +
+               "\n" +
+               "— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=\n")
+
+       verifier, err := note.NewVerifier(vkey)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       verifiers := note.VerifierList(verifier)
+
+       n, err := note.Open([]byte(msg), verifiers)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+
+       skey, vkey, err := note.GenerateKey(rand.Reader, "EnochRoot")
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       _ = vkey // give to verifiers
+
+       me, err := note.NewSigner(skey)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+
+       msg, err = note.Sign(n, me)
+       if err != nil {
+               fmt.Println(err)
+               return
+       }
+       os.Stdout.Write(msg)
+
+       // Output:
+       // If you think cryptography is the answer to your problem,
+       // then you don't know what your problem is.
+       //
+       // — PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=
+       // — EnochRoot rwz+eBzmZa0SO3NbfRGzPCpDckykFXSdeX+MNtCOXm2/5n2tiOHp+vAF1aGrQ5ovTG01oOTGwnWLox33WWd1RvMc+QQ=
+}
diff --git a/libgo/go/cmd/go/internal/note/note.go b/libgo/go/cmd/go/internal/note/note.go
new file mode 100644 (file)
index 0000000..f770da2
--- /dev/null
@@ -0,0 +1,683 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package note defines the notes signed by the Go module database server.
+//
+// This package is part of a DRAFT of what the Go module database server will look like.
+// Do not assume the details here are final!
+//
+// A note is text signed by one or more server keys.
+// The text should be ignored unless the note is signed by
+// a trusted server key and the signature has been verified
+// using the server's public key.
+//
+// A server's public key is identified by a name, typically the "host[/path]"
+// giving the base URL of the server's transparency log.
+// The syntactic restrictions on a name are that it be non-empty,
+// well-formed UTF-8 containing neither Unicode spaces nor plus (U+002B).
+//
+// A Go module database server signs texts using public key cryptography.
+// A given server may have multiple public keys, each
+// identified by the first 32 bits of the SHA-256 hash of
+// the concatenation of the server name, a newline, and
+// the encoded public key.
+//
+// Verifying Notes
+//
+// A Verifier allows verification of signatures by one server public key.
+// It can report the name of the server and the uint32 hash of the key,
+// and it can verify a purported signature by that key.
+//
+// The standard implementation of a Verifier is constructed
+// by NewVerifier starting from a verifier key, which is a
+// plain text string of the form "<name>+<hash>+<keydata>".
+//
+// A Verifiers allows looking up a Verifier by the combination
+// of server name and key hash.
+//
+// The standard implementation of a Verifiers is constructed
+// by VerifierList from a list of known verifiers.
+//
+// A Note represents a text with one or more signatures.
+// An implementation can reject a note with too many signatures
+// (for example, more than 100 signatures).
+//
+// A Signature represents a signature on a note, verified or not.
+//
+// The Open function takes as input a signed message
+// and a set of known verifiers. It decodes and verifies
+// the message signatures and returns a Note structure
+// containing the message text and (verified or unverified) signatures.
+//
+// Signing Notes
+//
+// A Signer allows signing a text with a given key.
+// It can report the name of the server and the hash of the key
+// and can sign a raw text using that key.
+//
+// The standard implementation of a Signer is constructed
+// by NewSigner starting from an encoded signer key, which is a
+// plain text string of the form "PRIVATE+KEY+<name>+<hash>+<keydata>".
+// Anyone with an encoded signer key can sign messages using that key,
+// so it must be kept secret. The encoding begins with the literal text
+// "PRIVATE+KEY" to avoid confusion with the public server key.
+//
+// The Sign function takes as input a Note and a list of Signers
+// and returns an encoded, signed message.
+//
+// Signed Note Format
+//
+// A signed note consists of a text ending in newline (U+000A),
+// followed by a blank line (only a newline),
+// followed by one or more signature lines of this form:
+// em dash (U+2014), space (U+0020),
+// server name, space, base64-encoded signature, newline.
+//
+// Signed notes must be valid UTF-8 and must not contain any
+// ASCII control characters (those below U+0020) other than newline.
+//
+// A signature is a base64 encoding of 4+n bytes.
+//
+// The first four bytes in the signature are the uint32 key hash
+// stored in big-endian order, which is to say they are the first
+// four bytes of the truncated SHA-256 used to derive the key hash
+// in the first place.
+//
+// The remaining n bytes are the result of using the specified key
+// to sign the note text (including the final newline but not the
+// separating blank line).
+//
+// Generating Keys
+//
+// There is only one key type, Ed25519 with algorithm identifier 1.
+// New key types may be introduced in the future as needed,
+// although doing so will require deploying the new algorithms to all clients
+// before starting to depend on them for signatures.
+//
+// The GenerateKey function generates and returns a new signer
+// and corresponding verifier.
+//
+// Example
+//
+// Here is a well-formed signed note:
+//
+//     If you think cryptography is the answer to your problem,
+//     then you don't know what your problem is.
+//
+//     — PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=
+//
+// It can be constructed and displayed using:
+//
+//     skey := "PRIVATE+KEY+PeterNeumann+c74f20a3+AYEKFALVFGyNhPJEMzD1QIDr+Y7hfZx09iUvxdXHKDFz"
+//     text := "If you think cryptography is the answer to your problem,\n" +
+//             "then you don't know what your problem is.\n"
+//
+//     signer, err := note.NewSigner(skey)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//
+//     msg, err := note.Sign(&note.Note{Text: text}, signer)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     os.Stdout.Write(msg)
+//
+// The note's text is two lines, including the final newline,
+// and the text is purportedly signed by a server named
+// "PeterNeumann". (Although server names are canonically
+// base URLs, the only syntactic requirement is that they
+// not contain spaces or newlines).
+//
+// If Open is given access to a Verifiers including the
+// Verifier for this key, then it will succeed at verifiying
+// the encoded message and returning the parsed Note:
+//
+//     vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+//     msg := []byte("If you think cryptography is the answer to your problem,\n" +
+//             "then you don't know what your problem is.\n" +
+//             "\n" +
+//             "— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=\n")
+//
+//     verifier, err := note.NewVerifier(vkey)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     verifiers := note.VerifierList(verifier)
+//
+//     n, err := note.Open([]byte(msg), verifiers)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     fmt.Printf("%s (%08x):\n%s", n.Sigs[0].Name, n.Sigs[0].Hash, n.Text)
+//
+// You can add your own signature to this message by re-signing the note:
+//
+//     skey, vkey, err := note.GenerateKey(rand.Reader, "EnochRoot")
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     _ = vkey // give to verifiers
+//
+//     me, err := note.NewSigner(skey)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//
+//     msg, err := note.Sign(n, me)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     os.Stdout.Write(msg)
+//
+// This will print a doubly-signed message, like:
+//
+//     If you think cryptography is the answer to your problem,
+//     then you don't know what your problem is.
+//
+//     — PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=
+//     — EnochRoot rwz+eBzmZa0SO3NbfRGzPCpDckykFXSdeX+MNtCOXm2/5n2tiOHp+vAF1aGrQ5ovTG01oOTGwnWLox33WWd1RvMc+QQ=
+//
+package note
+
+import (
+       "bytes"
+       "crypto/ed25519"
+       "crypto/sha256"
+       "encoding/base64"
+       "encoding/binary"
+       "errors"
+       "fmt"
+       "io"
+       "strconv"
+       "strings"
+       "unicode"
+       "unicode/utf8"
+)
+
+// A Verifier verifies messages signed with a specific key.
+type Verifier interface {
+       // Name returns the server name associated with the key.
+       Name() string
+
+       // KeyHash returns the key hash.
+       KeyHash() uint32
+
+       // Verify reports whether sig is a valid signature of msg.
+       Verify(msg, sig []byte) bool
+}
+
+// A Signer signs messages using a specific key.
+type Signer interface {
+       // Name returns the server name associated with the key.
+       Name() string
+
+       // KeyHash returns the key hash.
+       KeyHash() uint32
+
+       // Sign returns a signature for the given message.
+       Sign(msg []byte) ([]byte, error)
+}
+
+// keyHash computes the key hash for the given server name and encoded public key.
+func keyHash(name string, key []byte) uint32 {
+       h := sha256.New()
+       h.Write([]byte(name))
+       h.Write([]byte("\n"))
+       h.Write(key)
+       sum := h.Sum(nil)
+       return binary.BigEndian.Uint32(sum)
+}
+
+var (
+       errVerifierID   = errors.New("malformed verifier id")
+       errVerifierAlg  = errors.New("unknown verifier algorithm")
+       errVerifierHash = errors.New("invalid verifier hash")
+)
+
+const (
+       algEd25519 = 1
+)
+
+// isValidName reports whether name is valid.
+// It must be non-empty and not have any Unicode spaces or pluses.
+func isValidName(name string) bool {
+       return name != "" && utf8.ValidString(name) && strings.IndexFunc(name, unicode.IsSpace) < 0 && !strings.Contains(name, "+")
+}
+
+// NewVerifier construct a new Verifier from an encoded verifier key.
+func NewVerifier(vkey string) (Verifier, error) {
+       name, vkey := chop(vkey, "+")
+       hash16, key64 := chop(vkey, "+")
+       hash, err1 := strconv.ParseUint(hash16, 16, 32)
+       key, err2 := base64.StdEncoding.DecodeString(key64)
+       if len(hash16) != 8 || err1 != nil || err2 != nil || !isValidName(name) || len(key) == 0 {
+               return nil, errVerifierID
+       }
+       if uint32(hash) != keyHash(name, key) {
+               return nil, errVerifierHash
+       }
+
+       v := &verifier{
+               name: name,
+               hash: uint32(hash),
+       }
+
+       alg, key := key[0], key[1:]
+       switch alg {
+       default:
+               return nil, errVerifierAlg
+
+       case algEd25519:
+               if len(key) != 32 {
+                       return nil, errVerifierID
+               }
+               v.verify = func(msg, sig []byte) bool {
+                       return ed25519.Verify(key, msg, sig)
+               }
+       }
+
+       return v, nil
+}
+
+// chop chops s at the first instance of sep, if any,
+// and returns the text before and after sep.
+// If sep is not present, chop returns before is s and after is empty.
+func chop(s, sep string) (before, after string) {
+       i := strings.Index(s, sep)
+       if i < 0 {
+               return s, ""
+       }
+       return s[:i], s[i+len(sep):]
+}
+
+// verifier is a trivial Verifier implementation.
+type verifier struct {
+       name   string
+       hash   uint32
+       verify func([]byte, []byte) bool
+}
+
+func (v *verifier) Name() string                { return v.name }
+func (v *verifier) KeyHash() uint32             { return v.hash }
+func (v *verifier) Verify(msg, sig []byte) bool { return v.verify(msg, sig) }
+
+// NewSigner constructs a new Signer from an encoded signer key.
+func NewSigner(skey string) (Signer, error) {
+       priv1, skey := chop(skey, "+")
+       priv2, skey := chop(skey, "+")
+       name, skey := chop(skey, "+")
+       hash16, key64 := chop(skey, "+")
+       hash, err1 := strconv.ParseUint(hash16, 16, 32)
+       key, err2 := base64.StdEncoding.DecodeString(key64)
+       if priv1 != "PRIVATE" || priv2 != "KEY" || len(hash16) != 8 || err1 != nil || err2 != nil || !isValidName(name) || len(key) == 0 {
+               return nil, errSignerID
+       }
+
+       // Note: hash is the hash of the public key and we have the private key.
+       // Must verify hash after deriving public key.
+
+       s := &signer{
+               name: name,
+               hash: uint32(hash),
+       }
+
+       var pubkey []byte
+
+       alg, key := key[0], key[1:]
+       switch alg {
+       default:
+               return nil, errSignerAlg
+
+       case algEd25519:
+               if len(key) != 32 {
+                       return nil, errSignerID
+               }
+               key = ed25519.NewKeyFromSeed(key)
+               pubkey = append([]byte{algEd25519}, key[32:]...)
+               s.sign = func(msg []byte) ([]byte, error) {
+                       return ed25519.Sign(key, msg), nil
+               }
+       }
+
+       if uint32(hash) != keyHash(name, pubkey) {
+               return nil, errSignerHash
+       }
+
+       return s, nil
+}
+
+var (
+       errSignerID   = errors.New("malformed verifier id")
+       errSignerAlg  = errors.New("unknown verifier algorithm")
+       errSignerHash = errors.New("invalid verifier hash")
+)
+
+// signer is a trivial Signer implementation.
+type signer struct {
+       name string
+       hash uint32
+       sign func([]byte) ([]byte, error)
+}
+
+func (s *signer) Name() string                    { return s.name }
+func (s *signer) KeyHash() uint32                 { return s.hash }
+func (s *signer) Sign(msg []byte) ([]byte, error) { return s.sign(msg) }
+
+// GenerateKey generates a signer and verifier key pair for a named server.
+// The signer key skey is private and must be kept secret.
+func GenerateKey(rand io.Reader, name string) (skey, vkey string, err error) {
+       pub, priv, err := ed25519.GenerateKey(rand)
+       if err != nil {
+               return "", "", err
+       }
+       pubkey := append([]byte{algEd25519}, pub...)
+       privkey := append([]byte{algEd25519}, priv.Seed()...)
+       h := keyHash(name, pubkey)
+
+       skey = fmt.Sprintf("PRIVATE+KEY+%s+%08x+%s", name, h, base64.StdEncoding.EncodeToString(privkey))
+       vkey = fmt.Sprintf("%s+%08x+%s", name, h, base64.StdEncoding.EncodeToString(pubkey))
+       return skey, vkey, nil
+}
+
+// NewEd25519VerifierKey returns an encoded verifier key using the given name
+// and Ed25519 public key.
+func NewEd25519VerifierKey(name string, key ed25519.PublicKey) (string, error) {
+       if len(key) != ed25519.PublicKeySize {
+               return "", fmt.Errorf("invalid public key size %d, expected %d", len(key), ed25519.PublicKeySize)
+       }
+
+       pubkey := append([]byte{algEd25519}, key...)
+       hash := keyHash(name, pubkey)
+
+       b64Key := base64.StdEncoding.EncodeToString(pubkey)
+       return fmt.Sprintf("%s+%08x+%s", name, hash, b64Key), nil
+}
+
+// A Verifiers is a collection of known verifier keys.
+type Verifiers interface {
+       // Verifier returns the Verifier associated with the key
+       // identified by the name and hash.
+       // If the name, hash pair is unknown, Verifier should return
+       // an UnknownVerifierError.
+       Verifier(name string, hash uint32) (Verifier, error)
+}
+
+// An UnknownVerifierError indicates that the given key is not known.
+// The Open function records signatures without associated verifiers as
+// unverified signatures.
+type UnknownVerifierError struct {
+       Name    string
+       KeyHash uint32
+}
+
+func (e *UnknownVerifierError) Error() string {
+       return fmt.Sprintf("unknown key %s+%08x", e.Name, e.KeyHash)
+}
+
+// An ambiguousVerifierError indicates that the given name and hash
+// match multiple keys passed to VerifierList.
+// (If this happens, some malicious actor has taken control of the
+// verifier list, at which point we may as well give up entirely,
+// but we diagnose the problem instead.)
+type ambiguousVerifierError struct {
+       name string
+       hash uint32
+}
+
+func (e *ambiguousVerifierError) Error() string {
+       return fmt.Sprintf("ambiguous key %s+%08x", e.name, e.hash)
+}
+
+// VerifierList returns a Verifiers implementation that uses the given list of verifiers.
+func VerifierList(list ...Verifier) Verifiers {
+       m := make(verifierMap)
+       for _, v := range list {
+               k := nameHash{v.Name(), v.KeyHash()}
+               m[k] = append(m[k], v)
+       }
+       return m
+}
+
+type nameHash struct {
+       name string
+       hash uint32
+}
+
+type verifierMap map[nameHash][]Verifier
+
+func (m verifierMap) Verifier(name string, hash uint32) (Verifier, error) {
+       v, ok := m[nameHash{name, hash}]
+       if !ok {
+               return nil, &UnknownVerifierError{name, hash}
+       }
+       if len(v) > 1 {
+               return nil, &ambiguousVerifierError{name, hash}
+       }
+       return v[0], nil
+}
+
+// A Note is a text and signatures.
+type Note struct {
+       Text           string      // text of note
+       Sigs           []Signature // verified signatures
+       UnverifiedSigs []Signature // unverified signatures
+}
+
+// A Signature is a single signature found in a note.
+type Signature struct {
+       // Name and Hash give the name and key hash
+       // for the key that generated the signature.
+       Name string
+       Hash uint32
+
+       // Base64 records the base64-encoded signature bytes.
+       Base64 string
+}
+
+// An UnverifiedNoteError indicates that the note
+// successfully parsed but had no verifiable signatures.
+type UnverifiedNoteError struct {
+       Note *Note
+}
+
+func (e *UnverifiedNoteError) Error() string {
+       return "note has no verifiable signatures"
+}
+
+// An InvalidSignatureError indicates that the given key was known
+// and the associated Verifier rejected the signature.
+type InvalidSignatureError struct {
+       Name string
+       Hash uint32
+}
+
+func (e *InvalidSignatureError) Error() string {
+       return fmt.Sprintf("invalid signature for key %s+%08x", e.Name, e.Hash)
+}
+
+var (
+       errMalformedNote = errors.New("malformed note")
+       errInvalidSigner = errors.New("invalid signer")
+
+       sigSplit  = []byte("\n\n")
+       sigPrefix = []byte("— ")
+)
+
+// Open opens and parses the message msg, checking signatures from the known verifiers.
+//
+// For each signature in the message, Open calls known.Verifier to find a verifier.
+// If known.Verifier returns a verifier and the verifier accepts the signature,
+// Open records the signature in the returned note's Sigs field.
+// If known.Verifier returns a verifier but the verifier rejects the signature,
+// Open returns an InvalidSignatureError.
+// If known.Verifier returns an UnknownVerifierError,
+// Open records the signature in the returned note's UnverifiedSigs field.
+// If known.Verifier returns any other error, Open returns that error.
+//
+// If no known verifier has signed an otherwise valid note,
+// Open returns an UnverifiedNoteError.
+// In this case, the unverified note can be fetched from inside the error.
+func Open(msg []byte, known Verifiers) (*Note, error) {
+       if known == nil {
+               // Treat nil Verifiers as empty list, to produce useful error instead of crash.
+               known = VerifierList()
+       }
+
+       // Must have valid UTF-8 with no non-newline ASCII control characters.
+       for i := 0; i < len(msg); {
+               r, size := utf8.DecodeRune(msg[i:])
+               if r < 0x20 && r != '\n' || r == utf8.RuneError && size == 1 {
+                       return nil, errMalformedNote
+               }
+               i += size
+       }
+
+       // Must end with signature block preceded by blank line.
+       split := bytes.LastIndex(msg, sigSplit)
+       if split < 0 {
+               return nil, errMalformedNote
+       }
+       text, sigs := msg[:split+1], msg[split+2:]
+       if len(sigs) == 0 || sigs[len(sigs)-1] != '\n' {
+               return nil, errMalformedNote
+       }
+
+       n := &Note{
+               Text: string(text),
+       }
+
+       var buf bytes.Buffer
+       buf.Write(text)
+
+       // Parse and verify signatures.
+       // Ignore duplicate signatures.
+       seen := make(map[nameHash]bool)
+       seenUnverified := make(map[string]bool)
+       numSig := 0
+       for len(sigs) > 0 {
+               // Pull out next signature line.
+               // We know sigs[len(sigs)-1] == '\n', so IndexByte always finds one.
+               i := bytes.IndexByte(sigs, '\n')
+               line := sigs[:i]
+               sigs = sigs[i+1:]
+
+               if !bytes.HasPrefix(line, sigPrefix) {
+                       return nil, errMalformedNote
+               }
+               line = line[len(sigPrefix):]
+               name, b64 := chop(string(line), " ")
+               sig, err := base64.StdEncoding.DecodeString(b64)
+               if err != nil || !isValidName(name) || b64 == "" || len(sig) < 5 {
+                       return nil, errMalformedNote
+               }
+               hash := binary.BigEndian.Uint32(sig[0:4])
+               sig = sig[4:]
+
+               if numSig++; numSig > 100 {
+                       // Avoid spending forever parsing a note with many signatures.
+                       return nil, errMalformedNote
+               }
+
+               v, err := known.Verifier(name, hash)
+               if _, ok := err.(*UnknownVerifierError); ok {
+                       // Drop repeated identical unverified signatures.
+                       if seenUnverified[string(line)] {
+                               continue
+                       }
+                       seenUnverified[string(line)] = true
+                       n.UnverifiedSigs = append(n.UnverifiedSigs, Signature{Name: name, Hash: hash, Base64: b64})
+                       continue
+               }
+               if err != nil {
+                       return nil, err
+               }
+
+               // Drop repeated signatures by a single verifier.
+               if seen[nameHash{name, hash}] {
+                       continue
+               }
+               seen[nameHash{name, hash}] = true
+
+               ok := v.Verify(text, sig)
+               if !ok {
+                       return nil, &InvalidSignatureError{name, hash}
+               }
+
+               n.Sigs = append(n.Sigs, Signature{Name: name, Hash: hash, Base64: b64})
+       }
+
+       // Parsed and verified all the signatures.
+       if len(n.Sigs) == 0 {
+               return nil, &UnverifiedNoteError{n}
+       }
+       return n, nil
+}
+
+// Sign signs the note with the given signers and returns the encoded message.
+// The new signatures from signers are listed in the encoded message after
+// the existing signatures already present in n.Sigs.
+// If any signer uses the same key as an existing signature,
+// the existing signature is elided from the output.
+func Sign(n *Note, signers ...Signer) ([]byte, error) {
+       var buf bytes.Buffer
+       if !strings.HasSuffix(n.Text, "\n") {
+               return nil, errMalformedNote
+       }
+       buf.WriteString(n.Text)
+
+       // Prepare signatures.
+       var sigs bytes.Buffer
+       have := make(map[nameHash]bool)
+       for _, s := range signers {
+               name := s.Name()
+               hash := s.KeyHash()
+               have[nameHash{name, hash}] = true
+               if !isValidName(name) {
+                       return nil, errInvalidSigner
+               }
+
+               sig, err := s.Sign(buf.Bytes()) // buf holds n.Text
+               if err != nil {
+                       return nil, err
+               }
+
+               var hbuf [4]byte
+               binary.BigEndian.PutUint32(hbuf[:], hash)
+               b64 := base64.StdEncoding.EncodeToString(append(hbuf[:], sig...))
+               sigs.WriteString("— ")
+               sigs.WriteString(name)
+               sigs.WriteString(" ")
+               sigs.WriteString(b64)
+               sigs.WriteString("\n")
+       }
+
+       buf.WriteString("\n")
+
+       // Emit existing signatures not replaced by new ones.
+       for _, list := range [][]Signature{n.Sigs, n.UnverifiedSigs} {
+               for _, sig := range list {
+                       name, hash := sig.Name, sig.Hash
+                       if !isValidName(name) {
+                               return nil, errMalformedNote
+                       }
+                       if have[nameHash{name, hash}] {
+                               continue
+                       }
+                       // Double-check hash against base64.
+                       raw, err := base64.StdEncoding.DecodeString(sig.Base64)
+                       if err != nil || len(raw) < 4 || binary.BigEndian.Uint32(raw) != hash {
+                               return nil, errMalformedNote
+                       }
+                       buf.WriteString("— ")
+                       buf.WriteString(sig.Name)
+                       buf.WriteString(" ")
+                       buf.WriteString(sig.Base64)
+                       buf.WriteString("\n")
+               }
+       }
+       buf.Write(sigs.Bytes())
+
+       return buf.Bytes(), nil
+}
diff --git a/libgo/go/cmd/go/internal/note/note_test.go b/libgo/go/cmd/go/internal/note/note_test.go
new file mode 100644 (file)
index 0000000..7293246
--- /dev/null
@@ -0,0 +1,472 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package note
+
+import (
+       "crypto/ed25519"
+       "crypto/rand"
+       "errors"
+       "strings"
+       "testing"
+       "testing/iotest"
+)
+
+func TestNewVerifier(t *testing.T) {
+       vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       _, err := NewVerifier(vkey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       // Check various manglings are not accepted.
+       badKey := func(k string) {
+               _, err := NewVerifier(k)
+               if err == nil {
+                       t.Errorf("NewVerifier(%q) succeeded, should have failed", k)
+               }
+       }
+
+       b := []byte(vkey)
+       for i := 0; i <= len(b); i++ {
+               for j := i + 1; j <= len(b); j++ {
+                       if i != 0 || j != len(b) {
+                               badKey(string(b[i:j]))
+                       }
+               }
+       }
+       for i := 0; i < len(b); i++ {
+               b[i]++
+               badKey(string(b))
+               b[i]--
+       }
+
+       badKey("PeterNeumann+cc469956+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TWBADKEY==") // wrong length key, with adjusted key hash
+       badKey("PeterNeumann+173116ae+ZRpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW")         // unknown algorithm, with adjusted key hash
+}
+
+func TestNewSigner(t *testing.T) {
+       skey := "PRIVATE+KEY+PeterNeumann+c74f20a3+AYEKFALVFGyNhPJEMzD1QIDr+Y7hfZx09iUvxdXHKDFz"
+       _, err := NewSigner(skey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       // Check various manglings are not accepted.
+       b := []byte(skey)
+       for i := 0; i <= len(b); i++ {
+               for j := i + 1; j <= len(b); j++ {
+                       if i == 0 && j == len(b) {
+                               continue
+                       }
+                       _, err := NewSigner(string(b[i:j]))
+                       if err == nil {
+                               t.Errorf("NewSigner(%q) succeeded, should have failed", b[i:j])
+                       }
+               }
+       }
+       for i := 0; i < len(b); i++ {
+               b[i]++
+               _, err := NewSigner(string(b))
+               if err == nil {
+                       t.Errorf("NewSigner(%q) succeeded, should have failed", b)
+               }
+               b[i]--
+       }
+}
+
+func testSignerAndVerifier(t *testing.T, Name string, signer Signer, verifier Verifier) {
+       if name := signer.Name(); name != Name {
+               t.Errorf("signer.Name() = %q, want %q", name, Name)
+       }
+       if name := verifier.Name(); name != Name {
+               t.Errorf("verifier.Name() = %q, want %q", name, Name)
+       }
+       shash := signer.KeyHash()
+       vhash := verifier.KeyHash()
+       if shash != vhash {
+               t.Errorf("signer.KeyHash() = %#08x != verifier.KeyHash() = %#08x", shash, vhash)
+       }
+
+       msg := []byte("hi")
+       sig, err := signer.Sign(msg)
+       if err != nil {
+               t.Fatalf("signer.Sign: %v", err)
+       }
+       if !verifier.Verify(msg, sig) {
+               t.Fatalf("verifier.Verify failed on signature returned by signer.Sign")
+       }
+       sig[0]++
+       if verifier.Verify(msg, sig) {
+               t.Fatalf("verifier.Verify succceeded on corrupt signature")
+       }
+       sig[0]--
+       msg[0]++
+       if verifier.Verify(msg, sig) {
+               t.Fatalf("verifier.Verify succceeded on corrupt message")
+       }
+}
+
+func TestGenerateKey(t *testing.T) {
+       // Generate key pair, make sure it is all self-consistent.
+       const Name = "EnochRoot"
+
+       skey, vkey, err := GenerateKey(rand.Reader, Name)
+       if err != nil {
+               t.Fatalf("GenerateKey: %v", err)
+       }
+       signer, err := NewSigner(skey)
+       if err != nil {
+               t.Fatalf("NewSigner: %v", err)
+       }
+       verifier, err := NewVerifier(vkey)
+       if err != nil {
+               t.Fatalf("NewVerifier: %v", err)
+       }
+
+       testSignerAndVerifier(t, Name, signer, verifier)
+
+       // Check that GenerateKey returns error from rand reader.
+       _, _, err = GenerateKey(iotest.TimeoutReader(iotest.OneByteReader(rand.Reader)), Name)
+       if err == nil {
+               t.Fatalf("GenerateKey succeeded with error-returning rand reader")
+       }
+}
+
+func TestFromEd25519(t *testing.T) {
+       const Name = "EnochRoot"
+
+       pub, priv, err := ed25519.GenerateKey(rand.Reader)
+       if err != nil {
+               t.Fatalf("GenerateKey: %v", err)
+       }
+       signer, err := newSignerFromEd25519Seed(Name, priv.Seed())
+       if err != nil {
+               t.Fatalf("newSignerFromEd25519Seed: %v", err)
+       }
+       vkey, err := NewEd25519VerifierKey(Name, pub)
+       if err != nil {
+               t.Fatalf("NewEd25519VerifierKey: %v", err)
+       }
+       verifier, err := NewVerifier(vkey)
+       if err != nil {
+               t.Fatalf("NewVerifier: %v", err)
+       }
+
+       testSignerAndVerifier(t, Name, signer, verifier)
+
+       // Check that wrong key sizes return errors.
+       _, err = NewEd25519VerifierKey(Name, pub[:len(pub)-1])
+       if err == nil {
+               t.Errorf("NewEd25519VerifierKey succeeded with a seed of the wrong size")
+       }
+}
+
+// newSignerFromEd25519Seed constructs a new signer from a verifier name and a
+// crypto/ed25519 private key seed.
+func newSignerFromEd25519Seed(name string, seed []byte) (Signer, error) {
+       if len(seed) != ed25519.SeedSize {
+               return nil, errors.New("invalid seed size")
+       }
+       priv := ed25519.NewKeyFromSeed(seed)
+       pub := priv[32:]
+
+       pubkey := append([]byte{algEd25519}, pub...)
+       hash := keyHash(name, pubkey)
+
+       s := &signer{
+               name: name,
+               hash: uint32(hash),
+               sign: func(msg []byte) ([]byte, error) {
+                       return ed25519.Sign(priv, msg), nil
+               },
+       }
+       return s, nil
+}
+
+func TestSign(t *testing.T) {
+       skey := "PRIVATE+KEY+PeterNeumann+c74f20a3+AYEKFALVFGyNhPJEMzD1QIDr+Y7hfZx09iUvxdXHKDFz"
+       text := "If you think cryptography is the answer to your problem,\n" +
+               "then you don't know what your problem is.\n"
+
+       signer, err := NewSigner(skey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       msg, err := Sign(&Note{Text: text}, signer)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       want := `If you think cryptography is the answer to your problem,
+then you don't know what your problem is.
+
+— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=
+`
+       if string(msg) != want {
+               t.Errorf("Sign: wrong output\nhave:\n%s\nwant:\n%s", msg, want)
+       }
+
+       // Check that existing signature is replaced by new one.
+       msg, err = Sign(&Note{Text: text, Sigs: []Signature{{Name: "PeterNeumann", Hash: 0xc74f20a3, Base64: "BADSIGN="}}}, signer)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if string(msg) != want {
+               t.Errorf("Sign replacing signature: wrong output\nhave:\n%s\nwant:\n%s", msg, want)
+       }
+
+       // Check various bad inputs.
+       _, err = Sign(&Note{Text: "abc"}, signer)
+       if err == nil || err.Error() != "malformed note" {
+               t.Fatalf("Sign with short text: %v, want malformed note error", err)
+       }
+
+       _, err = Sign(&Note{Text: text, Sigs: []Signature{{Name: "a+b", Base64: "ABCD"}}})
+       if err == nil || err.Error() != "malformed note" {
+               t.Fatalf("Sign with bad name: %v, want malformed note error", err)
+       }
+
+       _, err = Sign(&Note{Text: text, Sigs: []Signature{{Name: "PeterNeumann", Hash: 0xc74f20a3, Base64: "BADHASH="}}})
+       if err == nil || err.Error() != "malformed note" {
+               t.Fatalf("Sign with bad pre-filled signature: %v, want malformed note error", err)
+       }
+
+       _, err = Sign(&Note{Text: text}, &badSigner{signer})
+       if err == nil || err.Error() != "invalid signer" {
+               t.Fatalf("Sign with bad signer: %v, want invalid signer error", err)
+       }
+
+       _, err = Sign(&Note{Text: text}, &errSigner{signer})
+       if err != errSurprise {
+               t.Fatalf("Sign with failing signer: %v, want errSurprise", err)
+       }
+}
+
+func TestVerifierList(t *testing.T) {
+       peterKey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       peterVerifier, err := NewVerifier(peterKey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       enochKey := "EnochRoot+af0cfe78+ATtqJ7zOtqQtYqOo0CpvDXNlMhV3HeJDpjrASKGLWdop"
+       enochVerifier, err := NewVerifier(enochKey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       list := VerifierList(peterVerifier, enochVerifier, enochVerifier)
+       v, err := list.Verifier("PeterNeumann", 0xc74f20a3)
+       if v != peterVerifier || err != nil {
+               t.Fatalf("list.Verifier(peter) = %v, %v, want %v, nil", v, err, peterVerifier)
+       }
+       v, err = list.Verifier("PeterNeumann", 0xc74f20a4)
+       if v != nil || err == nil || err.Error() != "unknown key PeterNeumann+c74f20a4" {
+               t.Fatalf("list.Verifier(peter bad hash) = %v, %v, want nil, unknown key error", v, err)
+       }
+
+       v, err = list.Verifier("PeterNeuman", 0xc74f20a3)
+       if v != nil || err == nil || err.Error() != "unknown key PeterNeuman+c74f20a3" {
+               t.Fatalf("list.Verifier(peter bad name) = %v, %v, want nil, unknown key error", v, err)
+       }
+       v, err = list.Verifier("EnochRoot", 0xaf0cfe78)
+       if v != nil || err == nil || err.Error() != "ambiguous key EnochRoot+af0cfe78" {
+               t.Fatalf("list.Verifier(enoch) = %v, %v, want nil, ambiguous key error", v, err)
+       }
+}
+
+type badSigner struct {
+       Signer
+}
+
+func (b *badSigner) Name() string {
+       return "bad name"
+}
+
+var errSurprise = errors.New("surprise!")
+
+type errSigner struct {
+       Signer
+}
+
+func (e *errSigner) Sign([]byte) ([]byte, error) {
+       return nil, errSurprise
+}
+
+func TestOpen(t *testing.T) {
+       peterKey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       peterVerifier, err := NewVerifier(peterKey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       enochKey := "EnochRoot+af0cfe78+ATtqJ7zOtqQtYqOo0CpvDXNlMhV3HeJDpjrASKGLWdop"
+       enochVerifier, err := NewVerifier(enochKey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       text := `If you think cryptography is the answer to your problem,
+then you don't know what your problem is.
+`
+       peterSig := "— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=\n"
+       enochSig := "— EnochRoot rwz+eBzmZa0SO3NbfRGzPCpDckykFXSdeX+MNtCOXm2/5n2tiOHp+vAF1aGrQ5ovTG01oOTGwnWLox33WWd1RvMc+QQ=\n"
+
+       peter := Signature{"PeterNeumann", 0xc74f20a3, "x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM="}
+       enoch := Signature{"EnochRoot", 0xaf0cfe78, "rwz+eBzmZa0SO3NbfRGzPCpDckykFXSdeX+MNtCOXm2/5n2tiOHp+vAF1aGrQ5ovTG01oOTGwnWLox33WWd1RvMc+QQ="}
+
+       // Check one signature verified, one not.
+       n, err := Open([]byte(text+"\n"+peterSig+enochSig), VerifierList(peterVerifier))
+       if err != nil {
+               t.Fatal(err)
+       }
+       if n.Text != text {
+               t.Errorf("n.Text = %q, want %q", n.Text, text)
+       }
+       if len(n.Sigs) != 1 || n.Sigs[0] != peter {
+               t.Errorf("n.Sigs:\nhave %v\nwant %v", n.Sigs, []Signature{peter})
+       }
+       if len(n.UnverifiedSigs) != 1 || n.UnverifiedSigs[0] != enoch {
+               t.Errorf("n.UnverifiedSigs:\nhave %v\nwant %v", n.Sigs, []Signature{peter})
+       }
+
+       // Check both verified.
+       n, err = Open([]byte(text+"\n"+peterSig+enochSig), VerifierList(peterVerifier, enochVerifier))
+       if err != nil {
+               t.Fatal(err)
+       }
+       if len(n.Sigs) != 2 || n.Sigs[0] != peter || n.Sigs[1] != enoch {
+               t.Errorf("n.Sigs:\nhave %v\nwant %v", n.Sigs, []Signature{peter, enoch})
+       }
+       if len(n.UnverifiedSigs) != 0 {
+               t.Errorf("n.UnverifiedSigs:\nhave %v\nwant %v", n.Sigs, []Signature{})
+       }
+
+       // Check both unverified.
+       n, err = Open([]byte(text+"\n"+peterSig+enochSig), VerifierList())
+       if n != nil || err == nil {
+               t.Fatalf("Open unverified = %v, %v, want nil, error", n, err)
+       }
+       e, ok := err.(*UnverifiedNoteError)
+       if !ok {
+               t.Fatalf("Open unverified: err is %T, want *UnverifiedNoteError", err)
+       }
+       if err.Error() != "note has no verifiable signatures" {
+               t.Fatalf("Open unverified: err.Error() = %q, want %q", err.Error(), "note has no verifiable signatures")
+       }
+
+       n = e.Note
+       if n == nil {
+               t.Fatalf("Open unverified: missing note in UnverifiedNoteError")
+       }
+       if len(n.Sigs) != 0 {
+               t.Errorf("n.Sigs:\nhave %v\nwant %v", n.Sigs, []Signature{})
+       }
+       if len(n.UnverifiedSigs) != 2 || n.UnverifiedSigs[0] != peter || n.UnverifiedSigs[1] != enoch {
+               t.Errorf("n.UnverifiedSigs:\nhave %v\nwant %v", n.Sigs, []Signature{peter, enoch})
+       }
+
+       // Check duplicated verifier.
+       _, err = Open([]byte(text+"\n"+enochSig), VerifierList(enochVerifier, peterVerifier, enochVerifier))
+       if err == nil || err.Error() != "ambiguous key EnochRoot+af0cfe78" {
+               t.Fatalf("Open with duplicated verifier: err=%v, want ambiguous key", err)
+       }
+
+       // Check unused duplicated verifier.
+       _, err = Open([]byte(text+"\n"+peterSig), VerifierList(enochVerifier, peterVerifier, enochVerifier))
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       // Check too many signatures.
+       n, err = Open([]byte(text+"\n"+strings.Repeat(peterSig, 101)), VerifierList(peterVerifier))
+       if n != nil || err == nil || err.Error() != "malformed note" {
+               t.Fatalf("Open too many verified signatures = %v, %v, want nil, malformed note error", n, err)
+       }
+       n, err = Open([]byte(text+"\n"+strings.Repeat(peterSig, 101)), VerifierList())
+       if n != nil || err == nil || err.Error() != "malformed note" {
+               t.Fatalf("Open too many verified signatures = %v, %v, want nil, malformed note error", n, err)
+       }
+
+       // Invalid signature.
+       n, err = Open([]byte(text+"\n"+peterSig[:60]+"ABCD"+peterSig[60:]), VerifierList(peterVerifier))
+       if n != nil || err == nil || err.Error() != "invalid signature for key PeterNeumann+c74f20a3" {
+               t.Fatalf("Open too many verified signatures = %v, %v, want nil, invalid signature error", n, err)
+       }
+
+       // Duplicated verified and unverified signatures.
+       enochABCD := Signature{"EnochRoot", 0xaf0cfe78, "rwz+eBzmZa0SO3NbfRGzPCpDckykFXSdeX+MNtCOXm2/5n" + "ABCD" + "2tiOHp+vAF1aGrQ5ovTG01oOTGwnWLox33WWd1RvMc+QQ="}
+       n, err = Open([]byte(text+"\n"+peterSig+peterSig+enochSig+enochSig+enochSig[:60]+"ABCD"+enochSig[60:]), VerifierList(peterVerifier))
+       if err != nil {
+               t.Fatal(err)
+       }
+       if len(n.Sigs) != 1 || n.Sigs[0] != peter {
+               t.Errorf("n.Sigs:\nhave %v\nwant %v", n.Sigs, []Signature{peter})
+       }
+       if len(n.UnverifiedSigs) != 2 || n.UnverifiedSigs[0] != enoch || n.UnverifiedSigs[1] != enochABCD {
+               t.Errorf("n.UnverifiedSigs:\nhave %v\nwant %v", n.UnverifiedSigs, []Signature{enoch, enochABCD})
+       }
+
+       // Invalid encoded message syntax.
+       badMsgs := []string{
+               text,
+               text + "\n",
+               text + "\n" + peterSig[:len(peterSig)-1],
+               "\x01" + text + "\n" + peterSig,
+               "\xff" + text + "\n" + peterSig,
+               text + "\n" + "— Bad Name x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=",
+               text + "\n" + peterSig + "Unexpected line.\n",
+       }
+       for _, msg := range badMsgs {
+               n, err := Open([]byte(msg), VerifierList(peterVerifier))
+               if n != nil || err == nil || err.Error() != "malformed note" {
+                       t.Fatalf("Open bad msg = %v, %v, want nil, malformed note error\nmsg:\n%s", n, err, msg)
+               }
+       }
+}
+
+func BenchmarkOpen(b *testing.B) {
+       vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
+       msg := []byte("If you think cryptography is the answer to your problem,\n" +
+               "then you don't know what your problem is.\n" +
+               "\n" +
+               "— PeterNeumann x08go/ZJkuBS9UG/SffcvIAQxVBtiFupLLr8pAcElZInNIuGUgYN1FFYC2pZSNXgKvqfqdngotpRZb6KE6RyyBwJnAM=\n")
+
+       verifier, err := NewVerifier(vkey)
+       if err != nil {
+               b.Fatal(err)
+       }
+       verifiers := VerifierList(verifier)
+       verifiers0 := VerifierList()
+
+       // Try with 0 signatures and 1 signature so we can tell how much each signature adds.
+
+       b.Run("Sig0", func(b *testing.B) {
+               for i := 0; i < b.N; i++ {
+                       _, err := Open(msg, verifiers0)
+                       e, ok := err.(*UnverifiedNoteError)
+                       if !ok {
+                               b.Fatal("expected UnverifiedNoteError")
+                       }
+                       n := e.Note
+                       if len(n.Sigs) != 0 || len(n.UnverifiedSigs) != 1 {
+                               b.Fatal("wrong signature count")
+                       }
+               }
+       })
+
+       b.Run("Sig1", func(b *testing.B) {
+               for i := 0; i < b.N; i++ {
+                       n, err := Open(msg, verifiers)
+                       if err != nil {
+                               b.Fatal(err)
+                       }
+                       if len(n.Sigs) != 1 || len(n.UnverifiedSigs) != 0 {
+                               b.Fatal("wrong signature count")
+                       }
+               }
+       })
+}
index a568c86f60b77c171ec438322e5bb980be38cd5b..960cec6fb16994ea9ef028b9e1b9d2b797f35a19 100644 (file)
@@ -147,3 +147,44 @@ func (c *Cache) Get(key interface{}) interface{} {
        }
        return e.result
 }
+
+// Clear removes all entries in the cache.
+//
+// Concurrent calls to Get may return old values. Concurrent calls to Do
+// may return old values or store results in entries that have been deleted.
+//
+// TODO(jayconrod): Delete this after the package cache clearing functions
+// in internal/load have been removed.
+func (c *Cache) Clear() {
+       c.m.Range(func(key, value interface{}) bool {
+               c.m.Delete(key)
+               return true
+       })
+}
+
+// Delete removes an entry from the map. It is safe to call Delete for an
+// entry that does not exist. Delete will return quickly, even if the result
+// for a key is still being computed; the computation will finish, but the
+// result won't be accessible through the cache.
+//
+// TODO(jayconrod): Delete this after the package cache clearing functions
+// in internal/load have been removed.
+func (c *Cache) Delete(key interface{}) {
+       c.m.Delete(key)
+}
+
+// DeleteIf calls pred for each key in the map. If pred returns true for a key,
+// DeleteIf removes the corresponding entry. If the result for a key is
+// still being computed, DeleteIf will remove the entry without waiting for
+// the computation to finish. The result won't be accessible through the cache.
+//
+// TODO(jayconrod): Delete this after the package cache clearing functions
+// in internal/load have been removed.
+func (c *Cache) DeleteIf(pred func(key interface{}) bool) {
+       c.m.Range(func(key, _ interface{}) bool {
+               if pred(key) {
+                       c.Delete(key)
+               }
+               return true
+       })
+}
index 8f59e1a57732579bfc547e49b227955f300cdba5..d573cc690d2397627c69e055f5a4b4c55e7de9b2 100644 (file)
@@ -8,12 +8,15 @@ package renameio
 import (
        "bytes"
        "io"
-       "io/ioutil"
+       "math/rand"
        "os"
        "path/filepath"
+       "strconv"
+
+       "cmd/go/internal/robustio"
 )
 
-const patternSuffix = "*.tmp"
+const patternSuffix = ".tmp"
 
 // Pattern returns a glob pattern that matches the unrenamed temporary files
 // created when writing to filename.
@@ -26,14 +29,14 @@ func Pattern(filename string) string {
 // final name.
 //
 // That ensures that the final location, if it exists, is always a complete file.
-func WriteFile(filename string, data []byte) (err error) {
-       return WriteToFile(filename, bytes.NewReader(data))
+func WriteFile(filename string, data []byte, perm os.FileMode) (err error) {
+       return WriteToFile(filename, bytes.NewReader(data), perm)
 }
 
 // WriteToFile is a variant of WriteFile that accepts the data as an io.Reader
 // instead of a slice.
-func WriteToFile(filename string, data io.Reader) (err error) {
-       f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)+patternSuffix)
+func WriteToFile(filename string, data io.Reader, perm os.FileMode) (err error) {
+       f, err := tempFile(filepath.Dir(filename), filepath.Base(filename), perm)
        if err != nil {
                return err
        }
@@ -59,5 +62,32 @@ func WriteToFile(filename string, data io.Reader) (err error) {
        if err := f.Close(); err != nil {
                return err
        }
-       return os.Rename(f.Name(), filename)
+
+       return robustio.Rename(f.Name(), filename)
+}
+
+// ReadFile is like ioutil.ReadFile, but on Windows retries spurious errors that
+// may occur if the file is concurrently replaced.
+//
+// Errors are classified heuristically and retries are bounded, so even this
+// function may occasionally return a spurious error on Windows.
+// If so, the error will likely wrap one of:
+//     - syscall.ERROR_ACCESS_DENIED
+//     - syscall.ERROR_FILE_NOT_FOUND
+//     - internal/syscall/windows.ERROR_SHARING_VIOLATION
+func ReadFile(filename string) ([]byte, error) {
+       return robustio.ReadFile(filename)
+}
+
+// tempFile creates a new temporary file with given permission bits.
+func tempFile(dir, prefix string, perm os.FileMode) (f *os.File, err error) {
+       for i := 0; i < 10000; i++ {
+               name := filepath.Join(dir, prefix+strconv.Itoa(rand.Intn(1000000000))+patternSuffix)
+               f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, perm)
+               if os.IsExist(err) {
+                       continue
+               }
+               break
+       }
+       return
 }
diff --git a/libgo/go/cmd/go/internal/renameio/renameio_test.go b/libgo/go/cmd/go/internal/renameio/renameio_test.go
new file mode 100644 (file)
index 0000000..81dba6d
--- /dev/null
@@ -0,0 +1,145 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !plan9
+
+package renameio
+
+import (
+       "encoding/binary"
+       "errors"
+       "io/ioutil"
+       "math/rand"
+       "os"
+       "path/filepath"
+       "runtime"
+       "sync"
+       "sync/atomic"
+       "syscall"
+       "testing"
+       "time"
+
+       "cmd/go/internal/robustio"
+)
+
+func TestConcurrentReadsAndWrites(t *testing.T) {
+       dir, err := ioutil.TempDir("", "renameio")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.RemoveAll(dir)
+       path := filepath.Join(dir, "blob.bin")
+
+       const chunkWords = 8 << 10
+       buf := make([]byte, 2*chunkWords*8)
+       for i := uint64(0); i < 2*chunkWords; i++ {
+               binary.LittleEndian.PutUint64(buf[i*8:], i)
+       }
+
+       var attempts int64 = 128
+       if !testing.Short() {
+               attempts *= 16
+       }
+       const parallel = 32
+
+       var sem = make(chan bool, parallel)
+
+       var (
+               writeSuccesses, readSuccesses int64 // atomic
+               writeErrnoSeen, readErrnoSeen sync.Map
+       )
+
+       for n := attempts; n > 0; n-- {
+               sem <- true
+               go func() {
+                       defer func() { <-sem }()
+
+                       time.Sleep(time.Duration(rand.Intn(100)) * time.Microsecond)
+                       offset := rand.Intn(chunkWords)
+                       chunk := buf[offset*8 : (offset+chunkWords)*8]
+                       if err := WriteFile(path, chunk, 0666); err == nil {
+                               atomic.AddInt64(&writeSuccesses, 1)
+                       } else if robustio.IsEphemeralError(err) {
+                               var (
+                                       errno syscall.Errno
+                                       dup   bool
+                               )
+                               if errors.As(err, &errno) {
+                                       _, dup = writeErrnoSeen.LoadOrStore(errno, true)
+                               }
+                               if !dup {
+                                       t.Logf("ephemeral error: %v", err)
+                               }
+                       } else {
+                               t.Errorf("unexpected error: %v", err)
+                       }
+
+                       time.Sleep(time.Duration(rand.Intn(100)) * time.Microsecond)
+                       data, err := ReadFile(path)
+                       if err == nil {
+                               atomic.AddInt64(&readSuccesses, 1)
+                       } else if robustio.IsEphemeralError(err) {
+                               var (
+                                       errno syscall.Errno
+                                       dup   bool
+                               )
+                               if errors.As(err, &errno) {
+                                       _, dup = readErrnoSeen.LoadOrStore(errno, true)
+                               }
+                               if !dup {
+                                       t.Logf("ephemeral error: %v", err)
+                               }
+                               return
+                       } else {
+                               t.Errorf("unexpected error: %v", err)
+                               return
+                       }
+
+                       if len(data) != 8*chunkWords {
+                               t.Errorf("read %d bytes, but each write is a %d-byte file", len(data), 8*chunkWords)
+                               return
+                       }
+
+                       u := binary.LittleEndian.Uint64(data)
+                       for i := 1; i < chunkWords; i++ {
+                               next := binary.LittleEndian.Uint64(data[i*8:])
+                               if next != u+1 {
+                                       t.Errorf("wrote sequential integers, but read integer out of sequence at offset %d", i)
+                                       return
+                               }
+                               u = next
+                       }
+               }()
+       }
+
+       for n := parallel; n > 0; n-- {
+               sem <- true
+       }
+
+       var minWriteSuccesses int64 = attempts
+       if runtime.GOOS == "windows" {
+               // Windows produces frequent "Access is denied" errors under heavy rename load.
+               // As long as those are the only errors and *some* of the writes succeed, we're happy.
+               minWriteSuccesses = attempts / 4
+       }
+
+       if writeSuccesses < minWriteSuccesses {
+               t.Errorf("%d (of %d) writes succeeded; want ≥ %d", writeSuccesses, attempts, minWriteSuccesses)
+       } else {
+               t.Logf("%d (of %d) writes succeeded (ok: ≥ %d)", writeSuccesses, attempts, minWriteSuccesses)
+       }
+
+       var minReadSuccesses int64 = attempts
+       if runtime.GOOS == "windows" {
+               // Windows produces frequent "Access is denied" errors under heavy rename load.
+               // As long as those are the only errors and *some* of the writes succeed, we're happy.
+               minReadSuccesses = attempts / 4
+       }
+
+       if readSuccesses < minReadSuccesses {
+               t.Errorf("%d (of %d) reads succeeded; want ≥ %d", readSuccesses, attempts, minReadSuccesses)
+       } else {
+               t.Logf("%d (of %d) reads succeeded (ok: ≥ %d)", readSuccesses, attempts, minReadSuccesses)
+       }
+}
diff --git a/libgo/go/cmd/go/internal/renameio/umask_test.go b/libgo/go/cmd/go/internal/renameio/umask_test.go
new file mode 100644 (file)
index 0000000..1a471c9
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !nacl,!plan9,!windows,!js
+
+package renameio
+
+import (
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "syscall"
+       "testing"
+)
+
+func TestWriteFileModeAppliesUmask(t *testing.T) {
+       dir, err := ioutil.TempDir("", "renameio")
+       if err != nil {
+               t.Fatalf("Failed to create temporary directory: %v", err)
+       }
+
+       const mode = 0644
+       const umask = 0007
+       defer syscall.Umask(syscall.Umask(umask))
+
+       file := filepath.Join(dir, "testWrite")
+       err = WriteFile(file, []byte("go-build"), mode)
+       if err != nil {
+               t.Fatalf("Failed to write file: %v", err)
+       }
+       defer os.RemoveAll(dir)
+
+       fi, err := os.Stat(file)
+       if err != nil {
+               t.Fatalf("Stat %q (looking for mode %#o): %s", file, mode, err)
+       }
+
+       if fi.Mode()&os.ModePerm != 0640 {
+               t.Errorf("Stat %q: mode %#o want %#o", file, fi.Mode()&os.ModePerm, 0640)
+       }
+}
diff --git a/libgo/go/cmd/go/internal/robustio/robustio.go b/libgo/go/cmd/go/internal/robustio/robustio.go
new file mode 100644 (file)
index 0000000..76e47ad
--- /dev/null
@@ -0,0 +1,53 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package robustio wraps I/O functions that are prone to failure on Windows,
+// transparently retrying errors up to an arbitrary timeout.
+//
+// Errors are classified heuristically and retries are bounded, so the functions
+// in this package do not completely eliminate spurious errors. However, they do
+// significantly reduce the rate of failure in practice.
+//
+// If so, the error will likely wrap one of:
+// The functions in this package do not completely eliminate spurious errors,
+// but substantially reduce their rate of occurrence in practice.
+package robustio
+
+// Rename is like os.Rename, but on Windows retries errors that may occur if the
+// file is concurrently read or overwritten.
+//
+// (See golang.org/issue/31247 and golang.org/issue/32188.)
+func Rename(oldpath, newpath string) error {
+       return rename(oldpath, newpath)
+}
+
+// ReadFile is like ioutil.ReadFile, but on Windows retries errors that may
+// occur if the file is concurrently replaced.
+//
+// (See golang.org/issue/31247 and golang.org/issue/32188.)
+func ReadFile(filename string) ([]byte, error) {
+       return readFile(filename)
+}
+
+// RemoveAll is like os.RemoveAll, but on Windows retries errors that may occur
+// if an executable file in the directory has recently been executed.
+//
+// (See golang.org/issue/19491.)
+func RemoveAll(path string) error {
+       return removeAll(path)
+}
+
+// IsEphemeralError reports whether err is one of the errors that the functions
+// in this package attempt to mitigate.
+//
+// Errors considered ephemeral include:
+//     - syscall.ERROR_ACCESS_DENIED
+//     - syscall.ERROR_FILE_NOT_FOUND
+//     - internal/syscall/windows.ERROR_SHARING_VIOLATION
+//
+// This set may be expanded in the future; programs must not rely on the
+// non-ephemerality of any given error.
+func IsEphemeralError(err error) bool {
+       return isEphemeralError(err)
+}
diff --git a/libgo/go/cmd/go/internal/robustio/robustio_other.go b/libgo/go/cmd/go/internal/robustio/robustio_other.go
new file mode 100644 (file)
index 0000000..91ca56c
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !windows
+
+package robustio
+
+import (
+       "io/ioutil"
+       "os"
+)
+
+func rename(oldpath, newpath string) error {
+       return os.Rename(oldpath, newpath)
+}
+
+func readFile(filename string) ([]byte, error) {
+       return ioutil.ReadFile(filename)
+}
+
+func removeAll(path string) error {
+       return os.RemoveAll(path)
+}
+
+func isEphemeralError(err error) bool {
+       return false
+}
diff --git a/libgo/go/cmd/go/internal/robustio/robustio_windows.go b/libgo/go/cmd/go/internal/robustio/robustio_windows.go
new file mode 100644 (file)
index 0000000..a3d94e5
--- /dev/null
@@ -0,0 +1,105 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package robustio
+
+import (
+       "errors"
+       "internal/syscall/windows"
+       "io/ioutil"
+       "math/rand"
+       "os"
+       "syscall"
+       "time"
+)
+
+const arbitraryTimeout = 500 * time.Millisecond
+
+// retry retries ephemeral errors from f up to an arbitrary timeout
+// to work around spurious filesystem errors on Windows
+func retry(f func() (err error, mayRetry bool)) error {
+       var (
+               bestErr     error
+               lowestErrno syscall.Errno
+               start       time.Time
+               nextSleep   time.Duration = 1 * time.Millisecond
+       )
+       for {
+               err, mayRetry := f()
+               if err == nil || !mayRetry {
+                       return err
+               }
+
+               var errno syscall.Errno
+               if errors.As(err, &errno) && (lowestErrno == 0 || errno < lowestErrno) {
+                       bestErr = err
+                       lowestErrno = errno
+               } else if bestErr == nil {
+                       bestErr = err
+               }
+
+               if start.IsZero() {
+                       start = time.Now()
+               } else if d := time.Since(start) + nextSleep; d >= arbitraryTimeout {
+                       break
+               }
+               time.Sleep(nextSleep)
+               nextSleep += time.Duration(rand.Int63n(int64(nextSleep)))
+       }
+
+       return bestErr
+}
+
+// rename is like os.Rename, but retries ephemeral errors.
+//
+// It wraps os.Rename, which (as of 2019-06-04) uses MoveFileEx with
+// MOVEFILE_REPLACE_EXISTING.
+//
+// Windows also provides a different system call, ReplaceFile,
+// that provides similar semantics, but perhaps preserves more metadata. (The
+// documentation on the differences between the two is very sparse.)
+//
+// Empirical error rates with MoveFileEx are lower under modest concurrency, so
+// for now we're sticking with what the os package already provides.
+func rename(oldpath, newpath string) (err error) {
+       return retry(func() (err error, mayRetry bool) {
+               err = os.Rename(oldpath, newpath)
+               return err, isEphemeralError(err)
+       })
+}
+
+// readFile is like ioutil.ReadFile, but retries ephemeral errors.
+func readFile(filename string) ([]byte, error) {
+       var b []byte
+       err := retry(func() (err error, mayRetry bool) {
+               b, err = ioutil.ReadFile(filename)
+
+               // Unlike in rename, we do not retry ERROR_FILE_NOT_FOUND here: it can occur
+               // as a spurious error, but the file may also genuinely not exist, so the
+               // increase in robustness is probably not worth the extra latency.
+               return err, isEphemeralError(err) && !errors.Is(err, syscall.ERROR_FILE_NOT_FOUND)
+       })
+       return b, err
+}
+
+func removeAll(path string) error {
+       return retry(func() (err error, mayRetry bool) {
+               err = os.RemoveAll(path)
+               return err, isEphemeralError(err)
+       })
+}
+
+// isEphemeralError returns true if err may be resolved by waiting.
+func isEphemeralError(err error) bool {
+       var errno syscall.Errno
+       if errors.As(err, &errno) {
+               switch errno {
+               case syscall.ERROR_ACCESS_DENIED,
+                       syscall.ERROR_FILE_NOT_FOUND,
+                       windows.ERROR_SHARING_VIOLATION:
+                       return true
+               }
+       }
+       return false
+}
index feccf23b2782a868fbf822be029935a959d765ff..71da5adc934cdaf23c042a97d5f0c186b7b32dfa 100644 (file)
@@ -8,6 +8,7 @@ package run
 import (
        "fmt"
        "os"
+       "path"
        "strings"
 
        "cmd/go/internal/base"
@@ -22,7 +23,7 @@ var CmdRun = &base.Command{
        Short:     "compile and run Go program",
        Long: `
 Run compiles and runs the named main Go package.
-Typically the package is specified as a list of .go source files,
+Typically the package is specified as a list of .go source files from a single directory,
 but it may also be an import path, file system path, or pattern
 matching a single known package, as in 'go run .' or 'go run my/cmd'.
 
@@ -94,10 +95,10 @@ func runRun(cmd *base.Command, args []string) {
                base.Fatalf("go run: no go files listed")
        }
        cmdArgs := args[i:]
-
        if p.Error != nil {
                base.Fatalf("%s", p.Error)
        }
+
        p.Internal.OmitDebug = true
        if len(p.DepsErrors) > 0 {
                // Since these are errors in dependencies,
@@ -117,21 +118,26 @@ func runRun(cmd *base.Command, args []string) {
                base.Fatalf("go run: cannot run non-main package")
        }
        p.Target = "" // must build - not up to date
-       var src string
-       if len(p.GoFiles) > 0 {
-               src = p.GoFiles[0]
-       } else if len(p.CgoFiles) > 0 {
-               src = p.CgoFiles[0]
-       } else {
-               // this case could only happen if the provided source uses cgo
-               // while cgo is disabled.
-               hint := ""
-               if !cfg.BuildContext.CgoEnabled {
-                       hint = " (cgo is disabled)"
+       if p.Internal.CmdlineFiles {
+               //set executable name if go file is given as cmd-argument
+               var src string
+               if len(p.GoFiles) > 0 {
+                       src = p.GoFiles[0]
+               } else if len(p.CgoFiles) > 0 {
+                       src = p.CgoFiles[0]
+               } else {
+                       // this case could only happen if the provided source uses cgo
+                       // while cgo is disabled.
+                       hint := ""
+                       if !cfg.BuildContext.CgoEnabled {
+                               hint = " (cgo is disabled)"
+                       }
+                       base.Fatalf("go run: no suitable source files%s", hint)
                }
-               base.Fatalf("go run: no suitable source files%s", hint)
+               p.Internal.ExeName = src[:len(src)-len(".go")]
+       } else {
+               p.Internal.ExeName = path.Base(p.ImportPath)
        }
-       p.Internal.ExeName = src[:len(src)-len(".go")] // name temporary executable for first go file
        a1 := b.LinkAction(work.ModeBuild, work.ModeBuild, p)
        a := &work.Action{Mode: "go run", Func: buildRunProgram, Args: cmdArgs, Deps: []*work.Action{a1}}
        b.Do(a)
index 0ca60e73497e2188a424dbb0fcbdfe8a0bb325ca..0167c8d7550838f0b84ee8c03f60269c1167baf6 100644 (file)
@@ -190,7 +190,7 @@ func MatchPackagesInFS(pattern string) *Match {
 
                if !top && cfg.ModulesEnabled {
                        // Ignore other modules found in subdirectories.
-                       if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil {
+                       if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() {
                                return filepath.SkipDir
                        }
                }
@@ -327,14 +327,35 @@ func ImportPathsQuiet(patterns []string) []*Match {
                        out = append(out, MatchPackages(a))
                        continue
                }
-               if strings.Contains(a, "...") {
-                       if build.IsLocalImport(a) {
-                               out = append(out, MatchPackagesInFS(a))
+
+               if build.IsLocalImport(a) || filepath.IsAbs(a) {
+                       var m *Match
+                       if strings.Contains(a, "...") {
+                               m = MatchPackagesInFS(a)
                        } else {
-                               out = append(out, MatchPackages(a))
+                               m = &Match{Pattern: a, Literal: true, Pkgs: []string{a}}
+                       }
+
+                       // Change the file import path to a regular import path if the package
+                       // is in GOPATH or GOROOT. We don't report errors here; LoadImport
+                       // (or something similar) will report them later.
+                       for i, dir := range m.Pkgs {
+                               if !filepath.IsAbs(dir) {
+                                       dir = filepath.Join(base.Cwd, dir)
+                               }
+                               if bp, _ := cfg.BuildContext.ImportDir(dir, build.FindOnly); bp.ImportPath != "" && bp.ImportPath != "." {
+                                       m.Pkgs[i] = bp.ImportPath
+                               }
                        }
+                       out = append(out, m)
                        continue
                }
+
+               if strings.Contains(a, "...") {
+                       out = append(out, MatchPackages(a))
+                       continue
+               }
+
                out = append(out, &Match{Pattern: a, Literal: true, Pkgs: []string{a}})
        }
        return out
index a9b4d759a6b051fea2e3d83e9ff932e3d1bcac4d..a4ffc5f131241bc1165a495df56f4ffa3e79c007 100644 (file)
@@ -5,6 +5,7 @@
 package str
 
 import (
+       "path"
        "path/filepath"
        "strings"
 )
@@ -49,3 +50,47 @@ func HasFilePathPrefix(s, prefix string) bool {
                return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix
        }
 }
+
+// GlobsMatchPath reports whether any path prefix of target
+// matches one of the glob patterns (as defined by path.Match)
+// in the comma-separated globs list.
+// It ignores any empty or malformed patterns in the list.
+func GlobsMatchPath(globs, target string) bool {
+       for globs != "" {
+               // Extract next non-empty glob in comma-separated list.
+               var glob string
+               if i := strings.Index(globs, ","); i >= 0 {
+                       glob, globs = globs[:i], globs[i+1:]
+               } else {
+                       glob, globs = globs, ""
+               }
+               if glob == "" {
+                       continue
+               }
+
+               // A glob with N+1 path elements (N slashes) needs to be matched
+               // against the first N+1 path elements of target,
+               // which end just before the N+1'th slash.
+               n := strings.Count(glob, "/")
+               prefix := target
+               // Walk target, counting slashes, truncating at the N+1'th slash.
+               for i := 0; i < len(target); i++ {
+                       if target[i] == '/' {
+                               if n == 0 {
+                                       prefix = target[:i]
+                                       break
+                               }
+                               n--
+                       }
+               }
+               if n > 0 {
+                       // Not enough prefix elements.
+                       continue
+               }
+               matched, _ := path.Match(glob, prefix)
+               if matched {
+                       return true
+               }
+       }
+       return false
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/cache.go b/libgo/go/cmd/go/internal/sumweb/cache.go
new file mode 100644 (file)
index 0000000..a8117a7
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Parallel cache.
+// This file is copied from cmd/go/internal/par.
+
+package sumweb
+
+import (
+       "sync"
+       "sync/atomic"
+)
+
+// parCache runs an action once per key and caches the result.
+type parCache struct {
+       m sync.Map
+}
+
+type cacheEntry struct {
+       done   uint32
+       mu     sync.Mutex
+       result interface{}
+}
+
+// Do calls the function f if and only if Do is being called for the first time with this key.
+// No call to Do with a given key returns until the one call to f returns.
+// Do returns the value returned by the one call to f.
+func (c *parCache) Do(key interface{}, f func() interface{}) interface{} {
+       entryIface, ok := c.m.Load(key)
+       if !ok {
+               entryIface, _ = c.m.LoadOrStore(key, new(cacheEntry))
+       }
+       e := entryIface.(*cacheEntry)
+       if atomic.LoadUint32(&e.done) == 0 {
+               e.mu.Lock()
+               if atomic.LoadUint32(&e.done) == 0 {
+                       e.result = f()
+                       atomic.StoreUint32(&e.done, 1)
+               }
+               e.mu.Unlock()
+       }
+       return e.result
+}
+
+// Get returns the cached result associated with key.
+// It returns nil if there is no such result.
+// If the result for key is being computed, Get does not wait for the computation to finish.
+func (c *parCache) Get(key interface{}) interface{} {
+       entryIface, ok := c.m.Load(key)
+       if !ok {
+               return nil
+       }
+       e := entryIface.(*cacheEntry)
+       if atomic.LoadUint32(&e.done) == 0 {
+               return nil
+       }
+       return e.result
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/client.go b/libgo/go/cmd/go/internal/sumweb/client.go
new file mode 100644 (file)
index 0000000..6973e5a
--- /dev/null
@@ -0,0 +1,619 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sumweb
+
+import (
+       "bytes"
+       "errors"
+       "fmt"
+       "strings"
+       "sync"
+       "sync/atomic"
+
+       "cmd/go/internal/note"
+       "cmd/go/internal/str"
+       "cmd/go/internal/tlog"
+)
+
+// A Client provides the external operations
+// (file caching, HTTP fetches, and so on)
+// needed to implement the HTTP client Conn.
+// The methods must be safe for concurrent use by multiple goroutines.
+type Client interface {
+       // ReadRemote reads and returns the content served at the given path
+       // on the remote database server. The path begins with "/lookup" or "/tile/".
+       // It is the implementation's responsibility to turn that path into a full URL
+       // and make the HTTP request. ReadRemote should return an error for
+       // any non-200 HTTP response status.
+       ReadRemote(path string) ([]byte, error)
+
+       // ReadConfig reads and returns the content of the named configuration file.
+       // There are only a fixed set of configuration files.
+       //
+       // "key" returns a file containing the verifier key for the server.
+       //
+       // serverName + "/latest" returns a file containing the latest known
+       // signed tree from the server. It is read and written (using WriteConfig).
+       // To signal that the client wishes to start with an "empty" signed tree,
+       // ReadConfig can return a successful empty result (0 bytes of data).
+       ReadConfig(file string) ([]byte, error)
+
+       // WriteConfig updates the content of the named configuration file,
+       // changing it from the old []byte to the new []byte.
+       // If the old []byte does not match the stored configuration,
+       // WriteConfig must return ErrWriteConflict.
+       // Otherwise, WriteConfig should atomically replace old with new.
+       WriteConfig(file string, old, new []byte) error
+
+       // ReadCache reads and returns the content of the named cache file.
+       // Any returned error will be treated as equivalent to the file not existing.
+       // There can be arbitrarily many cache files, such as:
+       //      serverName/lookup/pkg@version
+       //      serverName/tile/8/1/x123/456
+       ReadCache(file string) ([]byte, error)
+
+       // WriteCache writes the named cache file.
+       WriteCache(file string, data []byte)
+
+       // Log prints the given log message (such as with log.Print)
+       Log(msg string)
+
+       // SecurityError prints the given security error log message.
+       // The Conn returns ErrSecurity from any operation that invokes SecurityError,
+       // but the return value is mainly for testing. In a real program,
+       // SecurityError should typically print the message and call log.Fatal or os.Exit.
+       SecurityError(msg string)
+}
+
+// ErrWriteConflict signals a write conflict during Client.WriteConfig.
+var ErrWriteConflict = errors.New("write conflict")
+
+// ErrSecurity is returned by Conn operations that invoke Client.SecurityError.
+var ErrSecurity = errors.New("security error: misbehaving server")
+
+// A Conn is a client connection to a go.sum database.
+// All the methods are safe for simultaneous use by multiple goroutines.
+type Conn struct {
+       client Client // client-provided external world
+
+       didLookup uint32
+
+       // one-time initialized data
+       initOnce   sync.Once
+       initErr    error          // init error, if any
+       name       string         // name of accepted verifier
+       verifiers  note.Verifiers // accepted verifiers (just one, but Verifiers for note.Open)
+       tileReader tileReader
+       tileHeight int
+       nosumdb    string
+
+       record    parCache // cache of record lookup, keyed by path@vers
+       tileCache parCache // cache of c.readTile, keyed by tile
+
+       latestMu  sync.Mutex
+       latest    tlog.Tree // latest known tree head
+       latestMsg []byte    // encoded signed note for latest
+
+       tileSavedMu sync.Mutex
+       tileSaved   map[tlog.Tile]bool // which tiles have been saved using c.client.WriteCache already
+}
+
+// NewConn returns a new Conn using the given Client.
+func NewConn(client Client) *Conn {
+       return &Conn{
+               client: client,
+       }
+}
+
+// init initiailzes the conn (if not already initialized)
+// and returns any initialization error.
+func (c *Conn) init() error {
+       c.initOnce.Do(c.initWork)
+       return c.initErr
+}
+
+// initWork does the actual initialization work.
+func (c *Conn) initWork() {
+       defer func() {
+               if c.initErr != nil {
+                       c.initErr = fmt.Errorf("initializing sumweb.Conn: %v", c.initErr)
+               }
+       }()
+
+       c.tileReader.c = c
+       if c.tileHeight == 0 {
+               c.tileHeight = 8
+       }
+       c.tileSaved = make(map[tlog.Tile]bool)
+
+       vkey, err := c.client.ReadConfig("key")
+       if err != nil {
+               c.initErr = err
+               return
+       }
+       verifier, err := note.NewVerifier(strings.TrimSpace(string(vkey)))
+       if err != nil {
+               c.initErr = err
+               return
+       }
+       c.verifiers = note.VerifierList(verifier)
+       c.name = verifier.Name()
+
+       data, err := c.client.ReadConfig(c.name + "/latest")
+       if err != nil {
+               c.initErr = err
+               return
+       }
+       if err := c.mergeLatest(data); err != nil {
+               c.initErr = err
+               return
+       }
+}
+
+// SetTileHeight sets the tile height for the Conn.
+// Any call to SetTileHeight must happen before the first call to Lookup.
+// If SetTileHeight is not called, the Conn defaults to tile height 8.
+func (c *Conn) SetTileHeight(height int) {
+       if atomic.LoadUint32(&c.didLookup) != 0 {
+               panic("SetTileHeight used after Lookup")
+       }
+       if c.tileHeight != 0 {
+               panic("multiple calls to SetTileHeight")
+       }
+       c.tileHeight = height
+}
+
+// SetGONOSUMDB sets the list of comma-separated GONOSUMDB patterns for the Conn.
+// For any module path matching one of the patterns,
+// Lookup will return ErrGONOSUMDB.
+// Any call to SetGONOSUMDB must happen before the first call to Lookup.
+func (c *Conn) SetGONOSUMDB(list string) {
+       if atomic.LoadUint32(&c.didLookup) != 0 {
+               panic("SetGONOSUMDB used after Lookup")
+       }
+       if c.nosumdb != "" {
+               panic("multiple calls to SetGONOSUMDB")
+       }
+       c.nosumdb = list
+}
+
+// ErrGONOSUMDB is returned by Lookup for paths that match
+// a pattern listed in the GONOSUMDB list (set by SetGONOSUMDB,
+// usually from the environment variable).
+var ErrGONOSUMDB = errors.New("skipped (listed in GONOSUMDB)")
+
+func (c *Conn) skip(target string) bool {
+       return str.GlobsMatchPath(c.nosumdb, target)
+}
+
+// Lookup returns the go.sum lines for the given module path and version.
+// The version may end in a /go.mod suffix, in which case Lookup returns
+// the go.sum lines for the module's go.mod-only hash.
+func (c *Conn) Lookup(path, vers string) (lines []string, err error) {
+       atomic.StoreUint32(&c.didLookup, 1)
+
+       if c.skip(path) {
+               return nil, ErrGONOSUMDB
+       }
+
+       defer func() {
+               if err != nil {
+                       err = fmt.Errorf("%s@%s: %v", path, vers, err)
+               }
+       }()
+
+       if err := c.init(); err != nil {
+               return nil, err
+       }
+
+       // Prepare encoded cache filename / URL.
+       epath, err := encodePath(path)
+       if err != nil {
+               return nil, err
+       }
+       evers, err := encodeVersion(strings.TrimSuffix(vers, "/go.mod"))
+       if err != nil {
+               return nil, err
+       }
+       file := c.name + "/lookup/" + epath + "@" + evers
+       remotePath := "/lookup/" + epath + "@" + evers
+
+       // Fetch the data.
+       // The lookupCache avoids redundant ReadCache/GetURL operations
+       // (especially since go.sum lines tend to come in pairs for a given
+       // path and version) and also avoids having multiple of the same
+       // request in flight at once.
+       type cached struct {
+               data []byte
+               err  error
+       }
+       result := c.record.Do(file, func() interface{} {
+               // Try the on-disk cache, or else get from web.
+               writeCache := false
+               data, err := c.client.ReadCache(file)
+               if err != nil {
+                       data, err = c.client.ReadRemote(remotePath)
+                       if err != nil {
+                               return cached{nil, err}
+                       }
+                       writeCache = true
+               }
+
+               // Validate the record before using it for anything.
+               id, text, treeMsg, err := tlog.ParseRecord(data)
+               if err != nil {
+                       return cached{nil, err}
+               }
+               if err := c.mergeLatest(treeMsg); err != nil {
+                       return cached{nil, err}
+               }
+               if err := c.checkRecord(id, text); err != nil {
+                       return cached{nil, err}
+               }
+
+               // Now that we've validated the record,
+               // save it to the on-disk cache (unless that's where it came from).
+               if writeCache {
+                       c.client.WriteCache(file, data)
+               }
+
+               return cached{data, nil}
+       }).(cached)
+       if result.err != nil {
+               return nil, result.err
+       }
+
+       // Extract the lines for the specific version we want
+       // (with or without /go.mod).
+       prefix := path + " " + vers + " "
+       var hashes []string
+       for _, line := range strings.Split(string(result.data), "\n") {
+               if strings.HasPrefix(line, prefix) {
+                       hashes = append(hashes, line)
+               }
+       }
+       return hashes, nil
+}
+
+// mergeLatest merges the tree head in msg
+// with the Conn's current latest tree head,
+// ensuring the result is a consistent timeline.
+// If the result is inconsistent, mergeLatest calls c.client.SecurityError
+// with a detailed security error message and then
+// (only if c.client.SecurityError does not exit the program) returns ErrSecurity.
+// If the Conn's current latest tree head moves forward,
+// mergeLatest updates the underlying configuration file as well,
+// taking care to merge any independent updates to that configuration.
+func (c *Conn) mergeLatest(msg []byte) error {
+       // Merge msg into our in-memory copy of the latest tree head.
+       when, err := c.mergeLatestMem(msg)
+       if err != nil {
+               return err
+       }
+       if when != msgFuture {
+               // msg matched our present or was in the past.
+               // No change to our present, so no update of config file.
+               return nil
+       }
+
+       // Flush our extended timeline back out to the configuration file.
+       // If the configuration file has been updated in the interim,
+       // we need to merge any updates made there as well.
+       // Note that writeConfig is an atomic compare-and-swap.
+       for {
+               msg, err := c.client.ReadConfig(c.name + "/latest")
+               if err != nil {
+                       return err
+               }
+               when, err := c.mergeLatestMem(msg)
+               if err != nil {
+                       return err
+               }
+               if when != msgPast {
+                       // msg matched our present or was from the future,
+                       // and now our in-memory copy matches.
+                       return nil
+               }
+
+               // msg (== config) is in the past, so we need to update it.
+               c.latestMu.Lock()
+               latestMsg := c.latestMsg
+               c.latestMu.Unlock()
+               if err := c.client.WriteConfig(c.name+"/latest", msg, latestMsg); err != ErrWriteConflict {
+                       // Success or a non-write-conflict error.
+                       return err
+               }
+       }
+}
+
+const (
+       msgPast = 1 + iota
+       msgNow
+       msgFuture
+)
+
+// mergeLatestMem is like mergeLatest but is only concerned with
+// updating the in-memory copy of the latest tree head (c.latest)
+// not the configuration file.
+// The when result explains when msg happened relative to our
+// previous idea of c.latest:
+// msgPast means msg was from before c.latest,
+// msgNow means msg was exactly c.latest, and
+// msgFuture means msg was from after c.latest, which has now been updated.
+func (c *Conn) mergeLatestMem(msg []byte) (when int, err error) {
+       if len(msg) == 0 {
+               // Accept empty msg as the unsigned, empty timeline.
+               c.latestMu.Lock()
+               latest := c.latest
+               c.latestMu.Unlock()
+               if latest.N == 0 {
+                       return msgNow, nil
+               }
+               return msgPast, nil
+       }
+
+       note, err := note.Open(msg, c.verifiers)
+       if err != nil {
+               return 0, fmt.Errorf("reading tree note: %v\nnote:\n%s", err, msg)
+       }
+       tree, err := tlog.ParseTree([]byte(note.Text))
+       if err != nil {
+               return 0, fmt.Errorf("reading tree: %v\ntree:\n%s", err, note.Text)
+       }
+
+       // Other lookups may be calling mergeLatest with other heads,
+       // so c.latest is changing underfoot. We don't want to hold the
+       // c.mu lock during tile fetches, so loop trying to update c.latest.
+       c.latestMu.Lock()
+       latest := c.latest
+       latestMsg := c.latestMsg
+       c.latestMu.Unlock()
+
+       for {
+               // If the tree head looks old, check that it is on our timeline.
+               if tree.N <= latest.N {
+                       if err := c.checkTrees(tree, msg, latest, latestMsg); err != nil {
+                               return 0, err
+                       }
+                       if tree.N < latest.N {
+                               return msgPast, nil
+                       }
+                       return msgNow, nil
+               }
+
+               // The tree head looks new. Check that we are on its timeline and try to move our timeline forward.
+               if err := c.checkTrees(latest, latestMsg, tree, msg); err != nil {
+                       return 0, err
+               }
+
+               // Install our msg if possible.
+               // Otherwise we will go around again.
+               c.latestMu.Lock()
+               installed := false
+               if c.latest == latest {
+                       installed = true
+                       c.latest = tree
+                       c.latestMsg = msg
+               } else {
+                       latest = c.latest
+                       latestMsg = c.latestMsg
+               }
+               c.latestMu.Unlock()
+
+               if installed {
+                       return msgFuture, nil
+               }
+       }
+}
+
+// checkTrees checks that older (from olderNote) is contained in newer (from newerNote).
+// If an error occurs, such as malformed data or a network problem, checkTrees returns that error.
+// If on the other hand checkTrees finds evidence of misbehavior, it prepares a detailed
+// message and calls log.Fatal.
+func (c *Conn) checkTrees(older tlog.Tree, olderNote []byte, newer tlog.Tree, newerNote []byte) error {
+       thr := tlog.TileHashReader(newer, &c.tileReader)
+       h, err := tlog.TreeHash(older.N, thr)
+       if err != nil {
+               if older.N == newer.N {
+                       return fmt.Errorf("checking tree#%d: %v", older.N, err)
+               }
+               return fmt.Errorf("checking tree#%d against tree#%d: %v", older.N, newer.N, err)
+       }
+       if h == older.Hash {
+               return nil
+       }
+
+       // Detected a fork in the tree timeline.
+       // Start by reporting the inconsistent signed tree notes.
+       var buf bytes.Buffer
+       fmt.Fprintf(&buf, "SECURITY ERROR\n")
+       fmt.Fprintf(&buf, "go.sum database server misbehavior detected!\n\n")
+       indent := func(b []byte) []byte {
+               return bytes.Replace(b, []byte("\n"), []byte("\n\t"), -1)
+       }
+       fmt.Fprintf(&buf, "old database:\n\t%s\n", indent(olderNote))
+       fmt.Fprintf(&buf, "new database:\n\t%s\n", indent(newerNote))
+
+       // The notes alone are not enough to prove the inconsistency.
+       // We also need to show that the newer note's tree hash for older.N
+       // does not match older.Hash. The consumer of this report could
+       // of course consult the server to try to verify the inconsistency,
+       // but we are holding all the bits we need to prove it right now,
+       // so we might as well print them and make the report not depend
+       // on the continued availability of the misbehaving server.
+       // Preparing this data only reuses the tiled hashes needed for
+       // tlog.TreeHash(older.N, thr) above, so assuming thr is caching tiles,
+       // there are no new access to the server here, and these operations cannot fail.
+       fmt.Fprintf(&buf, "proof of misbehavior:\n\t%v", h)
+       if p, err := tlog.ProveTree(newer.N, older.N, thr); err != nil {
+               fmt.Fprintf(&buf, "\tinternal error: %v\n", err)
+       } else if err := tlog.CheckTree(p, newer.N, newer.Hash, older.N, h); err != nil {
+               fmt.Fprintf(&buf, "\tinternal error: generated inconsistent proof\n")
+       } else {
+               for _, h := range p {
+                       fmt.Fprintf(&buf, "\n\t%v", h)
+               }
+       }
+       c.client.SecurityError(buf.String())
+       return ErrSecurity
+}
+
+// checkRecord checks that record #id's hash matches data.
+func (c *Conn) checkRecord(id int64, data []byte) error {
+       c.latestMu.Lock()
+       latest := c.latest
+       c.latestMu.Unlock()
+
+       if id >= latest.N {
+               return fmt.Errorf("cannot validate record %d in tree of size %d", id, latest.N)
+       }
+       hashes, err := tlog.TileHashReader(latest, &c.tileReader).ReadHashes([]int64{tlog.StoredHashIndex(0, id)})
+       if err != nil {
+               return err
+       }
+       if hashes[0] == tlog.RecordHash(data) {
+               return nil
+       }
+       return fmt.Errorf("cannot authenticate record data in server response")
+}
+
+// tileReader is a *Conn wrapper that implements tlog.TileReader.
+// The separate type avoids exposing the ReadTiles and SaveTiles
+// methods on Conn itself.
+type tileReader struct {
+       c *Conn
+}
+
+func (r *tileReader) Height() int {
+       return r.c.tileHeight
+}
+
+// ReadTiles reads and returns the requested tiles,
+// either from the on-disk cache or the server.
+func (r *tileReader) ReadTiles(tiles []tlog.Tile) ([][]byte, error) {
+       // Read all the tiles in parallel.
+       data := make([][]byte, len(tiles))
+       errs := make([]error, len(tiles))
+       var wg sync.WaitGroup
+       for i, tile := range tiles {
+               wg.Add(1)
+               go func(i int, tile tlog.Tile) {
+                       defer wg.Done()
+                       data[i], errs[i] = r.c.readTile(tile)
+               }(i, tile)
+       }
+       wg.Wait()
+
+       for _, err := range errs {
+               if err != nil {
+                       return nil, err
+               }
+       }
+
+       return data, nil
+}
+
+// tileCacheKey returns the cache key for the tile.
+func (c *Conn) tileCacheKey(tile tlog.Tile) string {
+       return c.name + "/" + tile.Path()
+}
+
+// tileRemotePath returns the remote path for the tile.
+func (c *Conn) tileRemotePath(tile tlog.Tile) string {
+       return "/" + tile.Path()
+}
+
+// readTile reads a single tile, either from the on-disk cache or the server.
+func (c *Conn) readTile(tile tlog.Tile) ([]byte, error) {
+       type cached struct {
+               data []byte
+               err  error
+       }
+
+       result := c.tileCache.Do(tile, func() interface{} {
+               // Try the requested tile in on-disk cache.
+               data, err := c.client.ReadCache(c.tileCacheKey(tile))
+               if err == nil {
+                       c.markTileSaved(tile)
+                       return cached{data, nil}
+               }
+
+               // Try the full tile in on-disk cache (if requested tile not already full).
+               // We only save authenticated tiles to the on-disk cache,
+               // so the recreated prefix is equally authenticated.
+               full := tile
+               full.W = 1 << tile.H
+               if tile != full {
+                       data, err := c.client.ReadCache(c.tileCacheKey(full))
+                       if err == nil {
+                               c.markTileSaved(tile) // don't save tile later; we already have full
+                               return cached{data[:len(data)/full.W*tile.W], nil}
+                       }
+               }
+
+               // Try requested tile from server.
+               data, err = c.client.ReadRemote(c.tileRemotePath(tile))
+               if err == nil {
+                       return cached{data, nil}
+               }
+
+               // Try full tile on server.
+               // If the partial tile does not exist, it should be because
+               // the tile has been completed and only the complete one
+               // is available.
+               if tile != full {
+                       data, err := c.client.ReadRemote(c.tileRemotePath(full))
+                       if err == nil {
+                               // Note: We could save the full tile in the on-disk cache here,
+                               // but we don't know if it is valid yet, and we will only find out
+                               // about the partial data, not the full data. So let SaveTiles
+                               // save the partial tile, and we'll just refetch the full tile later
+                               // once we can validate more (or all) of it.
+                               return cached{data[:len(data)/full.W*tile.W], nil}
+                       }
+               }
+
+               // Nothing worked.
+               // Return the error from the server fetch for the requested (not full) tile.
+               return cached{nil, err}
+       }).(cached)
+
+       return result.data, result.err
+}
+
+// markTileSaved records that tile is already present in the on-disk cache,
+// so that a future SaveTiles for that tile can be ignored.
+func (c *Conn) markTileSaved(tile tlog.Tile) {
+       c.tileSavedMu.Lock()
+       c.tileSaved[tile] = true
+       c.tileSavedMu.Unlock()
+}
+
+// SaveTiles saves the now validated tiles.
+func (r *tileReader) SaveTiles(tiles []tlog.Tile, data [][]byte) {
+       c := r.c
+
+       // Determine which tiles need saving.
+       // (Tiles that came from the cache need not be saved back.)
+       save := make([]bool, len(tiles))
+       c.tileSavedMu.Lock()
+       for i, tile := range tiles {
+               if !c.tileSaved[tile] {
+                       save[i] = true
+                       c.tileSaved[tile] = true
+               }
+       }
+       c.tileSavedMu.Unlock()
+
+       for i, tile := range tiles {
+               if save[i] {
+                       // If WriteCache fails here (out of disk space? i/o error?),
+                       // c.tileSaved[tile] is still true and we will not try to write it again.
+                       // Next time we run maybe we'll redownload it again and be
+                       // more successful.
+                       c.client.WriteCache(c.name+"/"+tile.Path(), data[i])
+               }
+       }
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/client_test.go b/libgo/go/cmd/go/internal/sumweb/client_test.go
new file mode 100644 (file)
index 0000000..83a182a
--- /dev/null
@@ -0,0 +1,460 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sumweb
+
+import (
+       "bytes"
+       "fmt"
+       "strings"
+       "sync"
+       "testing"
+
+       "cmd/go/internal/note"
+       "cmd/go/internal/tlog"
+)
+
+const (
+       testName        = "localhost.localdev/sumdb"
+       testVerifierKey = "localhost.localdev/sumdb+00000c67+AcTrnkbUA+TU4heY3hkjiSES/DSQniBqIeQ/YppAUtK6"
+       testSignerKey   = "PRIVATE+KEY+localhost.localdev/sumdb+00000c67+AXu6+oaVaOYuQOFrf1V59JK1owcFlJcHwwXHDfDGxSPk"
+)
+
+func TestConnLookup(t *testing.T) {
+       tc := newTestClient(t)
+       tc.mustHaveLatest(1)
+
+       // Basic lookup.
+       tc.mustLookup("rsc.io/sampler", "v1.3.0", "rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=")
+       tc.mustHaveLatest(3)
+
+       // Everything should now be cached, both for the original package and its /go.mod.
+       tc.getOK = false
+       tc.mustLookup("rsc.io/sampler", "v1.3.0", "rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=")
+       tc.mustLookup("rsc.io/sampler", "v1.3.0/go.mod", "rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=")
+       tc.mustHaveLatest(3)
+       tc.getOK = true
+       tc.getTileOK = false // the cache has what we need
+
+       // Lookup with multiple returned lines.
+       tc.mustLookup("rsc.io/quote", "v1.5.2", "rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=\nrsc.io/quote v1.5.2 h2:xyzzy")
+       tc.mustHaveLatest(3)
+
+       // Lookup with need for !-encoding.
+       // rsc.io/Quote is the only record written after rsc.io/samper,
+       // so it is the only one that should need more tiles.
+       tc.getTileOK = true
+       tc.mustLookup("rsc.io/Quote", "v1.5.2", "rsc.io/Quote v1.5.2 h1:uppercase!=")
+       tc.mustHaveLatest(4)
+}
+
+func TestConnBadTiles(t *testing.T) {
+       tc := newTestClient(t)
+
+       flipBits := func() {
+               for url, data := range tc.remote {
+                       if strings.Contains(url, "/tile/") {
+                               for i := range data {
+                                       data[i] ^= 0x80
+                               }
+                       }
+               }
+       }
+
+       // Bad tiles in initial download.
+       tc.mustHaveLatest(1)
+       flipBits()
+       _, err := tc.conn.Lookup("rsc.io/sampler", "v1.3.0")
+       tc.mustError(err, "rsc.io/sampler@v1.3.0: initializing sumweb.Conn: checking tree#1: downloaded inconsistent tile")
+       flipBits()
+       tc.newConn()
+       tc.mustLookup("rsc.io/sampler", "v1.3.0", "rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=")
+
+       // Bad tiles after initial download.
+       flipBits()
+       _, err = tc.conn.Lookup("rsc.io/Quote", "v1.5.2")
+       tc.mustError(err, "rsc.io/Quote@v1.5.2: checking tree#3 against tree#4: downloaded inconsistent tile")
+       flipBits()
+       tc.newConn()
+       tc.mustLookup("rsc.io/Quote", "v1.5.2", "rsc.io/Quote v1.5.2 h1:uppercase!=")
+
+       // Bad starting tree hash looks like bad tiles.
+       tc.newConn()
+       text := tlog.FormatTree(tlog.Tree{N: 1, Hash: tlog.Hash{}})
+       data, err := note.Sign(&note.Note{Text: string(text)}, tc.signer)
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       tc.config[testName+"/latest"] = data
+       _, err = tc.conn.Lookup("rsc.io/sampler", "v1.3.0")
+       tc.mustError(err, "rsc.io/sampler@v1.3.0: initializing sumweb.Conn: checking tree#1: downloaded inconsistent tile")
+}
+
+func TestConnFork(t *testing.T) {
+       tc := newTestClient(t)
+       tc2 := tc.fork()
+
+       tc.addRecord("rsc.io/pkg1@v1.5.2", `rsc.io/pkg1 v1.5.2 h1:hash!=
+`)
+       tc.addRecord("rsc.io/pkg1@v1.5.4", `rsc.io/pkg1 v1.5.4 h1:hash!=
+`)
+       tc.mustLookup("rsc.io/pkg1", "v1.5.2", "rsc.io/pkg1 v1.5.2 h1:hash!=")
+
+       tc2.addRecord("rsc.io/pkg1@v1.5.3", `rsc.io/pkg1 v1.5.3 h1:hash!=
+`)
+       tc2.addRecord("rsc.io/pkg1@v1.5.4", `rsc.io/pkg1 v1.5.4 h1:hash!=
+`)
+       tc2.mustLookup("rsc.io/pkg1", "v1.5.4", "rsc.io/pkg1 v1.5.4 h1:hash!=")
+
+       key := "/lookup/rsc.io/pkg1@v1.5.2"
+       tc2.remote[key] = tc.remote[key]
+       _, err := tc2.conn.Lookup("rsc.io/pkg1", "v1.5.2")
+       tc2.mustError(err, ErrSecurity.Error())
+
+       /*
+          SECURITY ERROR
+          go.sum database server misbehavior detected!
+
+          old database:
+               go.sum database tree!
+               5
+               nWzN20+pwMt62p7jbv1/NlN95ePTlHijabv5zO/s36w=
+
+               — localhost.localdev/sumdb AAAMZ5/2FVAdMH58kmnz/0h299pwyskEbzDzoa2/YaPdhvLya4YWDFQQxu2TQb5GpwAH4NdWnTwuhILafisyf3CNbgg=
+
+          new database:
+               go.sum database tree
+               6
+               wc4SkQt52o5W2nQ8To2ARs+mWuUJjss+sdleoiqxMmM=
+
+               — localhost.localdev/sumdb AAAMZ6oRNswlEZ6ZZhxrCvgl1MBy+nusq4JU+TG6Fe2NihWLqOzb+y2c2kzRLoCr4tvw9o36ucQEnhc20e4nA4Qc/wc=
+
+          proof of misbehavior:
+               T7i+H/8ER4nXOiw4Bj0koZOkGjkxoNvlI34GpvhHhQg=
+               Nsuejv72de9hYNM5bqFv8rv3gm3zJQwv/DT/WNbLDLA=
+               mOmqqZ1aI/lzS94oq/JSbj7pD8Rv9S+xDyi12BtVSHo=
+               /7Aw5jVSMM9sFjQhaMg+iiDYPMk6decH7QLOGrL9Lx0=
+       */
+
+       wants := []string{
+               "SECURITY ERROR",
+               "go.sum database server misbehavior detected!",
+               "old database:\n\tgo.sum database tree\n\t5\n",
+               "— localhost.localdev/sumdb AAAMZ5/2FVAd",
+               "new database:\n\tgo.sum database tree\n\t6\n",
+               "— localhost.localdev/sumdb AAAMZ6oRNswl",
+               "proof of misbehavior:\n\tT7i+H/8ER4nXOiw4Bj0k",
+       }
+       text := tc2.security.String()
+       for _, want := range wants {
+               if !strings.Contains(text, want) {
+                       t.Fatalf("cannot find %q in security text:\n%s", want, text)
+               }
+       }
+}
+
+func TestConnGONOSUMDB(t *testing.T) {
+       tc := newTestClient(t)
+       tc.conn.SetGONOSUMDB("p,*/q")
+       tc.conn.Lookup("rsc.io/sampler", "v1.3.0") // initialize before we turn off network
+       tc.getOK = false
+
+       ok := []string{
+               "abc",
+               "a/p",
+               "pq",
+               "q",
+               "n/o/p/q",
+       }
+       skip := []string{
+               "p",
+               "p/x",
+               "x/q",
+               "x/q/z",
+       }
+
+       for _, path := range ok {
+               _, err := tc.conn.Lookup(path, "v1.0.0")
+               if err == ErrGONOSUMDB {
+                       t.Errorf("Lookup(%q): ErrGONOSUMDB, wanted failed actual lookup", path)
+               }
+       }
+       for _, path := range skip {
+               _, err := tc.conn.Lookup(path, "v1.0.0")
+               if err != ErrGONOSUMDB {
+                       t.Errorf("Lookup(%q): %v, wanted ErrGONOSUMDB", path, err)
+               }
+       }
+}
+
+// A testClient is a self-contained client-side testing environment.
+type testClient struct {
+       t          *testing.T // active test
+       conn       *Conn      // conn being tested
+       tileHeight int        // tile height to use (default 2)
+       getOK      bool       // should tc.GetURL succeed?
+       getTileOK  bool       // should tc.GetURL of tiles succeed?
+       treeSize   int64
+       hashes     []tlog.Hash
+       remote     map[string][]byte
+       signer     note.Signer
+
+       // mu protects config, cache, log, security
+       // during concurrent use of the exported methods
+       // by the conn itself (testClient is the Conn's Client,
+       // and the Client methods can both read and write these fields).
+       // Unexported methods invoked directly by the test
+       // (for example, addRecord) need not hold the mutex:
+       // for proper test execution those methods should only
+       // be called when the Conn is idle and not using its Client.
+       // Not holding the mutex in those methods ensures
+       // that if a mistake is made, go test -race will report it.
+       // (Holding the mutex would eliminate the race report but
+       // not the underlying problem.)
+       // Similarly, the get map is not protected by the mutex,
+       // because the Client methods only read it.
+       mu       sync.Mutex // prot
+       config   map[string][]byte
+       cache    map[string][]byte
+       security bytes.Buffer
+}
+
+// newTestClient returns a new testClient that will call t.Fatal on error
+// and has a few records already available on the remote server.
+func newTestClient(t *testing.T) *testClient {
+       tc := &testClient{
+               t:          t,
+               tileHeight: 2,
+               getOK:      true,
+               getTileOK:  true,
+               config:     make(map[string][]byte),
+               cache:      make(map[string][]byte),
+               remote:     make(map[string][]byte),
+       }
+
+       tc.config["key"] = []byte(testVerifierKey + "\n")
+       var err error
+       tc.signer, err = note.NewSigner(testSignerKey)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       tc.newConn()
+
+       tc.addRecord("rsc.io/quote@v1.5.2", `rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
+rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
+rsc.io/quote v1.5.2 h2:xyzzy
+`)
+
+       tc.addRecord("golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c", `golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+`)
+       tc.addRecord("rsc.io/sampler@v1.3.0", `rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+`)
+       tc.config[testName+"/latest"] = tc.signTree(1)
+
+       tc.addRecord("rsc.io/!quote@v1.5.2", `rsc.io/Quote v1.5.2 h1:uppercase!=
+`)
+       return tc
+}
+
+// newConn resets the Conn associated with tc.
+// This clears any in-memory cache from the Conn
+// but not tc's on-disk cache.
+func (tc *testClient) newConn() {
+       tc.conn = NewConn(tc)
+       tc.conn.SetTileHeight(tc.tileHeight)
+}
+
+// mustLookup does a lookup for path@vers and checks that the lines that come back match want.
+func (tc *testClient) mustLookup(path, vers, want string) {
+       tc.t.Helper()
+       lines, err := tc.conn.Lookup(path, vers)
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       if strings.Join(lines, "\n") != want {
+               tc.t.Fatalf("Lookup(%q, %q):\n\t%s\nwant:\n\t%s", path, vers, strings.Join(lines, "\n\t"), strings.Replace(want, "\n", "\n\t", -1))
+       }
+}
+
+// mustHaveLatest checks that the on-disk configuration
+// for latest is a tree of size n.
+func (tc *testClient) mustHaveLatest(n int64) {
+       tc.t.Helper()
+
+       latest := tc.config[testName+"/latest"]
+       lines := strings.Split(string(latest), "\n")
+       if len(lines) < 2 || lines[1] != fmt.Sprint(n) {
+               tc.t.Fatalf("/latest should have tree %d, but has:\n%s", n, latest)
+       }
+}
+
+// mustError checks that err's error string contains the text.
+func (tc *testClient) mustError(err error, text string) {
+       tc.t.Helper()
+       if err == nil || !strings.Contains(err.Error(), text) {
+               tc.t.Fatalf("err = %v, want %q", err, text)
+       }
+}
+
+// fork returns a copy of tc.
+// Changes made to the new copy or to tc are not reflected in the other.
+func (tc *testClient) fork() *testClient {
+       tc2 := &testClient{
+               t:          tc.t,
+               getOK:      tc.getOK,
+               getTileOK:  tc.getTileOK,
+               tileHeight: tc.tileHeight,
+               treeSize:   tc.treeSize,
+               hashes:     append([]tlog.Hash{}, tc.hashes...),
+               signer:     tc.signer,
+               config:     copyMap(tc.config),
+               cache:      copyMap(tc.cache),
+               remote:     copyMap(tc.remote),
+       }
+       tc2.newConn()
+       return tc2
+}
+
+func copyMap(m map[string][]byte) map[string][]byte {
+       m2 := make(map[string][]byte)
+       for k, v := range m {
+               m2[k] = v
+       }
+       return m2
+}
+
+// ReadHashes is tc's implementation of tlog.HashReader, for use with
+// tlog.TreeHash and so on.
+func (tc *testClient) ReadHashes(indexes []int64) ([]tlog.Hash, error) {
+       var list []tlog.Hash
+       for _, id := range indexes {
+               list = append(list, tc.hashes[id])
+       }
+       return list, nil
+}
+
+// addRecord adds a log record using the given (!-encoded) key and data.
+func (tc *testClient) addRecord(key, data string) {
+       tc.t.Helper()
+
+       // Create record, add hashes to log tree.
+       id := tc.treeSize
+       tc.treeSize++
+       rec, err := tlog.FormatRecord(id, []byte(data))
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       hashes, err := tlog.StoredHashesForRecordHash(id, tlog.RecordHash([]byte(data)), tc)
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       tc.hashes = append(tc.hashes, hashes...)
+
+       // Create lookup result.
+       tc.remote["/lookup/"+key] = append(rec, tc.signTree(tc.treeSize)...)
+
+       // Create new tiles.
+       tiles := tlog.NewTiles(tc.tileHeight, id, tc.treeSize)
+       for _, tile := range tiles {
+               data, err := tlog.ReadTileData(tile, tc)
+               if err != nil {
+                       tc.t.Fatal(err)
+               }
+               tc.remote["/"+tile.Path()] = data
+               // TODO delete old partial tiles
+       }
+}
+
+// signTree returns the signed head for the tree of the given size.
+func (tc *testClient) signTree(size int64) []byte {
+       h, err := tlog.TreeHash(size, tc)
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       text := tlog.FormatTree(tlog.Tree{N: size, Hash: h})
+       data, err := note.Sign(&note.Note{Text: string(text)}, tc.signer)
+       if err != nil {
+               tc.t.Fatal(err)
+       }
+       return data
+}
+
+// ReadRemote is for tc's implementation of Client.
+func (tc *testClient) ReadRemote(path string) ([]byte, error) {
+       // No mutex here because only the Client should be running
+       // and the Client cannot change tc.get.
+       if !tc.getOK {
+               return nil, fmt.Errorf("disallowed remote read %s", path)
+       }
+       if strings.Contains(path, "/tile/") && !tc.getTileOK {
+               return nil, fmt.Errorf("disallowed remote tile read %s", path)
+       }
+
+       data, ok := tc.remote[path]
+       if !ok {
+               return nil, fmt.Errorf("no remote path %s", path)
+       }
+       return data, nil
+}
+
+// ReadConfig is for tc's implementation of Client.
+func (tc *testClient) ReadConfig(file string) ([]byte, error) {
+       tc.mu.Lock()
+       defer tc.mu.Unlock()
+
+       data, ok := tc.config[file]
+       if !ok {
+               return nil, fmt.Errorf("no config %s", file)
+       }
+       return data, nil
+}
+
+// WriteConfig is for tc's implementation of Client.
+func (tc *testClient) WriteConfig(file string, old, new []byte) error {
+       tc.mu.Lock()
+       defer tc.mu.Unlock()
+
+       data := tc.config[file]
+       if !bytes.Equal(old, data) {
+               return ErrWriteConflict
+       }
+       tc.config[file] = new
+       return nil
+}
+
+// ReadCache is for tc's implementation of Client.
+func (tc *testClient) ReadCache(file string) ([]byte, error) {
+       tc.mu.Lock()
+       defer tc.mu.Unlock()
+
+       data, ok := tc.cache[file]
+       if !ok {
+               return nil, fmt.Errorf("no cache %s", file)
+       }
+       return data, nil
+}
+
+// WriteCache is for tc's implementation of Client.
+func (tc *testClient) WriteCache(file string, data []byte) {
+       tc.mu.Lock()
+       defer tc.mu.Unlock()
+
+       tc.cache[file] = data
+}
+
+// Log is for tc's implementation of Client.
+func (tc *testClient) Log(msg string) {
+       tc.t.Log(msg)
+}
+
+// SecurityError is for tc's implementation of Client.
+func (tc *testClient) SecurityError(msg string) {
+       tc.mu.Lock()
+       defer tc.mu.Unlock()
+
+       fmt.Fprintf(&tc.security, "%s\n", strings.TrimRight(msg, "\n"))
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/encode.go b/libgo/go/cmd/go/internal/sumweb/encode.go
new file mode 100644 (file)
index 0000000..d044a84
--- /dev/null
@@ -0,0 +1,167 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// FS-safe encoding of module paths and versions.
+// Copied from cmd/go/internal/module and unexported.
+
+package sumweb
+
+import (
+       "fmt"
+       "unicode/utf8"
+)
+
+// Safe encodings
+//
+// Module paths appear as substrings of file system paths
+// (in the download cache) and of web server URLs in the proxy protocol.
+// In general we cannot rely on file systems to be case-sensitive,
+// nor can we rely on web servers, since they read from file systems.
+// That is, we cannot rely on the file system to keep rsc.io/QUOTE
+// and rsc.io/quote separate. Windows and macOS don't.
+// Instead, we must never require two different casings of a file path.
+// Because we want the download cache to match the proxy protocol,
+// and because we want the proxy protocol to be possible to serve
+// from a tree of static files (which might be stored on a case-insensitive
+// file system), the proxy protocol must never require two different casings
+// of a URL path either.
+//
+// One possibility would be to make the safe encoding be the lowercase
+// hexadecimal encoding of the actual path bytes. This would avoid ever
+// needing different casings of a file path, but it would be fairly illegible
+// to most programmers when those paths appeared in the file system
+// (including in file paths in compiler errors and stack traces)
+// in web server logs, and so on. Instead, we want a safe encoding that
+// leaves most paths unaltered.
+//
+// The safe encoding is this:
+// replace every uppercase letter with an exclamation mark
+// followed by the letter's lowercase equivalent.
+//
+// For example,
+// github.com/Azure/azure-sdk-for-go ->  github.com/!azure/azure-sdk-for-go.
+// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy
+// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus.
+//
+// Import paths that avoid upper-case letters are left unchanged.
+// Note that because import paths are ASCII-only and avoid various
+// problematic punctuation (like : < and >), the safe encoding is also ASCII-only
+// and avoids the same problematic punctuation.
+//
+// Import paths have never allowed exclamation marks, so there is no
+// need to define how to encode a literal !.
+//
+// Although paths are disallowed from using Unicode (see pathOK above),
+// the eventual plan is to allow Unicode letters as well, to assume that
+// file systems and URLs are Unicode-safe (storing UTF-8), and apply
+// the !-for-uppercase convention. Note however that not all runes that
+// are different but case-fold equivalent are an upper/lower pair.
+// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin)
+// are considered to case-fold to each other. When we do add Unicode
+// letters, we must not assume that upper/lower are the only case-equivalent pairs.
+// Perhaps the Kelvin symbol would be disallowed entirely, for example.
+// Or perhaps it would encode as "!!k", or perhaps as "(212A)".
+//
+// Also, it would be nice to allow Unicode marks as well as letters,
+// but marks include combining marks, and then we must deal not
+// only with case folding but also normalization: both U+00E9 ('é')
+// and U+0065 U+0301 ('e' followed by combining acute accent)
+// look the same on the page and are treated by some file systems
+// as the same path. If we do allow Unicode marks in paths, there
+// must be some kind of normalization to allow only one canonical
+// encoding of any character used in an import path.
+
+// encodePath returns the safe encoding of the given module path.
+// It fails if the module path is invalid.
+func encodePath(path string) (encoding string, err error) {
+       return encodeString(path)
+}
+
+// encodeVersion returns the safe encoding of the given module version.
+// Versions are allowed to be in non-semver form but must be valid file names
+// and not contain exclamation marks.
+func encodeVersion(v string) (encoding string, err error) {
+       return encodeString(v)
+}
+
+func encodeString(s string) (encoding string, err error) {
+       haveUpper := false
+       for _, r := range s {
+               if r == '!' || r >= utf8.RuneSelf {
+                       // This should be disallowed by CheckPath, but diagnose anyway.
+                       // The correctness of the encoding loop below depends on it.
+                       return "", fmt.Errorf("internal error: inconsistency in EncodePath")
+               }
+               if 'A' <= r && r <= 'Z' {
+                       haveUpper = true
+               }
+       }
+
+       if !haveUpper {
+               return s, nil
+       }
+
+       var buf []byte
+       for _, r := range s {
+               if 'A' <= r && r <= 'Z' {
+                       buf = append(buf, '!', byte(r+'a'-'A'))
+               } else {
+                       buf = append(buf, byte(r))
+               }
+       }
+       return string(buf), nil
+}
+
+// decodePath returns the module path of the given safe encoding.
+// It fails if the encoding is invalid or encodes an invalid path.
+func decodePath(encoding string) (path string, err error) {
+       path, ok := decodeString(encoding)
+       if !ok {
+               return "", fmt.Errorf("invalid module path encoding %q", encoding)
+       }
+       return path, nil
+}
+
+// decodeVersion returns the version string for the given safe encoding.
+// It fails if the encoding is invalid or encodes an invalid version.
+// Versions are allowed to be in non-semver form but must be valid file names
+// and not contain exclamation marks.
+func decodeVersion(encoding string) (v string, err error) {
+       v, ok := decodeString(encoding)
+       if !ok {
+               return "", fmt.Errorf("invalid version encoding %q", encoding)
+       }
+       return v, nil
+}
+
+func decodeString(encoding string) (string, bool) {
+       var buf []byte
+
+       bang := false
+       for _, r := range encoding {
+               if r >= utf8.RuneSelf {
+                       return "", false
+               }
+               if bang {
+                       bang = false
+                       if r < 'a' || 'z' < r {
+                               return "", false
+                       }
+                       buf = append(buf, byte(r+'A'-'a'))
+                       continue
+               }
+               if r == '!' {
+                       bang = true
+                       continue
+               }
+               if 'A' <= r && r <= 'Z' {
+                       return "", false
+               }
+               buf = append(buf, byte(r))
+       }
+       if bang {
+               return "", false
+       }
+       return string(buf), true
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/encode_test.go b/libgo/go/cmd/go/internal/sumweb/encode_test.go
new file mode 100644 (file)
index 0000000..9ed5e4a
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sumweb
+
+import "testing"
+
+var encodeTests = []struct {
+       path string
+       enc  string // empty means same as path
+}{
+       {path: "ascii.com/abcdefghijklmnopqrstuvwxyz.-+/~_0123456789"},
+       {path: "github.com/GoogleCloudPlatform/omega", enc: "github.com/!google!cloud!platform/omega"},
+}
+
+func TestEncodePath(t *testing.T) {
+       // Check encodings.
+       for _, tt := range encodeTests {
+               enc, err := encodePath(tt.path)
+               if err != nil {
+                       t.Errorf("encodePath(%q): unexpected error: %v", tt.path, err)
+                       continue
+               }
+               want := tt.enc
+               if want == "" {
+                       want = tt.path
+               }
+               if enc != want {
+                       t.Errorf("encodePath(%q) = %q, want %q", tt.path, enc, want)
+               }
+       }
+}
+
+var badDecode = []string{
+       "github.com/GoogleCloudPlatform/omega",
+       "github.com/!google!cloud!platform!/omega",
+       "github.com/!0google!cloud!platform/omega",
+       "github.com/!_google!cloud!platform/omega",
+       "github.com/!!google!cloud!platform/omega",
+}
+
+func TestDecodePath(t *testing.T) {
+       // Check invalid decodings.
+       for _, bad := range badDecode {
+               _, err := decodePath(bad)
+               if err == nil {
+                       t.Errorf("DecodePath(%q): succeeded, want error (invalid decoding)", bad)
+               }
+       }
+
+       // Check encodings.
+       for _, tt := range encodeTests {
+               enc := tt.enc
+               if enc == "" {
+                       enc = tt.path
+               }
+               path, err := decodePath(enc)
+               if err != nil {
+                       t.Errorf("decodePath(%q): unexpected error: %v", enc, err)
+                       continue
+               }
+               if path != tt.path {
+                       t.Errorf("decodePath(%q) = %q, want %q", enc, path, tt.path)
+               }
+       }
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/server.go b/libgo/go/cmd/go/internal/sumweb/server.go
new file mode 100644 (file)
index 0000000..5050805
--- /dev/null
@@ -0,0 +1,183 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package sumweb implements the HTTP protocols for serving or accessing a go.sum database.
+package sumweb
+
+import (
+       "context"
+       "internal/lazyregexp"
+       "net/http"
+       "os"
+       "strings"
+
+       "cmd/go/internal/tlog"
+)
+
+// A Server provides the external operations
+// (underlying database access and so on)
+// needed to implement the HTTP server Handler.
+type Server interface {
+       // NewContext returns the context to use for the request r.
+       NewContext(r *http.Request) (context.Context, error)
+
+       // Signed returns the signed hash of the latest tree.
+       Signed(ctx context.Context) ([]byte, error)
+
+       // ReadRecords returns the content for the n records id through id+n-1.
+       ReadRecords(ctx context.Context, id, n int64) ([][]byte, error)
+
+       // Lookup looks up a record by its associated key ("module@version"),
+       // returning the record ID.
+       Lookup(ctx context.Context, key string) (int64, error)
+
+       // ReadTileData reads the content of tile t.
+       // It is only invoked for hash tiles (t.L ≥ 0).
+       ReadTileData(ctx context.Context, t tlog.Tile) ([]byte, error)
+}
+
+// A Handler is the go.sum database server handler,
+// which should be invoked to serve the paths listed in Paths.
+// The calling code is responsible for initializing Server.
+type Handler struct {
+       Server Server
+}
+
+// Paths are the URL paths for which Handler should be invoked.
+//
+// Typically a server will do:
+//
+//     handler := &sumweb.Handler{Server: srv}
+//     for _, path := range sumweb.Paths {
+//             http.HandleFunc(path, handler)
+//     }
+//
+var Paths = []string{
+       "/lookup/",
+       "/latest",
+       "/tile/",
+}
+
+var modVerRE = lazyregexp.New(`^[^@]+@v[0-9]+\.[0-9]+\.[0-9]+(-[^@]*)?(\+incompatible)?$`)
+
+func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+       ctx, err := h.Server.NewContext(r)
+       if err != nil {
+               http.Error(w, err.Error(), 500)
+               return
+       }
+
+       switch {
+       default:
+               http.NotFound(w, r)
+
+       case strings.HasPrefix(r.URL.Path, "/lookup/"):
+               mod := strings.TrimPrefix(r.URL.Path, "/lookup/")
+               if !modVerRE.MatchString(mod) {
+                       http.Error(w, "invalid module@version syntax", http.StatusBadRequest)
+                       return
+               }
+               i := strings.Index(mod, "@")
+               encPath, encVers := mod[:i], mod[i+1:]
+               path, err := decodePath(encPath)
+               if err != nil {
+                       reportError(w, r, err)
+                       return
+               }
+               vers, err := decodeVersion(encVers)
+               if err != nil {
+                       reportError(w, r, err)
+                       return
+               }
+               id, err := h.Server.Lookup(ctx, path+"@"+vers)
+               if err != nil {
+                       reportError(w, r, err)
+                       return
+               }
+               records, err := h.Server.ReadRecords(ctx, id, 1)
+               if err != nil {
+                       // This should never happen - the lookup says the record exists.
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
+               if len(records) != 1 {
+                       http.Error(w, "invalid record count returned by ReadRecords", http.StatusInternalServerError)
+                       return
+               }
+               msg, err := tlog.FormatRecord(id, records[0])
+               if err != nil {
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
+               signed, err := h.Server.Signed(ctx)
+               if err != nil {
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
+               w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
+               w.Write(msg)
+               w.Write(signed)
+
+       case r.URL.Path == "/latest":
+               data, err := h.Server.Signed(ctx)
+               if err != nil {
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
+               w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
+               w.Write(data)
+
+       case strings.HasPrefix(r.URL.Path, "/tile/"):
+               t, err := tlog.ParseTilePath(r.URL.Path[1:])
+               if err != nil {
+                       http.Error(w, "invalid tile syntax", http.StatusBadRequest)
+                       return
+               }
+               if t.L == -1 {
+                       // Record data.
+                       start := t.N << uint(t.H)
+                       records, err := h.Server.ReadRecords(ctx, start, int64(t.W))
+                       if err != nil {
+                               reportError(w, r, err)
+                               return
+                       }
+                       if len(records) != t.W {
+                               http.Error(w, "invalid record count returned by ReadRecords", http.StatusInternalServerError)
+                               return
+                       }
+                       var data []byte
+                       for i, text := range records {
+                               msg, err := tlog.FormatRecord(start+int64(i), text)
+                               if err != nil {
+                                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                               }
+                               data = append(data, msg...)
+                       }
+                       w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
+                       w.Write(data)
+                       return
+               }
+
+               data, err := h.Server.ReadTileData(ctx, t)
+               if err != nil {
+                       reportError(w, r, err)
+                       return
+               }
+               w.Header().Set("Content-Type", "application/octet-stream")
+               w.Write(data)
+       }
+}
+
+// reportError reports err to w.
+// If it's a not-found, the reported error is 404.
+// Otherwise it is an internal server error.
+// The caller must only call reportError in contexts where
+// a not-found err should be reported as 404.
+func reportError(w http.ResponseWriter, r *http.Request, err error) {
+       if os.IsNotExist(err) {
+               http.Error(w, err.Error(), http.StatusNotFound)
+               return
+       }
+       http.Error(w, err.Error(), http.StatusInternalServerError)
+}
diff --git a/libgo/go/cmd/go/internal/sumweb/test.go b/libgo/go/cmd/go/internal/sumweb/test.go
new file mode 100644 (file)
index 0000000..cce86e7
--- /dev/null
@@ -0,0 +1,133 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sumweb
+
+import (
+       "context"
+       "fmt"
+       "net/http"
+       "strings"
+       "sync"
+
+       "cmd/go/internal/note"
+       "cmd/go/internal/tlog"
+)
+
+// NewTestServer constructs a new TestServer
+// that will sign its tree with the given signer key
+// (see cmd/go/internal/note)
+// and fetch new records as needed by calling gosum.
+func NewTestServer(signer string, gosum func(path, vers string) ([]byte, error)) *TestServer {
+       return &TestServer{signer: signer, gosum: gosum}
+}
+
+// A TestServer is an in-memory implementation of Server for testing.
+type TestServer struct {
+       signer string
+       gosum  func(path, vers string) ([]byte, error)
+
+       mu      sync.Mutex
+       hashes  testHashes
+       records [][]byte
+       lookup  map[string]int64
+}
+
+// testHashes implements tlog.HashReader, reading from a slice.
+type testHashes []tlog.Hash
+
+func (h testHashes) ReadHashes(indexes []int64) ([]tlog.Hash, error) {
+       var list []tlog.Hash
+       for _, id := range indexes {
+               list = append(list, h[id])
+       }
+       return list, nil
+}
+
+func (s *TestServer) NewContext(r *http.Request) (context.Context, error) {
+       return nil, nil
+}
+
+func (s *TestServer) Signed(ctx context.Context) ([]byte, error) {
+       s.mu.Lock()
+       defer s.mu.Unlock()
+
+       size := int64(len(s.records))
+       h, err := tlog.TreeHash(size, s.hashes)
+       if err != nil {
+               return nil, err
+       }
+       text := tlog.FormatTree(tlog.Tree{N: size, Hash: h})
+       signer, err := note.NewSigner(s.signer)
+       if err != nil {
+               return nil, err
+       }
+       return note.Sign(&note.Note{Text: string(text)}, signer)
+}
+
+func (s *TestServer) ReadRecords(ctx context.Context, id, n int64) ([][]byte, error) {
+       s.mu.Lock()
+       defer s.mu.Unlock()
+
+       var list [][]byte
+       for i := int64(0); i < n; i++ {
+               if id+i >= int64(len(s.records)) {
+                       return nil, fmt.Errorf("missing records")
+               }
+               list = append(list, s.records[id+i])
+       }
+       return list, nil
+}
+
+func (s *TestServer) Lookup(ctx context.Context, key string) (int64, error) {
+       s.mu.Lock()
+       id, ok := s.lookup[key]
+       s.mu.Unlock()
+       if ok {
+               return id, nil
+       }
+
+       // Look up module and compute go.sum lines.
+       i := strings.Index(key, "@")
+       if i < 0 {
+               return 0, fmt.Errorf("invalid lookup key %q", key)
+       }
+       path, vers := key[:i], key[i+1:]
+       data, err := s.gosum(path, vers)
+       if err != nil {
+               return 0, err
+       }
+
+       s.mu.Lock()
+       defer s.mu.Unlock()
+
+       // We ran the fetch without the lock.
+       // If another fetch happened and committed, use it instead.
+       id, ok = s.lookup[key]
+       if ok {
+               return id, nil
+       }
+
+       // Add record.
+       id = int64(len(s.records))
+       s.records = append(s.records, data)
+       if s.lookup == nil {
+               s.lookup = make(map[string]int64)
+       }
+       s.lookup[key] = id
+       hashes, err := tlog.StoredHashesForRecordHash(id, tlog.RecordHash([]byte(data)), s.hashes)
+       if err != nil {
+               panic(err)
+       }
+       s.hashes = append(s.hashes, hashes...)
+
+       return id, nil
+}
+
+func (s *TestServer) ReadTileData(ctx context.Context, t tlog.Tile) ([]byte, error) {
+       s.mu.Lock()
+       defer s.mu.Unlock()
+
+       return tlog.ReadTileData(t, s.hashes)
+}
index b72eace55ab13646d53dbce64e8af2726ccc4400..eed2d437c99efd15b0396ce17151dcf920d6e097 100644 (file)
@@ -102,7 +102,10 @@ package test passes, go test prints only the final 'ok' summary
 line. If a package test fails, go test prints the full test output.
 If invoked with the -bench or -v flag, go test prints the full
 output even for passing package tests, in order to display the
-requested benchmark results or verbose logging.
+requested benchmark results or verbose logging. After the package
+tests for all of the listed packages finish, and their output is
+printed, go test prints a final 'FAIL' status if any package test
+has failed.
 
 In package list mode only, go test caches successful package test
 results to avoid unnecessary repeated running of tests. When the
@@ -484,10 +487,14 @@ var (
        pkgArgs          []string
        pkgs             []*load.Package
 
-       testKillTimeout = 10 * time.Minute
-       testCacheExpire time.Time // ignore cached test results before this time
+       testActualTimeout = 10 * time.Minute                  // actual timeout which is passed to tests
+       testKillTimeout   = testActualTimeout + 1*time.Minute // backup alarm
+       testCacheExpire   time.Time                           // ignore cached test results before this time
 )
 
+// testVetExplicit records whether testVetFlags were set by an explicit -vet.
+var testVetExplicit = false
+
 // testVetFlags is the list of flags to pass to vet when invoked automatically during go test.
 var testVetFlags = []string{
        // TODO(rsc): Decide which tests are enabled by default.
@@ -500,6 +507,7 @@ var testVetFlags = []string{
        // "-cgocall",
        // "-composites",
        // "-copylocks",
+       "-errorsas",
        // "-httpresponse",
        // "-lostcancel",
        // "-methods",
@@ -514,15 +522,22 @@ var testVetFlags = []string{
        // "-unusedresult",
 }
 
+func testCmdUsage() {
+       fmt.Fprintf(os.Stderr, "usage: %s\n", CmdTest.UsageLine)
+       fmt.Fprintf(os.Stderr, "Run 'go help %s' and 'go help %s' for details.\n", CmdTest.LongName(), HelpTestflag.LongName())
+       os.Exit(2)
+}
+
 func runTest(cmd *base.Command, args []string) {
        modload.LoadTests = true
 
-       pkgArgs, testArgs = testFlags(cmd.Usage, args)
+       pkgArgs, testArgs = testFlags(testCmdUsage, args)
 
        work.FindExecCmd() // initialize cached result
 
        work.BuildInit()
        work.VetFlags = testVetFlags
+       work.VetExplicit = testVetExplicit
 
        pkgs = load.PackagesForBuild(pkgArgs)
        if len(pkgs) == 0 {
@@ -546,13 +561,21 @@ func runTest(cmd *base.Command, args []string) {
        // the test wedges with a goroutine spinning and its background
        // timer does not get a chance to fire.
        if dt, err := time.ParseDuration(testTimeout); err == nil && dt > 0 {
-               testKillTimeout = dt + 1*time.Minute
+               testActualTimeout = dt
+               testKillTimeout = testActualTimeout + 1*time.Minute
        } else if err == nil && dt == 0 {
                // An explicit zero disables the test timeout.
+               // No timeout is passed to tests.
                // Let it have one century (almost) before we kill it.
+               testActualTimeout = -1
                testKillTimeout = 100 * 365 * 24 * time.Hour
        }
 
+       // Pass timeout to tests if it exists.
+       if testActualTimeout > 0 {
+               testArgs = append(testArgs, "-test.timeout="+testActualTimeout.String())
+       }
+
        // show passing test output (after buffering) with -v flag.
        // must buffer because tests are running in parallel, and
        // otherwise the output will get mixed.
@@ -640,7 +663,7 @@ func runTest(cmd *base.Command, args []string) {
                }
 
                // Select for coverage all dependencies matching the testCoverPaths patterns.
-               for _, p := range load.GetTestPackageList(pkgs) {
+               for _, p := range load.TestPackageList(pkgs) {
                        haveMatch := false
                        for i := range testCoverPaths {
                                if match[i](p) {
@@ -720,7 +743,7 @@ func runTest(cmd *base.Command, args []string) {
        }
 
        // Ultimately the goal is to print the output.
-       root := &work.Action{Mode: "go test", Deps: prints}
+       root := &work.Action{Mode: "go test", Func: printExitStatus, Deps: prints}
 
        // Force the printing of results to happen in order,
        // one at a time.
@@ -754,7 +777,7 @@ func ensureImport(p *load.Package, pkg string) {
                }
        }
 
-       p1 := load.LoadPackage(pkg, &load.ImportStack{})
+       p1 := load.LoadImportWithFlags(pkg, p.Dir, p, &load.ImportStack{}, nil, 0)
        if p1.Error != nil {
                base.Fatalf("load %s: %v", pkg, p1.Error)
        }
@@ -792,7 +815,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin
                        DeclVars: declareCoverVars,
                }
        }
-       pmain, ptest, pxtest, err := load.GetTestPackagesFor(p, cover)
+       pmain, ptest, pxtest, err := load.TestPackagesFor(p, cover)
        if err != nil {
                return nil, nil, nil, err
        }
@@ -820,7 +843,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin
        if !cfg.BuildN {
                // writeTestmain writes _testmain.go,
                // using the test description gathered in t.
-               if err := ioutil.WriteFile(testDir+"_testmain.go", *pmain.Internal.TestmainGo, 0666); err != nil {
+               if err := ioutil.WriteFile(testDir+"_testmain.go", pmain.Internal.TestmainGo, 0666); err != nil {
                        return nil, nil, nil, err
                }
        }
@@ -1617,3 +1640,14 @@ func builderNoTest(b *work.Builder, a *work.Action) error {
        fmt.Fprintf(stdout, "?   \t%s\t[no test files]\n", a.Package.ImportPath)
        return nil
 }
+
+// printExitStatus is the action for printing the exit status
+func printExitStatus(b *work.Builder, a *work.Action) error {
+       if !testJSON && len(pkgArgs) != 0 {
+               if base.GetExitStatus() != 0 {
+                       fmt.Println("FAIL")
+                       return nil
+               }
+       }
+       return nil
+}
index ebcf49a4e9c92df667e8b7d29d1a05f2d435f094..138e1f9d2a25f435917166700c76c87a79e92755 100644 (file)
@@ -202,6 +202,7 @@ func testFlags(usage func(), args []string) (packageNames, passToTest []string)
                }
        }
 
+       testVetExplicit = testVetList != ""
        if testVetList != "" && testVetList != "off" {
                if strings.Contains(testVetList, "=") {
                        base.Fatalf("-vet argument cannot contain equal signs")
diff --git a/libgo/go/cmd/go/internal/tlog/ct_test.go b/libgo/go/cmd/go/internal/tlog/ct_test.go
new file mode 100644 (file)
index 0000000..c2d9aeb
--- /dev/null
@@ -0,0 +1,96 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package tlog
+
+import (
+       "encoding/json"
+       "fmt"
+       "io/ioutil"
+       "net/http"
+       "net/url"
+       "os"
+       "testing"
+)
+
+func TestCertificateTransparency(t *testing.T) {
+       // Test that we can verify actual Certificate Transparency proofs.
+       // (The other tests check that we can verify our own proofs;
+       // this is a test that the two are compatible.)
+
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
+
+       var root ctTree
+       httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth", &root)
+
+       var leaf ctEntries
+       httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-entries?start=10000&end=10000", &leaf)
+       hash := RecordHash(leaf.Entries[0].Data)
+
+       var rp ctRecordProof
+       httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-proof-by-hash?tree_size="+fmt.Sprint(root.Size)+"&hash="+url.QueryEscape(hash.String()), &rp)
+
+       err := CheckRecord(rp.Proof, root.Size, root.Hash, 10000, hash)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       var tp ctTreeProof
+       httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth-consistency?first=3654490&second="+fmt.Sprint(root.Size), &tp)
+
+       oh, _ := ParseHash("AuIZ5V6sDUj1vn3Y1K85oOaQ7y+FJJKtyRTl1edIKBQ=")
+       err = CheckTree(tp.Proof, root.Size, root.Hash, 3654490, oh)
+       if err != nil {
+               t.Fatal(err)
+       }
+}
+
+type ctTree struct {
+       Size int64 `json:"tree_size"`
+       Hash Hash  `json:"sha256_root_hash"`
+}
+
+type ctEntries struct {
+       Entries []*ctEntry
+}
+
+type ctEntry struct {
+       Data []byte `json:"leaf_input"`
+}
+
+type ctRecordProof struct {
+       Index int64       `json:"leaf_index"`
+       Proof RecordProof `json:"audit_path"`
+}
+
+type ctTreeProof struct {
+       Proof TreeProof `json:"consistency"`
+}
+
+func httpGET(t *testing.T, url string, targ interface{}) {
+       if testing.Verbose() {
+               println()
+               println(url)
+       }
+       resp, err := http.Get(url)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer resp.Body.Close()
+       data, err := ioutil.ReadAll(resp.Body)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if testing.Verbose() {
+               os.Stdout.Write(data)
+       }
+       err = json.Unmarshal(data, targ)
+       if err != nil {
+               println(url)
+               os.Stdout.Write(data)
+               t.Fatal(err)
+       }
+}
diff --git a/libgo/go/cmd/go/internal/tlog/note.go b/libgo/go/cmd/go/internal/tlog/note.go
new file mode 100644 (file)
index 0000000..65c7164
--- /dev/null
@@ -0,0 +1,135 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package tlog
+
+import (
+       "bytes"
+       "encoding/base64"
+       "errors"
+       "fmt"
+       "strconv"
+       "strings"
+       "unicode/utf8"
+)
+
+// A Tree is a tree description, to be signed by a go.sum database server.
+type Tree struct {
+       N    int64
+       Hash Hash
+}
+
+// FormatTree formats a tree description for inclusion in a note.
+//
+// The encoded form is three lines, each ending in a newline (U+000A):
+//
+//     go.sum database tree
+//     N
+//     Hash
+//
+// where N is in decimal and Hash is in base64.
+//
+// A future backwards-compatible encoding may add additional lines,
+// which the parser can ignore.
+// A future backwards-incompatible encoding would use a different
+// first line (for example, "go.sum database tree v2").
+func FormatTree(tree Tree) []byte {
+       return []byte(fmt.Sprintf("go.sum database tree\n%d\n%s\n", tree.N, tree.Hash))
+}
+
+var errMalformedTree = errors.New("malformed tree note")
+var treePrefix = []byte("go.sum database tree\n")
+
+// ParseTree parses a tree root description.
+func ParseTree(text []byte) (tree Tree, err error) {
+       // The message looks like:
+       //
+       //      go.sum database tree
+       //      2
+       //      nND/nri/U0xuHUrYSy0HtMeal2vzD9V4k/BO79C+QeI=
+       //
+       // For forwards compatibility, extra text lines after the encoding are ignored.
+       if !bytes.HasPrefix(text, treePrefix) || bytes.Count(text, []byte("\n")) < 3 || len(text) > 1e6 {
+               return Tree{}, errMalformedTree
+       }
+
+       lines := strings.SplitN(string(text), "\n", 4)
+       n, err := strconv.ParseInt(lines[1], 10, 64)
+       if err != nil || n < 0 || lines[1] != strconv.FormatInt(n, 10) {
+               return Tree{}, errMalformedTree
+       }
+
+       h, err := base64.StdEncoding.DecodeString(lines[2])
+       if err != nil || len(h) != HashSize {
+               return Tree{}, errMalformedTree
+       }
+
+       var hash Hash
+       copy(hash[:], h)
+       return Tree{n, hash}, nil
+}
+
+var errMalformedRecord = errors.New("malformed record data")
+
+// FormatRecord formats a record for serving to a client
+// in a lookup response or data tile.
+//
+// The encoded form is the record ID as a single number,
+// then the text of the record, and then a terminating blank line.
+// Record text must be valid UTF-8 and must not contain any ASCII control
+// characters (those below U+0020) other than newline (U+000A).
+// It must end in a terminating newline and not contain any blank lines.
+func FormatRecord(id int64, text []byte) (msg []byte, err error) {
+       if !isValidRecordText(text) {
+               return nil, errMalformedRecord
+       }
+       msg = []byte(fmt.Sprintf("%d\n", id))
+       msg = append(msg, text...)
+       msg = append(msg, '\n')
+       return msg, nil
+}
+
+// isValidRecordText reports whether text is syntactically valid record text.
+func isValidRecordText(text []byte) bool {
+       var last rune
+       for i := 0; i < len(text); {
+               r, size := utf8.DecodeRune(text[i:])
+               if r < 0x20 && r != '\n' || r == utf8.RuneError && size == 1 || last == '\n' && r == '\n' {
+                       return false
+               }
+               i += size
+               last = r
+       }
+       if last != '\n' {
+               return false
+       }
+       return true
+}
+
+// ParseRecord parses a record description at the start of text,
+// stopping immediately after the terminating blank line.
+// It returns the record id, the record text, and the remainder of text.
+func ParseRecord(msg []byte) (id int64, text, rest []byte, err error) {
+       // Leading record id.
+       i := bytes.IndexByte(msg, '\n')
+       if i < 0 {
+               return 0, nil, nil, errMalformedRecord
+       }
+       id, err = strconv.ParseInt(string(msg[:i]), 10, 64)
+       if err != nil {
+               return 0, nil, nil, errMalformedRecord
+       }
+       msg = msg[i+1:]
+
+       // Record text.
+       i = bytes.Index(msg, []byte("\n\n"))
+       if i < 0 {
+               return 0, nil, nil, errMalformedRecord
+       }
+       text, rest = msg[:i+1], msg[i+2:]
+       if !isValidRecordText(text) {
+               return 0, nil, nil, errMalformedRecord
+       }
+       return id, text, rest, nil
+}
diff --git a/libgo/go/cmd/go/internal/tlog/note_test.go b/libgo/go/cmd/go/internal/tlog/note_test.go
new file mode 100644 (file)
index 0000000..a32d6d2
--- /dev/null
@@ -0,0 +1,117 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package tlog
+
+import (
+       "strings"
+       "testing"
+)
+
+func TestFormatTree(t *testing.T) {
+       n := int64(123456789012)
+       h := RecordHash([]byte("hello world"))
+       golden := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n"
+       b := FormatTree(Tree{n, h})
+       if string(b) != golden {
+               t.Errorf("FormatTree(...) = %q, want %q", b, golden)
+       }
+}
+
+func TestParseTree(t *testing.T) {
+       in := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n"
+       goldH := RecordHash([]byte("hello world"))
+       goldN := int64(123456789012)
+       tree, err := ParseTree([]byte(in))
+       if tree.N != goldN || tree.Hash != goldH || err != nil {
+               t.Fatalf("ParseTree(...) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", tree.N, tree.Hash, err, goldN, goldH)
+       }
+
+       // Check invalid trees.
+       var badTrees = []string{
+               "not-" + in,
+               "go.sum database tree\n0xabcdef\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n",
+               "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBTOOBIG=\n",
+       }
+       for _, bad := range badTrees {
+               _, err := ParseTree([]byte(bad))
+               if err == nil {
+                       t.Fatalf("ParseTree(%q) succeeded, want failure", in)
+               }
+       }
+
+       // Check junk on end is ignored.
+       var goodTrees = []string{
+               in + "JOE",
+               in + "JOE\n",
+               in + strings.Repeat("JOE\n", 1000),
+       }
+       for _, good := range goodTrees {
+               _, err := ParseTree([]byte(good))
+               if tree.N != goldN || tree.Hash != goldH || err != nil {
+                       t.Fatalf("ParseTree(...+%q) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", good[len(in):], tree.N, tree.Hash, err, goldN, goldH)
+               }
+       }
+}
+
+func TestFormatRecord(t *testing.T) {
+       id := int64(123456789012)
+       text := "hello, world\n"
+       golden := "123456789012\nhello, world\n\n"
+       msg, err := FormatRecord(id, []byte(text))
+       if err != nil {
+               t.Fatalf("FormatRecord: %v", err)
+       }
+       if string(msg) != golden {
+               t.Fatalf("FormatRecord(...) = %q, want %q", msg, golden)
+       }
+
+       var badTexts = []string{
+               "",
+               "hello\nworld",
+               "hello\n\nworld\n",
+               "hello\x01world\n",
+       }
+       for _, bad := range badTexts {
+               msg, err := FormatRecord(id, []byte(bad))
+               if err == nil {
+                       t.Errorf("FormatRecord(id, %q) = %q, want error", bad, msg)
+               }
+       }
+}
+
+func TestParseRecord(t *testing.T) {
+       in := "123456789012\nhello, world\n\njunk on end\x01\xff"
+       goldID := int64(123456789012)
+       goldText := "hello, world\n"
+       goldRest := "junk on end\x01\xff"
+       id, text, rest, err := ParseRecord([]byte(in))
+       if id != goldID || string(text) != goldText || string(rest) != goldRest || err != nil {
+               t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, goldRest)
+       }
+
+       in = "123456789012\nhello, world\n\n"
+       id, text, rest, err = ParseRecord([]byte(in))
+       if id != goldID || string(text) != goldText || len(rest) != 0 || err != nil {
+               t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, "")
+       }
+       if rest == nil {
+               t.Fatalf("ParseRecord(%q): rest = []byte(nil), want []byte{}", in)
+       }
+
+       // Check invalid records.
+       var badRecords = []string{
+               "not-" + in,
+               "123\nhello\x01world\n\n",
+               "123\nhello\xffworld\n\n",
+               "123\nhello world\n",
+               "0x123\nhello world\n\n",
+       }
+       for _, bad := range badRecords {
+               id, text, rest, err := ParseRecord([]byte(bad))
+               if err == nil {
+                       t.Fatalf("ParseRecord(%q) = %d, %q, %q, nil, want error", in, id, text, rest)
+               }
+       }
+}
diff --git a/libgo/go/cmd/go/internal/tlog/tile.go b/libgo/go/cmd/go/internal/tlog/tile.go
new file mode 100644 (file)
index 0000000..694d89c
--- /dev/null
@@ -0,0 +1,418 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package tlog
+
+import (
+       "fmt"
+       "strconv"
+       "strings"
+)
+
+// A Tile is a description of a transparency log tile.
+// A tile of height H at level L offset N lists W consecutive hashes
+// at level H*L of the tree starting at offset N*(2**H).
+// A complete tile lists 2**H hashes; a partial tile lists fewer.
+// Note that a tile represents the entire subtree of height H
+// with those hashes as the leaves. The levels above H*L
+// can be reconstructed by hashing the leaves.
+//
+// Each Tile can be encoded as a “tile coordinate path”
+// of the form tile/H/L/NNN[.p/W].
+// The .p/W suffix is present only for partial tiles, meaning W < 2**H.
+// The NNN element is an encoding of N into 3-digit path elements.
+// All but the last path element begins with an "x".
+// For example,
+// Tile{H: 3, L: 4, N: 1234067, W: 1}'s path
+// is tile/3/4/x001/x234/067.p/1, and
+// Tile{H: 3, L: 4, N: 1234067, W: 8}'s path
+// is tile/3/4/x001/x234/067.
+// See Tile's Path method and the ParseTilePath function.
+//
+// The special level L=-1 holds raw record data instead of hashes.
+// In this case, the level encodes into a tile path as the path element
+// "data" instead of "-1".
+type Tile struct {
+       H int   // height of tile (1 ≤ H ≤ 30)
+       L int   // level in tiling (-1 ≤ L ≤ 63)
+       N int64 // number within level (0 ≤ N, unbounded)
+       W int   // width of tile (1 ≤ W ≤ 2**H; 2**H is complete tile)
+}
+
+// TileForIndex returns the tile of height h ≥ 1
+// and least width storing the given hash storage index.
+func TileForIndex(h int, index int64) Tile {
+       if h < 1 {
+               panic("TileForIndex: invalid height")
+       }
+       t, _, _ := tileForIndex(h, index)
+       return t
+}
+
+// tileForIndex returns the tile of height h ≥ 1
+// storing the given hash index, which can be
+// reconstructed using tileHash(data[start:end]).
+func tileForIndex(h int, index int64) (t Tile, start, end int) {
+       level, n := SplitStoredHashIndex(index)
+       t.H = h
+       t.L = level / h
+       level -= t.L * h // now level within tile
+       t.N = n << uint(level) >> uint(t.H)
+       n -= t.N << uint(t.H) >> uint(level) // now n within tile at level
+       t.W = int((n + 1) << uint(level))
+       return t, int(n<<uint(level)) * HashSize, int((n+1)<<uint(level)) * HashSize
+}
+
+// HashFromTile returns the hash at the given storage index,
+// provided that t == TileForIndex(t.H, index) or a wider version,
+// and data is t's tile data (of length at least t.W*HashSize).
+func HashFromTile(t Tile, data []byte, index int64) (Hash, error) {
+       if t.H < 1 || t.H > 30 || t.L < 0 || t.L >= 64 || t.W < 1 || t.W > 1<<uint(t.H) {
+               return Hash{}, fmt.Errorf("invalid tile %v", t.Path())
+       }
+       if len(data) < t.W*HashSize {
+               return Hash{}, fmt.Errorf("data len %d too short for tile %v", len(data), t.Path())
+       }
+       t1, start, end := tileForIndex(t.H, index)
+       if t.L != t1.L || t.N != t1.N || t.W < t1.W {
+               return Hash{}, fmt.Errorf("index %v is in %v not %v", index, t1.Path(), t.Path())
+       }
+       return tileHash(data[start:end]), nil
+}
+
+// tileHash computes the subtree hash corresponding to the (2^K)-1 hashes in data.
+func tileHash(data []byte) Hash {
+       if len(data) == 0 {
+               panic("bad math in tileHash")
+       }
+       if len(data) == HashSize {
+               var h Hash
+               copy(h[:], data)
+               return h
+       }
+       n := len(data) / 2
+       return NodeHash(tileHash(data[:n]), tileHash(data[n:]))
+}
+
+// NewTiles returns the coordinates of the tiles of height h ≥ 1
+// that must be published when publishing from a tree of
+// size newTreeSize to replace a tree of size oldTreeSize.
+// (No tiles need to be published for a tree of size zero.)
+func NewTiles(h int, oldTreeSize, newTreeSize int64) []Tile {
+       if h < 1 {
+               panic(fmt.Sprintf("NewTiles: invalid height %d", h))
+       }
+       H := uint(h)
+       var tiles []Tile
+       for level := uint(0); newTreeSize>>(H*level) > 0; level++ {
+               oldN := oldTreeSize >> (H * level)
+               newN := newTreeSize >> (H * level)
+               for n := oldN >> H; n < newN>>H; n++ {
+                       tiles = append(tiles, Tile{H: h, L: int(level), N: n, W: 1 << H})
+               }
+               n := newN >> H
+               maxW := int(newN - n<<H)
+               minW := 1
+               if oldN > n<<H {
+                       minW = int(oldN - n<<H)
+               }
+               for w := minW; w <= maxW; w++ {
+                       tiles = append(tiles, Tile{H: h, L: int(level), N: n, W: w})
+               }
+       }
+       return tiles
+}
+
+// ReadTileData reads the hashes for tile t from r
+// and returns the corresponding tile data.
+func ReadTileData(t Tile, r HashReader) ([]byte, error) {
+       size := t.W
+       if size == 0 {
+               size = 1 << uint(t.H)
+       }
+       start := t.N << uint(t.H)
+       indexes := make([]int64, size)
+       for i := 0; i < size; i++ {
+               indexes[i] = StoredHashIndex(t.H*t.L, start+int64(i))
+       }
+
+       hashes, err := r.ReadHashes(indexes)
+       if err != nil {
+               return nil, err
+       }
+       if len(hashes) != len(indexes) {
+               return nil, fmt.Errorf("tlog: ReadHashes(%d indexes) = %d hashes", len(indexes), len(hashes))
+       }
+
+       tile := make([]byte, size*HashSize)
+       for i := 0; i < size; i++ {
+               copy(tile[i*HashSize:], hashes[i][:])
+       }
+       return tile, nil
+}
+
+// To limit the size of any particular directory listing,
+// we encode the (possibly very large) number N
+// by encoding three digits at a time.
+// For example, 123456789 encodes as x123/x456/789.
+// Each directory has at most 1000 each xNNN, NNN, and NNN.p children,
+// so there are at most 3000 entries in any one directory.
+const pathBase = 1000
+
+// Path returns a tile coordinate path describing t.
+func (t Tile) Path() string {
+       n := t.N
+       nStr := fmt.Sprintf("%03d", n%pathBase)
+       for n >= pathBase {
+               n /= pathBase
+               nStr = fmt.Sprintf("x%03d/%s", n%pathBase, nStr)
+       }
+       pStr := ""
+       if t.W != 1<<uint(t.H) {
+               pStr = fmt.Sprintf(".p/%d", t.W)
+       }
+       var L string
+       if t.L == -1 {
+               L = "data"
+       } else {
+               L = fmt.Sprintf("%d", t.L)
+       }
+       return fmt.Sprintf("tile/%d/%s/%s%s", t.H, L, nStr, pStr)
+}
+
+// ParseTilePath parses a tile coordinate path.
+func ParseTilePath(path string) (Tile, error) {
+       f := strings.Split(path, "/")
+       if len(f) < 4 || f[0] != "tile" {
+               return Tile{}, &badPathError{path}
+       }
+       h, err1 := strconv.Atoi(f[1])
+       isData := false
+       if f[2] == "data" {
+               isData = true
+               f[2] = "0"
+       }
+       l, err2 := strconv.Atoi(f[2])
+       if err1 != nil || err2 != nil || h < 1 || l < 0 || h > 30 {
+               return Tile{}, &badPathError{path}
+       }
+       w := 1 << uint(h)
+       if dotP := f[len(f)-2]; strings.HasSuffix(dotP, ".p") {
+               ww, err := strconv.Atoi(f[len(f)-1])
+               if err != nil || ww <= 0 || ww >= w {
+                       return Tile{}, &badPathError{path}
+               }
+               w = ww
+               f[len(f)-2] = dotP[:len(dotP)-len(".p")]
+               f = f[:len(f)-1]
+       }
+       f = f[3:]
+       n := int64(0)
+       for _, s := range f {
+               nn, err := strconv.Atoi(strings.TrimPrefix(s, "x"))
+               if err != nil || nn < 0 || nn >= pathBase {
+                       return Tile{}, &badPathError{path}
+               }
+               n = n*pathBase + int64(nn)
+       }
+       if isData {
+               l = -1
+       }
+       t := Tile{H: h, L: l, N: n, W: w}
+       if path != t.Path() {
+               return Tile{}, &badPathError{path}
+       }
+       return t, nil
+}
+
+type badPathError struct {
+       path string
+}
+
+func (e *badPathError) Error() string {
+       return fmt.Sprintf("malformed tile path %q", e.path)
+}
+
+// A TileReader reads tiles from a go.sum database log.
+type TileReader interface {
+       // Height returns the height of the available tiles.
+       Height() int
+
+       // ReadTiles returns the data for each requested tile.
+       // If ReadTiles returns err == nil, it must also return
+       // a data record for each tile (len(data) == len(tiles))
+       // and each data record must be the correct length
+       // (len(data[i]) == tiles[i].W*HashSize).
+       ReadTiles(tiles []Tile) (data [][]byte, err error)
+
+       // SaveTiles informs the TileReader that the tile data
+       // returned by ReadTiles has been confirmed as valid
+       // and can be saved in persistent storage (on disk).
+       SaveTiles(tiles []Tile, data [][]byte)
+}
+
+// TileHashReader returns a HashReader that satisfies requests
+// by loading tiles of the given tree.
+//
+// The returned HashReader checks that loaded tiles are
+// valid for the given tree. Therefore, any hashes returned
+// by the HashReader are already proven to be in the tree.
+func TileHashReader(tree Tree, tr TileReader) HashReader {
+       return &tileHashReader{tree: tree, tr: tr}
+}
+
+type tileHashReader struct {
+       tree Tree
+       tr   TileReader
+}
+
+// tileParent returns t's k'th tile parent in the tiles for a tree of size n.
+// If there is no such parent, tileParent returns Tile{}.
+func tileParent(t Tile, k int, n int64) Tile {
+       t.L += k
+       t.N >>= uint(k * t.H)
+       t.W = 1 << uint(t.H)
+       if max := n >> uint(t.L*t.H); t.N<<uint(t.H)+int64(t.W) >= max {
+               if t.N<<uint(t.H) >= max {
+                       return Tile{}
+               }
+               t.W = int(max - t.N<<uint(t.H))
+       }
+       return t
+}
+
+func (r *tileHashReader) ReadHashes(indexes []int64) ([]Hash, error) {
+       h := r.tr.Height()
+
+       tileOrder := make(map[Tile]int) // tileOrder[tileKey(tiles[i])] = i
+       var tiles []Tile
+
+       // Plan to fetch tiles necessary to recompute tree hash.
+       // If it matches, those tiles are authenticated.
+       stx := subTreeIndex(0, r.tree.N, nil)
+       stxTileOrder := make([]int, len(stx))
+       for i, x := range stx {
+               tile, _, _ := tileForIndex(h, x)
+               tile = tileParent(tile, 0, r.tree.N)
+               if j, ok := tileOrder[tile]; ok {
+                       stxTileOrder[i] = j
+                       continue
+               }
+               stxTileOrder[i] = len(tiles)
+               tileOrder[tile] = len(tiles)
+               tiles = append(tiles, tile)
+       }
+
+       // Plan to fetch tiles containing the indexes,
+       // along with any parent tiles needed
+       // for authentication. For most calls,
+       // the parents are being fetched anyway.
+       indexTileOrder := make([]int, len(indexes))
+       for i, x := range indexes {
+               if x >= StoredHashIndex(0, r.tree.N) {
+                       return nil, fmt.Errorf("indexes not in tree")
+               }
+
+               tile, _, _ := tileForIndex(h, x)
+
+               // Walk up parent tiles until we find one we've requested.
+               // That one will be authenticated.
+               k := 0
+               for ; ; k++ {
+                       p := tileParent(tile, k, r.tree.N)
+                       if j, ok := tileOrder[p]; ok {
+                               if k == 0 {
+                                       indexTileOrder[i] = j
+                               }
+                               break
+                       }
+               }
+
+               // Walk back down recording child tiles after parents.
+               // This loop ends by revisiting the tile for this index
+               // (tileParent(tile, 0, r.tree.N)) unless k == 0, in which
+               // case the previous loop did it.
+               for k--; k >= 0; k-- {
+                       p := tileParent(tile, k, r.tree.N)
+                       if p.W != 1<<uint(p.H) {
+                               // Only full tiles have parents.
+                               // This tile has a parent, so it must be full.
+                               return nil, fmt.Errorf("bad math in tileHashReader: %d %d %v", r.tree.N, x, p)
+                       }
+                       tileOrder[p] = len(tiles)
+                       if k == 0 {
+                               indexTileOrder[i] = len(tiles)
+                       }
+                       tiles = append(tiles, p)
+               }
+       }
+
+       // Fetch all the tile data.
+       data, err := r.tr.ReadTiles(tiles)
+       if err != nil {
+               return nil, err
+       }
+       if len(data) != len(tiles) {
+               return nil, fmt.Errorf("TileReader returned bad result slice (len=%d, want %d)", len(data), len(tiles))
+       }
+       for i, tile := range tiles {
+               if len(data[i]) != tile.W*HashSize {
+                       return nil, fmt.Errorf("TileReader returned bad result slice (%v len=%d, want %d)", tile.Path(), len(data[i]), tile.W*HashSize)
+               }
+       }
+
+       // Authenticate the initial tiles against the tree hash.
+       // They are arranged so that parents are authenticated before children.
+       // First the tiles needed for the tree hash.
+       th, err := HashFromTile(tiles[stxTileOrder[len(stx)-1]], data[stxTileOrder[len(stx)-1]], stx[len(stx)-1])
+       if err != nil {
+               return nil, err
+       }
+       for i := len(stx) - 2; i >= 0; i-- {
+               h, err := HashFromTile(tiles[stxTileOrder[i]], data[stxTileOrder[i]], stx[i])
+               if err != nil {
+                       return nil, err
+               }
+               th = NodeHash(h, th)
+       }
+       if th != r.tree.Hash {
+               // The tiles do not support the tree hash.
+               // We know at least one is wrong, but not which one.
+               return nil, fmt.Errorf("downloaded inconsistent tile")
+       }
+
+       // Authenticate full tiles against their parents.
+       for i := len(stx); i < len(tiles); i++ {
+               tile := tiles[i]
+               p := tileParent(tile, 1, r.tree.N)
+               j, ok := tileOrder[p]
+               if !ok {
+                       return nil, fmt.Errorf("bad math in tileHashReader %d %v: lost parent of %v", r.tree.N, indexes, tile)
+               }
+               h, err := HashFromTile(p, data[j], StoredHashIndex(p.L*p.H, tile.N))
+               if err != nil {
+                       return nil, fmt.Errorf("bad math in tileHashReader %d %v: lost hash of %v: %v", r.tree.N, indexes, tile, err)
+               }
+               if h != tileHash(data[i]) {
+                       return nil, fmt.Errorf("downloaded inconsistent tile")
+               }
+       }
+
+       // Now we have all the tiles needed for the requested hashes,
+       // and we've authenticated the full tile set against the trusted tree hash.
+       r.tr.SaveTiles(tiles, data)
+
+       // Pull out the requested hashes.
+       hashes := make([]Hash, len(indexes))
+       for i, x := range indexes {
+               j := indexTileOrder[i]
+               h, err := HashFromTile(tiles[j], data[j], x)
+               if err != nil {
+                       return nil, fmt.Errorf("bad math in tileHashReader %d %v: lost hash %v: %v", r.tree.N, indexes, x, err)
+               }
+               hashes[i] = h
+       }
+
+       return hashes, nil
+}
diff --git a/libgo/go/cmd/go/internal/tlog/tlog.go b/libgo/go/cmd/go/internal/tlog/tlog.go
new file mode 100644 (file)
index 0000000..6703656
--- /dev/null
@@ -0,0 +1,601 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package tlog implements a tamper-evident log
+// used in the Go module go.sum database server.
+//
+// This package is part of a DRAFT of what the go.sum database server will look like.
+// Do not assume the details here are final!
+//
+// This package follows the design of Certificate Transparency (RFC 6962)
+// and its proofs are compatible with that system.
+// See TestCertificateTransparency.
+//
+package tlog
+
+import (
+       "crypto/sha256"
+       "encoding/base64"
+       "errors"
+       "fmt"
+       "math/bits"
+)
+
+// A Hash is a hash identifying a log record or tree root.
+type Hash [HashSize]byte
+
+// HashSize is the size of a Hash in bytes.
+const HashSize = 32
+
+// String returns a base64 representation of the hash for printing.
+func (h Hash) String() string {
+       return base64.StdEncoding.EncodeToString(h[:])
+}
+
+// MarshalJSON marshals the hash as a JSON string containing the base64-encoded hash.
+func (h Hash) MarshalJSON() ([]byte, error) {
+       return []byte(`"` + h.String() + `"`), nil
+}
+
+// UnmarshalJSON unmarshals a hash from JSON string containing the a base64-encoded hash.
+func (h *Hash) UnmarshalJSON(data []byte) error {
+       if len(data) != 1+44+1 || data[0] != '"' || data[len(data)-2] != '=' || data[len(data)-1] != '"' {
+               return errors.New("cannot decode hash")
+       }
+
+       // As of Go 1.12, base64.StdEncoding.Decode insists on
+       // slicing into target[33:] even when it only writes 32 bytes.
+       // Since we already checked that the hash ends in = above,
+       // we can use base64.RawStdEncoding with the = removed;
+       // RawStdEncoding does not exhibit the same bug.
+       // We decode into a temporary to avoid writing anything to *h
+       // unless the entire input is well-formed.
+       var tmp Hash
+       n, err := base64.RawStdEncoding.Decode(tmp[:], data[1:len(data)-2])
+       if err != nil || n != HashSize {
+               return errors.New("cannot decode hash")
+       }
+       *h = tmp
+       return nil
+}
+
+// ParseHash parses the base64-encoded string form of a hash.
+func ParseHash(s string) (Hash, error) {
+       data, err := base64.StdEncoding.DecodeString(s)
+       if err != nil || len(data) != HashSize {
+               return Hash{}, fmt.Errorf("malformed hash")
+       }
+       var h Hash
+       copy(h[:], data)
+       return h, nil
+}
+
+// maxpow2 returns k, the maximum power of 2 smaller than n,
+// as well as l = log₂ k (so k = 1<<l).
+func maxpow2(n int64) (k int64, l int) {
+       l = 0
+       for 1<<uint(l+1) < n {
+               l++
+       }
+       return 1 << uint(l), l
+}
+
+var zeroPrefix = []byte{0x00}
+
+// RecordHash returns the content hash for the given record data.
+func RecordHash(data []byte) Hash {
+       // SHA256(0x00 || data)
+       // https://tools.ietf.org/html/rfc6962#section-2.1
+       h := sha256.New()
+       h.Write(zeroPrefix)
+       h.Write(data)
+       var h1 Hash
+       h.Sum(h1[:0])
+       return h1
+}
+
+// NodeHash returns the hash for an interior tree node with the given left and right hashes.
+func NodeHash(left, right Hash) Hash {
+       // SHA256(0x01 || left || right)
+       // https://tools.ietf.org/html/rfc6962#section-2.1
+       // We use a stack buffer to assemble the hash input
+       // to avoid allocating a hash struct with sha256.New.
+       var buf [1 + HashSize + HashSize]byte
+       buf[0] = 0x01
+       copy(buf[1:], left[:])
+       copy(buf[1+HashSize:], right[:])
+       return sha256.Sum256(buf[:])
+}
+
+// For information about the stored hash index ordering,
+// see section 3.3 of Crosby and Wallach's paper
+// "Efficient Data Structures for Tamper-Evident Logging".
+// https://www.usenix.org/legacy/event/sec09/tech/full_papers/crosby.pdf
+
+// StoredHashIndex maps the tree coordinates (level, n)
+// to a dense linear ordering that can be used for hash storage.
+// Hash storage implementations that store hashes in sequential
+// storage can use this function to compute where to read or write
+// a given hash.
+func StoredHashIndex(level int, n int64) int64 {
+       // Level L's n'th hash is written right after level L+1's 2n+1'th hash.
+       // Work our way down to the level 0 ordering.
+       // We'll add back the orignal level count at the end.
+       for l := level; l > 0; l-- {
+               n = 2*n + 1
+       }
+
+       // Level 0's n'th hash is written at n+n/2+n/4+... (eventually n/2ⁱ hits zero).
+       i := int64(0)
+       for ; n > 0; n >>= 1 {
+               i += n
+       }
+
+       return i + int64(level)
+}
+
+// SplitStoredHashIndex is the inverse of StoredHashIndex.
+// That is, SplitStoredHashIndex(StoredHashIndex(level, n)) == level, n.
+func SplitStoredHashIndex(index int64) (level int, n int64) {
+       // Determine level 0 record before index.
+       // StoredHashIndex(0, n) < 2*n,
+       // so the n we want is in [index/2, index/2+log₂(index)].
+       n = index / 2
+       indexN := StoredHashIndex(0, n)
+       if indexN > index {
+               panic("bad math")
+       }
+       for {
+               // Each new record n adds 1 + trailingZeros(n) hashes.
+               x := indexN + 1 + int64(bits.TrailingZeros64(uint64(n+1)))
+               if x > index {
+                       break
+               }
+               n++
+               indexN = x
+       }
+       // The hash we want was commited with record n,
+       // meaning it is one of (0, n), (1, n/2), (2, n/4), ...
+       level = int(index - indexN)
+       return level, n >> uint(level)
+}
+
+// StoredHashCount returns the number of stored hashes
+// that are expected for a tree with n records.
+func StoredHashCount(n int64) int64 {
+       if n == 0 {
+               return 0
+       }
+       // The tree will have the hashes up to the last leaf hash.
+       numHash := StoredHashIndex(0, n-1) + 1
+       // And it will have any hashes for subtrees completed by that leaf.
+       for i := uint64(n - 1); i&1 != 0; i >>= 1 {
+               numHash++
+       }
+       return numHash
+}
+
+// StoredHashes returns the hashes that must be stored when writing
+// record n with the given data. The hashes should be stored starting
+// at StoredHashIndex(0, n). The result will have at most 1 + log₂ n hashes,
+// but it will average just under two per call for a sequence of calls for n=1..k.
+//
+// StoredHashes may read up to log n earlier hashes from r
+// in order to compute hashes for completed subtrees.
+func StoredHashes(n int64, data []byte, r HashReader) ([]Hash, error) {
+       return StoredHashesForRecordHash(n, RecordHash(data), r)
+}
+
+// StoredHashesForRecordHash is like StoredHashes but takes
+// as its second argument RecordHash(data) instead of data itself.
+func StoredHashesForRecordHash(n int64, h Hash, r HashReader) ([]Hash, error) {
+       // Start with the record hash.
+       hashes := []Hash{h}
+
+       // Build list of indexes needed for hashes for completed subtrees.
+       // Each trailing 1 bit in the binary representation of n completes a subtree
+       // and consumes a hash from an adjacent subtree.
+       m := int(bits.TrailingZeros64(uint64(n + 1)))
+       indexes := make([]int64, m)
+       for i := 0; i < m; i++ {
+               // We arrange indexes in sorted order.
+               // Note that n>>i is always odd.
+               indexes[m-1-i] = StoredHashIndex(i, n>>uint(i)-1)
+       }
+
+       // Fetch hashes.
+       old, err := r.ReadHashes(indexes)
+       if err != nil {
+               return nil, err
+       }
+       if len(old) != len(indexes) {
+               return nil, fmt.Errorf("tlog: ReadHashes(%d indexes) = %d hashes", len(indexes), len(old))
+       }
+
+       // Build new hashes.
+       for i := 0; i < m; i++ {
+               h = NodeHash(old[m-1-i], h)
+               hashes = append(hashes, h)
+       }
+       return hashes, nil
+}
+
+// A HashReader can read hashes for nodes in the log's tree structure.
+type HashReader interface {
+       // ReadHashes returns the hashes with the given stored hash indexes
+       // (see StoredHashIndex and SplitStoredHashIndex).
+       // ReadHashes must return a slice of hashes the same length as indexes,
+       // or else it must return a non-nil error.
+       // ReadHashes may run faster if indexes is sorted in increasing order.
+       ReadHashes(indexes []int64) ([]Hash, error)
+}
+
+// A HashReaderFunc is a function implementing HashReader.
+type HashReaderFunc func([]int64) ([]Hash, error)
+
+func (f HashReaderFunc) ReadHashes(indexes []int64) ([]Hash, error) {
+       return f(indexes)
+}
+
+// TreeHash computes the hash for the root of the tree with n records,
+// using the HashReader to obtain previously stored hashes
+// (those returned by StoredHashes during the writes of those n records).
+// TreeHash makes a single call to ReadHash requesting at most 1 + log₂ n hashes.
+// The tree of size zero is defined to have an all-zero Hash.
+func TreeHash(n int64, r HashReader) (Hash, error) {
+       if n == 0 {
+               return Hash{}, nil
+       }
+       indexes := subTreeIndex(0, n, nil)
+       hashes, err := r.ReadHashes(indexes)
+       if err != nil {
+               return Hash{}, err
+       }
+       if len(hashes) != len(indexes) {
+               return Hash{}, fmt.Errorf("tlog: ReadHashes(%d indexes) = %d hashes", len(indexes), len(hashes))
+       }
+       hash, hashes := subTreeHash(0, n, hashes)
+       if len(hashes) != 0 {
+               panic("tlog: bad index math in TreeHash")
+       }
+       return hash, nil
+}
+
+// subTreeIndex returns the storage indexes needed to compute
+// the hash for the subtree containing records [lo, hi),
+// appending them to need and returning the result.
+// See https://tools.ietf.org/html/rfc6962#section-2.1
+func subTreeIndex(lo, hi int64, need []int64) []int64 {
+       // See subTreeHash below for commentary.
+       for lo < hi {
+               k, level := maxpow2(hi - lo + 1)
+               if lo&(k-1) != 0 {
+                       panic("tlog: bad math in subTreeIndex")
+               }
+               need = append(need, StoredHashIndex(level, lo>>uint(level)))
+               lo += k
+       }
+       return need
+}
+
+// subTreeHash computes the hash for the subtree containing records [lo, hi),
+// assuming that hashes are the hashes corresponding to the indexes
+// returned by subTreeIndex(lo, hi).
+// It returns any leftover hashes.
+func subTreeHash(lo, hi int64, hashes []Hash) (Hash, []Hash) {
+       // Repeatedly partition the tree into a left side with 2^level nodes,
+       // for as large a level as possible, and a right side with the fringe.
+       // The left hash is stored directly and can be read from storage.
+       // The right side needs further computation.
+       numTree := 0
+       for lo < hi {
+               k, _ := maxpow2(hi - lo + 1)
+               if lo&(k-1) != 0 || lo >= hi {
+                       panic("tlog: bad math in subTreeHash")
+               }
+               numTree++
+               lo += k
+       }
+
+       if len(hashes) < numTree {
+               panic("tlog: bad index math in subTreeHash")
+       }
+
+       // Reconstruct hash.
+       h := hashes[numTree-1]
+       for i := numTree - 2; i >= 0; i-- {
+               h = NodeHash(hashes[i], h)
+       }
+       return h, hashes[numTree:]
+}
+
+// A RecordProof is a verifiable proof that a particular log root contains a particular record.
+// RFC 6962 calls this a “Merkle audit path.”
+type RecordProof []Hash
+
+// ProveRecord returns the proof that the tree of size t contains the record with index n.
+func ProveRecord(t, n int64, r HashReader) (RecordProof, error) {
+       if t < 0 || n < 0 || n >= t {
+               return nil, fmt.Errorf("tlog: invalid inputs in ProveRecord")
+       }
+       indexes := leafProofIndex(0, t, n, nil)
+       if len(indexes) == 0 {
+               return RecordProof{}, nil
+       }
+       hashes, err := r.ReadHashes(indexes)
+       if err != nil {
+               return nil, err
+       }
+       if len(hashes) != len(indexes) {
+               return nil, fmt.Errorf("tlog: ReadHashes(%d indexes) = %d hashes", len(indexes), len(hashes))
+       }
+
+       p, hashes := leafProof(0, t, n, hashes)
+       if len(hashes) != 0 {
+               panic("tlog: bad index math in ProveRecord")
+       }
+       return p, nil
+}
+
+// leafProofIndex builds the list of indexes needed to construct the proof
+// that leaf n is contained in the subtree with leaves [lo, hi).
+// It appends those indexes to need and returns the result.
+// See https://tools.ietf.org/html/rfc6962#section-2.1.1
+func leafProofIndex(lo, hi, n int64, need []int64) []int64 {
+       // See leafProof below for commentary.
+       if !(lo <= n && n < hi) {
+               panic("tlog: bad math in leafProofIndex")
+       }
+       if lo+1 == hi {
+               return need
+       }
+       if k, _ := maxpow2(hi - lo); n < lo+k {
+               need = leafProofIndex(lo, lo+k, n, need)
+               need = subTreeIndex(lo+k, hi, need)
+       } else {
+               need = subTreeIndex(lo, lo+k, need)
+               need = leafProofIndex(lo+k, hi, n, need)
+       }
+       return need
+}
+
+// leafProof constructs the proof that leaf n is contained in the subtree with leaves [lo, hi).
+// It returns any leftover hashes as well.
+// See https://tools.ietf.org/html/rfc6962#section-2.1.1
+func leafProof(lo, hi, n int64, hashes []Hash) (RecordProof, []Hash) {
+       // We must have lo <= n < hi or else the code here has a bug.
+       if !(lo <= n && n < hi) {
+               panic("tlog: bad math in leafProof")
+       }
+
+       if lo+1 == hi { // n == lo
+               // Reached the leaf node.
+               // The verifier knows what the leaf hash is, so we don't need to send it.
+               return RecordProof{}, hashes
+       }
+
+       // Walk down the tree toward n.
+       // Record the hash of the path not taken (needed for verifying the proof).
+       var p RecordProof
+       var th Hash
+       if k, _ := maxpow2(hi - lo); n < lo+k {
+               // n is on left side
+               p, hashes = leafProof(lo, lo+k, n, hashes)
+               th, hashes = subTreeHash(lo+k, hi, hashes)
+       } else {
+               // n is on right side
+               th, hashes = subTreeHash(lo, lo+k, hashes)
+               p, hashes = leafProof(lo+k, hi, n, hashes)
+       }
+       return append(p, th), hashes
+}
+
+var errProofFailed = errors.New("invalid transparency proof")
+
+// CheckRecord verifies that p is a valid proof that the tree of size t
+// with hash th has an n'th record with hash h.
+func CheckRecord(p RecordProof, t int64, th Hash, n int64, h Hash) error {
+       if t < 0 || n < 0 || n >= t {
+               return fmt.Errorf("tlog: invalid inputs in CheckRecord")
+       }
+       th2, err := runRecordProof(p, 0, t, n, h)
+       if err != nil {
+               return err
+       }
+       if th2 == th {
+               return nil
+       }
+       return errProofFailed
+}
+
+// runRecordProof runs the proof p that leaf n is contained in the subtree with leaves [lo, hi).
+// Running the proof means constructing and returning the implied hash of that
+// subtree.
+func runRecordProof(p RecordProof, lo, hi, n int64, leafHash Hash) (Hash, error) {
+       // We must have lo <= n < hi or else the code here has a bug.
+       if !(lo <= n && n < hi) {
+               panic("tlog: bad math in runRecordProof")
+       }
+
+       if lo+1 == hi { // m == lo
+               // Reached the leaf node.
+               // The proof must not have any unnecessary hashes.
+               if len(p) != 0 {
+                       return Hash{}, errProofFailed
+               }
+               return leafHash, nil
+       }
+
+       if len(p) == 0 {
+               return Hash{}, errProofFailed
+       }
+
+       k, _ := maxpow2(hi - lo)
+       if n < lo+k {
+               th, err := runRecordProof(p[:len(p)-1], lo, lo+k, n, leafHash)
+               if err != nil {
+                       return Hash{}, err
+               }
+               return NodeHash(th, p[len(p)-1]), nil
+       } else {
+               th, err := runRecordProof(p[:len(p)-1], lo+k, hi, n, leafHash)
+               if err != nil {
+                       return Hash{}, err
+               }
+               return NodeHash(p[len(p)-1], th), nil
+       }
+}
+
+// A TreeProof is a verifiable proof that a particular log tree contains
+// as a prefix all records present in an earlier tree.
+// RFC 6962 calls this a “Merkle consistency proof.”
+type TreeProof []Hash
+
+// ProveTree returns the proof that the tree of size t contains
+// as a prefix all the records from the tree of smaller size n.
+func ProveTree(t, n int64, h HashReader) (TreeProof, error) {
+       if t < 1 || n < 1 || n > t {
+               return nil, fmt.Errorf("tlog: invalid inputs in ProveTree")
+       }
+       indexes := treeProofIndex(0, t, n, nil)
+       if len(indexes) == 0 {
+               return TreeProof{}, nil
+       }
+       hashes, err := h.ReadHashes(indexes)
+       if err != nil {
+               return nil, err
+       }
+       if len(hashes) != len(indexes) {
+               return nil, fmt.Errorf("tlog: ReadHashes(%d indexes) = %d hashes", len(indexes), len(hashes))
+       }
+
+       p, hashes := treeProof(0, t, n, hashes)
+       if len(hashes) != 0 {
+               panic("tlog: bad index math in ProveTree")
+       }
+       return p, nil
+}
+
+// treeProofIndex builds the list of indexes needed to construct
+// the sub-proof related to the subtree containing records [lo, hi).
+// See https://tools.ietf.org/html/rfc6962#section-2.1.2.
+func treeProofIndex(lo, hi, n int64, need []int64) []int64 {
+       // See treeProof below for commentary.
+       if !(lo < n && n <= hi) {
+               panic("tlog: bad math in treeProofIndex")
+       }
+
+       if n == hi {
+               if lo == 0 {
+                       return need
+               }
+               return subTreeIndex(lo, hi, need)
+       }
+
+       if k, _ := maxpow2(hi - lo); n <= lo+k {
+               need = treeProofIndex(lo, lo+k, n, need)
+               need = subTreeIndex(lo+k, hi, need)
+       } else {
+               need = subTreeIndex(lo, lo+k, need)
+               need = treeProofIndex(lo+k, hi, n, need)
+       }
+       return need
+}
+
+// treeProof constructs the sub-proof related to the subtree containing records [lo, hi).
+// It returns any leftover hashes as well.
+// See https://tools.ietf.org/html/rfc6962#section-2.1.2.
+func treeProof(lo, hi, n int64, hashes []Hash) (TreeProof, []Hash) {
+       // We must have lo < n <= hi or else the code here has a bug.
+       if !(lo < n && n <= hi) {
+               panic("tlog: bad math in treeProof")
+       }
+
+       // Reached common ground.
+       if n == hi {
+               if lo == 0 {
+                       // This subtree corresponds exactly to the old tree.
+                       // The verifier knows that hash, so we don't need to send it.
+                       return TreeProof{}, hashes
+               }
+               th, hashes := subTreeHash(lo, hi, hashes)
+               return TreeProof{th}, hashes
+       }
+
+       // Interior node for the proof.
+       // Decide whether to walk down the left or right side.
+       var p TreeProof
+       var th Hash
+       if k, _ := maxpow2(hi - lo); n <= lo+k {
+               // m is on left side
+               p, hashes = treeProof(lo, lo+k, n, hashes)
+               th, hashes = subTreeHash(lo+k, hi, hashes)
+       } else {
+               // m is on right side
+               th, hashes = subTreeHash(lo, lo+k, hashes)
+               p, hashes = treeProof(lo+k, hi, n, hashes)
+       }
+       return append(p, th), hashes
+}
+
+// CheckTree verifies that p is a valid proof that the tree of size t with hash th
+// contains as a prefix the tree of size n with hash h.
+func CheckTree(p TreeProof, t int64, th Hash, n int64, h Hash) error {
+       if t < 1 || n < 1 || n > t {
+               return fmt.Errorf("tlog: invalid inputs in CheckTree")
+       }
+       h2, th2, err := runTreeProof(p, 0, t, n, h)
+       if err != nil {
+               return err
+       }
+       if th2 == th && h2 == h {
+               return nil
+       }
+       return errProofFailed
+}
+
+// runTreeProof runs the sub-proof p related to the subtree containing records [lo, hi),
+// where old is the hash of the old tree with n records.
+// Running the proof means constructing and returning the implied hashes of that
+// subtree in both the old and new tree.
+func runTreeProof(p TreeProof, lo, hi, n int64, old Hash) (Hash, Hash, error) {
+       // We must have lo < n <= hi or else the code here has a bug.
+       if !(lo < n && n <= hi) {
+               panic("tlog: bad math in runTreeProof")
+       }
+
+       // Reached common ground.
+       if n == hi {
+               if lo == 0 {
+                       if len(p) != 0 {
+                               return Hash{}, Hash{}, errProofFailed
+                       }
+                       return old, old, nil
+               }
+               if len(p) != 1 {
+                       return Hash{}, Hash{}, errProofFailed
+               }
+               return p[0], p[0], nil
+       }
+
+       if len(p) == 0 {
+               return Hash{}, Hash{}, errProofFailed
+       }
+
+       // Interior node for the proof.
+       k, _ := maxpow2(hi - lo)
+       if n <= lo+k {
+               oh, th, err := runTreeProof(p[:len(p)-1], lo, lo+k, n, old)
+               if err != nil {
+                       return Hash{}, Hash{}, err
+               }
+               return oh, NodeHash(th, p[len(p)-1]), nil
+       } else {
+               oh, th, err := runTreeProof(p[:len(p)-1], lo+k, hi, n, old)
+               if err != nil {
+                       return Hash{}, Hash{}, err
+               }
+               return NodeHash(p[len(p)-1], oh), NodeHash(p[len(p)-1], th), nil
+       }
+}
diff --git a/libgo/go/cmd/go/internal/tlog/tlog_test.go b/libgo/go/cmd/go/internal/tlog/tlog_test.go
new file mode 100644 (file)
index 0000000..584e728
--- /dev/null
@@ -0,0 +1,269 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package tlog
+
+import (
+       "bytes"
+       "fmt"
+       "testing"
+)
+
+type testHashStorage []Hash
+
+func (t testHashStorage) ReadHash(level int, n int64) (Hash, error) {
+       return t[StoredHashIndex(level, n)], nil
+}
+
+func (t testHashStorage) ReadHashes(index []int64) ([]Hash, error) {
+       // It's not required by HashReader that indexes be in increasing order,
+       // but check that the functions we are testing only ever ask for
+       // indexes in increasing order.
+       for i := 1; i < len(index); i++ {
+               if index[i-1] >= index[i] {
+                       panic("indexes out of order")
+               }
+       }
+
+       out := make([]Hash, len(index))
+       for i, x := range index {
+               out[i] = t[x]
+       }
+       return out, nil
+}
+
+type testTilesStorage struct {
+       unsaved int
+       m       map[Tile][]byte
+}
+
+func (t testTilesStorage) Height() int {
+       return 2
+}
+
+func (t *testTilesStorage) SaveTiles(tiles []Tile, data [][]byte) {
+       t.unsaved -= len(tiles)
+}
+
+func (t *testTilesStorage) ReadTiles(tiles []Tile) ([][]byte, error) {
+       out := make([][]byte, len(tiles))
+       for i, tile := range tiles {
+               out[i] = t.m[tile]
+       }
+       t.unsaved += len(tiles)
+       return out, nil
+}
+
+func TestTree(t *testing.T) {
+       var trees []Hash
+       var leafhashes []Hash
+       var storage testHashStorage
+       tiles := make(map[Tile][]byte)
+       const testH = 2
+       for i := int64(0); i < 100; i++ {
+               data := []byte(fmt.Sprintf("leaf %d", i))
+               hashes, err := StoredHashes(i, data, storage)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               leafhashes = append(leafhashes, RecordHash(data))
+               oldStorage := len(storage)
+               storage = append(storage, hashes...)
+               if count := StoredHashCount(i + 1); count != int64(len(storage)) {
+                       t.Errorf("StoredHashCount(%d) = %d, have %d StoredHashes", i+1, count, len(storage))
+               }
+               th, err := TreeHash(i+1, storage)
+               if err != nil {
+                       t.Fatal(err)
+               }
+
+               for _, tile := range NewTiles(testH, i, i+1) {
+                       data, err := ReadTileData(tile, storage)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       old := Tile{H: tile.H, L: tile.L, N: tile.N, W: tile.W - 1}
+                       oldData := tiles[old]
+                       if len(oldData) != len(data)-HashSize || !bytes.Equal(oldData, data[:len(oldData)]) {
+                               t.Fatalf("tile %v not extending earlier tile %v", tile.Path(), old.Path())
+                       }
+                       tiles[tile] = data
+               }
+               for _, tile := range NewTiles(testH, 0, i+1) {
+                       data, err := ReadTileData(tile, storage)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       if !bytes.Equal(tiles[tile], data) {
+                               t.Fatalf("mismatch at %+v", tile)
+                       }
+               }
+               for _, tile := range NewTiles(testH, i/2, i+1) {
+                       data, err := ReadTileData(tile, storage)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       if !bytes.Equal(tiles[tile], data) {
+                               t.Fatalf("mismatch at %+v", tile)
+                       }
+               }
+
+               // Check that all the new hashes are readable from their tiles.
+               for j := oldStorage; j < len(storage); j++ {
+                       tile := TileForIndex(testH, int64(j))
+                       data, ok := tiles[tile]
+                       if !ok {
+                               t.Log(NewTiles(testH, 0, i+1))
+                               t.Fatalf("TileForIndex(%d, %d) = %v, not yet stored (i=%d, stored %d)", testH, j, tile.Path(), i, len(storage))
+                               continue
+                       }
+                       h, err := HashFromTile(tile, data, int64(j))
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       if h != storage[j] {
+                               t.Errorf("HashFromTile(%v, %d) = %v, want %v", tile.Path(), int64(j), h, storage[j])
+                       }
+               }
+
+               trees = append(trees, th)
+
+               // Check that leaf proofs work, for all trees and leaves so far.
+               for j := int64(0); j <= i; j++ {
+                       p, err := ProveRecord(i+1, j, storage)
+                       if err != nil {
+                               t.Fatalf("ProveRecord(%d, %d): %v", i+1, j, err)
+                       }
+                       if err := CheckRecord(p, i+1, th, j, leafhashes[j]); err != nil {
+                               t.Fatalf("CheckRecord(%d, %d): %v", i+1, j, err)
+                       }
+                       for k := range p {
+                               p[k][0] ^= 1
+                               if err := CheckRecord(p, i+1, th, j, leafhashes[j]); err == nil {
+                                       t.Fatalf("CheckRecord(%d, %d) succeeded with corrupt proof hash #%d!", i+1, j, k)
+                               }
+                               p[k][0] ^= 1
+                       }
+               }
+
+               // Check that leaf proofs work using TileReader.
+               // To prove a leaf that way, all you have to do is read and verify its hash.
+               storage := &testTilesStorage{m: tiles}
+               thr := TileHashReader(Tree{i + 1, th}, storage)
+               for j := int64(0); j <= i; j++ {
+                       h, err := thr.ReadHashes([]int64{StoredHashIndex(0, j)})
+                       if err != nil {
+                               t.Fatalf("TileHashReader(%d).ReadHashes(%d): %v", i+1, j, err)
+                       }
+                       if h[0] != leafhashes[j] {
+                               t.Fatalf("TileHashReader(%d).ReadHashes(%d) returned wrong hash", i+1, j)
+                       }
+
+                       // Even though reading the hash suffices,
+                       // check we can generate the proof too.
+                       p, err := ProveRecord(i+1, j, thr)
+                       if err != nil {
+                               t.Fatalf("ProveRecord(%d, %d, TileHashReader(%d)): %v", i+1, j, i+1, err)
+                       }
+                       if err := CheckRecord(p, i+1, th, j, leafhashes[j]); err != nil {
+                               t.Fatalf("CheckRecord(%d, %d, TileHashReader(%d)): %v", i+1, j, i+1, err)
+                       }
+               }
+               if storage.unsaved != 0 {
+                       t.Fatalf("TileHashReader(%d) did not save %d tiles", i+1, storage.unsaved)
+               }
+
+               // Check that ReadHashes will give an error if the index is not in the tree.
+               if _, err := thr.ReadHashes([]int64{(i + 1) * 2}); err == nil {
+                       t.Fatalf("TileHashReader(%d).ReadHashes(%d) for index not in tree <nil>, want err", i, i+1)
+               }
+               if storage.unsaved != 0 {
+                       t.Fatalf("TileHashReader(%d) did not save %d tiles", i+1, storage.unsaved)
+               }
+
+               // Check that tree proofs work, for all trees so far, using TileReader.
+               // To prove a tree that way, all you have to do is compute and verify its hash.
+               for j := int64(0); j <= i; j++ {
+                       h, err := TreeHash(j+1, thr)
+                       if err != nil {
+                               t.Fatalf("TreeHash(%d, TileHashReader(%d)): %v", j, i+1, err)
+                       }
+                       if h != trees[j] {
+                               t.Fatalf("TreeHash(%d, TileHashReader(%d)) = %x, want %x (%v)", j, i+1, h[:], trees[j][:], trees[j])
+                       }
+
+                       // Even though computing the subtree hash suffices,
+                       // check that we can generate the proof too.
+                       p, err := ProveTree(i+1, j+1, thr)
+                       if err != nil {
+                               t.Fatalf("ProveTree(%d, %d): %v", i+1, j+1, err)
+                       }
+                       if err := CheckTree(p, i+1, th, j+1, trees[j]); err != nil {
+                               t.Fatalf("CheckTree(%d, %d): %v [%v]", i+1, j+1, err, p)
+                       }
+                       for k := range p {
+                               p[k][0] ^= 1
+                               if err := CheckTree(p, i+1, th, j+1, trees[j]); err == nil {
+                                       t.Fatalf("CheckTree(%d, %d) succeeded with corrupt proof hash #%d!", i+1, j+1, k)
+                               }
+                               p[k][0] ^= 1
+                       }
+               }
+               if storage.unsaved != 0 {
+                       t.Fatalf("TileHashReader(%d) did not save %d tiles", i+1, storage.unsaved)
+               }
+       }
+}
+
+func TestSplitStoredHashIndex(t *testing.T) {
+       for l := 0; l < 10; l++ {
+               for n := int64(0); n < 100; n++ {
+                       x := StoredHashIndex(l, n)
+                       l1, n1 := SplitStoredHashIndex(x)
+                       if l1 != l || n1 != n {
+                               t.Fatalf("StoredHashIndex(%d, %d) = %d, but SplitStoredHashIndex(%d) = %d, %d", l, n, x, x, l1, n1)
+                       }
+               }
+       }
+}
+
+// TODO(rsc): Test invalid paths too, like "tile/3/5/123/456/078".
+var tilePaths = []struct {
+       path string
+       tile Tile
+}{
+       {"tile/4/0/001", Tile{4, 0, 1, 16}},
+       {"tile/4/0/001.p/5", Tile{4, 0, 1, 5}},
+       {"tile/3/5/x123/x456/078", Tile{3, 5, 123456078, 8}},
+       {"tile/3/5/x123/x456/078.p/2", Tile{3, 5, 123456078, 2}},
+       {"tile/1/0/x003/x057/500", Tile{1, 0, 3057500, 2}},
+       {"tile/3/5/123/456/078", Tile{}},
+       {"tile/3/-1/123/456/078", Tile{}},
+       {"tile/1/data/x003/x057/500", Tile{1, -1, 3057500, 2}},
+}
+
+func TestTilePath(t *testing.T) {
+       for _, tt := range tilePaths {
+               if tt.tile.H > 0 {
+                       p := tt.tile.Path()
+                       if p != tt.path {
+                               t.Errorf("%+v.Path() = %q, want %q", tt.tile, p, tt.path)
+                       }
+               }
+               tile, err := ParseTilePath(tt.path)
+               if err != nil {
+                       if tt.tile.H == 0 {
+                               // Expected error.
+                               continue
+                       }
+                       t.Errorf("ParseTilePath(%q): %v", tt.path, err)
+               } else if tile != tt.tile {
+                       if tt.tile.H == 0 {
+                               t.Errorf("ParseTilePath(%q): expected error, got %+v", tt.path, tt.tile)
+                               continue
+                       }
+                       t.Errorf("ParseTilePath(%q) = %+v, want %+v", tt.path, tile, tt.tile)
+               }
+       }
+}
index edcf93513d89e341374baf6db395036bd362750d..930eecb63f1c4955c842e6e7d10a936e77783254 100644 (file)
@@ -83,8 +83,6 @@ func runTool(cmd *base.Command, args []string) {
                Stdin:  os.Stdin,
                Stdout: os.Stdout,
                Stderr: os.Stderr,
-               // Set $GOROOT, mainly for go tool dist.
-               Env: base.MergeEnvLists([]string{"GOROOT=" + cfg.GOROOT}, os.Environ()),
        }
        err := toolCmd.Run()
        if err != nil {
diff --git a/libgo/go/cmd/go/internal/version/exe.go b/libgo/go/cmd/go/internal/version/exe.go
new file mode 100644 (file)
index 0000000..55da960
--- /dev/null
@@ -0,0 +1,252 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package version
+
+import (
+       "bytes"
+       "debug/elf"
+       "debug/macho"
+       "debug/pe"
+       "fmt"
+       "internal/xcoff"
+       "io"
+       "os"
+)
+
+// An exe is a generic interface to an OS executable (ELF, Mach-O, PE, XCOFF).
+type exe interface {
+       // Close closes the underlying file.
+       Close() error
+
+       // ReadData reads and returns up to size byte starting at virtual address addr.
+       ReadData(addr, size uint64) ([]byte, error)
+
+       // DataStart returns the writable data segment start address.
+       DataStart() uint64
+}
+
+// openExe opens file and returns it as an exe.
+func openExe(file string) (exe, error) {
+       f, err := os.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       data := make([]byte, 16)
+       if _, err := io.ReadFull(f, data); err != nil {
+               return nil, err
+       }
+       f.Seek(0, 0)
+       if bytes.HasPrefix(data, []byte("\x7FELF")) {
+               e, err := elf.NewFile(f)
+               if err != nil {
+                       f.Close()
+                       return nil, err
+               }
+               return &elfExe{f, e}, nil
+       }
+       if bytes.HasPrefix(data, []byte("MZ")) {
+               e, err := pe.NewFile(f)
+               if err != nil {
+                       f.Close()
+                       return nil, err
+               }
+               return &peExe{f, e}, nil
+       }
+       if bytes.HasPrefix(data, []byte("\xFE\xED\xFA")) || bytes.HasPrefix(data[1:], []byte("\xFA\xED\xFE")) {
+               e, err := macho.NewFile(f)
+               if err != nil {
+                       f.Close()
+                       return nil, err
+               }
+               return &machoExe{f, e}, nil
+       }
+       if bytes.HasPrefix(data, []byte{0x01, 0xDF}) || bytes.HasPrefix(data, []byte{0x01, 0xF7}) {
+               e, err := xcoff.NewFile(f)
+               if err != nil {
+                       f.Close()
+                       return nil, err
+               }
+               return &xcoffExe{f, e}, nil
+
+       }
+       return nil, fmt.Errorf("unrecognized executable format")
+}
+
+// elfExe is the ELF implementation of the exe interface.
+type elfExe struct {
+       os *os.File
+       f  *elf.File
+}
+
+func (x *elfExe) Close() error {
+       return x.os.Close()
+}
+
+func (x *elfExe) ReadData(addr, size uint64) ([]byte, error) {
+       for _, prog := range x.f.Progs {
+               if prog.Vaddr <= addr && addr <= prog.Vaddr+prog.Filesz-1 {
+                       n := prog.Vaddr + prog.Filesz - addr
+                       if n > size {
+                               n = size
+                       }
+                       data := make([]byte, n)
+                       _, err := prog.ReadAt(data, int64(addr-prog.Vaddr))
+                       if err != nil {
+                               return nil, err
+                       }
+                       return data, nil
+               }
+       }
+       return nil, fmt.Errorf("address not mapped")
+}
+
+func (x *elfExe) DataStart() uint64 {
+       for _, p := range x.f.Progs {
+               if p.Type == elf.PT_LOAD && p.Flags&(elf.PF_X|elf.PF_W) == elf.PF_W {
+                       return p.Vaddr
+               }
+       }
+       return 0
+}
+
+// peExe is the PE (Windows Portable Executable) implementation of the exe interface.
+type peExe struct {
+       os *os.File
+       f  *pe.File
+}
+
+func (x *peExe) Close() error {
+       return x.os.Close()
+}
+
+func (x *peExe) imageBase() uint64 {
+       switch oh := x.f.OptionalHeader.(type) {
+       case *pe.OptionalHeader32:
+               return uint64(oh.ImageBase)
+       case *pe.OptionalHeader64:
+               return oh.ImageBase
+       }
+       return 0
+}
+
+func (x *peExe) ReadData(addr, size uint64) ([]byte, error) {
+       addr -= x.imageBase()
+       for _, sect := range x.f.Sections {
+               if uint64(sect.VirtualAddress) <= addr && addr <= uint64(sect.VirtualAddress+sect.Size-1) {
+                       n := uint64(sect.VirtualAddress+sect.Size) - addr
+                       if n > size {
+                               n = size
+                       }
+                       data := make([]byte, n)
+                       _, err := sect.ReadAt(data, int64(addr-uint64(sect.VirtualAddress)))
+                       if err != nil {
+                               return nil, err
+                       }
+                       return data, nil
+               }
+       }
+       return nil, fmt.Errorf("address not mapped")
+}
+
+func (x *peExe) DataStart() uint64 {
+       // Assume data is first writable section.
+       const (
+               IMAGE_SCN_CNT_CODE               = 0x00000020
+               IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040
+               IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080
+               IMAGE_SCN_MEM_EXECUTE            = 0x20000000
+               IMAGE_SCN_MEM_READ               = 0x40000000
+               IMAGE_SCN_MEM_WRITE              = 0x80000000
+               IMAGE_SCN_MEM_DISCARDABLE        = 0x2000000
+               IMAGE_SCN_LNK_NRELOC_OVFL        = 0x1000000
+               IMAGE_SCN_ALIGN_32BYTES          = 0x600000
+       )
+       for _, sect := range x.f.Sections {
+               if sect.VirtualAddress != 0 && sect.Size != 0 &&
+                       sect.Characteristics&^IMAGE_SCN_ALIGN_32BYTES == IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_WRITE {
+                       return uint64(sect.VirtualAddress) + x.imageBase()
+               }
+       }
+       return 0
+}
+
+// machoExe is the Mach-O (Apple macOS/iOS) implementation of the exe interface.
+type machoExe struct {
+       os *os.File
+       f  *macho.File
+}
+
+func (x *machoExe) Close() error {
+       return x.os.Close()
+}
+
+func (x *machoExe) ReadData(addr, size uint64) ([]byte, error) {
+       for _, load := range x.f.Loads {
+               seg, ok := load.(*macho.Segment)
+               if !ok {
+                       continue
+               }
+               if seg.Addr <= addr && addr <= seg.Addr+seg.Filesz-1 {
+                       if seg.Name == "__PAGEZERO" {
+                               continue
+                       }
+                       n := seg.Addr + seg.Filesz - addr
+                       if n > size {
+                               n = size
+                       }
+                       data := make([]byte, n)
+                       _, err := seg.ReadAt(data, int64(addr-seg.Addr))
+                       if err != nil {
+                               return nil, err
+                       }
+                       return data, nil
+               }
+       }
+       return nil, fmt.Errorf("address not mapped")
+}
+
+func (x *machoExe) DataStart() uint64 {
+       // Assume data is first non-empty writable segment.
+       const RW = 3
+       for _, load := range x.f.Loads {
+               seg, ok := load.(*macho.Segment)
+               if ok && seg.Addr != 0 && seg.Filesz != 0 && seg.Prot == RW && seg.Maxprot == RW {
+                       return seg.Addr
+               }
+       }
+       return 0
+}
+
+// xcoffExe is the XCOFF (AIX eXtended COFF) implementation of the exe interface.
+type xcoffExe struct {
+       os *os.File
+       f  *xcoff.File
+}
+
+func (x *xcoffExe) Close() error {
+       return x.os.Close()
+}
+
+func (x *xcoffExe) ReadData(addr, size uint64) ([]byte, error) {
+       for _, sect := range x.f.Sections {
+               if uint64(sect.VirtualAddress) <= addr && addr <= uint64(sect.VirtualAddress+sect.Size-1) {
+                       n := uint64(sect.VirtualAddress+sect.Size) - addr
+                       if n > size {
+                               n = size
+                       }
+                       data := make([]byte, n)
+                       _, err := sect.ReadAt(data, int64(addr-uint64(sect.VirtualAddress)))
+                       if err != nil {
+                               return nil, err
+                       }
+                       return data, nil
+               }
+       }
+       return nil, fmt.Errorf("address not mapped")
+}
+
+func (x *xcoffExe) DataStart() uint64 {
+       return x.f.SectionByType(xcoff.STYP_DATA).VirtualAddress
+}
index 9344a28dc36af57e2ca5953967a986fe2aad36ea..857548c7ed8d41ddde7399242487527064723613 100644 (file)
 package version
 
 import (
+       "bytes"
+       "encoding/binary"
        "fmt"
+       "os"
+       "path/filepath"
        "runtime"
+       "strings"
 
        "cmd/go/internal/base"
 )
 
 var CmdVersion = &base.Command{
-       Run:       runVersion,
-       UsageLine: "go version",
+       UsageLine: "go version [-m] [-v] [file ...]",
        Short:     "print Go version",
-       Long:      `Version prints the Go version, as reported by runtime.Version.`,
+       Long: `Version prints the build information for Go executables.
+
+Go version reports the Go version used to build each of the named
+executable files.
+
+If no files are named on the command line, go version prints its own
+version information.
+
+If a directory is named, go version walks that directory, recursively,
+looking for recognized Go binaries and reporting their versions.
+By default, go version does not report unrecognized files found
+during a directory scan. The -v flag causes it to report unrecognized files.
+
+The -m flag causes go version to print each executable's embedded
+module version information, when available. In the output, the module
+information consists of multiple lines following the version line, each
+indented by a leading tab character.
+
+See also: go doc runtime/debug.BuildInfo.
+`,
 }
 
+func init() {
+       CmdVersion.Run = runVersion // break init cycle
+}
+
+var (
+       versionM = CmdVersion.Flag.Bool("m", false, "")
+       versionV = CmdVersion.Flag.Bool("v", false, "")
+)
+
 func runVersion(cmd *base.Command, args []string) {
-       if len(args) != 0 {
-               cmd.Usage()
+       if len(args) == 0 {
+               fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
+               return
+       }
+
+       for _, arg := range args {
+               info, err := os.Stat(arg)
+               if err != nil {
+                       fmt.Fprintf(os.Stderr, "%v\n", err)
+                       continue
+               }
+               if info.IsDir() {
+                       scanDir(arg)
+               } else {
+                       scanFile(arg, info, true)
+               }
+       }
+}
+
+// scanDir scans a directory for executables to run scanFile on.
+func scanDir(dir string) {
+       filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+               if info.Mode().IsRegular() || info.Mode()&os.ModeSymlink != 0 {
+                       scanFile(path, info, *versionV)
+               }
+               return nil
+       })
+}
+
+// isExe reports whether the file should be considered executable.
+func isExe(file string, info os.FileInfo) bool {
+       if runtime.GOOS == "windows" {
+               return strings.HasSuffix(strings.ToLower(file), ".exe")
+       }
+       return info.Mode().IsRegular() && info.Mode()&0111 != 0
+}
+
+// scanFile scans file to try to report the Go and module versions.
+// If mustPrint is true, scanFile will report any error reading file.
+// Otherwise (mustPrint is false, because scanFile is being called
+// by scanDir) scanFile prints nothing for non-Go executables.
+func scanFile(file string, info os.FileInfo, mustPrint bool) {
+       if info.Mode()&os.ModeSymlink != 0 {
+               // Accept file symlinks only.
+               i, err := os.Stat(file)
+               if err != nil || !i.Mode().IsRegular() {
+                       if mustPrint {
+                               fmt.Fprintf(os.Stderr, "%s: symlink\n", file)
+                       }
+                       return
+               }
+               info = i
+       }
+       if !isExe(file, info) {
+               if mustPrint {
+                       fmt.Fprintf(os.Stderr, "%s: not executable file\n", file)
+               }
+               return
        }
 
-       fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
+       x, err := openExe(file)
+       if err != nil {
+               if mustPrint {
+                       fmt.Fprintf(os.Stderr, "%s: %v\n", file, err)
+               }
+               return
+       }
+       defer x.Close()
+
+       vers, mod := findVers(x)
+       if vers == "" {
+               if mustPrint {
+                       fmt.Fprintf(os.Stderr, "%s: go version not found\n", file)
+               }
+               return
+       }
+
+       fmt.Printf("%s: %s\n", file, vers)
+       if *versionM && mod != "" {
+               fmt.Printf("\t%s\n", strings.Replace(mod[:len(mod)-1], "\n", "\n\t", -1))
+       }
+}
+
+// The build info blob left by the linker is identified by
+// a 16-byte header, consisting of buildInfoMagic (14 bytes),
+// the binary's pointer size (1 byte),
+// and whether the binary is big endian (1 byte).
+var buildInfoMagic = []byte("\xff Go buildinf:")
+
+// findVers finds and returns the Go version and module version information
+// in the executable x.
+func findVers(x exe) (vers, mod string) {
+       // Read the first 64kB of text to find the build info blob.
+       text := x.DataStart()
+       data, err := x.ReadData(text, 64*1024)
+       if err != nil {
+               return
+       }
+       for ; !bytes.HasPrefix(data, buildInfoMagic); data = data[32:] {
+               if len(data) < 32 {
+                       return
+               }
+       }
+
+       // Decode the blob.
+       ptrSize := int(data[14])
+       bigEndian := data[15] != 0
+       var bo binary.ByteOrder
+       if bigEndian {
+               bo = binary.BigEndian
+       } else {
+               bo = binary.LittleEndian
+       }
+       var readPtr func([]byte) uint64
+       if ptrSize == 4 {
+               readPtr = func(b []byte) uint64 { return uint64(bo.Uint32(b)) }
+       } else {
+               readPtr = bo.Uint64
+       }
+       vers = readString(x, ptrSize, readPtr, readPtr(data[16:]))
+       if vers == "" {
+               return
+       }
+       mod = readString(x, ptrSize, readPtr, readPtr(data[16+ptrSize:]))
+       if len(mod) >= 33 && mod[len(mod)-17] == '\n' {
+               // Strip module framing.
+               mod = mod[16 : len(mod)-16]
+       } else {
+               mod = ""
+       }
+       return
+}
+
+// readString returns the string at address addr in the executable x.
+func readString(x exe, ptrSize int, readPtr func([]byte) uint64, addr uint64) string {
+       hdr, err := x.ReadData(addr, uint64(2*ptrSize))
+       if err != nil || len(hdr) < 2*ptrSize {
+               return ""
+       }
+       dataAddr := readPtr(hdr)
+       dataLen := readPtr(hdr[ptrSize:])
+       data, err := x.ReadData(dataAddr, dataLen)
+       if err != nil || uint64(len(data)) < dataLen {
+               return ""
+       }
+       return string(data)
 }
index 3d828a2a4a4c28fbab95969f496aa13090d7ee32..327b761c3cd6bf68858804b3c17a409acf24c95b 100644 (file)
@@ -69,7 +69,7 @@ func runVet(cmd *base.Command, args []string) {
 
        root := &work.Action{Mode: "go vet"}
        for _, p := range pkgs {
-               _, ptest, pxtest, err := load.GetTestPackagesFor(p, nil)
+               _, ptest, pxtest, err := load.TestPackagesFor(p, nil)
                if err != nil {
                        base.Errorf("%v", err)
                        continue
diff --git a/libgo/go/cmd/go/internal/web/api.go b/libgo/go/cmd/go/internal/web/api.go
new file mode 100644 (file)
index 0000000..cd0e19d
--- /dev/null
@@ -0,0 +1,133 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package web defines minimal helper routines for accessing HTTP/HTTPS
+// resources without requiring external dependenicies on the net package.
+//
+// If the cmd_go_bootstrap build tag is present, web avoids the use of the net
+// package and returns errors for all network operations.
+package web
+
+import (
+       "fmt"
+       "io"
+       "io/ioutil"
+       "net/url"
+       "os"
+       "strings"
+)
+
+// SecurityMode specifies whether a function should make network
+// calls using insecure transports (eg, plain text HTTP).
+// The zero value is "secure".
+type SecurityMode int
+
+const (
+       SecureOnly      SecurityMode = iota // Reject plain HTTP; validate HTTPS.
+       DefaultSecurity                     // Allow plain HTTP if explicit; validate HTTPS.
+       Insecure                            // Allow plain HTTP if not explicitly HTTPS; skip HTTPS validation.
+)
+
+// An HTTPError describes an HTTP error response (non-200 result).
+type HTTPError struct {
+       URL        string // redacted
+       Status     string
+       StatusCode int
+}
+
+func (e *HTTPError) Error() string {
+       return fmt.Sprintf("reading %s: %v", e.URL, e.Status)
+}
+
+func (e *HTTPError) Is(target error) bool {
+       return target == os.ErrNotExist && (e.StatusCode == 404 || e.StatusCode == 410)
+}
+
+// GetBytes returns the body of the requested resource, or an error if the
+// response status was not http.StatusOK.
+//
+// GetBytes is a convenience wrapper around Get and Response.Err.
+func GetBytes(u *url.URL) ([]byte, error) {
+       resp, err := Get(DefaultSecurity, u)
+       if err != nil {
+               return nil, err
+       }
+       defer resp.Body.Close()
+       if err := resp.Err(); err != nil {
+               return nil, err
+       }
+       b, err := ioutil.ReadAll(resp.Body)
+       if err != nil {
+               return nil, fmt.Errorf("reading %s: %v", Redacted(u), err)
+       }
+       return b, nil
+}
+
+type Response struct {
+       URL        string // redacted
+       Status     string
+       StatusCode int
+       Header     map[string][]string
+       Body       io.ReadCloser
+}
+
+// Err returns an *HTTPError corresponding to the response r.
+// It returns nil if the response r has StatusCode 200 or 0 (unset).
+func (r *Response) Err() error {
+       if r.StatusCode == 200 || r.StatusCode == 0 {
+               return nil
+       }
+       return &HTTPError{URL: r.URL, Status: r.Status, StatusCode: r.StatusCode}
+}
+
+// Get returns the body of the HTTP or HTTPS resource specified at the given URL.
+//
+// If the URL does not include an explicit scheme, Get first tries "https".
+// If the server does not respond under that scheme and the security mode is
+// Insecure, Get then tries "http".
+// The URL included in the response indicates which scheme was actually used,
+// and it is a redacted URL suitable for use in error messages.
+//
+// For the "https" scheme only, credentials are attached using the
+// cmd/go/internal/auth package. If the URL itself includes a username and
+// password, it will not be attempted under the "http" scheme unless the
+// security mode is Insecure.
+//
+// Get returns a non-nil error only if the request did not receive a response
+// under any applicable scheme. (A non-2xx response does not cause an error.)
+func Get(security SecurityMode, u *url.URL) (*Response, error) {
+       return get(security, u)
+}
+
+// Redacted returns a redacted string form of the URL,
+// suitable for printing in error messages.
+// The string form replaces any non-empty password
+// in the original URL with "[redacted]".
+func Redacted(u *url.URL) string {
+       if u.User != nil {
+               if _, ok := u.User.Password(); ok {
+                       redacted := *u
+                       redacted.User = url.UserPassword(u.User.Username(), "[redacted]")
+                       u = &redacted
+               }
+       }
+       return u.String()
+}
+
+// OpenBrowser attempts to open the requested URL in a web browser.
+func OpenBrowser(url string) (opened bool) {
+       return openBrowser(url)
+}
+
+// Join returns the result of adding the slash-separated
+// path elements to the end of u's path.
+func Join(u *url.URL, path string) *url.URL {
+       j := *u
+       if path == "" {
+               return &j
+       }
+       j.Path = strings.TrimSuffix(u.Path, "/") + "/" + strings.TrimPrefix(path, "/")
+       j.RawPath = strings.TrimSuffix(u.RawPath, "/") + "/" + strings.TrimPrefix(path, "/")
+       return &j
+}
index d1d4621a44b6884e5d1f862524c6528a6f0fb087..781702100a09e8b596ce9d3a9095e7dc88ada578 100644 (file)
@@ -6,32 +6,18 @@
 
 // This code is compiled only into the bootstrap 'go' binary.
 // These stubs avoid importing packages with large dependency
-// trees, like the use of "net/http" in vcs.go.
+// trees that potentially require C linking,
+// like the use of "net/http" in vcs.go.
 
 package web
 
 import (
        "errors"
-       "io"
+       urlpkg "net/url"
 )
 
-var errHTTP = errors.New("no http in bootstrap go command")
-
-type HTTPError struct {
-       StatusCode int
-}
-
-func (e *HTTPError) Error() string {
-       panic("unreachable")
-}
-
-func Get(url string) ([]byte, error) {
-       return nil, errHTTP
-}
-
-func GetMaybeInsecure(importPath string, security SecurityMode) (string, io.ReadCloser, error) {
-       return "", nil, errHTTP
+func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
+       return nil, errors.New("no http in bootstrap go command")
 }
 
-func QueryEscape(s string) string { panic("unreachable") }
-func OpenBrowser(url string) bool { panic("unreachable") }
+func openBrowser(url string) bool { return false }
diff --git a/libgo/go/cmd/go/internal/web/file_test.go b/libgo/go/cmd/go/internal/web/file_test.go
new file mode 100644 (file)
index 0000000..e31ad71
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package web
+
+import (
+       "errors"
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "testing"
+)
+
+func TestGetFileURL(t *testing.T) {
+       const content = "Hello, file!\n"
+
+       f, err := ioutil.TempFile("", "web-TestGetFileURL")
+       if err != nil {
+               t.Fatal(err)
+       }
+       if _, err := f.WriteString(content); err != nil {
+               t.Error(err)
+       }
+       if err := f.Close(); err != nil {
+               t.Fatal(err)
+       }
+
+       u, err := urlFromFilePath(f.Name())
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       b, err := GetBytes(u)
+       if err != nil {
+               t.Fatalf("GetBytes(%v) = _, %v", u, err)
+       }
+       if string(b) != content {
+               t.Fatalf("after writing %q to %s, GetBytes(%v) read %q", content, f.Name(), u, b)
+       }
+}
+
+func TestGetNonexistentFile(t *testing.T) {
+       path, err := filepath.Abs("nonexistent")
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       u, err := urlFromFilePath(path)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       b, err := GetBytes(u)
+       if !errors.Is(err, os.ErrNotExist) {
+               t.Fatalf("GetBytes(%v) = %q, %v; want _, os.ErrNotExist", u, b, err)
+       }
+}
index 6e347fbf86029ae0a5977062886c824b52984f21..b790fe9916e8c64772e73d5d62a5e06519fb09f1 100644 (file)
@@ -14,21 +14,18 @@ package web
 import (
        "crypto/tls"
        "fmt"
-       "io"
        "io/ioutil"
-       "log"
        "net/http"
-       "net/url"
+       urlpkg "net/url"
+       "os"
+       "strings"
        "time"
 
+       "cmd/go/internal/auth"
        "cmd/go/internal/cfg"
        "cmd/internal/browser"
 )
 
-// httpClient is the default HTTP client, but a variable so it can be
-// changed by tests, without modifying http.DefaultClient.
-var httpClient = http.DefaultClient
-
 // impatientInsecureHTTPClient is used in -insecure mode,
 // when we're connecting to https servers that might not be there
 // or might be using self-signed certificates.
@@ -42,81 +39,179 @@ var impatientInsecureHTTPClient = &http.Client{
        },
 }
 
-type HTTPError struct {
-       status     string
-       StatusCode int
-       url        string
+// securityPreservingHTTPClient is like the default HTTP client, but rejects
+// redirects to plain-HTTP URLs if the original URL was secure.
+var securityPreservingHTTPClient = &http.Client{
+       CheckRedirect: func(req *http.Request, via []*http.Request) error {
+               if len(via) > 0 && via[0].URL.Scheme == "https" && req.URL.Scheme != "https" {
+                       lastHop := via[len(via)-1].URL
+                       return fmt.Errorf("redirected from secure URL %s to insecure URL %s", lastHop, req.URL)
+               }
+               return nil
+       },
 }
 
-func (e *HTTPError) Error() string {
-       return fmt.Sprintf("%s: %s", e.url, e.status)
-}
+func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
+       start := time.Now()
 
-// Get returns the data from an HTTP GET request for the given URL.
-func Get(url string) ([]byte, error) {
-       resp, err := httpClient.Get(url)
-       if err != nil {
-               return nil, err
+       if url.Scheme == "file" {
+               return getFile(url)
        }
-       defer resp.Body.Close()
-       if resp.StatusCode != 200 {
-               err := &HTTPError{status: resp.Status, StatusCode: resp.StatusCode, url: url}
 
-               return nil, err
-       }
-       b, err := ioutil.ReadAll(resp.Body)
-       if err != nil {
-               return nil, fmt.Errorf("%s: %v", url, err)
+       if os.Getenv("TESTGOPROXY404") == "1" && url.Host == "proxy.golang.org" {
+               res := &Response{
+                       URL:        Redacted(url),
+                       Status:     "404 testing",
+                       StatusCode: 404,
+                       Header:     make(map[string][]string),
+                       Body:       ioutil.NopCloser(strings.NewReader("")),
+               }
+               if cfg.BuildX {
+                       fmt.Fprintf(os.Stderr, "# get %s: %v (%.3fs)\n", Redacted(url), res.Status, time.Since(start).Seconds())
+               }
+               return res, nil
        }
-       return b, nil
-}
 
-// GetMaybeInsecure returns the body of either the importPath's
-// https resource or, if unavailable and permitted by the security mode, the http resource.
-func GetMaybeInsecure(importPath string, security SecurityMode) (urlStr string, body io.ReadCloser, err error) {
-       fetch := func(scheme string) (urlStr string, res *http.Response, err error) {
-               u, err := url.Parse(scheme + "://" + importPath)
+       fetch := func(url *urlpkg.URL) (*urlpkg.URL, *http.Response, error) {
+               // Note: The -v build flag does not mean "print logging information",
+               // despite its historical misuse for this in GOPATH-based go get.
+               // We print extra logging in -x mode instead, which traces what
+               // commands are executed.
+               if cfg.BuildX {
+                       fmt.Fprintf(os.Stderr, "# get %s\n", Redacted(url))
+               }
+
+               req, err := http.NewRequest("GET", url.String(), nil)
                if err != nil {
-                       return "", nil, err
+                       return nil, nil, err
                }
-               u.RawQuery = "go-get=1"
-               urlStr = u.String()
-               if cfg.BuildV {
-                       log.Printf("Fetching %s", urlStr)
+               if url.Scheme == "https" {
+                       auth.AddCredentials(req)
                }
-               if security == Insecure && scheme == "https" { // fail earlier
-                       res, err = impatientInsecureHTTPClient.Get(urlStr)
+
+               var res *http.Response
+               if security == Insecure && url.Scheme == "https" { // fail earlier
+                       res, err = impatientInsecureHTTPClient.Do(req)
                } else {
-                       res, err = httpClient.Get(urlStr)
+                       res, err = securityPreservingHTTPClient.Do(req)
                }
-               return
+               return url, res, err
        }
-       closeBody := func(res *http.Response) {
-               if res != nil {
-                       res.Body.Close()
+
+       var (
+               fetched *urlpkg.URL
+               res     *http.Response
+               err     error
+       )
+       if url.Scheme == "" || url.Scheme == "https" {
+               secure := new(urlpkg.URL)
+               *secure = *url
+               secure.Scheme = "https"
+
+               fetched, res, err = fetch(secure)
+               if err != nil {
+                       if cfg.BuildX {
+                               fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(url), err)
+                       }
+                       if security != Insecure || url.Scheme == "https" {
+                               // HTTPS failed, and we can't fall back to plain HTTP.
+                               // Report the error from the HTTPS attempt.
+                               return nil, err
+                       }
                }
        }
-       urlStr, res, err := fetch("https")
-       if err != nil {
-               if cfg.BuildV {
-                       log.Printf("https fetch failed: %v", err)
+
+       if res == nil {
+               switch url.Scheme {
+               case "http":
+                       if security == SecureOnly {
+                               if cfg.BuildX {
+                                       fmt.Fprintf(os.Stderr, "# get %s: insecure\n", Redacted(url))
+                               }
+                               return nil, fmt.Errorf("insecure URL: %s", Redacted(url))
+                       }
+               case "":
+                       if security != Insecure {
+                               panic("should have returned after HTTPS failure")
+                       }
+               default:
+                       if cfg.BuildX {
+                               fmt.Fprintf(os.Stderr, "# get %s: unsupported\n", Redacted(url))
+                       }
+                       return nil, fmt.Errorf("unsupported scheme: %s", Redacted(url))
+               }
+
+               insecure := new(urlpkg.URL)
+               *insecure = *url
+               insecure.Scheme = "http"
+               if insecure.User != nil && security != Insecure {
+                       if cfg.BuildX {
+                               fmt.Fprintf(os.Stderr, "# get %s: insecure credentials\n", Redacted(url))
+                       }
+                       return nil, fmt.Errorf("refusing to pass credentials to insecure URL: %s", Redacted(insecure))
                }
-               if security == Insecure {
-                       closeBody(res)
-                       urlStr, res, err = fetch("http")
+
+               fetched, res, err = fetch(insecure)
+               if err != nil {
+                       if cfg.BuildX {
+                               fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(url), err)
+                       }
+                       // HTTP failed, and we already tried HTTPS if applicable.
+                       // Report the error from the HTTP attempt.
+                       return nil, err
                }
        }
-       if err != nil {
-               closeBody(res)
-               return "", nil, err
-       }
+
        // Note: accepting a non-200 OK here, so people can serve a
        // meta import in their http 404 page.
-       if cfg.BuildV {
-               log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode)
+       if cfg.BuildX {
+               fmt.Fprintf(os.Stderr, "# get %s: %v (%.3fs)\n", Redacted(url), res.Status, time.Since(start).Seconds())
        }
-       return urlStr, res.Body, nil
+       r := &Response{
+               URL:        Redacted(fetched),
+               Status:     res.Status,
+               StatusCode: res.StatusCode,
+               Header:     map[string][]string(res.Header),
+               Body:       res.Body,
+       }
+       return r, nil
+}
+
+func getFile(u *urlpkg.URL) (*Response, error) {
+       path, err := urlToFilePath(u)
+       if err != nil {
+               return nil, err
+       }
+       f, err := os.Open(path)
+
+       if os.IsNotExist(err) {
+               return &Response{
+                       URL:        Redacted(u),
+                       Status:     http.StatusText(http.StatusNotFound),
+                       StatusCode: http.StatusNotFound,
+                       Body:       http.NoBody,
+               }, nil
+       }
+
+       if os.IsPermission(err) {
+               return &Response{
+                       URL:        Redacted(u),
+                       Status:     http.StatusText(http.StatusForbidden),
+                       StatusCode: http.StatusForbidden,
+                       Body:       http.NoBody,
+               }, nil
+       }
+
+       if err != nil {
+               return nil, err
+       }
+
+       return &Response{
+               URL:        Redacted(u),
+               Status:     http.StatusText(http.StatusOK),
+               StatusCode: http.StatusOK,
+               Body:       f,
+       }, nil
 }
 
-func QueryEscape(s string) string { return url.QueryEscape(s) }
-func OpenBrowser(url string) bool { return browser.Open(url) }
+func openBrowser(url string) bool { return browser.Open(url) }
diff --git a/libgo/go/cmd/go/internal/web/security.go b/libgo/go/cmd/go/internal/web/security.go
deleted file mode 100644 (file)
index 1dc6f1b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package web defines helper routines for accessing HTTP/HTTPS resources.
-package web
-
-// SecurityMode specifies whether a function should make network
-// calls using insecure transports (eg, plain text HTTP).
-// The zero value is "secure".
-type SecurityMode int
-
-const (
-       Secure SecurityMode = iota
-       Insecure
-)
diff --git a/libgo/go/cmd/go/internal/web/url.go b/libgo/go/cmd/go/internal/web/url.go
new file mode 100644 (file)
index 0000000..146c51f
--- /dev/null
@@ -0,0 +1,95 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package web
+
+import (
+       "errors"
+       "net/url"
+       "path/filepath"
+       "strings"
+)
+
+// TODO(golang.org/issue/32456): If accepted, move these functions into the
+// net/url package.
+
+var errNotAbsolute = errors.New("path is not absolute")
+
+func urlToFilePath(u *url.URL) (string, error) {
+       if u.Scheme != "file" {
+               return "", errors.New("non-file URL")
+       }
+
+       checkAbs := func(path string) (string, error) {
+               if !filepath.IsAbs(path) {
+                       return "", errNotAbsolute
+               }
+               return path, nil
+       }
+
+       if u.Path == "" {
+               if u.Host != "" || u.Opaque == "" {
+                       return "", errors.New("file URL missing path")
+               }
+               return checkAbs(filepath.FromSlash(u.Opaque))
+       }
+
+       path, err := convertFileURLPath(u.Host, u.Path)
+       if err != nil {
+               return path, err
+       }
+       return checkAbs(path)
+}
+
+func urlFromFilePath(path string) (*url.URL, error) {
+       if !filepath.IsAbs(path) {
+               return nil, errNotAbsolute
+       }
+
+       // If path has a Windows volume name, convert the volume to a host and prefix
+       // per https://blogs.msdn.microsoft.com/ie/2006/12/06/file-uris-in-windows/.
+       if vol := filepath.VolumeName(path); vol != "" {
+               if strings.HasPrefix(vol, `\\`) {
+                       path = filepath.ToSlash(path[2:])
+                       i := strings.IndexByte(path, '/')
+
+                       if i < 0 {
+                               // A degenerate case.
+                               // \\host.example.com (without a share name)
+                               // becomes
+                               // file://host.example.com/
+                               return &url.URL{
+                                       Scheme: "file",
+                                       Host:   path,
+                                       Path:   "/",
+                               }, nil
+                       }
+
+                       // \\host.example.com\Share\path\to\file
+                       // becomes
+                       // file://host.example.com/Share/path/to/file
+                       return &url.URL{
+                               Scheme: "file",
+                               Host:   path[:i],
+                               Path:   filepath.ToSlash(path[i:]),
+                       }, nil
+               }
+
+               // C:\path\to\file
+               // becomes
+               // file:///C:/path/to/file
+               return &url.URL{
+                       Scheme: "file",
+                       Path:   "/" + filepath.ToSlash(path),
+               }, nil
+       }
+
+       // /path/to/file
+       // becomes
+       // file:///path/to/file
+       return &url.URL{
+               Scheme: "file",
+               Path:   filepath.ToSlash(path),
+       }, nil
+}
diff --git a/libgo/go/cmd/go/internal/web/url_other.go b/libgo/go/cmd/go/internal/web/url_other.go
new file mode 100644 (file)
index 0000000..bd243e5
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !windows
+
+package web
+
+import (
+       "errors"
+       "path/filepath"
+)
+
+func convertFileURLPath(host, path string) (string, error) {
+       switch host {
+       case "", "localhost":
+       default:
+               return "", errors.New("file URL specifies non-local host")
+       }
+       return filepath.FromSlash(path), nil
+}
diff --git a/libgo/go/cmd/go/internal/web/url_other_test.go b/libgo/go/cmd/go/internal/web/url_other_test.go
new file mode 100644 (file)
index 0000000..b4a74d9
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !windows
+
+package web
+
+var urlTests = []struct {
+       url          string
+       filePath     string
+       canonicalURL string // If empty, assume equal to url.
+       wantErr      string
+}{
+       // Examples from RFC 8089:
+       {
+               url:      `file:///path/to/file`,
+               filePath: `/path/to/file`,
+       },
+       {
+               url:          `file:/path/to/file`,
+               filePath:     `/path/to/file`,
+               canonicalURL: `file:///path/to/file`,
+       },
+       {
+               url:          `file://localhost/path/to/file`,
+               filePath:     `/path/to/file`,
+               canonicalURL: `file:///path/to/file`,
+       },
+
+       // We reject non-local files.
+       {
+               url:     `file://host.example.com/path/to/file`,
+               wantErr: "file URL specifies non-local host",
+       },
+}
diff --git a/libgo/go/cmd/go/internal/web/url_test.go b/libgo/go/cmd/go/internal/web/url_test.go
new file mode 100644 (file)
index 0000000..8f462f5
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package web
+
+import (
+       "net/url"
+       "testing"
+)
+
+func TestURLToFilePath(t *testing.T) {
+       for _, tc := range urlTests {
+               if tc.url == "" {
+                       continue
+               }
+               tc := tc
+
+               t.Run(tc.url, func(t *testing.T) {
+                       u, err := url.Parse(tc.url)
+                       if err != nil {
+                               t.Fatalf("url.Parse(%q): %v", tc.url, err)
+                       }
+
+                       path, err := urlToFilePath(u)
+                       if err != nil {
+                               if err.Error() == tc.wantErr {
+                                       return
+                               }
+                               if tc.wantErr == "" {
+                                       t.Fatalf("urlToFilePath(%v): %v; want <nil>", u, err)
+                               } else {
+                                       t.Fatalf("urlToFilePath(%v): %v; want %s", u, err, tc.wantErr)
+                               }
+                       }
+
+                       if path != tc.filePath || tc.wantErr != "" {
+                               t.Fatalf("urlToFilePath(%v) = %q, <nil>; want %q, %s", u, path, tc.filePath, tc.wantErr)
+                       }
+               })
+       }
+}
+
+func TestURLFromFilePath(t *testing.T) {
+       for _, tc := range urlTests {
+               if tc.filePath == "" {
+                       continue
+               }
+               tc := tc
+
+               t.Run(tc.filePath, func(t *testing.T) {
+                       u, err := urlFromFilePath(tc.filePath)
+                       if err != nil {
+                               if err.Error() == tc.wantErr {
+                                       return
+                               }
+                               if tc.wantErr == "" {
+                                       t.Fatalf("urlFromFilePath(%v): %v; want <nil>", tc.filePath, err)
+                               } else {
+                                       t.Fatalf("urlFromFilePath(%v): %v; want %s", tc.filePath, err, tc.wantErr)
+                               }
+                       }
+
+                       if tc.wantErr != "" {
+                               t.Fatalf("urlFromFilePath(%v) = <nil>; want error: %s", tc.filePath, tc.wantErr)
+                       }
+
+                       wantURL := tc.url
+                       if tc.canonicalURL != "" {
+                               wantURL = tc.canonicalURL
+                       }
+                       if u.String() != wantURL {
+                               t.Errorf("urlFromFilePath(%v) = %v; want %s", tc.filePath, u, wantURL)
+                       }
+               })
+       }
+}
diff --git a/libgo/go/cmd/go/internal/web/url_windows.go b/libgo/go/cmd/go/internal/web/url_windows.go
new file mode 100644 (file)
index 0000000..2a65ec8
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package web
+
+import (
+       "errors"
+       "path/filepath"
+       "strings"
+)
+
+func convertFileURLPath(host, path string) (string, error) {
+       if len(path) == 0 || path[0] != '/' {
+               return "", errNotAbsolute
+       }
+
+       path = filepath.FromSlash(path)
+
+       // We interpret Windows file URLs per the description in
+       // https://blogs.msdn.microsoft.com/ie/2006/12/06/file-uris-in-windows/.
+
+       // The host part of a file URL (if any) is the UNC volume name,
+       // but RFC 8089 reserves the authority "localhost" for the local machine.
+       if host != "" && host != "localhost" {
+               // A common "legacy" format omits the leading slash before a drive letter,
+               // encoding the drive letter as the host instead of part of the path.
+               // (See https://blogs.msdn.microsoft.com/freeassociations/2005/05/19/the-bizarre-and-unhappy-story-of-file-urls/.)
+               // We do not support that format, but we should at least emit a more
+               // helpful error message for it.
+               if filepath.VolumeName(host) != "" {
+                       return "", errors.New("file URL encodes volume in host field: too few slashes?")
+               }
+               return `\\` + host + path, nil
+       }
+
+       // If host is empty, path must contain an initial slash followed by a
+       // drive letter and path. Remove the slash and verify that the path is valid.
+       if vol := filepath.VolumeName(path[1:]); vol == "" || strings.HasPrefix(vol, `\\`) {
+               return "", errors.New("file URL missing drive letter")
+       }
+       return path[1:], nil
+}
diff --git a/libgo/go/cmd/go/internal/web/url_windows_test.go b/libgo/go/cmd/go/internal/web/url_windows_test.go
new file mode 100644 (file)
index 0000000..06386a0
--- /dev/null
@@ -0,0 +1,94 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package web
+
+var urlTests = []struct {
+       url          string
+       filePath     string
+       canonicalURL string // If empty, assume equal to url.
+       wantErr      string
+}{
+       // Examples from https://blogs.msdn.microsoft.com/ie/2006/12/06/file-uris-in-windows/:
+
+       {
+               url:      `file://laptop/My%20Documents/FileSchemeURIs.doc`,
+               filePath: `\\laptop\My Documents\FileSchemeURIs.doc`,
+       },
+       {
+               url:      `file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc`,
+               filePath: `C:\Documents and Settings\davris\FileSchemeURIs.doc`,
+       },
+       {
+               url:      `file:///D:/Program%20Files/Viewer/startup.htm`,
+               filePath: `D:\Program Files\Viewer\startup.htm`,
+       },
+       {
+               url:          `file:///C:/Program%20Files/Music/Web%20Sys/main.html?REQUEST=RADIO`,
+               filePath:     `C:\Program Files\Music\Web Sys\main.html`,
+               canonicalURL: `file:///C:/Program%20Files/Music/Web%20Sys/main.html`,
+       },
+       {
+               url:      `file://applib/products/a-b/abc_9/4148.920a/media/start.swf`,
+               filePath: `\\applib\products\a-b\abc_9\4148.920a\media\start.swf`,
+       },
+       {
+               url:     `file:////applib/products/a%2Db/abc%5F9/4148.920a/media/start.swf`,
+               wantErr: "file URL missing drive letter",
+       },
+       {
+               url:     `C:\Program Files\Music\Web Sys\main.html?REQUEST=RADIO`,
+               wantErr: "non-file URL",
+       },
+
+       // The example "file://D:\Program Files\Viewer\startup.htm" errors out in
+       // url.Parse, so we substitute a slash-based path for testing instead.
+       {
+               url:     `file://D:/Program Files/Viewer/startup.htm`,
+               wantErr: "file URL encodes volume in host field: too few slashes?",
+       },
+
+       // The blog post discourages the use of non-ASCII characters because they
+       // depend on the user's current codepage. However, when we are working with Go
+       // strings we assume UTF-8 encoding, and our url package refuses to encode
+       // URLs to non-ASCII strings.
+       {
+               url:          `file:///C:/exampleㄓ.txt`,
+               filePath:     `C:\exampleㄓ.txt`,
+               canonicalURL: `file:///C:/example%E3%84%93.txt`,
+       },
+       {
+               url:      `file:///C:/example%E3%84%93.txt`,
+               filePath: `C:\exampleㄓ.txt`,
+       },
+
+       // Examples from RFC 8089:
+
+       // We allow the drive-letter variation from section E.2, because it is
+       // simpler to support than not to. However, we do not generate the shorter
+       // form in the reverse direction.
+       {
+               url:          `file:c:/path/to/file`,
+               filePath:     `c:\path\to\file`,
+               canonicalURL: `file:///c:/path/to/file`,
+       },
+
+       // We encode the UNC share name as the authority following section E.3.1,
+       // because that is what the Microsoft blog post explicitly recommends.
+       {
+               url:      `file://host.example.com/Share/path/to/file.txt`,
+               filePath: `\\host.example.com\Share\path\to\file.txt`,
+       },
+
+       // We decline the four- and five-slash variations from section E.3.2.
+       // The paths in these URLs would change meaning under path.Clean.
+       {
+               url:     `file:////host.example.com/path/to/file`,
+               wantErr: "file URL missing drive letter",
+       },
+       {
+               url:     `file://///host.example.com/path/to/file`,
+               wantErr: "file URL missing drive letter",
+       },
+}
diff --git a/libgo/go/cmd/go/internal/web2/web.go b/libgo/go/cmd/go/internal/web2/web.go
deleted file mode 100644 (file)
index 64934f1..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package web2
-
-import (
-       "bytes"
-       "cmd/go/internal/base"
-       "cmd/go/internal/cfg"
-       "encoding/json"
-       "flag"
-       "fmt"
-       "io"
-       "io/ioutil"
-       "log"
-       "net/http"
-       "os"
-       "path/filepath"
-       "runtime"
-       "runtime/debug"
-       "strings"
-       "sync"
-)
-
-var TraceGET = false
-var webstack = false
-
-func init() {
-       flag.BoolVar(&TraceGET, "webtrace", TraceGET, "trace GET requests")
-       flag.BoolVar(&webstack, "webstack", webstack, "print stack for GET requests")
-}
-
-type netrcLine struct {
-       machine  string
-       login    string
-       password string
-}
-
-var netrcOnce sync.Once
-var netrc []netrcLine
-
-func parseNetrc(data string) []netrcLine {
-       var nrc []netrcLine
-       var l netrcLine
-       for _, line := range strings.Split(data, "\n") {
-               f := strings.Fields(line)
-               for i := 0; i < len(f)-1; i += 2 {
-                       switch f[i] {
-                       case "machine":
-                               l.machine = f[i+1]
-                       case "login":
-                               l.login = f[i+1]
-                       case "password":
-                               l.password = f[i+1]
-                       }
-               }
-               if l.machine != "" && l.login != "" && l.password != "" {
-                       nrc = append(nrc, l)
-                       l = netrcLine{}
-               }
-       }
-       return nrc
-}
-
-func havePassword(machine string) bool {
-       netrcOnce.Do(readNetrc)
-       for _, line := range netrc {
-               if line.machine == machine {
-                       return true
-               }
-       }
-       return false
-}
-
-func netrcPath() string {
-       switch runtime.GOOS {
-       case "windows":
-               return filepath.Join(os.Getenv("USERPROFILE"), "_netrc")
-       case "plan9":
-               return filepath.Join(os.Getenv("home"), ".netrc")
-       default:
-               return filepath.Join(os.Getenv("HOME"), ".netrc")
-       }
-}
-
-func readNetrc() {
-       data, err := ioutil.ReadFile(netrcPath())
-       if err != nil {
-               return
-       }
-       netrc = parseNetrc(string(data))
-}
-
-type getState struct {
-       req      *http.Request
-       resp     *http.Response
-       body     io.ReadCloser
-       non200ok bool
-}
-
-type Option interface {
-       option(*getState) error
-}
-
-func Non200OK() Option {
-       return optionFunc(func(g *getState) error {
-               g.non200ok = true
-               return nil
-       })
-}
-
-type optionFunc func(*getState) error
-
-func (f optionFunc) option(g *getState) error {
-       return f(g)
-}
-
-func DecodeJSON(dst interface{}) Option {
-       return optionFunc(func(g *getState) error {
-               if g.resp != nil {
-                       return json.NewDecoder(g.body).Decode(dst)
-               }
-               return nil
-       })
-}
-
-func ReadAllBody(body *[]byte) Option {
-       return optionFunc(func(g *getState) error {
-               if g.resp != nil {
-                       var err error
-                       *body, err = ioutil.ReadAll(g.body)
-                       return err
-               }
-               return nil
-       })
-}
-
-func Body(body *io.ReadCloser) Option {
-       return optionFunc(func(g *getState) error {
-               if g.resp != nil {
-                       *body = g.body
-                       g.body = nil
-               }
-               return nil
-       })
-}
-
-func Header(hdr *http.Header) Option {
-       return optionFunc(func(g *getState) error {
-               if g.resp != nil {
-                       *hdr = CopyHeader(g.resp.Header)
-               }
-               return nil
-       })
-}
-
-func CopyHeader(hdr http.Header) http.Header {
-       if hdr == nil {
-               return nil
-       }
-       h2 := make(http.Header)
-       for k, v := range hdr {
-               v2 := make([]string, len(v))
-               copy(v2, v)
-               h2[k] = v2
-       }
-       return h2
-}
-
-var cache struct {
-       mu    sync.Mutex
-       byURL map[string]*cacheEntry
-}
-
-type cacheEntry struct {
-       mu   sync.Mutex
-       resp *http.Response
-       body []byte
-}
-
-var httpDo = http.DefaultClient.Do
-
-func SetHTTPDoForTesting(do func(*http.Request) (*http.Response, error)) {
-       if do == nil {
-               do = http.DefaultClient.Do
-       }
-       httpDo = do
-}
-
-func Get(url string, options ...Option) error {
-       if TraceGET || webstack || cfg.BuildV {
-               log.Printf("Fetching %s", url)
-               if webstack {
-                       log.Println(string(debug.Stack()))
-               }
-       }
-
-       req, err := http.NewRequest("GET", url, nil)
-       if err != nil {
-               return err
-       }
-
-       netrcOnce.Do(readNetrc)
-       for _, l := range netrc {
-               if l.machine == req.URL.Host {
-                       req.SetBasicAuth(l.login, l.password)
-                       break
-               }
-       }
-
-       g := &getState{req: req}
-       for _, o := range options {
-               if err := o.option(g); err != nil {
-                       return err
-               }
-       }
-
-       cache.mu.Lock()
-       e := cache.byURL[url]
-       if e == nil {
-               e = new(cacheEntry)
-               if !strings.HasPrefix(url, "file:") {
-                       if cache.byURL == nil {
-                               cache.byURL = make(map[string]*cacheEntry)
-                       }
-                       cache.byURL[url] = e
-               }
-       }
-       cache.mu.Unlock()
-
-       e.mu.Lock()
-       if strings.HasPrefix(url, "file:") {
-               body, err := ioutil.ReadFile(req.URL.Path)
-               if err != nil {
-                       e.mu.Unlock()
-                       return err
-               }
-               e.body = body
-               e.resp = &http.Response{
-                       StatusCode: 200,
-               }
-       } else if e.resp == nil {
-               resp, err := httpDo(req)
-               if err != nil {
-                       e.mu.Unlock()
-                       return err
-               }
-               e.resp = resp
-               // TODO: Spool to temp file.
-               body, err := ioutil.ReadAll(resp.Body)
-               resp.Body.Close()
-               resp.Body = nil
-               if err != nil {
-                       e.mu.Unlock()
-                       return err
-               }
-               e.body = body
-       }
-       g.resp = e.resp
-       g.body = ioutil.NopCloser(bytes.NewReader(e.body))
-       e.mu.Unlock()
-
-       defer func() {
-               if g.body != nil {
-                       g.body.Close()
-               }
-       }()
-
-       if g.resp.StatusCode == 403 && req.URL.Host == "api.github.com" && !havePassword("api.github.com") {
-               base.Errorf("%s", githubMessage)
-       }
-       if !g.non200ok && g.resp.StatusCode != 200 {
-               return fmt.Errorf("unexpected status (%s): %v", url, g.resp.Status)
-       }
-
-       for _, o := range options {
-               if err := o.option(g); err != nil {
-                       return err
-               }
-       }
-       return err
-}
-
-var githubMessage = `go: 403 response from api.github.com
-
-GitHub applies fairly small rate limits to unauthenticated users, and
-you appear to be hitting them. To authenticate, please visit
-https://github.com/settings/tokens and click "Generate New Token" to
-create a Personal Access Token. The token only needs "public_repo"
-scope, but you can add "repo" if you want to access private
-repositories too.
-
-Add the token to your $HOME/.netrc (%USERPROFILE%\_netrc on Windows):
-
-    machine api.github.com login YOU password TOKEN
-
-Sorry for the interruption.
-`
diff --git a/libgo/go/cmd/go/internal/web2/web_test.go b/libgo/go/cmd/go/internal/web2/web_test.go
deleted file mode 100644 (file)
index c6f6b1e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package web2
-
-import (
-       "reflect"
-       "testing"
-)
-
-var testNetrc = `
-machine api.github.com
-  login user
-  password pwd
-
-machine incomlete.host
-  login justlogin
-  
-machine test.host
-login user2
-password pwd2
-`
-
-func TestReadNetrc(t *testing.T) {
-       lines := parseNetrc(testNetrc)
-       want := []netrcLine{
-               {"api.github.com", "user", "pwd"},
-               {"test.host", "user2", "pwd2"},
-       }
-
-       if !reflect.DeepEqual(lines, want) {
-               t.Errorf("parseNetrc:\nhave %q\nwant %q", lines, want)
-       }
-}
diff --git a/libgo/go/cmd/go/internal/webtest/test.go b/libgo/go/cmd/go/internal/webtest/test.go
deleted file mode 100644 (file)
index 94b20a3..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package webtest
-
-import (
-       "bufio"
-       "bytes"
-       "encoding/hex"
-       "flag"
-       "fmt"
-       "io"
-       "io/ioutil"
-       "log"
-       "net/http"
-       "os"
-       "sort"
-       "strconv"
-       "strings"
-       "sync"
-       "unicode/utf8"
-
-       web "cmd/go/internal/web2"
-)
-
-var mode = flag.String("webtest", "replay", "set webtest `mode` - record, replay, bypass")
-
-func Hook() {
-       if *mode == "bypass" {
-               return
-       }
-       web.SetHTTPDoForTesting(Do)
-}
-
-func Unhook() {
-       web.SetHTTPDoForTesting(nil)
-}
-
-func Print() {
-       web.SetHTTPDoForTesting(DoPrint)
-}
-
-var responses struct {
-       mu    sync.Mutex
-       byURL map[string]*respEntry
-}
-
-type respEntry struct {
-       status string
-       code   int
-       hdr    http.Header
-       body   []byte
-}
-
-func Serve(url string, status string, hdr http.Header, body []byte) {
-       if status == "" {
-               status = "200 OK"
-       }
-       code, err := strconv.Atoi(strings.Fields(status)[0])
-       if err != nil {
-               panic("bad Serve status - " + status + " - " + err.Error())
-       }
-
-       responses.mu.Lock()
-       defer responses.mu.Unlock()
-
-       if responses.byURL == nil {
-               responses.byURL = make(map[string]*respEntry)
-       }
-       responses.byURL[url] = &respEntry{status: status, code: code, hdr: web.CopyHeader(hdr), body: body}
-}
-
-func Do(req *http.Request) (*http.Response, error) {
-       if req.Method != "GET" {
-               return nil, fmt.Errorf("bad method - must be GET")
-       }
-
-       responses.mu.Lock()
-       e := responses.byURL[req.URL.String()]
-       responses.mu.Unlock()
-
-       if e == nil {
-               if *mode == "record" {
-                       loaded.mu.Lock()
-                       if len(loaded.did) != 1 {
-                               loaded.mu.Unlock()
-                               return nil, fmt.Errorf("cannot use -webtest=record with multiple loaded response files")
-                       }
-                       var file string
-                       for file = range loaded.did {
-                               break
-                       }
-                       loaded.mu.Unlock()
-                       return doSave(file, req)
-               }
-               e = &respEntry{code: 599, status: "599 unexpected request (no canned response)"}
-       }
-       resp := &http.Response{
-               Status:     e.status,
-               StatusCode: e.code,
-               Header:     web.CopyHeader(e.hdr),
-               Body:       ioutil.NopCloser(bytes.NewReader(e.body)),
-       }
-       return resp, nil
-}
-
-func DoPrint(req *http.Request) (*http.Response, error) {
-       return doSave("", req)
-}
-
-func doSave(file string, req *http.Request) (*http.Response, error) {
-       resp, err := http.DefaultClient.Do(req)
-       if err != nil {
-               return nil, err
-       }
-       data, err := ioutil.ReadAll(resp.Body)
-       resp.Body.Close()
-       if err != nil {
-               return nil, err
-       }
-       resp.Body = ioutil.NopCloser(bytes.NewReader(data))
-
-       var f *os.File
-       if file == "" {
-               f = os.Stderr
-       } else {
-               f, err = os.OpenFile(file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
-               if err != nil {
-                       log.Fatal(err)
-               }
-               defer f.Close()
-       }
-
-       fmt.Fprintf(f, "GET %s\n", req.URL.String())
-       fmt.Fprintf(f, "%s\n", resp.Status)
-       var keys []string
-       for k := range resp.Header {
-               keys = append(keys, k)
-       }
-       sort.Strings(keys)
-       for _, k := range keys {
-               if k == "Set-Cookie" {
-                       continue
-               }
-               for _, v := range resp.Header[k] {
-                       fmt.Fprintf(f, "%s: %s\n", k, v)
-               }
-       }
-       fmt.Fprintf(f, "\n")
-       if utf8.Valid(data) && !bytes.Contains(data, []byte("\nGET")) && !isHexDump(data) {
-               fmt.Fprintf(f, "%s\n\n", data)
-       } else {
-               fmt.Fprintf(f, "%s\n", hex.Dump(data))
-       }
-       return resp, err
-}
-
-var loaded struct {
-       mu  sync.Mutex
-       did map[string]bool
-}
-
-func LoadOnce(file string) {
-       loaded.mu.Lock()
-       if loaded.did[file] {
-               loaded.mu.Unlock()
-               return
-       }
-       if loaded.did == nil {
-               loaded.did = make(map[string]bool)
-       }
-       loaded.did[file] = true
-       loaded.mu.Unlock()
-
-       f, err := os.Open(file)
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer f.Close()
-
-       b := bufio.NewReader(f)
-       var ungetLine string
-       nextLine := func() string {
-               if ungetLine != "" {
-                       l := ungetLine
-                       ungetLine = ""
-                       return l
-               }
-               line, err := b.ReadString('\n')
-               if err != nil {
-                       if err == io.EOF {
-                               return ""
-                       }
-                       log.Fatalf("%s: unexpected read error: %v", file, err)
-               }
-               return line
-       }
-
-       for {
-               line := nextLine()
-               if line == "" { // EOF
-                       break
-               }
-               line = strings.TrimSpace(line)
-               if strings.HasPrefix(line, "#") || line == "" {
-                       continue
-               }
-               if !strings.HasPrefix(line, "GET ") {
-                       log.Fatalf("%s: malformed GET line: %s", file, line)
-               }
-               url := line[len("GET "):]
-               status := nextLine()
-               if _, err := strconv.Atoi(strings.Fields(status)[0]); err != nil {
-                       log.Fatalf("%s: malformed status line (after GET %s): %s", file, url, status)
-               }
-               hdr := make(http.Header)
-               for {
-                       kv := strings.TrimSpace(nextLine())
-                       if kv == "" {
-                               break
-                       }
-                       i := strings.Index(kv, ":")
-                       if i < 0 {
-                               log.Fatalf("%s: malformed header line (after GET %s): %s", file, url, kv)
-                       }
-                       k, v := kv[:i], strings.TrimSpace(kv[i+1:])
-                       hdr[k] = append(hdr[k], v)
-               }
-
-               var body []byte
-       Body:
-               for n := 0; ; n++ {
-                       line := nextLine()
-                       if n == 0 && isHexDump([]byte(line)) {
-                               ungetLine = line
-                               b, err := parseHexDump(nextLine)
-                               if err != nil {
-                                       log.Fatalf("%s: malformed hex dump (after GET %s): %v", file, url, err)
-                               }
-                               body = b
-                               break
-                       }
-                       if line == "" { // EOF
-                               for i := 0; i < 2; i++ {
-                                       if len(body) > 0 && body[len(body)-1] == '\n' {
-                                               body = body[:len(body)-1]
-                                       }
-                               }
-                               break
-                       }
-                       body = append(body, line...)
-                       for line == "\n" {
-                               line = nextLine()
-                               if strings.HasPrefix(line, "GET ") {
-                                       ungetLine = line
-                                       body = body[:len(body)-1]
-                                       if len(body) > 0 {
-                                               body = body[:len(body)-1]
-                                       }
-                                       break Body
-                               }
-                               body = append(body, line...)
-                       }
-               }
-
-               Serve(url, status, hdr, body)
-       }
-}
-
-func isHexDump(data []byte) bool {
-       return bytes.HasPrefix(data, []byte("00000000  ")) || bytes.HasPrefix(data, []byte("0000000 "))
-}
-
-// parseHexDump parses the hex dump in text, which should be the
-// output of "hexdump -C" or Plan 9's "xd -b" or Go's hex.Dump
-// and returns the original data used to produce the dump.
-// It is meant to enable storing golden binary files as text, so that
-// changes to the golden files can be seen during code reviews.
-func parseHexDump(nextLine func() string) ([]byte, error) {
-       var out []byte
-       for {
-               line := nextLine()
-               if line == "" || line == "\n" {
-                       break
-               }
-               if i := strings.Index(line, "|"); i >= 0 { // remove text dump
-                       line = line[:i]
-               }
-               f := strings.Fields(line)
-               if len(f) > 1+16 {
-                       return nil, fmt.Errorf("parsing hex dump: too many fields on line %q", line)
-               }
-               if len(f) == 0 || len(f) == 1 && f[0] == "*" { // all zeros block omitted
-                       continue
-               }
-               addr64, err := strconv.ParseUint(f[0], 16, 0)
-               if err != nil {
-                       return nil, fmt.Errorf("parsing hex dump: invalid address %q", f[0])
-               }
-               addr := int(addr64)
-               if len(out) < addr {
-                       out = append(out, make([]byte, addr-len(out))...)
-               }
-               for _, x := range f[1:] {
-                       val, err := strconv.ParseUint(x, 16, 8)
-                       if err != nil {
-                               return nil, fmt.Errorf("parsing hexdump: invalid hex byte %q", x)
-                       }
-                       out = append(out, byte(val))
-               }
-       }
-       return out, nil
-}
index 1cc701d2ae31ca4e8ad76217fc9f9d00f059d73f..eabac6bd14e1412210decc8a50e5b2110bdb92ea 100644 (file)
@@ -17,8 +17,10 @@ import (
        "io/ioutil"
        "os"
        "path/filepath"
+       "runtime"
        "strings"
        "sync"
+       "time"
 
        "cmd/go/internal/base"
        "cmd/go/internal/cache"
@@ -83,15 +85,17 @@ type Action struct {
        actionID cache.ActionID // cache ID of action input
        buildID  string         // build ID of action output
 
-       VetxOnly bool       // Mode=="vet": only being called to supply info about dependencies
-       needVet  bool       // Mode=="build": need to fill in vet config
-       vetCfg   *vetConfig // vet config
-       output   []byte     // output redirect buffer (nil means use b.Print)
+       VetxOnly  bool       // Mode=="vet": only being called to supply info about dependencies
+       needVet   bool       // Mode=="build": need to fill in vet config
+       needBuild bool       // Mode=="build": need to do actual build (can be false if needVet is true)
+       vetCfg    *vetConfig // vet config
+       output    []byte     // output redirect buffer (nil means use b.Print)
 
        // Execution state.
-       pending  int  // number of deps yet to complete
-       priority int  // relative execution priority
-       Failed   bool // whether the action failed
+       pending  int         // number of deps yet to complete
+       priority int         // relative execution priority
+       Failed   bool        // whether the action failed
+       json     *actionJSON // action graph information
 }
 
 // BuildActionID returns the action ID section of a's build ID.
@@ -123,6 +127,9 @@ func (q *actionQueue) Pop() interface{} {
 }
 
 func (q *actionQueue) push(a *Action) {
+       if a.json != nil {
+               a.json.TimeReady = time.Now()
+       }
        heap.Push(q, a)
 }
 
@@ -134,16 +141,28 @@ type actionJSON struct {
        ID         int
        Mode       string
        Package    string
-       Deps       []int    `json:",omitempty"`
-       IgnoreFail bool     `json:",omitempty"`
-       Args       []string `json:",omitempty"`
-       Link       bool     `json:",omitempty"`
-       Objdir     string   `json:",omitempty"`
-       Target     string   `json:",omitempty"`
-       Priority   int      `json:",omitempty"`
-       Failed     bool     `json:",omitempty"`
-       Built      string   `json:",omitempty"`
-       VetxOnly   bool     `json:",omitempty"`
+       Deps       []int     `json:",omitempty"`
+       IgnoreFail bool      `json:",omitempty"`
+       Args       []string  `json:",omitempty"`
+       Link       bool      `json:",omitempty"`
+       Objdir     string    `json:",omitempty"`
+       Target     string    `json:",omitempty"`
+       Priority   int       `json:",omitempty"`
+       Failed     bool      `json:",omitempty"`
+       Built      string    `json:",omitempty"`
+       VetxOnly   bool      `json:",omitempty"`
+       NeedVet    bool      `json:",omitempty"`
+       NeedBuild  bool      `json:",omitempty"`
+       ActionID   string    `json:",omitempty"`
+       BuildID    string    `json:",omitempty"`
+       TimeReady  time.Time `json:",omitempty"`
+       TimeStart  time.Time `json:",omitempty"`
+       TimeDone   time.Time `json:",omitempty"`
+
+       Cmd     []string      // `json:",omitempty"`
+       CmdReal time.Duration `json:",omitempty"`
+       CmdUser time.Duration `json:",omitempty"`
+       CmdSys  time.Duration `json:",omitempty"`
 }
 
 // cacheKey is the key for the action cache.
@@ -173,26 +192,30 @@ func actionGraphJSON(a *Action) string {
 
        var list []*actionJSON
        for id, a := range workq {
-               aj := &actionJSON{
-                       Mode:       a.Mode,
-                       ID:         id,
-                       IgnoreFail: a.IgnoreFail,
-                       Args:       a.Args,
-                       Objdir:     a.Objdir,
-                       Target:     a.Target,
-                       Failed:     a.Failed,
-                       Priority:   a.priority,
-                       Built:      a.built,
-                       VetxOnly:   a.VetxOnly,
-               }
-               if a.Package != nil {
-                       // TODO(rsc): Make this a unique key for a.Package somehow.
-                       aj.Package = a.Package.ImportPath
-               }
-               for _, a1 := range a.Deps {
-                       aj.Deps = append(aj.Deps, inWorkq[a1])
+               if a.json == nil {
+                       a.json = &actionJSON{
+                               Mode:       a.Mode,
+                               ID:         id,
+                               IgnoreFail: a.IgnoreFail,
+                               Args:       a.Args,
+                               Objdir:     a.Objdir,
+                               Target:     a.Target,
+                               Failed:     a.Failed,
+                               Priority:   a.priority,
+                               Built:      a.built,
+                               VetxOnly:   a.VetxOnly,
+                               NeedBuild:  a.needBuild,
+                               NeedVet:    a.needVet,
+                       }
+                       if a.Package != nil {
+                               // TODO(rsc): Make this a unique key for a.Package somehow.
+                               a.json.Package = a.Package.ImportPath
+                       }
+                       for _, a1 := range a.Deps {
+                               a.json.Deps = append(a.json.Deps, inWorkq[a1])
+                       }
                }
-               list = append(list, aj)
+               list = append(list, a.json)
        }
 
        js, err := json.MarshalIndent(list, "", "\t")
@@ -211,6 +234,8 @@ const (
        ModeBuild BuildMode = iota
        ModeInstall
        ModeBuggyInstall
+
+       ModeVetOnly = 1 << 8
 )
 
 func (b *Builder) Init() {
@@ -225,7 +250,7 @@ func (b *Builder) Init() {
        if cfg.BuildN {
                b.WorkDir = "$WORK"
        } else {
-               tmp, err := ioutil.TempDir(os.Getenv("GOTMPDIR"), "go-build")
+               tmp, err := ioutil.TempDir(cfg.Getenv("GOTMPDIR"), "go-build")
                if err != nil {
                        base.Fatalf("go: creating work dir: %v", err)
                }
@@ -243,7 +268,26 @@ func (b *Builder) Init() {
                }
                if !cfg.BuildWork {
                        workdir := b.WorkDir
-                       base.AtExit(func() { os.RemoveAll(workdir) })
+                       base.AtExit(func() {
+                               start := time.Now()
+                               for {
+                                       err := os.RemoveAll(workdir)
+                                       if err == nil {
+                                               return
+                                       }
+
+                                       // On some configurations of Windows, directories containing executable
+                                       // files may be locked for a while after the executable exits (perhaps
+                                       // due to antivirus scans?). It's probably worth a little extra latency
+                                       // on exit to avoid filling up the user's temporary directory with leaked
+                                       // files. (See golang.org/issue/30789.)
+                                       if runtime.GOOS != "windows" || time.Since(start) >= 500*time.Millisecond {
+                                               fmt.Fprintf(os.Stderr, "go: failed to remove work dir: %s\n", err)
+                                               return
+                                       }
+                                       time.Sleep(5 * time.Millisecond)
+                               }
+                       })
                }
        }
 
@@ -294,7 +338,7 @@ func readpkglist(shlibpath string) (pkgs []*load.Package) {
                        if strings.HasPrefix(t, "pkgpath ") {
                                t = strings.TrimPrefix(t, "pkgpath ")
                                t = strings.TrimSuffix(t, ";")
-                               pkgs = append(pkgs, load.LoadPackage(t, &stk))
+                               pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd, nil, &stk, nil, 0))
                        }
                }
        } else {
@@ -305,7 +349,7 @@ func readpkglist(shlibpath string) (pkgs []*load.Package) {
                scanner := bufio.NewScanner(bytes.NewBuffer(pkglistbytes))
                for scanner.Scan() {
                        t := scanner.Text()
-                       pkgs = append(pkgs, load.LoadPackage(t, &stk))
+                       pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd, nil, &stk, nil, 0))
                }
        }
        return
@@ -338,6 +382,9 @@ func (b *Builder) AutoAction(mode, depMode BuildMode, p *load.Package) *Action {
 // depMode is the action (build or install) to use when building dependencies.
 // To turn package main into an executable, call b.Link instead.
 func (b *Builder) CompileAction(mode, depMode BuildMode, p *load.Package) *Action {
+       vetOnly := mode&ModeVetOnly != 0
+       mode &^= ModeVetOnly
+
        if mode != ModeBuild && (p.Internal.Local || p.Module != nil) && p.Target == "" {
                // Imported via local path or using modules. No permanent target.
                mode = ModeBuild
@@ -384,6 +431,19 @@ func (b *Builder) CompileAction(mode, depMode BuildMode, p *load.Package) *Actio
                return a
        })
 
+       // Find the build action; the cache entry may have been replaced
+       // by the install action during (*Builder).installAction.
+       buildAction := a
+       switch buildAction.Mode {
+       case "build", "built-in package", "gccgo stdlib":
+               // ok
+       case "build-install":
+               buildAction = a.Deps[0]
+       default:
+               panic("lost build action: " + buildAction.Mode)
+       }
+       buildAction.needBuild = buildAction.needBuild || !vetOnly
+
        // Construct install action.
        if mode == ModeInstall || mode == ModeBuggyInstall {
                a = b.installAction(a, mode)
@@ -405,12 +465,12 @@ func (b *Builder) VetAction(mode, depMode BuildMode, p *load.Package) *Action {
 func (b *Builder) vetAction(mode, depMode BuildMode, p *load.Package) *Action {
        // Construct vet action.
        a := b.cacheAction("vet", p, func() *Action {
-               a1 := b.CompileAction(mode, depMode, p)
+               a1 := b.CompileAction(mode|ModeVetOnly, depMode, p)
 
                // vet expects to be able to import "fmt".
                var stk load.ImportStack
                stk.Push("vet")
-               p1 := load.LoadPackage("fmt", &stk)
+               p1 := load.LoadImportWithFlags("fmt", p.Dir, p, &stk, nil, 0)
                stk.Pop()
                aFmt := b.CompileAction(ModeBuild, depMode, p1)
 
@@ -424,7 +484,7 @@ func (b *Builder) vetAction(mode, depMode BuildMode, p *load.Package) *Action {
                } else {
                        deps = []*Action{a1, aFmt}
                }
-               for _, p1 := range load.PackageList(p.Internal.Imports) {
+               for _, p1 := range p.Internal.Imports {
                        deps = append(deps, b.vetAction(mode, depMode, p1))
                }
 
@@ -710,7 +770,7 @@ func (b *Builder) linkSharedAction(mode, depMode BuildMode, shlib string, a1 *Ac
                                        }
                                }
                                var stk load.ImportStack
-                               p := load.LoadPackage(pkg, &stk)
+                               p := load.LoadImportWithFlags(pkg, base.Cwd, nil, &stk, nil, 0)
                                if p.Error != nil {
                                        base.Fatalf("load %s: %v", pkg, p.Error)
                                }
index ed66df22c33b4714b1251ebfcca9c0ded7453a29..ed5a149da355f82fb4e0d6219b8b3c11f19ca255 100644 (file)
@@ -27,8 +27,8 @@ var CmdBuild = &base.Command{
 Build compiles the packages named by the import paths,
 along with their dependencies, but it does not install the results.
 
-If the arguments to build are a list of .go files, build treats
-them as a list of source files specifying a single package.
+If the arguments to build are a list of .go files from a single directory,
+build treats them as a list of source files specifying a single package.
 
 When compiling a single main package, build writes
 the resulting executable to an output file named after
@@ -42,10 +42,10 @@ serving only as a check that the packages can be built.
 
 When compiling packages, build ignores files that end in '_test.go'.
 
-The -o flag, only allowed when compiling a single package,
-forces build to write the resulting executable or object
-to the named output file, instead of the default behavior described
-in the last two paragraphs.
+The -o flag forces build to write the resulting executable or object
+to the named output file or directory, instead of the default behavior described
+in the last two paragraphs. If the named output is a directory that exists,
+then any resulting executables will be written to that directory.
 
 The -i flag installs the packages that are dependencies of the target.
 
@@ -104,10 +104,18 @@ and test commands:
                install and load all packages from dir instead of the usual locations.
                For example, when building with a non-standard configuration,
                use -pkgdir to keep generated packages in a separate location.
-       -tags 'tag list'
-               a space-separated list of build tags to consider satisfied during the
+       -tags tag,list
+               a comma-separated list of build tags to consider satisfied during the
                build. For more information about build tags, see the description of
                build constraints in the documentation for the go/build package.
+               (Earlier versions of Go used a space-separated list, and that form
+               is deprecated but still recognized.)
+       -trimpath
+               remove all file system paths from the resulting executable.
+               Instead of absolute file system paths, the recorded file names
+               will begin with either "go" (for the standard library),
+               or a module path@version (when using modules),
+               or a plain import path (when using GOPATH).
        -toolexec 'cmd args'
                a program to use to invoke toolchain programs like vet and asm.
                For example, instead of running asm, the go command will run
@@ -153,7 +161,7 @@ func init() {
        CmdInstall.Run = runInstall
 
        CmdBuild.Flag.BoolVar(&cfg.BuildI, "i", false, "")
-       CmdBuild.Flag.StringVar(&cfg.BuildO, "o", "", "output file")
+       CmdBuild.Flag.StringVar(&cfg.BuildO, "o", "", "output file or directory")
 
        CmdInstall.Flag.BoolVar(&cfg.BuildI, "i", false, "")
 
@@ -227,14 +235,38 @@ func AddBuildFlags(cmd *base.Command) {
        cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "")
        cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "")
        cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "")
-       cmd.Flag.Var((*base.StringsFlag)(&cfg.BuildContext.BuildTags), "tags", "")
+       cmd.Flag.Var((*tagsFlag)(&cfg.BuildContext.BuildTags), "tags", "")
        cmd.Flag.Var((*base.StringsFlag)(&cfg.BuildToolexec), "toolexec", "")
+       cmd.Flag.BoolVar(&cfg.BuildTrimpath, "trimpath", false, "")
        cmd.Flag.BoolVar(&cfg.BuildWork, "work", false, "")
 
        // Undocumented, unstable debugging flags.
        cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
 }
 
+// tagsFlag is the implementation of the -tags flag.
+type tagsFlag []string
+
+func (v *tagsFlag) Set(s string) error {
+       // For compatibility with Go 1.12 and earlier, allow "-tags='a b c'" or even just "-tags='a'".
+       if strings.Contains(s, " ") || strings.Contains(s, "'") {
+               return (*base.StringsFlag)(v).Set(s)
+       }
+
+       // Split on commas, ignore empty strings.
+       *v = []string{}
+       for _, s := range strings.Split(s, ",") {
+               if s != "" {
+                       *v = append(*v, s)
+               }
+       }
+       return nil
+}
+
+func (v *tagsFlag) String() string {
+       return "<TagsFlag>"
+}
+
 // fileExtSplit expects a filename and returns the name
 // and ext (without the dot). If the file has no
 // extension, ext will be empty.
@@ -283,6 +315,8 @@ func runBuild(cmd *base.Command, args []string) {
 
        pkgs := load.PackagesForBuild(args)
 
+       explicitO := len(cfg.BuildO) > 0
+
        if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" {
                cfg.BuildO = load.DefaultExecName(pkgs[0].ImportPath)
                cfg.BuildO += cfg.ExeSuffix
@@ -316,8 +350,32 @@ func runBuild(cmd *base.Command, args []string) {
        }
 
        if cfg.BuildO != "" {
+               // If the -o name exists and is a directory, then
+               // write all main packages to that directory.
+               // Otherwise require only a single package be built.
+               if fi, err := os.Stat(cfg.BuildO); err == nil && fi.IsDir() {
+                       if !explicitO {
+                               base.Fatalf("go build: build output %q already exists and is a directory", cfg.BuildO)
+                       }
+                       a := &Action{Mode: "go build"}
+                       for _, p := range pkgs {
+                               if p.Name != "main" {
+                                       continue
+                               }
+                               p.Target = filepath.Join(cfg.BuildO, load.DefaultExecName(p.ImportPath))
+                               p.Target += cfg.ExeSuffix
+                               p.Stale = true
+                               p.StaleReason = "build -o flag in use"
+                               a.Deps = append(a.Deps, b.AutoAction(ModeInstall, depMode, p))
+                       }
+                       if len(a.Deps) == 0 {
+                               base.Fatalf("go build: no main packages to build")
+                       }
+                       b.Do(a)
+                       return
+               }
                if len(pkgs) > 1 {
-                       base.Fatalf("go build: cannot use -o with multiple packages")
+                       base.Fatalf("go build: cannot write multiple packages to non-directory %s", cfg.BuildO)
                } else if len(pkgs) == 0 {
                        base.Fatalf("no packages to build")
                }
@@ -346,6 +404,15 @@ var CmdInstall = &base.Command{
        Long: `
 Install compiles and installs the packages named by the import paths.
 
+Executables are installed in the directory named by the GOBIN environment
+variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH
+environment variable is not set. Executables in $GOROOT
+are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN.
+
+When module-aware mode is disabled, other packages are installed in the
+directory $GOPATH/pkg/$GOOS_$GOARCH. When module-aware mode is enabled,
+other packages are built and cached but not installed.
+
 The -i flag installs the dependencies of the named packages as well.
 
 For more about the build flags, see 'go help build'.
index ef95a408ca31bbc7fddbcef31aac019853bc41fe..55e1eea25ba08aaccc0df7b95d962010c65543d4 100644 (file)
@@ -227,8 +227,8 @@ func TestRespectSetgidDir(t *testing.T) {
                if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
                        t.Skip("can't set SetGID bit with chmod on iOS")
                }
-       case "windows", "plan9", "js":
-               t.Skip("chown/chmod setgid are not supported on Windows, Plan 9, or JS")
+       case "windows", "plan9":
+               t.Skip("chown/chmod setgid are not supported on Windows or Plan 9")
        }
 
        var b Builder
index 750bc3c6cdbe450e5c6e87bd953bd174a61ee974..1f6d1e8e779a3160165796e2adc9e43962cae690 100644 (file)
@@ -159,7 +159,7 @@ func hashToString(h [cache.HashSize]byte) string {
 // which influences the action ID half of the build ID, is based on the content ID,
 // then the Linux compiler binary and Mac compiler binary will have different tool IDs
 // and therefore produce executables with different action IDs.
-// To avoids this problem, for releases we use the release version string instead
+// To avoid this problem, for releases we use the release version string instead
 // of the compiler binary's content hash. This assumes that all compilers built
 // on all different systems are semantically equivalent, which is of course only true
 // modulo bugs. (Producing the exact same executables also requires that the different
@@ -215,7 +215,7 @@ func (b *Builder) toolID(name string) string {
 }
 
 // gccToolID returns the unique ID to use for a tool that is invoked
-// by the GCC driver. This is in particular gccgo, but this can also
+// by the GCC driver. This is used particularly for gccgo, but this can also
 // be used for gcc, g++, gfortran, etc.; those tools all use the GCC
 // driver under different names. The approach used here should also
 // work for sufficiently new versions of clang. Unlike toolID, the
@@ -326,7 +326,7 @@ func (b *Builder) gccgoBuildIDFile(a *Action) (string, error) {
        var buf bytes.Buffer
        if cfg.Goos == "aix" {
                fmt.Fprintf(&buf, "\t.csect .go.buildid[XO]\n")
-       } else if cfg.Goos != "solaris" || assemblerIsGas() {
+       } else if (cfg.Goos != "solaris" && cfg.Goos != "illumos") || assemblerIsGas() {
                fmt.Fprintf(&buf, "\t"+`.section .go.buildid,"e"`+"\n")
        } else if cfg.Goarch == "sparc" || cfg.Goarch == "sparc64" {
                fmt.Fprintf(&buf, "\t"+`.section ".go.buildid",#exclude`+"\n")
@@ -345,7 +345,7 @@ func (b *Builder) gccgoBuildIDFile(a *Action) (string, error) {
                fmt.Fprintf(&buf, "%#02x", a.buildID[i])
        }
        fmt.Fprintf(&buf, "\n")
-       if cfg.Goos != "solaris" && cfg.Goos != "aix" {
+       if cfg.Goos != "solaris" && cfg.Goos != "illumos" && cfg.Goos != "aix" {
                secType := "@progbits"
                if cfg.Goarch == "arm" {
                        secType = "%progbits"
@@ -423,6 +423,9 @@ func (b *Builder) useCache(a *Action, p *load.Package, actionHash cache.ActionID
        // engineered 96-bit partial SHA256 collision.
        a.actionID = actionHash
        actionID := hashToString(actionHash)
+       if a.json != nil {
+               a.json.ActionID = actionID
+       }
        contentID := actionID // temporary placeholder, likely unique
        a.buildID = actionID + buildIDSeparator + contentID
 
@@ -440,6 +443,9 @@ func (b *Builder) useCache(a *Action, p *load.Package, actionHash cache.ActionID
                buildID, _ = buildid.ReadFile(target)
                if strings.HasPrefix(buildID, actionID+buildIDSeparator) {
                        a.buildID = buildID
+                       if a.json != nil {
+                               a.json.BuildID = a.buildID
+                       }
                        a.built = target
                        // Poison a.Target to catch uses later in the build.
                        a.Target = "DO NOT USE - " + a.Mode
@@ -482,6 +488,9 @@ func (b *Builder) useCache(a *Action, p *load.Package, actionHash cache.ActionID
                                        // Poison a.Target to catch uses later in the build.
                                        a.Target = "DO NOT USE - main build pseudo-cache Target"
                                        a.built = "DO NOT USE - main build pseudo-cache built"
+                                       if a.json != nil {
+                                               a.json.BuildID = a.buildID
+                                       }
                                        return true
                                }
                                // Otherwise restore old build ID for main build.
@@ -549,6 +558,9 @@ func (b *Builder) useCache(a *Action, p *load.Package, actionHash cache.ActionID
                                                a.built = file
                                                a.Target = "DO NOT USE - using cache"
                                                a.buildID = buildID
+                                               if a.json != nil {
+                                                       a.json.BuildID = a.buildID
+                                               }
                                                if p := a.Package; p != nil {
                                                        // Clearer than explaining that something else is stale.
                                                        p.StaleReason = "not installed but available in build cache"
@@ -644,6 +656,9 @@ func (b *Builder) updateBuildID(a *Action, target string, rewrite bool) error {
 
        // Replace with new content-based ID.
        a.buildID = newID
+       if a.json != nil {
+               a.json.BuildID = a.buildID
+       }
        if len(matches) == 0 {
                // Assume the user specified -buildid= to override what we were going to choose.
                return nil
index 530272466141ce980c4795dd85d0cb4c72d0abd7..8e92f9461cf19d84f03b3a8034a7d6bfefdeb3b7 100644 (file)
@@ -8,9 +8,15 @@ package work
 
 import (
        "bytes"
+       "cmd/go/internal/base"
+       "cmd/go/internal/cache"
+       "cmd/go/internal/cfg"
+       "cmd/go/internal/load"
+       "cmd/go/internal/str"
        "encoding/json"
        "errors"
        "fmt"
+       "internal/lazyregexp"
        "io"
        "io/ioutil"
        "log"
@@ -24,12 +30,6 @@ import (
        "strings"
        "sync"
        "time"
-
-       "cmd/go/internal/base"
-       "cmd/go/internal/cache"
-       "cmd/go/internal/cfg"
-       "cmd/go/internal/load"
-       "cmd/go/internal/str"
 )
 
 // actionList returns the list of actions in the dag rooted at root
@@ -75,13 +75,22 @@ func (b *Builder) Do(root *Action) {
                a.priority = i
        }
 
-       if cfg.DebugActiongraph != "" {
-               js := actionGraphJSON(root)
-               if err := ioutil.WriteFile(cfg.DebugActiongraph, []byte(js), 0666); err != nil {
-                       fmt.Fprintf(os.Stderr, "go: writing action graph: %v\n", err)
-                       base.SetExitStatus(1)
+       // Write action graph, without timing information, in case we fail and exit early.
+       writeActionGraph := func() {
+               if file := cfg.DebugActiongraph; file != "" {
+                       if strings.HasSuffix(file, ".go") {
+                               // Do not overwrite Go source code in:
+                               //      go build -debug-actiongraph x.go
+                               base.Fatalf("go: refusing to write action graph to %v\n", file)
+                       }
+                       js := actionGraphJSON(root)
+                       if err := ioutil.WriteFile(file, []byte(js), 0666); err != nil {
+                               fmt.Fprintf(os.Stderr, "go: writing action graph: %v\n", err)
+                               base.SetExitStatus(1)
+                       }
                }
        }
+       writeActionGraph()
 
        b.readySema = make(chan bool, len(all))
 
@@ -100,12 +109,15 @@ func (b *Builder) Do(root *Action) {
        // Handle runs a single action and takes care of triggering
        // any actions that are runnable as a result.
        handle := func(a *Action) {
+               if a.json != nil {
+                       a.json.TimeStart = time.Now()
+               }
                var err error
-
                if a.Func != nil && (!a.Failed || a.IgnoreFail) {
-                       if err == nil {
-                               err = a.Func(b, a)
-                       }
+                       err = a.Func(b, a)
+               }
+               if a.json != nil {
+                       a.json.TimeDone = time.Now()
                }
 
                // The actions run in parallel but all the updates to the
@@ -172,6 +184,9 @@ func (b *Builder) Do(root *Action) {
        }
 
        wg.Wait()
+
+       // Write action graph again, this time with timing information.
+       writeActionGraph()
 }
 
 // buildActionID computes the action ID for a build action.
@@ -196,6 +211,9 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID {
        fmt.Fprintf(h, "goos %s goarch %s\n", cfg.Goos, cfg.Goarch)
        fmt.Fprintf(h, "import %q\n", p.ImportPath)
        fmt.Fprintf(h, "omitdebug %v standard %v local %v prefix %q\n", p.Internal.OmitDebug, p.Standard, p.Internal.Local, p.Internal.LocalPrefix)
+       if cfg.BuildTrimpath {
+               fmt.Fprintln(h, "trimpath")
+       }
        if p.Internal.ForceLibrary {
                fmt.Fprintf(h, "forcelibrary\n")
        }
@@ -225,12 +243,16 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID {
                if len(p.SFiles) > 0 {
                        fmt.Fprintf(h, "asm %q %q %q\n", b.toolID("asm"), forcedAsmflags, p.Internal.Asmflags)
                }
+
                // GO386, GOARM, GOMIPS, etc.
-               baseArch := strings.TrimSuffix(cfg.BuildContext.GOARCH, "le")
-               fmt.Fprintf(h, "GO$GOARCH=%s\n", os.Getenv("GO"+strings.ToUpper(baseArch)))
+               key, val := cfg.GetArchEnv()
+               fmt.Fprintf(h, "%s=%s\n", key, val)
 
                // TODO(rsc): Convince compiler team not to add more magic environment variables,
                // or perhaps restrict the environment variables passed to subprocesses.
+               // Because these are clumsy, undocumented special-case hacks
+               // for debugging the compiler, they are not settable using 'go env -w',
+               // and so here we use os.Getenv, not cfg.Getenv.
                magic := []string{
                        "GOCLOBBERDEADHASH",
                        "GOSSAFUNC",
@@ -267,8 +289,9 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID {
                }
                fmt.Fprintf(h, "compile %s %q %q\n", id, forcedGccgoflags, p.Internal.Gccgoflags)
                fmt.Fprintf(h, "pkgpath %s\n", gccgoPkgpath(p))
+               fmt.Fprintf(h, "ar %q\n", BuildToolchain.(gccgoToolchain).ar())
                if len(p.SFiles) > 0 {
-                       id, err = b.gccgoToolID(BuildToolchain.compiler(), "assembler-with-cpp")
+                       id, _ = b.gccgoToolID(BuildToolchain.compiler(), "assembler-with-cpp")
                        // Ignore error; different assembler versions
                        // are unlikely to make any difference anyhow.
                        fmt.Fprintf(h, "asm %q\n", id)
@@ -364,8 +387,8 @@ func (b *Builder) build(a *Action) (err error) {
                return 0
        }
 
-       cached := false
-       need := bit(needBuild, !b.IsCmdList || b.NeedExport) |
+       cachedBuild := false
+       need := bit(needBuild, !b.IsCmdList && a.needBuild || b.NeedExport) |
                bit(needCgoHdr, b.needCgoHdr(a)) |
                bit(needVet, a.needVet) |
                bit(needCompiledGoFiles, b.NeedCompiledGoFiles)
@@ -374,6 +397,11 @@ func (b *Builder) build(a *Action) (err error) {
                if b.useCache(a, p, b.buildActionID(a), p.Target) {
                        // We found the main output in the cache.
                        // If we don't need any other outputs, we can stop.
+                       // Otherwise, we need to write files to a.Objdir (needVet, needCgoHdr).
+                       // Remember that we might have them in cache
+                       // and check again after we create a.Objdir.
+                       cachedBuild = true
+                       a.output = []byte{} // start saving output in case we miss any cache results
                        need &^= needBuild
                        if b.NeedExport {
                                p.Export = a.built
@@ -381,16 +409,11 @@ func (b *Builder) build(a *Action) (err error) {
                        if need&needCompiledGoFiles != 0 && b.loadCachedSrcFiles(a) {
                                need &^= needCompiledGoFiles
                        }
-                       // Otherwise, we need to write files to a.Objdir (needVet, needCgoHdr).
-                       // Remember that we might have them in cache
-                       // and check again after we create a.Objdir.
-                       cached = true
-                       a.output = []byte{} // start saving output in case we miss any cache results
                }
 
                // Source files might be cached, even if the full action is not
                // (e.g., go list -compiled -find).
-               if !cached && need&needCompiledGoFiles != 0 && b.loadCachedSrcFiles(a) {
+               if !cachedBuild && need&needCompiledGoFiles != 0 && b.loadCachedSrcFiles(a) {
                        need &^= needCompiledGoFiles
                }
 
@@ -422,24 +445,12 @@ func (b *Builder) build(a *Action) (err error) {
        }
 
        if a.Package.BinaryOnly {
-               _, err := os.Stat(a.Package.Target)
-               if err == nil {
-                       a.built = a.Package.Target
-                       a.Target = a.Package.Target
-                       if b.NeedExport {
-                               a.Package.Export = a.Package.Target
-                       }
-                       a.buildID = b.fileHash(a.Package.Target)
-                       a.Package.Stale = false
-                       a.Package.StaleReason = "binary-only package"
-                       return nil
-               }
-               a.Package.Stale = true
-               a.Package.StaleReason = "missing or invalid binary-only package"
+               p.Stale = true
+               p.StaleReason = "binary-only packages are no longer supported"
                if b.IsCmdList {
                        return nil
                }
-               return fmt.Errorf("missing or invalid binary-only package; expected file %q", a.Package.Target)
+               return errors.New("binary-only packages are no longer supported")
        }
 
        if err := b.Mkdir(a.Objdir); err != nil {
@@ -447,21 +458,20 @@ func (b *Builder) build(a *Action) (err error) {
        }
        objdir := a.Objdir
 
-       if cached {
-               if need&needCgoHdr != 0 && b.loadCachedCgoHdr(a) {
-                       need &^= needCgoHdr
-               }
+       // Load cached cgo header, but only if we're skipping the main build (cachedBuild==true).
+       if cachedBuild && need&needCgoHdr != 0 && b.loadCachedCgoHdr(a) {
+               need &^= needCgoHdr
+       }
 
-               // Load cached vet config, but only if that's all we have left
-               // (need == needVet, not testing just the one bit).
-               // If we are going to do a full build anyway,
-               // we're going to regenerate the files below anyway.
-               if need == needVet && b.loadCachedVet(a) {
-                       need &^= needVet
-               }
-               if need == 0 {
-                       return nil
-               }
+       // Load cached vet config, but only if that's all we have left
+       // (need == needVet, not testing just the one bit).
+       // If we are going to do a full build anyway,
+       // we're going to regenerate the files below anyway.
+       if need == needVet && b.loadCachedVet(a) {
+               need &^= needVet
+       }
+       if need == 0 {
+               return nil
        }
 
        // make target directory
@@ -532,6 +542,15 @@ func (b *Builder) build(a *Action) (err error) {
                }
        }
 
+       // Write out the _testinginit.go file for any test packages that import "testing".
+       if a.Package.Internal.TestinginitGo != nil {
+               initfile := objdir + "_testinginit.go"
+               if err := b.writeFile(initfile, a.Package.Internal.TestinginitGo); err != nil {
+                       return err
+               }
+               gofiles = append([]string{initfile}, gofiles...)
+       }
+
        // Run cgo.
        if a.Package.UsesCgo() || a.Package.UsesSwig() {
                // In a package using cgo, cgo compiles the C, C++ and assembly files with gcc.
@@ -724,7 +743,7 @@ func (b *Builder) build(a *Action) (err error) {
        // This is read by readGccgoArchive in cmd/internal/buildid/buildid.go.
        if a.buildID != "" && cfg.BuildToolchainName == "gccgo" {
                switch cfg.Goos {
-               case "aix", "android", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+               case "aix", "android", "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
                        asmfile, err := b.gccgoBuildIDFile(a)
                        if err != nil {
                                return err
@@ -971,10 +990,13 @@ func buildVetConfig(a *Action, srcfiles []string) {
 // The caller is expected to set it (if needed) before executing any vet actions.
 var VetTool string
 
-// VetFlags are the flags to pass to vet.
+// VetFlags are the default flags to pass to vet.
 // The caller is expected to set them before executing any vet actions.
 var VetFlags []string
 
+// VetExplicit records whether the vet flags were set explicitly on the command line.
+var VetExplicit bool
+
 func (b *Builder) vet(a *Action) error {
        // a.Deps[0] is the build of the package being vetted.
        // a.Deps[1] is the build of the "fmt" package.
@@ -1001,12 +1023,42 @@ func (b *Builder) vet(a *Action) error {
        h := cache.NewHash("vet " + a.Package.ImportPath)
        fmt.Fprintf(h, "vet %q\n", b.toolID("vet"))
 
+       vetFlags := VetFlags
+
+       // In GOROOT, we enable all the vet tests during 'go test',
+       // not just the high-confidence subset. This gets us extra
+       // checking for the standard library (at some compliance cost)
+       // and helps us gain experience about how well the checks
+       // work, to help decide which should be turned on by default.
+       // The command-line still wins.
+       //
+       // Note that this flag change applies even when running vet as
+       // a dependency of vetting a package outside std.
+       // (Otherwise we'd have to introduce a whole separate
+       // space of "vet fmt as a dependency of a std top-level vet"
+       // versus "vet fmt as a dependency of a non-std top-level vet".)
+       // This is OK as long as the packages that are farther down the
+       // dependency tree turn on *more* analysis, as here.
+       // (The unsafeptr check does not write any facts for use by
+       // later vet runs.)
+       if a.Package.Goroot && !VetExplicit {
+               // Note that $GOROOT/src/buildall.bash
+               // does the same for the misc-compile trybots
+               // and should be updated if these flags are
+               // changed here.
+               //
+               // There's too much unsafe.Pointer code
+               // that vet doesn't like in low-level packages
+               // like runtime, sync, and reflect.
+               vetFlags = []string{"-unsafeptr=false"}
+       }
+
        // Note: We could decide that vet should compute export data for
        // all analyses, in which case we don't need to include the flags here.
        // But that would mean that if an analysis causes problems like
        // unexpected crashes there would be no way to turn it off.
        // It seems better to let the flags disable export analysis too.
-       fmt.Fprintf(h, "vetflags %q\n", VetFlags)
+       fmt.Fprintf(h, "vetflags %q\n", vetFlags)
 
        fmt.Fprintf(h, "pkg %q\n", a.Deps[0].actionID)
        for _, a1 := range a.Deps {
@@ -1026,26 +1078,6 @@ func (b *Builder) vet(a *Action) error {
                }
        }
 
-       // TODO(adonovan): delete this when we use the new vet printf checker.
-       // https://github.com/golang/go/issues/28756
-       if vcfg.ImportMap["fmt"] == "" {
-               a1 := a.Deps[1]
-               vcfg.ImportMap["fmt"] = "fmt"
-               if a1.built != "" {
-                       vcfg.PackageFile["fmt"] = a1.built
-               }
-               vcfg.Standard["fmt"] = true
-       }
-
-       // During go test, ignore type-checking failures during vet.
-       // We only run vet if the compilation has succeeded,
-       // so at least for now assume the bug is in vet.
-       // We know of at least #18395.
-       // TODO(rsc,gri): Try to remove this for Go 1.11.
-       //
-       // Disabled 2018-04-20. Let's see if we can do without it.
-       // vcfg.SucceedOnTypecheckFailure = cfg.CmdName == "test"
-
        js, err := json.MarshalIndent(vcfg, "", "\t")
        if err != nil {
                return fmt.Errorf("internal error marshaling vet config: %v", err)
@@ -1065,7 +1097,7 @@ func (b *Builder) vet(a *Action) error {
        if tool == "" {
                tool = base.Tool("vet")
        }
-       runErr := b.run(a, p.Dir, p.ImportPath, env, cfg.BuildToolexec, tool, VetFlags, a.Objdir+"vet.cfg")
+       runErr := b.run(a, p.Dir, p.ImportPath, env, cfg.BuildToolexec, tool, vetFlags, a.Objdir+"vet.cfg")
 
        // If vet wrote export data, save it for input to future vets.
        if f, err := os.Open(vcfg.VetxOutput); err == nil {
@@ -1089,6 +1121,9 @@ func (b *Builder) linkActionID(a *Action) cache.ActionID {
        fmt.Fprintf(h, "buildmode %s goos %s goarch %s\n", cfg.BuildBuildmode, cfg.Goos, cfg.Goarch)
        fmt.Fprintf(h, "import %q\n", p.ImportPath)
        fmt.Fprintf(h, "omitdebug %v standard %v local %v prefix %q\n", p.Internal.OmitDebug, p.Standard, p.Internal.Local, p.Internal.LocalPrefix)
+       if cfg.BuildTrimpath {
+               fmt.Fprintln(h, "trimpath")
+       }
 
        // Toolchain-dependent configuration, shared with b.linkSharedActionID.
        b.printLinkerConfig(h, p)
@@ -1130,21 +1165,16 @@ func (b *Builder) printLinkerConfig(h io.Writer, p *load.Package) {
                if p != nil {
                        fmt.Fprintf(h, "linkflags %q\n", p.Internal.Ldflags)
                }
-               fmt.Fprintf(h, "GO$GOARCH=%s\n", os.Getenv("GO"+strings.ToUpper(cfg.BuildContext.GOARCH))) // GO386, GOARM, etc
+
+               // GO386, GOARM, GOMIPS, etc.
+               key, val := cfg.GetArchEnv()
+               fmt.Fprintf(h, "%s=%s\n", key, val)
 
                // The linker writes source file paths that say GOROOT_FINAL.
                fmt.Fprintf(h, "GOROOT=%s\n", cfg.GOROOT_FINAL)
 
-               // TODO(rsc): Convince linker team not to add more magic environment variables,
-               // or perhaps restrict the environment variables passed to subprocesses.
-               magic := []string{
-                       "GO_EXTLINK_ENABLED",
-               }
-               for _, env := range magic {
-                       if x := os.Getenv(env); x != "" {
-                               fmt.Fprintf(h, "magic %s=%s\n", env, x)
-                       }
-               }
+               // GO_EXTLINK_ENABLED controls whether the external linker is used.
+               fmt.Fprintf(h, "GO_EXTLINK_ENABLED=%s\n", cfg.Getenv("GO_EXTLINK_ENABLED"))
 
                // TODO(rsc): Do cgo settings and flags need to be included?
                // Or external linker settings and flags?
@@ -1317,7 +1347,7 @@ func (b *Builder) getPkgConfigFlags(p *load.Package) (cflags, ldflags []string,
                        }
                }
                var out []byte
-               out, err = b.runOut(p.Dir, nil, b.PkgconfigCmd(), "--cflags", pcflags, "--", pkgs)
+               out, err = b.runOut(nil, p.Dir, nil, b.PkgconfigCmd(), "--cflags", pcflags, "--", pkgs)
                if err != nil {
                        b.showOutput(nil, p.Dir, b.PkgconfigCmd()+" --cflags "+strings.Join(pcflags, " ")+" -- "+strings.Join(pkgs, " "), string(out))
                        b.Print(err.Error() + "\n")
@@ -1332,7 +1362,7 @@ func (b *Builder) getPkgConfigFlags(p *load.Package) (cflags, ldflags []string,
                                return nil, nil, err
                        }
                }
-               out, err = b.runOut(p.Dir, nil, b.PkgconfigCmd(), "--libs", pcflags, "--", pkgs)
+               out, err = b.runOut(nil, p.Dir, nil, b.PkgconfigCmd(), "--libs", pcflags, "--", pkgs)
                if err != nil {
                        b.showOutput(nil, p.Dir, b.PkgconfigCmd()+" --libs "+strings.Join(pcflags, " ")+" -- "+strings.Join(pkgs, " "), string(out))
                        b.Print(err.Error() + "\n")
@@ -1432,6 +1462,9 @@ func BuildInstallFunc(b *Builder, a *Action) (err error) {
 
        a1 := a.Deps[0]
        a.buildID = a1.buildID
+       if a.json != nil {
+               a.json.BuildID = a.buildID
+       }
 
        // If we are using the eventual install target as an up-to-date
        // cached copy of the thing we built, then there's no need to
@@ -1651,25 +1684,6 @@ func (b *Builder) writeFile(file string, text []byte) error {
        return ioutil.WriteFile(file, text, 0666)
 }
 
-// appendFile appends the text to file.
-func (b *Builder) appendFile(file string, text []byte) error {
-       if cfg.BuildN || cfg.BuildX {
-               b.Showcmd("", "cat >>%s << 'EOF' # internal\n%sEOF", file, text)
-       }
-       if cfg.BuildN {
-               return nil
-       }
-       f, err := os.OpenFile(file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
-       if err != nil {
-               return err
-       }
-       defer f.Close()
-       if _, err = f.Write(text); err != nil {
-               return err
-       }
-       return f.Close()
-}
-
 // Install the cgo export header file, if there is one.
 func (b *Builder) installHeader(a *Action) error {
        src := a.Objdir + "_cgo_install.h"
@@ -1841,14 +1855,14 @@ func (b *Builder) showOutput(a *Action, dir, desc, out string) {
 // print this error.
 var errPrintedOutput = errors.New("already printed output - no need to show error")
 
-var cgoLine = regexp.MustCompile(`\[[^\[\]]+\.(cgo1|cover)\.go:[0-9]+(:[0-9]+)?\]`)
-var cgoTypeSigRe = regexp.MustCompile(`\b_C2?(type|func|var|macro)_\B`)
+var cgoLine = lazyregexp.New(`\[[^\[\]]+\.(cgo1|cover)\.go:[0-9]+(:[0-9]+)?\]`)
+var cgoTypeSigRe = lazyregexp.New(`\b_C2?(type|func|var|macro)_\B`)
 
 // run runs the command given by cmdline in the directory dir.
 // If the command fails, run prints information about the failure
 // and returns a non-nil error.
 func (b *Builder) run(a *Action, dir string, desc string, env []string, cmdargs ...interface{}) error {
-       out, err := b.runOut(dir, env, cmdargs...)
+       out, err := b.runOut(a, dir, env, cmdargs...)
        if len(out) > 0 {
                if desc == "" {
                        desc = b.fmtcmd(dir, "%s", strings.Join(str.StringList(cmdargs...), " "))
@@ -1880,7 +1894,8 @@ func (b *Builder) processOutput(out []byte) string {
 
 // runOut runs the command given by cmdline in the directory dir.
 // It returns the command output and any errors that occurred.
-func (b *Builder) runOut(dir string, env []string, cmdargs ...interface{}) ([]byte, error) {
+// It accumulates execution time in a.
+func (b *Builder) runOut(a *Action, dir string, env []string, cmdargs ...interface{}) ([]byte, error) {
        cmdline := str.StringList(cmdargs...)
 
        for _, arg := range cmdline {
@@ -1919,8 +1934,19 @@ func (b *Builder) runOut(dir string, env []string, cmdargs ...interface{}) ([]by
        cleanup := passLongArgsInResponseFiles(cmd)
        defer cleanup()
        cmd.Dir = dir
-       cmd.Env = base.MergeEnvLists(env, base.EnvForDir(cmd.Dir, os.Environ()))
+       cmd.Env = base.EnvForDir(cmd.Dir, os.Environ())
+       cmd.Env = append(cmd.Env, env...)
+       start := time.Now()
        err := cmd.Run()
+       if a != nil && a.json != nil {
+               aj := a.json
+               aj.Cmd = append(aj.Cmd, joinUnambiguously(cmdline))
+               aj.CmdReal += time.Since(start)
+               if ps := cmd.ProcessState; ps != nil {
+                       aj.CmdUser += ps.UserTime()
+                       aj.CmdSys += ps.SystemTime()
+               }
+       }
 
        // err can be something like 'exit status 1'.
        // Add information about what program was running.
@@ -1945,7 +1971,8 @@ func joinUnambiguously(a []string) string {
                q := strconv.Quote(s)
                // A gccgo command line can contain -( and -).
                // Make sure we quote them since they are special to the shell.
-               if s == "" || strings.ContainsAny(s, " ()") || len(q) > len(s)+2 {
+               // The trimpath argument can also contain > (part of =>) and ;. Quote those too.
+               if s == "" || strings.ContainsAny(s, " ()>;") || len(q) > len(s)+2 {
                        buf.WriteString(q)
                } else {
                        buf.WriteString(s)
@@ -2117,7 +2144,7 @@ func (b *Builder) ccompile(a *Action, p *load.Package, outfile string, flags []s
        if !filepath.IsAbs(outfile) {
                outfile = filepath.Join(p.Dir, outfile)
        }
-       output, err := b.runOut(filepath.Dir(file), b.cCompilerEnv(), compiler, flags, "-o", outfile, "-c", filepath.Base(file))
+       output, err := b.runOut(a, filepath.Dir(file), b.cCompilerEnv(), compiler, flags, "-o", outfile, "-c", filepath.Base(file))
        if len(output) > 0 {
                // On FreeBSD 11, when we pass -g to clang 3.8 it
                // invokes its internal assembler with -dwarf-version=2.
@@ -2150,7 +2177,7 @@ func (b *Builder) ccompile(a *Action, p *load.Package, outfile string, flags []s
 }
 
 // gccld runs the gcc linker to create an executable from a set of object files.
-func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string, objs []string) error {
+func (b *Builder) gccld(a *Action, p *load.Package, objdir, outfile string, flags []string, objs []string) error {
        var cmd []string
        if len(p.CXXFiles) > 0 || len(p.SwigCXXFiles) > 0 {
                cmd = b.GxxCmd(p.Dir, objdir)
@@ -2160,16 +2187,37 @@ func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string,
 
        cmdargs := []interface{}{cmd, "-o", outfile, objs, flags}
        dir := p.Dir
-       out, err := b.runOut(dir, b.cCompilerEnv(), cmdargs...)
+       out, err := b.runOut(a, dir, b.cCompilerEnv(), cmdargs...)
        if len(out) > 0 {
                // Filter out useless linker warnings caused by bugs outside Go.
                // See also cmd/link/internal/ld's hostlink method.
                var save [][]byte
+               var skipLines int
                for _, line := range bytes.SplitAfter(out, []byte("\n")) {
                        // golang.org/issue/26073 - Apple Xcode bug
                        if bytes.Contains(line, []byte("ld: warning: text-based stub file")) {
                                continue
                        }
+
+                       if skipLines > 0 {
+                               skipLines--
+                               continue
+                       }
+
+                       // Remove duplicate main symbol with runtime/cgo on AIX.
+                       // With runtime/cgo, two main are available:
+                       // One is generated by cgo tool with {return 0;}.
+                       // The other one is the main calling runtime.rt0_go
+                       // in runtime/cgo.
+                       // The second can't be used by cgo programs because
+                       // runtime.rt0_go is unknown to them.
+                       // Therefore, we let ld remove this main version
+                       // and used the cgo generated one.
+                       if p.ImportPath == "runtime/cgo" && bytes.Contains(line, []byte("ld: 0711-224 WARNING: Duplicate symbol: .main")) {
+                               skipLines = 1
+                               continue
+                       }
+
                        save = append(save, line)
                }
                out = bytes.Join(save, nil)
@@ -2185,8 +2233,8 @@ func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string,
 
 // Grab these before main helpfully overwrites them.
 var (
-       origCC  = os.Getenv("CC")
-       origCXX = os.Getenv("CXX")
+       origCC  = cfg.Getenv("CC")
+       origCXX = cfg.Getenv("CXX")
 )
 
 // gccCmd returns a gcc command line prefix
@@ -2218,7 +2266,7 @@ func (b *Builder) cxxExe() []string {
 
 // fcExe returns the FC compiler setting without all the extra flags we add implicitly.
 func (b *Builder) fcExe() []string {
-       return b.compilerExe(os.Getenv("FC"), "gfortran")
+       return b.compilerExe(cfg.Getenv("FC"), "gfortran")
 }
 
 // compilerExe returns the compiler to use given an
@@ -2260,6 +2308,11 @@ func (b *Builder) compilerCmd(compiler []string, incdir, workdir string) []strin
                }
        }
 
+       if cfg.Goos == "aix" {
+               // mcmodel=large must always be enabled to allow large TOC.
+               a = append(a, "-mcmodel=large")
+       }
+
        // disable ASCII art in clang errors, if possible
        if b.gccSupportsFlag(compiler, "-fno-caret-diagnostics") {
                a = append(a, "-fno-caret-diagnostics")
@@ -2344,7 +2397,8 @@ func (b *Builder) gccSupportsFlag(compiler []string, flag string) bool {
        }
        cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...)
        cmd.Dir = b.WorkDir
-       cmd.Env = base.MergeEnvLists([]string{"LC_ALL=C"}, base.EnvForDir(cmd.Dir, os.Environ()))
+       cmd.Env = base.EnvForDir(cmd.Dir, os.Environ())
+       cmd.Env = append(cmd.Env, "LC_ALL=C")
        out, _ := cmd.CombinedOutput()
        // GCC says "unrecognized command line option".
        // clang says "unknown argument".
@@ -2384,7 +2438,7 @@ func (b *Builder) gccArchArgs() []string {
 // envList returns the value of the given environment variable broken
 // into fields, using the default value when the variable is empty.
 func envList(key, def string) []string {
-       v := os.Getenv(key)
+       v := cfg.Getenv(key)
        if v == "" {
                v = def
        }
@@ -2421,7 +2475,7 @@ func buildFlags(name, defaults string, fromPackage []string, check func(string,
        return str.StringList(envList("CGO_"+name, defaults), fromPackage), nil
 }
 
-var cgoRe = regexp.MustCompile(`[/\\:]`)
+var cgoRe = lazyregexp.New(`[/\\:]`)
 
 func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgofiles, gccfiles, gxxfiles, mfiles, ffiles []string) (outGo, outObj []string, err error) {
        p := a.Package
@@ -2441,7 +2495,7 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo
        // Support gfortran out of the box and let others pass the correct link options
        // via CGO_LDFLAGS
        if len(ffiles) > 0 {
-               fc := os.Getenv("FC")
+               fc := cfg.Getenv("FC")
                if fc == "" {
                        fc = "gfortran"
                }
@@ -2622,7 +2676,7 @@ func (b *Builder) dynimport(a *Action, p *load.Package, objdir, importGo, cgoExe
                }
                ldflags = append(n, "-pie")
        }
-       if err := b.gccld(p, objdir, dynobj, ldflags, linkobj); err != nil {
+       if err := b.gccld(a, p, objdir, dynobj, ldflags, linkobj); err != nil {
                return err
        }
 
@@ -2681,7 +2735,7 @@ var (
 )
 
 func (b *Builder) swigDoVersionCheck() error {
-       out, err := b.runOut("", nil, "swig", "-version")
+       out, err := b.runOut(nil, "", nil, "swig", "-version")
        if err != nil {
                return err
        }
@@ -2836,7 +2890,7 @@ func (b *Builder) swigOne(a *Action, p *load.Package, file, objdir string, pcCFL
                args = append(args, "-c++")
        }
 
-       out, err := b.runOut(p.Dir, nil, "swig", args, file)
+       out, err := b.runOut(a, p.Dir, nil, "swig", args, file)
        if err != nil {
                if len(out) > 0 {
                        if bytes.Contains(out, []byte("-intgosize")) || bytes.Contains(out, []byte("-cgo")) {
index 3d09f69fcc3e43698dbb8182695bb4f4746247f9..86322946a6113484ce2a61c3b00b9eacd0d4121b 100644 (file)
@@ -21,6 +21,7 @@ import (
        "cmd/go/internal/load"
        "cmd/go/internal/str"
        "cmd/internal/objabi"
+       "cmd/internal/sys"
        "crypto/sha1"
 )
 
@@ -116,7 +117,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg []byte, s
                }
        }
 
-       args := []interface{}{cfg.BuildToolexec, base.Tool("compile"), "-o", ofile, "-trimpath", trimDir(a.Objdir), gcflags, gcargs, "-D", p.Internal.LocalPrefix}
+       args := []interface{}{cfg.BuildToolexec, base.Tool("compile"), "-o", ofile, "-trimpath", a.trimpath(), gcflags, gcargs, "-D", p.Internal.LocalPrefix}
        if importcfg != nil {
                if err := b.writeFile(objdir+"importcfg", importcfg); err != nil {
                        return "", nil, err
@@ -139,7 +140,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg []byte, s
                args = append(args, mkAbs(p.Dir, f))
        }
 
-       output, err = b.runOut(p.Dir, nil, args...)
+       output, err = b.runOut(a, p.Dir, nil, args...)
        return ofile, output, err
 }
 
@@ -214,17 +215,33 @@ CheckFlags:
        return c
 }
 
-func trimDir(dir string) string {
-       if len(dir) > 1 && dir[len(dir)-1] == filepath.Separator {
-               dir = dir[:len(dir)-1]
+// trimpath returns the -trimpath argument to use
+// when compiling the action.
+func (a *Action) trimpath() string {
+       // Strip the object directory entirely.
+       objdir := a.Objdir
+       if len(objdir) > 1 && objdir[len(objdir)-1] == filepath.Separator {
+               objdir = objdir[:len(objdir)-1]
        }
-       return dir
+       rewrite := objdir + "=>"
+
+       // For "go build -trimpath", rewrite package source directory
+       // to a file system-independent path (just the import path).
+       if cfg.BuildTrimpath {
+               if m := a.Package.Module; m != nil {
+                       rewrite += ";" + m.Dir + "=>" + m.Path + "@" + m.Version
+               } else {
+                       rewrite += ";" + a.Package.Dir + "=>" + a.Package.ImportPath
+               }
+       }
+
+       return rewrite
 }
 
 func asmArgs(a *Action, p *load.Package) []interface{} {
        // Add -I pkg/GOOS_GOARCH so #include "textflag.h" works in .s files.
        inc := filepath.Join(cfg.GOROOT, "pkg", "include")
-       args := []interface{}{cfg.BuildToolexec, base.Tool("asm"), "-trimpath", trimDir(a.Objdir), "-I", a.Objdir, "-I", inc, "-D", "GOOS_" + cfg.Goos, "-D", "GOARCH_" + cfg.Goarch, forcedAsmflags, p.Internal.Asmflags}
+       args := []interface{}{cfg.BuildToolexec, base.Tool("asm"), "-trimpath", a.trimpath(), "-I", a.Objdir, "-I", inc, "-D", "GOOS_" + cfg.Goos, "-D", "GOARCH_" + cfg.Goarch, forcedAsmflags, p.Internal.Asmflags}
        if p.ImportPath == "runtime" && cfg.Goarch == "386" {
                for _, arg := range forcedAsmflags {
                        if arg == "-dynlink" {
@@ -292,55 +309,6 @@ func (gcToolchain) symabis(b *Builder, a *Action, sfiles []string) (string, erro
                }
        }
 
-       // Gather known cross-package references from assembly code.
-       var otherPkgs []string
-       if p.ImportPath == "runtime" {
-               // Assembly in the following packages references
-               // symbols in runtime.
-               otherPkgs = []string{"syscall", "internal/syscall/unix", "runtime/cgo"}
-       } else if p.ImportPath == "runtime/internal/atomic" {
-               // sync/atomic is an assembly wrapper around
-               // runtime/internal/atomic.
-               otherPkgs = []string{"sync/atomic"}
-       }
-       for _, p2name := range otherPkgs {
-               p2 := load.LoadPackage(p2name, &load.ImportStack{})
-               if len(p2.SFiles) == 0 {
-                       continue
-               }
-
-               symabis2 := a.Objdir + "symabis2"
-               if err := mkSymabis(p2, p2.SFiles, symabis2); err != nil {
-                       return "", err
-               }
-
-               // Filter out just the symbol refs and append them to
-               // the symabis file.
-               if cfg.BuildN {
-                       // -x will print the lines from symabis2 that are actually appended
-                       // to symabis. With -n, we don't know what those lines will be.
-                       b.Showcmd("", `grep '^ref' <%s | grep -v '^ref\s*""\.' >>%s`, symabis2, a.Objdir+"symabis")
-                       continue
-               }
-               abis2, err := ioutil.ReadFile(symabis2)
-               if err != nil {
-                       return "", err
-               }
-               var refs bytes.Buffer
-               for _, line := range strings.Split(string(abis2), "\n") {
-                       fs := strings.Fields(line)
-                       if len(fs) >= 2 && fs[0] == "ref" && !strings.HasPrefix(fs[1], `"".`) {
-                               fmt.Fprintf(&refs, "%s\n", line)
-                       }
-               }
-               if refs.Len() != 0 {
-                       symabis = a.Objdir + "symabis"
-                       if err := b.appendFile(symabis, refs.Bytes()); err != nil {
-                               return "", err
-                       }
-               }
-       }
-
        return symabis, nil
 }
 
@@ -493,7 +461,21 @@ func pluginPath(a *Action) string {
                return p.ImportPath
        }
        h := sha1.New()
-       fmt.Fprintf(h, "build ID: %s\n", a.buildID)
+       buildID := a.buildID
+       if a.Mode == "link" {
+               // For linking, use the main package's build ID instead of
+               // the binary's build ID, so it is the same hash used in
+               // compiling and linking.
+               // When compiling, we use actionID/actionID (instead of
+               // actionID/contentID) as a temporary build ID to compute
+               // the hash. Do the same here. (See buildid.go:useCache)
+               // The build ID matters because it affects the overall hash
+               // in the plugin's pseudo-import path returned below.
+               // We need to use the same import path when compiling and linking.
+               id := strings.Split(buildID, buildIDSeparator)
+               buildID = id[1] + buildIDSeparator + id[1]
+       }
+       fmt.Fprintf(h, "build ID: %s\n", buildID)
        for _, file := range str.StringList(p.GoFiles, p.CgoFiles, p.SFiles) {
                data, err := ioutil.ReadFile(filepath.Join(p.Dir, file))
                if err != nil {
@@ -525,7 +507,13 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string)
        // Store BuildID inside toolchain binaries as a unique identifier of the
        // tool being run, for use by content-based staleness determination.
        if root.Package.Goroot && strings.HasPrefix(root.Package.ImportPath, "cmd/") {
-               ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID)
+               // External linking will include our build id in the external
+               // linker's build id, which will cause our build id to not
+               // match the next time the tool is built.
+               // Rely on the external build id instead.
+               if !sys.MustLinkExternal(cfg.Goos, cfg.Goarch) {
+                       ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID)
+               }
        }
 
        // If the user has not specified the -extld option, then specify the
@@ -560,7 +548,11 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string)
                dir, out = filepath.Split(out)
        }
 
-       return b.run(root, dir, root.Package.ImportPath, nil, cfg.BuildToolexec, base.Tool("link"), "-o", out, "-importcfg", importcfg, ldflags, mainpkg)
+       env := []string{}
+       if cfg.BuildTrimpath {
+               env = append(env, "GOROOT_FINAL=go")
+       }
+       return b.run(root, dir, root.Package.ImportPath, env, cfg.BuildToolexec, base.Tool("link"), "-o", out, "-importcfg", importcfg, ldflags, mainpkg)
 }
 
 func (gcToolchain) ldShared(b *Builder, root *Action, toplevelactions []*Action, out, importcfg string, allactions []*Action) error {
index 3b97209b7525afc22f5de252c45b6ee2094f925b..87b3f5facd95c0099357fcc303df168121416d2c 100644 (file)
@@ -26,7 +26,7 @@ var GccgoName, GccgoBin string
 var gccgoErr error
 
 func init() {
-       GccgoName = os.Getenv("GCCGO")
+       GccgoName = cfg.Getenv("GCCGO")
        if GccgoName == "" {
                GccgoName = cfg.DefaultGCCGO(cfg.Goos, cfg.Goarch)
        }
@@ -44,7 +44,7 @@ func (gccgoToolchain) linker() string {
 }
 
 func (gccgoToolchain) ar() string {
-       ar := os.Getenv("AR")
+       ar := cfg.Getenv("AR")
        if ar == "" {
                ar = "ar"
        }
@@ -96,7 +96,7 @@ func (tools gccgoToolchain) gc(b *Builder, a *Action, archive string, importcfg
                args = append(args, mkAbs(p.Dir, f))
        }
 
-       output, err = b.runOut(p.Dir, nil, args)
+       output, err = b.runOut(a, p.Dir, nil, args)
        return ofile, output, err
 }
 
@@ -209,7 +209,7 @@ func (tools gccgoToolchain) pack(b *Builder, a *Action, afile string, ofiles []s
        }
        absAfile := mkAbs(objdir, afile)
        // Try with D modifier first, then without if that fails.
-       output, err := b.runOut(p.Dir, nil, tools.ar(), arArgs, "rcD", absAfile, absOfiles)
+       output, err := b.runOut(a, p.Dir, nil, tools.ar(), arArgs, "rcD", absAfile, absOfiles)
        if err != nil {
                return b.run(a, p.Dir, p.ImportPath, nil, tools.ar(), arArgs, "rc", absAfile, absOfiles)
        }
@@ -490,6 +490,7 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string
                ldflags = append(ldflags, "-shared", "-nostdlib")
                ldflags = append(ldflags, goLibBegin...)
                ldflags = append(ldflags, "-lgo", "-lgcc_s", "-lgcc", "-lc", "-lgcc")
+
        case "shared":
                if cfg.Goos != "aix" {
                        ldflags = append(ldflags, "-zdefs")
@@ -512,7 +513,7 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string
                        ldflags = append(ldflags, "-lobjc")
                }
                if fortran {
-                       fc := os.Getenv("FC")
+                       fc := cfg.Getenv("FC")
                        if fc == "" {
                                fc = "gfortran"
                        }
index 3381ab544c7f4aad84c55db6c83bdcacf06f0da3..35d3a505cc7d362607932d3c9decff4e51cb8479 100644 (file)
@@ -95,7 +95,7 @@ func buildModeInit() {
                                codegenArg = "-shared"
                        default:
                                switch cfg.Goos {
-                               case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+                               case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
                                        if platform == "linux/ppc64" {
                                                base.Fatalf("-buildmode=c-archive not supported on %s\n", platform)
                                        }
@@ -164,6 +164,7 @@ func buildModeInit() {
                                codegenArg = "-shared"
                        case "darwin/amd64":
                                codegenArg = "-shared"
+                       case "aix/ppc64":
                        default:
                                base.Fatalf("-buildmode=pie not supported on %s\n", platform)
                        }
index 1a401b8981ec2141c72385bf7c8a4a627d272e2e..0d8da21ae388793379568c4b510fee06baeb372f 100644 (file)
 package work
 
 import (
-       "cmd/go/internal/load"
        "fmt"
-       "os"
+       "internal/lazyregexp"
        "regexp"
        "strings"
+
+       "cmd/go/internal/cfg"
+       "cmd/go/internal/load"
 )
 
-var re = regexp.MustCompile
+var re = lazyregexp.New
 
-var validCompilerFlags = []*regexp.Regexp{
+var validCompilerFlags = []*lazyregexp.Regexp{
        re(`-D([A-Za-z_].*)`),
        re(`-F([^@\-].*)`),
        re(`-I([^@\-].*)`),
@@ -100,6 +102,10 @@ var validCompilerFlags = []*regexp.Regexp{
        re(`-mmacosx-(.+)`),
        re(`-mios-simulator-version-min=(.+)`),
        re(`-miphoneos-version-min=(.+)`),
+       re(`-mtvos-simulator-version-min=(.+)`),
+       re(`-mtvos-version-min=(.+)`),
+       re(`-mwatchos-simulator-version-min=(.+)`),
+       re(`-mwatchos-version-min=(.+)`),
        re(`-mnop-fun-dllimport`),
        re(`-m(no-)?sse[0-9.]*`),
        re(`-m(no-)?ssse3`),
@@ -130,7 +136,7 @@ var validCompilerFlagsWithNextArg = []string{
        "-x",
 }
 
-var validLinkerFlags = []*regexp.Regexp{
+var validLinkerFlags = []*lazyregexp.Regexp{
        re(`-F([^@\-].*)`),
        re(`-l([^@\-].*)`),
        re(`-L([^@\-].*)`),
@@ -166,6 +172,7 @@ var validLinkerFlags = []*regexp.Regexp{
        re(`-Wl,--(no-)?allow-shlib-undefined`),
        re(`-Wl,--(no-)?as-needed`),
        re(`-Wl,-Bdynamic`),
+       re(`-Wl,-berok`),
        re(`-Wl,-Bstatic`),
        re(`-WL,-O([^@,\-][^,]*)?`),
        re(`-Wl,-d[ny]`),
@@ -177,6 +184,8 @@ var validLinkerFlags = []*regexp.Regexp{
        re(`-Wl,-framework,[^,@\-][^,]+`),
        re(`-Wl,-headerpad_max_install_names`),
        re(`-Wl,--no-undefined`),
+       re(`-Wl,-R([^@\-][^,@]*$)`),
+       re(`-Wl,--just-symbols[=,]([^,@\-][^,@]+)`),
        re(`-Wl,-rpath(-link)?[=,]([^,@\-][^,]+)`),
        re(`-Wl,-s`),
        re(`-Wl,-search_paths_first`),
@@ -206,6 +215,8 @@ var validLinkerFlagsWithNextArg = []string{
        "-target",
        "-Wl,-framework",
        "-Wl,-rpath",
+       "-Wl,-R",
+       "-Wl,--just-symbols",
        "-Wl,-undefined",
 }
 
@@ -217,20 +228,20 @@ func checkLinkerFlags(name, source string, list []string) error {
        return checkFlags(name, source, list, validLinkerFlags, validLinkerFlagsWithNextArg)
 }
 
-func checkFlags(name, source string, list []string, valid []*regexp.Regexp, validNext []string) error {
+func checkFlags(name, source string, list []string, valid []*lazyregexp.Regexp, validNext []string) error {
        // Let users override rules with $CGO_CFLAGS_ALLOW, $CGO_CFLAGS_DISALLOW, etc.
        var (
                allow    *regexp.Regexp
                disallow *regexp.Regexp
        )
-       if env := os.Getenv("CGO_" + name + "_ALLOW"); env != "" {
+       if env := cfg.Getenv("CGO_" + name + "_ALLOW"); env != "" {
                r, err := regexp.Compile(env)
                if err != nil {
                        return fmt.Errorf("parsing $CGO_%s_ALLOW: %v", name, err)
                }
                allow = r
        }
-       if env := os.Getenv("CGO_" + name + "_DISALLOW"); env != "" {
+       if env := cfg.Getenv("CGO_" + name + "_DISALLOW"); env != "" {
                r, err := regexp.Compile(env)
                if err != nil {
                        return fmt.Errorf("parsing $CGO_%s_DISALLOW: %v", name, err)
index d23b6eadff50e8db21e368755f9ee3530691bc61..fd8caeab4ecf7dd0286ba26df65fb15dc05cc440 100644 (file)
@@ -125,6 +125,11 @@ var goodLinkerFlags = [][]string{
        {"-pthread"},
        {"-Wl,-rpath,foo"},
        {"-Wl,-rpath,$ORIGIN/foo"},
+       {"-Wl,-R", "/foo"},
+       {"-Wl,-R", "foo"},
+       {"-Wl,-R,foo"},
+       {"-Wl,--just-symbols=foo"},
+       {"-Wl,--just-symbols,foo"},
        {"-Wl,--warn-error"},
        {"-Wl,--no-warn-error"},
        {"foo.so"},
@@ -197,6 +202,9 @@ var badLinkerFlags = [][]string{
        {"-x", "--c"},
        {"-x", "@obj"},
        {"-Wl,-rpath,@foo"},
+       {"-Wl,-R,foo,bar"},
+       {"-Wl,-R,@foo"},
+       {"-Wl,--just-symbols,@foo"},
        {"../x.o"},
 }
 
index d986f5508d91dd0073d74e5bdb839f33384790e8..16bdb6209f1b8580c9b620008e1db04aa9f0362d 100644 (file)
@@ -49,7 +49,7 @@ func init() {
                fix.CmdFix,
                fmtcmd.CmdFmt,
                generate.CmdGenerate,
-               get.CmdGet,
+               modget.CmdGet,
                work.CmdInstall,
                list.CmdList,
                modcmd.CmdMod,
@@ -71,6 +71,8 @@ func init() {
                help.HelpImportPath,
                modload.HelpModules,
                modget.HelpModuleGet,
+               modfetch.HelpModuleAuth,
+               modfetch.HelpModulePrivate,
                help.HelpPackages,
                test.HelpTestflag,
                test.HelpTestfunc,
@@ -88,17 +90,10 @@ func main() {
                base.Usage()
        }
 
-       if modload.MustUseModules {
-               // If running with modules force-enabled, change get now to change help message.
-               *get.CmdGet = *modget.CmdGet
-       }
-
        if args[0] == "get" || args[0] == "help" {
-               // Replace get with module-aware get if appropriate.
-               // Note that if MustUseModules is true, this happened already above,
-               // but no harm in doing it again.
-               if modload.Init(); modload.Enabled() {
-                       *get.CmdGet = *modget.CmdGet
+               if modload.Init(); !modload.Enabled() {
+                       // Replace module-aware get with GOPATH get if appropriate.
+                       *modget.CmdGet = *get.CmdGet
                }
        }
 
@@ -128,8 +123,14 @@ func main() {
                                os.Exit(2)
                        }
                        if !filepath.IsAbs(p) {
-                               fmt.Fprintf(os.Stderr, "go: GOPATH entry is relative; must be absolute path: %q.\nFor more details see: 'go help gopath'\n", p)
-                               os.Exit(2)
+                               if cfg.Getenv("GOPATH") == "" {
+                                       // We inferred $GOPATH from $HOME and did a bad job at it.
+                                       // Instead of dying, uninfer it.
+                                       cfg.BuildContext.GOPATH = ""
+                               } else {
+                                       fmt.Fprintf(os.Stderr, "go: GOPATH entry is relative; must be absolute path: %q.\nFor more details see: 'go help gopath'\n", p)
+                                       os.Exit(2)
+                               }
                        }
                }
        }
@@ -142,37 +143,6 @@ func main() {
                os.Exit(2)
        }
 
-       // TODO(rsc): Remove all these helper prints in Go 1.12.
-       switch args[0] {
-       case "mod":
-               if len(args) >= 2 {
-                       flag := args[1]
-                       if strings.HasPrefix(flag, "--") {
-                               flag = flag[1:]
-                       }
-                       if i := strings.Index(flag, "="); i >= 0 {
-                               flag = flag[:i]
-                       }
-                       switch flag {
-                       case "-sync", "-fix":
-                               fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod tidy\n", flag)
-                               os.Exit(2)
-                       case "-init", "-graph", "-vendor", "-verify":
-                               fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod %s\n", flag, flag[1:])
-                               os.Exit(2)
-                       case "-fmt", "-json", "-module", "-require", "-droprequire", "-replace", "-dropreplace", "-exclude", "-dropexclude":
-                               fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod edit %s\n", flag, flag)
-                               os.Exit(2)
-                       }
-               }
-       case "vendor":
-               fmt.Fprintf(os.Stderr, "go: vgo vendor is now go mod vendor\n")
-               os.Exit(2)
-       case "verify":
-               fmt.Fprintf(os.Stderr, "go: vgo verify is now go mod verify\n")
-               os.Exit(2)
-       }
-
        // Set environment (GOOS, GOARCH, etc) explicitly.
        // In theory all the commands we invoke should have
        // the same default computation of these as we do,
index 7ef4c641d7d4f98c6e862cc8b66b3bdef373d9c7..e94e82bd5bd9909d935e5df67302c5444a40e63b 100644 (file)
@@ -34,8 +34,6 @@ func TestNoteReading(t *testing.T) {
        switch {
        case !build.Default.CgoEnabled:
                t.Skipf("skipping - no cgo, so assuming external linking not available")
-       case runtime.GOOS == "openbsd" && runtime.GOARCH == "arm":
-               t.Skipf("skipping - external linking not supported, golang.org/issue/10619")
        case runtime.GOOS == "plan9":
                t.Skipf("skipping - external linking not supported")
        }
index 830cea029b7ac2ef4787fa8b22f91170296aacfa..6919d32184720df84b9b2c1ea97e43976aae2c14 100644 (file)
@@ -8,23 +8,28 @@ import (
        "archive/zip"
        "bytes"
        "encoding/json"
+       "errors"
        "flag"
        "fmt"
+       "io"
        "io/ioutil"
        "log"
        "net"
        "net/http"
        "os"
        "path/filepath"
+       "strconv"
        "strings"
        "sync"
        "testing"
 
+       "cmd/go/internal/dirhash"
        "cmd/go/internal/modfetch"
        "cmd/go/internal/modfetch/codehost"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
        "cmd/go/internal/semver"
+       "cmd/go/internal/sumweb"
        "cmd/go/internal/txtar"
 )
 
@@ -42,7 +47,6 @@ var proxyOnce sync.Once
 // The proxy serves from testdata/mod. See testdata/mod/README.
 func StartProxy() {
        proxyOnce.Do(func() {
-               fmt.Fprintf(os.Stderr, "go test proxy starting\n")
                readModList()
                addr := *proxyAddr
                if addr == "" {
@@ -58,6 +62,11 @@ func StartProxy() {
                go func() {
                        log.Fatalf("go proxy: http.Serve: %v", http.Serve(l, http.HandlerFunc(proxyHandler)))
                }()
+
+               // Prepopulate main sumdb.
+               for _, mod := range modList {
+                       sumdbHandler.Server.Lookup(nil, mod.Path+"@"+mod.Version)
+               }
        })
 }
 
@@ -81,7 +90,9 @@ func readModList() {
                encPath := strings.ReplaceAll(name[:i], "_", "/")
                path, err := module.DecodePath(encPath)
                if err != nil {
-                       fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err)
+                       if encPath != "example.com/invalidpath/v1" {
+                               fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err)
+                       }
                        continue
                }
                encVers := name[i+1:]
@@ -96,6 +107,15 @@ func readModList() {
 
 var zipCache par.Cache
 
+const (
+       testSumDBName        = "localhost.localdev/sumdb"
+       testSumDBVerifierKey = "localhost.localdev/sumdb+00000c67+AcTrnkbUA+TU4heY3hkjiSES/DSQniBqIeQ/YppAUtK6"
+       testSumDBSignerKey   = "PRIVATE+KEY+localhost.localdev/sumdb+00000c67+AXu6+oaVaOYuQOFrf1V59JK1owcFlJcHwwXHDfDGxSPk"
+)
+
+var sumdbHandler = &sumweb.Handler{Server: sumweb.NewTestServer(testSumDBSignerKey, proxyGoSum)}
+var sumdbWrongHandler = &sumweb.Handler{Server: sumweb.NewTestServer(testSumDBSignerKey, proxyGoSumWrong)}
+
 // proxyHandler serves the Go module proxy protocol.
 // See the proxy section of https://research.swtch.com/vgo-module.
 func proxyHandler(w http.ResponseWriter, r *http.Request) {
@@ -103,7 +123,117 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) {
                http.NotFound(w, r)
                return
        }
-       path := strings.TrimPrefix(r.URL.Path, "/mod/")
+       path := r.URL.Path[len("/mod/"):]
+
+       // /mod/quiet/ does not print errors.
+       quiet := false
+       if strings.HasPrefix(path, "quiet/") {
+               path = path[len("quiet/"):]
+               quiet = true
+       }
+
+       // Next element may opt into special behavior.
+       if j := strings.Index(path, "/"); j >= 0 {
+               n, err := strconv.Atoi(path[:j])
+               if err == nil && n >= 200 {
+                       w.WriteHeader(n)
+                       return
+               }
+               if strings.HasPrefix(path, "sumdb-") {
+                       n, err := strconv.Atoi(path[len("sumdb-"):j])
+                       if err == nil && n >= 200 {
+                               if strings.HasPrefix(path[j:], "/sumdb/") {
+                                       w.WriteHeader(n)
+                                       return
+                               }
+                               path = path[j+1:]
+                       }
+               }
+       }
+
+       // Request for $GOPROXY/sumdb-direct is direct sumdb access.
+       // (Client thinks it is talking directly to a sumdb.)
+       if strings.HasPrefix(path, "sumdb-direct/") {
+               r.URL.Path = path[len("sumdb-direct"):]
+               sumdbHandler.ServeHTTP(w, r)
+               return
+       }
+
+       // Request for $GOPROXY/sumdb-wrong is direct sumdb access
+       // but all the hashes are wrong.
+       // (Client thinks it is talking directly to a sumdb.)
+       if strings.HasPrefix(path, "sumdb-wrong/") {
+               r.URL.Path = path[len("sumdb-wrong"):]
+               sumdbWrongHandler.ServeHTTP(w, r)
+               return
+       }
+
+       // Request for $GOPROXY/sumdb/<name>/supported
+       // is checking whether it's OK to access sumdb via the proxy.
+       if path == "sumdb/"+testSumDBName+"/supported" {
+               w.WriteHeader(200)
+               return
+       }
+
+       // Request for $GOPROXY/sumdb/<name>/... goes to sumdb.
+       if sumdbPrefix := "sumdb/" + testSumDBName + "/"; strings.HasPrefix(path, sumdbPrefix) {
+               r.URL.Path = path[len(sumdbPrefix)-1:]
+               sumdbHandler.ServeHTTP(w, r)
+               return
+       }
+
+       // Module proxy request: /mod/path/@latest
+       // Rewrite to /mod/path/@v/<latest>.info where <latest> is the semantically
+       // latest version, including pseudo-versions.
+       if i := strings.LastIndex(path, "/@latest"); i >= 0 {
+               enc := path[:i]
+               modPath, err := module.DecodePath(enc)
+               if err != nil {
+                       if !quiet {
+                               fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err)
+                       }
+                       http.NotFound(w, r)
+                       return
+               }
+
+               // Imitate what "latest" does in direct mode and what proxy.golang.org does.
+               // Use the latest released version.
+               // If there is no released version, use the latest prereleased version.
+               // Otherwise, use the latest pseudoversion.
+               var latestRelease, latestPrerelease, latestPseudo string
+               for _, m := range modList {
+                       if m.Path != modPath {
+                               continue
+                       }
+                       if modfetch.IsPseudoVersion(m.Version) && (latestPseudo == "" || semver.Compare(latestPseudo, m.Version) > 0) {
+                               latestPseudo = m.Version
+                       } else if semver.Prerelease(m.Version) != "" && (latestPrerelease == "" || semver.Compare(latestPrerelease, m.Version) > 0) {
+                               latestPrerelease = m.Version
+                       } else if latestRelease == "" || semver.Compare(latestRelease, m.Version) > 0 {
+                               latestRelease = m.Version
+                       }
+               }
+               var latest string
+               if latestRelease != "" {
+                       latest = latestRelease
+               } else if latestPrerelease != "" {
+                       latest = latestPrerelease
+               } else if latestPseudo != "" {
+                       latest = latestPseudo
+               } else {
+                       http.NotFound(w, r)
+                       return
+               }
+
+               encVers, err := module.EncodeVersion(latest)
+               if err != nil {
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
+               path = fmt.Sprintf("%s/@v/%s.info", enc, encVers)
+       }
+
+       // Module proxy request: /mod/path/@v/version[.suffix]
        i := strings.Index(path, "/@v/")
        if i < 0 {
                http.NotFound(w, r)
@@ -112,21 +242,29 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) {
        enc, file := path[:i], path[i+len("/@v/"):]
        path, err := module.DecodePath(enc)
        if err != nil {
-               fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err)
+               if !quiet {
+                       fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err)
+               }
                http.NotFound(w, r)
                return
        }
        if file == "list" {
-               n := 0
+               // list returns a list of versions, not including pseudo-versions.
+               // If the module has no tagged versions, we should serve an empty 200.
+               // If the module doesn't exist, we should serve 404 or 410.
+               found := false
                for _, m := range modList {
-                       if m.Path == path && !modfetch.IsPseudoVersion(m.Version) {
+                       if m.Path != path {
+                               continue
+                       }
+                       found = true
+                       if !modfetch.IsPseudoVersion(m.Version) {
                                if err := module.Check(m.Path, m.Version); err == nil {
                                        fmt.Fprintf(w, "%s\n", m.Version)
-                                       n++
                                }
                        }
                }
-               if n == 0 {
+               if !found {
                        http.NotFound(w, r)
                }
                return
@@ -168,10 +306,16 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) {
                }
        }
 
-       a := readArchive(path, vers)
-       if a == nil {
-               fmt.Fprintf(os.Stderr, "go proxy: no archive %s %s\n", path, vers)
-               http.Error(w, "cannot load archive", 500)
+       a, err := readArchive(path, vers)
+       if err != nil {
+               if !quiet {
+                       fmt.Fprintf(os.Stderr, "go proxy: no archive %s %s: %v\n", path, vers, err)
+               }
+               if errors.Is(err, os.ErrNotExist) {
+                       http.NotFound(w, r)
+               } else {
+                       http.Error(w, "cannot load archive", 500)
+               }
                return
        }
 
@@ -218,7 +362,9 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) {
                }).(cached)
 
                if c.err != nil {
-                       fmt.Fprintf(os.Stderr, "go proxy: %v\n", c.err)
+                       if !quiet {
+                               fmt.Fprintf(os.Stderr, "go proxy: %v\n", c.err)
+                       }
                        http.Error(w, c.err.Error(), 500)
                        return
                }
@@ -230,8 +376,8 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) {
 }
 
 func findHash(m module.Version) string {
-       a := readArchive(m.Path, m.Version)
-       if a == nil {
+       a, err := readArchive(m.Path, m.Version)
+       if err != nil {
                return ""
        }
        var data []byte
@@ -250,16 +396,14 @@ var archiveCache par.Cache
 
 var cmdGoDir, _ = os.Getwd()
 
-func readArchive(path, vers string) *txtar.Archive {
+func readArchive(path, vers string) (*txtar.Archive, error) {
        enc, err := module.EncodePath(path)
        if err != nil {
-               fmt.Fprintf(os.Stderr, "go proxy: %v\n", err)
-               return nil
+               return nil, err
        }
        encVers, err := module.EncodeVersion(vers)
        if err != nil {
-               fmt.Fprintf(os.Stderr, "go proxy: %v\n", err)
-               return nil
+               return nil, err
        }
 
        prefix := strings.ReplaceAll(enc, "/", "_")
@@ -274,5 +418,51 @@ func readArchive(path, vers string) *txtar.Archive {
                }
                return a
        }).(*txtar.Archive)
-       return a
+       if a == nil {
+               return nil, os.ErrNotExist
+       }
+       return a, nil
+}
+
+// proxyGoSum returns the two go.sum lines for path@vers.
+func proxyGoSum(path, vers string) ([]byte, error) {
+       a, err := readArchive(path, vers)
+       if err != nil {
+               return nil, err
+       }
+       var names []string
+       files := make(map[string][]byte)
+       var gomod []byte
+       for _, f := range a.Files {
+               if strings.HasPrefix(f.Name, ".") {
+                       if f.Name == ".mod" {
+                               gomod = f.Data
+                       }
+                       continue
+               }
+               name := path + "@" + vers + "/" + f.Name
+               names = append(names, name)
+               files[name] = f.Data
+       }
+       h1, err := dirhash.Hash1(names, func(name string) (io.ReadCloser, error) {
+               data := files[name]
+               return ioutil.NopCloser(bytes.NewReader(data)), nil
+       })
+       if err != nil {
+               return nil, err
+       }
+       h1mod, err := dirhash.Hash1([]string{"go.mod"}, func(string) (io.ReadCloser, error) {
+               return ioutil.NopCloser(bytes.NewReader(gomod)), nil
+       })
+       if err != nil {
+               return nil, err
+       }
+       data := []byte(fmt.Sprintf("%s %s %s\n%s %s/go.mod %s\n", path, vers, h1, path, vers, h1mod))
+       return data, nil
+}
+
+// proxyGoSumWrong returns the wrong lines.
+func proxyGoSumWrong(path, vers string) ([]byte, error) {
+       data := []byte(fmt.Sprintf("%s %s %s\n%s %s/go.mod %s\n", path, vers, "h1:wrong", path, vers, "h1:wrong"))
+       return data, nil
 }
index 3002db767993778b1491b9da6e936851e494941a..4dcb4b4e0d5dc0a8f0d19bbdaa51224abe529b81 100644 (file)
@@ -24,8 +24,10 @@ import (
        "testing"
        "time"
 
+       "cmd/go/internal/cfg"
        "cmd/go/internal/imports"
        "cmd/go/internal/par"
+       "cmd/go/internal/robustio"
        "cmd/go/internal/txtar"
        "cmd/go/internal/work"
 )
@@ -84,6 +86,7 @@ type backgroundCmd struct {
 
 var extraEnvKeys = []string{
        "SYSTEMROOT",         // must be preserved on Windows to find DLLs; golang.org/issue/25210
+       "WINDIR",             // must be preserved on Windows to be able to run PowerShell command; golang.org/issue/30711
        "LD_LIBRARY_PATH",    // must be preserved on Unix systems to find shared libraries
        "CC",                 // don't lose user settings when invoking cgo
        "GO_TESTING_GOTOOLS", // for gccgo testing
@@ -105,10 +108,15 @@ func (ts *testScript) setup() {
                "CCACHE_DISABLE=1", // ccache breaks with non-existent HOME
                "GOARCH=" + runtime.GOARCH,
                "GOCACHE=" + testGOCACHE,
+               "GOEXE=" + cfg.ExeSuffix,
                "GOOS=" + runtime.GOOS,
                "GOPATH=" + filepath.Join(ts.workdir, "gopath"),
                "GOPROXY=" + proxyURL,
+               "GOPRIVATE=",
                "GOROOT=" + testGOROOT,
+               "GOSUMDB=" + testSumDBVerifierKey,
+               "GONOPROXY=",
+               "GONOSUMDB=",
                tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"),
                "devnull=" + os.DevNull,
                "goversion=" + goVersion(ts),
@@ -119,11 +127,6 @@ func (ts *testScript) setup() {
                ts.env = append(ts.env, "path="+testBin+string(filepath.ListSeparator)+os.Getenv("path"))
        }
 
-       if runtime.GOOS == "windows" {
-               ts.env = append(ts.env, "exe=.exe")
-       } else {
-               ts.env = append(ts.env, "exe=")
-       }
        for _, key := range extraEnvKeys {
                if val := os.Getenv(key); val != "" {
                        ts.env = append(ts.env, key+"="+val)
@@ -192,7 +195,7 @@ func (ts *testScript) run() {
        a, err := txtar.ParseFile(ts.file)
        ts.check(err)
        for _, f := range a.Files {
-               name := ts.mkabs(ts.expand(f.Name))
+               name := ts.mkabs(ts.expand(f.Name, false))
                ts.check(os.MkdirAll(filepath.Dir(name), 0777))
                ts.check(ioutil.WriteFile(name, f.Data, 0666))
        }
@@ -238,34 +241,24 @@ Script:
                }
 
                // Parse input line. Ignore blanks entirely.
-               args := ts.parse(line)
-               if len(args) == 0 {
+               parsed := ts.parse(line)
+               if parsed.name == "" {
+                       if parsed.neg || len(parsed.conds) > 0 {
+                               ts.fatalf("missing command")
+                       }
                        continue
                }
 
                // Echo command to log.
                fmt.Fprintf(&ts.log, "> %s\n", line)
 
-               // Command prefix [cond] means only run this command if cond is satisfied.
-               for strings.HasPrefix(args[0], "[") && strings.HasSuffix(args[0], "]") {
-                       cond := args[0]
-                       cond = cond[1 : len(cond)-1]
-                       cond = strings.TrimSpace(cond)
-                       args = args[1:]
-                       if len(args) == 0 {
-                               ts.fatalf("missing command after condition")
-                       }
-                       want := true
-                       if strings.HasPrefix(cond, "!") {
-                               want = false
-                               cond = strings.TrimSpace(cond[1:])
-                       }
+               for _, cond := range parsed.conds {
                        // Known conds are: $GOOS, $GOARCH, runtime.Compiler, and 'short' (for testing.Short).
                        //
                        // NOTE: If you make changes here, update testdata/script/README too!
                        //
                        ok := false
-                       switch cond {
+                       switch cond.tag {
                        case runtime.GOOS, runtime.GOARCH, runtime.Compiler:
                                ok = true
                        case "short":
@@ -285,8 +278,8 @@ Script:
                        case "symlink":
                                ok = testenv.HasSymlink()
                        default:
-                               if strings.HasPrefix(cond, "exec:") {
-                                       prog := cond[len("exec:"):]
+                               if strings.HasPrefix(cond.tag, "exec:") {
+                                       prog := cond.tag[len("exec:"):]
                                        ok = execCache.Do(prog, func() interface{} {
                                                if runtime.GOOS == "plan9" && prog == "git" {
                                                        // The Git command is usually not the real Git on Plan 9.
@@ -298,33 +291,22 @@ Script:
                                        }).(bool)
                                        break
                                }
-                               if !imports.KnownArch[cond] && !imports.KnownOS[cond] && cond != "gc" && cond != "gccgo" {
-                                       ts.fatalf("unknown condition %q", cond)
+                               if !imports.KnownArch[cond.tag] && !imports.KnownOS[cond.tag] && cond.tag != "gc" && cond.tag != "gccgo" {
+                                       ts.fatalf("unknown condition %q", cond.tag)
                                }
                        }
-                       if ok != want {
+                       if ok != cond.want {
                                // Don't run rest of line.
                                continue Script
                        }
                }
 
-               // Command prefix ! means negate the expectations about this command:
-               // go command should fail, match should not be found, etc.
-               neg := false
-               if args[0] == "!" {
-                       neg = true
-                       args = args[1:]
-                       if len(args) == 0 {
-                               ts.fatalf("! on line by itself")
-                       }
-               }
-
                // Run command.
-               cmd := scriptCmds[args[0]]
+               cmd := scriptCmds[parsed.name]
                if cmd == nil {
-                       ts.fatalf("unknown command %q", args[0])
+                       ts.fatalf("unknown command %q", parsed.name)
                }
-               cmd(ts, neg, args[1:])
+               cmd(ts, parsed.neg, parsed.args)
 
                // Command can ask script to stop early.
                if ts.stopped {
@@ -376,6 +358,14 @@ var scriptCmds = map[string]func(*testScript, bool, []string){
        "wait":    (*testScript).cmdWait,
 }
 
+// When expanding shell variables for these commands, we apply regexp quoting to
+// expanded strings within the first argument.
+var regexpCmd = map[string]bool{
+       "grep":   true,
+       "stderr": true,
+       "stdout": true,
+}
+
 // addcrlf adds CRLF line endings to the named files.
 func (ts *testScript) cmdAddcrlf(neg bool, args []string) {
        if len(args) == 0 {
@@ -399,7 +389,7 @@ func (ts *testScript) cmdCc(neg bool, args []string) {
        var b work.Builder
        b.Init()
        ts.cmdExec(neg, append(b.GccCmd(".", ""), args...))
-       os.RemoveAll(b.WorkDir)
+       robustio.RemoveAll(b.WorkDir)
 }
 
 // cd changes to a different directory.
@@ -486,8 +476,8 @@ func (ts *testScript) doCmdCmp(args []string, env bool) {
        text2 = string(data)
 
        if env {
-               text1 = ts.expand(text1)
-               text2 = ts.expand(text2)
+               text1 = ts.expand(text1, false)
+               text2 = ts.expand(text2, false)
        }
 
        if text1 == text2 {
@@ -515,16 +505,33 @@ func (ts *testScript) cmdCp(neg bool, args []string) {
        }
 
        for _, arg := range args[:len(args)-1] {
-               src := ts.mkabs(arg)
-               info, err := os.Stat(src)
-               ts.check(err)
-               data, err := ioutil.ReadFile(src)
-               ts.check(err)
+               var (
+                       src  string
+                       data []byte
+                       mode os.FileMode
+               )
+               switch arg {
+               case "stdout":
+                       src = arg
+                       data = []byte(ts.stdout)
+                       mode = 0666
+               case "stderr":
+                       src = arg
+                       data = []byte(ts.stderr)
+                       mode = 0666
+               default:
+                       src = ts.mkabs(arg)
+                       info, err := os.Stat(src)
+                       ts.check(err)
+                       mode = info.Mode() & 0777
+                       data, err = ioutil.ReadFile(src)
+                       ts.check(err)
+               }
                targ := dst
                if dstDir {
                        targ = filepath.Join(dst, filepath.Base(src))
                }
-               ts.check(ioutil.WriteFile(targ, data, info.Mode()&0777))
+               ts.check(ioutil.WriteFile(targ, data, mode))
        }
 }
 
@@ -533,6 +540,13 @@ func (ts *testScript) cmdEnv(neg bool, args []string) {
        if neg {
                ts.fatalf("unsupported: ! env")
        }
+
+       conv := func(s string) string { return s }
+       if len(args) > 0 && args[0] == "-r" {
+               conv = regexp.QuoteMeta
+               args = args[1:]
+       }
+
        if len(args) == 0 {
                printed := make(map[string]bool) // env list can have duplicates; only print effective value (from envMap) once
                for _, kv := range ts.env {
@@ -550,8 +564,9 @@ func (ts *testScript) cmdEnv(neg bool, args []string) {
                        fmt.Fprintf(&ts.log, "%s=%s\n", env, ts.envMap[env])
                        continue
                }
-               ts.env = append(ts.env, env)
-               ts.envMap[env[:i]] = env[i+1:]
+               key, val := env[:i], conv(env[i+1:])
+               ts.env = append(ts.env, key+"="+val)
+               ts.envMap[key] = val
        }
 }
 
@@ -655,8 +670,8 @@ func (ts *testScript) cmdRm(neg bool, args []string) {
        }
        for _, arg := range args {
                file := ts.mkabs(arg)
-               removeAll(file)              // does chmod and then attempts rm
-               ts.check(os.RemoveAll(file)) // report error
+               removeAll(file)                    // does chmod and then attempts rm
+               ts.check(robustio.RemoveAll(file)) // report error
        }
 }
 
@@ -737,6 +752,11 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
                }
                args = args[1:]
        }
+       quiet := false
+       if len(args) >= 1 && args[0] == "-q" {
+               quiet = true
+               args = args[1:]
+       }
 
        extraUsage := ""
        want := 1
@@ -748,9 +768,11 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
                ts.fatalf("usage: %s [-count=N] 'pattern'%s", name, extraUsage)
        }
 
-       pattern := args[0]
-       re, err := regexp.Compile(`(?m)` + pattern)
-       ts.check(err)
+       pattern := `(?m)` + args[0]
+       re, err := regexp.Compile(pattern)
+       if err != nil {
+               ts.fatalf("regexp.Compile(%q): %v", pattern, err)
+       }
 
        isGrep := name == "grep"
        if isGrep {
@@ -765,14 +787,14 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
 
        if neg {
                if re.MatchString(text) {
-                       if isGrep {
+                       if isGrep && !quiet {
                                fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
                        }
                        ts.fatalf("unexpected match for %#q found in %s: %s", pattern, name, re.FindString(text))
                }
        } else {
                if !re.MatchString(text) {
-                       if isGrep {
+                       if isGrep && !quiet {
                                fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
                        }
                        ts.fatalf("no match for %#q found in %s", pattern, name)
@@ -780,7 +802,7 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
                if n > 0 {
                        count := len(re.FindAllString(text, -1))
                        if count != n {
-                               if isGrep {
+                               if isGrep && !quiet {
                                        fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
                                }
                                ts.fatalf("have %d matches for %#q, want %d", count, pattern, n)
@@ -939,8 +961,20 @@ func interruptProcess(p *os.Process) {
 }
 
 // expand applies environment variable expansion to the string s.
-func (ts *testScript) expand(s string) string {
-       return os.Expand(s, func(key string) string { return ts.envMap[key] })
+func (ts *testScript) expand(s string, inRegexp bool) string {
+       return os.Expand(s, func(key string) string {
+               e := ts.envMap[key]
+               if inRegexp {
+                       // Replace workdir with $WORK, since we have done the same substitution in
+                       // the text we're about to compare against.
+                       e = strings.ReplaceAll(e, ts.workdir, "$WORK")
+
+                       // Quote to literal strings: we want paths like C:\work\go1.4 to remain
+                       // paths rather than regular expressions.
+                       e = regexp.QuoteMeta(e)
+               }
+               return e
+       })
 }
 
 // fatalf aborts the test with the given failure message.
@@ -958,27 +992,82 @@ func (ts *testScript) mkabs(file string) string {
        return filepath.Join(ts.cd, file)
 }
 
+// A condition guards execution of a command.
+type condition struct {
+       want bool
+       tag  string
+}
+
+// A command is a complete command parsed from a script.
+type command struct {
+       neg   bool        // if true, expect the command to fail
+       conds []condition // all must be satisfied
+       name  string      // the name of the command; must be non-empty
+       args  []string    // shell-expanded arguments following name
+}
+
 // parse parses a single line as a list of space-separated arguments
 // subject to environment variable expansion (but not resplitting).
 // Single quotes around text disable splitting and expansion.
 // To embed a single quote, double it: 'Don''t communicate by sharing memory.'
-func (ts *testScript) parse(line string) []string {
+func (ts *testScript) parse(line string) command {
        ts.line = line
 
        var (
-               args   []string
-               arg    string  // text of current arg so far (need to add line[start:i])
-               start  = -1    // if >= 0, position where current arg text chunk starts
-               quoted = false // currently processing quoted text
+               cmd      command
+               arg      string  // text of current arg so far (need to add line[start:i])
+               start    = -1    // if >= 0, position where current arg text chunk starts
+               quoted   = false // currently processing quoted text
+               isRegexp = false // currently processing unquoted regular expression
        )
+
+       flushArg := func() {
+               defer func() {
+                       arg = ""
+                       start = -1
+               }()
+
+               if cmd.name != "" {
+                       cmd.args = append(cmd.args, arg)
+                       isRegexp = false // Commands take only one regexp argument, so no subsequent args are regexps.
+                       return
+               }
+
+               // Command prefix ! means negate the expectations about this command:
+               // go command should fail, match should not be found, etc.
+               if arg == "!" {
+                       if cmd.neg {
+                               ts.fatalf("duplicated '!' token")
+                       }
+                       cmd.neg = true
+                       return
+               }
+
+               // Command prefix [cond] means only run this command if cond is satisfied.
+               if strings.HasPrefix(arg, "[") && strings.HasSuffix(arg, "]") {
+                       want := true
+                       arg = strings.TrimSpace(arg[1 : len(arg)-1])
+                       if strings.HasPrefix(arg, "!") {
+                               want = false
+                               arg = strings.TrimSpace(arg[1:])
+                       }
+                       if arg == "" {
+                               ts.fatalf("empty condition")
+                       }
+                       cmd.conds = append(cmd.conds, condition{want: want, tag: arg})
+                       return
+               }
+
+               cmd.name = arg
+               isRegexp = regexpCmd[cmd.name]
+       }
+
        for i := 0; ; i++ {
                if !quoted && (i >= len(line) || line[i] == ' ' || line[i] == '\t' || line[i] == '\r' || line[i] == '#') {
                        // Found arg-separating space.
                        if start >= 0 {
-                               arg += ts.expand(line[start:i])
-                               args = append(args, arg)
-                               start = -1
-                               arg = ""
+                               arg += ts.expand(line[start:i], isRegexp)
+                               flushArg()
                        }
                        if i >= len(line) || line[i] == '#' {
                                break
@@ -992,7 +1081,7 @@ func (ts *testScript) parse(line string) []string {
                        if !quoted {
                                // starting a quoted chunk
                                if start >= 0 {
-                                       arg += ts.expand(line[start:i])
+                                       arg += ts.expand(line[start:i], isRegexp)
                                }
                                start = i + 1
                                quoted = true
@@ -1016,7 +1105,7 @@ func (ts *testScript) parse(line string) []string {
                        start = i
                }
        }
-       return args
+       return cmd
 }
 
 // diff returns a formatted diff of the two texts,
index 8bb6056a540ae24850eb74f557fd56c5ac2ffdac..d9c3aab9c49630306a61607398f21b451283b39c 100644 (file)
@@ -29,7 +29,7 @@ import (
        "path/filepath"
        "strings"
 
-       "../internal/txtar"
+       "cmd/go/internal/txtar"
 )
 
 func usage() {
@@ -44,7 +44,7 @@ func fatalf(format string, args ...interface{}) {
        log.Fatalf(format, args...)
 }
 
-const goCmd = "vgo"
+const goCmd = "go"
 
 func main() {
        flag.Usage = usage
index ddf613d870126ca62b6402718b2f1e466c77e4af..a4e5507f2cd92ca6aba8cb9cde5769654f068665 100644 (file)
@@ -1,16 +1,19 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package flag_test
 
 import (
        "flag"
-       "log"
        "testing"
 )
 
 var v = flag.Int("v", 0, "v flag")
 
-// Run this as go test pkg -v=7
+// Run this as go test pkg -args -v=7
 func TestVFlagIsSet(t *testing.T) {
        if *v != 7 {
-               log.Fatal("v flag not set")
+               t.Fatal("v flag not set")
        }
 }
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt
new file mode 100644 (file)
index 0000000..d7bf647
--- /dev/null
@@ -0,0 +1,12 @@
+example.com/badchain/a v1.0.0
+
+-- .mod --
+module example.com/badchain/a
+
+require example.com/badchain/b v1.0.0
+-- .info --
+{"Version":"v1.0.0"}
+-- a.go --
+package a
+
+import _ "example.com/badchain/b"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt
new file mode 100644 (file)
index 0000000..92190d8
--- /dev/null
@@ -0,0 +1,12 @@
+example.com/badchain/a v1.1.0
+
+-- .mod --
+module example.com/badchain/a
+
+require example.com/badchain/b v1.1.0
+-- .info --
+{"Version":"v1.1.0"}
+-- a.go --
+package a
+
+import _ "example.com/badchain/b"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt
new file mode 100644 (file)
index 0000000..d42b8aa
--- /dev/null
@@ -0,0 +1,12 @@
+example.com/badchain/b v1.0.0
+
+-- .mod --
+module example.com/badchain/b
+
+require example.com/badchain/c v1.0.0
+-- .info --
+{"Version":"v1.0.0"}
+-- b.go --
+package b
+
+import _ "example.com/badchain/c"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt
new file mode 100644 (file)
index 0000000..6648184
--- /dev/null
@@ -0,0 +1,12 @@
+example.com/badchain/b v1.1.0
+
+-- .mod --
+module example.com/badchain/b
+
+require example.com/badchain/c v1.1.0
+-- .info --
+{"Version":"v1.1.0"}
+-- b.go --
+package b
+
+import _ "example.com/badchain/c"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt
new file mode 100644 (file)
index 0000000..9c717cb
--- /dev/null
@@ -0,0 +1,8 @@
+example.com/badchain/c v1.0.0
+
+-- .mod --
+module example.com/badchain/c
+-- .info --
+{"Version":"v1.0.0"}
+-- c.go --
+package c
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt
new file mode 100644 (file)
index 0000000..da19ebd
--- /dev/null
@@ -0,0 +1,8 @@
+example.com/badchain/c v1.1.0
+
+-- .mod --
+module example.com/badchain/wrong
+-- .info --
+{"Version":"v1.1.0"}
+-- c.go --
+package c
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt
new file mode 100644 (file)
index 0000000..88d50e5
--- /dev/null
@@ -0,0 +1,9 @@
+example.com/downgrade v2.0.0
+written by hand
+
+-- .mod --
+module example.com/downgrade
+
+require rsc.io/quote v1.5.2
+-- .info --
+{"Version":"v2.0.0"}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt b/libgo/go/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt
new file mode 100644 (file)
index 0000000..a4d665f
--- /dev/null
@@ -0,0 +1,13 @@
+example.com/downgrade/v2 v2.0.1
+written by hand
+
+-- .mod --
+module example.com/downgrade/v2
+
+require rsc.io/quote v1.5.2
+-- .info --
+{"Version":"v2.0.1"}
+-- go.mod --
+module example.com/downgrade/v2
+
+require rsc.io/quote v1.5.2
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_invalidpath_v1_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_invalidpath_v1_v1.0.0.txt
new file mode 100644 (file)
index 0000000..7d9d130
--- /dev/null
@@ -0,0 +1,13 @@
+example.com/invalidpath/v1 v1.0.0
+written by hand
+
+-- .mod --
+module example.com/invalidpath/v1
+-- .info --
+{"Version":"v1.0.0"}
+-- go.mod --
+module example.com/invalidpath/v1
+-- version.go --
+package version
+
+const V = "v1.0.0"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt
new file mode 100644 (file)
index 0000000..25bd3d9
--- /dev/null
@@ -0,0 +1,14 @@
+example.com/latemigrate/v2 v2.0.0
+written by hand
+
+This repository migrated to modules in v2.0.1 after v2.0.0 was already tagged.
+All versions require rsc.io/quote so we can test downgrades.
+
+v2.0.0 is technically part of example.com/latemigrate as v2.0.0+incompatible.
+Proxies may serve it as part of the version list for example.com/latemigrate/v2.
+'go get' must be able to ignore these versions.
+
+-- .mod --
+module example.com/latemigrate
+-- .info --
+{"Version":"v2.0.0"}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt b/libgo/go/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt
new file mode 100644 (file)
index 0000000..be427a3
--- /dev/null
@@ -0,0 +1,20 @@
+example.com/latemigrate/v2 v2.0.1
+written by hand
+
+This repository migrated to modules in v2.0.1 after v2.0.0 was already tagged.
+All versions require rsc.io/quote so we can test downgrades.
+
+v2.0.1 belongs to example.com/latemigrate/v2.
+
+-- .mod --
+module example.com/latemigrate/v2
+
+require rsc.io/quote v1.3.0
+-- .info --
+{"Version":"v2.0.1"}
+-- go.mod --
+module example.com/latemigrate/v2
+
+require rsc.io/quote v1.3.0
+-- late.go --
+package late
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt
new file mode 100644 (file)
index 0000000..15f3f69
--- /dev/null
@@ -0,0 +1,11 @@
+The deprecated package is present in this version (which is @latest) but
+is deleted in a newer prerelease version.
+
+-- .mod --
+module example.com/missingpkg
+-- .info --
+{"Version":"v1.0.0"}
+-- lib.go --
+package lib
+-- deprecated/deprecated.go --
+package deprecated
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt b/libgo/go/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt
new file mode 100644 (file)
index 0000000..44580fe
--- /dev/null
@@ -0,0 +1,8 @@
+The deprecated package is deleted in this version.
+
+-- .mod --
+module example.com/missingpkg
+-- .info --
+{"Version":"v1.0.1-beta"}
+-- lib.go --
+package lib
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_nest_sub_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_nest_sub_v1.0.0.txt
new file mode 100644 (file)
index 0000000..90f1459
--- /dev/null
@@ -0,0 +1,12 @@
+Written by hand.
+Test case for nested modules without an explicit relationship.
+This is nested below the top-level module.
+
+-- .mod --
+module example.com/nest/sub
+-- .info --
+{"Version": "v1.0.0"}
+-- go.mod --
+module example.com/nest/sub
+-- y/y.go --
+package y
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_nest_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_nest_v1.0.0.txt
new file mode 100644 (file)
index 0000000..593caf1
--- /dev/null
@@ -0,0 +1,12 @@
+Written by hand.
+Test case for nested modules without an explicit relationship.
+This is the top-level module.
+
+-- .mod --
+module example.com/nest
+-- .info --
+{"Version": "v1.0.0"}
+-- go.mod --
+module example.com/nest
+-- sub/x/x.go --
+package x
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_nest_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_nest_v1.1.0.txt
new file mode 100644 (file)
index 0000000..5a01550
--- /dev/null
@@ -0,0 +1,12 @@
+Written by hand.
+Test case for nested modules without an explicit relationship.
+This is the top-level module.
+
+-- .mod --
+module example.com/nest
+-- .info --
+{"Version": "v1.1.0"}
+-- go.mod --
+module example.com/nest
+-- sub/x/x.go --
+package x
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.0.txt
new file mode 100644 (file)
index 0000000..829065d
--- /dev/null
@@ -0,0 +1,10 @@
+example.com/newcycle/a v1.0.0
+
+Transitively requires v1.0.1 of itself via example.com/newcycle/b
+
+-- .mod --
+module example.com/newcycle/a
+
+require example.com/newcycle/b v1.0.0
+-- .info --
+{"Version":"v1.0.0"}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/example.com_newcycle_a_v1.0.1.txt
new file mode 100644 (file)
index 0000000..a03f4b4
--- /dev/null
@@ -0,0 +1,10 @@
+example.com/newcycle/a v1.0.1
+
+Transitively requires itself via example.com/newcycle/b
+
+-- .mod --
+module example.com/newcycle/a
+
+require example.com/newcycle/b v1.0.0
+-- .info --
+{"Version":"v1.0.1"}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_newcycle_b_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_newcycle_b_v1.0.0.txt
new file mode 100644 (file)
index 0000000..ff9e1f5
--- /dev/null
@@ -0,0 +1,8 @@
+example.com/newcycle/b v1.0.0
+
+-- .mod --
+module example.com/newcycle/b
+
+require example.com/newcycle/a v1.0.1
+-- .info --
+{"Version":"v1.0.0"}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.0.txt
new file mode 100644 (file)
index 0000000..aa5febf
--- /dev/null
@@ -0,0 +1,8 @@
+A module which has no root package.
+
+-- .mod --
+module example.com/noroot
+-- .info --
+{"Version":"v1.0.0"}
+-- pkg/pkg.go --
+package pkg
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/example.com_noroot_v1.0.1.txt
new file mode 100644 (file)
index 0000000..9b93717
--- /dev/null
@@ -0,0 +1,8 @@
+A module which has no root package.
+
+-- .mod --
+module example.com/noroot
+-- .info --
+{"Version":"v1.0.1"}
+-- pkg/pkg.go --
+package pkg
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_notags_v0.0.0-20190507143103-cc8cbe209b64.txt b/libgo/go/cmd/go/testdata/mod/example.com_notags_v0.0.0-20190507143103-cc8cbe209b64.txt
new file mode 100644 (file)
index 0000000..259774d
--- /dev/null
@@ -0,0 +1,9 @@
+Written by hand.
+The "latest" version of a module without any tags.
+
+-- .mod --
+module example.com/notags
+-- .info --
+{"Version":"v0.0.0-20190507143103-cc8cbe209b64","Time":"2019-05-07T07:31:03-07:00"}
+-- notags.go --
+package notags
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_printversion_v0.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_printversion_v0.1.0.txt
new file mode 100644 (file)
index 0000000..bae8b13
--- /dev/null
@@ -0,0 +1,27 @@
+example.com/printversion v0.1.0
+
+-- .mod --
+module example.com/printversion
+-- .info --
+{"Version":"v0.1.0"}
+-- README.txt --
+There is no go.mod file for this version of the module.
+-- printversion.go --
+package main
+
+import (
+       "fmt"
+       "os"
+       "runtime/debug"
+
+       _ "example.com/version"
+)
+
+func main() {
+       info, _ := debug.ReadBuildInfo()
+       fmt.Fprintf(os.Stdout, "path is %s\n", info.Path)
+       fmt.Fprintf(os.Stdout, "main is %s %s\n", info.Main.Path, info.Main.Version)
+       for _, m := range info.Deps {
+               fmt.Fprintf(os.Stdout, "using %s %s\n", m.Path, m.Version)
+       }
+}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_printversion_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_printversion_v1.0.0.txt
new file mode 100644 (file)
index 0000000..2467418
--- /dev/null
@@ -0,0 +1,35 @@
+example.com/printversion v1.0.0
+
+-- .mod --
+module example.com/printversion
+
+require example.com/version v1.0.0
+replace example.com/version v1.0.0 => ../oops v0.0.0
+exclude example.com/version v1.1.0
+-- .info --
+{"Version":"v1.0.0"}
+-- go.mod --
+module example.com/printversion
+
+require example.com/version v1.0.0
+replace example.com/version v1.0.0 => ../oops v0.0.0
+exclude example.com/version v1.0.1
+-- printversion.go --
+package main
+
+import (
+       "fmt"
+       "os"
+       "runtime/debug"
+
+       _ "example.com/version"
+)
+
+func main() {
+       info, _ := debug.ReadBuildInfo()
+       fmt.Fprintf(os.Stdout, "path is %s\n", info.Path)
+       fmt.Fprintf(os.Stdout, "main is %s %s\n", info.Main.Path, info.Main.Version)
+       for _, m := range info.Deps {
+               fmt.Fprintf(os.Stdout, "using %s %s\n", m.Path, m.Version)
+       }
+}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.0.0-20190430073000-30950c05d534.txt b/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.0.0-20190430073000-30950c05d534.txt
new file mode 100644 (file)
index 0000000..047ceb6
--- /dev/null
@@ -0,0 +1,13 @@
+example.com/pseudoupgrade v0.0.0-20190429073000-30950c05d534
+written by hand
+
+-- .mod --
+module example.com/pseudoupgrade
+
+-- .info --
+{"Version":"v0.0.0-20190430073000-30950c05d534","Name":"v0.0.0-20190430073000-30950c05d534","Short":"30950c05d534","Time":"2019-04-30T07:30:00Z"}
+
+-- pseudoupgrade.go --
+package pseudoupgrade
+
+const X = 1
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.0.txt
new file mode 100644 (file)
index 0000000..7ddb0dc
--- /dev/null
@@ -0,0 +1,13 @@
+example.com/pseudoupgrade v0.1.0
+written by hand
+
+-- .mod --
+module example.com/pseudoupgrade
+
+-- .info --
+{"Version":"v0.1.0","Name":"","Short":"","Time":"2019-04-29T07:30:30Z"}
+
+-- pseudoupgrade.go --
+package pseudoupgrade
+
+const X = 1
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.1-0.20190429073117-b5426c86b553.txt b/libgo/go/cmd/go/testdata/mod/example.com_pseudoupgrade_v0.1.1-0.20190429073117-b5426c86b553.txt
new file mode 100644 (file)
index 0000000..b3f48bb
--- /dev/null
@@ -0,0 +1,13 @@
+example.com/pseudoupgrade v0.1.1-0.20190429073117-b5426c86b553
+written by hand
+
+-- .mod --
+module example.com/pseudoupgrade
+
+-- .info --
+{"Version":"v0.1.1-0.20190429073117-b5426c86b553","Name":"v0.1.1-0.20190429073117-b5426c86b553","Short":"b5426c86b553","Time":"2019-04-29T07:31:00Z"}
+
+-- pseudoupgrade.go --
+package pseudoupgrade
+
+const X = 1
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt
new file mode 100644 (file)
index 0000000..22e36b9
--- /dev/null
@@ -0,0 +1,12 @@
+-- .info --
+{"Version": "v1.0.0"}
+-- .mod --
+module example.com/tools
+-- cmd/hello/hello.go --
+package main
+
+import "fmt"
+
+func main() {
+       fmt.Println("hello")
+}
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt
new file mode 100644 (file)
index 0000000..5e1c5c8
--- /dev/null
@@ -0,0 +1,13 @@
+This module requires example.com/missingpkg at a prerelease version, which
+is newer than @latest.
+
+-- .mod --
+module example.com/usemissingpre
+
+require example.com/missingpkg v1.0.1-beta
+-- .info --
+{"Version":"v1.0.0"}
+-- use.go --
+package use
+
+import _ "example.com/missingpkg"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.0.txt
new file mode 100644 (file)
index 0000000..d8c45b5
--- /dev/null
@@ -0,0 +1,11 @@
+example.com/version v1.0.0
+written by hand
+
+-- .mod --
+module example.com/version
+-- .info --
+{"Version":"v1.0.0"}
+-- version.go --
+package version
+
+const V = "v1.0.0"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/example.com_version_v1.0.1.txt
new file mode 100644 (file)
index 0000000..3bfdb0e
--- /dev/null
@@ -0,0 +1,11 @@
+example.com/version v1.0.1
+written by hand
+
+-- .mod --
+module example.com/version
+-- .info --
+{"Version":"v1.0.1"}
+-- version.go --
+package version
+
+const V = "v1.0.1"
diff --git a/libgo/go/cmd/go/testdata/mod/example.com_version_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/example.com_version_v1.1.0.txt
new file mode 100644 (file)
index 0000000..8109a9a
--- /dev/null
@@ -0,0 +1,11 @@
+example.com/version v1.1.0
+written by hand
+
+-- .mod --
+module example.com/version
+-- .info --
+{"Version":"v1.1.0"}
+-- version.go --
+package version
+
+const V = "v1.1.0"
diff --git a/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.0.0-20190619020302-197a620e0c9a.txt b/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.0.0-20190619020302-197a620e0c9a.txt
new file mode 100644 (file)
index 0000000..c2709c1
--- /dev/null
@@ -0,0 +1,10 @@
+module github.com/dmitshur-test/modtest5@v0.0.0-20190619020302-197a620e0c9a
+
+-- .mod --
+module github.com/dmitshur-test/modtest5
+-- .info --
+{"Version":"v0.0.0-20190619020302-197a620e0c9a","Time":"2019-06-18T19:03:02-07:00"}
+-- p.go --
+package p
+
+const v = 1
diff --git a/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.0.20190619023908-3da23a9deb9e.txt b/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.0.20190619023908-3da23a9deb9e.txt
new file mode 100644 (file)
index 0000000..22e47f3
--- /dev/null
@@ -0,0 +1,10 @@
+module github.com/dmitshur-test/modtest5@v0.5.0-alpha.0.20190619023908-3da23a9deb9e
+
+-- .mod --
+module github.com/dmitshur-test/modtest5
+-- .info --
+{"Version":"v0.5.0-alpha.0.20190619023908-3da23a9deb9e","Time":"2019-06-18T19:39:08-07:00"}
+-- p.go --
+package p
+
+const v = 3
diff --git a/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.txt b/libgo/go/cmd/go/testdata/mod/github.com_dmitshur-test_modtest5_v0.5.0-alpha.txt
new file mode 100644 (file)
index 0000000..4f088cc
--- /dev/null
@@ -0,0 +1,10 @@
+module github.com/dmitshur-test/modtest5@v0.5.0-alpha
+
+-- .mod --
+module github.com/dmitshur-test/modtest5
+-- .info --
+{"Version":"v0.5.0-alpha","Time":"2019-06-18T19:04:46-07:00"}
+-- p.go --
+package p
+
+const v = 2
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt
new file mode 100644 (file)
index 0000000..40616c6
--- /dev/null
@@ -0,0 +1,11 @@
+patch.example.com/depofdirectpatch v1.0.0
+written by hand
+
+-- .mod --
+module patch.example.com/depofdirectpatch
+-- .info --
+{"Version":"v1.0.0"}
+-- go.mod --
+module patch.example.com/depofdirectpatch
+-- depofdirectpatch.go --
+package depofdirectpatch
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt
new file mode 100644 (file)
index 0000000..e075028
--- /dev/null
@@ -0,0 +1,11 @@
+patch.example.com/depofdirectpatch v1.0.1
+written by hand
+
+-- .mod --
+module patch.example.com/depofdirectpatch
+-- .info --
+{"Version":"v1.0.1"}
+-- go.mod --
+module patch.example.com/depofdirectpatch
+-- depofdirectpatch.go --
+package depofdirectpatch
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt
new file mode 100644 (file)
index 0000000..1e775fb
--- /dev/null
@@ -0,0 +1,21 @@
+patch.example.com/direct v1.0.0
+written by hand
+
+-- .mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+)
+-- .info --
+{"Version":"v1.0.0"}
+-- go.mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+)
+-- direct.go --
+package direct
+
+import _ "patch.example.com/indirect"
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt
new file mode 100644 (file)
index 0000000..64912b7
--- /dev/null
@@ -0,0 +1,27 @@
+patch.example.com/direct v1.0.1
+written by hand
+
+-- .mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+       patch.example.com/depofdirectpatch v1.0.0
+)
+-- .info --
+{"Version":"v1.0.1"}
+-- go.mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+       patch.example.com/depofdirectpatch v1.0.0
+)
+-- direct.go --
+package direct
+
+import _ "patch.example.com/indirect"
+-- usedepofdirectpatch/unused.go --
+package usedepofdirectpatch
+
+import _ "patch.example.com/depofdirectpatch"
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt
new file mode 100644 (file)
index 0000000..406e3b9
--- /dev/null
@@ -0,0 +1,21 @@
+patch.example.com/direct v1.1.0
+written by hand
+
+-- .mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+)
+-- .info --
+{"Version":"v1.1.0"}
+-- go.mod --
+module patch.example.com/direct
+
+require (
+       patch.example.com/indirect v1.0.0
+)
+-- direct.go --
+package direct
+
+import _ "patch.example.com/indirect"
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt
new file mode 100644 (file)
index 0000000..ea7f5e2
--- /dev/null
@@ -0,0 +1,11 @@
+patch.example.com/indirect v1.0.0
+written by hand
+
+-- .mod --
+module patch.example.com/indirect
+-- .info --
+{"Version":"v1.0.0"}
+-- go.mod --
+module patch.example.com/indirect
+-- direct.go --
+package indirect
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt
new file mode 100644 (file)
index 0000000..8c6cf8e
--- /dev/null
@@ -0,0 +1,11 @@
+patch.example.com/indirect v1.0.1
+written by hand
+
+-- .mod --
+module patch.example.com/indirect
+-- .info --
+{"Version":"v1.0.1"}
+-- go.mod --
+module patch.example.com/indirect
+-- direct.go --
+package indirect
diff --git a/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt b/libgo/go/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt
new file mode 100644 (file)
index 0000000..f7229d4
--- /dev/null
@@ -0,0 +1,11 @@
+patch.example.com/indirect v1.1.0
+written by hand
+
+-- .mod --
+module patch.example.com/indirect
+-- .info --
+{"Version":"v1.1.0"}
+-- go.mod --
+module patch.example.com/indirect
+-- direct.go --
+package indirect
diff --git a/libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt
new file mode 100644 (file)
index 0000000..d62db26
--- /dev/null
@@ -0,0 +1,14 @@
+rsc.io/badsum@v1.0.0
+
+This module would match the hard-coded hash for rsc.io/badsum v1.0.0
+in modfetch/notary.go if not for the "break hash" line.
+
+-- .mod --
+module "rsc.io/badsum"
+-- .info --
+{"Version":"v1.0.0","Time":"2018-02-14T00:45:20Z"}
+-- go.mod --
+module "rsc.io/badsum"
+-- badsum.go --
+package badsum
+// break hash
diff --git a/libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt b/libgo/go/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt
new file mode 100644 (file)
index 0000000..5fea50a
--- /dev/null
@@ -0,0 +1,14 @@
+rsc.io/badsum@v1.0.1
+
+This module would match the hard-coded hash for rsc.io/badsum v1.0.1/go.mod
+in modfetch/notary.go if not for the "break hash" line.
+
+-- .mod --
+module "rsc.io/badsum"
+# break hash
+-- .info --
+{"Version":"v1.0.1","Time":"2018-02-14T00:45:20Z"}
+-- go.mod --
+module "rsc.io/badsum"
+-- badsum.go --
+package badsum
diff --git a/libgo/go/cmd/go/testdata/mod/rsc.io_badzip_v1.0.0.txt b/libgo/go/cmd/go/testdata/mod/rsc.io_badzip_v1.0.0.txt
new file mode 100644 (file)
index 0000000..07a38fa
--- /dev/null
@@ -0,0 +1,11 @@
+rsc.io/badzip v1.0.0
+written by hand
+
+-- .mod --
+module rsc.io/badzip
+-- .info --
+{"Version":"v1.0.0"}
+-- x.go --
+package x
+-- /rsc.io/badzip@v1.0.0.txt --
+This file should not be here.
index a7b50fff1645456710fa262e580d3d5b3f102781..66ab8515c33e7838b31f4c4a3b63260a967ad67a 100644 (file)
@@ -28,6 +28,7 @@ Scripts also have access to these other environment variables:
 
        GOARCH=<target GOARCH>
        GOCACHE=<actual GOCACHE being used outside the test>
+       GOEXE=<executable file suffix: .exe on Windows, empty on other systems>
        GOOS=<target GOOS>
        GOPATH=$WORK/gopath
        GOPROXY=<local module proxy serving from cmd/go/testdata/mod>
@@ -38,8 +39,6 @@ Scripts also have access to these other environment variables:
        devnull=<value of os.DevNull>
        goversion=<current Go version; for example, 1.12>
 
-The environment variable $exe (lowercase) is an empty string on most systems, ".exe" on Windows.
-
 The scripts supporting files are unpacked relative to $GOPATH/src (aka $WORK/gopath/src)
 and then the script begins execution in that directory as well. Thus the example above runs
 in $WORK/gopath/src with GOPATH=$WORK/gopath and $WORK/gopath/src/hello.go
@@ -108,10 +107,14 @@ The commands are:
 
 - cp src... dst
   Copy the listed files to the target file or existing directory.
+  src can include "stdout" or "stderr" to use the standard output or standard error
+  from the most recent exec or go command.
 
-- env [key=value...]
+- env [-r] [key=value...]
   With no arguments, print the environment (useful for debugging).
   Otherwise add the listed key=value pairs to the environment.
+  The -r flag causes the values to be escaped using regexp.QuoteMeta
+  before being recorded.
 
 - [!] exec program [args...] [&]
   Run the given executable program with the arguments.
@@ -133,9 +136,10 @@ The commands are:
   Run the (test copy of the) go command with the given arguments.
   It must (or must not) succeed.
 
-- [!] grep [-count=N] pattern file
+- [!] grep [-count=N] [-q] pattern file
   The file's content must (or must not) match the regular expression pattern.
   For positive matches, -count=N specifies an exact number of matches to require.
+  The -q flag disables printing the file content on a mismatch.
 
 - mkdir path...
   Create the listed directories, if they do not already exists.
diff --git a/libgo/go/cmd/go/testdata/script/binary_only.txt b/libgo/go/cmd/go/testdata/script/binary_only.txt
deleted file mode 100644 (file)
index 397904e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# check that error for missing binary-only says where it should be
-! go build b
-stderr pkg[\\/].*a\.a
-
--- a/a.go --
-//go:binary-only-package
-
-package a
--- b/b.go --
-package b; import "a"
diff --git a/libgo/go/cmd/go/testdata/script/bug.txt b/libgo/go/cmd/go/testdata/script/bug.txt
new file mode 100644 (file)
index 0000000..db3ac25
--- /dev/null
@@ -0,0 +1,46 @@
+# Verify that go bug creates the appropriate URL issue body
+
+[!linux] skip
+
+go install
+env BROWSER=$GOPATH/bin/browser
+go bug
+exists $TMPDIR/browser
+grep '^go version' $TMPDIR/browser
+[!gccgo] grep '^GOROOT/bin/go version: go version' $TMPDIR/browser
+[!gccgo] grep '^GOROOT/bin/go tool compile -V: compile version' $TMPDIR/browser
+grep '^uname -sr: Linux' $TMPDIR/browser
+
+-- go.mod --
+module browser
+
+-- main.go --
+package main
+
+import (
+       "fmt"
+       "net/url"
+       "os"
+       "path/filepath"
+)
+
+func main() {
+       u, err := url.Parse(os.Args[1])
+       if err != nil {
+               panic(err)
+       }
+       body, err := url.PathUnescape(u.Query().Get("body"))
+       if err != nil {
+               panic(err)
+       }
+       out := filepath.Join(os.TempDir(), "browser")
+       f, err := os.Create(out)
+       if err != nil {
+               panic(err)
+       }
+       fmt.Fprintln(f, body)
+       if err := f.Close(); err != nil {
+               panic(err)
+       }
+}
+
index ea06dcc472def69ec7a68dd8bf569c827beb5f2e..c93ca932cab5064aac1626df7f80d6fd4f1991f8 100644 (file)
@@ -1,3 +1,6 @@
+env GO111MODULE=off
+[short] skip
+
 # Set GOCACHE to a clean directory to ensure that 'go build' has work to report.
 env GOCACHE=$WORK/gocache
 
diff --git a/libgo/go/cmd/go/testdata/script/build_acl_windows.txt b/libgo/go/cmd/go/testdata/script/build_acl_windows.txt
new file mode 100644 (file)
index 0000000..13a3ba2
--- /dev/null
@@ -0,0 +1,44 @@
+[!windows] stop
+[!exec:icacls] skip
+[!exec:powershell] skip
+
+# Create $WORK\guest and give the Guests group full access.
+# Files created within that directory will have different security attributes by default.
+mkdir $WORK\guest
+exec icacls $WORK\guest /grant '*S-1-5-32-546:(oi)(ci)f'
+
+env TMP=$WORK\guest
+env TEMP=$WORK\guest
+
+# Build a binary using the guest directory as an intermediate
+cd TestACL
+go build -o main.exe main.go
+# Build the same binary, but write it to the guest directory.
+go build -o $TMP\main.exe main.go
+
+# Read ACLs for the files.
+exec powershell -Command 'Get-Acl main.exe | Select -expand AccessToString'
+cp stdout $WORK\exe-acl.txt
+exec powershell -Command 'Get-Acl main.go | Select -expand AccessToString'
+cp stdout $WORK\src-acl.txt
+cd $TMP
+exec powershell -Command 'Get-Acl main.exe | Select -expand AccessToString'
+cp stdout $WORK\guest-acl.txt
+
+cd $WORK
+
+# The executable written to the source directory should have the same ACL as the source file.
+cmp $WORK\exe-acl.txt $WORK\src-acl.txt
+
+# The file written to the guest-allowed directory should give Guests control.
+grep 'BUILTIN\\Guests\s+Allow' $WORK\guest-acl.txt
+
+# The file written to the ordinary directory should not.
+! grep 'BUILTIN\\Guests\s+Allow' $WORK\exe-acl.txt
+
+
+-- TestACL/go.mod --
+module TestACL
+-- TestACL/main.go --
+package main
+func main() {}
index 7db881a2682d6f45d8ac22939c8db50224a3c6ce..64b391f9aa4651dcac1826be4a74f95f7bc9d2f7 100644 (file)
@@ -1,3 +1,6 @@
+env GO111MODULE=off
+[short] skip
+
 # Set up fresh GOCACHE.
 env GOCACHE=$WORK/gocache
 mkdir $GOCACHE
diff --git a/libgo/go/cmd/go/testdata/script/build_cache_gomips.txt b/libgo/go/cmd/go/testdata/script/build_cache_gomips.txt
new file mode 100644 (file)
index 0000000..0cbf16a
--- /dev/null
@@ -0,0 +1,40 @@
+env GO111MODULE=off
+[short] skip # rebuilds std for mips
+
+# Set up fresh GOCACHE.
+env GOCACHE=$WORK/gocache
+mkdir $GOCACHE
+
+# Building for mipsle without setting GOMIPS will use floating point registers.
+env GOARCH=mipsle
+env GOOS=linux
+go build -gcflags=-S f.go
+stderr ADDD.F[0-9]+,.F[0-9]+,.F[0-9]+
+
+# Clean cache
+go clean -cache
+
+# Building with GOMIPS=softfloat will not use floating point registers
+env GOMIPS=softfloat
+go build -gcflags=-S f.go
+! stderr ADDD.F[0-9]+,.F[0-9]+,.F[0-9]+
+
+# Clean cache
+go clean -cache
+
+# Build without setting GOMIPS
+env GOMIPS=
+go build -gcflags=-S f.go
+stderr ADDD.F[0-9]+,.F[0-9]+,.F[0-9]+
+
+# Building with GOMIPS should still not use floating point registers.
+env GOMIPS=softfloat
+go build -gcflags=-S f.go
+! stderr ADDD.F[0-9]+,.F[0-9]+,.F[0-9]+
+
+-- f.go --
+package f
+
+func F(x float64) float64 {
+     return x + x
+}
index 61e7ee46d3a78d8ff3792ab96e3f2faed4f69661..b9c740ac10ea23acdb23901b3d9a113081e5d169 100644 (file)
@@ -1,3 +1,6 @@
+env GO111MODULE=off
+[short] skip
+
 # Set up fresh GOCACHE.
 env GOCACHE=$WORK/gocache
 mkdir $GOCACHE
@@ -13,9 +16,9 @@ go build -o $devnull -x main.go
 stderr '(link|gccgo)( |\.exe)'
 
 # ... but the output binary can serve as a cache.
-go build -o main$exe -x main.go
+go build -o main$GOEXE -x main.go
 stderr '(link|gccgo)( |\.exe)'
-go build -o main$exe -x main.go
+go build -o main$GOEXE -x main.go
 ! stderr '(link|gccgo)( |\.exe)'
 
 -- main.go --
index ee4099e5f356cb8eec818ddaf5c7496c6d19d9a8..89e3ff0f1ec377116f1b1010783587a9240d1fbe 100644 (file)
@@ -1,4 +1,7 @@
+env GO111MODULE=off
+
 [!gc] skip
+[short] skip # clears cache, rebuilds too much
 
 # Set up fresh GOCACHE.
 env GOCACHE=$WORK/gocache
diff --git a/libgo/go/cmd/go/testdata/script/build_cache_trimpath.txt b/libgo/go/cmd/go/testdata/script/build_cache_trimpath.txt
new file mode 100644 (file)
index 0000000..39367ae
--- /dev/null
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+
+# Set up fresh GOCACHE.
+env GOCACHE=$WORK/gocache
+mkdir $GOCACHE
+
+cd $WORK
+go build -o a.out
+
+# Varying -trimpath should cause a rebuild.
+go build -x -o a.out -trimpath
+stderr '(compile|gccgo)( |\.exe)'
+stderr 'link( |\.exe)'
+
+-- $WORK/hello.go --
+package main
+func main() { println("hello") }
+
+-- $WORK/go.mod --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/build_multi_main.txt b/libgo/go/cmd/go/testdata/script/build_multi_main.txt
new file mode 100644 (file)
index 0000000..1d4926d
--- /dev/null
@@ -0,0 +1,33 @@
+# Verify build -o can output multiple executables to a directory.
+
+mkdir $WORK/bin
+go build -o $WORK/bin ./cmd/c1 ./cmd/c2
+! stderr 'multiple packages'
+
+! go build -o $WORK/bin ./pkg1 ./pkg1
+stderr 'no main packages'
+
+! go build ./cmd/c1
+stderr 'already exists and is a directory'
+
+-- go.mod --
+module exmod
+
+-- cmd/c1/main.go --
+package main
+
+func main() {}
+
+-- cmd/c2/main.go --
+package main
+
+func main() {}
+
+-- pkg1/pkg1.go --
+package pkg1
+
+-- pkg2/pkg2.go --
+package pkg2
+
+-- c1$GOEXE/keep.txt --
+Create c1 directory.
diff --git a/libgo/go/cmd/go/testdata/script/build_nocache.txt b/libgo/go/cmd/go/testdata/script/build_nocache.txt
new file mode 100644 (file)
index 0000000..1059cad
--- /dev/null
@@ -0,0 +1,40 @@
+env GO111MODULE=off
+
+# As of Go 1.12, the module cache is required.
+
+# If none of the variables we use to locate GOCACHE are set, the cache is off
+# and we cannot build.
+env GOCACHE=
+env XDG_CACHE_HOME=
+env HOME=
+[plan9] env home=
+[windows] env LocalAppData=
+! go build -o triv triv.go
+stderr 'build cache is required, but could not be located: GOCACHE is not defined and .*'
+
+# If GOCACHE is set but is not an absolute path, and we cannot build.
+env GOCACHE=test
+! go build -o triv triv.go
+stderr 'build cache is required, but could not be located: GOCACHE is not an absolute path'
+
+# An explicit GOCACHE=off also disables builds.
+env GOCACHE=off
+! go build -o triv triv.go
+stderr 'build cache is disabled by GOCACHE=off'
+
+# If GOCACHE is set to an unwritable directory, we should diagnose it as such.
+[windows] stop # Does not support unwritable directories.
+[root] skip # Can write to unwritable directories.
+
+mkdir $WORK/unwritable/home
+chmod 0555 $WORK/unwritable/home
+[!plan9] env HOME=$WORK/unwritable/home
+[plan9] env home=$WORK/unwritable/home
+
+env GOCACHE=$WORK/unwritable/home
+! go build -o triv triv.go
+stderr 'failed to initialize build cache.* permission denied'
+
+-- triv.go --
+package main
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/build_relative_pkgdir.txt b/libgo/go/cmd/go/testdata/script/build_relative_pkgdir.txt
new file mode 100644 (file)
index 0000000..0716bcd
--- /dev/null
@@ -0,0 +1,9 @@
+env GO111MODULE=off
+
+# Regression test for golang.org/issue/21309: accept relative -pkgdir argument.
+
+[short] skip
+
+mkdir $WORK/gocache
+env GOCACHE=$WORK/gocache
+go build -i -pkgdir=. runtime
diff --git a/libgo/go/cmd/go/testdata/script/build_relative_tmpdir.txt b/libgo/go/cmd/go/testdata/script/build_relative_tmpdir.txt
new file mode 100644 (file)
index 0000000..3e98a67
--- /dev/null
@@ -0,0 +1,18 @@
+env GO111MODULE=off
+
+# If GOTMPDIR is relative, 'go build' should derive an absolute $WORK directory.
+cd $WORK
+mkdir tmp
+env GOTMPDIR=tmp
+go build -work a
+stderr 'WORK=\$WORK' # the test script itself converts the absolute directory back to $WORK
+
+# Similarly if TMP/TMPDIR is relative.
+env GOTMPDIR=
+env TMP=tmp    # Windows
+env TMPDIR=tmp # Unix
+go build -work a
+stderr 'WORK=\$WORK'
+
+-- a/a.go --
+package a
diff --git a/libgo/go/cmd/go/testdata/script/build_runtime_gcflags.txt b/libgo/go/cmd/go/testdata/script/build_runtime_gcflags.txt
new file mode 100644 (file)
index 0000000..da1b65f
--- /dev/null
@@ -0,0 +1,11 @@
+env GO111MODULE=off
+[short] skip # rebuilds all of std
+
+# Set up fresh GOCACHE.
+env GOCACHE=$WORK/gocache
+mkdir $GOCACHE
+
+# Verify the standard library (specifically runtime/internal/atomic) can be
+# built with -gcflags when -n is given. See golang.org/issue/29346.
+go build -n -gcflags=all='-l' std
+stderr 'compile.* -l .* runtime/internal/atomic'
diff --git a/libgo/go/cmd/go/testdata/script/build_trimpath.txt b/libgo/go/cmd/go/testdata/script/build_trimpath.txt
new file mode 100644 (file)
index 0000000..f785b0c
--- /dev/null
@@ -0,0 +1,21 @@
+[short] skip
+
+env -r GOROOT_REGEXP=$GOROOT
+env -r WORK_REGEXP=$WORK
+env GOROOT GOROOT_REGEXP WORK WORK_REGEXP
+
+go build -trimpath -o hello.exe hello.go
+! grep -q $GOROOT_REGEXP hello.exe
+! grep -q $WORK_REGEXP hello.exe
+
+env GO111MODULE=on
+go build -trimpath -o fortune.exe rsc.io/fortune
+! grep -q $GOROOT_REGEXP fortune.exe
+! grep -q $WORK_REGEXP fortune.exe
+
+-- hello.go --
+package main
+func main() { println("hello") }
+
+-- go.mod --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/cache_unix.txt b/libgo/go/cmd/go/testdata/script/cache_unix.txt
new file mode 100644 (file)
index 0000000..0e07ba6
--- /dev/null
@@ -0,0 +1,36 @@
+env GO111MODULE=off
+
+# Integration test for cache directory calculation (cmd/go/internal/cache).
+
+[windows] skip
+[darwin] skip
+[plan9] skip
+
+mkdir $WORK/gocache
+mkdir $WORK/xdg
+mkdir $WORK/home
+
+# Set GOCACHE, XDG_CACHE_HOME, and HOME.
+env GOCACHE=$WORK/gocache
+env XDG_CACHE_HOME=$WORK/xdg
+env HOME=$WORK/home
+
+# With all three set, we should prefer GOCACHE.
+go env GOCACHE
+stdout '\$WORK/gocache$'
+
+# Without GOCACHE, we should prefer XDG_CACHE_HOME over HOME.
+env GOCACHE=
+go env GOCACHE
+stdout '\$WORK/xdg/go-build$$'
+
+# With only HOME set, we should use $HOME/.cache.
+env XDG_CACHE_HOME=
+go env GOCACHE
+stdout '\$WORK/home/.cache/go-build$'
+
+# With no guidance from the environment, we must disable the cache, but that
+# should not cause commands that do not write to the cache to fail.
+env HOME=
+go env GOCACHE
+stdout 'off'
diff --git a/libgo/go/cmd/go/testdata/script/cgo_syso_issue29253.txt b/libgo/go/cmd/go/testdata/script/cgo_syso_issue29253.txt
new file mode 100644 (file)
index 0000000..4fb5cca
--- /dev/null
@@ -0,0 +1,31 @@
+env GO111MODULE=off
+[short] skip
+
+# This test tests that we can link in-package syso files that provides symbols
+# for cgo. See issue 29253.
+[!cgo] stop
+[!gc] stop
+cc -c -o pkg/o.syso ext.c
+go build main.go
+
+-- ext.c --
+// +build ignore
+
+int f() { return 42; }
+-- pkg/pkg.go --
+package pkg
+
+// extern int f(void);
+import "C"
+
+func init() {
+       if v := C.f(); v != 42 {
+               panic(v)
+       }
+}
+-- main.go --
+package main
+
+import _ "pkg"
+
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/clean_testcache.txt b/libgo/go/cmd/go/testdata/script/clean_testcache.txt
new file mode 100644 (file)
index 0000000..dd78464
--- /dev/null
@@ -0,0 +1,19 @@
+env GO111MODULE=off
+[short] skip
+
+# go clean -testcache
+# should work (see golang.org/issue/29757).
+cd x
+go test x_test.go
+go clean -testcache
+go test x_test.go
+! stdout 'cached'
+
+
+-- x/x_test.go --
+package x_test
+import (
+    "testing"
+)
+func TestMain(t *testing.T) {
+}
\ No newline at end of file
index c122c05cb68930e27655d3896afe7d2ebf3096dc..c3bc67df534687b7823a4244e8b9a612e976d70e 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 [short] skip
 
 go test -coverpkg=all -covermode=atomic x
index 5d169d631268e21f8bc851e82baa4644f3df8457..9927c3069070fdeed6712717bc0c222039b07e06 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # Issue 23882
 
 [short] skip
index 142d5ee718dceb754630d4ae833b61f1dd7513f4..38d6439fb1717eb06abf022ec71ed6a8d9d3a0e6 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # Issue 23150
 
 [short] skip
diff --git a/libgo/go/cmd/go/testdata/script/env_write.txt b/libgo/go/cmd/go/testdata/script/env_write.txt
new file mode 100644 (file)
index 0000000..695cc83
--- /dev/null
@@ -0,0 +1,87 @@
+env GO111MODULE=off
+
+# go env should default to the right places
+env AppData=$HOME/windowsappdata
+env home=$HOME/plan9home
+go env GOENV
+[aix] stdout $HOME/.config/go/env
+[darwin] stdout $HOME'/Library/Application Support/go/env'
+[freebsd] stdout $HOME/.config/go/env
+[linux] stdout $HOME/.config/go/env
+[netbsd] stdout $HOME/.config/go/env
+[openbsd] stdout $HOME/.config/go/env
+[plan9] stdout $HOME/plan9home/lib/go/env
+[windows] stdout $HOME\\windowsappdata\\go\\env
+
+# Now override it to something writable.
+env GOENV=$WORK/envdir/go/env
+go env GOENV
+stdout envdir[\\/]go[\\/]env
+
+# go env shows all variables
+go env
+stdout GOARCH=
+stdout GOOS=
+stdout GOROOT=
+
+# go env -w changes default setting
+env root=
+[windows] env root=c:
+env GOPATH=
+go env -w GOPATH=$root/non-exist/gopath
+! stderr .+
+grep GOPATH=$root/non-exist/gopath $WORK/envdir/go/env
+go env GOPATH
+stdout /non-exist/gopath
+
+# go env -w does not override OS environment, and warns about that
+env GOPATH=$root/other
+go env -w GOPATH=$root/non-exist/gopath2
+stderr 'warning: go env -w GOPATH=... does not override conflicting OS environment variable'
+go env GOPATH
+stdout $root/other
+
+# but go env -w does do the update, and unsetting the env var exposes the change
+env GOPATH=
+go env GOPATH
+stdout $root/non-exist/gopath2
+
+# unsetting with go env -u does not warn about OS environment overrides,
+# nor does it warn about variables that haven't been set by go env -w.
+env GOPATH=$root/other
+go env -u GOPATH
+! stderr .+
+go env -u GOPATH
+! stderr .+
+
+# go env -w rejects unknown or bad variables
+! go env -w GODEBUG=gctrace=1
+stderr 'unknown go command variable GODEBUG'
+! go env -w GOEXE=.bat
+stderr 'GOEXE cannot be modified'
+! go env -w GOENV=/env
+stderr 'GOENV can only be set using the OS environment'
+
+# go env -w can set multiple variables
+env CC=
+go env CC
+! stdout ^xyc$
+go env -w GOOS=$GOOS CC=xyc
+grep CC=xyc $GOENV
+# file is maintained in sorted order
+grep 'CC=xyc\nGOOS=' $GOENV
+go env CC
+stdout ^xyc$
+
+# go env -u unsets effect of go env -w.
+go env -u CC
+go env CC
+! stdout ^xyc$
+
+# go env -w rejects double-set variables
+! go env -w GOOS=$GOOS GOOS=$GOOS
+stderr 'multiple values for key: GOOS'
+
+# go env -w rejects missing variables
+! go env -w GOOS
+stderr 'arguments must be KEY=VALUE: invalid argument: GOOS'
index cdc3be2df8f12bb4b1b923351fc238c3ffc9b8fa..5cb35f0dac35f92851ecc768d39e7e5aea55fb36 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # look for short, relative file:line in error message
 ! go run ../../gopath/x/y/z/err.go
 stderr ^..[\\/]x[\\/]y[\\/]z[\\/]err.go:
diff --git a/libgo/go/cmd/go/testdata/script/gcflags_patterns.txt b/libgo/go/cmd/go/testdata/script/gcflags_patterns.txt
new file mode 100644 (file)
index 0000000..dce8e39
--- /dev/null
@@ -0,0 +1,86 @@
+env GO111MODULE=off
+
+[!gc] skip 'using -gcflags and -ldflags'
+[short] skip
+
+# -gcflags=-e applies to named packages, not dependencies
+go build -n -v -gcflags=-e z1 z2
+stderr 'compile.* -e.* -p z1'
+stderr 'compile.* -e.* -p z2'
+stderr 'compile.* -p y'
+! stderr 'compile.* -e.* -p [^z]'
+
+# -gcflags can specify package=flags, and can be repeated; last match wins
+go build -n -v -gcflags=-e -gcflags=z1=-N z1 z2
+stderr 'compile.* -N.* -p z1'
+! stderr 'compile.* -e.* -p z1'
+! stderr 'compile.* -N.* -p z2'
+stderr 'compile.* -e.* -p z2'
+stderr 'compile.* -p y'
+! stderr 'compile.* -e.* -p [^z]'
+! stderr 'compile.* -N.* -p [^z]'
+
+# -gcflags can have arbitrary spaces around the flags
+go build -n -v -gcflags='  z1 =        -e      ' z1
+stderr 'compile.* -e.* -p z1'
+
+# -gcflags='all=-e' should apply to all packages, even with go test
+go test -c -n -gcflags='all=-e' z1
+stderr 'compile.* -e.* -p z3 '
+
+# this particular -gcflags argument made the compiler crash
+! go build -gcflags=-d=ssa/ z1
+stderr 'PhaseOptions usage'
+
+# -ldflags for implicit test package applies to test binary
+go test -c -n -gcflags=-N -ldflags=-X=x.y=z z1
+stderr 'compile.* -N .*z_test.go'
+stderr 'link.* -X=x.y=z'
+
+# -ldflags for explicit test package applies to test binary
+go test -c -n -gcflags=z1=-N -ldflags=z1=-X=x.y=z z1
+stderr 'compile.* -N .*z_test.go'
+stderr 'link.* -X=x.y=z'
+
+# -ldflags applies to link of command
+go build -n -ldflags=-X=math.pi=3 my/cmd/prog
+stderr 'link.* -X=math.pi=3'
+
+# -ldflags applies to link of command even with strange directory name
+go build -n -ldflags=-X=math.pi=3 my/cmd/prog/
+stderr 'link.* -X=math.pi=3'
+
+# -ldflags applies to current directory
+cd my/cmd/prog
+go build -n -ldflags=-X=math.pi=3
+stderr 'link.* -X=math.pi=3'
+
+# -ldflags applies to current directory even if GOPATH is funny
+[windows] cd $WORK/GoPath/src/my/cmd/prog
+[darwin] cd $WORK/GoPath/src/my/cmd/prog
+go build -n -ldflags=-X=math.pi=3
+stderr 'link.* -X=math.pi=3'
+
+-- z1/z.go --
+package z1
+import _ "y"
+import _ "z2"
+
+-- z1/z_test.go --
+package z1_test
+import "testing"
+import _ "z3"
+func Test(t *testing.T) {}
+
+-- z2/z.go --
+package z2
+
+-- z3/z.go --
+package z3
+
+-- y/y.go --
+package y
+
+-- my/cmd/prog/prog.go --
+package main
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/get_404_meta.txt b/libgo/go/cmd/go/testdata/script/get_404_meta.txt
new file mode 100644 (file)
index 0000000..b71cc7f
--- /dev/null
@@ -0,0 +1,11 @@
+# golang.org/issue/13037: 'go get' was not parsing <meta> tags in 404 served over HTTPS.
+
+[!net] skip
+[!exec:git] skip
+
+env GO111MODULE=off
+go get -d -insecure bazil.org/fuse/fs/fstestutil
+
+env GO111MODULE=on
+env GOPROXY=direct
+go get -d -insecure bazil.org/fuse/fs/fstestutil
diff --git a/libgo/go/cmd/go/testdata/script/get_brace.txt b/libgo/go/cmd/go/testdata/script/get_brace.txt
new file mode 100644 (file)
index 0000000..3449a0c
--- /dev/null
@@ -0,0 +1,51 @@
+env GO111MODULE=off
+
+[!exec:git] skip
+
+# Set up some empty repositories.
+cd $WORK/_origin/foo
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git commit --allow-empty -m 'create master branch'
+
+cd $WORK
+cd '_origin/{confusing}'
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git commit --allow-empty -m 'create master branch'
+
+# Clone the empty repositories into GOPATH.
+# This tells the Go command where to find them: it takes the place of a user's meta-tag redirector.
+mkdir $GOPATH/src/example.com
+cd $GOPATH/src/example.com
+exec git clone $WORK/_origin/foo
+exec git clone $WORK/_origin/{confusing}
+
+# Commit contents to the repositories.
+cd $WORK/_origin/foo
+exec git add main.go
+exec git commit -m 'add main'
+
+cd $WORK
+cd '_origin/{confusing}'
+exec git add confusing.go
+exec git commit -m 'just try to delete this!'
+
+# 'go get' should refuse to download or update the confusingly-named repo.
+cd $GOPATH/src/example.com/foo
+! go get -u 'example.com/{confusing}'
+stderr 'invalid char'
+! go get -u example.com/foo
+stderr 'invalid import path'
+! exists example.com/{confusing}
+
+-- $WORK/_origin/foo/main.go --
+package main
+import _ "example.com/{confusing}"
+
+func main() {}
+
+-- $WORK/_origin/{confusing}/confusing.go --
+package confusing
diff --git a/libgo/go/cmd/go/testdata/script/get_dotfiles.txt b/libgo/go/cmd/go/testdata/script/get_dotfiles.txt
new file mode 100644 (file)
index 0000000..6757f9d
--- /dev/null
@@ -0,0 +1,64 @@
+env GO111MODULE=off
+[short] skip
+
+[!exec:git] skip
+
+# Set up a benign repository and a repository with a dotfile name.
+cd $WORK/_origin/foo
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git commit --allow-empty -m 'create master branch'
+
+cd $WORK/_origin/.hidden
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git commit --allow-empty -m 'create master branch'
+
+# Clone the empty repositories into GOPATH.
+# This tells the Go command where to find them: it takes the place of a user's meta-tag redirector.
+mkdir $GOPATH/src/example.com
+cd $GOPATH/src/example.com
+exec git clone $WORK/_origin/foo
+exec git clone $WORK/_origin/.hidden
+
+# Add a benign commit.
+cd $WORK/_origin/foo
+cp _ok/main.go main.go
+exec git add main.go
+exec git commit -m 'add ok'
+
+# 'go get' should install the benign commit.
+cd $GOPATH
+go get -u example.com/foo
+
+# Now sneak in an import of a dotfile path.
+cd $WORK/_origin/.hidden
+exec git add hidden.go
+exec git commit -m 'nothing to see here, move along'
+
+cd $WORK/_origin/foo
+cp _sneaky/main.go main.go
+exec git add main.go
+exec git commit -m 'fix typo (heh heh heh)'
+
+# 'go get -u' should refuse to download or update the dotfile-named repo.
+cd $GOPATH/src/example.com/foo
+! go get -u example.com/foo
+stderr 'leading dot'
+! exists example.com/.hidden/hidden.go
+
+-- $WORK/_origin/foo/_ok/main.go --
+package main
+
+func main() {}
+
+-- $WORK/_origin/foo/_sneaky/main.go --
+package main
+import _ "example.com/.hidden"
+
+func main() {}
+
+-- $WORK/_origin/.hidden/hidden.go --
+package hidden
diff --git a/libgo/go/cmd/go/testdata/script/get_insecure_redirect.txt b/libgo/go/cmd/go/testdata/script/get_insecure_redirect.txt
new file mode 100644 (file)
index 0000000..a83b176
--- /dev/null
@@ -0,0 +1,13 @@
+# golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure.
+
+[!net] skip
+[!exec:git] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+! go get -d vcs-test.golang.org/insecure/go/insecure
+stderr 'redirected .* to insecure URL'
+
+go get -d -insecure vcs-test.golang.org/insecure/go/insecure
diff --git a/libgo/go/cmd/go/testdata/script/get_tilde.txt b/libgo/go/cmd/go/testdata/script/get_tilde.txt
new file mode 100644 (file)
index 0000000..e520957
--- /dev/null
@@ -0,0 +1,24 @@
+env GO111MODULE=off
+[short] skip
+
+# Paths containing windows short names should be rejected before attempting to fetch.
+! go get example.com/longna~1.dir/thing
+stderr 'trailing tilde and digits'
+! go get example.com/longna~1/thing
+stderr 'trailing tilde and digits'
+! go get example.com/~9999999/thing
+stderr 'trailing tilde and digits'
+
+# A path containing an element that is just a tilde, or a tilde followed by non-digits,
+# should attempt to resolve.
+! go get example.com/~glenda/notfound
+! stderr 'trailing tilde and digits'
+stderr 'unrecognized import path'
+
+! go get example.com/~glenda2/notfound
+! stderr 'trailing tilde and digits'
+stderr 'unrecognized import path'
+
+! go get example.com/~/notfound
+! stderr 'trailing tilde and digits'
+stderr 'unrecognized import path'
diff --git a/libgo/go/cmd/go/testdata/script/get_unicode.txt b/libgo/go/cmd/go/testdata/script/get_unicode.txt
new file mode 100644 (file)
index 0000000..d3b82bd
--- /dev/null
@@ -0,0 +1,40 @@
+env GO111MODULE=off
+
+[!exec:git] skip
+[short] skip
+
+# Construct a repository that imports a non-ASCII path.
+cd $WORK/_origin/example.com/unicode
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git add unicode.go
+exec git commit -m 'add unicode.go'
+
+# Clone the repo into GOPATH so that 'go get -u' can find it.
+mkdir $GOPATH/src/example.com/unicode
+cd $GOPATH/src/example.com/unicode
+exec git clone $WORK/_origin/example.com/unicode .
+
+# Construct the imported repository.
+cd $WORK/_origin/example.com/испытание
+exec git init
+exec git config user.name 'Nameless Gopher'
+exec git config user.email 'nobody@golang.org'
+exec git add испытание.go
+exec git commit -m 'add испытание.go'
+
+# Clone that repo into GOPATH too.
+mkdir $GOPATH/src/example.com/испытание
+cd $GOPATH/src/example.com/испытание
+exec git clone $WORK/_origin/example.com/испытание .
+
+# Upgrading the importer should pull from the non-ASCII repo.
+cd $GOPATH
+go get -u example.com/unicode
+
+-- $WORK/_origin/example.com/unicode/unicode.go --
+package unicode
+import _ "example.com/испытание"
+-- $WORK/_origin/example.com/испытание/испытание.go --
+package испытание
index 93341a302c86cf8942af1aac30d55d982f5f584f..98854c72ad262b3d360760429415000ee2053520 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 env GIT_TRACE=1
 
 [!net] skip
index 20de325ac286b7b89ad190aff4187c08e250df98..fac6d807202285e365ff343b2b18bfd62105c5d9 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # GOFLAGS sets flags for commands
 
 env GOFLAGS='-e -f={{.Dir}} --test.benchtime=1s -count=10'
diff --git a/libgo/go/cmd/go/testdata/script/gopath_std_vendor.txt b/libgo/go/cmd/go/testdata/script/gopath_std_vendor.txt
new file mode 100644 (file)
index 0000000..a0a41a5
--- /dev/null
@@ -0,0 +1,44 @@
+env GO111MODULE=off
+
+[!gc] skip
+
+go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack
+stdout $GOPATH[/\\]src[/\\]vendor
+
+# A package importing 'net/http' should resolve its dependencies
+# to the package 'vendor/golang.org/x/net/http2/hpack' within GOROOT.
+cd importnethttp
+go list -deps -f '{{.ImportPath}} {{.Dir}}'
+stdout ^vendor/golang.org/x/net/http2/hpack
+stdout $GOROOT[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
+! stdout $GOPATH[/\\]src[/\\]vendor
+
+# In the presence of $GOPATH/src/vendor/golang.org/x/net/http2/hpack,
+# a package in GOPATH importing 'golang.org/x/net/http2/hpack' should
+# resolve its dependencies in GOPATH/src.
+cd ../issue16333
+go build .
+
+go list -deps -f '{{.ImportPath}} {{.Dir}}' .
+stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
+! stdout $GOROOT[/\\]src[/\\]vendor
+
+go list -test -deps -f '{{.ImportPath}} {{.Dir}}' .
+stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
+! stdout $GOROOT[/\\]src[/\\]vendor
+
+-- issue16333/issue16333.go --
+package vendoring17
+
+import _ "golang.org/x/net/http2/hpack"
+-- issue16333/issue16333_test.go --
+package vendoring17
+
+import _ "testing"
+import _ "golang.org/x/net/http2/hpack"
+-- importnethttp/http.go --
+package importnethttp
+
+import _ "net/http"
+-- $GOPATH/src/vendor/golang.org/x/net/http2/hpack/hpack.go --
+package hpack
index 9f455256f72d880d558fd0c4572e6189bc06353d..9752ede2e372830eabca429fdbc1ae67fa16d0d9 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # go help shows overview.
 go help
 stdout 'Go is a tool'
@@ -40,7 +42,7 @@ stderr 'Run ''go tool vet -help'' for the vet tool''s flags'
 # lines.
 ! go test -h
 stderr 'usage: go test'
-stderr 'Run ''go help test'' for details'
+stderr 'Run ''go help test'' and ''go help testflag'' for details.'
 
 # go help get shows usage for get
 go help get
index b8d322de629899ea638dddc9dd25ae25f6f65ad0..dc85eb8ceffaf0d343488291c9768c54226c400f 100644 (file)
@@ -1,21 +1,24 @@
+env GO111MODULE=off
+[short] skip
+
 # 'go install' with no arguments should clean up after go build
 cd mycmd
 go build
-exists mycmd$exe
+exists mycmd$GOEXE
 go install
-! exists mycmd$exe
+! exists mycmd$GOEXE
 
 # 'go install mycmd' does not clean up, even in the mycmd directory
 go build
-exists mycmd$exe
+exists mycmd$GOEXE
 go install mycmd
-exists mycmd$exe
+exists mycmd$GOEXE
 
 # 'go install mycmd' should not clean up in an unrelated current directory either
 cd ..
-cp mycmd/mycmd$exe mycmd$exe
+cp mycmd/mycmd$GOEXE mycmd$GOEXE
 go install mycmd
-exists mycmd$exe
+exists mycmd$GOEXE
 
 -- mycmd/main.go --
 package main
diff --git a/libgo/go/cmd/go/testdata/script/install_cmd_gobin.txt b/libgo/go/cmd/go/testdata/script/install_cmd_gobin.txt
new file mode 100644 (file)
index 0000000..81649e2
--- /dev/null
@@ -0,0 +1,11 @@
+# Check that commands in cmd are install to $GOROOT/bin, not $GOBIN.
+# Verifies golang.org/issue/32674.
+[gccgo] stop
+env GOBIN=gobin
+mkdir gobin
+go list -f '{{.Target}}' cmd/go
+stdout $GOROOT[/\\]bin[/\\]go$GOEXE
+
+# Check that tools are installed to $GOTOOLDIR, not $GOBIN.
+go list -f '{{.Target}}' cmd/compile
+stdout $GOROOT[/\\]pkg[/\\]tool[/\\]${GOOS}_${GOARCH}[/\\]compile$GOEXE
index f85e896f61ef7813aba88bfad1f849a61c0889a6..60aeed689f30dcc9f3d4c155e10d514688873434 100644 (file)
@@ -1,3 +1,6 @@
+env GO111MODULE=off
+[!short] skip # rebuilds std for alternate architecture
+
 cd mycmd
 go build mycmd
 
index d42b07004bf62880887ebece9e951352e4180957..14a6c8611e32d5421276b71c2a2bb975e80eb8db 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # GOPATH with p1 in d1, p2 in d2
 env GOPATH=$WORK/d1${:}$WORK/d2
 
index e7620a08caebee224c2d553610ad0482e3b57d3f..5db3778d8eb8b929997e623e8036e01f82a95500 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # go command should detect package staleness as source file set changes
 go install mypkg
 ! stale mypkg
index e2ec00c6edc3d8aa4aa8cf8e9d84bf5324e138cc..11336594d3596ba8a203bdc1099d90d63bc054b1 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # check for linker name in error message about linker crash
 [!gc] skip
 ! go build -ldflags=-crash_for_testing x.go
index 3d9cac0d5f5495b0bfb8a52856a9e6f840a385c1..b8f9d586f303566ad1c84ca0c680e8deb69c7175 100644 (file)
@@ -1,3 +1,6 @@
+env GO111MODULE=off
+[short] skip
+
 # This test matches mod_list_bad_import, but in GOPATH mode.
 # Please keep them in sync.
 
index 2c883b60610f9e05c82411c1dbd1d4d09b724039..bb4faa366f823c6bb929430930898fea8de23b41 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 [!cgo] skip
 
 # go list should report import "C"
index dbe8fb0ac98cea704f5eb2f3b5f655451aefe4e8..d450fc95549fa999cf6b21fece61ecc97f3a83ee 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # go list -find should not report imports
 
 go list -f {{.Incomplete}} x/y/z...  # should probably exit non-zero but never has
@@ -5,6 +7,16 @@ stdout true
 go list -find -f '{{.Incomplete}} {{.Imports}}' x/y/z...
 stdout '^false \[\]'
 
+# go list -find -compiled should use cached sources the second time it's run.
+# It might not find the same cached sources as "go build", but the sources
+# should be identical. "go build" derives action IDs (which are used as cache
+# keys) from dependencies' action IDs. "go list -find" won't know what the
+# dependencies are, so it's can't construct the same action IDs.
+[short] skip
+go list -find -compiled net
+go list -find -compiled -x net
+! stderr 'cgo'
+
 -- x/y/z/z.go --
 package z
 import "does/not/exist"
diff --git a/libgo/go/cmd/go/testdata/script/list_importmap.txt b/libgo/go/cmd/go/testdata/script/list_importmap.txt
new file mode 100644 (file)
index 0000000..52ee602
--- /dev/null
@@ -0,0 +1,27 @@
+env GO111MODULE=off
+
+# gccgo does not have standard packages.
+[gccgo] skip
+
+# fmt should have no rewritten imports.
+# The import from a/b should map c/d to a's vendor directory.
+go list -f '{{.ImportPath}}: {{.ImportMap}}' fmt a/b
+stdout 'fmt: map\[\]'
+stdout 'a/b: map\[c/d:a/vendor/c/d\]'
+
+# flag [fmt.test] should import fmt [fmt.test] as fmt
+# fmt.test should import testing [fmt.test] as testing
+# fmt.test should not import a modified os
+go list -deps -test -f '{{.ImportPath}} MAP: {{.ImportMap}}{{"\n"}}{{.ImportPath}} IMPORT: {{.Imports}}' fmt
+stdout '^flag \[fmt\.test\] MAP: map\[fmt:fmt \[fmt\.test\]\]'
+stdout '^fmt\.test MAP: map\[(.* )?testing:testing \[fmt\.test\]'
+! stdout '^fmt\.test MAP: map\[(.* )?os:'
+stdout '^fmt\.test IMPORT: \[fmt \[fmt\.test\] fmt_test \[fmt\.test\] os testing \[fmt\.test\] testing/internal/testdeps \[fmt\.test\]\]'
+
+
+-- a/b/b.go --
+package b
+
+import _ "c/d"
+-- a/vendor/c/d/d.go --
+package d
index 046bec6ac54b054e817539e6efa8d137276c937b..6ab1bd1674c99433106d200602c0cb5a897b5722 100644 (file)
@@ -1,12 +1,25 @@
+env GO111MODULE=off
+
 [!gc] skip
+[short] skip
 
-# listing GOROOT should only find standard packages
+# Listing GOROOT should only find standard packages.
 cd $GOROOT/src
 go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' ./...
 ! stdout .
-# TODO: ignore _/blah/go/src in output
 
-# our vendored packages should be reported as standard
-go list std cmd
-stdout internal/x/net/http2/hpack
+# Standard packages should include cmd, but not cmd/vendor.
+go list ./...
+stdout cmd/compile
+! stdout vendor/golang.org
+! stdout cmd/vendor
+
+# In GOPATH mode, packages vendored into GOROOT should be reported as standard.
+go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd
+stdout golang.org/x/net/http2/hpack
 stdout cmd/vendor/golang\.org/x/arch/x86/x86asm
+
+# However, vendored packages should not match wildcard patterns beginning with cmd.
+go list cmd/...
+stdout cmd/compile
+! stdout cmd/vendor
index c5dc99e9fbad3daafb98c2498f19127b58ac0c68..49069bd2135eae367b6f4b5f50b707c92a7c9c0b 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # go list supports -tags
 go list -tags=thetag ./my...
 stdout mypkg
index f1473322c65fbaf93c4956701d032cee648c8c9d..263892ba63f901b559ac5c4088956763243c6397 100644 (file)
@@ -1,5 +1,7 @@
+env GO111MODULE=off
+
 # issue 25980: crash in go list -e -test
-go list -e -test -f '{{.Error}}' p
+go list -e -test -deps -f '{{.Error}}' p
 stdout '^p[/\\]d_test.go:2:8: cannot find package "d" in any of:'
 
 -- p/d.go --
diff --git a/libgo/go/cmd/go/testdata/script/list_test_err.txt b/libgo/go/cmd/go/testdata/script/list_test_err.txt
new file mode 100644 (file)
index 0000000..a174b5e
--- /dev/null
@@ -0,0 +1,126 @@
+env GO111MODULE=off
+
+# issue 28491: errors in test source files should not prevent
+# "go list -test" from returning useful information.
+
+# go list prints information for package, internal test,
+# external test, but not testmain package when there is a
+# syntax error in test sources.
+! go list -test -deps syntaxerr
+stdout pkgdep
+stdout testdep_a
+stdout testdep_b
+stdout ^syntaxerr$
+stdout '^syntaxerr \[syntaxerr.test\]'
+stdout '^syntaxerr_test \[syntaxerr.test\]'
+! stdout '^syntaxerr\.test'
+stderr 'expected declaration'
+
+# go list -e prints information for all test packages.
+# The syntax error is shown in the package error field.
+go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' syntaxerr
+stdout 'pkgdep <nil>'
+stdout 'testdep_a <nil>'
+stdout 'testdep_b <nil>'
+stdout 'syntaxerr\.test "[^"]*expected declaration'
+! stderr 'expected declaration'
+
+[short] stop
+
+# go list prints partial information with test naming error
+! go list -test -deps nameerr
+stdout pkgdep
+stdout testdep_a
+stdout testdep_b
+stderr 'wrong signature for TestBad'
+
+go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' nameerr
+stdout 'pkgdep <nil>'
+stdout 'testdep_a <nil>'
+stdout 'testdep_b <nil>'
+stdout 'nameerr\.test "[^"]*wrong signature for TestBad'
+! stderr 'wrong signature for TestBad'
+
+# go list prints partial information with error if test has cyclic import
+! go list -test -deps cycleerr
+stdout cycleerr
+stderr 'import cycle not allowed in test'
+
+go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' cycleerr
+stdout 'cycleerr <nil>'
+stdout 'testdep_a <nil>'
+stdout 'testdep_cycle <nil>'
+stdout 'cycleerr \[cycleerr.test\] "[^"]*import cycle not allowed in test'
+! stderr 'import cycle not allowed in test'
+
+-- syntaxerr/syntaxerr.go --
+package syntaxerr
+
+import _ "pkgdep"
+
+-- syntaxerr/syntaxerr_ie_test.go --
+package syntaxerr
+
+!!!syntax error
+
+-- syntaxerr/syntaxerr_xe_test.go --
+package syntaxerr_test
+
+!!!syntax error
+
+-- syntaxerr/syntaxerr_i_test.go --
+package syntaxerr
+
+import _ "testdep_a"
+
+-- syntaxerr/syntaxerr_x_test.go --
+package syntaxerr
+
+import _ "testdep_b"
+
+-- nameerr/nameerr.go --
+package nameerr
+
+import _ "pkgdep"
+
+-- nameerr/nameerr_i_test.go --
+package nameerr
+
+import (
+  _ "testdep_a"
+  "testing"
+)
+
+func TestBad(t *testing.B) {}
+
+-- nameerr/nameerr_x_test.go --
+package nameerr_test
+
+import (
+  _ "testdep_b"
+  "testing"
+)
+
+func TestBad(t *testing.B) {}
+
+-- cycleerr/cycleerr_test.go --
+package cycleerr
+
+import (
+  _ "testdep_a"
+  _ "testdep_cycle"
+)
+
+-- pkgdep/pkgdep.go --
+package pkgdep
+
+-- testdep_a/testdep_a.go --
+package testdep_a
+
+-- testdep_b/testdep_b.go --
+package testdep_b
+
+-- testdep_cycle/testdep_cycle.go --
+package testdep_cycle
+
+import _ "cycleerr"
index 51d1ce9a69642e0bcc5e14e65483688cb90b5d3b..b2a6bc45f9ef0f55cc5996144b63b606991e1d97 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # issue 26880: list with tests has wrong variant in imports
 go list -test -f '{{.ImportPath}}:{{with .Imports}} {{join . ", "}}{{end}}' a b
 cmp stdout imports.txt
diff --git a/libgo/go/cmd/go/testdata/script/list_test_non_go_files.txt b/libgo/go/cmd/go/testdata/script/list_test_non_go_files.txt
new file mode 100644 (file)
index 0000000..16b98f4
--- /dev/null
@@ -0,0 +1,13 @@
+env GO111MODULE=off
+
+# issue 29899: handling files with non-Go extension
+go list -e -test -json -- c.c x.go
+stdout '"Err": "named files must be .go files: c.c"'
+
+! go list -test -json -- c.c x.go
+stderr 'can''t load package: named files must be .go files: c.c'
+
+-- x.go --
+package main
+-- c.c --
+package c
diff --git a/libgo/go/cmd/go/testdata/script/mod_alt_goroot.txt b/libgo/go/cmd/go/testdata/script/mod_alt_goroot.txt
new file mode 100644 (file)
index 0000000..32f94c5
--- /dev/null
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+
+# If the working directory is a different GOROOT, then the 'std' module should be
+# treated as an ordinary module (with an ordinary module prefix).
+# It should not override packages in GOROOT, but should not fail the command.
+# See golang.org/issue/30756.
+go list -e -deps -f '{{.ImportPath}} {{.Dir}}' ./bytes
+stdout ^std/bytes.*$PWD[/\\]bytes
+stdout '^bytes/modified'
+
+-- go.mod --
+module std
+
+go 1.12
+-- bytes/bytes.go --
+package bytes
+
+import _"bytes/modified"
+-- bytes/modified/modified.go --
+package modified
diff --git a/libgo/go/cmd/go/testdata/script/mod_auth.txt b/libgo/go/cmd/go/testdata/script/mod_auth.txt
new file mode 100644 (file)
index 0000000..fe1d657
--- /dev/null
@@ -0,0 +1,32 @@
+[!net] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+# Without credentials, downloading a module from a path that requires HTTPS
+# basic auth should fail.
+env NETRC=$WORK/empty
+! go list all
+
+# With credentials from a netrc file, it should succeed.
+env NETRC=$WORK/netrc
+go mod tidy
+go list all
+stdout vcs-test.golang.org/auth/or401
+stdout vcs-test.golang.org/auth/or404
+
+-- go.mod --
+module private.example.com
+-- main.go --
+package useprivate
+
+import (
+       _ "vcs-test.golang.org/auth/or401"
+       _ "vcs-test.golang.org/auth/or404"
+)
+-- $WORK/empty --
+-- $WORK/netrc --
+machine vcs-test.golang.org
+       login aladdin
+       password opensesame
index 1347eaacbf78a98946afe87a0897632fe2c8cf6b..ae1d605e1f2f1227bbdea8c70c55f69941b6074f 100644 (file)
@@ -16,6 +16,9 @@ stdout '\[y\.go\]'
 go list -f {{.GoFiles}} -tags 'tag1 tag2'
 stdout '\[x\.go y\.go\]'
 
+go list -f {{.GoFiles}} -tags tag1,tag2 # commas allowed as of Go 1.13
+stdout '\[x\.go y\.go\]'
+
 -- x/go.mod --
 module x
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_build_versioned.txt b/libgo/go/cmd/go/testdata/script/mod_build_versioned.txt
new file mode 100644 (file)
index 0000000..d1d74de
--- /dev/null
@@ -0,0 +1,17 @@
+env GO111MODULE=on
+[short] skip
+
+go get -d rsc.io/fortune/v2
+
+# The default executable name shouldn't be v2$GOEXE
+go build rsc.io/fortune/v2
+! exists v2$GOEXE
+exists fortune$GOEXE
+
+# The default test binary name shouldn't be v2.test$GOEXE
+go test -c rsc.io/fortune/v2
+! exists v2.test$GOEXE
+exists fortune.test$GOEXE
+
+-- go.mod --
+module scratch
diff --git a/libgo/go/cmd/go/testdata/script/mod_clean_cache.txt b/libgo/go/cmd/go/testdata/script/mod_clean_cache.txt
new file mode 100644 (file)
index 0000000..01fbc38
--- /dev/null
@@ -0,0 +1,58 @@
+env GO111MODULE=on
+
+# 'mod download' should download the module to the cache.
+go mod download rsc.io/quote@v1.5.0
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.zip
+
+# '-n' should print commands but not actually execute them.
+go clean -modcache -n
+stdout '^rm -rf .*pkg.mod$'
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.zip
+
+# 'go clean -modcache' should actually delete the files.
+go clean -modcache
+! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info
+! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod
+! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.zip
+
+# 'go clean -r -modcache' should clean only the dependencies that are within the
+# main module.
+# BUG(golang.org/issue/28680): Today, it cleans across module boundaries.
+cd r
+exists ./test.out
+exists ../replaced/test.out
+go clean -r -modcache
+! exists ./test.out
+! exists ../replaced/test.out  # BUG: should still exist
+
+# 'go clean -modcache' should not download anything before cleaning.
+go mod edit -require rsc.io/quote@v1.99999999.0-not-a-real-version
+go clean -modcache
+! stderr 'finding rsc.io'
+go mod edit -droprequire rsc.io/quote
+
+-- go.mod --
+module m
+-- m.go --
+package m
+
+-- r/go.mod --
+module example.com/r
+require example.com/r/replaced v0.0.0
+replace example.com/r/replaced => ../replaced
+-- r/r.go --
+package r
+import _ "example.com/r/replaced"
+-- r/test.out --
+DELETE ME
+
+-- replaced/go.mod --
+module example.com/r/replaced
+-- replaced/replaced.go --
+package replaced
+-- replaced/test.out --
+DO NOT DELETE
diff --git a/libgo/go/cmd/go/testdata/script/mod_concurrent.txt b/libgo/go/cmd/go/testdata/script/mod_concurrent.txt
new file mode 100644 (file)
index 0000000..e03e5e5
--- /dev/null
@@ -0,0 +1,31 @@
+env GO111MODULE=on
+
+# Concurrent builds should succeed, even if they need to download modules.
+go build ./x &
+go build ./y
+wait
+
+# Concurrent builds should update go.sum to the union of the hashes for the
+# modules they read.
+cmp go.sum go.sum.want
+
+-- go.mod --
+module golang.org/issue/26794
+
+require (
+       golang.org/x/text v0.3.0
+       rsc.io/sampler v1.0.0
+)
+-- x/x.go --
+package x
+
+import _ "golang.org/x/text/language"
+-- y/y.go --
+package y
+
+import _ "rsc.io/sampler"
+-- go.sum.want --
+golang.org/x/text v0.3.0 h1:ivTorhoiROmZ1mcs15mO2czVF0uy0tnezXpBVNzgrmA=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+rsc.io/sampler v1.0.0 h1:SRJnjyQ07sAtq6G4RcfJEmz8JxqLyj3PoGXG2VhbDWo=
+rsc.io/sampler v1.0.0/go.mod h1:cqxpM3ZVz9VtirqxZPmrWzkQ+UkiNiGtkrN+B+i8kx8=
index cc1083bcba2b3706d5a537195f70f70a8a94276a..267c90eb3ce07daad555058fca144dddf6e46726 100644 (file)
@@ -1,9 +1,31 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found Gopkg.lock in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
+# In Plan 9, directories are automatically created in /n.
+# For example, /n/Gopkg.lock always exists, but it's a directory.
+# Test that we ignore directories when trying to find alternate config files.
+cd $WORK/gopkgdir/x
+! go list .
+stderr 'cannot find main module'
+! stderr 'Gopkg.lock'
+! stderr 'go mod init'
+
 -- $WORK/test/Gopkg.lock --
 -- $WORK/test/x/x.go --
 package x // import "m/x"
+-- $WORK/gopkgdir/Gopkg.lock/README.txt --
+../Gopkg.lock is a directory, not a file.
+-- $WORK/gopkgdir/x/x.go --
+package x // import "m/x"
index 5ef534a8f886c7ae2a59b34766b264aebeeff413..ece505a7ba2c1c946428b7d7c9094ce39a181d51 100644 (file)
@@ -1,10 +1,23 @@
 env GO111MODULE=on
 
-# detect root of module tree as root of enclosing git repo
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found .git/config in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
+# We should not suggest creating a go.mod file in $GOROOT, even though there may be a .git/config there.
+cd $GOROOT
+! go list .
+! stderr 'go mod init'
+
 -- $WORK/test/.git/config --
 -- $WORK/test/x/x.go --
 package x // import "m/x"
index 50460bbf365ab306a5d6e5a3f31baf6fcb39eaa4..9f1fff51bf44643db8320aa90cde261a0318ccb6 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found glide.lock in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index 4d9aaffab50c73c45eb1edd4d669a1c16b0d366e..6aa07948883caa446d982ab217a3c802f1b364a1 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found GLOCKFILE in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index 61fbab112409b20de0ab191468057d3b87e5749d..da7b6c1059473735437a55726a7f114e2eaa490a 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found Godeps/Godeps.json in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index 5b82d85d653c7f9dfb5558cbd53f76e8833b16cd..6015ac8754338c2bc61838825efb3046556c5160 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found dependencies.tsv in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index b45d3b69fe2243de77cbb67dea484e142571bc41..57ec4191a451e00ff6ddea2124490f31996efc7e 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found vendor.conf in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index cb6e5fee15fed8f60cb9331db1d29cc5a9484ddd..47d111d4c13b32965eb993d92d43805160aa59ea 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found vendor/vendor.json in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index bcf185136ba8dc723ffe82ecb273f8ca2ed65935..68edb9dc292e8a953e00cae65a05e6ee92939205 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found vendor/manifest in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
index 0cd245bace1f729997f992a7971b5b9d5ffdc812..4ed140a25a2fa4b7ffab170489728d3a888bb2c8 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
 
+# We should not create a go.mod file unless the user ran 'go mod init' explicitly.
+# However, we should suggest 'go mod init' if we can find an alternate config file.
 cd $WORK/test/x
+! go list .
+stderr 'found vendor.yml in .*[/\\]test'
+stderr '\s*cd \.\. && go mod init'
+
+# The command we suggested should succeed.
+cd ..
+go mod init
 go list -m all
 stdout '^m$'
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_dir.txt b/libgo/go/cmd/go/testdata/script/mod_dir.txt
new file mode 100644 (file)
index 0000000..05548f6
--- /dev/null
@@ -0,0 +1,20 @@
+# The directory named go.mod should be ignored
+
+env GO111MODULE=on
+
+cd $WORK/sub
+
+go list .
+stdout 'x/sub'
+
+mkdir go.mod
+exists go.mod
+
+go list .
+stdout 'x/sub'
+
+-- $WORK/go.mod --
+module x
+
+-- $WORK/sub/x.go --
+package x
\ No newline at end of file
index 450d85754ea3f347761fba7fb65118083eb370a3..40acbc5ac083b48b0e60825bc1e0eb4718c7f48e 100644 (file)
@@ -1,8 +1,7 @@
 # go doc should find module documentation
 
-[gccgo] stop 'no go doc'
-
 env GO111MODULE=on
+[short] skip
 
 go doc y
 stdout 'Package y is.*alphabet'
index 22f07c33c7565adf68afc02434b83fa801ecbe3c..c6729c71a299db0af28439283f04bc724b9ceb6a 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+env GOPROXY=$GOPROXY/quiet
 
 # download with version should print nothing
 go mod download rsc.io/quote@v1.5.0
@@ -9,6 +10,7 @@ exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod
 exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.zip
 
 # download of an invalid path should report the error
+[short] skip
 ! go mod download this.domain.is.invalid/somemodule@v1.0.0
 stderr 'this.domain.is.invalid'
 ! go mod download -json this.domain.is.invalid/somemodule@v1.0.0
@@ -81,5 +83,12 @@ exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip
 go mod download -json rsc.io/quote@v1.5.1
 exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.1.zip
 
+# allow go mod download without go.mod
+env GO111MODULE=auto
+rm go.mod
+rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.2.1.zip
+go mod download rsc.io/quote@v1.2.1
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.2.1.zip
+
 -- go.mod --
 module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_download_hash.txt b/libgo/go/cmd/go/testdata/script/mod_download_hash.txt
new file mode 100644 (file)
index 0000000..5a42c4b
--- /dev/null
@@ -0,0 +1,24 @@
+env GO111MODULE=on
+
+# Testing mod download with non semantic versions; turn off proxy.
+[!net] skip
+[!exec:git] skip
+env GOPROXY=direct
+env GOSUMDB=off
+
+go mod download rsc.io/quote@a91498bed0a73d4bb9c1fb2597925f7883bc40a7
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.info
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.mod
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.zip
+
+go mod download rsc.io/quote@master
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.info
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.mod
+exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-0.20180709162918-a91498bed0a7.zip
+
+
+-- go.mod --
+module m
+
+-- m.go --
+package m
index aa714e8b3cd7baeb6cc6a9e7862d05a92dad2ec2..42007b13d09f95f63cb0ced068648be4a80afd56 100644 (file)
@@ -25,6 +25,10 @@ cmpenv go.mod $WORK/go.mod.edit2
 go mod edit -json
 cmpenv stdout $WORK/go.mod.json
 
+# go mod edit -json (empty mod file)
+go mod edit -json $WORK/go.mod.empty
+cmp stdout $WORK/go.mod.empty.json
+
 # go mod edit -replace
 go mod edit -replace=x.1@v1.3.0=y.1/v2@v2.3.5 -replace=x.1@v1.4.0=y.1/v2@v2.3.5
 cmpenv go.mod $WORK/go.mod.edit3
@@ -168,4 +172,14 @@ require x.3   v1.99.0
 -- $WORK/m/go.mod.edit --
 module x.x/y/z
 
-go $goversion
\ No newline at end of file
+go $goversion
+-- $WORK/go.mod.empty --
+-- $WORK/go.mod.empty.json --
+{
+       "Module": {
+               "Path": ""
+       },
+       "Require": null,
+       "Exclude": null,
+       "Replace": null
+}
diff --git a/libgo/go/cmd/go/testdata/script/mod_edit_go.txt b/libgo/go/cmd/go/testdata/script/mod_edit_go.txt
new file mode 100644 (file)
index 0000000..4285102
--- /dev/null
@@ -0,0 +1,18 @@
+# Test support for go mod -edit to set language version.
+
+[gccgo] stop
+
+env GO111MODULE=on
+! go build
+stderr 'type aliases only supported as of'
+go mod edit -go=1.9
+grep 'go 1.9' go.mod
+go build
+
+-- go.mod --
+module m
+go 1.8
+
+-- alias.go --
+package alias
+type T = int
index ab5ee3d6dfa656cb36e7a311d8699fd5d85788a5..10fa103fad391364b7fcc5632b65b6e066077d81 100644 (file)
@@ -1,15 +1,15 @@
-# GO111MODULE=auto should only trigger outside GOPATH/src
+# GO111MODULE=auto should trigger any time a go.mod exists in a parent directory.
 env GO111MODULE=auto
 
 cd $GOPATH/src/x/y/z
 go env GOMOD
-! stdout . # no non-empty lines
-go list -m -f {{.GoMod}}
-stderr 'not using modules'
+stdout $GOPATH[/\\]src[/\\]x[/\\]y[/\\]z[/\\]go.mod
+go list -m -f {{.GoMod}}
+stdout $GOPATH[/\\]src[/\\]x[/\\]y[/\\]z[/\\]go.mod
 
 cd $GOPATH/src/x/y/z/w
 go env GOMOD
-! stdout .
+stdout $GOPATH[/\\]src[/\\]x[/\\]y[/\\]z[/\\]go.mod
 
 cd $GOPATH/src/x/y
 go env GOMOD
@@ -25,6 +25,17 @@ cd $GOPATH/foo/bar/baz
 go env GOMOD
 stdout foo[/\\]go.mod
 
+# GO111MODULE unset should be equivalent to auto.
+env GO111MODULE=
+
+cd $GOPATH/src/x/y/z
+go env GOMOD
+stdout $GOPATH[/\\]src[/\\]x[/\\]y[/\\]z[/\\]go.mod
+
+cd $GOPATH/src/x/y
+go env GOMOD
+! stdout .
+
 # GO111MODULE=on should trigger everywhere
 env GO111MODULE=on
 
index 8de6d7dbb88ba514a08590a2845f39e81c5979b3..38d9fd25fbebeb8c4e0d62a77e2632e4161e46ec 100644 (file)
@@ -1,3 +1,5 @@
+[short] skip
+
 # Allow (cached) downloads for -mod=readonly.
 env GO111MODULE=on
 env GOPATH=$WORK/gopath1
@@ -9,17 +11,26 @@ go list
 grep v1.5.1 $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/list
 
 # Use download cache as file:/// proxy.
-[windows] stop # TODO: file://$WORK puts backslashes in the URL
 env GOPATH=$WORK/gopath2
-env GOPROXY=file:///nonexist
+[windows] env GOPROXY=file:///C:/nonexist
+[!windows] env GOPROXY=file:///nonexist
 ! go list
-env GOPROXY=file://$WORK/gopath1/pkg/mod/cache/download
+[windows] env GOPROXY=file:///$WORK/gopath1/pkg/mod/cache/download
+[!windows] env GOPROXY=file://$WORK/gopath1/pkg/mod/cache/download
 go list
 grep v1.5.1 $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/list
 
 -- $WORK/x/go.mod --
 module x
+go 1.13
 require rsc.io/quote v1.5.1
 -- $WORK/x/x.go --
 package x
 import _ "rsc.io/quote"
+-- $WORK/x/go.sum --
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:pvCbr/wm8HzDD3fVywevekufpn6tCGPY3spdHeZJEsw=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+rsc.io/quote v1.5.1 h1:ZE3OgnVGrhXtFkGw90HwW992ZRqcdli/33DLqEYsoxA=
+rsc.io/quote v1.5.1/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
+rsc.io/sampler v1.3.0 h1:HLGR/BgEtI3r0uymSP/nl2uPLsUnNJX8toRyhfpBTII=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
index f4ac8d01f563bbfce37856212274a68d96f866d0..7fbe9fb7fe6ed1d8a35585650bd822061c3f7200 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=on
+
 # Derive module path from import comment.
 cd $WORK/x
 exists x.go
@@ -10,14 +12,8 @@ addcrlf x.go
 go mod init
 stderr 'module x'
 
-# go mod should die in GOPATH if modules are not enabled for GOPATH
-cd $GOPATH/src/example.com/x/y
-! go mod init
-stderr 'go: modules disabled inside GOPATH/src by GO111MODULE=auto; see ''go help modules'''
-
-env GO111MODULE=on
-
 # Derive module path from location inside GOPATH.
+# 'go mod init' should succeed if modules are not explicitly disabled.
 cd $GOPATH/src/example.com/x/y
 go mod init
 stderr 'module example.com/x/y$'
@@ -43,6 +39,13 @@ go mod init
 stderr 'empty'
 rm go.mod
 
+# In Plan 9, directories are automatically created in /n.
+# For example, /n/go.mod always exist, but it's a directory.
+# Test that we ignore directories when trying to find go.mod.
+cd $WORK/gomoddir
+! go list .
+stderr 'cannot find main module'
+
 [!symlink] stop
 
 # gplink1/src/empty where gopathlink -> GOPATH
@@ -89,3 +92,8 @@ package y
 package z
 -- $GOPATH/src/example.com/x/y/z/Godeps/Godeps.json --
 {"ImportPath": "unexpected.com/z"}
+
+-- $WORK/gomoddir/go.mod/README.txt --
+../go.mod is a directory, not a file.
+-- $WORK/gomoddir/p.go --
+package p
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_cmd.txt b/libgo/go/cmd/go/testdata/script/mod_get_cmd.txt
new file mode 100644 (file)
index 0000000..d31cee1
--- /dev/null
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+[short] skip
+
+# Test that when 'go get' is run from $GOBIN, it does not delete binaries
+# after it installs them. Verifies golang.org/issue/32766.
+
+go get example.com/tools/cmd/hello
+
+# 'go get' should not delete the command when run from $GOPATH/bin
+cd $GOPATH/bin
+exists hello$GOEXE
+go get example.com/tools/cmd/hello
+exists hello$GOEXE
+
+# 'go get' should not delete the command when run from a different $GOBIN
+mkdir $WORK/bin
+cd $WORK/bin
+env GOBIN=$WORK/bin
+go get example.com/tools/cmd/hello
+exists hello$GOEXE
index 589a791fd4d58108370de58bf628d97e8bc04e8a..a906babbd5f67b8b47db53046039363125f87203 100644 (file)
@@ -1,23 +1,19 @@
 env GO111MODULE=on
+env GOPROXY=$GOPROXY/quiet
+[short] skip
 
 # @commit should resolve
 
-# golang.org/x/text/language@commit should not resolve with -m,
-# because that's not a module path.
-! go get -m golang.org/x/text/language@14c0d48
-
-# ... but it should work without -m.
-# because of -d, the compiler should not run
+# golang.org/x/text/language@commit should resolve.
+# Because of -d, the compiler should not run.
 go get -d -x golang.org/x/text/language@14c0d48
 ! stderr 'compile|cp|gccgo .*language\.a$'
 
 # go get should skip build with no Go files in root
-go get golang.org/x/text@14c0d48
-
-# ... and go get should skip build with -m
-go get -m golang.org/x/text@14c0d48
+go get -d golang.org/x/text@14c0d48
 
 # dropping -d, we should see a build.
+[short] skip
 go get -x golang.org/x/text/language@14c0d48
 stderr 'compile|cp|gccgo .*language\.a$'
 
index ac814dae08fcabe4e1e7d008c8d2964da0aa9ac0..ee9ac964751fe6b648fa77c879ce81089ec63a84 100644 (file)
@@ -1,6 +1,8 @@
 env GO111MODULE=on
+[short] skip
 
 # downgrade sampler should downgrade quote
+cp go.mod.orig go.mod
 go get rsc.io/sampler@v1.0.0
 go list -m all
 stdout 'rsc.io/quote v1.4.0'
@@ -30,9 +32,21 @@ stdout 'rsc.io/quote v1.4.0'
 stdout 'rsc.io/sampler v1.0.0'
 ! stdout golang.org/x/text
 
--- go.mod --
+# downgrading away quote should also downgrade away latemigrate/v2,
+# since there are no older versions. v2.0.0 is incompatible.
+cp go.mod.orig go.mod
+go list -m -versions example.com/latemigrate/v2
+stdout v2.0.0 # proxy may serve incompatible versions
+go get rsc.io/quote@none
+go list -m all
+! stdout 'example.com/latemigrate/v2'
+
+-- go.mod.orig --
 module x
-require rsc.io/quote v1.5.1
+require (
+       rsc.io/quote v1.5.1
+       example.com/latemigrate/v2 v2.0.1
+)
 -- go.mod.empty --
 module x
 -- x.go --
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_hash.txt b/libgo/go/cmd/go/testdata/script/mod_get_hash.txt
new file mode 100644 (file)
index 0000000..3bb3ee7
--- /dev/null
@@ -0,0 +1,19 @@
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+[!net] skip
+[!exec:git] skip
+
+# fetch commit hash reachable from refs/heads/* and refs/tags/* is OK
+go list -m golang.org/x/time@8be79e1e0910c292df4e79c241bb7e8f7e725959 # on master branch
+
+# fetch other commit hash, even with a non-standard ref, is not OK
+! go list -m golang.org/x/time@334d83c35137ac2b376c1dc3e4c7733791855a3a # refs/changes/24/41624/3
+stderr 'unknown revision'
+! go list -m golang.org/x/time@v0.0.0-20170424233410-334d83c35137
+stderr 'unknown revision'
+! go list -m golang.org/x/time@334d83c35137
+stderr 'unknown revision'
+
+-- go.mod --
+module m
index 3ae5833834b10081c4b5a30d5a0660fc79c0d435..f25e170a499e97327dc31612bbf5cb6e0f294ac1 100644 (file)
@@ -1,6 +1,15 @@
 env GO111MODULE=on
+[short] skip
 
-# get -u should find quote v1.5.2
+# get -u should not upgrade anything, since the package
+# in the current directory doesn't import anything.
+go get -u
+go list -m all
+stdout 'quote v1.5.1$'
+grep 'rsc.io/quote v1.5.1$' go.mod
+
+# get -u should find quote v1.5.2 once there is a use.
+cp $WORK/tmp/usequote.go x.go
 go get -u
 go list -m all
 stdout 'quote v1.5.2$'
@@ -11,11 +20,10 @@ go list -m -f '{{.Path}} {{.Version}}{{if .Indirect}} // indirect{{end}}' all
 stdout '^golang.org/x/text [v0-9a-f\.-]+ // indirect'
 grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
 
-# importing an empty module root as a package makes it direct.
-# TODO(bcmills): This doesn't seem correct. Fix is in the next change.
+# importing an empty module root as a package does not remove indirect tag.
 cp $WORK/tmp/usetext.go x.go
 go list -e
-grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
+grep 'golang.org/x/text v0.3.0 // indirect$' go.mod
 
 # indirect tag should be removed upon seeing direct import.
 cp $WORK/tmp/uselang.go x.go
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_latest_pseudo.txt b/libgo/go/cmd/go/testdata/script/mod_get_latest_pseudo.txt
new file mode 100644 (file)
index 0000000..825ee8c
--- /dev/null
@@ -0,0 +1,10 @@
+# Check that we can build a module with no tagged versions by querying
+# "@latest" through a proxy.
+# Verifies golang.org/issue/32636
+
+env GO111MODULE=on
+
+go mod init m
+go list example.com/notags
+go list -m all
+stdout '^example.com/notags v0.0.0-20190507143103-cc8cbe209b64$'
index 4edda993f1e538f67974270800a49761e35ac3aa..eb09da58b3e23404626e37993efd9747d0811ff1 100644 (file)
@@ -1,49 +1,50 @@
 # Test 'go get' with a local module with a name that is not valid for network lookup.
+[short] skip
 
 env GO111MODULE=on
 go mod edit -fmt
 cp go.mod go.mod.orig
 
-# 'go get -u -m' within the main module should work, even if it has a local-only name.
+# 'go get -u' within the main module should work, even if it has a local-only name.
 cp go.mod.orig go.mod
-go get -u -m
+go get -d -u ./...
 grep 'rsc.io/quote.*v1.5.2' go.mod
 grep 'golang.org/x/text.*v0.3.0' go.mod
 cp go.mod go.mod.implicitmod
 
-# 'go get -u -m' with the name of the main module should be equivalent to
-# 'go get -u -m' without any further arguments.
+# 'go get -u local/...' should be equivalent to 'go get -u ./...'
+# (assuming no nested modules)
 cp go.mod.orig go.mod
-go get -u -m local
+go get -d -u local/...
 cmp go.mod go.mod.implicitmod
 
-# 'go get -u -d' in the empty root of the main module should update the
-# dependencies of all packages in the module.
+# For the main module, @patch should be a no-op.
 cp go.mod.orig go.mod
-go get -u -d
+go get -d -u local/...@patch
 cmp go.mod go.mod.implicitmod
 
-# 'go get -u -d .' within a package in the main module updates all dependencies
-# of the main module.
-# TODO: Determine whether that behavior is a bug.
-# (https://golang.org/issue/26902)
+# 'go get -u -d' in the empty root of the main module should fail.
+# 'go get -u -d .' should also fail.
+cp go.mod.orig go.mod
+! go get -u -d
+! go get -u -d .
+
+# 'go get -u -d .' within a package in the main module updates the dependencies
+# of that package.
 cp go.mod.orig go.mod
 cd uselang
 go get -u -d .
 cd ..
-grep 'rsc.io/quote.*v1.5.2' go.mod
+grep 'rsc.io/quote.*v1.3.0' go.mod
 grep 'golang.org/x/text.*v0.3.0' go.mod
 cp go.mod go.mod.dotpkg
 
-# 'go get -u -d' with an explicit package in the main module updates
-# all dependencies of the main module.
-# TODO: Determine whether that behavior is a bug.
-# (https://golang.org/issue/26902)
+# 'go get -u -d' with an explicit package in the main module updates the
+# dependencies of that package.
 cp go.mod.orig go.mod
 go get -u -d local/uselang
 cmp go.mod go.mod.dotpkg
 
-
 -- go.mod --
 module local
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_main.txt b/libgo/go/cmd/go/testdata/script/mod_get_main.txt
new file mode 100644 (file)
index 0000000..8e06220
--- /dev/null
@@ -0,0 +1,32 @@
+env GO111MODULE=on
+[short] skip
+
+# @patch and @latest within the main module refer to the current version.
+# The main module won't be upgraded, but missing dependencies will be added.
+cp go.mod.orig go.mod
+go get -d rsc.io/x@latest
+grep 'rsc.io/quote v1.5.2' go.mod
+cp go.mod.orig go.mod
+go get -d rsc.io/x@patch
+grep 'rsc.io/quote v1.5.2' go.mod
+cp go.mod.orig go.mod
+
+# The main module cannot be updated to a specific version.
+! go get rsc.io/x@v0.1.0
+stderr '^go get rsc.io/x@v0.1.0: can.t request explicit version of path in main module$'
+! go get -d rsc.io/x@v0.1.0
+stderr '^go get rsc.io/x@v0.1.0: can.t request explicit version of path in main module$'
+
+# Upgrading a package pattern not contained in the main module should not
+# attempt to upgrade the main module.
+go get -d rsc.io/quote/...@v1.5.1
+grep 'rsc.io/quote v1.5.1' go.mod
+
+-- go.mod.orig --
+module rsc.io
+
+go 1.13
+-- x/x.go --
+package x
+
+import _ "rsc.io/quote"
index be9144915522e0f53c107e0b215c395ca76c5745..edc41cf9488a26f4d53f86c13d79a4e1d4b43fd2 100644 (file)
@@ -1,4 +1,6 @@
 env GO111MODULE=on
+env GOPROXY=$GOPROXY/quiet
+[short] skip
 
 # A 'go get' that worked at a previous version should continue to work at that version,
 # even if the package was subsequently moved into a submodule.
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_newcycle.txt b/libgo/go/cmd/go/testdata/script/mod_get_newcycle.txt
new file mode 100644 (file)
index 0000000..9616863
--- /dev/null
@@ -0,0 +1,14 @@
+env GO111MODULE=on
+
+# Download modules to avoid stderr chatter
+go mod download example.com/newcycle/a@v1.0.0
+go mod download example.com/newcycle/a@v1.0.1
+go mod download example.com/newcycle/b@v1.0.0
+
+go mod init m
+! go get example.com/newcycle/a@v1.0.0
+cmp stderr stderr-expected
+
+-- stderr-expected --
+go get: inconsistent versions:
+       example.com/newcycle/a@v1.0.0 requires example.com/newcycle/a@v1.0.1 (not example.com/newcycle/a@v1.0.0)
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_patterns.txt b/libgo/go/cmd/go/testdata/script/mod_get_patterns.txt
new file mode 100644 (file)
index 0000000..b993197
--- /dev/null
@@ -0,0 +1,36 @@
+env GO111MODULE=on
+[short] skip
+
+# If a pattern doesn't match any packages provided by modules
+# in the build list, we assume the pattern matches a single module
+# whose path is a prefix of the part of the pattern before "...".
+cp go.mod.orig go.mod
+go get -d rsc.io/quote/...
+grep 'require rsc.io/quote' go.mod
+
+cp go.mod.orig go.mod
+! go get -d rsc.io/quote/x...
+stderr 'go get rsc.io/quote/x...: module rsc.io/quote@latest \(v1.5.2\) found, but does not contain packages matching rsc.io/quote/x...'
+! grep 'require rsc.io/quote' go.mod
+
+! go get -d rsc.io/quote/x/...
+stderr 'go get rsc.io/quote/x/...: module rsc.io/quote@latest \(v1.5.2\) found, but does not contain packages matching rsc.io/quote/x/...'
+! grep 'require rsc.io/quote' go.mod
+
+# If a pattern matches no packages within a module, the module should not
+# be upgraded, even if the module path matches the pattern.
+cp go.mod.orig go.mod
+go mod edit -require example.com/nest@v1.0.0
+go get -d example.com/nest/sub/y...
+grep 'example.com/nest/sub v1.0.0' go.mod
+grep 'example.com/nest v1.0.0' go.mod
+
+-- go.mod.orig --
+module m
+
+go 1.13
+
+-- use/use.go --
+package use
+
+import _ "rsc.io/quote"
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_private_vcs.txt b/libgo/go/cmd/go/testdata/script/mod_get_private_vcs.txt
new file mode 100644 (file)
index 0000000..514b0a7
--- /dev/null
@@ -0,0 +1,11 @@
+env GO111MODULE=on
+
+# Testing stderr for git ls-remote; turn off proxy.
+[!net] skip
+[!exec:git] skip
+env GOPROXY=direct
+
+! go get github.com/golang/nonexist
+stderr 'Confirm the import path was entered correctly.'
+stderr 'If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.'
+! stdout .
index 3945fdfa8934cbd512d6e00c217250e5e76f1e13..582837a1665e28aaa0b2fd4e4ea83e92d3ca50b9 100644 (file)
@@ -3,73 +3,75 @@ env GO111MODULE=on
 # Testing git->module converter's generation of +incompatible tags; turn off proxy.
 [!net] skip
 [!exec:git] skip
-env GOPROXY=
+env GOPROXY=direct
+env GOSUMDB=off
 
 # We can resolve the @master branch without unshallowing the local repository
 # (even with older gits), so try that before we do anything else.
 # (This replicates https://golang.org/issue/26713 with git 2.7.4.)
-go get -m github.com/rsc/legacytest@master
+go get -d github.com/rsc/legacytest@master
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.1-0\.\d{14}-7303f7796364\+incompatible$'
 
 # get should include incompatible tags in "latest" calculation.
-go get -m github.com/rsc/legacytest@latest
+go mod edit -droprequire github.com/rsc/legacytest
+go get -d github.com/rsc/legacytest@latest
 go list
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'
 
 # v2.0.1-0.pseudo+incompatible
-go get -m ...test@7303f77
+go get -d ...test@7303f77
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.1-0\.\d{14}-7303f7796364\+incompatible$'
 
 # v2.0.0+incompatible by tag+incompatible
-go get -m ...test@v2.0.0+incompatible
+go get -d ...test@v2.0.0+incompatible
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'
 
 # v2.0.0+incompatible by tag
-go get -m ...test@v2.0.0
+go get -d ...test@v2.0.0
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'
 
 # v2.0.0+incompatible by hash (back on master)
-go get -m ...test@d7ae1e4
+go get -d ...test@d7ae1e4
 go list -m all
 stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'
 
 # v1.2.1-0.pseudo
-go get -m ...test@d2d4c3e
+go get -d ...test@d2d4c3e
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.2\.1-0\.\d{14}-d2d4c3ea6623$'
 
 # v1.2.0
-go get -m ...test@9f6f860
+go get -d ...test@9f6f860
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.2\.0$'
 
 # v1.1.0-pre.0.pseudo
-go get -m ...test@fb3c628
+go get -d ...test@fb3c628
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.1\.0-pre\.0\.\d{14}-fb3c628075e3$'
 
 # v1.1.0-pre (no longer on master)
-go get -m ...test@731e3b1
+go get -d ...test@731e3b1
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.1\.0-pre$'
 
 # v1.0.1-0.pseudo
-go get -m ...test@fa4f5d6
+go get -d ...test@fa4f5d6
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.0\.1-0\.\d{14}-fa4f5d6a71c6$'
 
 # v1.0.0
-go get -m ...test@7fff7f3
+go get -d ...test@7fff7f3
 go list -m all
 stdout '^github.com/rsc/legacytest v1\.0\.0$'
 
 # v0.0.0-pseudo
-go get -m ...test@52853eb
+go get -d ...test@52853eb
 go list -m all
 stdout '^github.com/rsc/legacytest v0\.0\.0-\d{14}-52853eb7b552$'
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt b/libgo/go/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt
new file mode 100644 (file)
index 0000000..0fbd041
--- /dev/null
@@ -0,0 +1,67 @@
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+# Testing that a pseudo-version is based on the semantically-latest
+# tag that appears in any commit that is a (transitive) parent of the commit
+# supplied to 'go get', regardless of branches
+
+[!net] skip
+[!exec:git] skip
+
+# For this test repository:
+#  tag v0.2.1 is most recent tag on master itself
+#  tag v0.2.2 is on branch2, which was then merged to master
+#  master is a merge commit with both tags as parents
+#
+# The pseudo-version hence sorts immediately after v0.2.2 rather
+# than v0.2.1, even though the v0.2.2 tag is not on master.
+
+go get -d vcs-test.golang.org/git/tagtests.git@master
+go list -m all
+stdout '^vcs-test.golang.org/git/tagtests.git v0.2.3-0\.'
+
+-- go.mod --
+module x
+
+go 1.12
+-- x.go --
+package x
+
+import _ "vcs-test.golang.org/git/tagtests.git"
+-- gen_testtags.sh --
+#!/bin/bash
+
+# This is not part of the test.
+# Run this to generate and update the repository on vcs-test.golang.org.
+
+set -euo pipefail
+cd "$(dirname "$0")"
+rm -rf tagtests
+mkdir tagtests
+cd tagtests
+
+git init
+echo module vcs-test.golang.org/git/tagtests.git >go.mod
+echo package tagtests >tagtests.go
+git add go.mod tagtests.go
+git commit -m 'create module tagtests'
+
+git branch b
+
+echo v0.2.1 >v0.2.1
+git add v0.2.1
+git commit -m v0.2.1
+git tag v0.2.1
+
+git checkout b
+echo v0.2.2 >v0.2.2
+git add v0.2.2
+git commit -m v0.2.2
+git tag v0.2.2
+
+git checkout master
+git merge b -m merge
+
+zip -r ../tagtests.zip .
+gsutil cp ../tagtests.zip gs://vcs-test/git/tagtests.zip
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_pseudo_prefix.txt b/libgo/go/cmd/go/testdata/script/mod_get_pseudo_prefix.txt
new file mode 100644 (file)
index 0000000..b78e6e6
--- /dev/null
@@ -0,0 +1,64 @@
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+# Testing that a pseudo-version is based on the semantically-latest
+# prefixed tag in any commit that is a parent of the commit supplied
+# to 'go get', when using a repo with go.mod in a sub directory.
+
+[!net] skip
+[!exec:git] skip
+
+# For this test repository go.mod resides in sub/ (only):
+#  master is not tagged
+#  tag v0.2.0 is most recent tag before master
+#  tag sub/v0.0.10 is most recent tag before v0.2.0
+#
+# The pseudo-version is based on sub/v0.0.10, since v0.2.0 doesn't
+# contain the prefix.
+go get -d vcs-test.golang.org/git/prefixtagtests.git/sub
+go list -m all
+stdout '^vcs-test.golang.org/git/prefixtagtests.git/sub v0.0.10$'
+
+go get -d -u vcs-test.golang.org/git/prefixtagtests.git/sub@master
+go list -m all
+stdout '^vcs-test.golang.org/git/prefixtagtests.git/sub v0.0.11-0\.'
+
+-- go.mod --
+module x
+
+go 1.12
+-- x.go --
+package x
+
+import _ "vcs-test.golang.org/prefixtagtests.git/sub"
+-- gen_prefixtagtests.sh --
+#!/bin/bash
+
+# This is not part of the test.
+# Run this to generate and update the repository on vcs-test.golang.org.
+
+set -euo pipefail
+cd "$(dirname "$0")"
+rm -rf prefixtagtests
+mkdir prefixtagtests
+cd prefixtagtests
+
+git init
+mkdir sub
+echo module vcs-test.golang.org/git/prefixtagtests.git/sub >sub/go.mod
+echo package sub >sub/sub.go
+git add sub
+git commit -m 'create module sub'
+for i in v0.1.0 sub/v0.0.9 sub/v0.0.10 v0.2.0; do
+  echo $i >status
+  git add status
+  git commit -m $i
+  git tag $i
+done
+echo 'after last tag' >status
+git add status
+git commit -m 'after last tag'
+
+zip -r ../prefixtagtests.zip .
+gsutil cp ../prefixtagtests.zip gs://vcs-test/git/prefixtagtests.zip
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_svn.txt b/libgo/go/cmd/go/testdata/script/mod_get_svn.txt
new file mode 100644 (file)
index 0000000..b343628
--- /dev/null
@@ -0,0 +1,20 @@
+[!net] skip
+[!exec:svn] skip
+
+env GO111MODULE=on
+env GOPROXY=direct # obtain llvm.org directory, not via svn.
+
+# Attempting to get a module zip using svn should fail with a reasonable
+# message instead of a panic.
+# TODO(golang.org/issue/26092): Really, it shouldn't fail at all.
+! go get -d llvm.org/llvm/bindings/go/llvm
+stderr 'ReadZip not implemented for svn'
+! go install .
+stderr 'ReadZip not implemented for svn'
+
+-- go.mod --
+module golang/go/issues/28943/main
+-- main.go --
+package main
+import _ "llvm.org/llvm/bindings/go/llvm"
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_tags.txt b/libgo/go/cmd/go/testdata/script/mod_get_tags.txt
new file mode 100644 (file)
index 0000000..603c769
--- /dev/null
@@ -0,0 +1,44 @@
+env GO111MODULE=on
+
+[short] skip
+
+# get should add modules needed to build packages, even if those
+# dependencies are in sources excluded by build tags.
+# All build tags are considered true except "ignore".
+go mod init m
+go get -d .
+go list -m all
+stdout 'example.com/version v1.1.0'
+stdout 'rsc.io/quote v1.5.2'
+
+[short] skip
+
+# Packages that are only imported in excluded files should not be built.
+go get -x .
+stderr 'compile.* -p m '
+! stderr 'compile.* -p example.com/version '
+! stderr 'compile.* -p rsc.io/quote '
+
+-- empty.go --
+package m
+
+-- excluded.go --
+// +build windows,mips
+
+package m
+
+import _ "example.com/version"
+
+-- tools.go --
+// +build tools
+
+package tools
+
+import _ "rsc.io/quote"
+
+-- ignore.go --
+// +build ignore
+
+package ignore
+
+import _ "example.com/doesnotexist"
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_test.txt b/libgo/go/cmd/go/testdata/script/mod_get_test.txt
new file mode 100644 (file)
index 0000000..f921168
--- /dev/null
@@ -0,0 +1,58 @@
+env GO111MODULE=on
+
+# By default, 'go get' should ignore tests
+cp go.mod.empty go.mod
+go get m/a
+! grep rsc.io/quote go.mod
+
+# 'go get -t' should consider test dependencies of the named package.
+cp go.mod.empty go.mod
+go get -d -t m/a
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+# 'go get -t' should not consider test dependencies of imported packages,
+# including packages imported from tests.
+cp go.mod.empty go.mod
+go get -d -t m/b
+! grep rsc.io/quote go.mod
+
+# 'go get -t -u' should update test dependencies of the named package.
+cp go.mod.empty go.mod
+go mod edit -require=rsc.io/quote@v1.5.1
+go get -d -t -u m/a
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+# 'go get -t -u' should not add or update test dependencies
+# of imported packages, including packages imported from tests.
+cp go.mod.empty go.mod
+go get -d -t -u m/b
+! grep rsc.io/quote go.mod
+go mod edit -require=rsc.io/quote@v1.5.1
+go get -d -t -u m/b
+grep 'rsc.io/quote v1.5.1$' go.mod
+
+# 'go get all' should consider test dependencies with or without -t.
+cp go.mod.empty go.mod
+go get all
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+-- go.mod.empty --
+module m
+
+-- a/a.go --
+package a
+
+-- a/a_test.go --
+package a_test
+
+import _ "rsc.io/quote"
+
+-- b/b.go --
+package b
+
+import _ "m/a"
+
+-- b/b_test.go --
+package b_test
+
+import _ "m/a"
index 5eb5ff965777b14cf68f0b0197f5e822a12693ea..6a14dfdc45d6cfda4a397e1b5cfb023c19321751 100644 (file)
@@ -5,31 +5,31 @@ go list -m all
 stdout 'rsc.io/quote v1.5.1'
 grep 'rsc.io/quote v1.5.1$' go.mod
 
-# get -u should update all dependencies
-go get -u
+# get -u should update dependencies of the package in the current directory
+go get -d -u
 grep 'rsc.io/quote v1.5.2$' go.mod
 grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
 
 # get -u rsc.io/sampler should update only sampler's dependencies
 cp go.mod-v1.5.1 go.mod
-go get -u rsc.io/sampler
+go get -d -u rsc.io/sampler
 grep 'rsc.io/quote v1.5.1$' go.mod
 grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
 
 # move to a pseudo-version after any tags
-go get -m rsc.io/quote@dd9747d
+go get -d rsc.io/quote@dd9747d
 grep 'rsc.io/quote v0.0.0-20180628003336-dd9747d19b04' go.mod
 
 # get -u should not jump off newer pseudo-version to earlier tag
-go get -m -u
+go get -d -u
 grep 'rsc.io/quote v0.0.0-20180628003336-dd9747d19b04' go.mod
 
 # move to earlier pseudo-version
-go get -m rsc.io/quote@e7a685a342
+go get -d rsc.io/quote@e7a685a342
 grep 'rsc.io/quote v0.0.0-20180214005133-e7a685a342c0' go.mod
 
 # get -u should jump off earlier pseudo-version to newer tag
-go get -m -u
+go get -d -u
 grep 'rsc.io/quote v1.5.2' go.mod
 
 -- go.mod --
@@ -39,3 +39,8 @@ require rsc.io/quote v1.1.0
 -- go.mod-v1.5.1 --
 module x
 require rsc.io/quote v1.5.1
+
+-- use.go --
+package use
+
+import _ "rsc.io/quote"
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_upgrade_pseudo.txt b/libgo/go/cmd/go/testdata/script/mod_get_upgrade_pseudo.txt
new file mode 100644 (file)
index 0000000..9184d85
--- /dev/null
@@ -0,0 +1,46 @@
+env GO111MODULE=on
+
+# For this test module there are three versions:
+#   * v0.1.1-0.20190429073117-b5426c86b553
+#   * v0.1.0
+#   * v0.0.0-20190430073000-30950c05d534
+# Only v0.1.0 is tagged.
+#
+# The v0.1.1 pseudo-version is semantically higher than the latest tag.
+# The v0.0.0 pseudo-version is chronologically newer.
+
+# 'get -u' should not downgrade to the (lower) tagged version.
+go get -d example.com/pseudoupgrade@b5426c8
+go get -d -u
+go list -m -u all
+stdout '^example.com/pseudoupgrade v0.1.1-0.20190429073117-b5426c86b553$'
+
+# 'get example.com/pseudoupgrade@latest' should not downgrade to
+# the (lower) tagged version.
+go get -d example.com/pseudoupgrade@latest
+go list -m all
+stdout '^example.com/pseudoupgrade v0.1.1-0.20190429073117-b5426c86b553$'
+
+# We should observe the same behavior with the newer pseudo-version.
+go get -d example.com/pseudoupgrade@v0.0.0-20190430073000-30950c05d534
+
+# 'get -u' should not downgrade to the chronologically older tagged version.
+go get -d -u
+go list -m -u all
+stdout '^example.com/pseudoupgrade v0.0.0-20190430073000-30950c05d534$'
+
+# 'get example.com/pseudoupgrade@latest' should not downgrade to the
+# chronologically older tagged version.
+go get -d example.com/pseudoupgrade@latest
+go list -m -u all
+stdout '^example.com/pseudoupgrade v0.0.0-20190430073000-30950c05d534$'
+
+-- go.mod --
+module x
+
+go 1.12
+
+-- main.go --
+package x
+
+import _ "example.com/pseudoupgrade"
diff --git a/libgo/go/cmd/go/testdata/script/mod_get_warning.txt b/libgo/go/cmd/go/testdata/script/mod_get_warning.txt
deleted file mode 100644 (file)
index 36b5434..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# go get in GO111MODULE=auto should warn when not using modules and go.mod exists
-
-env GO111MODULE=auto
-mkdir z
-cd z
-! go get # fails because no code in directory, not the warning
-stderr 'go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src;\n\tignoring ..[/\\]go.mod;\n\tsee ''go help modules'''
-
--- go.mod --
-module x
index 3dd8d1b888d2314fe657d9b203850afdbff960b2..7e1f6aa323e0ec1ac81f7ecde6b2e0185f1e1745 100644 (file)
@@ -1,6 +1,6 @@
 env GO111MODULE=on
 
-go get -m rsc.io/quote@v1.5.1
+go get -d rsc.io/quote@v1.5.1
 go mod vendor
 env GOPATH=$WORK/empty
 env GOPROXY=file:///nonexist
diff --git a/libgo/go/cmd/go/testdata/script/mod_git_export_subst.txt b/libgo/go/cmd/go/testdata/script/mod_git_export_subst.txt
new file mode 100644 (file)
index 0000000..a28b4f2
--- /dev/null
@@ -0,0 +1,21 @@
+env GO111MODULE=on
+env GOPROXY=direct
+
+# Testing that git export-subst is disabled
+[!net] skip
+[!exec:git] skip
+go build
+
+-- x.go --
+package x
+
+import _ "github.com/jasonkeene/export-subst"
+
+-- go.mod --
+module x
+
+require github.com/jasonkeene/export-subst v0.0.0-20180927204031-5845945ec626
+
+-- go.sum --
+github.com/jasonkeene/export-subst v0.0.0-20180927204031-5845945ec626 h1:AUkXi/xFnm7lH2pgtvVkGb7buRn1ywFHw+xDpZ29Rz0=
+github.com/jasonkeene/export-subst v0.0.0-20180927204031-5845945ec626/go.mod h1:DwJXqVtrgrQkv3Giuf2Jh4YyubVe7y41S1eOIaysTJw=
index 932b8b66f92fe54eed912ee0c8a02f35fc1021a0..a4eb5d6596f49f50a5f87dbd949d68bfc05bae84 100644 (file)
@@ -1,46 +1,52 @@
+[short] skip
+
 # go/build's Import should find modules by invoking the go command
 
 go build -o $WORK/testimport.exe ./testimport
 
 # GO111MODULE=off
 env GO111MODULE=off
-! exec $WORK/testimport.exe x/y/z/w .
+! exec $WORK/testimport.exe gobuild.example.com/x/y/z/w .
 
 # GO111MODULE=auto in GOPATH/src
-env GO111MODULE=
-! exec $WORK/testimport.exe x/y/z/w .
 env GO111MODULE=auto
-! exec $WORK/testimport.exe x/y/z/w .
+exec $WORK/testimport.exe gobuild.example.com/x/y/z/w .
 
 # GO111MODULE=auto outside GOPATH/src
 cd $GOPATH/other
-env GO111MODULE=
+env GO111MODULE=auto
 exec $WORK/testimport.exe other/x/y/z/w .
 stdout w2.go
 
-! exec $WORK/testimport.exe x/y/z/w .
-stderr 'cannot find module providing package x/y/z/w'
+! exec $WORK/testimport.exe gobuild.example.com/x/y/z/w .
+stderr 'cannot find module providing package gobuild.example.com/x/y/z/w'
 
 cd z
-env GO111MODULE=auto
 exec $WORK/testimport.exe other/x/y/z/w .
 stdout w2.go
 
 # GO111MODULE=on outside GOPATH/src
+env GO111MODULE=
+exec $WORK/testimport.exe other/x/y/z/w .
+stdout w2.go
 env GO111MODULE=on
 exec $WORK/testimport.exe other/x/y/z/w .
 stdout w2.go
 
 # GO111MODULE=on in GOPATH/src
 cd $GOPATH/src
-exec $WORK/testimport.exe x/y/z/w .
+env GO111MODULE=
+exec $WORK/testimport.exe gobuild.example.com/x/y/z/w .
+stdout w1.go
+env GO111MODULE=on
+exec $WORK/testimport.exe gobuild.example.com/x/y/z/w .
 stdout w1.go
 cd w
-exec $WORK/testimport.exe x/y/z/w ..
+exec $WORK/testimport.exe gobuild.example.com/x/y/z/w ..
 stdout w1.go
 
 -- go.mod --
-module x/y/z
+module gobuild.example.com/x/y/z
 
 -- z.go --
 package z
diff --git a/libgo/go/cmd/go/testdata/script/mod_gonoproxy.txt b/libgo/go/cmd/go/testdata/script/mod_gonoproxy.txt
new file mode 100644 (file)
index 0000000..2bd94cd
--- /dev/null
@@ -0,0 +1,37 @@
+env GO111MODULE=on
+env sumdb=$GOSUMDB
+env proxy=$GOPROXY
+env GOPRIVATE GOPROXY GONOPROXY GOSUMDB GONOSUMDB
+env dbname=localhost.localdev/sumdb
+
+# disagree with sumdb fails
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb' '$proxy/sumdb-wrong
+! go get rsc.io/quote
+stderr 'SECURITY ERROR'
+
+# but GONOSUMDB bypasses sumdb, for rsc.io/quote, rsc.io/sampler, golang.org/x/text
+env GONOSUMDB='*/quote,*/*mple*,golang.org/x'
+go get rsc.io/quote
+rm go.sum
+env GOPRIVATE='*/quote,*/*mple*,golang.org/x'
+env GONOPROXY=none # that is, proxy all despite GOPRIVATE
+go get rsc.io/quote
+
+# and GONOPROXY bypasses proxy
+[!net] skip
+[!exec:git] skip
+env GOPRIVATE=none
+env GONOPROXY='*/fortune'
+! go get rsc.io/fortune # does not exist in real world, only on test proxy
+stderr 'git ls-remote'
+
+env GOSUMDB=
+env GONOPROXY=
+env GOPRIVATE='*/x'
+go get golang.org/x/text
+go list -m all
+! stdout 'text.*v0.0.0-2017' # should not have the version from the proxy
+
+-- go.mod.orig --
+module m
index d945cf35b439ac2d1332d7faab1c599c6a69b3e8..9d288a64d455803550c550b649d31b8e6b88fdb1 100644 (file)
@@ -8,8 +8,10 @@ cp go.mod.empty go.mod
 go list
 
 [!net] skip
+[!exec:git] skip
 
-env GOPROXY=
+env GOPROXY=direct
+env GOSUMDB=off
 go get gopkg.in/macaroon-bakery.v2-unstable/bakery
 go list -m all
 stdout 'gopkg.in/macaroon-bakery.v2-unstable v2.0.0-[0-9]+-[0-9a-f]+$'
diff --git a/libgo/go/cmd/go/testdata/script/mod_help.txt b/libgo/go/cmd/go/testdata/script/mod_help.txt
new file mode 100644 (file)
index 0000000..b5cd30c
--- /dev/null
@@ -0,0 +1,6 @@
+env GO111MODULE=on
+
+# go help get shows usage for get
+go help get
+stdout 'usage: go get'
+stdout 'get using modules to manage source'
\ No newline at end of file
diff --git a/libgo/go/cmd/go/testdata/script/mod_import_v1suffix.txt b/libgo/go/cmd/go/testdata/script/mod_import_v1suffix.txt
new file mode 100644 (file)
index 0000000..a429450
--- /dev/null
@@ -0,0 +1,11 @@
+env GO111MODULE=on
+
+! go get -d example.com/invalidpath/v1
+! go install .
+
+-- go.mod --
+module example.com
+-- main.go --
+package main
+import _ "example.com/invalidpath/v1"
+func main() {}
index 29c840b3833af5af4b42eea539daf6aee0e41ff3..755076eae801b878f5aa092744956a8160ec3e47 100644 (file)
@@ -21,6 +21,11 @@ go list
 go list -m all
 stdout 'rsc.io/sampler v1.0.0'
 
+# test dep replacement
+cd y
+go mod init
+cmpenv go.mod go.mod.replace
+
 -- go.mod1 --
 module x
 
@@ -32,3 +37,21 @@ package x
   name = "rsc.io/sampler"
   version = "v1.0.0"
 
+-- y/Gopkg.lock --
+[[projects]]
+  name = "z"
+  revision = "v1.0.0"
+  source = "rsc.io/quote"
+
+-- y/y.go --
+package y // import "y"
+import _ "z"
+
+-- y/go.mod.replace --
+module y
+
+go $goversion
+
+replace z v1.0.0 => rsc.io/quote v1.0.0
+
+require rsc.io/quote v1.0.0
\ No newline at end of file
diff --git a/libgo/go/cmd/go/testdata/script/mod_init_empty.txt b/libgo/go/cmd/go/testdata/script/mod_init_empty.txt
new file mode 100644 (file)
index 0000000..1c3888c
--- /dev/null
@@ -0,0 +1,18 @@
+env GO111MODULE=on
+
+env GOPATH=$devnull
+
+go list -m
+stdout '^example.com$'
+
+go list
+stdout '^example.com$'
+
+-- go.mod --
+module example.com
+
+go 1.13
+-- main.go --
+package main
+
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_init_glide.txt b/libgo/go/cmd/go/testdata/script/mod_init_glide.txt
new file mode 100644 (file)
index 0000000..a351a6a
--- /dev/null
@@ -0,0 +1,34 @@
+[!net] skip
+[!exec:git] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+
+# Regression test for golang.org/issue/32161:
+# 'go mod init' did not locate tags when resolving a commit to a pseudo-version.
+go mod init x
+cmpenv go.mod go.mod.out
+
+-- main.go --
+package main
+
+import (
+       _ "github.com/rsc/legacytest"
+)
+
+func main() {}
+
+-- glide.lock --
+imports:
+- name: github.com/rsc/legacytest
+  version: fb3c628075e32f7f3c248a3abbdafd69ad6e21e1
+
+-- glide.yaml --
+package: x
+
+-- go.mod.out --
+module x
+
+go $goversion
+
+require github.com/rsc/legacytest v1.1.0-pre.0.20180717164849-fb3c628075e3
diff --git a/libgo/go/cmd/go/testdata/script/mod_init_path.txt b/libgo/go/cmd/go/testdata/script/mod_init_path.txt
new file mode 100644 (file)
index 0000000..637c29f
--- /dev/null
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+
+! go mod init .
+stderr 'malformed import path'
+
+cd x
+go mod init example.com/x
+
+cd ../y
+go mod init m
+
+-- x/main.go --
+package main
+
+func main() {}
+
+-- y/main.go --
+package main
+
+func main() {}
index 5a47c3fa44ae6c78e9840b1bd61c76722af37c3d..5a361a4f42471f7c22fe7145588161a67c4f03c7 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # golang.org/x/internal should be importable from other golang.org/x modules.
 rm go.mod
diff --git a/libgo/go/cmd/go/testdata/script/mod_invalid_version.txt b/libgo/go/cmd/go/testdata/script/mod_invalid_version.txt
new file mode 100644 (file)
index 0000000..2be0d01
--- /dev/null
@@ -0,0 +1,227 @@
+[!net] skip
+[!exec:git] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+# Regression test for golang.org/issue/27173: if the user (or go.mod file)
+# requests a pseudo-version that does not match both the module path and commit
+# metadata, reject it with a helpful error message.
+#
+# TODO(bcmills): Replace the github.com/pierrec/lz4 examples with something
+# equivalent on vcs-test.golang.org.
+
+# An incomplete commit hash is not a valid semantic version,
+# but can appear in the main go.mod file anyway and should be resolved.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0: parsing ../go.mod: '$WORK'/gopath/src/go.mod:5: require golang.org/x/text: version "14c0d48ead0c" invalid: must be of the form v1.2.3'
+cd ..
+go list -m golang.org/x/text
+stdout 'golang.org/x/text v0.1.1-0.20170915032832-14c0d48ead0c'
+grep 'golang.org/x/text v0.1.1-0.20170915032832-14c0d48ead0c' go.mod
+
+# A module path below the repo root that does not contain a go.mod file is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text/unicode@v0.0.0-20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text/unicode@v0.0.0-20170915032832-14c0d48ead0c: invalid version: missing golang.org/x/text/unicode/go.mod at revision 14c0d48ead0c'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text/unicode@v0.0.0-20170915032832-14c0d48ead0c: invalid version: missing golang.org/x/text/unicode/go.mod at revision 14c0d48ead0c'
+
+# However, arguments to 'go get' can name packages above the root.
+cp go.mod.orig go.mod
+go get -d golang.org/x/text/unicode@v0.0.0-20170915032832-14c0d48ead0c
+go list -m golang.org/x/text/...
+stdout 'golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c'
+! stdout 'golang.org/x/text/unicode'
+
+# A major version that does not match the module path is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v2.1.1-0.20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0: parsing ../go.mod: '$WORK'/gopath/src/go.mod:5: require golang.org/x/text: version "v2.1.1-0.20170915032832-14c0d48ead0c" invalid: should be v0 or v1, not v2'
+cd ..
+! go list -m golang.org/x/text
+stderr $WORK'/gopath/src/go.mod:5: require golang.org/x/text: version "v2.1.1-0.20170915032832-14c0d48ead0c" invalid: should be v0 or v1, not v2'
+
+# A pseudo-version with fewer than 12 digits of SHA-1 prefix is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0: invalid pseudo-version: revision is shorter than canonical \(14c0d48ead0c\)'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0: invalid pseudo-version: revision is shorter than canonical \(14c0d48ead0c\)'
+
+# A pseudo-version with more than 12 digits of SHA-1 prefix is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0cd47e3104ada247d91be04afc7a5a
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0cd47e3104ada247d91be04afc7a5a: invalid pseudo-version: revision is longer than canonical \(14c0d48ead0c\)'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0cd47e3104ada247d91be04afc7a5a: invalid pseudo-version: revision is longer than canonical \(14c0d48ead0c\)'
+
+# A pseudo-version that does not match the commit timestamp is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.1.1-0.20190915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.1.1-0.20190915032832-14c0d48ead0c: invalid pseudo-version: does not match version-control timestamp \(2017-09-15T03:28:32Z\)'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.1.1-0.20190915032832-14c0d48ead0c: invalid pseudo-version: does not match version-control timestamp \(2017-09-15T03:28:32Z\)'
+
+# A 'replace' directive in the main module can replace an invalid timestamp
+# with a valid one.
+go mod edit -replace golang.org/x/text@v0.1.1-0.20190915032832-14c0d48ead0c=golang.org/x/text@14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.1.1-0.20190915032832-14c0d48ead0c: invalid pseudo-version: does not match version-control timestamp \(2017-09-15T03:28:32Z\)'
+cd ..
+go list -m golang.org/x/text
+stdout 'golang.org/x/text v0.1.1-0.20190915032832-14c0d48ead0c => golang.org/x/text v0.1.1-0.20170915032832-14c0d48ead0c'
+
+# A pseudo-version that is not derived from a tag is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v1.999.999-0.20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v1.999.999-0.20170915032832-14c0d48ead0c: invalid pseudo-version: preceding tag \(v1.999.998\) not found'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v1.999.999-0.20170915032832-14c0d48ead0c: invalid pseudo-version: preceding tag \(v1.999.998\) not found'
+
+# A v1.0.0- pseudo-version that is not derived from a tag is invalid:
+# v1.0.0- implies no tag, but the correct no-tag prefix for a module path
+# without a major-version suffix is v0.0.0-.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v1.0.0-20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v1.0.0-20170915032832-14c0d48ead0c: invalid pseudo-version: major version without preceding tag must be v0, not v1'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v1.0.0-20170915032832-14c0d48ead0c: invalid pseudo-version: major version without preceding tag must be v0, not v1'
+
+# A pseudo-version vX.Y.Z+1 cannot have Z+1 == 0, since that would
+# imply a base tag with a negative patch field.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.0.0-0.20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.0.0-0.20170915032832-14c0d48ead0c: invalid pseudo-version: version before v0.0.0 would have negative patch number'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.0.0-0.20170915032832-14c0d48ead0c: invalid pseudo-version: version before v0.0.0 would have negative patch number'
+
+# A 'replace' directive in the main module can replace an
+# invalid pseudo-version base with a valid one.
+go mod edit -replace golang.org/x/text@v0.0.0-0.20170915032832-14c0d48ead0c=golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.0.0-0.20170915032832-14c0d48ead0c: invalid pseudo-version: version before v0.0.0 would have negative patch number'
+cd ..
+go list -m golang.org/x/text
+stdout 'golang.org/x/text v0.0.0-0.20170915032832-14c0d48ead0c => golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c'
+
+# A pseudo-version derived from a non-ancestor tag is invalid.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.2.1-0.20170915032832-14c0d48ead0c
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.2.1-0.20170915032832-14c0d48ead0c: invalid pseudo-version: revision 14c0d48ead0c is not a descendent of preceding tag \(v0.2.0\)'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.2.1-0.20170915032832-14c0d48ead0c: invalid pseudo-version: revision 14c0d48ead0c is not a descendent of preceding tag \(v0.2.0\)'
+
+# A +incompatible suffix is not allowed on a version that is actually compatible.
+cp go.mod.orig go.mod
+go mod edit -require golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0c+incompatible
+cd outside
+! go list -m golang.org/x/text
+stderr 'go: example.com@v0.0.0 requires\n\tgolang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0c\+incompatible: invalid version: \+incompatible suffix not allowed: major version v0 is compatible'
+cd ..
+! go list -m golang.org/x/text
+stderr 'golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0c\+incompatible: invalid version: \+incompatible suffix not allowed: major version v0 is compatible'
+
+# The pseudo-version for a commit after a tag with a non-matching major version
+# should instead be based on the last matching tag.
+cp go.mod.orig go.mod
+go mod edit -require github.com/pierrec/lz4@473cd7ce01a1
+go list -m github.com/pierrec/lz4
+stdout 'github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1'
+cd outside
+go list -m github.com/pierrec/lz4
+stdout 'github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1'
+cd ..
+
+# A +incompatible version for a module that has an explicit go.mod file is invalid.
+cp go.mod.orig go.mod
+go mod edit -require github.com/pierrec/lz4@v2.0.9-0.20190131084431-473cd7ce01a1+incompatible
+cd outside
+! go list -m github.com/pierrec/lz4
+stderr 'go: example.com@v0.0.0 requires\n\tgithub.com/pierrec/lz4@v2.0.9-0.20190131084431-473cd7ce01a1\+incompatible: invalid version: \+incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required'
+cd ..
+! go list -m github.com/pierrec/lz4
+stderr 'github.com/pierrec/lz4@v2.0.9-0.20190131084431-473cd7ce01a1\+incompatible: invalid version: \+incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required'
+
+# A +incompatible pseudo-version is valid for a revision of the module
+# that lacks a go.mod file.
+cp go.mod.orig go.mod
+go mod edit -require github.com/pierrec/lz4@v2.0.4-0.20180826165652-dbe9298ce099+incompatible
+cd outside
+go list -m github.com/pierrec/lz4
+stdout 'github.com/pierrec/lz4 v2.0.4-0.20180826165652-dbe9298ce099\+incompatible'
+cd ..
+go list -m github.com/pierrec/lz4
+stdout 'github.com/pierrec/lz4 v2.0.4-0.20180826165652-dbe9298ce099\+incompatible'
+
+# 'go get' for a mismatched major version without a go.mod file should resolve
+# to the equivalent +incompatible version, not a pseudo-version with a different
+# major version.
+cp go.mod.orig go.mod
+go get -d github.com/pierrec/lz4@v2.0.5
+go list -m github.com/pierrec/lz4
+stdout 'github.com/pierrec/lz4 v2.0.5\+incompatible'
+
+# 'go get' for a mismatched major version with a go.mod file should error out,
+# not resolve to a pseudo-version with a different major version.
+cp go.mod.orig go.mod
+! go get -d github.com/pierrec/lz4@v2.0.8
+stderr 'go get github.com/pierrec/lz4@v2.0.8: github.com/pierrec/lz4@v2.0.8: invalid version: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2'
+
+# An invalid +incompatible suffix for a canonical version should error out,
+# not resolve to a pseudo-version.
+#
+# TODO(bcmills): The "outside" view for this failure mode is missing its import stack.
+# Figure out why and fix it.
+cp go.mod.orig go.mod
+go mod edit -require github.com/pierrec/lz4@v2.0.8+incompatible
+cd outside
+! go list -m github.com/pierrec/lz4
+stderr 'github.com/pierrec/lz4@v2.0.8\+incompatible: invalid version: \+incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required'
+cd ..
+! go list -m github.com/pierrec/lz4
+stderr 'github.com/pierrec/lz4@v2.0.8\+incompatible: invalid version: \+incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required'
+
+-- go.mod.orig --
+module example.com
+
+go 1.13
+-- outside/go.mod --
+module example.com/outside
+
+go 1.13
+
+require example.com v0.0.0
+replace example.com v0.0.0 => ./..
index 2fa079f49ae2dfc0f760367bd5454e34cc7c1523..a15f5bca63540cc40cff161431e6df844f3a7cea 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # list {{.Dir}} shows main module and go.mod but not not-yet-downloaded dependency dir.
 go list -m -f '{{.Path}} {{.Main}} {{.GoMod}} {{.Dir}}' all
@@ -26,7 +27,7 @@ stdout 'v1.3.0.*mod[\\/]rsc.io[\\/]sampler@v1.3.1 .*[\\/]v1.3.1.mod => v1.3.1.*s
 
 # list std should work
 go list std
-[!gccgo] stdout ^math/big
+stdout ^math/big
 
 # rsc.io/quote/buggy should be listable as a package
 go list rsc.io/quote/buggy
@@ -41,10 +42,10 @@ stderr '^go list -m nonexist: module "nonexist" is not a known dependency'
 stderr '^go list -m rsc.io/quote/buggy: module "rsc.io/quote/buggy" is not a known dependency'
 
 # Module loader does not interfere with list -e (golang.org/issue/24149).
-[!gccgo] go list -e -f '{{.Error.Err}}' database
-[!gccgo] stdout 'no Go files in '
-[!gccgo] ! go list database
-[!gccgo] stderr 'no Go files in '
+go list -e -f '{{.Error.Err}}' database
+stdout 'no Go files in '
+! go list database
+stderr 'no Go files in '
 
 -- go.mod --
 module x
index 31cd27d75611841c97c8270e1d5a66c58174139a..c4db045631155b106f4cd2573aeaf5c602699c14 100644 (file)
@@ -1,6 +1,6 @@
-# go list with path to directory should work
+[short] skip
 
-[gccgo] stop
+# go list with path to directory should work
 
 env GO111MODULE=off
 go list -f '{{.ImportPath}}' $GOROOT/src/math
diff --git a/libgo/go/cmd/go/testdata/script/mod_list_pseudo.txt b/libgo/go/cmd/go/testdata/script/mod_list_pseudo.txt
new file mode 100644 (file)
index 0000000..3a10b3a
--- /dev/null
@@ -0,0 +1,50 @@
+env GO111MODULE=on
+
+# Regression test for golang.org/issue/32715.
+
+# When using $GOPATH/pkg/mod/cache/download as a proxy,
+# 'latest' queries should prefer tagged versions over pseudo-versions.
+
+go mod download github.com/dmitshur-test/modtest5@v0.0.0-20190619020302-197a620e0c9a
+go mod download github.com/dmitshur-test/modtest5@v0.5.0-alpha
+go mod download github.com/dmitshur-test/modtest5@v0.5.0-alpha.0.20190619023908-3da23a9deb9e
+cmp $GOPATH/pkg/mod/cache/download/github.com/dmitshur-test/modtest5/@v/list $WORK/modtest5.list
+
+env GOPROXY=file:///$GOPATH/pkg/mod/cache/download
+env GOPATH=$WORK/gopath2
+mkdir $GOPATH
+
+go list -m -json github.com/dmitshur-test/modtest5@latest
+cmp stdout $WORK/modtest5.json
+
+# If the module proxy contains only pseudo-versions, 'latest' should stat
+# the version with the most recent timestamp — not the highest semantic
+# version — and return its metadata.
+env GOPROXY=file:///$WORK/tinyproxy
+go list -m -json dmitri.shuralyov.com/test/modtest3@latest
+cmp stdout $WORK/modtest3.json
+
+-- $WORK/modtest5.list --
+v0.0.0-20190619020302-197a620e0c9a
+v0.5.0-alpha
+v0.5.0-alpha.0.20190619023908-3da23a9deb9e
+-- $WORK/modtest5.json --
+{
+       "Path": "github.com/dmitshur-test/modtest5",
+       "Version": "v0.5.0-alpha",
+       "Time": "2019-06-18T19:04:46-07:00"
+}
+-- $WORK/tinyproxy/dmitri.shuralyov.com/test/modtest3/@v/list --
+v0.1.0-0.20161023043300-000000000000
+v0.0.0-20181023043359-a85b471d5412
+-- $WORK/tinyproxy/dmitri.shuralyov.com/test/modtest3/@v/v0.0.0-20181023043359-a85b471d5412.info --
+{
+       "Version": "v0.0.0-20181023043359-a85b471d5412",
+       "Time": "2018-10-22T21:33:59-07:00"
+}
+-- $WORK/modtest3.json --
+{
+       "Path": "dmitri.shuralyov.com/test/modtest3",
+       "Version": "v0.0.0-20181023043359-a85b471d5412",
+       "Time": "2018-10-22T21:33:59-07:00"
+}
diff --git a/libgo/go/cmd/go/testdata/script/mod_list_replace_dir.txt b/libgo/go/cmd/go/testdata/script/mod_list_replace_dir.txt
new file mode 100644 (file)
index 0000000..37de882
--- /dev/null
@@ -0,0 +1,19 @@
+# Test that "go list" succeeds when given a directory in a replacement
+# module within the module cache.
+# Verifies golang.org/issue/29548
+
+env GO111MODULE=on
+go mod download
+
+! go list $GOPATH/pkg/mod/rsc.io/quote@v1.5.2
+stderr 'outside available modules'
+
+go list $GOPATH/pkg/mod/rsc.io/quote@v1.5.1
+stdout 'rsc.io/quote'
+
+-- go.mod --
+module example.com/quoter
+
+require rsc.io/quote v1.5.2
+
+replace rsc.io/quote => rsc.io/quote v1.5.1
diff --git a/libgo/go/cmd/go/testdata/script/mod_list_std.txt b/libgo/go/cmd/go/testdata/script/mod_list_std.txt
new file mode 100644 (file)
index 0000000..8552aeb
--- /dev/null
@@ -0,0 +1,58 @@
+env GO111MODULE=on
+env GOPROXY=off
+
+[!gc] skip
+[short] skip
+
+# Outside of GOROOT, our vendored packages should be reported as part of the standard library.
+go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd
+stdout ^vendor/golang.org/x/net/http2/hpack
+stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm
+
+# cmd/... should match the same packages it used to match in GOPATH mode.
+go list cmd/...
+stdout ^cmd/compile
+! stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm
+
+
+# Within the std module, listing ./... should omit the 'std' prefix:
+# the package paths should be the same via ./... or the 'std' meta-pattern.
+# TODO(golang.org/issue/30241): Make that work.
+# Today, they are listed in 'std' but not './...'.
+cd $GOROOT/src
+go list ./...
+! stdout ^vendor/golang.org/x  # TODO: should be included, or should be omitted from 'std'.
+
+cp stdout $WORK/listdot.txt
+go list std
+stdout ^vendor/golang.org/x  # TODO: remove vendor/ prefix
+# TODO: cmp stdout $WORK/listdot.txt
+
+go list all
+stdout ^vendor/golang.org/x  # TODO: remove vendor/ prefix.
+! stdout ^std/
+
+
+# Within the std module, the vendored dependencies of std should appear
+# to come from the actual modules.
+# TODO(golang.org/issue/30241): Make that work.
+# Today, they still have the vendor/ prefix.
+go list std
+stdout ^vendor/golang.org/x/net/http2/hpack  # TODO
+! stdout ^golang.org/x/net/http2/hpack       # TODO
+
+go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' std
+# ! stdout ^vendor/golang.org/x/net/http2/hpack  # TODO
+! stdout ^golang.org/x/net/http2/hpack         # TODO
+
+
+# Within std, the vendored dependencies of cmd should still appear to be part of cmd.
+go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' cmd
+stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm
+
+go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' cmd
+! stdout .
+
+go list cmd/...
+stdout ^cmd/compile
+! stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm
diff --git a/libgo/go/cmd/go/testdata/script/mod_list_test.txt b/libgo/go/cmd/go/testdata/script/mod_list_test.txt
new file mode 100644 (file)
index 0000000..a99e4f3
--- /dev/null
@@ -0,0 +1,16 @@
+env GO111MODULE=on
+
+# go list -compiled -test must handle test-only packages
+# golang.org/issue/27097.
+go list -compiled -test
+stdout '^m$'
+stdout '^m\.test$'
+stdout '^m \[m\.test\]$'
+
+-- go.mod --
+module m
+
+-- x_test.go --
+package x
+import "testing"
+func Test(t *testing.T) {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_list_upgrade_pseudo.txt b/libgo/go/cmd/go/testdata/script/mod_list_upgrade_pseudo.txt
new file mode 100644 (file)
index 0000000..b983bec
--- /dev/null
@@ -0,0 +1,26 @@
+env GO111MODULE=on
+
+# For this test module there are three versions:
+#   * v0.1.1-0.20190429073117-b5426c86b553
+#   * v0.1.0
+#   * v0.0.0-20190430073000-30950c05d534
+# Only v0.1.0 is tagged.
+#
+# The v0.1.1 pseudo-version is semantically higher than the latest tag.
+# The v0.0.0 pseudo-version is chronologically newer.
+
+# The latest pseudo-version is semantically higher than the latest tag.
+# 'list -u' should not suggest a lower version as an upgrade.
+
+go get -d example.com/pseudoupgrade@b5426c8
+go list -m -u all
+stdout '^example.com/pseudoupgrade v0.1.1-0.20190429073117-b5426c86b553$'
+
+go get -d example.com/pseudoupgrade@v0.0.0-20190430073000-30950c05d534
+go list -m -u all
+stdout '^example.com/pseudoupgrade v0.0.0-20190430073000-30950c05d534$'
+
+-- go.mod --
+module x
+
+go 1.12
diff --git a/libgo/go/cmd/go/testdata/script/mod_load_badchain.txt b/libgo/go/cmd/go/testdata/script/mod_load_badchain.txt
new file mode 100644 (file)
index 0000000..6fdf2c7
--- /dev/null
@@ -0,0 +1,75 @@
+[short] skip
+env GO111MODULE=on
+
+# Download everything to avoid "finding" messages in stderr later.
+cp go.mod.orig go.mod
+go mod download
+go mod download example.com@v1.0.0
+go mod download example.com/badchain/a@v1.1.0
+go mod download example.com/badchain/b@v1.1.0
+go mod download example.com/badchain/c@v1.1.0
+
+# Try to update example.com/badchain/a (and its dependencies).
+! go get -d example.com/badchain/a
+cmp stderr update-a-expected
+cmp go.mod go.mod.orig
+
+# Try to update the main module. This updates everything, including
+# modules that aren't direct requirements, so the error stack is shorter.
+! go get -d -u ./...
+cmp stderr update-main-expected
+cmp go.mod go.mod.orig
+
+# Update manually. Listing modules should produce an error.
+go mod edit -require=example.com/badchain/a@v1.1.0
+! go list -m
+cmp stderr list-expected
+
+# Try listing a package that imports a package
+# in a module without a requirement.
+go mod edit -droprequire example.com/badchain/a
+! go list m/use
+cmp stderr list-missing-expected
+
+! go list -test m/testuse
+cmp stderr list-missing-test-expected
+
+-- go.mod.orig --
+module m
+
+go 1.13
+
+require example.com/badchain/a v1.0.0
+-- use/use.go --
+package use
+
+import _ "example.com/badchain/c"
+-- testuse/testuse.go --
+package testuse
+-- testuse/testuse_test.go --
+package testuse
+
+import (
+       "testing"
+       _ "example.com/badchain/c"
+)
+
+func Test(t *testing.T) {}
+-- update-main-expected --
+go get: example.com/badchain/c@v1.0.0 updating to
+       example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong"
+-- update-a-expected --
+go get: example.com/badchain/a@v1.1.0 requires
+       example.com/badchain/b@v1.1.0 requires
+       example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong"
+-- list-expected --
+go: example.com/badchain/a@v1.1.0 requires
+       example.com/badchain/b@v1.1.0 requires
+       example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong"
+-- list-missing-expected --
+go: m/use imports
+       example.com/badchain/c: example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong"
+-- list-missing-test-expected --
+go: m/testuse tested by
+       m/testuse.test imports
+       example.com/badchain/c: example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong"
diff --git a/libgo/go/cmd/go/testdata/script/mod_load_badzip.txt b/libgo/go/cmd/go/testdata/script/mod_load_badzip.txt
new file mode 100644 (file)
index 0000000..c5ba18e
--- /dev/null
@@ -0,0 +1,15 @@
+# Zip files with unexpected file names inside should be rejected.
+env GO111MODULE=on
+
+! go get -d rsc.io/badzip
+stderr 'zip for rsc.io/badzip@v1.0.0 has unexpected file rsc.io/badzip@v1.0.0.txt'
+! grep rsc.io/badzip go.mod
+
+# TODO(golang.org/issue/31730): 'go build' should print the error below if the
+# requirement is not present.
+go mod edit -require rsc.io/badzip@v1.0.0
+! go build rsc.io/badzip
+stderr 'zip for rsc.io/badzip@v1.0.0 has unexpected file rsc.io/badzip@v1.0.0.txt'
+
+-- go.mod --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_missingpkg_prerelease.txt b/libgo/go/cmd/go/testdata/script/mod_missingpkg_prerelease.txt
new file mode 100644 (file)
index 0000000..6203606
--- /dev/null
@@ -0,0 +1,12 @@
+env GO111MODULE=on
+
+! go list use.go
+stderr 'example.com/missingpkg/deprecated: package provided by example.com/missingpkg at latest version v1.0.0 but not at required version v1.0.1-beta'
+
+-- use.go --
+package use
+
+import (
+       _ "example.com/missingpkg/deprecated"
+       _ "example.com/usemissingpre"
+)
diff --git a/libgo/go/cmd/go/testdata/script/mod_modinfo.txt b/libgo/go/cmd/go/testdata/script/mod_modinfo.txt
new file mode 100644 (file)
index 0000000..1e7dd44
--- /dev/null
@@ -0,0 +1,91 @@
+# Test to ensure runtime/debug.ReadBuildInfo parses
+# the modinfo embedded in a binary by the go tool
+# when module is enabled.
+env GO111MODULE=on
+
+[gccgo] stop
+
+cd x
+go mod edit -require=rsc.io/quote@v1.5.2
+go mod edit -replace=rsc.io/quote@v1.5.2=rsc.io/quote@v1.0.0
+
+# Build a binary and ensure that it can output its own debug info.
+# The debug info should be accessible before main starts (golang.org/issue/29628).
+go build
+exec ./x$GOEXE
+stderr 'mod\s+x\s+\(devel\)'
+stderr 'dep\s+rsc.io/quote\s+v1.5.2\s+'
+stderr '=>\s+rsc.io/quote\s+v1.0.0\s+h1:'
+stderr 'Hello, world.'
+
+[short] skip
+
+# Build a binary that accesses its debug info by reading the binary directly
+# (rather than through debug.ReadBuildInfo).
+# The debug info should still be present (golang.org/issue/28753).
+cd unused
+go build
+exec ./unused$GOEXE
+
+-- x/go.mod --
+module x
+
+-- x/lib/lib.go --
+// Package lib accesses runtime/debug.modinfo before package main's init
+// functions have run.
+package lib
+
+import "runtime/debug"
+
+func init() {
+       m, ok := debug.ReadBuildInfo()
+       if !ok {
+               panic("failed debug.ReadBuildInfo")
+       }
+       println("mod", m.Main.Path, m.Main.Version)
+       for _, d := range m.Deps {
+               println("dep", d.Path, d.Version, d.Sum)
+               if r := d.Replace; r != nil {
+                       println("=>", r.Path, r.Version, r.Sum)
+               }
+       }
+}
+
+-- x/main.go --
+package main
+
+import (
+       "rsc.io/quote"
+       _ "x/lib"
+)
+
+func main() {
+       println(quote.Hello())
+}
+
+-- x/unused/main.go --
+// The unused binary does not access runtime/debug.modinfo.
+package main
+
+import (
+       "bytes"
+       "encoding/hex"
+       "io/ioutil"
+       "log"
+       "os"
+
+       _ "rsc.io/quote"
+)
+
+func main() {
+       b, err := ioutil.ReadFile(os.Args[0])
+       if err != nil {
+               log.Fatal(err)
+       }
+
+       infoStart, _ := hex.DecodeString("3077af0c9274080241e1c107e6d618e6")
+       if !bytes.Contains(b, infoStart) {
+               log.Fatal("infoStart not found in binary")
+       }
+       log.Println("ok")
+}
diff --git a/libgo/go/cmd/go/testdata/script/mod_off.txt b/libgo/go/cmd/go/testdata/script/mod_off.txt
new file mode 100644 (file)
index 0000000..cada6de
--- /dev/null
@@ -0,0 +1,35 @@
+env GO111MODULE=off
+
+# This script tests that running go mod with
+# GO111MODULE=off when outside of GOPATH will fatal
+# with an error message, even with some source code in the directory and a go.mod.
+! go mod init
+stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod graph
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod verify
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod download
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+
+# Same result in an empty directory
+mkdir z
+cd z
+! go mod init
+stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod graph
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod verify
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+! go mod download
+stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules'''
+
+-- sample.go --
+package sample
+
+func main() {}
+
+-- go.mod --
+module sample
+
+go 1.12
diff --git a/libgo/go/cmd/go/testdata/script/mod_off_init.txt b/libgo/go/cmd/go/testdata/script/mod_off_init.txt
new file mode 100644 (file)
index 0000000..1339c8a
--- /dev/null
@@ -0,0 +1,5 @@
+# 'go mod init' should refuse to initialize a module if it will be
+# ignored anyway due to GO111MODULE=off.
+env GO111MODULE=off
+! go mod init
+stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules'''
diff --git a/libgo/go/cmd/go/testdata/script/mod_outside.txt b/libgo/go/cmd/go/testdata/script/mod_outside.txt
new file mode 100644 (file)
index 0000000..4182e71
--- /dev/null
@@ -0,0 +1,250 @@
+env GO111MODULE=on
+[short] skip
+
+# This script tests commands in module mode outside of any module.
+#
+# First, ensure that we really are in module mode, and that we really don't have
+# a go.mod file.
+go env GOMOD
+stdout 'NUL|/dev/null'
+
+
+# 'go list' without arguments implicitly operates on the current directory,
+# which is not in a module.
+! go list
+stderr 'cannot find main module'
+go list -m
+stdout '^command-line-arguments$'
+# 'go list' in the working directory should fail even if there is a a 'package
+# main' present: without a main module, we do not know its package path.
+! go list ./foo
+stderr 'cannot find main module'
+
+# 'go list all' lists the transitive import graph of the main module,
+# which is empty if there is no main module.
+go list all
+! stdout .
+stderr 'warning: "all" matched no packages'
+go list -m all
+stderr 'warning: pattern "all" matched no module dependencies'
+
+# 'go list' on standard-library packages should work, since they do not depend
+# on the contents of any module.
+go list -deps cmd
+stdout '^fmt$'
+stdout '^cmd/go$'
+
+go list $GOROOT/src/fmt
+stdout '^fmt$'
+
+# 'go list' should work with file arguments.
+go list ./foo/foo.go
+stdout 'command-line-arguments'
+
+# 'go list -m' with an explicit version should resolve that version.
+go list -m example.com/version@latest
+stdout 'example.com/version v1.1.0'
+
+# 'go list -m -versions' should succeed even without an explicit version.
+go list -m -versions example.com/version
+stdout 'v1.0.0\s+v1.0.1\s+v1.1.0'
+
+# 'go list -m <mods> all' does not include the dependencies of <mods> in the computation of 'all'.
+go list -m example.com/printversion@v1.0.0 all
+stdout 'example.com/printversion v1.0.0'
+stderr 'warning: pattern "all" matched no module dependencies'
+! stdout 'example.com/version'
+
+
+# 'go clean' should skip the current directory if it isn't in a module.
+go clean -n
+! stdout .
+! stderr .
+
+# 'go mod graph' should not display anything, since there are no active modules.
+go mod graph
+! stdout .
+! stderr .
+
+# 'go mod why' should report that nothing is a dependency.
+go mod why -m example.com/version
+stdout 'does not need'
+
+
+# 'go mod edit', 'go mod tidy', and 'go mod fmt' should fail:
+# there is no go.mod file to edit.
+! go mod tidy
+stderr 'cannot find main module'
+! go mod edit -fmt
+stderr 'cannot find main module'
+! go mod edit -require example.com/version@v1.0.0
+stderr 'cannot find main module'
+
+
+# 'go mod download' should download exactly the requested module without dependencies.
+rm -r $GOPATH/pkg/mod/cache/download/example.com
+go mod download example.com/printversion@v1.0.0
+exists $GOPATH/pkg/mod/cache/download/example.com/printversion/@v/v1.0.0.zip
+! exists $GOPATH/pkg/mod/cache/download/example.com/version/@v/v1.0.0.zip
+
+# 'go mod vendor' should fail: it starts by clearing the existing vendor
+# directory, and we don't know where that is.
+! go mod vendor
+stderr 'cannot find main module'
+
+# 'go mod verify' should succeed: we have no modules to verify.
+go mod verify
+stdout 'all modules verified'
+! stderr .
+
+
+# 'go get' without arguments implicitly operates on the main module, and thus
+# should fail.
+! go get
+stderr 'cannot find main module'
+! go get -u
+stderr 'cannot find main module'
+! go get -u ./foo
+stderr 'cannot find main module'
+
+# 'go get -u all' upgrades the transitive import graph of the main module,
+# which is empty.
+go get -u all
+! stdout .
+stderr 'warning: "all" matched no packages'
+
+# 'go get' should check the proposed module graph for consistency,
+# even though we won't write it anywhere.
+! go get -d example.com/printversion@v1.0.0 example.com/version@none
+stderr 'inconsistent versions'
+
+# 'go get -d' should download and extract the source code needed to build the requested version.
+rm -r $GOPATH/pkg/mod/example.com
+go get -d example.com/printversion@v1.0.0
+exists $GOPATH/pkg/mod/example.com/printversion@v1.0.0
+exists $GOPATH/pkg/mod/example.com/version@v1.0.0
+
+
+# 'go build' without arguments implicitly operates on the current directory, and should fail.
+cd foo
+! go build
+stderr 'cannot find main module'
+cd ..
+
+# 'go build' of a non-module directory should fail too.
+! go build ./foo
+stderr 'cannot find main module'
+
+# However, 'go build' should succeed for standard-library packages.
+go build -n fmt
+
+
+# TODO(golang.org/issue/28992): 'go doc' should document the latest version.
+# For now it does not.
+! go doc example.com/version
+stderr 'no such package'
+
+# 'go install' with a version should fail due to syntax.
+! go install example.com/printversion@v1.0.0
+stderr 'can only use path@version syntax with'
+
+
+# 'go fmt' should be able to format files outside of a module.
+go fmt foo/foo.go
+
+
+# The remainder of the test checks dependencies by linking and running binaries.
+[short] stop
+
+# 'go get' of a binary without a go.mod should install the requested version,
+# resolving outside dependencies to the latest available versions.
+go get example.com/printversion@v0.1.0
+exec ../bin/printversion
+stdout 'path is example.com/printversion'
+stdout 'main is example.com/printversion v0.1.0'
+stdout 'using example.com/version v1.1.0'
+
+# 'go get' of a versioned binary should build and install the latest version
+# using its minimal module requirements, ignoring replacements and exclusions.
+go get example.com/printversion
+exec ../bin/printversion
+stdout 'path is example.com/printversion'
+stdout 'main is example.com/printversion v1.0.0'
+stdout 'using example.com/version v1.0.0'
+
+# 'go get -u=patch' should patch dependencies before installing,
+# again ignoring replacements and exclusions.
+go get -u=patch example.com/printversion@v1.0.0
+exec ../bin/printversion
+stdout 'path is example.com/printversion'
+stdout 'main is example.com/printversion v1.0.0'
+stdout 'using example.com/version v1.0.1'
+
+# 'go install' without a version should install the latest version
+# using its minimal module requirements.
+go install example.com/printversion
+exec ../bin/printversion
+stdout 'path is example.com/printversion'
+stdout 'main is example.com/printversion v1.0.0'
+stdout 'using example.com/version v1.0.0'
+
+# 'go run' should use 'main' as the effective module and import path.
+go run ./foo/foo.go
+stdout 'path is command-line-arguments$'
+stdout 'main is command-line-arguments \(devel\)'
+stdout 'using example.com/version v1.1.0'
+
+# 'go generate' should work with file arguments.
+[exec:touch] go generate ./foo/foo.go
+[exec:touch] exists ./foo/gen.txt
+
+# 'go install' should work with file arguments.
+go install ./foo/foo.go
+
+# 'go test' should work with file arguments.
+go test -v ./foo/foo_test.go
+stdout 'foo was tested'
+
+# 'go vet' should work with file arguments.
+go vet ./foo/foo.go
+
+
+-- README.txt --
+There is no go.mod file in the working directory.
+
+-- foo/foo.go --
+//go:generate touch gen.txt
+
+package main
+
+import (
+       "fmt"
+       "os"
+       "runtime/debug"
+
+       _ "example.com/version"
+)
+
+func main() {
+       info, ok := debug.ReadBuildInfo()
+       if !ok {
+               panic("missing build info")
+       }
+       fmt.Fprintf(os.Stdout, "path is %s\n", info.Path)
+       fmt.Fprintf(os.Stdout, "main is %s %s\n", info.Main.Path, info.Main.Version)
+       for _, m := range info.Deps {
+               fmt.Fprintf(os.Stdout, "using %s %s\n", m.Path, m.Version)
+       }
+}
+
+-- foo/foo_test.go --
+package main
+
+import (
+       "fmt"
+       "testing"
+)
+
+func TestFoo(t *testing.T) {
+       fmt.Println("foo was tested")
+}
index 539b64a246106503d129a43bb4d32470f5c40bba..1b4b4380b44af68ab7034bb427dbb2f7ee734680 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 cd m
 
@@ -7,7 +8,6 @@ cd m
 # library or active modules.
 #
 # 'go list ...' should list packages in all active modules and the standard library.
-# But not cmd/* - see golang.org/issue/26924.
 #
 # 'go list example.com/m/...' should list packages in all modules that begin with 'example.com/m/'.
 #
@@ -23,17 +23,13 @@ stdout 'example.com/m/useunsafe: \[all \.\.\. example.com/m/... ./...\]'
 [!cgo] ! stdout example.com/m/useC
 stdout 'example.com/unused/useerrors: \[\.\.\.\]' # but not "all"
 stdout 'example.com/m/nested/useencoding: \[\.\.\. example.com/m/...\]' # but NOT "all" or "./..."
-[!gccgo] stdout '^unicode: \[all \.\.\.\]'
-[!gccgo] stdout '^unsafe: \[all \.\.\.\]'
-[!gccgo] stdout 'index/suffixarray: \[\.\.\.\]'
-! stdout cmd/pprof # golang.org/issue/26924
+stdout '^unicode: \[all \.\.\.\]'
+stdout '^unsafe: \[all \.\.\.\]'
+stdout 'index/suffixarray: \[\.\.\.\]'
+stdout 'cmd/pprof: \[\.\.\.\]'
 
 stderr -count=1 '^go: warning: "./xyz..." matched no packages$'
 
-env CGO_ENABLED=0
-go list -f '{{.ImportPath}}: {{.Match}}' all ... example.com/m/... ./... ./xyz...
-! stdout example.com/m/useC
-
 # 'go list ./...' should not try to resolve the main module.
 cd ../empty
 go list -deps ./...
@@ -41,6 +37,12 @@ go list -deps ./...
 ! stderr 'finding'
 stderr -count=1 '^go: warning: "./..." matched no packages'
 
+# disabling cgo should drop useC
+[short] skip
+env CGO_ENABLED=0
+go list -f '{{.ImportPath}}: {{.Match}}' all ... example.com/m/... ./... ./xyz...
+! stdout example.com/m/useC
+
 -- m/go.mod --
 module example.com/m
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_patterns_vendor.txt b/libgo/go/cmd/go/testdata/script/mod_patterns_vendor.txt
new file mode 100644 (file)
index 0000000..b4dc401
--- /dev/null
@@ -0,0 +1,28 @@
+env GO111MODULE=on
+
+go list -mod=vendor example.com/...
+stdout ^example.com/x$
+stdout ^example.com/x/y$
+! stdout ^example.com/x/vendor
+
+-- go.mod --
+module example.com/m
+
+-- vendor/modules.txt --
+# example.com/x v0.0.0
+example.com/x
+# example.com/x/y v0.1.0
+example.com/x/y
+
+-- vendor/example.com/x/go.mod --
+module example.com/x
+-- vendor/example.com/x/x.go --
+package x
+
+-- vendor/example.com/x/y/go.mod --
+module example.com/x/y
+-- vendor/example.com/x/y/y.go --
+package y
+
+-- vendor/example.com/x/vendor/z/z.go --
+package z
diff --git a/libgo/go/cmd/go/testdata/script/mod_proxy_https.txt b/libgo/go/cmd/go/testdata/script/mod_proxy_https.txt
new file mode 100644 (file)
index 0000000..a23090c
--- /dev/null
@@ -0,0 +1,19 @@
+env GO111MODULE=on
+
+# GOPROXY file paths must provide the "file://" prefix explicitly.
+env GOPROXY=$WORK/proxydir
+! go list -versions -m golang.org/x/text
+stderr 'invalid proxy URL.*proxydir'
+
+[!net] stop
+
+# GOPROXY HTTPS paths may elide the "https://" prefix.
+# (See golang.org/issue/32191.)
+env GOPROXY=proxy.golang.org
+go list -versions -m golang.org/x/text
+
+-- go.mod --
+module example.com
+go 1.13
+-- $WORK/proxydir/README.md --
+This proxy contains no data.
diff --git a/libgo/go/cmd/go/testdata/script/mod_proxy_list.txt b/libgo/go/cmd/go/testdata/script/mod_proxy_list.txt
new file mode 100644 (file)
index 0000000..a486228
--- /dev/null
@@ -0,0 +1,29 @@
+env GO111MODULE=on
+env proxy=$GOPROXY
+
+# Proxy that can't serve should fail.
+env GOPROXY=$proxy/404
+! go get rsc.io/quote@v1.0.0
+stderr '404 Not Found'
+
+# get should walk down the proxy list past 404 and 410 responses.
+env GOPROXY=$proxy/404,$proxy/410,$proxy
+go get rsc.io/quote@v1.1.0
+
+# get should not walk past other 4xx errors.
+env GOPROXY=$proxy/403,$proxy
+! go get rsc.io/quote@v1.2.0
+stderr 'reading.*/403/rsc.io/.*: 403 Forbidden'
+
+# get should not walk past non-4xx errors.
+env GOPROXY=$proxy/500,$proxy
+! go get rsc.io/quote@v1.3.0
+stderr 'reading.*/500/rsc.io/.*: 500 Internal Server Error'
+
+# get should return the final 404/410 if that's all we have.
+env GOPROXY=$proxy/404,$proxy/410
+! go get rsc.io/quote@v1.4.0
+stderr 'reading.*/410/rsc.io/.*: 410 Gone'
+
+-- go.mod --
+module x
diff --git a/libgo/go/cmd/go/testdata/script/mod_pseudo_cache.txt b/libgo/go/cmd/go/testdata/script/mod_pseudo_cache.txt
new file mode 100644 (file)
index 0000000..dd89614
--- /dev/null
@@ -0,0 +1,29 @@
+[!net] skip
+[!exec:git] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+env GOSUMDB=off
+
+# Regression test for golang.org/issue/27171: after resolving an older
+# pseudo-version of a commit, future resolution of that commit by hash should
+# choose the highest appropriate pseudo-version instead of the cached one.
+
+go mod download -json golang.org/x/text@v0.0.0-20171215141712-a1b916ed6726
+stdout '"Version": "v0.0.0-20171215141712-a1b916ed6726",'
+
+# If GOPROXY is 'off', lookups should use whatever pseudo-version is available.
+env GOPROXY=off
+go mod download -json golang.org/x/text@a1b916ed6726
+stdout '"Version": "v0.0.0-20171215141712-a1b916ed6726",'
+
+# If we can re-resolve the commit to a pseudo-version, fetching the commit by
+# hash should use the highest such pseudo-version appropriate to the commit.
+env GOPROXY=direct
+go mod download -json golang.org/x/text@a1b916ed6726
+stdout '"Version": "v0.3.1-0.20171215141712-a1b916ed6726",'
+
+# If GOPROXY is 'off', lookups should use the highest pseudo-version in the cache.
+env GOPROXY=off
+go mod download -json golang.org/x/text@a1b916ed6726
+stdout '"Version": "v0.3.1-0.20171215141712-a1b916ed6726",'
index 4baaaa89ed980581114dbec6ab2d9a7be2d9be30..c41f83d264c1bfc46510c10d41b3e2d191e5d905 100644 (file)
@@ -3,13 +3,21 @@ env GO111MODULE=on
 go list -m -versions rsc.io/quote
 stdout '^rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1$'
 
-# latest rsc.io/quote should be v1.5.2 not v1.5.3-pre1
+# Latest rsc.io/quote should be v1.5.2, not v1.5.3-pre1.
 go list -m rsc.io/quote@latest
 stdout 'rsc.io/quote v1.5.2$'
 
+# Same for rsc.io/quote@v1 and rsc.io/quote@v1.5 (with no patch version).
+go list -m rsc.io/quote@v1
+stdout 'rsc.io/quote v1.5.2$'
+go list -m rsc.io/quote@v1.5
+stdout 'rsc.io/quote v1.5.2$'
+
+# We should fall back to prereleases if no release tags match...
 go list -m rsc.io/quote@>v1.5.2
 stdout 'rsc.io/quote v1.5.3-pre1$'
 
+# ...but prefer release versions when given the option.
 go list -m rsc.io/quote@<v1.5.4
 stdout 'rsc.io/quote v1.5.2$'
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_query_empty.txt b/libgo/go/cmd/go/testdata/script/mod_query_empty.txt
new file mode 100644 (file)
index 0000000..4e27c1e
--- /dev/null
@@ -0,0 +1,52 @@
+env GO111MODULE=on
+env GOSUMDB=off
+
+go mod download example.com/join@v1.1.0
+
+# If the proxy serves a bogus result for the @latest version,
+# reading that version should cause 'go get' to fail.
+env GOPROXY=file:///$WORK/badproxy
+cp go.mod.orig go.mod
+! go get -d example.com/join/subpkg
+stderr 'go get example.com/join/subpkg: example.com/join/subpkg@v0.0.0-20190624000000-123456abcdef: .*'
+
+# If @v/list is empty, the 'go' command should still try to resolve
+# other module paths.
+env GOPROXY=file:///$WORK/emptysub
+cp go.mod.orig go.mod
+go get -d example.com/join/subpkg
+go list -m example.com/join/...
+! stdout 'example.com/join/subpkg'
+stdout 'example.com/join v1.1.0'
+
+# If @v/list includes a version that the proxy does not actually serve,
+# that version is treated as nonexistent.
+env GOPROXY=file:///$WORK/notfound
+cp go.mod.orig go.mod
+go get -d example.com/join/subpkg
+go list -m example.com/join/...
+! stdout 'example.com/join/subpkg'
+stdout 'example.com/join v1.1.0'
+
+-- go.mod.orig --
+module example.com/othermodule
+go 1.13
+-- $WORK/badproxy/example.com/join/subpkg/@v/list --
+v0.0.0-20190624000000-123456abcdef
+-- $WORK/badproxy/example.com/join/subpkg/@v/v0.0.0-20190624000000-123456abcdef.info --
+This file is not valid JSON.
+-- $WORK/badproxy/example.com/join/@v/list --
+v1.1.0
+-- $WORK/badproxy/example.com/join/@v/v1.1.0.info --
+{"Version": "v1.1.0"}
+-- $WORK/emptysub/example.com/join/subpkg/@v/list --
+-- $WORK/emptysub/example.com/join/@v/list --
+v1.1.0
+-- $WORK/emptysub/example.com/join/@v/v1.1.0.info --
+{"Version": "v1.1.0"}
+-- $WORK/notfound/example.com/join/subpkg/@v/list --
+v1.0.0-does-not-exist
+-- $WORK/notfound/example.com/join/@v/list --
+v1.1.0
+-- $WORK/notfound/example.com/join/@v/v1.1.0.info --
+{"Version": "v1.1.0"}
index a64a8e10866a46989e32b8d371e696afc92f0215..1ae0d17844a8f662cf53ae5225216d70baa4de7b 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+env GOPROXY=$GOPROXY/quiet
 
 # get excluded version
 cp go.mod1 go.mod
index 188a66d0e15fa8826c526744332771a72e846327..ff25f4bfe2f46013ba55771d94960107386a06ea 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # -mod=readonly must not resolve missing modules nor update go.mod
 #
index 78d6729fce322adb56306d30af1b6dd343caf430..35824b3a8a212f37c8b50a69e38153bd193ba49b 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 cp go.mod go.mod.orig
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_replace_import.txt b/libgo/go/cmd/go/testdata/script/mod_replace_import.txt
new file mode 100644 (file)
index 0000000..0da753a
--- /dev/null
@@ -0,0 +1,109 @@
+env GO111MODULE=on
+
+# 'go list -mod=readonly' should not add requirements even if they can be
+# resolved locally.
+cp go.mod go.mod.orig
+! go list -mod=readonly all
+cmp go.mod go.mod.orig
+
+# 'go list' should resolve imports using replacements.
+go list all
+stdout 'example.com/a/b$'
+stdout 'example.com/x/v3$'
+stdout 'example.com/y/z/w$'
+stdout 'example.com/v'
+
+# The selected modules should prefer longer paths,
+# but should try shorter paths if needed.
+# Modules with a major-version suffix should have a corresponding pseudo-version.
+# Replacements that specify a version should use the latest such version.
+go list -m all
+stdout 'example.com/a/b v0.0.0-00010101000000-000000000000 => ./b'
+stdout 'example.com/y v0.0.0-00010101000000-000000000000 => ./y'
+stdout 'example.com/x/v3 v3.0.0-00010101000000-000000000000 => ./v3'
+stdout 'example.com/v v1.12.0 => ./v12'
+
+-- go.mod --
+module example.com/m
+
+replace (
+       example.com/a => ./a
+       example.com/a/b => ./b
+)
+
+replace (
+       example.com/x => ./x
+       example.com/x/v3 => ./v3
+)
+
+replace (
+       example.com/y/z/w => ./w
+       example.com/y => ./y
+)
+
+replace (
+       example.com/v v1.11.0 => ./v11
+       example.com/v v1.12.0 => ./v12
+       example.com/v => ./v
+)
+
+-- m.go --
+package main
+import (
+       _ "example.com/a/b"
+       _ "example.com/x/v3"
+       _ "example.com/y/z/w"
+       _ "example.com/v"
+)
+func main() {}
+
+-- a/go.mod --
+module a.localhost
+-- a/a.go --
+package a
+-- a/b/b.go--
+package b
+
+-- b/go.mod --
+module a.localhost/b
+-- b/b.go --
+package b
+
+-- x/go.mod --
+module x.localhost
+-- x/x.go --
+package x
+-- x/v3.go --
+package v3
+import _ "x.localhost/v3"
+
+-- v3/go.mod --
+module x.localhost/v3
+-- v3/x.go --
+package x
+
+-- w/go.mod --
+module w.localhost
+-- w/skip/skip.go --
+// Package skip is nested below nonexistent package w.
+package skip
+
+-- y/go.mod --
+module y.localhost
+-- y/z/w/w.go --
+package w
+
+-- v12/go.mod --
+module v.localhost
+-- v12/v.go --
+package v
+
+-- v11/go.mod --
+module v.localhost
+-- v11/v.go --
+package v
+
+-- v/go.mod --
+module v.localhost
+-- v/v.go --
+package v
diff --git a/libgo/go/cmd/go/testdata/script/mod_run_internal.txt b/libgo/go/cmd/go/testdata/script/mod_run_internal.txt
new file mode 100644 (file)
index 0000000..653ad28
--- /dev/null
@@ -0,0 +1,46 @@
+env GO111MODULE=on
+
+go list -e -f '{{.Incomplete}}' runbad1.go
+stdout true
+! go run runbad1.go
+stderr 'use of internal package m/x/internal not allowed'
+
+go list -e -f '{{.Incomplete}}' runbad2.go
+stdout true
+! go run runbad2.go
+stderr 'use of internal package m/x/internal/y not allowed'
+
+go list -e -f '{{.Incomplete}}' runok.go
+stdout false
+go run runok.go
+
+-- go.mod --
+module m
+
+-- x/internal/internal.go --
+package internal
+
+-- x/internal/y/y.go --
+package y
+
+-- internal/internal.go --
+package internal
+
+-- internal/z/z.go --
+package z
+
+-- runbad1.go --
+package main
+import _ "m/x/internal"
+func main() {}
+
+-- runbad2.go --
+package main
+import _ "m/x/internal/y"
+func main() {}
+
+-- runok.go --
+package main
+import _ "m/internal"
+import _ "m/internal/z"
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_run_path.txt b/libgo/go/cmd/go/testdata/script/mod_run_path.txt
new file mode 100644 (file)
index 0000000..4369ee4
--- /dev/null
@@ -0,0 +1,15 @@
+# Test that go run does not get confused by conflict
+# between go.mod's module path and what you'd
+# expect from GOPATH. golang.org/issue/26046.
+
+env GO111MODULE=on
+
+cd $GOPATH/src/example.com/hello
+go run main.go
+
+-- $GOPATH/src/example.com/hello/go.mod --
+module example.com/hello/v2
+
+-- $GOPATH/src/example.com/hello/main.go --
+package main
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_std_vendor.txt b/libgo/go/cmd/go/testdata/script/mod_std_vendor.txt
new file mode 100644 (file)
index 0000000..5986cff
--- /dev/null
@@ -0,0 +1,80 @@
+env GO111MODULE=on
+env GOPROXY=off
+
+[!gc] skip
+
+# 'go list' should report imports from _test.go in the TestImports field.
+go list -f '{{.TestImports}}'
+stdout net/http # from .TestImports
+
+# 'go list' should find standard-vendored packages.
+go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack
+stdout $GOROOT[/\\]src[/\\]vendor
+
+# 'go list -test' should report vendored transitive dependencies of _test.go
+# imports in the Deps field.
+go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}'
+stdout ^vendor/golang.org/x/crypto # dep of .TestImports
+
+
+# Modules outside the standard library should not use the packages vendored there...
+cd broken
+! go build -mod=readonly
+stderr 'disabled by -mod=readonly'
+! go build -mod=vendor
+stderr 'cannot find package'
+stderr 'hpack'
+
+# ...even if they explicitly use the "cmd/vendor/" or "vendor/" prefix.
+cd ../importcmd
+! go build .
+stderr 'use of vendored package'
+
+cd ../importstd
+! go build .
+stderr 'use of vendored package'
+
+
+# When run within the 'std' module, 'go list -test' should report vendored
+# transitive dependencies at their original module paths.
+# TODO(golang.org/issue/30241): Make that work.
+# Today, they're standard packages as long as they exist.
+cd $GOROOT/src
+go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' net/http
+stdout ^vendor/golang.org/x/net/http2/hpack  # TODO: remove vendor/ prefix
+! stdout ^golang.org/x/net/http2/hpack
+
+-- go.mod --
+module m
+
+-- x.go --
+package x
+
+-- x_test.go --
+package x
+import "testing"
+import _ "net/http"
+func Test(t *testing.T) {}
+
+-- broken/go.mod --
+module broken
+-- broken/http.go --
+package broken
+
+import (
+       _ "net/http"
+       _ "golang.org/x/net/http2/hpack"
+)
+
+-- importcmd/go.mod --
+module importcmd
+-- importcmd/x.go --
+package importcmd
+
+import _ "cmd/vendor/golang.org/x/tools/go/analysis"
+-- importstd/go.mod --
+module importvendor
+-- importstd/x.go --
+package importstd
+
+import _ "vendor/golang.org/x/net/http2/hpack"
diff --git a/libgo/go/cmd/go/testdata/script/mod_string_alias.txt b/libgo/go/cmd/go/testdata/script/mod_string_alias.txt
new file mode 100644 (file)
index 0000000..5c3d428
--- /dev/null
@@ -0,0 +1,14 @@
+[short] skip
+
+env GO111MODULE=on
+
+go mod init golang.org/issue/27584
+
+go build .
+
+-- main.go --
+package main
+
+type string = []int
+
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_sum_replaced.txt b/libgo/go/cmd/go/testdata/script/mod_sum_replaced.txt
new file mode 100644 (file)
index 0000000..b03982d
--- /dev/null
@@ -0,0 +1,28 @@
+env GO111MODULE=on
+
+# After 'go get -d', the go.sum file should contain the sum for the module.
+go get -d rsc.io/quote@v1.5.0
+grep 'rsc.io/quote v1.5.0' go.sum
+
+# If we replace the module and run 'go mod tidy', we should get a sum for the replacement.
+go mod edit -replace rsc.io/quote@v1.5.0=rsc.io/quote@v1.5.1
+go mod tidy
+grep 'rsc.io/quote v1.5.1' go.sum
+cp go.sum go.sum.tidy
+
+# 'go mod vendor' should preserve that sum, and should not need to add any new entries.
+go mod vendor
+grep 'rsc.io/quote v1.5.1' go.sum
+cmp go.sum go.sum.tidy
+
+-- go.mod --
+module golang.org/issue/27868
+
+require rsc.io/quote v1.5.0
+
+-- main.go --
+package main
+
+import _ "rsc.io/quote"
+
+func main() {}
diff --git a/libgo/go/cmd/go/testdata/script/mod_sumdb.txt b/libgo/go/cmd/go/testdata/script/mod_sumdb.txt
new file mode 100644 (file)
index 0000000..8e1f3d7
--- /dev/null
@@ -0,0 +1,33 @@
+env GO111MODULE=on
+env sumdb=$GOSUMDB
+env proxy=$GOPROXY
+env GOPROXY GONOPROXY GOSUMDB GONOSUMDB
+env dbname=localhost.localdev/sumdb
+
+# disagreeing with the sumdb produces security errors
+# (this also populates tiles on the sumdb server).
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb' '$proxy/sumdb-wrong
+! go get -d rsc.io/quote
+stderr 'verifying rsc.io/quote@v1.5.2/go.mod: checksum mismatch'
+stderr 'downloaded: h1:LzX7'
+stderr 'localhost.localdev/sumdb: h1:wrong'
+stderr 'SECURITY ERROR\nThis download does NOT match the one reported by the checksum server.'
+! go get -d rsc.io/sampler
+! go get -d golang.org/x/text
+rm go.sum
+
+# switching to truthful sumdb detects timeline inconsistency
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb
+! go get -d rsc.io/fortune
+stderr 'SECURITY ERROR\ngo.sum database server misbehavior detected!'
+stderr 'proof of misbehavior:'
+
+# removing the cached wrong tree head and cached tiles clears the bad data
+rm $GOPATH/pkg/sumdb/$dbname/latest
+go clean -modcache
+go get -d rsc.io/fortune
+
+-- go.mod.orig --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_sumdb_cache.txt b/libgo/go/cmd/go/testdata/script/mod_sumdb_cache.txt
new file mode 100644 (file)
index 0000000..a44a874
--- /dev/null
@@ -0,0 +1,47 @@
+env GO111MODULE=on
+env sumdb=$GOSUMDB
+env proxy=$GOPROXY
+env GOPROXY GONOPROXY GOSUMDB GONOSUMDB
+
+# rejected proxy fails verification
+cp go.mod.orig go.mod
+rm go.sum
+env GOPROXY=$proxy/sumdb-503
+! go get -d rsc.io/quote
+stderr 503
+
+# fetch through working proxy is OK
+cp go.mod.orig go.mod
+rm go.sum
+env GOPROXY=$proxy
+go get -d rsc.io/quote
+
+# repeated fetch works entirely from cache, does not consult sumdb
+cp go.mod.orig go.mod
+rm go.sum
+env GOPROXY=$proxy/sumdb-503
+go get -d rsc.io/quote
+rm go.sum
+
+# fetch specific module can work without proxy, using cache or go.sum
+cp go.mod.orig go.mod
+rm go.sum
+env GOPROXY=off
+go get -d rsc.io/quote@v1.5.2 # using cache
+rm $GOPATH/pkg/mod/download/cache/sumdb/localhost.localdev/sumdb/lookup/rsc.io/quote@v1.5.2
+go get -d rsc.io/quote@v1.5.2 # using go.sum
+
+# fetch fails once we lose access to both cache and go.sum
+rm go.sum
+env GOPROXY=$proxy/sumdb-504
+! go get -d rsc.io/quote@v1.5.2
+stderr 504
+
+# but -insecure bypasses the checksum lookup entirely
+go get -d -insecure rsc.io/quote@v1.5.2
+
+# and then it is in go.sum again
+go get -d rsc.io/quote@v1.5.2
+
+-- go.mod.orig --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_sumdb_file_path.txt b/libgo/go/cmd/go/testdata/script/mod_sumdb_file_path.txt
new file mode 100644 (file)
index 0000000..744632e
--- /dev/null
@@ -0,0 +1,41 @@
+[!net] skip
+
+env GO111MODULE=on
+env GOSUMDB=
+
+# With a file-based proxy with an empty checksum directory,
+# downloading a new module should fail, even if a subsequent
+# proxy contains a more complete mirror of the sum database.
+[windows] env GOPROXY=file:///$WORK/sumproxy,https://proxy.golang.org
+[!windows] env GOPROXY=file://$WORK/sumproxy,https://proxy.golang.org
+! go get -d golang.org/x/text@v0.3.2
+stderr '^verifying golang.org/x/text.*: Not Found'
+
+# If the proxy does not claim to support the database,
+# checksum verification should fall through to the next proxy,
+# and downloading should succeed.
+[windows] env GOPROXY=file:///$WORK/emptyproxy,https://proxy.golang.org
+[!windows] env GOPROXY=file://$WORK/emptyproxy,https://proxy.golang.org
+go get -d golang.org/x/text@v0.3.2
+
+# Once the checksum is present in the go.sum file,
+# an empty file-based sumdb can be used in conjunction with
+# a fallback module mirror.
+grep golang.org/x/text go.sum
+go clean -modcache
+[windows] env GOPROXY=file:///$WORK/sumproxy
+[!windows] env GOPROXY=file://$WORK/sumproxy
+! go get -d golang.org/x/text@v0.3.2
+[windows] env GOPROXY=file:///$WORK/sumproxy,https://proxy.golang.org
+[!windows] env GOPROXY=file://$WORK/sumproxy,https://proxy.golang.org
+go get -d golang.org/x/text@v0.3.2
+
+-- go.mod --
+module example.com
+go 1.13
+-- $WORK/emptyproxy/README.md --
+This proxy contains no modules.
+-- $WORK/sumproxy/README.md --
+This proxy contains no modules.
+-- $WORK/sumproxy/sumdb/sum.golang.org/supported --
+This proxy blocks checksum downloads from sum.golang.org.
diff --git a/libgo/go/cmd/go/testdata/script/mod_sumdb_golang.txt b/libgo/go/cmd/go/testdata/script/mod_sumdb_golang.txt
new file mode 100644 (file)
index 0000000..964501f
--- /dev/null
@@ -0,0 +1,44 @@
+# Test default GOPROXY and GOSUMDB
+env GOPROXY=
+env GOSUMDB=
+go env GOPROXY
+stdout '^https://proxy.golang.org,direct$'
+go env GOSUMDB
+stdout '^sum.golang.org$'
+env GOPROXY=https://proxy.golang.org
+go env GOSUMDB
+stdout '^sum.golang.org$'
+
+# download direct from github
+[!net] skip
+[!exec:git] skip
+env GOSUMDB=sum.golang.org
+env GOPROXY=direct
+go get -d rsc.io/quote
+
+# download from proxy.golang.org with go.sum entry already
+go clean -modcache
+env GOSUMDB=
+env GOPROXY=
+go get -x -d rsc.io/quote
+! stderr github
+stderr proxy.golang.org/rsc.io/quote
+! stderr sum.golang.org/tile
+! stderr sum.golang.org/lookup/rsc.io/quote
+
+# download again, using checksum database to validate new go.sum lines
+rm go.sum
+go get -x -d rsc.io/quote
+! stderr github
+stderr proxy.golang.org/rsc.io/quote
+stderr sum.golang.org/tile
+stderr sum.golang.org/lookup/rsc.io/quote
+
+# test fallback to direct
+env TESTGOPROXY404=1
+go get -x -d rsc.io/quote
+stderr 'proxy.golang.org.*404 testing'
+stderr github.com/rsc
+
+-- go.mod --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_sumdb_proxy.txt b/libgo/go/cmd/go/testdata/script/mod_sumdb_proxy.txt
new file mode 100644 (file)
index 0000000..6fbf7ae
--- /dev/null
@@ -0,0 +1,50 @@
+env GO111MODULE=on
+env sumdb=$GOSUMDB
+env proxy=$GOPROXY
+env GOPROXY GONOPROXY GOSUMDB GONOSUMDB
+
+# basic fetch (through proxy) works
+cp go.mod.orig go.mod
+go get -d rsc.io/fortune@v1.0.0 # note: must use test proxy, does not exist in real world
+rm $GOPATH/pkg/mod/download/cache/sumdb # rm sumdb cache but NOT package download cache
+rm go.sum
+
+# can fetch by explicit URL
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb' '$proxy/sumdb-direct
+go get -d rsc.io/fortune@v1.0.0
+rm $GOPATH/pkg/mod/download/cache/sumdb
+rm go.sum
+
+# direct access fails (because localhost.localdev does not exist)
+# The text of the error message is hard to predict because some DNS servers
+# will resolve unknown domains like localhost.localdev to a real IP
+# to serve ads.
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb
+env GOPROXY=direct
+! go get -d rsc.io/fortune@v1.0.0
+stderr 'verifying.*localhost.localdev'
+rm $GOPATH/pkg/mod/download/cache/sumdb
+rm go.sum
+
+# proxy 404 falls back to direct access (which fails)
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb
+env GOPROXY=$proxy/sumdb-404
+! go get -d rsc.io/fortune@v1.0.0
+stderr 'verifying.*localhost.localdev'
+rm $GOPATH/pkg/mod/download/cache/sumdb
+rm go.sum
+
+# proxy non-200/404/410 stops direct access
+cp go.mod.orig go.mod
+env GOSUMDB=$sumdb
+env GOPROXY=$proxy/sumdb-503
+! go get -d rsc.io/fortune@v1.0.0
+stderr '503 Service Unavailable'
+rm $GOPATH/pkg/mod/download/cache/sumdb
+rm go.sum
+
+-- go.mod.orig --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/mod_symlink.txt b/libgo/go/cmd/go/testdata/script/mod_symlink.txt
new file mode 100644 (file)
index 0000000..49bece2
--- /dev/null
@@ -0,0 +1,42 @@
+env GO111MODULE=on
+[!symlink] skip
+
+# 'go list' should resolve modules of imported packages.
+go list -deps -f '{{.Module}}' .
+stdout golang.org/x/text
+
+go list -deps -f '{{.Module}}' ./subpkg
+stdout golang.org/x/text
+
+# Create a copy of the module using symlinks in src/links.
+mkdir links
+symlink links/go.mod -> $GOPATH/src/go.mod
+symlink links/issue.go -> $GOPATH/src/issue.go
+mkdir links/subpkg
+symlink links/subpkg/issue.go -> $GOPATH/src/subpkg/issue.go
+
+# We should see the copy as a valid module root.
+cd links
+go env GOMOD
+stdout links[/\\]go.mod
+go list -m
+stdout golang.org/issue/28107
+
+# The symlink-based copy should contain the same packages
+# and have the same dependencies as the original.
+go list -deps -f '{{.Module}}' .
+stdout golang.org/x/text
+go list -deps -f '{{.Module}}' ./subpkg
+stdout golang.org/x/text
+
+-- go.mod --
+module golang.org/issue/28107
+
+-- issue.go --
+package issue
+
+import _ "golang.org/x/text/language"
+-- subpkg/issue.go --
+package issue
+
+import _ "golang.org/x/text/language"
index af4fd76d706cff5a75c7da1fd6227621ee849f91..8f2da2f2a5b59593dcfb7c555b8baf1cd054c008 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # TODO(bcmills): Convert the 'go test' calls below to 'go list -test' once 'go
 # list' is more sensitive to package loading errors.
@@ -6,8 +7,8 @@ env GO111MODULE=on
 # A test in the module's root package should work.
 cd a/
 cp go.mod.empty go.mod
-go test
-stdout PASS
+go list -test
+! stderr error
 
 cp go.mod.empty go.mod
 go list -deps
@@ -33,27 +34,27 @@ go list -test all
 stdout '^testing'
 
 cp go.mod.empty go.mod
-go test
-stdout PASS
+go list -test
+! stderr error
 
 # A test with the "_test" suffix in the module root should also work.
 cd ../b/
-go test
-stdout PASS
+go list -test
+! stderr error
 
 # A test with the "_test" suffix of a *package* with a "_test" suffix should
 # even work (not that you should ever do that).
 cd ../c_test
-go test
-stdout PASS
+go list -test
+! stderr error
 
 cd ../d_test
-go test
-stdout PASS
+go list -test
+! stderr error
 
 cd ../e
-go test
-stdout PASS
+go list -test
+! stderr error
 
 -- a/go.mod.empty --
 module example.com/user/a
diff --git a/libgo/go/cmd/go/testdata/script/mod_test_files.txt b/libgo/go/cmd/go/testdata/script/mod_test_files.txt
new file mode 100644 (file)
index 0000000..87aecb4
--- /dev/null
@@ -0,0 +1,49 @@
+env GO111MODULE=on
+
+cd foo
+
+# Testing an explicit source file should use the same import visibility as the
+# package in the same directory.
+go list -test -deps
+go list -test -deps foo_test.go
+
+# If the file is inside the main module's vendor directory, it should have
+# visibility based on the vendor-relative import path.
+mkdir vendor/example.com/foo
+cp foo_test.go vendor/example.com/foo
+go list -test -deps vendor/example.com/foo/foo_test.go
+
+# If the file is outside the main module entirely, it should be treated as outside.
+cp foo_test.go ../foo_test.go
+! go list -test -deps ../foo_test.go
+stderr 'use of internal package'
+
+-- foo/go.mod --
+module example.com/foo
+require example.com/internal v0.0.0
+replace example.com/internal => ../internal
+
+-- foo/internal.go --
+package foo
+import _ "example.com/internal"
+
+-- foo/foo_test.go --
+package foo_test
+
+import (
+       "testing"
+       "example.com/internal"
+)
+
+func TestHacksEnabled(t *testing.T) {
+       if !internal.Hacks {
+               t.Fatal("hacks not enabled")
+       }
+}
+
+-- internal/go.mod --
+module example.com/internal
+
+-- internal/internal.go --
+package internal
+const Hacks = true
diff --git a/libgo/go/cmd/go/testdata/script/mod_tidy_replace.txt b/libgo/go/cmd/go/testdata/script/mod_tidy_replace.txt
new file mode 100644 (file)
index 0000000..d5c2253
--- /dev/null
@@ -0,0 +1,111 @@
+env GO111MODULE=on
+[short] skip
+
+# golang.org/issue/30166: 'go mod tidy' should not crash if a replaced module is
+# involved in a cycle.
+cd cycle
+env GOTRACEBACK=off
+go mod tidy
+cd ..
+
+# From inside the module, 'go list -m all' should NOT include transitive
+# requirements of modules that have been replaced.
+go list -m all
+stdout 'rsc.io/quote/v3 v3.0.0'
+! stdout 'rsc.io/sampler'
+! stdout 'golang.org/x/text'
+
+# From outside the module, 'go list -m all' should include them.
+cd outside
+go list -m all
+stdout 'rsc.io/quote/v3 v3.0.0'
+stdout 'rsc.io/sampler v1.3.0'
+stdout 'golang.org/x/text'
+cd ..
+
+# 'go list all' should add indirect requirements to satisfy the packages
+# imported from replacement modules.
+! grep 'rsc.io/sampler' go.mod
+! grep 'golang.org/x/text' go.mod
+go list all
+grep 'rsc.io/sampler' go.mod
+grep 'golang.org/x/text' go.mod
+
+# 'go get' and 'go mod tidy' should follow the requirements of the replacements,
+# not the originals, even if that results in a set of versions that are
+# misleading or redundant without those replacements.
+go get rsc.io/sampler@v1.2.0
+go mod tidy
+go list -m all
+stdout 'rsc.io/quote/v3 v3.0.0'
+stdout 'rsc.io/sampler v1.2.0'
+stdout 'golang.org/x/text'
+
+# The requirements seen from outside may be higher (or lower)
+# than those seen from within the module.
+grep 'rsc.io/sampler v1.2.0' go.mod
+cd outside
+go list -m all
+stdout 'rsc.io/sampler v1.3.0'
+
+-- go.mod --
+module example.com/tidy
+
+require rsc.io/quote/v3 v3.0.0
+replace rsc.io/quote/v3 => ./not-rsc.io/quote/v3
+
+-- imports.go --
+package tidy
+
+import _ "rsc.io/quote/v3"
+
+-- outside/go.mod --
+module example.com/tidy/outside
+
+require example.com/tidy v0.0.0
+replace example.com/tidy => ./..
+
+-- not-rsc.io/quote/v3/go.mod --
+module not-rsc.io/quote/v3
+
+// No requirements specified!
+
+-- not-rsc.io/quote/v3/quote.go --
+package quote
+
+import (
+       _ "rsc.io/sampler"
+       _ "golang.org/x/text/language"
+)
+
+-- cycle/go.mod --
+module golang.org/issue/30166
+
+require (
+       golang.org/issue/30166/a v0.0.0
+       golang.org/issue/30166/b v0.0.0
+)
+
+replace (
+       golang.org/issue/30166/a => ./a
+       golang.org/issue/30166/b => ./b
+)
+-- cycle/cycle.go --
+package cycle
+
+import (
+       _ "golang.org/issue/30166/a"
+       _ "golang.org/issue/30166/b"
+)
+-- cycle/a/a.go --
+package a
+-- cycle/a/go.mod --
+module golang.org/issue/30166/a
+
+require golang.org/issue/30166/b v0.0.0
+-- cycle/b/b.go --
+package b
+-- cycle/b/go.mod --
+module golang.org/issue/30166/b
+
+require golang.org/issue/30166/a v0.0.0
index 5a15818543ef2c4318d4f059624001ebc7d273df..c583f560586970c6741fc3d975da15ddb5384b9d 100644 (file)
@@ -1,12 +1,12 @@
 env GO111MODULE=on
 
 # go.sum should list directly used modules and dependencies
-go get rsc.io/quote@v1.5.2
+go get -d rsc.io/quote@v1.5.2
 go mod tidy
 grep rsc.io/sampler go.sum
 
 # go.sum should not normally lose old entries
-go get rsc.io/quote@v1.0.0
+go get -d rsc.io/quote@v1.0.0
 grep 'rsc.io/quote v1.0.0' go.sum
 grep 'rsc.io/quote v1.5.2' go.sum
 grep rsc.io/sampler go.sum
index 3c27cdbf7bb4bf73f99820cf69e2aad3268534c4..3939e54c1bfe9ce7f0a23b7ccab7f41b8b5d7d86 100644 (file)
@@ -1,29 +1,94 @@
 env GO111MODULE=on
+[short] skip
 
+# Initially, we are at v1.0.0 for all dependencies.
+cp go.mod go.mod.orig
 go list -m all
-stdout '^rsc.io/quote v1.4.0'
-stdout '^rsc.io/sampler v1.0.0'
+stdout '^patch.example.com/direct v1.0.0'
+stdout '^patch.example.com/indirect v1.0.0'
+! stdout '^patch.example.com/depofdirectpatch'
 
-# get -u=patch rsc.io/quote should take latest quote & patch update its deps
-go get -m -u=patch rsc.io/quote
+# get -u=patch, with no arguments, should patch-update all dependencies
+# of the package in the current directory, pulling in transitive dependencies
+# and also patching those.
+cp go.mod.orig go.mod
+go get -d -u=patch
 go list -m all
-stdout '^rsc.io/quote v1.5.2'
-stdout '^rsc.io/sampler v1.3.1'
-stdout '^golang.org/x/text v0.0.0-'
+stdout '^patch.example.com/direct v1.0.1'
+stdout '^patch.example.com/indirect v1.0.1'
+stdout '^patch.example.com/depofdirectpatch v1.0.0'
 
-# get -u=patch quote@v1.2.0 should take that version of quote & patch update its deps
-go get -m -u=patch rsc.io/quote@v1.2.0
+# 'get all@patch' should be equivalent to 'get -u=patch all'
+cp go.mod.orig go.mod
+go get -d all@patch
 go list -m all
-stdout '^rsc.io/quote v1.2.0'
-stdout '^rsc.io/sampler v1.3.1'
-stdout '^golang.org/x/text v0.0.0-'
+stdout '^patch.example.com/direct v1.0.1'
+stdout '^patch.example.com/indirect v1.0.1'
+stdout '^patch.example.com/depofdirectpatch v1.0.0'
 
-# get -u=patch with no args applies to all deps
-go get -m -u=patch
+# Requesting the direct dependency with -u=patch but without an explicit version
+# should patch-update it and its dependencies.
+cp go.mod.orig go.mod
+go get -d -u=patch patch.example.com/direct
 go list -m all
-stdout '^rsc.io/quote v1.2.1'
+stdout '^patch.example.com/direct v1.0.1'
+stdout '^patch.example.com/indirect v1.0.1'
+stdout '^patch.example.com/depofdirectpatch v1.0.0'
+
+# Requesting only the indirect dependency should not update the direct one.
+cp go.mod.orig go.mod
+go get -d -u=patch patch.example.com/indirect
+go list -m all
+stdout '^patch.example.com/direct v1.0.0'
+stdout '^patch.example.com/indirect v1.0.1'
+! stdout '^patch.example.com/depofdirectpatch'
+
+# @patch should apply only to the specific module,
+# but the result must reflect its upgraded requirements.
+cp go.mod.orig go.mod
+go get -d patch.example.com/direct@patch
+go list -m all
+stdout '^patch.example.com/direct v1.0.1'
+stdout '^patch.example.com/indirect v1.0.0'
+stdout '^patch.example.com/depofdirectpatch v1.0.0'
+
+# An explicit @patch should override a general -u.
+cp go.mod.orig go.mod
+go get -d -u patch.example.com/direct@patch
+go list -m all
+stdout '^patch.example.com/direct v1.0.1'
+stdout '^patch.example.com/indirect v1.1.0'
+stdout '^patch.example.com/depofdirectpatch v1.0.0'
+
+# An explicit @latest should override a general -u=patch.
+cp go.mod.orig go.mod
+go get -d -u=patch patch.example.com/direct@latest
+go list -m all
+stdout '^patch.example.com/direct v1.1.0'
+stdout '^patch.example.com/indirect v1.0.1'
+! stdout '^patch.example.com/depofdirectpatch'
+
+# Standard-library packages cannot be upgraded explicitly.
+cp go.mod.orig go.mod
+! go get cmd/vet@patch
+stderr 'cannot use pattern .* with explicit version'
+
+# However, standard-library packages without explicit versions are fine.
+go get -d -u=patch -d cmd/go
+
+# We can upgrade to a new version of a module with no root package.
+go get -d example.com/noroot@v1.0.0
+go list -m all
+stdout '^example.com/noroot v1.0.0$'
+go get -d example.com/noroot@patch
+go list -m all
+stdout '^example.com/noroot v1.0.1$'
 
 -- go.mod --
 module x
-require rsc.io/quote v1.4.0
 
+require patch.example.com/direct v1.0.0
+
+-- main.go --
+package x
+import _ "patch.example.com/direct"
diff --git a/libgo/go/cmd/go/testdata/script/mod_vcs_missing.txt b/libgo/go/cmd/go/testdata/script/mod_vcs_missing.txt
new file mode 100644 (file)
index 0000000..a755935
--- /dev/null
@@ -0,0 +1,28 @@
+[exec:bzr] skip 'tests NOT having bzr'
+[!net] skip
+
+env GO111MODULE=on
+env GOPROXY=direct
+
+cd empty
+! go list launchpad.net/gocheck
+stderr '"bzr": executable file not found'
+cd ..
+
+# 1.11 used to give the cryptic error "cannot find module for path" here, but
+# only for a main package.
+cd main
+! go build
+stderr '"bzr": executable file not found'
+cd ..
+
+-- empty/go.mod --
+module m
+-- main/go.mod --
+module m
+-- main/main.go --
+package main
+
+import _ "launchpad.net/gocheck"
+
+func main() {}
index 203183be881f2a43366ef4710785a7e0a2e11488..eae4f2946ce5318214f581fa0d57939964e04d3a 100644 (file)
@@ -18,6 +18,7 @@ stderr '^y'
 stderr '^# z v1.0.0 => ./z'
 stderr '^z'
 ! stderr '^w'
+grep 'a/foo/bar/b\na/foo/bar/c' vendor/modules.txt # must be sorted
 
 go list -f {{.Dir}} x
 stdout 'src[\\/]x'
@@ -38,6 +39,7 @@ stdout 'src[\\/]w'
 stderr 'src[\\/]vendor[\\/]w'
 
 ! exists vendor/x/testdata
+! exists vendor/a/foo/bar/b/ignored.go
 ! exists vendor/a/foo/bar/b/main_test.go
 
 exists vendor/a/foo/AUTHORS.txt
@@ -102,6 +104,14 @@ replace (
 
 -- a/foo/bar/b/main.go --
 package b
+-- a/foo/bar/b/ignored.go --
+// This file is intended for use with "go run"; it isn't really part of the package.
+
+// +build ignore
+
+package main
+
+func main() {}
 -- a/foo/bar/b/main_test.go --
 package b
 
@@ -117,6 +127,7 @@ func TestDir(t *testing.T) {
 }
 -- a/foo/bar/c/main.go --
 package c
+import _ "a/foo/bar/b"
 -- a/foo/bar/c/main_test.go --
 package c
 
@@ -181,7 +192,6 @@ import _ "a"
 -- testdata2.go --
 package m
 
-import _ "a/foo/bar/b"
 import _ "a/foo/bar/c"
 -- v1.go --
 package m
index 7b304dbb707ea86cd98f463c4ab83444ae363822..24920a36b66e9aa8e420f536f597e1482210ac12 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # initial conditions: using sampler v1.3.0, not listed in go.mod.
 go list -deps
@@ -19,6 +20,16 @@ cmp go.mod go.mod.good
 go list -mod=vendor
 cmp go.mod go.mod.good
 
+# With a clean (and empty) module cache, 'go list -mod=vendor' should not download modules.
+go clean -modcache
+env GOPROXY=off
+! go list ...
+go list -mod=vendor ...
+
+# However, it should still list packages in the main module.
+go list -mod=vendor m/...
+stdout m
+
 -- go.mod --
 module m
 
diff --git a/libgo/go/cmd/go/testdata/script/mod_vendor_replace.txt b/libgo/go/cmd/go/testdata/script/mod_vendor_replace.txt
new file mode 100644 (file)
index 0000000..6bc1c77
--- /dev/null
@@ -0,0 +1,39 @@
+env GO111MODULE=on
+
+# Before vendoring, we expect to see the original directory.
+go list -f '{{.Version}} {{.Dir}}' -m rsc.io/quote/v3
+stdout 'v3.0.0'
+stdout '.*[/\\]not-rsc.io[/\\]quote[/\\]v3'
+
+# Since all dependencies are replaced, 'go mod vendor' should not
+# have to download anything from the network.
+go mod vendor
+! stderr 'downloading'
+! stderr 'finding'
+
+# After vendoring, we expect to see the replacement in the vendor directory,
+# without attempting to look up the non-replaced version.
+cmp vendor/rsc.io/quote/v3/quote.go local/not-rsc.io/quote/v3/quote.go
+
+go list -mod=vendor -f '{{.Version}} {{.Dir}}' -m rsc.io/quote/v3
+stdout 'v3.0.0'
+stdout '.*[/\\]vendor[/\\]rsc.io[/\\]quote[/\\]v3'
+! stderr 'finding'
+! stderr 'lookup disabled'
+
+-- go.mod --
+module example.com/replace
+
+require rsc.io/quote/v3 v3.0.0
+replace rsc.io/quote/v3 => ./local/not-rsc.io/quote/v3
+
+-- imports.go --
+package replace
+
+import _ "rsc.io/quote/v3"
+
+-- local/not-rsc.io/quote/v3/go.mod --
+module not-rsc.io/quote/v3
+
+-- local/not-rsc.io/quote/v3/quote.go --
+package quote
index 50c9b4a43751aafacfc50a56e392fea0ae9f7454..646bc62bb7015b026392b480870c723bf4e96b0b 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 # With good go.sum, verify succeeds by avoiding download.
 cp go.sum.good go.sum
index 4d556fc73fff371565dfd02ba4a6326e692bcc33..10a4f9fbea7981745ab34cde46ebefd798645760 100644 (file)
@@ -1,4 +1,5 @@
 env GO111MODULE=on
+[short] skip
 
 go list -test all
 stdout rsc.io/quote
index 8e6549b5c54e1d3a7907654b0ae84ea28b7cb355..9a1f5e52f07a168dac7d442a02f42210a463e5a5 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # patterns match directories with syntax errors
 ! go list ./...
 ! go build ./...
diff --git a/libgo/go/cmd/go/testdata/script/prevent_sys_unix_import.txt b/libgo/go/cmd/go/testdata/script/prevent_sys_unix_import.txt
new file mode 100644 (file)
index 0000000..ea1ad78
--- /dev/null
@@ -0,0 +1,6 @@
+# Policy decision: we shouldn't vendor golang.org/x/sys/unix in std
+# See https://golang.org/issue/32102
+
+env GO111MODULE=on
+go list std
+! stdout vendor/golang.org/x/sys/unix
index 8c4c1c16833e97f7fa4226097bb731d560daa938..939b661e58f378ede7fc0735759d0628c7e7d99c 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # hello world
 go run hello.go
 stderr 'hello world'
diff --git a/libgo/go/cmd/go/testdata/script/run_set_executable_name.txt b/libgo/go/cmd/go/testdata/script/run_set_executable_name.txt
new file mode 100644 (file)
index 0000000..54ddee9
--- /dev/null
@@ -0,0 +1,50 @@
+env GO111MODULE=on
+[short] skip
+
+# Check for correct naming of temporary executable
+
+#Test for single file specified
+cd x/y/z
+go run foo.go
+stderr 'foo'
+
+#Test for current directory
+go run .
+stderr 'z'
+
+#Test for set path
+go run m/x/y/z/
+stderr 'z'
+
+-- m/x/y/z/foo.go --
+package main
+import(
+       "os"
+       "path/filepath"
+)
+func main() {
+       println(filepath.Base(os.Args[0]))
+}
+
+-- x/y/z/foo.go --
+package main
+import(
+       "os"
+       "path/filepath"
+)
+func main() {
+       println(filepath.Base(os.Args[0]))
+}
+
+-- x/y/z/foo.go --
+package main
+import(
+       "os"
+       "path/filepath"
+)
+func main() {
+       println(filepath.Base(os.Args[0]))
+}
+
+-- go.mod --
+module m
\ No newline at end of file
diff --git a/libgo/go/cmd/go/testdata/script/run_wildcard.txt b/libgo/go/cmd/go/testdata/script/run_wildcard.txt
new file mode 100644 (file)
index 0000000..72036d1
--- /dev/null
@@ -0,0 +1,7 @@
+env GO111MODULE=off
+
+# Fix for https://github.com/golang/go/issues/28696:
+# go run x/... should not panic when directory x doesn't exist.
+
+! go run nonexistent/...
+stderr '^go run: no packages loaded from nonexistent/...$'
diff --git a/libgo/go/cmd/go/testdata/script/script_wait.txt b/libgo/go/cmd/go/testdata/script/script_wait.txt
new file mode 100644 (file)
index 0000000..3cd4ded
--- /dev/null
@@ -0,0 +1,24 @@
+env GO111MODULE=off
+
+[!exec:echo] skip
+[!exec:false] skip
+
+exec echo foo
+stdout foo
+
+exec echo foo &
+exec echo bar &
+! exec false &
+
+# Starting a background process should clear previous output.
+! stdout foo
+
+# Wait should set the output to the concatenated outputs of the background
+# programs, in the order in which they were started.
+wait
+stdout 'foo\nbar'
+
+# The end of the test should interrupt or kill any remaining background
+# programs.
+[!exec:sleep] skip
+! exec sleep 86400 &
diff --git a/libgo/go/cmd/go/testdata/script/std_vendor.txt b/libgo/go/cmd/go/testdata/script/std_vendor.txt
new file mode 100644 (file)
index 0000000..6cb015f
--- /dev/null
@@ -0,0 +1,43 @@
+env GO111MODULE=off
+
+[!gc] skip
+
+# 'go list' should report imports from _test.go in the TestImports field.
+go list -f '{{.TestImports}}'
+stdout net/http # from .TestImports
+
+# 'go list' should report standard-vendored packages by path.
+go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack
+stdout $GOROOT[/\\]src[/\\]vendor
+
+# 'go list -test' should report vendored transitive dependencies of _test.go
+# imports in the Deps field, with a 'vendor' prefix on their import paths.
+go list -test -f '{{.Deps}}'
+stdout golang.org/x/crypto # dep of .TestImports
+
+# Packages outside the standard library should not use its copy of vendored packages.
+cd broken
+! go build
+stderr 'cannot find package'
+
+-- go.mod --
+module m
+
+-- x.go --
+package x
+
+-- x_test.go --
+package x
+import "testing"
+import _ "net/http"
+func Test(t *testing.T) {}
+
+-- broken/go.mod --
+module broken
+-- broken/http.go --
+package broken
+
+import (
+       _ "net/http"
+       _ "golang.org/x/net/http/httpproxy"
+)
diff --git a/libgo/go/cmd/go/testdata/script/sum_readonly.txt b/libgo/go/cmd/go/testdata/script/sum_readonly.txt
new file mode 100644 (file)
index 0000000..8aa6116
--- /dev/null
@@ -0,0 +1,29 @@
+# Test that go.sum does not get updated when -mod=readonly flag is set
+env GO111MODULE=on
+
+go get -d rsc.io/quote
+go mod tidy
+
+# go.sum != dirty; -mod=readonly
+go list -mod=readonly
+
+# dirty up go.sum by removing it.
+rm go.sum
+
+# go.sum == dirty; -mod=readonly
+! go list -mod=readonly
+
+stderr 'go: updates to go.sum needed, disabled by -mod=readonly'
+
+-- go.mod --
+module m
+
+-- main.go --
+
+package main
+
+import "rsc.io/quote"
+
+func main() {
+    println(quote.Hello())
+}
\ No newline at end of file
index 42fcfed2fcc53a42aeed6998122fc6c7e11db04c..f5db6941a0d129e72d040fa0d2a52c9bc47518a6 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 ! go test badtest/...
 ! stdout ^ok
 stdout ^FAIL\tbadtest/badexec
index 6c01bc5729e91389266552a794f7c94b4fe47625..6562f2453ff4100ac5ebac63fa4429459bd88918 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 ! go test -c compile_binary/...
 stderr 'build comment'
 
diff --git a/libgo/go/cmd/go/testdata/script/test_devnull.txt b/libgo/go/cmd/go/testdata/script/test_devnull.txt
new file mode 100644 (file)
index 0000000..3307167
--- /dev/null
@@ -0,0 +1,15 @@
+env GO111MODULE=off
+
+# go test -c -o NUL
+# should work (see golang.org/issue/28035).
+cd x
+go test -o=$devnull -c
+! exists x.test$GOEXE
+
+-- x/x_test.go --
+package x_test
+import (
+    "testing"
+)
+func TestNUL(t *testing.T) {
+}
diff --git a/libgo/go/cmd/go/testdata/script/test_generated_main.txt b/libgo/go/cmd/go/testdata/script/test_generated_main.txt
new file mode 100644 (file)
index 0000000..75ffa9c
--- /dev/null
@@ -0,0 +1,35 @@
+# Tests that the generated test main file has a generated code comment.
+# This is needed by analyzers that access source files through 'go list'.
+# Verifies golang.org/issue/31971.
+# TODO(jayconrod): This test is brittle. We should write _testmain.go as
+# a build action instead of with an ad-hoc WriteFile call
+# in internal/test/test.go. Then we could just grep 'go get -n'.
+go test x_test.go
+
+-- x_test.go --
+package x
+
+import (
+       "os"
+       "path/filepath"
+       "io/ioutil"
+       "regexp"
+       "testing"
+)
+
+func Test(t *testing.T) {
+       exePath, err := os.Executable()
+       if err != nil {
+               t.Fatal(err)
+       }
+       testmainPath := filepath.Join(filepath.Dir(exePath), "_testmain.go")
+       source, err := ioutil.ReadFile(testmainPath)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if matched, err := regexp.Match(`(?m)^// Code generated .* DO NOT EDIT\.$`, source); err != nil {
+               t.Fatal(err)
+       } else if !matched {
+               t.Error("_testmain.go does not have generated code comment")
+       }
+}
diff --git a/libgo/go/cmd/go/testdata/script/test_init.txt b/libgo/go/cmd/go/testdata/script/test_init.txt
new file mode 100644 (file)
index 0000000..73b4f3c
--- /dev/null
@@ -0,0 +1,86 @@
+# Tests for automatic testing.Init calls when using 'go test'.
+
+env GO111MODULE=on
+
+# A TestMain should be able to access testing flags if it calls flag.Parse
+# without needing to use testing.Init.
+# Test code can use the name 'testing' without colliding with generated
+# testinginit code.
+# Tests running under 'go test' should observe that testing.Init is called
+# before any user package initialization code runs.
+go test
+stdout TestMain
+stdout TestInit
+stdout TestExt
+
+-- go.mod --
+module m
+
+-- init_test.go --
+package testinitflag
+
+import (
+       "flag"
+       "fmt"
+       "os"
+       Testing "testing"
+)
+
+func testFlagsInitialized() bool {
+       found := false
+       flag.VisitAll(func(f *flag.Flag) {
+               if f.Name == "test.count" {
+                       found = true
+               }
+       })
+       return found
+}
+
+var testing int
+var testingInitAtInitialization = testFlagsInitialized()
+
+func TestInit(t *Testing.T) {
+       if !testingInitAtInitialization {
+               t.Fatal("testing.Init not called before package initialization")
+       }
+       fmt.Printf("TestInit\n")
+}
+
+func TestMain(m *Testing.M) {
+       fmt.Printf("TestMain\n")
+       flag.Parse()
+       if !testFlagsInitialized() {
+               fmt.Println("testing flags not registered")
+               os.Exit(1)
+       }
+       os.Exit(m.Run())
+}
+
+-- external_test.go --
+package testinitflag_test
+
+import (
+       "flag"
+       "fmt"
+       Testing "testing"
+)
+
+func testFlagsInitialized() bool {
+       found := false
+       flag.VisitAll(func(f *flag.Flag) {
+               if f.Name == "test.count" {
+                       found = true
+               }
+       })
+       return found
+}
+
+var testing int
+var testingInitAtInitialization = testFlagsInitialized()
+
+func TestExt(t *Testing.T) {
+       fmt.Printf("TestExt\n")
+       if !testingInitAtInitialization {
+               t.Fatal("testing.Init not called before package initialization")
+       }
+}
diff --git a/libgo/go/cmd/go/testdata/script/test_status.txt b/libgo/go/cmd/go/testdata/script/test_status.txt
new file mode 100644 (file)
index 0000000..aa6ad3c
--- /dev/null
@@ -0,0 +1,18 @@
+env GO111MODULE=off
+
+! go test x y
+stdout ^FAIL\s+x
+stdout ^ok\s+y
+stdout (?-m)FAIL\n$
+
+-- x/x_test.go --
+package x
+
+import "testing"
+
+func TestNothingJustFail(t *testing.T) {
+    t.Fail()
+}
+
+-- y/y_test.go --
+package y
diff --git a/libgo/go/cmd/go/testdata/script/test_timeout.txt b/libgo/go/cmd/go/testdata/script/test_timeout.txt
new file mode 100644 (file)
index 0000000..8dead0a
--- /dev/null
@@ -0,0 +1,22 @@
+[short] skip
+env GO111MODULE=off
+cd a
+
+# No timeout is passed via 'go test' command.
+go test -v
+stdout '10m0s'
+
+# Timeout is passed via 'go test' command.
+go test -v -timeout 30m
+stdout '30m0s'
+
+-- a/timeout_test.go --
+package t
+import (
+       "flag"
+       "fmt"
+       "testing"
+)
+func TestTimeout(t *testing.T) {
+       fmt.Println(flag.Lookup("test.timeout").Value.String())
+}
\ No newline at end of file
index 6513451df856c4eb1bcd74da1d102c9395d84ad0..9ca94e72c527491faa16b909eb13da684a7fce5c 100644 (file)
@@ -1,3 +1,5 @@
+env GO111MODULE=off
+
 # smoke test for complex build configuration
 go build -o complex.exe complex
 [exec:gccgo] go build -compiler=gccgo -o complex.exe complex
diff --git a/libgo/go/cmd/go/testdata/script/version.txt b/libgo/go/cmd/go/testdata/script/version.txt
new file mode 100644 (file)
index 0000000..cb4881f
--- /dev/null
@@ -0,0 +1,12 @@
+env GO111MODULE=on
+[short] skip
+
+go build -o fortune.exe rsc.io/fortune
+go version fortune.exe
+stdout '^fortune.exe: .+'
+go version -m fortune.exe
+stdout '^\tpath\trsc.io/fortune'
+stdout '^\tmod\trsc.io/fortune\tv1.0.0'
+
+-- go.mod --
+module m
diff --git a/libgo/go/cmd/go/testdata/script/vet_asm.txt b/libgo/go/cmd/go/testdata/script/vet_asm.txt
new file mode 100644 (file)
index 0000000..59b35ec
--- /dev/null
@@ -0,0 +1,32 @@
+env GO111MODULE=off
+
+# Issue 27665. Verify that "go vet" analyzes non-Go files.
+
+[!amd64] skip
+! go vet -asmdecl a
+stderr 'f: invalid MOVW of x'
+
+# -c flag shows context
+! go vet -c=2 -asmdecl a
+stderr '...invalid MOVW...'
+stderr '1      .*TEXT'
+stderr '2              MOVW'
+stderr '3              RET'
+stderr '4'
+
+# -json causes success, even with diagnostics and errors.
+go vet -json -asmdecl a
+stderr '"a": {'
+stderr   '"asmdecl":'
+stderr     '"posn": ".*asm.s:2:1",'
+stderr     '"message": ".*invalid MOVW.*"'
+
+-- a/a.go --
+package a
+
+func f(x int8)
+
+-- a/asm.s --
+TEXT ·f(SB),0,$0-1
+       MOVW    x+0(FP), AX
+       RET
diff --git a/libgo/go/cmd/go/testdata/script/vet_deps.txt b/libgo/go/cmd/go/testdata/script/vet_deps.txt
new file mode 100644 (file)
index 0000000..b2a8f16
--- /dev/null
@@ -0,0 +1,34 @@
+env GO111MODULE=off
+
+# Issue 30296. Verify that "go vet" uses only immediate dependencies.
+
+# First run fills the cache.
+go vet a
+
+go vet -x a
+! stderr 'transitive'
+
+-- a/a.go --
+package a
+
+import "b"
+
+func F() {
+       b.F()
+}
+
+-- b/b.go --
+package b
+
+import "transitive"
+
+func F() {
+       transitive.F()
+}
+
+-- transitive/c.go --
+package transitive
+
+func F() {
+}
+
diff --git a/libgo/go/cmd/go/testdata/testcover/pkg4/a.go b/libgo/go/cmd/go/testdata/testcover/pkg4/a.go
new file mode 100644 (file)
index 0000000..cf09e6f
--- /dev/null
@@ -0,0 +1,5 @@
+package pkg4
+
+type T struct {
+       X bool
+}
diff --git a/libgo/go/cmd/go/testdata/testcover/pkg4/a_test.go b/libgo/go/cmd/go/testdata/testcover/pkg4/a_test.go
new file mode 100644 (file)
index 0000000..12b8685
--- /dev/null
@@ -0,0 +1,9 @@
+package pkg4
+
+import (
+       "testing"
+)
+
+func TestT(t *testing.T) {
+       _ = T{}
+}
index cd009db5cf00ff277b1e350ac5f2294b262fd12d..1bdaf2abb054cfc11c8e9a4ae9e7753548f38dcc 100644 (file)
@@ -46,7 +46,7 @@ func TestDir(t *testing.T) {
 }
 -- a/foo/bar/c/testdata/1 --
 -- a/foo/bar/testdata/1 --
--- a/gcc/go/gofrontend.mod --
+-- a/go.mod --
 module a
 -- a/main.go --
 package a
index c302d7e9b584146f1df0261a7b8ebceb6dd265ac..8b67de06ca628f218e4725d65af95b244a51312a 100644 (file)
@@ -181,6 +181,7 @@ func TestVendorGet(t *testing.T) {
 
 func TestVendorGetUpdate(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -192,6 +193,7 @@ func TestVendorGetUpdate(t *testing.T) {
 
 func TestVendorGetU(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -202,6 +204,7 @@ func TestVendorGetU(t *testing.T) {
 
 func TestVendorGetTU(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -212,6 +215,7 @@ func TestVendorGetTU(t *testing.T) {
 
 func TestVendorGetBadVendor(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        for _, suffix := range []string{"bad/imp", "bad/imp2", "bad/imp3", "..."} {
                t.Run(suffix, func(t *testing.T) {
@@ -228,6 +232,7 @@ func TestVendorGetBadVendor(t *testing.T) {
 
 func TestGetSubmodules(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -248,6 +253,7 @@ func TestVendorCache(t *testing.T) {
 
 func TestVendorTest2(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -273,6 +279,7 @@ func TestVendorTest2(t *testing.T) {
 
 func TestVendorTest3(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -299,6 +306,7 @@ func TestVendorTest3(t *testing.T) {
 
 func TestVendorList(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
@@ -349,6 +357,7 @@ func TestLegacyMod(t *testing.T) {
 
 func TestLegacyModGet(t *testing.T) {
        testenv.MustHaveExternalNetwork(t)
+       testenv.MustHaveExecPath(t, "git")
 
        tg := testgo(t)
        defer tg.cleanup()
index ac6852f2e4e3841e049070b878038c849bab0675..d7a77a968231ca477c3fb1423c6f58c7c6b76099 100644 (file)
@@ -112,6 +112,8 @@ func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error
                simplify(file)
        }
 
+       ast.Inspect(file, normalizeNumbers)
+
        res, err := format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth})
        if err != nil {
                return err
@@ -326,3 +328,56 @@ func backupFile(filename string, data []byte, perm os.FileMode) (string, error)
 
        return bakname, err
 }
+
+// normalizeNumbers rewrites base prefixes and exponents to
+// use lower-case letters, and removes leading 0's from
+// integer imaginary literals. It leaves hexadecimal digits
+// alone.
+func normalizeNumbers(n ast.Node) bool {
+       lit, _ := n.(*ast.BasicLit)
+       if lit == nil || (lit.Kind != token.INT && lit.Kind != token.FLOAT && lit.Kind != token.IMAG) {
+               return true
+       }
+       if len(lit.Value) < 2 {
+               return false // only one digit (common case) - nothing to do
+       }
+       // len(lit.Value) >= 2
+
+       // We ignore lit.Kind because for lit.Kind == token.IMAG the literal may be an integer
+       // or floating-point value, decimal or not. Instead, just consider the literal pattern.
+       x := lit.Value
+       switch x[:2] {
+       default:
+               // 0-prefix octal, decimal int, or float (possibly with 'i' suffix)
+               if i := strings.LastIndexByte(x, 'E'); i >= 0 {
+                       x = x[:i] + "e" + x[i+1:]
+                       break
+               }
+               // remove leading 0's from integer (but not floating-point) imaginary literals
+               if x[len(x)-1] == 'i' && strings.IndexByte(x, '.') < 0 && strings.IndexByte(x, 'e') < 0 {
+                       x = strings.TrimLeft(x, "0_")
+                       if x == "i" {
+                               x = "0i"
+                       }
+               }
+       case "0X":
+               x = "0x" + x[2:]
+               fallthrough
+       case "0x":
+               // possibly a hexadecimal float
+               if i := strings.LastIndexByte(x, 'P'); i >= 0 {
+                       x = x[:i] + "p" + x[i+1:]
+               }
+       case "0O":
+               x = "0o" + x[2:]
+       case "0o":
+               // nothing to do
+       case "0B":
+               x = "0b" + x[2:]
+       case "0b":
+               // nothing to do
+       }
+
+       lit.Value = x
+       return false
+}
index 231d11b18572c599e26b3c06c0d0570fb63311f6..addbd2ac88b00b99fd863ce8c9c151e1c9673a93 100644 (file)
@@ -11,14 +11,15 @@ package objabi
 // ../../../runtime/symtab.go.
 
 const (
-       PCDATA_StackMapIndex       = 0
-       PCDATA_InlTreeIndex        = 1
-       PCDATA_RegMapIndex         = 2
+       PCDATA_RegMapIndex   = 0
+       PCDATA_StackMapIndex = 1
+       PCDATA_InlTreeIndex  = 2
+
        FUNCDATA_ArgsPointerMaps   = 0
        FUNCDATA_LocalsPointerMaps = 1
-       FUNCDATA_InlTree           = 2
-       FUNCDATA_RegPointerMaps    = 3
-       FUNCDATA_StackObjects      = 4
+       FUNCDATA_RegPointerMaps    = 2
+       FUNCDATA_StackObjects      = 3
+       FUNCDATA_InlTree           = 4
 
        // ArgsSizeUnknown is set in Func.argsize to mark all functions
        // whose argument size is unknown (C vararg functions, and
index db2221d6b145e1cddb162bb4f495899739802177..0a54228228425a30bd36b44ab50e6b40a58214e4 100644 (file)
@@ -73,7 +73,7 @@ func (h *HeadType) Set(s string) error {
                *h = Hopenbsd
        case "plan9":
                *h = Hplan9
-       case "solaris":
+       case "illumos", "solaris":
                *h = Hsolaris
        case "windows":
                *h = Hwindows
index 1c671b211f8310cfb72048b055afa5716728e9db..178c8363d95d8a39b74167636f3b4972ccbfa975 100644 (file)
@@ -7,6 +7,7 @@ package objabi
 import (
        "os"
        "path/filepath"
+       "strings"
 )
 
 // WorkingDir returns the current working directory
@@ -21,32 +22,63 @@ func WorkingDir() string {
        return filepath.ToSlash(path)
 }
 
-// AbsFile returns the absolute filename for file in the given directory.
-// It also removes a leading pathPrefix, or else rewrites a leading $GOROOT
-// prefix to the literal "$GOROOT".
+// AbsFile returns the absolute filename for file in the given directory,
+// as rewritten by the rewrites argument.
+// For unrewritten paths, AbsFile rewrites a leading $GOROOT prefix to the literal "$GOROOT".
 // If the resulting path is the empty string, the result is "??".
-func AbsFile(dir, file, pathPrefix string) string {
+//
+// The rewrites argument is a ;-separated list of rewrites.
+// Each rewrite is of the form "prefix" or "prefix=>replace",
+// where prefix must match a leading sequence of path elements
+// and is either removed entirely or replaced by the replacement.
+func AbsFile(dir, file, rewrites string) string {
        abs := file
        if dir != "" && !filepath.IsAbs(file) {
                abs = filepath.Join(dir, file)
        }
 
-       if pathPrefix != "" && hasPathPrefix(abs, pathPrefix) {
-               if abs == pathPrefix {
-                       abs = ""
-               } else {
-                       abs = abs[len(pathPrefix)+1:]
+       start := 0
+       for i := 0; i <= len(rewrites); i++ {
+               if i == len(rewrites) || rewrites[i] == ';' {
+                       if new, ok := applyRewrite(abs, rewrites[start:i]); ok {
+                               abs = new
+                               goto Rewritten
+                       }
+                       start = i + 1
                }
-       } else if hasPathPrefix(abs, GOROOT) {
+       }
+       if hasPathPrefix(abs, GOROOT) {
                abs = "$GOROOT" + abs[len(GOROOT):]
        }
+
+Rewritten:
        if abs == "" {
                abs = "??"
        }
-
        return abs
 }
 
+// applyRewrite applies the rewrite to the path,
+// returning the rewritten path and a boolean
+// indicating whether the rewrite applied at all.
+func applyRewrite(path, rewrite string) (string, bool) {
+       prefix, replace := rewrite, ""
+       if j := strings.LastIndex(rewrite, "=>"); j >= 0 {
+               prefix, replace = rewrite[:j], rewrite[j+len("=>"):]
+       }
+
+       if prefix == "" || !hasPathPrefix(path, prefix) {
+               return path, false
+       }
+       if len(path) == len(prefix) {
+               return replace, true
+       }
+       if replace == "" {
+               return path[len(prefix)+1:], true
+       }
+       return replace + path[len(prefix):], true
+}
+
 // Does s have t as a path prefix?
 // That is, does s == t or does s begin with t followed by a slash?
 // For portability, we allow ASCII case folding, so that hasPathPrefix("a/b/c", "A/B") is true.
diff --git a/libgo/go/cmd/internal/objabi/line_test.go b/libgo/go/cmd/internal/objabi/line_test.go
new file mode 100644 (file)
index 0000000..1fa0ff1
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package objabi
+
+import (
+       "path/filepath"
+       "runtime"
+       "testing"
+)
+
+// On Windows, "/foo" is reported as a relative path
+// (it is relative to the current drive letter),
+// so we need add a drive letter to test absolute path cases.
+func drive() string {
+       if runtime.GOOS == "windows" {
+               return "c:"
+       }
+       return ""
+}
+
+var absFileTests = []struct {
+       dir      string
+       file     string
+       rewrites string
+       abs      string
+}{
+       {"/d", "f", "", "/d/f"},
+       {"/d", drive() + "/f", "", drive() + "/f"},
+       {"/d", "f/g", "", "/d/f/g"},
+       {"/d", drive() + "/f/g", "", drive() + "/f/g"},
+
+       {"/d", "f", "/d/f", "??"},
+       {"/d", "f/g", "/d/f", "g"},
+       {"/d", "f/g", "/d/f=>h", "h/g"},
+       {"/d", "f/g", "/d/f=>/h", "/h/g"},
+       {"/d", "f/g", "/d/f=>/h;/d/e=>/i", "/h/g"},
+       {"/d", "e/f", "/d/f=>/h;/d/e=>/i", "/i/f"},
+}
+
+func TestAbsFile(t *testing.T) {
+       for _, tt := range absFileTests {
+               abs := filepath.FromSlash(AbsFile(filepath.FromSlash(tt.dir), filepath.FromSlash(tt.file), tt.rewrites))
+               want := filepath.FromSlash(tt.abs)
+               if abs != want {
+                       t.Errorf("AbsFile(%q, %q, %q) = %q, want %q", tt.dir, tt.file, tt.rewrites, abs, want)
+               }
+       }
+}
index 355882c63880af3d0e60f7cd3a56d4f1a3ce2c9d..5dc9356fe1786c5e43fa27758af33cb82a6f7fc8 100644 (file)
@@ -30,7 +30,7 @@
 
 package objabi
 
-type RelocType int32
+type RelocType int16
 
 //go:generate stringer -type=RelocType
 const (
@@ -132,6 +132,26 @@ const (
        // slot of the referenced symbol.
        R_ARM64_GOTPCREL
 
+       // R_ARM64_GOT resolves a GOT-relative instruction sequence, usually an adrp
+       // followed by another ld instruction.
+       R_ARM64_GOT
+
+       // R_ARM64_PCREL resolves a PC-relative addresses instruction sequence, usually an
+       // adrp followed by another add instruction.
+       R_ARM64_PCREL
+
+       // R_ARM64_LDST8 sets a LD/ST immediate value to bits [11:0] of a local address.
+       R_ARM64_LDST8
+
+       // R_ARM64_LDST32 sets a LD/ST immediate value to bits [11:2] of a local address.
+       R_ARM64_LDST32
+
+       // R_ARM64_LDST64 sets a LD/ST immediate value to bits [11:3] of a local address.
+       R_ARM64_LDST64
+
+       // R_ARM64_LDST128 sets a LD/ST immediate value to bits [11:4] of a local address.
+       R_ARM64_LDST128
+
        // PPC64.
 
        // R_POWER_TLS_LE is used to implement the "local exec" model for tls
@@ -196,6 +216,11 @@ const (
 
        // R_WASMIMPORT resolves to the index of the WebAssembly function import.
        R_WASMIMPORT
+
+       // R_XCOFFREF (only used on aix/ppc64) prevents garbage collection by ld
+       // of a symbol. This isn't a real relocation, it can be placed in anywhere
+       // in a symbol and target any symbols.
+       R_XCOFFREF
 )
 
 // IsDirectJump reports whether r is a relocation for a direct jump.
index 2cd3a9404546a117637e008a48e16f6f26af2da4..a1c4c1aa5189bc392e1e8d145dd78b23284c6edc 100644 (file)
@@ -4,9 +4,9 @@ package objabi
 
 import "strconv"
 
-const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_WEAKADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_METHODOFFR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_PCRELDBLR_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORT"
+const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_WEAKADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_METHODOFFR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_LDST8R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_PCRELDBLR_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREF"
 
-var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 60, 66, 72, 81, 92, 101, 112, 122, 129, 136, 144, 152, 160, 166, 172, 178, 188, 197, 208, 219, 229, 238, 251, 265, 279, 293, 309, 323, 337, 348, 362, 377, 394, 412, 433, 443, 454, 467, 478, 490}
+var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 60, 66, 72, 81, 92, 101, 112, 122, 129, 136, 144, 152, 160, 166, 172, 178, 188, 197, 208, 219, 229, 238, 251, 265, 279, 293, 309, 320, 333, 346, 360, 374, 389, 403, 417, 428, 442, 457, 474, 492, 513, 523, 534, 547, 558, 570, 580}
 
 func (i RelocType) String() string {
        i -= 1
index f0e6f472e5bf5c26aaad36b6f85b53798403d913..990ff1888de6aa1fb97684cd4710986f1921130e 100644 (file)
@@ -36,6 +36,5 @@ const (
        KindUnsafePointer
        KindDirectIface = 1 << 5
        KindGCProg      = 1 << 6
-       KindNoPointers  = 1 << 7
        KindMask        = (1 << 5) - 1
 )
index da49f706f603384a976395e93e0ee0bfaad09d75..bf71b6b0c02272ed1fce38156b11b8ea75dde00c 100644 (file)
@@ -19,7 +19,7 @@ func envOr(key, value string) string {
 }
 
 var (
-       defaultGOROOT string // set by linker
+       defaultGOROOT = defaultGOROOTValue()
 
        GOROOT   = envOr("GOROOT", defaultGOROOT)
        GOARCH   = envOr("GOARCH", defaultGOARCH)
@@ -28,9 +28,17 @@ var (
        GOARM    = goarm()
        GOMIPS   = gomips()
        GOMIPS64 = gomips64()
+       GOPPC64  = goppc64()
+       GOWASM   = gowasm()
+       GO_LDSO  = defaultGO_LDSO
        Version  = version
 )
 
+const (
+       ElfRelocOffset   = 256
+       MachoRelocOffset = 2048 // reserve enough space for ELF relocations
+)
+
 func goarm() int {
        switch v := envOr("GOARM", defaultGOARM); v {
        case "5":
@@ -63,6 +71,49 @@ func gomips64() string {
        panic("unreachable")
 }
 
+func goppc64() int {
+       switch v := envOr("GOPPC64", defaultGOPPC64); v {
+       case "power8":
+               return 8
+       case "power9":
+               return 9
+       }
+       log.Fatalf("Invalid GOPPC64 value. Must be power8 or power9.")
+       panic("unreachable")
+}
+
+type gowasmFeatures struct {
+       SignExt bool
+       SatConv bool
+}
+
+func (f gowasmFeatures) String() string {
+       var flags []string
+       if f.SatConv {
+               flags = append(flags, "satconv")
+       }
+       if f.SignExt {
+               flags = append(flags, "signext")
+       }
+       return strings.Join(flags, ",")
+}
+
+func gowasm() (f gowasmFeatures) {
+       for _, opt := range strings.Split(envOr("GOWASM", ""), ",") {
+               switch opt {
+               case "satconv":
+                       f.SatConv = true
+               case "signext":
+                       f.SignExt = true
+               case "":
+                       // ignore
+               default:
+                       log.Fatalf("Invalid GOWASM value. No such feature: " + opt)
+               }
+       }
+       return
+}
+
 func Getgoextlinkenabled() string {
        return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED)
 }
index a53da6ed2cbebc993fc0704b9811fd82e59eedee..4162858ac1b8bfe3f38f553307858f74cbfe5c33 100644 (file)
@@ -6,6 +6,9 @@ package sys
 
 // RaceDetectorSupported reports whether goos/goarch supports the race
 // detector. There is a copy of this function in cmd/dist/test.go.
+// Race detector only supports 48-bit VMA on arm64. But it will always
+// return true for arm64, because we don't have VMA size information during
+// the compile time.
 func RaceDetectorSupported(goos, goarch string) bool {
        switch goos {
        case "linux":
@@ -27,3 +30,16 @@ func MSanSupported(goos, goarch string) bool {
                return false
        }
 }
+
+// MustLinkExternal reports whether goos/goarch requires external linking.
+func MustLinkExternal(goos, goarch string) bool {
+       switch goos {
+       case "android":
+               return true
+       case "darwin":
+               if goarch == "arm" || goarch == "arm64" {
+                       return true
+               }
+       }
+       return false
+}
diff --git a/libgo/go/cmd/vet/all/main.go b/libgo/go/cmd/vet/all/main.go
deleted file mode 100644 (file)
index 2500c69..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// The vet/all command runs go vet on the standard library and commands.
-// It compares the output against a set of whitelists
-// maintained in the whitelist directory.
-//
-// This program attempts to build packages from golang.org/x/tools,
-// which must be in your GOPATH.
-package main
-
-import (
-       "bufio"
-       "bytes"
-       "flag"
-       "fmt"
-       "go/build"
-       "go/types"
-       "internal/testenv"
-       "io"
-       "io/ioutil"
-       "log"
-       "os"
-       "os/exec"
-       "path/filepath"
-       "runtime"
-       "strings"
-       "sync/atomic"
-)
-
-var (
-       flagPlatforms = flag.String("p", "", "platform(s) to use e.g. linux/amd64,darwin/386")
-       flagAll       = flag.Bool("all", false, "run all platforms")
-       flagNoLines   = flag.Bool("n", false, "don't print line numbers")
-)
-
-var cmdGoPath string
-var failed uint32 // updated atomically
-
-func main() {
-       log.SetPrefix("vet/all: ")
-       log.SetFlags(0)
-
-       var err error
-       cmdGoPath, err = testenv.GoTool()
-       if err != nil {
-               log.Print("could not find cmd/go; skipping")
-               // We're on a platform that can't run cmd/go.
-               // We want this script to be able to run as part of all.bash,
-               // so return cleanly rather than with exit code 1.
-               return
-       }
-
-       flag.Parse()
-       switch {
-       case *flagAll && *flagPlatforms != "":
-               log.Print("-all and -p flags are incompatible")
-               flag.Usage()
-               os.Exit(2)
-       case *flagPlatforms != "":
-               vetPlatforms(parseFlagPlatforms())
-       case *flagAll:
-               vetPlatforms(allPlatforms())
-       default:
-               hostPlatform.vet()
-       }
-       if atomic.LoadUint32(&failed) != 0 {
-               os.Exit(1)
-       }
-}
-
-var hostPlatform = platform{os: build.Default.GOOS, arch: build.Default.GOARCH}
-
-func allPlatforms() []platform {
-       var pp []platform
-       cmd := exec.Command(cmdGoPath, "tool", "dist", "list")
-       out, err := cmd.Output()
-       if err != nil {
-               log.Fatal(err)
-       }
-       lines := bytes.Split(out, []byte{'\n'})
-       for _, line := range lines {
-               if len(line) == 0 {
-                       continue
-               }
-               pp = append(pp, parsePlatform(string(line)))
-       }
-       return pp
-}
-
-func parseFlagPlatforms() []platform {
-       var pp []platform
-       components := strings.Split(*flagPlatforms, ",")
-       for _, c := range components {
-               pp = append(pp, parsePlatform(c))
-       }
-       return pp
-}
-
-func parsePlatform(s string) platform {
-       vv := strings.Split(s, "/")
-       if len(vv) != 2 {
-               log.Fatalf("could not parse platform %s, must be of form goos/goarch", s)
-       }
-       return platform{os: vv[0], arch: vv[1]}
-}
-
-type whitelist map[string]int
-
-// load adds entries from the whitelist file, if present, for os/arch to w.
-func (w whitelist) load(goos string, goarch string) {
-       sz := types.SizesFor("gc", goarch)
-       if sz == nil {
-               log.Fatalf("unknown type sizes for arch %q", goarch)
-       }
-       archbits := 8 * sz.Sizeof(types.Typ[types.UnsafePointer])
-
-       // Look up whether goarch has a shared arch suffix,
-       // such as mips64x for mips64 and mips64le.
-       archsuff := goarch
-       if x, ok := archAsmX[goarch]; ok {
-               archsuff = x
-       }
-
-       // Load whitelists.
-       filenames := []string{
-               "all.txt",
-               goos + ".txt",
-               goarch + ".txt",
-               goos + "_" + goarch + ".txt",
-               fmt.Sprintf("%dbit.txt", archbits),
-       }
-       if goarch != archsuff {
-               filenames = append(filenames,
-                       archsuff+".txt",
-                       goos+"_"+archsuff+".txt",
-               )
-       }
-
-       // We allow error message templates using GOOS and GOARCH.
-       if goos == "android" {
-               goos = "linux" // so many special cases :(
-       }
-
-       // Read whitelists and do template substitution.
-       replace := strings.NewReplacer("GOOS", goos, "GOARCH", goarch, "ARCHSUFF", archsuff)
-
-       for _, filename := range filenames {
-               path := filepath.Join("whitelist", filename)
-               f, err := os.Open(path)
-               if err != nil {
-                       // Allow not-exist errors; not all combinations have whitelists.
-                       if os.IsNotExist(err) {
-                               continue
-                       }
-                       log.Fatal(err)
-               }
-               scan := bufio.NewScanner(f)
-               for scan.Scan() {
-                       line := scan.Text()
-                       if len(line) == 0 || strings.HasPrefix(line, "//") {
-                               continue
-                       }
-                       w[replace.Replace(line)]++
-               }
-               if err := scan.Err(); err != nil {
-                       log.Fatal(err)
-               }
-       }
-}
-
-type platform struct {
-       os   string
-       arch string
-}
-
-func (p platform) String() string {
-       return p.os + "/" + p.arch
-}
-
-// ignorePathPrefixes are file path prefixes that should be ignored wholesale.
-var ignorePathPrefixes = [...]string{
-       // These testdata dirs have lots of intentionally broken/bad code for tests.
-       "cmd/go/testdata/",
-       "cmd/vet/testdata/",
-       "go/printer/testdata/",
-}
-
-func vetPlatforms(pp []platform) {
-       for _, p := range pp {
-               p.vet()
-       }
-}
-
-func (p platform) vet() {
-       if p.os == "linux" && (p.arch == "riscv64" || p.arch == "sparc64") {
-               // TODO(tklauser): enable as soon as these ports have fully landed
-               fmt.Printf("skipping %s/%s\n", p.os, p.arch)
-               return
-       }
-
-       if p.os == "windows" && p.arch == "arm" {
-               // TODO(jordanrh1): enable as soon as the windows/arm port has fully landed
-               fmt.Println("skipping windows/arm")
-               return
-       }
-
-       if p.os == "aix" && p.arch == "ppc64" {
-               // TODO(aix): enable as soon as the aix/ppc64 port has fully landed
-               fmt.Println("skipping aix/ppc64")
-               return
-       }
-
-       var buf bytes.Buffer
-       fmt.Fprintf(&buf, "go run main.go -p %s\n", p)
-
-       // Load whitelist(s).
-       w := make(whitelist)
-       w.load(p.os, p.arch)
-
-       tmpdir, err := ioutil.TempDir("", "cmd-vet-all")
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer os.RemoveAll(tmpdir)
-
-       // Build the go/packages-based vet command from the x/tools
-       // repo. It is considerably faster than "go vet", which rebuilds
-       // the standard library.
-       vetTool := filepath.Join(tmpdir, "vet")
-       cmd := exec.Command(cmdGoPath, "build", "-o", vetTool, "golang.org/x/tools/go/analysis/cmd/vet")
-       cmd.Dir = filepath.Join(runtime.GOROOT(), "src")
-       cmd.Stderr = os.Stderr
-       cmd.Stdout = os.Stderr
-       if err := cmd.Run(); err != nil {
-               log.Fatal(err)
-       }
-
-       // TODO: The unsafeptr checks are disabled for now,
-       // because there are so many false positives,
-       // and no clear way to improve vet to eliminate large chunks of them.
-       // And having them in the whitelists will just cause annoyance
-       // and churn when working on the runtime.
-       cmd = exec.Command(vetTool,
-               "-unsafeptr=0",
-               "-nilness=0", // expensive, uses SSA
-               "std",
-               "cmd/...",
-               "cmd/compile/internal/gc/testdata",
-       )
-       cmd.Dir = filepath.Join(runtime.GOROOT(), "src")
-       cmd.Env = append(os.Environ(), "GOOS="+p.os, "GOARCH="+p.arch, "CGO_ENABLED=0")
-       stderr, err := cmd.StderrPipe()
-       if err != nil {
-               log.Fatal(err)
-       }
-       if err := cmd.Start(); err != nil {
-               log.Fatal(err)
-       }
-
-       // Process vet output.
-       scan := bufio.NewScanner(stderr)
-       var parseFailed bool
-NextLine:
-       for scan.Scan() {
-               line := scan.Text()
-               if strings.HasPrefix(line, "vet: ") {
-                       // Typecheck failure: Malformed syntax or multiple packages or the like.
-                       // This will yield nicer error messages elsewhere, so ignore them here.
-
-                       // This includes warnings from asmdecl of the form:
-                       //   "vet: foo.s:16: [amd64] cannot check cross-package assembly function"
-                       continue
-               }
-
-               if strings.HasPrefix(line, "panic: ") {
-                       // Panic in vet. Don't filter anything, we want the complete output.
-                       parseFailed = true
-                       fmt.Fprintf(os.Stderr, "panic in vet (to reproduce: go run main.go -p %s):\n", p)
-                       fmt.Fprintln(os.Stderr, line)
-                       io.Copy(os.Stderr, stderr)
-                       break
-               }
-               if strings.HasPrefix(line, "# ") {
-                       // 'go vet' prefixes the output of each vet invocation by a comment:
-                       //    # [package]
-                       continue
-               }
-
-               // Parse line.
-               // Assume the part before the first ": "
-               // is the "file:line:col: " information.
-               // TODO(adonovan): parse vet -json output.
-               var file, lineno, msg string
-               if i := strings.Index(line, ": "); i >= 0 {
-                       msg = line[i+len(": "):]
-
-                       words := strings.Split(line[:i], ":")
-                       switch len(words) {
-                       case 3:
-                               _ = words[2] // ignore column
-                               fallthrough
-                       case 2:
-                               lineno = words[1]
-                               fallthrough
-                       case 1:
-                               file = words[0]
-
-                               // Make the file name relative to GOROOT/src.
-                               if rel, err := filepath.Rel(cmd.Dir, file); err == nil {
-                                       file = rel
-                               }
-                       default:
-                               // error: too many columns
-                       }
-               }
-               if file == "" {
-                       if !parseFailed {
-                               parseFailed = true
-                               fmt.Fprintf(os.Stderr, "failed to parse %s vet output:\n", p)
-                       }
-                       fmt.Fprintln(os.Stderr, line)
-                       continue
-               }
-
-               msg = strings.TrimSpace(msg)
-
-               for _, ignore := range ignorePathPrefixes {
-                       if strings.HasPrefix(file, filepath.FromSlash(ignore)) {
-                               continue NextLine
-                       }
-               }
-
-               key := file + ": " + msg
-               if w[key] == 0 {
-                       // Vet error with no match in the whitelist. Print it.
-                       if *flagNoLines {
-                               fmt.Fprintf(&buf, "%s: %s\n", file, msg)
-                       } else {
-                               fmt.Fprintf(&buf, "%s:%s: %s\n", file, lineno, msg)
-                       }
-                       atomic.StoreUint32(&failed, 1)
-                       continue
-               }
-               w[key]--
-       }
-       if parseFailed {
-               atomic.StoreUint32(&failed, 1)
-               return
-       }
-       if scan.Err() != nil {
-               log.Fatalf("failed to scan vet output: %v", scan.Err())
-       }
-       err = cmd.Wait()
-       // We expect vet to fail.
-       // Make sure it has failed appropriately, though (for example, not a PathError).
-       if _, ok := err.(*exec.ExitError); !ok {
-               log.Fatalf("unexpected go vet execution failure: %v", err)
-       }
-       printedHeader := false
-       if len(w) > 0 {
-               for k, v := range w {
-                       if v != 0 {
-                               if !printedHeader {
-                                       fmt.Fprintln(&buf, "unmatched whitelist entries:")
-                                       printedHeader = true
-                               }
-                               for i := 0; i < v; i++ {
-                                       fmt.Fprintln(&buf, k)
-                               }
-                               atomic.StoreUint32(&failed, 1)
-                       }
-               }
-       }
-
-       os.Stdout.Write(buf.Bytes())
-}
-
-// archAsmX maps architectures to the suffix usually used for their assembly files,
-// if different than the arch name itself.
-var archAsmX = map[string]string{
-       "android":  "linux",
-       "mips64":   "mips64x",
-       "mips64le": "mips64x",
-       "mips":     "mipsx",
-       "mipsle":   "mipsx",
-       "ppc64":    "ppc64x",
-       "ppc64le":  "ppc64x",
-}
index 4ec174b3cd1e06de48aeb36e40cf4aebfb6e178c..2a4f929d6090e0d1ebca3dc3c22ac1e597b39bff 100644 (file)
@@ -1,6 +1,8 @@
 package main
 
 import (
+       "cmd/internal/objabi"
+
        "golang.org/x/tools/go/analysis/unitchecker"
 
        "golang.org/x/tools/go/analysis/passes/asmdecl"
@@ -11,6 +13,7 @@ import (
        "golang.org/x/tools/go/analysis/passes/cgocall"
        "golang.org/x/tools/go/analysis/passes/composite"
        "golang.org/x/tools/go/analysis/passes/copylock"
+       "golang.org/x/tools/go/analysis/passes/errorsas"
        "golang.org/x/tools/go/analysis/passes/httpresponse"
        "golang.org/x/tools/go/analysis/passes/loopclosure"
        "golang.org/x/tools/go/analysis/passes/lostcancel"
@@ -27,6 +30,8 @@ import (
 )
 
 func main() {
+       objabi.AddVersionFlag()
+
        unitchecker.Main(
                asmdecl.Analyzer,
                assign.Analyzer,
@@ -36,6 +41,7 @@ func main() {
                cgocall.Analyzer,
                composite.Analyzer,
                copylock.Analyzer,
+               errorsas.Analyzer,
                httpresponse.Analyzer,
                loopclosure.Analyzer,
                lostcancel.Analyzer,
diff --git a/libgo/go/cmd/vet/testdata/asm/asm.go b/libgo/go/cmd/vet/testdata/asm/asm.go
new file mode 100644 (file)
index 0000000..72ff452
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains declarations to test the assembly in asm1.s.
+
+package testdata
+
+func arg1(x int8, y uint8)
diff --git a/libgo/go/cmd/vet/testdata/assign/assign.go b/libgo/go/cmd/vet/testdata/assign/assign.go
new file mode 100644 (file)
index 0000000..112614e
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the useless-assignment checker.
+
+package assign
+
+import "math/rand"
+
+type ST struct {
+       x int
+       l []int
+}
+
+func (s *ST) SetX(x int, ch chan int) {
+       // Accidental self-assignment; it should be "s.x = x"
+       x = x // ERROR "self-assignment of x to x"
+       // Another mistake
+       s.x = s.x // ERROR "self-assignment of s.x to s.x"
+
+       s.l[0] = s.l[0] // ERROR "self-assignment of s.l.0. to s.l.0."
+
+       // Bail on any potential side effects to avoid false positives
+       s.l[num()] = s.l[num()]
+       rng := rand.New(rand.NewSource(0))
+       s.l[rng.Intn(len(s.l))] = s.l[rng.Intn(len(s.l))]
+       s.l[<-ch] = s.l[<-ch]
+}
+
+func num() int { return 2 }
diff --git a/libgo/go/cmd/vet/testdata/atomic/atomic.go b/libgo/go/cmd/vet/testdata/atomic/atomic.go
new file mode 100644 (file)
index 0000000..650d56b
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the atomic checker.
+
+package atomic
+
+import "sync/atomic"
+
+func AtomicTests() {
+       x := uint64(1)
+       x = atomic.AddUint64(&x, 1) // ERROR "direct assignment to atomic value"
+}
diff --git a/libgo/go/cmd/vet/testdata/bool/bool.go b/libgo/go/cmd/vet/testdata/bool/bool.go
new file mode 100644 (file)
index 0000000..20e01aa
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the bool checker.
+
+package bool
+
+func _() {
+       var f, g func() int
+
+       if v, w := f(), g(); v == w || v == w { // ERROR "redundant or: v == w || v == w"
+       }
+}
diff --git a/libgo/go/cmd/vet/testdata/buildtag/buildtag.go b/libgo/go/cmd/vet/testdata/buildtag/buildtag.go
new file mode 100644 (file)
index 0000000..c2fd6aa
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the buildtag checker.
+
+// +builder // ERROR "possible malformed \+build comment"
+// +build !ignore
+
+package testdata
+
+// +build toolate // ERROR "build comment must appear before package clause and be followed by a blank line$"
+
+var _ = 3
+
+var _ = `
+// +build notacomment
+`
diff --git a/libgo/go/cmd/vet/testdata/cgo/cgo.go b/libgo/go/cmd/vet/testdata/cgo/cgo.go
new file mode 100644 (file)
index 0000000..292d7fd
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the cgo checker.
+
+package testdata
+
+// void f(void *p) {}
+import "C"
+
+import "unsafe"
+
+func CgoTests() {
+       var c chan bool
+       C.f(*(*unsafe.Pointer)(unsafe.Pointer(&c))) // ERROR "embedded pointer"
+       C.f(unsafe.Pointer(&c))                     // ERROR "embedded pointer"
+}
diff --git a/libgo/go/cmd/vet/testdata/composite/composite.go b/libgo/go/cmd/vet/testdata/composite/composite.go
new file mode 100644 (file)
index 0000000..63a2837
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains the test for untagged struct literals.
+
+package composite
+
+import "flag"
+
+// Testing is awkward because we need to reference things from a separate package
+// to trigger the warnings.
+
+var goodStructLiteral = flag.Flag{
+       Name:  "Name",
+       Usage: "Usage",
+}
+
+var badStructLiteral = flag.Flag{ // ERROR "unkeyed fields"
+       "Name",
+       "Usage",
+       nil, // Value
+       "DefValue",
+}
diff --git a/libgo/go/cmd/vet/testdata/copylock/copylock.go b/libgo/go/cmd/vet/testdata/copylock/copylock.go
new file mode 100644 (file)
index 0000000..8079cf3
--- /dev/null
@@ -0,0 +1,11 @@
+package copylock
+
+import "sync"
+
+func BadFunc() {
+       var x *sync.Mutex
+       p := x
+       var y sync.Mutex
+       p = &y
+       *p = *x // ERROR "assignment copies lock value to \*p: sync.Mutex"
+}
diff --git a/libgo/go/cmd/vet/testdata/deadcode/deadcode.go b/libgo/go/cmd/vet/testdata/deadcode/deadcode.go
new file mode 100644 (file)
index 0000000..af83cdf
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the dead code checker.
+
+package deadcode
+
+func _() int {
+       print(1)
+       return 2
+       println() // ERROR "unreachable code"
+       return 3
+}
diff --git a/libgo/go/cmd/vet/testdata/httpresponse/httpresponse.go b/libgo/go/cmd/vet/testdata/httpresponse/httpresponse.go
new file mode 100644 (file)
index 0000000..6141f6e
--- /dev/null
@@ -0,0 +1,22 @@
+package httpresponse
+
+import (
+       "log"
+       "net/http"
+)
+
+func goodHTTPGet() {
+       res, err := http.Get("http://foo.com")
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer res.Body.Close()
+}
+
+func badHTTPGet() {
+       res, err := http.Get("http://foo.com")
+       defer res.Body.Close() // ERROR "using res before checking for errors"
+       if err != nil {
+               log.Fatal(err)
+       }
+}
diff --git a/libgo/go/cmd/vet/testdata/lostcancel/lostcancel.go b/libgo/go/cmd/vet/testdata/lostcancel/lostcancel.go
new file mode 100644 (file)
index 0000000..1bbb22d
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package lostcancel
+
+import "context"
+
+func _() {
+       var _, cancel = context.WithCancel(context.Background()) // ERROR "the cancel function is not used on all paths \(possible context leak\)"
+       if false {
+               _ = cancel
+       }
+} // ERROR "this return statement may be reached without using the cancel var defined on line 10"
diff --git a/libgo/go/cmd/vet/testdata/method/method.go b/libgo/go/cmd/vet/testdata/method/method.go
new file mode 100644 (file)
index 0000000..51c3f65
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains the code to check canonical methods.
+
+package method
+
+import "fmt"
+
+type MethodTest int
+
+func (t *MethodTest) Scan(x fmt.ScanState, c byte) { // ERROR "should have signature Scan\(fmt\.ScanState, rune\) error"
+}
diff --git a/libgo/go/cmd/vet/testdata/nilfunc/nilfunc.go b/libgo/go/cmd/vet/testdata/nilfunc/nilfunc.go
new file mode 100644 (file)
index 0000000..c34d60e
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package nilfunc
+
+func F() {}
+
+func Comparison() {
+       if F == nil { // ERROR "comparison of function F == nil is always false"
+               panic("can't happen")
+       }
+}
diff --git a/libgo/go/cmd/vet/testdata/print/print.go b/libgo/go/cmd/vet/testdata/print/print.go
new file mode 100644 (file)
index 0000000..7a4783a
--- /dev/null
@@ -0,0 +1,681 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the printf checker.
+
+package print
+
+import (
+       "fmt"
+       logpkg "log" // renamed to make it harder to see
+       "math"
+       "os"
+       "testing"
+       "unsafe" // just for test case printing unsafe.Pointer
+       // For testing printf-like functions from external package.
+       // "github.com/foobar/externalprintf"
+)
+
+func UnsafePointerPrintfTest() {
+       var up unsafe.Pointer
+       fmt.Printf("%p, %x %X", up, up, up)
+}
+
+// Error methods that do not satisfy the Error interface and should be checked.
+type errorTest1 int
+
+func (errorTest1) Error(...interface{}) string {
+       return "hi"
+}
+
+type errorTest2 int // Analogous to testing's *T type.
+func (errorTest2) Error(...interface{}) {
+}
+
+type errorTest3 int
+
+func (errorTest3) Error() { // No return value.
+}
+
+type errorTest4 int
+
+func (errorTest4) Error() int { // Different return type.
+       return 3
+}
+
+type errorTest5 int
+
+func (errorTest5) error() { // niladic; don't complain if no args (was bug)
+}
+
+// This function never executes, but it serves as a simple test for the program.
+// Test with make test.
+func PrintfTests() {
+       var b bool
+       var i int
+       var r rune
+       var s string
+       var x float64
+       var p *int
+       var imap map[int]int
+       var fslice []float64
+       var c complex64
+       // Some good format/argtypes
+       fmt.Printf("")
+       fmt.Printf("%b %b %b", 3, i, x)
+       fmt.Printf("%c %c %c %c", 3, i, 'x', r)
+       fmt.Printf("%d %d %d", 3, i, imap)
+       fmt.Printf("%e %e %e %e", 3e9, x, fslice, c)
+       fmt.Printf("%E %E %E %E", 3e9, x, fslice, c)
+       fmt.Printf("%f %f %f %f", 3e9, x, fslice, c)
+       fmt.Printf("%F %F %F %F", 3e9, x, fslice, c)
+       fmt.Printf("%g %g %g %g", 3e9, x, fslice, c)
+       fmt.Printf("%G %G %G %G", 3e9, x, fslice, c)
+       fmt.Printf("%b %b %b %b", 3e9, x, fslice, c)
+       fmt.Printf("%o %o", 3, i)
+       fmt.Printf("%p", p)
+       fmt.Printf("%q %q %q %q", 3, i, 'x', r)
+       fmt.Printf("%s %s %s", "hi", s, []byte{65})
+       fmt.Printf("%t %t", true, b)
+       fmt.Printf("%T %T", 3, i)
+       fmt.Printf("%U %U", 3, i)
+       fmt.Printf("%v %v", 3, i)
+       fmt.Printf("%x %x %x %x", 3, i, "hi", s)
+       fmt.Printf("%X %X %X %X", 3, i, "hi", s)
+       fmt.Printf("%.*s %d %g", 3, "hi", 23, 2.3)
+       fmt.Printf("%s", &stringerv)
+       fmt.Printf("%v", &stringerv)
+       fmt.Printf("%T", &stringerv)
+       fmt.Printf("%s", &embeddedStringerv)
+       fmt.Printf("%v", &embeddedStringerv)
+       fmt.Printf("%T", &embeddedStringerv)
+       fmt.Printf("%v", notstringerv)
+       fmt.Printf("%T", notstringerv)
+       fmt.Printf("%q", stringerarrayv)
+       fmt.Printf("%v", stringerarrayv)
+       fmt.Printf("%s", stringerarrayv)
+       fmt.Printf("%v", notstringerarrayv)
+       fmt.Printf("%T", notstringerarrayv)
+       fmt.Printf("%d", new(fmt.Formatter))
+       fmt.Printf("%*%", 2)               // Ridiculous but allowed.
+       fmt.Printf("%s", interface{}(nil)) // Nothing useful we can say.
+
+       fmt.Printf("%g", 1+2i)
+       fmt.Printf("%#e %#E %#f %#F %#g %#G", 1.2, 1.2, 1.2, 1.2, 1.2, 1.2) // OK since Go 1.9
+       // Some bad format/argTypes
+       fmt.Printf("%b", "hi")                      // ERROR "Printf format %b has arg \x22hi\x22 of wrong type string"
+       fmt.Printf("%t", c)                         // ERROR "Printf format %t has arg c of wrong type complex64"
+       fmt.Printf("%t", 1+2i)                      // ERROR "Printf format %t has arg 1 \+ 2i of wrong type complex128"
+       fmt.Printf("%c", 2.3)                       // ERROR "Printf format %c has arg 2.3 of wrong type float64"
+       fmt.Printf("%d", 2.3)                       // ERROR "Printf format %d has arg 2.3 of wrong type float64"
+       fmt.Printf("%e", "hi")                      // ERROR "Printf format %e has arg \x22hi\x22 of wrong type string"
+       fmt.Printf("%E", true)                      // ERROR "Printf format %E has arg true of wrong type bool"
+       fmt.Printf("%f", "hi")                      // ERROR "Printf format %f has arg \x22hi\x22 of wrong type string"
+       fmt.Printf("%F", 'x')                       // ERROR "Printf format %F has arg 'x' of wrong type rune"
+       fmt.Printf("%g", "hi")                      // ERROR "Printf format %g has arg \x22hi\x22 of wrong type string"
+       fmt.Printf("%g", imap)                      // ERROR "Printf format %g has arg imap of wrong type map\[int\]int"
+       fmt.Printf("%G", i)                         // ERROR "Printf format %G has arg i of wrong type int"
+       fmt.Printf("%o", x)                         // ERROR "Printf format %o has arg x of wrong type float64"
+       fmt.Printf("%p", nil)                       // ERROR "Printf format %p has arg nil of wrong type untyped nil"
+       fmt.Printf("%p", 23)                        // ERROR "Printf format %p has arg 23 of wrong type int"
+       fmt.Printf("%q", x)                         // ERROR "Printf format %q has arg x of wrong type float64"
+       fmt.Printf("%s", b)                         // ERROR "Printf format %s has arg b of wrong type bool"
+       fmt.Printf("%s", byte(65))                  // ERROR "Printf format %s has arg byte\(65\) of wrong type byte"
+       fmt.Printf("%t", 23)                        // ERROR "Printf format %t has arg 23 of wrong type int"
+       fmt.Printf("%U", x)                         // ERROR "Printf format %U has arg x of wrong type float64"
+       fmt.Printf("%x", nil)                       // ERROR "Printf format %x has arg nil of wrong type untyped nil"
+       fmt.Printf("%X", 2.3)                       // ERROR "Printf format %X has arg 2.3 of wrong type float64"
+       fmt.Printf("%s", stringerv)                 // ERROR "Printf format %s has arg stringerv of wrong type .*print.ptrStringer"
+       fmt.Printf("%t", stringerv)                 // ERROR "Printf format %t has arg stringerv of wrong type .*print.ptrStringer"
+       fmt.Printf("%s", embeddedStringerv)         // ERROR "Printf format %s has arg embeddedStringerv of wrong type .*print.embeddedStringer"
+       fmt.Printf("%t", embeddedStringerv)         // ERROR "Printf format %t has arg embeddedStringerv of wrong type .*print.embeddedStringer"
+       fmt.Printf("%q", notstringerv)              // ERROR "Printf format %q has arg notstringerv of wrong type .*print.notstringer"
+       fmt.Printf("%t", notstringerv)              // ERROR "Printf format %t has arg notstringerv of wrong type .*print.notstringer"
+       fmt.Printf("%t", stringerarrayv)            // ERROR "Printf format %t has arg stringerarrayv of wrong type .*print.stringerarray"
+       fmt.Printf("%t", notstringerarrayv)         // ERROR "Printf format %t has arg notstringerarrayv of wrong type .*print.notstringerarray"
+       fmt.Printf("%q", notstringerarrayv)         // ERROR "Printf format %q has arg notstringerarrayv of wrong type .*print.notstringerarray"
+       fmt.Printf("%d", BoolFormatter(true))       // ERROR "Printf format %d has arg BoolFormatter\(true\) of wrong type .*print.BoolFormatter"
+       fmt.Printf("%z", FormatterVal(true))        // correct (the type is responsible for formatting)
+       fmt.Printf("%d", FormatterVal(true))        // correct (the type is responsible for formatting)
+       fmt.Printf("%s", nonemptyinterface)         // correct (the type is responsible for formatting)
+       fmt.Printf("%.*s %d %6g", 3, "hi", 23, 'x') // ERROR "Printf format %6g has arg 'x' of wrong type rune"
+       fmt.Println()                               // not an error
+       fmt.Println("%s", "hi")                     // ERROR "Println call has possible formatting directive %s"
+       fmt.Println("%v", "hi")                     // ERROR "Println call has possible formatting directive %v"
+       fmt.Println("%T", "hi")                     // ERROR "Println call has possible formatting directive %T"
+       fmt.Println("0.0%")                         // correct (trailing % couldn't be a formatting directive)
+       fmt.Printf("%s", "hi", 3)                   // ERROR "Printf call needs 1 arg but has 2 args"
+       _ = fmt.Sprintf("%"+("s"), "hi", 3)         // ERROR "Sprintf call needs 1 arg but has 2 args"
+       fmt.Printf("%s%%%d", "hi", 3)               // correct
+       fmt.Printf("%08s", "woo")                   // correct
+       fmt.Printf("% 8s", "woo")                   // correct
+       fmt.Printf("%.*d", 3, 3)                    // correct
+       fmt.Printf("%.*d x", 3, 3, 3, 3)            // ERROR "Printf call needs 2 args but has 4 args"
+       fmt.Printf("%.*d x", "hi", 3)               // ERROR "Printf format %.*d uses non-int \x22hi\x22 as argument of \*"
+       fmt.Printf("%.*d x", i, 3)                  // correct
+       fmt.Printf("%.*d x", s, 3)                  // ERROR "Printf format %.\*d uses non-int s as argument of \*"
+       fmt.Printf("%*% x", 0.22)                   // ERROR "Printf format %\*% uses non-int 0.22 as argument of \*"
+       fmt.Printf("%q %q", multi()...)             // ok
+       fmt.Printf("%#q", `blah`)                   // ok
+       // printf("now is the time", "buddy")          // no error "printf call has arguments but no formatting directives"
+       Printf("now is the time", "buddy") // ERROR "Printf call has arguments but no formatting directives"
+       Printf("hi")                       // ok
+       const format = "%s %s\n"
+       Printf(format, "hi", "there")
+       Printf(format, "hi")              // ERROR "Printf format %s reads arg #2, but call has 1 arg$"
+       Printf("%s %d %.3v %q", "str", 4) // ERROR "Printf format %.3v reads arg #3, but call has 2 args"
+       f := new(ptrStringer)
+       f.Warn(0, "%s", "hello", 3)           // ERROR "Warn call has possible formatting directive %s"
+       f.Warnf(0, "%s", "hello", 3)          // ERROR "Warnf call needs 1 arg but has 2 args"
+       f.Warnf(0, "%r", "hello")             // ERROR "Warnf format %r has unknown verb r"
+       f.Warnf(0, "%#s", "hello")            // ERROR "Warnf format %#s has unrecognized flag #"
+       f.Warn2(0, "%s", "hello", 3)          // ERROR "Warn2 call has possible formatting directive %s"
+       f.Warnf2(0, "%s", "hello", 3)         // ERROR "Warnf2 call needs 1 arg but has 2 args"
+       f.Warnf2(0, "%r", "hello")            // ERROR "Warnf2 format %r has unknown verb r"
+       f.Warnf2(0, "%#s", "hello")           // ERROR "Warnf2 format %#s has unrecognized flag #"
+       f.Wrap(0, "%s", "hello", 3)           // ERROR "Wrap call has possible formatting directive %s"
+       f.Wrapf(0, "%s", "hello", 3)          // ERROR "Wrapf call needs 1 arg but has 2 args"
+       f.Wrapf(0, "%r", "hello")             // ERROR "Wrapf format %r has unknown verb r"
+       f.Wrapf(0, "%#s", "hello")            // ERROR "Wrapf format %#s has unrecognized flag #"
+       f.Wrap2(0, "%s", "hello", 3)          // ERROR "Wrap2 call has possible formatting directive %s"
+       f.Wrapf2(0, "%s", "hello", 3)         // ERROR "Wrapf2 call needs 1 arg but has 2 args"
+       f.Wrapf2(0, "%r", "hello")            // ERROR "Wrapf2 format %r has unknown verb r"
+       f.Wrapf2(0, "%#s", "hello")           // ERROR "Wrapf2 format %#s has unrecognized flag #"
+       fmt.Printf("%#s", FormatterVal(true)) // correct (the type is responsible for formatting)
+       Printf("d%", 2)                       // ERROR "Printf format % is missing verb at end of string"
+       Printf("%d", percentDV)
+       Printf("%d", &percentDV)
+       Printf("%d", notPercentDV)  // ERROR "Printf format %d has arg notPercentDV of wrong type .*print.notPercentDStruct"
+       Printf("%d", &notPercentDV) // ERROR "Printf format %d has arg &notPercentDV of wrong type \*.*print.notPercentDStruct"
+       Printf("%p", &notPercentDV) // Works regardless: we print it as a pointer.
+       Printf("%q", &percentDV)    // ERROR "Printf format %q has arg &percentDV of wrong type \*.*print.percentDStruct"
+       Printf("%s", percentSV)
+       Printf("%s", &percentSV)
+       // Good argument reorderings.
+       Printf("%[1]d", 3)
+       Printf("%[1]*d", 3, 1)
+       Printf("%[2]*[1]d", 1, 3)
+       Printf("%[2]*.[1]*[3]d", 2, 3, 4)
+       fmt.Fprintf(os.Stderr, "%[2]*.[1]*[3]d", 2, 3, 4) // Use Fprintf to make sure we count arguments correctly.
+       // Bad argument reorderings.
+       Printf("%[xd", 3)                      // ERROR "Printf format %\[xd is missing closing \]"
+       Printf("%[x]d x", 3)                   // ERROR "Printf format has invalid argument index \[x\]"
+       Printf("%[3]*s x", "hi", 2)            // ERROR "Printf format has invalid argument index \[3\]"
+       _ = fmt.Sprintf("%[3]d x", 2)          // ERROR "Sprintf format has invalid argument index \[3\]"
+       Printf("%[2]*.[1]*[3]d x", 2, "hi", 4) // ERROR "Printf format %\[2]\*\.\[1\]\*\[3\]d uses non-int \x22hi\x22 as argument of \*"
+       Printf("%[0]s x", "arg1")              // ERROR "Printf format has invalid argument index \[0\]"
+       Printf("%[0]d x", 1)                   // ERROR "Printf format has invalid argument index \[0\]"
+       // Something that satisfies the error interface.
+       var e error
+       fmt.Println(e.Error()) // ok
+       // Something that looks like an error interface but isn't, such as the (*T).Error method
+       // in the testing package.
+       var et1 *testing.T
+       et1.Error()        // ok
+       et1.Error("hi")    // ok
+       et1.Error("%d", 3) // ERROR "Error call has possible formatting directive %d"
+       var et3 errorTest3
+       et3.Error() // ok, not an error method.
+       var et4 errorTest4
+       et4.Error() // ok, not an error method.
+       var et5 errorTest5
+       et5.error() // ok, not an error method.
+       // Interfaces can be used with any verb.
+       var iface interface {
+               ToTheMadness() bool // Method ToTheMadness usually returns false
+       }
+       fmt.Printf("%f", iface) // ok: fmt treats interfaces as transparent and iface may well have a float concrete type
+       // Can't print a function.
+       Printf("%d", someFunction) // ERROR "Printf format %d arg someFunction is a func value, not called"
+       Printf("%v", someFunction) // ERROR "Printf format %v arg someFunction is a func value, not called"
+       Println(someFunction)      // ERROR "Println arg someFunction is a func value, not called"
+       Printf("%p", someFunction) // ok: maybe someone wants to see the pointer
+       Printf("%T", someFunction) // ok: maybe someone wants to see the type
+       // Bug: used to recur forever.
+       Printf("%p %x", recursiveStructV, recursiveStructV.next)
+       Printf("%p %x", recursiveStruct1V, recursiveStruct1V.next) // ERROR "Printf format %x has arg recursiveStruct1V\.next of wrong type \*.*print\.RecursiveStruct2"
+       Printf("%p %x", recursiveSliceV, recursiveSliceV)
+       Printf("%p %x", recursiveMapV, recursiveMapV)
+       // Special handling for Log.
+       math.Log(3) // OK
+       var t *testing.T
+       t.Log("%d", 3) // ERROR "Log call has possible formatting directive %d"
+       t.Logf("%d", 3)
+       t.Logf("%d", "hi") // ERROR "Logf format %d has arg \x22hi\x22 of wrong type string"
+
+       Errorf(1, "%d", 3)    // OK
+       Errorf(1, "%d", "hi") // ERROR "Errorf format %d has arg \x22hi\x22 of wrong type string"
+
+       // Multiple string arguments before variadic args
+       errorf("WARNING", "foobar")            // OK
+       errorf("INFO", "s=%s, n=%d", "foo", 1) // OK
+       errorf("ERROR", "%d")                  // ERROR "errorf format %d reads arg #1, but call has 0 args"
+
+       // Printf from external package
+       // externalprintf.Printf("%d", 42) // OK
+       // externalprintf.Printf("foobar") // OK
+       // level := 123
+       // externalprintf.Logf(level, "%d", 42)                        // OK
+       // externalprintf.Errorf(level, level, "foo %q bar", "foobar") // OK
+       // externalprintf.Logf(level, "%d")                            // no error "Logf format %d reads arg #1, but call has 0 args"
+       // var formatStr = "%s %s"
+       // externalprintf.Sprintf(formatStr, "a", "b")     // OK
+       // externalprintf.Logf(level, formatStr, "a", "b") // OK
+
+       // user-defined Println-like functions
+       ss := &someStruct{}
+       ss.Log(someFunction, "foo")          // OK
+       ss.Error(someFunction, someFunction) // OK
+       ss.Println()                         // OK
+       ss.Println(1.234, "foo")             // OK
+       ss.Println(1, someFunction)          // no error "Println arg someFunction is a func value, not called"
+       ss.log(someFunction)                 // OK
+       ss.log(someFunction, "bar", 1.33)    // OK
+       ss.log(someFunction, someFunction)   // no error "log arg someFunction is a func value, not called"
+
+       // indexed arguments
+       Printf("%d %[3]d %d %[2]d x", 1, 2, 3, 4)             // OK
+       Printf("%d %[0]d %d %[2]d x", 1, 2, 3, 4)             // ERROR "Printf format has invalid argument index \[0\]"
+       Printf("%d %[3]d %d %[-2]d x", 1, 2, 3, 4)            // ERROR "Printf format has invalid argument index \[-2\]"
+       Printf("%d %[3]d %d %[2234234234234]d x", 1, 2, 3, 4) // ERROR "Printf format has invalid argument index \[2234234234234\]"
+       Printf("%d %[3]d %-10d %[2]d x", 1, 2, 3)             // ERROR "Printf format %-10d reads arg #4, but call has 3 args"
+       Printf("%[1][3]d x", 1, 2)                            // ERROR "Printf format %\[1\]\[ has unknown verb \["
+       Printf("%[1]d x", 1, 2)                               // OK
+       Printf("%d %[3]d %d %[2]d x", 1, 2, 3, 4, 5)          // OK
+
+       // wrote Println but meant Fprintln
+       Printf("%p\n", os.Stdout)   // OK
+       Println(os.Stdout, "hello") // ERROR "Println does not take io.Writer but has first arg os.Stdout"
+
+       Printf(someString(), "hello") // OK
+
+       // Printf wrappers in package log should be detected automatically
+       logpkg.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
+       logpkg.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
+       logpkg.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
+       logpkg.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
+       logpkg.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
+       logpkg.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
+       logpkg.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
+       logpkg.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
+       logpkg.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
+
+       // Methods too.
+       var l *logpkg.Logger
+       l.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
+       l.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
+       l.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
+       l.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
+       l.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
+       l.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
+       l.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
+       l.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
+       l.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
+
+       // Issue 26486
+       dbg("", 1) // no error "call has arguments but no formatting directive"
+}
+
+func someString() string { return "X" }
+
+type someStruct struct{}
+
+// Log is non-variadic user-define Println-like function.
+// Calls to this func must be skipped when checking
+// for Println-like arguments.
+func (ss *someStruct) Log(f func(), s string) {}
+
+// Error is variadic user-define Println-like function.
+// Calls to this func mustn't be checked for Println-like arguments,
+// since variadic arguments type isn't interface{}.
+func (ss *someStruct) Error(args ...func()) {}
+
+// Println is variadic user-defined Println-like function.
+// Calls to this func must be checked for Println-like arguments.
+func (ss *someStruct) Println(args ...interface{}) {}
+
+// log is variadic user-defined Println-like function.
+// Calls to this func must be checked for Println-like arguments.
+func (ss *someStruct) log(f func(), args ...interface{}) {}
+
+// A function we use as a function value; it has no other purpose.
+func someFunction() {}
+
+// Printf is used by the test so we must declare it.
+func Printf(format string, args ...interface{}) {
+       fmt.Printf(format, args...)
+}
+
+// Println is used by the test so we must declare it.
+func Println(args ...interface{}) {
+       fmt.Println(args...)
+}
+
+// printf is used by the test so we must declare it.
+func printf(format string, args ...interface{}) {
+       fmt.Printf(format, args...)
+}
+
+// Errorf is used by the test for a case in which the first parameter
+// is not a format string.
+func Errorf(i int, format string, args ...interface{}) {
+       _ = fmt.Errorf(format, args...)
+}
+
+// errorf is used by the test for a case in which the function accepts multiple
+// string parameters before variadic arguments
+func errorf(level, format string, args ...interface{}) {
+       _ = fmt.Errorf(format, args...)
+}
+
+// multi is used by the test.
+func multi() []interface{} {
+       panic("don't call - testing only")
+}
+
+type stringer int
+
+func (stringer) String() string { return "string" }
+
+type ptrStringer float64
+
+var stringerv ptrStringer
+
+func (*ptrStringer) String() string {
+       return "string"
+}
+
+func (p *ptrStringer) Warn2(x int, args ...interface{}) string {
+       return p.Warn(x, args...)
+}
+
+func (p *ptrStringer) Warnf2(x int, format string, args ...interface{}) string {
+       return p.Warnf(x, format, args...)
+}
+
+func (*ptrStringer) Warn(x int, args ...interface{}) string {
+       return "warn"
+}
+
+func (*ptrStringer) Warnf(x int, format string, args ...interface{}) string {
+       return "warnf"
+}
+
+func (p *ptrStringer) Wrap2(x int, args ...interface{}) string {
+       return p.Wrap(x, args...)
+}
+
+func (p *ptrStringer) Wrapf2(x int, format string, args ...interface{}) string {
+       return p.Wrapf(x, format, args...)
+}
+
+func (*ptrStringer) Wrap(x int, args ...interface{}) string {
+       return fmt.Sprint(args...)
+}
+
+func (*ptrStringer) Wrapf(x int, format string, args ...interface{}) string {
+       return fmt.Sprintf(format, args...)
+}
+
+func (*ptrStringer) BadWrap(x int, args ...interface{}) string {
+       return fmt.Sprint(args) // ERROR "missing ... in args forwarded to print-like function"
+}
+
+func (*ptrStringer) BadWrapf(x int, format string, args ...interface{}) string {
+       return fmt.Sprintf(format, args) // ERROR "missing ... in args forwarded to printf-like function"
+}
+
+func (*ptrStringer) WrapfFalsePositive(x int, arg1 string, arg2 ...interface{}) string {
+       return fmt.Sprintf("%s %v", arg1, arg2)
+}
+
+type embeddedStringer struct {
+       foo string
+       ptrStringer
+       bar int
+}
+
+var embeddedStringerv embeddedStringer
+
+type notstringer struct {
+       f float64
+}
+
+var notstringerv notstringer
+
+type stringerarray [4]float64
+
+func (stringerarray) String() string {
+       return "string"
+}
+
+var stringerarrayv stringerarray
+
+type notstringerarray [4]float64
+
+var notstringerarrayv notstringerarray
+
+var nonemptyinterface = interface {
+       f()
+}(nil)
+
+// A data type we can print with "%d".
+type percentDStruct struct {
+       a int
+       b []byte
+       c *float64
+}
+
+var percentDV percentDStruct
+
+// A data type we cannot print correctly with "%d".
+type notPercentDStruct struct {
+       a int
+       b []byte
+       c bool
+}
+
+var notPercentDV notPercentDStruct
+
+// A data type we can print with "%s".
+type percentSStruct struct {
+       a string
+       b []byte
+       C stringerarray
+}
+
+var percentSV percentSStruct
+
+type recursiveStringer int
+
+func (s recursiveStringer) String() string {
+       _ = fmt.Sprintf("%d", s)
+       _ = fmt.Sprintf("%#v", s)
+       _ = fmt.Sprintf("%v", s)  // ERROR "Sprintf format %v with arg s causes recursive String method call"
+       _ = fmt.Sprintf("%v", &s) // ERROR "Sprintf format %v with arg &s causes recursive String method call"
+       _ = fmt.Sprintf("%T", s)  // ok; does not recursively call String
+       return fmt.Sprintln(s)    // ERROR "Sprintln arg s causes recursive call to String method"
+}
+
+type recursivePtrStringer int
+
+func (p *recursivePtrStringer) String() string {
+       _ = fmt.Sprintf("%v", *p)
+       _ = fmt.Sprint(&p)     // ok; prints address
+       return fmt.Sprintln(p) // ERROR "Sprintln arg p causes recursive call to String method"
+}
+
+type BoolFormatter bool
+
+func (*BoolFormatter) Format(fmt.State, rune) {
+}
+
+// Formatter with value receiver
+type FormatterVal bool
+
+func (FormatterVal) Format(fmt.State, rune) {
+}
+
+type RecursiveSlice []RecursiveSlice
+
+var recursiveSliceV = &RecursiveSlice{}
+
+type RecursiveMap map[int]RecursiveMap
+
+var recursiveMapV = make(RecursiveMap)
+
+type RecursiveStruct struct {
+       next *RecursiveStruct
+}
+
+var recursiveStructV = &RecursiveStruct{}
+
+type RecursiveStruct1 struct {
+       next *RecursiveStruct2
+}
+
+type RecursiveStruct2 struct {
+       next *RecursiveStruct1
+}
+
+var recursiveStruct1V = &RecursiveStruct1{}
+
+type unexportedInterface struct {
+       f interface{}
+}
+
+// Issue 17798: unexported ptrStringer cannot be formatted.
+type unexportedStringer struct {
+       t ptrStringer
+}
+type unexportedStringerOtherFields struct {
+       s string
+       t ptrStringer
+       S string
+}
+
+// Issue 17798: unexported error cannot be formatted.
+type unexportedError struct {
+       e error
+}
+type unexportedErrorOtherFields struct {
+       s string
+       e error
+       S string
+}
+
+type errorer struct{}
+
+func (e errorer) Error() string { return "errorer" }
+
+type unexportedCustomError struct {
+       e errorer
+}
+
+type errorInterface interface {
+       error
+       ExtraMethod()
+}
+
+type unexportedErrorInterface struct {
+       e errorInterface
+}
+
+func UnexportedStringerOrError() {
+       fmt.Printf("%s", unexportedInterface{"foo"}) // ok; prints {foo}
+       fmt.Printf("%s", unexportedInterface{3})     // ok; we can't see the problem
+
+       us := unexportedStringer{}
+       fmt.Printf("%s", us)  // ERROR "Printf format %s has arg us of wrong type .*print.unexportedStringer"
+       fmt.Printf("%s", &us) // ERROR "Printf format %s has arg &us of wrong type [*].*print.unexportedStringer"
+
+       usf := unexportedStringerOtherFields{
+               s: "foo",
+               S: "bar",
+       }
+       fmt.Printf("%s", usf)  // ERROR "Printf format %s has arg usf of wrong type .*print.unexportedStringerOtherFields"
+       fmt.Printf("%s", &usf) // ERROR "Printf format %s has arg &usf of wrong type [*].*print.unexportedStringerOtherFields"
+
+       ue := unexportedError{
+               e: &errorer{},
+       }
+       fmt.Printf("%s", ue)  // ERROR "Printf format %s has arg ue of wrong type .*print.unexportedError"
+       fmt.Printf("%s", &ue) // ERROR "Printf format %s has arg &ue of wrong type [*].*print.unexportedError"
+
+       uef := unexportedErrorOtherFields{
+               s: "foo",
+               e: &errorer{},
+               S: "bar",
+       }
+       fmt.Printf("%s", uef)  // ERROR "Printf format %s has arg uef of wrong type .*print.unexportedErrorOtherFields"
+       fmt.Printf("%s", &uef) // ERROR "Printf format %s has arg &uef of wrong type [*].*print.unexportedErrorOtherFields"
+
+       uce := unexportedCustomError{
+               e: errorer{},
+       }
+       fmt.Printf("%s", uce) // ERROR "Printf format %s has arg uce of wrong type .*print.unexportedCustomError"
+
+       uei := unexportedErrorInterface{}
+       fmt.Printf("%s", uei)       // ERROR "Printf format %s has arg uei of wrong type .*print.unexportedErrorInterface"
+       fmt.Println("foo\n", "bar") // not an error
+
+       fmt.Println("foo\n")  // ERROR "Println arg list ends with redundant newline"
+       fmt.Println("foo\\n") // not an error
+       fmt.Println(`foo\n`)  // not an error
+
+       intSlice := []int{3, 4}
+       fmt.Printf("%s", intSlice) // ERROR "Printf format %s has arg intSlice of wrong type \[\]int"
+       nonStringerArray := [1]unexportedStringer{{}}
+       fmt.Printf("%s", nonStringerArray)  // ERROR "Printf format %s has arg nonStringerArray of wrong type \[1\].*print.unexportedStringer"
+       fmt.Printf("%s", []stringer{3, 4})  // not an error
+       fmt.Printf("%s", [2]stringer{3, 4}) // not an error
+}
+
+// TODO: Disable complaint about '0' for Go 1.10. To be fixed properly in 1.11.
+// See issues 23598 and 23605.
+func DisableErrorForFlag0() {
+       fmt.Printf("%0t", true)
+}
+
+// Issue 26486.
+func dbg(format string, args ...interface{}) {
+       if format == "" {
+               format = "%v"
+       }
+       fmt.Printf(format, args...)
+}
+
+func PointersToCompoundTypes() {
+       stringSlice := []string{"a", "b"}
+       fmt.Printf("%s", &stringSlice) // not an error
+
+       intSlice := []int{3, 4}
+       fmt.Printf("%s", &intSlice) // ERROR "Printf format %s has arg &intSlice of wrong type \*\[\]int"
+
+       stringArray := [2]string{"a", "b"}
+       fmt.Printf("%s", &stringArray) // not an error
+
+       intArray := [2]int{3, 4}
+       fmt.Printf("%s", &intArray) // ERROR "Printf format %s has arg &intArray of wrong type \*\[2\]int"
+
+       stringStruct := struct{ F string }{"foo"}
+       fmt.Printf("%s", &stringStruct) // not an error
+
+       intStruct := struct{ F int }{3}
+       fmt.Printf("%s", &intStruct) // ERROR "Printf format %s has arg &intStruct of wrong type \*struct{F int}"
+
+       stringMap := map[string]string{"foo": "bar"}
+       fmt.Printf("%s", &stringMap) // not an error
+
+       intMap := map[int]int{3: 4}
+       fmt.Printf("%s", &intMap) // ERROR "Printf format %s has arg &intMap of wrong type \*map\[int\]int"
+
+       type T2 struct {
+               X string
+       }
+       type T1 struct {
+               X *T2
+       }
+       fmt.Printf("%s\n", T1{&T2{"x"}}) // ERROR "Printf format %s has arg T1{&T2{.x.}} of wrong type .*print\.T1"
+}
diff --git a/libgo/go/cmd/vet/testdata/rangeloop/rangeloop.go b/libgo/go/cmd/vet/testdata/rangeloop/rangeloop.go
new file mode 100644 (file)
index 0000000..4e21564
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the rangeloop checker.
+
+package rangeloop
+
+func RangeLoopTests() {
+       var s []int
+       for i, v := range s {
+               go func() {
+                       println(i) // ERROR "loop variable i captured by func literal"
+                       println(v) // ERROR "loop variable v captured by func literal"
+               }()
+       }
+}
diff --git a/libgo/go/cmd/vet/testdata/shift/shift.go b/libgo/go/cmd/vet/testdata/shift/shift.go
new file mode 100644 (file)
index 0000000..6b7a5ac
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the suspicious shift checker.
+
+package shift
+
+func ShiftTest() {
+       var i8 int8
+       _ = i8 << 7
+       _ = (i8 + 1) << 8 // ERROR ".i8 . 1. .8 bits. too small for shift of 8"
+}
diff --git a/libgo/go/cmd/vet/testdata/src/asm/asm.go b/libgo/go/cmd/vet/testdata/src/asm/asm.go
deleted file mode 100644 (file)
index 72ff452..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains declarations to test the assembly in asm1.s.
-
-package testdata
-
-func arg1(x int8, y uint8)
diff --git a/libgo/go/cmd/vet/testdata/src/assign/assign.go b/libgo/go/cmd/vet/testdata/src/assign/assign.go
deleted file mode 100644 (file)
index 112614e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the useless-assignment checker.
-
-package assign
-
-import "math/rand"
-
-type ST struct {
-       x int
-       l []int
-}
-
-func (s *ST) SetX(x int, ch chan int) {
-       // Accidental self-assignment; it should be "s.x = x"
-       x = x // ERROR "self-assignment of x to x"
-       // Another mistake
-       s.x = s.x // ERROR "self-assignment of s.x to s.x"
-
-       s.l[0] = s.l[0] // ERROR "self-assignment of s.l.0. to s.l.0."
-
-       // Bail on any potential side effects to avoid false positives
-       s.l[num()] = s.l[num()]
-       rng := rand.New(rand.NewSource(0))
-       s.l[rng.Intn(len(s.l))] = s.l[rng.Intn(len(s.l))]
-       s.l[<-ch] = s.l[<-ch]
-}
-
-func num() int { return 2 }
diff --git a/libgo/go/cmd/vet/testdata/src/atomic/atomic.go b/libgo/go/cmd/vet/testdata/src/atomic/atomic.go
deleted file mode 100644 (file)
index 650d56b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the atomic checker.
-
-package atomic
-
-import "sync/atomic"
-
-func AtomicTests() {
-       x := uint64(1)
-       x = atomic.AddUint64(&x, 1) // ERROR "direct assignment to atomic value"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/bool/bool.go b/libgo/go/cmd/vet/testdata/src/bool/bool.go
deleted file mode 100644 (file)
index 20e01aa..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the bool checker.
-
-package bool
-
-func _() {
-       var f, g func() int
-
-       if v, w := f(), g(); v == w || v == w { // ERROR "redundant or: v == w || v == w"
-       }
-}
diff --git a/libgo/go/cmd/vet/testdata/src/buildtag/buildtag.go b/libgo/go/cmd/vet/testdata/src/buildtag/buildtag.go
deleted file mode 100644 (file)
index c2fd6aa..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the buildtag checker.
-
-// +builder // ERROR "possible malformed \+build comment"
-// +build !ignore
-
-package testdata
-
-// +build toolate // ERROR "build comment must appear before package clause and be followed by a blank line$"
-
-var _ = 3
-
-var _ = `
-// +build notacomment
-`
diff --git a/libgo/go/cmd/vet/testdata/src/cgo/cgo.go b/libgo/go/cmd/vet/testdata/src/cgo/cgo.go
deleted file mode 100644 (file)
index 292d7fd..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the cgo checker.
-
-package testdata
-
-// void f(void *p) {}
-import "C"
-
-import "unsafe"
-
-func CgoTests() {
-       var c chan bool
-       C.f(*(*unsafe.Pointer)(unsafe.Pointer(&c))) // ERROR "embedded pointer"
-       C.f(unsafe.Pointer(&c))                     // ERROR "embedded pointer"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/composite/composite.go b/libgo/go/cmd/vet/testdata/src/composite/composite.go
deleted file mode 100644 (file)
index 63a2837..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the test for untagged struct literals.
-
-package composite
-
-import "flag"
-
-// Testing is awkward because we need to reference things from a separate package
-// to trigger the warnings.
-
-var goodStructLiteral = flag.Flag{
-       Name:  "Name",
-       Usage: "Usage",
-}
-
-var badStructLiteral = flag.Flag{ // ERROR "unkeyed fields"
-       "Name",
-       "Usage",
-       nil, // Value
-       "DefValue",
-}
diff --git a/libgo/go/cmd/vet/testdata/src/copylock/copylock.go b/libgo/go/cmd/vet/testdata/src/copylock/copylock.go
deleted file mode 100644 (file)
index 8079cf3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-package copylock
-
-import "sync"
-
-func BadFunc() {
-       var x *sync.Mutex
-       p := x
-       var y sync.Mutex
-       p = &y
-       *p = *x // ERROR "assignment copies lock value to \*p: sync.Mutex"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/deadcode/deadcode.go b/libgo/go/cmd/vet/testdata/src/deadcode/deadcode.go
deleted file mode 100644 (file)
index af83cdf..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the dead code checker.
-
-package deadcode
-
-func _() int {
-       print(1)
-       return 2
-       println() // ERROR "unreachable code"
-       return 3
-}
diff --git a/libgo/go/cmd/vet/testdata/src/httpresponse/httpresponse.go b/libgo/go/cmd/vet/testdata/src/httpresponse/httpresponse.go
deleted file mode 100644 (file)
index 6141f6e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package httpresponse
-
-import (
-       "log"
-       "net/http"
-)
-
-func goodHTTPGet() {
-       res, err := http.Get("http://foo.com")
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer res.Body.Close()
-}
-
-func badHTTPGet() {
-       res, err := http.Get("http://foo.com")
-       defer res.Body.Close() // ERROR "using res before checking for errors"
-       if err != nil {
-               log.Fatal(err)
-       }
-}
diff --git a/libgo/go/cmd/vet/testdata/src/lostcancel/lostcancel.go b/libgo/go/cmd/vet/testdata/src/lostcancel/lostcancel.go
deleted file mode 100644 (file)
index 1bbb22d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package lostcancel
-
-import "context"
-
-func _() {
-       var _, cancel = context.WithCancel(context.Background()) // ERROR "the cancel function is not used on all paths \(possible context leak\)"
-       if false {
-               _ = cancel
-       }
-} // ERROR "this return statement may be reached without using the cancel var defined on line 10"
diff --git a/libgo/go/cmd/vet/testdata/src/method/method.go b/libgo/go/cmd/vet/testdata/src/method/method.go
deleted file mode 100644 (file)
index 51c3f65..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code to check canonical methods.
-
-package method
-
-import "fmt"
-
-type MethodTest int
-
-func (t *MethodTest) Scan(x fmt.ScanState, c byte) { // ERROR "should have signature Scan\(fmt\.ScanState, rune\) error"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/nilfunc/nilfunc.go b/libgo/go/cmd/vet/testdata/src/nilfunc/nilfunc.go
deleted file mode 100644 (file)
index c34d60e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package nilfunc
-
-func F() {}
-
-func Comparison() {
-       if F == nil { // ERROR "comparison of function F == nil is always false"
-               panic("can't happen")
-       }
-}
diff --git a/libgo/go/cmd/vet/testdata/src/print/print.go b/libgo/go/cmd/vet/testdata/src/print/print.go
deleted file mode 100644 (file)
index 6bacd0f..0000000
+++ /dev/null
@@ -1,681 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the printf checker.
-
-package print
-
-import (
-       "fmt"
-       logpkg "log" // renamed to make it harder to see
-       "math"
-       "os"
-       "testing"
-       "unsafe" // just for test case printing unsafe.Pointer
-       // For testing printf-like functions from external package.
-       // "github.com/foobar/externalprintf"
-)
-
-func UnsafePointerPrintfTest() {
-       var up unsafe.Pointer
-       fmt.Printf("%p, %x %X", up, up, up)
-}
-
-// Error methods that do not satisfy the Error interface and should be checked.
-type errorTest1 int
-
-func (errorTest1) Error(...interface{}) string {
-       return "hi"
-}
-
-type errorTest2 int // Analogous to testing's *T type.
-func (errorTest2) Error(...interface{}) {
-}
-
-type errorTest3 int
-
-func (errorTest3) Error() { // No return value.
-}
-
-type errorTest4 int
-
-func (errorTest4) Error() int { // Different return type.
-       return 3
-}
-
-type errorTest5 int
-
-func (errorTest5) error() { // niladic; don't complain if no args (was bug)
-}
-
-// This function never executes, but it serves as a simple test for the program.
-// Test with make test.
-func PrintfTests() {
-       var b bool
-       var i int
-       var r rune
-       var s string
-       var x float64
-       var p *int
-       var imap map[int]int
-       var fslice []float64
-       var c complex64
-       // Some good format/argtypes
-       fmt.Printf("")
-       fmt.Printf("%b %b %b", 3, i, x)
-       fmt.Printf("%c %c %c %c", 3, i, 'x', r)
-       fmt.Printf("%d %d %d", 3, i, imap)
-       fmt.Printf("%e %e %e %e", 3e9, x, fslice, c)
-       fmt.Printf("%E %E %E %E", 3e9, x, fslice, c)
-       fmt.Printf("%f %f %f %f", 3e9, x, fslice, c)
-       fmt.Printf("%F %F %F %F", 3e9, x, fslice, c)
-       fmt.Printf("%g %g %g %g", 3e9, x, fslice, c)
-       fmt.Printf("%G %G %G %G", 3e9, x, fslice, c)
-       fmt.Printf("%b %b %b %b", 3e9, x, fslice, c)
-       fmt.Printf("%o %o", 3, i)
-       fmt.Printf("%p", p)
-       fmt.Printf("%q %q %q %q", 3, i, 'x', r)
-       fmt.Printf("%s %s %s", "hi", s, []byte{65})
-       fmt.Printf("%t %t", true, b)
-       fmt.Printf("%T %T", 3, i)
-       fmt.Printf("%U %U", 3, i)
-       fmt.Printf("%v %v", 3, i)
-       fmt.Printf("%x %x %x %x", 3, i, "hi", s)
-       fmt.Printf("%X %X %X %X", 3, i, "hi", s)
-       fmt.Printf("%.*s %d %g", 3, "hi", 23, 2.3)
-       fmt.Printf("%s", &stringerv)
-       fmt.Printf("%v", &stringerv)
-       fmt.Printf("%T", &stringerv)
-       fmt.Printf("%s", &embeddedStringerv)
-       fmt.Printf("%v", &embeddedStringerv)
-       fmt.Printf("%T", &embeddedStringerv)
-       fmt.Printf("%v", notstringerv)
-       fmt.Printf("%T", notstringerv)
-       fmt.Printf("%q", stringerarrayv)
-       fmt.Printf("%v", stringerarrayv)
-       fmt.Printf("%s", stringerarrayv)
-       fmt.Printf("%v", notstringerarrayv)
-       fmt.Printf("%T", notstringerarrayv)
-       fmt.Printf("%d", new(fmt.Formatter))
-       fmt.Printf("%*%", 2)               // Ridiculous but allowed.
-       fmt.Printf("%s", interface{}(nil)) // Nothing useful we can say.
-
-       fmt.Printf("%g", 1+2i)
-       fmt.Printf("%#e %#E %#f %#F %#g %#G", 1.2, 1.2, 1.2, 1.2, 1.2, 1.2) // OK since Go 1.9
-       // Some bad format/argTypes
-       fmt.Printf("%b", "hi")                      // ERROR "Printf format %b has arg \x22hi\x22 of wrong type string"
-       fmt.Printf("%t", c)                         // ERROR "Printf format %t has arg c of wrong type complex64"
-       fmt.Printf("%t", 1+2i)                      // ERROR "Printf format %t has arg 1 \+ 2i of wrong type complex128"
-       fmt.Printf("%c", 2.3)                       // ERROR "Printf format %c has arg 2.3 of wrong type float64"
-       fmt.Printf("%d", 2.3)                       // ERROR "Printf format %d has arg 2.3 of wrong type float64"
-       fmt.Printf("%e", "hi")                      // ERROR "Printf format %e has arg \x22hi\x22 of wrong type string"
-       fmt.Printf("%E", true)                      // ERROR "Printf format %E has arg true of wrong type bool"
-       fmt.Printf("%f", "hi")                      // ERROR "Printf format %f has arg \x22hi\x22 of wrong type string"
-       fmt.Printf("%F", 'x')                       // ERROR "Printf format %F has arg 'x' of wrong type rune"
-       fmt.Printf("%g", "hi")                      // ERROR "Printf format %g has arg \x22hi\x22 of wrong type string"
-       fmt.Printf("%g", imap)                      // ERROR "Printf format %g has arg imap of wrong type map\[int\]int"
-       fmt.Printf("%G", i)                         // ERROR "Printf format %G has arg i of wrong type int"
-       fmt.Printf("%o", x)                         // ERROR "Printf format %o has arg x of wrong type float64"
-       fmt.Printf("%p", nil)                       // ERROR "Printf format %p has arg nil of wrong type untyped nil"
-       fmt.Printf("%p", 23)                        // ERROR "Printf format %p has arg 23 of wrong type int"
-       fmt.Printf("%q", x)                         // ERROR "Printf format %q has arg x of wrong type float64"
-       fmt.Printf("%s", b)                         // ERROR "Printf format %s has arg b of wrong type bool"
-       fmt.Printf("%s", byte(65))                  // ERROR "Printf format %s has arg byte\(65\) of wrong type byte"
-       fmt.Printf("%t", 23)                        // ERROR "Printf format %t has arg 23 of wrong type int"
-       fmt.Printf("%U", x)                         // ERROR "Printf format %U has arg x of wrong type float64"
-       fmt.Printf("%x", nil)                       // ERROR "Printf format %x has arg nil of wrong type untyped nil"
-       fmt.Printf("%X", 2.3)                       // ERROR "Printf format %X has arg 2.3 of wrong type float64"
-       fmt.Printf("%s", stringerv)                 // ERROR "Printf format %s has arg stringerv of wrong type print.ptrStringer"
-       fmt.Printf("%t", stringerv)                 // ERROR "Printf format %t has arg stringerv of wrong type print.ptrStringer"
-       fmt.Printf("%s", embeddedStringerv)         // ERROR "Printf format %s has arg embeddedStringerv of wrong type print.embeddedStringer"
-       fmt.Printf("%t", embeddedStringerv)         // ERROR "Printf format %t has arg embeddedStringerv of wrong type print.embeddedStringer"
-       fmt.Printf("%q", notstringerv)              // ERROR "Printf format %q has arg notstringerv of wrong type print.notstringer"
-       fmt.Printf("%t", notstringerv)              // ERROR "Printf format %t has arg notstringerv of wrong type print.notstringer"
-       fmt.Printf("%t", stringerarrayv)            // ERROR "Printf format %t has arg stringerarrayv of wrong type print.stringerarray"
-       fmt.Printf("%t", notstringerarrayv)         // ERROR "Printf format %t has arg notstringerarrayv of wrong type print.notstringerarray"
-       fmt.Printf("%q", notstringerarrayv)         // ERROR "Printf format %q has arg notstringerarrayv of wrong type print.notstringerarray"
-       fmt.Printf("%d", BoolFormatter(true))       // ERROR "Printf format %d has arg BoolFormatter\(true\) of wrong type print.BoolFormatter"
-       fmt.Printf("%z", FormatterVal(true))        // correct (the type is responsible for formatting)
-       fmt.Printf("%d", FormatterVal(true))        // correct (the type is responsible for formatting)
-       fmt.Printf("%s", nonemptyinterface)         // correct (the type is responsible for formatting)
-       fmt.Printf("%.*s %d %6g", 3, "hi", 23, 'x') // ERROR "Printf format %6g has arg 'x' of wrong type rune"
-       fmt.Println()                               // not an error
-       fmt.Println("%s", "hi")                     // ERROR "Println call has possible formatting directive %s"
-       fmt.Println("%v", "hi")                     // ERROR "Println call has possible formatting directive %v"
-       fmt.Println("%T", "hi")                     // ERROR "Println call has possible formatting directive %T"
-       fmt.Println("0.0%")                         // correct (trailing % couldn't be a formatting directive)
-       fmt.Printf("%s", "hi", 3)                   // ERROR "Printf call needs 1 arg but has 2 args"
-       _ = fmt.Sprintf("%"+("s"), "hi", 3)         // ERROR "Sprintf call needs 1 arg but has 2 args"
-       fmt.Printf("%s%%%d", "hi", 3)               // correct
-       fmt.Printf("%08s", "woo")                   // correct
-       fmt.Printf("% 8s", "woo")                   // correct
-       fmt.Printf("%.*d", 3, 3)                    // correct
-       fmt.Printf("%.*d x", 3, 3, 3, 3)            // ERROR "Printf call needs 2 args but has 4 args"
-       fmt.Printf("%.*d x", "hi", 3)               // ERROR "Printf format %.*d uses non-int \x22hi\x22 as argument of \*"
-       fmt.Printf("%.*d x", i, 3)                  // correct
-       fmt.Printf("%.*d x", s, 3)                  // ERROR "Printf format %.\*d uses non-int s as argument of \*"
-       fmt.Printf("%*% x", 0.22)                   // ERROR "Printf format %\*% uses non-int 0.22 as argument of \*"
-       fmt.Printf("%q %q", multi()...)             // ok
-       fmt.Printf("%#q", `blah`)                   // ok
-       // printf("now is the time", "buddy")          // no error "printf call has arguments but no formatting directives"
-       Printf("now is the time", "buddy") // ERROR "Printf call has arguments but no formatting directives"
-       Printf("hi")                       // ok
-       const format = "%s %s\n"
-       Printf(format, "hi", "there")
-       Printf(format, "hi")              // ERROR "Printf format %s reads arg #2, but call has 1 arg$"
-       Printf("%s %d %.3v %q", "str", 4) // ERROR "Printf format %.3v reads arg #3, but call has 2 args"
-       f := new(ptrStringer)
-       f.Warn(0, "%s", "hello", 3)           // ERROR "Warn call has possible formatting directive %s"
-       f.Warnf(0, "%s", "hello", 3)          // ERROR "Warnf call needs 1 arg but has 2 args"
-       f.Warnf(0, "%r", "hello")             // ERROR "Warnf format %r has unknown verb r"
-       f.Warnf(0, "%#s", "hello")            // ERROR "Warnf format %#s has unrecognized flag #"
-       f.Warn2(0, "%s", "hello", 3)          // ERROR "Warn2 call has possible formatting directive %s"
-       f.Warnf2(0, "%s", "hello", 3)         // ERROR "Warnf2 call needs 1 arg but has 2 args"
-       f.Warnf2(0, "%r", "hello")            // ERROR "Warnf2 format %r has unknown verb r"
-       f.Warnf2(0, "%#s", "hello")           // ERROR "Warnf2 format %#s has unrecognized flag #"
-       f.Wrap(0, "%s", "hello", 3)           // ERROR "Wrap call has possible formatting directive %s"
-       f.Wrapf(0, "%s", "hello", 3)          // ERROR "Wrapf call needs 1 arg but has 2 args"
-       f.Wrapf(0, "%r", "hello")             // ERROR "Wrapf format %r has unknown verb r"
-       f.Wrapf(0, "%#s", "hello")            // ERROR "Wrapf format %#s has unrecognized flag #"
-       f.Wrap2(0, "%s", "hello", 3)          // ERROR "Wrap2 call has possible formatting directive %s"
-       f.Wrapf2(0, "%s", "hello", 3)         // ERROR "Wrapf2 call needs 1 arg but has 2 args"
-       f.Wrapf2(0, "%r", "hello")            // ERROR "Wrapf2 format %r has unknown verb r"
-       f.Wrapf2(0, "%#s", "hello")           // ERROR "Wrapf2 format %#s has unrecognized flag #"
-       fmt.Printf("%#s", FormatterVal(true)) // correct (the type is responsible for formatting)
-       Printf("d%", 2)                       // ERROR "Printf format % is missing verb at end of string"
-       Printf("%d", percentDV)
-       Printf("%d", &percentDV)
-       Printf("%d", notPercentDV)  // ERROR "Printf format %d has arg notPercentDV of wrong type print.notPercentDStruct"
-       Printf("%d", &notPercentDV) // ERROR "Printf format %d has arg &notPercentDV of wrong type \*print.notPercentDStruct"
-       Printf("%p", &notPercentDV) // Works regardless: we print it as a pointer.
-       Printf("%q", &percentDV)    // ERROR "Printf format %q has arg &percentDV of wrong type \*print.percentDStruct"
-       Printf("%s", percentSV)
-       Printf("%s", &percentSV)
-       // Good argument reorderings.
-       Printf("%[1]d", 3)
-       Printf("%[1]*d", 3, 1)
-       Printf("%[2]*[1]d", 1, 3)
-       Printf("%[2]*.[1]*[3]d", 2, 3, 4)
-       fmt.Fprintf(os.Stderr, "%[2]*.[1]*[3]d", 2, 3, 4) // Use Fprintf to make sure we count arguments correctly.
-       // Bad argument reorderings.
-       Printf("%[xd", 3)                      // ERROR "Printf format %\[xd is missing closing \]"
-       Printf("%[x]d x", 3)                   // ERROR "Printf format has invalid argument index \[x\]"
-       Printf("%[3]*s x", "hi", 2)            // ERROR "Printf format has invalid argument index \[3\]"
-       _ = fmt.Sprintf("%[3]d x", 2)          // ERROR "Sprintf format has invalid argument index \[3\]"
-       Printf("%[2]*.[1]*[3]d x", 2, "hi", 4) // ERROR "Printf format %\[2]\*\.\[1\]\*\[3\]d uses non-int \x22hi\x22 as argument of \*"
-       Printf("%[0]s x", "arg1")              // ERROR "Printf format has invalid argument index \[0\]"
-       Printf("%[0]d x", 1)                   // ERROR "Printf format has invalid argument index \[0\]"
-       // Something that satisfies the error interface.
-       var e error
-       fmt.Println(e.Error()) // ok
-       // Something that looks like an error interface but isn't, such as the (*T).Error method
-       // in the testing package.
-       var et1 *testing.T
-       et1.Error()        // ok
-       et1.Error("hi")    // ok
-       et1.Error("%d", 3) // ERROR "Error call has possible formatting directive %d"
-       var et3 errorTest3
-       et3.Error() // ok, not an error method.
-       var et4 errorTest4
-       et4.Error() // ok, not an error method.
-       var et5 errorTest5
-       et5.error() // ok, not an error method.
-       // Interfaces can be used with any verb.
-       var iface interface {
-               ToTheMadness() bool // Method ToTheMadness usually returns false
-       }
-       fmt.Printf("%f", iface) // ok: fmt treats interfaces as transparent and iface may well have a float concrete type
-       // Can't print a function.
-       Printf("%d", someFunction) // ERROR "Printf format %d arg someFunction is a func value, not called"
-       Printf("%v", someFunction) // ERROR "Printf format %v arg someFunction is a func value, not called"
-       Println(someFunction)      // ERROR "Println arg someFunction is a func value, not called"
-       Printf("%p", someFunction) // ok: maybe someone wants to see the pointer
-       Printf("%T", someFunction) // ok: maybe someone wants to see the type
-       // Bug: used to recur forever.
-       Printf("%p %x", recursiveStructV, recursiveStructV.next)
-       Printf("%p %x", recursiveStruct1V, recursiveStruct1V.next) // ERROR "Printf format %x has arg recursiveStruct1V\.next of wrong type \*print\.RecursiveStruct2"
-       Printf("%p %x", recursiveSliceV, recursiveSliceV)
-       Printf("%p %x", recursiveMapV, recursiveMapV)
-       // Special handling for Log.
-       math.Log(3) // OK
-       var t *testing.T
-       t.Log("%d", 3) // ERROR "Log call has possible formatting directive %d"
-       t.Logf("%d", 3)
-       t.Logf("%d", "hi") // ERROR "Logf format %d has arg \x22hi\x22 of wrong type string"
-
-       Errorf(1, "%d", 3)    // OK
-       Errorf(1, "%d", "hi") // ERROR "Errorf format %d has arg \x22hi\x22 of wrong type string"
-
-       // Multiple string arguments before variadic args
-       errorf("WARNING", "foobar")            // OK
-       errorf("INFO", "s=%s, n=%d", "foo", 1) // OK
-       errorf("ERROR", "%d")                  // ERROR "errorf format %d reads arg #1, but call has 0 args"
-
-       // Printf from external package
-       // externalprintf.Printf("%d", 42) // OK
-       // externalprintf.Printf("foobar") // OK
-       // level := 123
-       // externalprintf.Logf(level, "%d", 42)                        // OK
-       // externalprintf.Errorf(level, level, "foo %q bar", "foobar") // OK
-       // externalprintf.Logf(level, "%d")                            // no error "Logf format %d reads arg #1, but call has 0 args"
-       // var formatStr = "%s %s"
-       // externalprintf.Sprintf(formatStr, "a", "b")     // OK
-       // externalprintf.Logf(level, formatStr, "a", "b") // OK
-
-       // user-defined Println-like functions
-       ss := &someStruct{}
-       ss.Log(someFunction, "foo")          // OK
-       ss.Error(someFunction, someFunction) // OK
-       ss.Println()                         // OK
-       ss.Println(1.234, "foo")             // OK
-       ss.Println(1, someFunction)          // no error "Println arg someFunction is a func value, not called"
-       ss.log(someFunction)                 // OK
-       ss.log(someFunction, "bar", 1.33)    // OK
-       ss.log(someFunction, someFunction)   // no error "log arg someFunction is a func value, not called"
-
-       // indexed arguments
-       Printf("%d %[3]d %d %[2]d x", 1, 2, 3, 4)             // OK
-       Printf("%d %[0]d %d %[2]d x", 1, 2, 3, 4)             // ERROR "Printf format has invalid argument index \[0\]"
-       Printf("%d %[3]d %d %[-2]d x", 1, 2, 3, 4)            // ERROR "Printf format has invalid argument index \[-2\]"
-       Printf("%d %[3]d %d %[2234234234234]d x", 1, 2, 3, 4) // ERROR "Printf format has invalid argument index \[2234234234234\]"
-       Printf("%d %[3]d %-10d %[2]d x", 1, 2, 3)             // ERROR "Printf format %-10d reads arg #4, but call has 3 args"
-       Printf("%[1][3]d x", 1, 2)                            // ERROR "Printf format %\[1\]\[ has unknown verb \["
-       Printf("%[1]d x", 1, 2)                               // OK
-       Printf("%d %[3]d %d %[2]d x", 1, 2, 3, 4, 5)          // OK
-
-       // wrote Println but meant Fprintln
-       Printf("%p\n", os.Stdout)   // OK
-       Println(os.Stdout, "hello") // ERROR "Println does not take io.Writer but has first arg os.Stdout"
-
-       Printf(someString(), "hello") // OK
-
-       // Printf wrappers in package log should be detected automatically
-       logpkg.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
-       logpkg.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
-       logpkg.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
-       logpkg.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
-       logpkg.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
-       logpkg.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
-       logpkg.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
-       logpkg.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
-       logpkg.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
-
-       // Methods too.
-       var l *logpkg.Logger
-       l.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
-       l.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
-       l.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
-       l.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
-       l.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
-       l.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
-       l.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
-       l.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
-       l.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
-
-       // Issue 26486
-       dbg("", 1) // no error "call has arguments but no formatting directive"
-}
-
-func someString() string { return "X" }
-
-type someStruct struct{}
-
-// Log is non-variadic user-define Println-like function.
-// Calls to this func must be skipped when checking
-// for Println-like arguments.
-func (ss *someStruct) Log(f func(), s string) {}
-
-// Error is variadic user-define Println-like function.
-// Calls to this func mustn't be checked for Println-like arguments,
-// since variadic arguments type isn't interface{}.
-func (ss *someStruct) Error(args ...func()) {}
-
-// Println is variadic user-defined Println-like function.
-// Calls to this func must be checked for Println-like arguments.
-func (ss *someStruct) Println(args ...interface{}) {}
-
-// log is variadic user-defined Println-like function.
-// Calls to this func must be checked for Println-like arguments.
-func (ss *someStruct) log(f func(), args ...interface{}) {}
-
-// A function we use as a function value; it has no other purpose.
-func someFunction() {}
-
-// Printf is used by the test so we must declare it.
-func Printf(format string, args ...interface{}) {
-       fmt.Printf(format, args...)
-}
-
-// Println is used by the test so we must declare it.
-func Println(args ...interface{}) {
-       fmt.Println(args...)
-}
-
-// printf is used by the test so we must declare it.
-func printf(format string, args ...interface{}) {
-       fmt.Printf(format, args...)
-}
-
-// Errorf is used by the test for a case in which the first parameter
-// is not a format string.
-func Errorf(i int, format string, args ...interface{}) {
-       _ = fmt.Errorf(format, args...)
-}
-
-// errorf is used by the test for a case in which the function accepts multiple
-// string parameters before variadic arguments
-func errorf(level, format string, args ...interface{}) {
-       _ = fmt.Errorf(format, args...)
-}
-
-// multi is used by the test.
-func multi() []interface{} {
-       panic("don't call - testing only")
-}
-
-type stringer int
-
-func (stringer) String() string { return "string" }
-
-type ptrStringer float64
-
-var stringerv ptrStringer
-
-func (*ptrStringer) String() string {
-       return "string"
-}
-
-func (p *ptrStringer) Warn2(x int, args ...interface{}) string {
-       return p.Warn(x, args...)
-}
-
-func (p *ptrStringer) Warnf2(x int, format string, args ...interface{}) string {
-       return p.Warnf(x, format, args...)
-}
-
-func (*ptrStringer) Warn(x int, args ...interface{}) string {
-       return "warn"
-}
-
-func (*ptrStringer) Warnf(x int, format string, args ...interface{}) string {
-       return "warnf"
-}
-
-func (p *ptrStringer) Wrap2(x int, args ...interface{}) string {
-       return p.Wrap(x, args...)
-}
-
-func (p *ptrStringer) Wrapf2(x int, format string, args ...interface{}) string {
-       return p.Wrapf(x, format, args...)
-}
-
-func (*ptrStringer) Wrap(x int, args ...interface{}) string {
-       return fmt.Sprint(args...)
-}
-
-func (*ptrStringer) Wrapf(x int, format string, args ...interface{}) string {
-       return fmt.Sprintf(format, args...)
-}
-
-func (*ptrStringer) BadWrap(x int, args ...interface{}) string {
-       return fmt.Sprint(args) // ERROR "missing ... in args forwarded to print-like function"
-}
-
-func (*ptrStringer) BadWrapf(x int, format string, args ...interface{}) string {
-       return fmt.Sprintf(format, args) // ERROR "missing ... in args forwarded to printf-like function"
-}
-
-func (*ptrStringer) WrapfFalsePositive(x int, arg1 string, arg2 ...interface{}) string {
-       return fmt.Sprintf("%s %v", arg1, arg2)
-}
-
-type embeddedStringer struct {
-       foo string
-       ptrStringer
-       bar int
-}
-
-var embeddedStringerv embeddedStringer
-
-type notstringer struct {
-       f float64
-}
-
-var notstringerv notstringer
-
-type stringerarray [4]float64
-
-func (stringerarray) String() string {
-       return "string"
-}
-
-var stringerarrayv stringerarray
-
-type notstringerarray [4]float64
-
-var notstringerarrayv notstringerarray
-
-var nonemptyinterface = interface {
-       f()
-}(nil)
-
-// A data type we can print with "%d".
-type percentDStruct struct {
-       a int
-       b []byte
-       c *float64
-}
-
-var percentDV percentDStruct
-
-// A data type we cannot print correctly with "%d".
-type notPercentDStruct struct {
-       a int
-       b []byte
-       c bool
-}
-
-var notPercentDV notPercentDStruct
-
-// A data type we can print with "%s".
-type percentSStruct struct {
-       a string
-       b []byte
-       C stringerarray
-}
-
-var percentSV percentSStruct
-
-type recursiveStringer int
-
-func (s recursiveStringer) String() string {
-       _ = fmt.Sprintf("%d", s)
-       _ = fmt.Sprintf("%#v", s)
-       _ = fmt.Sprintf("%v", s)  // ERROR "Sprintf format %v with arg s causes recursive String method call"
-       _ = fmt.Sprintf("%v", &s) // ERROR "Sprintf format %v with arg &s causes recursive String method call"
-       _ = fmt.Sprintf("%T", s)  // ok; does not recursively call String
-       return fmt.Sprintln(s)    // ERROR "Sprintln arg s causes recursive call to String method"
-}
-
-type recursivePtrStringer int
-
-func (p *recursivePtrStringer) String() string {
-       _ = fmt.Sprintf("%v", *p)
-       _ = fmt.Sprint(&p)     // ok; prints address
-       return fmt.Sprintln(p) // ERROR "Sprintln arg p causes recursive call to String method"
-}
-
-type BoolFormatter bool
-
-func (*BoolFormatter) Format(fmt.State, rune) {
-}
-
-// Formatter with value receiver
-type FormatterVal bool
-
-func (FormatterVal) Format(fmt.State, rune) {
-}
-
-type RecursiveSlice []RecursiveSlice
-
-var recursiveSliceV = &RecursiveSlice{}
-
-type RecursiveMap map[int]RecursiveMap
-
-var recursiveMapV = make(RecursiveMap)
-
-type RecursiveStruct struct {
-       next *RecursiveStruct
-}
-
-var recursiveStructV = &RecursiveStruct{}
-
-type RecursiveStruct1 struct {
-       next *RecursiveStruct2
-}
-
-type RecursiveStruct2 struct {
-       next *RecursiveStruct1
-}
-
-var recursiveStruct1V = &RecursiveStruct1{}
-
-type unexportedInterface struct {
-       f interface{}
-}
-
-// Issue 17798: unexported ptrStringer cannot be formatted.
-type unexportedStringer struct {
-       t ptrStringer
-}
-type unexportedStringerOtherFields struct {
-       s string
-       t ptrStringer
-       S string
-}
-
-// Issue 17798: unexported error cannot be formatted.
-type unexportedError struct {
-       e error
-}
-type unexportedErrorOtherFields struct {
-       s string
-       e error
-       S string
-}
-
-type errorer struct{}
-
-func (e errorer) Error() string { return "errorer" }
-
-type unexportedCustomError struct {
-       e errorer
-}
-
-type errorInterface interface {
-       error
-       ExtraMethod()
-}
-
-type unexportedErrorInterface struct {
-       e errorInterface
-}
-
-func UnexportedStringerOrError() {
-       fmt.Printf("%s", unexportedInterface{"foo"}) // ok; prints {foo}
-       fmt.Printf("%s", unexportedInterface{3})     // ok; we can't see the problem
-
-       us := unexportedStringer{}
-       fmt.Printf("%s", us)  // ERROR "Printf format %s has arg us of wrong type print.unexportedStringer"
-       fmt.Printf("%s", &us) // ERROR "Printf format %s has arg &us of wrong type [*]print.unexportedStringer"
-
-       usf := unexportedStringerOtherFields{
-               s: "foo",
-               S: "bar",
-       }
-       fmt.Printf("%s", usf)  // ERROR "Printf format %s has arg usf of wrong type print.unexportedStringerOtherFields"
-       fmt.Printf("%s", &usf) // ERROR "Printf format %s has arg &usf of wrong type [*]print.unexportedStringerOtherFields"
-
-       ue := unexportedError{
-               e: &errorer{},
-       }
-       fmt.Printf("%s", ue)  // ERROR "Printf format %s has arg ue of wrong type print.unexportedError"
-       fmt.Printf("%s", &ue) // ERROR "Printf format %s has arg &ue of wrong type [*]print.unexportedError"
-
-       uef := unexportedErrorOtherFields{
-               s: "foo",
-               e: &errorer{},
-               S: "bar",
-       }
-       fmt.Printf("%s", uef)  // ERROR "Printf format %s has arg uef of wrong type print.unexportedErrorOtherFields"
-       fmt.Printf("%s", &uef) // ERROR "Printf format %s has arg &uef of wrong type [*]print.unexportedErrorOtherFields"
-
-       uce := unexportedCustomError{
-               e: errorer{},
-       }
-       fmt.Printf("%s", uce) // ERROR "Printf format %s has arg uce of wrong type print.unexportedCustomError"
-
-       uei := unexportedErrorInterface{}
-       fmt.Printf("%s", uei)       // ERROR "Printf format %s has arg uei of wrong type print.unexportedErrorInterface"
-       fmt.Println("foo\n", "bar") // not an error
-
-       fmt.Println("foo\n")  // ERROR "Println arg list ends with redundant newline"
-       fmt.Println("foo\\n") // not an error
-       fmt.Println(`foo\n`)  // not an error
-
-       intSlice := []int{3, 4}
-       fmt.Printf("%s", intSlice) // ERROR "Printf format %s has arg intSlice of wrong type \[\]int"
-       nonStringerArray := [1]unexportedStringer{{}}
-       fmt.Printf("%s", nonStringerArray)  // ERROR "Printf format %s has arg nonStringerArray of wrong type \[1\]print.unexportedStringer"
-       fmt.Printf("%s", []stringer{3, 4})  // not an error
-       fmt.Printf("%s", [2]stringer{3, 4}) // not an error
-}
-
-// TODO: Disable complaint about '0' for Go 1.10. To be fixed properly in 1.11.
-// See issues 23598 and 23605.
-func DisableErrorForFlag0() {
-       fmt.Printf("%0t", true)
-}
-
-// Issue 26486.
-func dbg(format string, args ...interface{}) {
-       if format == "" {
-               format = "%v"
-       }
-       fmt.Printf(format, args...)
-}
-
-func PointersToCompoundTypes() {
-       stringSlice := []string{"a", "b"}
-       fmt.Printf("%s", &stringSlice) // not an error
-
-       intSlice := []int{3, 4}
-       fmt.Printf("%s", &intSlice) // ERROR "Printf format %s has arg &intSlice of wrong type \*\[\]int"
-
-       stringArray := [2]string{"a", "b"}
-       fmt.Printf("%s", &stringArray) // not an error
-
-       intArray := [2]int{3, 4}
-       fmt.Printf("%s", &intArray) // ERROR "Printf format %s has arg &intArray of wrong type \*\[2\]int"
-
-       stringStruct := struct{ F string }{"foo"}
-       fmt.Printf("%s", &stringStruct) // not an error
-
-       intStruct := struct{ F int }{3}
-       fmt.Printf("%s", &intStruct) // ERROR "Printf format %s has arg &intStruct of wrong type \*struct{F int}"
-
-       stringMap := map[string]string{"foo": "bar"}
-       fmt.Printf("%s", &stringMap) // not an error
-
-       intMap := map[int]int{3: 4}
-       fmt.Printf("%s", &intMap) // ERROR "Printf format %s has arg &intMap of wrong type \*map\[int\]int"
-
-       type T2 struct {
-               X string
-       }
-       type T1 struct {
-               X *T2
-       }
-       fmt.Printf("%s\n", T1{&T2{"x"}}) // ERROR "Printf format %s has arg T1{&T2{.x.}} of wrong type print\.T1"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/rangeloop/rangeloop.go b/libgo/go/cmd/vet/testdata/src/rangeloop/rangeloop.go
deleted file mode 100644 (file)
index 4e21564..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the rangeloop checker.
-
-package rangeloop
-
-func RangeLoopTests() {
-       var s []int
-       for i, v := range s {
-               go func() {
-                       println(i) // ERROR "loop variable i captured by func literal"
-                       println(v) // ERROR "loop variable v captured by func literal"
-               }()
-       }
-}
diff --git a/libgo/go/cmd/vet/testdata/src/shift/shift.go b/libgo/go/cmd/vet/testdata/src/shift/shift.go
deleted file mode 100644 (file)
index 6b7a5ac..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the suspicious shift checker.
-
-package shift
-
-func ShiftTest() {
-       var i8 int8
-       _ = i8 << 7
-       _ = (i8 + 1) << 8 // ERROR ".i8 . 1. .8 bits. too small for shift of 8"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/structtag/structtag.go b/libgo/go/cmd/vet/testdata/src/structtag/structtag.go
deleted file mode 100644 (file)
index cbcc453..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the test for canonical struct tags.
-
-package structtag
-
-type StructTagTest struct {
-       A int "hello" // ERROR "`hello` not compatible with reflect.StructTag.Get: bad syntax for struct tag pair"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/tagtest/file1.go b/libgo/go/cmd/vet/testdata/src/tagtest/file1.go
deleted file mode 100644 (file)
index 47fe3c8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build testtag
-
-package main
-
-import "fmt"
-
-func main() {
-       fmt.Printf("%s", 0)
-}
diff --git a/libgo/go/cmd/vet/testdata/src/tagtest/file2.go b/libgo/go/cmd/vet/testdata/src/tagtest/file2.go
deleted file mode 100644 (file)
index 1f45efc..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !testtag
-
-package main
-
-import "fmt"
-
-func main() {
-       fmt.Printf("%s", 0)
-}
diff --git a/libgo/go/cmd/vet/testdata/src/testingpkg/tests.go b/libgo/go/cmd/vet/testdata/src/testingpkg/tests.go
deleted file mode 100644 (file)
index 69d29d3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-package testdata
diff --git a/libgo/go/cmd/vet/testdata/src/testingpkg/tests_test.go b/libgo/go/cmd/vet/testdata/src/testingpkg/tests_test.go
deleted file mode 100644 (file)
index 09bb98d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-package testdata
-
-func Example_BadSuffix() {} // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix"
diff --git a/libgo/go/cmd/vet/testdata/src/unmarshal/unmarshal.go b/libgo/go/cmd/vet/testdata/src/unmarshal/unmarshal.go
deleted file mode 100644 (file)
index b387bbb..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the unmarshal checker.
-
-package unmarshal
-
-import "encoding/json"
-
-func _() {
-       type t struct {
-               a int
-       }
-       var v t
-
-       json.Unmarshal([]byte{}, v) // ERROR "call of Unmarshal passes non-pointer as second argument"
-}
diff --git a/libgo/go/cmd/vet/testdata/src/unsafeptr/unsafeptr.go b/libgo/go/cmd/vet/testdata/src/unsafeptr/unsafeptr.go
deleted file mode 100644 (file)
index e9b866e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unsafeptr
-
-import "unsafe"
-
-func _() {
-       var x unsafe.Pointer
-       var y uintptr
-       x = unsafe.Pointer(y) // ERROR "possible misuse of unsafe.Pointer"
-       _ = x
-}
diff --git a/libgo/go/cmd/vet/testdata/src/unused/unused.go b/libgo/go/cmd/vet/testdata/src/unused/unused.go
deleted file mode 100644 (file)
index 1e83e90..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for the unusedresult checker.
-
-package unused
-
-import "fmt"
-
-func _() {
-       fmt.Errorf("") // ERROR "result of fmt.Errorf call not used"
-}
diff --git a/libgo/go/cmd/vet/testdata/structtag/structtag.go b/libgo/go/cmd/vet/testdata/structtag/structtag.go
new file mode 100644 (file)
index 0000000..cbcc453
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains the test for canonical struct tags.
+
+package structtag
+
+type StructTagTest struct {
+       A int "hello" // ERROR "`hello` not compatible with reflect.StructTag.Get: bad syntax for struct tag pair"
+}
diff --git a/libgo/go/cmd/vet/testdata/tagtest/file1.go b/libgo/go/cmd/vet/testdata/tagtest/file1.go
new file mode 100644 (file)
index 0000000..47fe3c8
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build testtag
+
+package main
+
+import "fmt"
+
+func main() {
+       fmt.Printf("%s", 0)
+}
diff --git a/libgo/go/cmd/vet/testdata/tagtest/file2.go b/libgo/go/cmd/vet/testdata/tagtest/file2.go
new file mode 100644 (file)
index 0000000..1f45efc
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !testtag
+
+package main
+
+import "fmt"
+
+func main() {
+       fmt.Printf("%s", 0)
+}
diff --git a/libgo/go/cmd/vet/testdata/testingpkg/tests.go b/libgo/go/cmd/vet/testdata/testingpkg/tests.go
new file mode 100644 (file)
index 0000000..69d29d3
--- /dev/null
@@ -0,0 +1 @@
+package testdata
diff --git a/libgo/go/cmd/vet/testdata/testingpkg/tests_test.go b/libgo/go/cmd/vet/testdata/testingpkg/tests_test.go
new file mode 100644 (file)
index 0000000..09bb98d
--- /dev/null
@@ -0,0 +1,3 @@
+package testdata
+
+func Example_BadSuffix() {} // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix"
diff --git a/libgo/go/cmd/vet/testdata/unmarshal/unmarshal.go b/libgo/go/cmd/vet/testdata/unmarshal/unmarshal.go
new file mode 100644 (file)
index 0000000..b387bbb
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the unmarshal checker.
+
+package unmarshal
+
+import "encoding/json"
+
+func _() {
+       type t struct {
+               a int
+       }
+       var v t
+
+       json.Unmarshal([]byte{}, v) // ERROR "call of Unmarshal passes non-pointer as second argument"
+}
diff --git a/libgo/go/cmd/vet/testdata/unsafeptr/unsafeptr.go b/libgo/go/cmd/vet/testdata/unsafeptr/unsafeptr.go
new file mode 100644 (file)
index 0000000..e9b866e
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package unsafeptr
+
+import "unsafe"
+
+func _() {
+       var x unsafe.Pointer
+       var y uintptr
+       x = unsafe.Pointer(y) // ERROR "possible misuse of unsafe.Pointer"
+       _ = x
+}
diff --git a/libgo/go/cmd/vet/testdata/unused/unused.go b/libgo/go/cmd/vet/testdata/unused/unused.go
new file mode 100644 (file)
index 0000000..1e83e90
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the unusedresult checker.
+
+package unused
+
+import "fmt"
+
+func _() {
+       fmt.Errorf("") // ERROR "result of fmt.Errorf call not used"
+}
index 1c7b8625f35a37e0f9f4f7824c785a824fbaa6c1..66732ad6f64442c54af06c53b8f2f0e1a8f0a372 100644 (file)
@@ -13,6 +13,7 @@ import (
        "log"
        "os"
        "os/exec"
+       "path"
        "path/filepath"
        "regexp"
        "runtime"
@@ -22,16 +23,25 @@ import (
        "testing"
 )
 
-const (
-       dataDir = "testdata"
-       binary  = "./testvet.exe"
-)
+const dataDir = "testdata"
+
+var binary string
 
 // We implement TestMain so remove the test binary when all is done.
 func TestMain(m *testing.M) {
-       result := m.Run()
-       os.Remove(binary)
-       os.Exit(result)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       dir, err := ioutil.TempDir("", "vet_test")
+       if err != nil {
+               fmt.Fprintln(os.Stderr, err)
+               return 1
+       }
+       defer os.RemoveAll(dir)
+       binary = filepath.Join(dir, "testvet.exe")
+
+       return m.Run()
 }
 
 var (
@@ -60,14 +70,9 @@ func Build(t *testing.T) {
        built = true
 }
 
-func vetCmd(t *testing.T, args ...string) *exec.Cmd {
-       cmd := exec.Command(testenv.GoToolPath(t), "vet", "-vettool="+binary)
-       cmd.Args = append(cmd.Args, args...)
-       testdata, err := filepath.Abs("testdata")
-       if err != nil {
-               t.Fatal(err)
-       }
-       cmd.Env = append(os.Environ(), "GOPATH="+testdata)
+func vetCmd(t *testing.T, arg, pkg string) *exec.Cmd {
+       cmd := exec.Command(testenv.GoToolPath(t), "vet", "-vettool="+binary, arg, path.Join("cmd/vet/testdata", pkg))
+       cmd.Env = os.Environ()
        return cmd
 }
 
@@ -117,7 +122,7 @@ func TestVet(t *testing.T) {
                                cmd.Env = append(cmd.Env, "GOOS=linux", "GOARCH=amd64")
                        }
 
-                       dir := filepath.Join("testdata/src", pkg)
+                       dir := filepath.Join("testdata", pkg)
                        gos, err := filepath.Glob(filepath.Join(dir, "*.go"))
                        if err != nil {
                                t.Fatal(err)
index 034040e56decbf465e177c3754cfa53a3bf0d22c..4288f62a8d1f46bb3c4d094619d7993f79731ba8 100644 (file)
@@ -161,7 +161,7 @@ func TestVeryLongSparseChunk(t *testing.T) {
                t.Errorf("NewWriter: %v", err)
                return
        }
-       if _, err = io.Copy(w, &sparseReader{l: 23E8}); err != nil {
+       if _, err = io.Copy(w, &sparseReader{l: 23e8}); err != nil {
                t.Errorf("Compress failed: %v", err)
                return
        }
@@ -345,6 +345,9 @@ func testToFromWithLimit(t *testing.T, input []byte, name string, limit [11]int)
 func TestDeflateInflate(t *testing.T) {
        t.Parallel()
        for i, h := range deflateInflateTests {
+               if testing.Short() && len(h.in) > 10000 {
+                       continue
+               }
                testToFromWithLimit(t, h.in, fmt.Sprintf("#%d", i), [11]int{})
        }
 }
@@ -591,6 +594,9 @@ func TestBestSpeed(t *testing.T) {
        }
 
        for i, tc := range testCases {
+               if i >= 3 && testing.Short() {
+                       break
+               }
                for _, firstN := range []int{1, 65534, 65535, 65536, 65537, 131072} {
                        tc[0] = firstN
                outer:
index f42a921e674b283904ef1032d20f0ec7ba7bd006..3e19061f8b57e5306612c01493cc1946eae7cf50 100644 (file)
@@ -609,10 +609,10 @@ func (w *huffmanBitWriter) writeTokens(tokens []token, leCodes, oeCodes []hcode)
 var huffOffset *huffmanEncoder
 
 func init() {
-       w := newHuffmanBitWriter(nil)
-       w.offsetFreq[0] = 1
+       offsetFreq := make([]int32, offsetCodeCount)
+       offsetFreq[0] = 1
        huffOffset = newHuffmanEncoder(offsetCodeCount)
-       huffOffset.generate(w.offsetFreq, 15)
+       huffOffset.generate(offsetFreq, 15)
 }
 
 // writeBlockHuff encodes a block of bytes as either
index 85d52e85009cf081c7357349d07eb21cf78c5e71..924bce10b7c0cb1a901f47255afea99efcfc298a 100644 (file)
@@ -126,8 +126,8 @@ func (z *Reader) Reset(r io.Reader) error {
 // can be useful when reading file formats that distinguish individual gzip
 // data streams or mix gzip data streams with other data streams.
 // In this mode, when the Reader reaches the end of the data stream,
-// Read returns io.EOF. If the underlying reader implements io.ByteReader,
-// it will be left positioned just after the gzip stream.
+// Read returns io.EOF. The underlying reader must implement io.ByteReader
+// in order to be left positioned just after the gzip stream.
 // To start the next stream, call z.Reset(r) followed by z.Multistream(false).
 // If there is no next stream, z.Reset(r) will return io.EOF.
 func (z *Reader) Multistream(ok bool) {
index e16aba1572d190e05c2e38b55c99f504e99904a1..f18c5cb45475b98401df080f79a193e1320784a6 100644 (file)
@@ -214,6 +214,9 @@ func TestConcat(t *testing.T) {
        w.Close()
 
        r, err := NewReader(&buf)
+       if err != nil {
+               t.Fatal(err)
+       }
        data, err := ioutil.ReadAll(r)
        if string(data) != "hello world\n" || err != nil {
                t.Fatalf("ReadAll = %q, %v, want %q, nil", data, err, "hello world")
index 552f0e24b55b964635c24a147c40c59d4b1d5522..41d18abf8b6b1c745cb280f7fd2a241340739a73 100644 (file)
@@ -179,7 +179,7 @@ func TestLink2(t *testing.T) {
 func TestLink3(t *testing.T) {
        var r Ring
        n := 1
-       for i := 1; i < 100; i++ {
+       for i := 1; i < 10; i++ {
                n += i
                verify(t, r.Link(New(i)), n, -1)
        }
index 21a40d59477b4bc3277b4a2a036c9cb9e9d209b0..05d01d0294adaf9c99d0cd520e621427213821e4 100644 (file)
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Package context defines the Context type, which carries deadlines,
-// cancelation signals, and other request-scoped values across API boundaries
+// cancellation signals, and other request-scoped values across API boundaries
 // and between processes.
 //
 // Incoming requests to a server should create a Context, and outgoing
@@ -49,13 +49,13 @@ package context
 
 import (
        "errors"
-       "fmt"
-       "reflect"
+       "internal/oserror"
+       "internal/reflectlite"
        "sync"
        "time"
 )
 
-// A Context carries a deadline, a cancelation signal, and other values across
+// A Context carries a deadline, a cancellation signal, and other values across
 // API boundaries.
 //
 // Context's methods may be called by multiple goroutines simultaneously.
@@ -93,7 +93,7 @@ type Context interface {
        //  }
        //
        // See https://blog.golang.org/pipelines for more examples of how to use
-       // a Done channel for cancelation.
+       // a Done channel for cancellation.
        Done() <-chan struct{}
 
        // If Done is not yet closed, Err returns nil.
@@ -163,6 +163,9 @@ type deadlineExceededError struct{}
 func (deadlineExceededError) Error() string   { return "context deadline exceeded" }
 func (deadlineExceededError) Timeout() bool   { return true }
 func (deadlineExceededError) Temporary() bool { return true }
+func (deadlineExceededError) Is(target error) bool {
+       return target == oserror.ErrTimeout || target == oserror.ErrTemporary
+}
 
 // An emptyCtx is never canceled, has no values, and has no deadline. It is not
 // struct{}, since vars of this type must have distinct addresses.
@@ -217,6 +220,7 @@ func TODO() Context {
 
 // A CancelFunc tells an operation to abandon its work.
 // A CancelFunc does not wait for the work to stop.
+// A CancelFunc may be called by multiple goroutines simultaneously.
 // After the first call, subsequent calls to a CancelFunc do nothing.
 type CancelFunc func()
 
@@ -338,8 +342,19 @@ func (c *cancelCtx) Err() error {
        return err
 }
 
+type stringer interface {
+       String() string
+}
+
+func contextName(c Context) string {
+       if s, ok := c.(stringer); ok {
+               return s.String()
+       }
+       return reflectlite.TypeOf(c).String()
+}
+
 func (c *cancelCtx) String() string {
-       return fmt.Sprintf("%v.WithCancel", c.Context)
+       return contextName(c.Context) + ".WithCancel"
 }
 
 // cancel closes c.done, cancels each of c's children, and, if
@@ -420,7 +435,9 @@ func (c *timerCtx) Deadline() (deadline time.Time, ok bool) {
 }
 
 func (c *timerCtx) String() string {
-       return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, time.Until(c.deadline))
+       return contextName(c.cancelCtx.Context) + ".WithDeadline(" +
+               c.deadline.String() + " [" +
+               time.Until(c.deadline).String() + "])"
 }
 
 func (c *timerCtx) cancel(removeFromParent bool, err error) {
@@ -468,7 +485,7 @@ func WithValue(parent Context, key, val interface{}) Context {
        if key == nil {
                panic("nil key")
        }
-       if !reflect.TypeOf(key).Comparable() {
+       if !reflectlite.TypeOf(key).Comparable() {
                panic("key is not comparable")
        }
        return &valueCtx{parent, key, val}
@@ -481,8 +498,23 @@ type valueCtx struct {
        key, val interface{}
 }
 
+// stringify tries a bit to stringify v, without using fmt, since we don't
+// want context depending on the unicode tables. This is only used by
+// *valueCtx.String().
+func stringify(v interface{}) string {
+       switch s := v.(type) {
+       case stringer:
+               return s.String()
+       case string:
+               return s
+       }
+       return "<not Stringer>"
+}
+
 func (c *valueCtx) String() string {
-       return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val)
+       return contextName(c.Context) + ".WithValue(type " +
+               reflectlite.TypeOf(c.key).String() +
+               ", val " + stringify(c.val) + ")"
 }
 
 func (c *valueCtx) Value(key interface{}) interface{} {
index 548476f290d4976a5ac373034774db831b175e0d..96ad14627c34ea1844952a2f091b9227f4052f87 100644 (file)
@@ -5,8 +5,10 @@
 package context
 
 import (
+       "errors"
        "fmt"
        "math/rand"
+       "os"
        "runtime"
        "strings"
        "sync"
@@ -94,7 +96,7 @@ func XTestWithCancel(t testingT) {
        }
 
        cancel()
-       time.Sleep(100 * time.Millisecond) // let cancelation propagate
+       time.Sleep(100 * time.Millisecond) // let cancellation propagate
 
        for i, c := range contexts {
                select {
@@ -306,7 +308,7 @@ func XTestCanceledTimeout(t testingT) {
        o := otherContext{c}
        c, cancel := WithTimeout(o, 2*time.Second)
        cancel()
-       time.Sleep(100 * time.Millisecond) // let cancelation propagate
+       time.Sleep(100 * time.Millisecond) // let cancellation propagate
        select {
        case <-c.Done():
        default:
@@ -343,7 +345,7 @@ func XTestValues(t testingT) {
        c1 := WithValue(Background(), k1, "c1k1")
        check(c1, "c1", "c1k1", "", "")
 
-       if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want {
+       if got, want := fmt.Sprint(c1), `context.Background.WithValue(type context.key1, val c1k1)`; got != want {
                t.Errorf("c.String() = %q want %q", got, want)
        }
 
@@ -647,4 +649,7 @@ func XTestDeadlineExceededSupportsTimeout(t testingT) {
        if !i.Timeout() {
                t.Fatal("wrong value for timeout")
        }
+       if !errors.Is(DeadlineExceeded, os.ErrTimeout) {
+               t.Fatal("errors.Is(DeadlineExceeded, os.ErrTimeout) = false, want true")
+       }
 }
index 2b28b577042d6a8d71074d75591f70106a91d793..b91a8acef3a9588e7c786239000f3039c53dd57e 100644 (file)
@@ -59,7 +59,7 @@ func ExampleWithDeadline() {
        ctx, cancel := context.WithDeadline(context.Background(), d)
 
        // Even though ctx will be expired, it is good practice to call its
-       // cancelation function in any case. Failure to do so may keep the
+       // cancellation function in any case. Failure to do so may keep the
        // context and its parent alive longer than necessary.
        defer cancel()
 
index ecb716df015160e4376326b8ecf933a9fa40f8cc..72f62e69d3d39cb9a6c40df6f110ff8a27774f07 100644 (file)
@@ -81,7 +81,7 @@ func TestCFBVectors(t *testing.T) {
                plaintextCopy := make([]byte, len(ciphertext))
                cfbdec.XORKeyStream(plaintextCopy, ciphertext)
 
-               if !bytes.Equal(plaintextCopy, plaintextCopy) {
+               if !bytes.Equal(plaintextCopy, plaintext) {
                        t.Errorf("#%d: wrong plaintext: got %x, expected %x", i, plaintextCopy, plaintext)
                }
        }
index 24877efc367e24478c357ea38632abf051a2926d..4f829e946190ffb0adb9fd35775992ea66aef85e 100644 (file)
@@ -15,6 +15,9 @@ import (
 
 func TestXOR(t *testing.T) {
        for j := 1; j <= 1024; j++ {
+               if testing.Short() && j > 16 {
+                       break
+               }
                for alignP := 0; alignP < 2; alignP++ {
                        for alignQ := 0; alignQ < 2; alignQ++ {
                                for alignD := 0; alignD < 2; alignD++ {
index 21e6d4e82f6b2cc8cea0b0e8da2ea4d2679ecb19..3e3fe06c02393138be9d71cd13b01d696e69580c 100644 (file)
@@ -4,7 +4,10 @@
 
 package des
 
-import "encoding/binary"
+import (
+       "encoding/binary"
+       "sync"
+)
 
 func cryptBlock(subkeys []uint64, dst, src []byte, decrypt bool) {
        b := binary.BigEndian.Uint64(src)
@@ -42,7 +45,8 @@ func decryptBlock(subkeys []uint64, dst, src []byte) {
        cryptBlock(subkeys, dst, src, true)
 }
 
-// DES Feistel function
+// DES Feistel function. feistelBox must be initialized via
+// feistelBoxOnce.Do(initFeistelBox) first.
 func feistel(l, r uint32, k0, k1 uint64) (lout, rout uint32) {
        var t uint32
 
@@ -77,6 +81,8 @@ func feistel(l, r uint32, k0, k1 uint64) (lout, rout uint32) {
 // for sBoxes[s][i][j] << 4*(7-s)
 var feistelBox [8][64]uint32
 
+var feistelBoxOnce sync.Once
+
 // general purpose function to perform DES block permutations
 func permuteBlock(src uint64, permutation []uint8) (block uint64) {
        for position, n := range permutation {
@@ -86,7 +92,7 @@ func permuteBlock(src uint64, permutation []uint8) (block uint64) {
        return
 }
 
-func init() {
+func initFeistelBox() {
        for s := range sBoxes {
                for i := 0; i < 4; i++ {
                        for j := 0; j < 16; j++ {
@@ -219,6 +225,8 @@ func ksRotate(in uint32) (out []uint32) {
 
 // creates 16 56-bit subkeys from the original key
 func (c *desCipher) generateSubkeys(keyBytes []byte) {
+       feistelBoxOnce.Do(initFeistelBox)
+
        // apply PC1 permutation to key
        key := binary.BigEndian.Uint64(keyBytes)
        permutedKey := permuteBlock(key, permutedChoice1[:])
index e059f181c7ea340774176e1534de9c412568481f..ddc3b35ba30336c0618746bb364d151d9b57576b 100644 (file)
@@ -21,13 +21,12 @@ import (
        "crypto/aes"
        "crypto/cipher"
        "crypto/elliptic"
+       "crypto/internal/randutil"
        "crypto/sha512"
        "encoding/asn1"
        "errors"
        "io"
        "math/big"
-
-       "crypto/internal/randutil"
 )
 
 // A invertible implements fast inverse mod Curve.Params().N
@@ -190,14 +189,21 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
 
        // See [NSA] 3.4.1
        c := priv.PublicKey.Curve
+       e := hashToInt(hash, c)
+       r, s, err = sign(priv, &csprng, c, e)
+       return
+}
+
+func signGeneric(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, e *big.Int) (r, s *big.Int, err error) {
        N := c.Params().N
        if N.Sign() == 0 {
                return nil, nil, errZeroParam
        }
+
        var k, kInv *big.Int
        for {
                for {
-                       k, err = randFieldElement(c, csprng)
+                       k, err = randFieldElement(c, *csprng)
                        if err != nil {
                                r = nil
                                return
@@ -215,8 +221,6 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
                                break
                        }
                }
-
-               e := hashToInt(hash, c)
                s = new(big.Int).Mul(priv.D, r)
                s.Add(s, e)
                s.Mul(s, kInv)
@@ -225,7 +229,6 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
                        break
                }
        }
-
        return
 }
 
@@ -243,8 +246,12 @@ func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
                return false
        }
        e := hashToInt(hash, c)
+       return verify(pub, c, e, r, s)
+}
 
+func verifyGeneric(pub *PublicKey, c elliptic.Curve, e, r, s *big.Int) bool {
        var w *big.Int
+       N := c.Params().N
        if in, ok := c.(invertible); ok {
                w = in.Inverse(s)
        } else {
diff --git a/libgo/go/crypto/ecdsa/ecdsa_noasm.go b/libgo/go/crypto/ecdsa/ecdsa_noasm.go
new file mode 100644 (file)
index 0000000..d9f9cff
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !s390x gccgo
+
+package ecdsa
+
+import (
+       "crypto/cipher"
+       "crypto/elliptic"
+       "math/big"
+)
+
+func sign(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, e *big.Int) (r, s *big.Int, err error) {
+       r, s, err = signGeneric(priv, csprng, c, e)
+       return
+}
+
+func verify(pub *PublicKey, c elliptic.Curve, e, r, s *big.Int) bool {
+       return verifyGeneric(pub, c, e, r, s)
+}
diff --git a/libgo/go/crypto/ecdsa/ecdsa_s390x.go b/libgo/go/crypto/ecdsa/ecdsa_s390x.go
new file mode 100644 (file)
index 0000000..f07c3bf
--- /dev/null
@@ -0,0 +1,153 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,!gccgo
+
+package ecdsa
+
+import (
+       "crypto/cipher"
+       "crypto/elliptic"
+       "internal/cpu"
+       "math/big"
+)
+
+// s390x accelerated signatures
+//go:noescape
+func kdsaSig(fc uint64, block *[1720]byte) (errn uint64)
+
+type signverify int
+
+const (
+       signing signverify = iota
+       verifying
+)
+
+// bufferOffsets represents the offset of a particular parameter in
+// the buffer passed to the KDSA instruction.
+type bufferOffsets struct {
+       baseSize       int
+       hashSize       int
+       offsetHash     int
+       offsetKey1     int
+       offsetRNorKey2 int
+       offsetR        int
+       offsetS        int
+       functionCode   uint64
+}
+
+func canUseKDSA(sv signverify, c elliptic.Curve, bo *bufferOffsets) bool {
+       if !cpu.S390X.HasECDSA {
+               return false
+       }
+
+       switch c.Params().Name {
+       case "P-256":
+               bo.baseSize = 32
+               bo.hashSize = 32
+               bo.offsetHash = 64
+               bo.offsetKey1 = 96
+               bo.offsetRNorKey2 = 128
+               bo.offsetR = 0
+               bo.offsetS = 32
+               if sv == signing {
+                       bo.functionCode = 137
+               } else {
+                       bo.functionCode = 1
+               }
+               return true
+       case "P-384":
+               bo.baseSize = 48
+               bo.hashSize = 48
+               bo.offsetHash = 96
+               bo.offsetKey1 = 144
+               bo.offsetRNorKey2 = 192
+               bo.offsetR = 0
+               bo.offsetS = 48
+               if sv == signing {
+                       bo.functionCode = 138
+               } else {
+                       bo.functionCode = 2
+               }
+               return true
+       case "P-521":
+               bo.baseSize = 66
+               bo.hashSize = 80
+               bo.offsetHash = 160
+               bo.offsetKey1 = 254
+               bo.offsetRNorKey2 = 334
+               bo.offsetR = 14
+               bo.offsetS = 94
+               if sv == signing {
+                       bo.functionCode = 139
+               } else {
+                       bo.functionCode = 3
+               }
+               return true
+       }
+       return false
+}
+
+// zeroExtendAndCopy pads src with leading zeros until it has the size given.
+// It then copies the padded src into the dst. Bytes beyond size in dst are
+// not modified.
+func zeroExtendAndCopy(dst, src []byte, size int) {
+       nz := size - len(src)
+       if nz < 0 {
+               panic("src is too long")
+       }
+       // the compiler should replace this loop with a memclr call
+       z := dst[:nz]
+       for i := range z {
+               z[i] = 0
+       }
+       copy(dst[nz:size], src[:size-nz])
+       return
+}
+
+func sign(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, e *big.Int) (r, s *big.Int, err error) {
+       var bo bufferOffsets
+       if canUseKDSA(signing, c, &bo) && e.Sign() != 0 {
+               var buffer [1720]byte
+               for {
+                       var k *big.Int
+                       k, err = randFieldElement(c, csprng)
+                       if err != nil {
+                               return nil, nil, err
+                       }
+                       zeroExtendAndCopy(buffer[bo.offsetHash:], e.Bytes(), bo.hashSize)
+                       zeroExtendAndCopy(buffer[bo.offsetKey1:], priv.D.Bytes(), bo.baseSize)
+                       zeroExtendAndCopy(buffer[bo.offsetRNorKey2:], k.Bytes(), bo.baseSize)
+                       errn := kdsaSig(bo.functionCode, &buffer)
+                       if errn == 2 {
+                               return nil, nil, errZeroParam
+                       }
+                       if errn == 0 { // success == 0 means successful signing
+                               r = new(big.Int)
+                               r.SetBytes(buffer[bo.offsetR : bo.offsetR+bo.baseSize])
+                               s = new(big.Int)
+                               s.SetBytes(buffer[bo.offsetS : bo.offsetS+bo.baseSize])
+                               return
+                       }
+                       //at this point, it must be that errn == 1: retry
+               }
+       }
+       r, s, err = signGeneric(priv, csprng, c, e)
+       return
+}
+
+func verify(pub *PublicKey, c elliptic.Curve, e, r, s *big.Int) bool {
+       var bo bufferOffsets
+       if canUseKDSA(verifying, c, &bo) && e.Sign() != 0 {
+               var buffer [1720]byte
+               zeroExtendAndCopy(buffer[bo.offsetR:], r.Bytes(), bo.baseSize)
+               zeroExtendAndCopy(buffer[bo.offsetS:], s.Bytes(), bo.baseSize)
+               zeroExtendAndCopy(buffer[bo.offsetHash:], e.Bytes(), bo.hashSize)
+               zeroExtendAndCopy(buffer[bo.offsetKey1:], pub.X.Bytes(), bo.baseSize)
+               zeroExtendAndCopy(buffer[bo.offsetRNorKey2:], pub.Y.Bytes(), bo.baseSize)
+               errn := kdsaSig(bo.functionCode, &buffer)
+               return errn == 0
+       }
+       return verifyGeneric(pub, c, e, r, s)
+}
diff --git a/libgo/go/crypto/ecdsa/ecdsa_s390x_test.go b/libgo/go/crypto/ecdsa/ecdsa_s390x_test.go
new file mode 100644 (file)
index 0000000..80babc9
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,!gccgo
+
+package ecdsa
+
+import (
+       "crypto/elliptic"
+       "testing"
+)
+
+func TestNoAsm(t *testing.T) {
+       curves := [...]elliptic.Curve{
+               elliptic.P256(),
+               elliptic.P384(),
+               elliptic.P521(),
+       }
+
+       for _, curve := range curves {
+               // override the name of the curve to stop the assembly path being taken
+               params := *curve.Params()
+               name := params.Name
+               params.Name = name + "_GENERIC_OVERRIDE"
+
+               testKeyGeneration(t, &params, name)
+               testSignAndVerify(t, &params, name)
+               testNonceSafety(t, &params, name)
+               testINDCCA(t, &params, name)
+               testNegativeInputs(t, &params, name)
+       }
+}
diff --git a/libgo/go/crypto/ed25519/ed25519.go b/libgo/go/crypto/ed25519/ed25519.go
new file mode 100644 (file)
index 0000000..dc47e55
--- /dev/null
@@ -0,0 +1,216 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package ed25519 implements the Ed25519 signature algorithm. See
+// https://ed25519.cr.yp.to/.
+//
+// These functions are also compatible with the “Ed25519” function defined in
+// RFC 8032. However, unlike RFC 8032's formulation, this package's private key
+// representation includes a public key suffix to make multiple signing
+// operations with the same key more efficient. This package refers to the RFC
+// 8032 private key as the “seed”.
+package ed25519
+
+// This code is a port of the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+import (
+       "bytes"
+       "crypto"
+       "crypto/ed25519/internal/edwards25519"
+       cryptorand "crypto/rand"
+       "crypto/sha512"
+       "errors"
+       "io"
+       "strconv"
+)
+
+const (
+       // PublicKeySize is the size, in bytes, of public keys as used in this package.
+       PublicKeySize = 32
+       // PrivateKeySize is the size, in bytes, of private keys as used in this package.
+       PrivateKeySize = 64
+       // SignatureSize is the size, in bytes, of signatures generated and verified by this package.
+       SignatureSize = 64
+       // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032.
+       SeedSize = 32
+)
+
+// PublicKey is the type of Ed25519 public keys.
+type PublicKey []byte
+
+// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.
+type PrivateKey []byte
+
+// Public returns the PublicKey corresponding to priv.
+func (priv PrivateKey) Public() crypto.PublicKey {
+       publicKey := make([]byte, PublicKeySize)
+       copy(publicKey, priv[32:])
+       return PublicKey(publicKey)
+}
+
+// Seed returns the private key seed corresponding to priv. It is provided for
+// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds
+// in this package.
+func (priv PrivateKey) Seed() []byte {
+       seed := make([]byte, SeedSize)
+       copy(seed, priv[:32])
+       return seed
+}
+
+// Sign signs the given message with priv.
+// Ed25519 performs two passes over messages to be signed and therefore cannot
+// handle pre-hashed messages. Thus opts.HashFunc() must return zero to
+// indicate the message hasn't been hashed. This can be achieved by passing
+// crypto.Hash(0) as the value for opts.
+func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) {
+       if opts.HashFunc() != crypto.Hash(0) {
+               return nil, errors.New("ed25519: cannot sign hashed message")
+       }
+
+       return Sign(priv, message), nil
+}
+
+// GenerateKey generates a public/private key pair using entropy from rand.
+// If rand is nil, crypto/rand.Reader will be used.
+func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) {
+       if rand == nil {
+               rand = cryptorand.Reader
+       }
+
+       seed := make([]byte, SeedSize)
+       if _, err := io.ReadFull(rand, seed); err != nil {
+               return nil, nil, err
+       }
+
+       privateKey := NewKeyFromSeed(seed)
+       publicKey := make([]byte, PublicKeySize)
+       copy(publicKey, privateKey[32:])
+
+       return publicKey, privateKey, nil
+}
+
+// NewKeyFromSeed calculates a private key from a seed. It will panic if
+// len(seed) is not SeedSize. This function is provided for interoperability
+// with RFC 8032. RFC 8032's private keys correspond to seeds in this
+// package.
+func NewKeyFromSeed(seed []byte) PrivateKey {
+       if l := len(seed); l != SeedSize {
+               panic("ed25519: bad seed length: " + strconv.Itoa(l))
+       }
+
+       digest := sha512.Sum512(seed)
+       digest[0] &= 248
+       digest[31] &= 127
+       digest[31] |= 64
+
+       var A edwards25519.ExtendedGroupElement
+       var hBytes [32]byte
+       copy(hBytes[:], digest[:])
+       edwards25519.GeScalarMultBase(&A, &hBytes)
+       var publicKeyBytes [32]byte
+       A.ToBytes(&publicKeyBytes)
+
+       privateKey := make([]byte, PrivateKeySize)
+       copy(privateKey, seed)
+       copy(privateKey[32:], publicKeyBytes[:])
+
+       return privateKey
+}
+
+// Sign signs the message with privateKey and returns a signature. It will
+// panic if len(privateKey) is not PrivateKeySize.
+func Sign(privateKey PrivateKey, message []byte) []byte {
+       if l := len(privateKey); l != PrivateKeySize {
+               panic("ed25519: bad private key length: " + strconv.Itoa(l))
+       }
+
+       h := sha512.New()
+       h.Write(privateKey[:32])
+
+       var digest1, messageDigest, hramDigest [64]byte
+       var expandedSecretKey [32]byte
+       h.Sum(digest1[:0])
+       copy(expandedSecretKey[:], digest1[:])
+       expandedSecretKey[0] &= 248
+       expandedSecretKey[31] &= 63
+       expandedSecretKey[31] |= 64
+
+       h.Reset()
+       h.Write(digest1[32:])
+       h.Write(message)
+       h.Sum(messageDigest[:0])
+
+       var messageDigestReduced [32]byte
+       edwards25519.ScReduce(&messageDigestReduced, &messageDigest)
+       var R edwards25519.ExtendedGroupElement
+       edwards25519.GeScalarMultBase(&R, &messageDigestReduced)
+
+       var encodedR [32]byte
+       R.ToBytes(&encodedR)
+
+       h.Reset()
+       h.Write(encodedR[:])
+       h.Write(privateKey[32:])
+       h.Write(message)
+       h.Sum(hramDigest[:0])
+       var hramDigestReduced [32]byte
+       edwards25519.ScReduce(&hramDigestReduced, &hramDigest)
+
+       var s [32]byte
+       edwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced)
+
+       signature := make([]byte, SignatureSize)
+       copy(signature[:], encodedR[:])
+       copy(signature[32:], s[:])
+
+       return signature
+}
+
+// Verify reports whether sig is a valid signature of message by publicKey. It
+// will panic if len(publicKey) is not PublicKeySize.
+func Verify(publicKey PublicKey, message, sig []byte) bool {
+       if l := len(publicKey); l != PublicKeySize {
+               panic("ed25519: bad public key length: " + strconv.Itoa(l))
+       }
+
+       if len(sig) != SignatureSize || sig[63]&224 != 0 {
+               return false
+       }
+
+       var A edwards25519.ExtendedGroupElement
+       var publicKeyBytes [32]byte
+       copy(publicKeyBytes[:], publicKey)
+       if !A.FromBytes(&publicKeyBytes) {
+               return false
+       }
+       edwards25519.FeNeg(&A.X, &A.X)
+       edwards25519.FeNeg(&A.T, &A.T)
+
+       h := sha512.New()
+       h.Write(sig[:32])
+       h.Write(publicKey[:])
+       h.Write(message)
+       var digest [64]byte
+       h.Sum(digest[:0])
+
+       var hReduced [32]byte
+       edwards25519.ScReduce(&hReduced, &digest)
+
+       var R edwards25519.ProjectiveGroupElement
+       var s [32]byte
+       copy(s[:], sig[32:])
+
+       // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in
+       // the range [0, order) in order to prevent signature malleability.
+       if !edwards25519.ScMinimal(&s) {
+               return false
+       }
+
+       edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s)
+
+       var checkR [32]byte
+       R.ToBytes(&checkR)
+       return bytes.Equal(sig[:32], checkR[:])
+}
diff --git a/libgo/go/crypto/ed25519/ed25519_test.go b/libgo/go/crypto/ed25519/ed25519_test.go
new file mode 100644 (file)
index 0000000..9c980fc
--- /dev/null
@@ -0,0 +1,219 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ed25519
+
+import (
+       "bufio"
+       "bytes"
+       "compress/gzip"
+       "crypto"
+       "crypto/ed25519/internal/edwards25519"
+       "crypto/rand"
+       "encoding/hex"
+       "os"
+       "strings"
+       "testing"
+)
+
+type zeroReader struct{}
+
+func (zeroReader) Read(buf []byte) (int, error) {
+       for i := range buf {
+               buf[i] = 0
+       }
+       return len(buf), nil
+}
+
+func TestUnmarshalMarshal(t *testing.T) {
+       pub, _, _ := GenerateKey(rand.Reader)
+
+       var A edwards25519.ExtendedGroupElement
+       var pubBytes [32]byte
+       copy(pubBytes[:], pub)
+       if !A.FromBytes(&pubBytes) {
+               t.Fatalf("ExtendedGroupElement.FromBytes failed")
+       }
+
+       var pub2 [32]byte
+       A.ToBytes(&pub2)
+
+       if pubBytes != pub2 {
+               t.Errorf("FromBytes(%v)->ToBytes does not round-trip, got %x\n", pubBytes, pub2)
+       }
+}
+
+func TestSignVerify(t *testing.T) {
+       var zero zeroReader
+       public, private, _ := GenerateKey(zero)
+
+       message := []byte("test message")
+       sig := Sign(private, message)
+       if !Verify(public, message, sig) {
+               t.Errorf("valid signature rejected")
+       }
+
+       wrongMessage := []byte("wrong message")
+       if Verify(public, wrongMessage, sig) {
+               t.Errorf("signature of different message accepted")
+       }
+}
+
+func TestCryptoSigner(t *testing.T) {
+       var zero zeroReader
+       public, private, _ := GenerateKey(zero)
+
+       signer := crypto.Signer(private)
+
+       publicInterface := signer.Public()
+       public2, ok := publicInterface.(PublicKey)
+       if !ok {
+               t.Fatalf("expected PublicKey from Public() but got %T", publicInterface)
+       }
+
+       if !bytes.Equal(public, public2) {
+               t.Errorf("public keys do not match: original:%x vs Public():%x", public, public2)
+       }
+
+       message := []byte("message")
+       var noHash crypto.Hash
+       signature, err := signer.Sign(zero, message, noHash)
+       if err != nil {
+               t.Fatalf("error from Sign(): %s", err)
+       }
+
+       if !Verify(public, message, signature) {
+               t.Errorf("Verify failed on signature from Sign()")
+       }
+}
+
+func TestGolden(t *testing.T) {
+       // sign.input.gz is a selection of test cases from
+       // https://ed25519.cr.yp.to/python/sign.input
+       testDataZ, err := os.Open("testdata/sign.input.gz")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer testDataZ.Close()
+       testData, err := gzip.NewReader(testDataZ)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer testData.Close()
+
+       scanner := bufio.NewScanner(testData)
+       lineNo := 0
+
+       for scanner.Scan() {
+               lineNo++
+
+               line := scanner.Text()
+               parts := strings.Split(line, ":")
+               if len(parts) != 5 {
+                       t.Fatalf("bad number of parts on line %d", lineNo)
+               }
+
+               privBytes, _ := hex.DecodeString(parts[0])
+               pubKey, _ := hex.DecodeString(parts[1])
+               msg, _ := hex.DecodeString(parts[2])
+               sig, _ := hex.DecodeString(parts[3])
+               // The signatures in the test vectors also include the message
+               // at the end, but we just want R and S.
+               sig = sig[:SignatureSize]
+
+               if l := len(pubKey); l != PublicKeySize {
+                       t.Fatalf("bad public key length on line %d: got %d bytes", lineNo, l)
+               }
+
+               var priv [PrivateKeySize]byte
+               copy(priv[:], privBytes)
+               copy(priv[32:], pubKey)
+
+               sig2 := Sign(priv[:], msg)
+               if !bytes.Equal(sig, sig2[:]) {
+                       t.Errorf("different signature result on line %d: %x vs %x", lineNo, sig, sig2)
+               }
+
+               if !Verify(pubKey, msg, sig2) {
+                       t.Errorf("signature failed to verify on line %d", lineNo)
+               }
+
+               priv2 := NewKeyFromSeed(priv[:32])
+               if !bytes.Equal(priv[:], priv2) {
+                       t.Errorf("recreating key pair gave different private key on line %d: %x vs %x", lineNo, priv[:], priv2)
+               }
+
+               if pubKey2 := priv2.Public().(PublicKey); !bytes.Equal(pubKey, pubKey2) {
+                       t.Errorf("recreating key pair gave different public key on line %d: %x vs %x", lineNo, pubKey, pubKey2)
+               }
+
+               if seed := priv2.Seed(); !bytes.Equal(priv[:32], seed) {
+                       t.Errorf("recreating key pair gave different seed on line %d: %x vs %x", lineNo, priv[:32], seed)
+               }
+       }
+
+       if err := scanner.Err(); err != nil {
+               t.Fatalf("error reading test data: %s", err)
+       }
+}
+
+func TestMalleability(t *testing.T) {
+       // https://tools.ietf.org/html/rfc8032#section-5.1.7 adds an additional test
+       // that s be in [0, order). This prevents someone from adding a multiple of
+       // order to s and obtaining a second valid signature for the same message.
+       msg := []byte{0x54, 0x65, 0x73, 0x74}
+       sig := []byte{
+               0x7c, 0x38, 0xe0, 0x26, 0xf2, 0x9e, 0x14, 0xaa, 0xbd, 0x05, 0x9a,
+               0x0f, 0x2d, 0xb8, 0xb0, 0xcd, 0x78, 0x30, 0x40, 0x60, 0x9a, 0x8b,
+               0xe6, 0x84, 0xdb, 0x12, 0xf8, 0x2a, 0x27, 0x77, 0x4a, 0xb0, 0x67,
+               0x65, 0x4b, 0xce, 0x38, 0x32, 0xc2, 0xd7, 0x6f, 0x8f, 0x6f, 0x5d,
+               0xaf, 0xc0, 0x8d, 0x93, 0x39, 0xd4, 0xee, 0xf6, 0x76, 0x57, 0x33,
+               0x36, 0xa5, 0xc5, 0x1e, 0xb6, 0xf9, 0x46, 0xb3, 0x1d,
+       }
+       publicKey := []byte{
+               0x7d, 0x4d, 0x0e, 0x7f, 0x61, 0x53, 0xa6, 0x9b, 0x62, 0x42, 0xb5,
+               0x22, 0xab, 0xbe, 0xe6, 0x85, 0xfd, 0xa4, 0x42, 0x0f, 0x88, 0x34,
+               0xb1, 0x08, 0xc3, 0xbd, 0xae, 0x36, 0x9e, 0xf5, 0x49, 0xfa,
+       }
+
+       if Verify(publicKey, msg, sig) {
+               t.Fatal("non-canonical signature accepted")
+       }
+}
+
+func BenchmarkKeyGeneration(b *testing.B) {
+       var zero zeroReader
+       for i := 0; i < b.N; i++ {
+               if _, _, err := GenerateKey(zero); err != nil {
+                       b.Fatal(err)
+               }
+       }
+}
+
+func BenchmarkSigning(b *testing.B) {
+       var zero zeroReader
+       _, priv, err := GenerateKey(zero)
+       if err != nil {
+               b.Fatal(err)
+       }
+       message := []byte("Hello, world!")
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               Sign(priv, message)
+       }
+}
+
+func BenchmarkVerification(b *testing.B) {
+       var zero zeroReader
+       pub, priv, err := GenerateKey(zero)
+       if err != nil {
+               b.Fatal(err)
+       }
+       message := []byte("Hello, world!")
+       signature := Sign(priv, message)
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               Verify(pub, message, signature)
+       }
+}
diff --git a/libgo/go/crypto/ed25519/internal/edwards25519/const.go b/libgo/go/crypto/ed25519/internal/edwards25519/const.go
new file mode 100644 (file)
index 0000000..e39f086
--- /dev/null
@@ -0,0 +1,1422 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package edwards25519
+
+// These values are from the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+// d is a constant in the Edwards curve equation.
+var d = FieldElement{
+       -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116,
+}
+
+// d2 is 2*d.
+var d2 = FieldElement{
+       -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199,
+}
+
+// SqrtM1 is the square-root of -1 in the field.
+var SqrtM1 = FieldElement{
+       -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482,
+}
+
+// A is a constant in the Montgomery-form of curve25519.
+var A = FieldElement{
+       486662, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+}
+
+// bi contains precomputed multiples of the base-point. See the Ed25519 paper
+// for a discussion about how these values are used.
+var bi = [8]PreComputedGroupElement{
+       {
+               FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},
+               FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},
+               FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},
+       },
+       {
+               FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},
+               FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},
+               FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},
+       },
+       {
+               FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},
+               FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},
+               FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},
+       },
+       {
+               FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},
+               FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},
+               FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},
+       },
+       {
+               FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877},
+               FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951},
+               FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784},
+       },
+       {
+               FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436},
+               FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918},
+               FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877},
+       },
+       {
+               FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800},
+               FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305},
+               FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300},
+       },
+       {
+               FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876},
+               FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619},
+               FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683},
+       },
+}
+
+// base contains precomputed multiples of the base-point. See the Ed25519 paper
+// for a discussion about how these values are used.
+var base = [32][8]PreComputedGroupElement{
+       {
+               {
+                       FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},
+                       FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},
+                       FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},
+               },
+               {
+                       FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303},
+                       FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081},
+                       FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697},
+               },
+               {
+                       FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},
+                       FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},
+                       FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},
+               },
+               {
+                       FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540},
+                       FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397},
+                       FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325},
+               },
+               {
+                       FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},
+                       FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},
+                       FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},
+               },
+               {
+                       FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777},
+                       FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737},
+                       FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652},
+               },
+               {
+                       FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},
+                       FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},
+                       FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},
+               },
+               {
+                       FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726},
+                       FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955},
+                       FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425},
+               },
+       },
+       {
+               {
+                       FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171},
+                       FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510},
+                       FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660},
+               },
+               {
+                       FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639},
+                       FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963},
+                       FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950},
+               },
+               {
+                       FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568},
+                       FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335},
+                       FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628},
+               },
+               {
+                       FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007},
+                       FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772},
+                       FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653},
+               },
+               {
+                       FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567},
+                       FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686},
+                       FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372},
+               },
+               {
+                       FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887},
+                       FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954},
+                       FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953},
+               },
+               {
+                       FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833},
+                       FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532},
+                       FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876},
+               },
+               {
+                       FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268},
+                       FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214},
+                       FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038},
+               },
+       },
+       {
+               {
+                       FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800},
+                       FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645},
+                       FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664},
+               },
+               {
+                       FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933},
+                       FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182},
+                       FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222},
+               },
+               {
+                       FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991},
+                       FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880},
+                       FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092},
+               },
+               {
+                       FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295},
+                       FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788},
+                       FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553},
+               },
+               {
+                       FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026},
+                       FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347},
+                       FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033},
+               },
+               {
+                       FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395},
+                       FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278},
+                       FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890},
+               },
+               {
+                       FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995},
+                       FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596},
+                       FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891},
+               },
+               {
+                       FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060},
+                       FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608},
+                       FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606},
+               },
+       },
+       {
+               {
+                       FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389},
+                       FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016},
+                       FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341},
+               },
+               {
+                       FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505},
+                       FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553},
+                       FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655},
+               },
+               {
+                       FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220},
+                       FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631},
+                       FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099},
+               },
+               {
+                       FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556},
+                       FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749},
+                       FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930},
+               },
+               {
+                       FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391},
+                       FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253},
+                       FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066},
+               },
+               {
+                       FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958},
+                       FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082},
+                       FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383},
+               },
+               {
+                       FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521},
+                       FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807},
+                       FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948},
+               },
+               {
+                       FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134},
+                       FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455},
+                       FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629},
+               },
+       },
+       {
+               {
+                       FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069},
+                       FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746},
+                       FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919},
+               },
+               {
+                       FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837},
+                       FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906},
+                       FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771},
+               },
+               {
+                       FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817},
+                       FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098},
+                       FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409},
+               },
+               {
+                       FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504},
+                       FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727},
+                       FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420},
+               },
+               {
+                       FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003},
+                       FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605},
+                       FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384},
+               },
+               {
+                       FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701},
+                       FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683},
+                       FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708},
+               },
+               {
+                       FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563},
+                       FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260},
+                       FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387},
+               },
+               {
+                       FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672},
+                       FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686},
+                       FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665},
+               },
+       },
+       {
+               {
+                       FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182},
+                       FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277},
+                       FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628},
+               },
+               {
+                       FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474},
+                       FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539},
+                       FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822},
+               },
+               {
+                       FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970},
+                       FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756},
+                       FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508},
+               },
+               {
+                       FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683},
+                       FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655},
+                       FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158},
+               },
+               {
+                       FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125},
+                       FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839},
+                       FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664},
+               },
+               {
+                       FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294},
+                       FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899},
+                       FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070},
+               },
+               {
+                       FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294},
+                       FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949},
+                       FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083},
+               },
+               {
+                       FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420},
+                       FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940},
+                       FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396},
+               },
+       },
+       {
+               {
+                       FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567},
+                       FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127},
+                       FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294},
+               },
+               {
+                       FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887},
+                       FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964},
+                       FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195},
+               },
+               {
+                       FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244},
+                       FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999},
+                       FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762},
+               },
+               {
+                       FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274},
+                       FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236},
+                       FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605},
+               },
+               {
+                       FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761},
+                       FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884},
+                       FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482},
+               },
+               {
+                       FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638},
+                       FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490},
+                       FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170},
+               },
+               {
+                       FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736},
+                       FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124},
+                       FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392},
+               },
+               {
+                       FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029},
+                       FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048},
+                       FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958},
+               },
+       },
+       {
+               {
+                       FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593},
+                       FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071},
+                       FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692},
+               },
+               {
+                       FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687},
+                       FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441},
+                       FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001},
+               },
+               {
+                       FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460},
+                       FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007},
+                       FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762},
+               },
+               {
+                       FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005},
+                       FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674},
+                       FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035},
+               },
+               {
+                       FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590},
+                       FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957},
+                       FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812},
+               },
+               {
+                       FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740},
+                       FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122},
+                       FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158},
+               },
+               {
+                       FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885},
+                       FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140},
+                       FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857},
+               },
+               {
+                       FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155},
+                       FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260},
+                       FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483},
+               },
+       },
+       {
+               {
+                       FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677},
+                       FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815},
+                       FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751},
+               },
+               {
+                       FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203},
+                       FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208},
+                       FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230},
+               },
+               {
+                       FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850},
+                       FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389},
+                       FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968},
+               },
+               {
+                       FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689},
+                       FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880},
+                       FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304},
+               },
+               {
+                       FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632},
+                       FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412},
+                       FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566},
+               },
+               {
+                       FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038},
+                       FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232},
+                       FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943},
+               },
+               {
+                       FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856},
+                       FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738},
+                       FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971},
+               },
+               {
+                       FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718},
+                       FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697},
+                       FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883},
+               },
+       },
+       {
+               {
+                       FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912},
+                       FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358},
+                       FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849},
+               },
+               {
+                       FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307},
+                       FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977},
+                       FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335},
+               },
+               {
+                       FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644},
+                       FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616},
+                       FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735},
+               },
+               {
+                       FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099},
+                       FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341},
+                       FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336},
+               },
+               {
+                       FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646},
+                       FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425},
+                       FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388},
+               },
+               {
+                       FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743},
+                       FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822},
+                       FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462},
+               },
+               {
+                       FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985},
+                       FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702},
+                       FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797},
+               },
+               {
+                       FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293},
+                       FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100},
+                       FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688},
+               },
+       },
+       {
+               {
+                       FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186},
+                       FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610},
+                       FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707},
+               },
+               {
+                       FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220},
+                       FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025},
+                       FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044},
+               },
+               {
+                       FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992},
+                       FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027},
+                       FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197},
+               },
+               {
+                       FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901},
+                       FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952},
+                       FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878},
+               },
+               {
+                       FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390},
+                       FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730},
+                       FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730},
+               },
+               {
+                       FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180},
+                       FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272},
+                       FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715},
+               },
+               {
+                       FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970},
+                       FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772},
+                       FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865},
+               },
+               {
+                       FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750},
+                       FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373},
+                       FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348},
+               },
+       },
+       {
+               {
+                       FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144},
+                       FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195},
+                       FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086},
+               },
+               {
+                       FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684},
+                       FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518},
+                       FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233},
+               },
+               {
+                       FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793},
+                       FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794},
+                       FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435},
+               },
+               {
+                       FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921},
+                       FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518},
+                       FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563},
+               },
+               {
+                       FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278},
+                       FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024},
+                       FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030},
+               },
+               {
+                       FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783},
+                       FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717},
+                       FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844},
+               },
+               {
+                       FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333},
+                       FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048},
+                       FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760},
+               },
+               {
+                       FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760},
+                       FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757},
+                       FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112},
+               },
+       },
+       {
+               {
+                       FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468},
+                       FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184},
+                       FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289},
+               },
+               {
+                       FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066},
+                       FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882},
+                       FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226},
+               },
+               {
+                       FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101},
+                       FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279},
+                       FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811},
+               },
+               {
+                       FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709},
+                       FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714},
+                       FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121},
+               },
+               {
+                       FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464},
+                       FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847},
+                       FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400},
+               },
+               {
+                       FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414},
+                       FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158},
+                       FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045},
+               },
+               {
+                       FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415},
+                       FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459},
+                       FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079},
+               },
+               {
+                       FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412},
+                       FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743},
+                       FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836},
+               },
+       },
+       {
+               {
+                       FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022},
+                       FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429},
+                       FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065},
+               },
+               {
+                       FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861},
+                       FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000},
+                       FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101},
+               },
+               {
+                       FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815},
+                       FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642},
+                       FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966},
+               },
+               {
+                       FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574},
+                       FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742},
+                       FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689},
+               },
+               {
+                       FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020},
+                       FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772},
+                       FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982},
+               },
+               {
+                       FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953},
+                       FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218},
+                       FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265},
+               },
+               {
+                       FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073},
+                       FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325},
+                       FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798},
+               },
+               {
+                       FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870},
+                       FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863},
+                       FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927},
+               },
+       },
+       {
+               {
+                       FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267},
+                       FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663},
+                       FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862},
+               },
+               {
+                       FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673},
+                       FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943},
+                       FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020},
+               },
+               {
+                       FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238},
+                       FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064},
+                       FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795},
+               },
+               {
+                       FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052},
+                       FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904},
+                       FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531},
+               },
+               {
+                       FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979},
+                       FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841},
+                       FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431},
+               },
+               {
+                       FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324},
+                       FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940},
+                       FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320},
+               },
+               {
+                       FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184},
+                       FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114},
+                       FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878},
+               },
+               {
+                       FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784},
+                       FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091},
+                       FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585},
+               },
+       },
+       {
+               {
+                       FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208},
+                       FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864},
+                       FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661},
+               },
+               {
+                       FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233},
+                       FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212},
+                       FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525},
+               },
+               {
+                       FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068},
+                       FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397},
+                       FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988},
+               },
+               {
+                       FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889},
+                       FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038},
+                       FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697},
+               },
+               {
+                       FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875},
+                       FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905},
+                       FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656},
+               },
+               {
+                       FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818},
+                       FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714},
+                       FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203},
+               },
+               {
+                       FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931},
+                       FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024},
+                       FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084},
+               },
+               {
+                       FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204},
+                       FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817},
+                       FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667},
+               },
+       },
+       {
+               {
+                       FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504},
+                       FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768},
+                       FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255},
+               },
+               {
+                       FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790},
+                       FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438},
+                       FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333},
+               },
+               {
+                       FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971},
+                       FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905},
+                       FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409},
+               },
+               {
+                       FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409},
+                       FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499},
+                       FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363},
+               },
+               {
+                       FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664},
+                       FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324},
+                       FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940},
+               },
+               {
+                       FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990},
+                       FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914},
+                       FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290},
+               },
+               {
+                       FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257},
+                       FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433},
+                       FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236},
+               },
+               {
+                       FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045},
+                       FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093},
+                       FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347},
+               },
+       },
+       {
+               {
+                       FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191},
+                       FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507},
+                       FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906},
+               },
+               {
+                       FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018},
+                       FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109},
+                       FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926},
+               },
+               {
+                       FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528},
+                       FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625},
+                       FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286},
+               },
+               {
+                       FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033},
+                       FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866},
+                       FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896},
+               },
+               {
+                       FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075},
+                       FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347},
+                       FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437},
+               },
+               {
+                       FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165},
+                       FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588},
+                       FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193},
+               },
+               {
+                       FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017},
+                       FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883},
+                       FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961},
+               },
+               {
+                       FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043},
+                       FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663},
+                       FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362},
+               },
+       },
+       {
+               {
+                       FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860},
+                       FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466},
+                       FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063},
+               },
+               {
+                       FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997},
+                       FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295},
+                       FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369},
+               },
+               {
+                       FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385},
+                       FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109},
+                       FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906},
+               },
+               {
+                       FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424},
+                       FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185},
+                       FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962},
+               },
+               {
+                       FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325},
+                       FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593},
+                       FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404},
+               },
+               {
+                       FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644},
+                       FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801},
+                       FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804},
+               },
+               {
+                       FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884},
+                       FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577},
+                       FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849},
+               },
+               {
+                       FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473},
+                       FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644},
+                       FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319},
+               },
+       },
+       {
+               {
+                       FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599},
+                       FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768},
+                       FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084},
+               },
+               {
+                       FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328},
+                       FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369},
+                       FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920},
+               },
+               {
+                       FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815},
+                       FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025},
+                       FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397},
+               },
+               {
+                       FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448},
+                       FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981},
+                       FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165},
+               },
+               {
+                       FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501},
+                       FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073},
+                       FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861},
+               },
+               {
+                       FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845},
+                       FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211},
+                       FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870},
+               },
+               {
+                       FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096},
+                       FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803},
+                       FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168},
+               },
+               {
+                       FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965},
+                       FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505},
+                       FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598},
+               },
+       },
+       {
+               {
+                       FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782},
+                       FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900},
+                       FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479},
+               },
+               {
+                       FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208},
+                       FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232},
+                       FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719},
+               },
+               {
+                       FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271},
+                       FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326},
+                       FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132},
+               },
+               {
+                       FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300},
+                       FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570},
+                       FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670},
+               },
+               {
+                       FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994},
+                       FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913},
+                       FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317},
+               },
+               {
+                       FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730},
+                       FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096},
+                       FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078},
+               },
+               {
+                       FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411},
+                       FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905},
+                       FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654},
+               },
+               {
+                       FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870},
+                       FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498},
+                       FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579},
+               },
+       },
+       {
+               {
+                       FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677},
+                       FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647},
+                       FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743},
+               },
+               {
+                       FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468},
+                       FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375},
+                       FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155},
+               },
+               {
+                       FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725},
+                       FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612},
+                       FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943},
+               },
+               {
+                       FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944},
+                       FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928},
+                       FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406},
+               },
+               {
+                       FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139},
+                       FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963},
+                       FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693},
+               },
+               {
+                       FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734},
+                       FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680},
+                       FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410},
+               },
+               {
+                       FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931},
+                       FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654},
+                       FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710},
+               },
+               {
+                       FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180},
+                       FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684},
+                       FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895},
+               },
+       },
+       {
+               {
+                       FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501},
+                       FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413},
+                       FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880},
+               },
+               {
+                       FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874},
+                       FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962},
+                       FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899},
+               },
+               {
+                       FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152},
+                       FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063},
+                       FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080},
+               },
+               {
+                       FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146},
+                       FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183},
+                       FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133},
+               },
+               {
+                       FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421},
+                       FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622},
+                       FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197},
+               },
+               {
+                       FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663},
+                       FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753},
+                       FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755},
+               },
+               {
+                       FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862},
+                       FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118},
+                       FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171},
+               },
+               {
+                       FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380},
+                       FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824},
+                       FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270},
+               },
+       },
+       {
+               {
+                       FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438},
+                       FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584},
+                       FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562},
+               },
+               {
+                       FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471},
+                       FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610},
+                       FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269},
+               },
+               {
+                       FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650},
+                       FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369},
+                       FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461},
+               },
+               {
+                       FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462},
+                       FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793},
+                       FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218},
+               },
+               {
+                       FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226},
+                       FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019},
+                       FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037},
+               },
+               {
+                       FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171},
+                       FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132},
+                       FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841},
+               },
+               {
+                       FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181},
+                       FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210},
+                       FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040},
+               },
+               {
+                       FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935},
+                       FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105},
+                       FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814},
+               },
+       },
+       {
+               {
+                       FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852},
+                       FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581},
+                       FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646},
+               },
+               {
+                       FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844},
+                       FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025},
+                       FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453},
+               },
+               {
+                       FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068},
+                       FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192},
+                       FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921},
+               },
+               {
+                       FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259},
+                       FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426},
+                       FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072},
+               },
+               {
+                       FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305},
+                       FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832},
+                       FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943},
+               },
+               {
+                       FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011},
+                       FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447},
+                       FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494},
+               },
+               {
+                       FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245},
+                       FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859},
+                       FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915},
+               },
+               {
+                       FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707},
+                       FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848},
+                       FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224},
+               },
+       },
+       {
+               {
+                       FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391},
+                       FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215},
+                       FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101},
+               },
+               {
+                       FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713},
+                       FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849},
+                       FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930},
+               },
+               {
+                       FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940},
+                       FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031},
+                       FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404},
+               },
+               {
+                       FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243},
+                       FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116},
+                       FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525},
+               },
+               {
+                       FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509},
+                       FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883},
+                       FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865},
+               },
+               {
+                       FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660},
+                       FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273},
+                       FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138},
+               },
+               {
+                       FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560},
+                       FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135},
+                       FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941},
+               },
+               {
+                       FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739},
+                       FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756},
+                       FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819},
+               },
+       },
+       {
+               {
+                       FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347},
+                       FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028},
+                       FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075},
+               },
+               {
+                       FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799},
+                       FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609},
+                       FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817},
+               },
+               {
+                       FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989},
+                       FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523},
+                       FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278},
+               },
+               {
+                       FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045},
+                       FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377},
+                       FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480},
+               },
+               {
+                       FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016},
+                       FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426},
+                       FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525},
+               },
+               {
+                       FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396},
+                       FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080},
+                       FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892},
+               },
+               {
+                       FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275},
+                       FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074},
+                       FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140},
+               },
+               {
+                       FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717},
+                       FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101},
+                       FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127},
+               },
+       },
+       {
+               {
+                       FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632},
+                       FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415},
+                       FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160},
+               },
+               {
+                       FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876},
+                       FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625},
+                       FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478},
+               },
+               {
+                       FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164},
+                       FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595},
+                       FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248},
+               },
+               {
+                       FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858},
+                       FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193},
+                       FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184},
+               },
+               {
+                       FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942},
+                       FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635},
+                       FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948},
+               },
+               {
+                       FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935},
+                       FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415},
+                       FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416},
+               },
+               {
+                       FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018},
+                       FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778},
+                       FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659},
+               },
+               {
+                       FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385},
+                       FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503},
+                       FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329},
+               },
+       },
+       {
+               {
+                       FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056},
+                       FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838},
+                       FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948},
+               },
+               {
+                       FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691},
+                       FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118},
+                       FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517},
+               },
+               {
+                       FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269},
+                       FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904},
+                       FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589},
+               },
+               {
+                       FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193},
+                       FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910},
+                       FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930},
+               },
+               {
+                       FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667},
+                       FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481},
+                       FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876},
+               },
+               {
+                       FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640},
+                       FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278},
+                       FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112},
+               },
+               {
+                       FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272},
+                       FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012},
+                       FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221},
+               },
+               {
+                       FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046},
+                       FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345},
+                       FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310},
+               },
+       },
+       {
+               {
+                       FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937},
+                       FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636},
+                       FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008},
+               },
+               {
+                       FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429},
+                       FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576},
+                       FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066},
+               },
+               {
+                       FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490},
+                       FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104},
+                       FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053},
+               },
+               {
+                       FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275},
+                       FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511},
+                       FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095},
+               },
+               {
+                       FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439},
+                       FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939},
+                       FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424},
+               },
+               {
+                       FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310},
+                       FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608},
+                       FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079},
+               },
+               {
+                       FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101},
+                       FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418},
+                       FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576},
+               },
+               {
+                       FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356},
+                       FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996},
+                       FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099},
+               },
+       },
+       {
+               {
+                       FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728},
+                       FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658},
+                       FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242},
+               },
+               {
+                       FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001},
+                       FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766},
+                       FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373},
+               },
+               {
+                       FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458},
+                       FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628},
+                       FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657},
+               },
+               {
+                       FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062},
+                       FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616},
+                       FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014},
+               },
+               {
+                       FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383},
+                       FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814},
+                       FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718},
+               },
+               {
+                       FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417},
+                       FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222},
+                       FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444},
+               },
+               {
+                       FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597},
+                       FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970},
+                       FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799},
+               },
+               {
+                       FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647},
+                       FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511},
+                       FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032},
+               },
+       },
+       {
+               {
+                       FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834},
+                       FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461},
+                       FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062},
+               },
+               {
+                       FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516},
+                       FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547},
+                       FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240},
+               },
+               {
+                       FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038},
+                       FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741},
+                       FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103},
+               },
+               {
+                       FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747},
+                       FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323},
+                       FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016},
+               },
+               {
+                       FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373},
+                       FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228},
+                       FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141},
+               },
+               {
+                       FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399},
+                       FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831},
+                       FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376},
+               },
+               {
+                       FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313},
+                       FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958},
+                       FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577},
+               },
+               {
+                       FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743},
+                       FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684},
+                       FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476},
+               },
+       },
+}
diff --git a/libgo/go/crypto/ed25519/internal/edwards25519/edwards25519.go b/libgo/go/crypto/ed25519/internal/edwards25519/edwards25519.go
new file mode 100644 (file)
index 0000000..fd03c25
--- /dev/null
@@ -0,0 +1,1793 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package edwards25519
+
+import "encoding/binary"
+
+// This code is a port of the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+// FieldElement represents an element of the field GF(2^255 - 19).  An element
+// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
+// t[3]+2^102 t[4]+...+2^230 t[9].  Bounds on each t[i] vary depending on
+// context.
+type FieldElement [10]int32
+
+var zero FieldElement
+
+func FeZero(fe *FieldElement) {
+       copy(fe[:], zero[:])
+}
+
+func FeOne(fe *FieldElement) {
+       FeZero(fe)
+       fe[0] = 1
+}
+
+func FeAdd(dst, a, b *FieldElement) {
+       dst[0] = a[0] + b[0]
+       dst[1] = a[1] + b[1]
+       dst[2] = a[2] + b[2]
+       dst[3] = a[3] + b[3]
+       dst[4] = a[4] + b[4]
+       dst[5] = a[5] + b[5]
+       dst[6] = a[6] + b[6]
+       dst[7] = a[7] + b[7]
+       dst[8] = a[8] + b[8]
+       dst[9] = a[9] + b[9]
+}
+
+func FeSub(dst, a, b *FieldElement) {
+       dst[0] = a[0] - b[0]
+       dst[1] = a[1] - b[1]
+       dst[2] = a[2] - b[2]
+       dst[3] = a[3] - b[3]
+       dst[4] = a[4] - b[4]
+       dst[5] = a[5] - b[5]
+       dst[6] = a[6] - b[6]
+       dst[7] = a[7] - b[7]
+       dst[8] = a[8] - b[8]
+       dst[9] = a[9] - b[9]
+}
+
+func FeCopy(dst, src *FieldElement) {
+       copy(dst[:], src[:])
+}
+
+// Replace (f,g) with (g,g) if b == 1;
+// replace (f,g) with (f,g) if b == 0.
+//
+// Preconditions: b in {0,1}.
+func FeCMove(f, g *FieldElement, b int32) {
+       b = -b
+       f[0] ^= b & (f[0] ^ g[0])
+       f[1] ^= b & (f[1] ^ g[1])
+       f[2] ^= b & (f[2] ^ g[2])
+       f[3] ^= b & (f[3] ^ g[3])
+       f[4] ^= b & (f[4] ^ g[4])
+       f[5] ^= b & (f[5] ^ g[5])
+       f[6] ^= b & (f[6] ^ g[6])
+       f[7] ^= b & (f[7] ^ g[7])
+       f[8] ^= b & (f[8] ^ g[8])
+       f[9] ^= b & (f[9] ^ g[9])
+}
+
+func load3(in []byte) int64 {
+       var r int64
+       r = int64(in[0])
+       r |= int64(in[1]) << 8
+       r |= int64(in[2]) << 16
+       return r
+}
+
+func load4(in []byte) int64 {
+       var r int64
+       r = int64(in[0])
+       r |= int64(in[1]) << 8
+       r |= int64(in[2]) << 16
+       r |= int64(in[3]) << 24
+       return r
+}
+
+func FeFromBytes(dst *FieldElement, src *[32]byte) {
+       h0 := load4(src[:])
+       h1 := load3(src[4:]) << 6
+       h2 := load3(src[7:]) << 5
+       h3 := load3(src[10:]) << 3
+       h4 := load3(src[13:]) << 2
+       h5 := load4(src[16:])
+       h6 := load3(src[20:]) << 7
+       h7 := load3(src[23:]) << 5
+       h8 := load3(src[26:]) << 4
+       h9 := (load3(src[29:]) & 8388607) << 2
+
+       FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+// FeToBytes marshals h to s.
+// Preconditions:
+//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Write p=2^255-19; q=floor(h/p).
+// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
+//
+// Proof:
+//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
+//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
+//
+//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
+//   Then 0<y<1.
+//
+//   Write r=h-pq.
+//   Have 0<=r<=p-1=2^255-20.
+//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
+//
+//   Write x=r+19(2^-255)r+y.
+//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
+//
+//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
+//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
+func FeToBytes(s *[32]byte, h *FieldElement) {
+       var carry [10]int32
+
+       q := (19*h[9] + (1 << 24)) >> 25
+       q = (h[0] + q) >> 26
+       q = (h[1] + q) >> 25
+       q = (h[2] + q) >> 26
+       q = (h[3] + q) >> 25
+       q = (h[4] + q) >> 26
+       q = (h[5] + q) >> 25
+       q = (h[6] + q) >> 26
+       q = (h[7] + q) >> 25
+       q = (h[8] + q) >> 26
+       q = (h[9] + q) >> 25
+
+       // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
+       h[0] += 19 * q
+       // Goal: Output h-2^255 q, which is between 0 and 2^255-20.
+
+       carry[0] = h[0] >> 26
+       h[1] += carry[0]
+       h[0] -= carry[0] << 26
+       carry[1] = h[1] >> 25
+       h[2] += carry[1]
+       h[1] -= carry[1] << 25
+       carry[2] = h[2] >> 26
+       h[3] += carry[2]
+       h[2] -= carry[2] << 26
+       carry[3] = h[3] >> 25
+       h[4] += carry[3]
+       h[3] -= carry[3] << 25
+       carry[4] = h[4] >> 26
+       h[5] += carry[4]
+       h[4] -= carry[4] << 26
+       carry[5] = h[5] >> 25
+       h[6] += carry[5]
+       h[5] -= carry[5] << 25
+       carry[6] = h[6] >> 26
+       h[7] += carry[6]
+       h[6] -= carry[6] << 26
+       carry[7] = h[7] >> 25
+       h[8] += carry[7]
+       h[7] -= carry[7] << 25
+       carry[8] = h[8] >> 26
+       h[9] += carry[8]
+       h[8] -= carry[8] << 26
+       carry[9] = h[9] >> 25
+       h[9] -= carry[9] << 25
+       // h10 = carry9
+
+       // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
+       // Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
+       // evidently 2^255 h10-2^255 q = 0.
+       // Goal: Output h[0]+...+2^230 h[9].
+
+       s[0] = byte(h[0] >> 0)
+       s[1] = byte(h[0] >> 8)
+       s[2] = byte(h[0] >> 16)
+       s[3] = byte((h[0] >> 24) | (h[1] << 2))
+       s[4] = byte(h[1] >> 6)
+       s[5] = byte(h[1] >> 14)
+       s[6] = byte((h[1] >> 22) | (h[2] << 3))
+       s[7] = byte(h[2] >> 5)
+       s[8] = byte(h[2] >> 13)
+       s[9] = byte((h[2] >> 21) | (h[3] << 5))
+       s[10] = byte(h[3] >> 3)
+       s[11] = byte(h[3] >> 11)
+       s[12] = byte((h[3] >> 19) | (h[4] << 6))
+       s[13] = byte(h[4] >> 2)
+       s[14] = byte(h[4] >> 10)
+       s[15] = byte(h[4] >> 18)
+       s[16] = byte(h[5] >> 0)
+       s[17] = byte(h[5] >> 8)
+       s[18] = byte(h[5] >> 16)
+       s[19] = byte((h[5] >> 24) | (h[6] << 1))
+       s[20] = byte(h[6] >> 7)
+       s[21] = byte(h[6] >> 15)
+       s[22] = byte((h[6] >> 23) | (h[7] << 3))
+       s[23] = byte(h[7] >> 5)
+       s[24] = byte(h[7] >> 13)
+       s[25] = byte((h[7] >> 21) | (h[8] << 4))
+       s[26] = byte(h[8] >> 4)
+       s[27] = byte(h[8] >> 12)
+       s[28] = byte((h[8] >> 20) | (h[9] << 6))
+       s[29] = byte(h[9] >> 2)
+       s[30] = byte(h[9] >> 10)
+       s[31] = byte(h[9] >> 18)
+}
+
+func FeIsNegative(f *FieldElement) byte {
+       var s [32]byte
+       FeToBytes(&s, f)
+       return s[0] & 1
+}
+
+func FeIsNonZero(f *FieldElement) int32 {
+       var s [32]byte
+       FeToBytes(&s, f)
+       var x uint8
+       for _, b := range s {
+               x |= b
+       }
+       x |= x >> 4
+       x |= x >> 2
+       x |= x >> 1
+       return int32(x & 1)
+}
+
+// FeNeg sets h = -f
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func FeNeg(h, f *FieldElement) {
+       h[0] = -f[0]
+       h[1] = -f[1]
+       h[2] = -f[2]
+       h[3] = -f[3]
+       h[4] = -f[4]
+       h[5] = -f[5]
+       h[6] = -f[6]
+       h[7] = -f[7]
+       h[8] = -f[8]
+       h[9] = -f[9]
+}
+
+func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {
+       var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64
+
+       /*
+         |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
+           i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
+         |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
+           i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
+       */
+
+       c0 = (h0 + (1 << 25)) >> 26
+       h1 += c0
+       h0 -= c0 << 26
+       c4 = (h4 + (1 << 25)) >> 26
+       h5 += c4
+       h4 -= c4 << 26
+       /* |h0| <= 2^25 */
+       /* |h4| <= 2^25 */
+       /* |h1| <= 1.51*2^58 */
+       /* |h5| <= 1.51*2^58 */
+
+       c1 = (h1 + (1 << 24)) >> 25
+       h2 += c1
+       h1 -= c1 << 25
+       c5 = (h5 + (1 << 24)) >> 25
+       h6 += c5
+       h5 -= c5 << 25
+       /* |h1| <= 2^24; from now on fits into int32 */
+       /* |h5| <= 2^24; from now on fits into int32 */
+       /* |h2| <= 1.21*2^59 */
+       /* |h6| <= 1.21*2^59 */
+
+       c2 = (h2 + (1 << 25)) >> 26
+       h3 += c2
+       h2 -= c2 << 26
+       c6 = (h6 + (1 << 25)) >> 26
+       h7 += c6
+       h6 -= c6 << 26
+       /* |h2| <= 2^25; from now on fits into int32 unchanged */
+       /* |h6| <= 2^25; from now on fits into int32 unchanged */
+       /* |h3| <= 1.51*2^58 */
+       /* |h7| <= 1.51*2^58 */
+
+       c3 = (h3 + (1 << 24)) >> 25
+       h4 += c3
+       h3 -= c3 << 25
+       c7 = (h7 + (1 << 24)) >> 25
+       h8 += c7
+       h7 -= c7 << 25
+       /* |h3| <= 2^24; from now on fits into int32 unchanged */
+       /* |h7| <= 2^24; from now on fits into int32 unchanged */
+       /* |h4| <= 1.52*2^33 */
+       /* |h8| <= 1.52*2^33 */
+
+       c4 = (h4 + (1 << 25)) >> 26
+       h5 += c4
+       h4 -= c4 << 26
+       c8 = (h8 + (1 << 25)) >> 26
+       h9 += c8
+       h8 -= c8 << 26
+       /* |h4| <= 2^25; from now on fits into int32 unchanged */
+       /* |h8| <= 2^25; from now on fits into int32 unchanged */
+       /* |h5| <= 1.01*2^24 */
+       /* |h9| <= 1.51*2^58 */
+
+       c9 = (h9 + (1 << 24)) >> 25
+       h0 += c9 * 19
+       h9 -= c9 << 25
+       /* |h9| <= 2^24; from now on fits into int32 unchanged */
+       /* |h0| <= 1.8*2^37 */
+
+       c0 = (h0 + (1 << 25)) >> 26
+       h1 += c0
+       h0 -= c0 << 26
+       /* |h0| <= 2^25; from now on fits into int32 unchanged */
+       /* |h1| <= 1.01*2^24 */
+
+       h[0] = int32(h0)
+       h[1] = int32(h1)
+       h[2] = int32(h2)
+       h[3] = int32(h3)
+       h[4] = int32(h4)
+       h[5] = int32(h5)
+       h[6] = int32(h6)
+       h[7] = int32(h7)
+       h[8] = int32(h8)
+       h[9] = int32(h9)
+}
+
+// FeMul calculates h = f * g
+// Can overlap h with f or g.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Notes on implementation strategy:
+//
+// Using schoolbook multiplication.
+// Karatsuba would save a little in some cost models.
+//
+// Most multiplications by 2 and 19 are 32-bit precomputations;
+// cheaper than 64-bit postcomputations.
+//
+// There is one remaining multiplication by 19 in the carry chain;
+// one *19 precomputation can be merged into this,
+// but the resulting data flow is considerably less clean.
+//
+// There are 12 carries below.
+// 10 of them are 2-way parallelizable and vectorizable.
+// Can get away with 11 carries, but then data flow is much deeper.
+//
+// With tighter constraints on inputs, can squeeze carries into int32.
+func FeMul(h, f, g *FieldElement) {
+       f0 := int64(f[0])
+       f1 := int64(f[1])
+       f2 := int64(f[2])
+       f3 := int64(f[3])
+       f4 := int64(f[4])
+       f5 := int64(f[5])
+       f6 := int64(f[6])
+       f7 := int64(f[7])
+       f8 := int64(f[8])
+       f9 := int64(f[9])
+
+       f1_2 := int64(2 * f[1])
+       f3_2 := int64(2 * f[3])
+       f5_2 := int64(2 * f[5])
+       f7_2 := int64(2 * f[7])
+       f9_2 := int64(2 * f[9])
+
+       g0 := int64(g[0])
+       g1 := int64(g[1])
+       g2 := int64(g[2])
+       g3 := int64(g[3])
+       g4 := int64(g[4])
+       g5 := int64(g[5])
+       g6 := int64(g[6])
+       g7 := int64(g[7])
+       g8 := int64(g[8])
+       g9 := int64(g[9])
+
+       g1_19 := int64(19 * g[1]) /* 1.4*2^29 */
+       g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */
+       g3_19 := int64(19 * g[3])
+       g4_19 := int64(19 * g[4])
+       g5_19 := int64(19 * g[5])
+       g6_19 := int64(19 * g[6])
+       g7_19 := int64(19 * g[7])
+       g8_19 := int64(19 * g[8])
+       g9_19 := int64(19 * g[9])
+
+       h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19
+       h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19
+       h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19
+       h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19
+       h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19
+       h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19
+       h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19
+       h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19
+       h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19
+       h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0
+
+       FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {
+       f0 := int64(f[0])
+       f1 := int64(f[1])
+       f2 := int64(f[2])
+       f3 := int64(f[3])
+       f4 := int64(f[4])
+       f5 := int64(f[5])
+       f6 := int64(f[6])
+       f7 := int64(f[7])
+       f8 := int64(f[8])
+       f9 := int64(f[9])
+       f0_2 := int64(2 * f[0])
+       f1_2 := int64(2 * f[1])
+       f2_2 := int64(2 * f[2])
+       f3_2 := int64(2 * f[3])
+       f4_2 := int64(2 * f[4])
+       f5_2 := int64(2 * f[5])
+       f6_2 := int64(2 * f[6])
+       f7_2 := int64(2 * f[7])
+       f5_38 := 38 * f5 // 1.31*2^30
+       f6_19 := 19 * f6 // 1.31*2^30
+       f7_38 := 38 * f7 // 1.31*2^30
+       f8_19 := 19 * f8 // 1.31*2^30
+       f9_38 := 38 * f9 // 1.31*2^30
+
+       h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38
+       h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19
+       h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19
+       h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38
+       h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38
+       h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19
+       h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19
+       h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38
+       h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38
+       h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5
+
+       return
+}
+
+// FeSquare calculates h = f*f. Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func FeSquare(h, f *FieldElement) {
+       h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)
+       FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+// FeSquare2 sets h = 2 * f * f
+//
+// Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
+// See fe_mul.c for discussion of implementation strategy.
+func FeSquare2(h, f *FieldElement) {
+       h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)
+
+       h0 += h0
+       h1 += h1
+       h2 += h2
+       h3 += h3
+       h4 += h4
+       h5 += h5
+       h6 += h6
+       h7 += h7
+       h8 += h8
+       h9 += h9
+
+       FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+func FeInvert(out, z *FieldElement) {
+       var t0, t1, t2, t3 FieldElement
+       var i int
+
+       FeSquare(&t0, z)        // 2^1
+       FeSquare(&t1, &t0)      // 2^2
+       for i = 1; i < 2; i++ { // 2^3
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t1, z, &t1)      // 2^3 + 2^0
+       FeMul(&t0, &t0, &t1)    // 2^3 + 2^1 + 2^0
+       FeSquare(&t2, &t0)      // 2^4 + 2^2 + 2^1
+       FeMul(&t1, &t1, &t2)    // 2^4 + 2^3 + 2^2 + 2^1 + 2^0
+       FeSquare(&t2, &t1)      // 5,4,3,2,1
+       for i = 1; i < 5; i++ { // 9,8,7,6,5
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t1, &t2, &t1)     // 9,8,7,6,5,4,3,2,1,0
+       FeSquare(&t2, &t1)       // 10..1
+       for i = 1; i < 10; i++ { // 19..10
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t2, &t2, &t1)     // 19..0
+       FeSquare(&t3, &t2)       // 20..1
+       for i = 1; i < 20; i++ { // 39..20
+               FeSquare(&t3, &t3)
+       }
+       FeMul(&t2, &t3, &t2)     // 39..0
+       FeSquare(&t2, &t2)       // 40..1
+       for i = 1; i < 10; i++ { // 49..10
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t1, &t2, &t1)     // 49..0
+       FeSquare(&t2, &t1)       // 50..1
+       for i = 1; i < 50; i++ { // 99..50
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t2, &t2, &t1)      // 99..0
+       FeSquare(&t3, &t2)        // 100..1
+       for i = 1; i < 100; i++ { // 199..100
+               FeSquare(&t3, &t3)
+       }
+       FeMul(&t2, &t3, &t2)     // 199..0
+       FeSquare(&t2, &t2)       // 200..1
+       for i = 1; i < 50; i++ { // 249..50
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t1, &t2, &t1)    // 249..0
+       FeSquare(&t1, &t1)      // 250..1
+       for i = 1; i < 5; i++ { // 254..5
+               FeSquare(&t1, &t1)
+       }
+       FeMul(out, &t1, &t0) // 254..5,3,1,0
+}
+
+func fePow22523(out, z *FieldElement) {
+       var t0, t1, t2 FieldElement
+       var i int
+
+       FeSquare(&t0, z)
+       for i = 1; i < 1; i++ {
+               FeSquare(&t0, &t0)
+       }
+       FeSquare(&t1, &t0)
+       for i = 1; i < 2; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t1, z, &t1)
+       FeMul(&t0, &t0, &t1)
+       FeSquare(&t0, &t0)
+       for i = 1; i < 1; i++ {
+               FeSquare(&t0, &t0)
+       }
+       FeMul(&t0, &t1, &t0)
+       FeSquare(&t1, &t0)
+       for i = 1; i < 5; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t0, &t1, &t0)
+       FeSquare(&t1, &t0)
+       for i = 1; i < 10; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t1, &t1, &t0)
+       FeSquare(&t2, &t1)
+       for i = 1; i < 20; i++ {
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t1, &t2, &t1)
+       FeSquare(&t1, &t1)
+       for i = 1; i < 10; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t0, &t1, &t0)
+       FeSquare(&t1, &t0)
+       for i = 1; i < 50; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t1, &t1, &t0)
+       FeSquare(&t2, &t1)
+       for i = 1; i < 100; i++ {
+               FeSquare(&t2, &t2)
+       }
+       FeMul(&t1, &t2, &t1)
+       FeSquare(&t1, &t1)
+       for i = 1; i < 50; i++ {
+               FeSquare(&t1, &t1)
+       }
+       FeMul(&t0, &t1, &t0)
+       FeSquare(&t0, &t0)
+       for i = 1; i < 2; i++ {
+               FeSquare(&t0, &t0)
+       }
+       FeMul(out, &t0, z)
+}
+
+// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 *
+// y^2 where d = -121665/121666.
+//
+// Several representations are used:
+//   ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z
+//   ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
+//   CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
+//   PreComputedGroupElement: (y+x,y-x,2dxy)
+
+type ProjectiveGroupElement struct {
+       X, Y, Z FieldElement
+}
+
+type ExtendedGroupElement struct {
+       X, Y, Z, T FieldElement
+}
+
+type CompletedGroupElement struct {
+       X, Y, Z, T FieldElement
+}
+
+type PreComputedGroupElement struct {
+       yPlusX, yMinusX, xy2d FieldElement
+}
+
+type CachedGroupElement struct {
+       yPlusX, yMinusX, Z, T2d FieldElement
+}
+
+func (p *ProjectiveGroupElement) Zero() {
+       FeZero(&p.X)
+       FeOne(&p.Y)
+       FeOne(&p.Z)
+}
+
+func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) {
+       var t0 FieldElement
+
+       FeSquare(&r.X, &p.X)
+       FeSquare(&r.Z, &p.Y)
+       FeSquare2(&r.T, &p.Z)
+       FeAdd(&r.Y, &p.X, &p.Y)
+       FeSquare(&t0, &r.Y)
+       FeAdd(&r.Y, &r.Z, &r.X)
+       FeSub(&r.Z, &r.Z, &r.X)
+       FeSub(&r.X, &t0, &r.Y)
+       FeSub(&r.T, &r.T, &r.Z)
+}
+
+func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) {
+       var recip, x, y FieldElement
+
+       FeInvert(&recip, &p.Z)
+       FeMul(&x, &p.X, &recip)
+       FeMul(&y, &p.Y, &recip)
+       FeToBytes(s, &y)
+       s[31] ^= FeIsNegative(&x) << 7
+}
+
+func (p *ExtendedGroupElement) Zero() {
+       FeZero(&p.X)
+       FeOne(&p.Y)
+       FeOne(&p.Z)
+       FeZero(&p.T)
+}
+
+func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) {
+       var q ProjectiveGroupElement
+       p.ToProjective(&q)
+       q.Double(r)
+}
+
+func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) {
+       FeAdd(&r.yPlusX, &p.Y, &p.X)
+       FeSub(&r.yMinusX, &p.Y, &p.X)
+       FeCopy(&r.Z, &p.Z)
+       FeMul(&r.T2d, &p.T, &d2)
+}
+
+func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) {
+       FeCopy(&r.X, &p.X)
+       FeCopy(&r.Y, &p.Y)
+       FeCopy(&r.Z, &p.Z)
+}
+
+func (p *ExtendedGroupElement) ToBytes(s *[32]byte) {
+       var recip, x, y FieldElement
+
+       FeInvert(&recip, &p.Z)
+       FeMul(&x, &p.X, &recip)
+       FeMul(&y, &p.Y, &recip)
+       FeToBytes(s, &y)
+       s[31] ^= FeIsNegative(&x) << 7
+}
+
+func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool {
+       var u, v, v3, vxx, check FieldElement
+
+       FeFromBytes(&p.Y, s)
+       FeOne(&p.Z)
+       FeSquare(&u, &p.Y)
+       FeMul(&v, &u, &d)
+       FeSub(&u, &u, &p.Z) // y = y^2-1
+       FeAdd(&v, &v, &p.Z) // v = dy^2+1
+
+       FeSquare(&v3, &v)
+       FeMul(&v3, &v3, &v) // v3 = v^3
+       FeSquare(&p.X, &v3)
+       FeMul(&p.X, &p.X, &v)
+       FeMul(&p.X, &p.X, &u) // x = uv^7
+
+       fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8)
+       FeMul(&p.X, &p.X, &v3)
+       FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8)
+
+       var tmpX, tmp2 [32]byte
+
+       FeSquare(&vxx, &p.X)
+       FeMul(&vxx, &vxx, &v)
+       FeSub(&check, &vxx, &u) // vx^2-u
+       if FeIsNonZero(&check) == 1 {
+               FeAdd(&check, &vxx, &u) // vx^2+u
+               if FeIsNonZero(&check) == 1 {
+                       return false
+               }
+               FeMul(&p.X, &p.X, &SqrtM1)
+
+               FeToBytes(&tmpX, &p.X)
+               for i, v := range tmpX {
+                       tmp2[31-i] = v
+               }
+       }
+
+       if FeIsNegative(&p.X) != (s[31] >> 7) {
+               FeNeg(&p.X, &p.X)
+       }
+
+       FeMul(&p.T, &p.X, &p.Y)
+       return true
+}
+
+func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) {
+       FeMul(&r.X, &p.X, &p.T)
+       FeMul(&r.Y, &p.Y, &p.Z)
+       FeMul(&r.Z, &p.Z, &p.T)
+}
+
+func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) {
+       FeMul(&r.X, &p.X, &p.T)
+       FeMul(&r.Y, &p.Y, &p.Z)
+       FeMul(&r.Z, &p.Z, &p.T)
+       FeMul(&r.T, &p.X, &p.Y)
+}
+
+func (p *PreComputedGroupElement) Zero() {
+       FeOne(&p.yPlusX)
+       FeOne(&p.yMinusX)
+       FeZero(&p.xy2d)
+}
+
+func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {
+       var t0 FieldElement
+
+       FeAdd(&r.X, &p.Y, &p.X)
+       FeSub(&r.Y, &p.Y, &p.X)
+       FeMul(&r.Z, &r.X, &q.yPlusX)
+       FeMul(&r.Y, &r.Y, &q.yMinusX)
+       FeMul(&r.T, &q.T2d, &p.T)
+       FeMul(&r.X, &p.Z, &q.Z)
+       FeAdd(&t0, &r.X, &r.X)
+       FeSub(&r.X, &r.Z, &r.Y)
+       FeAdd(&r.Y, &r.Z, &r.Y)
+       FeAdd(&r.Z, &t0, &r.T)
+       FeSub(&r.T, &t0, &r.T)
+}
+
+func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {
+       var t0 FieldElement
+
+       FeAdd(&r.X, &p.Y, &p.X)
+       FeSub(&r.Y, &p.Y, &p.X)
+       FeMul(&r.Z, &r.X, &q.yMinusX)
+       FeMul(&r.Y, &r.Y, &q.yPlusX)
+       FeMul(&r.T, &q.T2d, &p.T)
+       FeMul(&r.X, &p.Z, &q.Z)
+       FeAdd(&t0, &r.X, &r.X)
+       FeSub(&r.X, &r.Z, &r.Y)
+       FeAdd(&r.Y, &r.Z, &r.Y)
+       FeSub(&r.Z, &t0, &r.T)
+       FeAdd(&r.T, &t0, &r.T)
+}
+
+func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {
+       var t0 FieldElement
+
+       FeAdd(&r.X, &p.Y, &p.X)
+       FeSub(&r.Y, &p.Y, &p.X)
+       FeMul(&r.Z, &r.X, &q.yPlusX)
+       FeMul(&r.Y, &r.Y, &q.yMinusX)
+       FeMul(&r.T, &q.xy2d, &p.T)
+       FeAdd(&t0, &p.Z, &p.Z)
+       FeSub(&r.X, &r.Z, &r.Y)
+       FeAdd(&r.Y, &r.Z, &r.Y)
+       FeAdd(&r.Z, &t0, &r.T)
+       FeSub(&r.T, &t0, &r.T)
+}
+
+func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {
+       var t0 FieldElement
+
+       FeAdd(&r.X, &p.Y, &p.X)
+       FeSub(&r.Y, &p.Y, &p.X)
+       FeMul(&r.Z, &r.X, &q.yMinusX)
+       FeMul(&r.Y, &r.Y, &q.yPlusX)
+       FeMul(&r.T, &q.xy2d, &p.T)
+       FeAdd(&t0, &p.Z, &p.Z)
+       FeSub(&r.X, &r.Z, &r.Y)
+       FeAdd(&r.Y, &r.Z, &r.Y)
+       FeSub(&r.Z, &t0, &r.T)
+       FeAdd(&r.T, &t0, &r.T)
+}
+
+func slide(r *[256]int8, a *[32]byte) {
+       for i := range r {
+               r[i] = int8(1 & (a[i>>3] >> uint(i&7)))
+       }
+
+       for i := range r {
+               if r[i] != 0 {
+                       for b := 1; b <= 6 && i+b < 256; b++ {
+                               if r[i+b] != 0 {
+                                       if r[i]+(r[i+b]<<uint(b)) <= 15 {
+                                               r[i] += r[i+b] << uint(b)
+                                               r[i+b] = 0
+                                       } else if r[i]-(r[i+b]<<uint(b)) >= -15 {
+                                               r[i] -= r[i+b] << uint(b)
+                                               for k := i + b; k < 256; k++ {
+                                                       if r[k] == 0 {
+                                                               r[k] = 1
+                                                               break
+                                                       }
+                                                       r[k] = 0
+                                               }
+                                       } else {
+                                               break
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+// GeDoubleScalarMultVartime sets r = a*A + b*B
+// where a = a[0]+256*a[1]+...+256^31 a[31].
+// and b = b[0]+256*b[1]+...+256^31 b[31].
+// B is the Ed25519 base point (x,4/5) with x positive.
+func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) {
+       var aSlide, bSlide [256]int8
+       var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A
+       var t CompletedGroupElement
+       var u, A2 ExtendedGroupElement
+       var i int
+
+       slide(&aSlide, a)
+       slide(&bSlide, b)
+
+       A.ToCached(&Ai[0])
+       A.Double(&t)
+       t.ToExtended(&A2)
+
+       for i := 0; i < 7; i++ {
+               geAdd(&t, &A2, &Ai[i])
+               t.ToExtended(&u)
+               u.ToCached(&Ai[i+1])
+       }
+
+       r.Zero()
+
+       for i = 255; i >= 0; i-- {
+               if aSlide[i] != 0 || bSlide[i] != 0 {
+                       break
+               }
+       }
+
+       for ; i >= 0; i-- {
+               r.Double(&t)
+
+               if aSlide[i] > 0 {
+                       t.ToExtended(&u)
+                       geAdd(&t, &u, &Ai[aSlide[i]/2])
+               } else if aSlide[i] < 0 {
+                       t.ToExtended(&u)
+                       geSub(&t, &u, &Ai[(-aSlide[i])/2])
+               }
+
+               if bSlide[i] > 0 {
+                       t.ToExtended(&u)
+                       geMixedAdd(&t, &u, &bi[bSlide[i]/2])
+               } else if bSlide[i] < 0 {
+                       t.ToExtended(&u)
+                       geMixedSub(&t, &u, &bi[(-bSlide[i])/2])
+               }
+
+               t.ToProjective(r)
+       }
+}
+
+// equal returns 1 if b == c and 0 otherwise, assuming that b and c are
+// non-negative.
+func equal(b, c int32) int32 {
+       x := uint32(b ^ c)
+       x--
+       return int32(x >> 31)
+}
+
+// negative returns 1 if b < 0 and 0 otherwise.
+func negative(b int32) int32 {
+       return (b >> 31) & 1
+}
+
+func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) {
+       FeCMove(&t.yPlusX, &u.yPlusX, b)
+       FeCMove(&t.yMinusX, &u.yMinusX, b)
+       FeCMove(&t.xy2d, &u.xy2d, b)
+}
+
+func selectPoint(t *PreComputedGroupElement, pos int32, b int32) {
+       var minusT PreComputedGroupElement
+       bNegative := negative(b)
+       bAbs := b - (((-bNegative) & b) << 1)
+
+       t.Zero()
+       for i := int32(0); i < 8; i++ {
+               PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1))
+       }
+       FeCopy(&minusT.yPlusX, &t.yMinusX)
+       FeCopy(&minusT.yMinusX, &t.yPlusX)
+       FeNeg(&minusT.xy2d, &t.xy2d)
+       PreComputedGroupElementCMove(t, &minusT, bNegative)
+}
+
+// GeScalarMultBase computes h = a*B, where
+//   a = a[0]+256*a[1]+...+256^31 a[31]
+//   B is the Ed25519 base point (x,4/5) with x positive.
+//
+// Preconditions:
+//   a[31] <= 127
+func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) {
+       var e [64]int8
+
+       for i, v := range a {
+               e[2*i] = int8(v & 15)
+               e[2*i+1] = int8((v >> 4) & 15)
+       }
+
+       // each e[i] is between 0 and 15 and e[63] is between 0 and 7.
+
+       carry := int8(0)
+       for i := 0; i < 63; i++ {
+               e[i] += carry
+               carry = (e[i] + 8) >> 4
+               e[i] -= carry << 4
+       }
+       e[63] += carry
+       // each e[i] is between -8 and 8.
+
+       h.Zero()
+       var t PreComputedGroupElement
+       var r CompletedGroupElement
+       for i := int32(1); i < 64; i += 2 {
+               selectPoint(&t, i/2, int32(e[i]))
+               geMixedAdd(&r, h, &t)
+               r.ToExtended(h)
+       }
+
+       var s ProjectiveGroupElement
+
+       h.Double(&r)
+       r.ToProjective(&s)
+       s.Double(&r)
+       r.ToProjective(&s)
+       s.Double(&r)
+       r.ToProjective(&s)
+       s.Double(&r)
+       r.ToExtended(h)
+
+       for i := int32(0); i < 64; i += 2 {
+               selectPoint(&t, i/2, int32(e[i]))
+               geMixedAdd(&r, h, &t)
+               r.ToExtended(h)
+       }
+}
+
+// The scalars are GF(2^252 + 27742317777372353535851937790883648493).
+
+// Input:
+//   a[0]+256*a[1]+...+256^31*a[31] = a
+//   b[0]+256*b[1]+...+256^31*b[31] = b
+//   c[0]+256*c[1]+...+256^31*c[31] = c
+//
+// Output:
+//   s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
+//   where l = 2^252 + 27742317777372353535851937790883648493.
+func ScMulAdd(s, a, b, c *[32]byte) {
+       a0 := 2097151 & load3(a[:])
+       a1 := 2097151 & (load4(a[2:]) >> 5)
+       a2 := 2097151 & (load3(a[5:]) >> 2)
+       a3 := 2097151 & (load4(a[7:]) >> 7)
+       a4 := 2097151 & (load4(a[10:]) >> 4)
+       a5 := 2097151 & (load3(a[13:]) >> 1)
+       a6 := 2097151 & (load4(a[15:]) >> 6)
+       a7 := 2097151 & (load3(a[18:]) >> 3)
+       a8 := 2097151 & load3(a[21:])
+       a9 := 2097151 & (load4(a[23:]) >> 5)
+       a10 := 2097151 & (load3(a[26:]) >> 2)
+       a11 := (load4(a[28:]) >> 7)
+       b0 := 2097151 & load3(b[:])
+       b1 := 2097151 & (load4(b[2:]) >> 5)
+       b2 := 2097151 & (load3(b[5:]) >> 2)
+       b3 := 2097151 & (load4(b[7:]) >> 7)
+       b4 := 2097151 & (load4(b[10:]) >> 4)
+       b5 := 2097151 & (load3(b[13:]) >> 1)
+       b6 := 2097151 & (load4(b[15:]) >> 6)
+       b7 := 2097151 & (load3(b[18:]) >> 3)
+       b8 := 2097151 & load3(b[21:])
+       b9 := 2097151 & (load4(b[23:]) >> 5)
+       b10 := 2097151 & (load3(b[26:]) >> 2)
+       b11 := (load4(b[28:]) >> 7)
+       c0 := 2097151 & load3(c[:])
+       c1 := 2097151 & (load4(c[2:]) >> 5)
+       c2 := 2097151 & (load3(c[5:]) >> 2)
+       c3 := 2097151 & (load4(c[7:]) >> 7)
+       c4 := 2097151 & (load4(c[10:]) >> 4)
+       c5 := 2097151 & (load3(c[13:]) >> 1)
+       c6 := 2097151 & (load4(c[15:]) >> 6)
+       c7 := 2097151 & (load3(c[18:]) >> 3)
+       c8 := 2097151 & load3(c[21:])
+       c9 := 2097151 & (load4(c[23:]) >> 5)
+       c10 := 2097151 & (load3(c[26:]) >> 2)
+       c11 := (load4(c[28:]) >> 7)
+       var carry [23]int64
+
+       s0 := c0 + a0*b0
+       s1 := c1 + a0*b1 + a1*b0
+       s2 := c2 + a0*b2 + a1*b1 + a2*b0
+       s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0
+       s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0
+       s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0
+       s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0
+       s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0
+       s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0
+       s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0
+       s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0
+       s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0
+       s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1
+       s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2
+       s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3
+       s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4
+       s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5
+       s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6
+       s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7
+       s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8
+       s20 := a9*b11 + a10*b10 + a11*b9
+       s21 := a10*b11 + a11*b10
+       s22 := a11 * b11
+       s23 := int64(0)
+
+       carry[0] = (s0 + (1 << 20)) >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[2] = (s2 + (1 << 20)) >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[4] = (s4 + (1 << 20)) >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[6] = (s6 + (1 << 20)) >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[8] = (s8 + (1 << 20)) >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[10] = (s10 + (1 << 20)) >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+       carry[12] = (s12 + (1 << 20)) >> 21
+       s13 += carry[12]
+       s12 -= carry[12] << 21
+       carry[14] = (s14 + (1 << 20)) >> 21
+       s15 += carry[14]
+       s14 -= carry[14] << 21
+       carry[16] = (s16 + (1 << 20)) >> 21
+       s17 += carry[16]
+       s16 -= carry[16] << 21
+       carry[18] = (s18 + (1 << 20)) >> 21
+       s19 += carry[18]
+       s18 -= carry[18] << 21
+       carry[20] = (s20 + (1 << 20)) >> 21
+       s21 += carry[20]
+       s20 -= carry[20] << 21
+       carry[22] = (s22 + (1 << 20)) >> 21
+       s23 += carry[22]
+       s22 -= carry[22] << 21
+
+       carry[1] = (s1 + (1 << 20)) >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[3] = (s3 + (1 << 20)) >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[5] = (s5 + (1 << 20)) >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[7] = (s7 + (1 << 20)) >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[9] = (s9 + (1 << 20)) >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[11] = (s11 + (1 << 20)) >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+       carry[13] = (s13 + (1 << 20)) >> 21
+       s14 += carry[13]
+       s13 -= carry[13] << 21
+       carry[15] = (s15 + (1 << 20)) >> 21
+       s16 += carry[15]
+       s15 -= carry[15] << 21
+       carry[17] = (s17 + (1 << 20)) >> 21
+       s18 += carry[17]
+       s17 -= carry[17] << 21
+       carry[19] = (s19 + (1 << 20)) >> 21
+       s20 += carry[19]
+       s19 -= carry[19] << 21
+       carry[21] = (s21 + (1 << 20)) >> 21
+       s22 += carry[21]
+       s21 -= carry[21] << 21
+
+       s11 += s23 * 666643
+       s12 += s23 * 470296
+       s13 += s23 * 654183
+       s14 -= s23 * 997805
+       s15 += s23 * 136657
+       s16 -= s23 * 683901
+       s23 = 0
+
+       s10 += s22 * 666643
+       s11 += s22 * 470296
+       s12 += s22 * 654183
+       s13 -= s22 * 997805
+       s14 += s22 * 136657
+       s15 -= s22 * 683901
+       s22 = 0
+
+       s9 += s21 * 666643
+       s10 += s21 * 470296
+       s11 += s21 * 654183
+       s12 -= s21 * 997805
+       s13 += s21 * 136657
+       s14 -= s21 * 683901
+       s21 = 0
+
+       s8 += s20 * 666643
+       s9 += s20 * 470296
+       s10 += s20 * 654183
+       s11 -= s20 * 997805
+       s12 += s20 * 136657
+       s13 -= s20 * 683901
+       s20 = 0
+
+       s7 += s19 * 666643
+       s8 += s19 * 470296
+       s9 += s19 * 654183
+       s10 -= s19 * 997805
+       s11 += s19 * 136657
+       s12 -= s19 * 683901
+       s19 = 0
+
+       s6 += s18 * 666643
+       s7 += s18 * 470296
+       s8 += s18 * 654183
+       s9 -= s18 * 997805
+       s10 += s18 * 136657
+       s11 -= s18 * 683901
+       s18 = 0
+
+       carry[6] = (s6 + (1 << 20)) >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[8] = (s8 + (1 << 20)) >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[10] = (s10 + (1 << 20)) >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+       carry[12] = (s12 + (1 << 20)) >> 21
+       s13 += carry[12]
+       s12 -= carry[12] << 21
+       carry[14] = (s14 + (1 << 20)) >> 21
+       s15 += carry[14]
+       s14 -= carry[14] << 21
+       carry[16] = (s16 + (1 << 20)) >> 21
+       s17 += carry[16]
+       s16 -= carry[16] << 21
+
+       carry[7] = (s7 + (1 << 20)) >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[9] = (s9 + (1 << 20)) >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[11] = (s11 + (1 << 20)) >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+       carry[13] = (s13 + (1 << 20)) >> 21
+       s14 += carry[13]
+       s13 -= carry[13] << 21
+       carry[15] = (s15 + (1 << 20)) >> 21
+       s16 += carry[15]
+       s15 -= carry[15] << 21
+
+       s5 += s17 * 666643
+       s6 += s17 * 470296
+       s7 += s17 * 654183
+       s8 -= s17 * 997805
+       s9 += s17 * 136657
+       s10 -= s17 * 683901
+       s17 = 0
+
+       s4 += s16 * 666643
+       s5 += s16 * 470296
+       s6 += s16 * 654183
+       s7 -= s16 * 997805
+       s8 += s16 * 136657
+       s9 -= s16 * 683901
+       s16 = 0
+
+       s3 += s15 * 666643
+       s4 += s15 * 470296
+       s5 += s15 * 654183
+       s6 -= s15 * 997805
+       s7 += s15 * 136657
+       s8 -= s15 * 683901
+       s15 = 0
+
+       s2 += s14 * 666643
+       s3 += s14 * 470296
+       s4 += s14 * 654183
+       s5 -= s14 * 997805
+       s6 += s14 * 136657
+       s7 -= s14 * 683901
+       s14 = 0
+
+       s1 += s13 * 666643
+       s2 += s13 * 470296
+       s3 += s13 * 654183
+       s4 -= s13 * 997805
+       s5 += s13 * 136657
+       s6 -= s13 * 683901
+       s13 = 0
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = (s0 + (1 << 20)) >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[2] = (s2 + (1 << 20)) >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[4] = (s4 + (1 << 20)) >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[6] = (s6 + (1 << 20)) >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[8] = (s8 + (1 << 20)) >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[10] = (s10 + (1 << 20)) >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+
+       carry[1] = (s1 + (1 << 20)) >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[3] = (s3 + (1 << 20)) >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[5] = (s5 + (1 << 20)) >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[7] = (s7 + (1 << 20)) >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[9] = (s9 + (1 << 20)) >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[11] = (s11 + (1 << 20)) >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = s0 >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[1] = s1 >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[2] = s2 >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[3] = s3 >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[4] = s4 >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[5] = s5 >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[6] = s6 >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[7] = s7 >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[8] = s8 >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[9] = s9 >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[10] = s10 >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+       carry[11] = s11 >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = s0 >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[1] = s1 >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[2] = s2 >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[3] = s3 >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[4] = s4 >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[5] = s5 >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[6] = s6 >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[7] = s7 >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[8] = s8 >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[9] = s9 >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[10] = s10 >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+
+       s[0] = byte(s0 >> 0)
+       s[1] = byte(s0 >> 8)
+       s[2] = byte((s0 >> 16) | (s1 << 5))
+       s[3] = byte(s1 >> 3)
+       s[4] = byte(s1 >> 11)
+       s[5] = byte((s1 >> 19) | (s2 << 2))
+       s[6] = byte(s2 >> 6)
+       s[7] = byte((s2 >> 14) | (s3 << 7))
+       s[8] = byte(s3 >> 1)
+       s[9] = byte(s3 >> 9)
+       s[10] = byte((s3 >> 17) | (s4 << 4))
+       s[11] = byte(s4 >> 4)
+       s[12] = byte(s4 >> 12)
+       s[13] = byte((s4 >> 20) | (s5 << 1))
+       s[14] = byte(s5 >> 7)
+       s[15] = byte((s5 >> 15) | (s6 << 6))
+       s[16] = byte(s6 >> 2)
+       s[17] = byte(s6 >> 10)
+       s[18] = byte((s6 >> 18) | (s7 << 3))
+       s[19] = byte(s7 >> 5)
+       s[20] = byte(s7 >> 13)
+       s[21] = byte(s8 >> 0)
+       s[22] = byte(s8 >> 8)
+       s[23] = byte((s8 >> 16) | (s9 << 5))
+       s[24] = byte(s9 >> 3)
+       s[25] = byte(s9 >> 11)
+       s[26] = byte((s9 >> 19) | (s10 << 2))
+       s[27] = byte(s10 >> 6)
+       s[28] = byte((s10 >> 14) | (s11 << 7))
+       s[29] = byte(s11 >> 1)
+       s[30] = byte(s11 >> 9)
+       s[31] = byte(s11 >> 17)
+}
+
+// Input:
+//   s[0]+256*s[1]+...+256^63*s[63] = s
+//
+// Output:
+//   s[0]+256*s[1]+...+256^31*s[31] = s mod l
+//   where l = 2^252 + 27742317777372353535851937790883648493.
+func ScReduce(out *[32]byte, s *[64]byte) {
+       s0 := 2097151 & load3(s[:])
+       s1 := 2097151 & (load4(s[2:]) >> 5)
+       s2 := 2097151 & (load3(s[5:]) >> 2)
+       s3 := 2097151 & (load4(s[7:]) >> 7)
+       s4 := 2097151 & (load4(s[10:]) >> 4)
+       s5 := 2097151 & (load3(s[13:]) >> 1)
+       s6 := 2097151 & (load4(s[15:]) >> 6)
+       s7 := 2097151 & (load3(s[18:]) >> 3)
+       s8 := 2097151 & load3(s[21:])
+       s9 := 2097151 & (load4(s[23:]) >> 5)
+       s10 := 2097151 & (load3(s[26:]) >> 2)
+       s11 := 2097151 & (load4(s[28:]) >> 7)
+       s12 := 2097151 & (load4(s[31:]) >> 4)
+       s13 := 2097151 & (load3(s[34:]) >> 1)
+       s14 := 2097151 & (load4(s[36:]) >> 6)
+       s15 := 2097151 & (load3(s[39:]) >> 3)
+       s16 := 2097151 & load3(s[42:])
+       s17 := 2097151 & (load4(s[44:]) >> 5)
+       s18 := 2097151 & (load3(s[47:]) >> 2)
+       s19 := 2097151 & (load4(s[49:]) >> 7)
+       s20 := 2097151 & (load4(s[52:]) >> 4)
+       s21 := 2097151 & (load3(s[55:]) >> 1)
+       s22 := 2097151 & (load4(s[57:]) >> 6)
+       s23 := (load4(s[60:]) >> 3)
+
+       s11 += s23 * 666643
+       s12 += s23 * 470296
+       s13 += s23 * 654183
+       s14 -= s23 * 997805
+       s15 += s23 * 136657
+       s16 -= s23 * 683901
+       s23 = 0
+
+       s10 += s22 * 666643
+       s11 += s22 * 470296
+       s12 += s22 * 654183
+       s13 -= s22 * 997805
+       s14 += s22 * 136657
+       s15 -= s22 * 683901
+       s22 = 0
+
+       s9 += s21 * 666643
+       s10 += s21 * 470296
+       s11 += s21 * 654183
+       s12 -= s21 * 997805
+       s13 += s21 * 136657
+       s14 -= s21 * 683901
+       s21 = 0
+
+       s8 += s20 * 666643
+       s9 += s20 * 470296
+       s10 += s20 * 654183
+       s11 -= s20 * 997805
+       s12 += s20 * 136657
+       s13 -= s20 * 683901
+       s20 = 0
+
+       s7 += s19 * 666643
+       s8 += s19 * 470296
+       s9 += s19 * 654183
+       s10 -= s19 * 997805
+       s11 += s19 * 136657
+       s12 -= s19 * 683901
+       s19 = 0
+
+       s6 += s18 * 666643
+       s7 += s18 * 470296
+       s8 += s18 * 654183
+       s9 -= s18 * 997805
+       s10 += s18 * 136657
+       s11 -= s18 * 683901
+       s18 = 0
+
+       var carry [17]int64
+
+       carry[6] = (s6 + (1 << 20)) >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[8] = (s8 + (1 << 20)) >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[10] = (s10 + (1 << 20)) >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+       carry[12] = (s12 + (1 << 20)) >> 21
+       s13 += carry[12]
+       s12 -= carry[12] << 21
+       carry[14] = (s14 + (1 << 20)) >> 21
+       s15 += carry[14]
+       s14 -= carry[14] << 21
+       carry[16] = (s16 + (1 << 20)) >> 21
+       s17 += carry[16]
+       s16 -= carry[16] << 21
+
+       carry[7] = (s7 + (1 << 20)) >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[9] = (s9 + (1 << 20)) >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[11] = (s11 + (1 << 20)) >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+       carry[13] = (s13 + (1 << 20)) >> 21
+       s14 += carry[13]
+       s13 -= carry[13] << 21
+       carry[15] = (s15 + (1 << 20)) >> 21
+       s16 += carry[15]
+       s15 -= carry[15] << 21
+
+       s5 += s17 * 666643
+       s6 += s17 * 470296
+       s7 += s17 * 654183
+       s8 -= s17 * 997805
+       s9 += s17 * 136657
+       s10 -= s17 * 683901
+       s17 = 0
+
+       s4 += s16 * 666643
+       s5 += s16 * 470296
+       s6 += s16 * 654183
+       s7 -= s16 * 997805
+       s8 += s16 * 136657
+       s9 -= s16 * 683901
+       s16 = 0
+
+       s3 += s15 * 666643
+       s4 += s15 * 470296
+       s5 += s15 * 654183
+       s6 -= s15 * 997805
+       s7 += s15 * 136657
+       s8 -= s15 * 683901
+       s15 = 0
+
+       s2 += s14 * 666643
+       s3 += s14 * 470296
+       s4 += s14 * 654183
+       s5 -= s14 * 997805
+       s6 += s14 * 136657
+       s7 -= s14 * 683901
+       s14 = 0
+
+       s1 += s13 * 666643
+       s2 += s13 * 470296
+       s3 += s13 * 654183
+       s4 -= s13 * 997805
+       s5 += s13 * 136657
+       s6 -= s13 * 683901
+       s13 = 0
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = (s0 + (1 << 20)) >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[2] = (s2 + (1 << 20)) >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[4] = (s4 + (1 << 20)) >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[6] = (s6 + (1 << 20)) >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[8] = (s8 + (1 << 20)) >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[10] = (s10 + (1 << 20)) >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+
+       carry[1] = (s1 + (1 << 20)) >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[3] = (s3 + (1 << 20)) >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[5] = (s5 + (1 << 20)) >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[7] = (s7 + (1 << 20)) >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[9] = (s9 + (1 << 20)) >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[11] = (s11 + (1 << 20)) >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = s0 >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[1] = s1 >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[2] = s2 >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[3] = s3 >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[4] = s4 >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[5] = s5 >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[6] = s6 >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[7] = s7 >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[8] = s8 >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[9] = s9 >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[10] = s10 >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+       carry[11] = s11 >> 21
+       s12 += carry[11]
+       s11 -= carry[11] << 21
+
+       s0 += s12 * 666643
+       s1 += s12 * 470296
+       s2 += s12 * 654183
+       s3 -= s12 * 997805
+       s4 += s12 * 136657
+       s5 -= s12 * 683901
+       s12 = 0
+
+       carry[0] = s0 >> 21
+       s1 += carry[0]
+       s0 -= carry[0] << 21
+       carry[1] = s1 >> 21
+       s2 += carry[1]
+       s1 -= carry[1] << 21
+       carry[2] = s2 >> 21
+       s3 += carry[2]
+       s2 -= carry[2] << 21
+       carry[3] = s3 >> 21
+       s4 += carry[3]
+       s3 -= carry[3] << 21
+       carry[4] = s4 >> 21
+       s5 += carry[4]
+       s4 -= carry[4] << 21
+       carry[5] = s5 >> 21
+       s6 += carry[5]
+       s5 -= carry[5] << 21
+       carry[6] = s6 >> 21
+       s7 += carry[6]
+       s6 -= carry[6] << 21
+       carry[7] = s7 >> 21
+       s8 += carry[7]
+       s7 -= carry[7] << 21
+       carry[8] = s8 >> 21
+       s9 += carry[8]
+       s8 -= carry[8] << 21
+       carry[9] = s9 >> 21
+       s10 += carry[9]
+       s9 -= carry[9] << 21
+       carry[10] = s10 >> 21
+       s11 += carry[10]
+       s10 -= carry[10] << 21
+
+       out[0] = byte(s0 >> 0)
+       out[1] = byte(s0 >> 8)
+       out[2] = byte((s0 >> 16) | (s1 << 5))
+       out[3] = byte(s1 >> 3)
+       out[4] = byte(s1 >> 11)
+       out[5] = byte((s1 >> 19) | (s2 << 2))
+       out[6] = byte(s2 >> 6)
+       out[7] = byte((s2 >> 14) | (s3 << 7))
+       out[8] = byte(s3 >> 1)
+       out[9] = byte(s3 >> 9)
+       out[10] = byte((s3 >> 17) | (s4 << 4))
+       out[11] = byte(s4 >> 4)
+       out[12] = byte(s4 >> 12)
+       out[13] = byte((s4 >> 20) | (s5 << 1))
+       out[14] = byte(s5 >> 7)
+       out[15] = byte((s5 >> 15) | (s6 << 6))
+       out[16] = byte(s6 >> 2)
+       out[17] = byte(s6 >> 10)
+       out[18] = byte((s6 >> 18) | (s7 << 3))
+       out[19] = byte(s7 >> 5)
+       out[20] = byte(s7 >> 13)
+       out[21] = byte(s8 >> 0)
+       out[22] = byte(s8 >> 8)
+       out[23] = byte((s8 >> 16) | (s9 << 5))
+       out[24] = byte(s9 >> 3)
+       out[25] = byte(s9 >> 11)
+       out[26] = byte((s9 >> 19) | (s10 << 2))
+       out[27] = byte(s10 >> 6)
+       out[28] = byte((s10 >> 14) | (s11 << 7))
+       out[29] = byte(s11 >> 1)
+       out[30] = byte(s11 >> 9)
+       out[31] = byte(s11 >> 17)
+}
+
+// order is the order of Curve25519 in little-endian form.
+var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000}
+
+// ScMinimal returns true if the given scalar is less than the order of the
+// curve.
+func ScMinimal(scalar *[32]byte) bool {
+       for i := 3; ; i-- {
+               v := binary.LittleEndian.Uint64(scalar[i*8:])
+               if v > order[i] {
+                       return false
+               } else if v < order[i] {
+                       break
+               } else if i == 0 {
+                       return false
+               }
+       }
+
+       return true
+}
diff --git a/libgo/go/crypto/ed25519/testdata/sign.input.gz b/libgo/go/crypto/ed25519/testdata/sign.input.gz
new file mode 100644 (file)
index 0000000..e6dc728
Binary files /dev/null and b/libgo/go/crypto/ed25519/testdata/sign.input.gz differ
index 10196cf0bc994d3bfb7cbb72ea7257d28f5ffac4..eaeed0daccea00ad35d0ca85b73b288d13875775 100644 (file)
@@ -22,7 +22,7 @@ func TestFuzz(t *testing.T) {
        var timeout *time.Timer
 
        if testing.Short() {
-               timeout = time.NewTimer(500 * time.Millisecond)
+               timeout = time.NewTimer(10 * time.Millisecond)
        } else {
                timeout = time.NewTimer(2 * time.Second)
        }
index 40c0929cd0e8dfec73001eebc31654cd7a1de4ba..fb38e0a272d5d016c6103d0bb03ea7c5544ccc57 100644 (file)
@@ -16,7 +16,7 @@ import (
 
 const (
        offsetS390xHasVX  = unsafe.Offsetof(cpu.S390X.HasVX)
-       offsetS390xHasVE1 = unsafe.Offsetof(cpu.S390X.HasVE1)
+       offsetS390xHasVE1 = unsafe.Offsetof(cpu.S390X.HasVXE)
 )
 
 type p256CurveFast struct {
index 34c7f541c5740ca95492bc87fabc05abdb71f462..282ba1b8592f5f35af858768b5e3be595c969f56 100644 (file)
@@ -169,12 +169,12 @@ type unmarshalTest struct {
 
 var largeUnmarshalTests = []unmarshalTest{
        // Data length: 7_102_415_735
-       unmarshalTest{
+       {
                state: "md5\x01\xa5\xf7\xf0=\xd6S\x85\xd9M\n}\xc3\u0601\x89\xe7@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa7VCw",
                sum:   "cddefcf74ffec709a0b45a6a987564d5",
        },
        // Data length: 6_565_544_823
-       unmarshalTest{
+       {
                state: "md5\x01{\xda\x1a\xc7\xc9'?\x83EX\xe0\x88q\xfeG\x18@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87VCw",
                sum:   "fd9f41874ab240698e7bc9c3ae70c8e4",
        },
index bb213963fd44f4727bfd681888dac726b6256d8a..7e939742ac657bbe389305a512676f39feceb243 100644 (file)
@@ -13,6 +13,7 @@ func init() {
 }
 
 var jsCrypto = js.Global().Get("crypto")
+var uint8Array = js.Global().Get("Uint8Array")
 
 // reader implements a pseudorandom generator
 // using JavaScript crypto.getRandomValues method.
@@ -20,8 +21,8 @@ var jsCrypto = js.Global().Get("crypto")
 type reader struct{}
 
 func (r *reader) Read(b []byte) (int, error) {
-       a := js.TypedArrayOf(b)
+       a := uint8Array.New(len(b))
        jsCrypto.Call("getRandomValues", a)
-       a.Release()
+       js.CopyBytesToGo(b, a)
        return len(b), nil
 }
index 685624e1b3dfbea04abfe46291dd8f294a63b6ba..e76ce2018afe23edaa9af1f99bf4269c821cd0b5 100644 (file)
@@ -84,6 +84,9 @@ func TestIntMask(t *testing.T) {
        for max := 1; max <= 256; max++ {
                t.Run(fmt.Sprintf("max=%d", max), func(t *testing.T) {
                        for i := 0; i < max; i++ {
+                               if testing.Short() && i == 0 {
+                                       i = max - 1
+                               }
                                var b bytes.Buffer
                                b.WriteByte(byte(i))
                                n, err := rand.Int(&b, big.NewInt(int64(max)))
index 47444f311c341b8cc5eaf3430927b85d74d48aaf..7e62560a04fe109386fa250558a1349b6f3a8bbc 100644 (file)
@@ -274,8 +274,8 @@ func TestShortSessionKey(t *testing.T) {
        }
 }
 
-// In order to generate new test vectors you'll need the PEM form of this key:
-// -----BEGIN RSA PRIVATE KEY-----
+// In order to generate new test vectors you'll need the PEM form of this key (and s/TESTING/PRIVATE/):
+// -----BEGIN RSA TESTING KEY-----
 // MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
 // fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
 // /ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
@@ -283,7 +283,7 @@ func TestShortSessionKey(t *testing.T) {
 // EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
 // IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
 // tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-// -----END RSA PRIVATE KEY-----
+// -----END RSA TESTING KEY-----
 
 var rsaPrivateKey = &PrivateKey{
        PublicKey: PublicKey{
index 8c48042b1ce3f987c437d2825fedfb8e3d2ec48b..286a59d33d662bfa6fc955dea711f0a3d5eba6a8 100644 (file)
@@ -10,6 +10,7 @@ package sha1
 
 import (
        "crypto"
+       "encoding/binary"
        "errors"
        "hash"
 )
@@ -81,13 +82,13 @@ func (d *digest) UnmarshalBinary(b []byte) error {
 
 func appendUint64(b []byte, x uint64) []byte {
        var a [8]byte
-       putUint64(a[:], x)
+       binary.BigEndian.PutUint64(a[:], x)
        return append(b, a[:]...)
 }
 
 func appendUint32(b []byte, x uint32) []byte {
        var a [4]byte
-       putUint32(a[:], x)
+       binary.BigEndian.PutUint32(a[:], x)
        return append(b, a[:]...)
 }
 
@@ -170,7 +171,7 @@ func (d *digest) checkSum() [Size]byte {
 
        // Length in bits.
        len <<= 3
-       putUint64(tmp[:], len)
+       binary.BigEndian.PutUint64(tmp[:], len)
        d.Write(tmp[0:8])
 
        if d.nx != 0 {
@@ -179,11 +180,11 @@ func (d *digest) checkSum() [Size]byte {
 
        var digest [Size]byte
 
-       putUint32(digest[0:], d.h[0])
-       putUint32(digest[4:], d.h[1])
-       putUint32(digest[8:], d.h[2])
-       putUint32(digest[12:], d.h[3])
-       putUint32(digest[16:], d.h[4])
+       binary.BigEndian.PutUint32(digest[0:], d.h[0])
+       binary.BigEndian.PutUint32(digest[4:], d.h[1])
+       binary.BigEndian.PutUint32(digest[8:], d.h[2])
+       binary.BigEndian.PutUint32(digest[12:], d.h[3])
+       binary.BigEndian.PutUint32(digest[16:], d.h[4])
 
        return digest
 }
@@ -263,23 +264,3 @@ func Sum(data []byte) [Size]byte {
        d.Write(data)
        return d.checkSum()
 }
-
-func putUint64(x []byte, s uint64) {
-       _ = x[7]
-       x[0] = byte(s >> 56)
-       x[1] = byte(s >> 48)
-       x[2] = byte(s >> 40)
-       x[3] = byte(s >> 32)
-       x[4] = byte(s >> 24)
-       x[5] = byte(s >> 16)
-       x[6] = byte(s >> 8)
-       x[7] = byte(s)
-}
-
-func putUint32(x []byte, s uint32) {
-       _ = x[3]
-       x[0] = byte(s >> 24)
-       x[1] = byte(s >> 16)
-       x[2] = byte(s >> 8)
-       x[3] = byte(s)
-}
index c047204bf3164c2f5b4b2ff0598666b8d2d3ac42..681e928de2530ae7af7928b9b81d2d9eebaa522b 100644 (file)
@@ -168,12 +168,12 @@ type unmarshalTest struct {
 
 var largeUnmarshalTests = []unmarshalTest{
        // Data length: 7_102_415_735
-       unmarshalTest{
+       {
                state: "sha\x01\x13\xbc\xfe\x83\x8c\xbd\xdfP\x1f\xd8ڿ<\x9eji8t\xe1\xa5@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa7VCw",
                sum:   "bc6245c9959cc33e1c2592e5c9ea9b5d0431246c",
        },
        // Data length: 6_565_544_823
-       unmarshalTest{
+       {
                state: "sha\x01m;\x16\xa6R\xbe@\xa9nĈ\xf9S\x03\x00B\xc2\xdcv\xcf@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87VCw",
                sum:   "8f2d1c0e4271768f35feb918bfe21ea1387a2072",
        },
index 1d37544940f120485a636ce72204e0c1d3ae1261..321d34351c1f5e92b42e52114af76c30b84f3f45 100644 (file)
@@ -4,6 +4,10 @@
 
 package sha1
 
+import (
+       "math/bits"
+)
+
 const (
        _K0 = 0x5A827999
        _K1 = 0x6ED9EBA1
@@ -33,48 +37,37 @@ func blockGeneric(dig *digest, p []byte) {
                i := 0
                for ; i < 16; i++ {
                        f := b&c | (^b)&d
-                       a5 := a<<5 | a>>(32-5)
-                       b30 := b<<30 | b>>(32-30)
-                       t := a5 + f + e + w[i&0xf] + _K0
-                       a, b, c, d, e = t, a, b30, c, d
+                       t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K0
+                       a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
                }
                for ; i < 20; i++ {
                        tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
                        w[i&0xf] = tmp<<1 | tmp>>(32-1)
 
                        f := b&c | (^b)&d
-                       a5 := a<<5 | a>>(32-5)
-                       b30 := b<<30 | b>>(32-30)
-                       t := a5 + f + e + w[i&0xf] + _K0
-                       a, b, c, d, e = t, a, b30, c, d
+                       t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K0
+                       a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
                }
                for ; i < 40; i++ {
                        tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
                        w[i&0xf] = tmp<<1 | tmp>>(32-1)
                        f := b ^ c ^ d
-                       a5 := a<<5 | a>>(32-5)
-                       b30 := b<<30 | b>>(32-30)
-                       t := a5 + f + e + w[i&0xf] + _K1
-                       a, b, c, d, e = t, a, b30, c, d
+                       t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K1
+                       a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
                }
                for ; i < 60; i++ {
                        tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
                        w[i&0xf] = tmp<<1 | tmp>>(32-1)
                        f := ((b | c) & d) | (b & c)
-
-                       a5 := a<<5 | a>>(32-5)
-                       b30 := b<<30 | b>>(32-30)
-                       t := a5 + f + e + w[i&0xf] + _K2
-                       a, b, c, d, e = t, a, b30, c, d
+                       t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K2
+                       a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
                }
                for ; i < 80; i++ {
                        tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
                        w[i&0xf] = tmp<<1 | tmp>>(32-1)
                        f := b ^ c ^ d
-                       a5 := a<<5 | a>>(32-5)
-                       b30 := b<<30 | b>>(32-30)
-                       t := a5 + f + e + w[i&0xf] + _K3
-                       a, b, c, d, e = t, a, b30, c, d
+                       t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K3
+                       a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
                }
 
                h0 += a
index 3fd446f94b6f2835326e49406982e72533e8a73e..e1cccf65a60307517d7adecf7dcefdbd47d88aa5 100644 (file)
@@ -8,6 +8,7 @@ package sha256
 
 import (
        "crypto"
+       "encoding/binary"
        "errors"
        "hash"
 )
@@ -104,35 +105,15 @@ func (d *digest) UnmarshalBinary(b []byte) error {
        return nil
 }
 
-func putUint32(x []byte, s uint32) {
-       _ = x[3]
-       x[0] = byte(s >> 24)
-       x[1] = byte(s >> 16)
-       x[2] = byte(s >> 8)
-       x[3] = byte(s)
-}
-
-func putUint64(x []byte, s uint64) {
-       _ = x[7]
-       x[0] = byte(s >> 56)
-       x[1] = byte(s >> 48)
-       x[2] = byte(s >> 40)
-       x[3] = byte(s >> 32)
-       x[4] = byte(s >> 24)
-       x[5] = byte(s >> 16)
-       x[6] = byte(s >> 8)
-       x[7] = byte(s)
-}
-
 func appendUint64(b []byte, x uint64) []byte {
        var a [8]byte
-       putUint64(a[:], x)
+       binary.BigEndian.PutUint64(a[:], x)
        return append(b, a[:]...)
 }
 
 func appendUint32(b []byte, x uint32) []byte {
        var a [4]byte
-       putUint32(a[:], x)
+       binary.BigEndian.PutUint32(a[:], x)
        return append(b, a[:]...)
 }
 
@@ -246,7 +227,7 @@ func (d *digest) checkSum() [Size]byte {
 
        // Length in bits.
        len <<= 3
-       putUint64(tmp[:], len)
+       binary.BigEndian.PutUint64(tmp[:], len)
        d.Write(tmp[0:8])
 
        if d.nx != 0 {
@@ -255,15 +236,15 @@ func (d *digest) checkSum() [Size]byte {
 
        var digest [Size]byte
 
-       putUint32(digest[0:], d.h[0])
-       putUint32(digest[4:], d.h[1])
-       putUint32(digest[8:], d.h[2])
-       putUint32(digest[12:], d.h[3])
-       putUint32(digest[16:], d.h[4])
-       putUint32(digest[20:], d.h[5])
-       putUint32(digest[24:], d.h[6])
+       binary.BigEndian.PutUint32(digest[0:], d.h[0])
+       binary.BigEndian.PutUint32(digest[4:], d.h[1])
+       binary.BigEndian.PutUint32(digest[8:], d.h[2])
+       binary.BigEndian.PutUint32(digest[12:], d.h[3])
+       binary.BigEndian.PutUint32(digest[16:], d.h[4])
+       binary.BigEndian.PutUint32(digest[20:], d.h[5])
+       binary.BigEndian.PutUint32(digest[24:], d.h[6])
        if !d.is224 {
-               putUint32(digest[28:], d.h[7])
+               binary.BigEndian.PutUint32(digest[28:], d.h[7])
        }
 
        return digest
index a606190753505ee0968a10a9a40e34fd0fac961d..433c5a4c5e6254e9cd0acdd33f9a3c15bdb724a9 100644 (file)
@@ -241,19 +241,19 @@ type unmarshalTest struct {
 
 var largeUnmarshalTests = []unmarshalTest{
        // Data length: 7_115_087_207
-       unmarshalTest{
+       {
                state: "sha\x03yX\xaf\xb7\x04*\x8f\xaa\x9bx\xc5#\x1f\xeb\x94\xfdz1\xaf\xfbk֗\n\xc93\xcf\x02\v.\xa5\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa8\x17\x9dg",
                sum:   "f5e06371f0c115e9968455c8e48a318aba548b9f15676fa41de123f7d1c99c55",
        },
 
        // Data length: 7_070_038_086
-       unmarshalTest{
+       {
                state: "sha\x03$\x933u\nV\v\xe2\xf7:0!ʳ\xa4\x13\xd3 6\xdcBB\xb5\x19\xcd=\xc1h\xee=\xb4\x9c@ABCDE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa5h8F",
                sum:   "a280b08df5eba060fcd0eb3d29320bbc038afb95781661f91bbfd0a6fc9fdd6e",
        },
 
        // Data length: 6_464_878_887
-       unmarshalTest{
+       {
                state: "sha\x03\x9f\x12\x87G\xf2\xdf<\x82\xa0\x11/*W\x02&IKWlh\x03\x95\xb1\xab\f\n\xf6Ze\xf9\x1d\x1b\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x81V9'",
                sum:   "d2fffb762f105ab71e2d70069346c44c38c4fe183aad8cfcf5a76397c0457806",
        },
index d43bbf02453a7cd08727e08d9a189daaef945669..bd2f9da93ce847880142bfae645584ee4e09c442 100644 (file)
@@ -8,6 +8,8 @@
 
 package sha256
 
+import "math/bits"
+
 var _K = []uint32{
        0x428a2f98,
        0x71374491,
@@ -87,18 +89,18 @@ func blockGeneric(dig *digest, p []byte) {
                }
                for i := 16; i < 64; i++ {
                        v1 := w[i-2]
-                       t1 := (v1>>17 | v1<<(32-17)) ^ (v1>>19 | v1<<(32-19)) ^ (v1 >> 10)
+                       t1 := (bits.RotateLeft32(v1, -17)) ^ (bits.RotateLeft32(v1, -19)) ^ (v1 >> 10)
                        v2 := w[i-15]
-                       t2 := (v2>>7 | v2<<(32-7)) ^ (v2>>18 | v2<<(32-18)) ^ (v2 >> 3)
+                       t2 := (bits.RotateLeft32(v2, -7)) ^ (bits.RotateLeft32(v2, -18)) ^ (v2 >> 3)
                        w[i] = t1 + w[i-7] + t2 + w[i-16]
                }
 
                a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7
 
                for i := 0; i < 64; i++ {
-                       t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
+                       t1 := h + ((bits.RotateLeft32(e, -6)) ^ (bits.RotateLeft32(e, -11)) ^ (bits.RotateLeft32(e, -25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
 
-                       t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c))
+                       t2 := ((bits.RotateLeft32(a, -2)) ^ (bits.RotateLeft32(a, -13)) ^ (bits.RotateLeft32(a, -22))) + ((a & b) ^ (a & c) ^ (b & c))
 
                        h = g
                        g = f
index c685319480c24470578f88649d5de9cba8a0de3f..9c143a2a2817786095b94b2775db18210ff3a7be 100644 (file)
@@ -12,6 +12,7 @@ package sha512
 
 import (
        "crypto"
+       "encoding/binary"
        "errors"
        "hash"
 )
@@ -195,21 +196,9 @@ func (d *digest) UnmarshalBinary(b []byte) error {
        return nil
 }
 
-func putUint64(x []byte, s uint64) {
-       _ = x[7]
-       x[0] = byte(s >> 56)
-       x[1] = byte(s >> 48)
-       x[2] = byte(s >> 40)
-       x[3] = byte(s >> 32)
-       x[4] = byte(s >> 24)
-       x[5] = byte(s >> 16)
-       x[6] = byte(s >> 8)
-       x[7] = byte(s)
-}
-
 func appendUint64(b []byte, x uint64) []byte {
        var a [8]byte
-       putUint64(a[:], x)
+       binary.BigEndian.PutUint64(a[:], x)
        return append(b, a[:]...)
 }
 
@@ -316,8 +305,8 @@ func (d *digest) checkSum() [Size]byte {
 
        // Length in bits.
        len <<= 3
-       putUint64(tmp[0:], 0) // upper 64 bits are always zero, because len variable has type uint64
-       putUint64(tmp[8:], len)
+       binary.BigEndian.PutUint64(tmp[0:], 0) // upper 64 bits are always zero, because len variable has type uint64
+       binary.BigEndian.PutUint64(tmp[8:], len)
        d.Write(tmp[0:16])
 
        if d.nx != 0 {
@@ -325,15 +314,15 @@ func (d *digest) checkSum() [Size]byte {
        }
 
        var digest [Size]byte
-       putUint64(digest[0:], d.h[0])
-       putUint64(digest[8:], d.h[1])
-       putUint64(digest[16:], d.h[2])
-       putUint64(digest[24:], d.h[3])
-       putUint64(digest[32:], d.h[4])
-       putUint64(digest[40:], d.h[5])
+       binary.BigEndian.PutUint64(digest[0:], d.h[0])
+       binary.BigEndian.PutUint64(digest[8:], d.h[1])
+       binary.BigEndian.PutUint64(digest[16:], d.h[2])
+       binary.BigEndian.PutUint64(digest[24:], d.h[3])
+       binary.BigEndian.PutUint64(digest[32:], d.h[4])
+       binary.BigEndian.PutUint64(digest[40:], d.h[5])
        if d.function != crypto.SHA384 {
-               putUint64(digest[48:], d.h[6])
-               putUint64(digest[56:], d.h[7])
+               binary.BigEndian.PutUint64(digest[48:], d.h[6])
+               binary.BigEndian.PutUint64(digest[56:], d.h[7])
        }
 
        return digest
index 96a1aa69a4fcc090e7f4b08da4eb9e189078de4f..59998b1d38d7450c29ec2d5d191194f060fa20f2 100644 (file)
@@ -847,11 +847,11 @@ type unmarshalTest struct {
 
 var largeUnmarshalTests = []unmarshalTest{
        // Data length: 6_565_544_823
-       unmarshalTest{
+       {
                state: "sha\aηe\x0f\x0f\xe1r]#\aoJ!.{5B\xe4\x140\x91\xdd\x00a\xe1\xb3E&\xb9\xbb\aJ\x9f^\x9f\x03ͺD\x96H\x80\xb0X\x9d\xdeʸ\f\xf7:\xd5\xe6'\xb9\x93f\xddA\xf0~\xe1\x02\x14\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87VCw",
                sum:   "12d612357a1dbc74a28883dff79b83e7d2b881ae40d7a67fd7305490bc8a641cd1ce9ece598192080d6e9ac7e75d5988567a58a9812991299eb99a04ecb69523",
        },
-       unmarshalTest{
+       {
                state: "sha\a2\xd2\xdc\xf5\xd7\xe2\xf9\x97\xaa\xe7}Fϱ\xbc\x8e\xbf\x12h\x83Z\xa1\xc7\xf5p>bfS T\xea\xee\x1e\xa6Z\x9c\xa4ڶ\u0086\bn\xe47\x8fsGs3\xe0\xda\\\x9dqZ\xa5\xf6\xd0kM\xa1\xf2\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa7VCw",
                sum:   "94a04b9a901254cd94ca0313557e4be3ab1ca86e920c1f3efdc22d361e9ae12be66bc6d6dc5db79a0a4aa6eca6f293c1e9095bbae127ae405f6c325478343299",
        },
index 42e8d19fe8c850c87e9dbb78facf7c292acab8c6..81569c5f84e8964e955b5b5aa24e9f6e696c923d 100644 (file)
@@ -8,6 +8,8 @@
 
 package sha512
 
+import "math/bits"
+
 var _K = []uint64{
        0x428a2f98d728ae22,
        0x7137449123ef65cd,
@@ -102,9 +104,9 @@ func blockGeneric(dig *digest, p []byte) {
                }
                for i := 16; i < 80; i++ {
                        v1 := w[i-2]
-                       t1 := (v1>>19 | v1<<(64-19)) ^ (v1>>61 | v1<<(64-61)) ^ (v1 >> 6)
+                       t1 := bits.RotateLeft64(v1, -19) ^ bits.RotateLeft64(v1, -61) ^ (v1 >> 6)
                        v2 := w[i-15]
-                       t2 := (v2>>1 | v2<<(64-1)) ^ (v2>>8 | v2<<(64-8)) ^ (v2 >> 7)
+                       t2 := bits.RotateLeft64(v2, -1) ^ bits.RotateLeft64(v2, -8) ^ (v2 >> 7)
 
                        w[i] = t1 + w[i-7] + t2 + w[i-16]
                }
@@ -112,9 +114,9 @@ func blockGeneric(dig *digest, p []byte) {
                a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7
 
                for i := 0; i < 80; i++ {
-                       t1 := h + ((e>>14 | e<<(64-14)) ^ (e>>18 | e<<(64-18)) ^ (e>>41 | e<<(64-41))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
+                       t1 := h + (bits.RotateLeft64(e, -14) ^ bits.RotateLeft64(e, -18) ^ bits.RotateLeft64(e, -41)) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
 
-                       t2 := ((a>>28 | a<<(64-28)) ^ (a>>34 | a<<(64-34)) ^ (a>>39 | a<<(64-39))) + ((a & b) ^ (a & c) ^ (b & c))
+                       t2 := (bits.RotateLeft64(a, -28) ^ bits.RotateLeft64(a, -34) ^ bits.RotateLeft64(a, -39)) + ((a & b) ^ (a & c) ^ (b & c))
 
                        h = g
                        g = f
index 6fe97185050d61213a0e8d9869fe9a99a16e075d..c62c9af76b6dc4192d724b54a6c33ccb1b6f0aad 100644 (file)
@@ -5,8 +5,10 @@
 package tls
 
 import (
+       "bytes"
        "crypto"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/elliptic"
        "crypto/rsa"
        "encoding/asn1"
@@ -38,6 +40,15 @@ func pickSignatureAlgorithm(pubkey crypto.PublicKey, peerSigAlgs, ourSigAlgs []S
                        }
                case *ecdsa.PublicKey:
                        return ECDSAWithSHA1, signatureECDSA, crypto.SHA1, nil
+               case ed25519.PublicKey:
+                       if tlsVersion < VersionTLS12 {
+                               // RFC 8422 specifies support for Ed25519 in TLS 1.0 and 1.1,
+                               // but it requires holding on to a handshake transcript to do a
+                               // full signature, and not even OpenSSL bothers with the
+                               // complexity, so we can't even test it properly.
+                               return 0, 0, 0, fmt.Errorf("tls: Ed25519 public keys are not supported before TLS 1.2")
+                       }
+                       return Ed25519, signatureEd25519, directSigning, nil
                default:
                        return 0, 0, 0, fmt.Errorf("tls: unsupported public key: %T", pubkey)
                }
@@ -60,6 +71,10 @@ func pickSignatureAlgorithm(pubkey crypto.PublicKey, peerSigAlgs, ourSigAlgs []S
                        if sigType == signatureECDSA {
                                return sigAlg, sigType, hashAlg, nil
                        }
+               case ed25519.PublicKey:
+                       if sigType == signatureEd25519 {
+                               return sigAlg, sigType, hashAlg, nil
+                       }
                default:
                        return 0, 0, 0, fmt.Errorf("tls: unsupported public key: %T", pubkey)
                }
@@ -67,9 +82,9 @@ func pickSignatureAlgorithm(pubkey crypto.PublicKey, peerSigAlgs, ourSigAlgs []S
        return 0, 0, 0, errors.New("tls: peer doesn't support any common signature algorithms")
 }
 
-// verifyHandshakeSignature verifies a signature against pre-hashed handshake
-// contents.
-func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc crypto.Hash, digest, sig []byte) error {
+// verifyHandshakeSignature verifies a signature against pre-hashed
+// (if required) handshake contents.
+func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc crypto.Hash, signed, sig []byte) error {
        switch sigType {
        case signatureECDSA:
                pubKey, ok := pubkey.(*ecdsa.PublicKey)
@@ -83,15 +98,23 @@ func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc c
                if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
                        return errors.New("tls: ECDSA signature contained zero or negative values")
                }
-               if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
+               if !ecdsa.Verify(pubKey, signed, ecdsaSig.R, ecdsaSig.S) {
                        return errors.New("tls: ECDSA verification failure")
                }
+       case signatureEd25519:
+               pubKey, ok := pubkey.(ed25519.PublicKey)
+               if !ok {
+                       return errors.New("tls: Ed25519 signing requires a Ed25519 public key")
+               }
+               if !ed25519.Verify(pubKey, signed, sig) {
+                       return errors.New("tls: Ed25519 verification failure")
+               }
        case signaturePKCS1v15:
                pubKey, ok := pubkey.(*rsa.PublicKey)
                if !ok {
                        return errors.New("tls: RSA signing requires a RSA public key")
                }
-               if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
+               if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, signed, sig); err != nil {
                        return err
                }
        case signatureRSAPSS:
@@ -100,7 +123,7 @@ func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc c
                        return errors.New("tls: RSA signing requires a RSA public key")
                }
                signOpts := &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}
-               if err := rsa.VerifyPSS(pubKey, hashFunc, digest, sig, signOpts); err != nil {
+               if err := rsa.VerifyPSS(pubKey, hashFunc, signed, sig, signOpts); err != nil {
                        return err
                }
        default:
@@ -125,18 +148,29 @@ var signaturePadding = []byte{
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
 }
 
-// writeSignedMessage writes the content to be signed by certificate keys in TLS
-// 1.3 to sigHash. See RFC 8446, Section 4.4.3.
-func writeSignedMessage(sigHash io.Writer, context string, transcript hash.Hash) {
-       sigHash.Write(signaturePadding)
-       io.WriteString(sigHash, context)
-       sigHash.Write(transcript.Sum(nil))
+// signedMessage returns the pre-hashed (if necessary) message to be signed by
+// certificate keys in TLS 1.3. See RFC 8446, Section 4.4.3.
+func signedMessage(sigHash crypto.Hash, context string, transcript hash.Hash) []byte {
+       if sigHash == directSigning {
+               b := &bytes.Buffer{}
+               b.Write(signaturePadding)
+               io.WriteString(b, context)
+               b.Write(transcript.Sum(nil))
+               return b.Bytes()
+       }
+       h := sigHash.New()
+       h.Write(signaturePadding)
+       io.WriteString(h, context)
+       h.Write(transcript.Sum(nil))
+       return h.Sum(nil)
 }
 
 // signatureSchemesForCertificate returns the list of supported SignatureSchemes
-// for a given certificate, based on the public key and the protocol version. It
-// does not support the crypto.Decrypter interface, so shouldn't be used on the
-// server side in TLS 1.2 and earlier.
+// for a given certificate, based on the public key and the protocol version.
+//
+// It does not support the crypto.Decrypter interface, so shouldn't be used for
+// server certificates in TLS 1.2 and earlier, and it must be kept in sync with
+// supportedSignatureAlgorithms.
 func signatureSchemesForCertificate(version uint16, cert *Certificate) []SignatureScheme {
        priv, ok := cert.PrivateKey.(crypto.Signer)
        if !ok {
@@ -168,21 +202,19 @@ func signatureSchemesForCertificate(version uint16, cert *Certificate) []Signatu
        case *rsa.PublicKey:
                if version != VersionTLS13 {
                        return []SignatureScheme{
-                               PSSWithSHA256,
-                               PSSWithSHA384,
-                               PSSWithSHA512,
                                PKCS1WithSHA256,
                                PKCS1WithSHA384,
                                PKCS1WithSHA512,
                                PKCS1WithSHA1,
                        }
                }
-               // RSA keys with RSA-PSS OID are not supported by crypto/x509.
                return []SignatureScheme{
                        PSSWithSHA256,
                        PSSWithSHA384,
                        PSSWithSHA512,
                }
+       case ed25519.PublicKey:
+               return []SignatureScheme{Ed25519}
        default:
                return nil
        }
@@ -195,6 +227,8 @@ func unsupportedCertificateError(cert *Certificate) error {
        case rsa.PrivateKey, ecdsa.PrivateKey:
                return fmt.Errorf("tls: unsupported certificate: private key is %T, expected *%T",
                        cert.PrivateKey, cert.PrivateKey)
+       case *ed25519.PrivateKey:
+               return fmt.Errorf("tls: unsupported certificate: private key is *ed25519.PrivateKey, expected ed25519.PrivateKey")
        }
 
        signer, ok := cert.PrivateKey.(crypto.Signer)
@@ -213,6 +247,7 @@ func unsupportedCertificateError(cert *Certificate) error {
                        return fmt.Errorf("tls: unsupported certificate curve (%s)", pub.Curve.Params().Name)
                }
        case *rsa.PublicKey:
+       case ed25519.PublicKey:
        default:
                return fmt.Errorf("tls: unsupported certificate key (%T)", pub)
        }
index 3f876b9e1a90898efb9b9070edf01fd78ff964d7..1d958cf141032b7f1a365ebe49b18f8c411aab39 100644 (file)
@@ -6,12 +6,14 @@ package tls
 
 import (
        "crypto"
+       "crypto/ed25519"
        "testing"
 )
 
 func TestSignatureSelection(t *testing.T) {
        rsaCert := &testRSAPrivateKey.PublicKey
        ecdsaCert := &testECDSAPrivateKey.PublicKey
+       ed25519Cert := testEd25519PrivateKey.Public().(ed25519.PublicKey)
        sigsPKCS1WithSHA := []SignatureScheme{PKCS1WithSHA256, PKCS1WithSHA1}
        sigsPSSWithSHA := []SignatureScheme{PSSWithSHA256, PSSWithSHA384}
        sigsECDSAWithSHA := []SignatureScheme{ECDSAWithP256AndSHA256, ECDSAWithSHA1}
@@ -22,7 +24,7 @@ func TestSignatureSelection(t *testing.T) {
                ourSigAlgs  []SignatureScheme
                tlsVersion  uint16
 
-               expectedSigAlg  SignatureScheme // or 0 if ignored
+               expectedSigAlg  SignatureScheme // if tlsVersion == VersionTLS12
                expectedSigType uint8
                expectedHash    crypto.Hash
        }{
@@ -56,6 +58,10 @@ func TestSignatureSelection(t *testing.T) {
                // RSASSA-PSS is defined in TLS 1.3 for TLS 1.2
                // https://tools.ietf.org/html/draft-ietf-tls-tls13-21#page-45
                {rsaCert, []SignatureScheme{PSSWithSHA256}, sigsPSSWithSHA, VersionTLS12, PSSWithSHA256, signatureRSAPSS, crypto.SHA256},
+
+               // All results are fixed for Ed25519. RFC 8422, Section 5.10.
+               {ed25519Cert, []SignatureScheme{Ed25519}, []SignatureScheme{ECDSAWithSHA1, Ed25519}, VersionTLS12, Ed25519, signatureEd25519, directSigning},
+               {ed25519Cert, nil, nil, VersionTLS12, Ed25519, signatureEd25519, directSigning},
        }
 
        for testNo, test := range tests {
@@ -63,7 +69,7 @@ func TestSignatureSelection(t *testing.T) {
                if err != nil {
                        t.Errorf("test[%d]: unexpected error: %v", testNo, err)
                }
-               if test.expectedSigAlg != 0 && test.expectedSigAlg != sigAlg {
+               if test.tlsVersion == VersionTLS12 && test.expectedSigAlg != sigAlg {
                        t.Errorf("test[%d]: expected signature scheme %#x, got %#x", testNo, test.expectedSigAlg, sigAlg)
                }
                if test.expectedSigType != sigType {
@@ -84,6 +90,12 @@ func TestSignatureSelection(t *testing.T) {
                {ecdsaCert, sigsPKCS1WithSHA, sigsPKCS1WithSHA, VersionTLS12},
                {ecdsaCert, sigsECDSAWithSHA, sigsPKCS1WithSHA, VersionTLS12},
                {rsaCert, []SignatureScheme{0}, sigsPKCS1WithSHA, VersionTLS12},
+               {ed25519Cert, sigsECDSAWithSHA, sigsECDSAWithSHA, VersionTLS12},
+               {ed25519Cert, []SignatureScheme{Ed25519}, sigsECDSAWithSHA, VersionTLS12},
+               {ecdsaCert, []SignatureScheme{Ed25519}, []SignatureScheme{Ed25519}, VersionTLS12},
+               {ed25519Cert, nil, nil, VersionTLS11},
+               {ed25519Cert, nil, nil, VersionTLS10},
+               {ed25519Cert, nil, nil, VersionSSL30},
 
                // ECDSA is unspecified for SSL 3.0 in RFC 4492.
                // TODO a SSL 3.0 client cannot advertise signature_algorithms,
index ecb4db290a0f8df5777fa730e87e04d23d9eb9ed..61bbc9f90991e17a98bb174a2cd16f75e43b2f3c 100644 (file)
@@ -14,8 +14,8 @@ import (
        "crypto/sha1"
        "crypto/sha256"
        "crypto/x509"
+       "golang.org/x/crypto/chacha20poly1305"
        "hash"
-       "internal/x/crypto/chacha20poly1305"
 )
 
 // a keyAgreement implements the client and server side of a TLS key agreement
@@ -43,11 +43,11 @@ const (
        // client indicates that it supports ECC with a curve and point format
        // that we're happy with.
        suiteECDHE = 1 << iota
-       // suiteECDSA indicates that the cipher suite involves an ECDSA
-       // signature and therefore may only be selected when the server's
-       // certificate is ECDSA. If this is not set then the cipher suite is
-       // RSA based.
-       suiteECDSA
+       // suiteECSign indicates that the cipher suite involves an ECDSA or
+       // EdDSA signature and therefore may only be selected when the server's
+       // certificate is ECDSA or EdDSA. If this is not set then the cipher suite
+       // is RSA based.
+       suiteECSign
        // suiteTLS12 indicates that the cipher suite should only be advertised
        // and accepted when using TLS 1.2.
        suiteTLS12
@@ -78,17 +78,17 @@ var cipherSuites = []*cipherSuite{
        // Ciphersuite order is chosen so that ECDHE comes before plain RSA and
        // AEADs are the top preference.
        {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadChaCha20Poly1305},
-       {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadChaCha20Poly1305},
+       {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12, nil, nil, aeadChaCha20Poly1305},
        {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadAESGCM},
-       {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadAESGCM},
+       {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12, nil, nil, aeadAESGCM},
        {TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
-       {TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
+       {TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
        {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
        {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
-       {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
-       {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
+       {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
+       {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECSign, cipherAES, macSHA1, nil},
        {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
-       {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
+       {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECSign, cipherAES, macSHA1, nil},
        {TLS_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, rsaKA, suiteTLS12, nil, nil, aeadAESGCM},
        {TLS_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, rsaKA, suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
        {TLS_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, rsaKA, suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
@@ -100,7 +100,7 @@ var cipherSuites = []*cipherSuite{
        // RC4-based cipher suites are disabled by default.
        {TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, suiteDefaultOff, cipherRC4, macSHA1, nil},
        {TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE | suiteDefaultOff, cipherRC4, macSHA1, nil},
-       {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteDefaultOff, cipherRC4, macSHA1, nil},
+       {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteDefaultOff, cipherRC4, macSHA1, nil},
 }
 
 // A cipherSuiteTLS13 defines only the pair of the AEAD algorithm and hash
index f695528fe07c190e2da5c0ea27afd783d611ff61..d135b1fc994cf4bc1c653cc08eb0896d3acad33b 100644 (file)
@@ -149,37 +149,56 @@ const (
 // Certificate types (for certificateRequestMsg)
 const (
        certTypeRSASign   = 1
-       certTypeECDSASign = 64 // RFC 4492, Section 5.5
+       certTypeECDSASign = 64 // ECDSA or EdDSA keys, see RFC 8422, Section 3.
 )
 
-// Signature algorithms (for internal signaling use). Starting at 16 to avoid overlap with
+// Signature algorithms (for internal signaling use). Starting at 225 to avoid overlap with
 // TLS 1.2 codepoints (RFC 5246, Appendix A.4.1), with which these have nothing to do.
 const (
-       signaturePKCS1v15 uint8 = iota + 16
-       signatureECDSA
+       signaturePKCS1v15 uint8 = iota + 225
        signatureRSAPSS
+       signatureECDSA
+       signatureEd25519
 )
 
+// directSigning is a standard Hash value that signals that no pre-hashing
+// should be performed, and that the input should be signed directly. It is the
+// hash function associated with the Ed25519 signature scheme.
+var directSigning crypto.Hash = 0
+
 // supportedSignatureAlgorithms contains the signature and hash algorithms that
 // the code advertises as supported in a TLS 1.2+ ClientHello and in a TLS 1.2+
 // CertificateRequest. The two fields are merged to match with TLS 1.3.
 // Note that in TLS 1.2, the ECDSA algorithms are not constrained to P-256, etc.
 var supportedSignatureAlgorithms = []SignatureScheme{
        PSSWithSHA256,
+       ECDSAWithP256AndSHA256,
+       Ed25519,
        PSSWithSHA384,
        PSSWithSHA512,
        PKCS1WithSHA256,
-       ECDSAWithP256AndSHA256,
        PKCS1WithSHA384,
-       ECDSAWithP384AndSHA384,
        PKCS1WithSHA512,
+       ECDSAWithP384AndSHA384,
        ECDSAWithP521AndSHA512,
        PKCS1WithSHA1,
        ECDSAWithSHA1,
 }
 
-// RSA-PSS is disabled in TLS 1.2 for Go 1.12. See Issue 30055.
-var supportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithms[3:]
+// supportedSignatureAlgorithmsTLS12 contains the signature and hash algorithms
+// that are supported in TLS 1.2, where it is possible to distinguish the
+// protocol version. This is temporary, see Issue 32425.
+var supportedSignatureAlgorithmsTLS12 = []SignatureScheme{
+       PKCS1WithSHA256,
+       ECDSAWithP256AndSHA256,
+       Ed25519,
+       PKCS1WithSHA384,
+       PKCS1WithSHA512,
+       ECDSAWithP384AndSHA384,
+       ECDSAWithP521AndSHA512,
+       PKCS1WithSHA1,
+       ECDSAWithSHA1,
+}
 
 // helloRetryRequestRandom is set as the Random value of a ServerHello
 // to signal that the message is actually a HelloRetryRequest.
@@ -310,6 +329,9 @@ const (
        ECDSAWithP384AndSHA384 SignatureScheme = 0x0503
        ECDSAWithP521AndSHA512 SignatureScheme = 0x0603
 
+       // EdDSA algorithms.
+       Ed25519 SignatureScheme = 0x0807
+
        // Legacy signature and hash algorithms for TLS 1.2.
        PKCS1WithSHA1 SignatureScheme = 0x0201
        ECDSAWithSHA1 SignatureScheme = 0x0203
@@ -779,7 +801,7 @@ func (c *Config) supportedVersions(isClient bool) []uint16 {
                if isClient && v < VersionTLS10 {
                        continue
                }
-               // TLS 1.3 is opt-in in Go 1.12.
+               // TLS 1.3 is opt-out in Go 1.13.
                if v == VersionTLS13 && !isTLS13Supported() {
                        continue
                }
@@ -794,11 +816,11 @@ var tls13Support struct {
        cached bool
 }
 
-// isTLS13Supported returns whether the program opted into TLS 1.3 via
-// GODEBUG=tls13=1. It's cached after the first execution.
+// isTLS13Supported returns whether the program enabled TLS 1.3 by not opting
+// out with GODEBUG=tls13=0. It's cached after the first execution.
 func isTLS13Supported() bool {
        tls13Support.Do(func() {
-               tls13Support.cached = goDebugString("tls13") == "1"
+               tls13Support.cached = goDebugString("tls13") != "0"
        })
        return tls13Support.cached
 }
@@ -969,7 +991,7 @@ var writerMutex sync.Mutex
 type Certificate struct {
        Certificate [][]byte
        // PrivateKey contains the private key corresponding to the public key in
-       // Leaf. This must implement crypto.Signer with an RSA or ECDSA PublicKey.
+       // Leaf. This must implement crypto.Signer with an RSA, ECDSA or Ed25519 PublicKey.
        // For a server up to TLS 1.2, it can also implement crypto.Decrypter with
        // an RSA PublicKey.
        PrivateKey crypto.PrivateKey
@@ -1185,6 +1207,8 @@ func signatureFromSignatureScheme(signatureAlgorithm SignatureScheme) uint8 {
                return signatureRSAPSS
        case ECDSAWithSHA1, ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512:
                return signatureECDSA
+       case Ed25519:
+               return signatureEd25519
        default:
                return 0
        }
index f61d43203fd93333cca4a838404a03627f07ee2a..0c7952f7b846b29dffc005a3a5d580c95f6b5bae 100644 (file)
@@ -274,6 +274,17 @@ func extractPadding(payload []byte) (toRemove int, good byte) {
        good &= good << 1
        good = uint8(int8(good) >> 7)
 
+       // Zero the padding length on error. This ensures any unchecked bytes
+       // are included in the MAC. Otherwise, an attacker that could
+       // distinguish MAC failures from padding failures could mount an attack
+       // similar to POODLE in SSL 3.0: given a good ciphertext that uses a
+       // full block's worth of padding, replace the final block with another
+       // block. If the MAC check passed but the padding check failed, the
+       // last byte of that block decrypted to the block size.
+       //
+       // See also macAndPaddingGood logic below.
+       paddingLen &= good
+
        toRemove = int(paddingLen) + 1
        return
 }
@@ -416,7 +427,15 @@ func (hc *halfConn) decrypt(record []byte) ([]byte, recordType, error) {
                remoteMAC := payload[n : n+macSize]
                localMAC := hc.mac.MAC(hc.seq[0:], record[:recordHeaderLen], payload[:n], payload[n+macSize:])
 
-               if subtle.ConstantTimeCompare(localMAC, remoteMAC) != 1 || paddingGood != 255 {
+               // This is equivalent to checking the MACs and paddingGood
+               // separately, but in constant-time to prevent distinguishing
+               // padding failures from MAC failures. Depending on what value
+               // of paddingLen was returned on bad padding, distinguishing
+               // bad MAC from bad padding can lead to an attack.
+               //
+               // See also the logic at the end of extractPadding.
+               macAndPaddingGood := subtle.ConstantTimeCompare(localMAC, remoteMAC) & int(paddingGood)
+               if macAndPaddingGood != 1 {
                        return nil, 0, alertBadRecordMAC
                }
 
index 8d012be75c1bbe71b65dc1ae6c650ee25f62e927..7329d97a9d01a38ad4351e1d9f4d1221bcb6dd1c 100644 (file)
@@ -11,6 +11,7 @@ package main
 
 import (
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/elliptic"
        "crypto/rand"
        "crypto/rsa"
@@ -18,7 +19,6 @@ import (
        "crypto/x509/pkix"
        "encoding/pem"
        "flag"
-       "fmt"
        "log"
        "math/big"
        "net"
@@ -34,6 +34,7 @@ var (
        isCA       = flag.Bool("ca", false, "whether this cert should be its own Certificate Authority")
        rsaBits    = flag.Int("rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set")
        ecdsaCurve = flag.String("ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256 (recommended), P384, P521")
+       ed25519Key = flag.Bool("ed25519", false, "Generate an Ed25519 key")
 )
 
 func publicKey(priv interface{}) interface{} {
@@ -42,22 +43,8 @@ func publicKey(priv interface{}) interface{} {
                return &k.PublicKey
        case *ecdsa.PrivateKey:
                return &k.PublicKey
-       default:
-               return nil
-       }
-}
-
-func pemBlockForKey(priv interface{}) *pem.Block {
-       switch k := priv.(type) {
-       case *rsa.PrivateKey:
-               return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)}
-       case *ecdsa.PrivateKey:
-               b, err := x509.MarshalECPrivateKey(k)
-               if err != nil {
-                       fmt.Fprintf(os.Stderr, "Unable to marshal ECDSA private key: %v", err)
-                       os.Exit(2)
-               }
-               return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}
+       case ed25519.PrivateKey:
+               return k.Public().(ed25519.PublicKey)
        default:
                return nil
        }
@@ -74,7 +61,11 @@ func main() {
        var err error
        switch *ecdsaCurve {
        case "":
-               priv, err = rsa.GenerateKey(rand.Reader, *rsaBits)
+               if *ed25519Key {
+                       _, priv, err = ed25519.GenerateKey(rand.Reader)
+               } else {
+                       priv, err = rsa.GenerateKey(rand.Reader, *rsaBits)
+               }
        case "P224":
                priv, err = ecdsa.GenerateKey(elliptic.P224(), rand.Reader)
        case "P256":
@@ -84,11 +75,10 @@ func main() {
        case "P521":
                priv, err = ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
        default:
-               fmt.Fprintf(os.Stderr, "Unrecognized elliptic curve: %q", *ecdsaCurve)
-               os.Exit(1)
+               log.Fatalf("Unrecognized elliptic curve: %q", *ecdsaCurve)
        }
        if err != nil {
-               log.Fatalf("failed to generate private key: %s", err)
+               log.Fatalf("Failed to generate private key: %s", err)
        }
 
        var notBefore time.Time
@@ -97,8 +87,7 @@ func main() {
        } else {
                notBefore, err = time.Parse("Jan 2 15:04:05 2006", *validFrom)
                if err != nil {
-                       fmt.Fprintf(os.Stderr, "Failed to parse creation date: %s\n", err)
-                       os.Exit(1)
+                       log.Fatalf("Failed to parse creation date: %s", err)
                }
        }
 
@@ -107,7 +96,7 @@ func main() {
        serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
        serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
        if err != nil {
-               log.Fatalf("failed to generate serial number: %s", err)
+               log.Fatalf("Failed to generate serial number: %s", err)
        }
 
        template := x509.Certificate{
@@ -144,26 +133,30 @@ func main() {
 
        certOut, err := os.Create("cert.pem")
        if err != nil {
-               log.Fatalf("failed to open cert.pem for writing: %s", err)
+               log.Fatalf("Failed to open cert.pem for writing: %s", err)
        }
        if err := pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}); err != nil {
-               log.Fatalf("failed to write data to cert.pem: %s", err)
+               log.Fatalf("Failed to write data to cert.pem: %s", err)
        }
        if err := certOut.Close(); err != nil {
-               log.Fatalf("error closing cert.pem: %s", err)
+               log.Fatalf("Error closing cert.pem: %s", err)
        }
        log.Print("wrote cert.pem\n")
 
        keyOut, err := os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
        if err != nil {
-               log.Print("failed to open key.pem for writing:", err)
+               log.Fatalf("Failed to open key.pem for writing:", err)
                return
        }
-       if err := pem.Encode(keyOut, pemBlockForKey(priv)); err != nil {
-               log.Fatalf("failed to write data to key.pem: %s", err)
+       privBytes, err := x509.MarshalPKCS8PrivateKey(priv)
+       if err != nil {
+               log.Fatalf("Unable to marshal private key: %v", err)
+       }
+       if err := pem.Encode(keyOut, &pem.Block{Type: "PRIVATE KEY", Bytes: privBytes}); err != nil {
+               log.Fatalf("Failed to write data to key.pem: %s", err)
        }
        if err := keyOut.Close(); err != nil {
-               log.Fatalf("error closing key.pem: %s", err)
+               log.Fatalf("Error closing key.pem: %s", err)
        }
        log.Print("wrote key.pem\n")
 }
index e760fbf2c1a227cc0e3e3f5e337a5b52d7ffcdfe..ed000eb6192a06b948d1b35f4bfbdeca05150a2c 100644 (file)
@@ -8,6 +8,7 @@ import (
        "bytes"
        "crypto"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/rsa"
        "crypto/subtle"
        "crypto/x509"
@@ -85,7 +86,6 @@ func (c *Conn) makeClientHello() (*clientHelloMsg, ecdheParameters, error) {
        possibleCipherSuites := config.cipherSuites()
        hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites))
 
-NextCipherSuite:
        for _, suiteId := range possibleCipherSuites {
                for _, suite := range cipherSuites {
                        if suite.id != suiteId {
@@ -94,10 +94,10 @@ NextCipherSuite:
                        // Don't advertise TLS 1.2-only cipher suites unless
                        // we're attempting TLS 1.2.
                        if hello.vers < VersionTLS12 && suite.flags&suiteTLS12 != 0 {
-                               continue
+                               break
                        }
                        hello.cipherSuites = append(hello.cipherSuites, suiteId)
-                       continue NextCipherSuite
+                       break
                }
        }
 
@@ -582,7 +582,7 @@ func (hs *clientHandshakeState) doFullHandshake() error {
                if certVerify.hasSignatureAlgorithm {
                        certVerify.signatureAlgorithm = signatureAlgorithm
                }
-               digest, err := hs.finishedHash.hashForClientCertificate(sigType, hashFunc, hs.masterSecret)
+               signed, err := hs.finishedHash.hashForClientCertificate(sigType, hashFunc, hs.masterSecret)
                if err != nil {
                        c.sendAlert(alertInternalError)
                        return err
@@ -591,7 +591,7 @@ func (hs *clientHandshakeState) doFullHandshake() error {
                if sigType == signatureRSAPSS {
                        signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: hashFunc}
                }
-               certVerify.signature, err = key.Sign(c.config.rand(), digest, signOpts)
+               certVerify.signature, err = key.Sign(c.config.rand(), signed, signOpts)
                if err != nil {
                        c.sendAlert(alertInternalError)
                        return err
@@ -827,11 +827,7 @@ func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
                        DNSName:       c.config.ServerName,
                        Intermediates: x509.NewCertPool(),
                }
-
-               for i, cert := range certs {
-                       if i == 0 {
-                               continue
-                       }
+               for _, cert := range certs[1:] {
                        opts.Intermediates.AddCert(cert)
                }
                var err error
@@ -850,7 +846,7 @@ func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
        }
 
        switch certs[0].PublicKey.(type) {
-       case *rsa.PublicKey, *ecdsa.PublicKey:
+       case *rsa.PublicKey, *ecdsa.PublicKey, ed25519.PublicKey:
                break
        default:
                c.sendAlert(alertUnsupportedCertificate)
@@ -873,13 +869,13 @@ var (
 // certificateRequestInfoFromMsg generates a CertificateRequestInfo from a TLS
 // <= 1.2 CertificateRequest, making an effort to fill in missing information.
 func certificateRequestInfoFromMsg(certReq *certificateRequestMsg) *CertificateRequestInfo {
-       var rsaAvail, ecdsaAvail bool
+       var rsaAvail, ecAvail bool
        for _, certType := range certReq.certificateTypes {
                switch certType {
                case certTypeRSASign:
                        rsaAvail = true
                case certTypeECDSASign:
-                       ecdsaAvail = true
+                       ecAvail = true
                }
        }
 
@@ -893,25 +889,23 @@ func certificateRequestInfoFromMsg(certReq *certificateRequestMsg) *CertificateR
                // case we use a plausible list based on the acceptable
                // certificate types.
                switch {
-               case rsaAvail && ecdsaAvail:
+               case rsaAvail && ecAvail:
                        cri.SignatureSchemes = tls11SignatureSchemes
                case rsaAvail:
                        cri.SignatureSchemes = tls11SignatureSchemesRSA
-               case ecdsaAvail:
+               case ecAvail:
                        cri.SignatureSchemes = tls11SignatureSchemesECDSA
                }
                return cri
        }
 
-       // In TLS 1.2, the signature schemes apply to both the certificate chain and
-       // the leaf key, while the certificate types only apply to the leaf key.
+       // Filter the signature schemes based on the certificate types.
        // See RFC 5246, Section 7.4.4 (where it calls this "somewhat complicated").
-       // Filter the signature schemes based on the certificate type.
        cri.SignatureSchemes = make([]SignatureScheme, 0, len(certReq.supportedSignatureAlgorithms))
        for _, sigScheme := range certReq.supportedSignatureAlgorithms {
                switch signatureFromSignatureScheme(sigScheme) {
-               case signatureECDSA:
-                       if ecdsaAvail {
+               case signatureECDSA, signatureEd25519:
+                       if ecAvail {
                                cri.SignatureSchemes = append(cri.SignatureSchemes, sigScheme)
                        }
                case signatureRSAPSS, signaturePKCS1v15:
index 8c4125b7e2aa2e0bd2adf2f8d5737e2a99a6635b..1b6b9a1074dab7aa80becadb9d24dfe814b03aaf 100644 (file)
@@ -6,7 +6,6 @@ package tls
 
 import (
        "bytes"
-       "crypto/ecdsa"
        "crypto/rsa"
        "crypto/x509"
        "encoding/base64"
@@ -26,18 +25,6 @@ import (
        "time"
 )
 
-func init() {
-       // TLS 1.3 cipher suites preferences are not configurable and change based
-       // on the architecture. Force them to the version with AES accelleration for
-       // test consistency.
-       once.Do(initDefaultCipherSuites)
-       varDefaultCipherSuitesTLS13 = []uint16{
-               TLS_AES_128_GCM_SHA256,
-               TLS_CHACHA20_POLY1305_SHA256,
-               TLS_AES_256_GCM_SHA384,
-       }
-}
-
 // Note: see comment in handshake_test.go for details of how the reference
 // tests work.
 
@@ -142,7 +129,7 @@ type clientTest struct {
        // cert, if not empty, contains a DER-encoded certificate for the
        // reference server.
        cert []byte
-       // key, if not nil, contains either a *rsa.PrivateKey or
+       // key, if not nil, contains either a *rsa.PrivateKey, ed25519.PrivateKey or
        // *ecdsa.PrivateKey which is the private key for the reference server.
        key interface{}
        // extensions, if not nil, contains a list of extension data to be returned
@@ -185,25 +172,13 @@ func (test *clientTest) connFromCommand() (conn *recordingConn, child *exec.Cmd,
        if test.key != nil {
                key = test.key
        }
-       var pemType string
-       var derBytes []byte
-       switch key := key.(type) {
-       case *rsa.PrivateKey:
-               pemType = "RSA"
-               derBytes = x509.MarshalPKCS1PrivateKey(key)
-       case *ecdsa.PrivateKey:
-               pemType = "EC"
-               var err error
-               derBytes, err = x509.MarshalECPrivateKey(key)
-               if err != nil {
-                       panic(err)
-               }
-       default:
-               panic("unknown key type")
+       derBytes, err := x509.MarshalPKCS8PrivateKey(key)
+       if err != nil {
+               panic(err)
        }
 
        var pemOut bytes.Buffer
-       pem.Encode(&pemOut, &pem.Block{Type: pemType + " PRIVATE KEY", Bytes: derBytes})
+       pem.Encode(&pemOut, &pem.Block{Type: "PRIVATE KEY", Bytes: derBytes})
 
        keyPath := tempFile(pemOut.String())
        defer os.Remove(keyPath)
@@ -300,8 +275,6 @@ func (test *clientTest) loadData() (flows [][]byte, err error) {
 }
 
 func (test *clientTest) run(t *testing.T, write bool) {
-       checkOpenSSLVersion(t)
-
        var clientConn, serverConn net.Conn
        var recordingConn *recordingConn
        var childProcess *exec.Cmd
@@ -463,12 +436,20 @@ func (test *clientTest) run(t *testing.T, write bool) {
                }
                for i, b := range flows {
                        if i%2 == 1 {
-                               serverConn.SetWriteDeadline(time.Now().Add(1 * time.Minute))
+                               if *fast {
+                                       serverConn.SetWriteDeadline(time.Now().Add(1 * time.Second))
+                               } else {
+                                       serverConn.SetWriteDeadline(time.Now().Add(1 * time.Minute))
+                               }
                                serverConn.Write(b)
                                continue
                        }
                        bb := make([]byte, len(b))
-                       serverConn.SetReadDeadline(time.Now().Add(1 * time.Minute))
+                       if *fast {
+                               serverConn.SetReadDeadline(time.Now().Add(1 * time.Second))
+                       } else {
+                               serverConn.SetReadDeadline(time.Now().Add(1 * time.Minute))
+                       }
                        _, err := io.ReadFull(serverConn, bb)
                        if err != nil {
                                t.Fatalf("%s, flow %d: %s", test.name, i+1, err)
@@ -745,6 +726,29 @@ func TestHandshakeClientECDSATLS13(t *testing.T) {
        runClientTestTLS13(t, test)
 }
 
+func TestHandshakeClientEd25519(t *testing.T) {
+       test := &clientTest{
+               name: "Ed25519",
+               cert: testEd25519Certificate,
+               key:  testEd25519PrivateKey,
+       }
+       runClientTestTLS12(t, test)
+       runClientTestTLS13(t, test)
+
+       config := testConfig.Clone()
+       cert, _ := X509KeyPair([]byte(clientEd25519CertificatePEM), []byte(clientEd25519KeyPEM))
+       config.Certificates = []Certificate{cert}
+
+       test = &clientTest{
+               name:   "ClientCert-Ed25519",
+               args:   []string{"-Verify", "1"},
+               config: config,
+       }
+
+       runClientTestTLS12(t, test)
+       runClientTestTLS13(t, test)
+}
+
 func TestHandshakeClientCertRSA(t *testing.T) {
        config := testConfig.Clone()
        cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
@@ -809,22 +813,26 @@ func TestHandshakeClientCertECDSA(t *testing.T) {
        runClientTestTLS12(t, test)
 }
 
-// TestHandshakeClientCertRSAPSS tests a few separate things:
-//  * that our client can serve a PSS-signed certificate
-//  * that our client can validate a PSS-signed certificate
-//  * that our client can use rsa_pss_rsae_sha256 in its CertificateVerify
-//  * that our client can accpet rsa_pss_rsae_sha256 in the server CertificateVerify
+// TestHandshakeClientCertRSAPSS tests rsa_pss_rsae_sha256 signatures from both
+// client and server certificates. It also serves from both sides a certificate
+// signed itself with RSA-PSS, mostly to check that crypto/x509 chain validation
+// works.
 func TestHandshakeClientCertRSAPSS(t *testing.T) {
-       issuer, err := x509.ParseCertificate(testRSAPSSCertificate)
+       cert, err := x509.ParseCertificate(testRSAPSSCertificate)
        if err != nil {
                panic(err)
        }
        rootCAs := x509.NewCertPool()
-       rootCAs.AddCert(issuer)
+       rootCAs.AddCert(cert)
 
        config := testConfig.Clone()
-       cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
-       config.Certificates = []Certificate{cert}
+       // Use GetClientCertificate to bypass the client certificate selection logic.
+       config.GetClientCertificate = func(*CertificateRequestInfo) (*Certificate, error) {
+               return &Certificate{
+                       Certificate: [][]byte{testRSAPSSCertificate},
+                       PrivateKey:  testRSAPrivateKey,
+               }, nil
+       }
        config.RootCAs = rootCAs
 
        test := &clientTest{
@@ -835,9 +843,19 @@ func TestHandshakeClientCertRSAPSS(t *testing.T) {
                cert:   testRSAPSSCertificate,
                key:    testRSAPrivateKey,
        }
+       runClientTestTLS13(t, test)
 
+       // In our TLS 1.2 client, RSA-PSS is only supported for server certificates.
+       // See Issue 32425.
+       test = &clientTest{
+               name: "ClientCert-RSA-RSAPSS",
+               args: []string{"-cipher", "AES128", "-Verify", "1", "-client_sigalgs",
+                       "rsa_pkcs1_sha256", "-sigalgs", "rsa_pss_rsae_sha256"},
+               config: config,
+               cert:   testRSAPSSCertificate,
+               key:    testRSAPrivateKey,
+       }
        runClientTestTLS12(t, test)
-       runClientTestTLS13(t, test)
 }
 
 func TestHandshakeClientCertRSAPKCS1v15(t *testing.T) {
@@ -855,61 +873,6 @@ func TestHandshakeClientCertRSAPKCS1v15(t *testing.T) {
        runClientTestTLS12(t, test)
 }
 
-func TestHandshakeClientCertPSSDisabled(t *testing.T) {
-       config := testConfig.Clone()
-       cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
-       config.Certificates = []Certificate{cert}
-
-       test := &clientTest{
-               name:   "ClientCert-RSA-PSS-Disabled",
-               args:   []string{"-cipher", "AES128", "-Verify", "1"},
-               config: config,
-       }
-
-       // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2,
-       // and check that handshakes still work.
-       testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12
-       defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }()
-       supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12
-
-       // Use t.Run to ensure the defer runs after all parallel tests end.
-       t.Run("1024", func(t *testing.T) {
-               runClientTestTLS12(t, test)
-               runClientTestTLS13(t, test)
-       })
-
-       // Use a 512-bit key to check that the TLS 1.2 handshake is actually using
-       // PKCS#1 v1.5. PSS would be failing here.
-       cert, err := X509KeyPair([]byte(`-----BEGIN CERTIFICATE-----
-MIIBcTCCARugAwIBAgIQGjQnkCFlUqaFlt6ixyz/tDANBgkqhkiG9w0BAQsFADAS
-MRAwDgYDVQQKEwdBY21lIENvMB4XDTE5MDExODIzMjMyOFoXDTIwMDExODIzMjMy
-OFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDd
-ez1rFUDwax2HTxbcnFUP9AhcgEGMHVV2nn4VVEWFJB6I8C/Nkx0XyyQlrmFYBzEQ
-nIPhKls4T0hFoLvjJnXpAgMBAAGjTTBLMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUE
-DDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBYGA1UdEQQPMA2CC2V4YW1wbGUu
-Y29tMA0GCSqGSIb3DQEBCwUAA0EAxDuUS+BrrS3c+h+k+fQPOmOScy6yTX9mHw0Q
-KbucGamXYEy0URIwOdO0tQ3LHPc1YGvYSPwkDjkjqECs2Vm/AA==
------END CERTIFICATE-----`), []byte(`-----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBAN17PWsVQPBrHYdPFtycVQ/0CFyAQYwdVXaefhVURYUkHojwL82T
-HRfLJCWuYVgHMRCcg+EqWzhPSEWgu+MmdekCAwEAAQJBALjQYNTdXF4CFBbXwUz/
-yt9QFDYT9B5WT/12jeGAe653gtYS6OOi/+eAkGmzg1GlRnw6fOfn+HYNFDORST7z
-4j0CIQDn2xz9hVWQEu9ee3vecNT3f60huDGTNoRhtqgweQGX0wIhAPSLj1VcRZEz
-nKpbtU22+PbIMSJ+e80fmY9LIPx5N4HTAiAthGSimMR9bloz0EY3GyuUEyqoDgMd
-hXxjuno2WesoJQIgemilbcALXpxsLmZLgcQ2KSmaVr7jb5ECx9R+hYKTw1sCIG4s
-T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g
------END RSA PRIVATE KEY-----`))
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       test.name = "ClientCert-RSA-PSS-Disabled-512"
-       config.Certificates = []Certificate{cert}
-
-       t.Run("512", func(t *testing.T) {
-               runClientTestTLS12(t, test)
-       })
-}
-
 func TestClientKeyUpdate(t *testing.T) {
        test := &clientTest{
                name:          "KeyUpdate",
@@ -925,6 +888,9 @@ func TestResumption(t *testing.T) {
 }
 
 func testResumption(t *testing.T, version uint16) {
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
        serverConfig := &Config{
                MaxVersion:   version,
                CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
@@ -1772,6 +1738,9 @@ func TestAlertFlushing(t *testing.T) {
 }
 
 func TestHandshakeRace(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
        t.Parallel()
        // This test races a Read and Write to try and complete a handshake in
        // order to provide some evidence that there are no races or deadlocks
index 85715b721c0dd8d0bd3a9e7e8c0b913ec47d844f..82207eb646d8ccf2bca971dd1de79d66e8ac30fe 100644 (file)
@@ -462,10 +462,9 @@ func (hs *clientHandshakeStateTLS13) readServerCertificate() error {
                c.sendAlert(alertIllegalParameter)
                return errors.New("tls: invalid certificate signature algorithm")
        }
-       h := sigHash.New()
-       writeSignedMessage(h, serverSignatureContext, hs.transcript)
+       signed := signedMessage(sigHash, serverSignatureContext, hs.transcript)
        if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey,
-               sigHash, h.Sum(nil), certVerify.signature); err != nil {
+               sigHash, signed, certVerify.signature); err != nil {
                c.sendAlert(alertDecryptError)
                return errors.New("tls: invalid certificate signature")
        }
@@ -580,14 +579,13 @@ func (hs *clientHandshakeStateTLS13) sendClientCertificate() error {
        if sigType == 0 || err != nil {
                return c.sendAlert(alertInternalError)
        }
-       h := sigHash.New()
-       writeSignedMessage(h, clientSignatureContext, hs.transcript)
 
+       signed := signedMessage(sigHash, clientSignatureContext, hs.transcript)
        signOpts := crypto.SignerOpts(sigHash)
        if sigType == signatureRSAPSS {
                signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
        }
-       sig, err := cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), h.Sum(nil), signOpts)
+       sig, err := cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts)
        if err != nil {
                c.sendAlert(alertInternalError)
                return errors.New("tls: failed to sign handshake: " + err.Error())
index c0e049b16f0ed272420c81a74bc8bd9cadb2054c..2d21377737c03ffed0592b23ecae2038f5f5cb6d 100644 (file)
@@ -6,7 +6,7 @@ package tls
 
 import (
        "fmt"
-       "internal/x/crypto/cryptobyte"
+       "golang.org/x/crypto/cryptobyte"
        "strings"
 )
 
@@ -320,7 +320,7 @@ func (m *clientHelloMsg) marshalWithoutBinders() []byte {
 }
 
 // updateBinders updates the m.pskBinders field, if necessary updating the
-// cached marshalled representation. The supplied binders must have the same
+// cached marshaled representation. The supplied binders must have the same
 // length as the current m.pskBinders.
 func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) {
        if len(pskBinders) != len(m.pskBinders) {
index 4f4b60ae2cea8566c11947fa79deaec0f04d2662..a3d8848caf9c354b69b7360ba626fe8ed8ce69c4 100644 (file)
@@ -7,6 +7,7 @@ package tls
 import (
        "crypto"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/rsa"
        "crypto/subtle"
        "crypto/x509"
@@ -23,8 +24,8 @@ type serverHandshakeState struct {
        clientHello  *clientHelloMsg
        hello        *serverHelloMsg
        suite        *cipherSuite
-       ellipticOk   bool
-       ecdsaOk      bool
+       ecdhOk       bool
+       ecSignOk     bool
        rsaDecryptOk bool
        rsaSignOk    bool
        sessionState *sessionState
@@ -193,7 +194,7 @@ Curves:
                        break
                }
        }
-       hs.ellipticOk = supportedCurve && supportedPointFormat
+       hs.ecdhOk = supportedCurve && supportedPointFormat
 
        foundCompression := false
        // We only support null compression, so check that the client offered it.
@@ -266,7 +267,9 @@ Curves:
        if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
                switch priv.Public().(type) {
                case *ecdsa.PublicKey:
-                       hs.ecdsaOk = true
+                       hs.ecSignOk = true
+               case ed25519.PublicKey:
+                       hs.ecSignOk = true
                case *rsa.PublicKey:
                        hs.rsaSignOk = true
                default:
@@ -454,9 +457,10 @@ func (hs *serverHandshakeState) doFullHandshake() error {
                }
        }
 
+       var certReq *certificateRequestMsg
        if c.config.ClientAuth >= RequestClientCert {
                // Request a client certificate
-               certReq := new(certificateRequestMsg)
+               certReq = new(certificateRequestMsg)
                certReq.certificateTypes = []byte{
                        byte(certTypeRSASign),
                        byte(certTypeECDSASign),
@@ -559,15 +563,15 @@ func (hs *serverHandshakeState) doFullHandshake() error {
                }
 
                // Determine the signature type.
-               _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, supportedSignatureAlgorithmsTLS12, c.vers)
+               _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, certReq.supportedSignatureAlgorithms, c.vers)
                if err != nil {
                        c.sendAlert(alertIllegalParameter)
                        return err
                }
 
-               var digest []byte
-               if digest, err = hs.finishedHash.hashForClientCertificate(sigType, hashFunc, hs.masterSecret); err == nil {
-                       err = verifyHandshakeSignature(sigType, pub, hashFunc, digest, certVerify.signature)
+               signed, err := hs.finishedHash.hashForClientCertificate(sigType, hashFunc, hs.masterSecret)
+               if err == nil {
+                       err = verifyHandshakeSignature(sigType, pub, hashFunc, signed, certVerify.signature)
                }
                if err != nil {
                        c.sendAlert(alertBadCertificate)
@@ -754,7 +758,7 @@ func (c *Conn) processCertsFromClient(certificate Certificate) error {
        }
 
        switch certs[0].PublicKey.(type) {
-       case *ecdsa.PublicKey, *rsa.PublicKey:
+       case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
        default:
                c.sendAlert(alertUnsupportedCertificate)
                return fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
@@ -771,33 +775,34 @@ func (c *Conn) processCertsFromClient(certificate Certificate) error {
 // It returns a bool indicating if the suite was set.
 func (hs *serverHandshakeState) setCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16) bool {
        for _, supported := range supportedCipherSuites {
-               if id == supported {
-                       candidate := cipherSuiteByID(id)
-                       if candidate == nil {
+               if id != supported {
+                       continue
+               }
+               candidate := cipherSuiteByID(id)
+               if candidate == nil {
+                       continue
+               }
+               // Don't select a ciphersuite which we can't
+               // support for this client.
+               if candidate.flags&suiteECDHE != 0 {
+                       if !hs.ecdhOk {
                                continue
                        }
-                       // Don't select a ciphersuite which we can't
-                       // support for this client.
-                       if candidate.flags&suiteECDHE != 0 {
-                               if !hs.ellipticOk {
-                                       continue
-                               }
-                               if candidate.flags&suiteECDSA != 0 {
-                                       if !hs.ecdsaOk {
-                                               continue
-                                       }
-                               } else if !hs.rsaSignOk {
+                       if candidate.flags&suiteECSign != 0 {
+                               if !hs.ecSignOk {
                                        continue
                                }
-                       } else if !hs.rsaDecryptOk {
+                       } else if !hs.rsaSignOk {
                                continue
                        }
-                       if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
-                               continue
-                       }
-                       hs.suite = candidate
-                       return true
+               } else if !hs.rsaDecryptOk {
+                       continue
+               }
+               if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
+                       continue
                }
+               hs.suite = candidate
+               return true
        }
        return false
 }
index c23f98f6bc5c17da1fe8a83b5656b8c64f831177..22b126fa22dc5ce8c62be8000041b7961fd11132 100644 (file)
@@ -7,17 +7,11 @@ package tls
 import (
        "bytes"
        "crypto"
-       "crypto/ecdsa"
        "crypto/elliptic"
-       "crypto/rsa"
-       "crypto/x509"
-       "encoding/hex"
        "encoding/pem"
        "errors"
        "fmt"
        "io"
-       "io/ioutil"
-       "math/big"
        "net"
        "os"
        "os/exec"
@@ -27,52 +21,6 @@ import (
        "time"
 )
 
-// zeroSource is an io.Reader that returns an unlimited number of zero bytes.
-type zeroSource struct{}
-
-func (zeroSource) Read(b []byte) (n int, err error) {
-       for i := range b {
-               b[i] = 0
-       }
-
-       return len(b), nil
-}
-
-var testConfig *Config
-
-func allCipherSuites() []uint16 {
-       ids := make([]uint16, len(cipherSuites))
-       for i, suite := range cipherSuites {
-               ids[i] = suite.id
-       }
-
-       return ids
-}
-
-func init() {
-       testConfig = &Config{
-               Time:               func() time.Time { return time.Unix(0, 0) },
-               Rand:               zeroSource{},
-               Certificates:       make([]Certificate, 2),
-               InsecureSkipVerify: true,
-               MinVersion:         VersionSSL30,
-               MaxVersion:         VersionTLS13,
-               CipherSuites:       allCipherSuites(),
-       }
-       testConfig.Certificates[0].Certificate = [][]byte{testRSACertificate}
-       testConfig.Certificates[0].PrivateKey = testRSAPrivateKey
-       testConfig.Certificates[1].Certificate = [][]byte{testSNICertificate}
-       testConfig.Certificates[1].PrivateKey = testRSAPrivateKey
-       testConfig.BuildNameToCertificate()
-       if keyFile := os.Getenv("SSLKEYLOGFILE"); keyFile != "" {
-               f, err := os.OpenFile(keyFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
-               if err != nil {
-                       panic("failed to open SSLKEYLOGFILE: " + err.Error())
-               }
-               testConfig.KeyLogWriter = f
-       }
-}
-
 func testClientHello(t *testing.T, serverConfig *Config, m handshakeMessage) {
        testClientHelloFailure(t, serverConfig, m, "")
 }
@@ -347,46 +295,6 @@ func TestClose(t *testing.T) {
        }
 }
 
-func testHandshake(t *testing.T, clientConfig, serverConfig *Config) (serverState, clientState ConnectionState, err error) {
-       c, s := localPipe(t)
-       errChan := make(chan error)
-       go func() {
-               cli := Client(c, clientConfig)
-               err := cli.Handshake()
-               if err != nil {
-                       errChan <- fmt.Errorf("client: %v", err)
-                       c.Close()
-                       return
-               }
-               defer cli.Close()
-               clientState = cli.ConnectionState()
-               buf, err := ioutil.ReadAll(cli)
-               if err != nil {
-                       t.Errorf("failed to call cli.Read: %v", err)
-               }
-               if got := string(buf); got != opensslSentinel {
-                       t.Errorf("read %q from TLS connection, but expected %q", got, opensslSentinel)
-               }
-               errChan <- nil
-       }()
-       server := Server(s, serverConfig)
-       err = server.Handshake()
-       if err == nil {
-               serverState = server.ConnectionState()
-               if _, err := io.WriteString(server, opensslSentinel); err != nil {
-                       t.Errorf("failed to call server.Write: %v", err)
-               }
-               if err := server.Close(); err != nil {
-                       t.Errorf("failed to call server.Close: %v", err)
-               }
-               err = <-errChan
-       } else {
-               s.Close()
-               <-errChan
-       }
-       return
-}
-
 func TestVersion(t *testing.T) {
        serverConfig := &Config{
                Certificates: testConfig.Certificates,
@@ -632,8 +540,6 @@ func (test *serverTest) loadData() (flows [][]byte, err error) {
 }
 
 func (test *serverTest) run(t *testing.T, write bool) {
-       checkOpenSSLVersion(t)
-
        var clientConn, serverConn net.Conn
        var recordingConn *recordingConn
        var childProcess *exec.Cmd
@@ -684,12 +590,20 @@ func (test *serverTest) run(t *testing.T, write bool) {
                }
                for i, b := range flows {
                        if i%2 == 0 {
-                               clientConn.SetWriteDeadline(time.Now().Add(1 * time.Minute))
+                               if *fast {
+                                       clientConn.SetWriteDeadline(time.Now().Add(1 * time.Second))
+                               } else {
+                                       clientConn.SetWriteDeadline(time.Now().Add(1 * time.Minute))
+                               }
                                clientConn.Write(b)
                                continue
                        }
                        bb := make([]byte, len(b))
-                       clientConn.SetReadDeadline(time.Now().Add(1 * time.Minute))
+                       if *fast {
+                               clientConn.SetReadDeadline(time.Now().Add(1 * time.Second))
+                       } else {
+                               clientConn.SetReadDeadline(time.Now().Add(1 * time.Minute))
+                       }
                        n, err := io.ReadFull(clientConn, bb)
                        if err != nil {
                                t.Fatalf("%s #%d: %s\nRead %d, wanted %d, got %x, wanted %x\n", test.name, i+1, err, n, len(bb), bb[:n], b)
@@ -1204,38 +1118,33 @@ func TestHandshakeServerRSAPKCS1v15(t *testing.T) {
 
 func TestHandshakeServerRSAPSS(t *testing.T) {
        test := &serverTest{
+               name:                          "RSA-RSAPSS",
+               command:                       []string{"openssl", "s_client", "-no_ticket", "-sigalgs", "rsa_pss_rsae_sha256"},
+               expectHandshakeErrorIncluding: "peer doesn't support any common signature algorithms", // See Issue 32425.
+       }
+       runServerTestTLS12(t, test)
+
+       test = &serverTest{
                name:    "RSA-RSAPSS",
                command: []string{"openssl", "s_client", "-no_ticket", "-sigalgs", "rsa_pss_rsae_sha256"},
        }
-       runServerTestTLS12(t, test)
        runServerTestTLS13(t, test)
 }
 
-func TestHandshakeServerPSSDisabled(t *testing.T) {
+func TestHandshakeServerEd25519(t *testing.T) {
+       config := testConfig.Clone()
+       config.Certificates = make([]Certificate, 1)
+       config.Certificates[0].Certificate = [][]byte{testEd25519Certificate}
+       config.Certificates[0].PrivateKey = testEd25519PrivateKey
+       config.BuildNameToCertificate()
+
        test := &serverTest{
-               name:    "RSA-PSS-Disabled",
+               name:    "Ed25519",
                command: []string{"openssl", "s_client", "-no_ticket"},
-               wait:    true,
+               config:  config,
        }
-
-       // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2,
-       // and check that handshakes still work.
-       testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12
-       defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }()
-       supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12
-
        runServerTestTLS12(t, test)
        runServerTestTLS13(t, test)
-
-       test = &serverTest{
-               name:    "RSA-PSS-Disabled-Required",
-               command: []string{"openssl", "s_client", "-no_ticket", "-sigalgs", "rsa_pss_rsae_sha256"},
-               wait:    true,
-
-               expectHandshakeErrorIncluding: "peer doesn't support any common signature algorithms",
-       }
-
-       runServerTestTLS12(t, test)
 }
 
 func benchmarkHandshakeServer(b *testing.B, version uint16, cipherSuite uint16, curve CurveID, cert []byte, key crypto.PrivateKey) {
@@ -1346,67 +1255,8 @@ func BenchmarkHandshakeServer(b *testing.B) {
        })
 }
 
-const clientCertificatePEM = `
------BEGIN CERTIFICATE-----
-MIIB7zCCAVigAwIBAgIQXBnBiWWDVW/cC8m5k5/pvDANBgkqhkiG9w0BAQsFADAS
-MRAwDgYDVQQKEwdBY21lIENvMB4XDTE2MDgxNzIxNTIzMVoXDTE3MDgxNzIxNTIz
-MVowEjEQMA4GA1UEChMHQWNtZSBDbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
-gYEAum+qhr3Pv5/y71yUYHhv6BPy0ZZvzdkybiI3zkH5yl0prOEn2mGi7oHLEMff
-NFiVhuk9GeZcJ3NgyI14AvQdpJgJoxlwaTwlYmYqqyIjxXuFOE8uCXMyp70+m63K
-hAfmDzr/d8WdQYUAirab7rCkPy1MTOZCPrtRyN1IVPQMjkcCAwEAAaNGMEQwDgYD
-VR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAw
-DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOBgQBGq0Si+yhU+Fpn+GKU
-8ZqyGJ7ysd4dfm92lam6512oFmyc9wnTN+RLKzZ8Aa1B0jLYw9KT+RBrjpW5LBeK
-o0RIvFkTgxYEiKSBXCUNmAysEbEoVr4dzWFihAm/1oDGRY2CLLTYg5vbySK3KhIR
-e/oCO8HJ/+rJnahJ05XX1Q7lNQ==
------END CERTIFICATE-----`
-
-const clientKeyPEM = `
------BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQC6b6qGvc+/n/LvXJRgeG/oE/LRlm/N2TJuIjfOQfnKXSms4Sfa
-YaLugcsQx980WJWG6T0Z5lwnc2DIjXgC9B2kmAmjGXBpPCViZiqrIiPFe4U4Ty4J
-czKnvT6brcqEB+YPOv93xZ1BhQCKtpvusKQ/LUxM5kI+u1HI3UhU9AyORwIDAQAB
-AoGAEJZ03q4uuMb7b26WSQsOMeDsftdatT747LGgs3pNRkMJvTb/O7/qJjxoG+Mc
-qeSj0TAZXp+PXXc3ikCECAc+R8rVMfWdmp903XgO/qYtmZGCorxAHEmR80SrfMXv
-PJnznLQWc8U9nphQErR+tTESg7xWEzmFcPKwnZd1xg8ERYkCQQDTGtrFczlB2b/Z
-9TjNMqUlMnTLIk/a/rPE2fLLmAYhK5sHnJdvDURaH2mF4nso0EGtENnTsh6LATnY
-dkrxXGm9AkEA4hXHG2q3MnhgK1Z5hjv+Fnqd+8bcbII9WW4flFs15EKoMgS1w/PJ
-zbsySaSy5IVS8XeShmT9+3lrleed4sy+UwJBAJOOAbxhfXP5r4+5R6ql66jES75w
-jUCVJzJA5ORJrn8g64u2eGK28z/LFQbv9wXgCwfc72R468BdawFSLa/m2EECQGbZ
-rWiFla26IVXV0xcD98VWJsTBZMlgPnSOqoMdM1kSEd4fUmlAYI/dFzV1XYSkOmVr
-FhdZnklmpVDeu27P4c0CQQCuCOup0FlJSBpWY1TTfun/KMBkBatMz0VMA3d7FKIU
-csPezl677Yjo8u1r/KzeI6zLg87Z8E6r6ZWNc9wBSZK6
------END RSA PRIVATE KEY-----`
-
-const clientECDSACertificatePEM = `
------BEGIN CERTIFICATE-----
-MIIB/DCCAV4CCQCaMIRsJjXZFzAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
-EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
-eSBMdGQwHhcNMTIxMTE0MTMyNTUzWhcNMjIxMTEyMTMyNTUzWjBBMQswCQYDVQQG
-EwJBVTEMMAoGA1UECBMDTlNXMRAwDgYDVQQHEwdQeXJtb250MRIwEAYDVQQDEwlK
-b2VsIFNpbmcwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACVjJF1FMBexFe01MNv
-ja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd3kfDdq0Z9kUs
-jLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx+U56jb0JuK7q
-ixgnTy5w/hOWusPTQBbNZU6sER7m8TAJBgcqhkjOPQQBA4GMADCBiAJCAOAUxGBg
-C3JosDJdYUoCdFzCgbkWqD8pyDbHgf9stlvZcPE4O1BIKJTLCRpS8V3ujfK58PDa
-2RU6+b0DeoeiIzXsAkIBo9SKeDUcSpoj0gq+KxAxnZxfvuiRs9oa9V2jI/Umi0Vw
-jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes=
------END CERTIFICATE-----`
-
-const clientECDSAKeyPEM = `
------BEGIN EC PARAMETERS-----
-BgUrgQQAIw==
------END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
-MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8
-k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1
-FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd
-3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx
-+U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q==
------END EC PRIVATE KEY-----`
-
 func TestClientAuth(t *testing.T) {
-       var certPath, keyPath, ecdsaCertPath, ecdsaKeyPath string
+       var certPath, keyPath, ecdsaCertPath, ecdsaKeyPath, ed25519CertPath, ed25519KeyPath string
 
        if *update {
                certPath = tempFile(clientCertificatePEM)
@@ -1417,82 +1267,70 @@ func TestClientAuth(t *testing.T) {
                defer os.Remove(ecdsaCertPath)
                ecdsaKeyPath = tempFile(clientECDSAKeyPEM)
                defer os.Remove(ecdsaKeyPath)
+               ed25519CertPath = tempFile(clientEd25519CertificatePEM)
+               defer os.Remove(ed25519CertPath)
+               ed25519KeyPath = tempFile(clientEd25519KeyPEM)
+               defer os.Remove(ed25519KeyPath)
+       } else {
+               t.Parallel()
        }
 
-       t.Run("Normal", func(t *testing.T) {
-               config := testConfig.Clone()
-               config.ClientAuth = RequestClientCert
-
-               test := &serverTest{
-                       name:    "ClientAuthRequestedNotGiven",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA"},
-                       config:  config,
-               }
-               runServerTestTLS12(t, test)
-               runServerTestTLS13(t, test)
-
-               config.ClientAuth = RequireAnyClientCert
+       config := testConfig.Clone()
+       config.ClientAuth = RequestClientCert
 
-               test = &serverTest{
-                       name: "ClientAuthRequestedAndGiven",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
-                               "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pss_rsae_sha256"},
-                       config:            config,
-                       expectedPeerCerts: []string{clientCertificatePEM},
-               }
-               runServerTestTLS12(t, test)
-               runServerTestTLS13(t, test)
-
-               test = &serverTest{
-                       name: "ClientAuthRequestedAndECDSAGiven",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
-                               "-cert", ecdsaCertPath, "-key", ecdsaKeyPath},
-                       config:            config,
-                       expectedPeerCerts: []string{clientECDSACertificatePEM},
-               }
-               runServerTestTLS12(t, test)
-               runServerTestTLS13(t, test)
-
-               test = &serverTest{
-                       name: "ClientAuthRequestedAndPKCS1v15Given",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
-                               "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pkcs1_sha256"},
-                       config:            config,
-                       expectedPeerCerts: []string{clientCertificatePEM},
-               }
-               runServerTestTLS12(t, test)
-       })
+       test := &serverTest{
+               name:    "ClientAuthRequestedNotGiven",
+               command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA"},
+               config:  config,
+       }
+       runServerTestTLS12(t, test)
+       runServerTestTLS13(t, test)
 
-       // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2,
-       // and check that handshakes still work.
-       testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12
-       defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }()
-       supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12
+       test = &serverTest{
+               name: "ClientAuthRequestedAndGiven",
+               command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
+                       "-cert", certPath, "-key", keyPath, "-client_sigalgs", "rsa_pss_rsae_sha256"},
+               config:            config,
+               expectedPeerCerts: []string{}, // See Issue 32425.
+       }
+       runServerTestTLS12(t, test)
+       test = &serverTest{
+               name: "ClientAuthRequestedAndGiven",
+               command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
+                       "-cert", certPath, "-key", keyPath, "-client_sigalgs", "rsa_pss_rsae_sha256"},
+               config:            config,
+               expectedPeerCerts: []string{clientCertificatePEM},
+       }
+       runServerTestTLS13(t, test)
 
-       t.Run("PSSDisabled", func(t *testing.T) {
-               config := testConfig.Clone()
-               config.ClientAuth = RequireAnyClientCert
-
-               test := &serverTest{
-                       name: "ClientAuthRequestedAndGiven-PSS-Disabled",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
-                               "-cert", certPath, "-key", keyPath},
-                       config:            config,
-                       expectedPeerCerts: []string{clientCertificatePEM},
-               }
-               runServerTestTLS12(t, test)
-               runServerTestTLS13(t, test)
+       test = &serverTest{
+               name: "ClientAuthRequestedAndECDSAGiven",
+               command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
+                       "-cert", ecdsaCertPath, "-key", ecdsaKeyPath},
+               config:            config,
+               expectedPeerCerts: []string{clientECDSACertificatePEM},
+       }
+       runServerTestTLS12(t, test)
+       runServerTestTLS13(t, test)
 
-               test = &serverTest{
-                       name: "ClientAuthRequestedAndGiven-PSS-Disabled-Required",
-                       command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
-                               "-cert", certPath, "-key", keyPath, "-client_sigalgs", "rsa_pss_rsae_sha256"},
-                       config: config,
+       test = &serverTest{
+               name: "ClientAuthRequestedAndEd25519Given",
+               command: []string{"openssl", "s_client", "-no_ticket",
+                       "-cert", ed25519CertPath, "-key", ed25519KeyPath},
+               config:            config,
+               expectedPeerCerts: []string{clientEd25519CertificatePEM},
+       }
+       runServerTestTLS12(t, test)
+       runServerTestTLS13(t, test)
 
-                       expectHandshakeErrorIncluding: "client didn't provide a certificate",
-               }
-               runServerTestTLS12(t, test)
-       })
+       test = &serverTest{
+               name: "ClientAuthRequestedAndPKCS1v15Given",
+               command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA",
+                       "-cert", certPath, "-key", keyPath, "-client_sigalgs", "rsa_pkcs1_sha256"},
+               config:            config,
+               expectedPeerCerts: []string{clientCertificatePEM},
+       }
+       runServerTestTLS12(t, test)
 }
 
 func TestSNIGivenOnFailure(t *testing.T) {
@@ -1680,55 +1518,6 @@ func TestGetConfigForClient(t *testing.T) {
        }
 }
 
-func bigFromString(s string) *big.Int {
-       ret := new(big.Int)
-       ret.SetString(s, 10)
-       return ret
-}
-
-func fromHex(s string) []byte {
-       b, _ := hex.DecodeString(s)
-       return b
-}
-
-var testRSACertificate = fromHex("3082024b308201b4a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b30190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b0500038181009d30cc402b5b50a061cbbae55358e1ed8328a9581aa938a495a1ac315a1a84663d43d32dd90bf297dfd320643892243a00bccf9c7db74020015faad3166109a276fd13c3cce10c5ceeb18782f16c04ed73bbb343778d0c1cf10fa1d8408361c94c722b9daedb4606064df4c1b33ec0d1bd42d4dbfe3d1360845c21d33be9fae7")
-
-var testRSACertificateIssuer = fromHex("3082021930820182a003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100d667b378bb22f34143b6cd2008236abefaf2852adf3ab05e01329e2c14834f5105df3f3073f99dab5442d45ee5f8f57b0111c8cb682fbb719a86944eebfffef3406206d898b8c1b1887797c9c5006547bb8f00e694b7a063f10839f269f2c34fff7a1f4b21fbcd6bfdfb13ac792d1d11f277b5c5b48600992203059f2a8f8cc50203010001a35d305b300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e041204104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b050003818100c1154b4bab5266221f293766ae4138899bd4c5e36b13cee670ceeaa4cbdf4f6679017e2fe649765af545749fe4249418a56bd38a04b81e261f5ce86b8d5c65413156a50d12449554748c59a30c515bc36a59d38bddf51173e899820b282e40aa78c806526fd184fb6b4cf186ec728edffa585440d2b3225325f7ab580e87dd76")
-
-// testRSAPSSCertificate has signatureAlgorithm rsassaPss, and subjectPublicKeyInfo
-// algorithm rsaEncryption, for use with the rsa_pss_rsae_* SignatureSchemes.
-// See also TestRSAPSSKeyError. testRSAPSSCertificate is self-signed.
-var testRSAPSSCertificate = fromHex("308202583082018da003020102021100f29926eb87ea8a0db9fcc247347c11b0304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012030123110300e060355040a130741636d6520436f301e170d3137313132333136313631305a170d3138313132333136313631305a30123110300e060355040a130741636d6520436f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d110408300687047f000001304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012003818100cdac4ef2ce5f8d79881042707f7cbf1b5a8a00ef19154b40151771006cd41626e5496d56da0c1a139fd84695593cb67f87765e18aa03ea067522dd78d2a589b8c92364e12838ce346c6e067b51f1a7e6f4b37ffab13f1411896679d18e880e0ba09e302ac067efca460288e9538122692297ad8093d4f7dd701424d7700a46a1")
-
-var testECDSACertificate = fromHex("3082020030820162020900b8bf2d47a0d2ebf4300906072a8648ce3d04013045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c7464301e170d3132313132323135303633325a170d3232313132303135303633325a3045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c746430819b301006072a8648ce3d020106052b81040023038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b300906072a8648ce3d040103818c0030818802420188a24febe245c5487d1bacf5ed989dae4770c05e1bb62fbdf1b64db76140d311a2ceee0b7e927eff769dc33b7ea53fcefa10e259ec472d7cacda4e970e15a06fd00242014dfcbe67139c2d050ebd3fa38c25c13313830d9406bbd4377af6ec7ac9862eddd711697f857c56defb31782be4c7780daecbbe9e4e3624317b6a0f399512078f2a")
-
-var testSNICertificate = fromHex("0441883421114c81480804c430820237308201a0a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a3023310b3009060355040a1302476f311430120603550403130b736e69746573742e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3773075300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b0500038181007beeecff0230dbb2e7a334af65430b7116e09f327c3bbf918107fc9c66cb497493207ae9b4dbb045cb63d605ec1b5dd485bb69124d68fa298dc776699b47632fd6d73cab57042acb26f083c4087459bc5a3bb3ca4d878d7fe31016b7bc9a627438666566e3389bfaeebe6becc9a0093ceed18d0f9ac79d56f3a73f18188988ed")
-
-var testP256Certificate = fromHex("308201693082010ea00302010202105012dc24e1124ade4f3e153326ff27bf300a06082a8648ce3d04030230123110300e060355040a130741636d6520436f301e170d3137303533313232343934375a170d3138303533313232343934375a30123110300e060355040a130741636d6520436f3059301306072a8648ce3d020106082a8648ce3d03010703420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d1104083006820474657374300a06082a8648ce3d0403020349003046022100963712d6226c7b2bef41512d47e1434131aaca3ba585d666c924df71ac0448b3022100f4d05c725064741aef125f243cdbccaa2a5d485927831f221c43023bd5ae471a")
-
-var testRSAPrivateKey = &rsa.PrivateKey{
-       PublicKey: rsa.PublicKey{
-               N: bigFromString("153980389784927331788354528594524332344709972855165340650588877572729725338415474372475094155672066328274535240275856844648695200875763869073572078279316458648124537905600131008790701752441155668003033945258023841165089852359980273279085783159654751552359397986180318708491098942831252291841441726305535546071"),
-               E: 65537,
-       },
-       D: bigFromString("7746362285745539358014631136245887418412633787074173796862711588221766398229333338511838891484974940633857861775630560092874987828057333663969469797013996401149696897591265769095952887917296740109742927689053276850469671231961384712725169432413343763989564437170644270643461665184965150423819594083121075825"),
-       Primes: []*big.Int{
-               bigFromString("13299275414352936908236095374926261633419699590839189494995965049151460173257838079863316944311313904000258169883815802963543635820059341150014695560313417"),
-               bigFromString("11578103692682951732111718237224894755352163854919244905974423810539077224889290605729035287537520656160688625383765857517518932447378594964220731750802463"),
-       },
-}
-
-var testECDSAPrivateKey = &ecdsa.PrivateKey{
-       PublicKey: ecdsa.PublicKey{
-               Curve: elliptic.P521(),
-               X:     bigFromString("2636411247892461147287360222306590634450676461695221912739908880441342231985950069527906976759812296359387337367668045707086543273113073382714101597903639351"),
-               Y:     bigFromString("3204695818431246682253994090650952614555094516658732116404513121125038617915183037601737180082382202488628239201196033284060130040574800684774115478859677243"),
-       },
-       D: bigFromString("5477294338614160138026852784385529180817726002953041720191098180813046231640184669647735805135001309477695746518160084669446643325196003346204701381388769751"),
-}
-
-var testP256PrivateKey, _ = x509.ParseECPrivateKey(fromHex("30770201010420012f3b52bc54c36ba3577ad45034e2e8efe1e6999851284cb848725cfe029991a00a06082a8648ce3d030107a14403420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75"))
-
 func TestCloseServerConnectionOnIdleClient(t *testing.T) {
        clientConn, serverConn := localPipe(t)
        server := Server(serverConn, testConfig.Clone())
@@ -1758,9 +1547,15 @@ func TestCloneHash(t *testing.T) {
        }
 }
 
+func expectError(t *testing.T, err error, sub string) {
+       if err == nil {
+               t.Errorf(`expected error %q, got nil`, sub)
+       } else if !strings.Contains(err.Error(), sub) {
+               t.Errorf(`expected error %q, got %q`, sub, err)
+       }
+}
+
 func TestKeyTooSmallForRSAPSS(t *testing.T) {
-       clientConn, serverConn := localPipe(t)
-       client := Client(clientConn, testConfig)
        cert, err := X509KeyPair([]byte(`-----BEGIN CERTIFICATE-----
 MIIBcTCCARugAwIBAgIQGjQnkCFlUqaFlt6ixyz/tDANBgkqhkiG9w0BAQsFADAS
 MRAwDgYDVQQKEwdBY21lIENvMB4XDTE5MDExODIzMjMyOFoXDTIwMDExODIzMjMy
@@ -1770,7 +1565,7 @@ nIPhKls4T0hFoLvjJnXpAgMBAAGjTTBLMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUE
 DDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBYGA1UdEQQPMA2CC2V4YW1wbGUu
 Y29tMA0GCSqGSIb3DQEBCwUAA0EAxDuUS+BrrS3c+h+k+fQPOmOScy6yTX9mHw0Q
 KbucGamXYEy0URIwOdO0tQ3LHPc1YGvYSPwkDjkjqECs2Vm/AA==
------END CERTIFICATE-----`), []byte(`-----BEGIN RSA PRIVATE KEY-----
+-----END CERTIFICATE-----`), []byte(testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOgIBAAJBAN17PWsVQPBrHYdPFtycVQ/0CFyAQYwdVXaefhVURYUkHojwL82T
 HRfLJCWuYVgHMRCcg+EqWzhPSEWgu+MmdekCAwEAAQJBALjQYNTdXF4CFBbXwUz/
 yt9QFDYT9B5WT/12jeGAe653gtYS6OOi/+eAkGmzg1GlRnw6fOfn+HYNFDORST7z
@@ -1778,11 +1573,13 @@ yt9QFDYT9B5WT/12jeGAe653gtYS6OOi/+eAkGmzg1GlRnw6fOfn+HYNFDORST7z
 nKpbtU22+PbIMSJ+e80fmY9LIPx5N4HTAiAthGSimMR9bloz0EY3GyuUEyqoDgMd
 hXxjuno2WesoJQIgemilbcALXpxsLmZLgcQ2KSmaVr7jb5ECx9R+hYKTw1sCIG4s
 T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g
------END RSA PRIVATE KEY-----`))
+-----END RSA TESTING KEY-----`)))
        if err != nil {
                t.Fatal(err)
        }
 
+       clientConn, serverConn := localPipe(t)
+       client := Client(clientConn, testConfig)
        done := make(chan struct{})
        go func() {
                config := testConfig.Clone()
@@ -1790,23 +1587,14 @@ T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g
                config.MinVersion = VersionTLS13
                server := Server(serverConn, config)
                err := server.Handshake()
-               if !strings.Contains(err.Error(), "key size too small for PSS signature") {
-                       t.Errorf(`expected "key size too small for PSS signature", got %q`, err)
-               }
+               expectError(t, err, "key size too small for PSS signature")
                close(done)
        }()
        err = client.Handshake()
-       if !strings.Contains(err.Error(), "handshake failure") {
-               t.Errorf(`expected "handshake failure", got %q`, err)
-       }
+       expectError(t, err, "handshake failure")
        <-done
 
-       // With RSA-PSS disabled and TLS 1.2, this should work.
-
-       testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12
-       defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }()
-       supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12
-
+       // In TLS 1.2 RSA-PSS is not used, so this should succeed. See Issue 32425.
        serverConfig := testConfig.Clone()
        serverConfig.Certificates = []Certificate{cert}
        serverConfig.MaxVersion = VersionTLS12
index fd65ac11909901b5dae02a5862c58de8f7283549..74f430cf8ad5ec6ac7ea9563fc7670dc9c1d960c 100644 (file)
@@ -626,14 +626,13 @@ func (hs *serverHandshakeStateTLS13) sendServerCertificate() error {
        if sigType == 0 || err != nil {
                return c.sendAlert(alertInternalError)
        }
-       h := sigHash.New()
-       writeSignedMessage(h, serverSignatureContext, hs.transcript)
 
+       signed := signedMessage(sigHash, serverSignatureContext, hs.transcript)
        signOpts := crypto.SignerOpts(sigHash)
        if sigType == signatureRSAPSS {
                signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
        }
-       sig, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), h.Sum(nil), signOpts)
+       sig, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts)
        if err != nil {
                public := hs.cert.PrivateKey.(crypto.Signer).Public()
                if rsaKey, ok := public.(*rsa.PublicKey); ok && sigType == signatureRSAPSS &&
@@ -815,10 +814,9 @@ func (hs *serverHandshakeStateTLS13) readClientCertificate() error {
                        c.sendAlert(alertIllegalParameter)
                        return errors.New("tls: invalid certificate signature algorithm")
                }
-               h := sigHash.New()
-               writeSignedMessage(h, clientSignatureContext, hs.transcript)
+               signed := signedMessage(sigHash, clientSignatureContext, hs.transcript)
                if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey,
-                       sigHash, h.Sum(nil), certVerify.signature); err != nil {
+                       sigHash, signed, certVerify.signature); err != nil {
                        c.sendAlert(alertDecryptError)
                        return errors.New("tls: invalid certificate signature")
                }
index aa072cef059d631d980ff35f67ae5c9e90873f3c..35c1fe8bf5848abab468197b0b31d59006174827 100644 (file)
@@ -6,6 +6,8 @@ package tls
 
 import (
        "bufio"
+       "crypto/ed25519"
+       "crypto/x509"
        "encoding/hex"
        "errors"
        "flag"
@@ -19,6 +21,7 @@ import (
        "strings"
        "sync"
        "testing"
+       "time"
 )
 
 // TLS reference tests run a connection against a reference implementation
@@ -39,37 +42,27 @@ import (
 // the reference connection will always change.
 
 var (
-       update = flag.Bool("update", false, "update golden files on disk")
-
-       opensslVersionTestOnce sync.Once
-       opensslVersionTestErr  error
+       update  = flag.Bool("update", false, "update golden files on disk")
+       fast    = flag.Bool("fast", false, "impose a quick, possibly flaky timeout on recorded tests")
+       keyFile = flag.String("keylog", "", "destination file for KeyLogWriter")
 )
 
-func checkOpenSSLVersion(t *testing.T) {
-       opensslVersionTestOnce.Do(testOpenSSLVersion)
-       if opensslVersionTestErr != nil {
-               t.Fatal(opensslVersionTestErr)
-       }
-}
-
-func testOpenSSLVersion() {
-       // This test ensures that the version of OpenSSL looks reasonable
-       // before updating the test data.
-
+// checkOpenSSLVersion ensures that the version of OpenSSL looks reasonable
+// before updating the test data.
+func checkOpenSSLVersion() error {
        if !*update {
-               return
+               return nil
        }
 
        openssl := exec.Command("openssl", "version")
        output, err := openssl.CombinedOutput()
        if err != nil {
-               opensslVersionTestErr = err
-               return
+               return err
        }
 
        version := string(output)
        if strings.HasPrefix(version, "OpenSSL 1.1.1") {
-               return
+               return nil
        }
 
        println("***********************************************")
@@ -82,7 +75,7 @@ func testOpenSSLVersion() {
        println("and then add the apps/ directory at the front of your PATH.")
        println("***********************************************")
 
-       opensslVersionTestErr = errors.New("version of OpenSSL does not appear to be suitable for updating test data")
+       return errors.New("version of OpenSSL does not appear to be suitable for updating test data")
 }
 
 // recordingConn is a net.Conn that records the traffic that passes through it.
@@ -253,7 +246,45 @@ func localPipe(t testing.TB) (net.Conn, net.Conn) {
        return c1, c2
 }
 
+// zeroSource is an io.Reader that returns an unlimited number of zero bytes.
+type zeroSource struct{}
+
+func (zeroSource) Read(b []byte) (n int, err error) {
+       for i := range b {
+               b[i] = 0
+       }
+
+       return len(b), nil
+}
+
+func allCipherSuites() []uint16 {
+       ids := make([]uint16, len(cipherSuites))
+       for i, suite := range cipherSuites {
+               ids[i] = suite.id
+       }
+
+       return ids
+}
+
+var testConfig *Config
+
 func TestMain(m *testing.M) {
+       flag.Parse()
+       os.Exit(runMain(m))
+}
+
+func runMain(m *testing.M) int {
+       // TLS 1.3 cipher suites preferences are not configurable and change based
+       // on the architecture. Force them to the version with AES acceleration for
+       // test consistency.
+       once.Do(initDefaultCipherSuites)
+       varDefaultCipherSuitesTLS13 = []uint16{
+               TLS_AES_128_GCM_SHA256,
+               TLS_CHACHA20_POLY1305_SHA256,
+               TLS_AES_256_GCM_SHA384,
+       }
+
+       // Set up localPipe.
        l, err := net.Listen("tcp", "127.0.0.1:0")
        if err != nil {
                l, err = net.Listen("tcp6", "[::1]:0")
@@ -263,7 +294,181 @@ func TestMain(m *testing.M) {
                os.Exit(1)
        }
        localListener.Listener = l
-       exitCode := m.Run()
-       localListener.Close()
-       os.Exit(exitCode)
+       defer localListener.Close()
+
+       if err := checkOpenSSLVersion(); err != nil {
+               fmt.Fprintf(os.Stderr, "Error: %v", err)
+               os.Exit(1)
+       }
+
+       testConfig = &Config{
+               Time:               func() time.Time { return time.Unix(0, 0) },
+               Rand:               zeroSource{},
+               Certificates:       make([]Certificate, 2),
+               InsecureSkipVerify: true,
+               MinVersion:         VersionSSL30,
+               MaxVersion:         VersionTLS13,
+               CipherSuites:       allCipherSuites(),
+       }
+       testConfig.Certificates[0].Certificate = [][]byte{testRSACertificate}
+       testConfig.Certificates[0].PrivateKey = testRSAPrivateKey
+       testConfig.Certificates[1].Certificate = [][]byte{testSNICertificate}
+       testConfig.Certificates[1].PrivateKey = testRSAPrivateKey
+       testConfig.BuildNameToCertificate()
+       if *keyFile != "" {
+               f, err := os.OpenFile(*keyFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+               if err != nil {
+                       panic("failed to open -keylog file: " + err.Error())
+               }
+               testConfig.KeyLogWriter = f
+               defer f.Close()
+       }
+
+       return m.Run()
+}
+
+func testHandshake(t *testing.T, clientConfig, serverConfig *Config) (serverState, clientState ConnectionState, err error) {
+       const sentinel = "SENTINEL\n"
+       c, s := localPipe(t)
+       errChan := make(chan error)
+       go func() {
+               cli := Client(c, clientConfig)
+               err := cli.Handshake()
+               if err != nil {
+                       errChan <- fmt.Errorf("client: %v", err)
+                       c.Close()
+                       return
+               }
+               defer cli.Close()
+               clientState = cli.ConnectionState()
+               buf, err := ioutil.ReadAll(cli)
+               if err != nil {
+                       t.Errorf("failed to call cli.Read: %v", err)
+               }
+               if got := string(buf); got != sentinel {
+                       t.Errorf("read %q from TLS connection, but expected %q", got, sentinel)
+               }
+               errChan <- nil
+       }()
+       server := Server(s, serverConfig)
+       err = server.Handshake()
+       if err == nil {
+               serverState = server.ConnectionState()
+               if _, err := io.WriteString(server, sentinel); err != nil {
+                       t.Errorf("failed to call server.Write: %v", err)
+               }
+               if err := server.Close(); err != nil {
+                       t.Errorf("failed to call server.Close: %v", err)
+               }
+               err = <-errChan
+       } else {
+               s.Close()
+               <-errChan
+       }
+       return
 }
+
+func fromHex(s string) []byte {
+       b, _ := hex.DecodeString(s)
+       return b
+}
+
+var testRSACertificate = fromHex("3082024b308201b4a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b30190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b0500038181009d30cc402b5b50a061cbbae55358e1ed8328a9581aa938a495a1ac315a1a84663d43d32dd90bf297dfd320643892243a00bccf9c7db74020015faad3166109a276fd13c3cce10c5ceeb18782f16c04ed73bbb343778d0c1cf10fa1d8408361c94c722b9daedb4606064df4c1b33ec0d1bd42d4dbfe3d1360845c21d33be9fae7")
+
+var testRSACertificateIssuer = fromHex("3082021930820182a003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100d667b378bb22f34143b6cd2008236abefaf2852adf3ab05e01329e2c14834f5105df3f3073f99dab5442d45ee5f8f57b0111c8cb682fbb719a86944eebfffef3406206d898b8c1b1887797c9c5006547bb8f00e694b7a063f10839f269f2c34fff7a1f4b21fbcd6bfdfb13ac792d1d11f277b5c5b48600992203059f2a8f8cc50203010001a35d305b300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e041204104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b050003818100c1154b4bab5266221f293766ae4138899bd4c5e36b13cee670ceeaa4cbdf4f6679017e2fe649765af545749fe4249418a56bd38a04b81e261f5ce86b8d5c65413156a50d12449554748c59a30c515bc36a59d38bddf51173e899820b282e40aa78c806526fd184fb6b4cf186ec728edffa585440d2b3225325f7ab580e87dd76")
+
+// testRSAPSSCertificate has signatureAlgorithm rsassaPss, but subjectPublicKeyInfo
+// algorithm rsaEncryption, for use with the rsa_pss_rsae_* SignatureSchemes.
+// See also TestRSAPSSKeyError. testRSAPSSCertificate is self-signed.
+var testRSAPSSCertificate = fromHex("308202583082018da003020102021100f29926eb87ea8a0db9fcc247347c11b0304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012030123110300e060355040a130741636d6520436f301e170d3137313132333136313631305a170d3138313132333136313631305a30123110300e060355040a130741636d6520436f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d110408300687047f000001304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012003818100cdac4ef2ce5f8d79881042707f7cbf1b5a8a00ef19154b40151771006cd41626e5496d56da0c1a139fd84695593cb67f87765e18aa03ea067522dd78d2a589b8c92364e12838ce346c6e067b51f1a7e6f4b37ffab13f1411896679d18e880e0ba09e302ac067efca460288e9538122692297ad8093d4f7dd701424d7700a46a1")
+
+var testECDSACertificate = fromHex("3082020030820162020900b8bf2d47a0d2ebf4300906072a8648ce3d04013045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c7464301e170d3132313132323135303633325a170d3232313132303135303633325a3045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c746430819b301006072a8648ce3d020106052b81040023038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b300906072a8648ce3d040103818c0030818802420188a24febe245c5487d1bacf5ed989dae4770c05e1bb62fbdf1b64db76140d311a2ceee0b7e927eff769dc33b7ea53fcefa10e259ec472d7cacda4e970e15a06fd00242014dfcbe67139c2d050ebd3fa38c25c13313830d9406bbd4377af6ec7ac9862eddd711697f857c56defb31782be4c7780daecbbe9e4e3624317b6a0f399512078f2a")
+
+var testEd25519Certificate = fromHex("3082012e3081e1a00302010202100f431c425793941de987e4f1ad15005d300506032b657030123110300e060355040a130741636d6520436f301e170d3139303531363231333830315a170d3230303531353231333830315a30123110300e060355040a130741636d6520436f302a300506032b65700321003fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8fa34d304b300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff0402300030160603551d11040f300d820b6578616d706c652e636f6d300506032b65700341006344ed9cc4be5324539fd2108d9fe82108909539e50dc155ff2c16b71dfcab7d4dd4e09313d0a942e0b66bfe5d6748d79f50bc6ccd4b03837cf20858cdaccf0c")
+
+var testSNICertificate = fromHex("0441883421114c81480804c430820237308201a0a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a3023310b3009060355040a1302476f311430120603550403130b736e69746573742e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3773075300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b0500038181007beeecff0230dbb2e7a334af65430b7116e09f327c3bbf918107fc9c66cb497493207ae9b4dbb045cb63d605ec1b5dd485bb69124d68fa298dc776699b47632fd6d73cab57042acb26f083c4087459bc5a3bb3ca4d878d7fe31016b7bc9a627438666566e3389bfaeebe6becc9a0093ceed18d0f9ac79d56f3a73f18188988ed")
+
+var testP256Certificate = fromHex("308201693082010ea00302010202105012dc24e1124ade4f3e153326ff27bf300a06082a8648ce3d04030230123110300e060355040a130741636d6520436f301e170d3137303533313232343934375a170d3138303533313232343934375a30123110300e060355040a130741636d6520436f3059301306072a8648ce3d020106082a8648ce3d03010703420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d1104083006820474657374300a06082a8648ce3d0403020349003046022100963712d6226c7b2bef41512d47e1434131aaca3ba585d666c924df71ac0448b3022100f4d05c725064741aef125f243cdbccaa2a5d485927831f221c43023bd5ae471a")
+
+var testRSAPrivateKey, _ = x509.ParsePKCS1PrivateKey(fromHex("3082025b02010002818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d702030100010281800b07fbcf48b50f1388db34b016298b8217f2092a7c9a04f77db6775a3d1279b62ee9951f7e371e9de33f015aea80660760b3951dc589a9f925ed7de13e8f520e1ccbc7498ce78e7fab6d59582c2386cc07ed688212a576ff37833bd5943483b5554d15a0b9b4010ed9bf09f207e7e9805f649240ed6c1256ed75ab7cd56d9671024100fded810da442775f5923debae4ac758390a032a16598d62f059bb2e781a9c2f41bfa015c209f966513fe3bf5a58717cbdb385100de914f88d649b7d15309fa49024100dd10978c623463a1802c52f012cfa72ff5d901f25a2292446552c2568b1840e49a312e127217c2186615aae4fb6602a4f6ebf3f3d160f3b3ad04c592f65ae41f02400c69062ca781841a09de41ed7a6d9f54adc5d693a2c6847949d9e1358555c9ac6a8d9e71653ac77beb2d3abaf7bb1183aa14278956575dbebf525d0482fd72d90240560fe1900ba36dae3022115fd952f2399fb28e2975a1c3e3d0b679660bdcb356cc189d611cfdd6d87cd5aea45aa30a2082e8b51e94c2f3dd5d5c6036a8a615ed0240143993d80ece56f877cb80048335701eb0e608cc0c1ca8c2227b52edf8f1ac99c562f2541b5ce81f0515af1c5b4770dba53383964b4b725ff46fdec3d08907df"))
+
+var testECDSAPrivateKey, _ = x509.ParseECPrivateKey(fromHex("3081dc0201010442019883e909ad0ac9ea3d33f9eae661f1785206970f8ca9a91672f1eedca7a8ef12bd6561bb246dda5df4b4d5e7e3a92649bc5d83a0bf92972e00e62067d0c7bd99d7a00706052b81040023a18189038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b"))
+
+var testP256PrivateKey, _ = x509.ParseECPrivateKey(fromHex("30770201010420012f3b52bc54c36ba3577ad45034e2e8efe1e6999851284cb848725cfe029991a00a06082a8648ce3d030107a14403420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75"))
+
+var testEd25519PrivateKey = ed25519.PrivateKey(fromHex("3a884965e76b3f55e5faf9615458a92354894234de3ec9f684d46d55cebf3dc63fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8f"))
+
+const clientCertificatePEM = `
+-----BEGIN CERTIFICATE-----
+MIIB7zCCAVigAwIBAgIQXBnBiWWDVW/cC8m5k5/pvDANBgkqhkiG9w0BAQsFADAS
+MRAwDgYDVQQKEwdBY21lIENvMB4XDTE2MDgxNzIxNTIzMVoXDTE3MDgxNzIxNTIz
+MVowEjEQMA4GA1UEChMHQWNtZSBDbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
+gYEAum+qhr3Pv5/y71yUYHhv6BPy0ZZvzdkybiI3zkH5yl0prOEn2mGi7oHLEMff
+NFiVhuk9GeZcJ3NgyI14AvQdpJgJoxlwaTwlYmYqqyIjxXuFOE8uCXMyp70+m63K
+hAfmDzr/d8WdQYUAirab7rCkPy1MTOZCPrtRyN1IVPQMjkcCAwEAAaNGMEQwDgYD
+VR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAw
+DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOBgQBGq0Si+yhU+Fpn+GKU
+8ZqyGJ7ysd4dfm92lam6512oFmyc9wnTN+RLKzZ8Aa1B0jLYw9KT+RBrjpW5LBeK
+o0RIvFkTgxYEiKSBXCUNmAysEbEoVr4dzWFihAm/1oDGRY2CLLTYg5vbySK3KhIR
+e/oCO8HJ/+rJnahJ05XX1Q7lNQ==
+-----END CERTIFICATE-----`
+
+var clientKeyPEM = testingKey(`
+-----BEGIN RSA TESTING KEY-----
+MIICXQIBAAKBgQC6b6qGvc+/n/LvXJRgeG/oE/LRlm/N2TJuIjfOQfnKXSms4Sfa
+YaLugcsQx980WJWG6T0Z5lwnc2DIjXgC9B2kmAmjGXBpPCViZiqrIiPFe4U4Ty4J
+czKnvT6brcqEB+YPOv93xZ1BhQCKtpvusKQ/LUxM5kI+u1HI3UhU9AyORwIDAQAB
+AoGAEJZ03q4uuMb7b26WSQsOMeDsftdatT747LGgs3pNRkMJvTb/O7/qJjxoG+Mc
+qeSj0TAZXp+PXXc3ikCECAc+R8rVMfWdmp903XgO/qYtmZGCorxAHEmR80SrfMXv
+PJnznLQWc8U9nphQErR+tTESg7xWEzmFcPKwnZd1xg8ERYkCQQDTGtrFczlB2b/Z
+9TjNMqUlMnTLIk/a/rPE2fLLmAYhK5sHnJdvDURaH2mF4nso0EGtENnTsh6LATnY
+dkrxXGm9AkEA4hXHG2q3MnhgK1Z5hjv+Fnqd+8bcbII9WW4flFs15EKoMgS1w/PJ
+zbsySaSy5IVS8XeShmT9+3lrleed4sy+UwJBAJOOAbxhfXP5r4+5R6ql66jES75w
+jUCVJzJA5ORJrn8g64u2eGK28z/LFQbv9wXgCwfc72R468BdawFSLa/m2EECQGbZ
+rWiFla26IVXV0xcD98VWJsTBZMlgPnSOqoMdM1kSEd4fUmlAYI/dFzV1XYSkOmVr
+FhdZnklmpVDeu27P4c0CQQCuCOup0FlJSBpWY1TTfun/KMBkBatMz0VMA3d7FKIU
+csPezl677Yjo8u1r/KzeI6zLg87Z8E6r6ZWNc9wBSZK6
+-----END RSA TESTING KEY-----`)
+
+const clientECDSACertificatePEM = `
+-----BEGIN CERTIFICATE-----
+MIIB/DCCAV4CCQCaMIRsJjXZFzAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
+EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
+eSBMdGQwHhcNMTIxMTE0MTMyNTUzWhcNMjIxMTEyMTMyNTUzWjBBMQswCQYDVQQG
+EwJBVTEMMAoGA1UECBMDTlNXMRAwDgYDVQQHEwdQeXJtb250MRIwEAYDVQQDEwlK
+b2VsIFNpbmcwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACVjJF1FMBexFe01MNv
+ja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd3kfDdq0Z9kUs
+jLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx+U56jb0JuK7q
+ixgnTy5w/hOWusPTQBbNZU6sER7m8TAJBgcqhkjOPQQBA4GMADCBiAJCAOAUxGBg
+C3JosDJdYUoCdFzCgbkWqD8pyDbHgf9stlvZcPE4O1BIKJTLCRpS8V3ujfK58PDa
+2RU6+b0DeoeiIzXsAkIBo9SKeDUcSpoj0gq+KxAxnZxfvuiRs9oa9V2jI/Umi0Vw
+jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes=
+-----END CERTIFICATE-----`
+
+var clientECDSAKeyPEM = testingKey(`
+-----BEGIN EC PARAMETERS-----
+BgUrgQQAIw==
+-----END EC PARAMETERS-----
+-----BEGIN EC TESTING KEY-----
+MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8
+k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1
+FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd
+3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx
++U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q==
+-----END EC TESTING KEY-----`)
+
+const clientEd25519CertificatePEM = `
+-----BEGIN CERTIFICATE-----
+MIIBLjCB4aADAgECAhAX0YGTviqMISAQJRXoNCNPMAUGAytlcDASMRAwDgYDVQQK
+EwdBY21lIENvMB4XDTE5MDUxNjIxNTQyNloXDTIwMDUxNTIxNTQyNlowEjEQMA4G
+A1UEChMHQWNtZSBDbzAqMAUGAytlcAMhAAvgtWC14nkwPb7jHuBQsQTIbcd4bGkv
+xRStmmNveRKRo00wSzAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
+AwIwDAYDVR0TAQH/BAIwADAWBgNVHREEDzANggtleGFtcGxlLmNvbTAFBgMrZXAD
+QQD8GRcqlKUx+inILn9boF2KTjRAOdazENwZ/qAicbP1j6FYDc308YUkv+Y9FN/f
+7Q7hF9gRomDQijcjKsJGqjoI
+-----END CERTIFICATE-----`
+
+var clientEd25519KeyPEM = testingKey(`
+-----BEGIN TESTING KEY-----
+MC4CAQAwBQYDK2VwBCIEINifzf07d9qx3d44e0FSbV4mC/xQxT644RRbpgNpin7I
+-----END TESTING KEY-----`)
index 05fe77b3e205b18a098cb9b6ee1820a677f4bd97..2922017cc4dd08c5bf30a921ee54c7d1834a3484 100644 (file)
@@ -105,26 +105,34 @@ func md5SHA1Hash(slices [][]byte) []byte {
 
 // hashForServerKeyExchange hashes the given slices and returns their digest
 // using the given hash function (for >= TLS 1.2) or using a default based on
-// the sigType (for earlier TLS versions).
-func hashForServerKeyExchange(sigType uint8, hashFunc crypto.Hash, version uint16, slices ...[]byte) ([]byte, error) {
+// the sigType (for earlier TLS versions). For Ed25519 signatures, which don't
+// do pre-hashing, it returns the concatenation of the slices.
+func hashForServerKeyExchange(sigType uint8, hashFunc crypto.Hash, version uint16, slices ...[]byte) []byte {
+       if sigType == signatureEd25519 {
+               var signed []byte
+               for _, slice := range slices {
+                       signed = append(signed, slice...)
+               }
+               return signed
+       }
        if version >= VersionTLS12 {
                h := hashFunc.New()
                for _, slice := range slices {
                        h.Write(slice)
                }
                digest := h.Sum(nil)
-               return digest, nil
+               return digest
        }
        if sigType == signatureECDSA {
-               return sha1Hash(slices), nil
+               return sha1Hash(slices)
        }
-       return md5SHA1Hash(slices), nil
+       return md5SHA1Hash(slices)
 }
 
 // ecdheKeyAgreement implements a TLS key agreement where the server
 // generates an ephemeral EC public/private key pair and signs it. The
 // pre-master secret is then calculated using ECDH. The signature may
-// either be ECDSA or RSA.
+// be ECDSA, Ed25519 or RSA.
 type ecdheKeyAgreement struct {
        version uint16
        isRSA   bool
@@ -185,16 +193,13 @@ NextCandidate:
                return nil, errors.New("tls: certificate cannot be used with the selected cipher suite")
        }
 
-       digest, err := hashForServerKeyExchange(sigType, hashFunc, ka.version, clientHello.random, hello.random, serverECDHParams)
-       if err != nil {
-               return nil, err
-       }
+       signed := hashForServerKeyExchange(sigType, hashFunc, ka.version, clientHello.random, hello.random, serverECDHParams)
 
        signOpts := crypto.SignerOpts(hashFunc)
        if sigType == signatureRSAPSS {
                signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: hashFunc}
        }
-       sig, err := priv.Sign(config.rand(), digest, signOpts)
+       sig, err := priv.Sign(config.rand(), signed, signOpts)
        if err != nil {
                return nil, errors.New("tls: failed to sign ECDHE parameters: " + err.Error())
        }
@@ -297,11 +302,8 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell
        }
        sig = sig[2:]
 
-       digest, err := hashForServerKeyExchange(sigType, hashFunc, ka.version, clientHello.random, serverHello.random, serverECDHParams)
-       if err != nil {
-               return err
-       }
-       return verifyHandshakeSignature(sigType, cert.PublicKey, hashFunc, digest, sig)
+       signed := hashForServerKeyExchange(sigType, hashFunc, ka.version, clientHello.random, serverHello.random, serverECDHParams)
+       return verifyHandshakeSignature(sigType, cert.PublicKey, hashFunc, signed, sig)
 }
 
 func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
index 2cfc226d7f6e9ee1c9bacddf3afd82199d8a366e..83e5480fc5ed9eb6e2988f29dd4ab98c463e7240 100644 (file)
@@ -7,11 +7,12 @@ package tls
 import (
        "crypto/elliptic"
        "crypto/hmac"
+       "crypto/subtle"
        "errors"
+       "golang.org/x/crypto/cryptobyte"
+       "golang.org/x/crypto/curve25519"
+       "golang.org/x/crypto/hkdf"
        "hash"
-       "internal/x/crypto/cryptobyte"
-       "internal/x/crypto/curve25519"
-       "internal/x/crypto/hkdf"
        "io"
        "math/big"
 )
@@ -193,8 +194,16 @@ func (p *x25519Parameters) SharedKey(peerPublicKey []byte) []byte {
        if len(peerPublicKey) != 32 {
                return nil
        }
+
        var theirPublicKey, sharedKey [32]byte
        copy(theirPublicKey[:], peerPublicKey)
        curve25519.ScalarMult(&sharedKey, &p.privateKey, &theirPublicKey)
+
+       // Check for low-order inputs. See RFC 8422, Section 5.11.
+       var allZeroes [32]byte
+       if subtle.ConstantTimeCompare(allZeroes[:], sharedKey[:]) == 1 {
+               return nil
+       }
+
        return sharedKey[:]
 }
index 5379397c265f3f2f0033139552101a067a2ff1e3..5e97726e792c89d020711b679963bf7e739ec866 100644 (file)
@@ -187,6 +187,8 @@ func hashFromSignatureScheme(signatureAlgorithm SignatureScheme) (crypto.Hash, e
                return crypto.SHA384, nil
        case PKCS1WithSHA512, PSSWithSHA512, ECDSAWithP521AndSHA512:
                return crypto.SHA512, nil
+       case Ed25519:
+               return directSigning, nil
        default:
                return 0, fmt.Errorf("tls: unsupported signature algorithm: %#04x", signatureAlgorithm)
        }
@@ -308,11 +310,11 @@ func (h finishedHash) serverSum(masterSecret []byte) []byte {
        return out
 }
 
-// hashForClientCertificate returns a digest over the handshake messages so far,
-// suitable for signing by a TLS client certificate.
+// hashForClientCertificate returns the handshake messages so far, pre-hashed if
+// necessary, suitable for signing by a TLS client certificate.
 func (h finishedHash) hashForClientCertificate(sigType uint8, hashAlg crypto.Hash, masterSecret []byte) ([]byte, error) {
-       if (h.version == VersionSSL30 || h.version >= VersionTLS12) && h.buffer == nil {
-               panic("a handshake hash for a client-certificate was requested after discarding the handshake buffer")
+       if (h.version == VersionSSL30 || h.version >= VersionTLS12 || sigType == signatureEd25519) && h.buffer == nil {
+               panic("tls: handshake hash for a client certificate requested after discarding the handshake buffer")
        }
 
        if h.version == VersionSSL30 {
@@ -326,6 +328,11 @@ func (h finishedHash) hashForClientCertificate(sigType uint8, hashAlg crypto.Has
                sha1Hash.Write(h.buffer)
                return finishedSum30(md5Hash, sha1Hash, masterSecret, nil), nil
        }
+
+       if sigType == signatureEd25519 {
+               return h.buffer, nil
+       }
+
        if h.version >= VersionTLS12 {
                hash := hashAlg.New()
                hash.Write(h.buffer)
index 009e6585c6a4aa0c52546f8ad3b3f79874bc033e..9de3f1437b473227fca09728692188d20623d33a 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 80 87 8d 86 82  |....Y...U.......|
-00000010  b7 ab d8 7d 1c b5 86 ca  1c af 7e c0 07 6d 43 3e  |...}......~..mC>|
-00000020  10 59 aa 08 19 ae d0 b8  a1 f5 23 20 b6 3d 32 8b  |.Y........# .=2.|
-00000030  f9 52 1a 01 eb 69 35 7c  be 2d a9 ca 55 21 f3 b3  |.R...i5|.-..U!..|
-00000040  87 89 1e 05 cb cb 5d af  97 84 7e 07 c0 09 00 00  |......]...~.....|
+00000000  16 03 01 00 59 02 00 00  55 03 01 94 1f ba 79 da  |....Y...U.....y.|
+00000010  4b 58 3e 08 2c c5 31 36  a4 7e 32 bf e1 a0 f7 71  |KX>.,.16.~2....q|
+00000020  01 48 63 3c 5f cb 08 7a  25 80 c7 20 35 0c c0 8b  |.Hc<_..z%.. 5...|
+00000030  df 30 fc dc 3d f1 48 96  0d b6 ff a8 cd 35 29 57  |.0..=.H......5)W|
+00000040  7d 3f c2 9d e2 32 b1 c2  4c 05 5e 3b c0 09 00 00  |}?...2..L.^;....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 b5 0c 00  00 b1 03 00 1d 20 db cd  |*............ ..|
-00000280  1a f4 85 72 91 7c ee 8c  5c 02 c7 5b 09 c3 97 5b  |...r.|..\..[...[|
-00000290  5a 5c 2a af 84 5d 40 e9  2a e6 71 29 85 5d 00 8b  |Z\*..]@.*.q).]..|
-000002a0  30 81 88 02 42 00 ec 5a  5c b8 29 7d b6 58 15 62  |0...B..Z\.)}.X.b|
-000002b0  b4 45 21 84 d6 d8 3a cc  b8 c5 ff 79 66 07 57 28  |.E!...:....yf.W(|
-000002c0  29 af 1d e3 cf db 1b 23  bb 5a 2f 23 8f 29 ed d4  |)......#.Z/#.)..|
-000002d0  6c 3b ab a4 09 76 38 cf  63 bf 74 f9 5b 87 a2 e2  |l;...v8.c.t.[...|
-000002e0  b7 1c 03 29 bd c6 1e 02  42 01 65 17 a6 34 04 01  |...)....B.e..4..|
-000002f0  f4 f6 57 95 85 44 57 f5  34 02 aa fa 8b 63 57 69  |..W..DW.4....cWi|
-00000300  6f e4 23 8a e6 c2 c4 4a  b9 ac a9 44 3e c7 bc 47  |o.#....J...D>..G|
-00000310  77 ae fe 22 14 5f bc 1c  e2 20 ab 3f f6 dd c3 8f  |w.."._... .?....|
-00000320  ed dd 39 c3 47 01 28 66  33 e6 c6 16 03 01 00 0a  |..9.G.(f3.......|
+00000270  2a 16 03 01 00 b5 0c 00  00 b1 03 00 1d 20 1a 74  |*............ .t|
+00000280  c4 96 9e 65 45 9a 0a 01  7c ed 7b 51 01 d8 ba 5b  |...eE...|.{Q...[|
+00000290  3e 2f b1 4b 36 69 e8 47  75 7e 27 be b3 2f 00 8b  |>/.K6i.Gu~'../..|
+000002a0  30 81 88 02 42 01 cb 20  d9 1e ae 05 6f 1f 37 ce  |0...B.. ....o.7.|
+000002b0  dc 38 20 2f 8f 52 9a 92  f6 80 d6 f9 97 99 a5 8b  |.8 /.R..........|
+000002c0  6e 73 0b 95 a4 4e 82 67  bd 1a 34 d9 5c 4e b4 d7  |ns...N.g..4.\N..|
+000002d0  35 e6 45 81 14 23 9c 4e  5a 4c 1b 93 fd 7f 43 18  |5.E..#.NZL....C.|
+000002e0  db 54 4b e0 d1 d3 fa 02  42 00 ab 8e 34 d5 c2 04  |.TK.....B...4...|
+000002f0  d0 a4 44 b1 b3 25 a0 af  c8 80 b3 88 ae da b3 c6  |..D..%..........|
+00000300  4f 57 ae 31 54 c6 d9 ee  4e 21 56 01 cc b9 6a e9  |OW.1T...N!V...j.|
+00000310  e9 7e 62 2a 64 0e a4 a0  79 1e a3 64 52 70 b1 a5  |.~b*d...y..dRp..|
+00000320  19 2c a4 6d 4b 3b a3 63  ed 56 2f 16 03 01 00 0a  |.,.mK;.c.V/.....|
 00000330  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
 00000340  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
 00000210  03 01 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 01 00 91 0f 00  |...._X.;t.......|
-00000240  00 8d 00 8b 30 81 88 02  42 01 b1 4c 5b 98 0d 02  |....0...B..L[...|
-00000250  57 ed 5a 6a ba b2 25 b8  fe ab 0b c2 d2 f7 4f cf  |W.Zj..%.......O.|
-00000260  05 fd 66 85 85 10 da 84  b5 30 76 92 70 5f 73 5b  |..f......0v.p_s[|
-00000270  5e c1 ce 1d 3c 88 1d 50  b1 85 f8 66 07 a8 16 6a  |^...<..P...f...j|
-00000280  f0 d5 61 80 e2 8e 75 dc  e2 e1 45 02 42 01 2f 2f  |..a...u...E.B.//|
-00000290  17 58 50 18 25 9e 99 9c  89 69 aa 55 69 26 6d 88  |.XP.%....i.Ui&m.|
-000002a0  8d c9 76 8b d5 40 5e 9d  0b f5 9f 6f dd 93 94 50  |..v..@^....o...P|
-000002b0  c0 6e c5 7a 4d 9e fb 64  61 31 88 be fa 0c 11 b8  |.n.zM..da1......|
-000002c0  ab 7e 7c 3d bf 4e da de  aa aa 19 af 1c 1f 35 14  |.~|=.N........5.|
-000002d0  03 01 00 01 01 16 03 01  00 30 58 e2 f6 52 c6 6f  |.........0X..R.o|
-000002e0  8d ba 2d be 84 8d fd 19  b7 2a e6 c4 b9 47 0d 3b  |..-......*...G.;|
-000002f0  af a8 8d 91 90 9d ff a1  f0 65 af 8e fe 8a 9b 39  |.........e.....9|
-00000300  1c b1 e4 0b e3 c5 9a bf  86 18                    |..........|
+00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 01 00 90 0f 00  |...._X.;t.......|
+00000240  00 8c 00 8a 30 81 87 02  42 01 89 0f 43 df a8 34  |....0...B...C..4|
+00000250  dd d7 c9 d4 2b 8d ec 29  77 7b 64 d0 0e 8c e8 2b  |....+..)w{d....+|
+00000260  e3 25 1c ed 0a 1b 05 e0  66 42 37 c0 e6 fa 3e 81  |.%......fB7...>.|
+00000270  ec e1 06 99 f4 62 3f ea  55 79 ae 68 56 9e e3 3c  |.....b?.Uy.hV..<|
+00000280  83 ba 9b 1c 65 b9 eb a6  e7 f7 4e 02 41 61 2c 52  |....e.....N.Aa,R|
+00000290  4c 48 92 b0 93 d8 31 58  c3 90 b0 e3 7d 55 94 fc  |LH....1X....}U..|
+000002a0  70 bf 18 42 51 73 d0 45  17 2e 0e 00 b0 12 76 0d  |p..BQs.E......v.|
+000002b0  35 78 cb fd 34 60 36 ff  ed 19 ef 0a 1e 21 cc 4c  |5x..4`6......!.L|
+000002c0  9a ff a0 f7 cf 72 03 cd  00 bb 73 0d 1d e5 14 03  |.....r....s.....|
+000002d0  01 00 01 01 16 03 01 00  30 69 76 1f 5b 81 5f 62  |........0iv.[._b|
+000002e0  cf d5 d9 2c 19 71 80 d0  2a 97 8a 89 21 7f 6d 02  |...,.q..*...!.m.|
+000002f0  b6 01 a4 ed fe 18 9f 34  ae 95 f6 a1 29 0b 9a 1c  |.......4....)...|
+00000300  04 b6 ce c7 d1 0c 5a b5  3f                       |......Z.?|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 bc 72 19 6f bb  |..........0.r.o.|
-00000010  a0 79 dd 23 cf 44 0c be  48 9e ef 94 f3 47 fb 03  |.y.#.D..H....G..|
-00000020  7d c6 af 0d 35 e2 4d 73  92 42 04 fa 5b 74 be 4d  |}...5.Ms.B..[t.M|
-00000030  0e 1b bf 3d 4a c9 d9 66  10 02 9f                 |...=J..f...|
+00000000  14 03 01 00 01 01 16 03  01 00 30 7d 4b fc 73 20  |..........0}K.s |
+00000010  e4 ac c4 39 15 79 e3 89  e1 24 ce 28 30 e5 f1 87  |...9.y...$.(0...|
+00000020  cd c0 cc 39 a8 77 3b 06  a5 f9 b0 a1 3d 54 53 3b  |...9.w;.....=TS;|
+00000030  53 ec ac b2 ea 24 1b 2d  6a ef c3                 |S....$.-j..|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 96 d0 e8  8d 10 80 14 f0 61 fa a9  |.... ........a..|
-00000010  61 f0 52 a9 22 b3 78 66  9d a4 79 6f 77 1e dc 2f  |a.R.".xf..yow../|
-00000020  0d f7 83 86 58 17 03 01  00 20 f9 91 e6 bf d9 c6  |....X.... ......|
-00000030  34 5c 2c a2 94 55 55 74  83 03 58 5f 02 a8 00 da  |4\,..UUt..X_....|
-00000040  70 22 e8 1d 54 c8 43 17  4e b8 15 03 01 00 20 b1  |p"..T.C.N..... .|
-00000050  6f a7 15 cc e5 50 e3 ab  70 14 ed 7f 8d fc 3a ff  |o....P..p.....:.|
-00000060  6a ea 4f bd b0 58 59 b7  38 36 2c b2 df 3c 4a     |j.O..XY.86,..<J|
+00000000  17 03 01 00 20 9d 57 d2  4b 5b 7e 7d 7c 28 f7 8e  |.... .W.K[~}|(..|
+00000010  00 0a b6 1c 3c 6b df 4d  06 c0 f8 db 86 2e 8f 8e  |....<k.M........|
+00000020  28 a9 ab 6c c2 17 03 01  00 20 b4 4e cc 55 14 1c  |(..l..... .N.U..|
+00000030  64 a4 3d 69 1a dc 3b 12  8e d8 15 f2 31 3a 71 1f  |d.=i..;.....1:q.|
+00000040  eb fe c3 b3 22 f7 2c 6e  01 e9 15 03 01 00 20 2a  |....".,n...... *|
+00000050  2e 34 ca 96 e5 a3 a0 53  c4 0c e2 0a b1 14 a3 c8  |.4.....S........|
+00000060  a5 db 72 09 31 25 11 11  2f ce 61 3a 55 48 0c     |..r.1%../.a:UH.|
index 8eae220c1749672661c2f89dbbf692297beab0de..754b76ece9549237d32233dac175c2fb48d6c2e6 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 a1 68 ff ed 89  |....Y...U...h...|
-00000010  15 1b 21 de e0 23 e9 b0  ea 6c 1a 10 c7 f2 bb c1  |..!..#...l......|
-00000020  c7 7a 76 6c df 17 45 2d  71 8d 6a 20 12 5b 28 d2  |.zvl..E-q.j .[(.|
-00000030  94 ed d3 f5 6d 0b 40 2b  6f ec 7d 1f 8b 37 5c da  |....m.@+o.}..7\.|
-00000040  ae b3 47 fd e5 13 36 c0  2f 50 33 58 c0 13 00 00  |..G...6./P3X....|
+00000000  16 03 01 00 59 02 00 00  55 03 01 97 0c 7e fc 7f  |....Y...U....~..|
+00000010  96 47 02 21 a7 19 45 a5  79 5c 5e fc c2 15 b3 fa  |.G.!..E.y\^.....|
+00000020  84 98 7d 67 65 c8 48 58  a1 5d 67 20 ad 2a c6 b3  |..}ge.HX.]g .*..|
+00000030  a4 17 82 12 4a c5 97 af  12 6b 7d f6 9e 49 f1 38  |....J....k}..I.8|
+00000040  d0 56 76 bc 81 23 ad 3a  3e 7f bc 2d c0 13 00 00  |.Vv..#.:>..-....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 67 3f fc ee e2 3f 93  |........ g?...?.|
-000002d0  c9 f9 f3 a2 41 97 86 04  ce f5 e5 6d ac 00 85 64  |....A......m...d|
-000002e0  01 83 89 75 5f 27 7c 5f  41 00 80 30 d3 2d ce bc  |...u_'|_A..0.-..|
-000002f0  9a 45 ea 21 4c 28 9b 36  ba a9 d0 24 c9 1a 1b 3b  |.E.!L(.6...$...;|
-00000300  6c 2d c3 72 3d d6 09 b2  07 d2 f2 54 b0 02 29 d7  |l-.r=......T..).|
-00000310  99 f6 5e ee 71 d9 6f 1d  0a 74 f3 ee 23 79 60 d3  |..^.q.o..t..#y`.|
-00000320  fd 14 99 d9 12 bd f7 5b  73 08 24 f2 3e 1f f5 38  |.......[s.$.>..8|
-00000330  6a c9 43 72 ea 97 78 b9  48 7b aa 05 b2 9a fc 6a  |j.Cr..x.H{.....j|
-00000340  1f 4d 01 6a 9f 05 a3 0e  84 1f 09 9d e3 1a 07 6b  |.M.j...........k|
-00000350  c6 82 5f cc 4a db 33 86  4a 03 50 21 d7 9e ca a1  |.._.J.3.J.P!....|
-00000360  9a 4f 52 53 43 67 81 53  3b ed fd 16 03 01 00 0a  |.ORSCg.S;.......|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 a4 24 f7 67 e3 da fa  |........ .$.g...|
+000002d0  10 33 95 b4 46 00 c0 3c  cd 74 12 e4 a3 3b 01 70  |.3..F..<.t...;.p|
+000002e0  fb 98 01 9a e9 2d d0 18  7b 00 80 ce c5 7b 4b 87  |.....-..{....{K.|
+000002f0  cd bc 5d 63 09 7e d4 ce  09 53 7a 1b e5 b4 10 54  |..]c.~...Sz....T|
+00000300  89 52 ac 82 9c 78 88 ed  e8 1a 8c 3a 7a 2c 9a c5  |.R...x.....:z,..|
+00000310  2b 97 1c 79 43 bd b1 ee  93 6f 4c 4d fc 3c 47 91  |+..yC....oLM.<G.|
+00000320  a6 ac ad be a9 39 12 98  40 f7 6a a3 e7 21 76 90  |.....9..@.j..!v.|
+00000330  c9 80 2b bc 80 3f 7e 60  59 7d cd 38 84 a8 53 2a  |..+..?~`Y}.8..S*|
+00000340  92 24 08 8f 84 da cd 9a  86 80 10 05 8f 1b fd 86  |.$..............|
+00000350  93 b6 ef 13 70 e5 6a d5  0e a5 bf 80 bf 50 a8 d4  |....p.j......P..|
+00000360  87 99 b8 d6 f0 4f 45 d5  e6 8b e1 16 03 01 00 0a  |.....OE.........|
 00000370  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
 00000380  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000210  03 01 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
 00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 01 00 91 0f 00  |...._X.;t.......|
-00000240  00 8d 00 8b 30 81 88 02  42 00 a6 8c ff 5a 40 01  |....0...B....Z@.|
-00000250  bc 1c 28 f7 95 34 93 1b  78 58 34 04 d9 3e 8b 1e  |..(..4..xX4..>..|
-00000260  bb 2a 3f aa a8 a0 24 38  05 c2 38 4f 8b 55 08 17  |.*?...$8..8O.U..|
-00000270  e4 68 9b 9a 6c f1 94 cc  61 52 90 8a 38 6e 76 f5  |.h..l...aR..8nv.|
-00000280  0b 59 60 94 67 b5 78 83  93 eb cd 02 42 00 eb 7b  |.Y`.g.x.....B..{|
-00000290  a4 90 f5 8a 07 ab 80 49  41 48 6e 37 7b e2 f8 b8  |.......IAHn7{...|
-000002a0  27 2d 06 2b cf 5a e9 eb  5c 36 a3 de 50 b9 40 b5  |'-.+.Z..\6..P.@.|
-000002b0  14 0a 5c a4 ec 8f 2b 0c  d4 ca a3 45 db 2a 3a 65  |..\...+....E.*:e|
-000002c0  b4 8e c4 a6 d8 e9 f7 c3  48 34 f7 e7 65 b9 90 14  |........H4..e...|
-000002d0  03 01 00 01 01 16 03 01  00 30 a3 4b 62 d6 25 40  |.........0.Kb.%@|
-000002e0  84 6c 3f 2c d8 fa 69 93  49 4f 4e 75 06 09 0c 1a  |.l?,..i.IONu....|
-000002f0  01 b9 09 2e 9d 4d 0a f7  57 c0 8b d8 d0 44 5d f4  |.....M..W....D].|
-00000300  c1 19 61 a7 a7 36 05 ad  96 92                    |..a..6....|
+00000240  00 8d 00 8b 30 81 88 02  42 01 71 f3 c4 3a 85 08  |....0...B.q..:..|
+00000250  3b 18 26 48 5c 3f c3 8a  4f e9 d7 29 48 59 1a 35  |;.&H\?..O..)HY.5|
+00000260  ee b3 0d 5e 29 03 1d 34  95 0e 40 73 85 13 14 d0  |...^)..4..@s....|
+00000270  fb fb 96 77 21 fb d8 43  d7 e2 bf 2c 95 7b 75 5d  |...w!..C...,.{u]|
+00000280  59 15 81 71 d2 b6 82 96  d9 cc 78 02 42 01 d3 51  |Y..q......x.B..Q|
+00000290  af 25 d0 f8 a4 e2 e7 8e  7e 46 56 53 8f d1 09 f6  |.%......~FVS....|
+000002a0  76 88 5a 42 83 89 92 7b  c7 e4 40 9c 3d 05 ac 43  |v.ZB...{..@.=..C|
+000002b0  bf 6e 24 14 fe 36 f8 43  a6 90 8e a1 bd e2 92 84  |.n$..6.C........|
+000002c0  60 e3 92 34 1c 7b 53 d5  57 6d 23 32 12 a8 23 14  |`..4.{S.Wm#2..#.|
+000002d0  03 01 00 01 01 16 03 01  00 30 6f 06 c7 84 fa 7f  |.........0o.....|
+000002e0  c9 66 a9 6f 26 37 45 db  42 c8 8f 63 c3 5b 05 07  |.f.o&7E.B..c.[..|
+000002f0  ef 07 41 be 71 60 35 d3  16 8f 92 f6 89 cb c7 dc  |..A.q`5.........|
+00000300  4e 45 61 99 31 45 66 40  36 86                    |NEa.1Ef@6.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 0a 75 fa 5e 6e  |..........0.u.^n|
-00000010  50 48 e9 b1 67 e2 e1 04  c4 d9 27 63 7a a3 74 9e  |PH..g.....'cz.t.|
-00000020  0d 70 13 b9 1c b6 f5 e4  43 eb e1 20 86 08 d0 39  |.p......C.. ...9|
-00000030  91 5e 72 f7 9b 30 25 db  aa 8c 72                 |.^r..0%...r|
+00000000  14 03 01 00 01 01 16 03  01 00 30 d3 83 ac 08 7f  |..........0.....|
+00000010  a1 91 51 7c b7 99 6f 24  cd b1 cd 31 7b 12 20 47  |..Q|..o$...1{. G|
+00000020  66 08 22 f6 28 ea 81 fe  92 b5 c8 40 60 bc 5b 19  |f.".(......@`.[.|
+00000030  e0 2b d1 26 fd 4c 12 22  c5 13 9a                 |.+.&.L."...|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 9a f8 b3  97 b0 90 7e c7 2c 15 74  |.... ......~.,.t|
-00000010  03 c9 15 5d 95 fa 5c 37  ca 1e 8f 5a 3c af dc 9b  |...]..\7...Z<...|
-00000020  30 64 41 66 d0 17 03 01  00 20 1f 65 3e 77 1b 39  |0dAf..... .e>w.9|
-00000030  c4 b9 de 44 67 a2 1d 73  a8 83 bf dd 4f 50 ad d2  |...Dg..s....OP..|
-00000040  67 cf 45 9d 48 19 d8 67  fd 70 15 03 01 00 20 2d  |g.E.H..g.p.... -|
-00000050  6e d3 18 d1 55 6a 68 88  9d c0 3b a7 2e 93 fe e5  |n...Ujh...;.....|
-00000060  f9 6c b9 b4 3e 28 f0 9a  3f f0 67 4f 32 ab 6b     |.l..>(..?.gO2.k|
+00000000  17 03 01 00 20 79 06 89  7e e0 17 9a e3 dc 4c ee  |.... y..~.....L.|
+00000010  70 63 13 bc 27 f5 43 fa  f8 90 49 d9 89 43 7a 15  |pc..'.C...I..Cz.|
+00000020  d4 e2 a8 e6 3e 17 03 01  00 20 ea 84 0e 21 62 d5  |....>.... ...!b.|
+00000030  ee 26 5e fc 3e 0c 83 3b  91 01 c4 a7 8e 9b c4 1a  |.&^.>..;........|
+00000040  86 f8 a0 44 21 44 2f 31  cf a1 15 03 01 00 20 c6  |...D!D/1...... .|
+00000050  11 f1 65 ea f3 39 d1 d2  ac 95 1f 81 36 ae db b1  |..e..9......6...|
+00000060  88 a8 42 25 86 ec 1b c1  7e 12 60 a9 6b 7f 66     |..B%....~.`.k.f|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-Ed25519
new file mode 100644 (file)
index 0000000..a14cef1
--- /dev/null
@@ -0,0 +1,110 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
+00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
+00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
+00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
+000000a0  00 00 0d 00 1a 00 18 08  04 08 05 08 06 04 01 04  |................|
+000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 08 07 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+>>> Flow 2 (server to client)
+00000000  16 03 01 00 59 02 00 00  55 03 01 55 df 11 fe c6  |....Y...U..U....|
+00000010  aa d4 85 4b 87 c2 35 4c  ac a9 c3 15 a3 7f 6d 7e  |...K..5L......m~|
+00000020  15 d1 47 b2 d2 09 16 4d  08 1b dd 20 49 d9 51 42  |..G....M... I.QB|
+00000030  97 cf 36 b3 74 3e 05 0a  e5 c9 97 ef 01 9c 24 34  |..6.t>........$4|
+00000040  31 17 e1 8a 6a ce 37 60  02 47 46 7f c0 13 00 00  |1...j.7`.GF.....|
+00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
+00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
+00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
+00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
+00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
+000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
+000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
+000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
+000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
+000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
+000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
+00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
+00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
+00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
+00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
+00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
+00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
+00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
+00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
+00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
+00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
+000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
+000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
+000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
+000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
+000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
+000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
+00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
+00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
+00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
+00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
+00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
+00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
+00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
+00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
+00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
+00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
+000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
+000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 17 27 58 d2 5f 59 a3  |........ .'X._Y.|
+000002d0  62 62 d4 97 4a 49 c4 ff  ec dc f7 d3 c9 ea f3 00  |bb..JI..........|
+000002e0  61 1b d3 73 38 9e af 7d  17 00 80 59 7a 4e 55 97  |a..s8..}...YzNU.|
+000002f0  5a 81 0e 2e 85 0b c2 61  f0 79 72 0e d1 d5 3b bf  |Z......a.yr...;.|
+00000300  6a 77 03 0a 9a 51 42 f5  98 2f 09 d5 7b 17 76 b8  |jw...QB../..{.v.|
+00000310  2c a7 95 ee 61 65 d7 37  b3 1b 16 3c 48 7e 9d ed  |,...ae.7...<H~..|
+00000320  87 25 b0 77 d9 93 44 28  9f 2a f1 2f 35 23 0d e5  |.%.w..D(.*./5#..|
+00000330  7b 08 e0 b0 42 9b d5 0d  e7 ca 73 49 b0 09 03 e2  |{...B.....sI....|
+00000340  bf 25 92 be bf d5 ac 84  38 1e a4 39 66 3b 18 71  |.%......8..9f;.q|
+00000350  31 df 4b 42 9b bf 38 c1  72 81 5c d6 4c 67 b1 58  |1.KB..8.r.\.Lg.X|
+00000360  24 84 71 73 0b 5d 21 9d  e2 e6 89 16 03 01 00 0a  |$.qs.]!.........|
+00000370  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
+00000380  00 00 00                                          |...|
+>>> Flow 3 (client to server)
+00000000  16 03 01 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
+00000010  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 17 d1 81  |...0............|
+00000020  93 be 2a 8c 21 20 10 25  15 e8 34 23 4f 30 05 06  |..*.! .%..4#O0..|
+00000030  03 2b 65 70 30 12 31 10  30 0e 06 03 55 04 0a 13  |.+ep0.1.0...U...|
+00000040  07 41 63 6d 65 20 43 6f  30 1e 17 0d 31 39 30 35  |.Acme Co0...1905|
+00000050  31 36 32 31 35 34 32 36  5a 17 0d 32 30 30 35 31  |16215426Z..20051|
+00000060  35 32 31 35 34 32 36 5a  30 12 31 10 30 0e 06 03  |5215426Z0.1.0...|
+00000070  55 04 0a 13 07 41 63 6d  65 20 43 6f 30 2a 30 05  |U....Acme Co0*0.|
+00000080  06 03 2b 65 70 03 21 00  0b e0 b5 60 b5 e2 79 30  |..+ep.!....`..y0|
+00000090  3d be e3 1e e0 50 b1 04  c8 6d c7 78 6c 69 2f c5  |=....P...m.xli/.|
+000000a0  14 ad 9a 63 6f 79 12 91  a3 4d 30 4b 30 0e 06 03  |...coy...M0K0...|
+000000b0  55 1d 0f 01 01 ff 04 04  03 02 05 a0 30 13 06 03  |U...........0...|
+000000c0  55 1d 25 04 0c 30 0a 06  08 2b 06 01 05 05 07 03  |U.%..0...+......|
+000000d0  02 30 0c 06 03 55 1d 13  01 01 ff 04 02 30 00 30  |.0...U.......0.0|
+000000e0  16 06 03 55 1d 11 04 0f  30 0d 82 0b 65 78 61 6d  |...U....0...exam|
+000000f0  70 6c 65 2e 63 6f 6d 30  05 06 03 2b 65 70 03 41  |ple.com0...+ep.A|
+00000100  00 fc 19 17 2a 94 a5 31  fa 29 c8 2e 7f 5b a0 5d  |....*..1.)...[.]|
+00000110  8a 4e 34 40 39 d6 b3 10  dc 19 fe a0 22 71 b3 f5  |.N4@9......."q..|
+00000120  8f a1 58 0d cd f4 f1 85  24 bf e6 3d 14 df df ed  |..X.....$..=....|
+00000130  0e e1 17 d8 11 a2 60 d0  8a 37 23 2a c2 46 aa 3a  |......`..7#*.F.:|
+00000140  08 16 03 01 00 25 10 00  00 21 20 2f e5 7d a3 47  |.....%...! /.}.G|
+00000150  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+00000160  c4 cf c2 ed 90 99 5f 58  cb 3b 74 16 03 01 00 46  |......_X.;t....F|
+00000170  0f 00 00 42 00 40 14 6a  d7 c1 9c 3d 81 fa e9 da  |...B.@.j...=....|
+00000180  96 5c 3a 09 e2 fc 36 e2  30 39 e4 6e 0d ac aa 54  |.\:...6.09.n...T|
+00000190  24 4d 8c f0 35 14 b0 0b  e9 5b 57 52 31 02 9f 6c  |$M..5....[WR1..l|
+000001a0  6f 6c d7 e9 b5 7f cb 30  fe b9 ba b9 7a 46 67 e3  |ol.....0....zFg.|
+000001b0  a7 50 ca ce e4 04 14 03  01 00 01 01 16 03 01 00  |.P..............|
+000001c0  30 8d 0a ca d1 5e 2c 7e  92 d0 69 f4 d9 e8 5d 0a  |0....^,~..i...].|
+000001d0  11 72 67 20 3e 80 64 29  e5 79 f5 33 ad 06 78 07  |.rg >.d).y.3..x.|
+000001e0  4c 03 fc 2e 16 35 70 b1  72 e7 35 a9 cc 49 b8 29  |L....5p.r.5..I.)|
+000001f0  30                                                |0|
+>>> Flow 4 (server to client)
+00000000  15 03 01 00 02 02 50                              |......P|
index 14ed93ca096abf08fc3d930c6639dc261fc0740a..641ab1bd156109914a49dee46d5c2f761bdf2c82 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 04 4a 64 8e 4f  |....Y...U...Jd.O|
-00000010  f1 4e 06 19 e2 cb b8 92  93 7b f5 ec 1b 0e 30 8e  |.N.......{....0.|
-00000020  1f 89 6c a1 28 e7 87 7f  9e 9e 19 20 cf aa b7 1f  |..l.(...... ....|
-00000030  77 43 26 3e 15 5e 67 68  0d a6 a3 b1 25 e5 63 27  |wC&>.^gh....%.c'|
-00000040  00 f9 59 23 e0 a3 1c d7  49 e9 dc b3 c0 09 00 00  |..Y#....I.......|
+00000000  16 03 01 00 59 02 00 00  55 03 01 3b 4c b9 76 d2  |....Y...U..;L.v.|
+00000010  c3 d1 ea 81 71 1a 10 e1  b1 69 5c 54 c2 df 17 0a  |....q....i\T....|
+00000020  de 41 cb d1 69 c3 9a da  90 fd 25 20 1e 02 11 16  |.A..i.....% ....|
+00000030  ab 66 13 56 3d 94 00 a9  80 7c d8 57 12 99 1c 5f  |.f.V=....|.W..._|
+00000040  7a b2 02 8c 23 f3 76 b8  59 5e 16 dd c0 09 00 00  |z...#.v.Y^......|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 b4 0c 00  00 b0 03 00 1d 20 6c 3b  |*............ l;|
-00000280  3f 6b 18 21 57 c4 df bf  3d ac 92 ee bc 99 0b 2f  |?k.!W...=....../|
-00000290  d5 b3 f5 ff 5f 6c 6b 33  db a9 7c 02 f8 4c 00 8a  |...._lk3..|..L..|
-000002a0  30 81 87 02 42 00 8e 15  e5 bb dc f5 3d c6 10 d7  |0...B.......=...|
-000002b0  67 54 3d 80 b5 6a 4d 69  f1 2c fe 99 bc 32 e1 ab  |gT=..jMi.,...2..|
-000002c0  42 c0 7d f2 5d e0 d6 22  95 58 25 5e 63 ba f0 9c  |B.}.]..".X%^c...|
-000002d0  9f 29 91 c9 a9 42 99 ab  b0 4f ed a9 42 8e 1f 3a  |.)...B...O..B..:|
-000002e0  44 34 48 d9 5a dd 9b 02  41 44 21 e1 54 b5 a3 e7  |D4H.Z...AD!.T...|
-000002f0  0a 57 45 52 ae 9d b5 fe  45 8a 3f 8b e7 50 e8 01  |.WER....E.?..P..|
-00000300  8c 26 27 85 f4 ef 80 30  7e d6 d8 27 4f d5 5e 9d  |.&'....0~..'O.^.|
-00000310  7b 65 1a c6 5a ab 57 17  3f 6e 5c 66 aa cd 46 bc  |{e..Z.W.?n\f..F.|
-00000320  5d 32 db a5 48 f8 f8 35  11 8b 16 03 01 00 0a 0d  |]2..H..5........|
-00000330  00 00 06 03 01 02 40 00  00 16 03 01 00 04 0e 00  |......@.........|
-00000340  00 00                                             |..|
+00000270  2a 16 03 01 00 b5 0c 00  00 b1 03 00 1d 20 16 64  |*............ .d|
+00000280  ca 24 70 6f 61 2f 9e 2d  43 0a 73 ac 67 f0 7a e5  |.$poa/.-C.s.g.z.|
+00000290  c7 4e c4 1f ad 13 0d eb  df ff 0d ff a3 27 00 8b  |.N...........'..|
+000002a0  30 81 88 02 42 01 1a 33  8b 88 78 ed 5c c1 56 0d  |0...B..3..x.\.V.|
+000002b0  75 51 69 a0 e7 45 6d ae  b0 67 55 3f be 23 3e 92  |uQi..Em..gU?.#>.|
+000002c0  fe 26 68 a2 30 84 2f b3  33 66 f6 dd 71 67 99 5e  |.&h.0./.3f..qg.^|
+000002d0  1c 6f bf 87 ed 33 a0 87  69 f6 35 65 8d cb 3a 7e  |.o...3..i.5e..:~|
+000002e0  95 a7 a4 40 54 cb 97 02  42 00 a3 fe 50 34 68 9f  |...@T...B...P4h.|
+000002f0  f2 43 98 23 e4 24 ad 36  e9 d3 e0 75 2c 11 46 6c  |.C.#.$.6...u,.Fl|
+00000300  48 33 c5 bc 2d 04 ff cc  bb ec 38 ec f4 b3 55 31  |H3..-.....8...U1|
+00000310  8a 6e 38 a5 6d a0 9c fc  f6 98 75 48 c6 79 53 de  |.n8.m.....uH.yS.|
+00000320  dd 91 49 f0 b6 32 83 45  61 89 4e 16 03 01 00 0a  |..I..2.Ea.N.....|
+00000330  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
+00000340  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000000  16 03 01 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
 00000200  e5 35 16 03 01 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 01 00  |......._X.;t....|
-00000230  86 0f 00 00 82 00 80 9a  02 82 fb dd 68 e7 91 9f  |............h...|
-00000240  83 12 57 35 23 7c de 88  97 07 a3 b2 67 77 0f c1  |..W5#|......gw..|
-00000250  bd 33 36 b3 ce fb f7 96  26 91 ab dc 96 26 64 fa  |.36.....&....&d.|
-00000260  34 66 31 2b fa 6d 52 60  3e fb a3 87 27 a7 7c ac  |4f1+.mR`>...'.|.|
-00000270  8c 87 ff c5 5e 6f 6f e1  db bf bc 58 3d b3 f6 89  |....^oo....X=...|
-00000280  a0 8e 0b 9d 26 74 68 57  ca e9 c2 ab 79 7b 6a dd  |....&thW....y{j.|
-00000290  c7 89 ef 0d 62 aa 47 7b  67 18 f2 ad 00 98 56 45  |....b.G{g.....VE|
-000002a0  12 ca de 6a d1 1a b5 a9  d2 53 ba 3b 90 a6 cf 69  |...j.....S.;...i|
-000002b0  12 65 32 c2 95 46 01 14  03 01 00 01 01 16 03 01  |.e2..F..........|
-000002c0  00 30 f7 2d b9 19 66 b2  2c 1b 96 08 bc 70 5b f5  |.0.-..f.,....p[.|
-000002d0  6d 58 9e 51 fb b5 3c a6  4f 4a fc 52 1f 10 20 c4  |mX.Q..<.OJ.R.. .|
-000002e0  3f d6 3c 0e 99 e3 1c b5  21 7f 0d fa 08 ec 17 27  |?.<.....!......'|
-000002f0  75 9f                                             |u.|
+00000230  86 0f 00 00 82 00 80 90  68 a8 2f 6f 2b 70 e4 25  |........h./o+p.%|
+00000240  7d fb b7 85 db 44 ec 1a  ad 6d 84 fb 95 21 fa 24  |}....D...m...!.$|
+00000250  7b 31 6a 97 4f 06 ee 87  22 c3 7c 81 70 ed e3 2a  |{1j.O...".|.p..*|
+00000260  d5 2c d1 4e 6d f0 12 52  2f 98 05 08 af 41 fa 87  |.,.Nm..R/....A..|
+00000270  d1 62 98 6c 06 47 ec 7a  44 e0 7d ae 7a 7d ef 1b  |.b.l.G.zD.}.z}..|
+00000280  d5 2c fa 1b 70 a3 fb 9a  5d 8c 60 b4 44 6a e5 b8  |.,..p...].`.Dj..|
+00000290  80 4c 29 fc f1 2d f1 11  46 81 c4 01 e4 11 2e 05  |.L)..-..F.......|
+000002a0  cb 2b ca d9 4a 14 39 06  93 77 19 db 80 03 82 38  |.+..J.9..w.....8|
+000002b0  e5 c1 0f 11 17 47 a7 14  03 01 00 01 01 16 03 01  |.....G..........|
+000002c0  00 30 a6 68 28 50 75 6d  eb f4 32 c8 a3 57 3f b1  |.0.h(Pum..2..W?.|
+000002d0  37 84 8e 7e 1d 1d 93 7d  9f ec ff ac 1c 8d bf 30  |7..~...}.......0|
+000002e0  d2 b0 0f 3f 02 c3 ef ac  a3 62 94 26 1c 8f 7e 8d  |...?.....b.&..~.|
+000002f0  74 99                                             |t.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 db ac b4 71 dc  |..........0...q.|
-00000010  92 06 9c fe 87 11 69 eb  a6 4e e9 50 29 6d 06 37  |......i..N.P)m.7|
-00000020  02 73 b8 6d 7e ca 89 02  cf fa ad 0c 7c d0 90 cb  |.s.m~.......|...|
-00000030  af e5 50 68 fc 76 c5 09  a1 a1 d3                 |..Ph.v.....|
+00000000  14 03 01 00 01 01 16 03  01 00 30 80 3e 0d 50 13  |..........0.>.P.|
+00000010  5f 00 ba 2e 47 46 5d 63  1b 72 a8 02 24 1c 3e 1f  |_...GF]c.r..$.>.|
+00000020  ed e2 3a 45 d7 7d 3a f2  33 97 c3 ab 13 9b 0e 4a  |..:E.}:.3......J|
+00000030  04 f0 08 48 ab d3 46 0b  40 7d 5c                 |...H..F.@}\|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 cd b3 a4  99 da 5d 59 36 6f f8 26  |.... .....]Y6o.&|
-00000010  2d b2 4a 47 a1 54 7f b0  b3 df 0d 52 cc 13 7a 8b  |-.JG.T.....R..z.|
-00000020  a3 6a 8b 1f ee 17 03 01  00 20 d6 ab 8a 3e b3 41  |.j....... ...>.A|
-00000030  0a be 61 50 79 19 1a 45  03 c6 b9 b4 84 b2 18 46  |..aPy..E.......F|
-00000040  86 1f c3 b7 78 77 fc 7f  4f 30 15 03 01 00 20 2d  |....xw..O0.... -|
-00000050  c0 f2 71 06 dc 19 9d 88  82 b9 3a 6b be a4 77 98  |..q.......:k..w.|
-00000060  87 32 46 54 27 e4 17 47  8a 83 9c 5a 45 6e 6b     |.2FT'..G...ZEnk|
+00000000  17 03 01 00 20 f7 32 e7  36 4f 77 2f 4a 05 fd 27  |.... .2.6Ow/J..'|
+00000010  19 57 52 f7 8a 0c 7f fb  14 78 b2 06 bf ca 86 73  |.WR......x.....s|
+00000020  32 13 33 04 91 17 03 01  00 20 7e e4 fe c5 6d f7  |2.3...... ~...m.|
+00000030  d4 69 30 57 89 a0 76 70  40 a7 b5 17 74 2f 5d 16  |.i0W..vp@...t/].|
+00000040  c1 19 30 73 f8 37 c4 10  5b b7 15 03 01 00 20 08  |..0s.7..[..... .|
+00000050  41 5e 0b 9f 36 23 bd 9a  09 f7 58 9d a3 d7 26 3a  |A^..6#....X...&:|
+00000060  f4 5e 6b bf 9c d4 6f 0c  d3 9e cd de cb 95 57     |.^k...o.......W|
index c5b33c01fe54faffa091c3a11fca6a713e1962dd..c46a9670e845b3c02cc133d98e347ca19d5bb9b9 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 6b 8a f7 68 78  |....Y...U..k..hx|
-00000010  f1 ea ad 9b 20 40 42 52  eb fa 55 fb 37 a7 21 22  |.... @BR..U.7.!"|
-00000020  71 0d f7 4d 46 bf 38 df  6e 00 e0 20 17 73 28 32  |q..MF.8.n.. .s(2|
-00000030  30 3f f4 01 df 70 98 ce  33 d0 c3 8c 0a fd 0a ba  |0?...p..3.......|
-00000040  6b 56 d7 f9 16 a2 24 0d  07 b1 32 47 c0 13 00 00  |kV....$...2G....|
+00000000  16 03 01 00 59 02 00 00  55 03 01 97 fe 7f 92 37  |....Y...U......7|
+00000010  67 99 e0 d8 62 a9 31 80  bd 1f 31 8e 7d 0b 08 0a  |g...b.1...1.}...|
+00000020  de a5 82 a2 f2 d0 c1 35  66 34 6e 20 39 46 b1 b0  |.......5f4n 9F..|
+00000030  6e 2d 0e fe 8c 48 ea ab  1c c4 49 ee f4 21 cf cb  |n-...H....I..!..|
+00000040  2a 20 57 78 18 99 a1 b9  7f 88 4f 64 c0 13 00 00  |* Wx......Od....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 b1 de e2 91 3f 1f be  |........ ....?..|
-000002d0  0e 21 49 44 db d1 d3 a7  89 db 61 56 97 bf 4c 73  |.!ID......aV..Ls|
-000002e0  7b d3 da 81 a5 cc 0a e3  13 00 80 66 fd 15 8d 8a  |{..........f....|
-000002f0  a2 f9 8d b9 d9 cb a5 6b  45 7c 11 05 24 6d de e5  |.......kE|..$m..|
-00000300  8f 3e 42 ba 3e bd 5a b8  f7 51 c0 b9 55 06 db d7  |.>B.>.Z..Q..U...|
-00000310  2d 78 d2 5d 47 2d 52 c9  7b 59 20 73 1a 1d 26 c4  |-x.]G-R.{Y s..&.|
-00000320  84 3d 5b 57 5f 1a fd 52  8c 40 87 be 58 58 73 d2  |.=[W_..R.@..XXs.|
-00000330  4b 84 9a 6c 96 c0 36 82  95 13 f9 12 74 c3 3b dd  |K..l..6.....t.;.|
-00000340  27 11 c3 66 fa de 28 b4  c0 d9 6e 65 e0 8a 5e b6  |'..f..(...ne..^.|
-00000350  3a a8 52 db 62 89 2b 1d  d0 be fb b7 6e 03 bd f7  |:.R.b.+.....n...|
-00000360  e3 a5 df c2 b3 5a 16 09  d8 1e df 16 03 01 00 0a  |.....Z..........|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 07 80 79 40 4b b1 0e  |........ ..y@K..|
+000002d0  05 ce e4 ca 9d f5 d7 ad  a6 98 f2 40 f9 b9 66 a8  |...........@..f.|
+000002e0  04 6e ae b5 da 99 67 09  69 00 80 01 4a f2 c1 c9  |.n....g.i...J...|
+000002f0  2f 46 4f b8 9e 8b 2c c4  a1 32 44 3c dc 2c 5e b9  |/FO...,..2D<.,^.|
+00000300  76 5f 41 20 23 1b 82 dd  ec 37 b4 24 68 6d a7 39  |v_A #....7.$hm.9|
+00000310  4f f2 e5 97 09 75 64 2a  64 16 b8 99 04 8a 74 77  |O....ud*d.....tw|
+00000320  19 bb 12 5f 27 f6 41 09  f7 2e 1c 33 80 3b 01 57  |..._'.A....3.;.W|
+00000330  5c f9 20 6e 0c 48 76 59  e1 8b 1f bb 2a 33 1a 28  |\. n.HvY....*3.(|
+00000340  a0 5a 05 44 94 eb 35 62  5e ae 7f e4 01 76 b6 b4  |.Z.D..5b^....v..|
+00000350  64 91 bf 25 09 ff 88 8a  af 73 00 d0 7e ea 0f ca  |d..%.....s..~...|
+00000360  4a 2b d4 6f 02 26 98 28  5a ed 11 16 03 01 00 0a  |J+.o.&.(Z.......|
 00000370  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
 00000380  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000200  e5 35 16 03 01 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 01 00  |......._X.;t....|
-00000230  86 0f 00 00 82 00 80 9c  f0 ab 90 83 2a 47 ba 5c  |............*G.\|
-00000240  37 a4 19 b8 62 b1 01 74  35 4d 1a 62 5e 3f 0b 54  |7...b..t5M.b^?.T|
-00000250  5a 6f b7 b5 99 4b b4 84  68 90 46 2b 95 e6 10 77  |Zo...K..h.F+...w|
-00000260  bf 68 81 b1 96 11 5c e9  93 a4 d5 78 42 c0 c4 92  |.h....\....xB...|
-00000270  cf 4e ce 25 e7 da 7d d9  2c 4d ab 71 2d b5 a7 1c  |.N.%..}.,M.q-...|
-00000280  5f b5 a3 32 f6 3e 38 79  17 36 45 94 8a e3 f8 1e  |_..2.>8y.6E.....|
-00000290  9e 95 23 48 0f f6 aa 1b  00 d2 45 85 c7 95 b2 d1  |..#H......E.....|
-000002a0  c1 81 e8 31 34 45 bd 28  32 26 a8 d1 23 90 cb 40  |...14E.(2&..#..@|
-000002b0  1c ed db eb c3 ec b6 14  03 01 00 01 01 16 03 01  |................|
-000002c0  00 30 16 97 3e a2 2a 11  d5 3f 29 f6 5b b8 7a d5  |.0..>.*..?).[.z.|
-000002d0  83 24 51 f0 0c c3 79 18  9c 58 b6 f4 2f 70 9f c0  |.$Q...y..X../p..|
-000002e0  52 be a0 f0 eb d7 0e de  42 36 14 39 84 fc 84 ed  |R.......B6.9....|
-000002f0  77 0c                                             |w.|
+00000230  86 0f 00 00 82 00 80 81  aa 68 1f a9 a4 de f1 4d  |.........h.....M|
+00000240  30 9a fe e6 a5 f6 f6 18  b6 3e d2 c7 f1 e6 77 e3  |0........>....w.|
+00000250  6a cd 61 01 81 3a 02 31  a5 aa d6 db b6 02 9d 4b  |j.a..:.1.......K|
+00000260  f5 78 50 c3 95 fe 43 88  33 3a 95 32 bc e8 02 1a  |.xP...C.3:.2....|
+00000270  e6 f4 d5 54 b9 fc e0 4a  4e f0 92 21 35 4b de c8  |...T...JN..!5K..|
+00000280  a4 b0 01 c3 ca 3a 87 ed  cb 21 1c ce c2 14 7b 8d  |.....:...!....{.|
+00000290  90 68 b9 21 49 13 dd cd  e7 68 83 41 7c 84 6a 75  |.h.!I....h.A|.ju|
+000002a0  76 ee 19 8b fa d5 a6 57  3d a7 f1 f1 6f 11 ca 77  |v......W=...o..w|
+000002b0  95 0e b5 c7 3d 99 d4 14  03 01 00 01 01 16 03 01  |....=...........|
+000002c0  00 30 5e be 40 82 f8 db  05 20 23 45 a4 42 48 e8  |.0^.@.... #E.BH.|
+000002d0  06 69 eb 4c ef 79 53 52  4a 5a 3a ba cc d6 99 59  |.i.L.ySRJZ:....Y|
+000002e0  4d c2 b0 34 0f 14 68 03  93 8b a4 95 7e cf 26 f8  |M..4..h.....~.&.|
+000002f0  5c 8a                                             |\.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 8a 97 aa 38 29  |..........0...8)|
-00000010  a4 7a 25 ae d5 5f 66 17  cb 8e de d3 ac 0f b3 9d  |.z%.._f.........|
-00000020  ba 61 54 31 cb c8 fc 1f  4c f5 76 b0 7e 7e 74 04  |.aT1....L.v.~~t.|
-00000030  8a 2e 45 a8 5f c7 43 d7  d5 f4 7d                 |..E._.C...}|
+00000000  14 03 01 00 01 01 16 03  01 00 30 ef 9b 5c da 0a  |..........0..\..|
+00000010  2e c4 79 fa ea 8a 9c 78  4a 1f 08 77 56 73 6e fa  |..y....xJ..wVsn.|
+00000020  3a 5b 3c cd cd e9 0c a8  bb 59 9e 22 ab 67 2c 03  |:[<......Y.".g,.|
+00000030  de ad 7c e4 cb 85 d7 8f  c1 1c e3                 |..|........|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 22 4d 00  3f 2a 41 f0 53 06 93 fe  |.... "M.?*A.S...|
-00000010  aa 79 9b 69 bb d5 9b e5  e4 3b 48 ff e5 ce 7d db  |.y.i.....;H...}.|
-00000020  d8 e8 e6 e1 04 17 03 01  00 20 e8 01 13 cb f1 1f  |......... ......|
-00000030  17 68 33 6a ad 74 ae a7  c5 d9 00 ea 0b dc bb 9c  |.h3j.t..........|
-00000040  5c 5f 49 01 1e 53 74 30  58 e6 15 03 01 00 20 bb  |\_I..St0X..... .|
-00000050  30 7d c2 43 c3 0d b9 b5  3a 70 14 2c 4a 64 c9 fe  |0}.C....:p.,Jd..|
-00000060  20 25 a7 0a 01 11 3c 62  ca d6 28 80 ed cd 73     | %....<b..(...s|
+00000000  17 03 01 00 20 48 1a 1a  1c 6c 7d 6c 2a e0 b2 e3  |.... H...l}l*...|
+00000010  b3 9f ec 39 a8 cd 9a f9  a2 3e 2d 46 3b cf 17 ed  |...9.....>-F;...|
+00000020  70 99 ce d7 3c 17 03 01  00 20 69 27 e9 89 78 e6  |p...<.... i'..x.|
+00000030  64 c0 a9 40 4f 0d 97 53  b2 2e 15 f3 2b 54 3b 77  |d..@O..S....+T;w|
+00000040  f2 24 2c 94 dc b3 8b f0  c4 ce 15 03 01 00 20 1b  |.$,........... .|
+00000050  50 55 83 d8 6b b4 04 b2  f0 2d 1c 9c 0d fa de 58  |PU..k....-.....X|
+00000060  cd 0a 1d 55 d6 36 f4 a4  fb cc 55 c5 b1 f3 d3     |...U.6....U....|
index 248ab45deff76b636e8d51f4554f3039e46b91b9..7d6683c026ab433a6b59c976f9833eb4582fc011 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 ec 11 a0 ef 24  |....Y...U......$|
-00000010  30 9c 83 8c 12 7c 61 a8  39 bd 40 41 22 5c 58 7f  |0....|a.9.@A"\X.|
-00000020  ca 0c b2 41 66 dc 87 2d  f1 4c cc 20 f6 53 42 ce  |...Af..-.L. .SB.|
-00000030  56 81 58 c1 70 30 37 55  64 f1 28 e4 63 50 e0 f4  |V.X.p07Ud.(.cP..|
-00000040  af 7d 01 af 5e 1a 50 19  64 e6 c2 76 c0 09 00 00  |.}..^.P.d..v....|
+00000000  16 03 01 00 59 02 00 00  55 03 01 a7 ea 63 8c 7d  |....Y...U....c.}|
+00000010  54 70 04 d5 5e a2 2e 8b  75 4f 17 c8 a8 8c 3d bc  |Tp..^...uO....=.|
+00000020  08 aa 82 48 85 ed 1a ff  42 e1 54 20 3b 77 9d 32  |...H....B.T ;w.2|
+00000030  4d 60 f2 81 f8 20 aa d2  b0 eb ea 7c 6a 39 52 20  |M`... .....|j9R |
+00000040  94 4a 2a 88 05 8a fe 6c  50 5c 95 39 c0 09 00 00  |.J*....lP\.9....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 b4 0c 00  00 b0 03 00 1d 20 cc 73  |*............ .s|
-00000280  bf 89 65 cc cf f2 dc ed  df d3 25 9b b2 16 f8 df  |..e.......%.....|
-00000290  97 56 f6 29 4e 08 17 19  f0 5a 2f 9d e3 57 00 8a  |.V.)N....Z/..W..|
-000002a0  30 81 87 02 42 01 91 4e  d1 9a 13 69 44 6c 79 01  |0...B..N...iDly.|
-000002b0  99 bb ac 65 c7 bd 0c c3  d1 4c ed 54 e3 7b ff ef  |...e.....L.T.{..|
-000002c0  c3 c2 44 ee ec 3b 8d b4  22 98 31 89 07 a7 b7 c9  |..D..;..".1.....|
-000002d0  dc 6f 0c e0 78 a9 79 fc  74 20 0b 55 48 16 d7 d6  |.o..x.y.t .UH...|
-000002e0  c8 c8 f8 81 67 e2 50 02  41 61 43 bd 1f e1 68 f1  |....g.P.AaC...h.|
-000002f0  7c e1 bf 10 3f 58 16 74  5c 98 ee 4c 18 17 bf f0  ||...?X.t\..L....|
-00000300  64 d9 9e be c6 d7 73 e8  20 89 b6 4e fa 93 7d 82  |d.....s. ..N..}.|
-00000310  7c 78 96 d1 d9 d1 81 1b  66 5f 87 7b a1 20 40 3c  ||x......f_.{. @<|
-00000320  13 49 e1 73 8e e9 52 e4  f0 46 16 03 01 00 04 0e  |.I.s..R..F......|
-00000330  00 00 00                                          |...|
+00000270  2a 16 03 01 00 b5 0c 00  00 b1 03 00 1d 20 3a 1f  |*............ :.|
+00000280  18 e9 f2 09 3e 79 4b a0  62 73 ef 87 0d ea 90 51  |....>yK.bs.....Q|
+00000290  7f 9d d2 79 59 e4 11 7f  69 f7 a9 d7 78 7f 00 8b  |...yY...i...x...|
+000002a0  30 81 88 02 42 01 65 ac  eb e6 b0 86 73 95 a4 27  |0...B.e.....s..'|
+000002b0  e3 82 55 cf 88 16 80 c2  68 4b 39 77 2a b1 a9 d3  |..U.....hK9w*...|
+000002c0  08 d5 ac 77 ce 5b 16 73  2c ad b5 57 2a 7a 75 34  |...w.[.s,..W*zu4|
+000002d0  ec 99 23 bd df b2 27 36  5a 4b 40 e0 d3 b0 d2 31  |..#...'6ZK@....1|
+000002e0  9b c7 9e 0a cb 5b 69 02  42 00 88 d7 5a 6a 9e 4c  |.....[i.B...Zj.L|
+000002f0  c5 7b 2c 8e 93 3b 75 27  b4 00 11 88 ba cf 99 8c  |.{,..;u'........|
+00000300  e5 f2 60 22 de f2 fe 86  a6 48 86 9c 40 31 08 75  |..`".....H..@1.u|
+00000310  aa bc 5d 6d fa 2e a4 a9  a1 0d fc e1 d9 5a a1 60  |..]m.........Z.`|
+00000320  93 b9 69 c7 c2 3e f5 a9  cb 31 41 16 03 01 00 04  |..i..>...1A.....|
+00000330  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 c6 44 20  88 b8 3b e4 a9 67 ca 54  |....0.D ..;..g.T|
-00000040  f6 98 79 0e c5 8d d4 da  71 ce 40 51 59 e9 3f ee  |..y.....q.@QY.?.|
-00000050  a0 bb 7d 8a 84 4d 0a be  37 37 a8 cc fe bb 5d b6  |..}..M..77....].|
-00000060  37 1b a8 a0 04                                    |7....|
+00000030  16 03 01 00 30 30 25 15  82 a1 7f 11 32 13 52 17  |....00%.....2.R.|
+00000040  b8 bd 5b b9 1e 69 88 0b  b3 5f 12 40 e3 4b 03 cb  |..[..i..._.@.K..|
+00000050  cd 07 3c 43 4f ab f7 5d  2c 6a a3 02 a9 64 d0 77  |..<CO..],j...d.w|
+00000060  27 dc 4a ae 8a                                    |'.J..|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 d3 c0 74 ba 22  |..........0..t."|
-00000010  e5 c6 8d c6 82 ac f4 63  90 28 73 a4 7a c3 43 ca  |.......c.(s.z.C.|
-00000020  0d 09 5a 84 70 d6 64 de  4b 06 9b fc b9 a9 3f d8  |..Z.p.d.K.....?.|
-00000030  a0 02 67 2b 63 1e 61 91  b7 f9 a2                 |..g+c.a....|
+00000000  14 03 01 00 01 01 16 03  01 00 30 b5 3e 18 97 a1  |..........0.>...|
+00000010  ca 2e 7f 5f b9 72 cb aa  d4 f6 85 86 d3 27 40 13  |..._.r.......'@.|
+00000020  e3 99 35 13 67 a8 9e 6e  bb 63 15 97 96 42 e4 b3  |..5.g..n.c...B..|
+00000030  fc 15 ee b7 d8 cb a2 64  3d 55 b8                 |.......d=U.|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 b2 55 db  d3 41 5d 5c 9b b5 b8 c8  |.... .U..A]\....|
-00000010  fd ab 30 74 08 59 22 e3  8c e0 43 d0 63 14 33 f8  |..0t.Y"...C.c.3.|
-00000020  00 b6 3d 1e a0 17 03 01  00 20 fa 14 95 a5 e3 a0  |..=...... ......|
-00000030  09 04 e1 49 35 c5 ef c1  b4 c5 7d b5 6a c7 13 db  |...I5.....}.j...|
-00000040  88 2f 4c 65 f8 c4 d5 2a  a5 3a 15 03 01 00 20 05  |./Le...*.:.... .|
-00000050  21 da 3d 87 62 0c a7 e6  eb aa f6 bd 2f 77 fd a4  |!.=.b......./w..|
-00000060  cd 2a ac 22 73 7c 75 60  59 db 0f 8f df 86 73     |.*."s|u`Y.....s|
+00000000  17 03 01 00 20 12 6c bf  f2 39 2d e6 ad a8 38 d5  |.... .l..9-...8.|
+00000010  1c ea 5b 79 e5 c7 4a 41  eb 58 70 f0 7d f7 60 e7  |..[y..JA.Xp.}.`.|
+00000020  ee 77 98 75 f2 17 03 01  00 20 ac 5e 6d b0 81 0b  |.w.u..... .^m...|
+00000030  14 ca c2 70 53 d8 6d 55  49 63 da 8a 61 66 80 2d  |...pS.mUIc..af.-|
+00000040  e4 7c 2e 60 1f eb 3c f2  27 66 15 03 01 00 20 7a  |.|.`..<.'f.... z|
+00000050  2b 80 f8 00 0f 06 f5 6e  fe b7 b7 6b 12 6c 8d 8e  |+......n...k.l..|
+00000060  c4 11 23 2b a2 bb 16 93  b4 e0 e0 fd 8c 42 db     |..#+.........B.|
index ccc71f606a1840ef2f6ee1523bb946e9201081a7..c0e842d155cb906736eae388a0e45bf935f90a29 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 29 ae 9f 95 df  |....Y...U..)....|
-00000010  c0 c9 77 0a cc 61 5e f2  7b bb 50 28 95 30 cd 6f  |..w..a^.{.P(.0.o|
-00000020  7f 23 ca 62 ee 35 20 31  85 6b 77 20 16 82 4f 3a  |.#.b.5 1.kw ..O:|
-00000030  13 67 6e cc 71 5c f8 7a  4a b2 1f 02 a6 1a a4 2b  |.gn.q\.zJ......+|
-00000040  32 cd 5a 81 4b 82 a2 e3  7e 67 fa e7 c0 13 00 00  |2.Z.K...~g......|
+00000000  16 03 01 00 59 02 00 00  55 03 01 16 f4 24 01 94  |....Y...U....$..|
+00000010  68 d2 0f 15 4d d6 65 54  84 73 ab 2c b2 11 c5 64  |h...M.eT.s.,...d|
+00000020  d8 93 66 50 cd b0 f0 ab  11 5c 72 20 b1 13 c1 f5  |..fP.....\r ....|
+00000030  63 ed 70 0b 21 52 85 36  84 99 1d b6 bb dc d3 1c  |c.p.!R.6........|
+00000040  b3 76 13 d9 ef 47 c4 c0  18 57 23 3b c0 13 00 00  |.v...G...W#;....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 89 38 c8 65 ea 1e 0f  |........ .8.e...|
-000002d0  6d 85 41 9e c4 f2 51 fd  0f f5 18 7d 60 1b c1 79  |m.A...Q....}`..y|
-000002e0  55 dc eb 35 8b 0b 64 9c  1e 00 80 d0 9c 8a 95 1b  |U..5..d.........|
-000002f0  0b 44 37 fc b7 53 98 05  23 e4 83 40 38 f5 1b 68  |.D7..S..#..@8..h|
-00000300  dd 4b eb 46 cf 26 7b 0b  37 89 b2 fd 13 2d 5d cd  |.K.F.&{.7....-].|
-00000310  c5 16 8f e5 ff c6 51 45  77 c5 59 02 71 2e d6 51  |......QEw.Y.q..Q|
-00000320  2a 2b ce 93 52 d9 56 e4  37 25 04 2e 5d 95 3d ea  |*+..R.V.7%..].=.|
-00000330  40 5e 86 8a ae 51 5a 87  17 00 a6 a1 77 c1 ec 40  |@^...QZ.....w..@|
-00000340  88 f9 a5 6f ec 73 b3 3e  b6 15 14 a1 5f 9a 85 18  |...o.s.>...._...|
-00000350  0b 19 82 2a d7 5a 37 4c  7b 4e 06 f7 86 24 15 25  |...*.Z7L{N...$.%|
-00000360  58 95 a0 aa 56 f2 3c 36  18 5d 2f 16 03 01 00 04  |X...V.<6.]/.....|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 7e aa 30 94 7b fb 09  |........ ~.0.{..|
+000002d0  b5 55 ce b3 e9 e0 5b 55  82 f4 e6 7c d0 e4 57 eb  |.U....[U...|..W.|
+000002e0  9b ec 82 48 d6 0e 2a bb  16 00 80 80 da c5 75 4f  |...H..*.......uO|
+000002f0  82 95 ee 47 28 af 09 08  d5 13 68 33 5d 91 dd 13  |...G(.....h3]...|
+00000300  43 84 e9 54 d9 e7 39 7c  38 74 d5 92 8f 46 37 86  |C..T..9|8t...F7.|
+00000310  44 68 ae c7 3a ad e1 33  5f cd d8 c6 a5 7c 5e 83  |Dh..:..3_....|^.|
+00000320  44 ba b1 09 44 ec 42 7f  41 80 d6 b6 4c 6d ae 24  |D...D.B.A...Lm.$|
+00000330  a9 3b 53 87 2f 3b 3a 1f  da 87 2b 7d cf 9e ed a5  |.;S./;:...+}....|
+00000340  04 54 ad c2 3c 7b 21 60  55 67 41 47 60 02 1e 62  |.T..<{!`UgAG`..b|
+00000350  bb 9f ee 2c 6e 79 20 6e  65 e2 d0 ae 73 70 3e a7  |...,ny ne...sp>.|
+00000360  3f 74 96 8e 2a 6e a6 7e  7a e0 e4 16 03 01 00 04  |?t..*n.~z.......|
 00000370  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 85 63 fe  57 56 dc ee 8c e6 66 e0  |....0.c.WV....f.|
-00000040  5c 06 37 0c 15 76 a2 51  b8 95 d6 b8 64 a3 dc 70  |\.7..v.Q....d..p|
-00000050  e7 2d 70 a8 73 ff fb 11  5a 96 bb 0e 23 b4 0a 5b  |.-p.s...Z...#..[|
-00000060  5e 6e c0 45 91                                    |^n.E.|
+00000030  16 03 01 00 30 5a cb 36  c8 1c 43 a8 e1 88 db c9  |....0Z.6..C.....|
+00000040  ae 78 b0 af 97 e4 c3 f6  25 51 8e 4d 57 94 ee ca  |.x......%Q.MW...|
+00000050  a4 8b 3f 4d 17 75 34 58  c3 fa a6 6f d4 e5 ae 3a  |..?M.u4X...o...:|
+00000060  cb 5a cb 11 ef                                    |.Z...|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 3b 02 9e ba 9e  |..........0;....|
-00000010  ae 5c 03 81 ba c4 13 9e  a8 0f 29 3c a3 e8 bd 2e  |.\........)<....|
-00000020  af 2c c7 45 c2 05 b1 03  2c 4b 45 07 5d ad 09 c6  |.,.E....,KE.]...|
-00000030  4d 9a fb 72 53 54 d7 a7  59 72 c9                 |M..rST..Yr.|
+00000000  14 03 01 00 01 01 16 03  01 00 30 96 92 50 6f f0  |..........0..Po.|
+00000010  d1 ff 7c 39 fb 75 0c 8b  c9 d7 29 7d 9d 32 4c 19  |..|9.u....)}.2L.|
+00000020  2e 93 ea 11 87 07 fc 5a  7d 3c 30 e1 bd 64 7f 90  |.......Z}<0..d..|
+00000030  fd 70 1d 50 eb ec f2 d6  de 09 61                 |.p.P......a|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 b4 b4 ad  09 c7 2f ce 80 0b ec 5b  |.... ...../....[|
-00000010  3f 59 b9 fb 8e 73 fe 23  d6 b0 39 c3 7f a9 61 12  |?Y...s.#..9...a.|
-00000020  a7 0f 76 08 f1 17 03 01  00 20 84 c5 c4 22 c8 0c  |..v...... ..."..|
-00000030  9c c7 04 f9 85 49 fb 8f  0b 49 4e c3 6b b4 5c 62  |.....I...IN.k.\b|
-00000040  2a 41 91 41 01 a2 17 43  7c 3d 15 03 01 00 20 e6  |*A.A...C|=.... .|
-00000050  5d fa 04 a1 72 9a b3 34  0e 59 e3 0b 8f 3e 6d f7  |]...r..4.Y...>m.|
-00000060  cd 85 4e d8 62 27 2c 21  c3 2e c6 64 d2 66 10     |..N.b',!...d.f.|
+00000000  17 03 01 00 20 fd a4 ba  f1 78 a9 a2 45 d3 d2 5a  |.... ....x..E..Z|
+00000010  1e 41 6b 89 8d bd a4 21  69 03 a1 7c b8 56 ff df  |.Ak....!i..|.V..|
+00000020  67 bc 85 5e 21 17 03 01  00 20 a7 6d 4c 11 d0 f3  |g..^!.... .mL...|
+00000030  7d e2 f0 69 18 7c 42 71  78 e4 3b 71 7d 13 27 bb  |}..i.|Bqx.;q}.'.|
+00000040  79 fd d7 b2 d7 28 ca 92  83 f1 15 03 01 00 20 10  |y....(........ .|
+00000050  b3 79 d4 1d 70 db b7 6c  f2 15 05 3c 4d 65 ba ec  |.y..p..l...<Me..|
+00000060  e8 0e 6a ba 88 90 53 2e  6e 29 9c 56 9f 52 5e     |..j...S.n).V.R^|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv10-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv10-Ed25519
new file mode 100644 (file)
index 0000000..e69de29
index a212b07734f90c70155a3d4d4fb4920c207ae156..1c65914281461fef58817817deb1d5243e538384 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 65 28 68 37 bf  |....Y...U..e(h7.|
-00000010  79 50 5d e6 20 07 ea 1c  6d 46 3b f9 95 a9 97 fa  |yP]. ...mF;.....|
-00000020  3c 37 87 45 e7 62 f2 e8  44 bb 02 20 e9 e0 63 8e  |<7.E.b..D.. ..c.|
-00000030  a1 0a cc a4 b3 e6 a9 3b  b0 88 c7 af cd d5 73 0a  |.......;......s.|
-00000040  b4 30 14 cf d9 f5 e0 e8  e2 2e fa 47 c0 13 00 00  |.0.........G....|
+00000000  16 03 01 00 59 02 00 00  55 03 01 7a a4 22 4f 19  |....Y...U..z."O.|
+00000010  54 37 47 cb e5 dd b4 54  86 9e 9e d6 3f f1 bd ca  |T7G....T....?...|
+00000020  9a 3e 16 3c 7e 1a 29 22  0d c8 95 20 ac 85 42 c1  |.>.<~.)"... ..B.|
+00000030  e7 f3 38 62 38 24 a8 24  d2 67 bd 0d 06 44 74 cf  |..8b8$.$.g...Dt.|
+00000040  3d a4 37 17 bc 8c 5d 41  9f 5a 74 69 c0 13 00 00  |=.7...]A.Zti....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 33 83 7d 9b d5 61 57  |........ 3.}..aW|
-000002d0  d1 d3 73 b8 f2 76 f8 31  fd 65 30 5a 6b ab c1 2f  |..s..v.1.e0Zk../|
-000002e0  0f 38 eb 54 bf 8b 09 a3  5a 00 80 34 a3 a6 86 46  |.8.T....Z..4...F|
-000002f0  e5 4d d9 73 23 6a 19 fb  f8 77 38 e1 00 74 00 c6  |.M.s#j...w8..t..|
-00000300  b2 58 3c 14 a3 7e 57 6d  85 5c 37 4d 82 f1 70 2a  |.X<..~Wm.\7M..p*|
-00000310  55 c9 e8 89 d1 45 03 e1  ac 84 2e ed 36 1c d5 90  |U....E......6...|
-00000320  cf 2d fe a6 9b f0 41 ee  0f 0a 3c 2b bd 18 da a3  |.-....A...<+....|
-00000330  f3 21 07 a4 4b 52 1e 3c  c4 cf 71 60 c7 05 39 75  |.!..KR.<..q`..9u|
-00000340  16 20 f0 6c 18 e8 82 28  3e fc f0 a0 43 6e 77 df  |. .l...(>...Cnw.|
-00000350  2f fd a1 6a fe 37 9c 67  4e a1 2a 86 23 79 a9 1f  |/..j.7.gN.*.#y..|
-00000360  4c 9f 2f 04 0c be 27 58  97 57 1d 16 03 01 00 04  |L./...'X.W......|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 71 52 12 72 a7 56 0b  |........ qR.r.V.|
+000002d0  51 81 af 9f e1 95 43 44  54 0e 9e 3d cc 6f 3c 4c  |Q.....CDT..=.o<L|
+000002e0  d7 9c e4 ae d5 ad 13 8b  28 00 80 46 29 b1 46 71  |........(..F).Fq|
+000002f0  ba 0a 3d be 29 0f 57 43  02 05 4e 49 a4 5b cd 39  |..=.).WC..NI.[.9|
+00000300  1c 44 6d 84 02 60 84 b6  7f ff 4e d8 0e e7 16 5a  |.Dm..`....N....Z|
+00000310  dd 3b 5a e0 e5 d0 b6 2c  fb 95 35 94 a0 b6 97 24  |.;Z....,..5....$|
+00000320  92 d7 b1 71 78 ee 15 6f  b2 47 fd c7 a6 a4 94 eb  |...qx..o.G......|
+00000330  44 61 9f 96 83 1d 89 a6  62 d9 9e 5b b2 3d 69 9d  |Da......b..[.=i.|
+00000340  59 c5 a4 4e e0 33 69 0c  56 6f 86 6c 6b e5 be c4  |Y..N.3i.Vo.lk...|
+00000350  ed e4 39 53 f3 fd ea 60  d2 b7 d9 5e 90 fd a3 3e  |..9S...`...^...>|
+00000360  cb 59 5d 81 da 58 07 83  e7 af 25 16 03 01 00 04  |.Y]..X....%.....|
 00000370  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 2a f4 6d  db f7 d5 12 3d 3a c0 46  |....0*.m....=:.F|
-00000040  cb db 19 82 70 5c 4d 98  f4 42 27 85 eb 90 77 2a  |....p\M..B'...w*|
-00000050  d7 60 f0 0a 98 a5 da 59  85 ac 65 68 79 91 64 bd  |.`.....Y..ehy.d.|
-00000060  3a c6 d6 3f 6d                                    |:..?m|
+00000030  16 03 01 00 30 c3 26 49  92 5a 8c d0 da 48 ba 60  |....0.&I.Z...H.`|
+00000040  29 c0 5c d5 44 04 11 7a  25 b5 d6 9f a4 cf fe bf  |).\.D..z%.......|
+00000050  33 a7 ba c2 96 2b 4d c1  fb dc 4c ba b8 2b 6f 20  |3....+M...L..+o |
+00000060  2d 2a 02 ee 17                                    |-*...|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 e2 d4 12 a3 5d  |..........0....]|
-00000010  dd 4b 72 a2 0b 5c 47 52  f1 2d cd 5f 13 c7 e8 a6  |.Kr..\GR.-._....|
-00000020  7c 7c ba 94 f8 f3 54 73  3f c0 1f 90 e7 d3 78 78  |||....Ts?.....xx|
-00000030  0b be f9 b2 d9 9a 39 83  45 f5 2c                 |......9.E.,|
+00000000  14 03 01 00 01 01 16 03  01 00 30 f4 4e 0a ea 58  |..........0.N..X|
+00000010  18 c6 9d 5f aa 5d f0 03  d4 63 0d e7 83 cb a8 18  |..._.]...c......|
+00000020  06 fa b6 82 da df 16 89  5c 8b 5d 92 87 b1 42 da  |........\.]...B.|
+00000030  cd 2a ee dc 43 08 f1 0d  1f 18 5c                 |.*..C.....\|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 a0 51 37  c8 db c1 c9 03 41 35 7e  |.... .Q7.....A5~|
-00000010  7c b4 c1 d2 b8 b4 63 e6  ac e7 6d 15 db ef 2d 4e  ||.....c...m...-N|
-00000020  70 c3 62 51 2c 17 03 01  00 20 55 0e e9 5a 5c 57  |p.bQ,.... U..Z\W|
-00000030  fb d9 f9 1b ae c5 ad fc  13 e3 5e 7c 79 c6 f8 92  |..........^|y...|
-00000040  9f b9 0e 94 e4 8b d4 cf  75 5c 15 03 01 00 20 bf  |........u\.... .|
-00000050  76 01 09 a9 b4 1e 54 cd  27 77 35 9e 5c 10 d5 dc  |v.....T.'w5.\...|
-00000060  3e 6c d6 1c 0b b0 97 b2  27 81 59 92 75 db 90     |>l......'.Y.u..|
+00000000  17 03 01 00 20 e6 95 10  e0 98 07 9f 2b 42 06 b8  |.... .......+B..|
+00000010  2a 6c 5d 4a 95 2a 2c 17  d5 cc 68 42 18 bd 72 58  |*l]J.*,...hB..rX|
+00000020  c1 39 73 05 75 17 03 01  00 20 d4 ae 70 ee a0 ed  |.9s.u.... ..p...|
+00000030  3e dd f9 aa 93 03 ff f5  a4 f6 f3 0d e7 a6 59 a9  |>.............Y.|
+00000040  40 b4 f6 ad a5 46 0b eb  ee 0e 15 03 01 00 20 7c  |@....F........ ||
+00000050  1a 29 f3 49 60 47 2e 52  ec 00 4a 62 44 30 93 5f  |.).I`G.R..JbD0._|
+00000060  df 73 2f 44 65 3f 77 c1  3d 04 32 c8 bb 86 ed     |.s/De?w.=.2....|
index 8a564081880d74d06a76bb55a340189859a1690f..1fe13b9f97a20353d67b7195a8e5f1496431dca1 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 d8 84 eb 07 33  |....Q...M......3|
-00000010  03 0d 9d c7 6d 90 a7 1f  92 33 6e d0 fc 67 7b 4f  |....m....3n..g{O|
-00000020  c5 47 84 9c 6b 1d 6d 15  82 0d e2 20 78 95 16 fc  |.G..k.m.... x...|
-00000030  9a c6 a9 8d 29 d7 5b aa  24 6a 60 48 88 85 f7 b5  |....).[.$j`H....|
-00000040  a0 72 f9 c0 ae 3d 01 ae  f7 6c b1 3a 00 05 00 00  |.r...=...l.:....|
+00000000  16 03 01 00 51 02 00 00  4d 03 01 5a 4f 78 41 d5  |....Q...M..ZOxA.|
+00000010  86 2f d2 0a c6 05 bc c9  8e cc bd b2 39 ac a5 78  |./..........9..x|
+00000020  e3 e5 31 b9 cb 01 af cb  ca fc 88 20 c9 61 c6 91  |..1........ .a..|
+00000030  b2 e5 70 df ca d0 41 a8  20 61 ab 08 f6 dc fe c0  |..p...A. a......|
+00000040  cc ea 1e 80 89 02 6a 26  ea f0 c8 71 00 05 00 00  |......j&...q....|
 00000050  05 ff 01 00 01 00 16 03  01 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 01 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 01 00 24 c5 cc  6d 58 66 41 6e 24 3d 77  |.....$..mXfAn$=w|
-000000a0  c6 dd b2 2e 39 6f 84 4c  e8 32 0b 0b 22 8b 8f d3  |....9o.L.2.."...|
-000000b0  e0 fc 8a 0e 88 8f 69 35  88 48                    |......i5.H|
+00000090  01 16 03 01 00 24 48 fd  e6 fc 4a 94 33 82 22 ff  |.....$H...J.3.".|
+000000a0  af c3 44 98 d2 c6 4e 8a  39 43 dd 4b 2a 11 2b 4e  |..D...N.9C.K*.+N|
+000000b0  5b d9 a4 fc 6c 95 d7 69  05 f9                    |[...l..i..|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 9c 13 f1 b9 96  |..........$.....|
-00000010  4a dc 99 34 51 3e 5f 00  e4 93 94 ee 91 25 9d f2  |J..4Q>_......%..|
-00000020  5d f1 8c 7e df b7 4a 42  9c 51 cb c0 83 92 cb     |]..~..JB.Q.....|
+00000000  14 03 01 00 01 01 16 03  01 00 24 61 d2 68 5e 12  |..........$a.h^.|
+00000010  91 6e 7f fe bf b7 42 58  e9 06 38 09 c1 16 34 e5  |.n....BX..8...4.|
+00000020  a1 46 d6 cf 23 ca 48 c1  ed 76 f9 48 a1 9a 2a     |.F..#.H..v.H..*|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 1a 7f 06 af  43 39 09 7b c7 52 fd 67  |........C9.{.R.g|
-00000010  cd 4f 44 8f b5 d4 60 db  ed dd 7e 10 5e df 1c 15  |.OD...`...~.^...|
-00000020  03 01 00 16 7b 2b ee 08  a0 6a c5 64 d8 6d dc 91  |....{+...j.d.m..|
-00000030  e8 e0 44 11 23 a9 c8 4c  9d 5b                    |..D.#..L.[|
+00000000  17 03 01 00 1a 3a e1 39  7c fe 25 50 dc 66 3f b6  |.....:.9|.%P.f?.|
+00000010  6f fd 79 3b 12 83 af 89  b1 c5 f6 75 56 ad a1 15  |o.y;.......uV...|
+00000020  03 01 00 16 07 d1 d3 7a  54 1c 71 0b c8 64 10 46  |.......zT.q..d.F|
+00000030  30 d0 bf df 75 a6 dc 10  b1 d1                    |0...u.....|
index e7a6cf5e086d9c49bb931e620ecb62b4a9fd860e..9d18cd62f78d151a074373c64a34ea8a36367c4c 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 48 df b9 04 7d  |....Y...U..H...}|
-00000010  92 50 cb 8f f7 03 8d 34  76 f5 4f 3a a0 d3 8e cc  |.P.....4v.O:....|
-00000020  2a cd 5d 31 1a 55 d8 08  48 3f d9 20 0c 3b c2 e1  |*.]1.U..H?. .;..|
-00000030  8f 94 68 6e e2 31 e4 f9  a6 3d bf 27 84 38 43 95  |..hn.1...=.'.8C.|
-00000040  b6 d9 d3 4b fa 0a a2 c6  5a ae 83 bd c0 09 00 00  |...K....Z.......|
+00000000  16 03 02 00 59 02 00 00  55 03 02 23 a8 e7 14 3f  |....Y...U..#...?|
+00000010  64 61 3c ee 80 a2 94 84  ab b8 66 76 30 84 06 78  |da<.......fv0..x|
+00000020  96 ba a7 d3 1e 81 1b 16  64 76 88 20 3d 21 21 b3  |........dv. =!!.|
+00000030  45 dd fe cb 5b d7 9a 86  39 ee 4f f8 60 eb 95 ea  |E...[...9.O.`...|
+00000040  ab 64 48 14 74 16 fd e9  47 07 66 60 c0 09 00 00  |.dH.t...G.f`....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  02 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 02 00 b4 0c 00  00 b0 03 00 1d 20 1d 08  |*............ ..|
-00000280  90 e5 39 31 40 7a 35 73  66 ff 41 e5 02 1f 8d a0  |..91@z5sf.A.....|
-00000290  12 e6 14 c8 24 b0 cc 1e  0f ad 4b 1b f9 1a 00 8a  |....$.....K.....|
-000002a0  30 81 87 02 42 00 bf 9d  0c 38 71 af 56 52 d7 5d  |0...B....8q.VR.]|
-000002b0  35 98 50 d2 fa 31 29 83  6d 53 9d 2a ef ae 6a 5f  |5.P..1).mS.*..j_|
-000002c0  4d aa 8b 27 a4 73 51 e7  eb 2d c2 13 54 87 41 23  |M..'.sQ..-..T.A#|
-000002d0  98 0b 47 96 ba 50 95 c2  58 ed 23 8e 0b 78 9f cf  |..G..P..X.#..x..|
-000002e0  6c 61 e6 e5 2b 0e b9 02  41 4b e0 f9 d6 03 cf b4  |la..+...AK......|
-000002f0  fa 6f 08 51 b7 3a 2a 60  d0 76 72 c8 28 8e 6e 67  |.o.Q.:*`.vr.(.ng|
-00000300  69 42 e3 e0 49 85 e9 cc  6a a0 c4 30 52 3b 3e 46  |iB..I...j..0R;>F|
-00000310  a7 a7 2b 95 7f bf 25 6e  54 ea 3c 48 1e 1d 28 96  |..+...%nT.<H..(.|
-00000320  86 ed 12 18 3c 68 6f 72  31 e9 16 03 02 00 04 0e  |....<hor1.......|
+00000270  2a 16 03 02 00 b4 0c 00  00 b0 03 00 1d 20 a7 a4  |*............ ..|
+00000280  33 20 48 6a 74 8e 07 fc  c0 b6 10 61 84 d6 67 d1  |3 Hjt......a..g.|
+00000290  ae cf 65 36 4d d5 13 a1  07 fc 1f aa 77 44 00 8a  |..e6M.......wD..|
+000002a0  30 81 87 02 42 01 02 5b  f9 4a af 8d 0a d5 a3 de  |0...B..[.J......|
+000002b0  11 62 d8 f1 db 49 7a 0c  34 3e 2d 61 f9 6f 6b c2  |.b...Iz.4>-a.ok.|
+000002c0  1d 32 4b 88 93 9b 22 b0  3d 09 c3 93 9e 25 31 d6  |.2K...".=....%1.|
+000002d0  5f 06 3a f0 4a 61 0b 06  03 5d 6c 0e b3 5e 48 5a  |_.:.Ja...]l..^HZ|
+000002e0  f0 5b 21 48 58 8f b2 02  41 1c 57 f1 51 04 d6 f8  |.[!HX...A.W.Q...|
+000002f0  a2 51 e6 e6 3e e0 99 63  aa d2 1c 7b 92 be 44 ec  |.Q..>..c...{..D.|
+00000300  86 c3 31 fa e7 9b 98 1a  59 a5 93 3e a9 73 f0 ec  |..1.....Y..>.s..|
+00000310  03 22 37 19 db 78 30 27  ab bf 52 07 6c 3a 79 f5  |."7..x0'..R.l:y.|
+00000320  ad 70 59 76 84 44 f0 47  e0 3d 16 03 02 00 04 0e  |.pYv.D.G.=......|
 00000330  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000000  16 03 02 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 02 00 01 01  |....._X.;t......|
 00000030  16 03 02 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 3b 28 96  4f 03 dd 04 4e a3 73 73  |.....;(.O...N.ss|
-00000050  48 40 ef e3 4f 9d ab 39  3b db c6 0e fa 7f 0c 18  |H@..O..9;.......|
-00000060  f5 94 cd 55 23 2f f5 5c  69 14 bb 0b 49 e3 98 d7  |...U#/.\i...I...|
-00000070  c0 db 9e 3a 8b                                    |...:.|
+00000040  00 00 00 00 00 ef 0f 92  ac 11 fe 97 1a 46 69 e4  |.............Fi.|
+00000050  b3 26 8d d7 92 46 02 25  5b 2e 86 3e 96 3d 64 ed  |.&...F.%[..>.=d.|
+00000060  37 92 dd ae a5 a6 9f 03  f0 c2 42 78 9f b9 78 ac  |7.........Bx..x.|
+00000070  97 ab 82 25 e2                                    |...%.|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 76 98 c8 7d 95  |..........@v..}.|
-00000010  ac 40 73 36 c1 49 ae 20  f4 a0 ef 70 59 bf d3 5e  |.@s6.I. ...pY..^|
-00000020  71 ec 2e f8 c5 ea 9d cc  4d 06 44 e3 aa 46 cd c3  |q.......M.D..F..|
-00000030  c9 1b a0 5a 9a 76 ce 3b  b5 16 85 33 cf ba 46 08  |...Z.v.;...3..F.|
-00000040  b8 c0 a7 da 2a 4d 23 b9  02 cc 3f                 |....*M#...?|
+00000000  14 03 02 00 01 01 16 03  02 00 40 df a9 23 37 74  |..........@..#7t|
+00000010  47 d8 98 87 53 b4 0a 4d  b0 a5 fb cb d6 37 c8 7c  |G...S..M.....7.||
+00000020  61 95 81 ef b3 63 78 2b  53 c2 86 fc 39 df c4 5f  |a....cx+S...9.._|
+00000030  e4 4b af 1d fe bc 4c fe  1b 6a 28 c3 46 6f 24 94  |.K....L..j(.Fo$.|
+00000040  a8 bf ef ce e8 e8 ad 2c  d9 10 32                 |.......,..2|
 >>> Flow 5 (client to server)
 00000000  17 03 02 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 03 dd b7  03 45 4d 4c 0a 7a e7 36  |.........EML.z.6|
-00000020  a0 93 82 4e 15 73 b1 b8  18 17 35 c6 e1 84 47 4b  |...N.s....5...GK|
-00000030  8c 3f 5c a2 9d 15 03 02  00 30 00 00 00 00 00 00  |.?\......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 c2 f9 0f cb 78 53  |..............xS|
-00000050  43 55 f3 fd 8a cc 16 32  19 0b 81 5d 90 a4 31 ff  |CU.....2...]..1.|
-00000060  58 ea 70 73 92 ad e8 ed  0c e3                    |X.ps......|
+00000010  00 00 00 00 00 34 50 ce  9c 7f f5 2d a2 c1 e4 5c  |.....4P....-...\|
+00000020  fa d1 a0 f4 38 e8 4f 51  54 36 07 da f1 af 6d ef  |....8.OQT6....m.|
+00000030  b8 b0 bc bc a6 15 03 02  00 30 00 00 00 00 00 00  |.........0......|
+00000040  00 00 00 00 00 00 00 00  00 00 0b d4 8e e8 69 64  |..............id|
+00000050  53 38 7c 72 d8 1d 9f d5  8a 83 74 a7 37 6b e2 c0  |S8|r......t.7k..|
+00000060  8f 26 e7 5d 0e 06 ae e0  db fb                    |.&.]......|
index 02175ac954ecdaeb641caeb2c76e08d563266363..4cc9610faa970d2c6a870197c858a9275f5bc4e9 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 98 e4 68 fc f9  |....Y...U....h..|
-00000010  df 3e 77 31 50 88 fb c7  9c 53 37 20 97 9d 66 e1  |.>w1P....S7 ..f.|
-00000020  7f 2b bd 1f 59 2e b4 e1  12 71 0a 20 fe dc fa 3d  |.+..Y....q. ...=|
-00000030  a5 41 2c 4c 0f 30 73 a8  35 4a 6a 14 1b 6c b6 22  |.A,L.0s.5Jj..l."|
-00000040  aa be ae be 7c 53 6d 29  c1 da 0e 6b c0 13 00 00  |....|Sm)...k....|
+00000000  16 03 02 00 59 02 00 00  55 03 02 6e ff 3b 26 66  |....Y...U..n.;&f|
+00000010  7c 32 3f 42 fd 92 7c 12  db 26 b2 45 6e 28 b9 49  ||2?B..|..&.En(.I|
+00000020  86 6b 00 54 92 3b 65 a6  02 6d 94 20 ea 44 db 5c  |.k.T.;e..m. .D.\|
+00000030  d1 39 35 b2 ea 1c 6d 3e  94 bb 47 60 25 1e 9c 74  |.95...m>..G`%..t|
+00000040  e7 bd 54 cc 2b 36 14 6a  12 54 5b 6c c0 13 00 00  |..T.+6.j.T[l....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  02 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 02 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 e7 c9 40 dc 8c e7 4a  |........ ..@...J|
-000002d0  52 c5 47 3d 41 9e 43 75  9a 3e 01 db 85 dd 6e 27  |R.G=A.Cu.>....n'|
-000002e0  89 c1 88 3f d3 1b 62 50  6b 00 80 26 d0 b2 dc c7  |...?..bPk..&....|
-000002f0  2f 94 03 ff be db bc ee  d1 2b 83 29 6e 73 6b 69  |/........+.)nski|
-00000300  39 eb a7 38 c3 4b d7 93  1d c7 94 ae 83 1e 70 2c  |9..8.K........p,|
-00000310  18 bb 82 b6 fe 18 74 a1  33 aa f8 a5 8a 41 c3 b8  |......t.3....A..|
-00000320  5d 30 7e 5e cd 05 ef df  bf 8a 77 96 1c cb e9 c5  |]0~^......w.....|
-00000330  82 0e 79 e0 04 2f ba 0a  63 f5 de 70 b6 ef 09 08  |..y../..c..p....|
-00000340  24 36 b6 01 c3 8c d7 3e  54 1b f1 39 08 2e 18 79  |$6.....>T..9...y|
-00000350  85 58 73 a2 f4 51 2b 04  1b c5 da b4 47 b0 a8 ca  |.Xs..Q+.....G...|
-00000360  38 35 75 78 2b 53 97 93  50 01 c3 16 03 02 00 04  |85ux+S..P.......|
+000002c0  aa 0c 00 00 a6 03 00 1d  20 82 3b d2 56 dd cd d8  |........ .;.V...|
+000002d0  e1 98 a7 90 d1 08 2d 37  dc e8 21 cd 29 af 29 a5  |......-7..!.).).|
+000002e0  78 8e 59 9e 4c ac c9 d2  4b 00 80 25 20 91 4e 0d  |x.Y.L...K..% .N.|
+000002f0  74 12 9e 1c 98 fb 5f 4b  ad fd c8 68 df 6b 82 98  |t....._K...h.k..|
+00000300  a8 7c ee 17 44 47 91 2a  42 c1 82 d0 ce aa cd f8  |.|..DG.*B.......|
+00000310  69 1e 85 79 27 fe ef 5a  a2 e1 35 30 9a 2d c6 b0  |i..y'..Z..50.-..|
+00000320  43 84 39 7f 8d 68 09 d6  6c 1a 84 0f c0 9a c0 9f  |C.9..h..l.......|
+00000330  64 56 cb fc 32 f2 4a a3  26 e8 c2 5f d7 16 3e 7c  |dV..2.J.&.._..>||
+00000340  4e 8b 89 f8 7f f4 c2 26  fe 01 cd 48 b6 61 9c 93  |N......&...H.a..|
+00000350  1a bc a1 d1 01 c5 bf ef  43 b4 ca 86 62 37 b4 99  |........C...b7..|
+00000360  54 69 db 74 51 92 92 dd  c1 b1 75 16 03 02 00 04  |Ti.tQ.....u.....|
 00000370  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
 00000000  16 03 02 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 02 00 01 01  |....._X.;t......|
 00000030  16 03 02 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 46 e7 d3  6c ca df 1e 98 43 dd fc  |.....F..l....C..|
-00000050  7c 0e 51 7c 32 0a 76 41  7a c5 19 4a b2 75 e0 43  ||.Q|2.vAz..J.u.C|
-00000060  27 7e 84 b3 e2 2b ee fd  6f a5 11 f3 f8 68 e2 b1  |'~...+..o....h..|
-00000070  5e 7e ec 3a 89                                    |^~.:.|
+00000040  00 00 00 00 00 c5 bf e6  b3 86 12 92 df 68 fa 75  |.............h.u|
+00000050  79 5f ee fe 60 91 d1 fd  8a 48 3b 97 b4 da 7f 58  |y_..`....H;....X|
+00000060  3e 7e 40 d7 93 1d 6b e2  0e 2a a4 45 20 e0 9d f9  |>~@...k..*.E ...|
+00000070  b6 5e b1 f1 4f                                    |.^..O|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 a1 8f f2 23 62  |..........@...#b|
-00000010  42 71 dd dc d6 8c 5e 3e  d7 cf ef 8b b8 26 d4 99  |Bq....^>.....&..|
-00000020  d9 4f 58 ac cf eb 5d 56  00 be 20 3e 32 c2 72 2a  |.OX...]V.. >2.r*|
-00000030  46 6a c4 b6 51 8c 3d c7  b3 e7 28 32 8c b7 f6 4c  |Fj..Q.=...(2...L|
-00000040  9a 3d 30 56 42 84 25 c7  aa f4 e7                 |.=0VB.%....|
+00000000  14 03 02 00 01 01 16 03  02 00 40 bf 58 92 80 02  |..........@.X...|
+00000010  75 91 40 30 35 e0 16 76  f4 97 bd 77 46 a3 a3 4e  |u.@05..v...wF..N|
+00000020  f1 be 53 eb b8 56 45 b1  71 c9 f8 a9 bf c6 9a 00  |..S..VE.q.......|
+00000030  83 46 91 88 d5 7b 72 95  27 33 80 43 3f 3e f6 60  |.F...{r.'3.C?>.`|
+00000040  c6 55 90 6a 87 8e 7d 48  27 e2 40                 |.U.j..}H'.@|
 >>> Flow 5 (client to server)
 00000000  17 03 02 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 c1 55 65  98 a8 15 c1 80 95 e0 85  |......Ue........|
-00000020  c0 0e f5 68 27 b1 f2 27  c2 cc 0e fd 36 15 ed 75  |...h'..'....6..u|
-00000030  9f 87 78 ae 3a 15 03 02  00 30 00 00 00 00 00 00  |..x.:....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 b1 1a 15 9d f2 93  |................|
-00000050  4b 2d 0c 32 9d e6 34 1b  37 bf 89 b2 ca 44 95 16  |K-.2..4.7....D..|
-00000060  10 26 bd 47 e9 cb 62 76  1e 72                    |.&.G..bv.r|
+00000010  00 00 00 00 00 f5 6b bc  6d 2c 70 b1 c0 f0 ab 78  |......k.m,p....x|
+00000020  44 c9 97 f6 59 ef 15 e4  05 cf e0 55 ee a4 68 8c  |D...Y......U..h.|
+00000030  86 57 82 bd 84 15 03 02  00 30 00 00 00 00 00 00  |.W.......0......|
+00000040  00 00 00 00 00 00 00 00  00 00 ef b2 a9 a5 bb a3  |................|
+00000050  6e e5 d1 2b ef 83 1d 11  de 29 d2 30 2c fc 78 73  |n..+.....).0,.xs|
+00000060  6b 6e 0a d2 55 67 5c d4  58 b3                    |kn..Ug\.X.|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv11-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv11-Ed25519
new file mode 100644 (file)
index 0000000..e69de29
index 6340eb1bbccf4c69ac153e468e063bad129c0445..9dae5dd6d2bf6dcafdaff95f046b8cc1c92d8d7e 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 51 02 00 00  4d 03 02 63 10 cc 62 2c  |....Q...M..c..b,|
-00000010  7c 1f 2a 30 cc 2f fc cf  57 4e b1 a8 48 1a e8 e6  ||.*0./..WN..H...|
-00000020  fe 3c ec cd e6 bf b4 0b  90 4f 28 20 f4 f9 6a 6d  |.<.......O( ..jm|
-00000030  73 cf 9f 86 7e d1 10 ab  7f 48 9c 1e c2 14 1d 18  |s...~....H......|
-00000040  cc e8 57 48 65 c5 2e 86  a8 e2 da 4a 00 05 00 00  |..WHe......J....|
+00000000  16 03 02 00 51 02 00 00  4d 03 02 96 ca 2a e7 23  |....Q...M....*.#|
+00000010  af 2e 45 62 15 fa 5a 84  bc aa 7c 79 03 1b 37 69  |..Eb..Z...|y..7i|
+00000020  a0 77 ce 03 81 b7 e5 7d  31 34 6e 20 93 83 5d 7c  |.w.....}14n ..]||
+00000030  e8 c7 48 f9 67 ec 97 b1  27 b6 de de 89 07 5a cf  |..H.g...'.....Z.|
+00000040  44 77 48 4b e9 62 43 e3  87 fd de 87 00 05 00 00  |DwHK.bC.........|
 00000050  05 ff 01 00 01 00 16 03  02 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 02 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 02 00 24 cf ee  c8 cd b5 06 a4 5a 3a 3e  |.....$.......Z:>|
-000000a0  6a 11 9b 40 48 b2 89 95  5c ba 30 59 df 05 63 46  |j..@H...\.0Y..cF|
-000000b0  0c 23 54 34 a8 f5 b2 51  1b 3c                    |.#T4...Q.<|
+00000090  01 16 03 02 00 24 33 5d  7f cb 6e 36 19 8b db 35  |.....$3]..n6...5|
+000000a0  88 16 87 7a 9d 5a 51 27  51 13 17 64 0e 57 d5 e1  |...z.ZQ'Q..d.W..|
+000000b0  6e 34 8d e6 99 a8 38 b2  e7 3a                    |n4....8..:|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 24 5e 7b 1a c0 81  |..........$^{...|
-00000010  94 bc 22 87 6f 6a 09 9d  ad b4 9c 90 ae 80 4f ed  |..".oj........O.|
-00000020  3f 6d ac 40 7a 20 0a 9a  7f b2 f9 7d c2 50 7a     |?m.@z .....}.Pz|
+00000000  14 03 02 00 01 01 16 03  02 00 24 e0 8b 90 9b 83  |..........$.....|
+00000010  f5 3d 00 e9 cf 7b 1d 75  cf c8 16 f2 29 8d de 0b  |.=...{.u....)...|
+00000020  75 82 b1 c4 6e 1c 1f ab  e9 90 74 31 99 f2 ad     |u...n.....t1...|
 >>> Flow 5 (client to server)
-00000000  17 03 02 00 1a bb f8 a5  2d ef c6 34 c7 1a 1b 87  |........-..4....|
-00000010  8c 59 31 72 64 19 a3 d4  ab 40 b3 b9 75 1c 92 15  |.Y1rd....@..u...|
-00000020  03 02 00 16 e0 65 24 90  8e 53 9c 2e 48 52 83 ec  |.....e$..S..HR..|
-00000030  09 b0 92 2b 21 42 c1 ed  45 bb                    |...+!B..E.|
+00000000  17 03 02 00 1a ca 2a 95  13 de 40 0d af 44 a4 aa  |......*...@..D..|
+00000010  9a 35 d7 38 c7 9f 74 4f  3a bf d1 9c cd 9e ee 15  |.5.8..tO:.......|
+00000020  03 02 00 16 d3 a4 32 78  a9 00 1b 7a 48 3e 7c 2b  |......2x...zH>|+|
+00000030  f9 3b 92 32 20 0b f4 16  39 18                    |.;.2 ...9.|
index dde850651abb4fb88b932284d59a315c505e8c6b..4412f53c90ac0c10d80a38bf0677583604cf8000 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 4c 7d 80 b6 78  |....Q...M..L}..x|
-00000010  9f 5c 70 7d fe 4a 0a b2  e3 12 80 14 6d 20 e3 cc  |.\p}.J......m ..|
-00000020  ec c9 08 8e 44 f6 c2 92  65 90 56 20 86 57 75 b4  |....D...e.V .Wu.|
-00000030  3d 5a 00 5f bb 25 f3 21  a9 e2 1e 10 4a 1e 8a 30  |=Z._.%.!....J..0|
-00000040  9a 93 b0 87 04 a1 d5 c6  ad 0f c9 fc 00 9c 00 00  |................|
+00000000  16 03 03 00 51 02 00 00  4d 03 03 1d be be 1e eb  |....Q...M.......|
+00000010  59 2c d5 07 b9 7a 64 47  95 84 ef cf d9 3e 82 4c  |Y,...zdG.....>.L|
+00000020  00 c0 0a 69 8a 01 2a b3  42 78 02 20 5e 32 5c 88  |...i..*.Bx. ^2\.|
+00000030  50 ed d5 44 41 4f bf a9  4e 49 83 5d aa 7c 2e 5d  |P..DAO..NI.].|.]|
+00000040  85 e8 64 92 5e 49 5d 8a  d0 0e 89 eb 00 9c 00 00  |..d.^I].........|
 00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 14 74  |.....(.........t|
-000000a0  ff 19 e7 d3 2c b4 5e 43  c2 38 d2 53 ca a2 3e f6  |....,.^C.8.S..>.|
-000000b0  f0 12 92 0c 68 6f d7 5c  37 ff 8e d7 98 bf        |....ho.\7.....|
+00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 69 38  |.....(........i8|
+000000a0  97 84 2e 77 5c b8 58 82  b5 78 85 2e f3 7b 92 81  |...w\.X..x...{..|
+000000b0  00 72 91 23 41 ae 59 6c  18 64 f0 62 f2 c9        |.r.#A.Yl.d.b..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 20 60 01 e9 d0  |..........( `...|
-00000010  f7 5a 03 c6 6c 6e 37 5e  ad e2 2f 93 84 31 88 38  |.Z..ln7^../..1.8|
-00000020  da b7 55 4d 3d 0c 8a 6b  7c 57 05 2a ef 6f 24 6b  |..UM=..k|W.*.o$k|
-00000030  6f 1d d6                                          |o..|
+00000000  14 03 03 00 01 01 16 03  03 00 28 37 f7 98 2f 78  |..........(7../x|
+00000010  54 85 5f 2e cb a9 b7 bf  4b 2d 62 06 e2 32 cd 18  |T._.....K-b..2..|
+00000020  de f5 54 c8 e0 54 2d c5  b4 98 07 7e c7 b7 79 a0  |..T..T-....~..y.|
+00000030  75 af 5c                                          |u.\|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 4f 20 33  |.............O 3|
-00000010  83 73 86 0a ca 92 4d 8b  d5 cf 2e e8 b1 f0 81 9c  |.s....M.........|
-00000020  c1 3b 0a 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.;..............|
-00000030  9c a9 02 e8 ad cf 5f 33  f0 15 86 c7 4a 11 85 20  |......_3....J.. |
-00000040  06 04                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 78 c1 c0  |.............x..|
+00000010  7d 1b a8 b2 80 0e a3 64  cf e0 fa 71 9d 37 5d 32  |}......d...q.7]2|
+00000020  8d 36 38 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.68.............|
+00000030  c2 f3 41 1a 2c a4 4f 48  fa 61 14 40 60 51 e5 99  |..A.,.OH.a.@`Q..|
+00000040  c6 e5                                             |..|
index 8714fdbcef797d9fdb6db729f07afa6a22d471d6..d7568843b48a7afbf12b1c3296c40eeeed76298e 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 fa f4 c1 2c 7a  |....Q...M.....,z|
-00000010  a0 09 f0 35 06 c3 79 90  a4 df fa 3c 14 1a 95 92  |...5..y....<....|
-00000020  23 16 19 9d 38 83 89 6f  ee 7e 7b 20 1f 2d 6c 2b  |#...8..o.~{ .-l+|
-00000030  bf 93 e4 58 00 13 6d ac  4d 0b c2 b4 4a e5 b3 39  |...X..m.M...J..9|
-00000040  80 8e 35 1b 7b ec 9a 2e  b8 bb 0b 04 00 3c 00 00  |..5.{........<..|
+00000000  16 03 03 00 51 02 00 00  4d 03 03 c3 41 d7 9c 1b  |....Q...M...A...|
+00000010  9a ff f8 17 af 41 df 8d  96 70 bb b8 f6 9a 4c a2  |.....A...p....L.|
+00000020  03 25 31 2c 58 fa 05 5b  12 85 6a 20 18 3c 34 d6  |.%1,X..[..j .<4.|
+00000030  08 44 46 a5 5c b1 40 0d  38 33 c0 2d ea a6 46 53  |.DF.\.@.83.-..FS|
+00000040  0e 09 39 6f 11 35 02 63  cf 21 74 c2 00 3c 00 00  |..9o.5.c.!t..<..|
 00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
 00000090  01 16 03 03 00 50 00 00  00 00 00 00 00 00 00 00  |.....P..........|
-000000a0  00 00 00 00 00 00 ab 11  61 9b 81 32 bc 64 54 55  |........a..2.dTU|
-000000b0  4d 76 5d 75 77 10 c4 df  34 43 af a5 83 37 24 e9  |Mv]uw...4C...7$.|
-000000c0  6c c8 73 ad 28 24 a8 3a  be 5d a9 22 21 fc e5 95  |l.s.($.:.]."!...|
-000000d0  7e 27 18 d4 c4 b4 c5 70  f6 48 73 a6 97 2a c7 5d  |~'.....p.Hs..*.]|
-000000e0  46 78 37 9f f1 30                                 |Fx7..0|
+000000a0  00 00 00 00 00 00 88 20  99 51 5e fb 72 79 7f f8  |....... .Q^.ry..|
+000000b0  b2 a9 56 96 a3 03 1d a0  e0 38 1a be 4c ea 80 f9  |..V......8..L...|
+000000c0  c0 ef 45 81 91 7f b9 1b  f7 91 3b 4e 05 87 d6 73  |..E.......;N...s|
+000000d0  c0 27 94 50 4f 00 ee c1  02 af 5f 6f 4c a5 0e 5b  |.'.PO....._oL..[|
+000000e0  6c 76 87 28 b4 bf                                 |lv.(..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 c3 5f 95 d2 ee  |..........P._...|
-00000010  3d 98 c9 29 ab 06 fc 8c  9b 9c fa 98 36 f1 6c f4  |=..)........6.l.|
-00000020  0c bd c6 d3 79 7e ce 90  fa 23 04 d3 41 ea 35 f0  |....y~...#..A.5.|
-00000030  3e bc dc 02 ae 0d 87 27  1a 8b d8 f0 e4 32 7d 89  |>......'.....2}.|
-00000040  9c 89 50 38 ae 02 e2 c7  65 43 a9 1f ce 42 c9 e3  |..P8....eC...B..|
-00000050  ce 0d 68 16 f6 46 6d 40  47 66 3c                 |..h..Fm@Gf<|
+00000000  14 03 03 00 01 01 16 03  03 00 50 93 14 a5 13 16  |..........P.....|
+00000010  d7 af 14 81 94 33 2d ae  f7 7a b1 b1 a5 38 fb e8  |.....3-..z...8..|
+00000020  c8 38 b3 ce f1 eb 70 e7  84 b6 fc 25 25 32 a9 09  |.8....p....%%2..|
+00000030  d1 0d 2d 59 57 6d d0 42  e8 c1 81 92 d0 af fb 5a  |..-YWm.B.......Z|
+00000040  08 7e 0f 3d 10 e5 42 6d  27 cd 8c 32 b2 20 4b 0a  |.~.=..Bm'..2. K.|
+00000050  75 76 ed 08 54 fe 74 94  72 35 9e                 |uv..T.t.r5.|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 55 d6 ad  fe d9 c9 28 f1 6e 80 e3  |.....U.....(.n..|
-00000020  54 38 52 96 9f cb cb 94  67 ef a1 ed e0 6b 83 c6  |T8R.....g....k..|
-00000030  c8 48 c2 bb ed 18 a5 ec  cc 6d cc f1 78 a1 be 45  |.H.......m..x..E|
-00000040  88 e9 c9 5a 03 15 03 03  00 40 00 00 00 00 00 00  |...Z.....@......|
-00000050  00 00 00 00 00 00 00 00  00 00 8a 47 d5 d1 ba 89  |...........G....|
-00000060  cb 14 1a a7 99 6b 41 14  4c 85 f3 df f2 51 42 23  |.....kA.L....QB#|
-00000070  0d 44 b1 a4 52 3c e8 34  5c 09 cc 92 06 3a 3f 75  |.D..R<.4\....:?u|
-00000080  b1 b2 cb bf c7 ff da f7  7a 90                    |........z.|
+00000010  00 00 00 00 00 53 91 38  34 33 20 94 0d 76 d7 72  |.....S.843 ..v.r|
+00000020  48 f3 17 34 01 ae 0e 89  db 60 f1 4e 64 a5 cf 0c  |H..4.....`.Nd...|
+00000030  32 52 3f a0 18 f8 c5 57  ed 3a d1 41 19 81 cf 0a  |2R?....W.:.A....|
+00000040  f2 d8 90 4b ba 15 03 03  00 40 00 00 00 00 00 00  |...K.....@......|
+00000050  00 00 00 00 00 00 00 00  00 00 05 2b 31 3c 1b a2  |...........+1<..|
+00000060  11 87 5f 0f 49 72 bb 67  e6 75 18 9c b1 f4 6c ed  |.._.Ir.g.u....l.|
+00000070  4d 01 58 35 30 43 44 e8  ee 1d f2 81 9d 67 6d 77  |M.X50CD......gmw|
+00000080  1e 36 61 7f f3 32 3d 60  73 6d                    |.6a..2=`sm|
index 61abb55a51996f8ead458d1d86f182718e5b31bf..2f552cbb62747527470fc4c0e352ff1861baf308 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 f9 28 80 d0 c1  |....Q...M...(...|
-00000010  26 36 81 01 db 60 7a 37  77 ff 57 da 2a 4c ab f3  |&6...`z7w.W.*L..|
-00000020  5d 00 df f9 84 db bd 2d  95 37 ae 20 f7 00 8d 5d  |]......-.7. ...]|
-00000030  1e ba e7 cc ed 36 d6 a5  87 63 5d c3 9b 4b a0 9c  |.....6...c]..K..|
-00000040  cf ee bc b3 de 8a ec 61  41 a3 3a df 00 9d 00 00  |.......aA.:.....|
+00000000  16 03 03 00 51 02 00 00  4d 03 03 2b 59 94 f3 9e  |....Q...M..+Y...|
+00000010  23 ae d3 58 82 1f 2e be  38 1d 14 e4 4c a4 b8 ed  |#..X....8...L...|
+00000020  95 08 b9 44 60 02 4b 0b  a9 6e ae 20 9b 43 e5 2a  |...D`.K..n. .C.*|
+00000030  0f 08 8e a4 c1 c0 15 79  9f af a5 ab a3 67 9d 09  |.......y.....g..|
+00000040  23 0e 8e 96 a9 aa 7d 26  74 d8 0c 9a 00 9d 00 00  |#.....}&t.......|
 00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 0c e7  |.....(..........|
-000000a0  cc 31 51 9b 03 cc bb 21  51 a7 5f 23 59 cf 5f 29  |.1Q....!Q._#Y._)|
-000000b0  4e bd db 3d d2 fb 92 73  27 2b 6f 9a b7 f2        |N..=...s'+o...|
+00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 59 fc  |.....(........Y.|
+000000a0  aa b1 84 ab 09 82 00 88  8e e4 82 6e cd 24 9f b5  |...........n.$..|
+000000b0  01 95 d3 c3 f4 a2 16 54  25 91 77 76 fc f0        |.......T%.wv..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 68 27 f4 6c ac  |..........(h'.l.|
-00000010  ae 31 68 1a b3 7c 5f 6f  41 18 5a 24 d3 04 00 d2  |.1h..|_oA.Z$....|
-00000020  2d ce 9b 30 a1 55 df f6  7a ff 80 42 9c 86 c7 13  |-..0.U..z..B....|
-00000030  c8 fc ca                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 67 ac 20 d9 b6  |..........(g. ..|
+00000010  a9 f0 ec f6 7b 34 31 3a  5e 06 20 0f 5b 32 86 1b  |....{41:^. .[2..|
+00000020  da 5a c5 54 47 d0 ad 4f  95 2c b5 1f 17 3f ec 17  |.Z.TG..O.,...?..|
+00000030  a3 01 fc                                          |...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 e3 e7 af  |................|
-00000010  ee cc 1b e2 13 85 a7 37  85 e9 bd a7 3e 18 e2 f0  |.......7....>...|
-00000020  e3 2d 64 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.-d.............|
-00000030  3d fe 35 3c b3 13 25 f8  a3 b8 81 da 91 3b 8d 69  |=.5<..%......;.i|
-00000040  fc c5                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 6c 9c 0a  |.............l..|
+00000010  ae 0b 40 57 8b 24 6d 09  77 ae 2f 14 be 06 26 9e  |..@W.$m.w./...&.|
+00000020  0a bf 18 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  32 50 20 68 3d 05 68 ed  0c ac 7a db 24 21 7e e0  |2P h=.h...z.$!~.|
+00000040  9e f0                                             |..|
index 72d2b7c4b73e8945074ed21f0425465cfafebb38..2708b262b6b96c7c3610711c0912c5d75783f69f 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 10 01 00 01  0c 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 12 01 00 01  0e 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,22 +7,22 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 91 33 74 00 00  00 05 00 05 01 00 00 00  |....3t..........|
+00000080  01 00 00 93 33 74 00 00  00 05 00 05 01 00 00 00  |....3t..........|
 00000090  00 00 0a 00 0a 00 08 00  1d 00 17 00 18 00 19 00  |................|
-000000a0  0b 00 02 01 00 00 0d 00  18 00 16 08 04 08 05 08  |................|
-000000b0  06 04 01 04 03 05 01 05  03 06 01 06 03 02 01 02  |................|
-000000c0  03 ff 01 00 01 00 00 10  00 10 00 0e 06 70 72 6f  |.............pro|
-000000d0  74 6f 32 06 70 72 6f 74  6f 31 00 12 00 00 00 2b  |to2.proto1.....+|
-000000e0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
-000000f0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
-00000100  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-00000110  5f 58 cb 3b 74                                    |_X.;t|
+000000a0  0b 00 02 01 00 00 0d 00  1a 00 18 08 04 04 03 08  |................|
+000000b0  07 08 05 08 06 04 01 05  01 06 01 05 03 06 03 02  |................|
+000000c0  01 02 03 ff 01 00 01 00  00 10 00 10 00 0e 06 70  |...............p|
+000000d0  72 6f 74 6f 32 06 70 72  6f 74 6f 31 00 12 00 00  |roto2.proto1....|
+000000e0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
+000000f0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
+00000100  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
+00000110  90 99 5f 58 cb 3b 74                              |.._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 66 02 00 00  62 03 03 44 df ea e4 67  |....f...b..D...g|
-00000010  62 77 d5 ee 65 9f 25 8b  54 86 1a 1f 09 46 9c 41  |bw..e.%.T....F.A|
-00000020  d3 13 bb 6c f5 73 9a 22  eb cf 8d 20 e8 2e 63 9f  |...l.s."... ..c.|
-00000030  a3 64 aa 59 7b 88 f8 28  7e 57 00 7c 3a cc 80 5e  |.d.Y{..(~W.|:..^|
-00000040  7d 9a 03 1e 5d 89 c0 ff  53 aa c0 4d cc a8 00 00  |}...]...S..M....|
+00000000  16 03 03 00 66 02 00 00  62 03 03 0e b3 00 4c e5  |....f...b.....L.|
+00000010  e4 08 c5 3d c2 9c 19 a1  de ae 43 24 9a 4d 81 99  |...=......C$.M..|
+00000020  df 60 cf a5 be ae c1 e8  e8 b9 a8 20 14 e6 e1 91  |.`......... ....|
+00000030  7a ab 9f 7b 3c dc c5 71  4b 28 80 5e fa 56 c9 b7  |z..{<..qK(.^.V..|
+00000040  d4 2f 0e 80 49 df 81 93  df 5d 34 49 cc a8 00 00  |./..I....]4I....|
 00000050  1a ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 10  |................|
 00000060  00 09 00 07 06 70 72 6f  74 6f 31 16 03 03 02 59  |.....proto1....Y|
 00000070  0b 00 02 55 00 02 52 00  02 4f 30 82 02 4b 30 82  |...U..R..O0..K0.|
 000002a0  1c f1 0f a1 d8 40 83 61  c9 4c 72 2b 9d ae db 46  |.....@.a.Lr+...F|
 000002b0  06 06 4d f4 c1 b3 3e c0  d1 bd 42 d4 db fe 3d 13  |..M...>...B...=.|
 000002c0  60 84 5c 21 d3 3b e9 fa  e7 16 03 03 00 ac 0c 00  |`.\!.;..........|
-000002d0  00 a8 03 00 1d 20 5e d1  0b 33 b0 c2 e9 12 eb 00  |..... ^..3......|
-000002e0  4d 2f b8 1b 74 b0 b2 a0  01 7a 67 5a 54 9e a5 d1  |M/..t....zgZT...|
-000002f0  c5 a5 2e 59 af 53 08 04  00 80 1f ac 73 b9 62 55  |...Y.S......s.bU|
-00000300  a2 53 ae 64 db 2a f7 a1  a8 69 09 2d a2 fa 0c d8  |.S.d.*...i.-....|
-00000310  9e e8 9a 2f b6 8f f0 e1  5e 53 bb 4c 9e fa e4 7a  |.../....^S.L...z|
-00000320  68 06 20 d5 e7 d0 de cf  29 a8 bd 6b 54 82 e4 bb  |h. .....)..kT...|
-00000330  dd 6e ab d1 d1 c9 af 77  01 b1 06 e1 9d 2f 00 7a  |.n.....w...../.z|
-00000340  2b e7 6f d1 da 7c 6f f5  2c 03 0d 57 9e 19 41 be  |+.o..|o.,..W..A.|
-00000350  91 85 17 c2 4a 5e 9b 87  44 0e df 81 64 b1 2e 4b  |....J^..D...d..K|
-00000360  64 80 fb f2 7f 23 f1 19  2c 8a 8d 6d 08 1e e9 0d  |d....#..,..m....|
-00000370  47 ec 94 b0 db c6 7a 44  79 04 16 03 03 00 04 0e  |G.....zDy.......|
+000002d0  00 a8 03 00 1d 20 18 37  3a d3 0a 4f 9b 95 c7 f0  |..... .7:..O....|
+000002e0  a2 00 43 5f df 2e a8 16  a9 9f 2a 0e 51 cf c9 b9  |..C_......*.Q...|
+000002f0  14 62 a7 ab 4b 6a 08 04  00 80 1a b2 78 e7 cd b6  |.b..Kj......x...|
+00000300  18 65 31 19 f9 91 9f a6  cb 77 97 69 86 27 ef 06  |.e1......w.i.'..|
+00000310  b5 bc f4 8f 75 96 01 72  64 2c d4 e4 67 0a d5 58  |....u..rd,..g..X|
+00000320  e0 e1 05 82 a6 58 f6 e0  06 c2 15 03 69 ba 5a a0  |.....X......i.Z.|
+00000330  2b af 6f b1 cd 16 84 1d  89 9c d0 c7 d2 c7 83 e8  |+.o.............|
+00000340  43 b7 4f e8 ca 97 c0 e2  57 d0 10 48 0c 26 cf 58  |C.O.....W..H.&.X|
+00000350  50 69 d8 86 b6 f5 aa 02  b8 f6 41 c4 15 52 99 52  |Pi........A..R.R|
+00000360  05 05 5b 42 80 6d 8a bf  7a e6 f3 60 c5 67 23 dc  |..[B.m..z..`.g#.|
+00000370  39 4b e6 74 0e 0e 47 a7  57 02 16 03 03 00 04 0e  |9K.t..G.W.......|
 00000380  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 b9 03 a2  50 29 94 cc 5b 6c 3c 7f  |.... ...P)..[l<.|
-00000040  71 13 4b f0 3e 1a 13 df  a0 a6 e3 15 a7 36 a2 40  |q.K.>........6.@|
-00000050  86 88 d4 63 c0                                    |...c.|
+00000030  16 03 03 00 20 0d 3c cf  6f 13 e3 73 d2 c5 05 06  |.... .<.o..s....|
+00000040  85 8d 41 e0 46 3b 25 e7  0a ae b9 00 1e c3 3f 61  |..A.F;%.......?a|
+00000050  82 2d e1 19 a4                                    |.-...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 c0 4e 72 ff 58  |.......... .Nr.X|
-00000010  40 70 90 8a ac 4e 94 28  ae 45 5e 2f 5f f4 c3 61  |@p...N.(.E^/_..a|
-00000020  64 5d d9 af 43 a0 c1 65  78 2a 5e                 |d]..C..ex*^|
+00000000  14 03 03 00 01 01 16 03  03 00 20 43 1a 5d c1 dc  |.......... C.]..|
+00000010  42 10 81 bc af 2d 40 82  fa 27 41 81 cc e5 97 99  |B....-@..'A.....|
+00000020  80 27 3a b5 db f5 8e 2a  6d 72 86                 |.':....*mr.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 e3 fb 93  b5 c4 17 c2 6a 9c 15 ca  |............j...|
-00000010  de ca c6 49 67 d6 59 65  4a ee d2 15 03 03 00 12  |...Ig.YeJ.......|
-00000020  8b f7 3f 3d ad 68 2b bf  f2 96 18 21 d0 0f ea e8  |..?=.h+....!....|
-00000030  a0 d9                                             |..|
+00000000  17 03 03 00 16 f1 0a 98  3b 2a 06 98 ad 46 f5 f7  |........;*...F..|
+00000010  42 cf 89 c0 d4 a7 08 df  bb dc 4d 15 03 03 00 12  |B.........M.....|
+00000020  9c d4 d2 a1 fb 38 98 31  7d ce 39 50 0b 58 d8 a8  |.....8.1}.9P.X..|
+00000030  3e 19                                             |>.|
index 0968c160a599e1a396531a9245d67795b4e098c5..e40999fb852cb7e442da4f268f01e436b77c4dcc 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 8d 42 b5 ca 09  |....Y...U...B...|
-00000010  22 3a a8 c0 09 57 81 1c  e9 40 20 14 a6 b5 6d c7  |":...W...@ ...m.|
-00000020  2a 62 69 7f 5f a8 e2 74  d5 c1 b0 20 9a bf c7 2c  |*bi._..t... ...,|
-00000030  b9 1b d5 45 8a a1 49 fa  0f 3b d2 74 da 6f ef 6a  |...E..I..;.t.o.j|
-00000040  87 75 9a be 04 8a 9e ef  7e ea d7 16 c0 09 00 00  |.u......~.......|
+00000000  16 03 03 00 59 02 00 00  55 03 03 08 a4 b1 ad 21  |....Y...U......!|
+00000010  3a 60 7a d3 3b 60 67 48  5d de da ff 3f a8 55 a9  |:`z.;`gH]...?.U.|
+00000020  c4 72 69 32 12 c1 d1 4e  d4 78 e1 20 6e 9f ed 1e  |.ri2...N.x. n...|
+00000030  50 9a 31 e2 ae e2 6a f4  01 cc 94 21 25 73 f3 a5  |P.1...j....!%s..|
+00000040  f6 28 b3 c6 6b c1 b3 2d  fc 0c d3 66 c0 09 00 00  |.(..k..-...f....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 1c 45  |*............ .E|
-00000280  5f 18 e9 5f 2f 0d 3b 3f  f2 a8 dc f8 15 1c 03 e4  |_.._/.;?........|
-00000290  c1 fa f8 f7 75 cb 74 17  cd 82 7d 26 8e 41 04 03  |....u.t...}&.A..|
-000002a0  00 8b 30 81 88 02 42 01  6c ae 9f 61 16 bb 03 50  |..0...B.l..a...P|
-000002b0  52 94 7f 89 59 92 a5 3e  74 54 97 7a f0 22 a5 7d  |R...Y..>tT.z.".}|
-000002c0  de 80 c4 6a 0d a0 cb 50  e1 aa 27 a9 44 4f 24 db  |...j...P..'.DO$.|
-000002d0  69 b2 d2 6c 6e 26 79 99  d8 31 9d 2d 47 26 f1 c6  |i..ln&y..1.-G&..|
-000002e0  42 25 f5 66 6b 03 7a 19  b1 02 42 00 f4 5c 98 a4  |B%.fk.z...B..\..|
-000002f0  d3 d7 af 36 42 cc 95 91  be 7e b1 3c 61 df a9 9c  |...6B....~.<a...|
-00000300  22 4d 22 82 e1 fa bc ff  8d b0 fe 3d 0e 5e d0 ef  |"M"........=.^..|
-00000310  d5 dc 62 88 9a f5 1b 66  1d d3 54 cc 4d 1d 2c ea  |..b....f..T.M.,.|
-00000320  bd 65 34 9a 15 b5 ad f6  7e 17 a5 96 c2 16 03 03  |.e4.....~.......|
+00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 ec f3  |*............ ..|
+00000280  2b 3b be 93 68 53 f2 ab  6c 97 5a fa 9b 8c bf eb  |+;..hS..l.Z.....|
+00000290  37 6f af d7 b8 02 f3 8c  0b f9 75 29 11 32 04 03  |7o........u).2..|
+000002a0  00 8b 30 81 88 02 42 01  9d 90 aa b3 19 d2 9d cf  |..0...B.........|
+000002b0  92 c1 64 05 89 db d0 dd  80 f3 a4 7e 09 ec 36 22  |..d........~..6"|
+000002c0  95 79 c4 36 0e 21 80 7d  4b 72 a5 38 a4 b0 a7 5f  |.y.6.!.}Kr.8..._|
+000002d0  fb ae f7 66 23 82 91 c2  f8 95 df 60 ce dc e8 1a  |...f#......`....|
+000002e0  3f 2b 2c fa 5e 58 67 98  78 02 42 00 fa 88 7f ae  |?+,.^Xg.x.B.....|
+000002f0  00 55 2c a1 c2 47 ed c8  11 74 64 e7 c6 30 63 fb  |.U,..G...td..0c.|
+00000300  bb 42 2a 02 9b 80 60 88  e7 3f af 17 a3 7f 1e f6  |.B*...`..?......|
+00000310  31 9c 1f 8c 89 e5 a0 b1  01 2a 4e d8 d2 1e 9f 11  |1........*N.....|
+00000320  f5 e3 35 38 3e b0 da 30  f1 fb ed e5 d1 16 03 03  |..58>..0........|
 00000330  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
 00000340  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000350  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000210  03 03 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
 00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 93 0f 00  |...._X.;t.......|
-00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 83 b1 39 05  |......0...B...9.|
-00000250  25 f1 1b 2b 55 c0 7e 56  e1 0e 33 bc 03 c7 0a 17  |%..+U.~V..3.....|
-00000260  b7 c2 b7 da ab 9d 5d 22  da 60 74 7d 85 5e 53 ff  |......]".`t}.^S.|
-00000270  57 4e c3 0a 47 fd e5 f6  dc 05 56 4c 7a 9f e4 5c  |WN..G.....VLz..\|
-00000280  04 97 80 61 d5 9f db a5  74 9b ec fc bf 02 42 01  |...a....t.....B.|
-00000290  27 f8 0e 21 c2 c2 68 72  82 1b 4b cf d8 0c 1a 09  |'..!..hr..K.....|
-000002a0  b0 f5 0f b9 3b e9 63 dc  68 33 5e 41 e2 2c a4 04  |....;.c.h3^A.,..|
-000002b0  ec ee 84 6d f3 28 fc 6d  c4 f1 04 8c 1d 38 6e e9  |...m.(.m.....8n.|
-000002c0  ae 0d 0a 82 0e 42 c4 42  e7 12 33 c5 38 4f 19 51  |.....B.B..3.8O.Q|
-000002d0  61 14 03 03 00 01 01 16  03 03 00 40 00 00 00 00  |a..........@....|
-000002e0  00 00 00 00 00 00 00 00  00 00 00 00 9e b0 80 10  |................|
-000002f0  4c da e3 cd 1e 56 e6 90  10 c5 ea d6 25 f9 34 31  |L....V......%.41|
-00000300  cd 42 60 5d ab 3b 13 05  48 cd f6 53 c3 b7 ea ea  |.B`].;..H..S....|
-00000310  30 f0 58 2d 17 3c 77 fb  a7 8f 9f a8              |0.X-.<w.....|
+00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 e6 0a ff de  |......0...B.....|
+00000250  af a6 d2 7a 5f 4e f8 eb  c8 19 74 53 5c e8 bc 2d  |...z_N....tS\..-|
+00000260  72 24 11 d2 11 ec ec cd  a1 9c 3d 10 a2 de f8 8b  |r$........=.....|
+00000270  22 98 d3 33 c2 13 3b 93  89 ae ca a6 a8 94 70 fe  |"..3..;.......p.|
+00000280  76 2f 04 bc ac fb 66 79  3b 76 7f 6d 96 02 42 01  |v/....fy;v.m..B.|
+00000290  df f6 30 14 7c 7e a1 0b  f6 b8 8b d7 75 b8 bd 0e  |..0.|~......u...|
+000002a0  63 8a bd 8b ec 75 70 db  d9 37 d7 53 f3 8b a2 ae  |c....up..7.S....|
+000002b0  60 96 69 74 eb bb 3d a6  9a 7d 46 51 73 ff 78 cf  |`.it..=..}FQs.x.|
+000002c0  7f 49 d9 27 5e 9f f9 d2  11 cc 0e e4 dc 04 fe d5  |.I.'^...........|
+000002d0  d2 14 03 03 00 01 01 16  03 03 00 40 00 00 00 00  |...........@....|
+000002e0  00 00 00 00 00 00 00 00  00 00 00 00 7a db 34 e9  |............z.4.|
+000002f0  98 f8 c1 f0 38 c3 33 22  5c c3 45 b0 a3 10 3c 77  |....8.3"\.E...<w|
+00000300  7f d2 06 c5 f8 13 b6 f4  ee 7e 53 0b 07 0b c3 c9  |.........~S.....|
+00000310  89 9a a9 bb 3b af 79 09  59 ce 10 41              |....;.y.Y..A|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 68 2a 2b af 97  |..........@h*+..|
-00000010  68 8d 96 ed 55 bc aa d2  d3 81 97 54 a1 01 88 7f  |h...U......T....|
-00000020  72 b7 3a 38 66 c2 53 9a  01 56 0d e0 02 b5 93 66  |r.:8f.S..V.....f|
-00000030  b3 93 74 e2 e0 c5 22 1c  0d 8f bb 7d e1 43 bf bd  |..t..."....}.C..|
-00000040  bc 69 2e 58 96 7b 39 f0  55 6f 1b                 |.i.X.{9.Uo.|
+00000000  14 03 03 00 01 01 16 03  03 00 40 18 c0 f3 96 7b  |..........@....{|
+00000010  45 91 6d 5b 1c 67 4f 37  74 b7 db 72 45 57 09 25  |E.m[.gO7t..rEW.%|
+00000020  4a 14 68 4d 78 6c c7 15  6a b1 57 e6 ff 53 c4 58  |J.hMxl..j.W..S.X|
+00000030  41 c5 6b 08 3c 5a 8c b9  04 d0 27 62 ee a6 e3 36  |A.k.<Z....'b...6|
+00000040  96 87 db 09 e3 88 d9 a2  0f 7d 9a                 |.........}.|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 a6 98 ea  d6 b2 81 83 18 5d 73 13  |.............]s.|
-00000020  dc e9 e9 bc 4c 1e a8 ec  a5 62 93 f6 b8 0c 0f f0  |....L....b......|
-00000030  91 6e 51 2c fe 15 03 03  00 30 00 00 00 00 00 00  |.nQ,.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 7f e8 f5 80 8e 27  |...............'|
-00000050  1b 31 aa d0 ec 91 51 d0  18 21 de e3 63 1f ee 80  |.1....Q..!..c...|
-00000060  bc db 2f 4f ce 26 46 ce  65 2e                    |../O.&F.e.|
+00000010  00 00 00 00 00 a6 c2 ef  07 bb 38 4a e4 8f 0c 12  |..........8J....|
+00000020  19 1a 96 62 22 57 57 a2  b5 b3 06 70 95 28 a7 f7  |...b"WW....p.(..|
+00000030  0d 42 69 37 7f 15 03 03  00 30 00 00 00 00 00 00  |.Bi7.....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 04 ed 3e 68 40 eb  |............>h@.|
+00000050  a0 7e 57 da 27 e7 f5 e8  6c e5 6d 58 c8 a5 18 47  |.~W.'...l.mX...G|
+00000060  92 5a 43 90 de 07 9e 9a  3b cc                    |.ZC.....;.|
index 995e9a9bc98aad973d500291a84967fff9cef4bd..f5fae453a86e3cbfef3c7ddf05a4895efe47926f 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 87 08 05 c4 11  |....Y...U.......|
-00000010  d3 bb ca 40 4a 0a 95 79  8c b9 82 54 6f e2 11 ba  |...@J..y...To...|
-00000020  bd 7b 0d e4 f4 64 0d 35  a0 66 0b 20 41 e2 af c4  |.{...d.5.f. A...|
-00000030  e0 db f1 52 6a 6b f3 77  0d 83 f7 00 d0 05 3f 3e  |...Rjk.w......?>|
-00000040  d8 3f d2 66 fa 19 3d 36  bd ff ae 13 c0 2f 00 00  |.?.f..=6...../..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 be ba ac 2a 81  |....Y...U.....*.|
+00000010  33 b1 6e 4d 8b 9b 29 f9  16 86 bc cd b2 03 50 72  |3.nM..).......Pr|
+00000020  91 9a 93 f9 e1 d6 27 55  8b b8 6c 20 84 c2 21 9e  |......'U..l ..!.|
+00000030  60 aa b3 f0 ec 2f 66 0d  59 31 02 08 9e 68 68 c0  |`..../f.Y1...hh.|
+00000040  58 9a 8e 6c 25 ce 4d e3  3f 9d dc 91 c0 2f 00 00  |X..l%.M.?..../..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 39 84 75 e0 64 4e 6d  |........ 9.u.dNm|
-000002d0  37 4a cd ae 78 6f d3 b5  bd 3e fb dc 9b f8 51 39  |7J..xo...>....Q9|
-000002e0  85 35 a2 11 4b 59 be 57  01 08 04 00 80 a1 dd a6  |.5..KY.W........|
-000002f0  f4 e0 89 8a c1 ff e6 20  1e cf 73 41 94 e6 4a 4f  |....... ..sA..JO|
-00000300  64 49 43 0e 53 90 61 31  92 a5 af 13 2e 00 2b e2  |dIC.S.a1......+.|
-00000310  61 6e 3f a1 9a e3 7d f6  79 0e cd f6 c1 84 e0 62  |an?...}.y......b|
-00000320  15 69 5a 94 8f af c5 c9  db b8 f4 4b 40 4c ea f7  |.iZ........K@L..|
-00000330  bb e9 cd f2 3a 00 c3 f1  c9 5e 43 67 36 c5 73 f1  |....:....^Cg6.s.|
-00000340  88 c1 6d 14 2f 92 63 ae  30 9d 3c 59 33 aa 78 62  |..m./.c.0.<Y3.xb|
-00000350  00 32 73 60 25 ed 4c 06  d4 ee 14 32 58 35 57 c6  |.2s`%.L....2X5W.|
-00000360  4c 10 3c 1b 16 6f f4 59  ad 52 74 42 0d 16 03 03  |L.<..o.Y.RtB....|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 82 89 54 65 64 97 8d  |........ ..Ted..|
+000002d0  e8 63 a2 5b 4f 16 56 7c  cf 8b 0a 75 46 52 7e b6  |.c.[O.V|...uFR~.|
+000002e0  99 2a e9 52 1f 11 46 85  36 08 04 00 80 cd a5 84  |.*.R..F.6.......|
+000002f0  ff 9a 79 b5 04 85 88 fb  1e 1c d6 6b 78 e8 4d a5  |..y........kx.M.|
+00000300  10 38 25 8e 8d de 71 51  b5 fd a6 2a f8 8b 5c 6d  |.8%...qQ...*..\m|
+00000310  1e 88 f7 d8 12 24 ff f7  7e dd 05 1c bf 71 7d 4f  |.....$..~....q}O|
+00000320  26 2f 2e 27 d8 e1 a8 8b  d2 42 2b a6 d9 4e e6 60  |&/.'.....B+..N.`|
+00000330  48 57 38 5d 3b f3 94 74  2c 8f ba e0 84 54 1c c0  |HW8];..t,....T..|
+00000340  10 51 a0 31 1a d0 ec 72  01 f1 d3 65 73 c7 40 25  |.Q.1...r...es.@%|
+00000350  af cd 10 18 29 2c 1a 52  e0 c9 a6 de 85 8c 96 e6  |....),.R........|
+00000360  7d 85 0a 64 86 59 39 25  8f 8c 36 4c 37 16 03 03  |}..d.Y9%..6L7...|
 00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
 00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
 00000210  03 03 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 93 0f 00  |...._X.;t.......|
-00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 cd 89 13 12  |......0...B.....|
-00000250  a4 7f e0 a5 f9 37 30 53  ed 49 39 ca 42 44 cf f0  |.....70S.I9.BD..|
-00000260  b3 ab 3f 70 eb ca 82 4d  9e a7 d5 47 0c df c2 fb  |..?p...M...G....|
-00000270  f3 92 6b 0f 21 92 06 6d  48 e7 ba 36 22 56 d2 f3  |..k.!..mH..6"V..|
-00000280  b7 28 00 ab 46 46 f5 32  b9 45 93 57 21 02 42 01  |.(..FF.2.E.W!.B.|
-00000290  37 7c d6 f3 bd eb fa 1c  9b c8 83 0b 5c 73 66 42  |7|..........\sfB|
-000002a0  0c cd 8d da 40 32 c6 35  26 46 be db 48 56 55 d2  |....@2.5&F..HVU.|
-000002b0  e9 33 6e e0 da b8 45 f8  24 f2 59 6e 4f 4a 34 e2  |.3n...E.$.YnOJ4.|
-000002c0  51 d7 0f 25 f0 ae 83 d5  fa cd 4f 4a e6 c5 82 3d  |Q..%......OJ...=|
-000002d0  a5 14 03 03 00 01 01 16  03 03 00 28 00 00 00 00  |...........(....|
-000002e0  00 00 00 00 fb 21 d8 50  53 e6 13 13 bc d4 f4 d4  |.....!.PS.......|
-000002f0  b5 f1 6c fe ed eb 15 ce  18 a1 3d cf 7f ae 40 d5  |..l.......=...@.|
-00000300  0c 91 41 69                                       |..Ai|
+00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 92 0f 00  |...._X.;t.......|
+00000240  00 8e 04 03 00 8a 30 81  87 02 41 72 16 75 7d 08  |......0...Ar.u}.|
+00000250  42 7b 33 e7 59 51 ef 3c  54 e7 81 e4 10 31 ab 5d  |B{3.YQ.<T....1.]|
+00000260  df 17 52 e0 a9 9f b5 43  e0 33 0e 52 b2 19 a2 a8  |..R....C.3.R....|
+00000270  0b b9 8b e3 0b 51 1d 65  c9 7b 7c 67 66 d4 98 77  |.....Q.e.{|gf..w|
+00000280  34 06 07 fc 8f 84 85 36  c3 fd f9 12 02 42 01 ad  |4......6.....B..|
+00000290  a7 25 ed c2 e8 2d c0 a3  12 0b 79 b2 32 e2 c3 70  |.%...-....y.2..p|
+000002a0  2b 5d 99 1b 24 45 60 68  8b b3 28 5c 96 1a 26 89  |+]..$E`h..(\..&.|
+000002b0  24 53 20 f5 fc 6f 98 b1  64 0b ba f5 ad ea 1e 33  |$S ..o..d......3|
+000002c0  4f 64 fd 43 37 80 24 f0  7d e3 7d 63 76 7e 60 e3  |Od.C7.$.}.}cv~`.|
+000002d0  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
+000002e0  00 00 00 27 0b ff 3a 92  88 b6 86 86 0e c2 f5 94  |...'..:.........|
+000002f0  d5 29 a4 6d 95 12 e1 d8  ec d9 a4 3c 1c db 52 76  |.).m.......<..Rv|
+00000300  2a 72 29                                          |*r)|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 36 f9 5d 31 f6  |..........(6.]1.|
-00000010  a2 62 16 db 9b ea 79 28  52 1b 06 e1 59 39 f3 4a  |.b....y(R...Y9.J|
-00000020  67 77 6d 2b 98 80 9d e9  80 55 53 82 37 17 61 65  |gwm+.....US.7.ae|
-00000030  f5 fa 06                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 b8 e9 dd 30 75  |..........(...0u|
+00000010  40 7d 71 76 db 9a 95 92  81 02 3a 9e 36 d5 15 ca  |@}qv......:.6...|
+00000020  5d 63 a1 0f 8c 53 c9 1c  37 56 b2 0d 54 15 a2 dc  |]c...S..7V..T...|
+00000030  03 d6 2e                                          |...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 a0 3f 7e  |..............?~|
-00000010  ce c3 cf 73 0f 2f 9d ba  5d 2e 3b 84 8b ef cd c4  |...s./..].;.....|
-00000020  2a 31 32 15 03 03 00 1a  00 00 00 00 00 00 00 02  |*12.............|
-00000030  58 7e 4f 75 06 0d 16 f5  6d 06 0f af 5a 40 9b bd  |X~Ou....m...Z@..|
-00000040  79 f4                                             |y.|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 01 85 96  |................|
+00000010  67 b2 4b d3 e3 27 80 9f  2d a8 f4 bf 47 91 58 6e  |g.K..'..-...G.Xn|
+00000020  47 d8 98 15 03 03 00 1a  00 00 00 00 00 00 00 02  |G...............|
+00000030  36 54 82 d1 a2 0f 2a c3  53 f6 09 d0 5c 78 46 97  |6T....*.S...\xF.|
+00000040  20 41                                             | A|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519
new file mode 100644 (file)
index 0000000..e415b12
--- /dev/null
@@ -0,0 +1,119 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
+00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
+00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
+00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 59 02 00 00  55 03 03 1c 50 4e 50 35  |....Y...U...PNP5|
+00000010  51 02 a9 62 ba 82 a5 d3  fa 40 4e f3 28 9b 50 a6  |Q..b.....@N.(.P.|
+00000020  f0 75 30 e9 fe be a3 42  1d 1c f5 20 9e 88 46 57  |.u0....B... ..FW|
+00000030  c5 b4 a3 a3 fc 88 bb e0  1c 5e ea 77 a0 75 93 5a  |.........^.w.u.Z|
+00000040  6d 4c c7 57 6f 3a 05 af  3f 3f ac 75 cc a8 00 00  |mL.Wo:..??.u....|
+00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
+00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
+00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
+00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
+00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
+000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
+000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
+000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
+000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
+000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
+000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
+00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
+00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
+00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
+00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
+00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
+00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
+00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
+00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
+00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
+00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
+000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
+000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
+000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
+000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
+000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
+000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
+00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
+00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
+00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
+00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
+00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
+00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
+00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
+00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
+00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
+00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
+000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
+000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 82 c1 f5 7b 68 eb 7a  |........ ...{h.z|
+000002d0  cf 02 c9 95 28 4b 31 76  a9 84 93 a9 1f 5b f4 2a  |....(K1v.....[.*|
+000002e0  5c a5 31 94 5f f0 e0 ed  2e 08 04 00 80 7a 99 38  |\.1._........z.8|
+000002f0  7f d0 25 4b bf a9 e0 2b  db ce 17 9d 30 4b 82 9e  |..%K...+....0K..|
+00000300  b1 50 84 fc dd b0 a8 5c  39 20 00 40 5b 92 dc 7c  |.P.....\9 .@[..||
+00000310  25 3b 53 7d 5a 4b ad 05  6f 3a 4f e5 84 b6 3a e2  |%;S}ZK..o:O...:.|
+00000320  fb bf cb c8 94 39 a5 28  ad c8 5f 94 53 90 0e 61  |.....9.(.._.S..a|
+00000330  af f2 92 2c 3b ec 3c bf  1d d3 8b a5 65 58 5b bf  |...,;.<.....eX[.|
+00000340  5a 21 3d cd 40 7c 9e 1d  e9 62 3c 67 71 7c ec b4  |Z!=.@|...b<gq|..|
+00000350  25 d0 4a 6a 85 1d c4 e8  44 d6 25 1a 2c 29 ae d7  |%.Jj....D.%.,)..|
+00000360  d7 24 fb 5a 62 f7 50 52  12 1b c7 3e b0 16 03 03  |.$.Zb.PR...>....|
+00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
+00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
+000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
+000003b0  04 0e 00 00 00                                    |.....|
+>>> Flow 3 (client to server)
+00000000  16 03 03 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
+00000010  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 17 d1 81  |...0............|
+00000020  93 be 2a 8c 21 20 10 25  15 e8 34 23 4f 30 05 06  |..*.! .%..4#O0..|
+00000030  03 2b 65 70 30 12 31 10  30 0e 06 03 55 04 0a 13  |.+ep0.1.0...U...|
+00000040  07 41 63 6d 65 20 43 6f  30 1e 17 0d 31 39 30 35  |.Acme Co0...1905|
+00000050  31 36 32 31 35 34 32 36  5a 17 0d 32 30 30 35 31  |16215426Z..20051|
+00000060  35 32 31 35 34 32 36 5a  30 12 31 10 30 0e 06 03  |5215426Z0.1.0...|
+00000070  55 04 0a 13 07 41 63 6d  65 20 43 6f 30 2a 30 05  |U....Acme Co0*0.|
+00000080  06 03 2b 65 70 03 21 00  0b e0 b5 60 b5 e2 79 30  |..+ep.!....`..y0|
+00000090  3d be e3 1e e0 50 b1 04  c8 6d c7 78 6c 69 2f c5  |=....P...m.xli/.|
+000000a0  14 ad 9a 63 6f 79 12 91  a3 4d 30 4b 30 0e 06 03  |...coy...M0K0...|
+000000b0  55 1d 0f 01 01 ff 04 04  03 02 05 a0 30 13 06 03  |U...........0...|
+000000c0  55 1d 25 04 0c 30 0a 06  08 2b 06 01 05 05 07 03  |U.%..0...+......|
+000000d0  02 30 0c 06 03 55 1d 13  01 01 ff 04 02 30 00 30  |.0...U.......0.0|
+000000e0  16 06 03 55 1d 11 04 0f  30 0d 82 0b 65 78 61 6d  |...U....0...exam|
+000000f0  70 6c 65 2e 63 6f 6d 30  05 06 03 2b 65 70 03 41  |ple.com0...+ep.A|
+00000100  00 fc 19 17 2a 94 a5 31  fa 29 c8 2e 7f 5b a0 5d  |....*..1.)...[.]|
+00000110  8a 4e 34 40 39 d6 b3 10  dc 19 fe a0 22 71 b3 f5  |.N4@9......."q..|
+00000120  8f a1 58 0d cd f4 f1 85  24 bf e6 3d 14 df df ed  |..X.....$..=....|
+00000130  0e e1 17 d8 11 a2 60 d0  8a 37 23 2a c2 46 aa 3a  |......`..7#*.F.:|
+00000140  08 16 03 03 00 25 10 00  00 21 20 2f e5 7d a3 47  |.....%...! /.}.G|
+00000150  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+00000160  c4 cf c2 ed 90 99 5f 58  cb 3b 74 16 03 03 00 48  |......_X.;t....H|
+00000170  0f 00 00 44 08 07 00 40  af a6 03 14 53 7a 4f 75  |...D...@....SzOu|
+00000180  9d cc 2f e3 e7 2a 51 16  16 b0 1d 28 e0 2a 59 f0  |../..*Q....(.*Y.|
+00000190  3c df cc 18 dd b8 ef d1  9f 9d 03 8e 59 00 27 d1  |<...........Y.'.|
+000001a0  39 2f 3b 33 53 1f b2 f0  22 1d 06 f6 50 0b a7 98  |9/;3S..."...P...|
+000001b0  cc fa 78 53 bf 8e ff 0b  14 03 03 00 01 01 16 03  |..xS............|
+000001c0  03 00 20 e5 81 3e a3 34  29 52 14 19 49 cf 04 82  |.. ..>.4)R..I...|
+000001d0  8b e7 83 aa 6c db 96 ec  97 29 b4 a3 db 87 21 2e  |....l....)....!.|
+000001e0  a5 c0 66                                          |..f|
+>>> Flow 4 (server to client)
+00000000  14 03 03 00 01 01 16 03  03 00 20 84 67 d4 ce cf  |.......... .g...|
+00000010  fb 54 2c dc f7 53 31 8a  aa 03 60 37 3d 33 f2 79  |.T,..S1...`7=3.y|
+00000020  d0 65 2e 3f 0e f9 1a d3  6e 6d 8e                 |.e.?....nm.|
+>>> Flow 5 (client to server)
+00000000  17 03 03 00 16 e5 b7 4c  92 05 fc 81 cf 11 ef cd  |.......L........|
+00000010  0f 4b df ef a1 54 ae 26  4e ec aa 15 03 03 00 12  |.K...T.&N.......|
+00000020  0a f3 5b 06 63 84 a6 eb  d4 73 94 db fe d8 e0 ae  |..[.c....s......|
+00000030  d6 fc                                             |..|
index e6791c0da476fa505d6399777946b3861814ba67..22115d5565126f6a791d1ed2a10a7152998879ed 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 10 af 03 5d d2  |....Y...U.....].|
-00000010  4d c8 e6 2e 88 08 57 65  8c c6 fa af b5 e7 bd 49  |M.....We.......I|
-00000020  4c d0 dc 04 e6 14 e0 83  40 79 dd 20 5a 11 db 9d  |L.......@y. Z...|
-00000030  c0 10 71 f5 27 89 5a 7e  17 80 9b 26 39 09 cc ad  |..q.'.Z~...&9...|
-00000040  be 1a 24 37 d7 08 a2 e1  fe 75 54 71 c0 30 00 00  |..$7.....uTq.0..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 41 6b 69 65 47  |....Y...U..AkieG|
+00000010  8c 15 2f d5 6d 1a 3d 0c  ff 56 ad 42 31 6c 1f 86  |../.m.=..V.B1l..|
+00000020  06 62 e3 e4 18 9c 5c 47  9e 8c 66 20 af ba 7c 62  |.b....\G..f ..|b|
+00000030  c2 32 f4 49 f1 8d f4 ba  7a 51 23 32 46 96 7e b8  |.2.I....zQ#2F.~.|
+00000040  f0 2c ae 0a d4 04 49 16  4a 64 79 c8 c0 30 00 00  |.,....I.Jdy..0..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 42 0e 6e 06 83 b5 4e  |........ B.n...N|
-000002d0  d9 f5 45 2b 82 1c 30 c7  65 5d 40 44 10 b8 63 aa  |..E+..0.e]@D..c.|
-000002e0  6f ef 92 13 4b 8d fd 1b  0e 08 04 00 80 63 8f 8a  |o...K........c..|
-000002f0  f3 6a 42 b9 e2 6d c3 06  c5 04 2d df 4b 06 0f b7  |.jB..m....-.K...|
-00000300  e5 36 d2 5f be aa 36 83  82 eb e8 06 e9 a5 b8 47  |.6._..6........G|
-00000310  db 43 fb 7d ab 0b 3a db  13 df ab 62 16 7d 80 57  |.C.}..:....b.}.W|
-00000320  4b 07 79 f6 d9 9c ad d4  1b b5 cd cb 92 44 bc 74  |K.y..........D.t|
-00000330  d0 f3 67 0c e6 1a 5a 18  53 bc bc 65 19 7a 13 f3  |..g...Z.S..e.z..|
-00000340  78 36 e7 14 7d 36 6d 85  ea d7 96 18 e2 bc 1d af  |x6..}6m.........|
-00000350  58 50 f3 f7 a3 27 49 a4  89 10 e2 cc 2d db c5 4a  |XP...'I.....-..J|
-00000360  4c 24 3e 9b 70 17 ae 2f  f9 d0 96 8f b0 16 03 03  |L$>.p../........|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 9e 80 b0 95 af 3b 4c  |........ .....;L|
+000002d0  e7 fb 97 65 d0 36 8f 97  88 0d 3b 5d a0 21 a8 78  |...e.6....;].!.x|
+000002e0  81 39 4c 80 5c 58 52 6e  68 08 04 00 80 41 c6 e7  |.9L.\XRnh....A..|
+000002f0  c9 48 c1 be 17 a6 a3 3c  3a de c8 c8 86 6e 70 37  |.H.....<:....np7|
+00000300  2f d3 ed 8a dd 3a 73 5c  b5 23 49 a8 4a fe e9 2b  |/....:s\.#I.J..+|
+00000310  4e 99 43 b8 e8 05 f9 fe  90 bf 74 be 92 3d d8 a3  |N.C.......t..=..|
+00000320  c2 b2 38 80 1c 82 1f 35  e1 2e 04 bf a6 0a ec 3f  |..8....5.......?|
+00000330  81 4c a2 2b 19 8f 91 4c  51 b5 0d 52 1e 69 84 0a  |.L.+...LQ..R.i..|
+00000340  b0 cb de 41 1a bd a6 3d  50 9a ca d2 c0 26 11 3f  |...A...=P....&.?|
+00000350  cd 80 b4 2d 6e 03 f2 c5  2b cd 9c b6 a4 d8 e6 cf  |...-n...+.......|
+00000360  ec 1d 7a a9 17 59 6c 89  17 2f 64 0a 7c 16 03 03  |..z..Yl../d.|...|
 00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
 00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 0d 7c 62 81 7d fc c9  |..........|b.}..|
-00000240  d4 4c 3e dd 4c b0 fe ce  43 90 27 39 2c be 01 24  |.L>.L...C.'9,..$|
-00000250  bc 55 f5 87 d7 31 00 47  6c 49 ce 82 db 0e 3d af  |.U...1.GlI....=.|
-00000260  a5 f3 4a 28 c9 f7 0b d3  68 e2 b8 de 2d b3 d8 5d  |..J(....h...-..]|
-00000270  c6 6d da 2f 74 c4 0a f4  93 ed 58 10 00 94 55 d6  |.m./t.....X...U.|
-00000280  c8 62 d0 35 20 cc 90 dc  70 bf 1d 6f c9 76 10 de  |.b.5 ...p..o.v..|
-00000290  c2 50 ba e9 b4 bd 80 d7  01 b2 aa 1d 27 03 0f ad  |.P..........'...|
-000002a0  39 46 ec 30 b0 fb 68 0f  1f b3 4c 0c 26 70 4c 33  |9F.0..h...L.&pL3|
-000002b0  bf 18 79 81 11 c0 7f b9  ae 14 03 03 00 01 01 16  |..y.............|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 a2 ee 76 00  |...(..........v.|
-000002d0  77 2b 70 9d f7 0a 11 b4  25 00 07 92 d4 4c 9c 68  |w+p.....%....L.h|
-000002e0  64 54 11 6d 39 46 6c ea  20 0c 15 ed              |dT.m9Fl. ...|
+00000230  88 0f 00 00 84 04 01 00  80 29 22 23 51 c5 71 4a  |.........)"#Q.qJ|
+00000240  32 eb 72 6b f2 c8 46 99  df fe d5 a7 0c 55 3c 40  |2.rk..F......U<@|
+00000250  e1 1e 09 4c 40 83 8a 0d  67 27 63 21 d2 36 66 8f  |...L@...g'c!.6f.|
+00000260  cb 97 4b 87 8a ed 9a 44  81 97 34 4b 9b 12 27 f5  |..K....D..4K..'.|
+00000270  d8 63 9b 1f cf d7 b4 2b  54 99 86 2d cd 36 9f 3e  |.c.....+T..-.6.>|
+00000280  92 af 5a a6 0c 8a e0 e3  d3 b9 9b 47 ea 67 61 69  |..Z........G.gai|
+00000290  d8 c1 86 1d fd 43 d4 1f  5c f5 48 d8 4a 97 a7 0f  |.....C..\.H.J...|
+000002a0  57 59 b0 5f e8 24 3f 9e  1d 96 3d 4b be 9c fa e3  |WY._.$?...=K....|
+000002b0  3b 34 7e aa 67 d7 cc ea  78 14 03 03 00 01 01 16  |;4~.g...x.......|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 33 b3 7b c9  |...(........3.{.|
+000002d0  3f e8 7d 08 3d 65 a3 22  fa e3 04 79 d9 9f 54 a3  |?.}.=e."...y..T.|
+000002e0  45 e7 64 b2 5d 95 cf dd  88 cc ba 0b              |E.d.].......|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 f5 f7 fe 25 12  |..........(...%.|
-00000010  d8 e2 d9 ee b3 c8 02 a9  6e d9 80 ee 7b 7e 95 1f  |........n...{~..|
-00000020  8e 97 a6 5f e8 4c ee 67  e9 a1 43 ab 0e 17 ce 92  |..._.L.g..C.....|
-00000030  7c 03 0f                                          ||..|
+00000000  14 03 03 00 01 01 16 03  03 00 28 7e 38 ab 82 0c  |..........(~8...|
+00000010  fd fa b9 83 3e 77 ed 22  b5 9d d3 c1 ca cd 18 c5  |....>w."........|
+00000020  1c 01 a0 b8 8b 96 20 92  7b bd 0a 33 ee fe be 75  |...... .{..3...u|
+00000030  95 6e 0c                                          |.n.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 4c 67 fb  |.............Lg.|
-00000010  76 75 0d a4 56 d5 9c 1a  6d 7d 94 06 df 6d 05 98  |vu..V...m}...m..|
-00000020  39 be 1e 15 03 03 00 1a  00 00 00 00 00 00 00 02  |9...............|
-00000030  31 e3 f4 a1 b7 0e cc 48  17 a6 69 4d ba 43 a0 2d  |1......H..iM.C.-|
-00000040  12 a2                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 9d f0 cd  |................|
+00000010  53 8d 1a 45 ae 4a e4 01  97 dd ac f1 00 d3 aa b6  |S..E.J..........|
+00000020  bf c9 bc 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  aa 1b 41 d5 f5 68 41 b8  32 94 9b 23 f8 60 7b 60  |..A..hA.2..#.`{`|
+00000040  2c 8a                                             |,.|
index 06a9be85a026175faff5f26ff25a14376b5f7a24..db82b3837eafa9b88b208ec6c479cb090a1e103f 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 69 98 98 c5 21  |....Y...U..i...!|
-00000010  2e b7 a6 8e ba d1 11 b4  0a 84 ad 33 b9 8c 81 d7  |...........3....|
-00000020  26 ba 77 32 24 e5 c2 95  5f d2 b8 20 23 79 50 e0  |&.w2$..._.. #yP.|
-00000030  59 94 e1 05 47 58 ce a0  52 32 3f 96 1a e5 d8 15  |Y...GX..R2?.....|
-00000040  ec ae c9 51 a1 1c 19 e0  ac 40 28 9d c0 09 00 00  |...Q.....@(.....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 59 e6 a5 3d 5a  |....Y...U..Y..=Z|
+00000010  bf 25 a3 16 e7 e3 da cb  ac b7 11 09 0a 1a 8a c5  |.%..............|
+00000020  33 a2 a6 58 12 27 cd 52  15 28 c9 20 23 9a f5 d3  |3..X.'.R.(. #...|
+00000030  d4 df 49 1d 01 87 12 36  03 c6 36 17 39 d0 db 62  |..I....6..6.9..b|
+00000040  22 48 7e 57 20 ab a3 7c  b0 53 7e f1 c0 09 00 00  |"H~W ..|.S~.....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 b8 1d  |*............ ..|
-00000280  dd 31 88 3e 51 9e d8 b3  7f f0 93 7c 77 70 79 2c  |.1.>Q......|wpy,|
-00000290  cb 21 d3 b8 8d 3d 65 33  2b a0 0d bb 5f 6a 04 03  |.!...=e3+..._j..|
-000002a0  00 8b 30 81 88 02 42 01  50 71 c1 68 9b a3 b3 7f  |..0...B.Pq.h....|
-000002b0  ab 3f b0 32 d8 57 36 db  3f e5 5b 26 36 51 ed 89  |.?.2.W6.?.[&6Q..|
-000002c0  33 a5 e3 e3 49 2b ac d7  b2 9c 3f 6b 4d 8e 21 3d  |3...I+....?kM.!=|
-000002d0  f6 bc 22 af 0a 48 f0 14  ff ed 14 95 16 e3 45 b3  |.."..H........E.|
-000002e0  b3 e7 c2 09 a5 e9 12 a1  4b 02 42 01 35 34 64 1c  |........K.B.54d.|
-000002f0  d3 28 48 66 82 f3 93 8e  36 0b f7 ac ad f7 f5 4f  |.(Hf....6......O|
-00000300  e5 fc b7 a8 a3 f0 fb 28  70 9e 36 bc c3 82 1b 22  |.......(p.6...."|
-00000310  ef 95 ab 70 28 07 0d aa  c0 42 d6 c6 0e ed 37 d7  |...p(....B....7.|
-00000320  a6 a0 75 e6 db 03 b7 3c  61 26 8a 47 e1 16 03 03  |..u....<a&.G....|
-00000330  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000340  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000350  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-00000360  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-00000370  04 0e 00 00 00                                    |.....|
+00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 a7 6b  |*............ .k|
+00000280  75 97 e7 04 a7 19 99 af  c7 73 72 82 59 7d 16 46  |u........sr.Y}.F|
+00000290  de 80 c2 d3 36 c7 e8 42  89 ca 8d db 11 39 04 03  |....6..B.....9..|
+000002a0  00 8a 30 81 87 02 41 73  4f fe e2 00 9d bf 60 0a  |..0...AsO.....`.|
+000002b0  36 0b 97 8a fc 3e 8c 1d  ac ff a2 0b 7a dc 8d 2f  |6....>......z../|
+000002c0  d7 90 da 18 a0 14 8a 7c  51 4c a6 ae ec 13 ee 5e  |.......|QL.....^|
+000002d0  1a 60 aa 2f 5a d2 05 48  fb bb bb 3a 1a dc fa 21  |.`./Z..H...:...!|
+000002e0  df 7b 6d 83 23 d6 62 0f  02 42 01 7f 5a 36 6d f4  |.{m.#.b..B..Z6m.|
+000002f0  0d f5 d0 6f d9 71 52 f8  eb e3 ed 7c 40 fd 64 14  |...o.qR....|@.d.|
+00000300  c1 31 4d 4b 78 70 5d 9f  61 18 3b 87 01 10 94 e5  |.1MKxp].a.;.....|
+00000310  7b 83 34 2d cd 90 50 db  10 62 8d 36 40 45 20 c0  |{.4-..P..b.6@E .|
+00000320  db ce de 5e b3 63 de 60  db bb fe be 16 03 03 00  |...^.c.`........|
+00000330  3a 0d 00 00 36 03 01 02  40 00 2e 04 03 05 03 06  |:...6...@.......|
+00000340  03 08 07 08 08 08 09 08  0a 08 0b 08 04 08 05 08  |................|
+00000350  06 04 01 05 01 06 01 03  03 02 03 03 01 02 01 03  |................|
+00000360  02 02 02 04 02 05 02 06  02 00 00 16 03 03 00 04  |................|
+00000370  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 0a f0 58 cc 8a d0 1c  |...........X....|
-00000240  77 22 05 20 40 d3 74 f8  af d9 17 ed 01 61 5e c2  |w". @.t......a^.|
-00000250  9d 3a 53 ce 55 c6 11 9c  63 01 14 97 38 5f d8 17  |.:S.U...c...8_..|
-00000260  68 6f ee 09 73 42 23 dc  40 f8 4a 41 4d ca c8 98  |ho..sB#.@.JAM...|
-00000270  65 09 22 ca cd 27 00 8b  27 36 8a f9 1c 07 7f 3b  |e."..'..'6.....;|
-00000280  98 46 2e fc 50 8e ca 4c  0e 2a f0 c4 e5 87 e2 24  |.F..P..L.*.....$|
-00000290  46 8b 3b 03 d3 03 78 f1  76 f5 14 12 c1 63 f7 21  |F.;...x.v....c.!|
-000002a0  e7 27 17 ce 2d a6 eb 50  ef e4 aa 32 14 89 f4 02  |.'..-..P...2....|
-000002b0  02 b7 9b 47 27 ca 56 5b  32 14 03 03 00 01 01 16  |...G'.V[2.......|
+00000230  88 0f 00 00 84 04 01 00  80 88 59 ec 09 a4 c9 5e  |..........Y....^|
+00000240  37 b4 e3 04 71 52 1a 5a  6d d6 9b f6 09 14 01 c2  |7...qR.Zm.......|
+00000250  3e 07 19 2f ec 15 d9 5b  12 6a 6e de 78 a3 ac 58  |>../...[.jn.x..X|
+00000260  40 44 f2 66 0a 12 a5 62  37 8b af 5a 3a 20 be f2  |@D.f...b7..Z: ..|
+00000270  6f 43 c8 00 69 21 c8 fd  b0 cf 00 74 c3 96 a0 8b  |oC..i!.....t....|
+00000280  6f ce c1 09 e6 90 1d 8e  53 40 b8 44 83 b9 46 9c  |o.......S@.D..F.|
+00000290  78 3b c1 0a 36 68 a5 04  e8 b5 ed 6d 7d 09 21 8c  |x;..6h.....m}.!.|
+000002a0  0e 00 0c 5e d0 2b 47 c9  f6 31 f6 8f 7b b6 2d 8d  |...^.+G..1..{.-.|
+000002b0  ec 4e c2 0d 08 c5 1b 26  b6 14 03 03 00 01 01 16  |.N.....&........|
 000002c0  03 03 00 40 00 00 00 00  00 00 00 00 00 00 00 00  |...@............|
-000002d0  00 00 00 00 5e ab 60 05  38 88 e6 d3 ba fd 13 2a  |....^.`.8......*|
-000002e0  8a 17 c8 6e 54 d4 4e fd  c4 12 87 c4 20 ef de 62  |...nT.N..... ..b|
-000002f0  fd d3 50 6f 5f 6b 9d b2  00 aa 5a ab 2c d1 3d 39  |..Po_k....Z.,.=9|
-00000300  46 20 ab d7                                       |F ..|
+000002d0  00 00 00 00 e7 64 7d 04  bb bf dd 2a ac fd 96 81  |.....d}....*....|
+000002e0  25 d8 3e 6c 1d 53 c7 79  31 4d 13 c3 71 d3 da c0  |%.>l.S.y1M..q...|
+000002f0  f8 74 11 bb 6b 9d 62 66  ed f0 97 ab 43 fe 12 cb  |.t..k.bf....C...|
+00000300  da 8d c2 4b                                       |...K|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 d7 80 4d 81 26  |..........@..M.&|
-00000010  8f 46 5b b4 63 56 cd bd  a6 ca 31 ba 8e b8 5b a2  |.F[.cV....1...[.|
-00000020  47 a3 ef 5f ca a2 6a af  d2 2c f9 bb c9 1b 20 fc  |G.._..j..,.... .|
-00000030  a1 78 ca 7e 79 09 66 08  2c cb 0c a5 a3 35 01 ed  |.x.~y.f.,....5..|
-00000040  90 90 3d 32 f3 7b 30 25  ca 5c 66                 |..=2.{0%.\f|
+00000000  14 03 03 00 01 01 16 03  03 00 40 35 ee 36 65 9a  |..........@5.6e.|
+00000010  e5 ac c7 30 18 b6 ff f9  fd fa 66 88 a7 73 be ba  |...0......f..s..|
+00000020  d5 89 59 26 cf 2d 8d 31  48 f0 fb 09 c1 66 ef eb  |..Y&.-.1H....f..|
+00000030  94 30 b7 47 71 a1 cb 03  34 37 14 f5 76 14 13 a9  |.0.Gq...47..v...|
+00000040  6f d7 4d 59 c1 63 f8 db  8b 74 36                 |o.MY.c...t6|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 58 dc 0e  2b 4a 58 05 aa 22 cb 21  |.....X..+JX..".!|
-00000020  1c 6b 93 40 ab 6b 99 aa  ae c0 e0 f8 31 22 a3 1b  |.k.@.k......1"..|
-00000030  4a 98 bc 70 08 15 03 03  00 30 00 00 00 00 00 00  |J..p.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 8a 7b b8 60 83 23  |...........{.`.#|
-00000050  53 04 cf 14 b7 cf a9 d8  70 51 fe 92 f3 9c 25 6a  |S.......pQ....%j|
-00000060  bf 43 e0 bd ca 33 33 6c  30 dc                    |.C...33l0.|
+00000010  00 00 00 00 00 19 16 39  bc a3 30 b5 1d ae e5 a9  |.......9..0.....|
+00000020  74 89 1e d1 77 86 8f 85  55 fa af cb 0a 94 45 f4  |t...w...U.....E.|
+00000030  a9 fa 21 c5 54 15 03 03  00 30 00 00 00 00 00 00  |..!.T....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 40 17 27 41 8c ae  |..........@.'A..|
+00000050  74 59 34 f0 2e 72 34 4e  98 6e d8 da 17 07 b3 14  |tY4..r4N.n......|
+00000060  d8 c8 2c ad b6 3e 44 5a  3e d7                    |..,..>DZ>.|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled b/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled
deleted file mode 100644 (file)
index 71d26ea..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
-00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
-00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
-00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
-00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
-00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 05 c1 62 2b 2f  |....Y...U....b+/|
-00000010  12 46 4d c5 47 61 bd 43  6d bb 3a 60 42 c1 cf da  |.FM.Ga.Cm.:`B...|
-00000020  47 96 0a 11 35 f0 71 d8  f6 39 69 20 0f 9c c1 3f  |G...5.q..9i ...?|
-00000030  9c 68 e7 86 13 7c 1f 83  6b 56 39 ee 0d c0 82 0b  |.h...|..kV9.....|
-00000040  24 1b 8a 39 a6 dc bf 57  79 27 02 e4 c0 2f 00 00  |$..9...Wy'.../..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 94 54 54 4c 52 a7 a5  |........ .TTLR..|
-000002d0  c0 01 ed 59 bf 46 03 59  25 3b 57 f8 24 99 1b dc  |...Y.F.Y%;W.$...|
-000002e0  f6 f4 1d 42 0e 2e c3 7c  02 08 04 00 80 5a 42 35  |...B...|.....ZB5|
-000002f0  78 c8 a9 37 6f 61 a4 ef  3a a3 12 03 f7 ee 44 be  |x..7oa..:.....D.|
-00000300  8b c9 52 4f de db f5 1e  9c c8 33 32 3c 0a 9e d6  |..RO......32<...|
-00000310  32 bf 2e 12 f7 b0 9b 15  dc eb 24 6e d6 f2 ad 5d  |2.........$n...]|
-00000320  9e 77 c4 a7 7a a1 a0 13  0b 90 b4 aa 3e 51 a1 3d  |.w..z.......>Q.=|
-00000330  71 09 15 84 1c c5 98 bb  12 db 11 e2 4c 2c d1 a9  |q...........L,..|
-00000340  5a ed 8e fb c6 ae ec d5  6d ec d8 d8 2a a7 23 ae  |Z.......m...*.#.|
-00000350  d7 d2 03 d0 23 8a 21 ac  7e 56 b4 23 7f c6 2a 72  |....#.!.~V.#..*r|
-00000360  85 0b 6d 6c 9d 6f ad ee  15 20 d9 2b b9 16 03 03  |..ml.o... .+....|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
-00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
-00000020  c1 89 65 83 55 6f dc 0b  c9 b9 93 9f e9 bc 30 0d  |..e.Uo........0.|
-00000030  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 12 31  |..*.H........0.1|
-00000040  10 30 0e 06 03 55 04 0a  13 07 41 63 6d 65 20 43  |.0...U....Acme C|
-00000050  6f 30 1e 17 0d 31 36 30  38 31 37 32 31 35 32 33  |o0...16081721523|
-00000060  31 5a 17 0d 31 37 30 38  31 37 32 31 35 32 33 31  |1Z..170817215231|
-00000070  5a 30 12 31 10 30 0e 06  03 55 04 0a 13 07 41 63  |Z0.1.0...U....Ac|
-00000080  6d 65 20 43 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |me Co0..0...*.H.|
-00000090  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-000000a0  81 00 ba 6f aa 86 bd cf  bf 9f f2 ef 5c 94 60 78  |...o........\.`x|
-000000b0  6f e8 13 f2 d1 96 6f cd  d9 32 6e 22 37 ce 41 f9  |o.....o..2n"7.A.|
-000000c0  ca 5d 29 ac e1 27 da 61  a2 ee 81 cb 10 c7 df 34  |.])..'.a.......4|
-000000d0  58 95 86 e9 3d 19 e6 5c  27 73 60 c8 8d 78 02 f4  |X...=..\'s`..x..|
-000000e0  1d a4 98 09 a3 19 70 69  3c 25 62 66 2a ab 22 23  |......pi<%bf*."#|
-000000f0  c5 7b 85 38 4f 2e 09 73  32 a7 bd 3e 9b ad ca 84  |.{.8O..s2..>....|
-00000100  07 e6 0f 3a ff 77 c5 9d  41 85 00 8a b6 9b ee b0  |...:.w..A.......|
-00000110  a4 3f 2d 4c 4c e6 42 3e  bb 51 c8 dd 48 54 f4 0c  |.?-LL.B>.Q..HT..|
-00000120  8e 47 02 03 01 00 01 a3  46 30 44 30 0e 06 03 55  |.G......F0D0...U|
-00000130  1d 0f 01 01 ff 04 04 03  02 05 a0 30 13 06 03 55  |...........0...U|
-00000140  1d 25 04 0c 30 0a 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-00000150  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 0f  |0...U.......0.0.|
-00000160  06 03 55 1d 11 04 08 30  06 87 04 7f 00 00 01 30  |..U....0.......0|
-00000170  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
-00000180  81 00 46 ab 44 a2 fb 28  54 f8 5a 67 f8 62 94 f1  |..F.D..(T.Zg.b..|
-00000190  9a b2 18 9e f2 b1 de 1d  7e 6f 76 95 a9 ba e7 5d  |........~ov....]|
-000001a0  a8 16 6c 9c f7 09 d3 37  e4 4b 2b 36 7c 01 ad 41  |..l....7.K+6|..A|
-000001b0  d2 32 d8 c3 d2 93 f9 10  6b 8e 95 b9 2c 17 8a a3  |.2......k...,...|
-000001c0  44 48 bc 59 13 83 16 04  88 a4 81 5c 25 0d 98 0c  |DH.Y.......\%...|
-000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
-000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
-000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
-00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
-00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 04 01 00  80 61 11 ba 1a fe 08 7c  |.........a.....||
-00000240  40 68 88 01 a4 3a 46 bf  f6 e9 bb b6 08 92 20 f0  |@h...:F....... .|
-00000250  13 90 c2 4b 53 83 a1 12  c2 d5 8d e6 67 82 df 80  |...KS.......g...|
-00000260  85 a5 b4 e0 cf 1b d6 3a  46 1e 62 e5 7f 21 bc 91  |.......:F.b..!..|
-00000270  4a 8c c0 79 16 64 5f 7e  40 c5 fb 7a 52 5b bf db  |J..y.d_~@..zR[..|
-00000280  cc 31 f8 b8 37 ef df dc  5f 96 30 ad dd 0b 8a 87  |.1..7..._.0.....|
-00000290  af 4d c6 5c a5 5e d7 2e  fa c7 72 68 85 71 c3 0e  |.M.\.^....rh.q..|
-000002a0  1b 26 87 ff 46 47 4a 1b  ce b7 a5 aa 13 d2 5a e3  |.&..FGJ.......Z.|
-000002b0  36 02 35 df 68 d9 bf 3f  24 14 03 03 00 01 01 16  |6.5.h..?$.......|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 e3 8e cc e5  |...(............|
-000002d0  2e ab 40 fa 3d 47 c1 4f  3f de 97 a9 3d 96 73 ba  |..@.=G.O?...=.s.|
-000002e0  eb a0 ce 67 f6 d1 14 b8  7e cd 1f 85              |...g....~...|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 6a 0a 74 70 75  |..........(j.tpu|
-00000010  0b 39 33 a5 15 0d 7c 7f  f8 13 de 0e 0a 8f 13 3b  |.93...|........;|
-00000020  62 4f 8a 0b bd 0a aa 9b  5a 52 d5 e6 9f e5 b9 3f  |bO......ZR.....?|
-00000030  bd d8 3b                                          |..;|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 0e 4d 62  |..............Mb|
-00000010  d3 ac cd 11 15 6d 24 c7  00 fa f9 d2 91 ba eb 06  |.....m$.........|
-00000020  f2 44 f1 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.D..............|
-00000030  d1 5a 58 ba ae 65 15 67  79 1f 52 f1 1a da 50 99  |.ZX..e.gy.R...P.|
-00000040  e8 50                                             |.P|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled-512 b/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled-512
deleted file mode 100644 (file)
index 0e04729..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
-00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
-00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
-00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
-00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
-00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 68 11 23 f1 8d  |....Y...U..h.#..|
-00000010  2b a0 71 8f 6e ad 9f ae  43 58 c2 93 2e f5 01 3d  |+.q.n...CX.....=|
-00000020  15 b6 d6 0d f5 42 25 ca  b7 b4 96 20 00 c7 86 06  |.....B%.... ....|
-00000030  ed d1 23 99 dd e3 c4 f5  f9 31 42 51 a3 51 5a 40  |..#......1BQ.QZ@|
-00000040  11 f6 07 90 51 04 f8 a2  f6 66 c1 f7 c0 2f 00 00  |....Q....f.../..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 fe 68 1c bf 2b d7 75  |........ .h..+.u|
-000002d0  c2 dd 96 03 5d 77 61 c1  7d dd 6f bc ea 3c aa 27  |....]wa.}.o..<.'|
-000002e0  ba cf 93 e2 8b d8 66 a1  1c 08 04 00 80 5e 16 b9  |......f......^..|
-000002f0  53 17 7d 8d bb 46 4b 1f  37 be cd fe e1 45 c3 10  |S.}..FK.7....E..|
-00000300  68 54 e4 61 20 a5 a5 98  4b df a7 5d 41 4a aa f8  |hT.a ...K..]AJ..|
-00000310  0e 36 c2 02 a6 56 a9 f1  aa 76 86 fd a7 86 fb 06  |.6...V...v......|
-00000320  94 55 56 bd eb 57 10 9a  d5 ba 70 59 46 75 e3 b3  |.UV..W....pYFu..|
-00000330  29 14 c2 65 0e 5c a1 47  e6 bf 12 9d 31 8f 65 4d  |)..e.\.G....1.eM|
-00000340  af dc 1b 6e d2 de d7 fb  85 e7 5a 42 4f de bf d8  |...n......ZBO...|
-00000350  d5 d8 5c 95 71 27 e7 04  af 58 0a d8 77 fb 3d 22  |..\.q'...X..w.="|
-00000360  84 f6 f6 53 c0 79 7a 72  01 6e 5c e1 a8 16 03 03  |...S.yzr.n\.....|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 7f 0b 00 01  7b 00 01 78 00 01 75 30  |........{..x..u0|
-00000010  82 01 71 30 82 01 1b a0  03 02 01 02 02 10 1a 34  |..q0...........4|
-00000020  27 90 21 65 52 a6 85 96  de a2 c7 2c ff b4 30 0d  |'.!eR......,..0.|
-00000030  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 12 31  |..*.H........0.1|
-00000040  10 30 0e 06 03 55 04 0a  13 07 41 63 6d 65 20 43  |.0...U....Acme C|
-00000050  6f 30 1e 17 0d 31 39 30  31 31 38 32 33 32 33 32  |o0...19011823232|
-00000060  38 5a 17 0d 32 30 30 31  31 38 32 33 32 33 32 38  |8Z..200118232328|
-00000070  5a 30 12 31 10 30 0e 06  03 55 04 0a 13 07 41 63  |Z0.1.0...U....Ac|
-00000080  6d 65 20 43 6f 30 5c 30  0d 06 09 2a 86 48 86 f7  |me Co0\0...*.H..|
-00000090  0d 01 01 01 05 00 03 4b  00 30 48 02 41 00 dd 7b  |.......K.0H.A..{|
-000000a0  3d 6b 15 40 f0 6b 1d 87  4f 16 dc 9c 55 0f f4 08  |=k.@.k..O...U...|
-000000b0  5c 80 41 8c 1d 55 76 9e  7e 15 54 45 85 24 1e 88  |\.A..Uv.~.TE.$..|
-000000c0  f0 2f cd 93 1d 17 cb 24  25 ae 61 58 07 31 10 9c  |./.....$%.aX.1..|
-000000d0  83 e1 2a 5b 38 4f 48 45  a0 bb e3 26 75 e9 02 03  |..*[8OHE...&u...|
-000000e0  01 00 01 a3 4d 30 4b 30  0e 06 03 55 1d 0f 01 01  |....M0K0...U....|
-000000f0  ff 04 04 03 02 05 a0 30  13 06 03 55 1d 25 04 0c  |.......0...U.%..|
-00000100  30 0a 06 08 2b 06 01 05  05 07 03 01 30 0c 06 03  |0...+.......0...|
-00000110  55 1d 13 01 01 ff 04 02  30 00 30 16 06 03 55 1d  |U.......0.0...U.|
-00000120  11 04 0f 30 0d 82 0b 65  78 61 6d 70 6c 65 2e 63  |...0...example.c|
-00000130  6f 6d 30 0d 06 09 2a 86  48 86 f7 0d 01 01 0b 05  |om0...*.H.......|
-00000140  00 03 41 00 c4 3b 94 4b  e0 6b ad 2d dc fa 1f a4  |..A..;.K.k.-....|
-00000150  f9 f4 0f 3a 63 92 73 2e  b2 4d 7f 66 1f 0d 10 29  |...:c.s..M.f...)|
-00000160  bb 9c 19 a9 97 60 4c b4  51 12 30 39 d3 b4 b5 0d  |.....`L.Q.09....|
-00000170  cb 1c f7 35 60 6b d8 48  fc 24 0e 39 23 a8 40 ac  |...5`k.H.$.9#.@.|
-00000180  d9 59 bf 00 16 03 03 00  25 10 00 00 21 20 2f e5  |.Y......%...! /.|
-00000190  7d a3 47 cd 62 43 15 28  da ac 5f bb 29 07 30 ff  |}.G.bC.(.._.).0.|
-000001a0  f6 84 af c4 cf c2 ed 90  99 5f 58 cb 3b 74 16 03  |........._X.;t..|
-000001b0  03 00 48 0f 00 00 44 04  01 00 40 15 33 b2 27 d6  |..H...D...@.3.'.|
-000001c0  ad 7f 45 86 df a0 83 5e  7c fb a7 0e 04 8e 3c a1  |..E....^|.....<.|
-000001d0  5b 9a 8f 98 04 cf 66 bb  cf 6a d4 63 d7 ff b2 a4  |[.....f..j.c....|
-000001e0  f1 08 27 f7 53 1c ec 76  35 b1 09 93 91 db 63 e3  |..'.S..v5.....c.|
-000001f0  a6 2b e5 55 da 06 5b 2f  c7 8d c3 14 03 03 00 01  |.+.U..[/........|
-00000200  01 16 03 03 00 28 00 00  00 00 00 00 00 00 98 d8  |.....(..........|
-00000210  99 fa 5a fb 79 57 1f 02  4e 07 51 d6 c6 32 9c e8  |..Z.yW..N.Q..2..|
-00000220  54 50 6c f9 63 fb 38 e2  ef 88 4b 7e 8d 7a        |TPl.c.8...K~.z|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 4c 6b f0 26 84  |..........(Lk.&.|
-00000010  97 e6 54 cf 1f 25 1c 91  5d 10 63 22 66 73 d2 ce  |..T..%..].c"fs..|
-00000020  0d 7c 0b 3d 7d 31 3c 0b  6c be 30 72 9e 04 c0 fb  |.|.=}1<.l.0r....|
-00000030  73 88 75                                          |s.u|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 2a b2 2d  |.............*.-|
-00000010  7f 6e 12 2d d7 63 05 e8  c4 fd 81 de b6 65 2f 2b  |.n.-.c.......e/+|
-00000020  00 0e 13 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  9c c0 ae 5a b4 5f b5 4f  cd 3f 27 78 f9 b3 b5 b5  |...Z._.O.?'x....|
-00000040  57 f2                                             |W.|
index a0aff2560d7e258122a790009f0bf8aa58ba35f3..02b11a69337e54534d86b7efbcf91309a80485ff 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 82 19 ee 7f ef  |....Y...U.......|
-00000010  86 a3 70 b1 75 84 05 bc  43 ed 52 df bf 42 c4 e3  |..p.u...C.R..B..|
-00000020  87 50 59 5d 88 4f df b6  85 0c 5d 20 c3 1b c3 9d  |.PY].O....] ....|
-00000030  a0 2c 6b 16 1c 35 7a 3b  98 eb ba 8a 55 7a 10 af  |.,k..5z;....Uz..|
-00000040  c4 7f cd 74 e5 f2 e4 6b  c1 58 5f 18 c0 2f 00 00  |...t...k.X_../..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 43 a0 10 ae 54  |....Y...U..C...T|
+00000010  09 23 be 14 d7 1d b3 64  66 5e 39 4e 42 ed 58 3a  |.#.....df^9NB.X:|
+00000020  1b de 35 eb ee 9b 86 44  fe 2b a8 20 e7 f1 4a 47  |..5....D.+. ..JG|
+00000030  b1 6b f0 fb d7 ed 3c 33  4a 52 bc 9b 39 c0 16 d3  |.k....<3JR..9...|
+00000040  f4 0a 7c 38 7e b3 95 31  7a c7 c8 f4 c0 2f 00 00  |..|8~..1z..../..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 5f 4e f4 61 c0 7a 45  |........ _N.a.zE|
-000002d0  82 9e 8e d4 dc cc cf 75  7e 22 47 c4 61 17 fc ae  |.......u~"G.a...|
-000002e0  b0 0b 10 eb 4b b5 74 38  25 08 04 00 80 d1 db f1  |....K.t8%.......|
-000002f0  bf 1a 22 33 54 0f 85 11  3d 07 05 63 c7 1c 71 90  |.."3T...=..c..q.|
-00000300  e5 30 8d e6 3b 48 b3 42  e4 2e 72 9d 3e 6b 10 09  |.0..;H.B..r.>k..|
-00000310  d6 32 ae 37 d4 37 5e 46  52 52 40 e5 d2 03 a9 db  |.2.7.7^FRR@.....|
-00000320  89 06 11 db be 67 73 3c  80 51 ce 09 df b0 ea 2a  |.....gs<.Q.....*|
-00000330  e3 aa 3e c0 4a c4 7d 88  ec 45 7d e8 a8 1e 46 28  |..>.J.}..E}...F(|
-00000340  26 9e 38 d2 2a 97 dc a2  90 1a 7c 98 01 d9 f6 22  |&.8.*.....|...."|
-00000350  9e 46 4a a2 2f ae 6e a4  3d 00 82 46 8e 8e 04 21  |.FJ./.n.=..F...!|
-00000360  e7 39 23 de f6 51 6c 59  5c 63 40 c5 57 16 03 03  |.9#..QlY\c@.W...|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 e7 c6 c3 84 0a b7 55  |........ ......U|
+000002d0  ff fb ae 43 10 da 03 0d  7d 91 77 90 cd 05 6a ab  |...C....}.w...j.|
+000002e0  08 35 5a 38 23 79 45 9f  54 08 04 00 80 d8 b8 a1  |.5Z8#yE.T.......|
+000002f0  67 15 39 93 cc d0 ac e7  55 85 3e 62 f3 a6 d8 35  |g.9.....U.>b...5|
+00000300  5e bb 60 4e 33 70 05 47  b8 9e 8c e6 85 65 09 e2  |^.`N3p.G.....e..|
+00000310  95 4f 8a d9 4b cb 60 62  3c ef 57 81 ed b4 20 cf  |.O..K.`b<.W... .|
+00000320  b1 71 d9 62 57 60 fa 07  89 12 a1 90 8f 8f 06 4a  |.q.bW`.........J|
+00000330  56 c3 81 e0 b6 11 9e ce  33 fe 0f 4e b2 84 cc 4b  |V.......3..N...K|
+00000340  dc d4 71 e4 43 04 61 11  a9 a6 8a 20 43 a7 0e b6  |..q.C.a.... C...|
+00000350  a8 97 43 1b e0 a9 b1 0f  e8 19 68 0a 5d 38 d9 69  |..C.......h.]8.i|
+00000360  22 65 16 aa 05 16 11 cd  66 4a 4f be 90 16 03 03  |"e......fJO.....|
 00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
 00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 41 a2 d2 32 db ce 5b  |.........A..2..[|
-00000240  04 45 ad 1c 31 7d f0 bc  bb c0 53 65 38 b6 75 10  |.E..1}....Se8.u.|
-00000250  de 25 38 c2 3b 54 5b 1e  3d bb d2 6a 70 77 16 62  |.%8.;T[.=..jpw.b|
-00000260  c2 e8 d0 17 bd 01 89 89  26 28 75 69 ba 5e a1 4a  |........&(ui.^.J|
-00000270  6d 7e e6 be 6c 64 7e 8b  0c 45 3b 4b ef 1d 75 69  |m~..ld~..E;K..ui|
-00000280  1f 51 4b 02 8e a0 19 de  47 41 44 14 4f e7 1e 23  |.QK.....GAD.O..#|
-00000290  b0 c0 41 3f 6a 64 0e 30  80 01 ea d8 a9 75 6d 97  |..A?jd.0.....um.|
-000002a0  28 4c ae df b1 6e 53 3b  c3 aa 48 f1 5a e8 1c 8f  |(L...nS;..H.Z...|
-000002b0  ed 8c 59 5d e1 0e 57 b1  7d 14 03 03 00 01 01 16  |..Y]..W.}.......|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 ee 41 37 7b  |...(.........A7{|
-000002d0  ea 1e c3 d1 a7 7d 76 5c  f8 b6 70 57 3c 02 71 49  |.....}v\..pW<.qI|
-000002e0  c5 14 35 bb c3 43 63 61  6c 46 6c 11              |..5..CcalFl.|
+00000230  88 0f 00 00 84 04 01 00  80 2e af 25 b4 ff 00 08  |...........%....|
+00000240  c8 dc 24 49 d5 9b d0 fe  b5 81 8d 4e 15 d4 63 bf  |..$I.......N..c.|
+00000250  8e 4c a4 7d 96 58 a2 4b  f4 25 a8 e3 39 fc df 2d  |.L.}.X.K.%..9..-|
+00000260  7c a0 20 61 86 35 8e 7e  ba a5 2c f3 07 ad 84 36  ||. a.5.~..,....6|
+00000270  df ef 66 e9 78 d8 5f b3  17 45 31 d4 4a 38 5c 6c  |..f.x._..E1.J8\l|
+00000280  03 73 3b 74 60 c9 00 d1  64 59 c9 a5 39 00 fc bf  |.s;t`...dY..9...|
+00000290  9c 3a 99 46 4b 71 90 64  8a 24 2e 37 cf 8a 42 c2  |.:.FKq.d.$.7..B.|
+000002a0  56 a6 94 97 60 c5 56 ba  de 71 78 6c f2 be ce 16  |V...`.V..qxl....|
+000002b0  47 ca 0d 95 3c cc b8 6f  b2 14 03 03 00 01 01 16  |G...<..o........|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 8e 0e 3b 43  |...(..........;C|
+000002d0  63 52 24 16 91 bc 50 85  ef 34 ad b9 f0 45 e7 4c  |cR$...P..4...E.L|
+000002e0  9a 07 1d 46 53 2c 89 79  0f 27 dc 9d              |...FS,.y.'..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 87 e9 a4 2c 0f  |..........(...,.|
-00000010  b5 52 a7 1b d0 99 86 27  d0 20 3e b5 44 77 0b 8f  |.R.....'. >.Dw..|
-00000020  d5 4e db dc 52 ab 01 c0  1c fd 85 2c 41 3b d0 14  |.N..R......,A;..|
-00000030  11 26 29                                          |.&)|
+00000000  14 03 03 00 01 01 16 03  03 00 28 2f 40 03 cf 5a  |..........(/@..Z|
+00000010  76 6c 87 87 8d 99 4c e8  76 73 6a 62 1d a5 31 bc  |vl....L.vsjb..1.|
+00000020  2e 7e 23 8c 50 bf 07 b9  13 53 4a 59 a0 9b 74 b7  |.~#.P....SJY..t.|
+00000030  53 21 2d                                          |S!-|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 e7 09 a0  |................|
-00000010  90 12 35 3f 8f 87 41 fc  aa 13 24 50 9f 69 a5 c7  |..5?..A...$P.i..|
-00000020  37 38 02 15 03 03 00 1a  00 00 00 00 00 00 00 02  |78..............|
-00000030  08 53 f5 80 5c eb b2 3b  9d be a3 49 46 24 da 5a  |.S..\..;...IF$.Z|
-00000040  7d 84                                             |}.|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 83 69 b1  |..............i.|
+00000010  20 19 eb db d4 58 e7 f1  5a 95 b0 d3 9d 3b 74 ad  | ....X..Z....;t.|
+00000020  bc 94 c4 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  7d 89 89 25 40 be 0d fc  24 d0 ff 5a 0f 24 5d f2  |}..%@...$..Z.$].|
+00000040  a3 ab                                             |..|
index 48c2868aa666ac5e75a6001c973721d4bd27ea37..26308fc9dfdd5aa57681309d35d1a46e4637b00d 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 27 d5 26 b1 eb  |....Y...U..'.&..|
-00000010  43 b9 e2 34 e7 3a e2 5e  73 ee b6 d7 4b 0c 88 49  |C..4.:.^s...K..I|
-00000020  04 a8 0e fa f7 a1 79 39  e3 a6 29 20 75 68 40 36  |......y9..) uh@6|
-00000030  ee c2 11 37 2f ae 43 85  f1 d0 eb ee 3d 69 99 e2  |...7/.C.....=i..|
-00000040  3f f1 91 03 5d 00 af c5  f8 0d 4d dc c0 2f 00 00  |?...].....M../..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 97 f2 cb de f1  |....Y...U.......|
+00000010  bb cf 9a 6c 6d 7e e2 94  af 9d 0b ed 02 cf fc b2  |...lm~..........|
+00000020  80 b2 7b 41 2c a6 83 e7  52 62 93 20 63 23 7f 48  |..{A,...Rb. c#.H|
+00000030  be c1 7f d3 75 34 fe 3a  ad 27 f5 99 b0 73 91 df  |....u4.:.'...s..|
+00000040  b3 e9 82 95 cd 1b f9 08  b6 3d 4f 9b c0 2f 00 00  |.........=O../..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 41 51 d5 70 34 15 c0  |........ AQ.p4..|
-000002d0  76 3e 2b 5c e2 de 36 69  a9 2e bf b8 60 b4 3a 56  |v>+\..6i....`.:V|
-000002e0  00 73 c1 85 4a b2 3e a6  54 04 01 00 80 5d 44 f2  |.s..J.>.T....]D.|
-000002f0  28 99 f6 4f 45 bc 83 ce  f7 98 ab 29 21 05 a6 c3  |(..OE......)!...|
-00000300  8c a9 ef c2 82 b5 b3 bd  31 09 ae 11 15 fa 21 02  |........1.....!.|
-00000310  43 59 00 fb 53 9d 0f bb  b0 ab ca ba ce e8 41 28  |CY..S.........A(|
-00000320  0a 7b ff cb d4 eb 81 8a  a2 ce a6 32 f8 d7 f2 a0  |.{.........2....|
-00000330  3b 0d c8 fc 8d 45 a8 4c  66 ef 48 ce 4a fc d3 7a  |;....E.Lf.H.J..z|
-00000340  19 1d 7f bd 71 c6 61 4a  93 b9 01 c9 39 32 48 ec  |....q.aJ....92H.|
-00000350  fd 01 c9 32 6b 9f d1 0e  c1 62 bc 78 32 34 af 7e  |...2k....b.x24.~|
-00000360  58 16 d0 4c c7 44 a6 3a  e5 4c 89 d6 f3 16 03 03  |X..L.D.:.L......|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 f8 3a 6c 5b 6f 88 48  |........ .:l[o.H|
+000002d0  19 c5 a2 e7 4a d9 6d 21  56 23 63 1b 1f 95 aa bc  |....J.m!V#c.....|
+000002e0  33 ac aa 3b bb f8 35 ba  1a 04 01 00 80 98 6d 7b  |3..;..5.......m{|
+000002f0  7d 40 13 81 6b 70 ec ac  60 ee 1d 3e 37 36 bc f4  |}@..kp..`..>76..|
+00000300  c1 9f 3c 13 b7 06 3d 38  be 4f 8c 3e e2 2e f2 b5  |..<...=8.O.>....|
+00000310  de 16 ec a0 5b 64 00 5c  c3 50 cc 79 a2 f7 e0 8d  |....[d.\.P.y....|
+00000320  68 e6 6b 1b b8 57 a4 15  d0 2c d7 4a be 97 26 26  |h.k..W...,.J..&&|
+00000330  8c 5c 4e 26 36 96 48 b5  0f 88 7b 37 43 e4 d1 24  |.\N&6.H...{7C..$|
+00000340  01 3c 70 38 99 c6 e2 2f  66 e7 db 57 30 f2 72 d0  |.<p8.../f..W0.r.|
+00000350  17 fd ad 09 a7 bd ee de  ca fd 57 15 de 25 b6 1f  |..........W..%..|
+00000360  ed 45 86 22 83 4e 64 54  56 17 1f 81 4f 16 03 03  |.E.".NdTV...O...|
 00000370  00 0c 0d 00 00 08 01 01  00 02 04 01 00 00 16 03  |................|
 00000380  03 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 04 01 00  80 02 7e 43 b4 4e a2 07  |..........~C.N..|
-00000240  a4 97 70 3f 80 91 5c b5  a0 f9 d7 c4 52 c9 ee 8a  |..p?..\.....R...|
-00000250  af 59 63 58 bb ac 55 47  cc 25 27 ea ca 48 0e fb  |.YcX..UG.%'..H..|
-00000260  87 e3 3e 5f 55 67 d8 60  8c 47 45 10 36 aa 66 6c  |..>_Ug.`.GE.6.fl|
-00000270  6b 16 2b 9e e5 da 50 73  dc 30 ef 2c 01 01 87 2e  |k.+...Ps.0.,....|
-00000280  68 eb 14 35 f5 ef c4 45  ae 8e 95 29 86 96 6e 04  |h..5...E...)..n.|
-00000290  03 d6 3c 29 49 55 7c 7d  ea 6c 1a a8 bf f9 5a e1  |..<)IU|}.l....Z.|
-000002a0  a9 c4 66 5b 8d b5 78 b8  05 ce 44 ca 98 77 a2 7d  |..f[..x...D..w.}|
-000002b0  74 26 f4 ed 41 a3 97 2b  29 14 03 03 00 01 01 16  |t&..A..+).......|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 ac ec 0d 5a  |...(...........Z|
-000002d0  c7 81 fe c3 b3 ff 3a 6e  d0 f3 f7 8e 17 6a 53 db  |......:n.....jS.|
-000002e0  58 5f 44 bb ce 59 0a 99  06 21 62 24              |X_D..Y...!b$|
+00000230  88 0f 00 00 84 04 01 00  80 a8 12 9d 84 c2 17 0a  |................|
+00000240  03 ae bd 87 9a b6 6f 65  2f 7a 04 1f 69 2a 41 f4  |......oe/z..i*A.|
+00000250  d0 9a 4d a4 5b 6e d2 d3  42 c3 77 4f 04 28 ce e6  |..M.[n..B.wO.(..|
+00000260  d4 25 c5 81 1b 78 91 e9  1e 93 90 57 b2 58 6f 26  |.%...x.....W.Xo&|
+00000270  ed 20 15 62 ff e9 c6 c1  52 4a 9a 05 a6 cd 17 22  |. .b....RJ....."|
+00000280  75 c8 81 da a4 96 af c6  83 b5 5c 81 93 59 44 26  |u.........\..YD&|
+00000290  5b 03 59 9d ab 93 ee c7  37 61 74 e7 4a 22 1c ec  |[.Y.....7at.J"..|
+000002a0  96 fb a2 c9 ea 2d 4b 8d  d3 a7 e4 60 57 10 be b7  |.....-K....`W...|
+000002b0  60 80 4f ee 8e 21 6b a2  13 14 03 03 00 01 01 16  |`.O..!k.........|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 16 82 4a c0  |...(..........J.|
+000002d0  98 7b 62 3e 9b da a9 ac  31 f2 32 a9 23 13 2f e3  |.{b>....1.2.#./.|
+000002e0  77 c9 1e ca 39 9f 4c 8a  10 58 33 67              |w...9.L..X3g|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 59 19 13 9f ea  |..........(Y....|
-00000010  68 14 58 ab 09 0c af 4d  b4 a1 05 09 47 08 50 cd  |h.X....M....G.P.|
-00000020  b0 40 a0 3a 3f 89 68 c9  9c ea 8f 69 0a ea e1 75  |.@.:?.h....i...u|
-00000030  11 97 ab                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 8e 56 d0 9c 38  |..........(.V..8|
+00000010  4f d9 df 12 9b dd 96 05  94 77 2f 6d 24 a8 cb 56  |O........w/m$..V|
+00000020  91 f9 bc ec 00 b5 cc 71  c4 f4 36 42 be 68 37 78  |.......q..6B.h7x|
+00000030  8f 6e 8c                                          |.n.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 38 f1 0f  |.............8..|
-00000010  d6 4f 5c 0a 60 1a 9f 97  6d 4a 43 e8 c8 a8 18 7e  |.O\.`...mJC....~|
-00000020  30 6f 67 15 03 03 00 1a  00 00 00 00 00 00 00 02  |0og.............|
-00000030  d9 ac f7 69 ca a2 58 78  10 c2 eb 1a 61 da af 28  |...i..Xx....a..(|
-00000040  20 02                                             | .|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 1c 19 9e  |................|
+00000010  a5 40 f6 d7 8b 80 23 8a  0b fa 14 65 08 6a 3c 66  |.@....#....e.j<f|
+00000020  07 c4 d2 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  16 7c e2 68 a5 d4 df 64  f4 1c 7d 17 b6 14 0a 4c  |.|.h...d..}....L|
+00000040  40 8e                                             |@.|
index 8c901f083efc4a1d2dae81769009fd940a598a11..f788e6f6006b739aca8b40fc7ae93dee57935272 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 ce d1 7f 55 bc  |....Y...U.....U.|
-00000010  b8 a8 fb 08 cc d4 2d a2  e9 fa ff 43 24 d2 14 04  |......-....C$...|
-00000020  ad 5a 05 77 d4 67 04 8b  c1 3e 5c 20 31 6e ba 32  |.Z.w.g...>\ 1n.2|
-00000030  70 bd f0 c8 55 74 a1 49  f3 9f 93 86 e9 b3 ee 81  |p...Ut.I........|
-00000040  3e 54 09 e9 15 78 78 7e  71 2b f5 cd c0 2f 00 00  |>T...xx~q+.../..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 be 63 44 bb 7e  |....Y...U...cD.~|
+00000010  0d 88 88 15 b1 ed 7e 75  03 57 25 1a 0c 52 42 31  |......~u.W%..RB1|
+00000020  f8 e1 46 e3 11 27 ff 05  5e 26 2e 20 e6 31 d0 a6  |..F..'..^&. .1..|
+00000030  d9 7c 69 a6 57 09 ee 50  c5 3c 5e 1d a0 a7 2b 7a  |.|i.W..P.<^...+z|
+00000040  7c dd 04 b4 38 45 c9 90  a0 98 33 68 c0 2f 00 00  ||...8E....3h./..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 66 0b 00 02 62 00  02 5f 00 02 5c 30 82 02  |..f...b.._..\0..|
 00000070  58 30 82 01 8d a0 03 02  01 02 02 11 00 f2 99 26  |X0.............&|
 000002a0  11 89 66 79 d1 8e 88 0e  0b a0 9e 30 2a c0 67 ef  |..fy.......0*.g.|
 000002b0  ca 46 02 88 e9 53 81 22  69 22 97 ad 80 93 d4 f7  |.F...S."i"......|
 000002c0  dd 70 14 24 d7 70 0a 46  a1 16 03 03 00 ac 0c 00  |.p.$.p.F........|
-000002d0  00 a8 03 00 1d 20 62 1f  63 aa 80 a5 b5 a3 e3 71  |..... b.c......q|
-000002e0  71 63 0d be 4d d2 bd f4  3b 0d 78 e8 c1 fe 43 0d  |qc..M...;.x...C.|
-000002f0  e3 09 9a 01 ed 72 08 04  00 80 59 a7 96 03 f4 60  |.....r....Y....`|
-00000300  fa 56 73 a2 14 e8 1e 0b  66 d5 7e 91 7c 99 50 6b  |.Vs.....f.~.|.Pk|
-00000310  c0 74 8d 24 a5 98 2d df  47 e4 42 73 09 a0 c4 6a  |.t.$..-.G.Bs...j|
-00000320  42 22 3d 85 f0 a4 05 f8  b5 74 96 85 f7 b0 22 9a  |B"=......t....".|
-00000330  ee 25 b5 19 c1 ec f0 3b  32 bd 28 6a eb ac 32 e4  |.%.....;2.(j..2.|
-00000340  54 18 2e 6c b9 c0 74 d5  e8 36 2b 47 67 65 ba fb  |T..l..t..6+Gge..|
-00000350  53 18 b2 e3 30 6c 49 4c  8f 07 91 54 93 47 3b b9  |S...0lIL...T.G;.|
-00000360  f1 92 81 53 b9 de 5a f5  28 08 e7 4a 46 fa 63 8f  |...S..Z.(..JF.c.|
-00000370  d0 66 29 0d 6d f0 6b 11  c1 2b 16 03 03 00 0c 0d  |.f).m.k..+......|
-00000380  00 00 08 01 01 00 02 08  04 00 00 16 03 03 00 04  |................|
+000002d0  00 a8 03 00 1d 20 60 8e  8a 17 8a fc b4 4f 01 ad  |..... `......O..|
+000002e0  f8 ef 44 f3 fc af 2a 90  57 7d ba 1d dd a6 17 cc  |..D...*.W}......|
+000002f0  c6 4a 5f a2 fb 47 08 04  00 80 46 d8 62 04 19 4a  |.J_..G....F.b..J|
+00000300  29 9b cc 3c 2c 0d 7e 67  3d 97 c0 32 65 90 28 e2  |)..<,.~g=..2e.(.|
+00000310  e9 df 7d 9b e1 62 82 a9  0b 22 99 a0 ae b9 7a 31  |..}..b..."....z1|
+00000320  75 c2 6e 61 e7 a5 64 b9  72 ce b8 04 b2 ca 14 78  |u.na..d.r......x|
+00000330  d4 b4 c2 b4 57 b4 a4 70  f9 d1 bf d0 77 e3 f5 66  |....W..p....w..f|
+00000340  c0 3f dd b2 40 30 3d d5  e9 a6 d1 49 79 ac ea b9  |.?..@0=....Iy...|
+00000350  38 43 52 3c a0 1c be 0d  18 a2 fc c0 a6 43 80 91  |8CR<.........C..|
+00000360  3f c5 c2 3a 43 31 92 ff  58 a8 40 52 b3 99 0f c4  |?..:C1..X.@R....|
+00000370  c6 00 89 0b b9 f4 9e 28  cd bf 16 03 03 00 0c 0d  |.......(........|
+00000380  00 00 08 01 01 00 02 04  01 00 00 16 03 03 00 04  |................|
 00000390  0e 00 00 00                                       |....|
 >>> Flow 3 (client to server)
-00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
-00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
-00000020  c1 89 65 83 55 6f dc 0b  c9 b9 93 9f e9 bc 30 0d  |..e.Uo........0.|
-00000030  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 12 31  |..*.H........0.1|
-00000040  10 30 0e 06 03 55 04 0a  13 07 41 63 6d 65 20 43  |.0...U....Acme C|
-00000050  6f 30 1e 17 0d 31 36 30  38 31 37 32 31 35 32 33  |o0...16081721523|
-00000060  31 5a 17 0d 31 37 30 38  31 37 32 31 35 32 33 31  |1Z..170817215231|
-00000070  5a 30 12 31 10 30 0e 06  03 55 04 0a 13 07 41 63  |Z0.1.0...U....Ac|
-00000080  6d 65 20 43 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |me Co0..0...*.H.|
-00000090  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-000000a0  81 00 ba 6f aa 86 bd cf  bf 9f f2 ef 5c 94 60 78  |...o........\.`x|
-000000b0  6f e8 13 f2 d1 96 6f cd  d9 32 6e 22 37 ce 41 f9  |o.....o..2n"7.A.|
-000000c0  ca 5d 29 ac e1 27 da 61  a2 ee 81 cb 10 c7 df 34  |.])..'.a.......4|
-000000d0  58 95 86 e9 3d 19 e6 5c  27 73 60 c8 8d 78 02 f4  |X...=..\'s`..x..|
-000000e0  1d a4 98 09 a3 19 70 69  3c 25 62 66 2a ab 22 23  |......pi<%bf*."#|
-000000f0  c5 7b 85 38 4f 2e 09 73  32 a7 bd 3e 9b ad ca 84  |.{.8O..s2..>....|
-00000100  07 e6 0f 3a ff 77 c5 9d  41 85 00 8a b6 9b ee b0  |...:.w..A.......|
-00000110  a4 3f 2d 4c 4c e6 42 3e  bb 51 c8 dd 48 54 f4 0c  |.?-LL.B>.Q..HT..|
-00000120  8e 47 02 03 01 00 01 a3  46 30 44 30 0e 06 03 55  |.G......F0D0...U|
-00000130  1d 0f 01 01 ff 04 04 03  02 05 a0 30 13 06 03 55  |...........0...U|
-00000140  1d 25 04 0c 30 0a 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-00000150  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 0f  |0...U.......0.0.|
-00000160  06 03 55 1d 11 04 08 30  06 87 04 7f 00 00 01 30  |..U....0.......0|
-00000170  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
-00000180  81 00 46 ab 44 a2 fb 28  54 f8 5a 67 f8 62 94 f1  |..F.D..(T.Zg.b..|
-00000190  9a b2 18 9e f2 b1 de 1d  7e 6f 76 95 a9 ba e7 5d  |........~ov....]|
-000001a0  a8 16 6c 9c f7 09 d3 37  e4 4b 2b 36 7c 01 ad 41  |..l....7.K+6|..A|
-000001b0  d2 32 d8 c3 d2 93 f9 10  6b 8e 95 b9 2c 17 8a a3  |.2......k...,...|
-000001c0  44 48 bc 59 13 83 16 04  88 a4 81 5c 25 0d 98 0c  |DH.Y.......\%...|
-000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
-000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
-000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
-00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
-00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 a4 3b 32 76 8f fd 9a  |..........;2v...|
-00000240  42 99 24 e1 58 f8 21 39  b7 b2 55 ed 25 5c 67 a7  |B.$.X.!9..U.%\g.|
-00000250  d3 79 f2 04 36 03 18 ad  76 4e db 9f ce 4f 97 86  |.y..6...vN...O..|
-00000260  6f 0c 72 f5 8e 52 44 16  01 f2 4d c2 74 9f 75 51  |o.r..RD...M.t.uQ|
-00000270  ea a4 0a 9c 1f a0 96 7e  2b e2 fc f9 80 c8 31 f9  |.......~+.....1.|
-00000280  40 19 fe 40 d2 62 fd 9c  1a 29 ed ea 33 b3 ac f7  |@..@.b...)..3...|
-00000290  e6 52 b6 2b 69 62 b2 a4  8d 62 db 4b 67 d9 fb b0  |.R.+ib...b.Kg...|
-000002a0  2a 25 c5 c1 7e ca 7d 56  75 a0 b4 8e 65 18 ea ba  |*%..~.}Vu...e...|
-000002b0  fb 86 dc 60 b1 d3 fb 4b  ce 14 03 03 00 01 01 16  |...`...K........|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 40 48 84 70  |...(........@H.p|
-000002d0  05 89 8a 4d 25 4b 4f 14  96 bd 29 5f f8 1a e5 c0  |...M%KO...)_....|
-000002e0  87 f5 b7 1e 1f ba 73 b4  66 e7 9f ea              |......s.f...|
+00000000  16 03 03 02 66 0b 00 02  62 00 02 5f 00 02 5c 30  |....f...b.._..\0|
+00000010  82 02 58 30 82 01 8d a0  03 02 01 02 02 11 00 f2  |..X0............|
+00000020  99 26 eb 87 ea 8a 0d b9  fc c2 47 34 7c 11 b0 30  |.&........G4|..0|
+00000030  41 06 09 2a 86 48 86 f7  0d 01 01 0a 30 34 a0 0f  |A..*.H......04..|
+00000040  30 0d 06 09 60 86 48 01  65 03 04 02 01 05 00 a1  |0...`.H.e.......|
+00000050  1c 30 1a 06 09 2a 86 48  86 f7 0d 01 01 08 30 0d  |.0...*.H......0.|
+00000060  06 09 60 86 48 01 65 03  04 02 01 05 00 a2 03 02  |..`.H.e.........|
+00000070  01 20 30 12 31 10 30 0e  06 03 55 04 0a 13 07 41  |. 0.1.0...U....A|
+00000080  63 6d 65 20 43 6f 30 1e  17 0d 31 37 31 31 32 33  |cme Co0...171123|
+00000090  31 36 31 36 31 30 5a 17  0d 31 38 31 31 32 33 31  |161610Z..1811231|
+000000a0  36 31 36 31 30 5a 30 12  31 10 30 0e 06 03 55 04  |61610Z0.1.0...U.|
+000000b0  0a 13 07 41 63 6d 65 20  43 6f 30 81 9f 30 0d 06  |...Acme Co0..0..|
+000000c0  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
+000000d0  30 81 89 02 81 81 00 db  46 7d 93 2e 12 27 06 48  |0.......F}...'.H|
+000000e0  bc 06 28 21 ab 7e c4 b6  a2 5d fe 1e 52 45 88 7a  |..(!.~...]..RE.z|
+000000f0  36 47 a5 08 0d 92 42 5b  c2 81 c0 be 97 79 98 40  |6G....B[.....y.@|
+00000100  fb 4f 6d 14 fd 2b 13 8b  c2 a5 2e 67 d8 d4 09 9e  |.Om..+.....g....|
+00000110  d6 22 38 b7 4a 0b 74 73  2b c2 34 f1 d1 93 e5 96  |."8.J.ts+.4.....|
+00000120  d9 74 7b f3 58 9f 6c 61  3c c0 b0 41 d4 d9 2b 2b  |.t{.X.la<..A..++|
+00000130  24 23 77 5b 1c 3b bd 75  5d ce 20 54 cf a1 63 87  |$#w[.;.u]. T..c.|
+00000140  1d 1e 24 c4 f3 1d 1a 50  8b aa b6 14 43 ed 97 a7  |..$....P....C...|
+00000150  75 62 f4 14 c8 52 d7 02  03 01 00 01 a3 46 30 44  |ub...R.......F0D|
+00000160  30 0e 06 03 55 1d 0f 01  01 ff 04 04 03 02 05 a0  |0...U...........|
+00000170  30 13 06 03 55 1d 25 04  0c 30 0a 06 08 2b 06 01  |0...U.%..0...+..|
+00000180  05 05 07 03 01 30 0c 06  03 55 1d 13 01 01 ff 04  |.....0...U......|
+00000190  02 30 00 30 0f 06 03 55  1d 11 04 08 30 06 87 04  |.0.0...U....0...|
+000001a0  7f 00 00 01 30 41 06 09  2a 86 48 86 f7 0d 01 01  |....0A..*.H.....|
+000001b0  0a 30 34 a0 0f 30 0d 06  09 60 86 48 01 65 03 04  |.04..0...`.H.e..|
+000001c0  02 01 05 00 a1 1c 30 1a  06 09 2a 86 48 86 f7 0d  |......0...*.H...|
+000001d0  01 01 08 30 0d 06 09 60  86 48 01 65 03 04 02 01  |...0...`.H.e....|
+000001e0  05 00 a2 03 02 01 20 03  81 81 00 cd ac 4e f2 ce  |...... ......N..|
+000001f0  5f 8d 79 88 10 42 70 7f  7c bf 1b 5a 8a 00 ef 19  |_.y..Bp.|..Z....|
+00000200  15 4b 40 15 17 71 00 6c  d4 16 26 e5 49 6d 56 da  |.K@..q.l..&.ImV.|
+00000210  0c 1a 13 9f d8 46 95 59  3c b6 7f 87 76 5e 18 aa  |.....F.Y<...v^..|
+00000220  03 ea 06 75 22 dd 78 d2  a5 89 b8 c9 23 64 e1 28  |...u".x.....#d.(|
+00000230  38 ce 34 6c 6e 06 7b 51  f1 a7 e6 f4 b3 7f fa b1  |8.4ln.{Q........|
+00000240  3f 14 11 89 66 79 d1 8e  88 0e 0b a0 9e 30 2a c0  |?...fy.......0*.|
+00000250  67 ef ca 46 02 88 e9 53  81 22 69 22 97 ad 80 93  |g..F...S."i"....|
+00000260  d4 f7 dd 70 14 24 d7 70  0a 46 a1 16 03 03 00 25  |...p.$.p.F.....%|
+00000270  10 00 00 21 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |...! /.}.G.bC.(.|
+00000280  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
+00000290  5f 58 cb 3b 74 16 03 03  00 88 0f 00 00 84 04 01  |_X.;t...........|
+000002a0  00 80 d5 bf 41 e0 65 7b  32 16 bb a3 92 48 f6 0e  |....A.e{2....H..|
+000002b0  31 eb ca a2 b7 1c b3 3a  b4 8f 91 0e 44 e8 9e ad  |1......:....D...|
+000002c0  f7 71 4c 71 20 da 59 29  09 4f 0b 1e fb 92 c5 ce  |.qLq .Y).O......|
+000002d0  7b a3 26 de 89 be f5 cc  b6 be dc af 09 6a f9 a2  |{.&..........j..|
+000002e0  f0 65 5c 39 2d ad 2c 46  ce df 26 09 2e 99 5d 9e  |.e\9-.,F..&...].|
+000002f0  58 2b cf 1f ed b5 1a 4b  21 0b d8 ec 14 fb bb f2  |X+.....K!.......|
+00000300  eb 41 9d 1c 6a 06 d8 38  b9 68 fc 1d 90 ad ff 9c  |.A..j..8.h......|
+00000310  91 c1 4a ff b0 49 59 8a  0b 25 26 eb 28 b1 a5 f8  |..J..IY..%&.(...|
+00000320  0d 8e 14 03 03 00 01 01  16 03 03 00 28 00 00 00  |............(...|
+00000330  00 00 00 00 00 cd a4 31  83 38 57 c8 91 98 4c 6c  |.......1.8W...Ll|
+00000340  76 c7 e1 d8 af f9 47 ee  45 75 f4 51 6c e5 7e da  |v.....G.Eu.Ql.~.|
+00000350  00 0f da 44 49                                    |...DI|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 9b d9 9c b6 21  |..........(....!|
-00000010  4f 16 83 6d 53 a4 df 76  a4 79 60 9d fb 92 b0 57  |O..mS..v.y`....W|
-00000020  7f 9b 4e 35 80 d6 d4 04  e6 a9 93 62 f7 41 8a 23  |..N5.......b.A.#|
-00000030  78 22 4e                                          |x"N|
+00000000  14 03 03 00 01 01 16 03  03 00 28 7f 1d 85 46 4c  |..........(...FL|
+00000010  7f 93 d7 e3 c1 3f a7 71  69 16 90 9a a6 f8 9a 22  |.....?.qi......"|
+00000020  a5 8b 0e 6d 6a f2 08 7e  40 6d ba 87 74 e4 e6 1d  |...mj..~@m..t...|
+00000030  ba 5e ff                                          |.^.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 81 49 a3  |..............I.|
-00000010  c8 46 e1 9a 79 fa 94 02  69 94 24 0d e2 44 95 76  |.F..y...i.$..D.v|
-00000020  ee a0 ca 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  41 df 97 11 9e 64 12 ce  6f 96 be 90 af d8 4a 13  |A....d..o.....J.|
-00000040  c5 01                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 2a 5a a1  |.............*Z.|
+00000010  d5 31 ba 8b 9d 3f f1 54  e0 53 cf 84 70 3b f5 bf  |.1...?.T.S..p;..|
+00000020  11 3c ad 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.<..............|
+00000030  1b ad 23 3d 37 69 87 9d  b5 60 f1 8a 13 d6 09 ab  |..#=7i...`......|
+00000040  a4 9b                                             |..|
index 4e021207c13e2cce135cf1ddda1d4c59aa2ddcd6..95781c6853b84226b923268fcd8909506e382991 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 fa c6 67 00 b7  |....Y...U....g..|
-00000010  e2 10 1e 8e b4 64 0e 4e  78 38 25 ff fb 5f bf 9f  |.....d.Nx8%.._..|
-00000020  b6 de b2 91 50 6c 67 0a  bd dc dd 20 83 f5 41 e7  |....Plg.... ..A.|
-00000030  98 0c 38 d9 3b 09 18 d2  2e 16 f5 ef 98 a9 ce 38  |..8.;..........8|
-00000040  f1 36 3e bb 6d 45 81 b8  03 82 57 3d c0 09 00 00  |.6>.mE....W=....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 eb a2 77 eb b6  |....Y...U....w..|
+00000010  1e e4 5c 2c ed 5a dc 93  1b 7e 8a 75 a1 8c ac a6  |..\,.Z...~.u....|
+00000020  69 13 f6 f6 a4 69 07 93  99 cf 12 20 37 d7 f8 26  |i....i..... 7..&|
+00000030  46 ea 3a 21 03 d0 25 0f  22 84 8d 24 2f 98 3d 42  |F.:!..%."..$/.=B|
+00000040  eb 47 1d de 0c 12 ab 95  7a 55 46 f7 c0 09 00 00  |.G......zUF.....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 da 76  |*............ .v|
-00000280  af 3a be 2d da 07 b1 41  61 16 f3 ad c1 3f b5 95  |.:.-...Aa....?..|
-00000290  27 4a 91 9d de f0 b8 a3  c7 ad c8 64 47 35 04 03  |'J.........dG5..|
-000002a0  00 8b 30 81 88 02 42 01  86 ea 56 df 52 76 06 31  |..0...B...V.Rv.1|
-000002b0  ae d9 80 6b 51 a0 61 84  9c a2 e5 aa dc d5 54 ba  |...kQ.a.......T.|
-000002c0  ca c9 88 d2 90 f6 a1 76  6c 38 39 d4 0b 2e e0 e5  |.......vl89.....|
-000002d0  6a f5 f1 98 97 d4 a9 5a  73 a8 c7 67 eb 8b e2 8a  |j......Zs..g....|
-000002e0  2c 2a 80 a3 7e 5d 5e d8  0c 02 42 01 96 20 c9 4a  |,*..~]^...B.. .J|
-000002f0  a5 43 f1 c0 08 20 72 ea  d2 9c 89 2b ef aa f1 37  |.C... r....+...7|
-00000300  ff 00 78 3a 51 61 6a 13  61 7b e9 ea 37 bf 35 18  |..x:Qaj.a{..7.5.|
-00000310  5a 19 33 29 4d fe e6 d4  0e cc 1e 21 13 6e ed 62  |Z.3)M......!.n.b|
-00000320  bc d5 66 26 a4 82 d5 e0  99 3b ed 70 78 16 03 03  |..f&.....;.px...|
+00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 90 68  |*............ .h|
+00000280  81 8b 1d 7f d5 69 36 d3  4e 63 40 fa 3a 21 ee a4  |.....i6.Nc@.:!..|
+00000290  c7 b4 09 bc 34 51 89 df  d5 d2 79 51 34 32 04 03  |....4Q....yQ42..|
+000002a0  00 8b 30 81 88 02 42 01  b4 69 6b 1c e6 35 99 81  |..0...B..ik..5..|
+000002b0  fb aa cb b4 2d e9 e0 48  6a 6c 5e 14 54 77 b7 9d  |....-..Hjl^.Tw..|
+000002c0  df a3 c2 1b 53 8c d2 46  6d 2e ae 83 3a db 7c 86  |....S..Fm...:.|.|
+000002d0  4a 45 c7 51 cd 30 d6 8c  f5 4f ea 37 cb 1e 27 18  |JE.Q.0...O.7..'.|
+000002e0  ba df d5 5f 11 ae 0e af  75 02 42 01 2b 37 2e 6d  |..._....u.B.+7.m|
+000002f0  7c 11 57 b7 b7 8b 90 73  cd e0 c9 38 3c ee aa d5  ||.W....s...8<...|
+00000300  f2 cd ff b9 66 6a be 62  70 74 ee a4 f4 e3 fb 4f  |....fj.bpt.....O|
+00000310  ed 2e d5 a7 b5 a4 53 c8  1b 17 9e e9 48 e1 dd a6  |......S.....H...|
+00000320  e8 6a 05 cf 73 b2 85 11  13 37 be e0 26 16 03 03  |.j..s....7..&...|
 00000330  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 08 0a dc  8c c5 3e 8d 03 ab e1 c3  |..........>.....|
-00000050  ea aa 03 d8 1d 19 99 9c  2c 15 09 4b 39 a8 51 c6  |........,..K9.Q.|
-00000060  4e 15 46 1c d2 7c b0 a9  4b 7f be c9 35 99 ab db  |N.F..|..K...5...|
-00000070  4b e0 6c 62 17                                    |K.lb.|
+00000040  00 00 00 00 00 7f 83 b7  cd 14 66 fb c3 2a f9 9f  |..........f..*..|
+00000050  79 ec 40 e5 dd 15 46 f3  25 8d dd b2 8e d5 78 97  |y.@...F.%.....x.|
+00000060  e5 d6 4e 1a 2e 35 21 b2  aa ac 28 6f 2c 36 a6 6e  |..N..5!...(o,6.n|
+00000070  44 92 84 1b b9                                    |D....|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 ae ce d9 46 bc  |..........@...F.|
-00000010  2f df aa fb d6 7d 52 e3  e9 a0 e6 e9 22 14 ae fe  |/....}R....."...|
-00000020  ce 34 c2 b2 16 ae aa 6b  72 90 d3 a6 e9 1e 96 3f  |.4.....kr......?|
-00000030  fd 45 d7 cc 28 db ac f7  42 55 3e 24 2c 5e dc 3e  |.E..(...BU>$,^.>|
-00000040  5f 6e 36 76 6e ab 1c 35  76 e5 4b                 |_n6vn..5v.K|
+00000000  14 03 03 00 01 01 16 03  03 00 40 db ee f8 c1 0e  |..........@.....|
+00000010  7f 23 b4 cb e6 db 03 2a  fb 68 40 78 85 03 9e dc  |.#.....*.h@x....|
+00000020  ac f8 f0 b5 65 8d 7c 01  4a ce 86 29 a9 c5 c3 b2  |....e.|.J..)....|
+00000030  12 8d d1 58 af e7 21 75  e4 be f3 c0 03 55 f8 bb  |...X..!u.....U..|
+00000040  71 bd 85 ee 46 87 a0 32  75 ee 4c                 |q...F..2u.L|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 48 f8 b0  95 19 6b 5f 9a 03 5d 10  |.....H....k_..].|
-00000020  d6 1a 3c ed d1 f8 73 4f  84 52 63 a2 3a f5 3c 4d  |..<...sO.Rc.:.<M|
-00000030  94 d7 a3 cf a4 15 03 03  00 30 00 00 00 00 00 00  |.........0......|
-00000040  00 00 00 00 00 00 00 00  00 00 09 9d 9d 6b 46 62  |.............kFb|
-00000050  f2 78 42 c0 f8 07 4e 58  8c a9 fa f2 8c 80 c9 fc  |.xB...NX........|
-00000060  ad 32 75 f8 9b 3b d7 32  7f 38                    |.2u..;.2.8|
+00000010  00 00 00 00 00 48 95 f8  a1 0e a7 d0 50 dd cf 8f  |.....H......P...|
+00000020  c4 af ec 49 89 bf 5d 8b  a0 d0 60 7b 38 5a 83 e4  |...I..]...`{8Z..|
+00000030  72 47 7f 81 bd 15 03 03  00 30 00 00 00 00 00 00  |rG.......0......|
+00000040  00 00 00 00 00 00 00 00  00 00 48 06 f1 30 61 dd  |..........H..0a.|
+00000050  e2 97 aa 9c 5f a7 07 bb  44 a4 fb d6 6a 7c aa f5  |...._...D...j|..|
+00000060  16 ae 38 1a 98 e5 f5 28  c2 57                    |..8....(.W|
index a0c3f3073a505bf6f8638c6e9f38ba12abc9e69b..7214747d15eac01d1397570e60a283ec8f8e1d96 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 d1 cf 2d 7a f6  |....Y...U....-z.|
-00000010  a2 09 06 6e 67 c1 ce 6e  ae 25 49 da fc 24 4f d1  |...ng..n.%I..$O.|
-00000020  8a a0 2e d0 7f 87 a4 8b  58 c8 37 20 22 d2 39 81  |........X.7 ".9.|
-00000030  5b 59 bd 0f 7b 59 b4 2c  38 d4 e0 03 1c 3b 5a 99  |[Y..{Y.,8....;Z.|
-00000040  20 57 75 30 3d 3f a8 d9  cd 33 41 17 c0 2b 00 00  | Wu0=?...3A..+..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 c9 a1 8b 70 59  |....Y...U.....pY|
+00000010  8b 88 41 56 b7 bc 9a 1f  50 57 46 7d 79 d8 ef b2  |..AV....PWF}y...|
+00000020  15 3f ad ad bb 48 09 ce  e1 c2 2c 20 84 43 65 e7  |.?...H...., .Ce.|
+00000030  3f 2f d8 13 9a 79 ac 54  ee b9 13 a1 7c a7 05 f7  |?/...y.T....|...|
+00000040  c8 b4 fc bd 20 40 17 ca  15 cd 91 1e c0 2b 00 00  |.... @.......+..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 1a b3  |*............ ..|
-00000280  9a e4 c6 dd ca 36 10 16  55 e4 97 36 a5 b2 e7 e9  |.....6..U..6....|
-00000290  42 b3 f3 a0 bb df d8 a5  00 be 40 35 8c 50 04 03  |B.........@5.P..|
-000002a0  00 8a 30 81 87 02 42 01  90 c8 0f 71 3e 83 c9 6b  |..0...B....q>..k|
-000002b0  f2 b0 75 7d 9c 54 d4 33  59 fd ef 69 b4 d9 4d 9b  |..u}.T.3Y..i..M.|
-000002c0  48 fd cd 45 e5 e4 6c 8a  3a d5 1d 60 dc 88 65 3b  |H..E..l.:..`..e;|
-000002d0  98 81 e1 69 38 d9 bf fe  19 65 6b d9 da 57 8b d3  |...i8....ek..W..|
-000002e0  b3 ef 54 db 4b dc f5 42  02 02 41 0d ab cd 01 a9  |..T.K..B..A.....|
-000002f0  fc b8 10 40 2c 1a c7 46  e1 54 c0 5b 7f 24 28 49  |...@,..F.T.[.$(I|
-00000300  fc 8b 62 e5 3e 99 db 2f  3d 69 d9 4c 86 c2 45 bb  |..b.>../=i.L..E.|
-00000310  89 0a f7 2e 7d 9f fb f8  fc 49 f9 c3 fb 21 f6 21  |....}....I...!.!|
-00000320  10 35 7f 92 14 09 37 76  8b 2c 6c f2 16 03 03 00  |.5....7v.,l.....|
-00000330  04 0e 00 00 00                                    |.....|
+00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 58 f9  |*............ X.|
+00000280  2e 03 90 fa 3d 33 0d 3e  e1 3a b1 5a 45 ec 5c ee  |....=3.>.:.ZE.\.|
+00000290  9f 47 51 4b 93 89 33 11  e0 63 86 fd b2 3b 04 03  |.GQK..3..c...;..|
+000002a0  00 8b 30 81 88 02 42 01  c2 fa 7b f8 ed 6b a5 0f  |..0...B...{..k..|
+000002b0  33 87 02 35 5b 8e 5d 31  5e 92 df c2 90 ae 58 24  |3..5[.]1^.....X$|
+000002c0  43 0f ba e3 b8 77 12 7a  97 c3 77 15 62 d3 f2 cc  |C....w.z..w.b...|
+000002d0  10 cd a9 be b6 b2 37 93  b1 ce 8b b2 6c fa 93 74  |......7.....l..t|
+000002e0  5e 14 8e ba 9e d7 66 48  b8 02 42 01 8e 9a 10 1d  |^.....fH..B.....|
+000002f0  7d e0 d3 cf 0d d0 3c bc  34 1c 16 20 85 50 03 3f  |}.....<.4.. .P.?|
+00000300  e1 6d a3 a0 d4 6e d8 fd  7e df b4 c1 84 29 c3 68  |.m...n..~....).h|
+00000310  c2 01 dd 77 fc 2c a5 8f  3b 74 c6 e4 32 20 b7 a0  |...w.,..;t..2 ..|
+00000320  8c 1b 2d 93 6a 9c 8a ed  21 b5 9a e0 cb 16 03 03  |..-.j...!.......|
+00000330  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 0b f4 58  |....(..........X|
-00000040  bd 46 cf 10 2b 5b f7 6b  89 44 12 a2 25 95 cd a3  |.F..+[.k.D..%...|
-00000050  df ce 5c e4 e2 50 5f ef  06 84 06 03 8f           |..\..P_......|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 c2 14 2d  |....(..........-|
+00000040  fc d7 a2 cb 18 b9 2a ae  38 70 b7 78 7c 88 97 d3  |......*.8p.x|...|
+00000050  ff 7f df 12 23 96 ab 4d  6c 5c 67 72 c4           |....#..Ml\gr.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 2f 02 07 37 3f  |..........(/..7?|
-00000010  3c 9d 0a fb 03 31 a2 df  0f d6 b4 53 f8 fa 38 bb  |<....1.....S..8.|
-00000020  47 ed 9d 69 b7 64 72 75  8a 06 f2 fa 9f 06 a4 91  |G..i.dru........|
-00000030  65 c5 6e                                          |e.n|
+00000000  14 03 03 00 01 01 16 03  03 00 28 2a dd b3 5b c6  |..........(*..[.|
+00000010  76 e7 c0 ac 8c 70 77 d6  d8 4e 79 4a 04 3d 91 a9  |v....pw..NyJ.=..|
+00000020  ad 79 ef c9 22 78 17 9e  ef b0 03 c8 e6 85 b7 8c  |.y.."x..........|
+00000030  e5 74 95                                          |.t.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 31 4a a6  |.............1J.|
-00000010  a1 88 d0 36 6a 11 b7 4f  81 a8 f5 1d c1 c6 d1 51  |...6j..O.......Q|
-00000020  3b a2 b1 15 03 03 00 1a  00 00 00 00 00 00 00 02  |;...............|
-00000030  0e 35 89 7d 67 0e 8d b7  6f c9 86 6d 33 05 9f 7c  |.5.}g...o..m3..||
-00000040  ab 8e                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 84 b5 0f  |................|
+00000010  1f ed f9 4c 0d a1 f3 7b  8e 23 87 65 b1 39 98 50  |...L...{.#.e.9.P|
+00000020  3d ff 1b 15 03 03 00 1a  00 00 00 00 00 00 00 02  |=...............|
+00000030  aa 34 cc f1 4a d3 de 4c  42 bc 2c 0f 3e 71 af 6b  |.4..J..LB.,.>q.k|
+00000040  3c fc                                             |<.|
index 12b87c95c8f2d976841f6ea0986268c6580905dc..96f6218a35d35a64777360ca6732100afafba30f 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 bd b8 d6 c0 5c  |....Y...U......\|
-00000010  0c 7f e3 50 4c 1c d3 b0  0f 67 1a 32 cc 49 18 03  |...PL....g.2.I..|
-00000020  41 91 87 43 0c eb 40 53  a4 2c 0c 20 ec a4 59 bd  |A..C..@S.,. ..Y.|
-00000030  cb 3e b8 94 d9 74 ee ab  8e 7a 24 c8 cc af 08 87  |.>...t...z$.....|
-00000040  e7 9c d1 01 4e fe 7d 1d  5d cf e0 2c c0 23 00 00  |....N.}.]..,.#..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 87 87 6f ce 44  |....Y...U....o.D|
+00000010  94 5f 2f cc 94 03 50 68  a7 4f 37 70 8a d4 cf e3  |._/...Ph.O7p....|
+00000020  23 7f 11 f5 93 c7 3f 96  87 49 45 20 9c d4 96 b2  |#.....?..IE ....|
+00000030  dc 8c 16 c5 fb cc 2f 8e  0e a5 ef a3 ea cf 57 d0  |....../.......W.|
+00000040  09 70 bd 16 c4 d9 e4 1b  a0 40 f7 f3 c0 23 00 00  |.p.......@...#..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 6d 7f  |*............ m.|
-00000280  23 3f 8c 08 0f db 54 cc  dc 84 d7 97 f0 18 85 68  |#?....T........h|
-00000290  e3 17 94 f6 48 f3 c2 9c  4c 3e 58 47 ed 29 04 03  |....H...L>XG.)..|
-000002a0  00 8a 30 81 87 02 42 01  c1 d9 7a d0 fb d9 ff 31  |..0...B...z....1|
-000002b0  78 20 9e 2e 5c f0 22 97  1b 24 e8 50 6f 5d 8c db  |x ..\."..$.Po]..|
-000002c0  fb 97 0d 2d 73 08 ae 46  14 1c 76 2b 38 ad 75 2d  |...-s..F..v+8.u-|
-000002d0  a2 8e 5a 99 40 47 51 1f  11 af c0 86 bc c9 3b e3  |..Z.@GQ.......;.|
-000002e0  a0 ff 6a e6 87 e6 74 d8  fd 02 41 7a 72 6a 93 12  |..j...t...Azrj..|
-000002f0  4b 48 f9 46 af 95 90 1e  3b c7 2c fe 67 a1 44 d8  |KH.F....;.,.g.D.|
-00000300  77 1c 7e 03 fe be ba 9d  a1 85 81 42 fb 18 7d 08  |w.~........B..}.|
-00000310  e6 04 1f 3e 05 eb 48 87  4e 28 1c e9 00 db 7f c4  |...>..H.N(......|
-00000320  17 cb 21 02 37 90 47 fd  2f db 95 a7 16 03 03 00  |..!.7.G./.......|
+00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 3f a6  |*............ ?.|
+00000280  d1 0d ae 8d c0 06 14 ca  da 2c 69 1c f1 84 c4 dd  |.........,i.....|
+00000290  14 f4 0e a6 ce b5 d6 37  9d 9f a5 ba 7b 74 04 03  |.......7....{t..|
+000002a0  00 8a 30 81 87 02 42 00  b5 2b 9a 32 9d af b9 cc  |..0...B..+.2....|
+000002b0  0d b6 f1 9b 87 35 af d7  dc 04 0f 1b 04 d7 fa 62  |.....5.........b|
+000002c0  20 bd 2c 31 41 17 e7 c0  ea 22 78 e4 de 37 14 a8  | .,1A...."x..7..|
+000002d0  f9 f3 f1 3e 0c 55 59 b3  e3 0e 31 26 ce d0 c1 19  |...>.UY...1&....|
+000002e0  b8 17 07 2a 23 98 7b 17  0f 02 41 41 d5 51 80 4d  |...*#.{...AA.Q.M|
+000002f0  8a 14 56 b1 39 7b 8b 37  24 ef e0 ec 43 44 5a cc  |..V.9{.7$...CDZ.|
+00000300  9b ab dc 63 e7 cc 7b 29  c0 66 ae 9c 23 c5 1b 98  |...c..{).f..#...|
+00000310  6e 35 64 97 12 43 16 73  a6 6b c8 09 2c 26 7c f5  |n5d..C.s.k..,&|.|
+00000320  b1 1f 9f 55 04 9e 53 33  c1 89 7a d0 16 03 03 00  |...U..S3..z.....|
 00000330  04 0e 00 00 00                                    |.....|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 50 00 00 00  00 00 00 00 00 00 00 00  |....P...........|
-00000040  00 00 00 00 00 7a c5 98  1b ac 30 7c ea 9b cc 6d  |.....z....0|...m|
-00000050  5d 40 19 5d 6e 47 8a 46  d4 de 8c a3 f8 9b b1 2c  |]@.]nG.F.......,|
-00000060  9f 90 e9 83 2c a6 18 9f  39 92 d5 1f ab d5 5a 03  |....,...9.....Z.|
-00000070  79 44 36 e3 0d b5 c9 e4  36 73 08 7d 55 e0 23 d6  |yD6.....6s.}U.#.|
-00000080  82 f3 d7 4e ba                                    |...N.|
+00000040  00 00 00 00 00 d3 72 3f  9d 37 ba 97 55 83 b4 f0  |......r?.7..U...|
+00000050  ad 0b f0 48 98 16 05 f1  b5 6e da a4 79 e4 d9 8e  |...H.....n..y...|
+00000060  62 af b9 a1 d1 a4 5c 04  d2 b1 86 32 af 64 ac 89  |b.....\....2.d..|
+00000070  d3 47 5f 61 ae f4 21 5b  8d 4b ff 74 c1 b8 9c de  |.G_a..![.K.t....|
+00000080  fd 74 a0 99 c1                                    |.t...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 a4 84 15 44 2e  |..........P...D.|
-00000010  6e e3 20 8d 7c a0 e4 85  36 7b a6 19 35 38 52 d0  |n. .|...6{..58R.|
-00000020  bf 47 7e b4 09 a7 5b 5b  e6 7c ad 4a b0 56 0a 28  |.G~...[[.|.J.V.(|
-00000030  50 ef 94 89 8b 54 80 06  7a d8 b2 5d 75 ab e2 ff  |P....T..z..]u...|
-00000040  b1 6c 11 60 d2 0d 06 af  bf 45 fd d8 5a 7b 2d 9c  |.l.`.....E..Z{-.|
-00000050  7c a1 b7 5e 4c 77 c9 ed  56 f0 68                 ||..^Lw..V.h|
+00000000  14 03 03 00 01 01 16 03  03 00 50 09 3b 3e 7e 2e  |..........P.;>~.|
+00000010  d8 46 04 ac b0 3d c9 7e  ec 28 8c bd 6c 0f a8 b5  |.F...=.~.(..l...|
+00000020  af 8c 86 ed 64 81 6c d4  98 9e 56 2a 48 0d 03 40  |....d.l...V*H..@|
+00000030  64 3e 25 58 6f 03 6a 4e  be a2 11 6f 6f e7 2f c2  |d>%Xo.jN...oo./.|
+00000040  8f 78 c4 11 a1 07 21 91  9d 34 01 08 39 0d 07 d2  |.x....!..4..9...|
+00000050  d4 a2 cc 2f 25 ea ee 8d  8b 91 f9                 |.../%......|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 0b 1a da  c8 8a 8e 62 45 0b b3 69  |...........bE..i|
-00000020  6a 6e 43 20 54 ae 4e 10  4b 64 0c e0 d6 1c 77 9d  |jnC T.N.Kd....w.|
-00000030  bd 23 f7 0a 7d eb 2e 54  9a d7 08 1d c6 af eb a9  |.#..}..T........|
-00000040  6e c2 18 b5 95 15 03 03  00 40 00 00 00 00 00 00  |n........@......|
-00000050  00 00 00 00 00 00 00 00  00 00 c7 9c 8c 71 7f 00  |.............q..|
-00000060  42 8e 5b 14 4a 9b 88 a1  5b 68 b4 45 16 c0 c1 91  |B.[.J...[h.E....|
-00000070  3e 9a 9f 84 b2 9b b3 f2  f5 e3 50 53 2e d8 4b 7c  |>.........PS..K||
-00000080  2a e8 e9 91 64 81 5a f4  43 f3                    |*...d.Z.C.|
+00000010  00 00 00 00 00 1d 76 4c  fb 46 f8 02 9a bc 07 8d  |......vL.F......|
+00000020  b0 52 40 44 58 da ad be  3c a6 d7 44 0f 59 98 f3  |.R@DX...<..D.Y..|
+00000030  ae 5c d2 04 bb 07 ee f6  99 9d 2c 14 44 3b 90 bc  |.\........,.D;..|
+00000040  2b e9 bc 37 59 15 03 03  00 40 00 00 00 00 00 00  |+..7Y....@......|
+00000050  00 00 00 00 00 00 00 00  00 00 c4 ef 97 87 35 a2  |..............5.|
+00000060  2f cc c2 6f 3d d5 f5 6f  fd 74 56 50 37 f8 10 e8  |/..o=..o.tVP7...|
+00000070  36 f5 fb 6f 7b 5d 20 07  0d 2f 72 46 a7 3a e0 de  |6..o{] ../rF.:..|
+00000080  39 b3 76 0e 4f c0 e7 85  4b bb                    |9.v.O...K.|
index 70608d8e472d0f0176cb0ac74e08d69f34769ac6..90a1639e9901dab5afb17de7a254b0fbd9c9138c 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 97 16 31 62 59  |....Y...U....1bY|
-00000010  8f a6 1c c4 b2 65 e5 d3  85 92 16 5e 52 06 03 9f  |.....e.....^R...|
-00000020  5a 20 35 3f c2 68 a7 3f  40 18 44 20 d1 5f 9f a0  |Z 5?.h.?@.D ._..|
-00000030  2c f9 83 69 98 2f 3f ff  ad 1c d8 bc ba 36 33 a7  |,..i./?......63.|
-00000040  72 8e a4 a7 1e cb 42 db  ef 3c ee b0 c0 2c 00 00  |r.....B..<...,..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 b8 16 bd ae 15  |....Y...U.......|
+00000010  a3 33 52 cc 60 dc 6c fe  7c f3 82 b9 1e 13 ab 87  |.3R.`.l.|.......|
+00000020  22 d8 c3 38 dc 8a 76 bb  a0 a3 fd 20 8a d1 92 d1  |"..8..v.... ....|
+00000030  d6 f3 76 e0 e2 76 32 95  32 a0 eb 5b dc e4 42 81  |..v..v2.2..[..B.|
+00000040  14 bb 58 ab b8 e8 9d ee  fa 32 58 05 c0 2c 00 00  |..X......2X..,..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 71 52  |*............ qR|
-00000280  57 ca a4 04 3b 72 37 67  bc 0f 5d 37 ac 33 21 9f  |W...;r7g..]7.3!.|
-00000290  65 cd 27 a1 5f b5 19 ff  9b cb 35 ce 98 76 04 03  |e.'._.....5..v..|
-000002a0  00 8a 30 81 87 02 41 13  01 36 e8 6e a5 85 d8 65  |..0...A..6.n...e|
-000002b0  d4 0c 38 31 bb 99 5f 39  f9 49 6f b7 bd 75 ef 5c  |..81.._9.Io..u.\|
-000002c0  87 d6 86 b4 76 25 87 72  50 e7 20 14 5f c4 1e b0  |....v%.rP. ._...|
-000002d0  fe c0 8c 44 a7 e0 18 1b  01 38 4d 11 d1 c5 ad 05  |...D.....8M.....|
-000002e0  87 09 dd dd 8a f0 96 9c  02 42 00 e4 50 9b 26 b0  |.........B..P.&.|
-000002f0  3c 00 7f 66 8b 71 12 cc  7f ba 03 6e b5 d9 3c a5  |<..f.q.....n..<.|
-00000300  2e 0a 10 d0 66 0b 82 10  97 45 4e 19 6e 95 7c 52  |....f....EN.n.|R|
-00000310  ca b1 ae 96 b7 c4 ee 93  67 41 d7 e4 4c 28 7a d6  |........gA..L(z.|
-00000320  70 10 dc 95 f9 22 52 3a  38 74 73 54 16 03 03 00  |p...."R:8tsT....|
+00000270  2a 16 03 03 00 b6 0c 00  00 b2 03 00 1d 20 5c 9b  |*............ \.|
+00000280  9b 29 5c 83 36 b8 20 47  2b 04 0d 1b ab f5 f7 81  |.)\.6. G+.......|
+00000290  aa 89 b4 93 37 aa 28 4e  44 e1 22 26 b6 46 04 03  |....7.(ND."&.F..|
+000002a0  00 8a 30 81 87 02 42 01  2c 87 df 1f 07 86 36 c8  |..0...B.,.....6.|
+000002b0  f6 aa 41 c1 8e 99 6e 12  08 5f e2 62 4b 3a 9b ad  |..A...n.._.bK:..|
+000002c0  e8 26 1c 95 f9 62 c6 f6  c7 e4 f7 db 3b 23 e5 4f  |.&...b......;#.O|
+000002d0  03 a1 c6 89 74 cb bd 2a  4e 47 3f 0f bf 28 bb 6d  |....t..*NG?..(.m|
+000002e0  c0 c6 53 4c 02 0b 9a 30  2d 02 41 0c 6f 26 a5 4c  |..SL...0-.A.o&.L|
+000002f0  b6 6c 8c ab 82 32 19 a0  f0 1b 41 2d 9d 1d 12 1b  |.l...2....A-....|
+00000300  91 62 6a 3d 17 92 79 f6  59 45 21 2f 6b d0 cb 7b  |.bj=..y.YE!/k..{|
+00000310  22 b3 79 80 90 90 81 97  06 c8 59 fd 8b 40 f9 ec  |".y.......Y..@..|
+00000320  80 58 db fc 5e a2 67 9a  96 01 53 d4 16 03 03 00  |.X..^.g...S.....|
 00000330  04 0e 00 00 00                                    |.....|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 1a c4 04  |....(...........|
-00000040  eb 27 48 c1 ed 93 75 73  01 06 e3 55 70 6c c6 a0  |.'H...us...Upl..|
-00000050  62 eb f5 a9 f3 8c a5 8a  e3 e9 43 a4 2e           |b.........C..|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 17 be e6  |....(...........|
+00000040  ba 39 2d 82 38 6e 09 2c  1c ef d5 1f ad 8e e0 47  |.9-.8n.,.......G|
+00000050  2d bc 74 f8 3b ed 86 89  9e e9 a5 01 40           |-.t.;.......@|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 6e bc 2f ed 32  |..........(n./.2|
-00000010  53 00 47 5c 73 6c e3 86  38 e5 df e2 db 40 bf 31  |S.G\sl..8....@.1|
-00000020  87 a5 33 fb af dd c9 c7  1c 98 7b ba 11 42 5e 0a  |..3.......{..B^.|
-00000030  f1 65 3b                                          |.e;|
+00000000  14 03 03 00 01 01 16 03  03 00 28 42 3b b0 5e 66  |..........(B;.^f|
+00000010  3e ef a5 3d 49 64 42 34  b1 21 d6 43 d3 f6 f5 84  |>..=IdB4.!.C....|
+00000020  21 96 b4 7b ed 73 b5 23  b6 40 cf 86 ab 71 59 58  |!..{.s.#.@...qYX|
+00000030  3a bf 79                                          |:.y|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 75 32 a8  |.............u2.|
-00000010  ce 12 60 b4 d6 83 2c 4a  e5 43 cb 6d c8 f3 f2 ee  |..`...,J.C.m....|
-00000020  8e 1e 2c 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..,.............|
-00000030  4e bb e9 81 44 f2 44 90  7c ac 8a 35 a3 ef e2 9b  |N...D.D.|..5....|
-00000040  d9 2b                                             |.+|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 8d 3c f7  |..............<.|
+00000010  9e da 91 15 35 10 5f a4  29 32 3f 6a 8c 1d bc 13  |....5._.)2?j....|
+00000020  8a 35 2b 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.5+.............|
+00000030  1f b3 e3 e3 24 ac 7a a6  ee 81 e7 cc 9e 70 34 2c  |....$.z......p4,|
+00000040  d2 28                                             |.(|
index 9acc6be054bc9bf8c001a6db1ed423fd02df5b8f..1b3c37be2418adcc2f130b5c21f171d82cdc5fd2 100644 (file)
@@ -1,24 +1,24 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ce 01 00 00  ca 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 d0 01 00 00  cc 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 08 cc a9  |................|
-00000050  13 01 13 03 13 02 01 00  00 79 00 05 00 05 01 00  |.........y......|
+00000050  13 01 13 03 13 02 01 00  00 7b 00 05 00 05 01 00  |.........{......|
 00000060  00 00 00 00 0a 00 0a 00  08 00 1d 00 17 00 18 00  |................|
-00000070  19 00 0b 00 02 01 00 00  0d 00 18 00 16 08 04 08  |................|
-00000080  05 08 06 04 01 04 03 05  01 05 03 06 01 06 03 02  |................|
-00000090  01 02 03 ff 01 00 01 00  00 12 00 00 00 2b 00 09  |.............+..|
-000000a0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
-000000b0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
-000000c0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
-000000d0  cb 3b 74                                          |.;t|
+00000070  19 00 0b 00 02 01 00 00  0d 00 1a 00 18 08 04 04  |................|
+00000080  03 08 07 08 05 08 06 04  01 05 01 06 01 05 03 06  |................|
+00000090  03 02 01 02 03 ff 01 00  01 00 00 12 00 00 00 2b  |...............+|
+000000a0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
+000000b0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
+000000c0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
+000000d0  5f 58 cb 3b 74                                    |_X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 81 32 be f7 42  |....Y...U...2..B|
-00000010  de 0a 50 a4 4e a3 58 2f  7c 6b a8 14 d9 d4 66 ec  |..P.N.X/|k....f.|
-00000020  ca 4b 07 2e 59 2d f0 b2  24 1d 69 20 53 20 08 85  |.K..Y-..$.i S ..|
-00000030  8a 10 34 6d 41 d8 12 02  38 49 d6 1c c8 f5 e3 6c  |..4mA...8I.....l|
-00000040  bb ac 77 2d 2a 06 69 e9  6c fd d0 da cc a9 00 00  |..w-*.i.l.......|
+00000000  16 03 03 00 59 02 00 00  55 03 03 ea 73 50 31 e4  |....Y...U...sP1.|
+00000010  7a c7 e2 05 23 a0 22 e3  1a cd 6d b5 0f e7 f2 5e  |z...#."...m....^|
+00000020  d6 cb 6c 70 05 04 a9 63  4a a3 fc 20 a2 c5 68 f2  |..lp...cJ.. ..h.|
+00000030  9b 56 6e 83 66 c1 7f 85  02 b6 6d 37 12 0f 12 5a  |.Vn.f.....m7...Z|
+00000040  41 7e c3 c9 44 85 3c 00  50 6f c7 f9 cc a9 00 00  |A~..D.<.Po......|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
 00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
 00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
 00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
 00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 fd 29  |*............ .)|
-00000280  57 4f 25 0b 83 38 bb da  84 c4 39 52 60 97 83 88  |WO%..8....9R`...|
-00000290  31 5e 38 df 9c 24 29 8b  29 d7 90 6d 19 56 04 03  |1^8..$).)..m.V..|
-000002a0  00 8b 30 81 88 02 42 01  04 ae 1f e9 dd fe 81 62  |..0...B........b|
-000002b0  5b 68 b5 2b dd fb d0 92  18 b4 8d 6b ed 87 0e d2  |[h.+.......k....|
-000002c0  ba 3c 83 ca f4 a1 09 87  89 bf 0e 5d 40 04 a5 e3  |.<.........]@...|
-000002d0  30 22 19 0d 0c be 64 3d  c4 8a b4 22 79 98 91 0e  |0"....d=..."y...|
-000002e0  7a d6 f8 71 75 7f 5b 30  c5 02 42 01 c0 0b 0a 14  |z..qu.[0..B.....|
-000002f0  93 15 f3 b4 36 4f 06 7d  70 42 52 b5 10 66 66 db  |....6O.}pBR..ff.|
-00000300  55 40 2b b9 4c aa 77 11  b8 27 5c aa eb df df a0  |U@+.L.w..'\.....|
-00000310  d3 54 ee 14 54 c9 fc e0  a4 10 01 c7 b2 0c 82 6b  |.T..T..........k|
-00000320  7d c0 b5 80 4d 04 e7 61  63 f9 1e 78 6b 16 03 03  |}...M..ac..xk...|
+00000270  2a 16 03 03 00 b7 0c 00  00 b3 03 00 1d 20 a4 6a  |*............ .j|
+00000280  0d ab f2 7c 1a 31 2a 7d  51 b7 fe 69 cd 59 f5 c1  |...|.1*}Q..i.Y..|
+00000290  10 94 a0 b2 6f 6f c4 48  48 9b 20 1e 46 2a 04 03  |....oo.HH. .F*..|
+000002a0  00 8b 30 81 88 02 42 00  84 2a 96 88 a4 7a 86 7f  |..0...B..*...z..|
+000002b0  cf 86 20 37 17 de 54 0c  c2 89 5e 27 f4 3b a4 ec  |.. 7..T...^'.;..|
+000002c0  ce 25 34 4e c7 a8 7d f5  56 6d 96 2c d0 53 ae 42  |.%4N..}.Vm.,.S.B|
+000002d0  b5 87 a9 20 9c 4f c9 67  7e ca f6 fc 2f 61 72 35  |... .O.g~.../ar5|
+000002e0  78 fe 54 32 1e a1 90 88  c2 02 42 01 a6 7b 98 de  |x.T2......B..{..|
+000002f0  fd 01 4b 4a 8f 1a e8 18  dd 07 bb 0b 38 41 7f 22  |..KJ........8A."|
+00000300  62 3b 7e 37 67 b7 18 46  a7 32 43 1b c9 a9 8a a6  |b;~7g..F.2C.....|
+00000310  d7 8a 2f 7b c5 14 f3 33  96 fe 0a fc 22 d0 a5 02  |../{...3...."...|
+00000320  37 a5 31 5f b9 6b d2 3b  f6 d0 d1 7b a1 16 03 03  |7.1_.k.;...{....|
 00000330  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 51 20 c3  d5 2d 48 50 98 1a 00 5c  |.... Q ..-HP...\|
-00000040  35 83 1d c6 22 8d a3 aa  2b 3a ac bf 68 51 a8 9f  |5..."...+:..hQ..|
-00000050  23 4b c7 91 df                                    |#K...|
+00000030  16 03 03 00 20 f5 a0 28  0a 7e d4 8b a2 b6 e1 af  |.... ..(.~......|
+00000040  83 e2 50 e8 fc 7e f0 59  21 ed 3d 0d a8 ef a9 b1  |..P..~.Y!.=.....|
+00000050  5a 13 2a 1b 2c                                    |Z.*.,|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 09 1f 51 48 37  |.......... ..QH7|
-00000010  b5 c7 d8 b3 8a 17 48 1d  cc b7 32 5d 82 73 ad a2  |......H...2].s..|
-00000020  db 4a dc 4a 0d 3b 0b 26  32 56 ee                 |.J.J.;.&2V.|
+00000000  14 03 03 00 01 01 16 03  03 00 20 44 15 68 4d e0  |.......... D.hM.|
+00000010  3b 34 c5 77 b2 25 f2 e9  35 75 08 f5 a9 53 c9 65  |;4.w.%..5u...S.e|
+00000020  19 36 49 fe 43 e4 f5 48  ac 7c d7                 |.6I.C..H.|.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 de 17 a1  32 d6 09 f3 0d 72 19 eb  |........2....r..|
-00000010  05 c6 41 f9 0f c6 f7 68  b9 f6 cf 15 03 03 00 12  |..A....h........|
-00000020  79 da 43 1b 80 2b d1 46  81 f3 33 78 53 58 79 bc  |y.C..+.F..3xSXy.|
-00000030  df 51                                             |.Q|
+00000000  17 03 03 00 16 f7 fd 2a  83 90 01 f3 d2 82 dc bd  |.......*........|
+00000010  6c 33 31 a3 92 0f a4 f5  9c fa f4 15 03 03 00 12  |l31.............|
+00000020  9e 60 18 02 f1 0d 2f f5  5f 68 69 ae 62 93 04 6a  |.`..../._hi.b..j|
+00000030  41 f0                                             |A.|
index 8feca539d887ec14c233c734f0bc47e809dd4042..eff5b979f97ce2ea29cdde2b19b9c0cdd10160e6 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 1c 68 c5 b0 f8  |....Y...U...h...|
-00000010  30 5e df 4e ef 13 06 3c  38 33 bd 70 40 9c 90 cb  |0^.N...<83.p@...|
-00000020  80 bc 8e 68 af 8f c4 59  1e fd 0d 20 40 58 a4 e2  |...h...Y... @X..|
-00000030  32 5a d7 19 11 6c d3 66  94 94 21 02 ca 42 ef 25  |2Z...l.f..!..B.%|
-00000040  ce 51 d8 d3 70 07 4f 70  8d c2 8f 55 c0 13 00 00  |.Q..p.Op...U....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 f1 07 97 47 f7  |....Y...U.....G.|
+00000010  b8 42 f5 ce 2b b5 ec 5a  d3 74 f1 fa 1f ea ec 6d  |.B..+..Z.t.....m|
+00000020  49 4e cf 2e 47 8b 2e 80  9b 8a ed 20 89 ca 35 4a  |IN..G...... ..5J|
+00000030  f4 35 5e b7 ed b2 96 ad  e1 66 1d 43 9d 07 ba ed  |.5^......f.C....|
+00000040  ff 9d 47 65 c8 7d 91 32  4b 88 4d 83 c0 13 00 00  |..Ge.}.2K.M.....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 5a a4 2f e5 a1 8d 85  |........ Z./....|
-000002d0  b5 4e f8 ac 27 83 77 b5  f5 ec c7 0a 92 39 a3 9e  |.N..'.w......9..|
-000002e0  31 7f e7 10 8f ac 56 07  74 08 04 00 80 6c 8c 2e  |1.....V.t....l..|
-000002f0  e8 7c d9 a6 d3 e9 bc 74  20 6a ad 01 80 ca 44 0c  |.|.....t j....D.|
-00000300  14 5d da 64 bd a3 32 07  03 2c 0a cf 87 56 af 01  |.].d..2..,...V..|
-00000310  32 4c 46 df c7 3b 34 56  a6 7a f6 1c 43 fb f0 43  |2LF..;4V.z..C..C|
-00000320  54 7c c8 47 0b 02 8e 2d  07 e8 bc 4c b2 9e ea 1d  |T|.G...-...L....|
-00000330  2b 29 9b e4 5d 5f ee 8a  4a 50 eb ec b7 09 68 e4  |+)..]_..JP....h.|
-00000340  c1 99 6a 2d b9 d6 11 b2  9f d9 ee 13 ee 2e b3 d2  |..j-............|
-00000350  1e be a0 6a 13 86 f0 53  7f aa 60 8e 87 5f ab 5d  |...j...S..`.._.]|
-00000360  f1 5a a4 1f 0b 85 b1 31  5f 2f af e9 7a 16 03 03  |.Z.....1_/..z...|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 78 22 92 20 a9 be 78  |........ x". ..x|
+000002d0  12 0f e6 83 13 3d 13 91  16 11 ca 26 9f b7 37 d5  |.....=.....&..7.|
+000002e0  f0 97 f9 f2 01 fd 08 4f  42 08 04 00 80 2c f1 4e  |.......OB....,.N|
+000002f0  79 63 f2 d9 54 1c 0c 56  fd 56 4d e0 37 ee 5d bb  |yc..T..V.VM.7.].|
+00000300  22 90 fd ee d9 0f e6 d9  85 41 b9 8d d6 76 5f 05  |"........A...v_.|
+00000310  1b 8c d7 4e c5 e8 4e 69  b9 5d de 73 c0 ed 4f 3e  |...N..Ni.].s..O>|
+00000320  09 9d b0 10 d6 61 87 d8  f9 c2 5b 48 f9 ef dd 65  |.....a....[H...e|
+00000330  e6 f8 b0 d2 71 f6 e9 ae  b1 c0 ea 90 dc 33 c6 72  |....q........3.r|
+00000340  3e 9f 31 d4 ae 78 23 54  7a 4f 02 69 72 c1 06 2f  |>.1..x#TzO.ir../|
+00000350  3f 3c 7b f2 d8 17 40 a6  95 6d 46 62 6b 54 f1 cf  |?<{...@..mFbkT..|
+00000360  60 08 63 89 f7 a5 2a 52  3b 0e 0c d6 34 16 03 03  |`.c...*R;...4...|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 d8 4d 17  e4 39 b7 4e 96 d1 1f 75  |......M..9.N...u|
-00000050  db 2c 1d df b9 72 c0 c8  5c b3 22 75 98 81 82 67  |.,...r..\."u...g|
-00000060  26 2c 45 d3 f0 34 0f 21  0a dd 6b 99 f8 82 70 3c  |&,E..4.!..k...p<|
-00000070  f3 7d 6a 15 91                                    |.}j..|
+00000040  00 00 00 00 00 96 55 d3  bd a1 b6 de 93 68 19 ed  |......U......h..|
+00000050  4a 3a cc 42 7c c4 41 1e  b5 37 65 d5 84 10 60 3d  |J:.B|.A..7e...`=|
+00000060  e9 57 29 28 79 54 da 6c  1b 36 6b b1 75 f4 bb 32  |.W)(yT.l.6k.u..2|
+00000070  47 8d de c8 7d                                    |G...}|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 27 83 f0 1d 2e  |..........@'....|
-00000010  f9 99 0e 36 76 7f 1e 8f  67 5d a8 26 27 c7 ad a1  |...6v...g].&'...|
-00000020  9f 51 ab d8 2e c8 1c 62  a3 01 b6 f3 6a 95 69 5f  |.Q.....b....j.i_|
-00000030  5b 09 eb d1 e6 19 76 72  4a 67 26 01 78 89 ac 77  |[.....vrJg&.x..w|
-00000040  e3 5c 7d 5b 17 79 a7 e4  19 bc 1a                 |.\}[.y.....|
+00000000  14 03 03 00 01 01 16 03  03 00 40 db ed ec 54 4a  |..........@...TJ|
+00000010  20 d8 a7 ee 12 04 e2 e4  95 b4 a4 a7 e1 80 c8 40  | ..............@|
+00000020  81 00 6d 3e 58 26 7c d4  26 84 86 ee b4 fc c5 50  |..m>X&|.&......P|
+00000030  46 31 e7 4c 1e fd ed 10  7e 72 45 18 43 db 4c 0d  |F1.L....~rE.C.L.|
+00000040  b5 49 6c 31 04 f0 85 a7  f8 02 e1                 |.Il1.......|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 24 63 76  ce f0 2a 88 0f 9b 51 b7  |.....$cv..*...Q.|
-00000020  15 86 74 ac c9 72 88 7a  26 34 ff c5 ec bb a8 6d  |..t..r.z&4.....m|
-00000030  44 97 00 3f ff 15 03 03  00 30 00 00 00 00 00 00  |D..?.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 f4 9d 5b 90 05 e6  |............[...|
-00000050  42 af 3c 4c 86 d8 ba d5  b7 88 8e ec 8c 07 24 5e  |B.<L..........$^|
-00000060  5b 3f e4 41 89 7e 1f 3a  ca 2d                    |[?.A.~.:.-|
+00000010  00 00 00 00 00 90 f7 06  a7 05 8d de 51 21 88 95  |............Q!..|
+00000020  47 61 fb 8d a9 c9 6d 59  ca 92 8d 07 8b 9d 82 4e  |Ga....mY.......N|
+00000030  fd e9 ae 3d b0 15 03 03  00 30 00 00 00 00 00 00  |...=.....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 12 77 0c 5f 12 4b  |...........w._.K|
+00000050  96 ab 64 58 6e f5 82 09  6c 18 ae 1f a2 fb 0a 3b  |..dXn...l......;|
+00000060  71 17 25 8b c8 72 d0 13  fb e8                    |q.%..r....|
index 265bc21eaacc67e3cb236c7b54d24f497ef12fa9..4f8f49eb6a001bad29666178063fc3f6074bcf24 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 9a 06 bc 4a 08  |....Y...U.....J.|
-00000010  7c e9 b0 32 64 21 d8 bc  41 77 d0 9f a2 0e 9a d4  ||..2d!..Aw......|
-00000020  a8 ef ec 18 b7 8b a9 20  27 0a 85 20 46 c0 6b 77  |....... '.. F.kw|
-00000030  56 12 53 90 e4 36 72 c4  cb b8 eb 79 6c ed e8 53  |V.S..6r....yl..S|
-00000040  c4 36 48 89 fc 3f ff 07  99 47 2d 9e c0 27 00 00  |.6H..?...G-..'..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 9e d4 c1 3e c6  |....Y...U.....>.|
+00000010  3d 44 eb a7 b8 c5 c8 e0  ab 16 06 83 67 5e b2 d6  |=D..........g^..|
+00000020  67 50 4b f3 24 17 97 19  76 7e 71 20 5a 2b dc 15  |gPK.$...v~q Z+..|
+00000030  87 37 be bb c7 9c 38 cd  3e 55 4e 33 32 a0 01 1b  |.7....8.>UN32...|
+00000040  79 13 87 6a 19 09 42 4c  fb 59 97 a8 c0 27 00 00  |y..j..BL.Y...'..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 9e a1 5f 87 14 ff b2  |........ .._....|
-000002d0  0c b8 82 0d 24 d8 bb 98  6d 3a ca 09 0b 6d 94 98  |....$...m:...m..|
-000002e0  16 20 ed 31 0e 54 23 d5  47 08 04 00 80 4a e0 aa  |. .1.T#.G....J..|
-000002f0  d0 e9 cb 75 f0 c0 6e 2d  74 8f c9 91 d9 32 98 22  |...u..n-t....2."|
-00000300  99 ef 91 77 41 80 c6 83  11 9a ed 55 61 fd b7 58  |...wA......Ua..X|
-00000310  70 7a a6 ce e1 28 40 7d  94 8a 96 64 7f f1 b4 97  |pz...(@}...d....|
-00000320  db 83 2c 77 55 f4 38 c6  4b 9a 77 74 9d 6b ae 06  |..,wU.8.K.wt.k..|
-00000330  b6 f0 07 61 7a e1 dc d9  e3 c4 32 5c c5 91 23 8d  |...az.....2\..#.|
-00000340  a3 53 db 37 4d ee e4 65  ef 58 42 af 63 72 06 5c  |.S.7M..e.XB.cr.\|
-00000350  4e aa f5 07 4c bc b3 1a  00 82 9f 72 34 64 52 e7  |N...L......r4dR.|
-00000360  1f 85 7a c3 36 3f 8d 4e  53 89 7b c2 d3 16 03 03  |..z.6?.NS.{.....|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 57 62 97 e9 c8 c6 17  |........ Wb.....|
+000002d0  73 d2 9e 31 a6 f8 be 03  65 86 af 6b e2 64 bf 7c  |s..1....e..k.d.||
+000002e0  4a f1 b9 fb 84 21 10 76  66 08 04 00 80 2d 08 24  |J....!.vf....-.$|
+000002f0  06 2a a3 c5 28 c4 22 5b  fe 79 4f 91 56 9e 40 6f  |.*..(."[.yO.V.@o|
+00000300  e6 0c e8 70 e0 35 9e 55  91 51 86 ec ad ff 6b 3f  |...p.5.U.Q....k?|
+00000310  a7 19 fa 6f 74 47 8a 86  04 b5 8a f0 0a d5 e5 5f  |...otG........._|
+00000320  ea 30 cc 79 77 3d ac 99  da 41 7f 25 3b da cd da  |.0.yw=...A.%;...|
+00000330  aa 4e 2a 54 b5 d3 13 4f  e4 e9 cb 76 86 fb 0b b5  |.N*T...O...v....|
+00000340  0d a3 be ab d2 e6 6e f6  77 7c 60 a7 50 56 43 60  |......n.w|`.PVC`|
+00000350  95 ba 95 c4 b5 1a 8d 6a  f7 a5 9f 03 27 93 9f 23  |.......j....'..#|
+00000360  44 27 88 f0 d5 51 0f ba  43 84 5c 02 14 16 03 03  |D'...Q..C.\.....|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 50 00 00 00  00 00 00 00 00 00 00 00  |....P...........|
-00000040  00 00 00 00 00 ec b0 fe  b3 cf eb b0 61 c3 77 f0  |............a.w.|
-00000050  ad 63 39 5f 7b 17 0e d7  07 7f cb ea 65 0c b0 8b  |.c9_{.......e...|
-00000060  45 ab 39 c4 d9 06 c7 3b  2e 98 a2 1f c7 e8 e7 e2  |E.9....;........|
-00000070  56 a9 6a b3 75 5e c9 27  66 16 af 0e e4 b4 3d 80  |V.j.u^.'f.....=.|
-00000080  8b 1c fd ff 34                                    |....4|
+00000040  00 00 00 00 00 02 19 fd  3e 06 0d 12 0d 03 42 da  |........>.....B.|
+00000050  76 6f e2 e3 96 eb 42 d9  96 b7 0b ae d6 a0 06 fa  |vo....B.........|
+00000060  57 4e ff 62 85 dd 3f ab  63 f9 73 87 8d 71 6a c6  |WN.b..?.c.s..qj.|
+00000070  f4 ef ce f5 55 5b d2 1f  b5 33 fd 12 32 bd 5e 1e  |....U[...3..2.^.|
+00000080  d5 32 91 9a ae                                    |.2...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 8b 01 85 06 02  |..........P.....|
-00000010  9c 71 ac 29 4c 4c 54 28  26 f7 1b d0 81 17 2c 95  |.q.)LLT(&.....,.|
-00000020  01 73 45 fe f3 1e bd 43  56 83 50 84 ad 13 9c 3f  |.sE....CV.P....?|
-00000030  2e bc 2b 25 67 ce 76 cc  e7 4d cc bb 8f 2e 09 3b  |..+%g.v..M.....;|
-00000040  48 3b 9c c5 fd 17 73 01  18 41 02 46 c1 9c fe 8f  |H;....s..A.F....|
-00000050  76 a4 6b 1d 6d 2c 6d c1  73 55 fd                 |v.k.m,m.sU.|
+00000000  14 03 03 00 01 01 16 03  03 00 50 77 80 95 42 a3  |..........Pw..B.|
+00000010  2b 1c 16 0f 3b f4 78 2a  bd ab 6e d1 33 1e 0e a5  |+...;.x*..n.3...|
+00000020  c7 f4 e9 92 82 00 da 44  0f b6 4e f9 1f ef 67 3b  |.......D..N...g;|
+00000030  de 5c dc 93 07 68 99 1a  70 7f 92 a7 d7 da f3 60  |.\...h..p......`|
+00000040  cf d5 f1 f0 5e 75 68 a1  0b 32 eb d2 96 de e6 34  |....^uh..2.....4|
+00000050  c3 e3 26 43 1f a2 8d e7  1b fc 76                 |..&C......v|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 ed 8d fb  10 4e 11 3f 61 35 bd 9c  |.........N.?a5..|
-00000020  40 16 78 f2 06 68 65 d0  06 85 8e 31 f7 8e d6 b0  |@.x..he....1....|
-00000030  a4 bb e6 03 f6 2d 36 12  4e b7 96 4b 42 b2 22 9d  |.....-6.N..KB.".|
-00000040  93 92 10 8b 0a 15 03 03  00 40 00 00 00 00 00 00  |.........@......|
-00000050  00 00 00 00 00 00 00 00  00 00 4c 59 01 7a 1e 64  |..........LY.z.d|
-00000060  c9 2a d4 a6 d6 e1 64 a2  e9 7d c0 29 32 53 68 e7  |.*....d..}.)2Sh.|
-00000070  a0 66 68 87 70 b5 c3 38  cc ac 18 8b bd 3a 50 85  |.fh.p..8.....:P.|
-00000080  d9 9a ca 67 c7 13 5c 74  76 68                    |...g..\tvh|
+00000010  00 00 00 00 00 f8 35 11  b8 23 cf d9 ec a7 d3 b9  |......5..#......|
+00000020  60 1e 34 01 20 49 73 ec  72 78 58 24 3b fc a8 42  |`.4. Is.rxX$;..B|
+00000030  b2 a9 69 69 40 65 5a c2  8b 9f 0b 0e 70 ab ac 22  |..ii@eZ.....p.."|
+00000040  1a ac d6 04 06 15 03 03  00 40 00 00 00 00 00 00  |.........@......|
+00000050  00 00 00 00 00 00 00 00  00 00 fe ed 19 a0 84 06  |................|
+00000060  8b f0 e8 4e 30 7a 3c 89  a0 a8 59 74 a5 92 73 f3  |...N0z<...Yt..s.|
+00000070  df 1b f0 c6 5a 95 d5 1c  b6 57 4a 1b 8f 24 59 87  |....Z....WJ..$Y.|
+00000080  b4 2b 7f 6f 89 03 e8 6d  e5 d9                    |.+.o...m..|
index 7a015de464e02ac383259f6abbb8314d29162151..38fb4a0be7cb5427d47f011c9b5c50222047f0f6 100644 (file)
@@ -1,24 +1,24 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ce 01 00 00  ca 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 d0 01 00 00  cc 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 08 cc a8  |................|
-00000050  13 01 13 03 13 02 01 00  00 79 00 05 00 05 01 00  |.........y......|
+00000050  13 01 13 03 13 02 01 00  00 7b 00 05 00 05 01 00  |.........{......|
 00000060  00 00 00 00 0a 00 0a 00  08 00 1d 00 17 00 18 00  |................|
-00000070  19 00 0b 00 02 01 00 00  0d 00 18 00 16 08 04 08  |................|
-00000080  05 08 06 04 01 04 03 05  01 05 03 06 01 06 03 02  |................|
-00000090  01 02 03 ff 01 00 01 00  00 12 00 00 00 2b 00 09  |.............+..|
-000000a0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
-000000b0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
-000000c0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
-000000d0  cb 3b 74                                          |.;t|
+00000070  19 00 0b 00 02 01 00 00  0d 00 1a 00 18 08 04 04  |................|
+00000080  03 08 07 08 05 08 06 04  01 05 01 06 01 05 03 06  |................|
+00000090  03 02 01 02 03 ff 01 00  01 00 00 12 00 00 00 2b  |...............+|
+000000a0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
+000000b0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
+000000c0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
+000000d0  5f 58 cb 3b 74                                    |_X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 94 bf 96 6e 08  |....Y...U.....n.|
-00000010  c5 59 6f b5 bc 22 4b 73  4a ba 5f f4 ea 2b 77 1d  |.Yo.."KsJ._..+w.|
-00000020  f4 6d 45 46 51 3d 0b 60  d8 6b 4e 20 00 4b 00 f8  |.mEFQ=.`.kN .K..|
-00000030  a2 81 c9 1c 44 4f 90 73  ea c7 88 70 d9 56 d9 27  |....DO.s...p.V.'|
-00000040  c5 0e e2 42 f0 bb 33 73  08 f1 12 ed cc a8 00 00  |...B..3s........|
+00000000  16 03 03 00 59 02 00 00  55 03 03 4e fb dc 04 6f  |....Y...U..N...o|
+00000010  5a 52 37 a3 55 58 26 e5  cd a0 67 4c 0f 87 1a 3a  |ZR7.UX&...gL...:|
+00000020  f6 84 33 2f 2e 52 d0 48  7c 5b 64 20 6e d0 bc ca  |..3/.R.H|[d n...|
+00000030  c9 a5 87 8d 99 c5 ec 85  84 89 f0 22 ab 63 55 f4  |...........".cU.|
+00000040  70 d7 02 93 b5 fe d7 38  fb c1 b2 da cc a8 00 00  |p......8........|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 cd 60 09 2c c1 3b d6  |........ .`.,.;.|
-000002d0  3b d1 c2 3c 9f 30 81 bb  6b 47 a3 cd 26 48 f4 41  |;..<.0..kG..&H.A|
-000002e0  c0 d4 36 57 05 33 93 f8  75 08 04 00 80 9a 67 4b  |..6W.3..u.....gK|
-000002f0  36 41 f9 c1 5c 80 67 9d  0d bc 64 f1 0d 08 e1 9f  |6A..\.g...d.....|
-00000300  85 88 44 e3 bc c9 b7 f4  86 ec 5c 79 e6 2c ac 07  |..D.......\y.,..|
-00000310  e9 cd 6a 7e 68 41 67 71  34 cb c5 13 7c ec 1a 73  |..j~hAgq4...|..s|
-00000320  f8 30 da 08 d0 14 c6 4b  e4 11 ac c6 34 f9 2f ca  |.0.....K....4./.|
-00000330  b4 81 35 76 17 9e 7b 4c  f3 f7 ac 6d d3 d8 f7 7c  |..5v..{L...m...||
-00000340  70 b8 36 fa cc 85 fb 15  8e 82 c6 50 0e 90 c0 39  |p.6........P...9|
-00000350  13 d9 02 b1 ae 17 ea 63  c4 e8 21 c2 c0 eb 5c 63  |.......c..!...\c|
-00000360  e4 43 c5 1e ae 01 ee 64  23 42 b2 2a 52 16 03 03  |.C.....d#B.*R...|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 fc 4b 92 ab d2 cb 4f  |........ .K....O|
+000002d0  61 aa 86 12 1a 1d 75 be  31 dd b8 ee 6c a6 db bd  |a.....u.1...l...|
+000002e0  0b ea b2 d5 27 49 42 eb  5a 08 04 00 80 02 ad 71  |....'IB.Z......q|
+000002f0  e2 e8 f6 44 3c a6 18 6f  76 ee 9a eb 0e d9 ff cb  |...D<..ov.......|
+00000300  6d 1e 64 dd 29 1d 8c c8  f6 14 40 c0 12 46 74 4c  |m.d.).....@..FtL|
+00000310  41 2d 71 5f 9c b7 86 0b  fc 66 1e 14 cb 26 d0 d7  |A-q_.....f...&..|
+00000320  21 b4 bd c2 04 38 77 90  6a f0 01 18 bd 1c 17 45  |!....8w.j......E|
+00000330  7e 38 46 4c 2e 97 ba 11  01 1f 20 cc df f2 6b 5b  |~8FL...... ...k[|
+00000340  a7 29 c0 52 52 9c 2f 23  bd 1c 72 c2 f2 99 d1 dc  |.).RR./#..r.....|
+00000350  6a 6c ac 8e 87 8a 00 74  47 2e 99 8d 3f 79 04 60  |jl.....tG...?y.`|
+00000360  5e dc ba 86 1c f4 f9 03  22 38 96 a7 b3 16 03 03  |^......."8......|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 8f 97 a6  c4 c1 81 4e 87 8c 17 3a  |.... ......N...:|
-00000040  6b 85 ad 17 6c 5c 14 b6  84 6b 7e a8 c1 ed 2e 6b  |k...l\...k~....k|
-00000050  fc e8 8f 8b 84                                    |.....|
+00000030  16 03 03 00 20 0a 17 ee  70 8c 50 24 7c 00 b9 6f  |.... ...p.P$|..o|
+00000040  82 71 ed 2b 8c 0b 4b ff  bb 38 bc 12 7e 0c a5 3e  |.q.+..K..8..~..>|
+00000050  71 a2 ad f8 52                                    |q...R|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 51 59 b7 f0 cf  |.......... QY...|
-00000010  07 d4 9a 45 15 b6 2f dd  03 5e 46 f9 c8 87 dc 99  |...E../..^F.....|
-00000020  d2 56 cd 95 f9 3e 2e 42  19 2e e3                 |.V...>.B...|
+00000000  14 03 03 00 01 01 16 03  03 00 20 e9 87 55 12 a8  |.......... ..U..|
+00000010  ad 68 42 0c 60 12 be 2f  2c e5 00 2d 01 cf 86 a2  |.hB.`../,..-....|
+00000020  1b 06 b3 86 bf 88 48 73  7a d3 cc                 |......Hsz..|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 6d 16 3b  26 a8 60 d8 2c 9f 08 42  |.....m.;&.`.,..B|
-00000010  51 bb 2a 58 c3 3b 42 cb  59 46 02 15 03 03 00 12  |Q.*X.;B.YF......|
-00000020  1e c6 5e 68 40 58 9c df  5e 11 a3 c2 1e 50 11 d4  |..^h@X..^....P..|
-00000030  ff 17                                             |..|
+00000000  17 03 03 00 16 96 75 4c  c6 ba b1 ad ae 2f 44 9d  |......uL...../D.|
+00000010  10 c3 ef e5 dc fb 0a 3e  af 6b 6a 15 03 03 00 12  |.......>.kj.....|
+00000020  30 13 8f e5 a1 0f 38 67  b9 53 4e 6a 66 ec ee 45  |0.....8g.SNjf..E|
+00000030  c2 b2                                             |..|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv12-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv12-Ed25519
new file mode 100644 (file)
index 0000000..35513ad
--- /dev/null
@@ -0,0 +1,68 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
+00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
+00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
+00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 59 02 00 00  55 03 03 66 49 2a a6 a4  |....Y...U..fI*..|
+00000010  75 60 58 bb 5f 5e 82 cd  e5 c0 9f 6d a4 fd 39 3b  |u`X._^.....m..9;|
+00000020  d9 17 80 14 89 ea 51 c1  b0 43 d6 20 b2 6b 72 81  |......Q..C. .kr.|
+00000030  f6 63 20 22 e2 b6 d2 61  aa 87 b6 67 ae 56 78 44  |.c "...a...g.VxD|
+00000040  5d 10 8c cf ea 32 cf 9e  92 e5 59 70 cc a9 00 00  |]....2....Yp....|
+00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
+00000060  03 01 3c 0b 00 01 38 00  01 35 00 01 32 30 82 01  |..<...8..5..20..|
+00000070  2e 30 81 e1 a0 03 02 01  02 02 10 0f 43 1c 42 57  |.0..........C.BW|
+00000080  93 94 1d e9 87 e4 f1 ad  15 00 5d 30 05 06 03 2b  |..........]0...+|
+00000090  65 70 30 12 31 10 30 0e  06 03 55 04 0a 13 07 41  |ep0.1.0...U....A|
+000000a0  63 6d 65 20 43 6f 30 1e  17 0d 31 39 30 35 31 36  |cme Co0...190516|
+000000b0  32 31 33 38 30 31 5a 17  0d 32 30 30 35 31 35 32  |213801Z..2005152|
+000000c0  31 33 38 30 31 5a 30 12  31 10 30 0e 06 03 55 04  |13801Z0.1.0...U.|
+000000d0  0a 13 07 41 63 6d 65 20  43 6f 30 2a 30 05 06 03  |...Acme Co0*0...|
+000000e0  2b 65 70 03 21 00 3f e2  15 2e e6 e3 ef 3f 4e 85  |+ep.!.?......?N.|
+000000f0  4a 75 77 a3 64 9e ed e0  bf 84 2c cc 92 26 8f fa  |Juw.d.....,..&..|
+00000100  6f 34 83 aa ec 8f a3 4d  30 4b 30 0e 06 03 55 1d  |o4.....M0K0...U.|
+00000110  0f 01 01 ff 04 04 03 02  05 a0 30 13 06 03 55 1d  |..........0...U.|
+00000120  25 04 0c 30 0a 06 08 2b  06 01 05 05 07 03 01 30  |%..0...+.......0|
+00000130  0c 06 03 55 1d 13 01 01  ff 04 02 30 00 30 16 06  |...U.......0.0..|
+00000140  03 55 1d 11 04 0f 30 0d  82 0b 65 78 61 6d 70 6c  |.U....0...exampl|
+00000150  65 2e 63 6f 6d 30 05 06  03 2b 65 70 03 41 00 63  |e.com0...+ep.A.c|
+00000160  44 ed 9c c4 be 53 24 53  9f d2 10 8d 9f e8 21 08  |D....S$S......!.|
+00000170  90 95 39 e5 0d c1 55 ff  2c 16 b7 1d fc ab 7d 4d  |..9...U.,.....}M|
+00000180  d4 e0 93 13 d0 a9 42 e0  b6 6b fe 5d 67 48 d7 9f  |......B..k.]gH..|
+00000190  50 bc 6c cd 4b 03 83 7c  f2 08 58 cd ac cf 0c 16  |P.l.K..|..X.....|
+000001a0  03 03 00 6c 0c 00 00 68  03 00 1d 20 c4 8c b8 a2  |...l...h... ....|
+000001b0  32 92 b8 22 1f 4c f1 96  00 64 35 47 4e f8 3d 08  |2..".L...d5GN.=.|
+000001c0  83 12 fe 95 a8 e4 8e c9  30 27 5c 39 08 07 00 40  |........0'\9...@|
+000001d0  7f 90 cf e0 87 69 e3 50  e6 fa 5e 28 a1 0f 79 0a  |.....i.P..^(..y.|
+000001e0  6e cf f4 87 e8 2f 55 b2  dd cb 5e 8f 9a 14 bd c2  |n..../U...^.....|
+000001f0  2b 2b 2d ed 72 40 23 5d  6d f4 89 3a ff 09 82 ec  |++-.r@#]m..:....|
+00000200  b6 4b 27 9a 08 ea e9 73  94 b4 31 1f e1 39 86 0e  |.K'....s..1..9..|
+00000210  16 03 03 00 04 0e 00 00  00                       |.........|
+>>> Flow 3 (client to server)
+00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
+00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
+00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
+00000030  16 03 03 00 20 8f 97 36  bd 59 ef 8e 2f 11 28 b0  |.... ..6.Y../.(.|
+00000040  d7 20 79 bf 04 07 45 f9  89 de b0 c7 55 1a ad 80  |. y...E.....U...|
+00000050  0f 8c ef 1d c6                                    |.....|
+>>> Flow 4 (server to client)
+00000000  14 03 03 00 01 01 16 03  03 00 20 47 6c 1f 86 47  |.......... Gl..G|
+00000010  72 03 94 e0 43 f8 e5 ca  03 7d f5 d5 dd 70 05 f5  |r...C....}...p..|
+00000020  98 5d 51 b4 11 49 71 7a  fd 37 9a                 |.]Q..Iqz.7.|
+>>> Flow 5 (client to server)
+00000000  17 03 03 00 16 b7 a2 f5  8e 7c d3 7d 61 af 29 1c  |.........|.}a.).|
+00000010  77 0c 8d b4 5b d3 be 77  a6 a5 99 15 03 03 00 12  |w...[..w........|
+00000020  d8 23 dc a8 99 fe 1c 6e  f2 2f 41 8e df 40 11 4f  |.#.....n./A..@.O|
+00000030  6b 92                                             |k.|
index 1a97ddacf15c2242e2abf8b6dd6524090304ea27..c900aa6d5e12d070eb26ad83c3ae9de18a3931f3 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 de e9 5f 9c 20  |....Y...U...._. |
-00000010  c7 37 0d ba e1 2c 21 ad  4b 8a 10 fe 66 4c c2 88  |.7...,!.K...fL..|
-00000020  87 fa 43 aa 42 ce e4 ca  d8 c2 2d 20 9c cc ef b1  |..C.B.....- ....|
-00000030  48 e2 9a e8 5a 61 16 6a  64 dd e9 6e d1 13 06 44  |H...Za.jd..n...D|
-00000040  c2 f6 9f e7 68 d3 cc 82  67 54 a0 66 cc a8 00 00  |....h...gT.f....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 7c c1 7b 30 03  |....Y...U..|.{0.|
+00000010  3c d7 63 5f 47 1c b1 13  56 56 b4 fd 55 e2 27 3e  |<.c_G...VV..U.'>|
+00000020  39 bb ce 9b 5b 2c 1e 17  33 e1 da 20 65 8b 26 42  |9...[,..3.. e.&B|
+00000030  a4 38 29 c7 9a 25 13 fc  1d 69 cb 10 63 c6 26 fc  |.8)..%...i..c.&.|
+00000040  f4 46 64 31 28 06 b3 a5  a4 c2 f6 5a cc a8 00 00  |.Fd1(......Z....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 30 ef c9 70 70 23 9c  |........ 0..pp#.|
-000002d0  b6 1c 35 b7 86 6c 9f 82  62 df e3 6e 47 6d 03 61  |..5..l..b..nGm.a|
-000002e0  e6 98 5b ca 86 b9 58 e4  18 08 04 00 80 30 82 41  |..[...X......0.A|
-000002f0  64 c8 03 a9 25 d8 b9 2f  9e a1 8d 6e 5b 1c b6 da  |d...%../...n[...|
-00000300  eb c0 63 2b 72 08 2b 50  2a 2e 4b 91 c1 9f fc df  |..c+r.+P*.K.....|
-00000310  87 6e 07 6c c5 38 24 02  b4 e8 c5 11 32 17 48 49  |.n.l.8$.....2.HI|
-00000320  ce d3 3d d8 58 e6 be 1a  fb c1 f2 2a 03 54 8f ae  |..=.X......*.T..|
-00000330  2a f7 84 2a 65 c3 b7 cd  80 64 b1 8c a8 25 ce 1c  |*..*e....d...%..|
-00000340  73 eb ae 42 7d 9c 87 72  fe f9 cf bd e1 36 ca bd  |s..B}..r.....6..|
-00000350  69 78 13 9f c8 16 03 9c  0a 02 1e f3 70 6b ed 38  |ix..........pk.8|
-00000360  d8 a5 b6 8a 7e 33 7b 62  44 8b 5e 99 ef 16 03 03  |....~3{bD.^.....|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 f7 a2 97 2f 50 e4 e2  |........ .../P..|
+000002d0  fa ef 80 67 78 1c aa 6c  03 aa 05 3b 6f 98 97 11  |...gx..l...;o...|
+000002e0  7e 55 3d 50 f3 a9 9b 21  65 08 04 00 80 34 4a 4b  |~U=P...!e....4JK|
+000002f0  4b 6e 86 01 1b 6b 8e 3e  84 01 75 b8 05 c3 b2 52  |Kn...k.>..u....R|
+00000300  16 ee ac 61 83 dd 09 32  d5 55 6a 5d d6 6b 4a 1a  |...a...2.Uj].kJ.|
+00000310  2b f7 09 33 6f 3d 4f c1  e3 aa 03 27 fe af cd 6d  |+..3o=O....'...m|
+00000320  b8 76 00 02 42 98 e6 f6  b7 ed fb 35 35 29 23 b1  |.v..B......55)#.|
+00000330  4d 48 0a ba a1 1b e3 8e  a2 cb 80 11 ec 92 20 df  |MH............ .|
+00000340  1f a4 5e 5d 70 85 8e 5d  85 62 81 1f b3 3a 0d 8d  |..^]p..].b...:..|
+00000350  9a 07 d3 99 a5 3c 6c c2  52 08 f0 be 50 ed d2 4d  |.....<l.R...P..M|
+00000360  44 ed e7 40 06 64 4e 17  fe 4a 0e 1b d6 16 03 03  |D..@.dN..J......|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 04 8f 3f  72 37 39 12 c4 21 b2 45  |.... ..?r79..!.E|
-00000040  5d 90 b9 fa d2 24 70 5f  86 d4 8b 24 e6 af 6e 9f  |]....$p_...$..n.|
-00000050  71 41 17 a8 54                                    |qA..T|
+00000030  16 03 03 00 20 30 8b ea  ef 6c 35 97 5b 26 5f ef  |.... 0...l5.[&_.|
+00000040  bc 28 fd e9 23 73 bb b3  ae 41 0c be 5f 83 a5 f7  |.(..#s...A.._...|
+00000050  96 07 8d 81 67                                    |....g|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 b0 70 aa d3 44  |.......... .p..D|
-00000010  df ef 57 0f bb 69 b3 09  70 1a ad b0 33 e5 97 8e  |..W..i..p...3...|
-00000020  bc 34 7f aa 27 a2 81 a3  08 7e b1                 |.4..'....~.|
+00000000  14 03 03 00 01 01 16 03  03 00 20 29 fa a8 de f2  |.......... )....|
+00000010  8f 94 16 fc be 84 93 e9  34 98 c2 44 08 9b 2e 37  |........4..D...7|
+00000020  1f 41 61 53 fa 9c 23 ff  d8 6d c3                 |.AaS..#..m.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 52 71 2d  1a 29 2c 84 b7 58 d2 b0  |.....Rq-.),..X..|
-00000010  92 c3 64 7f 29 3a da d8  c4 7b 73 15 03 03 00 12  |..d.):...{s.....|
-00000020  63 04 d5 2b 6c fc 35 82  bb ba ba 9b 01 a0 0c ac  |c..+l.5.........|
-00000030  2c 12                                             |,.|
+00000000  17 03 03 00 16 ab 6d 32  1c 16 cc 29 b1 21 4c b1  |......m2...).!L.|
+00000010  74 4c 50 e3 1f c5 f1 05  6a 8a 92 15 03 03 00 12  |tLP.....j.......|
+00000020  18 88 3d 23 81 d7 ba c5  1e 9a c4 3a 1b c8 cd 5b  |..=#.......:...[|
+00000030  c5 fa                                             |..|
index 819a061fb4f1642073c8f2cbcc0fc8b092384525..d75b670e1d535603e185682ee84ceea548fd2c6f 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 13 01 00 01  0f 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 15 01 00 01  11 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,22 +7,22 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 94 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
-00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 18 00  |................|
-000000a0  16 08 04 08 05 08 06 04  01 04 03 05 01 05 03 06  |................|
-000000b0  01 06 03 02 01 02 03 ff  01 00 01 00 00 12 00 00  |................|
-000000c0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
-000000d0  47 00 45 00 17 00 41 04  1e 18 37 ef 0d 19 51 88  |G.E...A...7...Q.|
-000000e0  35 75 71 b5 e5 54 5b 12  2e 8f 09 67 fd a7 24 20  |5uq..T[....g..$ |
-000000f0  3e b2 56 1c ce 97 28 5e  f8 2b 2d 4f 9e f1 07 9f  |>.V...(^.+-O....|
-00000100  6c 4b 5b 83 56 e2 32 42  e9 58 b6 d7 49 a6 b5 68  |lK[.V.2B.X..I..h|
-00000110  1a 41 03 56 6b dc 5a 89                           |.A.Vk.Z.|
+00000080  01 00 00 96 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
+000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
+000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000d0  33 00 47 00 45 00 17 00  41 04 1e 18 37 ef 0d 19  |3.G.E...A...7...|
+000000e0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
+000000f0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
+00000100  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
+00000110  b5 68 1a 41 03 56 6b dc  5a 89                    |.h.A.Vk.Z.|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 39 5a 55 c9 46  |....Y...U..9ZU.F|
-00000010  87 68 62 04 99 88 9e 60  93 a3 79 c3 d6 e0 30 9f  |.hb....`..y...0.|
-00000020  e5 2b 70 df 81 1f 33 53  f5 89 91 20 ce 7b aa 43  |.+p...3S... .{.C|
-00000030  a2 83 d7 6d 3f b9 86 38  1d 52 da 75 82 2b c6 05  |...m?..8.R.u.+..|
-00000040  6f a4 e2 15 27 21 18 36  0d 04 ba 42 c0 2f 00 00  |o...'!.6...B./..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 b8 7d f5 69 c3  |....Y...U...}.i.|
+00000010  6a ca 8b df f3 30 2c 39  47 2e 74 2e 4f 89 4c 1e  |j....0,9G.t.O.L.|
+00000020  f0 eb 10 0e 06 1d 2c 4e  de 2e 8f 20 6c a0 5b 66  |......,N... l.[f|
+00000030  fc a6 05 df 29 6b ce 72  92 e7 d7 78 f5 46 38 f9  |....)k.r...x.F8.|
+00000040  91 1c 9a 08 4c b1 9a 41  e5 0c d2 cd c0 2f 00 00  |....L..A...../..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  cd 0c 00 00 c9 03 00 17  41 04 76 c4 5d a9 b6 96  |........A.v.]...|
-000002d0  aa 4c e2 26 30 ce 69 90  11 42 fe a4 56 4d 4b 1c  |.L.&0.i..B..VMK.|
-000002e0  5e 1f e1 23 10 c7 8b 52  5a 04 1f 32 85 98 6b d8  |^..#...RZ..2..k.|
-000002f0  97 3a 7b 90 79 94 de f4  85 c8 c5 2a 05 b9 6d 79  |.:{.y......*..my|
-00000300  6f fb f8 1e b8 ab b8 e9  c3 91 08 04 00 80 b9 00  |o...............|
-00000310  a1 01 7d c7 fd 3e bc ba  44 42 64 68 21 7b b7 98  |..}..>..DBdh!{..|
-00000320  c1 9f 17 a6 a1 a3 7f 9e  63 d7 ee b7 53 d4 7c 48  |........c...S.|H|
-00000330  89 6e 20 0d 29 a1 b4 56  2c 83 7e d7 ab 3a 28 65  |.n .)..V,.~..:(e|
-00000340  03 a1 be 6b 0d 89 39 c4  c9 fc fd 41 f0 bd c2 cb  |...k..9....A....|
-00000350  40 d5 54 2e 98 0a b1 a0  86 65 cc 6a e9 5f 47 51  |@.T......e.j._GQ|
-00000360  a4 b4 40 47 25 ae df 93  c2 b6 eb fe b6 71 fe 04  |..@G%........q..|
-00000370  1e 98 d0 91 8b c7 ea 58  91 23 a7 76 67 ba 7a fd  |.......X.#.vg.z.|
-00000380  49 f0 c2 70 70 50 06 23  5e 31 90 4e 58 98 16 03  |I..ppP.#^1.NX...|
+000002c0  cd 0c 00 00 c9 03 00 17  41 04 3e 87 67 8b 87 08  |........A.>.g...|
+000002d0  fe 4e 4c c3 6b 42 4b 97  ad f4 1c 83 35 72 db 4f  |.NL.kBK.....5r.O|
+000002e0  39 83 ea 14 69 bb 8c 87  58 c5 a4 a8 8c d7 9d af  |9...i...X.......|
+000002f0  7a 5e 58 59 31 4d f2 01  4a 23 51 24 1b 04 0c e3  |z^XY1M..J#Q$....|
+00000300  94 9e 1b 6c ad aa 83 fd  2d 36 08 04 00 80 ab e9  |...l....-6......|
+00000310  ff 6d 7a cd 3b a7 da ff  d5 bd 27 49 68 53 f5 45  |.mz.;.....'IhS.E|
+00000320  c3 dd 5b a2 99 fb 8f 24  37 49 d3 08 87 d1 06 98  |..[....$7I......|
+00000330  39 72 25 78 b3 05 fb a2  c9 ac f9 c8 f7 fc ea 8a  |9r%x............|
+00000340  98 ce 78 83 64 f6 e0 c7  44 62 af a7 d5 26 df f1  |..x.d...Db...&..|
+00000350  2c cc ce 11 8b 03 4a e1  81 54 3f e1 6e 52 c9 1a  |,.....J..T?.nR..|
+00000360  d8 95 52 e0 3f a5 e3 c8  12 9a c7 57 5d 46 7a ce  |..R.?......W]Fz.|
+00000370  56 8a 90 0f 0d 1b ba 58  cf 1c a3 4b 39 5a 08 ee  |V......X...K9Z..|
+00000380  8a 61 bb 0f 7d f7 0e f2  1f 73 e0 c8 6f 54 16 03  |.a..}....s..oT..|
 00000390  03 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
 00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
 00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
 00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 e8 f8  |.....(..........|
-00000060  61 5f dc c0 12 cd e2 09  7a a9 61 4f 77 29 aa 9d  |a_......z.aOw)..|
-00000070  52 11 b9 35 66 1d ac e1  e7 05 f8 f7 d7 cc        |R..5f.........|
+00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 b8 16  |.....(..........|
+00000060  ce 7d df 64 13 07 9e d8  37 bb 3f 9c 9e 2b 3c 0e  |.}.d....7.?..+<.|
+00000070  26 a7 9d 32 e5 44 b8 d6  66 bc 05 7b 27 7a        |&..2.D..f..{'z|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 dd 5b e0 29 02  |..........(.[.).|
-00000010  9a 71 85 fb c1 d6 c0 fe  89 22 8d 86 9f 64 ab 70  |.q......."...d.p|
-00000020  ec 07 9a 61 a0 af 13 7b  04 e2 73 df f6 c2 06 86  |...a...{..s.....|
-00000030  a7 b2 65                                          |..e|
+00000000  14 03 03 00 01 01 16 03  03 00 28 c0 73 5c 27 1b  |..........(.s\'.|
+00000010  19 d0 66 68 ea c5 ad 7d  a8 03 37 d2 9a ff 00 c4  |..fh...}..7.....|
+00000020  70 65 98 3b 88 59 c0 ca  e3 c0 d6 32 0e 8d 15 3c  |pe.;.Y.....2...<|
+00000030  e2 c3 f3                                          |...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 d8 7a 81  |..............z.|
-00000010  28 a5 af fc 7d 02 4a 1c  f5 a2 0f 65 65 ad d1 c2  |(...}.J....ee...|
-00000020  2b fe 49 15 03 03 00 1a  00 00 00 00 00 00 00 02  |+.I.............|
-00000030  94 20 af f9 53 43 6e c0  bd 0a fb ce b8 cc b5 3f  |. ..SCn........?|
-00000040  39 73                                             |9s|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 28 ef 47  |.............(.G|
+00000010  ad 7f 40 4b 34 78 f3 1e  01 a7 f4 20 0a d5 c1 41  |..@K4x..... ...A|
+00000020  f7 be 41 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..A.............|
+00000030  fb fc eb 14 f2 a6 e7 2e  80 d6 93 31 25 01 e9 d2  |...........1%...|
+00000040  c3 ae                                             |..|
index 6b7f11621b837dc0751185ef76f84f6ec228ae7d..ab2c4eb14d853574620dafcdb03cbc139fdfb6ac 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 c1 47 51 e7 59  |....Q...M...GQ.Y|
-00000010  d9 0d ae 9b 9c 93 c6 36  c6 33 e9 38 ba 37 4c 60  |.......6.3.8.7L`|
-00000020  ec 0b 63 49 11 67 56 29  1b 78 dd 20 1a 60 41 ea  |..cI.gV).x. .`A.|
-00000030  93 07 16 61 e4 55 11 3f  d1 e2 e6 9d 9f 05 c8 3e  |...a.U.?.......>|
-00000040  37 47 31 0d f9 5d 7a a5  7b 82 63 23 00 05 00 00  |7G1..]z.{.c#....|
+00000000  16 03 03 00 51 02 00 00  4d 03 03 34 50 1f 52 15  |....Q...M..4P.R.|
+00000010  85 c7 85 2c 4d a9 b2 0c  49 e5 a3 ea 57 21 96 39  |...,M...I...W!.9|
+00000020  db c9 97 b6 c4 d0 81 9a  39 a3 e8 20 59 f5 b9 db  |........9.. Y...|
+00000030  58 2e ef 1c b3 85 96 27  6a 23 71 3f 5c 72 ce cf  |X......'j#q?\r..|
+00000040  c5 b7 fe 05 00 f4 65 06  54 c1 2e 7c 00 05 00 00  |......e.T..|....|
 00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
 00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
 00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 24 f7 0e  a5 ad 5d 6d ab c8 04 b7  |.....$....]m....|
-000000a0  07 e7 e7 28 30 72 63 a9  02 05 18 7c 07 61 68 58  |...(0rc....|.ahX|
-000000b0  6f 7a 5c d2 4f 32 b5 d3  b1 09                    |oz\.O2....|
+00000090  01 16 03 03 00 24 ab 48  84 ae 77 f9 8b 82 44 52  |.....$.H..w...DR|
+000000a0  3e 65 94 27 cc f2 08 a7  f2 e5 21 0c 02 d0 89 ac  |>e.'......!.....|
+000000b0  50 be 69 57 c9 7c a0 f2  7f 6d                    |P.iW.|...m|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 93 ef cc 6a e8  |..........$...j.|
-00000010  8c e4 16 6e 05 cd 2f 9a  31 52 e8 67 3b 93 83 0e  |...n../.1R.g;...|
-00000020  f0 29 04 29 40 b7 6a c8  c4 51 a4 6a 9d 5c 17     |.).)@.j..Q.j.\.|
+00000000  14 03 03 00 01 01 16 03  03 00 24 61 94 21 65 0f  |..........$a.!e.|
+00000010  10 ba 0c a6 d9 e3 08 54  86 ae f9 64 c7 e7 f4 4b  |.......T...d...K|
+00000020  aa f5 19 ca 2a 0d 50 88  85 42 32 14 04 29 d9     |....*.P..B2..).|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1a c0 49 e8  30 49 75 60 93 ec 04 e9  |......I.0Iu`....|
-00000010  3e 54 66 78 15 8e 1e 31  2e ab 1b c1 43 a3 44 15  |>Tfx...1....C.D.|
-00000020  03 03 00 16 34 97 5d 52  01 da 5d 45 c6 51 14 1a  |....4.]R..]E.Q..|
-00000030  45 8f 96 af fd 6a ea d2  37 cf                    |E....j..7.|
+00000000  17 03 03 00 1a cb 1d 43  67 de 7a 20 c7 ed 46 99  |.......Cg.z ..F.|
+00000010  86 1f b9 61 9f c6 34 9a  07 37 3c 94 45 b4 40 15  |...a..4..7<.E.@.|
+00000020  03 03 00 16 4e ac d3 12  23 b4 33 bc 5b 03 91 7e  |....N...#.3.[..~|
+00000030  d9 d0 7f d7 48 3e 8c 16  16 ec                    |....H>....|
index 9810f5221291e8f9966f716e402a26b0372a88a3..96f7b000734420621bacf40657a97621380a3583 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 8a b7 29 8f 35  |....Y...U....).5|
-00000010  0f 6b 07 77 95 15 94 08  ad b8 e3 8f 97 72 17 b5  |.k.w.........r..|
-00000020  79 1d b9 ab 57 d2 58 e0  63 04 8f 20 3b 5d 60 f3  |y...W.X.c.. ;]`.|
-00000030  d6 92 21 98 27 3d 20 69  ec c8 47 d0 27 ce 42 39  |..!.'= i..G.'.B9|
-00000040  1d 82 b0 e7 ef ca 59 f9  f8 fe 06 79 cc a8 00 00  |......Y....y....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 1c 04 37 7b 4d  |....Y...U....7{M|
+00000010  49 2a 45 1d e8 db 60 7e  7d be 7b 2d ff a2 dc aa  |I*E...`~}.{-....|
+00000020  b7 5e 66 f9 67 bf 58 f7  f1 0a 7b 20 f2 72 71 31  |.^f.g.X...{ .rq1|
+00000030  2a 6e 5e 2b e4 29 ef bc  3a 56 45 26 53 b4 9f 98  |*n^+.)..:VE&S...|
+00000040  fb 07 d5 2f b3 f3 f0 3b  02 1f 00 9b cc a8 00 00  |.../...;........|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 0d 87 80 0d 1d 7c ad  |........ .....|.|
-000002d0  a2 da 94 09 a5 23 c9 f2  23 cc f2 0a 2e 94 2d 74  |.....#..#.....-t|
-000002e0  01 5f 60 63 5b c7 1e a0  45 08 04 00 80 2f 2f 55  |._`c[...E....//U|
-000002f0  44 fb f1 5a 0d 37 7c b0  5d 63 bb 7a e3 a8 f3 e9  |D..Z.7|.]c.z....|
-00000300  b4 5d a0 ba 31 ec a8 4b  70 5f ce af 98 91 28 0c  |.]..1..Kp_....(.|
-00000310  47 a2 c9 03 a3 07 e6 67  1e 34 76 cc b8 14 3d 8f  |G......g.4v...=.|
-00000320  83 6a 10 34 dc 53 7c 57  39 77 49 48 3e dc 0d 37  |.j.4.S|W9wIH>..7|
-00000330  8f 37 f7 28 aa 13 19 b1  2f 31 e1 b6 94 45 b1 0d  |.7.(..../1...E..|
-00000340  ec 9f 39 78 90 24 31 c6  03 88 67 28 72 fa 24 41  |..9x.$1...g(r.$A|
-00000350  5c 5e 3f d8 cd e4 58 00  fb 1a ba c9 cc ff 1b 7a  |\^?...X........z|
-00000360  23 9a fd 38 04 18 6a 82  69 bd e4 59 87 16 03 03  |#..8..j.i..Y....|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 6f fe 48 78 c0 68 41  |........ o.Hx.hA|
+000002d0  fa 5a 33 f5 9b e0 b2 ae  93 e9 0c 5a 78 60 32 67  |.Z3........Zx`2g|
+000002e0  de cf 17 26 20 88 3a f5  5e 08 04 00 80 58 d9 c5  |...& .:.^....X..|
+000002f0  f0 c3 9e f5 4d a5 20 3e  ed da a2 7d b9 2a 9b 95  |....M. >...}.*..|
+00000300  ec 1c 2a c1 28 22 3e 36  4f 5a fe eb 2a 6a 9e 9e  |..*.(">6OZ..*j..|
+00000310  01 83 31 93 d1 bd 0f 6f  ff 9d e8 4e 7a cb 9d 8f  |..1....o...Nz...|
+00000320  63 92 bc f2 0e 37 1f e0  8a 1e 22 2c eb 53 e8 25  |c....7....",.S.%|
+00000330  15 20 97 1f 0c 75 5a 9d  6a aa e6 a6 86 d9 5d 4d  |. ...uZ.j.....]M|
+00000340  b8 58 d1 03 63 d4 8d cb  0b 4d 97 2e eb 50 13 39  |.X..c....M...P.9|
+00000350  07 5c d9 a8 bf cf eb 05  47 0a 48 30 5b 71 c0 ea  |.\......G.H0[q..|
+00000360  cb 4f 22 27 1a d2 58 02  ca 07 bd 03 f1 16 03 03  |.O"'..X.........|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 cb 26 0a  53 64 81 75 f6 f6 17 78  |.... .&.Sd.u...x|
-00000040  3f a7 96 52 91 70 91 2d  92 67 cb ae f0 8f 84 9d  |?..R.p.-.g......|
-00000050  ea 17 3f a1 38                                    |..?.8|
+00000030  16 03 03 00 20 f9 b0 26  8b 30 54 a5 80 7e 5b 47  |.... ..&.0T..~[G|
+00000040  2e b1 28 07 ef 12 93 33  5a 8d 5e de 8d 56 d5 c3  |..(....3Z.^..V..|
+00000050  3c 05 a8 f1 5e                                    |<...^|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 83 7c 41 9e 33  |.......... .|A.3|
-00000010  b0 89 6c 2f 88 99 61 b1  71 30 04 9f df 48 e9 9e  |..l/..a.q0...H..|
-00000020  50 5f 22 d8 09 49 f6 17  7f 6a 10                 |P_"..I...j.|
+00000000  14 03 03 00 01 01 16 03  03 00 20 c1 77 25 ba a7  |.......... .w%..|
+00000010  08 ba 0d 1e 8b e2 eb 11  77 d8 c7 e2 20 e0 60 da  |........w... .`.|
+00000020  97 f5 42 f4 12 bb 94 35  b7 ee c8                 |..B....5...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 63 50 67  b6 7a 7d 4e 3d f5 a9 93  |.....cPg.z}N=...|
-00000010  f9 6d 61 ea 46 c7 5d 28  77 ad 12                 |.ma.F.](w..|
+00000000  17 03 03 00 16 6f f6 5b  37 2f 21 25 ae e9 30 be  |.....o.[7/!%..0.|
+00000010  ce b4 66 f7 fd 9a 5a 02  9d 43 e8                 |..f...Z..C.|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 f4 d1 27  84 c9 8f 32 7c 0f ff e8  |.......'...2|...|
-00000010  ee ba 2e 93 29 cb fa 22  52                       |....).."R|
+00000000  16 03 03 00 14 8f be 53  56 e9 19 ec 85 79 d0 cc  |.......SV....y..|
+00000010  8d ab 43 3c b2 7b a3 55  57                       |..C<.{.UW|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 14 ba 60 c0  bb d9 cb 55 0f 08 fc 18  |......`....U....|
-00000010  15 81 5d 69 a0 b2 c7 87  94 af c1 63 a6 46 e1 57  |..]i.......c.F.W|
-00000020  1e c5 9e 2e f1 aa db ad  c9 20 4e a2 88 69 48 b5  |......... N..iH.|
-00000030  ed 91 14 f1 d0 ec d2 28  9f e3 b7 de 03 7d 53 a6  |.......(.....}S.|
-00000040  25 7f 2f e3 5b 6a 79 29  15 4b 25 90 bf a6 49 0a  |%./.[jy).K%...I.|
-00000050  29 94 86 29 4b 8b a2 6c  82 1e 0a 57 91 1c 46 f1  |)..)K..l...W..F.|
-00000060  94 e3 ef e5 6c d5 e7 c8  82 86 82 dc 48 04 9d 11  |....l.......H...|
-00000070  d9 85 1a 41 27 ec 1c 25  72 a5 15 53 ef 70 90 a8  |...A'..%r..S.p..|
-00000080  a8 17 ae 4f 22 71 1c d3  7e 00 55 67 67 3b 3d cb  |...O"q..~.Ugg;=.|
-00000090  2c f3 03 39 f3 d8 46 30  4d 60 c4 58 d1 20 f6 1c  |,..9..F0M`.X. ..|
-000000a0  f2 13 8d c8 58 36 08 97  c6 82 9e 6d a4 bd 0a 71  |....X6.....m...q|
-000000b0  e4 e2 7f 76 69 6f 39 19  43 9f 9c ea 8d fb ec ea  |...vio9.C.......|
-000000c0  90 a0 e7 67 ea d7 48 c6  e5 ce 7c f6 98 fb 0f 8a  |...g..H...|.....|
-000000d0  5b 9f 85 0b 9e 6b 50 40  32 12 a0 9e c2 5d d7 af  |[....kP@2....]..|
-000000e0  b1 57 e0 bf 05 59 3b 4c  93 4f 4b 85 6f 8d bf 65  |.W...Y;L.OK.o..e|
-000000f0  94 a9 7c fc ab ef 1a 3a  4e 70 bd 54 35 6d f9 68  |..|....:Np.T5m.h|
-00000100  36 8d 5e 30 d7 01 5c 1e  b1 91 7c 9a fb 18 08 63  |6.^0..\...|....c|
-00000110  28 d8 28 5d 53 1c f9 88  cb                       |(.(]S....|
+00000000  16 03 03 01 16 ab 36 6a  25 3d 93 3c 71 b6 5b 91  |......6j%=.<q.[.|
+00000010  8d 58 37 42 24 7f d9 16  71 64 64 49 f1 4b ff d8  |.X7B$...qddI.K..|
+00000020  47 8f 2a 27 93 d2 63 a1  7e bf 76 94 b5 e5 a6 d4  |G.*'..c.~.v.....|
+00000030  79 97 60 76 18 a5 4a 47  85 89 49 01 48 5c ff 73  |y.`v..JG..I.H\.s|
+00000040  99 b4 44 9d f6 53 44 2e  b8 21 75 b5 d6 98 c7 33  |..D..SD..!u....3|
+00000050  7c 1a 25 7f 8d 79 db 7f  05 8c 9e e4 d8 9c 4b 57  ||.%..y........KW|
+00000060  45 70 42 ba 2c c1 45 f4  69 04 5a 87 ab f7 e4 d1  |EpB.,.E.i.Z.....|
+00000070  6a ed e9 cf ab 79 1c bc  dc c6 2d 72 1b 94 51 17  |j....y....-r..Q.|
+00000080  2f 2a 1a f2 0f 85 66 97  15 81 4b 99 e7 75 ec 19  |/*....f...K..u..|
+00000090  61 20 a7 92 f3 14 e1 a0  f8 a0 ad ba 9f ef d5 5d  |a .............]|
+000000a0  f1 92 ff 50 1b 66 9f e0  39 c4 58 a5 59 c5 eb 46  |...P.f..9.X.Y..F|
+000000b0  4b f5 53 6d 04 dd bc b4  71 d8 2b cf 4d 73 67 74  |K.Sm....q.+.Msgt|
+000000c0  c1 8d ab d2 53 0a 91 ce  90 03 ed e4 d8 23 1a ff  |....S........#..|
+000000d0  2c 70 1a 42 bc fb 80 5b  a8 97 aa 9b 6e 27 2c ec  |,p.B...[....n',.|
+000000e0  78 30 5c 9f 6f 5d 65 dd  f3 e2 41 9c ad 8d 12 58  |x0\.o]e...A....X|
+000000f0  39 ef ed cf 0b 73 28 c7  f4 37 f3 a2 16 39 18 c5  |9....s(..7...9..|
+00000100  db b8 b6 db b9 b2 56 f2  9b 60 38 9f 82 60 45 06  |......V..`8..`E.|
+00000110  3e 6b cf 9c 2f 1e 5d 0b  ff 80 cb                 |>k../.]....|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 b9 47 ca  9a 81 1b 3e 4e 21 cf 05  |......G....>N!..|
-00000010  99 31 4c 2a d4 72 9d 71  1f b9 87 e7 19 36 60 84  |.1L*.r.q.....6`.|
-00000020  e4 be 4a d9 7d 10 ad b1  d2 28 58 5b 47 09 cd 19  |..J.}....(X[G...|
-00000030  de d3 76 c4 56 e1 19 f5  a3 e2 e3 bd 8b d0 d9 e0  |..v.V...........|
-00000040  75 b2 d3 23 04 f0 65 ef  22 f6 10 13 28 80 1b c5  |u..#..e."...(...|
-00000050  69 75 7b 8c e6 cb 0e f5  e7 e8 fa 1e d0 e3 c3 24  |iu{............$|
-00000060  52 83 c9 a2 5b 57 94 da  b9 f2 5e 0a bc f4 a0 da  |R...[W....^.....|
-00000070  a1 02 b5 18 20 de 40 4e  52 97 12 6b e6 00 b6 eb  |.... .@NR..k....|
-00000080  af 82 f0 08 d7 33 16 03  03 02 69 26 88 2e 6e 74  |.....3....i&..nt|
-00000090  21 8d 66 37 b3 77 37 52  0d 04 e6 89 99 00 3f e6  |!.f7.w7R......?.|
-000000a0  e5 6b 56 68 8e 07 0b 2b  35 8f 59 81 f0 b0 82 77  |.kVh...+5.Y....w|
-000000b0  dd 13 b8 16 a9 e0 84 9c  bc 2d cf c4 30 a4 43 f6  |.........-..0.C.|
-000000c0  01 04 c3 7d 9d a1 84 16  73 45 f8 85 c8 fc c2 25  |...}....sE.....%|
-000000d0  49 24 07 e1 d8 1c 8f da  ce 04 0e ca 1a 4f 97 a0  |I$...........O..|
-000000e0  ba 8f 0f 2d 87 02 f9 a1  08 33 4e 53 a7 a1 bb c8  |...-.....3NS....|
-000000f0  41 d2 9b c6 44 0a 7e 8e  21 ff 0d 23 61 d0 b9 4d  |A...D.~.!..#a..M|
-00000100  27 74 3a de 3a 7e 76 1e  8f a1 f8 57 ca 6b 1d dc  |'t:.:~v....W.k..|
-00000110  75 e9 2b 95 ae dc 5e 93  de 23 43 6e 1f b1 4d df  |u.+...^..#Cn..M.|
-00000120  f7 e6 d8 bd 3d 31 0a 7f  97 7b 07 c5 ac 8a 1e 51  |....=1...{.....Q|
-00000130  95 a1 c5 b3 93 ba ec 41  d8 1a 57 28 2f 53 14 d0  |.......A..W(/S..|
-00000140  e0 e9 e9 e2 f4 a8 b1 67  15 2d d8 3b 96 82 75 16  |.......g.-.;..u.|
-00000150  f9 4e a1 55 1d b0 e1 48  95 bb ee 46 5f dd 48 4a  |.N.U...H...F_.HJ|
-00000160  6a ae b4 a0 24 21 85 70  20 80 22 dc c0 cc 0e 15  |j...$!.p .".....|
-00000170  55 c8 e1 15 1c 8c 38 c3  fb 38 31 0e 3c d8 49 bf  |U.....8..81.<.I.|
-00000180  63 4d d4 20 09 a4 b1 57  f8 a3 1c b2 8e 8d 28 c8  |cM. ...W......(.|
-00000190  af 20 4c 46 ae b5 eb aa  54 ca 74 cc bc b4 5c a5  |. LF....T.t...\.|
-000001a0  a0 ab c1 41 fb cc 0d d6  6a 25 58 c9 f1 10 32 59  |...A....j%X...2Y|
-000001b0  6a d3 04 5a fe bb 84 58  94 04 aa fd a4 f9 79 6c  |j..Z...X......yl|
-000001c0  f8 da 28 7f 16 73 5e 4c  a2 07 9d cc 8f 8d 25 27  |..(..s^L......%'|
-000001d0  2d 60 a3 a0 0d e3 65 0b  69 1f 44 92 97 d7 1e b8  |-`....e.i.D.....|
-000001e0  43 f4 ed f5 3c 6c ce 0e  f6 cb a2 83 80 c3 ee 00  |C...<l..........|
-000001f0  85 dd 25 2b 31 59 ba 88  07 df 04 8d a0 88 02 cc  |..%+1Y..........|
-00000200  d4 b3 5b 7b f1 72 72 7f  2d 4d af 43 c6 a0 9c 46  |..[{.rr.-M.C...F|
-00000210  10 63 30 d1 cb 43 20 f8  5c d7 45 f8 48 3e 29 17  |.c0..C .\.E.H>).|
-00000220  ba 26 31 6e e8 a8 d4 d5  da e0 9f d1 8c 76 9a bf  |.&1n.........v..|
-00000230  18 f9 02 1d a0 c5 07 b7  fe cd d2 34 47 27 84 b4  |...........4G'..|
-00000240  d4 07 3b 37 72 74 64 bb  c4 31 5e 7b a9 c6 a9 a2  |..;7rtd..1^{....|
-00000250  06 03 ea 32 41 64 b2 6c  57 70 bb 5c 0a a0 3f 48  |...2Ad.lWp.\..?H|
-00000260  78 e8 0b 8a b7 dd 67 68  43 aa 8e d9 ff 81 a2 f4  |x.....ghC.......|
-00000270  c6 25 9d 06 30 a4 6a 24  e0 b1 cd b4 7a d4 09 6e  |.%..0.j$....z..n|
-00000280  e3 d4 4c 3e b5 16 c3 44  9d f7 92 d6 40 95 d8 3e  |..L>...D....@..>|
-00000290  22 61 a3 29 87 8d 63 e0  98 0c db 9b eb 86 84 fe  |"a.)..c.........|
-000002a0  f3 ca 9f ce 7b de a9 04  3a 61 d4 bf d4 d6 51 60  |....{...:a....Q`|
-000002b0  02 06 cb 13 e1 a6 bf db  f0 f1 53 c6 62 a6 1a 42  |..........S.b..B|
-000002c0  11 6f 5d 0c 13 c3 12 ff  f5 7c 9b ef 58 54 14 3d  |.o]......|..XT.=|
-000002d0  4d 4b c2 fc ae 33 4a 00  24 e9 3c 6f 6f 5b ef c4  |MK...3J.$.<oo[..|
-000002e0  dc be 36 c5 ae 09 c2 c8  fb ac b4 ac af 79 5a 8e  |..6..........yZ.|
-000002f0  0d 8a 9d 38 16 03 03 00  bc 67 81 2a 98 2a ee 5d  |...8.....g.*.*.]|
-00000300  cd 33 df de c0 78 96 ad  f6 d1 e2 fe 9a e1 ab d6  |.3...x..........|
-00000310  95 f0 c8 24 da 49 2d 5a  d8 da 29 e6 31 c0 94 cc  |...$.I-Z..).1...|
-00000320  e3 9d 7e e6 e8 61 c9 e9  3a 0b 21 65 12 d8 20 87  |..~..a..:.!e.. .|
-00000330  fe fa ca 0e 69 98 70 01  a6 23 4e fb d4 02 cb aa  |....i.p..#N.....|
-00000340  6a cc f9 f3 cf fe 60 b6  2c 01 c6 b9 fd 72 fb 6e  |j.....`.,....r.n|
-00000350  d9 f9 40 35 3a 06 5d f6  63 42 ec 0b ae b7 88 08  |..@5:.].cB......|
-00000360  a8 74 b0 4f a3 ec 85 e9  ce 81 74 00 e4 b0 b8 08  |.t.O......t.....|
-00000370  a8 f2 a0 d6 84 7e b8 04  35 73 4a 15 1d cf 49 a2  |.....~..5sJ...I.|
-00000380  13 a2 a0 5b bb 98 17 67  76 76 c9 0a 4c 62 80 25  |...[...gvv..Lb.%|
-00000390  b4 06 32 3b 31 d5 00 08  6a c2 fe d6 8f 3d c3 1f  |..2;1...j....=..|
-000003a0  aa 9c 9f 38 8a db fc 8b  7f f5 83 bb f2 2d c9 ec  |...8.........-..|
-000003b0  90 ae ec 93 71 16 03 03  00 4a 93 37 97 13 36 1e  |....q....J.7..6.|
-000003c0  02 ff d7 c6 86 d4 ef b6  8a b6 70 0c 3d 77 69 d8  |..........p.=wi.|
-000003d0  9c 5c 6e a7 55 b6 c8 1b  04 eb 4b bc d3 49 36 4f  |.\n.U.....K..I6O|
-000003e0  1b b5 1b 10 d5 12 48 80  7f fc 2f 61 8b 02 12 09  |......H.../a....|
-000003f0  4a 13 44 28 9d 8e d5 ea  5d b7 ae 61 d5 38 e1 50  |J.D(....]..a.8.P|
-00000400  fe 4b bc bb 16 03 03 00  14 90 03 cf f7 ec 97 ef  |.K..............|
-00000410  a3 9a 41 89 ac f5 99 9a  cf ab f6 eb 06           |..A..........|
+00000000  16 03 03 00 81 21 a2 14  95 1e 02 74 1b aa c5 ec  |.....!.....t....|
+00000010  3f 9f 1a 88 67 00 8b 16  68 54 52 bb df f7 4c 75  |?...g...hTR...Lu|
+00000020  57 49 e3 00 1e b2 6f 61  67 eb ac 1e 77 31 bc e1  |WI....oag...w1..|
+00000030  66 a9 db 13 8b 43 d3 73  f9 57 97 1d 75 bd fc 78  |f....C.s.W..u..x|
+00000040  1b 0c 92 a4 66 95 d6 89  3d 86 63 a6 e8 15 5d d2  |....f...=.c...].|
+00000050  65 4c b5 2b f7 3d be 81  17 e6 23 64 65 26 68 b8  |eL.+.=....#de&h.|
+00000060  14 6b 68 24 78 19 84 a4  a1 82 d2 b6 6f d1 58 68  |.kh$x.......o.Xh|
+00000070  43 db 14 90 af 15 3c 8d  0c 5d b3 26 f3 14 7f cf  |C.....<..].&....|
+00000080  09 05 2a 2a 5d 21 16 03  03 02 69 f3 b0 da 24 57  |..**]!....i...$W|
+00000090  c9 6b 11 b6 67 20 2c 5f  64 53 ca a5 71 26 95 89  |.k..g ,_dS..q&..|
+000000a0  47 be 7d 27 dd a9 6e 8e  af 45 de 5d bd 37 8c 2b  |G.}'..n..E.].7.+|
+000000b0  b0 d8 d0 49 7e f1 cf 1c  47 a9 0f 5f fa 99 56 46  |...I~...G.._..VF|
+000000c0  a2 41 f7 f6 08 5f 97 6b  14 64 01 aa b2 f6 55 34  |.A..._.k.d....U4|
+000000d0  25 76 f3 ef 29 a3 cc 99  f5 06 ac 30 d1 00 db 36  |%v..)......0...6|
+000000e0  9b 41 c0 45 2e d4 bc b9  02 87 0f 0a 0e 2d 9d 56  |.A.E.........-.V|
+000000f0  df b8 94 8e 54 a8 6d 0a  8d b8 71 3c c0 76 0a 94  |....T.m...q<.v..|
+00000100  6d dc c6 5b 24 7e c5 48  25 67 15 44 2b 48 d0 cd  |m..[$~.H%g.D+H..|
+00000110  82 d8 c8 5e 0c 20 32 95  a9 f8 d5 31 cd f7 44 da  |...^. 2....1..D.|
+00000120  05 c4 cb e9 04 48 72 ac  ca 7b 26 e6 76 d2 01 18  |.....Hr..{&.v...|
+00000130  c0 34 88 29 7c 8c dc 35  e3 25 c9 11 f0 2b 1f 44  |.4.)|..5.%...+.D|
+00000140  d8 7d ea 1d 6a 57 b2 2c  52 8e 89 50 e3 e4 1c 51  |.}..jW.,R..P...Q|
+00000150  91 0c 6d fd 8d ad 91 77  b1 34 02 83 96 7e 39 5f  |..m....w.4...~9_|
+00000160  bc ed b1 05 3b f0 d3 f0  b3 05 54 e8 47 36 32 b1  |....;.....T.G62.|
+00000170  88 c9 31 7e d8 41 12 3b  55 25 b3 bc e3 9f a5 17  |..1~.A.;U%......|
+00000180  a8 45 21 68 e6 12 83 0e  80 13 d5 80 4d 89 0d fb  |.E!h........M...|
+00000190  9f 06 84 35 04 e8 0e bc  8c e7 17 83 7a 0f 68 34  |...5........z.h4|
+000001a0  ee db 10 78 31 85 34 e0  d8 f4 d2 3d fa 1c 18 49  |...x1.4....=...I|
+000001b0  25 c9 b9 53 ee b1 62 ff  13 77 36 8e 59 73 f7 9b  |%..S..b..w6.Ys..|
+000001c0  5f 4d 01 2d 41 dc 9e 2e  f7 f4 4c f7 27 eb e3 35  |_M.-A.....L.'..5|
+000001d0  91 41 b5 7f 28 eb 04 2c  f6 db 80 aa 3d 4e ac 2b  |.A..(..,....=N.+|
+000001e0  9d 95 c8 97 cf 35 f5 49  0d c7 b1 4f bf 41 eb 4a  |.....5.I...O.A.J|
+000001f0  9a a6 56 b8 8a 75 53 17  dc d4 ad ab 82 25 e8 0a  |..V..uS......%..|
+00000200  ae 8b c0 a3 8e 67 4b d1  96 04 45 1d c8 12 32 3f  |.....gK...E...2?|
+00000210  7e 4c 48 95 9f 24 8c 01  cf c3 78 10 d6 12 63 37  |~LH..$....x...c7|
+00000220  38 58 d3 31 97 25 9d 43  29 29 86 fb 9a 47 b5 c1  |8X.1.%.C))...G..|
+00000230  81 dc ab 4b be 57 bf 9f  0c 0b 28 fc 13 15 4e 2d  |...K.W....(...N-|
+00000240  58 97 78 3e 7f eb bf a1  cf a1 8d ab fe 3a 47 77  |X.x>.........:Gw|
+00000250  c1 fb b7 b8 82 42 37 95  60 20 be 91 26 ca 2c 48  |.....B7.` ..&.,H|
+00000260  44 57 6c 75 24 22 93 32  cf 83 f8 0c 75 b5 4a f1  |DWlu$".2....u.J.|
+00000270  88 d0 8e 1d 4e c7 93 1b  ba ea 14 04 38 f6 7a c2  |....N.......8.z.|
+00000280  d2 4b 7c 9c 1b 8b 31 6c  d8 09 88 6a 6d a1 61 d6  |.K|...1l...jm.a.|
+00000290  ee 80 ea 76 c0 d9 5a 49  31 3b dd 0f b5 5a a1 29  |...v..ZI1;...Z.)|
+000002a0  d4 ff db 68 48 96 26 e7  a7 82 10 e9 6e 5c c4 66  |...hH.&.....n\.f|
+000002b0  d5 e0 87 c3 66 d8 7c 4e  bf a5 31 0f fa 6e f6 21  |....f.|N..1..n.!|
+000002c0  4d fe ea f0 36 91 9e 18  81 c0 21 4f 77 eb 65 c0  |M...6.....!Ow.e.|
+000002d0  fe 84 45 22 dd 28 03 eb  e5 ce 15 62 e1 b8 9f 0e  |..E".(.....b....|
+000002e0  aa 9d bc 5c 38 41 01 74  17 d0 92 a5 80 e4 4b 58  |...\8A.t......KX|
+000002f0  42 bb 42 5d 16 03 03 00  bc 09 fb 78 c1 36 2e 27  |B.B].......x.6.'|
+00000300  b2 44 17 1a a8 2b f5 cd  98 78 a4 c1 1c f2 e7 53  |.D...+...x.....S|
+00000310  92 ef c1 88 83 78 37 23  08 f5 7f 5d 9f d1 c4 32  |.....x7#...]...2|
+00000320  df 01 c6 9c 3e a8 11 31  f4 77 69 94 d7 67 bc 62  |....>..1.wi..g.b|
+00000330  8e 18 57 0a cd d8 ba db  cd 2b e8 f9 37 77 16 13  |..W......+..7w..|
+00000340  be 18 53 2a 50 0b 0a d7  9a f0 7d 10 d3 13 bb 82  |..S*P.....}.....|
+00000350  36 5c aa d1 17 ad 83 69  47 7f 81 5c 36 53 81 e3  |6\.....iG..\6S..|
+00000360  1d 65 9f ac b2 3e 76 77  5a 6a 39 e5 df 92 55 e6  |.e...>vwZj9...U.|
+00000370  90 96 9c b9 54 ac 09 17  ce f5 43 9f 3e 1e 3a b6  |....T.....C.>.:.|
+00000380  cb 61 da 1a 3e e0 b4 51  30 3e 22 09 0b 05 a7 6e  |.a..>..Q0>"....n|
+00000390  5a df 82 d2 ab b9 d8 d2  37 a7 d7 b5 7f a9 ea 49  |Z.......7......I|
+000003a0  2f 64 57 33 5a 19 7f a3  2f 6a 7e 40 18 19 4a 61  |/dW3Z.../j~@..Ja|
+000003b0  05 92 35 8b 50 16 03 03  00 4a 50 1e e6 f4 47 dd  |..5.P....JP...G.|
+000003c0  fb 02 b4 22 71 e7 1e b1  51 28 9f 2d 40 64 2c 85  |..."q...Q(.-@d,.|
+000003d0  47 33 69 3e b0 e4 c7 eb  a6 31 13 76 45 39 e7 50  |G3i>.....1.vE9.P|
+000003e0  94 86 2e dd e1 58 f2 83  60 86 07 94 29 ce 69 12  |.....X..`...).i.|
+000003f0  0f 89 e3 89 2f 00 50 2b  56 ed 1d fe 25 55 9f 33  |..../.P+V...%U.3|
+00000400  3d 30 93 3c 16 03 03 00  14 0e 3f df b0 79 70 a7  |=0.<......?..yp.|
+00000410  08 bb 01 ff 08 44 69 65  49 81 9f e5 3a           |.....DieI...:|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 74 87 f6  35 08 6b 36 04 33 bd 50  |....it..5.k6.3.P|
-00000010  d8 de c9 0b 8e 98 d4 2a  ca f1 68 50 10 03 d4 83  |.......*..hP....|
-00000020  56 e2 12 fd 8d 5f ff 7c  16 9b 43 d9 75 f7 c6 ee  |V...._.|..C.u...|
-00000030  ee dc f6 e9 19 d0 ae 8a  54 fb c6 7e 9e b4 15 79  |........T..~...y|
-00000040  17 fa d2 32 8d b4 b0 ff  15 44 ac 4f 28 5d ba 10  |...2.....D.O(]..|
-00000050  6e e6 cb b3 ad e8 ef 06  c4 3e aa 1f a8 df 1b 82  |n........>......|
-00000060  38 bd 5f 88 5c 0e 5b e7  03 df 9b 6f c2 d9 b8 5f  |8._.\.[....o..._|
-00000070  bf 60 de 69 f3 12 4f b8  50 28 fc 2d 15 70 92 3b  |.`.i..O.P(.-.p.;|
-00000080  76 7d 36 13 5e e6 39 e6  29 6d d0 99 14 ca 52 a5  |v}6.^.9.)m....R.|
-00000090  12 db 96 d4 d0 38 ef 42  6c 09 ca dc 06 f2 d3 8f  |.....8.Bl.......|
-000000a0  49 c8 a3 c2 77 c3 c1 f6  18 6a 91 95 36 1b d6 47  |I...w....j..6..G|
-000000b0  f6 87 0c 3e 82 b4 22 62  a5 cb 5b e8 73 6e 71 52  |...>.."b..[.snqR|
-000000c0  4f 7c 9f b8 b4 f1 5b 77  96 a6 8e 22 52 b6 cf cc  |O|....[w..."R...|
-000000d0  b4 5b a9 a9 63 4b 9b 1c  db a0 ad f4 35 04 20 6c  |.[..cK......5. l|
-000000e0  33 b2 c6 5c 6f 2a 1e 5f  d9 c4 c1 b1 82 4f 6d 12  |3..\o*._.....Om.|
-000000f0  e1 6e f9 9f e8 0f e7 9e  cf 80 eb 1a 72 de 9e df  |.n..........r...|
-00000100  b2 6f d4 57 1f cc 01 89  b2 e3 2f 65 dd 05 ae 0d  |.o.W....../e....|
-00000110  d0 9f 74 21 45 3c c4 00  67 61 2c 37 8e 96 a4 38  |..t!E<..ga,7...8|
-00000120  b2 1d d8 58 25 7a 3f 99  0c 7b e7 fd 67 92 e2 3f  |...X%z?..{..g..?|
-00000130  14 32 79 25 d3 df cd cf  1f fc 5d 67 53 e0 7d 28  |.2y%......]gS.}(|
-00000140  60 b1 b0 d8 d9 81 d4 b4  22 81 e4 c2 09 8e 8d 37  |`......."......7|
-00000150  82 35 61 37 6c 6e 8e 2d  9f 41 63 b3 e9 f9 1f 73  |.5a7ln.-.Ac....s|
-00000160  8f bf 7d 08 65 b8 a2 5a  32 5a 0f 96 70 fc 11 d5  |..}.e..Z2Z..p...|
-00000170  b3 af 85 2c 22 cc 8d da  18 80 74 6c d9 64 1e e5  |...,".....tl.d..|
-00000180  8a 10 ee 28 6b 3b 85 d9  af b7 65 bd 39 c4 4c 1e  |...(k;....e.9.L.|
-00000190  c6 40 b7 26 cd 07 1a e1  42 c9 a0 e6 94 34 60 11  |.@.&....B....4`.|
-000001a0  5e 1c c1 76 f5 59 70 fb  73 8e 2f 44 53 ea b2 55  |^..v.Yp.s./DS..U|
-000001b0  ed 0c 6f 39 f0 0a 04 b9  6c 7e c9 15 dc 3f c7 72  |..o9....l~...?.r|
-000001c0  85 78 02 ce 96 49 57 cd  56 dc 9c 76 b9 ae 08 6c  |.x...IW.V..v...l|
-000001d0  52 82 b2 a0 05 20 f6 2e  28 0d 4c 46 58 42 d5 2f  |R.... ..(.LFXB./|
-000001e0  83 55 b1 e1 47 f1 b1 70  72 b0 73 7f a5 7f 4d 73  |.U..G..pr.s...Ms|
-000001f0  e8 09 46 d7 16 3e 3d df  04 79 24 38 23 e2 a6 e3  |..F..>=..y$8#...|
-00000200  e7 70 b5 69 b7 42 fb 45  84 d3 e8 cc eb e5 25 67  |.p.i.B.E......%g|
-00000210  ee 71 b9 24 05 8c cc e0  2b 86 1d ac 54 24 e8 7a  |.q.$....+...T$.z|
-00000220  c3 8f 22 df 01 21 f7 d1  a9 b6 96 3c e8 b4 c9 95  |.."..!.....<....|
-00000230  5a e1 2e 46 ac e3 6b a5  14 60 d4 63 c1 37 5e d5  |Z..F..k..`.c.7^.|
-00000240  14 d1 97 ae c0 cf 01 d3  b0 b0 3d d7 7e 9f 5a 52  |..........=.~.ZR|
-00000250  73 f3 e0 70 22 09 44 85  b9 1e 2f 78 a1 33 cc 39  |s..p".D.../x.3.9|
-00000260  fd ff bc 68 1e 96 7e 26  be 31 8e 73 64 21 16 03  |...h..~&.1.sd!..|
-00000270  03 00 35 96 4d ac f1 b3  1b 7b e0 ab 2b 47 40 be  |..5.M....{..+G@.|
-00000280  46 a3 02 2c eb 74 b8 4f  53 b5 7d 05 47 dc 72 d9  |F..,.t.OS.}.G.r.|
-00000290  6a 8e 7d 6f 66 2a 6b e2  27 e7 6a bf 39 68 f3 9c  |j.}of*k.'.j.9h..|
-000002a0  89 51 dc 4e 8c 82 38 57  16 03 03 00 98 fb 44 b6  |.Q.N..8W......D.|
-000002b0  36 4a 3e 0a 41 01 3d 78  8b 5d fe 95 69 a5 53 d5  |6J>.A.=x.]..i.S.|
-000002c0  d6 37 c3 e3 03 ae b7 33  57 1a 1a dd d0 cf 86 34  |.7.....3W......4|
-000002d0  6e 06 30 ac 09 08 13 8b  18 9f a6 ec 96 e4 bc ca  |n.0.............|
-000002e0  06 6b 01 2d 2e 7c ff 34  9e 16 7e fc e3 0e 3c 0e  |.k.-.|.4..~...<.|
-000002f0  5c d0 13 88 7d af ec a4  91 fd a1 48 ef b3 fb 2a  |\...}......H...*|
-00000300  d8 e5 a3 c7 4b 50 34 fc  c1 33 dd 43 88 8d 6e 16  |....KP4..3.C..n.|
-00000310  9e 0c d7 b0 7f b2 77 cc  da e0 8e 02 9e db 2f 12  |......w......./.|
-00000320  3b 4f 5b 7b c2 eb e3 10  5c 6f 43 d6 54 e1 8c 55  |;O[{....\oC.T..U|
-00000330  ec 51 93 f8 12 5e f6 09  92 a1 95 51 db 75 97 17  |.Q...^.....Q.u..|
-00000340  bc cd 80 71 e9 14 03 03  00 11 4b d7 45 5f 00 cd  |...q......K.E_..|
-00000350  ad 58 83 c6 14 13 d2 89  fa a8 2b 16 03 03 00 20  |.X........+.... |
-00000360  33 77 49 9f ff 97 4c 6a  f7 42 45 d4 59 6a 1e 6e  |3wI...Lj.BE.Yj.n|
-00000370  12 29 e7 62 01 0c 9e 8c  e2 f1 7f fb aa a4 05 e2  |.).b............|
+00000000  16 03 03 02 69 b8 47 2d  3a 7a e4 d0 2b 45 b2 38  |....i.G-:z..+E.8|
+00000010  1e 6f 8d 3d e1 26 91 92  d7 1f e9 a4 2c d8 30 2c  |.o.=.&......,.0,|
+00000020  ce 68 50 e7 80 77 63 e1  bd c7 c8 1b 6f ca b0 bf  |.hP..wc.....o...|
+00000030  82 1d 75 85 2c 5d b2 f6  9a f2 b6 9b c4 24 54 86  |..u.,].......$T.|
+00000040  b8 fb dc ae 09 25 c4 42  fc 4d f2 18 5b a3 92 31  |.....%.B.M..[..1|
+00000050  8a 78 1f 1a 74 d4 43 0b  24 2f 14 2b 0e 05 3a 8d  |.x..t.C.$/.+..:.|
+00000060  7a 1c 21 2f cd 7b 9d 6c  32 b1 f6 14 fa 9d f5 be  |z.!/.{.l2.......|
+00000070  9c f1 8e 75 b9 27 82 ba  e7 fc 14 39 2a 6f 3e 59  |...u.'.....9*o>Y|
+00000080  d6 bc 6c 3f f1 33 5e fa  bb 07 bc e4 0b 7e 4a 5d  |..l?.3^......~J]|
+00000090  2b e8 9b d5 00 d2 cc 8f  94 01 82 0e bb 28 f9 d2  |+............(..|
+000000a0  1f ee 0c ff 9c 4d 37 5b  23 5b 23 a5 39 fe cd 2b  |.....M7[#[#.9..+|
+000000b0  ef 30 46 b7 c1 0e a3 fc  fd f6 1b d3 78 fb d9 93  |.0F.........x...|
+000000c0  3a 52 fe 91 dc 42 63 85  09 64 63 3a 9d 9f 21 74  |:R...Bc..dc:..!t|
+000000d0  c6 d9 e4 b5 cc ef 94 96  0f c1 d0 45 f6 e6 b9 32  |...........E...2|
+000000e0  01 74 88 24 bb d9 d6 25  23 14 de 25 f4 7e 9c 77  |.t.$...%#..%.~.w|
+000000f0  82 83 7e 59 dc c3 f7 d9  e4 b1 95 e0 bb 6e 66 e4  |..~Y.........nf.|
+00000100  bd cb a2 72 a0 63 d4 39  9f 57 a7 d1 88 7a 59 64  |...r.c.9.W...zYd|
+00000110  38 45 bb fc 5a 02 81 4c  2e e5 e4 1c 7d e9 e8 f0  |8E..Z..L....}...|
+00000120  e1 b7 88 f5 a6 ee d0 b7  e5 2f 9e 15 d5 76 8d f7  |........./...v..|
+00000130  68 0f 7b 6a 48 e7 19 3a  bc ef f5 fc 72 a4 62 ce  |h.{jH..:....r.b.|
+00000140  a6 66 e5 e8 74 03 c0 4d  b4 14 e4 0c 36 fd 99 0b  |.f..t..M....6...|
+00000150  0e 4f b6 5e 4c db dc 51  fe ae e9 07 37 92 6c 35  |.O.^L..Q....7.l5|
+00000160  f7 99 6c b9 36 c2 b9 7c  5e ef 72 c1 1f ba fb 18  |..l.6..|^.r.....|
+00000170  57 24 f2 d4 21 cf 46 bd  71 3d 62 63 ba 1c 0f 8b  |W$..!.F.q=bc....|
+00000180  f4 a6 fc ea 27 de 48 b8  ed e3 6e 4b 30 66 fa 1e  |....'.H...nK0f..|
+00000190  22 7b 49 e2 03 96 8a 6a  3c 6a 1a 62 81 cc 06 dd  |"{I....j<j.b....|
+000001a0  a7 6b dd 3c 1b 39 e3 36  5a 8c ec 22 71 35 af fc  |.k.<.9.6Z.."q5..|
+000001b0  74 11 68 2f bd 9a 61 57  39 1a e7 c5 df 62 45 fc  |t.h/..aW9....bE.|
+000001c0  b5 84 f0 b8 6a 63 6f dd  16 24 74 4d 81 34 3e 4c  |....jco..$tM.4>L|
+000001d0  e7 b9 9f 90 aa 1f 39 13  e2 4b 8c ff b5 13 d1 d2  |......9..K......|
+000001e0  cd ac ce 8c 2b bc b3 b3  fc f7 37 db 61 8f 6b 90  |....+.....7.a.k.|
+000001f0  c2 bc 6e e3 8e fa d9 16  ab 62 c7 3f d7 e1 0b a8  |..n......b.?....|
+00000200  2b 8a 0d b6 2c 90 dc 6e  b4 44 e0 13 32 fb 80 23  |+...,..n.D..2..#|
+00000210  a9 e4 18 ea 8d c7 8a 14  0a 82 8d 3b 21 88 bf bf  |...........;!...|
+00000220  ff 10 3c 08 6b 65 70 4c  b5 88 7d 9c 92 43 15 55  |..<.kepL..}..C.U|
+00000230  18 e9 cf 15 5d 55 3a f0  a1 46 ca d4 9e f3 c0 16  |....]U:..F......|
+00000240  4b ee f6 17 95 e0 af 1e  85 54 62 dd 56 88 6b e1  |K........Tb.V.k.|
+00000250  29 ac f9 4f dc 5c 89 16  19 6b 21 c9 6c c8 1e 1d  |)..O.\...k!.l...|
+00000260  89 7c cc a4 9b 1f c8 ce  67 c6 83 79 6a d6 16 03  |.|......g..yj...|
+00000270  03 00 35 6f 33 7d 96 3c  8d 66 a5 d1 7a 8b bc fa  |..5o3}.<.f..z...|
+00000280  ca f0 89 9d 2b 37 0c f5  aa 14 07 f2 58 be d1 d3  |....+7......X...|
+00000290  ec 73 dd b6 33 e2 df 46  1a d3 ee e8 26 d9 be 2b  |.s..3..F....&..+|
+000002a0  43 25 3b e2 78 72 10 43  16 03 03 00 98 18 03 96  |C%;.xr.C........|
+000002b0  9c eb 31 50 72 15 0e 9b  ff c7 6b b0 60 32 08 c6  |..1Pr.....k.`2..|
+000002c0  ef 70 f9 0c 22 4a a2 0f  77 31 b3 ea d0 12 65 af  |.p.."J..w1....e.|
+000002d0  c9 28 0f f9 5b b7 f3 75  9c 5a 6e df a1 6a e6 d5  |.(..[..u.Zn..j..|
+000002e0  82 0b 18 05 94 aa dd 93  e5 1d 60 06 47 f5 3e b1  |..........`.G.>.|
+000002f0  d5 e8 e7 b7 9f 43 bf 4b  8a 5e 48 3b f1 42 f6 c0  |.....C.K.^H;.B..|
+00000300  c3 65 86 e2 bc 7a 75 1d  93 cf 7f 3d 11 d3 85 c3  |.e...zu....=....|
+00000310  c3 90 90 0b 77 e1 d7 64  da 71 3c 55 de 7c b9 71  |....w..d.q<U.|.q|
+00000320  ea d9 7a ae a6 dd 7e e0  a4 2e 88 89 79 2c 40 dc  |..z...~.....y,@.|
+00000330  dd 95 b0 04 6a 76 90 70  2b c7 42 b0 2e 04 79 0c  |....jv.p+.B...y.|
+00000340  4e cb ca f0 81 14 03 03  00 11 29 9f c8 82 93 26  |N.........)....&|
+00000350  07 ce a1 23 50 1a 75 38  36 e0 92 16 03 03 00 20  |...#P.u86...... |
+00000360  75 41 82 00 9b 89 29 9b  59 2f 45 01 3e a9 ae c6  |uA....).Y/E.>...|
+00000370  f8 7e fd 4d bd 3b 0e bc  9b 74 27 09 33 c3 27 2a  |.~.M.;...t'.3.'*|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 b3 52 01  6f eb 60 f2 1e 3c 03 47  |......R.o.`..<.G|
-00000010  0b be 2c 14 06 9c 16 03  03 00 20 ac c1 ed 57 1b  |..,....... ...W.|
-00000020  87 8a c6 78 a7 36 17 2b  61 fd db d3 cc 23 88 5e  |...x.6.+a....#.^|
-00000030  8c 40 1b 04 10 40 1c 51  75 a3 3f 17 03 03 00 19  |.@...@.Qu.?.....|
-00000040  16 55 b1 d2 86 e7 fa be  59 4a 7f 13 b5 aa af d1  |.U......YJ......|
-00000050  0c 50 2a 7f a9 b9 c5 eb  45                       |.P*.....E|
+00000000  14 03 03 00 11 3d 29 da  dc b6 5a 09 66 34 6e 00  |.....=)...Z.f4n.|
+00000010  65 8c 29 d2 18 bd 16 03  03 00 20 63 55 d1 84 7d  |e.)....... cU..}|
+00000020  3e cc 2d f5 d3 48 c2 5c  72 d8 6b cf 69 b4 ed 5f  |>.-..H.\r.k.i.._|
+00000030  07 96 53 13 1e 53 59 18  c1 bb c7 17 03 03 00 19  |..S..SY.........|
+00000040  30 5b 6d d2 26 db ef c1  a9 00 e6 ce 87 86 9b 71  |0[m.&..........q|
+00000050  dd fb aa 79 aa b6 39 1e  70                       |...y..9.p|
 >>> Flow 11 (client to server)
-00000000  15 03 03 00 12 4c e2 da  21 11 be 48 2d 52 09 32  |.....L..!..H-R.2|
-00000010  83 9b 6f dc a8 6c 5c                              |..o..l\|
+00000000  15 03 03 00 12 32 8f cd  ef b8 3e 96 01 07 ca 0b  |.....2....>.....|
+00000010  83 21 83 97 78 25 64                              |.!..x%d|
index f85c6907fabcf3addff96190e9e4e0a910772e62..983174f5ec8a5bdc59dfa8345c2f8d7a1d2db485 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 51 2d ad 23 79  |....Y...U..Q-.#y|
-00000010  a1 68 89 d6 6d 78 78 ba  0d 65 e7 86 46 c7 5c c9  |.h..mxx..e..F.\.|
-00000020  3c fd 70 0e 82 d3 fa 66  5d 98 8a 20 db 5d a5 7f  |<.p....f].. .]..|
-00000030  85 73 11 b9 cd 80 4c f1  87 a2 5a 33 d7 4d af 49  |.s....L...Z3.M.I|
-00000040  ed 3b 5f 3d 13 6f a4 38  1e c9 75 13 cc a8 00 00  |.;_=.o.8..u.....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 34 8b db 6b 9e  |....Y...U..4..k.|
+00000010  68 c3 92 09 72 4f 02 6c  b9 7a ac 74 72 0b 32 01  |h...rO.l.z.tr.2.|
+00000020  f4 86 9e b5 53 db da 96  c2 65 2a 20 8f 89 24 79  |....S....e* ..$y|
+00000030  8a a5 38 7a 52 68 7a a9  cc d0 5a 04 4d ce 87 0e  |..8zRhz...Z.M...|
+00000040  64 48 51 e0 00 cb 60 f0  b4 e9 99 27 cc a8 00 00  |dHQ...`....'....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 68 e3 7e b2 34 ed 21  |........ h.~.4.!|
-000002d0  05 68 aa 61 70 f7 67 5b  ab 93 87 9c 8d 70 96 a7  |.h.ap.g[.....p..|
-000002e0  63 b8 ab 89 84 6b 89 08  13 08 04 00 80 94 a2 04  |c....k..........|
-000002f0  de e3 fa 20 2b ea 31 3b  c6 d9 ef 04 d9 7f 83 f8  |... +.1;........|
-00000300  f1 1e f3 9b d8 d6 db f1  bc 52 52 15 09 c7 6b 17  |.........RR...k.|
-00000310  56 ed 2c 51 2f ba 9c 23  1b 49 0f c6 d9 05 5c 66  |V.,Q/..#.I....\f|
-00000320  d0 19 af 29 d3 65 60 75  06 4e 15 7b c1 08 fe ac  |...).e`u.N.{....|
-00000330  0d b2 8c 65 67 f0 5a 9d  9f ed 33 dd 6a 09 58 0b  |...eg.Z...3.j.X.|
-00000340  25 ed 45 57 ea 61 a1 72  cb 39 ef fc 8b 06 94 b9  |%.EW.a.r.9......|
-00000350  68 ff 73 c5 52 8e 2b ef  c5 39 e7 93 34 2a cf c1  |h.s.R.+..9..4*..|
-00000360  54 cf c3 63 a2 2c 06 92  9f d9 8b 24 2c 16 03 03  |T..c.,.....$,...|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 63 06 67 5c 4e da 3f  |........ c.g\N.?|
+000002d0  0a 02 78 46 92 fe 8f ed  41 ac 1a d5 04 e6 ca 4a  |..xF....A......J|
+000002e0  7e 9c d0 32 e8 ee f3 9c  5d 08 04 00 80 c0 51 ba  |~..2....].....Q.|
+000002f0  71 28 00 53 c6 40 63 20  d4 bd 52 60 d2 f6 e2 57  |q(.S.@c ..R`...W|
+00000300  ba 6f a8 bf 42 2a 11 b5  9a eb 9f b6 53 77 87 72  |.o..B*......Sw.r|
+00000310  ea 7d bf f8 f4 cf 1d 76  6c 03 75 9d df 88 b1 13  |.}.....vl.u.....|
+00000320  66 5c 43 41 1e 97 52 32  86 d0 22 3c f6 ca 90 a5  |f\CA..R2.."<....|
+00000330  ba cf 75 94 1f 22 93 c0  0c c9 82 a5 eb d2 07 85  |..u.."..........|
+00000340  a0 39 9e 5d fa 88 1f 62  25 09 c3 97 c1 1d 4e a2  |.9.]...b%.....N.|
+00000350  fe 98 96 b8 c0 eb b9 18  07 2d e1 cf 9b fd 25 ba  |.........-....%.|
+00000360  93 fb 73 e5 7e 36 27 b3  11 00 58 95 f8 16 03 03  |..s.~6'...X.....|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 c5 ed 46  65 cc 21 42 fc 0f 93 4b  |.... ..Fe.!B...K|
-00000040  0e 73 eb 8f 8e e2 fe 45  f0 0e 64 f5 1b db 79 a6  |.s.....E..d...y.|
-00000050  60 7f ca 5c 72                                    |`..\r|
+00000030  16 03 03 00 20 02 50 f6  74 83 31 96 36 c1 22 99  |.... .P.t.1.6.".|
+00000040  1d d7 99 b2 8c 2b 04 3a  bd 3e 19 e5 ef 71 dc 72  |.....+.:.>...q.r|
+00000050  b2 0d c8 d1 3f                                    |....?|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 eb 22 65 3b 95  |.......... ."e;.|
-00000010  dd f8 04 5c 3e cc cb e7  e3 d0 bf 86 bf d6 70 f7  |...\>.........p.|
-00000020  1d 75 87 28 bb be 28 e3  b4 fd 7b                 |.u.(..(...{|
+00000000  14 03 03 00 01 01 16 03  03 00 20 9b a3 02 3e 55  |.......... ...>U|
+00000010  4a e6 4c 7f 9a a6 a2 65  bd 74 ff ad c5 ce 43 21  |J.L....e.t....C!|
+00000020  d3 b1 d1 89 0c 15 7d 7d  a7 d8 4c                 |......}}..L|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 d0 03 3c  9c 0a 2f 8e 12 d7 9b 3f  |.......<../....?|
-00000010  66 d3 6b e4 4d 2b be bf  61 e0 f1                 |f.k.M+..a..|
+00000000  17 03 03 00 16 4c 5e 0a  69 e1 e8 fc 52 f0 3d ea  |.....L^.i...R.=.|
+00000010  33 f5 02 6b 47 49 cd a5  b5 94 4e                 |3..kGI....N|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 f2 1c 0c  2c 61 9c 59 eb b5 b2 17  |........,a.Y....|
-00000010  50 46 fd a1 3f 06 2c fc  ef                       |PF..?.,..|
+00000000  16 03 03 00 14 6a 8d 46  e1 33 c6 63 9d 27 3e e8  |.....j.F.3.c.'>.|
+00000010  7f 31 74 7f 4f 60 b3 f7  aa                       |.1t.O`...|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 14 06 cd f6  16 2c a0 d5 ee c5 42 68  |.........,....Bh|
-00000010  c9 5f a9 b0 e7 79 0f 20  7c 0c 85 a9 ad df ee d6  |._...y. |.......|
-00000020  3e 8c ce ea c0 db 1a d4  9d b7 7d db 9f 37 91 93  |>.........}..7..|
-00000030  90 1e 48 ce a4 71 df 23  03 0d 29 82 7a 63 ee 2a  |..H..q.#..).zc.*|
-00000040  82 83 e6 e1 50 ab d2 9b  82 94 de 3d ae 0c e4 8a  |....P......=....|
-00000050  eb e7 3a d9 cb fb 87 24  2d 91 a3 65 e5 df 36 03  |..:....$-..e..6.|
-00000060  ef e4 93 4b 24 aa a5 04  17 60 68 2b 0d c9 e0 24  |...K$....`h+...$|
-00000070  18 69 7b 28 59 48 d6 1a  6e 74 23 7c 54 65 8c 3f  |.i{(YH..nt#|Te.?|
-00000080  51 67 e2 94 35 ce 60 2c  04 3d 04 15 31 b1 42 8a  |Qg..5.`,.=..1.B.|
-00000090  34 6c b6 47 d9 e0 3c e9  77 62 5f 76 c1 4a d3 f6  |4l.G..<.wb_v.J..|
-000000a0  56 b9 08 28 b7 c3 a5 ae  45 0e 26 95 3d fe 97 b4  |V..(....E.&.=...|
-000000b0  30 52 6d 57 5a 1f 95 97  67 18 b4 03 f3 b8 8d 0b  |0RmWZ...g.......|
-000000c0  49 bb 66 87 fb aa 36 35  00 7b fe d9 f1 7b 2b 7e  |I.f...65.{...{+~|
-000000d0  03 47 80 87 2b c9 17 c9  2e 45 82 af cd 67 49 e2  |.G..+....E...gI.|
-000000e0  a7 b5 fb 30 21 23 c6 22  a1 e7 f1 a1 3b 19 ff 04  |...0!#."....;...|
-000000f0  1c b4 99 7d b0 5e 49 43  5d 0e d4 62 04 7d 52 ed  |...}.^IC]..b.}R.|
-00000100  b4 50 86 06 83 d6 e6 9e  42 3d ee 9d 27 f7 6a 11  |.P......B=..'.j.|
-00000110  f6 c8 da 92 a2 23 49 8d  80                       |.....#I..|
+00000000  16 03 03 01 16 6f 4d 64  ff 20 fa 1c 19 26 bc 99  |.....oMd. ...&..|
+00000010  ec 09 be e7 6d 88 73 1e  4f c6 74 35 f7 5c b3 e5  |....m.s.O.t5.\..|
+00000020  f6 d1 2a 90 7f c3 34 dc  83 6b a9 f1 32 01 a1 84  |..*...4..k..2...|
+00000030  0c 4c 06 db 88 d4 19 31  d2 46 1f 2c 3d 13 75 5b  |.L.....1.F.,=.u[|
+00000040  f3 e5 d0 b7 a8 4f 2c b2  89 35 78 82 78 b7 f5 c6  |.....O,..5x.x...|
+00000050  ea a2 1d f3 24 9d e2 01  25 e2 96 a1 06 57 5c 50  |....$...%....W\P|
+00000060  d6 5b 56 24 18 6e b4 ce  6a 2e c7 01 65 99 3f 35  |.[V$.n..j...e.?5|
+00000070  c1 07 48 75 ad 0b 1a b3  58 df 83 42 f8 78 eb 92  |..Hu....X..B.x..|
+00000080  e8 70 c9 34 af db e8 d6  b0 c8 37 ac b2 d7 18 ba  |.p.4......7.....|
+00000090  a3 1d 35 09 2e 2f 82 e0  3a 68 fd 7f ba 4d 5c 5c  |..5../..:h...M\\|
+000000a0  6c 6d ac 24 60 bf e0 37  a9 17 8d 6d 8a 69 96 23  |lm.$`..7...m.i.#|
+000000b0  4f c7 53 a0 48 65 58 cc  01 03 df 33 36 5a 8a 7e  |O.S.HeX....36Z.~|
+000000c0  3f 84 33 26 3f 02 66 48  82 22 22 b7 7d 62 7e 56  |?.3&?.fH."".}b~V|
+000000d0  94 df 43 df 08 fc 70 f6  bb 1a dd 19 b1 ea ea a2  |..C...p.........|
+000000e0  6f 36 ab b0 d2 77 e6 c8  f6 70 a6 a6 a3 0d ab c8  |o6...w...p......|
+000000f0  dc d1 9b a2 05 43 44 0c  17 8d 47 86 55 77 56 34  |.....CD...G.UwV4|
+00000100  d7 71 2c 75 9a d4 70 e4  77 5e 1a b7 b1 13 ae 14  |.q,u..p.w^......|
+00000110  d0 99 a0 9e 50 9c 35 94  4d 34 e5                 |....P.5.M4.|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 7b f1 ac  76 fd 28 ba 97 a6 8e 3a  |.....{..v.(....:|
-00000010  ae f0 9a f6 ed 64 5d 2a  50 7d b2 83 e5 de b9 3c  |.....d]*P}.....<|
-00000020  3c 5b ab 48 db ec a7 18  d6 fd af a1 98 32 82 1e  |<[.H.........2..|
-00000030  b4 8d 83 3f 44 ff e6 1e  86 2b e3 f9 39 f8 30 a4  |...?D....+..9.0.|
-00000040  26 f9 cc 3f 73 d5 88 f5  90 c7 b4 20 0b d3 6b c3  |&..?s...... ..k.|
-00000050  4c 81 e6 4e 83 81 a7 9d  47 0d 0b 29 4c 2a 45 e2  |L..N....G..)L*E.|
-00000060  0d 8b 40 61 0d f1 ee e1  e8 db 8f 43 e4 75 71 44  |..@a.......C.uqD|
-00000070  f5 e3 69 99 a7 6d 67 79  06 02 65 4a 80 84 ee d8  |..i..mgy..eJ....|
-00000080  56 30 f2 a6 ad b5 16 03  03 02 69 c9 6d 2c 0f ed  |V0........i.m,..|
-00000090  9c 35 b6 61 29 70 0f ab  a0 61 00 cc d6 aa 9c 37  |.5.a)p...a.....7|
-000000a0  9a 55 e7 a7 73 77 44 1b  bb f0 be 1d 28 6a 45 03  |.U..swD.....(jE.|
-000000b0  d1 7e c4 ef 42 e2 37 1d  5e 5a 5e cd 73 54 05 bd  |.~..B.7.^Z^.sT..|
-000000c0  a5 d9 d3 0d 7d 65 a3 a2  72 86 e0 c3 2d e1 91 96  |....}e..r...-...|
-000000d0  d5 11 34 e1 f0 24 97 84  95 12 9f e1 89 f5 1b e0  |..4..$..........|
-000000e0  fb 59 5b c4 fa 4e d1 f4  44 34 21 5a 5e 97 1a f7  |.Y[..N..D4!Z^...|
-000000f0  ba 06 e8 83 b2 4a ca b4  90 ef f2 06 d5 48 2f 18  |.....J.......H/.|
-00000100  11 2b fc 5c 41 ef 73 c4  78 8c 43 3f 63 3a bd ab  |.+.\A.s.x.C?c:..|
-00000110  5b 61 bc 18 6c ce e3 f1  5c 55 3a 4b 78 70 91 06  |[a..l...\U:Kxp..|
-00000120  8f 79 19 4b aa 02 1d 86  f9 96 e6 2c a6 01 70 19  |.y.K.......,..p.|
-00000130  3a 84 f2 71 0e 18 6d 9a  d6 33 d6 4d 45 7e 83 c9  |:..q..m..3.ME~..|
-00000140  21 6a dd 3d 82 1d 18 21  d7 fd b3 6f 8b 7e db ef  |!j.=...!...o.~..|
-00000150  5e 7c 99 5a dd d1 03 22  d1 cf 2e 73 d5 09 33 2e  |^|.Z..."...s..3.|
-00000160  8c 51 0b a4 7e e5 da 1b  bc ed 13 ed d7 ba a9 25  |.Q..~..........%|
-00000170  b7 8a 3f 1c 54 bd 1f a8  53 4b 47 37 44 55 a5 4b  |..?.T...SKG7DU.K|
-00000180  75 de 9c 86 d7 80 eb f5  f7 76 ff 5c 4d 70 69 02  |u........v.\Mpi.|
-00000190  a8 4f b4 a0 65 d7 c5 55  34 3f b0 83 5c a8 bc 60  |.O..e..U4?..\..`|
-000001a0  d3 46 c1 33 3c ef f9 53  3e 8d 86 3e c8 22 c4 e5  |.F.3<..S>..>."..|
-000001b0  dd 6c 59 55 6b fe 3e 04  10 eb 7d c7 bd d8 3d 71  |.lYUk.>...}...=q|
-000001c0  c2 2d 0b cd 29 a0 d9 3c  cc c6 21 97 3d 24 36 1c  |.-..)..<..!.=$6.|
-000001d0  f5 6a b5 12 48 98 ec 91  42 85 cb 45 c2 b6 f6 64  |.j..H...B..E...d|
-000001e0  c4 76 53 27 64 d3 89 f2  4e d6 98 23 25 a0 5b 54  |.vS'd...N..#%.[T|
-000001f0  83 ab 53 29 5d 39 59 67  77 d0 4f 82 9e 0c 45 ae  |..S)]9Ygw.O...E.|
-00000200  6d 94 1a 9d 69 45 f0 37  0d 11 ee 46 4f 6a f3 81  |m...iE.7...FOj..|
-00000210  ce 9b 74 02 54 a6 d6 49  98 e7 3f 7b 4c fc 53 91  |..t.T..I..?{L.S.|
-00000220  80 d3 87 dd 55 91 04 ef  33 27 71 98 ef 1f df b8  |....U...3'q.....|
-00000230  d6 5c 31 6f ba 58 f3 89  7b ba b6 ea 9f 75 cd 08  |.\1o.X..{....u..|
-00000240  11 84 c9 e8 9f f8 8e 02  7d b7 4a 3b 6f 4d 25 46  |........}.J;oM%F|
-00000250  46 5d 7c 60 71 b5 02 d1  91 59 a8 10 c2 fa e8 56  |F]|`q....Y.....V|
-00000260  0f 6e 93 d1 dd c6 af e9  e1 c1 bf 64 8f 5b 04 78  |.n.........d.[.x|
-00000270  74 1c f5 af ef 48 b0 9e  29 a9 6c a0 ff e4 69 bb  |t....H..).l...i.|
-00000280  e1 95 12 be 73 b0 35 89  82 93 b4 69 84 79 cc 78  |....s.5....i.y.x|
-00000290  1d 93 05 a4 85 25 c5 a3  da 4b c7 72 66 2f 35 78  |.....%...K.rf/5x|
-000002a0  62 94 d6 f3 1c dd 23 c8  86 11 fe b0 cb 2f 5c 78  |b.....#....../\x|
-000002b0  45 8d 2e 0c 08 c6 7c 5c  92 80 70 25 3b 25 53 a8  |E.....|\..p%;%S.|
-000002c0  86 f4 54 b6 a5 94 38 10  ff f9 3e 78 bb ce 86 fa  |..T...8...>x....|
-000002d0  9d 91 df 9e c1 ef 79 db  1b f8 ed b5 53 6d 24 0f  |......y.....Sm$.|
-000002e0  18 a8 eb cd 25 bb bb 24  64 25 4a 3e 04 00 16 f2  |....%..$d%J>....|
-000002f0  9a 8b 8f 25 16 03 03 00  bc 05 1a 5b 08 49 0c 86  |...%.......[.I..|
-00000300  8b 23 78 13 9e a7 3f ce  73 6b 30 ff 65 e5 a7 ba  |.#x...?.sk0.e...|
-00000310  a4 14 8e e2 4e 14 3a 43  d7 03 50 79 8a fb ea a6  |....N.:C..Py....|
-00000320  03 06 8b d1 0b 2b 19 49  5c 50 34 67 ae 02 e7 f7  |.....+.I\P4g....|
-00000330  c4 91 ff 33 ad 87 62 bd  35 e4 bf bf c8 01 9f f7  |...3..b.5.......|
-00000340  69 74 b0 45 eb 10 f8 82  f6 bc 56 fa 0f 26 b7 cf  |it.E......V..&..|
-00000350  13 ad fa 0a 55 c1 06 b2  e7 4f 9f 75 fc 65 d6 ff  |....U....O.u.e..|
-00000360  e8 2d 21 22 52 bc a1 60  27 f9 7c 18 70 25 f1 76  |.-!"R..`'.|.p%.v|
-00000370  8d 4a f9 83 6e a0 52 d7  37 fe 2b 1c f2 03 8e d7  |.J..n.R.7.+.....|
-00000380  7d 51 a8 07 0b b8 9c e0  5d a3 ac cc bd d0 c9 8f  |}Q......].......|
-00000390  36 62 b7 9e 19 0d 62 82  fb c2 68 e3 0f 4f eb 3f  |6b....b...h..O.?|
-000003a0  33 ec f9 1a 3d c1 3d 68  46 1a 03 e1 fc 65 36 45  |3...=.=hF....e6E|
-000003b0  76 c2 87 6e 21 16 03 03  00 4a 7e 1f 28 4d ae 0e  |v..n!....J~.(M..|
-000003c0  d3 90 13 53 ba 15 7a 68  88 1a ed 5f 50 3c 5d b2  |...S..zh..._P<].|
-000003d0  11 5a 40 3a 11 44 a8 ce  fa 37 b3 0a d0 02 1e cc  |.Z@:.D...7......|
-000003e0  f9 2f 6d 28 a8 f1 26 ea  52 36 52 5a 70 3f de 89  |./m(..&.R6RZp?..|
-000003f0  5c 11 5f e0 ba 5e 18 b6  b8 b4 55 74 44 c5 a0 7c  |\._..^....UtD..||
-00000400  73 7c 51 e5 16 03 03 00  14 2d fe a4 59 be 8a e0  |s|Q......-..Y...|
-00000410  4a 6c e0 1a ae 8b ce 04  a0 f2 2f 1b f8           |Jl......../..|
+00000000  16 03 03 00 81 28 ba 2e  7a 2b 59 83 ae aa ba c7  |.....(..z+Y.....|
+00000010  d7 49 a5 ca c0 fc 8b 49  f5 10 77 ac e7 ae 12 de  |.I.....I..w.....|
+00000020  0d ad 0e 2c d9 ee 99 c4  95 7b 09 b2 91 27 44 6a  |...,.....{...'Dj|
+00000030  7c 08 ce bb 98 4a 1c 8c  47 30 21 c7 5d 1e 86 39  ||....J..G0!.]..9|
+00000040  79 07 48 2a ac 90 7b 26  46 6a a5 b1 7c df fa ae  |y.H*..{&Fj..|...|
+00000050  0f 20 c8 f0 b5 65 57 2b  d5 1f 14 cc bc 7e 94 42  |. ...eW+.....~.B|
+00000060  b6 30 c1 d7 eb 8d 39 0f  65 7a b7 d0 38 21 eb b0  |.0....9.ez..8!..|
+00000070  2d 04 5a 8b 9c 8b 24 91  fe de ac 1f f5 4f aa 74  |-.Z...$......O.t|
+00000080  71 e1 98 8b df 2f 16 03  03 02 69 fb 1f be be 41  |q..../....i....A|
+00000090  51 00 c5 48 bc a3 18 78  2c dc e3 59 d2 0d 23 c7  |Q..H...x,..Y..#.|
+000000a0  2b 03 f3 ce 08 81 62 8a  e9 59 52 06 2a cd 7f fe  |+.....b..YR.*...|
+000000b0  f4 58 5a a4 6c d1 fa f2  1e 31 7e c5 14 39 dc 37  |.XZ.l....1~..9.7|
+000000c0  27 4f 70 ef 79 7e b1 d1  32 1b 3c cf 08 e2 8a 44  |'Op.y~..2.<....D|
+000000d0  56 48 ea 85 8b 86 1d 77  ea 75 f2 c6 8b 14 9d 57  |VH.....w.u.....W|
+000000e0  17 87 29 64 e1 ef 1a 46  25 ed e1 d3 e6 90 63 8d  |..)d...F%.....c.|
+000000f0  30 b6 4d 3c 98 68 45 95  78 11 2c c5 4e 2c 2b 3a  |0.M<.hE.x.,.N,+:|
+00000100  a8 8b 02 1c b9 15 09 ea  59 30 c7 a8 d5 28 f3 45  |........Y0...(.E|
+00000110  77 eb bc bc 4a d9 82 4a  7d 8b 5e e1 36 17 ba 95  |w...J..J}.^.6...|
+00000120  34 ea 7e d7 b8 0d 8c 63  07 30 d9 07 49 df b0 ea  |4.~....c.0..I...|
+00000130  aa 5e 95 7f 90 ab 09 79  31 88 27 00 9e bd 84 5b  |.^.....y1.'....[|
+00000140  ab f6 be 18 10 42 11 49  bd ce 42 dc 2b ae 8f 00  |.....B.I..B.+...|
+00000150  a1 74 5a d1 e3 0b ba 62  57 5f 0e 65 e4 13 ce 78  |.tZ....bW_.e...x|
+00000160  b1 da 89 03 f6 42 cd 1b  fe 03 0c f4 89 77 07 bd  |.....B.......w..|
+00000170  fa 07 5a 4a 86 1f 47 15  2a 18 ec 26 36 e9 c7 04  |..ZJ..G.*..&6...|
+00000180  75 bb 66 e1 32 97 65 e2  e8 2c b1 bc 39 14 3a d6  |u.f.2.e..,..9.:.|
+00000190  77 d0 15 32 e5 58 eb 49  52 15 c6 d6 9c 4e 2d 97  |w..2.X.IR....N-.|
+000001a0  5c 59 5a 51 11 71 1e 3b  1e 25 b8 20 ef 16 d0 27  |\YZQ.q.;.%. ...'|
+000001b0  f9 ad 01 61 96 8c 50 a2  60 86 99 8c b3 cf 04 07  |...a..P.`.......|
+000001c0  de 8a b3 85 53 95 28 e7  6c db 26 42 b2 6c 51 3c  |....S.(.l.&B.lQ<|
+000001d0  b7 54 98 ff 78 48 b2 8e  11 b9 3b 59 b9 38 0b 48  |.T..xH....;Y.8.H|
+000001e0  ac 11 b3 0c b2 f7 98 58  64 ce 16 ae 78 9f 39 ce  |.......Xd...x.9.|
+000001f0  20 2b c3 14 74 54 17 54  8e a1 b7 ed 48 77 37 a0  | +..tT.T....Hw7.|
+00000200  12 18 77 b2 ab 51 d2 e3  fc 6a af b3 a2 4b 60 87  |..w..Q...j...K`.|
+00000210  fb f9 0c e8 33 84 e1 6b  95 f0 af 04 c3 c7 b7 0d  |....3..k........|
+00000220  bd f2 a6 26 f4 b2 15 c0  9e 90 1b cf 66 3f f8 1e  |...&........f?..|
+00000230  64 bf 91 30 b9 2f 31 5b  76 99 67 50 6e b3 fa 00  |d..0./1[v.gPn...|
+00000240  1f 1f 50 1d 52 ea f9 98  7d 59 3a 1d 10 b5 cf 00  |..P.R...}Y:.....|
+00000250  49 a6 72 78 2c e8 2a b2  64 38 34 55 25 b1 4f f7  |I.rx,.*.d84U%.O.|
+00000260  3d 5d 18 d8 63 c4 34 b9  78 15 19 c8 6c d8 03 e9  |=]..c.4.x...l...|
+00000270  0b cb bd 0c b1 32 9c 32  57 ad 7f bd cd db 99 77  |.....2.2W......w|
+00000280  7f 2a 01 60 c6 ce 99 a9  a0 17 ae 02 0c 72 67 b2  |.*.`.........rg.|
+00000290  0e d3 24 c4 88 96 7f ab  c2 46 fb fe 47 b0 72 a0  |..$......F..G.r.|
+000002a0  87 6b 22 00 ee 97 ce 13  eb ab 5b 41 2e 60 79 a1  |.k".......[A.`y.|
+000002b0  4b d1 8f d2 d0 5b 02 77  9c 29 1e ea 3e 30 a9 8f  |K....[.w.)..>0..|
+000002c0  07 b7 22 2a d7 64 50 cf  0a 34 6b db b8 8d e4 f6  |.."*.dP..4k.....|
+000002d0  50 71 65 54 0f e0 87 93  ca 3e 1b 68 29 2f d9 dd  |PqeT.....>.h)/..|
+000002e0  15 76 f0 c3 1c a4 ca e9  5f 17 29 87 bb 0a 5b 74  |.v......_.)...[t|
+000002f0  6c 2d 13 63 16 03 03 00  bc a6 81 fa a1 7b 6e 54  |l-.c.........{nT|
+00000300  0b 47 30 a5 e9 ca e6 86  db f9 af 19 5e fe ae a6  |.G0.........^...|
+00000310  91 c8 e9 c0 c5 17 b4 a6  2b cd 40 ee 9e fc 2d ef  |........+.@...-.|
+00000320  8c 68 6c ce 05 66 b1 80  7d 6f 07 91 6e 9f 23 ab  |.hl..f..}o..n.#.|
+00000330  f2 a7 d1 99 d1 5f ed 58  b1 aa 7f 31 f4 7f 2a ea  |....._.X...1..*.|
+00000340  3e 21 a0 4e 1c 49 d9 ab  1e 43 84 dc 42 cf f5 75  |>!.N.I...C..B..u|
+00000350  ae fc 97 a3 e7 b8 51 1b  68 1b f5 83 2b 2d b0 a5  |......Q.h...+-..|
+00000360  7c f9 f2 21 c1 68 d9 e2  4f bf f5 1e e6 90 7b 54  ||..!.h..O.....{T|
+00000370  2c 45 d2 35 a1 5c da 57  be ce 90 a7 56 90 f2 55  |,E.5.\.W....V..U|
+00000380  08 9e b1 52 09 12 b9 f1  8b fd fb 1a f2 9f 39 bf  |...R..........9.|
+00000390  73 c2 9c dc 6c 0f 19 9b  37 ec 91 86 27 ec 1a e8  |s...l...7...'...|
+000003a0  92 f8 a2 05 71 12 e6 8b  04 0c f3 b4 4d 93 d4 b4  |....q.......M...|
+000003b0  69 7b c3 9c 22 16 03 03  00 4a ba fe c0 02 30 02  |i{.."....J....0.|
+000003c0  33 02 67 87 19 20 13 90  48 80 a1 93 97 cc a6 26  |3.g.. ..H......&|
+000003d0  51 14 4d 2b 60 3d da 72  f0 99 51 2a 8b b4 54 ff  |Q.M+`=.r..Q*..T.|
+000003e0  47 6b 6c b4 6a 92 a9 9c  3c c0 ee ae 79 25 de 17  |Gkl.j...<...y%..|
+000003f0  61 cf 06 37 6f 84 e8 b8  4c 7b 9a c1 a1 ff 6e c5  |a..7o...L{....n.|
+00000400  f3 0b 7d 8d 16 03 03 00  14 a9 38 b9 f0 df 71 c5  |..}.......8...q.|
+00000410  1f fa 77 04 1e b4 4c 2b  64 01 e6 59 cb           |..w...L+d..Y.|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 70 17 aa  0e 85 63 a2 39 31 b1 d9  |....ip....c.91..|
-00000010  b5 a0 4b 6d 29 eb 23 6c  fb 66 11 6f 46 16 65 5e  |..Km).#l.f.oF.e^|
-00000020  79 75 aa 45 1f eb 07 99  0d 34 fa 10 90 32 5a 94  |yu.E.....4...2Z.|
-00000030  2c 85 b2 8f 27 1d ae 15  49 c0 92 49 58 84 54 2a  |,...'...I..IX.T*|
-00000040  35 d2 f5 56 fd ed c7 0f  33 fe b4 b8 9c 5c 7e 1e  |5..V....3....\~.|
-00000050  59 ee 41 3e 0c b1 30 f7  2a f4 ca 2c c3 9a 0a a1  |Y.A>..0.*..,....|
-00000060  96 96 81 61 77 e4 f2 f5  59 9a 57 71 31 89 7e 25  |...aw...Y.Wq1.~%|
-00000070  55 ef 4c 45 8b 54 c8 83  09 41 49 c6 3e cb fe ff  |U.LE.T...AI.>...|
-00000080  15 ee 48 51 b4 06 c0 c0  27 fb df d1 99 c5 f0 bf  |..HQ....'.......|
-00000090  fe 07 0b 49 88 fe 53 cf  d7 58 12 16 77 5a d1 27  |...I..S..X..wZ.'|
-000000a0  29 a2 00 de 48 a6 d3 e6  b2 87 86 55 03 f5 84 3a  |)...H......U...:|
-000000b0  84 bf 58 ab 48 bc d0 1e  f9 89 be 03 d5 af 4b 06  |..X.H.........K.|
-000000c0  f2 b5 42 c7 ef a4 bb 92  d1 23 64 ba 36 16 bc ed  |..B......#d.6...|
-000000d0  ff 3a 43 3a 71 31 66 b5  34 a4 bb 92 3c e2 3e 7c  |.:C:q1f.4...<.>||
-000000e0  b2 bb b4 c5 db 1a d4 a8  9a da 16 44 b3 8f 31 39  |...........D..19|
-000000f0  3e a7 58 2d 58 af d3 bb  ff 70 7e 9d 54 de 90 01  |>.X-X....p~.T...|
-00000100  c8 ef d9 24 50 b5 12 c2  ca 7d f6 bf c6 38 1b ad  |...$P....}...8..|
-00000110  4f 78 70 3d 64 4b 25 4f  bc 84 67 5c e1 c6 a4 b7  |Oxp=dK%O..g\....|
-00000120  7e 05 30 ad 53 42 d7 40  c8 c0 4d 1b 0c fe 10 a9  |~.0.SB.@..M.....|
-00000130  dd 4a 5e 11 3a 79 b7 10  59 a6 5e ef 51 6f cc 4a  |.J^.:y..Y.^.Qo.J|
-00000140  43 fb fd 5a 51 56 7d d7  d6 23 20 13 13 33 91 43  |C..ZQV}..# ..3.C|
-00000150  80 9a 4c e7 f6 78 18 25  02 4a dc 38 19 16 91 ef  |..L..x.%.J.8....|
-00000160  c9 a6 67 c0 66 85 77 13  3a ff 21 01 ba 65 fc d3  |..g.f.w.:.!..e..|
-00000170  23 d8 92 ae 46 a7 a4 7f  5f 57 3d 6d 7c f9 9c d7  |#...F..._W=m|...|
-00000180  3d 56 54 4a 69 1d 62 38  d3 75 5c 9b a8 c9 b5 4e  |=VTJi.b8.u\....N|
-00000190  b7 d6 9e 1a 51 76 57 7b  bd bb bd 4b e8 ed 2f df  |....QvW{...K../.|
-000001a0  34 72 6a 9c 54 3f ff f4  fe 30 3a 4f 2c 74 97 59  |4rj.T?...0:O,t.Y|
-000001b0  03 8c cc 71 f3 63 c8 04  55 37 e7 39 5c 0a 84 c6  |...q.c..U7.9\...|
-000001c0  75 fc b1 7f 24 59 e0 ca  59 50 29 1a 0d d3 27 47  |u...$Y..YP)...'G|
-000001d0  9e ea 6d 66 5a 22 e7 0d  10 56 a2 95 de 84 0e 7e  |..mfZ"...V.....~|
-000001e0  6d 3a 63 d3 b4 c3 8c 61  79 f5 0a 69 51 a6 c9 69  |m:c....ay..iQ..i|
-000001f0  8d 3a f8 e5 7c 04 6b ed  c7 5e 70 61 d4 38 c2 93  |.:..|.k..^pa.8..|
-00000200  84 26 23 c9 84 a5 ee b5  35 a9 18 6d 84 b1 bd de  |.&#.....5..m....|
-00000210  72 14 73 a4 ab db 68 47  b3 13 37 e7 56 a3 35 0d  |r.s...hG..7.V.5.|
-00000220  2c 54 88 21 d4 f1 2f ed  74 85 d6 19 45 9d 62 fa  |,T.!../.t...E.b.|
-00000230  02 45 d3 14 c9 8f df bd  9f fe da ab c7 e7 4c 96  |.E............L.|
-00000240  62 92 ee 4f 41 99 4a 04  18 01 63 cf d1 f6 8a b0  |b..OA.J...c.....|
-00000250  b5 d5 f7 26 c6 4a c7 a2  d0 f1 72 3b bf 20 82 c3  |...&.J....r;. ..|
-00000260  23 c7 be 4c 55 35 c6 53  27 aa 99 38 8c da 16 03  |#..LU5.S'..8....|
-00000270  03 00 35 ba 6e aa 5f 90  48 ee 19 33 dd 0d fc 31  |..5.n._.H..3...1|
-00000280  cb ce 1e f2 7b 6b ff 44  60 90 88 13 c6 50 2b f5  |....{k.D`....P+.|
-00000290  50 ba 48 ce 6e 3c e5 96  a8 30 bf bd de ba ab 21  |P.H.n<...0.....!|
-000002a0  da ff 8b 50 4b 65 5f a3  16 03 03 00 98 87 74 48  |...PKe_.......tH|
-000002b0  d2 88 7a b1 67 57 b0 c2  01 be e0 e9 41 6a 56 8f  |..z.gW......AjV.|
-000002c0  87 6c d2 37 09 45 40 59  9c 50 83 1b 48 6c b4 e4  |.l.7.E@Y.P..Hl..|
-000002d0  d3 9b 6d 46 89 83 2a 88  4c b3 b2 58 29 3e 41 76  |..mF..*.L..X)>Av|
-000002e0  4c 8a a0 cb aa e9 17 7f  48 7b 14 8a f7 ba 31 b4  |L.......H{....1.|
-000002f0  b6 3a e0 12 e6 88 8c 24  5f 97 93 46 bf 27 f3 fd  |.:.....$_..F.'..|
-00000300  e4 d4 54 54 9e 46 b6 1d  8e 8d 20 49 7e bd 6f 09  |..TT.F.... I~.o.|
-00000310  55 af 5d 7f 24 df 69 1b  dc a5 76 0c 34 e7 af 4c  |U.].$.i...v.4..L|
-00000320  2c 1d 2c db 97 37 81 29  41 c1 4e 65 65 33 44 7c  |,.,..7.)A.Nee3D||
-00000330  34 a2 dd fd 38 e4 e3 e1  dc af 2f 3f 64 2c 40 80  |4...8...../?d,@.|
-00000340  cc ff d2 d4 a7 14 03 03  00 11 8a 81 be 84 7b 14  |..............{.|
-00000350  28 fc b3 a5 ad 75 d6 ee  6e 5d 9b 16 03 03 00 20  |(....u..n]..... |
-00000360  87 3c 57 93 46 06 f0 6f  18 ce 33 5d 77 33 6c a6  |.<W.F..o..3]w3l.|
-00000370  7a d8 cb 6f 43 74 0a 56  30 72 bc 25 0e 2b e6 91  |z..oCt.V0r.%.+..|
+00000000  16 03 03 02 69 fb 20 8a  eb 44 f8 0a 95 61 0a 01  |....i. ..D...a..|
+00000010  48 6c ef 59 52 6f 99 7d  6e ce 7e 00 5e 67 f4 cd  |Hl.YRo.}n.~.^g..|
+00000020  19 08 39 12 a0 43 44 59  0f 9c 21 34 06 fe 09 6f  |..9..CDY..!4...o|
+00000030  3d de 99 a3 f8 96 03 12  78 eb 76 a7 ee 09 b4 49  |=.......x.v....I|
+00000040  50 42 48 09 f1 7b 54 aa  e9 45 73 29 e8 41 47 9a  |PBH..{T..Es).AG.|
+00000050  d5 8c fa bc f8 54 96 23  30 cb 36 ac cd 75 a4 16  |.....T.#0.6..u..|
+00000060  ee 88 cc 74 25 5d 2e e2  88 d9 9d dc 87 bd 77 8b  |...t%]........w.|
+00000070  ac 98 20 34 cb c7 1c 71  44 b1 3c a6 42 11 bd 20  |.. 4...qD.<.B.. |
+00000080  65 74 c3 36 c9 e3 6d ae  7e 37 9a b7 33 d8 6c 11  |et.6..m.~7..3.l.|
+00000090  93 49 a4 e8 14 11 27 72  9c c8 44 75 21 5d 82 1e  |.I....'r..Du!]..|
+000000a0  71 ca 7d 46 95 5f 2e c4  80 be 90 2f 5a 13 92 28  |q.}F._...../Z..(|
+000000b0  dc 54 5b e6 a0 9c c7 f8  bd 97 bd e5 6c 05 d2 68  |.T[.........l..h|
+000000c0  c3 f3 54 1c 9e bc a3 20  c1 de f1 e7 3a 7e 5a fd  |..T.... ....:~Z.|
+000000d0  4f 22 f7 d4 e7 19 fb 94  6f fd bd 15 39 bf 9e 4b  |O"......o...9..K|
+000000e0  63 35 19 0b 59 28 47 f3  56 ae 4c 13 50 30 b5 d1  |c5..Y(G.V.L.P0..|
+000000f0  d1 a9 a2 32 dc 23 5e 47  e9 dd 8c d5 32 12 d9 0d  |...2.#^G....2...|
+00000100  78 04 bc ae f9 81 5c e3  05 88 c9 89 72 c6 7d 86  |x.....\.....r.}.|
+00000110  c6 55 aa 39 cd 9e 9e 5e  ce 00 ce 51 fa 54 ee ba  |.U.9...^...Q.T..|
+00000120  64 a6 9c a8 88 00 a8 ed  6a 7a 63 cc d8 60 a4 52  |d.......jzc..`.R|
+00000130  a9 2f 23 c5 ca 96 12 d5  ec 11 46 84 1f d3 43 74  |./#.......F...Ct|
+00000140  db 87 13 42 18 71 b9 ff  18 d4 3b b5 c5 87 c8 c0  |...B.q....;.....|
+00000150  91 fb 8c 7e c8 39 77 0e  e0 52 bb 58 18 fa d8 5a  |...~.9w..R.X...Z|
+00000160  e0 e5 ab 4b 08 36 be 1d  6a ae a3 44 af 54 90 2f  |...K.6..j..D.T./|
+00000170  4f fb bc a5 d4 be c2 74  4e a1 22 61 10 09 5e 35  |O......tN."a..^5|
+00000180  1c ab 1c 73 de 20 37 38  d0 5f 6c 24 f8 8d 79 22  |...s. 78._l$..y"|
+00000190  0a b0 53 86 04 1e 73 36  57 dc c0 fb 98 15 ea 5e  |..S...s6W......^|
+000001a0  85 1d 8f 7f 7a 59 27 8d  ce 5d df 29 c8 4d 10 d2  |....zY'..].).M..|
+000001b0  87 79 9b 60 ff 17 a1 24  41 0d 12 99 dc ad ad 76  |.y.`...$A......v|
+000001c0  00 74 a3 5a 73 9e 0c f4  90 0e bb 5a 11 5a 89 c7  |.t.Zs......Z.Z..|
+000001d0  71 79 1a 72 f9 6f 19 6d  eb 29 32 39 4d da 69 e4  |qy.r.o.m.)29M.i.|
+000001e0  e9 f8 3a b0 b8 10 76 c0  21 3b 95 76 ec 01 7d f2  |..:...v.!;.v..}.|
+000001f0  10 15 5f 1d 94 b1 13 e8  ca c4 07 c4 aa d1 50 65  |.._...........Pe|
+00000200  5b 1f e9 ec 50 52 f6 33  38 e7 16 e4 e5 78 29 a1  |[...PR.38....x).|
+00000210  41 6c 4f dc 07 bb 28 59  7f 1d cb 61 4d 2d 1e 43  |AlO...(Y...aM-.C|
+00000220  b5 d5 8f b8 84 ec 4d 1c  c7 5c 62 b7 21 71 83 74  |......M..\b.!q.t|
+00000230  58 3b 70 92 c8 c8 af 7d  f6 da 75 9d 30 99 cf 33  |X;p....}..u.0..3|
+00000240  4e f0 8f 5e 44 1b 0d 35  83 80 b9 8c 80 23 a6 29  |N..^D..5.....#.)|
+00000250  34 0c 88 8f 55 da 85 f8  92 89 4c 34 6a 73 98 bd  |4...U.....L4js..|
+00000260  86 70 11 7e a3 b7 04 0a  24 07 34 6c 06 64 16 03  |.p.~....$.4l.d..|
+00000270  03 00 35 08 d2 96 51 e2  6f 68 ae 19 04 9c 59 e4  |..5...Q.oh....Y.|
+00000280  09 72 da 6a 8e ee 4f 87  b3 b3 1e 89 0b a5 45 32  |.r.j..O.......E2|
+00000290  98 a4 f3 af 64 d7 71 37  2a a5 d4 53 5a 0a 03 05  |....d.q7*..SZ...|
+000002a0  d6 33 c2 ff 5f 2d 6d 94  16 03 03 00 98 49 3c 15  |.3.._-m......I<.|
+000002b0  0a e5 ac 39 54 97 f5 2a  dd 05 02 87 16 1c 6c ae  |...9T..*......l.|
+000002c0  4e 62 1e 27 81 54 66 13  9a d1 1d d2 2c 5b 17 20  |Nb.'.Tf.....,[. |
+000002d0  a4 69 b5 69 ec 3a 59 bd  8b d2 5d f3 84 c7 65 a2  |.i.i.:Y...]...e.|
+000002e0  ad 02 57 bf 3f 72 c5 ce  61 24 09 7e e4 f4 2a a6  |..W.?r..a$.~..*.|
+000002f0  81 29 d0 9c 0f c5 d5 67  7a b0 e4 42 2f a5 5f 00  |.).....gz..B/._.|
+00000300  42 ea ef 8b c8 55 c6 c4  27 26 e5 f7 57 2e 35 f8  |B....U..'&..W.5.|
+00000310  e2 cc 41 6a 29 e2 66 b3  44 fe 2b f9 de 7d 32 96  |..Aj).f.D.+..}2.|
+00000320  96 e6 cf 57 2c b8 73 bc  e2 c2 89 20 8a 71 d3 03  |...W,.s.... .q..|
+00000330  02 7e 95 ef 94 f6 68 b5  94 4b b4 ec a4 e0 10 42  |.~....h..K.....B|
+00000340  c4 9e f2 28 dd 14 03 03  00 11 96 52 4d c7 17 35  |...(.......RM..5|
+00000350  cf 9a 66 5f 73 c3 f5 40  60 12 11 16 03 03 00 20  |..f_s..@`...... |
+00000360  67 eb 03 bf 5c 0f b8 d5  7d e4 14 0a 81 32 50 2a  |g...\...}....2P*|
+00000370  6b 02 53 f6 37 00 ef ef  8a 5f ee 3a bf 5b 84 b9  |k.S.7...._.:.[..|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 79 d6 72  03 0f 48 d1 78 b5 5e 31  |.....y.r..H.x.^1|
-00000010  d6 e0 42 bc 6e 60 16 03  03 00 20 3b f1 7f a5 ab  |..B.n`.... ;....|
-00000020  b7 b7 10 db 3d d6 7a 8a  5a bc c5 af 58 ca 5a 0b  |....=.z.Z...X.Z.|
-00000030  07 27 2d df e9 aa 44 47  73 ab c5 17 03 03 00 19  |.'-...DGs.......|
-00000040  0c d2 a9 df 85 db f3 99  1d 4a ce 4e 40 69 2f d7  |.........J.N@i/.|
-00000050  d7 0b e3 dc b8 af 56 99  89 16 03 03 00 14 01 f2  |......V.........|
-00000060  5b 6b c9 00 1c 12 e6 14  8d b6 ea 0d 18 19 a9 bd  |[k..............|
-00000070  07 e3                                             |..|
+00000000  14 03 03 00 11 ab e7 45  c8 02 30 54 0f 5a ea 63  |.......E..0T.Z.c|
+00000010  42 ea 39 9b 46 ba 16 03  03 00 20 60 56 50 ad d0  |B.9.F..... `VP..|
+00000020  fe 7d 56 a2 e1 d9 87 76  96 3b b3 27 3b 7f be e4  |.}V....v.;.';...|
+00000030  98 d0 7a 6a a2 e3 37 1c  f5 a9 a1 17 03 03 00 19  |..zj..7.........|
+00000040  67 ee fd 6d 58 de bd b8  df aa 4d 36 e4 93 83 7b  |g..mX.....M6...{|
+00000050  e5 bd d1 ba 5c f3 2f aa  a8 16 03 03 00 14 73 29  |....\./.......s)|
+00000060  15 c9 16 62 a2 97 81 f8  44 94 86 c1 94 37 9f 19  |...b....D....7..|
+00000070  1d c2                                             |..|
 >>> Flow 11 (client to server)
-00000000  16 03 03 01 14 5d 6b cf  2d 1d 78 18 d3 88 51 6c  |.....]k.-.x...Ql|
-00000010  34 c2 bb f0 e6 a9 8c d9  19 7f f8 3e c1 13 19 2b  |4..........>...+|
-00000020  61 65 46 cd 4b 3d 2e 91  a4 32 5e 49 ac 4c 67 8c  |aeF.K=...2^I.Lg.|
-00000030  4a 82 70 18 ac c5 70 b5  c8 9b 6b be 01 0d 91 ca  |J.p...p...k.....|
-00000040  ea 4d 78 e3 e5 e7 0c db  6b f4 03 31 11 e8 32 ea  |.Mx.....k..1..2.|
-00000050  bf 6b c2 0d f8 5f 5b 56  20 e9 81 41 53 59 e9 0e  |.k..._[V ..ASY..|
-00000060  a6 53 59 2e d3 cd 36 02  54 b3 c3 d5 70 64 41 b7  |.SY...6.T...pdA.|
-00000070  82 55 10 89 7e 3e 4d 5b  c3 32 57 ee 6c 80 6c b7  |.U..~>M[.2W.l.l.|
-00000080  4e 20 ac 13 cb 9c 78 b3  eb fb 8d 0c 8a e4 4a 58  |N ....x.......JX|
-00000090  de 71 71 6a 54 74 5f 12  3a 52 0f 14 93 1b f7 8f  |.qqjTt_.:R......|
-000000a0  14 fa 76 76 19 5b eb 8d  61 d7 ed c7 68 ed 1b 9d  |..vv.[..a...h...|
-000000b0  1b 91 e4 92 df 88 4f af  3c 43 38 fa 0d 19 51 3a  |......O.<C8...Q:|
-000000c0  2b 05 7d e4 28 56 0f 01  bf 2f 38 0c ea 7c f8 83  |+.}.(V.../8..|..|
-000000d0  c1 a2 2a 2b b7 7f ad 40  de 85 8e 07 22 cb 0f 3e  |..*+...@...."..>|
-000000e0  90 6e 9c 03 ff 9e 44 34  43 38 b6 0f 1f 57 11 cf  |.n....D4C8...W..|
-000000f0  c3 ad 0d 70 98 6e e5 70  7b 76 c7 f1 6b 69 2f 40  |...p.n.p{v..ki/@|
-00000100  df fe 47 c4 32 35 1d 03  42 a0 cc ee dd 5f 34 da  |..G.25..B...._4.|
-00000110  74 85 4d 56 de e4 bd 0d  b5                       |t.MV.....|
+00000000  16 03 03 01 16 bb 29 a6  76 e4 5a ec 09 4e a7 6a  |......).v.Z..N.j|
+00000010  66 d7 6e 39 fc 5a dd be  9f 34 1e cb 3a b3 3f 1e  |f.n9.Z...4..:.?.|
+00000020  48 ad 0b e0 0e 43 b1 3e  57 f3 4a d1 c7 c6 1a f0  |H....C.>W.J.....|
+00000030  a8 3e d1 37 de 95 ad 0f  92 85 ee b2 2b 1c 30 2f  |.>.7........+.0/|
+00000040  f5 70 ca 42 28 0c c2 e4  06 73 d5 eb 31 d2 86 f7  |.p.B(....s..1...|
+00000050  d6 42 5d e0 b0 a6 c0 94  2c 52 0b 18 2c 95 9c 2a  |.B].....,R..,..*|
+00000060  56 4d a4 17 fb 51 49 be  3a 37 27 87 c7 d5 94 56  |VM...QI.:7'....V|
+00000070  88 c5 94 a6 ff a1 dd cf  2b 70 e1 6c a9 39 1b e7  |........+p.l.9..|
+00000080  69 c3 0e ef 08 d2 fb 6d  54 8a 80 64 99 6a b3 e4  |i......mT..d.j..|
+00000090  2e 44 62 ce 1c 4d 7a 0a  45 cd ba 52 23 47 6d 05  |.Db..Mz.E..R#Gm.|
+000000a0  97 03 c6 c4 c7 5a ca bf  38 73 b4 8c e5 a5 14 1b  |.....Z..8s......|
+000000b0  10 ea 29 17 af f6 37 bd  7f 56 88 b2 63 92 9f b9  |..)...7..V..c...|
+000000c0  6c 18 9b 1b ad ce ac f0  97 45 3e 72 e0 10 8e 64  |l........E>r...d|
+000000d0  80 dc cd a1 f9 10 d1 cd  46 2a 98 cd 40 94 5b dc  |........F*..@.[.|
+000000e0  f5 07 05 96 f3 74 db 91  3c 45 f1 6e b7 f9 52 e8  |.....t..<E.n..R.|
+000000f0  95 05 c3 fc 95 f7 3d 91  45 cd fe b1 13 01 78 e0  |......=.E.....x.|
+00000100  31 fc e2 0d 5b 97 5b 92  43 0a 83 21 c4 f2 3f d3  |1...[.[.C..!..?.|
+00000110  3f 1a a0 52 e0 d0 fe a7  03 6c 1a                 |?..R.....l.|
 >>> Flow 12 (server to client)
-00000000  16 03 03 00 81 06 1c 3a  f7 71 f8 76 6c b0 7b fc  |.......:.q.vl.{.|
-00000010  04 d3 69 d9 6d 26 1c 0b  fb 7e 16 41 78 bc ba b8  |..i.m&...~.Ax...|
-00000020  ee 1f f5 00 e7 1d 32 84  7f 87 66 cb f9 5e e5 6c  |......2...f..^.l|
-00000030  26 f9 64 83 13 49 a6 ab  98 a2 74 25 61 e1 3a ec  |&.d..I....t%a.:.|
-00000040  f8 8f 0b e4 ca c3 0d 52  76 38 e2 d1 86 ac ee 7b  |.......Rv8.....{|
-00000050  5c 69 96 e3 ec 3b f0 5a  4c 5e 8b 73 8f 24 75 bc  |\i...;.ZL^.s.$u.|
-00000060  7a 48 b3 b2 cc 55 7d 20  4a e1 9b 90 5e 47 b5 71  |zH...U} J...^G.q|
-00000070  88 e6 8a a1 a4 f6 45 8e  8b 5b ed 45 96 95 96 7d  |......E..[.E...}|
-00000080  8b 7c 4d 03 64 34 16 03  03 02 69 d5 41 cd af 43  |.|M.d4....i.A..C|
-00000090  42 5f f3 98 87 0a 55 7f  c3 02 9c dd b5 8c 22 2e  |B_....U.......".|
-000000a0  8f 52 71 29 8a 33 dc 22  45 fc 61 bf b4 db fe 4c  |.Rq).3."E.a....L|
-000000b0  de 69 10 69 df a2 45 e5  fa 78 e8 1c 0a d0 c6 7d  |.i.i..E..x.....}|
-000000c0  7e 26 3b 12 e0 56 a2 c7  b8 cd 2a 15 8d 20 2a 86  |~&;..V....*.. *.|
-000000d0  67 f6 e8 36 3d c6 3e 75  09 15 ba 36 37 46 f0 45  |g..6=.>u...67F.E|
-000000e0  de 7a 49 fd 32 3c fc 2f  ab de 9c 28 f7 20 ad aa  |.zI.2<./...(. ..|
-000000f0  e7 10 60 24 71 35 bf 1c  ba 4e 98 92 e0 44 0a 39  |..`$q5...N...D.9|
-00000100  3c f6 7d 0f 4f aa b4 db  22 7b b5 cc f6 0a 59 46  |<.}.O..."{....YF|
-00000110  ba 8d ef dc 13 b5 bd 55  cd 73 50 e7 cb b3 08 3e  |.......U.sP....>|
-00000120  0c a2 d7 5a 12 bf ce 99  8d 05 ee 4a 03 e9 b7 65  |...Z.......J...e|
-00000130  0c 1e 41 46 08 bb 2c 9e  7e e2 c1 6f 3d 9f f4 e2  |..AF..,.~..o=...|
-00000140  cc c5 7c b6 87 aa 49 8e  a6 67 46 88 d0 ae 17 c9  |..|...I..gF.....|
-00000150  14 ae 63 67 bc 57 02 8f  84 90 17 e0 1d 48 80 c2  |..cg.W.......H..|
-00000160  7a f2 be c1 5a 44 b3 f3  3a 9a ac b0 41 87 a7 07  |z...ZD..:...A...|
-00000170  bb b2 7d 7c 0d 42 a3 c6  d8 d9 ef 0c c6 5b 14 f6  |..}|.B.......[..|
-00000180  82 cd 12 01 39 78 dc b2  46 59 22 22 1f d9 39 cf  |....9x..FY""..9.|
-00000190  b6 ac 13 be 22 50 37 10  33 01 0e 13 ee bc f3 bf  |...."P7.3.......|
-000001a0  55 c6 61 2a e0 ee 25 f3  01 35 69 7a 74 70 bd 6c  |U.a*..%..5iztp.l|
-000001b0  d5 08 c5 a3 09 71 8d ea  39 ec 0e c0 f0 16 2f 71  |.....q..9...../q|
-000001c0  86 af 28 d9 3e d4 45 b2  ce e7 f8 2b bd 54 9c 98  |..(.>.E....+.T..|
-000001d0  85 7d 2a f8 fe a5 95 0b  da 08 2a 32 f7 c3 ad 09  |.}*.......*2....|
-000001e0  2a aa ee ee 54 fa d5 2d  84 45 cf a0 2c 9c 9b 4a  |*...T..-.E..,..J|
-000001f0  3c 86 4f 20 12 a7 8a b5  91 36 a9 d2 1a 76 2d 1f  |<.O .....6...v-.|
-00000200  61 8d 5c 69 15 a1 36 ce  6b 99 48 c9 73 b0 58 69  |a.\i..6.k.H.s.Xi|
-00000210  38 c2 48 5d 74 69 7b fb  e8 b1 0f a1 03 d6 bd 5f  |8.H]ti{........_|
-00000220  5c 44 fa 0f 33 33 ce f0  ab 02 f3 26 9f bc 5b 3d  |\D..33.....&..[=|
-00000230  3f 08 00 a9 1b a5 ee 92  8c 62 a5 32 22 10 05 0e  |?........b.2"...|
-00000240  bb 59 03 03 6f 5f d1 39  3e 14 66 2f 92 e6 5a 21  |.Y..o_.9>.f/..Z!|
-00000250  3a ae b0 12 2c 74 f1 b1  d7 55 9b e9 0c 2a c5 db  |:...,t...U...*..|
-00000260  ac ae a3 69 49 de 4b 10  68 d4 05 f2 ff 4b c6 21  |...iI.K.h....K.!|
-00000270  f8 a7 8f dc 5f 82 f9 4f  cf 2e 68 1a 7b 6f 3a eb  |...._..O..h.{o:.|
-00000280  13 a8 c3 9f 86 aa 80 d3  5c f0 b0 f5 7b 8b 91 2c  |........\...{..,|
-00000290  e3 d2 bd 9c ad 66 dc 7c  77 0d 73 4e 0b 51 91 23  |.....f.|w.sN.Q.#|
-000002a0  f3 38 bb 2b 5a ee 1a 1e  39 40 b1 a3 b9 14 0f 16  |.8.+Z...9@......|
-000002b0  78 c9 4a 6e df c4 a4 ce  53 e9 a1 f9 17 14 0a e6  |x.Jn....S.......|
-000002c0  b6 3e 4a 25 6f 6e 00 8c  a5 67 98 ec e3 22 fe 30  |.>J%on...g...".0|
-000002d0  1d 43 c7 62 c8 2a a5 6f  88 99 f6 d1 ba 8a 73 16  |.C.b.*.o......s.|
-000002e0  2f 11 b6 a3 46 25 59 67  6e 8b 38 ec ad a4 06 19  |/...F%Ygn.8.....|
-000002f0  6e 2e 6c 39 16 03 03 00  bc b5 1d 9a f1 bd 76 6b  |n.l9..........vk|
-00000300  01 48 91 51 c4 d1 9a a6  35 f5 a8 b3 51 f3 98 cb  |.H.Q....5...Q...|
-00000310  6d 0e 6d 4f 6f 8b 2b dd  2c 3b b5 0e f0 c5 6a e6  |m.mOo.+.,;....j.|
-00000320  ed 04 60 94 3f d2 6a af  cf 9b 25 7f d9 56 4e 48  |..`.?.j...%..VNH|
-00000330  2c 6b 9c 2c 68 da ed 83  87 13 90 0a 77 39 7e 69  |,k.,h.......w9~i|
-00000340  ec 2c 4b bb 51 82 55 9d  8e 59 69 6e 72 dd 4d fb  |.,K.Q.U..Yinr.M.|
-00000350  2a 5c cf ef 47 13 8d 94  48 5e e8 8f 2c d4 47 14  |*\..G...H^..,.G.|
-00000360  82 aa e4 24 04 3f 8c ef  c8 3b 15 c0 53 63 b5 6b  |...$.?...;..Sc.k|
-00000370  ee f7 16 45 17 e4 6b 41  99 4b 18 34 c8 7c 09 f5  |...E..kA.K.4.|..|
-00000380  3a f3 79 06 ea 5d f8 96  48 9d 6f c7 ac 55 b0 9e  |:.y..]..H.o..U..|
-00000390  f9 95 6d e2 31 ce ac 6a  b6 4e 8d 66 16 1f dd d9  |..m.1..j.N.f....|
-000003a0  e2 2a c6 7d fa ef 37 e6  7b 01 a1 f7 71 76 14 9a  |.*.}..7.{...qv..|
-000003b0  08 ed a9 f7 8d 16 03 03  00 14 aa 66 05 9c d7 08  |...........f....|
-000003c0  9e d8 82 f7 91 18 57 23  4d 9f e9 17 ee f3        |......W#M.....|
+00000000  16 03 03 00 81 47 d2 a4  b9 04 d0 39 aa 1f d3 7a  |.....G.....9...z|
+00000010  f2 c3 a5 03 8a 35 6c 6b  bf 18 02 62 d3 ab 8a 0f  |.....5lk...b....|
+00000020  99 69 f3 84 45 7a 09 28  09 68 3a 67 8a ee 94 b1  |.i..Ez.(.h:g....|
+00000030  d3 2a e6 37 b7 f1 88 df  c0 18 42 96 78 4e cf 3b  |.*.7......B.xN.;|
+00000040  e9 35 50 af ee 96 52 e9  1c 58 47 79 87 97 ce d9  |.5P...R..XGy....|
+00000050  71 9b 4a 47 bc 60 8f 95  ea 75 4e c8 3e ca 79 0f  |q.JG.`...uN.>.y.|
+00000060  22 b2 37 19 12 d6 08 4d  01 93 d9 86 ed 4c 9e 42  |".7....M.....L.B|
+00000070  fb 9b 37 26 98 33 74 cf  84 f4 e1 23 81 6f b6 b2  |..7&.3t....#.o..|
+00000080  a9 27 e7 88 50 77 16 03  03 02 69 6b 78 db e3 0e  |.'..Pw....ikx...|
+00000090  cc 07 a4 96 1f 75 13 6d  fe cd 3d 36 8c b0 44 e9  |.....u.m..=6..D.|
+000000a0  4a 3a 41 26 c9 8c 2f 25  28 9d a8 7b dd df 28 6a  |J:A&../%(..{..(j|
+000000b0  fc ef 87 d4 06 dd 4e 05  ff 40 e3 6c 49 94 ad 1c  |......N..@.lI...|
+000000c0  c2 30 cc 41 35 39 a2 70  95 db de a7 c0 aa 05 c0  |.0.A59.p........|
+000000d0  a2 a7 18 8e ba 70 ee 4b  0d 8d de 98 c7 8a 58 9c  |.....p.K......X.|
+000000e0  8b 51 f7 8f bb 7c 8f f7  60 53 9e 11 7e 5c e6 25  |.Q...|..`S..~\.%|
+000000f0  be 22 aa 0a 3d 35 1c ac  2b 7d 98 fc 01 3a a9 9d  |."..=5..+}...:..|
+00000100  bf b5 d1 ae 10 52 ae 17  f6 df fc 24 38 0b f2 64  |.....R.....$8..d|
+00000110  a8 9a 5c ff cb 42 bd 9d  af 41 4d 6b 22 67 94 ac  |..\..B...AMk"g..|
+00000120  6b 95 2e 43 41 5d 5e c9  67 29 5f f8 8e 13 9d 18  |k..CA]^.g)_.....|
+00000130  3c d4 ff 20 66 ff a6 d1  84 1a 33 31 27 5d 28 b5  |<.. f.....31'](.|
+00000140  24 57 43 c1 83 6a e7 8c  35 0c a7 6f 5e 78 e8 84  |$WC..j..5..o^x..|
+00000150  7c ee 9a 94 dc fd f7 a4  10 3d bb 66 0a 17 14 e7  ||........=.f....|
+00000160  d7 29 47 f7 70 76 d6 ec  b2 3c e2 a0 22 e6 c5 c3  |.)G.pv...<.."...|
+00000170  bf a6 94 72 8b 70 eb 2b  b8 4f c9 7d 72 22 75 ce  |...r.p.+.O.}r"u.|
+00000180  b9 c2 34 08 ac 87 d3 a8  35 81 f7 5e 20 02 0c e8  |..4.....5..^ ...|
+00000190  0a 47 4e 37 4a 03 6d b1  c5 8f 29 77 80 c7 6c 5c  |.GN7J.m...)w..l\|
+000001a0  c3 3e 6f 3d 02 ee 5e f2  fb 20 a2 ad c1 5b 2c 02  |.>o=..^.. ...[,.|
+000001b0  ef dd 81 e7 ea af f0 01  4f 0b eb f8 a1 82 3d ee  |........O.....=.|
+000001c0  be b5 09 df f2 34 49 f0  e8 f3 bc 7e e7 6a 14 0d  |.....4I....~.j..|
+000001d0  e4 aa e5 38 8a 2c 15 01  52 48 83 46 50 13 2b 71  |...8.,..RH.FP.+q|
+000001e0  f4 48 1a 3d 3f 14 dc 3c  ba fc a8 68 57 44 5d f1  |.H.=?..<...hWD].|
+000001f0  f4 7f 23 8d ca f1 75 99  8c 36 99 38 b9 06 85 d0  |..#...u..6.8....|
+00000200  a6 76 8b ae 7e 2a 26 cb  cc 9e 8c 7c 98 e6 00 86  |.v..~*&....|....|
+00000210  a9 d4 cb 42 8c 04 dc 6b  37 1e 8b e2 98 90 0f b3  |...B...k7.......|
+00000220  c0 ea 07 1c 92 45 39 65  12 90 41 23 93 55 59 13  |.....E9e..A#.UY.|
+00000230  22 e1 68 05 cc 5d ef a2  40 85 fb 61 d5 53 cb 77  |".h..]..@..a.S.w|
+00000240  63 7b 16 bf c6 17 57 fb  58 1e d2 86 1a 4a 79 a2  |c{....W.X....Jy.|
+00000250  1f da 2c 64 65 1c 7c 13  21 1b 33 22 36 0e 03 41  |..,de.|.!.3"6..A|
+00000260  8e 6a 78 98 ae 29 71 3e  5c be 5f 83 55 f4 80 2d  |.jx..)q>\._.U..-|
+00000270  b8 2a b8 84 bd 97 7c 60  03 ae 67 77 44 47 70 c2  |.*....|`..gwDGp.|
+00000280  09 0d 1b ed a8 17 8e 84  97 1a b4 75 c2 48 86 bd  |...........u.H..|
+00000290  b1 3c 1f 7c 1a 5b 60 10  a0 66 aa 8e f7 ba 9b e8  |.<.|.[`..f......|
+000002a0  35 6c 46 f0 67 3f f1 8b  5f a0 be 31 2e 45 22 80  |5lF.g?.._..1.E".|
+000002b0  ba d1 ff 88 f0 c8 bd 31  84 64 6a 07 02 75 bd 99  |.......1.dj..u..|
+000002c0  f1 aa 3c 9d 0e b8 f4 76  b3 24 4f 68 f0 83 b1 da  |..<....v.$Oh....|
+000002d0  eb 70 1e 27 f4 17 90 a4  bc e5 1f d8 8b ee a1 e4  |.p.'............|
+000002e0  1e c5 f4 a2 5b c3 0c 6d  2e c8 0e 67 89 4b d9 fe  |....[..m...g.K..|
+000002f0  9b a0 15 97 16 03 03 00  bc 2c e6 a2 fe 1b d7 1e  |.........,......|
+00000300  38 85 ef 39 d1 d6 df ae  c4 7f af b2 ff c2 92 0b  |8..9............|
+00000310  37 e3 5c a9 6c 2c 9e f7  0e a3 88 ee 09 14 6b eb  |7.\.l,........k.|
+00000320  46 81 74 4a a7 f8 39 82  7d a0 16 69 e4 17 52 f0  |F.tJ..9.}..i..R.|
+00000330  16 5f f7 2a a1 a0 a2 bb  41 4c 0c f9 9c e3 af 5e  |._.*....AL.....^|
+00000340  bd 43 47 2d 6d 4a 88 60  95 52 29 94 3d ec 75 d4  |.CG-mJ.`.R).=.u.|
+00000350  dc f5 01 4a 57 fd 7b 96  13 75 5b ed a8 9d 29 5f  |...JW.{..u[...)_|
+00000360  5f 28 dc 04 3a 91 0f 6b  d6 7d 32 fe 75 cd 61 49  |_(..:..k.}2.u.aI|
+00000370  1b 6d b3 c6 41 87 6b 2d  09 e1 3d 8e f5 fb 9b b7  |.m..A.k-..=.....|
+00000380  04 9a 01 ab 82 e5 2b 17  4f 93 d7 ef 31 79 10 b0  |......+.O...1y..|
+00000390  1c cb 17 5b 8a 7a e9 22  ea 83 68 93 68 f6 85 34  |...[.z."..h.h..4|
+000003a0  d1 4d 75 5a b3 69 46 42  92 04 09 47 b1 8e 67 ad  |.MuZ.iFB...G..g.|
+000003b0  47 4e 2c 02 48 16 03 03  00 14 b0 40 bb eb e1 a6  |GN,.H......@....|
+000003c0  94 fd d0 8a e1 91 a7 c9  d2 4b f8 95 95 c7        |.........K....|
 >>> Flow 13 (client to server)
-00000000  16 03 03 00 35 9c d8 7f  73 12 30 50 85 5c 45 76  |....5...s.0P.\Ev|
-00000010  ea c9 c6 4d af 5a 6a 4d  a1 89 1e cd 6d 6a b7 49  |...M.ZjM....mj.I|
-00000020  cc 3f d5 19 6e 20 d7 f0  8f 1f 62 a1 17 a5 b8 68  |.?..n ....b....h|
-00000030  c0 67 f4 5d 97 76 42 00  4f 51 14 03 03 00 11 bb  |.g.].vB.OQ......|
-00000040  bc 4b 90 9d cd a7 c1 2a  c2 e0 26 0e 56 ff 13 53  |.K.....*..&.V..S|
-00000050  16 03 03 00 20 79 6d 6d  5a c5 0c 6e be bb 5b f7  |.... ymmZ..n..[.|
-00000060  66 02 50 f4 47 bf b3 bf  7c 76 e2 e1 ae dc 99 57  |f.P.G...|v.....W|
-00000070  2c 31 bb 7f c9                                    |,1...|
+00000000  16 03 03 00 35 25 1e 49  ad bf 9c 37 e2 d0 2b aa  |....5%.I...7..+.|
+00000010  44 91 d5 61 e7 a5 16 b2  cb 93 43 d7 a0 2b b7 19  |D..a......C..+..|
+00000020  f2 41 d8 36 65 95 4a bb  68 1b 65 7b de 89 a5 af  |.A.6e.J.h.e{....|
+00000030  1a aa ec bf b4 66 97 fc  76 d0 14 03 03 00 11 94  |.....f..v.......|
+00000040  b0 9b 4d 47 6e 63 e3 3d  c4 a7 36 94 3f d2 04 a3  |..MGnc.=..6.?...|
+00000050  16 03 03 00 20 34 f5 58  f2 80 c9 19 41 07 d8 6c  |.... 4.X....A..l|
+00000060  6f 64 e7 e9 76 65 cf a8  61 97 27 29 28 f8 0c 7a  |od..ve..a.')(..z|
+00000070  2c 5e 05 c6 53                                    |,^..S|
 >>> Flow 14 (server to client)
-00000000  14 03 03 00 11 1b d5 02  f0 2f 26 af 60 d4 c5 18  |........./&.`...|
-00000010  86 d6 d3 7a 70 7e 16 03  03 00 20 03 bd c7 ba 11  |...zp~.... .....|
-00000020  ab 10 4e 29 23 6c c9 7e  04 b2 da f4 87 3b d7 f1  |..N)#l.~.....;..|
-00000030  55 e7 09 29 99 f0 8f cc  3c 98 25 17 03 03 00 19  |U..)....<.%.....|
-00000040  6b 68 7e 24 a0 ce 39 e6  1e ca 06 59 71 a1 b1 8a  |kh~$..9....Yq...|
-00000050  f0 eb 5d 30 84 04 46 64  5f                       |..]0..Fd_|
+00000000  14 03 03 00 11 c3 73 b6  63 12 88 86 2b cb a8 94  |......s.c...+...|
+00000010  9b c4 10 9f 98 cb 16 03  03 00 20 1e 06 97 84 3f  |.......... ....?|
+00000020  7f 2e 8d 1a 81 1d da d1  f5 53 5d a4 89 9e 90 22  |.........S]...."|
+00000030  fd 14 58 d1 f7 b2 cd eb  42 2f e8 17 03 03 00 19  |..X.....B/......|
+00000040  1f e3 dc 74 9d 6b 81 43  cb 31 6b 48 31 50 15 e8  |...t.k.C.1kH1P..|
+00000050  80 f0 60 c4 43 f6 50 9a  3c                       |..`.C.P.<|
 >>> Flow 15 (client to server)
-00000000  15 03 03 00 12 91 57 e3  8e 3b e2 17 df 7d 1a d1  |......W..;...}..|
-00000010  cc 0d 9b bf fc f6 42                              |......B|
+00000000  15 03 03 00 12 33 e5 90  b6 f4 60 f4 da 3f f5 c4  |.....3....`..?..|
+00000010  5c a1 a1 75 01 04 8a                              |\..u...|
index 45c7804aaaf37005d658d989774c757cbe17030a..f9a7a113744e315aced3215e645fc6d53700e035 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 e7 f0 26 e8 9f  |....Y...U....&..|
-00000010  05 30 9e e5 7c 31 a5 b8  a9 38 35 c3 9c c1 d2 d3  |.0..|1...85.....|
-00000020  65 ab 3b 55 62 f9 c8 1f  6e 2e 57 20 0e 70 71 1a  |e.;Ub...n.W .pq.|
-00000030  59 05 45 40 2d 93 c4 0a  15 0b 16 0f 23 bb 28 33  |Y.E@-.......#.(3|
-00000040  03 db 44 75 0a 0f 5e 0a  7b 9e 47 63 cc a8 00 00  |..Du..^.{.Gc....|
+00000000  16 03 03 00 59 02 00 00  55 03 03 52 6a c1 e9 3d  |....Y...U..Rj..=|
+00000010  5e 12 f4 95 42 33 5e 56  98 6b e5 b9 c0 e2 b4 02  |^...B3^V.k......|
+00000020  3e 99 0c 26 52 66 69 35  ef 4a 66 20 bb ee b5 86  |>..&Rfi5.Jf ....|
+00000030  ec 40 54 e7 ef 93 8e cd  e4 bd c2 57 e7 2b d3 86  |.@T........W.+..|
+00000040  44 93 8f 4f 3a e3 4d eb  53 88 b0 43 cc a8 00 00  |D..O:.M.S..C....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 04 06 15 25 55 6d c0  |........ ...%Um.|
-000002d0  d0 71 c9 f8 4e d2 48 f3  7d 0b dc 99 a0 67 2a 5d  |.q..N.H.}....g*]|
-000002e0  eb ce a1 00 b3 d3 8d cd  4c 08 04 00 80 d3 0d 6d  |........L......m|
-000002f0  a1 41 2e b5 06 c0 e0 9b  70 c0 1a c3 45 61 3e 86  |.A......p...Ea>.|
-00000300  02 a8 04 76 f2 87 1d 58  98 82 38 dc 01 9d 5a 53  |...v...X..8...ZS|
-00000310  07 3c 65 66 68 bc e4 8f  e9 d4 65 b1 0d 90 0f 7f  |.<efh.....e.....|
-00000320  c3 1e 49 51 47 c5 45 f2  de 52 a6 e3 f5 7a 2d cb  |..IQG.E..R...z-.|
-00000330  bd 0d a7 1d 5b f0 f5 c9  f8 18 17 91 b0 1a 44 a8  |....[.........D.|
-00000340  72 19 b5 d9 f4 47 52 40  68 1c f3 15 3f b2 d1 df  |r....GR@h...?...|
-00000350  9f 5d 27 73 43 78 ba 6d  24 43 16 05 6b e2 a9 e5  |.]'sCx.m$C..k...|
-00000360  cc e2 cd 5c d0 15 b3 a5  30 3d 98 be 3d 16 03 03  |...\....0=..=...|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 dc 94 bc ee 1b 36 ac  |........ .....6.|
+000002d0  13 5f 6a b8 12 89 3b 05  8f 76 cf 1e 9c 20 2e 75  |._j...;..v... .u|
+000002e0  7c a4 f4 23 7f 74 72 97  74 08 04 00 80 b9 22 bb  ||..#.tr.t.....".|
+000002f0  8e 21 42 cd 1e 68 2c 47  f0 b1 7f 2d 26 ac 7b a6  |.!B..h,G...-&.{.|
+00000300  10 b0 a7 72 31 99 ce be  5e e3 a5 c0 18 a6 18 50  |...r1...^......P|
+00000310  d8 98 9c 0a f5 15 0f db  be 76 50 4b 09 8d f0 94  |.........vPK....|
+00000320  a3 48 23 7b d0 13 5e 2c  71 c1 8b e4 56 2b 69 88  |.H#{..^,q...V+i.|
+00000330  88 78 b4 b7 7c 0f 29 6c  73 21 b3 e5 26 a5 10 04  |.x..|.)ls!..&...|
+00000340  23 93 77 06 81 ff 23 df  06 be 82 4e ac 42 80 10  |#.w...#....N.B..|
+00000350  ea db 84 f9 96 98 8e bb  bf ab b4 b6 fc 21 88 02  |.............!..|
+00000360  49 cb a3 4c 89 ee 19 cb  4d 71 6f fc 37 16 03 03  |I..L....Mqo.7...|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 50 ea 05  19 9b 2d ea a4 e3 96 6c  |.... P....-....l|
-00000040  df b1 de db 80 da e9 65  da dd ad 35 42 7f ce fa  |.......e...5B...|
-00000050  43 79 b5 b7 60                                    |Cy..`|
+00000030  16 03 03 00 20 6e 65 ea  6e 03 fb f9 4e 00 8f d1  |.... ne.n...N...|
+00000040  99 24 83 3a 38 ef 28 7b  16 43 70 b5 af 0d de 37  |.$.:8.({.Cp....7|
+00000050  cd bf ac 83 09                                    |.....|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 79 ce b5 0f d4  |.......... y....|
-00000010  dd 4d 4b 19 9e d4 8c 49  41 2c 14 e3 2e b7 89 d1  |.MK....IA,......|
-00000020  3f 9f 2f 90 21 8c 91 98  bf 0c 4a                 |?./.!.....J|
+00000000  14 03 03 00 01 01 16 03  03 00 20 ef 39 04 ca 70  |.......... .9..p|
+00000010  71 ee f8 1b 72 10 b7 6a  89 cd 85 ee a4 81 a4 87  |q...r..j........|
+00000020  88 1b c7 5b 18 d9 95 fe  31 d9 c8                 |...[....1..|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 97 1a f9  8d c2 df 57 b3 c1 10 b9  |...........W....|
-00000010  2f 8f 3b 47 95 83 03 af  88 97 b1                 |/.;G.......|
+00000000  17 03 03 00 16 58 8c 23  1b 8d 7f 44 92 a4 5d 88  |.....X.#...D..].|
+00000010  3e ee 7c 98 90 14 b4 61  e9 5c ea                 |>.|....a.\.|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 30 98 ac  88 1f db 08 3a be 39 26  |.....0......:.9&|
-00000010  d8 5a df b9 5e fe 26 72  09                       |.Z..^.&r.|
+00000000  16 03 03 00 14 32 2b 55  14 4a 65 21 51 b0 72 e0  |.....2+U.Je!Q.r.|
+00000010  4c 57 b0 b1 78 0b e3 30  de                       |LW..x..0.|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 14 a4 24 c3  2f 54 1c 65 c6 79 11 73  |......$./T.e.y.s|
-00000010  a8 9b 6e 8b 81 08 e4 e1  8a 12 56 5d 93 cd 1a 0c  |..n.......V]....|
-00000020  a4 88 fe 2f a5 dc cf d0  1d 1b e8 d3 76 9e 8e a0  |.../........v...|
-00000030  d8 70 44 7d b5 1e be 95  2d 21 c8 0d 0d d0 fe ae  |.pD}....-!......|
-00000040  b0 0b 73 35 f7 82 6d 0e  36 0f e1 34 cf b7 d4 51  |..s5..m.6..4...Q|
-00000050  af d1 bc 83 3e 36 35 10  87 fd 59 ba 4b b5 fb 10  |....>65...Y.K...|
-00000060  da 41 f2 ce cb ce 4f 4f  42 4c 11 71 5e 60 c3 13  |.A....OOBL.q^`..|
-00000070  6a 10 44 3d 93 49 f4 01  aa c4 a1 6e 81 16 60 66  |j.D=.I.....n..`f|
-00000080  d2 7f 22 df e2 68 86 13  d8 e9 e2 2a a3 d5 81 11  |.."..h.....*....|
-00000090  af 36 9b 78 2e 33 e5 05  b6 47 1d 1c 3e 2c 43 57  |.6.x.3...G..>,CW|
-000000a0  a5 1e 1b a6 b2 20 fa 53  80 cb 11 92 51 93 89 f6  |..... .S....Q...|
-000000b0  1c 52 1d 32 c9 b4 ac b3  ac ad a1 02 a5 e1 50 e5  |.R.2..........P.|
-000000c0  24 6e 91 75 58 72 39 c9  9b 59 f8 79 ed 08 40 7a  |$n.uXr9..Y.y..@z|
-000000d0  c5 3c 1c fc 44 9d d9 f6  35 f0 2a 61 a4 7a 8c f3  |.<..D...5.*a.z..|
-000000e0  d5 81 e4 54 9d cf a2 14  aa 59 e7 6e 9d 0d e7 f1  |...T.....Y.n....|
-000000f0  36 d9 db ef 56 c5 8d 95  89 3d 7c 99 f2 e7 b1 12  |6...V....=|.....|
-00000100  4e 53 ca e8 84 cb ca 3c  2a 1d fd 4a e7 af 9b 35  |NS.....<*..J...5|
-00000110  20 24 49 ff 95 67 b1 e1  98                       | $I..g...|
+00000000  16 03 03 01 16 ff 7a 5b  80 e0 cd 83 55 3d b5 97  |......z[....U=..|
+00000010  60 d2 51 1e 75 d2 5d b9  ea 2a 5f 67 43 03 7c 50  |`.Q.u.]..*_gC.|P|
+00000020  25 5d a2 81 5f fa 0f be  08 9d 80 ac 73 16 bc 64  |%].._.......s..d|
+00000030  51 54 33 09 cc 05 90 24  c0 ee 99 a9 d1 8f 1b 3e  |QT3....$.......>|
+00000040  9f 6a e8 b6 83 b0 30 fe  e6 6b 6e 37 dd 95 95 30  |.j....0..kn7...0|
+00000050  64 46 c7 fc 15 54 84 ef  3d 1a 28 2d ee 3b aa 19  |dF...T..=.(-.;..|
+00000060  60 21 f9 d1 98 04 b4 0f  08 79 34 1f aa 12 2e 60  |`!.......y4....`|
+00000070  93 ff 87 16 56 55 24 c7  96 00 3b c2 72 7f 9d 96  |....VU$...;.r...|
+00000080  8b b7 2b 50 8f 99 df f5  4c 6a 42 0a cc 2f 27 f2  |..+P....LjB../'.|
+00000090  88 6d 42 e3 20 c8 1f 01  2b fb e9 b3 aa f3 2f 02  |.mB. ...+...../.|
+000000a0  fa 78 34 38 00 0f 1d f9  c7 5a 08 ae 56 19 c2 6c  |.x48.....Z..V..l|
+000000b0  0b b0 d1 40 0d 0e 57 d2  00 be 3d 65 9c c1 86 00  |...@..W...=e....|
+000000c0  4c a5 1b a6 67 4d 39 cd  ba fe 96 3c c5 25 dd 43  |L...gM9....<.%.C|
+000000d0  7b 49 f0 b5 8a 66 46 d4  65 6b 2d da 55 13 14 48  |{I...fF.ek-.U..H|
+000000e0  76 c8 2c 3d a4 4d 7a 14  1e 70 32 06 b3 96 cd 4e  |v.,=.Mz..p2....N|
+000000f0  bd 4f 06 a8 83 ae 30 83  b6 6b 61 2e 08 73 0e 14  |.O....0..ka..s..|
+00000100  08 13 3d f0 7c ec cf 78  ff b4 25 21 15 5e 80 14  |..=.|..x..%!.^..|
+00000110  80 4f af c7 9e 44 04 33  da cb 27                 |.O...D.3..'|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 4b cf ec  d9 bc 7a 0e d9 ad 98 1f  |.....K....z.....|
-00000010  a2 53 ff dd 05 f6 97 21  f3 e1 25 28 2d a3 72 5c  |.S.....!..%(-.r\|
-00000020  ce bd 73 ab da 53 56 78  05 d2 6d 61 8c 7c 68 bc  |..s..SVx..ma.|h.|
-00000030  b2 be b9 ac ff 6a 57 e2  96 62 b1 22 5f 82 cd 87  |.....jW..b."_...|
-00000040  24 d8 19 ca d4 9a 68 b3  12 7d 32 6f ff 35 d8 b7  |$.....h..}2o.5..|
-00000050  7a 41 b7 05 ba be f2 c6  b8 58 fb 3d f5 ca 9d 97  |zA.......X.=....|
-00000060  b3 c4 48 b0 33 2d 92 25  a2 ec 52 f0 e5 4e 72 65  |..H.3-.%..R..Nre|
-00000070  4d bb ce 30 da 8d 99 3b  69 04 b3 f1 e0 43 82 ab  |M..0...;i....C..|
-00000080  98 f8 f0 a8 4f fc 16 03  03 02 69 7e a5 80 32 0a  |....O.....i~..2.|
-00000090  ca 95 73 07 76 d9 80 87  f4 5a cd 91 02 86 fa dc  |..s.v....Z......|
-000000a0  c8 06 b1 77 a6 52 b6 51  fa 1d 27 1e 95 e8 ec 36  |...w.R.Q..'....6|
-000000b0  43 29 87 33 09 4e 67 8a  cc 20 66 77 b2 7e 36 7d  |C).3.Ng.. fw.~6}|
-000000c0  1c 06 95 4d ea 73 28 0f  07 2b 9b c7 ab eb fe c0  |...M.s(..+......|
-000000d0  65 b1 87 5b 40 c6 11 92  21 18 90 c2 23 32 f1 e0  |e..[@...!...#2..|
-000000e0  39 30 c9 c2 78 be 0f 89  9e 73 f3 c1 4b 39 d8 2e  |90..x....s..K9..|
-000000f0  59 59 38 6e 82 7e 9e cc  41 ab e3 94 14 b8 22 80  |YY8n.~..A.....".|
-00000100  63 c9 ca 16 df ce 7f de  17 d5 52 2d b7 a1 a4 c9  |c.........R-....|
-00000110  13 1b d9 c3 55 6d 60 48  b3 bf 4e 28 49 9f 30 a6  |....Um`H..N(I.0.|
-00000120  3f d5 e7 55 ed 9f 1b 69  5b 16 48 d5 76 01 09 ba  |?..U...i[.H.v...|
-00000130  1d 0d e6 4e 39 34 8c 42  62 1d 23 b5 77 d5 4f c6  |...N94.Bb.#.w.O.|
-00000140  61 d9 1f b5 ab 3c ec f1  c4 a1 ec 7f 96 d2 1c fb  |a....<..........|
-00000150  d3 c6 60 2c 55 38 3e 66  5d 5e 81 fb f0 23 95 9e  |..`,U8>f]^...#..|
-00000160  b1 e0 f7 e9 af 4c e2 d4  7d 92 df ef c5 16 57 de  |.....L..}.....W.|
-00000170  1d 68 23 53 46 8b 22 8c  d0 8d 25 f6 07 75 b0 19  |.h#SF."...%..u..|
-00000180  e1 80 82 67 d5 74 f2 2e  51 34 f0 84 56 5b 45 de  |...g.t..Q4..V[E.|
-00000190  d1 eb 00 41 94 f4 15 ef  60 23 39 63 cb f0 86 e7  |...A....`#9c....|
-000001a0  ee cc 34 cc b4 14 f7 f9  71 48 0c f0 66 9f d3 0c  |..4.....qH..f...|
-000001b0  92 a4 20 9c 40 44 da e5  4f a2 91 de a4 6b c3 5f  |.. .@D..O....k._|
-000001c0  0c dd b4 22 e7 6a b8 f3  46 2d aa 0d f3 c6 b6 10  |...".j..F-......|
-000001d0  9a 69 f1 3c a4 89 6f d5  b6 45 6c e5 7b 10 d8 f4  |.i.<..o..El.{...|
-000001e0  7f 9e 83 eb 44 5f 6c 00  e0 a9 5a 56 c8 80 5a 92  |....D_l...ZV..Z.|
-000001f0  20 48 7c ee 22 65 8a e2  35 55 3f 7c 1a bd 4c cf  | H|."e..5U?|..L.|
-00000200  84 2e af 26 d1 d1 1a fc  81 d3 90 a8 9e d0 56 c3  |...&..........V.|
-00000210  f4 f9 7e ac 29 9e d8 91  57 a0 a2 7b 00 b2 42 0f  |..~.)...W..{..B.|
-00000220  d0 5e ce 26 3c de f7 75  2d c9 74 c7 98 72 c8 b1  |.^.&<..u-.t..r..|
-00000230  86 33 81 21 f5 f7 4c c9  f3 04 c2 48 24 d0 3e a6  |.3.!..L....H$.>.|
-00000240  c4 8d 0f 3e 25 09 32 36  66 4c e4 67 27 4d 09 71  |...>%.26fL.g'M.q|
-00000250  45 91 8e 6a ca a1 ab 69  4a 20 ea e6 a5 a1 8a 53  |E..j...iJ .....S|
-00000260  b3 85 4f de de c8 4d a5  ec bd 4e 11 e7 78 f8 4c  |..O...M...N..x.L|
-00000270  7a 46 28 a7 0b 3d ce 1f  4a be 2d c3 1b 7c 79 9c  |zF(..=..J.-..|y.|
-00000280  da ae f3 ee ae 58 1f 93  6e ca f4 03 b7 4d be ac  |.....X..n....M..|
-00000290  d8 32 d9 0a 4e 3b dd a8  c3 b6 24 c7 e5 78 bc 7d  |.2..N;....$..x.}|
-000002a0  be 12 d9 c4 f9 c1 16 23  79 ba 00 27 fd 0c 93 38  |.......#y..'...8|
-000002b0  2c 36 0f e1 a3 9f 27 46  82 2b 60 b5 3f f9 9b cd  |,6....'F.+`.?...|
-000002c0  60 39 85 96 60 aa 1c 3d  0a 9e 53 46 90 0e 49 68  |`9..`..=..SF..Ih|
-000002d0  67 96 db 82 02 c9 4e f4  d7 fe 06 bf d7 01 ae db  |g.....N.........|
-000002e0  c5 eb 70 c2 51 72 2d 41  ca 2c ae 48 2c 19 bb ae  |..p.Qr-A.,.H,...|
-000002f0  7f 2f d4 cf 16 03 03 00  bc 75 f7 cb 92 aa 8c ab  |./.......u......|
-00000300  d7 ea 79 a1 b6 31 a5 5b  5a 19 98 a2 e2 a7 5a a6  |..y..1.[Z.....Z.|
-00000310  9c c8 d5 84 1e f0 cc 18  a3 ba 1b 21 2f 9a 0e 3d  |...........!/..=|
-00000320  54 10 17 ee a4 40 4d 0f  b9 36 bf 4a 41 76 7b 0a  |T....@M..6.JAv{.|
-00000330  7f d8 50 1c 1f 99 5b bf  50 87 e4 24 67 fe 45 93  |..P...[.P..$g.E.|
-00000340  a4 a2 41 ce e4 17 67 08  af 35 43 5c 12 ea c3 0e  |..A...g..5C\....|
-00000350  1f e6 80 89 76 4f 36 71  fe a2 51 ef 05 cb 10 55  |....vO6q..Q....U|
-00000360  16 fd 6d 07 aa ba 6a 68  d8 e5 53 cb 9e 17 cd 25  |..m...jh..S....%|
-00000370  98 83 62 a6 55 74 79 36  87 1c 5c ef 4a 65 85 a1  |..b.Uty6..\.Je..|
-00000380  a4 1b 5d 7c 0d cf e3 63  37 14 b2 ac 74 12 d9 f3  |..]|...c7...t...|
-00000390  25 52 d7 a9 d8 f2 c4 75  08 57 5b 48 c5 5e 07 78  |%R.....u.W[H.^.x|
-000003a0  c6 74 f3 6e 5a fb 09 67  4d a0 6a d0 f8 b4 0a 00  |.t.nZ..gM.j.....|
-000003b0  71 f2 ce e0 20 16 03 03  00 4a 1d 3b c4 a4 6e e3  |q... ....J.;..n.|
-000003c0  a0 43 f3 44 b6 eb d7 bb  47 dc 18 b6 84 4a c1 4d  |.C.D....G....J.M|
-000003d0  05 ee 71 1a 40 75 d1 ac  be c3 cb f0 4b f2 a3 c3  |..q.@u......K...|
-000003e0  03 6a 1d 3e 77 09 61 f0  0a 35 47 af 67 23 a1 76  |.j.>w.a..5G.g#.v|
-000003f0  9e 90 be 10 a0 6b 9d 49  9e 79 38 b8 6a c4 53 ba  |.....k.I.y8.j.S.|
-00000400  37 88 86 f2 16 03 03 00  14 c7 e1 2e 8a 83 d1 b0  |7...............|
-00000410  3e a6 81 d3 6b 62 89 d1  a3 43 c4 7b 4e           |>...kb...C.{N|
+00000000  16 03 03 00 81 f5 0b a1  9d 19 be 84 54 fd 42 47  |............T.BG|
+00000010  d9 4e f8 35 02 91 06 7e  53 5c ea 64 8b c4 34 ac  |.N.5...~S\.d..4.|
+00000020  f9 93 54 36 5d 13 d0 0d  75 9f 8f 22 20 70 17 45  |..T6]...u.." p.E|
+00000030  37 a9 ed c2 34 23 8b bc  c8 87 5f a2 ff 9c 54 48  |7...4#...._...TH|
+00000040  1b d4 85 60 39 4b 53 75  6f 65 d0 33 a7 b6 90 7d  |...`9KSuoe.3...}|
+00000050  4f 84 28 cc 59 ab af bd  85 4b 40 ed 72 ff 30 c6  |O.(.Y....K@.r.0.|
+00000060  a5 01 8b fa 03 52 7e 0d  a8 5d 86 89 9b 4e c4 05  |.....R~..]...N..|
+00000070  83 fb d4 aa f9 13 8b 06  b1 2b 89 82 12 d2 a3 e2  |.........+......|
+00000080  79 d6 6a 07 ef a0 16 03  03 02 69 65 b4 cc 90 43  |y.j.......ie...C|
+00000090  f7 6f 92 59 1b 47 32 e4  51 be 16 8c bb 7b ef 68  |.o.Y.G2.Q....{.h|
+000000a0  60 38 9c 5f 5a f6 04 da  78 1d 4e 89 a7 e9 5b e0  |`8._Z...x.N...[.|
+000000b0  27 7d 82 fa 6f 44 df 5d  59 b3 5b 4c 01 76 3e bd  |'}..oD.]Y.[L.v>.|
+000000c0  d7 b5 0b 9a 9d be d4 ec  03 9d e5 a5 e0 e2 f2 a3  |................|
+000000d0  7f b2 87 ed 09 46 b2 e1  6a e2 39 e9 82 0d fb 62  |.....F..j.9....b|
+000000e0  a4 ef 1e 29 75 96 68 da  f9 8d 75 86 df 0c 57 9c  |...)u.h...u...W.|
+000000f0  48 e9 3e de 16 ab 22 b2  6d 37 38 d6 33 44 bd 38  |H.>...".m78.3D.8|
+00000100  16 2c 49 1c 2c 17 1a 28  05 45 eb 65 44 4e 1a 02  |.,I.,..(.E.eDN..|
+00000110  fc 2f 5c c9 e8 d8 16 e6  4f 5f f4 bd b4 d7 ec 73  |./\.....O_.....s|
+00000120  2f d1 f5 5b 68 69 b6 6a  59 8e 0b 24 2d 7c 69 96  |/..[hi.jY..$-|i.|
+00000130  a6 99 66 3e 38 25 82 30  ba 1a b5 b9 66 23 ea 60  |..f>8%.0....f#.`|
+00000140  b6 30 5e f5 29 80 8a 75  fc 96 f0 af 3d d2 8e 83  |.0^.)..u....=...|
+00000150  5e 00 fc 76 1c 69 cc 2b  e8 d2 70 21 95 65 da 2c  |^..v.i.+..p!.e.,|
+00000160  ed c3 fd a4 31 de 00 e5  3a b1 81 38 fc 68 da 0f  |....1...:..8.h..|
+00000170  b0 8c 32 f4 67 08 ed 31  0d fc e1 9b 20 8c 79 99  |..2.g..1.... .y.|
+00000180  bd 52 e6 eb 27 04 a5 94  1c e9 a0 5a 18 bf 7b 59  |.R..'......Z..{Y|
+00000190  22 e6 5c 63 84 2f 0a f6  ef b8 c9 c0 cf 82 0d 07  |".\c./..........|
+000001a0  42 66 65 0b d5 5e ea 27  0d f9 de 7e 13 a9 c2 b5  |Bfe..^.'...~....|
+000001b0  ea e2 22 4f a0 13 dc 12  69 9a ec ed d4 44 b2 bc  |.."O....i....D..|
+000001c0  88 65 09 ea 50 ca d6 48  c2 f2 12 9e b3 ab 29 c5  |.e..P..H......).|
+000001d0  61 72 3d 0e 77 bd 96 d9  ff 24 4d 7f 4d 22 e0 67  |ar=.w....$M.M".g|
+000001e0  54 02 18 42 e7 78 0c 18  28 89 24 a8 4a a1 cc 70  |T..B.x..(.$.J..p|
+000001f0  a2 a1 4f ee a0 b6 1f 7e  cb 9b 20 95 1f 10 63 60  |..O....~.. ...c`|
+00000200  df fe ce 37 9e 9e ce ff  fa 49 4f 4c 5b c0 f6 35  |...7.....IOL[..5|
+00000210  b7 eb e1 ac 85 64 11 6e  83 61 6f da d9 e9 09 a6  |.....d.n.ao.....|
+00000220  10 eb c2 da 62 9c ac e0  2e 0a ff 21 2e f7 94 6d  |....b......!...m|
+00000230  a6 56 f9 1c 39 52 f3 c7  29 a9 d6 b2 8c a9 4f bf  |.V..9R..).....O.|
+00000240  62 c8 74 cb 80 3d 3e 4d  d1 25 4c 29 14 21 cd 13  |b.t..=>M.%L).!..|
+00000250  b0 92 5a ca 9b 10 f6 4c  91 6e f7 c3 55 5e 0e f0  |..Z....L.n..U^..|
+00000260  e2 8f 2f 65 f9 b8 c2 43  0c 38 45 86 22 15 ed 8f  |../e...C.8E."...|
+00000270  6b 49 ff 45 e5 59 b7 54  f8 c9 d3 b0 f6 71 82 7b  |kI.E.Y.T.....q.{|
+00000280  7d 52 be 6c 33 f2 27 5c  f8 33 96 05 64 fa b2 b9  |}R.l3.'\.3..d...|
+00000290  ae 74 23 91 46 6f 9b 42  5b 96 1c c4 1c f4 5e b0  |.t#.Fo.B[.....^.|
+000002a0  c7 78 0f f3 da d3 01 ae  25 6c c1 10 31 47 e9 0d  |.x......%l..1G..|
+000002b0  84 27 5d 5a 23 35 07 3c  2d ea e8 dc cd d3 c6 85  |.']Z#5.<-.......|
+000002c0  86 ff 48 07 b8 97 d5 c5  10 f4 47 46 af 87 d9 03  |..H.......GF....|
+000002d0  24 3d b0 80 33 46 2a 4d  15 77 5c 21 3c a4 13 99  |$=..3F*M.w\!<...|
+000002e0  6c 9e ce 69 81 2e 90 c9  ba 9a 95 91 30 cc 8d 9b  |l..i........0...|
+000002f0  6c 55 c4 09 16 03 03 00  bc 30 d3 15 d7 3b 42 a9  |lU.......0...;B.|
+00000300  9b a2 1f c8 ff 90 43 4c  0f 9c 4e 59 98 23 a2 9e  |......CL..NY.#..|
+00000310  17 e0 ea 06 ae 8f 23 e6  85 f9 ca 80 39 34 78 a3  |......#.....94x.|
+00000320  7b 7e 61 88 86 35 e3 8e  a3 61 2d f9 24 6e e4 b1  |{~a..5...a-.$n..|
+00000330  c2 7d 56 bc 9d e0 12 3d  e5 90 10 b9 39 d5 64 6b  |.}V....=....9.dk|
+00000340  a8 91 75 d7 95 e7 e6 ce  8f 11 b0 66 87 f5 48 5d  |..u........f..H]|
+00000350  c9 a1 56 b1 71 e9 74 5f  48 a6 06 32 dc 66 7b 0b  |..V.q.t_H..2.f{.|
+00000360  85 66 36 e9 d3 13 2d d8  60 8c b2 89 c5 2a de b7  |.f6...-.`....*..|
+00000370  48 63 e0 8e 27 65 3a 01  6f be 75 45 ec 2a 61 c4  |Hc..'e:.o.uE.*a.|
+00000380  a8 0b cf 95 93 a2 d6 27  fa 71 82 92 3a 95 39 a7  |.......'.q..:.9.|
+00000390  fc e5 33 e3 f2 0e a4 94  94 bb e6 65 25 3a 6f 6e  |..3........e%:on|
+000003a0  da a0 6d fc 57 2b 46 f8  ab 55 0e 5a 1e 56 92 68  |..m.W+F..U.Z.V.h|
+000003b0  7e 88 f4 d0 b2 16 03 03  00 4a 08 e0 60 21 59 5d  |~........J..`!Y]|
+000003c0  29 3e ba b9 1d 13 3a a0  e3 b2 76 39 29 00 92 d0  |)>....:...v9)...|
+000003d0  24 a6 d9 fd e2 2b c8 5d  6b 78 ea 75 ce 68 93 1b  |$....+.]kx.u.h..|
+000003e0  3b b8 59 e4 6b 60 5b 4a  28 7a e9 1d 04 72 a8 e0  |;.Y.k`[J(z...r..|
+000003f0  64 31 e4 86 da a9 f2 00  36 55 bd 56 02 d4 b3 48  |d1......6U.V...H|
+00000400  a7 21 69 11 16 03 03 00  14 44 1c 39 61 56 3d 7e  |.!i......D.9aV=~|
+00000410  ca dd cb 34 06 10 4f 5f  32 45 63 c1 98           |...4..O_2Ec..|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 07 d0 f5  52 49 69 16 9e a0 95 ae  |....i...RIi.....|
-00000010  90 23 85 b7 03 e7 93 76  bc 81 8f 30 73 d3 0b 58  |.#.....v...0s..X|
-00000020  cb 9a 18 00 66 cd 4c 43  a7 a7 8d e3 84 1a dc 86  |....f.LC........|
-00000030  11 c2 2e 02 07 94 9f 64  2d 77 8a 60 60 07 22 be  |.......d-w.``.".|
-00000040  dc 36 14 b4 04 b8 94 46  f6 d4 db bc 68 82 14 7e  |.6.....F....h..~|
-00000050  d9 cf 60 4b a3 ff 03 d7  05 e0 a5 f4 94 1f ee 76  |..`K...........v|
-00000060  4e 96 d0 70 1b cc 4e ad  ef d4 4d df 71 82 a1 b5  |N..p..N...M.q...|
-00000070  96 97 63 dc cc 13 75 29  bb b5 b7 46 fb b6 dd 17  |..c...u)...F....|
-00000080  fd 8d be 54 14 35 a9 2b  66 c5 80 fb 41 e6 92 c1  |...T.5.+f...A...|
-00000090  4b db 97 30 12 d1 4c c4  bc 4e 91 a4 17 c7 4e 22  |K..0..L..N....N"|
-000000a0  bd 81 69 26 b4 8e d8 63  c8 33 0c 89 b5 12 6e af  |..i&...c.3....n.|
-000000b0  ea 09 10 66 5e c3 f2 9f  c5 c2 0c 91 75 d5 c8 cc  |...f^.......u...|
-000000c0  4b dd 1f 42 22 29 fe f5  15 3f e6 96 b5 af 41 5d  |K..B")...?....A]|
-000000d0  06 59 33 40 da 8e c8 2f  00 9c 6b 7c fc fe 45 fe  |.Y3@.../..k|..E.|
-000000e0  fd 9c b4 87 18 f8 90 9c  8f 22 0d f4 d5 39 96 a0  |........."...9..|
-000000f0  77 55 4e 52 f7 31 15 cb  ea d6 dd 65 5c 91 f4 36  |wUNR.1.....e\..6|
-00000100  a2 d3 c0 d5 c7 9c 07 38  6e 38 e2 00 c9 82 c9 d3  |.......8n8......|
-00000110  e5 b0 77 11 4f 3b 82 7e  28 2c c0 69 7e 5d 76 ff  |..w.O;.~(,.i~]v.|
-00000120  c7 e0 f2 13 5e 5f 8d a0  51 f5 07 8c f2 4f 1c e9  |....^_..Q....O..|
-00000130  eb 36 62 3e 9f db 15 11  b7 b0 c2 9f 92 84 37 81  |.6b>..........7.|
-00000140  92 aa ea 5e 2a 70 74 3a  16 06 88 9a 98 1a de a9  |...^*pt:........|
-00000150  08 91 01 b0 d8 f1 1f fa  54 bd 44 ef 25 49 4d 81  |........T.D.%IM.|
-00000160  ec 3b 59 ec 3c b0 ba 08  d4 30 71 66 c1 46 c1 ba  |.;Y.<....0qf.F..|
-00000170  9d 56 8c b0 b9 b0 3d fa  35 51 7c 91 1f 3c b6 8f  |.V....=.5Q|..<..|
-00000180  05 fa d2 70 62 78 17 1e  27 68 3b e4 65 ca c4 dc  |...pbx..'h;.e...|
-00000190  b3 6b 91 27 7c 12 49 36  93 c6 62 5d d8 1f e2 de  |.k.'|.I6..b]....|
-000001a0  e7 2e 36 6b c5 9c 68 6d  91 29 d3 eb 8c 07 7c fa  |..6k..hm.)....|.|
-000001b0  42 3e 90 62 c0 0a eb 63  a5 2c b3 4b 3d 2e 5a 36  |B>.b...c.,.K=.Z6|
-000001c0  78 71 c1 5a 94 a7 b9 5a  b2 e2 8d dd b7 95 0d 94  |xq.Z...Z........|
-000001d0  63 38 8f 60 94 c0 2a b9  d6 77 14 34 a2 ac 2c 7e  |c8.`..*..w.4..,~|
-000001e0  97 f4 76 87 c9 31 bf 73  97 37 9e ef a0 3e dc 49  |..v..1.s.7...>.I|
-000001f0  db e1 4b 61 52 2a 1f 73  cd 76 49 28 f2 73 28 6f  |..KaR*.s.vI(.s(o|
-00000200  75 12 91 c6 5c 55 34 66  63 5f 79 22 9e 13 31 25  |u...\U4fc_y"..1%|
-00000210  42 c0 68 59 38 37 85 dd  ec 47 65 d1 9b 24 44 d2  |B.hY87...Ge..$D.|
-00000220  37 d9 8f d8 f9 e4 37 7b  a8 cd ad 25 65 f0 a1 27  |7.....7{...%e..'|
-00000230  5e d8 8b 69 1f a7 0b 26  d1 d8 cd b2 e5 ba 31 20  |^..i...&......1 |
-00000240  f0 9e 6a 39 6f 9d 04 cf  96 1f 4c 69 cc 4d 16 32  |..j9o.....Li.M.2|
-00000250  59 d6 4e eb b7 c5 bc 33  c2 18 9d 58 82 73 64 c0  |Y.N....3...X.sd.|
-00000260  a6 09 00 2b 04 1b 05 68  77 dd bb 73 b4 b3 16 03  |...+...hw..s....|
-00000270  03 00 35 3a 50 32 09 27  fd 20 17 11 7b 7b e1 42  |..5:P2.'. ..{{.B|
-00000280  9c af b2 bb 38 5a 89 c7  e5 eb c4 8e 1e 04 94 1f  |....8Z..........|
-00000290  40 17 4e b4 94 5b c7 fd  d9 14 6e 0d f8 4c f6 cc  |@.N..[....n..L..|
-000002a0  76 a3 08 02 7e a7 a2 4c  16 03 03 00 98 08 77 4a  |v...~..L......wJ|
-000002b0  7a f0 ba 64 6e 14 8e fd  d9 2f 67 57 1f 4b 05 7b  |z..dn..../gW.K.{|
-000002c0  99 ed 0d e9 03 de 88 60  44 0c 04 d2 5a 24 4a 9d  |.......`D...Z$J.|
-000002d0  9b bf fd d6 2f 60 03 63  e4 82 58 bb 69 92 41 c5  |..../`.c..X.i.A.|
-000002e0  30 18 cf 9b cc c5 66 b2  b6 ef 15 5f b3 60 93 c6  |0.....f...._.`..|
-000002f0  27 59 27 bc d5 dd 3b 5a  9d f7 ad 05 11 b7 9e bc  |'Y'...;Z........|
-00000300  ff 43 f8 0c 83 0f 6c fa  d1 23 09 03 42 60 61 d4  |.C....l..#..B`a.|
-00000310  ff 3b c9 ee 15 4a 02 fa  d9 60 97 91 50 03 7d 6b  |.;...J...`..P.}k|
-00000320  c1 a2 64 00 5b b1 12 62  bd e5 c9 8a 2e 0c c1 71  |..d.[..b.......q|
-00000330  a8 e2 94 45 be 8b ba a7  c0 6e e7 5e a5 bc 7a f8  |...E.....n.^..z.|
-00000340  48 06 e2 27 3f 14 03 03  00 11 ef 57 1d e6 74 e2  |H..'?......W..t.|
-00000350  9f 49 cd dc 7a 7d 0b 21  f7 1b e8 16 03 03 00 20  |.I..z}.!....... |
-00000360  39 a4 df 59 44 4c b2 99  aa 0c c6 90 b3 a1 0d 00  |9..YDL..........|
-00000370  38 ee 40 d2 b0 62 b4 cf  e3 20 e7 d7 5f f8 cf aa  |8.@..b... .._...|
+00000000  16 03 03 02 69 68 d9 de  2a 4d 03 fe 05 cc b8 d3  |....ih..*M......|
+00000010  c8 f0 3d df 1c 73 f1 bd  55 08 45 c4 2a 6b a1 c8  |..=..s..U.E.*k..|
+00000020  35 7d 56 b7 b9 15 63 ba  09 31 59 8b f8 ce a0 f8  |5}V...c..1Y.....|
+00000030  1b 3b 5f 5e 1c 3d bb 26  43 cb 7b f3 ba 3b a2 38  |.;_^.=.&C.{..;.8|
+00000040  a3 d5 bd 0b 65 16 7c e3  79 cc ed 17 04 34 60 e7  |....e.|.y....4`.|
+00000050  1e 60 52 72 13 e4 6b ef  32 99 86 94 49 30 47 df  |.`Rr..k.2...I0G.|
+00000060  e2 6c 6d 3f 6c 19 e4 4e  b9 df 42 e3 c8 47 2c d0  |.lm?l..N..B..G,.|
+00000070  be 2c 94 3b 1d 3e 3a b3  06 67 c3 25 9b 24 4e 8e  |.,.;.>:..g.%.$N.|
+00000080  dc c7 50 ab 72 bd b4 d1  ff f7 3f 6d 13 89 55 8c  |..P.r.....?m..U.|
+00000090  14 a1 ae fe ad a0 bb 8f  fe 51 ac 5b eb 23 3d d0  |.........Q.[.#=.|
+000000a0  9e b8 5e 34 8c dd 47 79  9c 73 f5 6b 47 ff 10 7d  |..^4..Gy.s.kG..}|
+000000b0  ac 1d a7 54 5e b5 0f 75  86 67 13 70 d5 66 da 55  |...T^..u.g.p.f.U|
+000000c0  0b 48 a0 88 ae f9 81 92  33 0b 29 79 42 f7 c2 98  |.H......3.)yB...|
+000000d0  2c 2f 32 c7 df 35 ff 4a  44 10 fa 9f 66 ce 4b 9a  |,/2..5.JD...f.K.|
+000000e0  3c 5b b3 7d ac 3b 9a 68  bb 40 3d 36 6b 72 98 c5  |<[.}.;.h.@=6kr..|
+000000f0  85 3c b0 75 1c d6 45 0f  f9 4d 26 2d ec 67 90 ed  |.<.u..E..M&-.g..|
+00000100  88 33 92 7d 99 22 c4 08  90 64 17 1e 06 03 d5 a3  |.3.}."...d......|
+00000110  72 a6 92 99 d3 c8 46 9f  e7 f9 15 bb dd ba e5 f7  |r.....F.........|
+00000120  d9 06 af 5c 1c a0 03 c7  fe 51 b5 41 0c 8f 6d ad  |...\.....Q.A..m.|
+00000130  f2 41 23 a5 44 38 8a bb  b3 d9 3c e8 5e 99 98 23  |.A#.D8....<.^..#|
+00000140  9c 87 3d f8 10 df 58 c2  dd b9 2c 7e 56 a1 75 84  |..=...X...,~V.u.|
+00000150  a2 e5 66 20 58 ed fe f7  04 ff 93 e0 6e 9f 1e f3  |..f X.......n...|
+00000160  a9 8a 9a 37 38 d2 7c 4d  74 88 f5 bd 2b 5a 05 bc  |...78.|Mt...+Z..|
+00000170  53 a1 48 ab 98 ca 91 bb  fa f3 62 a9 0a fa 89 e6  |S.H.......b.....|
+00000180  22 06 1d 59 72 32 51 d6  f6 de e8 89 b6 eb 96 f2  |"..Yr2Q.........|
+00000190  4d e0 82 0d b8 ec a7 09  84 79 18 70 3e 09 ba 9a  |M........y.p>...|
+000001a0  98 27 13 e8 e6 e5 9d 7c  df 4d 42 a8 41 be 62 e0  |.'.....|.MB.A.b.|
+000001b0  1d 48 24 5d 35 e5 a5 ff  f5 67 85 cf b8 53 e1 5e  |.H$]5....g...S.^|
+000001c0  dd 82 40 9e d3 94 fd 7b  1b b3 13 d8 98 a8 1f 21  |..@....{.......!|
+000001d0  1a 04 5a df 3c 8f 3a c0  dc 86 8b e1 39 0a 03 8e  |..Z.<.:.....9...|
+000001e0  8c 9a 4c d5 15 32 2d 1c  0f ad 43 25 e6 5a 77 f9  |..L..2-...C%.Zw.|
+000001f0  2d e5 a0 a0 b2 32 43 0f  11 55 bb c2 e1 c6 45 2a  |-....2C..U....E*|
+00000200  da a0 6c 14 49 0f a7 d7  40 b1 1a c8 72 2a a8 26  |..l.I...@...r*.&|
+00000210  45 f4 66 9a e0 42 aa 25  ac 28 ec 8c a2 df 48 cc  |E.f..B.%.(....H.|
+00000220  c3 a9 9e 9e af 38 88 82  43 8f 99 02 79 90 3e d9  |.....8..C...y.>.|
+00000230  9e d0 75 a5 95 83 ec 44  2b 13 1c d8 eb 3f 2c 5d  |..u....D+....?,]|
+00000240  1b 7e e2 fe 47 89 08 5b  58 dc 3d ea 32 5e a1 af  |.~..G..[X.=.2^..|
+00000250  c5 e8 90 b8 28 4b 58 55  34 46 ef 2a d6 a0 9b 0b  |....(KXU4F.*....|
+00000260  73 b9 8b b4 38 63 08 92  03 4c 8c 12 be a8 16 03  |s...8c...L......|
+00000270  03 00 35 f5 3c 22 cc bc  cf c3 ad 84 1d dc f4 b6  |..5.<"..........|
+00000280  e0 4a 1c b9 e5 d8 a6 b7  a2 8c fb 40 11 12 40 5c  |.J.........@..@\|
+00000290  e2 f4 ce ac 83 93 69 71  19 85 43 19 9e 30 ee 97  |......iq..C..0..|
+000002a0  02 8e 69 8f 4d 1d 2c 0f  16 03 03 00 98 94 e4 82  |..i.M.,.........|
+000002b0  1d 6b d2 ce 76 6d 68 55  db bb 91 73 6e e9 73 05  |.k..vmhU...sn.s.|
+000002c0  6a d3 eb 48 f1 d7 f6 52  ba 49 6a f2 f7 74 c8 56  |j..H...R.Ij..t.V|
+000002d0  ba f5 e5 97 cb a0 b7 ab  37 2c ff 7a a6 42 e6 78  |........7,.z.B.x|
+000002e0  51 8a 9c bf fa 05 b7 66  04 6d 83 d1 0d e8 18 d0  |Q......f.m......|
+000002f0  f2 b3 4d 4d 2d c0 f7 ac  d1 55 b8 03 d7 dc d7 c2  |..MM-....U......|
+00000300  73 72 54 c9 29 e4 98 29  a3 95 11 7e 56 52 87 09  |srT.)..)...~VR..|
+00000310  05 fe 74 e2 f1 74 c7 f6  f2 28 4f 2c 24 92 ac ae  |..t..t...(O,$...|
+00000320  1c df 4e f9 db ce 3c db  48 60 6b 4d 12 9c f7 de  |..N...<.H`kM....|
+00000330  26 73 25 d2 e7 d1 2e fd  b5 5e c4 66 2a 60 4a 04  |&s%......^.f*`J.|
+00000340  2d b9 6c b1 d2 14 03 03  00 11 58 08 81 e4 4d c4  |-.l.......X...M.|
+00000350  93 47 e2 45 e2 44 73 36  3a fe ba 16 03 03 00 20  |.G.E.Ds6:...... |
+00000360  25 2d 76 2c 22 34 e9 ed  11 a5 84 ee d3 63 df 17  |%-v,"4.......c..|
+00000370  88 be 86 7c 51 35 fb 7e  aa a6 b9 a2 02 59 f7 00  |...|Q5.~.....Y..|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 be d5 20  ab dc c2 df f6 29 bc b7  |....... .....)..|
-00000010  a3 7e 70 b9 48 73 16 03  03 00 20 b2 f3 25 a9 70  |.~p.Hs.... ..%.p|
-00000020  7f 99 0d f4 01 0a 58 ad  b8 6d 02 e8 6f 89 7b 77  |......X..m..o.{w|
-00000030  bf 22 89 b3 23 a8 02 28  00 94 f1 17 03 03 00 19  |."..#..(........|
-00000040  e3 22 a6 cd a4 dd 9d 2b  6f 6c 84 08 a5 dd 97 0d  |.".....+ol......|
-00000050  9a 37 a7 ac e4 6b 03 1f  db 16 03 03 00 14 ec d7  |.7...k..........|
-00000060  d4 fd ec 94 6c 0a 46 8f  ec ee 87 61 5c 0a 82 a2  |....l.F....a\...|
-00000070  03 91                                             |..|
+00000000  14 03 03 00 11 bb 91 ed  b9 75 be 6c 2c b8 7c 57  |.........u.l,.|W|
+00000010  0b 44 2e 6d 68 4a 16 03  03 00 20 49 17 51 ce 23  |.D.mhJ.... I.Q.#|
+00000020  ff 71 ad f5 45 75 01 43  4d d2 f8 08 d8 e5 4d d7  |.q..Eu.CM.....M.|
+00000030  1c 35 5e 8b 18 54 e5 f6  0c b5 2e 17 03 03 00 19  |.5^..T..........|
+00000040  ec 43 1a 6d 9e fb 53 cd  55 1a 72 2e da d1 ea 58  |.C.m..S.U.r....X|
+00000050  66 17 a9 1c be fc d9 72  dd 16 03 03 00 14 c2 98  |f......r........|
+00000060  a4 ac d5 0c a2 10 61 8b  55 3a 69 b6 26 33 4f fe  |......a.U:i.&3O.|
+00000070  2d 42                                             |-B|
 >>> Flow 11 (client to server)
-00000000  15 03 03 00 12 4b bc 67  b6 13 0f 0c df e1 42 46  |.....K.g......BF|
-00000010  05 97 85 e5 97 bc 81 15  03 03 00 12 d7 e8 b7 5c  |...............\|
-00000020  a4 d8 8e fb b3 a7 1f 06  2f bb 77 f1 13 35        |......../.w..5|
+00000000  15 03 03 00 12 d4 c8 e4  36 30 00 40 d1 d5 9a 9d  |........60.@....|
+00000010  3c 2d eb 4f e0 6e a3 15  03 03 00 12 4d b6 67 e4  |<-.O.n......M.g.|
+00000020  02 d0 89 50 ef 4b 8a 1f  49 f2 f0 14 b6 7e        |...P.K..I....~|
index 57febfbc8512be01b04d4c765073cc611fbf4dc3..3502977efa6472a5d8b3a5cf63547cb1f9fad897 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 e0 77 db d2 ca  |....Y...U...w...|
-00000010  46 29 bc ce 1a ee 39 d0  58 35 74 c0 1f 17 86 c0  |F)....9.X5t.....|
-00000020  a8 58 ad b6 e3 f5 e0 80  ae 71 43 20 cd a1 49 bb  |.X.......qC ..I.|
-00000030  94 bc fc 26 a5 56 ea dc  9d 9a b4 ee c7 70 fa 72  |...&.V.......p.r|
-00000040  04 c1 d8 e2 a9 63 24 9a  07 18 a5 fa cc a8 00 00  |.....c$.........|
+00000000  16 03 03 00 59 02 00 00  55 03 03 9c d0 eb d6 42  |....Y...U......B|
+00000010  2e ff 6e 5a 19 33 6d 12  97 56 56 2b f5 1b 86 c8  |..nZ.3m..VV+....|
+00000020  38 83 59 37 ac 17 46 ed  73 53 43 20 e4 94 9b 71  |8.Y7..F.sSC ...q|
+00000030  f4 94 d9 d9 3a a1 e1 99  1e b4 a5 55 46 88 e0 0a  |....:......UF...|
+00000040  af 0a 0e ff 81 10 e2 e0  63 21 ae 2a cc a8 00 00  |........c!.*....|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 96 83 76 7c af 6c af  |........ ..v|.l.|
-000002d0  be 20 ec 79 87 9e e0 23  fa 34 78 96 91 30 3b 78  |. .y...#.4x..0;x|
-000002e0  1b 3f 0f 73 b4 45 05 2f  22 08 04 00 80 38 fe 9b  |.?.s.E./"....8..|
-000002f0  e1 c2 82 13 ce 00 c2 0e  08 98 22 d0 4d 86 38 97  |..........".M.8.|
-00000300  c1 78 b9 11 a4 9d af e0  75 d1 c9 dc a1 dc 25 03  |.x......u.....%.|
-00000310  cd ba 15 2e be 0a 61 39  4f 4f d3 48 95 61 3f 2c  |......a9OO.H.a?,|
-00000320  fb e1 63 e7 8f 51 b4 1f  c8 98 f7 3e 23 11 8c 4a  |..c..Q.....>#..J|
-00000330  b4 76 15 cc 83 bd dc 6f  af 0c d9 f1 80 0d 9b a2  |.v.....o........|
-00000340  a3 ac 2f 26 c8 d3 23 94  bc c9 3d fb 44 4e 47 3e  |../&..#...=.DNG>|
-00000350  3b de ce 24 b8 ab 52 f3  5f 26 96 7f e6 a4 ec 9e  |;..$..R._&......|
-00000360  fc 44 4a 1b 73 d1 ea 2a  a9 b9 c8 ba f6 16 03 03  |.DJ.s..*........|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 9b 89 08 0d ea c2 d3  |........ .......|
+000002d0  4f 73 77 a0 e3 0e 1a 68  13 2c 5c a5 ec 39 75 1b  |Osw....h.,\..9u.|
+000002e0  c2 95 fe b8 fe 58 f4 bb  16 08 04 00 80 d4 e8 d3  |.....X..........|
+000002f0  d4 5b 1f ee ff 60 f5 86  b1 f4 06 c0 a8 ab 90 b0  |.[...`..........|
+00000300  26 15 d5 4e 3f d6 a5 e2  a3 3a e0 0f 9a 92 bd 96  |&..N?....:......|
+00000310  9d 98 15 f3 95 82 a9 5d  9f 1d 9b 4f 2e 77 58 40  |.......]...O.wX@|
+00000320  58 3d fd 8f a6 09 1c fa  61 77 2e 87 df e7 76 8b  |X=......aw....v.|
+00000330  bf f1 dd 29 f8 70 c0 6d  db e5 a0 55 92 77 44 75  |...).p.m...U.wDu|
+00000340  d9 95 a6 17 67 93 47 8e  1f 61 50 65 31 94 d3 79  |....g.G..aPe1..y|
+00000350  5f 25 a6 f0 3e 19 9a c8  ad b9 1a af 5b 50 2c 97  |_%..>.......[P,.|
+00000360  78 1e 71 3a e0 fa 7c 44  1e d1 32 56 4e 16 03 03  |x.q:..|D..2VN...|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 f3 a4 06  da e0 55 ed 41 d1 71 2a  |.... .....U.A.q*|
-00000040  d5 aa 00 31 eb 23 23 52  20 43 36 8f 10 70 d3 e0  |...1.##R C6..p..|
-00000050  6d cc 77 f9 68                                    |m.w.h|
+00000030  16 03 03 00 20 88 fe 97  82 bd a7 99 c6 a6 2f c1  |.... ........./.|
+00000040  1a a8 54 8c e5 c6 39 0a  6b 07 9b 1a 05 f4 fb e3  |..T...9.k.......|
+00000050  67 f5 c8 6e 17                                    |g..n.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 f5 84 89 dc 37  |.......... ....7|
-00000010  bf d9 75 10 c2 30 50 9e  2c 71 00 30 46 f3 af 00  |..u..0P.,q.0F...|
-00000020  9c 6c fd 78 2d d1 54 88  98 c4 8a                 |.l.x-.T....|
+00000000  14 03 03 00 01 01 16 03  03 00 20 3b 6d ac 1c 8b  |.......... ;m...|
+00000010  1b 46 3a 4e 03 75 51 9e  99 6e 5a a8 4f 07 91 a3  |.F:N.uQ..nZ.O...|
+00000020  18 2c bf 88 92 17 e5 13  65 a3 6c                 |.,......e.l|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 e7 10 a8  74 64 64 01 ea af 4a f2  |........tdd...J.|
-00000010  6a 09 c7 60 49 ba 59 71  bc f6 90                 |j..`I.Yq...|
+00000000  17 03 03 00 16 c7 94 fc  be 3d 73 fd ec ce b2 f6  |.........=s.....|
+00000010  bf 17 bf 52 3e b4 98 39  43 c0 0a                 |...R>..9C..|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 4c ff 21  fb 5d ef 36 28 6f f8 7b  |.....L.!.].6(o.{|
-00000010  c0 08 b6 1b e3 17 c3 6e  49                       |.......nI|
+00000000  16 03 03 00 14 cf 01 f5  e6 eb 60 e3 49 c4 fb 84  |..........`.I...|
+00000010  e1 11 69 e1 91 c0 02 d2  e3                       |..i......|
 >>> Flow 7 (client to server)
-00000000  15 03 03 00 12 ab 44 a2  47 b2 14 a3 5f 40 1b 56  |......D.G..._@.V|
-00000010  d0 f0 3f ea 95 cf aa 15  03 03 00 12 28 1b e3 5f  |..?.........(.._|
-00000020  8c c4 87 b4 d6 28 2f c9  93 30 66 7a 35 ce        |.....(/..0fz5.|
+00000000  15 03 03 00 12 4d 7f de  01 23 f7 3f 0d e6 1a f1  |.....M...#.?....|
+00000010  19 a2 cd 58 1a 25 f5 15  03 03 00 12 95 78 52 00  |...X.%.......xR.|
+00000020  65 aa 6d 77 5a 66 d5 95  c4 5a 9b 1b 05 b2        |e.mwZf...Z....|
index f817ea594fec6de20cd3f9bfb42351de41b01ea0..d12e263e15350afdac415e4d33d1b0246df3548d 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 01 c6 02 00 01  c2 03 03 cb c8 2f af ab  |............./..|
-00000010  d1 5b 34 64 8e 3f b3 6e  b7 bf 0b e8 15 0f c3 97  |.[4d.?.n........|
-00000020  a1 99 64 45 ac 8f 2a 60  9c 03 a3 20 41 c5 a1 11  |..dE..*`... A...|
-00000030  79 cd 6b 70 27 1f 0f e8  59 ac d3 d7 ae ae 1e d4  |y.kp'...Y.......|
-00000040  e2 74 81 43 26 b1 37 d1  14 87 a6 20 cc a8 00 01  |.t.C&.7.... ....|
+00000000  16 03 03 01 c6 02 00 01  c2 03 03 d8 a9 75 cc 9a  |.............u..|
+00000010  81 df 5a a0 3b ba 51 74  52 50 72 08 35 02 35 77  |..Z.;.QtRPr.5.5w|
+00000020  28 ff 44 e6 d9 c6 8b f8  54 67 b4 20 62 80 60 cc  |(.D.....Tg. b.`.|
+00000030  09 90 52 66 75 72 a2 c5  dc 8d 18 ce 9a d5 7e cd  |..Rfur........~.|
+00000040  a5 36 2a 2e 65 72 6f f0  dd b0 8c 14 cc a8 00 01  |.6*.ero.........|
 00000050  7a 00 12 01 69 01 67 00  75 00 a4 b9 09 90 b4 18  |z...i.g.u.......|
 00000060  58 14 87 bb 13 a2 cc 67  70 0a 3c 35 98 04 f9 1b  |X......gp.<5....|
 00000070  df b8 e3 77 cd 0e c8 0d  dc 10 00 00 01 47 97 99  |...w.........G..|
 00000400  1c f1 0f a1 d8 40 83 61  c9 4c 72 2b 9d ae db 46  |.....@.a.Lr+...F|
 00000410  06 06 4d f4 c1 b3 3e c0  d1 bd 42 d4 db fe 3d 13  |..M...>...B...=.|
 00000420  60 84 5c 21 d3 3b e9 fa  e7 16 03 03 00 ac 0c 00  |`.\!.;..........|
-00000430  00 a8 03 00 1d 20 c5 a7  0f f6 d3 e0 dd fe c0 6f  |..... .........o|
-00000440  b9 d5 82 34 0f 6d e9 5c  e2 38 3e 23 83 17 07 f8  |...4.m.\.8>#....|
-00000450  00 1c 5e e6 6b 40 08 04  00 80 93 f8 75 72 dc 74  |..^.k@......ur.t|
-00000460  68 62 98 55 f6 64 81 d1  03 9f f8 8c 17 77 d3 a6  |hb.U.d.......w..|
-00000470  f9 3e 41 b8 f7 73 e6 c7  83 21 3b e8 72 cf 5f 08  |.>A..s...!;.r._.|
-00000480  84 51 cf e5 f6 b0 f2 83  d9 cf b9 fc d7 3c 0d 39  |.Q...........<.9|
-00000490  a2 14 ae 78 07 24 25 95  13 90 71 f9 ac 0f 64 c7  |...x.$%...q...d.|
-000004a0  e9 15 35 37 83 02 10 38  be c1 d1 00 3d 4b f2 36  |..57...8....=K.6|
-000004b0  f6 7f ac 3e b2 ef 51 eb  df d6 8b 92 a6 8e 71 17  |...>..Q.......q.|
-000004c0  63 bd 6a 92 15 b7 b1 2d  0a 4c 58 68 65 23 ff ad  |c.j....-.LXhe#..|
-000004d0  59 03 85 9c a2 cf 02 3b  70 d4 16 03 03 00 04 0e  |Y......;p.......|
+00000430  00 a8 03 00 1d 20 cd 2a  10 ee 97 4a 83 7b 0e 6d  |..... .*...J.{.m|
+00000440  e7 00 5a ce bc d8 1c 57  fa f6 ec 52 0d 0f be 6d  |..Z....W...R...m|
+00000450  c8 5d 27 3c 8c 1b 08 04  00 80 a9 4c bb 3a 0a d7  |.]'<.......L.:..|
+00000460  db 72 3d 88 49 a6 0b f7  dc d5 e1 d0 07 e8 6c fa  |.r=.I.........l.|
+00000470  b0 5e 0b 13 27 29 6f 1f  1e b9 05 60 16 cc ea 7b  |.^..')o....`...{|
+00000480  46 d7 12 58 03 43 b0 fe  8e 7b 83 3b ee 11 78 8c  |F..X.C...{.;..x.|
+00000490  60 0f 9c 76 63 60 01 78  a0 9b 19 b9 32 99 a9 9d  |`..vc`.x....2...|
+000004a0  42 b8 1f f1 8b 87 07 32  fa 5e 74 d5 3e 5e ba 21  |B......2.^t.>^.!|
+000004b0  ff 63 b7 c6 68 bc b3 f9  52 1a ea 23 c7 f2 ec ff  |.c..h...R..#....|
+000004c0  d4 10 0d f8 76 2f bc 0d  e5 12 7f ee d3 8d 9e 6b  |....v/.........k|
+000004d0  5e 22 78 d6 fa 5e 6a 53  16 44 16 03 03 00 04 0e  |^"x..^jS.D......|
 000004e0  00 00 00                                          |...|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 62 1f 1a  94 94 88 9c 0c 3c ab d1  |.... b.......<..|
-00000040  32 32 9f 8d be 28 a8 86  43 e6 53 d3 c4 bf 13 84  |22...(..C.S.....|
-00000050  50 7f 30 84 e1                                    |P.0..|
+00000030  16 03 03 00 20 5c 1a 1b  0e 7e 83 4f 9b f6 8e 9f  |.... \...~.O....|
+00000040  ca 95 86 c3 7b 60 73 d3  8d 3c 6d 18 6a eb 70 a3  |....{`s..<m.j.p.|
+00000050  d9 08 f7 77 a3                                    |...w.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 bf 16 ab 1a 98  |.......... .....|
-00000010  d0 c1 95 b7 fe c2 45 fd  01 79 6b 8a 13 80 e4 96  |......E..yk.....|
-00000020  64 15 1b 6e 31 12 19 1d  6f ba b0                 |d..n1...o..|
+00000000  14 03 03 00 01 01 16 03  03 00 20 1f a2 50 dd c5  |.......... ..P..|
+00000010  ba 96 4a 63 e1 cc b6 45  77 09 c1 49 cb 5f eb 4b  |..Jc...Ew..I._.K|
+00000020  38 9b b1 40 1c af b1 a2  dc 7c ba                 |8..@.....|.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 a4 27 40  7a 6a 54 03 b6 ec 5f 4a  |......'@zjT..._J|
-00000010  56 a5 6e cb cc 4c 49 2e  08 29 37 15 03 03 00 12  |V.n..LI..)7.....|
-00000020  88 20 fe 73 46 06 a7 f0  31 1a d9 89 7a fe a8 28  |. .sF...1...z..(|
-00000030  d6 e8                                             |..|
+00000000  17 03 03 00 16 e7 54 f6  bf 56 39 57 c4 b2 ac f2  |......T..V9W....|
+00000010  b1 f4 b1 2f ad ae d7 87  21 ff 1c 15 03 03 00 12  |.../....!.......|
+00000020  5d b6 56 77 55 99 b6 7b  a4 0b d8 8e 8d 93 b6 35  |].VwU..{.......5|
+00000030  ce 9a                                             |..|
index 178106f0dff3d14b28c8a5988b953ff381bda639..d58a32f2b3732c7a0c7ad0d8a6954c12472f6955 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f2 01 00 00  ee 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 f4 01 00 00  f0 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,20 +7,20 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 73 00 05 00 05  01 00 00 00 00 00 0a 00  |...s............|
-00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 18 00  |................|
-000000a0  16 08 04 08 05 08 06 04  01 04 03 05 01 05 03 06  |................|
-000000b0  01 06 03 02 01 02 03 ff  01 00 01 00 00 12 00 00  |................|
-000000c0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
-000000d0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
-000000e0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000000f0  90 99 5f 58 cb 3b 74                              |.._X.;t|
+00000080  01 00 00 75 00 05 00 05  01 00 00 00 00 00 0a 00  |...u............|
+00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
+000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
+000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000d0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
+000000e0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
+000000f0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 14 f0 64 fb 80  |....Y...U....d..|
-00000010  40 49 f6 48 a5 65 9d e1  2e 37 c3 f7 b9 27 fe 6b  |@I.H.e...7...'.k|
-00000020  de 49 93 da 97 0d 59 c5  a8 5d 42 20 f9 10 79 a2  |.I....Y..]B ..y.|
-00000030  e6 33 e8 eb 6c 7d 3b 1d  e2 e9 3e df 5f 5a 40 d5  |.3..l};...>._Z@.|
-00000040  a2 0d c7 35 f2 db a1 e0  1f 90 bb 6b c0 2f 00 00  |...5.......k./..|
+00000000  16 03 03 00 59 02 00 00  55 03 03 e0 c7 ce be 3a  |....Y...U......:|
+00000010  a6 34 5f b7 c5 ec f1 f3  09 df 4d db 39 60 71 93  |.4_.......M.9`q.|
+00000020  db 7c 30 e0 81 93 f0 19  57 6b 6b 20 9e 4b e2 1e  |.|0.....Wkk .K..|
+00000030  27 8d d3 f6 0c f3 3d bc  67 3e 79 33 fd c9 cc 55  |'.....=.g>y3...U|
+00000040  36 55 a5 aa 89 94 fe b2  51 cf 24 56 c0 2f 00 00  |6U......Q.$V./..|
 00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
 00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
 00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
 00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
 000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
 000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 45 79 ac ef 3b d5 3e  |........ Ey..;.>|
-000002d0  81 e1 7d 8a 9e 94 b3 d8  15 49 3c 2a 71 0a 31 74  |..}......I<*q.1t|
-000002e0  2b 7a cc f7 5d 2d 72 d5  60 08 04 00 80 d1 63 69  |+z..]-r.`.....ci|
-000002f0  e9 5f 99 c1 43 18 29 04  39 f2 ec 2b d8 dc e6 59  |._..C.).9..+...Y|
-00000300  80 ff 27 f9 96 39 de 2c  26 9c f0 15 39 fa 42 ba  |..'..9.,&...9.B.|
-00000310  80 d8 1b f6 64 07 e4 2e  b3 1e ce 20 51 59 82 97  |....d...... QY..|
-00000320  a1 2f d5 3f 18 05 12 12  1e aa cf 29 93 34 89 18  |./.?.......).4..|
-00000330  0b 19 e0 30 21 5f ce c2  75 58 a1 aa 98 44 cb c0  |...0!_..uX...D..|
-00000340  08 db 6e c5 95 9c a7 f5  a2 30 c7 9d 9d 31 1d a1  |..n......0...1..|
-00000350  b8 3f 05 b8 13 b6 89 a8  3c 78 fe ae e5 6f 2a 91  |.?......<x...o*.|
-00000360  35 14 95 c5 89 4c 1e 68  2d 18 9b 36 81 16 03 03  |5....L.h-..6....|
+000002c0  ac 0c 00 00 a8 03 00 1d  20 9b 73 58 2f 9a aa 8b  |........ .sX/...|
+000002d0  3e 80 1c b1 8e e5 d4 54  c2 d0 b1 94 16 86 e2 4b  |>......T.......K|
+000002e0  9c ab d7 ce 2c e5 26 20  04 08 04 00 80 d8 c0 18  |....,.& ........|
+000002f0  90 8e 06 d8 d6 4c af a1  ae 5e ca 4b a1 18 bb 31  |.....L...^.K...1|
+00000300  f5 3a 75 c3 d7 73 69 a7  e0 0f 8e f2 c5 92 0a bd  |.:u..si.........|
+00000310  7f 91 36 6c 01 c3 eb 08  9a 3b 25 2c bd 86 88 05  |..6l.....;%,....|
+00000320  64 e0 38 5b 75 01 10 1f  1b d5 34 09 04 2e 34 6d  |d.8[u.....4...4m|
+00000330  71 d2 6c b6 f3 7a 1e ed  a9 9d 28 60 13 fc 02 6f  |q.l..z....(`...o|
+00000340  f6 17 99 52 7b 19 60 e5  a6 11 d4 b3 4c 52 03 b5  |...R{.`.....LR..|
+00000350  3e 28 91 c6 66 87 25 df  10 c6 cf b9 5f 92 0e d7  |>(..f.%....._...|
+00000360  b6 19 f0 19 b9 f6 e9 e9  24 74 35 3b c6 16 03 03  |........$t5;....|
 00000370  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 b5 c1 dc  |....(...........|
-00000040  8e c0 bc 78 74 a7 c6 36  23 67 55 5d bc 82 db 77  |...xt..6#gU]...w|
-00000050  85 d8 76 c8 98 65 63 8e  f2 47 0b 5b 10           |..v..ec..G.[.|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 01 e4 5a  |....(..........Z|
+00000040  e9 dc dd 98 cd 5f d2 d2  eb 84 12 c9 96 ca 91 d7  |....._..........|
+00000050  ae f4 db 44 a4 37 f3 a3  b2 8d db ed 3d           |...D.7......=|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 6e 20 eb fc d1  |..........(n ...|
-00000010  a1 0e 6c a5 d9 6c ab fc  4d 0e f3 f0 61 84 2d 14  |..l..l..M...a.-.|
-00000020  06 53 eb 69 18 b3 e3 f1  32 e8 19 00 5e 74 97 e5  |.S.i....2...^t..|
-00000030  98 a7 8a                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 c2 2d 32 ba 46  |..........(.-2.F|
+00000010  27 8d 87 13 7f b9 49 04  64 2f 6e cc 32 81 f8 3c  |'.....I.d/n.2..<|
+00000020  7f 0f 19 13 5c 11 33 a1  05 5f 91 bc 97 30 64 84  |....\.3.._...0d.|
+00000030  57 69 90                                          |Wi.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 32 91 ac  |.............2..|
-00000010  63 b8 71 f1 26 18 ac 15  45 58 6c 60 18 77 bc 5c  |c.q.&...EXl`.w.\|
-00000020  ff 5b cd 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.[..............|
-00000030  ad 89 71 22 f0 e0 61 3e  2b f7 d9 da 96 34 51 72  |..q"..a>+....4Qr|
-00000040  c9 be                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 fd 0f a5  |................|
+00000010  74 98 c4 98 ee 67 74 d4  c1 d4 fe d3 c7 e2 1b 2c  |t....gt........,|
+00000020  e5 3c be 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.<..............|
+00000030  f8 d4 60 41 13 6a 9c e3  0e 56 e2 ab 96 45 7e 06  |..`A.j...V...E~.|
+00000040  87 63                                             |.c|
index c35db9e681f363d79d59e3ca697afca9a6188f73..4273484ca710c86b4c1f5ddb809571af9fccb360 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,84 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 e6 6e e6 44 9a  |....z...v...n.D.|
-00000010  c9 e2 51 58 ac ba 02 48  ea 6f dd 09 7a 08 04 d2  |..QX...H.o..z...|
-00000020  df b6 96 2f 31 d4 6b bf  ab 0e 8e 20 00 00 00 00  |.../1.k.... ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 f7 30 f3 d1 e7  |....z...v...0...|
+00000010  eb 94 97 a2 c6 d5 be 74  e0 6c 08 80 2f ad 11 6b  |.......t.l../..k|
+00000020  b3 ce 22 59 06 a9 eb 41  9c 97 a8 20 00 00 00 00  |.."Y...A... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 98  |..+.....3.$... .|
-00000060  b2 16 47 4d 82 da 23 5b  2a a4 63 29 11 a8 d4 c0  |..GM..#[*.c)....|
-00000070  0b 5e 2d 73 0d d6 e7 1e  15 78 1a c2 58 93 70 14  |.^-s.....x..X.p.|
-00000080  03 03 00 01 01 17 03 03  00 17 c3 65 82 87 0c 61  |...........e...a|
-00000090  57 28 08 d5 da fc 59 8d  a3 76 49 0f d5 80 68 3d  |W(....Y..vI...h=|
-000000a0  03 17 03 03 02 6d c5 f1  b7 8a 61 03 06 9e 0f 3b  |.....m....a....;|
-000000b0  be 71 5b 29 17 c7 ed 0e  23 40 90 c6 7a 22 4e ad  |.q[)....#@..z"N.|
-000000c0  d5 f1 60 f6 db d9 37 73  1f b6 43 f7 7b fe 7b aa  |..`...7s..C.{.{.|
-000000d0  f7 16 28 e5 a8 b6 be 69  da 79 09 b5 dc ab bf d3  |..(....i.y......|
-000000e0  36 ca 19 ae 8c de 27 5c  0d 44 5e 4a e2 ac ff bc  |6.....'\.D^J....|
-000000f0  33 4e 35 d3 8d 21 22 4d  12 38 e2 f9 73 3b 3d d1  |3N5..!"M.8..s;=.|
-00000100  a7 b1 06 6a 6a 8d 25 0f  47 b1 d1 f2 da 32 cc 58  |...jj.%.G....2.X|
-00000110  9e 78 b6 b4 4e c1 bc 9d  91 38 44 ff 35 71 a7 c3  |.x..N....8D.5q..|
-00000120  39 67 5b 50 b1 9b 87 5d  fd 6d 87 42 25 10 1a 19  |9g[P...].m.B%...|
-00000130  e1 95 19 2f a1 2c 95 6e  ce 6c c9 d9 92 1d e6 7f  |.../.,.n.l......|
-00000140  9d d0 98 60 f3 6c cf 64  8e 66 bb a4 af de 1e b6  |...`.l.d.f......|
-00000150  6a 6d 7b 11 a7 ca e1 29  49 f3 57 50 73 e8 36 79  |jm{....)I.WPs.6y|
-00000160  81 fe 33 f7 04 1a 04 e3  60 8e e7 11 fa 07 bb 79  |..3.....`......y|
-00000170  73 c0 b7 5e 0f 61 b7 3a  50 85 a4 e1 8e 3b a3 43  |s..^.a.:P....;.C|
-00000180  79 8a 14 78 0a ff 66 b4  c3 c0 fe 0a 6a c6 66 72  |y..x..f.....j.fr|
-00000190  a8 8a e1 9c a6 ad ee 74  53 d9 b8 07 17 b3 9b f6  |.......tS.......|
-000001a0  eb 28 1b 64 97 aa 17 fa  80 36 cb b1 35 6e ec e1  |.(.d.....6..5n..|
-000001b0  16 1f ba 00 0c 26 fb 17  0e 00 8a e3 28 0d 6a 76  |.....&......(.jv|
-000001c0  8c 78 ee 55 02 78 66 90  5b 87 f2 16 e2 af ef fb  |.x.U.xf.[.......|
-000001d0  a1 f3 8f fd b9 8e e3 16  68 7a ec c0 54 2f 88 c4  |........hz..T/..|
-000001e0  08 6c 55 48 58 56 ac 3e  26 5b 67 42 18 72 6e a1  |.lUHXV.>&[gB.rn.|
-000001f0  b5 86 cf 55 d1 29 c5 9b  2c 7b 7d f3 a5 26 2e 5e  |...U.)..,{}..&.^|
-00000200  21 3a 40 97 5a c1 c8 13  3d c3 12 4e d8 88 e1 8f  |!:@.Z...=..N....|
-00000210  e8 c5 d3 9b 0f 49 24 42  da 27 ac e5 5e 21 2e 2c  |.....I$B.'..^!.,|
-00000220  8b 27 ae c4 39 49 6f 43  69 a3 e4 0d f1 fc 62 9f  |.'..9IoCi.....b.|
-00000230  be 65 78 01 d8 c8 4e 0f  b5 d7 12 d1 fc 73 cc 6e  |.ex...N......s.n|
-00000240  cc df d3 df 33 e4 f8 8e  4f 82 60 cd 1f a1 71 74  |....3...O.`...qt|
-00000250  20 7a e2 46 fc 7a 83 15  dc 6c 5d b3 4f 92 de a2  | z.F.z...l].O...|
-00000260  99 b5 33 4e b0 5d 19 0f  84 ae de 65 2e ee ef 40  |..3N.].....e...@|
-00000270  e9 5b c6 53 86 0d 88 fc  2a b2 2c 5c 76 66 95 a7  |.[.S....*.,\vf..|
-00000280  96 ad 7f ba 27 ea e4 54  5e 77 97 0d 6f 9e b8 e5  |....'..T^w..o...|
-00000290  b7 2f 75 13 42 7e 61 08  e3 69 31 d4 e6 d0 c0 6d  |./u.B~a..i1....m|
-000002a0  e3 e2 e4 69 5d d0 7d c2  f1 48 a1 e0 23 f1 19 81  |...i].}..H..#...|
-000002b0  23 ed a7 ac ed 88 70 60  c6 eb cf 11 23 39 cb 91  |#.....p`....#9..|
-000002c0  35 3b 32 6c 20 fc 61 cb  49 77 9c d9 5d e2 b4 41  |5;2l .a.Iw..]..A|
-000002d0  b9 c6 22 af 36 e4 a4 c4  45 47 f4 53 3f 7f b4 25  |..".6...EG.S?..%|
-000002e0  a0 34 f4 40 42 04 17 63  3b fa 05 35 c3 76 ec f7  |.4.@B..c;..5.v..|
-000002f0  b3 ee 62 fb 03 dc 06 22  90 4b fd 07 62 3b cd 27  |..b....".K..b;.'|
-00000300  da 87 32 73 3d 46 5c e7  b6 22 f7 02 8e 43 f4 46  |..2s=F\.."...C.F|
-00000310  79 cb 9b 17 03 03 00 99  81 e1 c1 b3 1d 11 4b 61  |y.............Ka|
-00000320  6a 4a f2 9a 97 52 36 2a  fc ef 77 54 aa 28 a7 4f  |jJ...R6*..wT.(.O|
-00000330  46 c5 69 2a a7 d7 da d6  ff 28 b1 21 3b 66 ac a7  |F.i*.....(.!;f..|
-00000340  ff 66 0a 10 20 1d 24 9b  f3 46 1a a7 04 4b b5 3d  |.f.. .$..F...K.=|
-00000350  e8 49 fc 3a f0 74 a8 02  b9 2d 5d e4 de 91 ef 4d  |.I.:.t...-]....M|
-00000360  ab 47 10 2c ba 70 c1 aa  a9 79 a8 96 27 71 90 e3  |.G.,.p...y..'q..|
-00000370  91 4d 4e dd 96 e0 4c ad  c5 0b 44 0a c0 4d 17 42  |.MN...L...D..M.B|
-00000380  65 12 8a ba fb 7c 66 7c  92 61 87 07 cd e3 a0 16  |e....|f|.a......|
-00000390  8b 94 23 77 85 70 88 d2  22 64 14 16 b5 ab db 6a  |..#w.p.."d.....j|
-000003a0  b9 23 26 ee c8 33 6e 9b  a6 e4 d1 85 d2 81 3a 5d  |.#&..3n.......:]|
-000003b0  33 17 03 03 00 35 b2 85  a7 fd fc 27 46 25 8f cd  |3....5.....'F%..|
-000003c0  ac ff 84 0a 54 cf f2 11  94 41 d0 7e 04 50 61 7d  |....T....A.~.Pa}|
-000003d0  71 40 df bc 48 0f c1 32  50 83 5c 05 c9 a5 02 95  |q@..H..2P.\.....|
-000003e0  77 04 8c 76 ee 44 32 44  94 e3 8b                 |w..v.D2D...|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 c0  |..+.....3.$... .|
+00000060  47 7e ad a1 41 53 e5 25  ec 74 46 bc 9e 80 08 3b  |G~..AS.%.tF....;|
+00000070  0b f5 7e fb 71 1f 00 d5  4b 27 51 22 4a 5e 5f 14  |..~.q...K'Q"J^_.|
+00000080  03 03 00 01 01 17 03 03  00 17 e9 e8 56 00 26 9e  |............V.&.|
+00000090  92 60 84 6c 07 3d b1 ef  e4 63 51 ba 48 ee d7 fe  |.`.l.=...cQ.H...|
+000000a0  57 17 03 03 02 6d 2e d4  bb bf a2 e8 3b 84 47 2e  |W....m......;.G.|
+000000b0  22 66 c1 98 ea 11 6b a3  4d 1b 64 c0 02 32 76 9b  |"f....k.M.d..2v.|
+000000c0  29 8a 4a 96 68 5b d1 fd  a0 0f a6 9b 70 20 c7 08  |).J.h[......p ..|
+000000d0  7b 25 07 d1 54 8c b1 bb  4e ba 32 65 2c 1e 16 29  |{%..T...N.2e,..)|
+000000e0  e7 d2 df e3 84 60 e1 43  07 99 35 4d 95 7c 27 96  |.....`.C..5M.|'.|
+000000f0  be f4 bf 0a e9 3b 9d 60  7a 6e 34 82 1f 03 ca 17  |.....;.`zn4.....|
+00000100  ac d1 a1 b5 dc 3f 20 7b  42 f6 94 43 60 ff 3f 1b  |.....? {B..C`.?.|
+00000110  b1 2e 2d 71 55 07 fb 65  40 56 59 82 1e 31 83 c9  |..-qU..e@VY..1..|
+00000120  35 6c 28 ad c1 bd 88 55  1b b6 1e 89 af 64 7f 11  |5l(....U.....d..|
+00000130  53 80 3a 62 ef 34 a7 d0  ce 38 9b 19 d6 5f 78 0d  |S.:b.4...8..._x.|
+00000140  66 73 b2 bd b6 a6 f8 70  c8 40 f9 aa a2 86 f4 48  |fs.....p.@.....H|
+00000150  0d 6c 54 67 c6 3c 91 97  ff 94 4d 9a 01 d5 e1 c9  |.lTg.<....M.....|
+00000160  8f 27 d3 8d b3 72 cd 34  eb 7a 6d 48 84 f3 8b 84  |.'...r.4.zmH....|
+00000170  34 d2 68 bd 26 bc 6d e5  46 41 cc 86 d4 7a b6 31  |4.h.&.m.FA...z.1|
+00000180  05 b3 bc a4 fe e1 5c d4  eb 8b fe 64 0e be 89 c4  |......\....d....|
+00000190  ce e0 49 a0 ba 7a 83 b6  fb 31 17 42 fd b4 e3 59  |..I..z...1.B...Y|
+000001a0  48 df f6 a8 e4 5c d1 77  77 cb c2 31 85 8a 26 65  |H....\.ww..1..&e|
+000001b0  20 fa 05 90 ae 66 95 7a  75 4b bc 93 15 dd a0 13  | ....f.zuK......|
+000001c0  61 d5 99 fb b2 27 bd ec  fd 10 b5 d2 c7 18 ac b9  |a....'..........|
+000001d0  bd bc 35 72 d0 42 6c f7  5a e0 67 46 45 10 f7 50  |..5r.Bl.Z.gFE..P|
+000001e0  e4 14 47 ac 39 5a 05 38  b9 25 4a 43 fa 57 b2 51  |..G.9Z.8.%JC.W.Q|
+000001f0  b7 3e f7 ef d5 b5 de 2e  2f 5c d0 d7 00 23 ac 4b  |.>....../\...#.K|
+00000200  65 8d 6c f4 ab 6f ef 1e  c2 66 c5 b2 cb 1a 51 4c  |e.l..o...f....QL|
+00000210  ef 96 8f 28 65 2f 50 9c  91 1f 73 87 fc 81 db 90  |...(e/P...s.....|
+00000220  16 69 00 06 98 6b 00 33  41 e1 e6 12 89 cb c9 f3  |.i...k.3A.......|
+00000230  23 2c 28 83 00 ca 4f 42  f5 26 bc 94 39 3b 18 31  |#,(...OB.&..9;.1|
+00000240  41 a9 19 4a 60 e8 de 8f  1d d0 e8 96 77 c0 49 bd  |A..J`.......w.I.|
+00000250  a2 98 bd b1 0a 6f bd 27  79 1d c4 33 50 37 a8 eb  |.....o.'y..3P7..|
+00000260  a5 4e 59 87 58 cd f0 a0  34 4e 2b 9d ee 03 e4 8a  |.NY.X...4N+.....|
+00000270  24 94 86 11 e1 94 f0 2b  3e 27 9a 92 1c 17 d3 96  |$......+>'......|
+00000280  c0 71 ab ee 75 5f 99 ca  0e 42 65 5d ed 48 0c 7a  |.q..u_...Be].H.z|
+00000290  95 8a d9 da f7 60 ee de  46 f2 f4 7a d6 ce 38 41  |.....`..F..z..8A|
+000002a0  fa e8 1f 3e 77 be 02 53  0c 33 96 5b 0d 38 bb 08  |...>w..S.3.[.8..|
+000002b0  5e 92 1a 81 f1 be c7 9a  e2 02 80 09 3b b7 62 b0  |^...........;.b.|
+000002c0  7c a7 85 3a d9 52 34 23  4f a3 04 e7 35 98 9e 18  ||..:.R4#O...5...|
+000002d0  13 0b 71 12 6d a4 2e 11  bf 39 8c 94 ef 15 96 27  |..q.m....9.....'|
+000002e0  9e be 81 d9 55 5a 8b 14  c5 49 dd 6e 6e 7b 6b c2  |....UZ...I.nn{k.|
+000002f0  f3 7d ef 24 88 b9 eb a6  15 3e aa a8 3e eb 37 54  |.}.$.....>..>.7T|
+00000300  fc 86 9f 51 30 5f 9c a5  fc 7a af f6 1b a5 a4 27  |...Q0_...z.....'|
+00000310  51 78 f7 17 03 03 00 99  79 14 63 10 91 cd 73 f5  |Qx......y.c...s.|
+00000320  a8 62 c3 92 a3 04 c2 3d  58 5e d3 6e 93 eb 9b b1  |.b.....=X^.n....|
+00000330  11 f0 3c c6 96 9f c6 c8  9b de 2c d5 12 c2 bd d1  |..<.......,.....|
+00000340  2a 68 89 4a 07 1e 23 d2  45 ca a1 0f 92 71 b7 f7  |*h.J..#.E....q..|
+00000350  d0 2f 2a be d0 5e 0c 5d  13 8f b0 7f df b8 52 2e  |./*..^.]......R.|
+00000360  7a 5e c8 eb 84 06 46 81  d0 f7 09 18 52 fb ce fd  |z^....F.....R...|
+00000370  22 d8 74 71 e8 7d 41 5f  3a 5d e5 f9 bb e6 99 03  |".tq.}A_:]......|
+00000380  32 d1 58 e8 5a 58 d8 b2  39 61 01 33 72 7d d2 11  |2.X.ZX..9a.3r}..|
+00000390  8f f7 58 55 c8 f2 64 63  33 9b 78 36 bf 9b 8b 40  |..XU..dc3.x6...@|
+000003a0  8c ec 7b a2 bb 51 ed b1  fe 74 c2 c9 1f b4 2b cb  |..{..Q...t....+.|
+000003b0  fd 17 03 03 00 35 75 46  88 74 06 9b 5e 88 c2 0d  |.....5uF.t..^...|
+000003c0  fc 7d 29 bd 6c 1c 23 2f  06 3f 14 b1 55 e4 98 b1  |.}).l.#/.?..U...|
+000003d0  ed c3 9a ed ea be 29 60  15 ac 80 c7 a8 f7 9b ce  |......)`........|
+000003e0  f3 79 b3 be ad ff ab b4  a7 45 57                 |.y.......EW|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 11 f3 e0 d9 39  |..........5....9|
-00000010  43 24 33 e1 54 01 5d f2  c7 50 21 9f db 2d 31 81  |C$3.T.]..P!..-1.|
-00000020  3f d5 9c cb 59 cb 24 40  2a 77 da 0a 9e 52 12 11  |?...Y.$@*w...R..|
-00000030  1e a8 f8 e2 f2 9e 32 6c  06 8c 48 e8 bf 9d ef 0f  |......2l..H.....|
-00000040  17 03 03 00 17 bc a1 a2  8a a1 6c c3 19 d1 49 7f  |..........l...I.|
-00000050  57 af 58 5b ff 7b 11 b2  bb 45 3c 6f 17 03 03 00  |W.X[.{...E<o....|
-00000060  13 54 2f ac 2b 0f 9d de  27 bc f6 90 e5 ef f3 fd  |.T/.+...'.......|
-00000070  f7 cd 07 f9                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 35 b5 22 19 23 49  |..........5.".#I|
+00000010  48 33 a5 f3 b2 72 2b 31  ab 89 27 f9 eb 1b b7 b1  |H3...r+1..'.....|
+00000020  bc 2b 99 9e 73 24 42 c4  2a 68 2c 76 e1 45 61 09  |.+..s$B.*h,v.Ea.|
+00000030  18 c7 44 45 9a 05 86 4c  90 c1 41 c6 fd 6a c2 95  |..DE...L..A..j..|
+00000040  17 03 03 00 17 ee 18 4e  d9 94 15 50 a9 99 4a 82  |.......N...P..J.|
+00000050  10 13 26 7b 74 10 db ef  fe b8 96 f6 17 03 03 00  |..&{t...........|
+00000060  13 2a 4c 52 8d c3 c5 af  d0 cd 5a 7d 0d a5 59 90  |.*LR......Z}..Y.|
+00000070  ce 59 3b af                                       |.Y;.|
index 723a9e92d711ef910f63bd8c8c3b9b3a362ddb63..7fecc79add77fbb112bcbf6c33e04341cf6d6d60 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,86 +7,86 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 fa ff 71 26 f0  |....z...v....q&.|
-00000010  2c ee 80 2c 1c f9 ea 4b  de ad d0 61 83 7f 89 6f  |,..,...K...a...o|
-00000020  db e6 a9 53 ff c5 b5 ec  04 08 4c 20 00 00 00 00  |...S......L ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 dd df 8d 85 da  |....z...v.......|
+00000010  3c 99 a3 0c 01 90 5f ec  b8 3d 28 ce e4 32 c0 e8  |<....._..=(..2..|
+00000020  fe 77 03 ad 0f e1 33 1f  dc 89 cb 20 00 00 00 00  |.w....3.... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 02 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 6f  |..+.....3.$... o|
-00000060  2a 3a fe 8e dc cf 2e 7d  26 bd 12 fb da 0a 00 16  |*:.....}&.......|
-00000070  b7 12 79 72 a0 a8 95 11  81 d5 b3 ae f8 d7 26 14  |..yr..........&.|
-00000080  03 03 00 01 01 17 03 03  00 17 42 95 95 65 84 db  |..........B..e..|
-00000090  3e dc c4 41 bb e2 21 94  27 2d 9e 27 4e dd 3e 9d  |>..A..!.'-.'N.>.|
-000000a0  6e 17 03 03 02 6d 71 24  bb 82 cf aa 37 52 4c 15  |n....mq$....7RL.|
-000000b0  6d 5c 74 44 c5 08 21 31  ab 47 5a 75 b9 31 d6 97  |m\tD..!1.GZu.1..|
-000000c0  69 64 40 b5 09 1c 2b 36  1d 54 19 52 4b ad c9 1c  |id@...+6.T.RK...|
-000000d0  d4 51 33 80 a4 b9 df 47  17 6a eb 7a d7 bc 12 3e  |.Q3....G.j.z...>|
-000000e0  7b 28 fa 15 16 aa 23 6f  b5 5f a4 f6 8e 2b 00 11  |{(....#o._...+..|
-000000f0  1b f2 00 e4 c8 31 38 ee  61 71 bc 7f dd a1 45 2d  |.....18.aq....E-|
-00000100  ac 1c 2b fd cd 40 51 29  4e 07 fd f4 04 45 09 56  |..+..@Q)N....E.V|
-00000110  72 c8 83 22 3e 20 06 3a  93 16 89 21 4a 9f 3b bc  |r.."> .:...!J.;.|
-00000120  63 7f c0 1b 6a b2 30 d1  49 43 90 08 af 28 4a c1  |c...j.0.IC...(J.|
-00000130  79 96 a1 72 0a 82 fe fb  20 1d 18 f8 b7 03 01 89  |y..r.... .......|
-00000140  05 04 d7 98 1b 77 2e ad  81 56 de 08 f1 83 1e 9c  |.....w...V......|
-00000150  7d 2b 16 e1 15 87 12 db  5f 59 5d a3 95 75 ab f8  |}+......_Y]..u..|
-00000160  54 87 91 0d 7f 80 76 6e  d8 44 f3 c5 ef d6 b4 3d  |T.....vn.D.....=|
-00000170  6e 91 4c 65 b7 94 2d 05  d1 1e e6 49 d4 78 1c 34  |n.Le..-....I.x.4|
-00000180  48 4a 5b 8c ed ad f7 cb  60 98 56 b5 98 ed 7e 88  |HJ[.....`.V...~.|
-00000190  4b 98 ec aa 7d 79 71 2c  f2 2f 15 5e c1 ed a6 14  |K...}yq,./.^....|
-000001a0  01 df 25 df 79 35 1c f0  52 85 7b 2b 46 2c 09 14  |..%.y5..R.{+F,..|
-000001b0  26 86 2c 6a d5 ec cf 24  04 49 9c d8 61 65 02 aa  |&.,j...$.I..ae..|
-000001c0  d6 ce 55 07 2f b6 23 f3  a7 8d 78 f9 72 fc 77 8b  |..U./.#...x.r.w.|
-000001d0  45 72 0e 61 c2 e8 8d 65  00 50 8b 00 42 48 d1 10  |Er.a...e.P..BH..|
-000001e0  1f 3e cc ca 21 10 4c 0b  6b fc f8 c1 b7 83 3e 25  |.>..!.L.k.....>%|
-000001f0  8e 40 11 55 32 34 83 0b  98 38 ad 2a ff e0 ae 71  |.@.U24...8.*...q|
-00000200  86 0d 9a ef 50 e8 8a 32  53 ba c8 71 4e 96 46 95  |....P..2S..qN.F.|
-00000210  c2 31 b5 64 6c 74 8e b6  be 8c e7 bd 5c 79 fd 87  |.1.dlt......\y..|
-00000220  db 7e 39 82 7c 7b 38 58  42 34 a1 64 e9 15 f8 f3  |.~9.|{8XB4.d....|
-00000230  56 2c ec c9 4f f3 4d e0  3d a6 ec 87 5f 48 be 75  |V,..O.M.=..._H.u|
-00000240  d0 9e a6 6c ef 97 db a8  66 ff 8b 5e 34 28 bb 34  |...l....f..^4(.4|
-00000250  e0 9c a0 a1 18 2a f4 98  71 e7 8b 18 2c 7c 37 a9  |.....*..q...,|7.|
-00000260  c0 75 b4 24 7f ce 85 42  fe ed 7f fd 6d 7c 3d 5b  |.u.$...B....m|=[|
-00000270  bf d4 72 b9 2f 6d b6 09  86 cd 48 2f 69 a5 94 86  |..r./m....H/i...|
-00000280  ab e9 04 b7 b3 88 3b 49  6b 28 e5 8a 30 73 60 9a  |......;Ik(..0s`.|
-00000290  c9 ff c5 ff 62 0b cc 3a  ec 8b 4b a5 f2 2e c3 9d  |....b..:..K.....|
-000002a0  a1 5d 51 9d f0 2d 88 20  24 cc bf cf 79 69 aa 4d  |.]Q..-. $...yi.M|
-000002b0  f0 86 ba 9f 7c b4 f0 e3  97 54 7b f5 68 f8 da 26  |....|....T{.h..&|
-000002c0  38 a5 5c 86 c5 0a f5 06  af 58 66 e3 40 a0 33 d4  |8.\......Xf.@.3.|
-000002d0  cb 90 52 1b 81 3d 31 9d  f9 8f 4f d9 38 80 f3 ea  |..R..=1...O.8...|
-000002e0  79 c4 2c 55 3f ea 9b 79  51 24 dc 70 6e 5c 68 ce  |y.,U?..yQ$.pn\h.|
-000002f0  b0 65 58 ec 3d 62 27 f3  1c 34 b4 7c b5 8e 91 1d  |.eX.=b'..4.|....|
-00000300  dc 6b 21 b5 3d 9c 6f 30  91 f8 39 d8 11 03 65 95  |.k!.=.o0..9...e.|
-00000310  72 71 36 17 03 03 00 99  4f 82 32 b2 1c df 6d 0d  |rq6.....O.2...m.|
-00000320  c5 6f d7 89 39 07 42 4d  d5 ae 7d 0d 6f a8 68 41  |.o..9.BM..}.o.hA|
-00000330  ca 64 5c 38 5a 31 85 02  d7 99 28 ac 0d 33 1b e2  |.d\8Z1....(..3..|
-00000340  d8 f7 f2 d3 13 30 50 0f  e9 21 3c 9e 53 1c fb cd  |.....0P..!<.S...|
-00000350  96 e7 00 ef 35 5d d6 a7  64 77 fd 76 07 fa e6 e0  |....5]..dw.v....|
-00000360  04 ec cf c0 76 41 a7 12  37 e0 c3 42 43 11 54 7e  |....vA..7..BC.T~|
-00000370  4f b8 38 3a 3e 60 0f 9c  ac 65 d1 84 d3 6e b1 c2  |O.8:>`...e...n..|
-00000380  fc be a7 96 59 89 87 c7  b9 d7 09 c0 ef 68 d7 10  |....Y........h..|
-00000390  a5 08 8a 45 23 17 47 e3  eb f7 9f d3 ab 54 d1 4a  |...E#.G......T.J|
-000003a0  8c 69 1f aa a3 43 af dd  ce 76 a3 9a 6f e5 4c 6a  |.i...C...v..o.Lj|
-000003b0  07 17 03 03 00 45 b8 72  a2 fb af 1c 5e 8f ed 0a  |.....E.r....^...|
-000003c0  53 85 d3 cd 32 ad 56 ba  38 82 1c 23 40 83 7e c1  |S...2.V.8..#@.~.|
-000003d0  ce 0f 53 f5 74 a0 54 39  aa fb f1 13 8d 5f 3a 93  |..S.t.T9....._:.|
-000003e0  fc 98 72 3f e5 70 e2 e5  97 fb 92 ca 2b 52 50 96  |..r?.p......+RP.|
-000003f0  3f d0 8d 94 d5 17 2b 0d  90 4a 12                 |?.....+..J.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 03  |..+.....3.$... .|
+00000060  6b 91 90 36 f0 54 da 66  8e 47 9b 26 9f 9f ae 30  |k..6.T.f.G.&...0|
+00000070  69 9e a2 6a 70 fb ef b2  f1 76 2b 32 90 0e 63 14  |i..jp....v+2..c.|
+00000080  03 03 00 01 01 17 03 03  00 17 46 47 2e ae ea 9b  |..........FG....|
+00000090  78 7b 0c d4 74 e2 b5 bf  7b 64 da c3 d3 c9 55 7f  |x{..t...{d....U.|
+000000a0  e3 17 03 03 02 6d a8 c1  57 27 66 9d 16 f6 4f 1b  |.....m..W'f...O.|
+000000b0  17 b6 5d 8c 3c fe f5 d5  4a d3 c6 8d e2 a8 2d d0  |..].<...J.....-.|
+000000c0  01 8d db 18 e8 c8 69 74  eb 81 9e 97 20 01 60 d5  |......it.... .`.|
+000000d0  96 d1 8f 9c de 09 ff 1d  e7 45 97 97 36 fa 89 77  |.........E..6..w|
+000000e0  88 20 30 c6 5b 42 d6 0e  85 9a 11 43 60 a1 86 34  |. 0.[B.....C`..4|
+000000f0  22 47 25 23 a5 35 87 a9  74 5d fe eb c9 70 32 44  |"G%#.5..t]...p2D|
+00000100  17 60 55 99 7a 93 b5 92  8b 66 31 ce dc e0 39 f2  |.`U.z....f1...9.|
+00000110  6a b3 db 43 5d 3f ba e5  12 12 1f 0e 3c 35 3b 72  |j..C]?......<5;r|
+00000120  9f 9d 69 d5 d6 cb ac b5  9e f4 af f5 74 68 67 f4  |..i.........thg.|
+00000130  e9 5f a4 4a d7 27 5b a5  2a 39 b7 30 49 4d 64 bb  |._.J.'[.*9.0IMd.|
+00000140  5d 89 10 ff a6 2c 42 a1  4a 2a 0c 28 c6 cd 4a e8  |]....,B.J*.(..J.|
+00000150  7d 24 d0 75 ff 61 08 3f  3b 05 ec f3 d6 61 ed 43  |}$.u.a.?;....a.C|
+00000160  08 5e 07 1c f2 15 96 22  2a c0 3c 5f 04 d1 17 82  |.^....."*.<_....|
+00000170  ea ee ee c7 49 cc 3e e4  65 15 97 6e 6f 36 24 a9  |....I.>.e..no6$.|
+00000180  27 34 3a 75 dc 07 1e 4c  f1 29 d1 e3 22 31 7d 84  |'4:u...L.).."1}.|
+00000190  a8 2a 7f 37 03 ab 13 ae  15 e2 74 50 bd 54 5b 32  |.*.7......tP.T[2|
+000001a0  ea 75 10 ed 39 5c 69 90  f6 74 09 53 c1 ce 44 49  |.u..9\i..t.S..DI|
+000001b0  64 fb f2 c6 bd 93 b2 07  06 96 94 04 a5 9e ed 67  |d..............g|
+000001c0  10 cb 01 fc 85 45 d7 22  76 3c c6 2f 14 4c 31 e1  |.....E."v<./.L1.|
+000001d0  73 81 7b 8b 6b 54 d6 34  15 d2 eb d0 03 10 c7 3d  |s.{.kT.4.......=|
+000001e0  f5 07 48 cc 72 9b e9 48  ee 13 9f 80 b5 13 86 77  |..H.r..H.......w|
+000001f0  33 91 79 6f f2 13 17 68  ca 72 6b 0d 93 9a 20 30  |3.yo...h.rk... 0|
+00000200  70 c3 30 ab 13 7e 14 39  97 4b ce c5 3d 8b 03 7f  |p.0..~.9.K..=...|
+00000210  cd 4b 67 c4 c5 79 0c bb  cd ba 17 c5 d5 15 51 cb  |.Kg..y........Q.|
+00000220  ac b7 f7 19 43 ff f5 c4  09 8c 44 67 ca e6 a1 5f  |....C.....Dg..._|
+00000230  1d 27 29 63 f2 0d 75 6d  b7 62 52 c9 1d 8e 0e 3b  |.')c..um.bR....;|
+00000240  6c cb 04 3e f7 13 74 bb  03 35 2e 4e 41 9a b7 72  |l..>..t..5.NA..r|
+00000250  15 ed 02 79 c7 bc 38 b3  65 75 0a 8e 82 dc d4 79  |...y..8.eu.....y|
+00000260  1c 10 3f 78 8c be 78 b0  73 18 cc 52 1d 3b 91 66  |..?x..x.s..R.;.f|
+00000270  33 fe 63 b2 ec 19 92 44  8f 06 4e 20 85 94 5c b4  |3.c....D..N ..\.|
+00000280  ad 22 16 a0 b3 76 03 dc  62 e9 0c ac 8c e1 67 c9  |."...v..b.....g.|
+00000290  d8 6f 40 51 b5 39 9a 61  b6 63 e0 d5 60 6a 27 78  |.o@Q.9.a.c..`j'x|
+000002a0  62 ec 94 1c 75 2c 38 f2  a6 f2 f0 c4 8f 98 ad cc  |b...u,8.........|
+000002b0  2e ce 7d 13 76 f4 4f 94  78 3f 85 cf ea 52 c4 6e  |..}.v.O.x?...R.n|
+000002c0  16 65 f9 48 5e f9 0b 07  bc 3e 38 91 06 e1 b0 76  |.e.H^....>8....v|
+000002d0  82 60 25 03 36 9c 3e 5e  54 73 8d cf df 91 19 33  |.`%.6.>^Ts.....3|
+000002e0  a7 18 96 d4 86 ea 7c 00  88 e6 a3 fe ea a1 14 db  |......|.........|
+000002f0  ae da 07 ef 1e 6f 16 bb  ad fb c0 f4 60 2f 75 5c  |.....o......`/u\|
+00000300  a4 43 a0 fc 3c d6 5e 89  cf 6e 1a c6 de 61 65 34  |.C..<.^..n...ae4|
+00000310  03 e5 cd 17 03 03 00 99  0a f3 a2 45 fe 53 22 37  |...........E.S"7|
+00000320  cd 31 9d 67 31 56 f9 99  c2 d1 bc 6d 47 de 9a e7  |.1.g1V.....mG...|
+00000330  67 c0 89 84 ac bf 27 b5  32 f0 e9 a5 9d f2 e0 ad  |g.....'.2.......|
+00000340  fd 12 6a a4 5d 50 4c b9  ed f1 f4 0e c0 c0 6c c4  |..j.]PL.......l.|
+00000350  39 9b 10 02 fa 10 64 a6  8b af 9d 6e d9 40 6d 0c  |9.....d....n.@m.|
+00000360  b0 6c b8 8d d5 b0 14 f0  ed 85 d6 66 8f 6f 61 43  |.l.........f.oaC|
+00000370  49 dd 95 08 94 2e a8 a6  19 b9 7b 6b 99 09 af 4c  |I.........{k...L|
+00000380  5f 41 48 da 10 b6 cf ee  68 b6 6e 03 d7 29 93 8e  |_AH.....h.n..)..|
+00000390  1a ab d1 ad d4 bf 33 2a  53 87 92 05 d1 1a de c0  |......3*S.......|
+000003a0  aa ef b9 9c 4d 2d f6 b1  72 60 22 80 bb 46 24 75  |....M-..r`"..F$u|
+000003b0  35 17 03 03 00 45 46 9e  b3 7f d0 82 b6 ef 45 1f  |5....EF.......E.|
+000003c0  18 6d 3b b6 23 f5 c9 f4  54 e3 08 d0 8b 30 c7 31  |.m;.#...T....0.1|
+000003d0  af 98 26 69 b7 6e 08 1d  1f be 1a 7e 5b 97 91 28  |..&i.n.....~[..(|
+000003e0  fa b7 78 05 ee 3f a1 9e  a0 79 fc 45 51 4c 96 fb  |..x..?...y.EQL..|
+000003f0  03 46 24 7d fe ec a4 40  51 d6 73                 |.F$}...@Q.s|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 45 f6 a2 b0 dd 25  |..........E....%|
-00000010  6e 65 f4 c5 74 2b 60 e0  14 12 92 b3 fc 8c 18 06  |ne..t+`.........|
-00000020  fb 5d c4 de d9 41 df 39  47 b1 d0 2f 3c 4e 90 fb  |.]...A.9G../<N..|
-00000030  d3 8f 32 93 2c 7e 66 5d  a2 96 91 91 df ec a5 6f  |..2.,~f].......o|
-00000040  2e 4a 7b b4 1b 77 1e 16  76 66 c3 80 c8 d9 b0 eb  |.J{..w..vf......|
-00000050  17 03 03 00 17 8e d8 13  8e af f8 41 d2 63 19 3b  |...........A.c.;|
-00000060  e0 a8 0a 73 6c dd 76 31  b8 51 17 bc 17 03 03 00  |...sl.v1.Q......|
-00000070  13 1a ee 55 37 e1 4c d3  fc 81 4d 37 84 e6 88 52  |...U7.L...M7...R|
-00000080  65 b5 02 78                                       |e..x|
+00000000  14 03 03 00 01 01 17 03  03 00 45 44 15 b9 ed d8  |..........ED....|
+00000010  10 2c 88 80 79 f3 38 a4  bc 42 9b 22 09 44 d9 19  |.,..y.8..B.".D..|
+00000020  e1 0a ec 15 aa d5 15 e9  19 6d b8 6b 71 63 86 ce  |.........m.kqc..|
+00000030  e7 16 0d 8e 3f 9a 3b 52  25 1e 96 f6 d9 d1 6c dd  |....?.;R%.....l.|
+00000040  e3 20 e9 97 f9 60 81 f5  4a b2 26 b5 d3 9e 84 46  |. ...`..J.&....F|
+00000050  17 03 03 00 17 de 4a e9  44 21 88 ef ce 78 35 6d  |......J.D!...x5m|
+00000060  b2 e4 78 47 39 8d 1f fd  9b 2d a4 47 17 03 03 00  |..xG9....-.G....|
+00000070  13 98 f9 1c 9c d4 b1 42  f7 e7 a1 9b 6d b1 b1 cb  |.......B....m...|
+00000080  86 e3 c2 27                                       |...'|
index 77b0342e43beaf8eb5fc39b4877d5c7f4a239c9e..f2ca5acfbd2cec0cc66bf7086981154b137662fe 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 10 01 00 01  0c 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 12 01 00 01  0e 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,87 +7,87 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 91 33 74 00 00  00 05 00 05 01 00 00 00  |....3t..........|
+00000080  01 00 00 93 33 74 00 00  00 05 00 05 01 00 00 00  |....3t..........|
 00000090  00 00 0a 00 0a 00 08 00  1d 00 17 00 18 00 19 00  |................|
-000000a0  0b 00 02 01 00 00 0d 00  18 00 16 08 04 08 05 08  |................|
-000000b0  06 04 01 04 03 05 01 05  03 06 01 06 03 02 01 02  |................|
-000000c0  03 ff 01 00 01 00 00 10  00 10 00 0e 06 70 72 6f  |.............pro|
-000000d0  74 6f 32 06 70 72 6f 74  6f 31 00 12 00 00 00 2b  |to2.proto1.....+|
-000000e0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
-000000f0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
-00000100  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-00000110  5f 58 cb 3b 74                                    |_X.;t|
+000000a0  0b 00 02 01 00 00 0d 00  1a 00 18 08 04 04 03 08  |................|
+000000b0  07 08 05 08 06 04 01 05  01 06 01 05 03 06 03 02  |................|
+000000c0  01 02 03 ff 01 00 01 00  00 10 00 10 00 0e 06 70  |...............p|
+000000d0  72 6f 74 6f 32 06 70 72  6f 74 6f 31 00 12 00 00  |roto2.proto1....|
+000000e0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
+000000f0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
+00000100  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
+00000110  90 99 5f 58 cb 3b 74                              |.._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 8b 65 4e 74 f0  |....z...v...eNt.|
-00000010  c4 05 7a a1 58 a7 fd b0  55 9e d2 15 67 1f 19 f9  |..z.X...U...g...|
-00000020  25 e1 3e 89 4f a6 79 90  95 5a 8c 20 00 00 00 00  |%.>.O.y..Z. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 9a f4 f5 6b ec  |....z...v.....k.|
+00000010  37 69 ea a2 43 05 46 fe  dd 55 27 2e 78 cb f6 cc  |7i..C.F..U'.x...|
+00000020  96 ea fd 68 98 bb 3e 9d  75 ad 6e 20 00 00 00 00  |...h..>.u.n ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 a5  |..+.....3.$... .|
-00000060  e3 ac d0 3c 26 f8 66 41  ac b5 47 6f 63 a0 8f 0a  |...<&.fA..Goc...|
-00000070  6f 79 62 23 15 01 d0 57  5d 66 9c 09 50 c5 45 14  |oyb#...W]f..P.E.|
-00000080  03 03 00 01 01 17 03 03  00 24 7d dc b2 50 38 8e  |.........$}..P8.|
-00000090  15 52 73 25 90 d3 d3 f2  19 da 76 ae 64 42 29 eb  |.Rs%......v.dB).|
-000000a0  21 1b 7d b1 d9 04 94 ac  71 b9 b3 e1 d7 59 17 03  |!.}.....q....Y..|
-000000b0  03 02 6d cb 4e 30 d0 df  41 b8 1a 76 1d e2 a2 14  |..m.N0..A..v....|
-000000c0  24 ec e4 b8 e4 5b 98 49  ed 4e 48 98 3d a7 89 d4  |$....[.I.NH.=...|
-000000d0  d1 35 2f d4 12 dc 0b c3  3f e7 0c df 11 20 41 fb  |.5/.....?.... A.|
-000000e0  5c 24 62 82 26 ad 28 25  59 c0 c0 81 41 9d 80 b7  |\$b.&.(%Y...A...|
-000000f0  db cd 41 bb 27 66 ba 55  e6 2f 52 5d 71 d4 77 6a  |..A.'f.U./R]q.wj|
-00000100  5c 5d 72 34 e6 83 9d c6  24 d1 be 3b 99 90 9b 22  |\]r4....$..;..."|
-00000110  7f d8 81 39 d4 7b a8 f9  d7 61 82 a1 72 f9 27 0b  |...9.{...a..r.'.|
-00000120  b8 6a 5c 72 bd 8f 84 34  c6 d0 c8 1a b9 27 d6 7b  |.j\r...4.....'.{|
-00000130  12 20 37 b7 64 85 19 7e  b4 37 46 df 51 77 23 be  |. 7.d..~.7F.Qw#.|
-00000140  c4 7a e4 7e 37 3b 53 3e  3b 86 8f 22 31 28 4b 8f  |.z.~7;S>;.."1(K.|
-00000150  89 0d dc 8d 67 37 53 9d  38 f2 5f 99 2c f4 76 64  |....g7S.8._.,.vd|
-00000160  87 e4 ce b7 4f d0 83 99  b2 55 8c 38 8c d0 89 d1  |....O....U.8....|
-00000170  2f 91 e8 ae ec b1 a6 29  65 3a 8f af 69 e0 48 00  |/......)e:..i.H.|
-00000180  db 3e 30 bd 7f 4b 82 56  cf f9 5b 5e 74 d7 d5 4b  |.>0..K.V..[^t..K|
-00000190  47 4f 22 17 53 fc e6 98  a4 5a 25 ca 7d ca 39 e9  |GO".S....Z%.}.9.|
-000001a0  fe 11 f5 ca 91 e1 25 3c  6d f2 b3 d0 9f ee 88 d2  |......%<m.......|
-000001b0  dd a5 9f 7c a8 33 59 20  62 fd 4e d6 98 4b ef af  |...|.3Y b.N..K..|
-000001c0  a6 fa 79 f5 26 90 fe 32  0a 6a e4 40 b9 e5 4d 1a  |..y.&..2.j.@..M.|
-000001d0  1f 02 49 4b 1b 6b 31 53  3d 0e 04 98 17 6e 1e 4a  |..IK.k1S=....n.J|
-000001e0  a3 8d ba 0e 8f 33 f6 23  41 5f f8 aa 1f 57 b1 7b  |.....3.#A_...W.{|
-000001f0  a2 fb c6 7f da b4 56 cf  d3 5e 78 de 3c 15 c5 6c  |......V..^x.<..l|
-00000200  62 ef 46 c4 a2 c0 fd a6  86 91 fb f2 98 57 cc 82  |b.F..........W..|
-00000210  7e e7 88 1b f4 65 eb df  2a 7c 7a 81 95 e8 3c 0d  |~....e..*|z...<.|
-00000220  c1 85 8f 55 49 c0 50 d0  c8 5f e7 32 7c 8c c2 ae  |...UI.P.._.2|...|
-00000230  8c af 3f 4c 4f 23 f6 80  0b c1 c3 1c a2 50 6b 37  |..?LO#.......Pk7|
-00000240  38 53 59 66 9c 5a d3 6d  39 59 99 14 79 d5 17 e3  |8SYf.Z.m9Y..y...|
-00000250  89 73 9e fe ed 43 2c 4a  2f 55 c7 c6 9e cf 82 64  |.s...C,J/U.....d|
-00000260  f5 5e 90 88 67 05 7a 00  b1 88 87 9c b2 51 61 1c  |.^..g.z......Qa.|
-00000270  c2 8a ea 9f b1 07 0c 17  ed b6 6e cc 4d 14 04 91  |..........n.M...|
-00000280  65 00 3b 8f ae d0 14 64  63 92 bd 3b 14 9c 1d 40  |e.;....dc..;...@|
-00000290  67 01 b1 38 26 86 4d e6  f3 20 ed f5 63 17 fc d0  |g..8&.M.. ..c...|
-000002a0  fb ad 5c 17 c8 d5 18 53  8b 89 70 13 2f 83 6a 3f  |..\....S..p./.j?|
-000002b0  4c 57 be 71 43 1d 9f bf  eb 30 7e de 7f 17 78 f1  |LW.qC....0~...x.|
-000002c0  af 69 13 9b f3 4a e6 69  4e 30 dc 99 af be 6f ee  |.i...J.iN0....o.|
-000002d0  1d d5 39 b4 19 29 ed 5c  58 bc 4a 08 7b 34 90 21  |..9..).\X.J.{4.!|
-000002e0  a5 ae 74 4c 17 95 79 8b  9c ee 47 99 32 f9 7d f2  |..tL..y...G.2.}.|
-000002f0  98 93 ec 12 52 7d 36 cc  a7 ca a2 cd fc ce 12 0e  |....R}6.........|
-00000300  32 e7 28 69 ce d4 a7 19  56 9f 90 1a d0 af f1 ee  |2.(i....V.......|
-00000310  77 a4 29 45 cb 2c ff 1a  90 9d 98 73 65 2a 82 77  |w.)E.,.....se*.w|
-00000320  17 03 03 00 99 76 fe 3b  d7 a3 d2 ec a0 28 bd ed  |.....v.;.....(..|
-00000330  64 41 ac 1c d0 60 79 29  26 f9 ad a1 2d 79 b6 f0  |dA...`y)&...-y..|
-00000340  cc de 8f c3 92 4a 1e 02  76 7a b4 86 d3 64 b3 a6  |.....J..vz...d..|
-00000350  2d bb d9 92 1e 12 1d e4  96 64 3c 41 7f 11 28 51  |-........d<A..(Q|
-00000360  69 83 64 45 fb a6 2c 34  97 e8 4b e8 48 92 b0 de  |i.dE..,4..K.H...|
-00000370  a0 37 8e fa d8 88 29 4c  8e e4 7e 1e d2 c1 b8 f2  |.7....)L..~.....|
-00000380  d3 5c 2f 09 9d e2 0b 4d  64 25 52 dc 77 d2 a4 fc  |.\/....Md%R.w...|
-00000390  c3 de 83 3c 04 19 f0 d9  d6 40 bb f1 8b c7 40 b3  |...<.....@....@.|
-000003a0  a9 62 99 4c 64 96 a4 67  a0 6b 7c 09 b3 10 97 e1  |.b.Ld..g.k|.....|
-000003b0  b5 83 9e 7e b4 97 bd b7  f9 70 48 2b aa f6 17 03  |...~.....pH+....|
-000003c0  03 00 35 a6 fc 3f d4 90  93 91 02 e8 0a a6 c1 6f  |..5..?.........o|
-000003d0  fa ee e2 6a 41 8d fd ac  53 ae 83 73 e1 d1 17 de  |...jA...S..s....|
-000003e0  36 5d db c6 06 98 f9 23  db d9 8a 35 c1 9b bc a5  |6].....#...5....|
-000003f0  f8 a8 8f 70 e2 c8 4e 22                           |...p..N"|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 04  |..+.....3.$... .|
+00000060  67 13 de c7 ca 6c 02 d8  ee c4 80 d8 43 c2 ef 3e  |g....l......C..>|
+00000070  94 e1 51 d6 bf c7 1f 0c  4a b0 af 7f 91 a5 61 14  |..Q.....J.....a.|
+00000080  03 03 00 01 01 17 03 03  00 24 3f 87 40 f6 93 e3  |.........$?.@...|
+00000090  c9 cb 6e 83 75 c5 2f e3  af 0f 84 9a 3b 88 ad cc  |..n.u./.....;...|
+000000a0  99 c9 1b a8 26 e0 14 d4  ab fe 50 5f ad 79 17 03  |....&.....P_.y..|
+000000b0  03 02 6d 67 86 8e eb e3  15 65 21 e5 2f aa 8d c7  |..mg.....e!./...|
+000000c0  d5 34 6a b6 d3 ab 5f 96  f6 b2 79 b0 bc 3e f7 9c  |.4j..._...y..>..|
+000000d0  5d 8d 62 50 91 35 e1 7d  fe 61 9b 8c 9d e1 4a 7f  |].bP.5.}.a....J.|
+000000e0  54 4b ad c5 35 3d c9 05  d1 b0 6c 3f b2 c4 f7 75  |TK..5=....l?...u|
+000000f0  57 84 50 62 8d 50 80 be  b6 71 b8 59 02 52 5d 55  |W.Pb.P...q.Y.R]U|
+00000100  70 5e 76 61 77 d9 d1 f6  20 d1 d9 bf e2 03 16 1e  |p^vaw... .......|
+00000110  eb 1c 55 85 48 8d 43 72  56 2a d2 16 fc a3 cc 94  |..U.H.CrV*......|
+00000120  08 6d a8 73 55 9d a8 0c  36 da f4 02 c9 23 7b d5  |.m.sU...6....#{.|
+00000130  06 e7 63 63 a1 fa 80 1c  ca 77 d3 ee 4a f8 61 31  |..cc.....w..J.a1|
+00000140  4b 1c d6 8c f3 86 d3 16  ba fe 1c ff 5a f6 fa fc  |K...........Z...|
+00000150  d6 c7 ab b6 5a db 51 f3  cc 42 f0 65 b6 8f f3 d7  |....Z.Q..B.e....|
+00000160  44 5a e7 1e a9 d4 a7 bd  cd 20 bf a1 13 f1 b5 29  |DZ....... .....)|
+00000170  91 a4 28 78 f5 b6 c2 09  a5 95 e5 98 ab c9 f4 4b  |..(x...........K|
+00000180  10 da eb 07 ff 46 44 f9  85 f6 4f 78 5c b0 fa 2d  |.....FD...Ox\..-|
+00000190  0b 3b 79 3f 11 a2 eb 12  96 a3 01 ac 13 d3 65 cc  |.;y?..........e.|
+000001a0  98 e8 c9 8c c3 c6 c9 09  aa f6 af 01 1e e5 30 40  |..............0@|
+000001b0  40 88 44 26 ee 49 91 68  18 56 b9 ce 22 f6 80 ff  |@.D&.I.h.V.."...|
+000001c0  32 d0 ee 15 e3 8a 96 c0  e5 47 51 c1 7f 70 e1 fc  |2........GQ..p..|
+000001d0  3a 44 1a 36 b9 e7 ee f0  9c 4e 62 1f 78 2f cc dd  |:D.6.....Nb.x/..|
+000001e0  62 a3 3b 9b ae d1 34 ea  7f d7 dc b4 c5 2c d7 96  |b.;...4......,..|
+000001f0  61 59 0b ed de cc 70 68  06 2c 93 3d a9 9f 0a 9b  |aY....ph.,.=....|
+00000200  46 0d 39 fa b0 db 7f 9b  c1 80 c8 55 35 bb 10 4c  |F.9........U5..L|
+00000210  2d 8f 88 ae 94 bf 4a 5f  3b f5 95 e7 7a 47 e2 0e  |-.....J_;...zG..|
+00000220  19 b2 e7 69 f5 bb c0 08  9d e8 5e 23 f0 85 12 c0  |...i......^#....|
+00000230  01 cf 7a 87 19 b1 98 97  8d 5a 19 5c 37 52 0b a7  |..z......Z.\7R..|
+00000240  45 e8 8f 9b 0c 76 5f a6  5b d9 45 87 5b 6e 0e db  |E....v_.[.E.[n..|
+00000250  6a 6a e2 b2 1d f9 e6 31  13 09 8c 32 93 43 46 17  |jj.....1...2.CF.|
+00000260  15 45 c8 26 7f f2 23 7b  b1 da c4 20 56 59 4b c9  |.E.&..#{... VYK.|
+00000270  3e 90 a6 77 ea 28 ea 05  74 b8 04 55 68 7a 60 91  |>..w.(..t..Uhz`.|
+00000280  b7 8e 7d 96 11 ac 2d af  f2 26 c5 03 99 57 80 a7  |..}...-..&...W..|
+00000290  80 1f 6f ce fd 0e 81 af  2e d6 b0 6b 7c 4c 71 02  |..o........k|Lq.|
+000002a0  4c 56 fc e9 0a 58 56 5e  4d fd 2d ea e8 ae d5 b7  |LV...XV^M.-.....|
+000002b0  cf aa 66 48 a9 42 76 59  81 52 18 cf c4 6d d8 8c  |..fH.BvY.R...m..|
+000002c0  90 e3 57 28 53 43 5e ae  cd 33 ac 64 e2 ff 65 17  |..W(SC^..3.d..e.|
+000002d0  11 e2 6a 07 aa 57 40 63  90 51 11 43 9f 9e 6d 56  |..j..W@c.Q.C..mV|
+000002e0  69 c2 44 bb f9 83 84 79  bf 98 be 62 e8 20 6e cc  |i.D....y...b. n.|
+000002f0  69 a9 c4 33 de 40 d5 e9  95 12 87 d5 28 24 05 62  |i..3.@......($.b|
+00000300  ca b8 c2 bd d9 96 dc 16  03 c8 7d 9c 7a 83 de 55  |..........}.z..U|
+00000310  3b 4f 90 7b af 36 9a a7  80 46 c5 76 14 70 6c f4  |;O.{.6...F.v.pl.|
+00000320  17 03 03 00 99 6e 39 2c  0d 81 12 85 c2 1c 42 56  |.....n9,......BV|
+00000330  6a 3a e2 04 60 af 78 13  20 d2 b5 b2 58 9e 2f b9  |j:..`.x. ...X./.|
+00000340  f8 11 4f 52 cd 31 c3 a1  ec 83 bd 2e ea 9a 53 6b  |..OR.1........Sk|
+00000350  55 99 a6 8a 25 1c f7 b6  83 4e 9f 1e 5d c5 b2 b2  |U...%....N..]...|
+00000360  a5 6b ea 87 96 0e 29 5b  a4 24 f2 16 4c ad e1 9b  |.k....)[.$..L...|
+00000370  24 d2 95 7e 74 37 44 1a  d7 83 f5 4c 28 3f 3d 92  |$..~t7D....L(?=.|
+00000380  a7 6f 6e 70 1c 27 93 19  64 ee 61 dc 81 35 67 c8  |.onp.'..d.a..5g.|
+00000390  f3 e6 de b0 8f 32 6c df  b1 66 97 6b b9 4a 81 f0  |.....2l..f.k.J..|
+000003a0  cd 3a b4 56 14 e3 27 50  b0 f3 9b 63 05 a5 99 3a  |.:.V..'P...c...:|
+000003b0  26 d6 a5 3c e4 ea 8a 5a  04 5e fb de 86 bb 17 03  |&..<...Z.^......|
+000003c0  03 00 35 eb 5f 0f df 9f  e0 c7 4d b4 3d a6 c8 1a  |..5._.....M.=...|
+000003d0  df f1 f8 1e 36 ea ae 30  32 da 78 0e 00 fe d3 54  |....6..02.x....T|
+000003e0  cc 90 08 1a cb 92 1c 5f  f7 0a 3c f7 19 ed a3 3b  |......._..<....;|
+000003f0  cb fd 56 cb 4f 30 83 07                           |..V.O0..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 f6 6b cb 4a 37  |..........5.k.J7|
-00000010  3e e2 61 7e 5b ac c5 25  cc 54 a2 6d 4e 7c 37 19  |>.a~[..%.T.mN|7.|
-00000020  ea 21 af df 7b dc 04 2d  db 84 ad 06 04 bd 50 f5  |.!..{..-......P.|
-00000030  05 9b 19 01 37 22 d2 6f  06 c2 63 dd 95 e6 ef 45  |....7".o..c....E|
-00000040  17 03 03 00 17 6d 03 e7  38 f9 a4 3c a7 c2 ee 8d  |.....m..8..<....|
-00000050  07 49 bd e6 e4 be 3f a3  ec 64 6c 3a 17 03 03 00  |.I....?..dl:....|
-00000060  13 cc a9 19 b1 03 56 99  c1 4c d0 f5 fd 3b e2 dd  |......V..L...;..|
-00000070  0e ef a0 20                                       |... |
+00000000  14 03 03 00 01 01 17 03  03 00 35 ec 05 98 86 f9  |..........5.....|
+00000010  a1 e4 14 c1 e2 85 17 62  f9 ff 5f 1f 53 8f 00 14  |.......b.._.S...|
+00000020  28 dd 31 bc 9a 7e 2d 54  53 c2 57 f0 24 0f e1 ca  |(.1..~-TS.W.$...|
+00000030  5e 17 07 bc 32 a5 72 3f  3e 90 dd be f1 a1 cc 6b  |^...2.r?>......k|
+00000040  17 03 03 00 17 93 58 dd  95 9a 88 82 3d 63 41 f7  |......X.....=cA.|
+00000050  ba da 0e 24 3f f2 b1 e5  db 83 2d bd 17 03 03 00  |...$?.....-.....|
+00000060  13 03 a4 42 58 3b d7 c5  c2 08 45 e5 c1 bc eb 47  |...BX;....E....G|
+00000070  b5 20 ea ce                                       |. ..|
index 98c3c52170c129a078e0bbc05da5f668e2792260..6d7b508fd34c4c724c81efefa2122a148bfb82be 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,84 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 49 41 93 3b 12  |....z...v..IA.;.|
-00000010  17 ef c7 e6 29 09 70 0e  6b df f7 3d bb 01 9d 27  |....).p.k..=...'|
-00000020  cb 0d 97 6b ce 4c 49 60  3e ff 18 20 00 00 00 00  |...k.LI`>.. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 43 b1 e8 d9 c3  |....z...v..C....|
+00000010  22 a0 a3 08 df 7f 37 34  7a fe 7a 47 98 ee ed 51  |".....74z.zG...Q|
+00000020  c2 ae 5c c6 b1 43 3d ff  f7 91 68 20 00 00 00 00  |..\..C=...h ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 a6  |..+.....3.$... .|
-00000060  16 ca 24 6e e9 b1 38 c9  3c 45 0e 35 98 32 c5 7c  |..$n..8.<E.5.2.||
-00000070  87 14 3f ec ae 4d 4a 00  13 40 e6 81 9d 4f 78 14  |..?..MJ..@...Ox.|
-00000080  03 03 00 01 01 17 03 03  00 17 61 33 7b cd 54 2c  |..........a3{.T,|
-00000090  a6 a4 0d 2d b8 cf fe 0f  75 1d af cf f3 81 9a 7c  |...-....u......||
-000000a0  8c 17 03 03 02 6d 64 52  27 5a 66 dd c4 51 24 a3  |.....mdR'Zf..Q$.|
-000000b0  fb 72 7c 68 ed 79 1c 3d  4d ed a0 18 c9 9e c1 0c  |.r|h.y.=M.......|
-000000c0  3c 16 20 18 f5 ce 59 fd  bb fa fd 12 a5 de 4a 58  |<. ...Y.......JX|
-000000d0  d0 59 6c d3 9b 1f e9 f0  61 af aa 93 57 07 8d e0  |.Yl.....a...W...|
-000000e0  be d3 3c 9a 01 1e 70 50  b3 30 f5 e5 e2 0b ef b5  |..<...pP.0......|
-000000f0  a6 dc 6a 3c 17 1c 8a 73  db 44 38 11 59 be 87 54  |..j<...s.D8.Y..T|
-00000100  c5 43 4f da c0 93 16 c9  ef 38 22 b8 32 2b e8 22  |.CO......8".2+."|
-00000110  b7 c5 d3 94 70 5e b6 48  89 c0 2b cd 5b 59 f5 6c  |....p^.H..+.[Y.l|
-00000120  18 0e 65 6e 23 9e a4 b1  12 38 2b b1 5f 9c c9 4f  |..en#....8+._..O|
-00000130  7d 32 d9 50 97 dc 7a 26  e4 ee 00 f9 ed b8 1a 5e  |}2.P..z&.......^|
-00000140  8a fe d3 09 3d 67 68 c6  58 e1 f8 3e b3 e0 55 3c  |....=gh.X..>..U<|
-00000150  00 77 9a 72 ba fc 13 ad  7a dc 34 0f aa 26 f9 c6  |.w.r....z.4..&..|
-00000160  fe b7 ef 0f e8 d7 46 d0  a7 ee e8 39 4d c1 13 a2  |......F....9M...|
-00000170  5c 00 e2 3e 47 08 71 b7  53 94 38 f6 31 3a 60 a5  |\..>G.q.S.8.1:`.|
-00000180  57 82 4c bc c0 f7 9b c3  4e 00 5e 5e 40 ef ae 61  |W.L.....N.^^@..a|
-00000190  09 37 38 40 b7 93 12 0a  7c 02 22 b9 39 a2 43 e3  |.78@....|.".9.C.|
-000001a0  f3 09 36 a7 2a c9 2b 35  fc 2c fc 1c 82 d0 3f 03  |..6.*.+5.,....?.|
-000001b0  a9 fc bc 53 79 23 5a ce  2d 07 80 5c 2c aa 34 52  |...Sy#Z.-..\,.4R|
-000001c0  9d 71 2d 16 4a f0 09 e6  95 94 2b dd bf d5 9c 84  |.q-.J.....+.....|
-000001d0  79 fc 41 15 a6 68 81 23  7e dc 83 55 b0 a4 a4 1c  |y.A..h.#~..U....|
-000001e0  4e 1e 4d 78 6d 62 45 59  1d bb c3 98 d5 0b 3a 8c  |N.MxmbEY......:.|
-000001f0  f1 98 49 6b 0f 64 29 d5  38 ad 6a ea 8b 34 29 99  |..Ik.d).8.j..4).|
-00000200  c0 04 ce 5a 4f 74 e8 ec  bb 0a a5 cd 23 6d 31 7a  |...ZOt......#m1z|
-00000210  d6 6e 1a 74 53 57 59 76  e9 e7 b2 5d 9f 5d 9a 53  |.n.tSWYv...].].S|
-00000220  b0 e6 d1 ad ba 43 b6 40  65 65 3a 04 35 12 e1 f7  |.....C.@ee:.5...|
-00000230  0e 91 f6 0c 1e 74 65 e3  90 ed e6 ec fd 88 99 e8  |.....te.........|
-00000240  20 64 90 33 b9 a9 d8 a2  f0 d7 e8 e0 cf 8d d4 2a  | d.3...........*|
-00000250  91 12 44 28 3b 99 69 93  aa 3e b2 3b 6a f0 dc 0a  |..D(;.i..>.;j...|
-00000260  8b 2e 7c d9 c0 c7 b7 d6  f2 07 69 81 97 7b d9 6a  |..|.......i..{.j|
-00000270  56 c3 6a e5 d5 6a 06 e7  60 b2 72 1c 4f cc 3f 6e  |V.j..j..`.r.O.?n|
-00000280  e9 fe 94 79 49 36 a6 5f  6d bf b2 87 a1 59 a3 c4  |...yI6._m....Y..|
-00000290  39 ad 9a ea 57 a5 69 47  f0 9b 60 4a a6 45 e8 70  |9...W.iG..`J.E.p|
-000002a0  6c 6b 1b 17 8a 4e 5e 56  89 40 de 91 c3 8a 05 06  |lk...N^V.@......|
-000002b0  57 9e 68 87 1e 00 c8 08  93 1c f1 57 0f 91 dd 32  |W.h........W...2|
-000002c0  b7 e8 96 99 e3 90 44 5e  7a 68 d8 e0 55 67 80 a0  |......D^zh..Ug..|
-000002d0  e3 bd d5 f7 01 f4 30 58  a7 b4 62 d7 7b 9c 5b 9b  |......0X..b.{.[.|
-000002e0  62 20 b6 01 25 1b ff 6f  b3 4f bc 41 ae 9c 88 71  |b ..%..o.O.A...q|
-000002f0  51 f5 25 06 44 a1 49 6b  1b db ac 4b 37 41 78 29  |Q.%.D.Ik...K7Ax)|
-00000300  1c c9 33 82 f4 fe d3 0a  f9 e0 e8 ca 8c 7b 76 3d  |..3..........{v=|
-00000310  8b 3c 3b 17 03 03 00 99  3e 4c 63 66 48 fa 43 7a  |.<;.....>LcfH.Cz|
-00000320  4d 4b 8b 95 25 ca 9a e7  cf d8 d6 e2 4d e7 15 07  |MK..%.......M...|
-00000330  d2 cb 07 79 66 63 b5 8f  3a 7d 00 f4 3a 05 b4 ae  |...yfc..:}..:...|
-00000340  e6 7e 0e b5 a2 20 ee 0e  cc 85 de c2 5d d5 49 32  |.~... ......].I2|
-00000350  83 d8 2a 11 36 36 86 93  46 ac ce 7e b4 4d e6 20  |..*.66..F..~.M. |
-00000360  24 7d 8e c7 37 5f 05 aa  5e a7 de e6 c7 79 88 a7  |$}..7_..^....y..|
-00000370  e7 f7 86 51 07 e0 80 63  76 b2 03 a9 6c c4 86 1a  |...Q...cv...l...|
-00000380  8d 98 e7 16 e0 a2 dc 6e  5c 19 d1 98 c4 10 2b 39  |.......n\.....+9|
-00000390  f4 03 b9 0f b5 ab c3 25  18 bf 8c 59 16 7a 06 60  |.......%...Y.z.`|
-000003a0  73 9a 7c 6f d1 1e e1 de  07 23 21 0e 28 c2 fb 19  |s.|o.....#!.(...|
-000003b0  64 17 03 03 00 35 e0 fd  9c 49 88 45 b3 c7 da a3  |d....5...I.E....|
-000003c0  02 ee 8e 0c e0 33 64 01  35 7e aa 31 aa 43 75 64  |.....3d.5~.1.Cud|
-000003d0  30 fc 89 d8 f0 dc 6e 49  68 e8 4e 01 41 0d 31 07  |0.....nIh.N.A.1.|
-000003e0  c4 e1 bd db 83 b1 e6 46  f0 06 56                 |.......F..V|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 63  |..+.....3.$... c|
+00000060  0f 66 ec 2d fa 67 d4 eb  94 47 8d 88 0b eb ed ec  |.f.-.g...G......|
+00000070  5b ac 22 f7 46 85 c5 1c  2b 5e e8 57 e2 d3 6f 14  |[.".F...+^.W..o.|
+00000080  03 03 00 01 01 17 03 03  00 17 d0 f8 1f 06 59 8d  |..............Y.|
+00000090  a0 40 21 8f 3e 36 3b 1d  6a 6e f7 77 44 fb b3 8e  |.@!.>6;.jn.wD...|
+000000a0  e2 17 03 03 02 6d 22 6b  63 ae 47 fd 66 f9 95 f6  |.....m"kc.G.f...|
+000000b0  63 ea e8 16 61 a3 64 82  39 82 76 1c 2c 04 9b 29  |c...a.d.9.v.,..)|
+000000c0  0f 8a ff 77 9b e6 2c ce  04 09 5f 91 f3 b6 2e 8d  |...w..,..._.....|
+000000d0  be 42 94 7e 5a 28 4b 9f  e9 7b 38 0a 3c de 90 77  |.B.~Z(K..{8.<..w|
+000000e0  c1 bf 97 bf 35 6c 77 98  4b 38 b4 8d 7f 1f 4b c0  |....5lw.K8....K.|
+000000f0  23 c5 73 08 90 fa 21 5c  cd cb 84 5b 0e 89 86 ce  |#.s...!\...[....|
+00000100  83 78 d5 1c 2b b9 b1 24  45 ad ab 9c 68 9f c2 28  |.x..+..$E...h..(|
+00000110  40 d6 c2 ac a2 0c 86 cd  75 92 43 d5 22 3f 61 9d  |@.......u.C."?a.|
+00000120  e8 56 b8 7c 71 db 25 cc  2e 74 52 74 da 6b d4 a1  |.V.|q.%..tRt.k..|
+00000130  2c 32 d2 d8 9c 74 41 9d  78 98 94 3b 87 99 8e 17  |,2...tA.x..;....|
+00000140  df df d6 c3 6d ef 58 13  5c 1e 20 2d ed 77 bd 5c  |....m.X.\. -.w.\|
+00000150  d6 5c 9a 6d 0f 19 77 e1  4f 79 b0 ed 9d 0b f5 e8  |.\.m..w.Oy......|
+00000160  42 d0 f4 90 88 97 a9 84  af 92 3c 41 fe fd 67 6e  |B.........<A..gn|
+00000170  33 77 8e 02 83 b4 6f c0  14 d2 ee 38 79 ca 45 61  |3w....o....8y.Ea|
+00000180  59 05 3b 76 4b ef 55 b9  18 43 9f c4 42 02 31 8e  |Y.;vK.U..C..B.1.|
+00000190  88 c1 b6 0b 5d c4 20 59  91 57 f3 81 b9 d0 ec 25  |....]. Y.W.....%|
+000001a0  26 72 37 e0 e0 c8 34 83  58 fe 15 bd aa 4d 49 f8  |&r7...4.X....MI.|
+000001b0  ba 8f 1d 8d 37 9c 18 88  cd 69 23 00 93 0f 64 e0  |....7....i#...d.|
+000001c0  ed 0d a7 a0 fc bd f3 7d  0b b0 50 6b cd e6 25 b8  |.......}..Pk..%.|
+000001d0  50 3a bf 37 d7 18 60 a7  de ba c7 ff b7 26 8a 20  |P:.7..`......&. |
+000001e0  ad d3 f9 5a 5f 61 37 2f  b0 9b d6 2a 4c 39 08 34  |...Z_a7/...*L9.4|
+000001f0  31 15 19 1e 72 d3 fc 72  63 0e d5 71 04 82 b3 80  |1...r..rc..q....|
+00000200  ec aa 51 0f 73 5f 2c dd  42 fd 40 b8 e3 1d 9e 31  |..Q.s_,.B.@....1|
+00000210  13 01 3b 6b 88 f2 52 17  fa 0b 9d 45 1e f2 f0 c1  |..;k..R....E....|
+00000220  5b 3f 14 23 41 e7 a2 2e  fa e4 9b 01 9b a4 99 43  |[?.#A..........C|
+00000230  32 85 fc c9 30 2a 5d ca  2a fa c5 7f 81 89 31 02  |2...0*].*.....1.|
+00000240  0a c6 89 f0 98 1b 92 08  96 d0 90 c7 18 b0 d4 e9  |................|
+00000250  5d 29 71 3b c6 2f c5 ff  2c be db f8 ef 56 d6 e0  |])q;./..,....V..|
+00000260  9b a6 21 b1 92 b1 58 26  e9 e2 3b 97 1b 95 b2 ba  |..!...X&..;.....|
+00000270  62 66 a5 df a1 a8 82 25  1e ae 85 98 94 d7 96 c5  |bf.....%........|
+00000280  3b 30 4c bd 04 23 45 3d  86 c9 7e 0e 47 5b 5f 14  |;0L..#E=..~.G[_.|
+00000290  b5 c5 29 31 1e cd a4 e0  6a b2 78 51 f0 7b b2 21  |..)1....j.xQ.{.!|
+000002a0  1f 10 0d 0d 7f 01 f1 06  4a 87 7d 4a 90 63 59 f3  |........J.}J.cY.|
+000002b0  6d 16 0f 07 9e 00 3a d2  c7 01 37 cc 39 6e 07 6e  |m.....:...7.9n.n|
+000002c0  9e 64 df 47 65 04 4c 72  59 ad 3b 3e 52 8e e4 b6  |.d.Ge.LrY.;>R...|
+000002d0  fc ba 9c f0 82 13 ba 25  11 c7 5d 38 00 cf 83 14  |.......%..]8....|
+000002e0  30 a9 72 48 d1 e8 4e 1b  ed 04 ed cf b7 5b 2e 72  |0.rH..N......[.r|
+000002f0  1c a2 03 ae 60 54 d6 cf  2f fb 11 a3 b1 8d d6 47  |....`T../......G|
+00000300  e8 9f 96 08 90 ae 3c 3c  c0 8c d8 c4 ef 30 18 ea  |......<<.....0..|
+00000310  2a 1a 15 17 03 03 00 99  85 b3 e4 18 6f 8d 34 c7  |*...........o.4.|
+00000320  3d 66 49 b8 f6 f5 aa 7a  e1 ca ba cb 48 53 15 bb  |=fI....z....HS..|
+00000330  e9 ec 74 91 c3 b5 d3 6b  bc 84 81 d8 e1 a4 31 62  |..t....k......1b|
+00000340  d5 19 6d 2f 15 4c f3 8a  3b ec 41 12 89 be d3 cc  |..m/.L..;.A.....|
+00000350  ab 08 59 a7 79 5d 77 14  ce b1 98 b4 ce 71 7b ad  |..Y.y]w......q{.|
+00000360  ba 41 3a 7f 9a f8 23 5c  c6 fb b5 7b cc eb 0e 7a  |.A:...#\...{...z|
+00000370  ee af 3d ff 4d 03 ba c2  2a af ac fd b5 e8 5b 43  |..=.M...*.....[C|
+00000380  3e 37 ef 84 3d 66 af 3c  8e 1d 0d 36 bd df 25 dc  |>7..=f.<...6..%.|
+00000390  74 89 9c e6 da 18 c4 c8  b5 6c 3c 4c a6 ac 10 28  |t........l<L...(|
+000003a0  67 c0 a7 02 6c d4 8c a1  ca 66 ec 30 65 a6 af f7  |g...l....f.0e...|
+000003b0  e3 17 03 03 00 35 46 33  9b 78 59 93 b5 3d 99 22  |.....5F3.xY..=."|
+000003c0  56 3b 26 82 9c d4 08 36  5a 07 c6 d7 5b 4f c8 d9  |V;&....6Z...[O..|
+000003d0  32 8b cd f1 e7 81 58 a8  98 b6 61 f6 9e 75 0c 52  |2.....X...a..u.R|
+000003e0  5a a1 e8 b1 97 8c 94 52  82 5e e8                 |Z......R.^.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 a3 4c 7d ed 56  |..........5.L}.V|
-00000010  62 f5 7a b9 39 08 02 7f  12 72 c2 de 2f dc 35 a2  |b.z.9....r../.5.|
-00000020  1f d0 8e 1a 7b c2 19 17  93 df 83 84 66 9e 8d 1a  |....{.......f...|
-00000030  fa 8c 37 74 04 13 b5 a2  81 7f dc 85 4c 37 f0 f1  |..7t........L7..|
-00000040  17 03 03 00 17 51 47 a8  1b bc 86 62 90 79 8a c7  |.....QG....b.y..|
-00000050  db 2c 99 95 bf 7c d0 27  6c c3 b6 24 17 03 03 00  |.,...|.'l..$....|
-00000060  13 e2 a8 b5 52 61 b0 66  54 50 60 83 78 3d 26 ef  |....Ra.fTP`.x=&.|
-00000070  f5 5e 36 58                                       |.^6X|
+00000000  14 03 03 00 01 01 17 03  03 00 35 55 88 37 f3 ee  |..........5U.7..|
+00000010  c5 1b 20 ac fe bc a3 f8  c9 59 3f 5f c0 81 40 8f  |.. ......Y?_..@.|
+00000020  1e a9 44 c8 10 16 69 8a  76 45 17 51 06 9e f0 55  |..D...i.vE.Q...U|
+00000030  a2 f2 56 98 7d a1 4d 95  5a c3 1f 51 cf 31 20 ca  |..V.}.M.Z..Q.1 .|
+00000040  17 03 03 00 17 81 2a 8e  32 29 ec 9b 92 c3 fd 98  |......*.2)......|
+00000050  64 aa 47 2a a5 0c d6 77  7f b1 8f 12 17 03 03 00  |d.G*...w........|
+00000060  13 60 8c fb 98 e1 03 b6  20 c8 45 4e d9 4b a8 17  |.`...... .EN.K..|
+00000070  10 79 5f b6                                       |.y_.|
index 633397542c1059140ab0446b685550f040eca657..c8e95c85dfc1d8a2373f693f131acd7d26a148d8 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 9b d5 46 91 59  |....z...v....F.Y|
-00000010  c3 26 be 21 ae 20 5f 26  4f 5f 19 ae 3c fe b9 df  |.&.!. _&O_..<...|
-00000020  16 1b 16 45 4b da 4e 08  58 e9 05 20 00 00 00 00  |...EK.N.X.. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 98 9a 92 3f c6  |....z...v.....?.|
+00000010  67 f5 96 5b 2f 5e 70 89  2d f6 1e ce 6f 6a e5 91  |g..[/^p.-...oj..|
+00000020  4b 4b 6f 98 cc f7 78 4a  b1 54 4a 20 00 00 00 00  |KKo...xJ.TJ ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 08  |..+.....3.$... .|
-00000060  7c 10 a4 69 11 21 4e 78  e3 38 76 c1 4a c2 da 5e  ||..i.!Nx.8v.J..^|
-00000070  8f 82 b8 4a 32 d8 7c 48  b6 78 e2 61 1d b6 21 14  |...J2.|H.x.a..!.|
-00000080  03 03 00 01 01 17 03 03  00 17 7f ac 84 c7 d4 6a  |...............j|
-00000090  fc 73 53 a6 ae 25 f9 ad  e4 4c b9 31 71 4f ba b1  |.sS..%...L.1qO..|
-000000a0  55 17 03 03 00 42 61 ac  61 81 87 40 f1 15 d1 7a  |U....Ba.a..@...z|
-000000b0  44 ef c0 c8 4a 79 99 f1  16 28 36 4b 31 24 95 b7  |D...Jy...(6K1$..|
-000000c0  38 49 60 00 a9 aa 51 40  91 52 2f 39 20 d1 37 92  |8I`...Q@.R/9 .7.|
-000000d0  cf e1 cb 42 4a 7a 83 27  d3 77 20 4c 3c 22 0b 65  |...BJz.'.w L<".e|
-000000e0  8f ce 2a ec c2 5f 90 b0  17 03 03 02 6d 3a d2 ce  |..*.._......m:..|
-000000f0  b7 7b d3 94 d4 33 91 be  81 f1 af 80 e6 3e 28 d5  |.{...3.......>(.|
-00000100  d8 2f 23 08 b6 a6 80 ec  b4 bb 2e 85 31 ed 90 46  |./#.........1..F|
-00000110  74 34 90 77 0d d3 51 2d  6e 67 f0 4c 36 7c f2 30  |t4.w..Q-ng.L6|.0|
-00000120  08 86 6e 53 08 01 c5 06  c8 a4 c6 6a c0 32 80 d4  |..nS.......j.2..|
-00000130  0f 05 ff 91 96 a6 75 5f  71 72 be 63 fb 88 dc 5c  |......u_qr.c...\|
-00000140  06 06 eb 06 57 94 04 61  11 b5 03 1a 96 a3 c4 10  |....W..a........|
-00000150  7b b9 ee 83 3e 73 42 71  93 52 a3 44 b8 9d fb 8e  |{...>sBq.R.D....|
-00000160  5b 5d e4 af 22 0b dc 40  09 34 aa dc 08 d3 e9 54  |[].."..@.4.....T|
-00000170  0a b6 ea 87 33 e6 f5 eb  59 e0 6e c3 24 be 81 b3  |....3...Y.n.$...|
-00000180  93 89 d1 f4 dd 8f ab c9  a4 1f bf ed 58 86 f4 41  |............X..A|
-00000190  de bf 87 2e 1c fb b0 99  f0 ab 4e ec 3e 22 80 78  |..........N.>".x|
-000001a0  45 71 eb 6a f0 0a 89 bf  fe 37 e4 1d a6 90 f4 f3  |Eq.j.....7......|
-000001b0  7c 96 26 47 9d 07 53 16  7c 15 b1 8a 60 ec ad 55  ||.&G..S.|...`..U|
-000001c0  e3 50 7c 1f 5f 67 bc 29  b0 c5 12 99 db d9 b2 1f  |.P|._g.)........|
-000001d0  6c b6 bc 7d ed 0c d3 76  a0 1d c3 f1 f3 10 9d 63  |l..}...v.......c|
-000001e0  22 fd 66 f4 12 4d 4f 2e  7a 81 6e 9f 55 cb 40 26  |".f..MO.z.n.U.@&|
-000001f0  77 6a 9c 44 5b c2 cf ae  2d de 7c 85 ca 3e f6 c9  |wj.D[...-.|..>..|
-00000200  22 d0 34 f8 36 f2 a4 56  5d dc aa 7d f4 9d 3a e0  |".4.6..V]..}..:.|
-00000210  3e 4a b8 77 be 7e 8c c1  f0 0f 42 e7 54 a3 a0 b7  |>J.w.~....B.T...|
-00000220  76 33 fd 51 8c 2b e8 c3  85 de 0c d3 d7 1a 34 16  |v3.Q.+........4.|
-00000230  41 fb e4 eb fb 0f 8b b2  71 45 a7 3e 8f 82 ac b9  |A.......qE.>....|
-00000240  85 54 6f 5a 66 a0 16 90  00 24 e0 91 6e 7f 11 55  |.ToZf....$..n..U|
-00000250  cb 1a 6f f1 89 b2 a7 23  52 a7 ec 54 cc 0c 51 71  |..o....#R..T..Qq|
-00000260  e8 21 fc b2 ca 90 0d 44  ab 05 18 62 4c 01 41 44  |.!.....D...bL.AD|
-00000270  eb a9 ca 97 31 a8 0f 5f  b9 3a d3 18 a0 be a1 cc  |....1.._.:......|
-00000280  2f 88 54 b6 c3 8d e7 12  9f 2d 53 62 2e 05 ba 6e  |/.T......-Sb...n|
-00000290  9c 75 69 cb 4e 3d 2a 46  20 c0 92 c8 e6 e4 1a 16  |.ui.N=*F .......|
-000002a0  4b 09 7d 02 ec 8e 7f a2  b9 e9 05 32 88 4b be 39  |K.}........2.K.9|
-000002b0  30 c5 f9 ed ca 2a 1d a3  3b fe 18 76 2e f2 51 d4  |0....*..;..v..Q.|
-000002c0  b3 aa 61 67 3b eb 90 9c  bb ea 1a 6c 11 7b ba 86  |..ag;......l.{..|
-000002d0  38 f1 cd c7 3c 64 56 f3  ca ff fd b2 14 bf 37 7f  |8...<dV.......7.|
-000002e0  88 07 0c 82 49 05 06 50  5d 54 15 33 0a b3 38 a6  |....I..P]T.3..8.|
-000002f0  b8 e1 20 37 42 d6 0e c1  80 f4 37 e2 d7 96 9a 86  |.. 7B.....7.....|
-00000300  d9 87 a0 34 3a a2 e1 15  5f 5d 4b 36 5f 1a e5 8c  |...4:..._]K6_...|
-00000310  45 d5 10 10 3d 01 01 49  e1 3f 97 16 8a b6 08 30  |E...=..I.?.....0|
-00000320  e2 80 14 21 a3 d4 90 50  ee f7 37 91 25 c9 8a b3  |...!...P..7.%...|
-00000330  ad 99 15 c1 31 8d 4d 83  4b d0 7a a6 af 9b ed 85  |....1.M.K.z.....|
-00000340  88 be 68 af f0 dc ad 09  ca 9e 56 31 11 ba 0f bd  |..h.......V1....|
-00000350  76 d5 58 c4 db ad bc dd  77 b5 17 03 03 00 99 d6  |v.X.....w.......|
-00000360  c8 48 f5 8f e5 40 94 0e  47 da a8 99 05 3c 80 7f  |.H...@..G....<..|
-00000370  9d 03 73 06 dc d1 c3 21  23 0a 16 ae 0a bd a7 5b  |..s....!#......[|
-00000380  c7 e1 15 44 bd 47 94 ef  c0 fb 1e 1b 47 0d b8 c4  |...D.G......G...|
-00000390  e7 34 de b2 7f 75 f4 9e  02 5d 2a 90 68 4e 78 1f  |.4...u...]*.hNx.|
-000003a0  2a 06 40 4c f4 cd c7 82  f2 16 db b4 a4 d3 18 1c  |*.@L............|
-000003b0  7d ae 8b bc 29 c9 31 d7  ff 32 07 33 c5 0b 79 01  |}...).1..2.3..y.|
-000003c0  c9 91 f7 b1 4b 4a fc f9  f7 17 44 88 93 ad e4 f6  |....KJ....D.....|
-000003d0  21 d5 3d d3 a6 17 1e ac  12 df 41 eb b9 87 b7 bb  |!.=.......A.....|
-000003e0  60 b2 7d 98 ed f1 0c 4f  1c 5f 4b 16 7e 02 ba d6  |`.}....O._K.~...|
-000003f0  2d 9c c7 9b 07 fb 46 6a  17 03 03 00 35 0e 95 be  |-.....Fj....5...|
-00000400  c4 e1 78 98 78 30 95 a9  65 5b e7 e6 a4 13 47 83  |..x.x0..e[....G.|
-00000410  41 9b 87 bc ab 12 0a 85  33 7c 03 ca 73 3d c2 0f  |A.......3|..s=..|
-00000420  75 89 b7 c2 7f b1 1b 57  23 85 0c 74 25 a9 2c 53  |u......W#..t%.,S|
-00000430  12 d5                                             |..|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 58  |..+.....3.$... X|
+00000060  96 37 c3 41 35 73 13 21  fc 31 e3 09 33 48 15 be  |.7.A5s.!.1..3H..|
+00000070  31 fb 57 61 b2 c9 60 31  2d 68 83 d5 7c d1 3a 14  |1.Wa..`1-h..|.:.|
+00000080  03 03 00 01 01 17 03 03  00 17 1d ce 7d b7 ca e3  |............}...|
+00000090  10 82 cb f6 1d 52 61 41  29 57 e3 7e e5 88 5c 47  |.....RaA)W.~..\G|
+000000a0  16 17 03 03 00 42 1b 49  e1 4a d7 73 57 cd e9 b7  |.....B.I.J.sW...|
+000000b0  e2 47 d3 74 21 6a 14 1d  1b 8d f5 aa 4c 1b f8 61  |.G.t!j......L..a|
+000000c0  8c 3a e4 2e 9d ff 3f 7d  b2 4d 79 6e 1d 02 05 ce  |.:....?}.Myn....|
+000000d0  c3 ad e6 f9 2b 2b dd 75  3b 6f 3e 0b 29 07 09 74  |....++.u;o>.)..t|
+000000e0  d1 37 68 9b 8a b6 8d 2b  17 03 03 02 6d d1 1b 9f  |.7h....+....m...|
+000000f0  75 ba cf 2d 10 4b f0 4e  09 58 fa ff 06 e8 c9 d5  |u..-.K.N.X......|
+00000100  a0 51 c8 d4 6f b2 c5 c1  d5 f3 ff 12 1f 43 d8 74  |.Q..o........C.t|
+00000110  33 d9 9b e5 f3 34 26 0e  89 dc 00 54 67 17 d2 f3  |3....4&....Tg...|
+00000120  c9 9e be f8 4c 77 8a 63  b1 64 5a b4 d7 57 d2 89  |....Lw.c.dZ..W..|
+00000130  ce 68 d1 f7 93 01 6c 36  b7 c9 4d 50 d0 4b df 5e  |.h....l6..MP.K.^|
+00000140  8a bb 6c d9 54 57 9b b9  c9 ec d8 49 c7 51 3c e5  |..l.TW.....I.Q<.|
+00000150  7b fb 48 0f fd 1b dd 0f  57 d3 a8 ee f6 51 ba 78  |{.H.....W....Q.x|
+00000160  c0 60 f1 d9 c1 d2 65 b4  a7 98 99 fb 64 83 4c 2c  |.`....e.....d.L,|
+00000170  a6 e9 19 ef 0e 88 68 f8  21 a4 2b bd 95 e9 52 d5  |......h.!.+...R.|
+00000180  fb 12 d3 36 06 a2 13 f9  e2 35 6a 06 dd 49 d9 42  |...6.....5j..I.B|
+00000190  89 d9 f0 24 5c 36 b8 6d  95 35 21 b3 9c 3b ee 08  |...$\6.m.5!..;..|
+000001a0  06 06 4d aa 74 eb fc 1b  c1 fd cf 07 24 74 44 2d  |..M.t.......$tD-|
+000001b0  54 d5 c5 d3 4e c4 eb 09  6e 90 8f 3d c0 c5 1c 21  |T...N...n..=...!|
+000001c0  7c 32 1b bc 4b 85 2b f0  b0 f5 cd 61 3d dd 31 03  ||2..K.+....a=.1.|
+000001d0  5e e0 5e 06 1a 37 61 1a  58 fa ed e8 cf 0c 4f da  |^.^..7a.X.....O.|
+000001e0  73 69 42 3a f4 ed dc ad  e5 e7 9b fd 54 16 77 85  |siB:........T.w.|
+000001f0  ae 84 41 10 be 84 ad 28  ef e6 13 2a e9 9f 9f 2f  |..A....(...*.../|
+00000200  c5 d0 65 c6 f5 58 b3 39  9b 5e 07 ba 95 be 5e 75  |..e..X.9.^....^u|
+00000210  68 17 ba 9d 2a 69 6d b8  ed d4 4b 6a ce 30 b1 82  |h...*im...Kj.0..|
+00000220  ae ec 68 9a 26 13 6b 05  38 0f 38 c9 94 01 d0 0b  |..h.&.k.8.8.....|
+00000230  7b bb ca 70 86 6c e4 f1  eb 81 05 25 33 c0 3e e3  |{..p.l.....%3.>.|
+00000240  2a 25 8e 32 eb d5 03 c7  c4 d8 22 22 ef 99 5a a3  |*%.2......""..Z.|
+00000250  01 6a b5 65 9a 55 6e fb  84 83 aa 43 ae 4a 3e da  |.j.e.Un....C.J>.|
+00000260  40 7e 09 e1 3b 15 ad 33  66 5a 3d 30 62 72 86 54  |@~..;..3fZ=0br.T|
+00000270  cd a2 6a bf 82 61 17 87  84 c5 3f f3 1e 86 a2 b1  |..j..a....?.....|
+00000280  2c 1a f9 ba 8c a2 21 5b  93 b2 16 b4 81 ae 7d 98  |,.....![......}.|
+00000290  d6 db 0a 56 14 c9 f7 48  c1 c7 3c 7e 63 8e bc 50  |...V...H..<~c..P|
+000002a0  6a 64 e1 1d 04 ba d3 cc  6a 61 60 4b d2 97 d5 ba  |jd......ja`K....|
+000002b0  23 1a 69 76 86 db 96 39  04 f6 ec e9 96 79 6a 25  |#.iv...9.....yj%|
+000002c0  ff 39 dd 19 08 34 4d c3  f6 7c 91 f2 6b 3a e1 0f  |.9...4M..|..k:..|
+000002d0  66 6d 14 5d 82 21 0b e3  e0 c3 f1 a1 70 e1 2c bc  |fm.].!......p.,.|
+000002e0  fb 54 aa 85 3c a0 7c 9a  35 00 e2 a1 4f 83 3e f1  |.T..<.|.5...O.>.|
+000002f0  64 83 ab c5 e6 31 c7 00  eb 36 f1 bc 41 f3 eb d4  |d....1...6..A...|
+00000300  97 30 4d 7f d2 d1 e7 1a  9e a2 53 31 35 6a 16 d1  |.0M.......S15j..|
+00000310  65 be d7 d3 93 2a be d2  27 dc 1b 8c 09 16 30 d4  |e....*..'.....0.|
+00000320  cb eb e0 bb 42 50 ff 59  c3 81 81 36 88 09 c2 23  |....BP.Y...6...#|
+00000330  dc dd 80 63 bb 78 19 6b  6a 70 4b b5 17 bf ed 6c  |...c.x.kjpK....l|
+00000340  58 f1 15 a9 16 66 c8 45  f5 5f 99 05 b1 3b be e6  |X....f.E._...;..|
+00000350  66 d7 45 df 19 16 9d c7  dd 4d 17 03 03 00 99 38  |f.E......M.....8|
+00000360  70 9e 16 94 07 67 7c ce  90 67 99 46 5e d9 61 b5  |p....g|..g.F^.a.|
+00000370  9b b8 31 fc cc 80 a3 07  30 c9 f5 f9 90 fb e2 0d  |..1.....0.......|
+00000380  dc 93 ab de 38 25 83 f8  77 0c 94 53 75 68 c7 71  |....8%..w..Suh.q|
+00000390  72 6f 61 77 a7 d7 c7 ed  5c d3 08 18 9f 64 f4 6e  |roaw....\....d.n|
+000003a0  30 dc 05 b1 65 11 79 08  66 34 8c 06 99 a9 00 26  |0...e.y.f4.....&|
+000003b0  86 2c e4 b5 6d cf db b1  03 f0 d0 c5 c0 f5 50 04  |.,..m.........P.|
+000003c0  f7 27 97 3e 31 19 aa a8  58 c4 78 43 a9 e3 76 0d  |.'.>1...X.xC..v.|
+000003d0  98 88 20 07 11 4c d6 8a  66 31 72 2e ed 47 66 71  |.. ..L..f1r..Gfq|
+000003e0  9a 3e 9c 0d 1c 17 df ab  6a 52 b4 43 a6 c2 64 30  |.>......jR.C..d0|
+000003f0  45 08 b8 de 59 be 3a f9  17 03 03 00 35 94 9b 02  |E...Y.:.....5...|
+00000400  47 a6 e3 55 9f 95 8a 8d  35 3b bb 56 ec 10 ab dd  |G..U....5;.V....|
+00000410  a3 ca fe ad bf 25 90 76  c4 15 a0 c0 73 d5 96 96  |.....%.v....s...|
+00000420  44 bc ba e9 09 f5 8e e7  e7 7d db f2 e7 9f 99 d2  |D........}......|
+00000430  dc e7                                             |..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 1e e2 06 ae 3e 78  |..............>x|
-00000010  b4 85 1b 44 b7 6d 04 4b  9f 2c ea 23 79 66 d5 7d  |...D.m.K.,.#yf.}|
-00000020  c5 39 57 5c 15 49 9a 6e  c8 19 1b ed 5d 95 ce 6f  |.9W\.I.n....]..o|
-00000030  df 96 3a 16 87 88 c0 25  6a 36 fc 62 05 01 bd c1  |..:....%j6.b....|
-00000040  00 a8 11 da 7f 0e a3 6c  28 26 9f 4a 18 e2 44 b9  |.......l(&.J..D.|
-00000050  aa 71 b2 f6 fa 8b cc 67  c5 29 72 32 cf 78 36 6b  |.q.....g.)r2.x6k|
-00000060  22 67 86 ac 71 19 cb 9d  9e 36 7b 03 42 01 e5 4b  |"g..q....6{.B..K|
-00000070  4c c0 0d 93 22 51 a6 d3  65 00 87 ef 92 f3 08 33  |L..."Q..e......3|
-00000080  4b e1 18 bc ba 2b 43 90  0f 2f d5 8e 4c 79 9f a7  |K....+C../..Ly..|
-00000090  bd 00 2a b7 89 27 b3 e3  db b7 a7 26 b4 8e 48 6f  |..*..'.....&..Ho|
-000000a0  e7 12 55 f0 8e 02 a8 3f  30 d4 22 a4 d0 e3 89 63  |..U....?0."....c|
-000000b0  7d cf c2 46 27 31 8c 10  5f 28 9f 85 fb 02 64 6a  |}..F'1.._(....dj|
-000000c0  8d 50 26 e6 73 57 43 53  39 c7 bb 72 4e c2 dd 07  |.P&.sWCS9..rN...|
-000000d0  86 b0 96 30 f5 d8 f0 5a  a0 09 1c 42 26 65 50 d1  |...0...Z...B&eP.|
-000000e0  65 1f 97 fd a0 3a c2 ae  d6 a4 08 af 5c 9d 30 12  |e....:......\.0.|
-000000f0  fc d8 a2 cd d3 b1 7b de  4b be df 54 aa 31 48 32  |......{.K..T.1H2|
-00000100  7a d2 d5 59 f1 39 bc cd  23 2b ac 17 ff e4 0e ec  |z..Y.9..#+......|
-00000110  55 d2 b9 6b a0 30 65 db  5b e9 b4 ab b9 1e dd 3c  |U..k.0e.[......<|
-00000120  fd 38 7b 19 7f ea 79 56  90 f8 41 bc 3d 64 0b df  |.8{...yV..A.=d..|
-00000130  05 a3 6c b8 14 5f f5 41  4f 3c 6d 46 a3 24 92 22  |..l.._.AO<mF.$."|
-00000140  65 f5 42 52 c7 56 0c 14  e2 3d e4 5c 68 33 91 5e  |e.BR.V...=.\h3.^|
-00000150  a2 8e b4 fc d9 2b 8d 2f  b9 32 4f 86 b1 6f 58 b2  |.....+./.2O..oX.|
-00000160  ae 55 2d 75 a6 8c 2b f1  2b b6 2b 47 5f 9d b1 71  |.U-u..+.+.+G_..q|
-00000170  64 8d a3 c1 48 29 b5 ef  aa d3 10 05 05 9c 73 10  |d...H)........s.|
-00000180  76 b5 c2 3f 5d 91 3f e8  1e b0 f7 62 74 3f 59 ea  |v..?].?....bt?Y.|
-00000190  db c8 ac d1 f2 e6 9d bd  08 f3 bf 8a 2a 0c 5a 10  |............*.Z.|
-000001a0  c7 4b ee f3 1a 7d fa 69  4b 5e e5 43 79 07 ce c8  |.K...}.iK^.Cy...|
-000001b0  29 96 e3 4e e6 fb c6 2c  cd 2a 78 72 0a 4e c6 44  |)..N...,.*xr.N.D|
-000001c0  53 d7 8b 16 1b 98 4c 39  8f 8f 1a f5 00 0a e5 e8  |S.....L9........|
-000001d0  31 62 d0 fb e5 0e e6 c0  95 6e d6 7c 6e b0 9d 63  |1b.......n.|n..c|
-000001e0  f0 74 38 d5 08 9d d1 b6  62 95 59 bf 6e d2 75 5d  |.t8.....b.Y.n.u]|
-000001f0  7a dd f0 11 3c 6f 55 b7  19 91 fc 5b cd e0 8f c6  |z...<oU....[....|
-00000200  28 e4 38 45 1b e3 4d d6  39 96 b3 4a 00 e7 ea 78  |(.8E..M.9..J...x|
-00000210  f7 a1 a7 00 83 04 ba c3  9f f9 21 07 c4 9a fd ed  |..........!.....|
-00000220  e9 a0 2a 3b 11 92 80 4e  89 17 03 03 00 a4 fd af  |..*;...N........|
-00000230  e1 d4 b1 20 76 34 06 f3  cc 9b 11 3d bc f3 5b e5  |... v4.....=..[.|
-00000240  0f 5f 32 40 6d 16 68 92  12 32 3e cd df e3 9b da  |._2@m.h..2>.....|
-00000250  18 9d de 95 a3 d2 00 98  88 90 4d d0 19 a0 47 60  |..........M...G`|
-00000260  6f 1b 36 e4 c0 d8 02 52  b8 0b f4 78 44 8d 72 56  |o.6....R...xD.rV|
-00000270  e4 68 ce c0 cd 71 34 60  6b 6c 8f 22 cb 78 d2 d7  |.h...q4`kl.".x..|
-00000280  fc 89 b9 d6 34 34 c9 f1  44 78 84 36 27 bc 73 0e  |....44..Dx.6'.s.|
-00000290  ae 43 72 66 07 e4 6c fd  ee da ca 99 a2 25 21 a7  |.Crf..l......%!.|
-000002a0  eb 63 11 21 c4 30 45 b3  82 27 7d 8c 9d 37 86 8d  |.c.!.0E..'}..7..|
-000002b0  35 90 5c 13 be 21 fc bd  65 af ec 65 3d c0 9a 1d  |5.\..!..e..e=...|
-000002c0  6b 75 38 17 8d d1 92 ba  43 c1 e8 a5 43 f5 0b ab  |ku8.....C...C...|
-000002d0  16 4d 17 03 03 00 35 a9  24 2a fd af f5 da 3b ed  |.M....5.$*....;.|
-000002e0  d7 15 86 16 c5 e8 bf 95  bc e1 90 fb 0f be f2 3c  |...............<|
-000002f0  75 b0 30 1b ce f9 ac f7  97 ae 7e 29 d7 17 aa a4  |u.0.......~)....|
-00000300  ba c3 2a db 1a 7c 5e bc  18 84 6e e0 17 03 03 00  |..*..|^...n.....|
-00000310  17 52 2f 82 87 2d ca 50  2c 51 f6 99 9d 54 5a 68  |.R/..-.P,Q...TZh|
-00000320  38 61 ca 02 81 2c 62 dc  17 03 03 00 13 35 e5 58  |8a...,b......5.X|
-00000330  b4 26 e0 83 2a 8e 61 e9  96 1a cd 1a 6e c9 67 c0  |.&..*.a.....n.g.|
+00000000  14 03 03 00 01 01 17 03  03 02 1e 64 ba 97 ba 8d  |...........d....|
+00000010  3f 1b d5 5b c5 2e e5 b9  10 01 37 c9 5c e5 ed 39  |?..[......7.\..9|
+00000020  7f 9c 8b f8 ef 50 64 5e  30 05 16 ac 80 51 96 78  |.....Pd^0....Q.x|
+00000030  2a 50 0f 1e d8 76 ab fd  bd 7f 3b 17 7e 1d e9 f5  |*P...v....;.~...|
+00000040  03 76 1b 66 3d 15 dc f3  65 a2 aa a9 23 89 09 e9  |.v.f=...e...#...|
+00000050  dc de a6 27 fc 21 d9 97  d4 08 05 9a 1c 49 8c ee  |...'.!.......I..|
+00000060  fc bd f1 9f e2 4e 3a e3  ee 07 39 d0 34 05 cb 18  |.....N:...9.4...|
+00000070  83 2b 68 45 df 84 4b b2  c3 79 42 73 b9 f1 1c f2  |.+hE..K..yBs....|
+00000080  5f d9 5c f5 7c 4e 86 5e  97 78 ea 0a fa e7 60 68  |_.\.|N.^.x....`h|
+00000090  80 c3 17 5f e7 92 9d 6e  9a 92 37 84 92 4b 83 9c  |..._...n..7..K..|
+000000a0  fa 4c 2a 82 23 eb 67 d0  b2 cc 9e 59 8f 2c e7 bc  |.L*.#.g....Y.,..|
+000000b0  b3 4f 2a 0c 93 bf 17 b8  48 70 5e 0a 85 92 6d 2a  |.O*.....Hp^...m*|
+000000c0  ac 81 9e cd 2c 59 fc a7  e3 5b 82 d5 e3 f5 cd c2  |....,Y...[......|
+000000d0  8a 68 b8 e9 36 e2 08 0b  f7 09 9c 17 95 a3 5e 3d  |.h..6.........^=|
+000000e0  ef 7c c6 5c fe 32 9e 9d  31 c9 b7 76 5a 71 c3 d7  |.|.\.2..1..vZq..|
+000000f0  cd e3 c6 70 e5 2f 07 df  1d b4 34 56 0b ed 52 13  |...p./....4V..R.|
+00000100  bc b2 ac 66 0c 84 b0 2e  32 93 08 f2 04 91 8e e3  |...f....2.......|
+00000110  7b 7f 22 2a a9 04 50 5c  78 f1 06 c5 fd 2c 4c 77  |{."*..P\x....,Lw|
+00000120  a9 17 b5 a8 42 6d f2 0e  87 32 d3 7f be 9e 1d 09  |....Bm...2......|
+00000130  50 10 25 9d f1 a5 25 c3  c2 be 0d 8d 8e 96 5e 1c  |P.%...%.......^.|
+00000140  83 06 45 bc f0 5b 6f b5  0a 02 2a cc ce ac 7e 62  |..E..[o...*...~b|
+00000150  f0 b1 89 25 30 bc 12 d2  da f9 1d d0 46 55 97 4c  |...%0.......FU.L|
+00000160  09 39 e1 a5 1f 4d e1 aa  bd 6f 1f 0d 79 4a aa 49  |.9...M...o..yJ.I|
+00000170  73 25 dc a5 bd f7 2b 64  3c 84 ed b0 ef 13 c5 6c  |s%....+d<......l|
+00000180  16 8b 27 bf a5 3d 15 f2  4a 3b 53 ad ba e9 9e 2a  |..'..=..J;S....*|
+00000190  6d f2 44 5c 66 69 04 94  27 99 08 8e c2 7e c6 69  |m.D\fi..'....~.i|
+000001a0  f7 65 1d 0b a5 8c 35 52  0b f1 bd 59 ca d1 bf 44  |.e....5R...Y...D|
+000001b0  47 b0 7b f8 3b a0 84 55  73 c2 83 bb 9d e0 bc ed  |G.{.;..Us.......|
+000001c0  60 07 32 ce 71 b3 60 12  ef ca 28 bb 6c fb bb c7  |`.2.q.`...(.l...|
+000001d0  3e eb 05 65 a5 26 1a 6c  40 c8 b4 4e 31 12 a0 96  |>..e.&.l@..N1...|
+000001e0  19 66 86 f5 1e f8 bd 6d  f4 2e 98 60 fe ff 22 1e  |.f.....m...`..".|
+000001f0  a9 27 49 87 77 7d b4 5d  ea f8 bc 3a 10 15 84 8c  |.'I.w}.]...:....|
+00000200  cd aa 2c e8 94 93 a5 ee  db 7a d8 96 e9 d5 68 e9  |..,......z....h.|
+00000210  34 68 40 5b dd 18 dc f0  ef b7 17 72 fd 06 70 d1  |4h@[.......r..p.|
+00000220  b6 89 ae 66 40 40 f7 61  0b 17 03 03 00 a4 26 c1  |...f@@.a......&.|
+00000230  3c d9 6c 83 52 e3 5e 64  46 7f 12 1d 3d c7 7d 0f  |<.l.R.^dF...=.}.|
+00000240  a9 8f d3 45 f5 81 46 16  24 c6 c3 7e 5f e4 25 be  |...E..F.$..~_.%.|
+00000250  00 33 7a 1c 35 d4 5c 64  54 56 08 66 4d 2f 68 15  |.3z.5.\dTV.fM/h.|
+00000260  1b 71 d9 aa c9 9e e0 cc  d2 73 a9 99 41 9b 08 1f  |.q.......s..A...|
+00000270  d4 41 de e5 4f 1f 30 65  61 02 8e 6f 79 d7 47 86  |.A..O.0ea..oy.G.|
+00000280  2f e6 0e 65 9e 06 e8 98  d1 fe bc 89 b4 bc f4 9b  |/..e............|
+00000290  70 02 06 e4 9d 37 dd 1b  63 b6 06 62 1a c7 45 30  |p....7..c..b..E0|
+000002a0  9d 08 64 35 8b 96 88 9a  1e 58 2f d0 ef 44 39 04  |..d5.....X/..D9.|
+000002b0  3c bf e2 e6 c4 73 de f9  b0 10 ed 56 eb 04 bd 4e  |<....s.....V...N|
+000002c0  89 38 50 3b e7 e5 12 7c  8e 74 b2 a5 79 2d 88 7b  |.8P;...|.t..y-.{|
+000002d0  e5 1b 17 03 03 00 35 42  b2 61 24 4c 38 b5 d1 42  |......5B.a$L8..B|
+000002e0  93 12 66 c5 be 3c f0 b1  b2 6b 86 07 99 7d f3 e4  |..f..<...k...}..|
+000002f0  74 2b 43 98 38 df 70 7a  e5 f7 67 cf c3 08 23 19  |t+C.8.pz..g...#.|
+00000300  4a cf 06 26 fe 56 4a 97  4a 82 70 09 17 03 03 00  |J..&.VJ.J.p.....|
+00000310  17 9b 3f bb 09 7d 4f c9  05 42 f7 d1 a7 59 0c a7  |..?..}O..B...Y..|
+00000320  c6 9b 36 e1 46 ad 9b 89  17 03 03 00 13 ae a5 51  |..6.F..........Q|
+00000330  76 d8 3a 77 a8 a0 38 70  bf be c8 fb ff fe 53 09  |v.:w..8p......S.|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519
new file mode 100644 (file)
index 0000000..26f76bc
--- /dev/null
@@ -0,0 +1,122 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
+00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
+00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
+00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 7a 02 00 00  76 03 03 a5 5b a0 2c f5  |....z...v...[.,.|
+00000010  57 cc 49 88 64 7d ea 7c  ee 61 cf fc 94 9f d4 5c  |W.I.d}.|.a.....\|
+00000020  bb 83 80 5a f5 7c a3 fc  0a c8 61 20 00 00 00 00  |...Z.|....a ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 fe  |..+.....3.$... .|
+00000060  e1 43 bd 10 b3 f6 3b 4d  7c 46 8f a3 bc 7d 08 08  |.C....;M|F...}..|
+00000070  22 ed aa 9b 7b 89 f3 87  13 7e fe 6c b0 db 3f 14  |"...{....~.l..?.|
+00000080  03 03 00 01 01 17 03 03  00 17 2b ce 52 22 34 c5  |..........+.R"4.|
+00000090  d9 2c ae d0 23 4d 0c 6e  b4 f0 c8 58 11 22 54 bb  |.,..#M.n...X."T.|
+000000a0  15 17 03 03 00 42 96 b4  72 be f0 6b d3 b0 82 7c  |.....B..r..k...||
+000000b0  dc d2 67 69 2c d4 40 a1  7a 3d 9a 39 a5 29 ca 64  |..gi,.@.z=.9.).d|
+000000c0  c5 0b d2 ba 7c c3 73 e2  93 0d 44 e3 64 ce ec b2  |....|.s...D.d...|
+000000d0  90 ae e2 df 18 f8 f5 93  5f 91 80 c2 b4 00 e7 de  |........_.......|
+000000e0  f5 3f 4d c8 de 4c 5f f0  17 03 03 02 6d c6 df 33  |.?M..L_.....m..3|
+000000f0  1e 12 40 02 7f 46 67 d8  4b 98 d7 5e f7 0a bf dc  |..@..Fg.K..^....|
+00000100  fe 3c 7f 00 2d 74 31 cb  10 35 e2 eb 16 11 d1 2f  |.<..-t1..5...../|
+00000110  10 bf 8c 4d 37 c7 1b f6  23 a3 3e 68 87 1a 50 53  |...M7...#.>h..PS|
+00000120  64 7c 0d fd 0d 06 32 93  17 85 da e0 d4 86 2c 5f  |d|....2.......,_|
+00000130  0a 91 9a fd 00 87 f1 f4  fc 18 22 a1 2e 21 44 7d  |.........."..!D}|
+00000140  6c ca 2c 0d f2 38 15 d1  9d 86 9b 67 b6 b4 06 6d  |l.,..8.....g...m|
+00000150  30 07 a8 b1 b8 7a 5d 1d  17 d0 c5 1a 40 a3 42 b5  |0....z].....@.B.|
+00000160  dc 56 c8 ec c3 c3 4e ff  5f 7c ce 27 fa a6 82 2a  |.V....N._|.'...*|
+00000170  b9 85 47 4e 0b d1 84 17  92 a6 42 86 9a 65 1c a9  |..GN......B..e..|
+00000180  45 be af a7 95 03 0b db  84 fa 5d 1b 7e 57 72 40  |E.........].~Wr@|
+00000190  ab a3 9e 46 50 3f c7 03  94 9a 4a 02 bd 9a 90 1c  |...FP?....J.....|
+000001a0  42 c9 98 e9 81 cd e8 73  a6 82 42 20 24 89 d5 8d  |B......s..B $...|
+000001b0  48 20 df d4 f4 d2 15 e4  c0 28 ee d8 2a 1b ad b8  |H .......(..*...|
+000001c0  1d a4 86 e1 b4 89 97 e8  36 63 aa 9c f4 7e 65 c6  |........6c...~e.|
+000001d0  12 86 41 54 b3 4a 79 9f  48 33 fc fc 0d f5 14 47  |..AT.Jy.H3.....G|
+000001e0  ba ae d3 20 64 37 f1 cd  9e 1b cc b2 27 68 e6 f2  |... d7......'h..|
+000001f0  95 0c 29 59 f2 15 2e 97  60 f3 8d 1b b1 65 cd 4f  |..)Y....`....e.O|
+00000200  0d a5 0a 34 59 63 20 f0  71 e6 d5 13 f2 4e dc 73  |...4Yc .q....N.s|
+00000210  5b 1a 36 d7 6a aa b0 30  f4 ff 68 ad f5 5e f0 12  |[.6.j..0..h..^..|
+00000220  0c 34 a8 4d 91 03 8e 4a  30 07 23 49 41 7a fe 19  |.4.M...J0.#IAz..|
+00000230  62 5b 6a a0 4d d5 54 a1  1f 45 91 86 b3 a1 c3 32  |b[j.M.T..E.....2|
+00000240  62 79 a8 93 b3 d4 43 0c  a8 12 10 4f f5 53 c3 3b  |by....C....O.S.;|
+00000250  d9 73 ef 42 be 1d f5 70  fd 9f ca 54 20 3a 33 c9  |.s.B...p...T :3.|
+00000260  f6 e8 55 13 b3 ab 45 c8  bb 5c 6b b9 39 a9 04 ac  |..U...E..\k.9...|
+00000270  1c 3c 5a aa b7 91 2c 0c  f6 74 ea 6b 2d e2 9a 3c  |.<Z...,..t.k-..<|
+00000280  d0 30 d8 14 e5 8c bf 06  2c d3 89 2e 0d ad df c5  |.0......,.......|
+00000290  5b 6d fa 8f 0c 64 cc 40  04 12 97 ab ab ff be d8  |[m...d.@........|
+000002a0  a6 fc 78 1d d4 18 90 bf  b4 8e ce 09 40 8c dd 8a  |..x.........@...|
+000002b0  a8 cc 86 ce 6d a8 0c f8  79 66 f6 0b 46 2b 0d 4c  |....m...yf..F+.L|
+000002c0  73 14 dd cd 2c 56 77 f7  1f 4d 85 d0 1c 16 da 26  |s...,Vw..M.....&|
+000002d0  b0 65 39 31 b5 cd f3 7a  80 52 96 6d 81 1e 65 98  |.e91...z.R.m..e.|
+000002e0  b2 a3 12 22 52 68 c5 59  19 a1 9a be 80 5c 25 57  |..."Rh.Y.....\%W|
+000002f0  9b 60 e9 95 28 4b 77 a0  70 ce 4b 5b 70 37 0a e3  |.`..(Kw.p.K[p7..|
+00000300  7e 2c c7 0e 1c 6b 3a 54  2c 0d b3 53 0c f4 12 66  |~,...k:T,..S...f|
+00000310  c6 17 04 88 f5 12 58 d8  2c 70 54 85 2b 71 ee 98  |......X.,pT.+q..|
+00000320  75 8d e4 57 7c 96 a2 44  12 77 f0 6d 8a 12 89 b3  |u..W|..D.w.m....|
+00000330  8b 85 bf 33 d9 ee de 24  b5 7d d5 cb 0d d4 9b bf  |...3...$.}......|
+00000340  c6 e3 27 44 f2 35 35 09  00 86 eb 8b 34 c4 c4 6a  |..'D.55.....4..j|
+00000350  fe 95 e9 80 58 4f 3e 99  24 f8 17 03 03 00 99 de  |....XO>.$.......|
+00000360  1b f5 7a dc 63 8d 5e 75  de 72 cf 41 ca 75 ab d9  |..z.c.^u.r.A.u..|
+00000370  55 b0 b5 81 a9 6c a9 f6  1d ea 66 dd dd 86 f5 03  |U....l....f.....|
+00000380  12 08 9d b4 07 48 eb 8b  45 f1 35 b1 31 bd 5d f3  |.....H..E.5.1.].|
+00000390  e2 34 73 9a e5 87 b7 8b  0b 8b ab 7e 05 db 56 db  |.4s........~..V.|
+000003a0  4f 4c 52 1a 3b 5d 4c 53  b1 49 40 81 5e 73 af 26  |OLR.;]LS.I@.^s.&|
+000003b0  21 e6 e3 5c 4a a6 f6 07  56 de f5 76 5c 67 d8 d5  |!..\J...V..v\g..|
+000003c0  eb f3 6a fb 6d b7 00 bc  6b 28 c9 63 4d 58 76 97  |..j.m...k(.cMXv.|
+000003d0  aa 51 2b f3 03 9c 70 3b  3e b2 a4 16 a0 a0 e0 43  |.Q+...p;>......C|
+000003e0  77 da 88 2d 48 3b 07 e2  8d a6 e2 80 85 68 ac dc  |w..-H;.......h..|
+000003f0  ce 66 2f 97 20 9e 4e 33  17 03 03 00 35 f6 ce 98  |.f/. .N3....5...|
+00000400  8b 01 f5 75 8e 98 42 02  b1 b8 90 f3 08 96 e8 5a  |...u..B........Z|
+00000410  d4 7c ef d1 62 1e b3 36  39 d9 b2 59 1f 1f cc 74  |.|..b..69..Y...t|
+00000420  f2 a8 62 11 00 28 31 fa  d9 5a 27 10 7b 93 ff de  |..b..(1..Z'.{...|
+00000430  a0 ec                                             |..|
+>>> Flow 3 (client to server)
+00000000  14 03 03 00 01 01 17 03  03 01 50 57 2a 94 d7 c1  |..........PW*...|
+00000010  40 42 d3 aa e3 d8 b3 e4  13 ff 51 ee 8a 52 9d 9c  |@B........Q..R..|
+00000020  c4 a4 40 91 72 0f c9 4e  fe 56 22 89 ea fb 6d 05  |..@.r..N.V"...m.|
+00000030  a2 96 97 4b fa ef ec 13  b6 13 3b 69 6c 65 c0 74  |...K......;ile.t|
+00000040  e5 54 df a4 97 50 f7 85  a1 c7 fb 52 84 56 98 16  |.T...P.....R.V..|
+00000050  52 b6 eb 5a d0 72 6e 65  98 81 bb f5 2a 4c ed 1a  |R..Z.rne....*L..|
+00000060  90 e1 01 a6 2b eb e0 1d  06 ba 8a d4 47 45 90 f0  |....+.......GE..|
+00000070  91 bd c4 d7 54 ba 44 30  78 42 15 42 74 59 1c c7  |....T.D0xB.BtY..|
+00000080  56 34 39 64 8e f8 0a 0f  2b 35 0f 06 97 34 3e 5e  |V49d....+5...4>^|
+00000090  00 00 5a f0 07 0a f5 66  46 86 94 8c 0b 62 1c fd  |..Z....fF....b..|
+000000a0  cc cf fd 5d 06 96 1e 21  9e 20 d5 07 5f 5a 00 9f  |...]...!. .._Z..|
+000000b0  6f 80 36 5e aa 56 d0 07  00 20 08 55 48 fe 6c a1  |o.6^.V... .UH.l.|
+000000c0  b1 22 f3 94 54 7e 7e d5  e9 f0 71 69 01 fc bd 14  |."..T~~...qi....|
+000000d0  a1 de 38 e4 b4 02 88 3e  66 77 3b f7 aa cd 57 a3  |..8....>fw;...W.|
+000000e0  cf 6a 40 7d 93 75 79 3b  95 07 33 69 b2 8d 2a 37  |.j@}.uy;..3i..*7|
+000000f0  94 d3 8d d5 b5 8a f0 94  8d 1e b4 9e 02 4f 7d 83  |.............O}.|
+00000100  05 c6 c7 c8 a0 74 f1 88  f7 68 bf 4b e4 18 3b 6f  |.....t...h.K..;o|
+00000110  0c 6c a6 e7 75 50 b9 f6  68 2e 05 67 a3 47 df 22  |.l..uP..h..g.G."|
+00000120  fa ae c1 4f a8 3d f3 bb  dc 66 c3 b6 98 b7 8c 5b  |...O.=...f.....[|
+00000130  48 51 57 d7 43 b2 13 25  9e d5 82 6c 70 5c 42 53  |HQW.C..%...lp\BS|
+00000140  a9 e8 8a 12 26 cd 3a f8  f8 e5 97 84 55 89 09 d4  |....&.:.....U...|
+00000150  d4 20 40 d7 2d 6f 66 36  63 f6 53 17 03 03 00 59  |. @.-of6c.S....Y|
+00000160  2f f6 22 ce f3 86 f8 ee  b1 f6 49 de c8 bf 91 9c  |/.".......I.....|
+00000170  bc 2f fa 75 af 51 bc ee  b7 a5 a9 82 35 3b 83 9d  |./.u.Q......5;..|
+00000180  3d 9f 57 10 07 4b af 01  66 f0 39 dd f0 4a a7 90  |=.W..K..f.9..J..|
+00000190  f3 6c 28 97 80 0d a5 74  2d 22 a3 81 cd 64 2b 1a  |.l(....t-"...d+.|
+000001a0  d1 4e 2d 9e 8e 69 38 f8  11 9c 17 1f e6 c9 01 4e  |.N-..i8........N|
+000001b0  48 1f 80 43 26 d4 5a 82  30 17 03 03 00 35 e9 25  |H..C&.Z.0....5.%|
+000001c0  b9 01 8e 0d 51 be 9d d1  b4 2b 0a ee 36 69 85 1a  |....Q....+..6i..|
+000001d0  10 a8 ff 36 e7 21 b7 f2  54 75 ca 07 52 88 48 d0  |...6.!..Tu..R.H.|
+000001e0  ad 67 0b 92 52 70 fa 14  bc 7e 1d 43 f0 a2 7b df  |.g..Rp...~.C..{.|
+000001f0  ac 0c 19 17 03 03 00 17  98 76 d7 52 06 90 ef 00  |.........v.R....|
+00000200  21 5e ec ed 0e 35 77 ef  5c f1 32 58 33 0f 06 17  |!^...5w.\.2X3...|
+00000210  03 03 00 13 05 fb b3 c3  4d b5 a4 9c 52 ea bc d2  |........M...R...|
+00000220  86 08 26 b8 df 5c 4c                              |..&..\L|
index 74163f0521f5aeee54a35c6013861cec013af5d4..09de5cca834b7592538144d43e1ebe99f35bc208 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 dd 25 8d f2 41  |....z...v...%..A|
-00000010  0b 2f 7b 80 24 03 af 9d  81 4e fd a8 ae e4 00 ee  |./{.$....N......|
-00000020  99 5f 09 05 8b 2a c2 0a  7c 92 ad 20 00 00 00 00  |._...*..|.. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 cc a2 2d 09 42  |....z...v....-.B|
+00000010  f0 11 87 04 64 83 e4 d8  80 a5 0f 88 69 ae f1 d2  |....d.......i...|
+00000020  12 05 d2 08 75 15 86 b7  d8 69 e7 20 00 00 00 00  |....u....i. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 fd  |..+.....3.$... .|
-00000060  03 d1 75 4e 57 ae b0 cc  43 4f 7e 2b de a8 01 46  |..uNW...CO~+...F|
-00000070  98 c7 f9 8e a5 46 95 68  fa 5e 07 c3 a1 55 5e 14  |.....F.h.^...U^.|
-00000080  03 03 00 01 01 17 03 03  00 17 df 30 a4 ce 8e db  |...........0....|
-00000090  20 0d 74 59 0a df 8e 67  23 af 3d 2f 87 8f 31 a0  | .tY...g#.=/..1.|
-000000a0  bf 17 03 03 00 42 0f 0a  20 4e 21 cd d8 01 13 ea  |.....B.. N!.....|
-000000b0  74 29 8d e4 a0 1b 6a a5  be 89 03 8d 2b 39 c4 23  |t)....j.....+9.#|
-000000c0  5e b1 f7 4f e4 1f dd ea  f8 38 fe 07 89 ca f1 e6  |^..O.....8......|
-000000d0  11 e9 2d 40 ca f1 63 11  ac 29 44 c2 25 18 4d 29  |..-@..c..)D.%.M)|
-000000e0  30 aa cb 35 b4 33 27 8a  17 03 03 02 22 36 fb 97  |0..5.3'....."6..|
-000000f0  fd ba 12 9b e5 19 14 79  2b 78 0e 6c a9 d8 13 a2  |.......y+x.l....|
-00000100  51 d8 c1 4b 53 ac a4 73  cf b1 2d 2c 4d 14 b8 10  |Q..KS..s..-,M...|
-00000110  de 5d 86 81 19 77 19 a0  b4 1b eb 85 f4 dc 21 2f  |.]...w........!/|
-00000120  c5 5c 62 44 1b ca f2 91  06 95 14 7a 07 02 1f 98  |.\bD.......z....|
-00000130  0d bc a4 89 7c 96 21 6b  37 1c 47 4a 10 e8 e2 b6  |....|.!k7.GJ....|
-00000140  f9 e2 97 06 a5 88 ad 5c  f1 08 28 4b f5 d5 9a a0  |.......\..(K....|
-00000150  51 74 30 ab 9c 52 b0 b9  2d 38 bb 25 b8 6e 71 a7  |Qt0..R..-8.%.nq.|
-00000160  7b c9 76 56 13 e6 60 bf  70 15 11 0c 21 12 cd a1  |{.vV..`.p...!...|
-00000170  b8 e5 3a 49 00 ad 9c 2f  e5 2b 1f cc 4e 4f 0b 90  |..:I.../.+..NO..|
-00000180  e1 77 64 5f b5 fc 7b 1c  f3 09 cb 0e c4 94 d7 33  |.wd_..{........3|
-00000190  59 5b 8f ae e1 9c e4 f6  83 10 f0 71 5f 17 4b b3  |Y[.........q_.K.|
-000001a0  3f 81 2c 0a 22 c5 f4 6b  bd 83 32 37 4a 2a 9a db  |?.,."..k..27J*..|
-000001b0  7b 42 c2 c0 7d 13 e0 e7  ea d7 58 a6 b1 20 68 bc  |{B..}.....X.. h.|
-000001c0  ba 4e 1a 91 6d dd 11 b9  fc 57 02 4d d4 e8 47 74  |.N..m....W.M..Gt|
-000001d0  9d e1 a0 25 2f d9 7d 21  39 b9 ca 4c ff de 42 8c  |...%/.}!9..L..B.|
-000001e0  36 bb 46 79 d3 52 be bc  1c dc 1f e3 6e 18 b8 4e  |6.Fy.R......n..N|
-000001f0  b2 47 e6 74 d3 50 fa cf  fd 5a c8 33 9a 17 2f 48  |.G.t.P...Z.3../H|
-00000200  e6 20 29 b3 7b e3 de a1  c8 e7 74 f0 ca eb f9 6e  |. ).{.....t....n|
-00000210  29 2c 73 17 df 5f 8f ed  dc ae 2a a6 37 f2 b7 f7  |),s.._....*.7...|
-00000220  38 da 45 63 cd 2e e6 bf  c7 a4 3c 15 c2 89 6f 59  |8.Ec......<...oY|
-00000230  c2 19 29 19 13 4f a4 59  57 f9 da 8c 7d 5a 82 7a  |..)..O.YW...}Z.z|
-00000240  9f 79 01 51 94 7c 25 46  7e c2 b2 bf b4 dd c1 e8  |.y.Q.|%F~.......|
-00000250  12 14 3e 77 44 8c 47 8b  9b ab 88 47 5d 12 cd 63  |..>wD.G....G]..c|
-00000260  17 c2 15 29 a3 cf 8c 08  e0 12 f6 36 ff ae a6 72  |...).......6...r|
-00000270  3b 71 4d c7 a2 3b 38 63  be 77 43 67 fb 78 e6 a8  |;qM..;8c.wCg.x..|
-00000280  1d aa 3a 42 f5 47 f8 d4  8d 83 f7 f0 93 ba 90 6d  |..:B.G.........m|
-00000290  25 65 e1 49 f5 3e fe e9  76 ea fb 23 38 6f b2 8f  |%e.I.>..v..#8o..|
-000002a0  3c 72 d3 fc 85 92 a0 d1  11 7c 6a 0b 0f 31 5d 8b  |<r.......|j..1].|
-000002b0  ab 61 bf 8b 06 a5 54 06  ff a0 70 da 38 e0 58 3d  |.a....T...p.8.X=|
-000002c0  d1 79 2b d8 ea 93 b2 0f  11 02 24 46 7f 27 e1 22  |.y+.......$F.'."|
-000002d0  42 b2 39 86 c7 08 62 5f  d4 18 0b 8b e3 40 80 76  |B.9...b_.....@.v|
-000002e0  f0 ad 86 48 54 52 d8 7a  ff da 3a 3a 93 d5 46 b5  |...HTR.z..::..F.|
-000002f0  67 0d 17 b3 43 c2 e3 73  de 49 cf a4 35 b8 17 db  |g...C..s.I..5...|
-00000300  ea 2c 8d e8 ba 1f a6 b2  a6 91 26 19 a2 b8 95 17  |.,........&.....|
-00000310  03 03 00 a3 d2 c7 70 d0  6d ab a9 63 7e 35 b4 a4  |......p.m..c~5..|
-00000320  7c 32 ea c9 25 83 88 3d  1a e3 a5 5e b9 7e 60 99  ||2..%..=...^.~`.|
-00000330  23 5e 28 13 61 77 ad e7  74 34 4c c8 60 7a a0 07  |#^(.aw..t4L.`z..|
-00000340  c7 e8 6e cd a2 03 33 62  43 dc 24 e8 1e 43 07 c3  |..n...3bC.$..C..|
-00000350  95 89 26 e4 7c 86 43 26  08 08 bc 62 74 1a d7 50  |..&.|.C&...bt..P|
-00000360  8d 43 e6 2b fe 47 8e 35  4c 09 99 7d 02 cc a8 51  |.C.+.G.5L..}...Q|
-00000370  ae 87 79 5e e1 c9 88 f2  1a 40 74 4b 72 3b b0 07  |..y^.....@tKr;..|
-00000380  0b 4a c2 df b4 ad 7a 07  c2 18 fa 53 4d 3d e7 19  |.J....z....SM=..|
-00000390  54 62 eb d1 da 5e 9f 0d  3a a2 a1 72 a3 aa 77 2b  |Tb...^..:..r..w+|
-000003a0  21 59 aa cb a1 f3 4a b6  e5 b2 bb 81 3d 1c c1 9b  |!Y....J.....=...|
-000003b0  ef 1b e2 cd 73 67 18 17  03 03 00 35 29 3e 2e 10  |....sg.....5)>..|
-000003c0  4a ba 5a 91 7b d1 b9 0e  d1 98 5e 95 4d 1c 7f 77  |J.Z.{.....^.M..w|
-000003d0  6e eb b9 8c 95 ce d4 04  5c 69 8f 7e 48 89 30 2b  |n.......\i.~H.0+|
-000003e0  71 27 a3 54 c2 b7 f2 ad  23 7b ee 64 88 a0 0d 75  |q'.T....#{.d...u|
-000003f0  76                                                |v|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 c9  |..+.....3.$... .|
+00000060  b4 93 8b 5b b0 ae 93 4a  01 26 0c fb db 3f 53 0b  |...[...J.&...?S.|
+00000070  04 ca 65 63 3f d7 d9 f9  fc ca ea 4c f2 08 3c 14  |..ec?......L..<.|
+00000080  03 03 00 01 01 17 03 03  00 17 85 f6 ff f8 58 7f  |..............X.|
+00000090  2a d9 e0 12 82 d6 31 64  29 70 05 24 0f 17 1e 9f  |*.....1d)p.$....|
+000000a0  dc 17 03 03 00 42 16 7b  d5 fa a6 30 94 8e a0 a7  |.....B.{...0....|
+000000b0  24 59 b9 3d 85 b0 2f d9  25 c6 5a b5 7f 51 ca 54  |$Y.=../.%.Z..Q.T|
+000000c0  4a f7 f0 72 bb dd 5e 70  14 6d 46 3f b3 86 6f c1  |J..r..^p.mF?..o.|
+000000d0  a4 5f 6d ba 97 f3 38 c0  24 4a 9f de 7b b9 49 12  |._m...8.$J..{.I.|
+000000e0  71 02 f8 bc bc 65 5a ea  17 03 03 02 22 f9 92 7e  |q....eZ....."..~|
+000000f0  34 eb b3 a4 03 8e ec 48  30 a0 9b ac a6 7b b3 a5  |4......H0....{..|
+00000100  d0 4a 89 2c 92 6a c6 04  de b2 86 72 0a f1 97 61  |.J.,.j.....r...a|
+00000110  da 70 ef 25 5a a3 f1 b3  3d 78 f1 ec 2b 8f 34 2b  |.p.%Z...=x..+.4+|
+00000120  c9 94 e7 d2 9e 2f 09 5d  7a e3 2e fc 6e e1 ef 80  |...../.]z...n...|
+00000130  e6 0c e9 3e 07 bb b7 0e  74 0c e8 19 fe 7f d8 d0  |...>....t.......|
+00000140  fa 70 03 c1 31 c2 76 51  c3 d0 ed a6 a1 0d 20 74  |.p..1.vQ...... t|
+00000150  86 15 99 51 71 f8 3d 8e  1c 8c a8 19 0a 9c ac 4a  |...Qq.=........J|
+00000160  ab 0e e6 cc 52 a0 a8 ca  d9 71 54 aa 2c 8b 6f 5b  |....R....qT.,.o[|
+00000170  f9 46 07 0d 86 40 d9 54  33 8e de 54 a5 c2 6e 36  |.F...@.T3..T..n6|
+00000180  14 0e e3 52 78 05 56 90  98 2c e1 ec 26 f6 bd 6a  |...Rx.V..,..&..j|
+00000190  e5 0b 31 e1 a4 2a 2a 96  1b d6 57 87 ac a8 07 71  |..1..**...W....q|
+000001a0  83 d9 70 1e 5e 63 9b d1  01 83 e7 c9 c8 1c 5a 34  |..p.^c........Z4|
+000001b0  05 c0 7b da 1c ca 5f 99  49 9a 04 da c9 1c 9b ed  |..{..._.I.......|
+000001c0  b4 af 9d ff 36 71 1b 3a  00 e8 6a c4 6e 47 d9 4a  |....6q.:..j.nG.J|
+000001d0  64 f5 c1 07 ab 19 c8 65  a3 33 26 99 be 53 c3 86  |d......e.3&..S..|
+000001e0  97 10 ef c1 54 8e 69 6c  b1 29 aa 7d c1 63 67 ba  |....T.il.).}.cg.|
+000001f0  d7 72 7c 74 83 58 bd 5a  a8 a8 5f 49 38 ee 1e 34  |.r|t.X.Z.._I8..4|
+00000200  c8 98 19 73 97 2d 76 e6  d7 0d 15 75 a0 98 1f 15  |...s.-v....u....|
+00000210  c9 b8 3d 3f cb 92 a1 39  4b 91 ca e0 d2 0e 38 c2  |..=?...9K.....8.|
+00000220  20 eb f2 b5 04 64 fa d8  e2 d7 2f ba 88 7e f4 37  | ....d..../..~.7|
+00000230  c1 68 c4 2f c9 54 a1 21  5d 4b e7 67 3b 2e 6a 06  |.h./.T.!]K.g;.j.|
+00000240  55 ba d4 8d fe 0e b1 b7  2d cf c2 82 ed 27 3d 5b  |U.......-....'=[|
+00000250  9b 3b 28 a9 d4 c4 3c a0  45 b1 77 37 8b f8 7e f0  |.;(...<.E.w7..~.|
+00000260  51 90 fe 7a 74 14 ac f7  59 8b ed be 79 b0 4b 89  |Q..zt...Y...y.K.|
+00000270  d9 0c 39 fe 45 9d 15 0c  a6 96 26 0d b2 29 b0 a4  |..9.E.....&..)..|
+00000280  29 62 df 4b c0 a0 05 f1  e8 8b 16 af ea 42 8b 58  |)b.K.........B.X|
+00000290  5a ae f6 28 d8 40 09 d1  1e 21 b3 c7 a8 e2 30 4a  |Z..(.@...!....0J|
+000002a0  27 e6 c4 ba ff 62 91 7b  ab 64 18 65 02 e2 10 68  |'....b.{.d.e...h|
+000002b0  87 35 c2 09 5b 23 a4 eb  96 19 a7 1e 75 85 6e 17  |.5..[#......u.n.|
+000002c0  0e bc 11 1a f5 49 05 92  f7 0e e4 c7 85 da 4e 26  |.....I........N&|
+000002d0  5b de f2 dc 36 fb dc dd  c6 42 23 0c a7 de 8d ad  |[...6....B#.....|
+000002e0  f5 2a 8b ff b4 5d c6 ca  ec e3 83 a4 1e 23 3a 2d  |.*...].......#:-|
+000002f0  1a 52 51 11 f5 3b 93 47  89 c8 fc 21 b0 a3 4f b3  |.RQ..;.G...!..O.|
+00000300  6e d2 83 ca 20 75 fc 43  43 e5 1d 5d 57 c9 7c 17  |n... u.CC..]W.|.|
+00000310  03 03 00 a4 dc 79 73 47  d4 f5 72 c9 12 46 ed 3c  |.....ysG..r..F.<|
+00000320  d0 61 20 81 a9 ad 64 f3  f1 77 7f f1 74 09 67 80  |.a ...d..w..t.g.|
+00000330  c1 08 07 9c 50 b8 7d f5  70 f5 c6 a1 5f ba 37 78  |....P.}.p..._.7x|
+00000340  58 37 e3 f4 3f 03 1d 69  6f af 2f 2b 8b 10 95 5a  |X7..?..io./+...Z|
+00000350  be a1 5c b8 42 61 65 5a  27 35 f6 b4 57 3d 3a 6b  |..\.BaeZ'5..W=:k|
+00000360  f4 e9 90 88 7b e3 7c bf  be 51 19 0e 51 53 cd 10  |....{.|..Q..QS..|
+00000370  2c 70 76 9e d1 32 28 8f  c4 6c 01 2c 46 8f 4d 14  |,pv..2(..l.,F.M.|
+00000380  21 a2 63 39 44 b3 03 0d  a3 9d a0 c8 f4 cf 5d 7e  |!.c9D.........]~|
+00000390  d2 17 05 ee 9c 5c 1a 2e  43 dc 3f 6d d9 f2 54 5d  |.....\..C.?m..T]|
+000003a0  64 ff d2 1c 21 73 66 b1  2c 21 9d 3f bf fe f8 a5  |d...!sf.,!.?....|
+000003b0  79 54 fe 8a d5 3d 5f f6  17 03 03 00 35 0f 01 eb  |yT...=_.....5...|
+000003c0  f8 46 f8 07 7a 06 69 45  e2 47 4d b0 eb 9c 82 8b  |.F..z.iE.GM.....|
+000003d0  5d d0 59 66 d1 b5 a2 7b  b2 f0 72 6f 34 8b 2c 05  |].Yf...{..ro4.,.|
+000003e0  84 53 1c 7b 24 d8 f0 cd  a3 46 d1 ed 08 22 bb e6  |.S.{$....F..."..|
+000003f0  38 98                                             |8.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 1d fa f6 f0 5f  |..............._|
-00000010  36 d9 1a b8 03 4b b5 2e  ba ca 43 ea 31 c2 08 05  |6....K....C.1...|
-00000020  e5 a1 55 2e 93 82 3b d5  5a b3 ca fe 11 92 9a 30  |..U...;.Z......0|
-00000030  7e d8 02 b4 95 29 8f 29  ba b5 34 22 97 99 bc a9  |~....).)..4"....|
-00000040  43 1f 18 5c e2 26 7e 2e  5d ff 2c 68 86 82 7c da  |C..\.&~.].,h..|.|
-00000050  7e da c5 46 21 69 37 3b  f5 65 a4 cd 70 ed e3 c8  |~..F!i7;.e..p...|
-00000060  47 21 88 8d 45 3a 0f c9  1e 37 a9 0a 6e 2e 59 0e  |G!..E:...7..n.Y.|
-00000070  1b 6b 08 22 10 81 74 00  0c 15 6f c6 1e a0 2d 60  |.k."..t...o...-`|
-00000080  b1 c6 ec 65 ff 91 16 1a  e4 18 86 1b 43 04 dc b1  |...e........C...|
-00000090  a0 f2 1d e8 4e 46 72 84  20 14 75 1e 72 52 1b 46  |....NFr. .u.rR.F|
-000000a0  1f 8a ed 08 c8 e0 07 1b  6d e3 44 68 ec 52 74 d5  |........m.Dh.Rt.|
-000000b0  8d 7f 41 96 b4 77 01 25  0c 1f aa 50 2f 8b d7 1a  |..A..w.%...P/...|
-000000c0  77 1b 24 01 0b 1f 0f c2  0f e1 00 db 0a 28 e9 c5  |w.$..........(..|
-000000d0  a7 22 a2 fd c2 98 c5 69  51 91 d4 55 0f 52 da 33  |.".....iQ..U.R.3|
-000000e0  47 f2 34 bd 06 bb 22 53  55 8c 6c e1 95 b5 0f b8  |G.4..."SU.l.....|
-000000f0  e5 8a 64 51 50 47 5d ca  5b 1a 20 22 99 b2 d4 74  |..dQPG].[. "...t|
-00000100  9e 6b 01 44 6b 7c 40 a0  e3 95 eb 96 53 c0 8d c0  |.k.Dk|@.....S...|
-00000110  c1 e1 2b 21 04 f1 64 03  ba 0f d9 34 57 f2 2e 62  |..+!..d....4W..b|
-00000120  5e f6 69 d6 86 3e f0 00  96 ca b7 ed 7d b4 1c 79  |^.i..>......}..y|
-00000130  f3 ea f4 10 79 d2 6d 6e  49 6c e4 32 c1 81 da 9d  |....y.mnIl.2....|
-00000140  cc 59 ea 41 3f 1e 62 34  61 6b 0e a4 07 4f ef f7  |.Y.A?.b4ak...O..|
-00000150  a3 31 ee 52 14 60 4c 06  5c 69 49 8e 6a ab e9 94  |.1.R.`L.\iI.j...|
-00000160  bf cc a5 12 b7 94 10 87  2f cc d8 40 b1 f3 a9 27  |......../..@...'|
-00000170  97 5c 7f 85 f9 14 dd e0  66 27 9e 3d f4 eb 75 ab  |.\......f'.=..u.|
-00000180  1d 1a c0 c3 72 af 6e 13  bb 24 ac fe f0 fb 47 d0  |....r.n..$....G.|
-00000190  1d 79 37 70 86 d3 43 9b  64 8c d0 f5 2b a8 7a 77  |.y7p..C.d...+.zw|
-000001a0  4a e7 92 a3 bf 1e db 22  5a 40 39 07 76 1c 71 de  |J......"Z@9.v.q.|
-000001b0  9c ff 75 b7 0d 6e 3e 14  69 8d 08 e5 f3 24 ae 6a  |..u..n>.i....$.j|
-000001c0  61 f3 dd a7 57 52 9e da  f1 de aa 07 11 65 41 64  |a...WR.......eAd|
-000001d0  61 57 23 71 47 aa 8e 47  9c 5f 99 84 90 2d 9a fd  |aW#qG..G._...-..|
-000001e0  5b 15 27 44 41 5c a0 41  87 05 8a 53 8f ed 93 22  |[.'DA\.A...S..."|
-000001f0  50 15 b4 60 55 c7 78 20  b5 d8 dd 9d 5d 8c 69 bc  |P..`U.x ....].i.|
-00000200  74 da d6 a6 a6 86 fe 93  e1 48 48 f2 f0 36 93 86  |t........HH..6..|
-00000210  d6 62 9d 09 3a 19 f7 9d  01 9b 87 85 17 03 03 00  |.b..:...........|
-00000220  99 37 bf 65 e8 18 ef 10  d7 02 e2 73 3f 13 4a 6f  |.7.e.......s?.Jo|
-00000230  ea f0 e2 c8 a3 fc a4 3a  d2 ea 96 2d 77 cb cc b3  |.......:...-w...|
-00000240  1d 8a 77 4d 97 a6 e9 6e  6e b5 af 67 d1 e4 e6 be  |..wM...nn..g....|
-00000250  0b 05 b1 da 15 83 ca af  19 cf 57 60 05 16 47 bd  |..........W`..G.|
-00000260  ce 94 f9 bf 48 5c 2c 38  57 57 c3 39 9b 84 19 59  |....H\,8WW.9...Y|
-00000270  db fc 09 06 29 4d e7 71  be d4 86 12 fa 8e 54 e8  |....)M.q......T.|
-00000280  b0 7e 79 56 dc b2 7a 30  08 e2 8b c7 fa 46 ce 84  |.~yV..z0.....F..|
-00000290  d3 3e 6d 1c 8d 4c 5e 76  c7 d2 1d 8b 85 5d be a3  |.>m..L^v.....]..|
-000002a0  1b d8 92 72 6d b1 73 d9  b4 a7 14 00 58 80 79 a9  |...rm.s.....X.y.|
-000002b0  75 55 96 af d9 d2 20 92  ef ca 17 03 03 00 35 b0  |uU.... .......5.|
-000002c0  fe 3f 36 6e 82 b5 d3 7c  e9 7b 75 d6 b1 4d f6 7b  |.?6n...|.{u..M.{|
-000002d0  d0 10 68 32 9a 7b 04 69  38 bf a2 42 1b 3d 14 75  |..h2.{.i8..B.=.u|
-000002e0  31 00 90 d4 1b b1 bf 5b  76 65 50 42 21 60 75 30  |1......[vePB!`u0|
-000002f0  f9 b8 ee 45 17 03 03 00  17 0b b8 78 9e a2 94 45  |...E.......x...E|
-00000300  47 f4 8e af 08 d0 80 75  09 7b c6 44 45 82 19 30  |G......u.{.DE..0|
-00000310  17 03 03 00 13 0e fb b9  24 58 7c ab 97 b3 6e 2e  |........$X|...n.|
-00000320  55 50 ff 05 5d 04 dc 72                           |UP..]..r|
+00000000  14 03 03 00 01 01 17 03  03 02 11 ce 65 5f 9d 1a  |............e_..|
+00000010  c6 5f 48 ea da 02 77 1d  79 b2 82 1a da c4 75 aa  |._H...w.y.....u.|
+00000020  11 af ae 1f e4 7e d7 6f  ed 75 48 56 de c8 36 05  |.....~.o.uHV..6.|
+00000030  6a 97 5e 49 49 55 25 6f  ef 3e ed 40 3f 91 9a ae  |j.^IIU%o.>.@?...|
+00000040  f4 a1 d3 02 d3 15 60 23  1b 7a 80 ef ef 60 bb 62  |......`#.z...`.b|
+00000050  a3 8d 6b 24 1a 11 7d 8e  00 76 54 69 f1 b5 df 77  |..k$..}..vTi...w|
+00000060  c0 3a a3 8d 9d a3 56 e7  4d 2d 68 fe 38 49 6d 42  |.:....V.M-h.8ImB|
+00000070  3d 2c 69 fd 8c 53 44 af  13 8b 1d cb dc 04 16 6e  |=,i..SD........n|
+00000080  5a ab 0a 00 19 cf a0 8a  ee bd 71 24 68 ee 18 2a  |Z.........q$h..*|
+00000090  ec 04 fe 0f 12 15 8e 09  e0 87 de 4e c4 2a a1 a5  |...........N.*..|
+000000a0  6d be 79 6e 25 15 11 64  8c 35 71 97 fa a4 43 e2  |m.yn%..d.5q...C.|
+000000b0  dd cd a1 da b3 75 5d d5  36 fb b4 6b 12 30 a7 f6  |.....u].6..k.0..|
+000000c0  d7 7c 72 e1 f8 6a 8b 3e  38 13 9c da ee 07 3d 6a  |.|r..j.>8.....=j|
+000000d0  f5 1b 26 73 ff 24 03 1f  ea dc f3 ed 6b c2 0d fe  |..&s.$......k...|
+000000e0  3e 03 c4 22 93 c9 9b fe  22 5c 1e fb 07 2b 1b 7f  |>.."...."\...+..|
+000000f0  34 ff c6 1b 24 32 4b b1  ee 4c 0b 08 b6 3b 1e aa  |4...$2K..L...;..|
+00000100  49 f3 04 b7 9a 42 e5 42  5a df a2 92 d3 2f 62 54  |I....B.BZ..../bT|
+00000110  e1 21 08 ee ce 64 80 48  d3 6a 15 67 8c 5e d1 ac  |.!...d.H.j.g.^..|
+00000120  a2 64 f9 10 67 2c 27 7e  10 11 d7 09 13 2f 61 a7  |.d..g,'~...../a.|
+00000130  d7 9d 2a 18 0f a8 93 c6  fc 75 5c 31 68 42 22 e6  |..*......u\1hB".|
+00000140  5c e8 4d 7d 82 73 ba 97  5c d7 6a a2 14 37 85 93  |\.M}.s..\.j..7..|
+00000150  48 a7 50 9c fc 66 7b 82  a8 b6 99 0f 8c 9e 40 b5  |H.P..f{.......@.|
+00000160  e4 4f 98 01 db 56 03 44  f9 9f 52 a3 33 ac 77 2a  |.O...V.D..R.3.w*|
+00000170  b6 0a de d5 68 a5 df 67  41 8d 4c 53 9d c4 8d b7  |....h..gA.LS....|
+00000180  2e 3d 1f 93 1c 23 e3 81  76 5a 99 7c 90 60 d8 4d  |.=...#..vZ.|.`.M|
+00000190  e4 a5 00 7d f9 2c c5 19  bc 3c a3 73 c3 83 ff 31  |...}.,...<.s...1|
+000001a0  6a 67 88 32 d3 90 7f ab  20 19 1f 55 72 e4 08 bc  |jg.2.... ..Ur...|
+000001b0  c4 d6 24 e6 00 2d 85 be  d4 9b 2c e5 7b ee 26 6b  |..$..-....,.{.&k|
+000001c0  49 ed 94 3d d6 ee fd 9d  da 39 be 02 23 aa b9 78  |I..=.....9..#..x|
+000001d0  f2 41 97 0a d9 66 15 1e  e1 a2 49 f3 09 f0 25 91  |.A...f....I...%.|
+000001e0  8a ea f5 38 87 ea 66 ae  dc d2 04 d1 02 92 ab 6c  |...8..f........l|
+000001f0  a4 1a cc 1b ba 48 d5 8e  27 c4 c5 34 08 8f c2 c8  |.....H..'..4....|
+00000200  e1 e6 a8 98 48 9c 43 6c  f1 34 ba c0 ff 8e 22 14  |....H.Cl.4....".|
+00000210  f7 f9 93 38 96 1e 73 57  28 5b 25 3e 17 03 03 00  |...8..sW([%>....|
+00000220  99 c7 8d 1d 62 23 f3 c1  31 3d 45 bc d5 59 ff 47  |....b#..1=E..Y.G|
+00000230  8e 34 3d 1d 06 cc e0 05  ea 38 87 f0 fd c3 84 53  |.4=......8.....S|
+00000240  47 6b fb 7b 9b c2 a4 f2  1f e0 61 ab 17 32 d0 57  |Gk.{......a..2.W|
+00000250  34 dd fb 42 9b ad 4c d7  20 ff b1 58 34 e0 0c b1  |4..B..L. ..X4...|
+00000260  44 0c cf d3 05 be 3b 8e  a2 d5 39 44 c8 22 64 ad  |D.....;...9D."d.|
+00000270  61 80 df 5d fd 40 0e c0  c2 41 4f a7 e5 4f b3 7f  |a..].@...AO..O..|
+00000280  0b db d6 ac fe ba c0 8b  24 8e e8 b2 d6 93 3d 12  |........$.....=.|
+00000290  75 41 85 1d b5 4a e2 e0  f8 a1 23 8f 13 24 c6 b6  |uA...J....#..$..|
+000002a0  e5 db 06 3f d8 d5 2f b5  e5 24 59 76 53 dd aa 0a  |...?../..$YvS...|
+000002b0  26 ba 72 23 63 ac 4d 5c  92 13 17 03 03 00 35 47  |&.r#c.M\......5G|
+000002c0  59 18 68 11 0a 9a 0b 66  d3 c0 26 72 da 51 0e 00  |Y.h....f..&r.Q..|
+000002d0  b0 78 8b 6a ef df 75 94  94 b0 aa 9b 77 e3 9c d8  |.x.j..u.....w...|
+000002e0  23 9d 74 ce 85 55 c0 30  4c 96 5b 59 7a f6 03 2e  |#.t..U.0L.[Yz...|
+000002f0  d8 9c 0e 11 17 03 03 00  17 74 ed 13 0b 6a 15 18  |.........t...j..|
+00000300  5e d4 5e 8a c6 e6 5c 0b  3c d0 1b 3d 68 86 2a 07  |^.^...\.<..=h.*.|
+00000310  17 03 03 00 13 6f e2 fe  a0 b8 95 d4 aa fd 11 2b  |.....o.........+|
+00000320  e8 6d 42 28 d1 ca 1c 5e                           |.mB(...^|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled b/libgo/go/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled
deleted file mode 100644 (file)
index 98d718b..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
-00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
-00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
-00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
-00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
-00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 e5 55 1c 7e bc  |....z...v...U.~.|
-00000010  05 a3 af 8b 02 03 6a 08  34 35 43 9f 35 c1 39 36  |......j.45C.5.96|
-00000020  97 ab d9 4f 77 26 88 31  f8 1c a4 20 00 00 00 00  |...Ow&.1... ....|
-00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 63  |..+.....3.$... c|
-00000060  74 2f 45 26 f4 7c cd d6  cb 8d 9f b5 6b 88 41 ef  |t/E&.|......k.A.|
-00000070  f4 cd 00 54 91 29 98 e4  a0 6b 6d b5 2f 39 01 14  |...T.)...km./9..|
-00000080  03 03 00 01 01 17 03 03  00 17 e6 81 13 75 85 fe  |.............u..|
-00000090  7d c6 09 24 01 bf 44 78  65 4e 5f d0 37 b9 89 15  |}..$..DxeN_.7...|
-000000a0  98 17 03 03 00 42 88 5c  b3 19 ee 62 c0 2d 95 51  |.....B.\...b.-.Q|
-000000b0  fd 88 e0 13 aa 53 e5 5a  45 be 0f 07 6f 46 c8 1b  |.....S.ZE...oF..|
-000000c0  a2 b5 2a 7c 46 5f b5 90  46 95 b9 a4 ce 44 a8 a7  |..*|F_..F....D..|
-000000d0  3d 8e ce d2 76 57 44 e0  0e 83 af f3 2f 00 55 cb  |=...vWD...../.U.|
-000000e0  1f e7 d2 42 22 6f 78 0c  17 03 03 02 6d 45 f7 95  |...B"ox.....mE..|
-000000f0  68 b9 ad 32 13 34 84 c2  dd 62 a7 f5 18 0f 0b a6  |h..2.4...b......|
-00000100  b8 5c dd 06 69 0d 07 ea  6b ec ad ad a7 13 ea f3  |.\..i...k.......|
-00000110  87 9b 74 a9 53 49 b3 a9  ff f3 eb 71 1b 25 63 8b  |..t.SI.....q.%c.|
-00000120  c6 0f 6a 21 bc f1 fb 4b  8e d4 07 6e c6 8e 9f bf  |..j!...K...n....|
-00000130  73 eb 1e a5 d7 e4 a1 cd  6e 7e de 45 a2 b4 6f 25  |s.......n~.E..o%|
-00000140  fe c2 a1 84 b8 09 d1 65  90 6d ef 07 ea d0 25 01  |.......e.m....%.|
-00000150  54 f2 8e f8 53 38 1e 35  a9 af be 2a 8d 81 9b 77  |T...S8.5...*...w|
-00000160  38 22 42 b8 56 ea 72 ab  c3 ac 9b 17 1a 0b 65 94  |8"B.V.r.......e.|
-00000170  8a 81 6d 83 c6 f4 76 32  ed f7 84 4d ec 17 0e 45  |..m...v2...M...E|
-00000180  74 e8 ba b0 46 92 62 8c  73 07 a8 1f d5 d3 44 d1  |t...F.b.s.....D.|
-00000190  53 21 62 8b 02 c6 20 40  1d f1 75 2b 8a 6a 60 2a  |S!b... @..u+.j`*|
-000001a0  ee 04 5f c0 46 6d 74 7a  18 4a e0 ca d4 a6 6a a2  |.._.Fmtz.J....j.|
-000001b0  11 21 20 4a 3e 57 3c 67  ff 61 3d 15 32 14 f2 01  |.! J>W<g.a=.2...|
-000001c0  a2 cc 96 f6 d1 2d 4f ba  67 ed 02 ae a9 08 13 74  |.....-O.g......t|
-000001d0  33 f6 b5 ad e3 e3 ee 0e  65 f6 89 db 80 d4 f5 23  |3.......e......#|
-000001e0  7b 5d 7a af 5f c6 43 b7  87 f6 90 25 5a f0 f6 76  |{]z._.C....%Z..v|
-000001f0  63 9c 93 d0 f3 94 9c 55  f7 e7 8f 2d cb 83 fb a1  |c......U...-....|
-00000200  b3 db 11 d7 f9 f7 4b 66  50 55 64 31 3f fc 97 df  |......KfPUd1?...|
-00000210  65 f9 e0 eb a2 5e 4d 9d  c7 35 fb 1c 22 79 b1 00  |e....^M..5.."y..|
-00000220  28 e9 54 28 a9 e6 97 e8  33 92 ac 8e f7 c0 82 ac  |(.T(....3.......|
-00000230  99 04 f0 f0 cc e7 4f 04  ad fe dc 9f 25 82 93 12  |......O.....%...|
-00000240  64 4a f6 34 da 41 8a f7  a9 3e fe 24 ae be 40 b7  |dJ.4.A...>.$..@.|
-00000250  10 59 17 11 6f 3c 11 8b  eb b2 42 e7 d5 b7 ee d2  |.Y..o<....B.....|
-00000260  ae 95 9c 21 48 34 d9 5a  20 95 7c 72 35 05 5e 6c  |...!H4.Z .|r5.^l|
-00000270  a2 05 46 30 e6 33 d3 91  ac c8 17 4b b1 15 cc f0  |..F0.3.....K....|
-00000280  af bb 7c 56 e0 5b 25 8e  35 e0 2e 35 91 0d e0 bc  |..|V.[%.5..5....|
-00000290  f6 9c 3b 15 f8 96 dc 4e  6c aa 57 c9 f0 1f 55 e2  |..;....Nl.W...U.|
-000002a0  d9 5d 09 71 f9 af 17 69  29 d5 94 8a 5f fa b2 ad  |.].q...i)..._...|
-000002b0  1b b9 ce 90 e7 bd 02 1b  ad 9d 91 19 7e f3 8f 2d  |............~..-|
-000002c0  70 d5 af 2c e7 29 b1 f9  3c 5a 7f 04 6f 73 88 da  |p..,.)..<Z..os..|
-000002d0  84 bd d7 ad 01 dd 35 b7  1f 64 79 89 ab cb 21 d1  |......5..dy...!.|
-000002e0  20 c5 71 b7 78 fe 93 c0  41 33 d8 aa a2 ed a4 64  | .q.x...A3.....d|
-000002f0  fb 5b c1 6e 0d 1e f7 ca  f6 01 a1 9a fc 82 af 34  |.[.n...........4|
-00000300  e3 45 d8 5a b9 81 e7 e4  c2 26 a7 79 b7 f4 87 9f  |.E.Z.....&.y....|
-00000310  2e 16 ab 96 21 e2 5f 1f  c9 e0 30 3e 97 27 42 15  |....!._...0>.'B.|
-00000320  6f 13 da a1 b2 b1 43 76  69 eb f1 c6 e2 b5 6c 57  |o.....Cvi.....lW|
-00000330  e0 88 c9 0d 7d 37 1b 0b  a0 b7 cd 6b ba 3a 52 55  |....}7.....k.:RU|
-00000340  61 c6 5c 71 ce 1e 69 b9  ea b4 c6 a5 78 c5 b8 b6  |a.\q..i.....x...|
-00000350  4e b1 94 84 a3 d4 31 d9  3b 15 17 03 03 00 99 6c  |N.....1.;......l|
-00000360  5d dd 43 24 9d 6e 5d 64  d3 54 30 aa 98 c3 7e 21  |].C$.n]d.T0...~!|
-00000370  05 06 fc 3b eb 52 12 36  6b 2e e1 32 5a 59 30 a7  |...;.R.6k..2ZY0.|
-00000380  b0 bb 52 1a 36 e6 78 20  84 8c cf 0d 90 da c7 88  |..R.6.x ........|
-00000390  c4 2f bc b4 b6 03 1b 34  9b c8 12 db bc 87 95 d3  |./.....4........|
-000003a0  84 4e 41 c1 de 2f 4c 66  d9 13 fc 78 31 05 6c 67  |.NA../Lf...x1.lg|
-000003b0  e3 3d 28 36 0f fe 5f 45  29 d2 1b 4d a5 60 dc f7  |.=(6.._E)..M.`..|
-000003c0  20 74 cf f5 7b 3f f7 58  53 0c 64 7d 3f c6 f1 ac  | t..{?.XS.d}?...|
-000003d0  a9 1b 60 d8 ea a5 32 11  23 6d 66 19 70 2b fa ce  |..`...2.#mf.p+..|
-000003e0  c8 f6 9d cc 12 83 a1 e1  4b be 98 d3 c2 56 65 34  |........K....Ve4|
-000003f0  73 3a b3 6e d8 2c db 3b  17 03 03 00 35 e6 ce 17  |s:.n.,.;....5...|
-00000400  e5 92 38 9e 00 2d 66 bf  a9 e2 13 66 01 af 64 15  |..8..-f....f..d.|
-00000410  8d da 6b f3 a7 f6 5c 76  e1 f4 c4 2f dc 93 c4 3c  |..k...\v.../...<|
-00000420  69 5a 30 e5 db 5a b5 0b  98 4e 43 a3 51 ba 41 9d  |iZ0..Z...NC.Q.A.|
-00000430  18 c0                                             |..|
->>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 24 0f 0c cc 6a  |...........$...j|
-00000010  8e 07 9c d7 f9 84 55 cc  79 a7 c1 c5 fb 6e 29 5e  |......U.y....n)^|
-00000020  31 e1 b1 00 c0 c9 a8 94  59 75 f4 b5 86 7c a4 8c  |1.......Yu...|..|
-00000030  8d 79 dd 42 45 67 69 f5  fb f0 02 54 f5 8f 1a 86  |.y.BEgi....T....|
-00000040  2f a0 4e 9b 68 e2 69 36  48 cb 8e cc 26 fa 1b 60  |/.N.h.i6H...&..`|
-00000050  c8 f3 b7 7c 36 dd 59 71  a3 f8 9a 7a bc 8a e1 10  |...|6.Yq...z....|
-00000060  8f 6d 69 60 07 b6 62 6d  d3 2b fa a4 81 eb ae 3f  |.mi`..bm.+.....?|
-00000070  9d 7e 1d d7 d1 89 24 4e  7e 65 4b d2 37 58 b2 56  |.~....$N~eK.7X.V|
-00000080  a1 8e 10 73 44 9c f1 c7  60 97 49 99 e2 82 74 58  |...sD...`.I...tX|
-00000090  e3 1f 41 ec 1d 13 85 f1  95 98 39 cb d1 51 f7 0e  |..A.......9..Q..|
-000000a0  fe e4 fa 04 20 1a f2 c5  ae 64 9d eb f8 ff 03 ce  |.... ....d......|
-000000b0  ca 12 7c dd a6 b4 2c a3  eb 8e 83 2c cf 77 6b 82  |..|...,....,.wk.|
-000000c0  68 77 58 5d 3e ef 01 0b  78 e9 37 b0 36 9c 62 44  |hwX]>...x.7.6.bD|
-000000d0  88 ae f1 5a d7 93 81 0a  84 cf 4f 3b db 05 41 92  |...Z......O;..A.|
-000000e0  4d 31 3d 06 9e 73 11 43  de 3e ec b8 b0 48 99 84  |M1=..s.C.>...H..|
-000000f0  bc 0c 7c 86 93 03 d5 5f  c5 21 34 a5 cc c7 d5 42  |..|...._.!4....B|
-00000100  1d 69 94 53 39 d9 56 07  40 46 44 89 e6 95 8d e9  |.i.S9.V.@FD.....|
-00000110  ca 6d f0 e0 2a 22 70 bc  e7 7f 8e 15 0c 56 51 e3  |.m..*"p......VQ.|
-00000120  46 5c b9 66 c5 8b 07 d3  f0 bb 84 fe 71 d6 a2 90  |F\.f........q...|
-00000130  d9 ec 46 00 82 10 38 9c  8f 35 e5 48 d8 82 7f 65  |..F...8..5.H...e|
-00000140  68 f5 42 48 74 6b 29 79  f3 32 b6 a1 aa 42 73 e3  |h.BHtk)y.2...Bs.|
-00000150  c3 f6 fc 76 9e 32 59 26  a6 75 4a dc 65 23 73 10  |...v.2Y&.uJ.e#s.|
-00000160  35 79 a5 41 7b 72 d5 cd  33 1f 7d 98 b3 39 4b f6  |5y.A{r..3.}..9K.|
-00000170  e8 09 ed d6 62 a0 48 b5  76 47 2e 7e 1a 5d 75 6d  |....b.H.vG.~.]um|
-00000180  c2 98 22 17 b1 8f 2e a5  a2 b3 b3 5e d9 89 c5 a0  |.."........^....|
-00000190  46 2a ac af 20 66 e9 f3  02 84 26 51 c0 0a 2e 0c  |F*.. f....&Q....|
-000001a0  d3 90 3c 9f 19 3f 25 3e  7d 3a 38 6f f3 ce 2f c4  |..<..?%>}:8o../.|
-000001b0  7b 84 e4 d5 c2 c8 90 54  6d 2c 59 70 34 44 53 25  |{......Tm,Yp4DS%|
-000001c0  ee ee d6 7e 13 30 1e 09  ff f2 79 bd 7c a1 af a9  |...~.0....y.|...|
-000001d0  a9 7b 51 6a d8 17 41 22  f5 d0 5d 84 00 a7 5f 1a  |.{Qj..A"..]..._.|
-000001e0  b6 15 98 de f4 bd cd fe  70 38 5c 0f 44 60 5a 7d  |........p8\.D`Z}|
-000001f0  be df 6e 56 bb 83 0b 10  fa 5d 3a 2c 9e 4a 00 7f  |..nV.....]:,.J..|
-00000200  ec f4 42 52 52 95 5e e1  bd cc cf a0 45 c2 79 2c  |..BRR.^.....E.y,|
-00000210  10 4d 14 35 ad bd 18 d4  b1 aa 09 65 17 03 03 00  |.M.5.......e....|
-00000220  99 a4 2c 7a c2 25 ba 3b  a2 84 1f e8 a0 d1 5c c4  |..,z.%.;......\.|
-00000230  bb c6 f8 fc eb 19 3e f5  e6 53 9f c3 35 d3 7a 00  |......>..S..5.z.|
-00000240  68 e1 e0 2f 73 75 d7 2d  df 44 aa 34 43 bf 66 c1  |h../su.-.D.4C.f.|
-00000250  31 0d e6 86 f8 71 6b 71  ac 89 c5 26 cf d9 1e 43  |1....qkq...&...C|
-00000260  33 c3 48 68 e0 4d f5 d5  69 ff fc 02 47 cc 91 41  |3.Hh.M..i...G..A|
-00000270  83 41 58 04 2a 02 53 3c  3b 0a 4c 18 16 00 fd e8  |.AX.*.S<;.L.....|
-00000280  64 54 0d 34 a1 3d a5 4b  bd c2 54 17 c3 5a 82 7a  |dT.4.=.K..T..Z.z|
-00000290  55 5d a9 57 63 62 ef 8b  3a 75 f2 cd 34 ef d6 30  |U].Wcb..:u..4..0|
-000002a0  08 7f 03 0b c3 eb 29 94  88 11 38 42 40 6f bf cc  |......)...8B@o..|
-000002b0  d4 01 3f 8a 90 11 f9 da  fd 9e 17 03 03 00 35 7d  |..?...........5}|
-000002c0  2d 12 d7 58 d0 76 43 25  d1 8d 5c 5c b1 7f fa 48  |-..X.vC%..\\...H|
-000002d0  a9 21 48 02 64 76 91 6c  79 7e b9 22 33 f7 32 cb  |.!H.dv.ly~."3.2.|
-000002e0  50 22 78 02 96 4e 2d f6  09 68 06 8e 44 e6 fd 7f  |P"x..N-..h..D...|
-000002f0  cf 0a 7e a3 17 03 03 00  17 84 cd d8 f2 e2 38 2e  |..~...........8.|
-00000300  57 e5 47 76 48 50 34 9e  65 d4 c6 1d 7d b3 4e 91  |W.GvHP4.e...}.N.|
-00000310  17 03 03 00 13 e5 05 98  5b 87 5d db ae 89 38 2c  |........[.]...8,|
-00000320  35 89 31 14 73 cd 16 54                           |5.1.s..T|
index d2092baa8c63e51aeb54ba9e90610d87bae288a5..9488dd6b66d692b932689f088f5cedac4e61831d 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 01 26 b2 48 f5  |....z...v...&.H.|
-00000010  b7 cc 24 54 75 e5 9d cd  17 e1 02 e4 2d e1 32 28  |..$Tu.......-.2(|
-00000020  4e 19 1e 6d 8a 1e 3f 0e  37 3c 5f 20 00 00 00 00  |N..m..?.7<_ ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 6d 36 ae 02 a9  |....z...v..m6...|
+00000010  74 ad e5 4d 55 b6 4a 70  c6 f5 cf d5 68 d9 2a 5f  |t..MU.Jp....h.*_|
+00000020  9b 4b 23 ce 38 9b f3 da  44 72 7d 20 00 00 00 00  |.K#.8...Dr} ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 67  |..+.....3.$... g|
-00000060  35 32 50 33 37 9b 04 46  e4 7d 40 53 9d 3b c3 53  |52P37..F.}@S.;.S|
-00000070  6d 16 d3 7a 95 ec 2b 09  37 ff 01 55 60 9c 53 14  |m..z..+.7..U`.S.|
-00000080  03 03 00 01 01 17 03 03  00 17 b9 d8 da 19 0a e9  |................|
-00000090  37 9a 76 b8 b1 e6 38 27  83 aa 0a 3a d5 cc 9a 25  |7.v...8'...:...%|
-000000a0  1c 17 03 03 00 20 17 a1  70 92 5e 78 bf 9f e3 0c  |..... ..p.^x....|
-000000b0  cc e8 a3 6d c9 ba 77 e1  b5 0c 4b 1e 84 08 04 33  |...m..w...K....3|
-000000c0  88 a3 05 4a e2 6a 17 03  03 02 7a f0 39 57 69 59  |...J.j....z.9WiY|
-000000d0  dd 3d b1 be 1a 06 fc 7b  21 a1 7a cb b9 6e f6 ce  |.=.....{!.z..n..|
-000000e0  62 13 c8 b6 b3 85 b2 93  22 ab 5c f2 32 a2 af 32  |b.......".\.2..2|
-000000f0  42 d1 c0 94 08 f4 ba 1f  bb d9 16 f7 2b 40 8d dd  |B...........+@..|
-00000100  43 a2 80 0e 3a e4 ff 2d  a3 18 59 b4 08 88 46 bf  |C...:..-..Y...F.|
-00000110  bb 46 58 82 b2 db 98 c0  9f 3a f8 c4 71 f0 87 ac  |.FX......:..q...|
-00000120  c5 ee 30 ea c4 b2 63 ee  d0 cb 17 06 5c 80 19 3a  |..0...c.....\..:|
-00000130  bc f8 07 a1 e8 47 b4 b2  77 e0 14 ea 5d 16 c1 31  |.....G..w...]..1|
-00000140  e6 34 bc 50 92 1a e8 9f  e5 e9 0d 60 af 00 ad 9b  |.4.P.......`....|
-00000150  e3 10 bc 64 bd d4 c0 35  e8 26 67 df fb 3d d4 e8  |...d...5.&g..=..|
-00000160  11 f2 24 13 d9 fb 68 5d  69 ce 23 98 07 e8 4a 4a  |..$...h]i.#...JJ|
-00000170  d9 d1 a7 b1 63 e1 01 08  ae e5 d1 57 1c e6 9a 5a  |....c......W...Z|
-00000180  ac 4a f8 f7 9a 33 51 d1  3b 68 42 1a 0d e0 08 f3  |.J...3Q.;hB.....|
-00000190  a1 ea 83 5c 8f 95 7f ee  bb 45 e3 72 72 2c a0 39  |...\.....E.rr,.9|
-000001a0  86 f1 e0 58 6c 82 01 b0  3c 17 09 82 f3 d9 99 0c  |...Xl...<.......|
-000001b0  24 33 7d 50 b0 b7 84 3e  9b 91 a8 1f 91 02 95 aa  |$3}P...>........|
-000001c0  44 b6 de 0e 35 e1 b7 f6  ca 73 f8 6f f4 5a 21 db  |D...5....s.o.Z!.|
-000001d0  d6 f8 04 88 4e d6 04 7c  67 93 22 9a ff d0 0e 79  |....N..|g."....y|
-000001e0  e6 cb b2 03 b9 f2 46 27  a3 1a 89 2e 8f 46 4f c5  |......F'.....FO.|
-000001f0  4a ad 09 e7 79 38 a4 84  43 19 c9 1f 62 a0 5a 4a  |J...y8..C...b.ZJ|
-00000200  fa e4 98 14 e7 34 a6 3f  07 93 ab 6a fb 1c 3e 1f  |.....4.?...j..>.|
-00000210  a2 82 0a 42 43 d7 ef e7  aa fa 42 e0 be a1 dd 4e  |...BC.....B....N|
-00000220  2e 9e 49 da 81 da bc 5f  40 fa f8 00 99 19 d0 13  |..I...._@.......|
-00000230  50 77 8b c5 69 f0 ec 7c  bd 2d 9e c5 66 16 56 ca  |Pw..i..|.-..f.V.|
-00000240  bd 51 67 7b 87 5e 1f 4d  21 05 30 72 ac a8 ab 13  |.Qg{.^.M!.0r....|
-00000250  12 dd 4c f7 e0 cc 95 c3  3e f0 94 95 40 ea c5 f1  |..L.....>...@...|
-00000260  31 f9 53 32 40 64 5f c8  29 52 7a d6 22 5c 2d e8  |1.S2@d_.)Rz."\-.|
-00000270  f9 eb f8 b9 e6 66 09 48  ad ed 73 6a 42 bc a8 7c  |.....f.H..sjB..||
-00000280  d6 f9 62 45 25 f6 bf 8a  56 13 b4 50 cb 1b 5e 8b  |..bE%...V..P..^.|
-00000290  92 f3 9d 50 fc 7d 3c e4  b1 55 ae b2 3f 6a a8 a2  |...P.}<..U..?j..|
-000002a0  f1 dd 83 9a 97 0e 3f 93  a9 6d 94 e5 cc a9 53 14  |......?..m....S.|
-000002b0  24 44 80 28 a2 6a 21 57  07 63 96 78 3f 05 40 7d  |$D.(.j!W.c.x?.@}|
-000002c0  be 83 b2 b8 b3 0a 58 a7  50 29 dc bb b1 7f c6 c7  |......X.P)......|
-000002d0  4b 5a ff 95 4a c8 50 0b  8e 44 ec 9b 0f 95 ac 8f  |KZ..J.P..D......|
-000002e0  f9 b3 19 d0 aa a6 67 f8  ce dc 67 34 0e c9 98 98  |......g...g4....|
-000002f0  82 b1 54 4a a0 0e 02 d7  02 d3 36 06 4d 51 6f e4  |..TJ......6.MQo.|
-00000300  f5 68 ff 4d 8f 00 94 a6  6b 6c 33 41 31 1a 9e 2c  |.h.M....kl3A1..,|
-00000310  f5 df 4a 43 b7 00 01 5b  6e 59 af 9c 9f bb c5 37  |..JC...[nY.....7|
-00000320  22 32 35 25 bf 69 0a 9d  75 7e aa 19 b9 4e b1 17  |"25%.i..u~...N..|
-00000330  cb f8 b5 8f 0f 81 9c df  b1 ce a0 5b f2 ed df 20  |...........[... |
-00000340  5a bd 8a 88 b1 17 03 03  00 99 15 09 f2 8d 63 c0  |Z.............c.|
-00000350  f2 00 9f e8 1a d3 0f cc  35 0b ce eb 3c 45 87 59  |........5...<E.Y|
-00000360  d9 8f f1 59 08 00 2f 6f  67 78 30 b4 cc f9 bb 7c  |...Y../ogx0....||
-00000370  ef ab 74 f5 23 fb 3d d3  95 98 2a 39 31 8b a9 88  |..t.#.=...*91...|
-00000380  12 18 36 c7 aa 7c 5c bf  16 44 b5 69 ff e4 91 96  |..6..|\..D.i....|
-00000390  c8 f9 c0 3b d2 50 18 18  21 d1 6a 36 12 2d 8c 08  |...;.P..!.j6.-..|
-000003a0  40 64 c2 cd b0 ee 73 31  ac f3 18 9f c6 d0 23 b7  |@d....s1......#.|
-000003b0  c1 bf 99 a6 62 d6 b8 6c  0e 96 2a 99 fe aa 58 60  |....b..l..*...X`|
-000003c0  3c c7 60 d6 05 64 6b 68  62 62 38 13 1e fc a9 4f  |<.`..dkhbb8....O|
-000003d0  ad e9 99 4e 7f b0 70 7d  38 79 d9 c7 d5 39 84 a8  |...N..p}8y...9..|
-000003e0  4e 63 66 17 03 03 00 35  fd 5c 31 7d ad c3 bf a2  |Ncf....5.\1}....|
-000003f0  a9 d8 15 8f aa 72 e9 db  f4 4c e7 19 e0 ca 98 65  |.....r...L.....e|
-00000400  8f 0e ac d9 e9 12 c7 37  cf 6e 0e 68 64 6e cd 29  |.......7.n.hdn.)|
-00000410  94 05 63 79 9c c6 c7 17  5a 26 c1 6f 3b           |..cy....Z&.o;|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 ba  |..+.....3.$... .|
+00000060  2a 76 cb fb 6c 6b bb 30  fb ef 87 6f e5 06 5c 6f  |*v..lk.0...o..\o|
+00000070  78 a7 44 41 93 c0 33 89  be 32 8c 0f fa 5c 43 14  |x.DA..3..2...\C.|
+00000080  03 03 00 01 01 17 03 03  00 17 ac 3e 8a 31 22 16  |...........>.1".|
+00000090  d3 69 bf 1d b5 2e 18 23  b3 21 00 17 23 a4 3f 9a  |.i.....#.!..#.?.|
+000000a0  0b 17 03 03 00 20 aa f0  51 64 b5 44 f0 28 ab 56  |..... ..Qd.D.(.V|
+000000b0  da 34 2d 62 77 4d 88 07  b6 82 ad 64 df e6 59 c9  |.4-bwM.....d..Y.|
+000000c0  91 e5 f8 f2 67 88 17 03  03 02 7a cf 2d 71 db 3f  |....g.....z.-q.?|
+000000d0  05 45 b8 68 18 1c b9 66  b6 00 f8 dc 9d ae e5 d2  |.E.h...f........|
+000000e0  a3 a8 02 5f ac e4 95 a6  fc 96 78 7b fd 0a 21 62  |..._......x{..!b|
+000000f0  ff 7c 15 2c fb f1 21 15  1e 8d 9e f9 71 62 43 e4  |.|.,..!.....qbC.|
+00000100  c9 69 e4 fe 87 f0 9d 9e  aa a4 5c d8 4e ae 3c 38  |.i........\.N.<8|
+00000110  e5 76 21 7b 03 a8 70 6f  e8 96 39 34 e7 3c b9 51  |.v!{..po..94.<.Q|
+00000120  b4 ef ce 7d 0b 1e 57 7d  62 de 47 6a 0a b0 97 6d  |...}..W}b.Gj...m|
+00000130  49 fe ae 6f c9 d6 e4 4a  54 60 3d 55 53 06 aa 28  |I..o...JT`=US..(|
+00000140  7a 3e 7b e0 d1 8a 60 45  87 81 bf fc 98 13 1e de  |z>{...`E........|
+00000150  7a 90 73 81 13 91 3a c4  da 71 74 e0 1d d5 30 55  |z.s...:..qt...0U|
+00000160  46 6a 48 c2 0c 18 91 a3  79 8e c2 b9 5b 24 88 76  |FjH.....y...[$.v|
+00000170  5f e6 8f 24 91 95 5b 0d  38 39 5b a4 f6 0e 1a b8  |_..$..[.89[.....|
+00000180  e8 2b 0d ac a8 56 10 23  54 a5 78 c9 2a cb ed 24  |.+...V.#T.x.*..$|
+00000190  58 16 1a 2f 1c b7 72 fc  da ab 56 f6 27 d1 98 39  |X../..r...V.'..9|
+000001a0  1f f9 dd e0 1f 1f 23 1a  ff 6b af e1 17 9d ec 35  |......#..k.....5|
+000001b0  de 0b 4d a4 46 5a fd 07  56 ce 72 19 76 dc 0c 06  |..M.FZ..V.r.v...|
+000001c0  99 38 ce 58 3b 9f 13 9a  d5 b7 d6 08 a6 05 4d e1  |.8.X;.........M.|
+000001d0  75 da 59 4d ab d9 28 e8  af c4 50 f0 b1 49 f8 fd  |u.YM..(...P..I..|
+000001e0  c9 11 b8 01 70 bb 49 e2  0f 26 1b cb ee c2 7b bd  |....p.I..&....{.|
+000001f0  2f 72 78 be a1 67 1d 0c  d0 bb 4e e7 40 b3 bd 8c  |/rx..g....N.@...|
+00000200  e2 f4 4f b2 c5 4c 82 49  51 00 44 17 c6 82 72 f5  |..O..L.IQ.D...r.|
+00000210  cd 55 c1 43 28 52 85 2b  5d 91 33 9c 15 34 6e ae  |.U.C(R.+].3..4n.|
+00000220  77 4e 08 0c 9c d2 ae 7f  e8 83 af 60 96 10 ae dc  |wN.........`....|
+00000230  58 6a 3b ae 15 e5 9c a8  25 f3 69 71 f7 94 9c 75  |Xj;.....%.iq...u|
+00000240  e0 b5 05 16 ae ce f4 23  20 30 aa 74 a3 63 68 76  |.......# 0.t.chv|
+00000250  f6 ec 64 e1 3d f6 0e b6  c4 7d a8 08 44 a9 96 1d  |..d.=....}..D...|
+00000260  7d c8 22 a8 df 04 2c ad  65 f1 4c 99 7d a1 cb bd  |}."...,.e.L.}...|
+00000270  b7 d4 d7 b5 ee 88 bd 15  2e 75 76 e2 72 bb 7d e6  |.........uv.r.}.|
+00000280  5b eb fc f7 96 96 f0 3c  aa b6 a8 58 92 e9 29 f6  |[......<...X..).|
+00000290  40 bf 8e 14 23 7c 45 da  e9 17 4b 32 16 11 ec 74  |@...#|E...K2...t|
+000002a0  78 d5 8c 5a 06 46 e4 dc  90 b9 44 8e d6 8a 4e 43  |x..Z.F....D...NC|
+000002b0  7f f9 60 9e a1 46 fa 16  88 ab 3c f1 1e d0 2e 00  |..`..F....<.....|
+000002c0  5d 01 e6 a7 b1 27 f7 40  26 17 f3 da fb cd 06 d1  |]....'.@&.......|
+000002d0  4e 27 75 9a 6f 0b 63 82  9c 40 07 4c 6e 0d d8 4b  |N'u.o.c..@.Ln..K|
+000002e0  f1 e6 d5 1c 41 55 72 b5  43 24 53 1e 0e a4 08 d7  |....AUr.C$S.....|
+000002f0  44 93 00 c9 8b 49 ba 7a  32 0c d8 e6 46 87 5d 62  |D....I.z2...F.]b|
+00000300  9d 4a 11 04 67 21 19 42  50 ad ad ab dd 62 0f f7  |.J..g!.BP....b..|
+00000310  0f 57 78 82 71 f6 09 9f  41 bc 8e 34 24 7c b5 d2  |.Wx.q...A..4$|..|
+00000320  5d 0c 18 fb d8 f6 62 dc  57 6a 78 2c 21 35 d8 eb  |].....b.Wjx,!5..|
+00000330  bb f8 7e 01 63 50 c1 98  88 a4 b5 63 1e c0 68 3c  |..~.cP.....c..h<|
+00000340  41 3c b8 6e 48 17 03 03  00 99 b6 09 37 a6 c2 d9  |A<.nH.......7...|
+00000350  5f 39 69 e1 0b ca 40 d8  31 5b 4b 4f c1 33 bf 1f  |_9i...@.1[KO.3..|
+00000360  db c2 8c 9c d2 14 26 96  4e aa b2 63 30 40 fa 49  |......&.N..c0@.I|
+00000370  fb 2d 66 59 70 cb c7 f8  fe 59 19 8b eb d5 5c 6c  |.-fYp....Y....\l|
+00000380  5c a0 c9 ba e6 4d d9 c3  e0 fe 00 c4 fb ab 8a f1  |\....M..........|
+00000390  2b ab 53 86 a7 86 57 01  b8 ae c4 a6 12 6b 7d f8  |+.S...W......k}.|
+000003a0  ea 2d df 37 04 01 eb 14  f4 9a d0 e7 67 46 ec 9f  |.-.7........gF..|
+000003b0  35 f8 d4 2e c6 95 91 10  0e dc 01 60 9a d6 f8 d8  |5..........`....|
+000003c0  9e c1 fd f8 2e e2 51 8a  e9 2f c3 4a 4f 01 31 52  |......Q../.JO.1R|
+000003d0  af cb 4b 52 96 4c 90 57  83 1f 11 97 d6 d6 16 74  |..KR.L.W.......t|
+000003e0  77 f8 c4 17 03 03 00 35  b0 61 57 8f 52 7e 93 b1  |w......5.aW.R~..|
+000003f0  f0 90 a1 23 09 6e 11 ff  a5 6c 38 f3 31 11 be 03  |...#.n...l8.1...|
+00000400  ad 59 65 57 1b 60 2b fc  41 98 e0 79 6d 14 26 c8  |.YeW.`+.A..ym.&.|
+00000410  fb d6 5f 00 e0 cc 70 46  a3 81 e4 3c ff           |.._...pF...<.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 7e e6 cb d5 bf  |...........~....|
-00000010  e1 5f 0a a5 6f 08 47 a4  27 a0 a0 2d 8e 6b 56 c6  |._..o.G.'..-.kV.|
-00000020  2e d4 7d 3d 83 f0 25 31  59 9d e5 61 a0 95 21 2e  |..}=..%1Y..a..!.|
-00000030  f8 39 8c 16 4b 6e d9 e0  19 23 05 b0 6c 89 2c f2  |.9..Kn...#..l.,.|
-00000040  e2 60 fb 83 99 2b 33 37  38 b0 85 67 cf 91 5f 22  |.`...+378..g.._"|
-00000050  32 8b 10 f6 0b 2b 0d 4a  18 32 e7 41 fc 07 58 54  |2....+.J.2.A..XT|
-00000060  d1 e2 6e da bb f7 4a 45  60 34 02 01 95 5e b3 4f  |..n...JE`4...^.O|
-00000070  0a df 33 d6 07 06 fc 20  5a 97 2f b8 bf 66 23 40  |..3.... Z./..f#@|
-00000080  32 24 0d f5 c8 a2 aa e4  6a 85 21 d5 a3 95 a8 3b  |2$......j.!....;|
-00000090  8f 6a 43 5c 96 64 80 ef  04 ed a4 10 2f e4 a8 8d  |.jC\.d....../...|
-000000a0  ff fb 77 53 28 30 cd ca  df 8e 25 08 51 ee 56 b8  |..wS(0....%.Q.V.|
-000000b0  3a ae 2f 27 a4 4a 71 9e  77 cc 70 af 62 d1 a7 2f  |:./'.Jq.w.p.b../|
-000000c0  2b 2f 98 2f e5 62 b5 3b  65 b6 2e a5 a5 19 1f c2  |+/./.b.;e.......|
-000000d0  a9 ef d8 2a 95 25 fc 10  32 31 da 29 bf 7e 58 d0  |...*.%..21.).~X.|
-000000e0  b5 2f 62 bf ed 57 c8 b4  55 85 29 66 07 52 6f 25  |./b..W..U.)f.Ro%|
-000000f0  02 2b 98 22 a5 e8 41 50  de f5 e3 e9 ce 60 f2 af  |.+."..AP.....`..|
-00000100  b3 c8 80 f1 27 2a 04 7a  1f 3b 13 0f 76 ec 6a 74  |....'*.z.;..v.jt|
-00000110  ad a9 8f e9 0d 67 9d 1c  a3 54 b3 14 a0 5c 36 80  |.....g...T...\6.|
-00000120  a7 be 7f 2b d1 89 c0 19  3f 25 c6 7a fd 04 44 c2  |...+....?%.z..D.|
-00000130  18 75 a9 44 7b cc 20 2b  f3 6a 9a e1 cc 4f aa 76  |.u.D{. +.j...O.v|
-00000140  e2 0a 45 75 81 0d d7 72  a1 e7 b2 82 02 77 45 e9  |..Eu...r.....wE.|
-00000150  f8 07 93 8b e5 79 c2 06  65 52 a5 0e 13 73 a7 f6  |.....y..eR...s..|
-00000160  be 85 5c 00 af 90 ed 83  3f b4 53 68 cf 0b b9 a6  |..\.....?.Sh....|
-00000170  06 43 3c 7a 15 6a b1 74  be af 70 3b fa 70 f3 4b  |.C<z.j.t..p;.p.K|
-00000180  d6 f7 92 8a 46 3d 46 f3  27 8b 74 6d c7 9f f4 64  |....F=F.'.tm...d|
-00000190  9b de b3 f7 1d 81 ab 8c  ca 97 fd e1 99 25 23 9f  |.............%#.|
-000001a0  54 15 fa a9 fb ab ba dd  a0 c1 b0 ad b9 4d b3 d6  |T............M..|
-000001b0  82 a1 85 06 d2 11 ff ce  03 e3 26 67 67 0e 59 17  |..........&gg.Y.|
-000001c0  ec f1 10 51 c6 26 6d ef  de e1 38 41 a0 2c 40 64  |...Q.&m...8A.,@d|
-000001d0  76 cf f7 2c 86 1f 26 4b  97 26 3c 10 cd dc 3f 3d  |v..,..&K.&<...?=|
-000001e0  27 92 50 ee d1 aa da 08  2f 01 c8 1c af 1d 39 02  |'.P...../.....9.|
-000001f0  c1 f1 17 19 64 35 70 81  9b f6 74 ec 50 42 95 ad  |....d5p...t.PB..|
-00000200  a0 72 52 67 cd 95 30 2f  c8 ad 47 11 fe 2e 60 20  |.rRg..0/..G...` |
-00000210  2c ea d5 eb 2c a2 82 6b  18 82 95 1e 17 03 03 00  |,...,..k........|
-00000220  99 7f 6a 21 64 26 3c 38  a6 39 72 58 a3 22 3d 69  |..j!d&<8.9rX."=i|
-00000230  89 1c 3d c6 79 4d 1a 92  44 4f ce 25 09 bb 8a c7  |..=.yM..DO.%....|
-00000240  ef 0c 61 85 1f 1a 0d 21  4b bd 8a 1f f9 ee 92 af  |..a....!K.......|
-00000250  78 7f 6f 3b 1b 26 09 fe  b7 fe c0 49 2a ac bf 13  |x.o;.&.....I*...|
-00000260  c3 73 b1 c4 69 bc 4c e6  b6 b5 cd 0c 69 18 57 b8  |.s..i.L.....i.W.|
-00000270  77 5a 21 8c 99 ad 09 14  26 93 fd 2e 60 03 ba 1e  |wZ!.....&...`...|
-00000280  d1 45 db c6 c9 ce c1 5c  06 67 66 68 b5 e8 43 2f  |.E.....\.gfh..C/|
-00000290  f8 ae 73 16 8a 90 75 f2  0d bc f2 6b d1 9d 99 f4  |..s...u....k....|
-000002a0  82 53 4a 54 4f 68 44 53  24 7f b3 b4 c1 4a 5d a0  |.SJTOhDS$....J].|
-000002b0  93 7a 40 12 c0 68 68 15  86 a9 17 03 03 00 35 8e  |.z@..hh.......5.|
-000002c0  86 f7 bc 9e 4e 4f 7c 69  fc 40 be 1e 71 05 42 99  |....NO|i.@..q.B.|
-000002d0  95 04 c0 a8 91 ce b8 e4  90 b9 4a 3a 3b d4 3c 27  |..........J:;.<'|
-000002e0  7b 37 27 80 17 bf 52 17  59 00 8c 67 f1 28 55 f3  |{7'...R.Y..g.(U.|
-000002f0  75 60 1e 25 17 03 03 00  17 0a 37 72 c3 59 07 9b  |u`.%......7r.Y..|
-00000300  5e 22 ec 33 fa 96 3e d2  c5 b7 87 7b 45 e1 52 24  |^".3..>....{E.R$|
-00000310  17 03 03 00 13 3b 43 97  33 75 c2 b6 9a f7 cd 96  |.....;C.3u......|
-00000320  e3 67 b7 2d cf ac d8 0a                           |.g.-....|
+00000000  14 03 03 00 01 01 17 03  03 02 7a 22 a3 3d 18 f8  |..........z".=..|
+00000010  a2 c7 8e 62 c3 07 99 b4  e6 bd 94 79 12 82 e9 e0  |...b.......y....|
+00000020  96 ff 5f c3 ec 34 02 2f  8d 95 2f 40 80 99 19 a3  |.._..4./../@....|
+00000030  bd 64 fd e4 0e b3 81 ad  4c 2e d9 72 d2 a3 bd 00  |.d......L..r....|
+00000040  81 42 78 5d f3 70 c3 78  0b fa cd b8 96 17 5e e7  |.Bx].p.x......^.|
+00000050  6e 03 b8 c6 ab 2b 2e 63  45 c7 b1 c9 98 71 c9 1d  |n....+.cE....q..|
+00000060  bb 7b 6e 6d c7 d5 90 b8  b2 4e 62 1a 8f cf 7d 99  |.{nm.....Nb...}.|
+00000070  52 3d 70 40 0f 0f 96 1c  ee a7 ff 29 2a 53 de d4  |R=p@.......)*S..|
+00000080  34 f9 d9 b2 33 2c 69 5e  2d f2 a7 62 dd ec 77 b1  |4...3,i^-..b..w.|
+00000090  6c 0f 61 86 8a bc 11 1f  91 ad f4 94 de 96 dd ef  |l.a.............|
+000000a0  d8 be 5e 45 50 fe af 1a  03 54 20 f6 05 8e a3 b0  |..^EP....T .....|
+000000b0  f7 31 93 f3 78 59 4d 54  50 99 a5 a1 53 81 1b 5d  |.1..xYMTP...S..]|
+000000c0  6d ea 32 e9 52 ab 83 d6  18 3f 2f 43 cd 64 ac 3f  |m.2.R....?/C.d.?|
+000000d0  11 6c 91 0d fa 86 f8 a5  12 eb 41 ac 24 2d 79 5b  |.l........A.$-y[|
+000000e0  ee 8e 02 46 f0 37 0a b1  19 c7 97 ed 97 d1 11 18  |...F.7..........|
+000000f0  df 80 8f f3 d7 61 a4 fe  6c ec b0 80 4e bc e4 52  |.....a..l...N..R|
+00000100  10 2f b1 6f 3f d4 39 08  81 f6 01 4b b4 d4 d5 20  |./.o?.9....K... |
+00000110  6b a1 be e6 cf c7 0e 95  e9 d7 00 07 63 25 1b 64  |k...........c%.d|
+00000120  4b b7 c4 79 29 84 45 45  5d 0d fe 72 2a 7e c6 bf  |K..y).EE]..r*~..|
+00000130  5a 98 ec e2 16 26 82 57  eb a6 dc ff 73 b6 e8 4c  |Z....&.W....s..L|
+00000140  87 52 e5 0a c1 6a 6f 02  69 17 17 ea e0 1c c1 07  |.R...jo.i.......|
+00000150  b4 f4 78 a7 99 39 8b 63  61 c2 7e 99 f4 64 16 d6  |..x..9.ca.~..d..|
+00000160  0a 84 9a 0f d4 f4 bd 4d  d4 4f 16 ec 19 30 a7 34  |.......M.O...0.4|
+00000170  f9 b9 60 10 39 25 ee 9d  bd 99 37 52 e6 32 a1 c9  |..`.9%....7R.2..|
+00000180  68 9b a2 4e 16 91 0e 54  54 d5 c5 77 bb 01 ba af  |h..N...TT..w....|
+00000190  97 be ea 09 85 91 69 84  4f 2c 04 f0 38 50 93 49  |......i.O,..8P.I|
+000001a0  e7 41 cb c1 d6 b6 77 59  09 7c 1e 0a 58 93 1e b4  |.A....wY.|..X...|
+000001b0  cf ed 32 85 b0 cd 6f 86  c7 94 8c 30 9d 83 a2 a0  |..2...o....0....|
+000001c0  4a de ad 8c b9 d8 58 d3  8c 34 6b 12 54 f1 28 66  |J.....X..4k.T.(f|
+000001d0  ea 55 d9 95 d0 b6 b3 aa  68 c3 31 e1 8f 1b f8 43  |.U......h.1....C|
+000001e0  51 b9 06 fc 53 69 9b 1c  e6 2c f8 b7 f0 47 4a 5a  |Q...Si...,...GJZ|
+000001f0  82 ca 27 df 0f 3d f8 79  90 8d c2 bd 27 85 74 6b  |..'..=.y....'.tk|
+00000200  9e 8b eb 74 a8 28 ba 6a  25 16 01 2c 56 3b c0 fa  |...t.(.j%..,V;..|
+00000210  91 ac af a7 c5 39 8d 2c  b1 f3 a2 c9 a5 72 c6 ff  |.....9.,.....r..|
+00000220  49 a0 78 14 5c 8c d2 71  de b9 4f 55 3a ca b6 a5  |I.x.\..q..OU:...|
+00000230  df ce bb f7 c2 d5 af 2c  c0 97 08 82 cc b4 02 26  |.......,.......&|
+00000240  c3 0c 99 39 4a df 6c d6  59 14 c4 d6 04 9d a4 92  |...9J.l.Y.......|
+00000250  d2 53 42 16 56 99 5f c2  82 a0 a8 5a 92 53 e6 b1  |.SB.V._....Z.S..|
+00000260  cd fc bc 9a b9 55 0b ae  2c 50 ce a3 bf d2 7d d2  |.....U..,P....}.|
+00000270  2b 58 ba 87 65 33 09 cf  74 51 0f 4b 4f a9 53 0d  |+X..e3..tQ.KO.S.|
+00000280  fa 60 1e ba e6 17 03 03  00 99 aa 43 d9 e2 e4 91  |.`.........C....|
+00000290  cf 65 fa 35 0e b0 21 51  9d c4 33 f5 7c 09 ff e5  |.e.5..!Q..3.|...|
+000002a0  db fd 6e 96 6d 13 7c 4c  ec 90 72 bd 54 6a 3f d8  |..n.m.|L..r.Tj?.|
+000002b0  1a a3 e2 a2 01 6b d6 50  a0 b1 d5 67 34 44 42 30  |.....k.P...g4DB0|
+000002c0  97 2e 82 07 46 04 56 0a  43 4b 9d 8c 81 64 bb 0b  |....F.V.CK...d..|
+000002d0  21 62 ea 23 0b 1c a0 c4  b2 cc 2f 51 b5 a2 9a a3  |!b.#....../Q....|
+000002e0  37 d3 0c 57 80 85 77 3b  8d 17 f1 a9 d5 ae 72 f9  |7..W..w;......r.|
+000002f0  cd 8c c4 2c fb c7 e0 f0  3a 5c d5 6a f7 8f 7e 53  |...,....:\.j..~S|
+00000300  c1 d0 7a b0 8d c9 b3 17  7c 99 df 54 d6 43 13 d5  |..z.....|..T.C..|
+00000310  78 9c 34 7e c9 11 4e e7  1c 8c f4 0f 82 89 94 61  |x.4~..N........a|
+00000320  80 d2 49 17 03 03 00 35  aa cd 97 5a a2 d3 27 78  |..I....5...Z..'x|
+00000330  d4 79 28 a7 57 dc 4f b1  2d b8 bd 3c ae ec e6 be  |.y(.W.O.-..<....|
+00000340  33 be b9 20 3b 69 22 03  31 34 7a 8d 68 39 c7 d5  |3.. ;i".14z.h9..|
+00000350  a1 a0 aa 46 15 94 93 d7  54 41 5b 6b 20 17 03 03  |...F....TA[k ...|
+00000360  00 17 f2 60 ff 91 c2 85  55 ed ab 39 6f 5d 0f 22  |...`....U..9o]."|
+00000370  45 3e 61 07 14 a3 05 f4  94 17 03 03 00 13 01 ea  |E>a.............|
+00000380  95 52 29 1c 63 71 3a 2d  73 a7 29 31 2c d0 ce 9f  |.R).cq:-s.)1,...|
+00000390  2b                                                |+|
index 96c8e8c1ee5455c39076554cea751196f7cc1b51..098f3ab3c984a2786bad8f699db11de9fedd4347 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,80 +7,80 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 05 cf 30 74 87  |....z...v....0t.|
-00000010  37 6e f2 12 86 19 bd ec  54 21 42 4c 2d 1a 71 4f  |7n......T!BL-.qO|
-00000020  fe de 90 2b a0 c4 73 d1  3e 57 40 20 00 00 00 00  |...+..s.>W@ ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 e8 ec ee 61 3e  |....z...v.....a>|
+00000010  c1 43 87 6d f1 61 ed d2  41 1f 7d d7 b7 c0 92 fd  |.C.m.a..A.}.....|
+00000020  34 17 85 7b c7 ff c4 56  dd 90 bd 20 00 00 00 00  |4..{...V... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 16  |..+.....3.$... .|
-00000060  4c 6f 4f d1 32 2e 2e b5  4c 48 29 0f cb 65 23 b2  |LoO.2...LH)..e#.|
-00000070  ab 2e 41 d8 c4 70 30 88  4f a1 d9 bb 52 e8 35 14  |..A..p0.O...R.5.|
-00000080  03 03 00 01 01 17 03 03  00 17 a7 86 3a 06 dc db  |............:...|
-00000090  c6 bc d5 8e 55 0f 93 b5  fc f4 d4 17 40 dc 3e d7  |....U.......@.>.|
-000000a0  16 17 03 03 02 22 b3 07  3f ab 52 ac c4 0d 50 75  |....."..?.R...Pu|
-000000b0  18 37 a5 f5 4b ba e7 e7  c0 30 3c b4 3f e4 11 2d  |.7..K....0<.?..-|
-000000c0  d1 33 07 a7 9d 41 47 61  40 ec db bb dd 7c 89 7b  |.3...AGa@....|.{|
-000000d0  e4 3e db 5a 30 c6 a3 74  7c 7a b1 53 d2 0a 48 65  |.>.Z0..t|z.S..He|
-000000e0  2c f6 d9 ca b4 f4 88 d2  d8 7e a6 ce b0 30 c6 32  |,........~...0.2|
-000000f0  36 fa 73 b2 0e 39 8e d5  af 41 ab 88 8c 3d d1 56  |6.s..9...A...=.V|
-00000100  2e 7b 7d 93 77 c6 51 66  d6 ed 20 52 a9 b1 98 ae  |.{}.w.Qf.. R....|
-00000110  c9 04 a5 1a 97 36 91 b9  38 39 7c 7c 8c bb 0f 37  |.....6..89||...7|
-00000120  e2 37 9c c0 49 fb a7 59  7d f2 0f 97 ee 15 9c e9  |.7..I..Y}.......|
-00000130  5a 9b 6d fd 7e 36 61 fb  30 69 ea 2f e8 37 70 b0  |Z.m.~6a.0i./.7p.|
-00000140  b5 65 1c 05 25 7a 32 36  6e 24 c9 e2 ca 6c c2 82  |.e..%z26n$...l..|
-00000150  d0 5b 1f 85 ba 1b f0 b2  49 71 2a bd 8d ae 16 95  |.[......Iq*.....|
-00000160  2c b9 ab ce f1 05 47 59  e5 65 02 57 34 85 df 26  |,.....GY.e.W4..&|
-00000170  cf 97 94 29 09 4d aa a6  dd 18 ef 9d 15 38 10 90  |...).M.......8..|
-00000180  ea a3 76 b7 25 c8 9c cd  b6 1e 88 a6 4e b8 b1 34  |..v.%.......N..4|
-00000190  70 1f 7b a1 83 e2 2e 3f  d8 e8 f2 2e 74 f1 93 bc  |p.{....?....t...|
-000001a0  ee 80 8a c3 d0 e0 d2 7a  16 5a 97 a5 57 1c c6 37  |.......z.Z..W..7|
-000001b0  ba 8a cd 07 8f ca 93 3a  d7 57 82 be 69 1d 83 5e  |.......:.W..i..^|
-000001c0  62 0e 65 f3 7f 3b 28 8f  51 f0 96 da 55 4c f5 55  |b.e..;(.Q...UL.U|
-000001d0  60 59 7c c4 61 1f 1d 50  38 09 e0 7b 90 ed b9 35  |`Y|.a..P8..{...5|
-000001e0  4d 70 37 f8 c8 59 09 9e  77 02 27 cc 5a cc 7c 8d  |Mp7..Y..w.'.Z.|.|
-000001f0  a8 cc 83 9d 3d dc e1 85  89 98 65 e9 aa 16 f9 e9  |....=.....e.....|
-00000200  85 f9 ec 6d 28 8d 20 4b  33 01 2f df fb 7d 6c 6e  |...m(. K3./..}ln|
-00000210  b8 28 d4 2e 72 1d af 66  15 1a ff ba bc 68 31 cb  |.(..r..f.....h1.|
-00000220  3e c8 62 d3 3e fd e8 ce  90 bc 30 36 31 e2 6d 47  |>.b.>.....061.mG|
-00000230  06 d4 df ad e8 51 3d 61  b7 8f b6 16 d5 e1 81 ff  |.....Q=a........|
-00000240  c7 ad 99 04 e1 af d0 a8  37 5e 57 44 93 7b e0 6d  |........7^WD.{.m|
-00000250  c2 23 f2 b7 7d 14 41 c6  ab 17 c8 3b de 48 20 73  |.#..}.A....;.H s|
-00000260  78 78 78 4a c4 1f ea 55  11 6e dc 55 48 5d 9b f1  |xxxJ...U.n.UH]..|
-00000270  33 84 17 35 cc b9 8d d4  6e 86 87 f1 c3 ab 31 46  |3..5....n.....1F|
-00000280  79 39 5f 41 19 40 7b 54  44 79 21 25 06 a1 ca 36  |y9_A.@{TDy!%...6|
-00000290  e0 9f d6 70 7c 3f 9f 5c  17 29 cc a3 ed a2 cd 6f  |...p|?.\.).....o|
-000002a0  12 19 d9 89 aa a1 fa 51  53 98 9f 34 d2 75 12 22  |.......QS..4.u."|
-000002b0  ea 63 85 3c 32 c8 cb e2  74 15 13 55 61 a1 80 1f  |.c.<2...t..Ua...|
-000002c0  85 5e 45 95 9c 92 4a 8d  17 03 03 00 a4 e8 50 d5  |.^E...J.......P.|
-000002d0  71 f4 21 a6 79 63 11 6a  8e 5e 3e 5d 96 63 4e 42  |q.!.yc.j.^>].cNB|
-000002e0  08 27 34 b7 4c 36 8a fe  b1 ed f2 f1 3c 72 00 99  |.'4.L6......<r..|
-000002f0  c6 09 9b 19 9c 96 e9 41  7f 09 89 17 ff 48 db 94  |.......A.....H..|
-00000300  f6 17 55 ef b0 48 34 a2  b7 14 b9 e6 b6 74 21 e1  |..U..H4......t!.|
-00000310  48 e2 ed 17 27 b9 93 55  1f b7 84 3a 18 e1 19 16  |H...'..U...:....|
-00000320  4f 5d be d0 59 39 90 be  94 74 e0 ad 79 84 31 01  |O]..Y9...t..y.1.|
-00000330  ab bc f2 34 39 cd 34 e8  f5 a0 00 94 75 0a 3d 78  |...49.4.....u.=x|
-00000340  f7 a2 9b eb ac 0e 5d 1a  ba c1 be 4f 1c 60 65 0d  |......]....O.`e.|
-00000350  2c a2 9c 99 66 d8 31 a0  02 ce bd 27 99 9c e3 48  |,...f.1....'...H|
-00000360  0a 1f 8c 65 24 a9 b6 de  bf d2 e7 66 fe 43 d3 8d  |...e$......f.C..|
-00000370  ea 17 03 03 00 35 d1 19  b3 a5 0c 0e 63 4d 32 bf  |.....5......cM2.|
-00000380  49 85 97 14 ac 78 ab e7  cc 59 48 96 d2 3c 66 0f  |I....x...YH..<f.|
-00000390  5e a2 a9 30 2a 3e 97 44  ab c0 68 1a 53 f9 71 41  |^..0*>.D..h.S.qA|
-000003a0  61 17 e3 da 92 ff 5a 8f  21 06 f5                 |a.....Z.!..|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 3f  |..+.....3.$... ?|
+00000060  be 50 e7 f1 b0 30 60 dc  92 50 b8 01 4a d1 3e ff  |.P...0`..P..J.>.|
+00000070  6e f0 bd e1 17 44 d8 19  1b c6 63 43 e5 c1 58 14  |n....D....cC..X.|
+00000080  03 03 00 01 01 17 03 03  00 17 c0 b7 da 01 3e 64  |..............>d|
+00000090  6b 57 ba 21 12 79 42 8c  63 1f 45 d1 f2 10 fe 98  |kW.!.yB.c.E.....|
+000000a0  b6 17 03 03 02 22 90 87  e6 c3 ba 92 41 a2 96 00  |....."......A...|
+000000b0  c7 92 97 ab 4b 80 02 bb  02 83 19 f3 f6 36 d5 23  |....K........6.#|
+000000c0  3c c7 bd fb 97 67 86 cb  70 4c 60 9e 6c d4 7a f3  |<....g..pL`.l.z.|
+000000d0  03 a5 f1 09 d5 7e 07 74  f3 c8 e4 b8 da 44 a3 94  |.....~.t.....D..|
+000000e0  ee 4e 4a 7b ab 4e 92 03  49 04 4e cf 1b b3 0d 91  |.NJ{.N..I.N.....|
+000000f0  0f 98 51 5c 56 4d d3 a8  75 4b e0 96 d9 9e dd c8  |..Q\VM..uK......|
+00000100  81 c4 37 a0 c6 c9 ec 0f  e0 f1 ed 29 ff 5a a2 d4  |..7........).Z..|
+00000110  af 61 f7 b1 d5 ee e7 1d  7a e1 7f 33 8d 75 e6 9d  |.a......z..3.u..|
+00000120  bc 78 56 eb c5 89 d3 19  86 81 09 e1 ee 10 03 7c  |.xV............||
+00000130  a4 1b 78 17 51 a3 53 b4  67 5d 29 49 21 b2 51 7b  |..x.Q.S.g])I!.Q{|
+00000140  f5 dc fd 60 11 ee 8f 50  ea 28 b5 db 57 04 7e 3b  |...`...P.(..W.~;|
+00000150  ad 6f 29 d4 22 f3 a1 4b  52 ac b8 2b 30 0c 67 16  |.o)."..KR..+0.g.|
+00000160  e3 e0 7d a3 03 66 c4 39  70 8e c7 06 cf d2 6f 98  |..}..f.9p.....o.|
+00000170  c1 c9 f6 a9 6a 89 b4 3e  38 97 ae e4 f2 97 a4 6f  |....j..>8......o|
+00000180  e2 05 f8 e9 53 c9 ae f7  87 c3 0f 68 75 9e 07 e9  |....S......hu...|
+00000190  45 e9 0d 03 7e c8 79 56  30 77 e3 ea db 92 a2 f8  |E...~.yV0w......|
+000001a0  5e 5b ab 77 0d 9b bc 5f  51 40 6c 1b 0d ef b4 cf  |^[.w..._Q@l.....|
+000001b0  4a 3d a6 8c b6 ab ce 4f  6c 08 0e 23 f0 2a 56 07  |J=.....Ol..#.*V.|
+000001c0  f5 88 68 c3 0c fd 63 9b  e4 56 12 a6 f5 0a ed 54  |..h...c..V.....T|
+000001d0  40 30 ee 36 72 5d ca bb  5a 52 d3 84 14 c1 7e e4  |@0.6r]..ZR....~.|
+000001e0  f8 fb e9 c8 10 16 54 16  1f 72 99 8c 7a 69 87 ca  |......T..r..zi..|
+000001f0  62 53 dc cb a4 26 73 90  fb 11 3c 3c 9f 94 65 cb  |bS...&s...<<..e.|
+00000200  28 94 65 ca 56 45 a8 c1  ec 08 31 dd eb bc 17 71  |(.e.VE....1....q|
+00000210  cd 65 04 95 2e e7 e0 fb  73 fe 70 db 70 31 93 90  |.e......s.p.p1..|
+00000220  cf 47 07 ec 92 98 c1 da  fc 13 f8 8a 28 4e e8 80  |.G..........(N..|
+00000230  a8 96 c2 e2 a6 cd df d4  7f 46 4a 3b e9 dd cf a5  |.........FJ;....|
+00000240  75 d5 cc 67 35 81 d5 2e  e4 68 c4 56 1a 46 33 5a  |u..g5....h.V.F3Z|
+00000250  f2 79 32 6b 4e a0 6b 76  53 53 04 73 86 fd bd e2  |.y2kN.kvSS.s....|
+00000260  f7 f8 14 0f 0a a8 10 6d  a1 bf f8 d0 27 8d cb e8  |.......m....'...|
+00000270  a5 51 16 4b 11 a2 8a 6f  22 c5 7c bc c5 7a 0b df  |.Q.K...o".|..z..|
+00000280  70 1d c4 93 ec 87 78 12  77 e3 85 5a 3c 29 d8 f7  |p.....x.w..Z<)..|
+00000290  ab a4 c6 10 50 ed d5 2a  3f b1 84 73 1e 7f 99 eb  |....P..*?..s....|
+000002a0  31 9c 2c d2 6a 80 4a 5e  7c aa 64 e7 83 df a9 17  |1.,.j.J^|.d.....|
+000002b0  c3 4c 13 c8 c1 d7 1b f5  be c9 00 cf ec 7e a5 ab  |.L...........~..|
+000002c0  89 9c b0 72 fd f0 cb 54  17 03 03 00 a4 28 34 92  |...r...T.....(4.|
+000002d0  a7 52 92 5d a0 99 6b e6  22 c5 f6 76 86 1b 0b d6  |.R.]..k."..v....|
+000002e0  b7 a8 67 c1 04 b8 1c ac  7b 02 f5 0a 20 41 dd 43  |..g.....{... A.C|
+000002f0  25 cc 01 f9 dc 6e c7 f7  4f 67 dd b3 54 81 80 d5  |%....n..Og..T...|
+00000300  6d 45 00 42 d0 49 23 d5  12 33 e4 5f fd 58 79 81  |mE.B.I#..3._.Xy.|
+00000310  e3 df 67 6d 03 44 58 0f  76 38 c3 de ed 26 90 29  |..gm.DX.v8...&.)|
+00000320  45 92 ce 3b fa ea 98 da  ea a2 d2 cc c6 0e a8 38  |E..;...........8|
+00000330  c1 2d 92 8c 48 79 58 25  75 fd 2d 6d ef 06 32 1a  |.-..HyX%u.-m..2.|
+00000340  bb 09 fa 66 bc 06 9d c5  fb 46 94 5e b1 73 8d 05  |...f.....F.^.s..|
+00000350  e1 90 24 c3 eb 72 7f a8  b7 12 a3 3c 11 29 ea 80  |..$..r.....<.)..|
+00000360  10 4e 19 40 25 0b c9 34  70 99 e9 1a 60 17 bb 5b  |.N.@%..4p...`..[|
+00000370  1a 17 03 03 00 35 91 4b  45 15 d5 2e 33 a7 ba 9b  |.....5.KE...3...|
+00000380  64 20 bb 72 28 06 27 37  2f ac c9 c0 9e b9 d8 f3  |d .r(.'7/.......|
+00000390  86 36 d2 7d df c2 4d 95  a5 a4 4b 64 5f 1a 83 67  |.6.}..M...Kd_..g|
+000003a0  f6 6a 21 ff d0 b4 1c 65  23 62 ac                 |.j!....e#b.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 a3 d4 49 e5 82  |..........5..I..|
-00000010  8d 09 1b 33 8a 0d 9b 4f  8d a8 95 66 0e 50 e0 85  |...3...O...f.P..|
-00000020  a7 0d f2 09 f6 05 44 f5  59 c3 48 92 9d 80 a7 db  |......D.Y.H.....|
-00000030  d0 18 7e 7b 5c fa 31 bf  c5 94 71 60 cf 0c d1 c7  |..~{\.1...q`....|
-00000040  17 03 03 00 17 f7 61 d6  c4 fa 7f 34 e7 cf cb b0  |......a....4....|
-00000050  9f 5d 13 25 8c 75 6c 1a  87 91 44 84 17 03 03 00  |.].%.ul...D.....|
-00000060  13 89 68 71 8d be 27 8e  31 f5 ca 7a 4e c5 b6 38  |..hq..'.1..zN..8|
-00000070  b2 68 b8 0d                                       |.h..|
+00000000  14 03 03 00 01 01 17 03  03 00 35 10 bd 5d 23 36  |..........5..]#6|
+00000010  58 43 f4 bb 5e 4e ee 43  fd 0e a1 d9 de 81 99 54  |XC..^N.C.......T|
+00000020  de 6e 82 33 71 8a 45 a7  35 f1 cd fb 5f bf 46 20  |.n.3q.E.5..._.F |
+00000030  a5 79 d6 87 aa f4 29 51  02 f5 4e 69 ef a5 d7 d6  |.y....)Q..Ni....|
+00000040  17 03 03 00 17 21 1f 90  0b 01 63 89 6a af 53 72  |.....!....c.j.Sr|
+00000050  51 c0 11 01 7b 09 dd 40  82 dd e1 32 17 03 03 00  |Q...{..@...2....|
+00000060  13 93 5d c1 19 16 5c 17  1a 7b 92 a0 9b f5 14 57  |..]...\..{.....W|
+00000070  85 39 4a ac                                       |.9J.|
diff --git a/libgo/go/crypto/tls/testdata/Client-TLSv13-Ed25519 b/libgo/go/crypto/tls/testdata/Client-TLSv13-Ed25519
new file mode 100644 (file)
index 0000000..0b4a17a
--- /dev/null
@@ -0,0 +1,68 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 32 cc a8  |.............2..|
+00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
+00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
+00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 7a 02 00 00  76 03 03 a8 21 4e 51 6a  |....z...v...!NQj|
+00000010  ce ba 17 cc 2d 25 b3 31  59 6a 3f 81 eb e6 ac a0  |....-%.1Yj?.....|
+00000020  91 d9 ef 76 a1 5f bb 63  ab 2c 6b 20 00 00 00 00  |...v._.c.,k ....|
+00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 81  |..+.....3.$... .|
+00000060  4c a8 07 aa 6b 4a f9 44  77 78 a9 57 d0 07 55 07  |L...kJ.Dwx.W..U.|
+00000070  9a c2 8e 33 bf c4 09 ee  49 51 5c fe f1 7b 30 14  |...3....IQ\..{0.|
+00000080  03 03 00 01 01 17 03 03  00 17 5a 22 a1 07 01 ea  |..........Z"....|
+00000090  97 bd 5a 59 3a 21 de 9c  45 0c 41 ff 34 45 35 ab  |..ZY:!..E.A.4E5.|
+000000a0  25 17 03 03 01 50 a1 8c  19 e7 0c 69 d3 e0 f6 53  |%....P.....i...S|
+000000b0  95 15 13 4c e3 c3 3f 35  d9 73 c9 fe 24 b0 14 5f  |...L..?5.s..$.._|
+000000c0  b6 9e 94 20 cf 80 f7 88  7c 0f be 4c 70 16 00 2a  |... ....|..Lp..*|
+000000d0  55 02 aa a9 4b 7f a7 a5  b8 46 09 9e 18 78 78 66  |U...K....F...xxf|
+000000e0  22 c2 31 19 12 f7 e4 7e  f3 26 39 7d cd 5e 74 24  |".1....~.&9}.^t$|
+000000f0  fb 75 7d b7 2c b5 fb e0  49 bd da 96 e1 c3 63 8f  |.u}.,...I.....c.|
+00000100  e3 28 43 bb 32 a7 fd 9c  ab 54 ba ce 07 4a 23 35  |.(C.2....T...J#5|
+00000110  a4 3a ff 43 40 19 ef 38  07 02 ba d6 c4 f0 bf 63  |.:.C@..8.......c|
+00000120  aa b3 ea 55 d0 e1 a9 f3  cb 04 6b 1b 8d 35 3a f8  |...U......k..5:.|
+00000130  0b 1c 40 99 fe b0 04 5f  d1 5b 3f 4b be fe b5 96  |..@...._.[?K....|
+00000140  f0 49 3d bf a5 92 f3 bd  a6 4c 47 24 f8 b5 7c 45  |.I=......LG$..|E|
+00000150  47 85 9b 08 a1 da 51 7a  ce 3f 32 66 de 89 c0 c3  |G.....Qz.?2f....|
+00000160  ac da 73 0d 15 14 18 e6  a0 7d 07 26 44 df 55 b7  |..s......}.&D.U.|
+00000170  6e 4e fa c0 f5 5e 42 3a  d9 29 d3 1d e6 cf 3c 8c  |nN...^B:.)....<.|
+00000180  6d c1 d9 f9 04 f0 57 dc  47 4e d1 e2 a1 f1 a1 c9  |m.....W.GN......|
+00000190  2e da 97 4d 65 65 04 54  e7 80 f1 88 b2 34 26 61  |...Mee.T.....4&a|
+000001a0  77 8a 1f bb 82 7f 4b ce  b3 5a 55 60 e1 3a ef 95  |w.....K..ZU`.:..|
+000001b0  bd 34 fc ef 2b 18 4b bb  8a cf ba 3a 69 43 f4 59  |.4..+.K....:iC.Y|
+000001c0  98 a1 95 a3 22 f6 b5 1a  84 83 cf cb 90 eb 28 29  |....".........()|
+000001d0  b3 84 e1 0d 37 9e 98 96  91 73 f1 7f d7 9b 71 38  |....7....s....q8|
+000001e0  6e bc 2e 60 2d 27 0c 18  fd 2a b8 76 01 33 2f 95  |n..`-'...*.v.3/.|
+000001f0  6e 0b bf 2b 26 5e 17 03  03 00 59 ed 43 2f e8 df  |n..+&^....Y.C/..|
+00000200  f3 2f 91 f3 dc 1b aa ff  d3 3b 28 1f 78 21 fb e2  |./.......;(.x!..|
+00000210  7d 6e 03 09 98 c1 23 09  d7 45 da b8 e0 5a e5 27  |}n....#..E...Z.'|
+00000220  38 9a 2f da 9b d3 04 35  f5 b9 31 b0 c0 1f 8a 1e  |8./....5..1.....|
+00000230  d8 8a 19 f1 38 af a6 74  ac e5 b4 0d 45 83 b4 59  |....8..t....E..Y|
+00000240  83 42 97 14 23 55 71 ef  66 8c 35 69 3f 2c 88 63  |.B..#Uq.f.5i?,.c|
+00000250  8d 3b 05 fe 17 03 03 00  35 47 82 ec 22 f4 86 6a  |.;......5G.."..j|
+00000260  b7 c1 d8 64 3b 42 f4 ca  5c 3d ba a3 6a ea 77 6a  |...d;B..\=..j.wj|
+00000270  d6 52 e3 b0 42 fb c2 f1  2c b1 ef 44 ed 11 29 6d  |.R..B...,..D..)m|
+00000280  2b 6f 13 0f 42 48 a0 2e  5b ba a1 93 6b de        |+o..BH..[...k.|
+>>> Flow 3 (client to server)
+00000000  14 03 03 00 01 01 17 03  03 00 35 11 45 8f b2 e0  |..........5.E...|
+00000010  87 3d 09 94 93 16 19 04  3d 84 6c e5 14 5e c6 8b  |.=......=.l..^..|
+00000020  73 1a 53 4c d0 f4 11 27  0c 0d 05 c7 9d ba d0 04  |s.SL...'........|
+00000030  37 ed 8b 8a 65 34 54 b1  07 36 92 8c 8c a8 30 b7  |7...e4T..6....0.|
+00000040  17 03 03 00 17 ea fc b8  84 8d f0 9d 8e 1c 2c 65  |..............,e|
+00000050  10 a8 69 7f dd 3c a4 80  45 5d c3 38 17 03 03 00  |..i..<..E].8....|
+00000060  13 15 4b b7 23 2f 55 b0  ae d3 3f f6 68 c9 b2 ef  |..K.#/U...?.h...|
+00000070  d7 e2 18 49                                       |...I|
index a30a26249b7b851fc8718b4e227928f6e790a985..b30641131ead5daa2b2e9375dc01857313afd98a 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,84 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 fe a9 2f 00 0c  |....z...v..../..|
-00000010  0b 91 a0 86 1d 9b 21 19  35 a1 07 9e 36 1d d2 82  |......!.5...6...|
-00000020  51 b7 d2 3e a6 42 ce 6f  86 e9 69 20 00 00 00 00  |Q..>.B.o..i ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 6d fb 70 07 b4  |....z...v..m.p..|
+00000010  2d 14 d1 d1 88 17 6a a3  b1 c1 e7 23 4b 06 c4 fa  |-.....j....#K...|
+00000020  4a 0e e1 2c ce 5a d5 c7  8c ab f2 20 00 00 00 00  |J..,.Z..... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 20  |..+.....3.$...  |
-00000060  8c d2 dd d7 17 cc 15 f7  0b dc 75 48 d0 82 54 36  |..........uH..T6|
-00000070  b0 f6 ae fe 29 7b 0d af  9f 06 4e 58 8c 66 10 14  |....){....NX.f..|
-00000080  03 03 00 01 01 17 03 03  00 17 8c ef b2 76 05 ee  |.............v..|
-00000090  eb e8 55 a3 56 d6 4a b7  d7 10 8e f0 f9 7e 49 eb  |..U.V.J......~I.|
-000000a0  fd 17 03 03 02 6d c2 33  a8 17 70 1e 66 4c b8 32  |.....m.3..p.fL.2|
-000000b0  99 41 79 b8 85 98 c8 f7  f4 c6 25 41 9b 30 ea f5  |.Ay.......%A.0..|
-000000c0  24 6c ad 7c b6 c1 c7 a6  d5 2c 0b d8 78 e0 ec df  |$l.|.....,..x...|
-000000d0  bb 8d ea 0a ff ba c9 aa  ec 24 05 63 2a ff 13 37  |.........$.c*..7|
-000000e0  5e fe c1 7b 6e c0 dd e1  09 c1 87 33 fc 18 90 28  |^..{n......3...(|
-000000f0  5b b2 ba 7e 69 06 dc 8e  ac c4 ca 08 84 aa df 0c  |[..~i...........|
-00000100  2a a7 74 46 e7 c8 db 23  96 67 95 f4 79 9b 6e 3d  |*.tF...#.g..y.n=|
-00000110  94 fc 80 07 d9 e7 cf 0d  31 27 84 08 66 23 2d 05  |........1'..f#-.|
-00000120  64 2f 63 27 5c e2 1c 2e  f7 6f 99 4f 59 4c f4 3d  |d/c'\....o.OYL.=|
-00000130  cf a9 ff 32 f4 6a 7d b4  c4 11 01 9d f2 8a ce da  |...2.j}.........|
-00000140  21 51 b0 99 0c a8 a6 fa  09 b1 c4 cf a9 84 96 7d  |!Q.............}|
-00000150  aa 80 b4 b3 c7 ed 70 08  1b 50 b9 07 a5 2c a0 21  |......p..P...,.!|
-00000160  da 97 a7 5f 35 d4 55 24  8b 2d 14 85 0d 63 10 7f  |..._5.U$.-...c..|
-00000170  0b 22 03 a5 e3 26 e4 2b  ca c4 54 39 4d 52 41 8b  |."...&.+..T9MRA.|
-00000180  8e b0 60 2f 61 f5 7f d2  62 2c a3 f9 f2 46 08 76  |..`/a...b,...F.v|
-00000190  37 92 d0 bc 6c 0e 75 a2  f5 c1 f4 b3 7d f9 83 8e  |7...l.u.....}...|
-000001a0  bd 30 4f 04 77 98 b7 d0  e9 a0 19 4c 61 c1 58 09  |.0O.w......La.X.|
-000001b0  04 82 60 38 55 51 c1 94  46 40 a2 12 68 0a 83 7b  |..`8UQ..F@..h..{|
-000001c0  30 71 a3 08 83 f7 67 86  df 44 df ea 6d 56 65 25  |0q....g..D..mVe%|
-000001d0  16 55 5d cd 8a f4 03 10  86 1d 5a fd d8 2e 23 7e  |.U].......Z...#~|
-000001e0  34 77 b7 af 4b 2c 8a 36  ad 07 a5 5a 3b 39 c8 90  |4w..K,.6...Z;9..|
-000001f0  4b 77 60 81 2e ac 51 37  09 ac c0 e7 6b 18 a5 76  |Kw`...Q7....k..v|
-00000200  52 91 62 95 6d 1c 9d 8e  6c 03 f5 12 cd 80 7f 40  |R.b.m...l......@|
-00000210  4e f3 e6 7d d2 f1 3d 94  a7 16 ec fc 0c c9 72 b9  |N..}..=.......r.|
-00000220  ee 33 bb 76 d0 6d 27 3d  58 cd ed 34 60 f4 bb 23  |.3.v.m'=X..4`..#|
-00000230  49 a8 8d 94 7c 46 85 04  65 26 c2 5e 4f 22 f6 7d  |I...|F..e&.^O".}|
-00000240  46 ae 1b 63 eb 6b 43 c5  64 fa 9d 43 86 e5 29 8f  |F..c.kC.d..C..).|
-00000250  98 20 9e 21 b2 f3 32 c9  82 75 4d 97 5e cf dd cb  |. .!..2..uM.^...|
-00000260  1d 6b 6e fc 8f 61 86 a9  71 12 96 e3 18 42 d3 28  |.kn..a..q....B.(|
-00000270  f9 86 7e ab 90 9b f6 5c  c2 46 fb 93 e6 51 7d f5  |..~....\.F...Q}.|
-00000280  8a b2 e9 c6 e1 70 62 fa  08 e1 91 0b ee 89 12 01  |.....pb.........|
-00000290  ca dd 25 56 8f 2d 45 0d  a5 47 26 f0 a2 4d f5 4b  |..%V.-E..G&..M.K|
-000002a0  8b dd 6f ab 0f f1 5b 60  9c b0 dc 88 24 df 1c 5b  |..o...[`....$..[|
-000002b0  a9 90 66 44 e1 e1 6b 96  b5 3f e2 69 76 a7 84 d6  |..fD..k..?.iv...|
-000002c0  2b 68 b0 f5 8a ba e7 83  83 88 45 78 2d e0 a4 82  |+h........Ex-...|
-000002d0  74 53 4a cf 14 84 fa 49  78 ce 3b 9a 24 66 00 a9  |tSJ....Ix.;.$f..|
-000002e0  5b 0b 83 20 fb 20 a8 20  45 10 53 76 7d ee b2 d6  |[.. . . E.Sv}...|
-000002f0  af 33 f9 29 d0 f7 16 7e  d6 59 b0 4a 06 ac d4 7d  |.3.)...~.Y.J...}|
-00000300  84 1d 50 64 d0 f8 67 65  54 2f a3 2c 50 9e 93 43  |..Pd..geT/.,P..C|
-00000310  58 59 67 17 03 03 00 99  62 ac 15 76 89 cb 8d 67  |XYg.....b..v...g|
-00000320  25 75 a7 57 b6 65 8c 73  24 a6 71 ba c4 75 ad f8  |%u.W.e.s$.q..u..|
-00000330  2a a6 94 12 c2 8d ca 7e  1a 75 e4 21 da cb 1e 77  |*......~.u.!...w|
-00000340  69 d0 e1 4b 25 46 ce 99  1b e0 10 9d 12 d6 16 62  |i..K%F.........b|
-00000350  f9 42 3b b8 3a 7b 3a 11  1f d7 04 fe 88 0b 62 ba  |.B;.:{:.......b.|
-00000360  a9 d6 51 c4 f5 be d9 92  e6 d6 05 94 9b f9 76 0d  |..Q...........v.|
-00000370  ca da 55 45 e4 fe a9 f3  dc d5 08 db 50 7c 4a 7c  |..UE........P|J||
-00000380  f1 9c a7 5d e6 0d f9 cf  32 67 c0 66 a6 85 26 8b  |...]....2g.f..&.|
-00000390  57 f0 2c 5e b7 7e c1 cb  3d 6c 23 e2 18 3e c2 67  |W.,^.~..=l#..>.g|
-000003a0  97 23 3f 86 f2 38 b5 a7  df 98 68 57 89 a3 e4 86  |.#?..8....hW....|
-000003b0  d7 17 03 03 00 35 4a d4  e1 fb d1 39 57 90 d1 19  |.....5J....9W...|
-000003c0  b9 f2 1b 0b 1a 0d 8f fb  4b f3 f1 f8 31 d2 ac 3b  |........K...1..;|
-000003d0  25 ad e7 da 8a 78 ab 2a  d6 97 9b 66 88 6a db ef  |%....x.*...f.j..|
-000003e0  bf b6 ed b9 8a 39 72 8c  ea 8f 0d                 |.....9r....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 4e  |..+.....3.$... N|
+00000060  fe 87 d7 81 71 25 ba 33  de 10 df 19 38 d8 af 43  |....q%.3....8..C|
+00000070  58 3f 41 2e b9 b8 cb 1c  65 a7 cd 8d 00 b1 0e 14  |X?A.....e.......|
+00000080  03 03 00 01 01 17 03 03  00 17 b3 63 09 54 ad 41  |...........c.T.A|
+00000090  24 fe 2c 81 49 c8 86 88  c2 ad ba cd 45 77 51 c0  |$.,.I.......EwQ.|
+000000a0  d5 17 03 03 02 6d 74 7d  de 53 70 5c 11 d0 a7 68  |.....mt}.Sp\...h|
+000000b0  8e 10 c9 cb cd 0c 25 ac  88 e7 17 54 8b 32 2c ee  |......%....T.2,.|
+000000c0  97 9c 3d f6 ce d1 83 70  ee c0 85 0c fc 61 ba db  |..=....p.....a..|
+000000d0  6d e0 04 26 6f b7 4e 44  4d 1c 5c 16 9a 57 4f e6  |m..&o.NDM.\..WO.|
+000000e0  52 89 27 53 88 f8 93 91  ed b2 42 b4 4c f0 58 a3  |R.'S......B.L.X.|
+000000f0  50 a7 af 2c 47 ac ad 8b  14 a0 9f d4 28 2e 7b 28  |P..,G.......(.{(|
+00000100  8e ec d1 bb 7d d9 78 fb  24 82 9f 2a ac 4e 85 83  |....}.x.$..*.N..|
+00000110  35 25 75 8f 9e 6d 4c 8a  dd 6f 9f 9a 34 93 a2 9d  |5%u..mL..o..4...|
+00000120  d0 26 4c 7b a8 72 a3 12  b9 ef 6b c8 d0 4f 44 5b  |.&L{.r....k..OD[|
+00000130  dd f1 72 3a b4 5c 7e a8  8d d4 68 bc 6d 54 2c ee  |..r:.\~...h.mT,.|
+00000140  c1 f7 78 f1 15 cd 57 b5  54 89 08 f0 d8 56 ef 8d  |..x...W.T....V..|
+00000150  14 d1 e8 fd 83 bd ab 64  c1 99 36 4e af 81 27 52  |.......d..6N..'R|
+00000160  0f 5e 31 5e c0 70 21 fb  05 40 d4 d2 71 df 0c 09  |.^1^.p!..@..q...|
+00000170  31 83 b0 71 82 84 d9 90  6b 25 5a 67 03 30 c4 80  |1..q....k%Zg.0..|
+00000180  2c 99 41 3f fa 51 ce a8  b4 b8 98 2a bc e9 cc ce  |,.A?.Q.....*....|
+00000190  f7 0c 69 a3 c3 02 dc b9  4f 00 ac 4f 29 d5 e5 df  |..i.....O..O)...|
+000001a0  df 67 3b ed 94 8e 80 3f  aa 6e a8 b7 e0 7f 4d fd  |.g;....?.n....M.|
+000001b0  95 80 54 89 57 ff d7 73  86 bd e8 98 11 d5 09 c6  |..T.W..s........|
+000001c0  ab af 1a a4 a0 cc 30 40  bc 63 dc d0 db 92 41 f5  |......0@.c....A.|
+000001d0  5c 1e f1 92 03 5b 3f 27  23 1f 9c 8e f8 8b 4f 69  |\....[?'#.....Oi|
+000001e0  0c 3d 09 e5 95 d8 ba 8c  90 cd ac 53 ed 77 8d 75  |.=.........S.w.u|
+000001f0  3a 56 b4 f3 21 a5 4e c2  6e 1f 87 74 56 69 32 95  |:V..!.N.n..tVi2.|
+00000200  29 56 07 2c 0d b3 74 47  28 6d 8f ef 56 f6 68 7f  |)V.,..tG(m..V.h.|
+00000210  25 e4 76 06 7c 82 40 11  f8 eb 3c ec 62 fa be 60  |%.v.|.@...<.b..`|
+00000220  d3 11 98 e2 d4 b1 d0 72  3d e6 4a da f0 d6 c0 42  |.......r=.J....B|
+00000230  8e a6 63 cc a1 41 e3 18  21 00 ac cc 98 f8 8d 78  |..c..A..!......x|
+00000240  ab 9b 39 16 ad 4c fd 11  15 79 0c fd 0e 87 45 d6  |..9..L...y....E.|
+00000250  81 30 bb 3a 72 89 92 c1  fa e8 ad 59 3b 8b b0 38  |.0.:r......Y;..8|
+00000260  2d c3 6e 87 a8 b8 1f 7d  a0 b3 e6 91 83 97 78 94  |-.n....}......x.|
+00000270  f0 01 66 a2 c8 89 45 8e  2e a0 7e 89 4d 7f 49 ee  |..f...E...~.M.I.|
+00000280  2a 69 c0 ec 77 db 85 df  01 d9 02 36 df 94 81 01  |*i..w......6....|
+00000290  aa 43 a2 3d 76 8c c3 21  bf 05 c3 b2 c4 28 85 65  |.C.=v..!.....(.e|
+000002a0  7b 4a ac e3 45 40 77 1d  a9 ee 1e e9 97 7c 2f 45  |{J..E@w......|/E|
+000002b0  45 18 58 47 ab 51 0f 26  eb d5 bb ac c2 8b a9 ae  |E.XG.Q.&........|
+000002c0  65 6a 91 9b 13 93 69 c6  9d bc 61 23 20 d2 ad a0  |ej....i...a# ...|
+000002d0  d3 f9 2d 32 79 e3 4b 07  90 32 9e e1 f3 13 18 b0  |..-2y.K..2......|
+000002e0  65 6e 89 a5 45 c6 a1 9b  f0 f6 d1 66 d3 e7 49 1a  |en..E......f..I.|
+000002f0  b8 e2 17 cd d0 13 9c e6  e1 77 87 a4 8b 6a d3 74  |.........w...j.t|
+00000300  0e 85 b1 2c f3 c8 a8 f3  65 b3 71 c2 bb f5 95 d7  |...,....e.q.....|
+00000310  81 78 45 17 03 03 00 99  1e 53 96 f9 b9 97 ec 53  |.xE......S.....S|
+00000320  4e 97 a9 8c 01 06 ee 6b  31 47 93 4b ac f7 b6 4a  |N......k1G.K...J|
+00000330  15 bb 28 d7 87 73 7c 1d  3b d3 6b 9d 48 77 df 09  |..(..s|.;.k.Hw..|
+00000340  c9 97 98 b6 d6 20 94 8a  ed 71 08 2d 56 af b2 b8  |..... ...q.-V...|
+00000350  20 fc d7 81 e4 53 eb 57  6a bd 9b 1c 11 4f 2e fb  | ....S.Wj....O..|
+00000360  9a 0e 65 08 69 df 28 70  a7 50 21 62 9f 63 39 db  |..e.i.(p.P!b.c9.|
+00000370  9e 73 40 5d 73 77 a7 1d  2e 79 61 fa b9 50 f0 70  |.s@]sw...ya..P.p|
+00000380  1e 71 d1 9e c6 2f 8c 4c  5f e0 b1 37 d7 c9 ab fc  |.q.../.L_..7....|
+00000390  5f 6a ca a9 9e 27 38 42  78 ba fb e6 8e c2 3f a6  |_j...'8Bx.....?.|
+000003a0  a0 c6 04 b6 d8 b7 3a 68  83 15 3b 70 f9 0a 27 4a  |......:h..;p..'J|
+000003b0  0a 17 03 03 00 35 d0 88  b7 b8 cf 81 4e 97 76 96  |.....5......N.v.|
+000003c0  c2 ed e8 15 e4 01 54 2b  1f 0e 34 08 52 6c a8 6a  |......T+..4.Rl.j|
+000003d0  cf 04 29 7b 27 fb e9 1e  d1 6c d2 28 15 03 2a 58  |..){'....l.(..*X|
+000003e0  d4 eb 67 18 83 3f d4 2a  ab 9f aa                 |..g..?.*...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 8c 85 73 71 98  |..........5..sq.|
-00000010  40 37 77 e7 8c fd d1 f0  42 a8 97 f3 7c 68 f4 a7  |@7w.....B...|h..|
-00000020  ac dc 7a ff 9b 2e f4 fe  2a c0 37 f9 56 a4 00 f5  |..z.....*.7.V...|
-00000030  b1 40 34 53 89 48 9a a6  9d af a1 75 3f 34 53 fd  |.@4S.H.....u?4S.|
-00000040  17 03 03 00 17 92 cf 4a  20 2e 0c 2b 4a dc 86 2a  |.......J ..+J..*|
-00000050  75 cd 8f 73 b3 b3 4b 3b  3a e4 39 c3 17 03 03 00  |u..s..K;:.9.....|
-00000060  13 83 08 42 b1 a8 95 2d  a5 4c 8b e8 e8 35 d2 4c  |...B...-.L...5.L|
-00000070  23 8b 83 73                                       |#..s|
+00000000  14 03 03 00 01 01 17 03  03 00 35 02 ed 34 8f 83  |..........5..4..|
+00000010  44 27 8b 71 af c1 06 33  0b 25 aa 22 85 96 41 75  |D'.q...3.%."..Au|
+00000020  4f fe 46 82 ba 95 91 4c  cc a9 99 60 5c f7 72 7f  |O.F....L...`\.r.|
+00000030  e4 1f e4 99 6a c2 25 db  d0 11 5d fc d6 28 8f 56  |....j.%...]..(.V|
+00000040  17 03 03 00 17 fe e8 cf  ed a0 7a ce 77 57 e6 aa  |..........z.wW..|
+00000050  f0 ce 6d 2f 5c e5 1f 7d  37 c8 91 cf 17 03 03 00  |..m/\..}7.......|
+00000060  13 a4 a9 4c b5 33 38 4a  1e b7 65 9d 72 85 1b 79  |...L.38J..e.r..y|
+00000070  79 87 e3 bf                                       |y...|
index c06837e6da28eb03b1ad8ca5d7d736c26f487a4d..10e13ec33d9ab61ead0e26ce5f695686b6d912b8 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f4 01 00 00  f0 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 f6 01 00 00  f2 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,14 +7,14 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 75 00 05 00 05  01 00 00 00 00 00 0a 00  |...u............|
+00000080  01 00 00 77 00 05 00 05  01 00 00 00 00 00 0a 00  |...w............|
 00000090  06 00 04 00 1d 00 17 00  0b 00 02 01 00 00 0d 00  |................|
-000000a0  18 00 16 08 04 08 05 08  06 04 01 04 03 05 01 05  |................|
-000000b0  03 06 01 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
-000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
-000000d0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
-000000e0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-000000f0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
+000000a0  1a 00 18 08 04 04 03 08  07 08 05 08 06 04 01 05  |................|
+000000b0  01 06 01 05 03 06 03 02  01 02 03 ff 01 00 01 00  |................|
+000000c0  00 12 00 00 00 2b 00 09  08 03 04 03 03 03 02 03  |.....+..........|
+000000d0  01 00 33 00 26 00 24 00  1d 00 20 2f e5 7d a3 47  |..3.&.$... /.}.G|
+000000e0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000000f0  c4 cf c2 ed 90 99 5f 58  cb 3b 74                 |......_X.;t|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 58 02 00 00  54 03 03 cf 21 ad 74 e5  |....X...T...!.t.|
 00000010  9a 61 11 be 1d 8c 02 1e  65 b8 91 c2 a2 11 16 7a  |.a......e......z|
@@ -24,7 +24,7 @@
 00000050  0c 00 2b 00 02 03 04 00  33 00 02 00 17 14 03 03  |..+.....3.......|
 00000060  00 01 01                                          |...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 16 03  03 01 15 01 00 01 11 03  |................|
+00000000  14 03 03 00 01 01 16 03  03 01 17 01 00 01 13 03  |................|
 00000010  03 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000030  00 20 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |. ..............|
 00000050  00 00 00 32 cc a8 cc a9  c0 2f c0 2b c0 30 c0 2c  |...2...../.+.0.,|
 00000060  c0 27 c0 13 c0 23 c0 09  c0 14 c0 0a 00 9c 00 9d  |.'...#..........|
 00000070  00 3c 00 2f 00 35 c0 12  00 0a 00 05 c0 11 c0 07  |.<./.5..........|
-00000080  13 01 13 03 13 02 01 00  00 96 00 05 00 05 01 00  |................|
+00000080  13 01 13 03 13 02 01 00  00 98 00 05 00 05 01 00  |................|
 00000090  00 00 00 00 0a 00 06 00  04 00 1d 00 17 00 0b 00  |................|
-000000a0  02 01 00 00 0d 00 18 00  16 08 04 08 05 08 06 04  |................|
-000000b0  01 04 03 05 01 05 03 06  01 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  47 00 45 00 17 00 41 04  |......3.G.E...A.|
-000000e0  1e 18 37 ef 0d 19 51 88  35 75 71 b5 e5 54 5b 12  |..7...Q.5uq..T[.|
-000000f0  2e 8f 09 67 fd a7 24 20  3e b2 56 1c ce 97 28 5e  |...g..$ >.V...(^|
-00000100  f8 2b 2d 4f 9e f1 07 9f  6c 4b 5b 83 56 e2 32 42  |.+-O....lK[.V.2B|
-00000110  e9 58 b6 d7 49 a6 b5 68  1a 41 03 56 6b dc 5a 89  |.X..I..h.A.Vk.Z.|
+000000a0  02 01 00 00 0d 00 1a 00  18 08 04 04 03 08 07 08  |................|
+000000b0  05 08 06 04 01 05 01 06  01 05 03 06 03 02 01 02  |................|
+000000c0  03 ff 01 00 01 00 00 12  00 00 00 2b 00 09 08 03  |...........+....|
+000000d0  04 03 03 03 02 03 01 00  33 00 47 00 45 00 17 00  |........3.G.E...|
+000000e0  41 04 1e 18 37 ef 0d 19  51 88 35 75 71 b5 e5 54  |A...7...Q.5uq..T|
+000000f0  5b 12 2e 8f 09 67 fd a7  24 20 3e b2 56 1c ce 97  |[....g..$ >.V...|
+00000100  28 5e f8 2b 2d 4f 9e f1  07 9f 6c 4b 5b 83 56 e2  |(^.+-O....lK[.V.|
+00000110  32 42 e9 58 b6 d7 49 a6  b5 68 1a 41 03 56 6b dc  |2B.X..I..h.A.Vk.|
+00000120  5a 89                                             |Z.|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 9b 02 00 00  97 03 03 84 0c ed 20 38  |.............. 8|
-00000010  61 6f 28 24 e6 70 28 71  1d 3e 38 fc e2 94 da fa  |ao($.p(q.>8.....|
-00000020  34 04 33 99 7a 18 e2 2a  cc d1 67 20 00 00 00 00  |4.3.z..*..g ....|
+00000000  16 03 03 00 9b 02 00 00  97 03 03 b5 7c 4a c4 82  |............|J..|
+00000010  67 2c 0d e4 cf 12 5a 8c  fc 44 10 da 7e ef ec ae  |g,....Z..D..~...|
+00000020  bc 59 6c 7d 62 b1 d8 95  5d 9d 3b 20 00 00 00 00  |.Yl}b...].; ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
-00000060  c8 a0 2b 32 b8 d5 a7 19  a7 5e 02 f6 f1 e9 ad 34  |..+2.....^.....4|
-00000070  72 59 97 9e 05 a8 46 42  21 53 06 06 81 ea b6 f1  |rY....FB!S......|
-00000080  ca b6 c6 a1 b6 2e c6 b7  93 17 8e bc 92 3f ac 9c  |.............?..|
-00000090  7a 74 d0 f9 b2 00 68 e3  f2 1d b6 b8 66 7b 8a cd  |zt....h.....f{..|
-000000a0  17 03 03 00 17 69 26 9c  4e 1d ec 10 61 5f 5b ef  |.....i&.N...a_[.|
-000000b0  d1 ad 5d 6a c5 0c d4 ef  a8 c4 8c ee 17 03 03 02  |..]j............|
-000000c0  6d c1 89 98 5a 1d 09 68  1a cd 6e 75 e6 d7 9c d4  |m...Z..h..nu....|
-000000d0  fb c4 70 dd c4 0d 6b 28  09 9b 59 53 81 44 80 f3  |..p...k(..YS.D..|
-000000e0  9f 16 7a 04 e2 15 8a 80  58 2d 98 1e aa 1c ac dc  |..z.....X-......|
-000000f0  f4 60 d9 b3 ff d3 da 56  4a d4 dc 99 89 78 7b 0e  |.`.....VJ....x{.|
-00000100  0a 76 93 08 9f c4 a6 22  de fe 9f ad 19 19 92 20  |.v....."....... |
-00000110  f3 2f ba c7 dd bc 15 54  03 8a ed 2f 5f 75 32 f2  |./.....T.../_u2.|
-00000120  2b cf 0e 08 2e c6 7e 6a  4c 3f 40 4e 89 3f c5 de  |+.....~jL?@N.?..|
-00000130  f0 0d a2 f3 e7 b6 48 ac  a6 c8 e9 78 8b ee a3 f1  |......H....x....|
-00000140  7c 87 ff 5d d0 9b 4c 98  bc fc 25 1b b8 56 00 22  ||..]..L...%..V."|
-00000150  e0 7e 52 24 c6 12 a3 21  39 2a 63 77 da ff de 21  |.~R$...!9*cw...!|
-00000160  98 85 1d 73 57 df 21 6c  e3 f8 de 06 4b 50 39 0e  |...sW.!l....KP9.|
-00000170  7c c9 c9 bc 7b 16 1e d7  e3 b2 e4 9e d3 a9 94 35  ||...{..........5|
-00000180  fb 65 22 b9 a9 f8 ef 13  5e 54 ef 4b d7 09 b8 72  |.e".....^T.K...r|
-00000190  a9 a5 30 a2 67 d3 ef 6e  aa 00 7c fb fa 63 28 e7  |..0.g..n..|..c(.|
-000001a0  48 18 23 9b 7e 0f dd 8b  b2 13 4f f6 d2 e4 75 42  |H.#.~.....O...uB|
-000001b0  27 8a 42 0c 02 d8 1e 45  82 ef 1b 65 a7 eb b5 19  |'.B....E...e....|
-000001c0  26 e5 42 06 80 80 d7 84  1e 05 c5 d5 f4 ea 53 51  |&.B...........SQ|
-000001d0  78 ba f3 47 47 01 7b 25  ab 34 f7 fc 52 71 ff a4  |x..GG.{%.4..Rq..|
-000001e0  d5 50 2b b5 7d e2 62 6a  e9 8e 9c 8d b2 6f d4 78  |.P+.}.bj.....o.x|
-000001f0  07 da 3a 9c 51 a3 d4 f5  24 a6 c0 c8 39 85 5f e1  |..:.Q...$...9._.|
-00000200  03 b0 65 8b 50 c4 5d 03  f6 36 d2 3d f2 36 e3 c6  |..e.P.]..6.=.6..|
-00000210  26 5b 82 d1 bd 54 e7 90  50 23 a8 e3 36 d9 d9 a0  |&[...T..P#..6...|
-00000220  07 df 1b 47 17 9c 2a ab  56 07 d5 ea e5 c7 71 0b  |...G..*.V.....q.|
-00000230  fb 0c 4e f3 5b 0e 1d d6  75 df 21 50 c3 c9 18 5f  |..N.[...u.!P..._|
-00000240  55 e1 84 91 5c 9c 13 68  95 15 ab 0e db 17 b1 b7  |U...\..h........|
-00000250  ee 3e 89 61 0f 6f 09 8b  6a 67 b5 bc 2a 61 cd 42  |.>.a.o..jg..*a.B|
-00000260  79 9a 9c a4 99 98 0d 1c  43 2c bd 8d ee ac a9 2e  |y.......C,......|
-00000270  6d 73 cc b3 a0 b7 b7 8f  8f 09 32 8a 9f 00 87 5f  |ms........2...._|
-00000280  ae b4 0f 47 22 0b ec f4  e2 be 4e 6f 13 8d 30 97  |...G".....No..0.|
-00000290  5a a8 f0 38 46 dd 1a 28  10 8b a8 4a e4 e6 fb 84  |Z..8F..(...J....|
-000002a0  c4 85 15 11 3d 0b 08 f7  9d fd 45 6a 6b f5 bf d4  |....=.....Ejk...|
-000002b0  2b 84 e5 20 5a a8 cb df  1f a3 af 96 17 df e8 b2  |+.. Z...........|
-000002c0  61 f1 d0 d1 85 91 d2 02  a5 38 a0 5e 19 ba c4 2c  |a........8.^...,|
-000002d0  80 64 77 13 e1 27 86 d3  d4 17 07 86 c7 11 c0 38  |.dw..'.........8|
-000002e0  11 69 89 48 39 7e b2 e5  d9 72 c1 b4 29 50 ab 9b  |.i.H9~...r..)P..|
-000002f0  49 cd 74 b9 4a ce c5 67  46 47 73 81 b1 a1 82 8f  |I.t.J..gFGs.....|
-00000300  76 ee 81 28 70 66 da 94  2a 8e 20 b0 ab 2e e4 d4  |v..(pf..*. .....|
-00000310  ef 26 8b 31 07 85 b6 b0  c2 5b 05 0a 32 2e e7 73  |.&.1.....[..2..s|
-00000320  41 e7 a1 97 f7 5e 2f 9c  73 25 c1 f7 77 12 17 03  |A....^/.s%..w...|
-00000330  03 00 99 92 0a 8c 17 e9  0d 77 a3 6f ab 1a 4f dd  |.........w.o..O.|
-00000340  de 1d 0f 72 39 5c 8f 9f  80 00 b2 e5 fe 28 79 a2  |...r9\.......(y.|
-00000350  16 21 e3 a2 25 90 c6 cd  f2 28 6d b6 08 5b 51 0d  |.!..%....(m..[Q.|
-00000360  58 22 a6 11 ac 29 5d 54  aa 05 35 28 87 da 54 39  |X"...)]T..5(..T9|
-00000370  b6 7f ef 94 3e 1c 80 59  f1 12 06 77 66 20 a1 00  |....>..Y...wf ..|
-00000380  82 ed 0b 7a 1f 5d 55 5e  31 11 85 93 69 94 2a 44  |...z.]U^1...i.*D|
-00000390  96 1c 39 7b 5b 7f 5b a6  05 6a 6d 52 79 20 52 f7  |..9{[.[..jmRy R.|
-000003a0  1f 79 50 36 f1 a9 00 aa  9d 46 57 fd 00 70 7b 4a  |.yP6.....FW..p{J|
-000003b0  7a 14 75 20 91 83 3e 1b  47 2a 90 c9 09 71 b6 95  |z.u ..>.G*...q..|
-000003c0  48 53 2a 3f 22 5f 9c 46  d6 12 27 b1 17 03 03 00  |HS*?"_.F..'.....|
-000003d0  35 98 15 74 4c d4 52 cf  0c 78 88 8f 82 9b c5 23  |5..tL.R..x.....#|
-000003e0  14 02 71 da 63 6c 28 36  aa 91 a0 14 74 0a 47 59  |..q.cl(6....t.GY|
-000003f0  ea 6f b1 46 1e a7 c4 5f  76 33 96 ae 82 eb 4b b4  |.o.F..._v3....K.|
-00000400  88 6a ce 37 db fd                                 |.j.7..|
+00000060  51 c8 a4 d2 63 ec a1 b7  72 7e 42 30 8e d2 eb b0  |Q...c...r~B0....|
+00000070  3c e0 06 d0 69 39 b7 55  ee 47 c3 b3 b6 56 2d df  |<...i9.U.G...V-.|
+00000080  3e 0c 1c 92 cf f6 c4 52  13 90 fa e6 52 13 e6 6d  |>......R....R..m|
+00000090  35 46 de 60 05 a1 85 a9  ec 86 dc da 19 4d 21 67  |5F.`.........M!g|
+000000a0  17 03 03 00 17 d7 59 69  75 49 13 ac 27 ad 1c a9  |......YiuI..'...|
+000000b0  17 68 46 77 a2 22 0a f5  6f ce 70 67 17 03 03 02  |.hFw."..o.pg....|
+000000c0  6d ee 92 51 b3 07 0f 46  be 24 a1 12 02 7e d1 d4  |m..Q...F.$...~..|
+000000d0  b1 2e f5 87 f5 96 ed 00  77 f1 ad 1b 8e cd 1d 01  |........w.......|
+000000e0  41 78 6a ff 68 9f 6d ac  fe 92 8a c5 43 d2 c9 1d  |Axj.h.m.....C...|
+000000f0  a8 d8 0f 00 7e c1 06 a9  16 ba 13 94 e7 d9 cd e1  |....~...........|
+00000100  01 fd 52 12 be b0 04 14  85 d3 06 a2 63 d7 16 7a  |..R.........c..z|
+00000110  06 5f 1f c2 31 ea 27 1a  a5 1d f6 39 d2 b1 99 8c  |._..1.'....9....|
+00000120  e0 71 32 3b ef 4e d3 1c  21 3f 30 59 5b 3e 1f 64  |.q2;.N..!?0Y[>.d|
+00000130  3c 27 35 0f ee f4 75 5c  53 38 f8 43 87 55 88 28  |<'5...u\S8.C.U.(|
+00000140  17 8f 4c 2d 73 d0 bd db  43 25 2f da fb f3 f7 b4  |..L-s...C%/.....|
+00000150  63 90 08 24 c6 b3 ae 91  00 2d 4f bd af bc 22 82  |c..$.....-O...".|
+00000160  08 ef 29 c9 49 d2 73 97  ce 6c 8d 1e a2 cb 53 ff  |..).I.s..l....S.|
+00000170  fe 9c b1 14 58 6f 45 bf  ee 93 c0 9b 96 86 54 1a  |....XoE.......T.|
+00000180  fc fe 84 c3 88 13 92 d4  d7 de 00 07 d4 f7 ef 8e  |................|
+00000190  5e 5f b0 12 c9 6a 81 df  05 e6 c3 a1 f6 8a bc 06  |^_...j..........|
+000001a0  bc 45 47 06 d4 45 70 78  f9 16 0f d2 f4 ae b5 94  |.EG..Epx........|
+000001b0  e6 ac b5 bf e3 40 d1 fe  20 07 23 f8 65 fe 57 b2  |.....@.. .#.e.W.|
+000001c0  63 a0 db 7b fa 12 25 2b  1f 1c df 66 ee c4 84 80  |c..{..%+...f....|
+000001d0  4a 95 64 3d 9f c2 e9 eb  7c 59 72 1c 52 68 fa 5a  |J.d=....|Yr.Rh.Z|
+000001e0  b3 d6 9e dc 51 d6 ac 0b  34 f1 66 42 4b 99 1d cb  |....Q...4.fBK...|
+000001f0  94 f4 08 c6 57 f9 97 87  54 9c 3b ba 4e 21 c7 b3  |....W...T.;.N!..|
+00000200  a0 d9 41 33 22 c4 3f a4  29 e4 7a 3c a1 86 e0 65  |..A3".?.).z<...e|
+00000210  f4 ff 67 c5 32 ae 16 01  67 8e 16 d7 28 5e b3 19  |..g.2...g...(^..|
+00000220  c6 18 c7 27 0d 01 8e 04  87 fb 6b f9 72 ee 00 ff  |...'......k.r...|
+00000230  25 f9 c5 dd bc 30 45 63  2d 4d 2d 9d ea 7f 54 aa  |%....0Ec-M-...T.|
+00000240  ac 9e d8 a2 ae c2 e3 64  b7 3d 54 56 67 39 e8 96  |.......d.=TVg9..|
+00000250  a5 5d fd 1e 01 2a 0c 7d  ee f1 4e fc 1b 19 f9 ef  |.]...*.}..N.....|
+00000260  60 dd e1 b2 94 f3 5f 54  d4 05 f7 86 83 6f 97 43  |`....._T.....o.C|
+00000270  4e 30 c1 49 cc 5e 98 10  5c 4e 32 84 97 70 c8 b9  |N0.I.^..\N2..p..|
+00000280  6d 0b c2 23 ab f9 e8 85  6f 0a 2a 99 e7 12 33 e8  |m..#....o.*...3.|
+00000290  f2 62 6f 65 0c 3d ff 9f  e6 15 eb 1d 24 0e e9 8a  |.boe.=......$...|
+000002a0  28 e0 09 31 23 a4 5c 2c  25 49 b4 0c 5f 18 e1 12  |(..1#.\,%I.._...|
+000002b0  82 16 6e 79 68 21 fb 5a  68 73 dd f7 2f aa e2 f9  |..nyh!.Zhs../...|
+000002c0  85 8d af c6 84 50 af 84  95 12 c8 32 a6 eb f0 93  |.....P.....2....|
+000002d0  a2 bd 97 d3 ba 76 a8 2e  a2 44 2f 98 23 ca 78 cd  |.....v...D/.#.x.|
+000002e0  7a 5f bf ab 19 00 72 b5  b3 e0 a7 b5 da 47 05 c8  |z_....r......G..|
+000002f0  44 0b 6c 7f 0b 4c 99 79  3c 47 7e e9 25 bd a8 4d  |D.l..L.y<G~.%..M|
+00000300  7a 1c 17 aa 00 dc f8 d8  98 5b 8e e4 30 9f 52 9e  |z........[..0.R.|
+00000310  d3 13 ea 82 65 8b 43 1f  05 f9 3a 86 09 e0 ed b9  |....e.C...:.....|
+00000320  8d 42 75 c7 dd 70 5d 04  c5 a4 68 04 e1 36 17 03  |.Bu..p]...h..6..|
+00000330  03 00 99 52 81 9b 5c ed  c2 08 48 13 d9 4f 0a 52  |...R..\...H..O.R|
+00000340  db 15 fc 73 66 03 85 10  b3 32 f3 e9 60 f1 c5 30  |...sf....2..`..0|
+00000350  e4 85 d8 ab 85 c7 52 f0  1e 99 88 cf b0 e1 f9 c7  |......R.........|
+00000360  c1 8a d0 ed 0f 0d 34 05  35 63 a6 52 bf 91 db f0  |......4.5c.R....|
+00000370  b2 46 fb d9 68 95 ec a7  e4 fc ff f7 f0 7f 54 db  |.F..h.........T.|
+00000380  a8 96 fe 9d 12 f0 38 3e  4f 68 ff 27 1c 25 a6 1d  |......8>Oh.'.%..|
+00000390  1f 89 9e 21 34 97 b9 7e  6e 2a c2 df 47 22 7d a6  |...!4..~n*..G"}.|
+000003a0  aa 7a 4a fd 11 b0 73 10  f5 16 8b 2c 3a af a6 7a  |.zJ...s....,:..z|
+000003b0  cc 3d 4b f0 36 43 60 db  53 2a 4e 2c 1b 2c 0a 54  |.=K.6C`.S*N,.,.T|
+000003c0  01 ff ad 7e 93 a8 d0 76  da 5a 88 88 17 03 03 00  |...~...v.Z......|
+000003d0  35 d0 36 70 7c 4c 6a 10  bd 43 50 2c 47 74 f9 ed  |5.6p|Lj..CP,Gt..|
+000003e0  9f 0b d7 33 82 74 2f fd  81 4d 08 d6 cf f4 13 4e  |...3.t/..M.....N|
+000003f0  de ec 84 bf 79 35 ee 72  8a a3 d0 61 29 94 ad 79  |....y5.r...a)..y|
+00000400  04 42 0f 2b 65 a1                                 |.B.+e.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 35 7b c5 88  f4 a0 83 1e 6e 67 e6 05  |....5{......ng..|
-00000010  05 fa b4 40 e3 7f fc f8  bc 50 11 76 93 22 92 5f  |...@.....P.v."._|
-00000020  9a 67 e5 65 a1 a3 af bc  ae 3b c7 aa b3 fb 99 f0  |.g.e.....;......|
-00000030  2a c2 65 aa 4b bd 91 20  17 22 17 03 03 00 17 1d  |*.e.K.. ."......|
-00000040  4f a0 06 07 65 2e 10 e7  15 c9 56 f3 2c 18 10 51  |O...e.....V.,..Q|
-00000050  c7 d5 ac 09 e6 93 17 03  03 00 13 34 b2 1d 5e da  |...........4..^.|
-00000060  55 b2 dd 2b c1 e0 ac 65  7e a2 52 f8 a4 5b        |U..+...e~.R..[|
+00000000  17 03 03 00 35 4b f7 dd  b6 64 32 61 42 e7 b2 93  |....5K...d2aB...|
+00000010  b8 4b dd 7c 25 c6 57 5b  68 d5 f2 d9 27 85 ee cf  |.K.|%.W[h...'...|
+00000020  09 44 79 8d 8e 14 0f 84  44 e5 16 a9 bf d9 14 bb  |.Dy.....D.......|
+00000030  22 73 c7 a9 24 c1 dd 38  1e 63 17 03 03 00 17 63  |"s..$..8.c.....c|
+00000040  56 45 91 62 9c 00 4b d6  ae f4 dc 17 a2 89 55 0d  |VE.b..K.......U.|
+00000050  c3 d4 f3 12 8b bf 17 03  03 00 13 1f ac ed f8 80  |................|
+00000060  31 7f 75 9f 6c a1 48 6e  20 89 b8 45 08 33        |1.u.l.Hn ..E.3|
index a613b78da58f65b9500299e593e9a493fbcd5b5a..d1efba928c55b454f46415416523a9de30d4a9a4 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f8 01 00 00  f4 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,96 +7,96 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
-000000a0  00 00 0d 00 18 00 16 08  04 08 05 08 06 04 01 04  |................|
-000000b0  03 05 01 05 03 06 01 06  03 02 01 02 03 ff 01 00  |................|
-000000c0  01 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
-000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
-000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
-000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
+000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
+000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
+000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 59 2c d4 a8 e3  |....z...v..Y,...|
-00000010  ec 72 f1 2f 9b ff af 2f  ab 13 fe 21 80 a5 c1 71  |.r./.../...!...q|
-00000020  02 55 9b 06 67 0f 7b dd  27 32 66 20 00 00 00 00  |.U..g.{.'2f ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 a2 49 b5 61 fe  |....z...v...I.a.|
+00000010  e3 52 ca 87 58 57 0f ec  bc 71 51 a9 50 7c ac 5e  |.R..XW...qQ.P|.^|
+00000020  af 4e 47 56 81 6c 92 d9  10 3d d0 20 00 00 00 00  |.NGV.l...=. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 3e  |..+.....3.$... >|
-00000060  13 b1 51 26 01 be c0 e5  85 a7 18 aa b5 83 21 6e  |..Q&..........!n|
-00000070  85 48 1b ea 4c 99 13 ba  b8 de 07 30 f4 9f 5b 14  |.H..L......0..[.|
-00000080  03 03 00 01 01 17 03 03  00 17 9f 78 1e 98 cb 85  |...........x....|
-00000090  0e 65 2b e5 20 c1 63 c1  b7 49 49 76 e3 90 0c c9  |.e+. .c..IIv....|
-000000a0  b6 17 03 03 02 6d 8f 91  03 6b b7 0d 7d 79 4c 16  |.....m...k..}yL.|
-000000b0  fc cb 62 11 62 12 2a 52  9a 19 7c b6 1c fc 31 d2  |..b.b.*R..|...1.|
-000000c0  11 4d b4 e9 23 3c 58 3e  87 f1 9e e0 27 04 a2 fb  |.M..#<X>....'...|
-000000d0  21 9a 82 59 3b ea 6b 29  ec a8 0e 1c 58 99 46 9b  |!..Y;.k)....X.F.|
-000000e0  2b c2 90 10 5d bc df d1  a0 71 00 8f 9b 90 10 49  |+...]....q.....I|
-000000f0  97 1d b5 d2 8f e2 a6 78  b1 2a e9 2d 8d 13 38 2f  |.......x.*.-..8/|
-00000100  db 56 bb cd 0f 08 69 f7  04 de 53 ec 3c 90 97 ca  |.V....i...S.<...|
-00000110  9f 63 d0 96 7f 3a 98 98  77 21 c8 ee 0f 5c 4e 97  |.c...:..w!...\N.|
-00000120  3c 72 88 13 48 82 1b 70  b2 83 b4 95 03 81 05 ef  |<r..H..p........|
-00000130  81 40 69 36 29 44 75 0f  10 6c 8e a4 af 67 15 45  |.@i6)Du..l...g.E|
-00000140  42 bc 35 3f a5 c1 a7 c2  0a e0 7f bc f2 b6 a3 53  |B.5?...........S|
-00000150  b4 14 56 ed 45 5b e0 35  c6 93 3a f5 90 a7 4c 78  |..V.E[.5..:...Lx|
-00000160  01 3d 6a 16 41 52 31 e7  a9 8c 29 5e e5 e4 6a 3a  |.=j.AR1...)^..j:|
-00000170  95 59 a0 d9 67 b5 62 ed  13 98 82 b8 9b e1 f3 cf  |.Y..g.b.........|
-00000180  1f 39 0e 58 d4 19 a1 59  b3 c9 d9 dc 7a 2c 78 da  |.9.X...Y....z,x.|
-00000190  f2 54 58 91 36 59 24 dc  90 78 53 2f d7 e5 74 10  |.TX.6Y$..xS/..t.|
-000001a0  f3 ab f2 7e f8 8e 4d a9  15 b5 d8 65 85 0f e2 aa  |...~..M....e....|
-000001b0  40 ec b6 a6 3c d9 2e 11  17 72 6d 11 ab b5 65 8c  |@...<....rm...e.|
-000001c0  c1 62 8a 2e 0d b1 84 45  fa 23 b4 4e 39 9d 6b b7  |.b.....E.#.N9.k.|
-000001d0  91 3c 29 87 59 2c 95 40  29 4c af 7f 67 4c e4 fb  |.<).Y,.@)L..gL..|
-000001e0  9b 91 5f 96 bc 0b 4a b0  8b 52 d5 92 91 42 83 85  |.._...J..R...B..|
-000001f0  9a ec 81 56 ee 90 03 e7  d5 36 e9 ca e5 ed 07 4b  |...V.....6.....K|
-00000200  c8 ba c8 45 1b fc a8 95  b8 ff a0 9b 32 de 35 da  |...E........2.5.|
-00000210  af 6e 3a 0a 3a 94 6f 23  29 78 c1 21 07 7d 5e c2  |.n:.:.o#)x.!.}^.|
-00000220  9f 32 6d 78 75 58 c6 81  e2 6a ee d3 ea 69 8a 31  |.2mxuX...j...i.1|
-00000230  dc 86 9b ad b4 f6 29 0e  5f e3 aa e2 32 13 60 e5  |......)._...2.`.|
-00000240  b8 5a 45 7b bc ad f1 ae  42 18 4c dd 10 aa 60 88  |.ZE{....B.L...`.|
-00000250  b2 d5 e2 e6 cd 83 85 4d  ba c4 a4 94 52 bd 70 8e  |.......M....R.p.|
-00000260  85 4e ef 57 f9 9f ae f0  40 50 6b 5c 3a d2 cb 7b  |.N.W....@Pk\:..{|
-00000270  53 c7 01 60 7c 0b 53 39  bf a8 a2 f7 ef 6c 99 a5  |S..`|.S9.....l..|
-00000280  b5 23 3d d1 d5 a5 93 bc  40 41 10 29 4c a6 2d 91  |.#=.....@A.)L.-.|
-00000290  5a 43 2c 7b fb ef 70 73  5f f0 13 9a 5d f2 f3 41  |ZC,{..ps_...]..A|
-000002a0  7e 8b 09 f3 6f 5a c8 40  b7 18 b9 ff 4c 93 ee 8e  |~...oZ.@....L...|
-000002b0  f2 cb 6b 02 b8 d8 b7 d2  8d dd 2f 19 83 f7 7d bc  |..k......./...}.|
-000002c0  71 62 78 b4 43 29 62 76  a0 82 17 bc d8 d4 09 dd  |qbx.C)bv........|
-000002d0  8e 48 bf 4b dd 44 45 7a  1f 9c bd ae 0c 26 fc 71  |.H.K.DEz.....&.q|
-000002e0  dc c7 49 ee 13 46 c8 dd  f9 45 46 34 4c ac 02 33  |..I..F...EF4L..3|
-000002f0  64 89 02 d7 93 dd 03 3e  3a 12 d7 c1 8e 18 55 33  |d......>:.....U3|
-00000300  76 5f ce 26 f6 53 d0 23  3a e2 78 0f 0a fe 2f 89  |v_.&.S.#:.x.../.|
-00000310  43 27 b3 17 03 03 00 99  61 da d2 f7 6d 84 f0 08  |C'......a...m...|
-00000320  b0 89 f8 a4 1f b4 99 6a  cf d1 08 d6 a7 03 fa f9  |.......j........|
-00000330  db c2 8a 9a 74 62 0c 93  7d 7c 22 c0 2d 84 5d 96  |....tb..}|".-.].|
-00000340  f8 66 05 6c c5 ab b6 5b  2d f5 10 27 c6 c3 81 13  |.f.l...[-..'....|
-00000350  94 3c af 56 ca 37 ca a6  24 86 34 54 f2 60 e2 51  |.<.V.7..$.4T.`.Q|
-00000360  67 5e dd 81 7f 87 81 84  15 cf b9 92 01 9c fc 90  |g^..............|
-00000370  18 21 ad 6a 4a b8 4f fe  03 c8 83 08 fd 55 5a 4d  |.!.jJ.O......UZM|
-00000380  75 b7 e3 2d ff 9d 0a e5  61 b2 e9 82 bf 65 6a 05  |u..-....a....ej.|
-00000390  d1 8d 36 82 07 8d a0 95  78 26 9e 3a c7 99 27 3f  |..6.....x&.:..'?|
-000003a0  54 0e a3 dd 9a 93 a6 6c  9b a3 14 46 bb cc f8 70  |T......l...F...p|
-000003b0  f1 17 03 03 00 35 34 03  e6 68 dc f1 3e ae 38 69  |.....54..h..>.8i|
-000003c0  87 ce 72 92 13 4a c0 4a  0d 22 28 3a 9f df 7d d5  |..r..J.J."(:..}.|
-000003d0  de 5f 3c 0d 49 be b7 63  85 67 90 be 68 dc e7 88  |._<.I..c.g..h...|
-000003e0  e3 58 90 43 99 0a db ee  ad be 6d                 |.X.C......m|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 75  |..+.....3.$... u|
+00000060  c4 ba b0 c4 9b a0 57 6a  ca e4 9c c6 eb f8 66 5a  |......Wj......fZ|
+00000070  d4 64 36 34 71 9d 6d 0f  2f 34 b8 ad b7 4a 55 14  |.d64q.m./4...JU.|
+00000080  03 03 00 01 01 17 03 03  00 17 ec 4c 36 aa 81 cf  |...........L6...|
+00000090  61 2c 2f 6c 35 e8 25 62  54 17 ae 9b 46 b0 96 f5  |a,/l5.%bT...F...|
+000000a0  0f 17 03 03 02 6d 6f 6c  27 e5 53 42 db 32 b4 2c  |.....mol'.SB.2.,|
+000000b0  6a 70 56 a7 0d 3a 7f a3  d7 fe 04 4f 0a 3e 52 8c  |jpV..:.....O.>R.|
+000000c0  52 1e 3a 26 5d 47 b1 6b  da 90 e2 74 50 0d 6e fa  |R.:&]G.k...tP.n.|
+000000d0  1b 3f 17 3b 21 f7 fa f7  c7 c3 e3 14 05 09 76 b2  |.?.;!.........v.|
+000000e0  27 66 bc 42 7e 49 4b ff  3a f1 3f a3 1a d4 9e 03  |'f.B~IK.:.?.....|
+000000f0  3f b6 a8 87 98 50 f3 d8  cb 8b a2 e9 2a ea ff bc  |?....P......*...|
+00000100  50 18 d0 57 58 c5 e9 c8  96 67 01 8b e2 a3 f4 77  |P..WX....g.....w|
+00000110  5e 1d 93 89 b6 f6 57 7d  93 b6 62 86 0a 21 18 56  |^.....W}..b..!.V|
+00000120  8c 14 25 df 47 1a b3 23  e6 99 d1 fc dc 07 0a 38  |..%.G..#.......8|
+00000130  9a 05 c8 3f 23 5c c5 d3  c4 48 fb b2 fd 9f 83 37  |...?#\...H.....7|
+00000140  1d 0c 85 9c 2b e6 ae 42  aa ad d4 5a 9e 49 89 b7  |....+..B...Z.I..|
+00000150  b0 c2 c5 ec 42 89 88 87  6e 54 3d 73 b2 f1 5f 0f  |....B...nT=s.._.|
+00000160  4b 49 3f 6b a3 8f 5f 99  bf fe af e9 25 ac 27 b7  |KI?k.._.....%.'.|
+00000170  e7 96 bb 4a c8 e8 9e f1  2c 23 c2 e7 96 ba b4 fe  |...J....,#......|
+00000180  d5 94 b5 72 82 bd 7f c2  e1 af b4 bd db c7 15 20  |...r........... |
+00000190  85 60 bb 02 f6 4b ef 09  3e a1 4e b9 77 64 0a 4a  |.`...K..>.N.wd.J|
+000001a0  2c 05 82 96 91 be 23 44  50 c1 c5 6c 05 55 51 42  |,.....#DP..l.UQB|
+000001b0  84 87 20 71 65 8d 09 86  66 fa 88 8b 54 21 44 34  |.. qe...f...T!D4|
+000001c0  df 6f ce a3 e9 12 4a e0  90 76 bb 1a f5 00 79 cb  |.o....J..v....y.|
+000001d0  d8 82 3b 88 c8 6a 5b a1  49 49 a0 c0 f7 d9 8f 89  |..;..j[.II......|
+000001e0  f2 04 59 2b 0c 6f e2 3f  b8 a8 c9 aa bf 2e 18 74  |..Y+.o.?.......t|
+000001f0  45 b5 35 34 9a bb fa 77  e8 46 b2 f8 6d 41 65 36  |E.54...w.F..mAe6|
+00000200  d9 f8 64 81 a6 50 63 b4  73 3e fb f9 b3 3e 03 3d  |..d..Pc.s>...>.=|
+00000210  d1 f4 b5 c1 ac f8 3f 4d  73 b7 da 16 8a 37 c9 a7  |......?Ms....7..|
+00000220  51 33 b1 68 69 19 0b 26  de a6 42 4d 22 a3 e8 c0  |Q3.hi..&..BM"...|
+00000230  7b 1d 66 e7 70 26 44 f7  62 3f 3d 0d e2 02 50 61  |{.f.p&D.b?=...Pa|
+00000240  db 9b 5e e4 49 e8 32 32  7a c0 03 37 a8 c6 85 80  |..^.I.22z..7....|
+00000250  4a 7e 39 b5 ba 6c cb 6f  53 e5 90 d0 0d 9c 2e e5  |J~9..l.oS.......|
+00000260  90 df 9b b1 c5 3f 16 98  a9 dd a1 b5 7a 48 04 0e  |.....?......zH..|
+00000270  15 f9 60 a7 35 0b 33 a1  93 4b 73 5f b3 46 a6 43  |..`.5.3..Ks_.F.C|
+00000280  ea a3 6e 4c fa bb 24 44  cd 48 85 c1 9f ea c2 14  |..nL..$D.H......|
+00000290  92 48 2e 35 43 30 dc e6  76 23 0b e4 2f 28 13 c1  |.H.5C0..v#../(..|
+000002a0  e1 bb 2d 9f de cf 10 8f  c3 8f 48 eb 64 eb 6d ef  |..-.......H.d.m.|
+000002b0  2a b3 c5 d6 85 db a2 05  b2 46 f8 77 aa 2c fb 14  |*........F.w.,..|
+000002c0  be 09 e7 11 33 88 cb 71  1b ca 46 cb 79 c6 99 eb  |....3..q..F.y...|
+000002d0  43 bb 59 c6 91 3b 0f 1a  76 cb c7 3b ef 07 c9 cb  |C.Y..;..v..;....|
+000002e0  3a 75 ac 14 d9 53 08 ca  4d 45 48 24 4a af 4e 94  |:u...S..MEH$J.N.|
+000002f0  0e 81 31 63 d1 f6 67 25  7d c0 dd 02 05 1b ce 38  |..1c..g%}......8|
+00000300  69 cf e7 6a bb b5 02 85  00 82 71 a6 e3 c0 33 b8  |i..j......q...3.|
+00000310  78 51 55 17 03 03 00 99  b3 5c cb a4 a3 6c e9 fa  |xQU......\...l..|
+00000320  33 25 04 21 28 66 e7 d4  22 02 8f d4 3e cc e1 20  |3%.!(f.."...>.. |
+00000330  15 5b 5a 55 14 d3 2b a5  de 7b 95 48 3c 26 68 22  |.[ZU..+..{.H<&h"|
+00000340  a3 0d c6 ac 7f ec d3 7b  fa 4d 51 20 6f 32 97 bc  |.......{.MQ o2..|
+00000350  fa 0c d6 8e bf ee 13 ca  b3 cf 00 c5 f5 87 f1 cb  |................|
+00000360  9b 63 22 e6 61 99 83 78  69 1d 03 f1 0b 66 c5 c4  |.c".a..xi....f..|
+00000370  2e 6f d8 b5 59 93 f7 40  3c 40 4e 1a 58 af b5 37  |.o..Y..@<@N.X..7|
+00000380  ce dd 83 dd b1 78 a8 ba  a3 35 f8 9f 0c 47 1e fb  |.....x...5...G..|
+00000390  aa 9b b5 5f 11 4c b9 0c  c1 a0 01 47 87 f9 e6 1f  |..._.L.....G....|
+000003a0  d5 e5 3f a7 15 4d c8 a5  79 9c e5 bc 62 6f cb cd  |..?..M..y...bo..|
+000003b0  86 17 03 03 00 35 e7 4d  67 3a 39 5b ac 13 89 cc  |.....5.Mg:9[....|
+000003c0  c4 dc 20 2b a4 b2 3c 5d  96 f1 45 17 52 12 ed 85  |.. +..<]..E.R...|
+000003d0  00 f0 7e 73 3a 6d a2 46  b8 59 7f e8 6f 46 06 e1  |..~s:m.F.Y..oF..|
+000003e0  43 c9 ca af a9 3e ca d6  42 4b 41                 |C....>..BKA|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 ea a5 10 9a 0a  |..........5.....|
-00000010  57 40 9c b7 f8 e6 01 28  9e 3f ae ce ec 73 7f 2e  |W@.....(.?...s..|
-00000020  84 8e a9 e3 cb 03 3b b3  1b 98 3c 09 5b 23 c2 10  |......;...<.[#..|
-00000030  c1 18 47 74 a8 a5 0e 33  93 5f 83 e9 e6 aa ed f5  |..Gt...3._......|
-00000040  17 03 03 00 17 80 72 fb  00 25 ff 83 4c df 43 66  |......r..%..L.Cf|
-00000050  cd e5 64 2e 78 44 e4 b7  58 61 fe 01              |..d.xD..Xa..|
+00000000  14 03 03 00 01 01 17 03  03 00 35 4d ad c5 c7 cc  |..........5M....|
+00000010  5a 34 8a f8 5f 71 83 af  fa 94 df 2a 94 a0 c4 8e  |Z4.._q.....*....|
+00000020  5e 00 f7 02 e1 30 62 a5  49 27 58 0b 1f fa 46 98  |^....0b.I'X...F.|
+00000030  f0 b8 6f 42 e3 3a 7f 26  77 b6 46 8f ab c6 5d d6  |..oB.:.&w.F...].|
+00000040  17 03 03 00 17 90 81 68  7a 48 8d 3b 59 9e 11 6f  |.......hzH.;Y..o|
+00000050  86 b5 24 e4 d9 e0 60 9f  c2 4f 3d 33              |..$...`..O=3|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 16 54 f1 cd  5a 87 da 6a e7 a6 e5 00  |.....T..Z..j....|
-00000010  60 f8 cd 6b af db 1b 85  3b 40 23                 |`..k....;@#|
+00000000  17 03 03 00 16 94 83 fa  cc 66 b4 60 c0 c7 6d b3  |.........f.`..m.|
+00000010  6e 8c 84 9d 89 76 61 3d  69 fd 29                 |n....va=i.)|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 b2 74 fa  c8 c6 6e 4f 62 4f ea 02  |......t...nObO..|
-00000010  4d 10 78 f1 b3 4a e2 e5  1d 8f 33                 |M.x..J....3|
+00000000  17 03 03 00 16 60 cb 39  3d 7d 79 01 88 93 bd bf  |.....`.9=}y.....|
+00000010  23 3b d1 f3 a4 5e 78 ea  cd 0f 5e                 |#;...^x...^|
 >>> Flow 6 (server to client)
-00000000  17 03 03 00 1a ba bc 59  f7 ad b4 77 2f bc 3d 60  |.......Y...w/.=`|
-00000010  5c bd 6c 6e 37 86 75 bd  e1 41 b9 07 f6 87 47     |\.ln7.u..A....G|
+00000000  17 03 03 00 1a 88 13 b4  f1 5f cc 63 1e 99 9f 85  |........._.c....|
+00000010  60 ff 0e 97 13 59 64 2a  c3 0d 2b ac ca a2 25     |`....Yd*..+...%|
 >>> Flow 7 (client to server)
-00000000  17 03 03 00 1d 7d 12 1b  b2 a7 b7 ae 37 fb 2d 71  |.....}......7.-q|
-00000010  98 ec c2 f0 7f 16 e9 b9  f9 49 05 e2 b2 c3 c6 ec  |.........I......|
-00000020  38 32 17 03 03 00 13 9f  c4 f4 f7 e9 c9 5f e2 70  |82..........._.p|
-00000030  b4 33 9f 35 f3 2a b1 cd  01 d5                    |.3.5.*....|
+00000000  17 03 03 00 1d 4f f2 48  ea b8 d6 75 8e 97 ab 54  |.....O.H...u...T|
+00000010  29 57 50 5b 59 40 59 d3  7a 3c 01 43 6a 33 30 bb  |)WP[Y@Y.z<.Cj30.|
+00000020  d4 40 17 03 03 00 13 18  fc b7 ac eb e7 52 6d f0  |.@...........Rm.|
+00000030  d4 d3 03 c6 5f 4e ea e3  7b 4e                    |...._N..{N|
index 20cafb45b61cc02ced9bf291634ac4a1879701c0..e6d81184e10c8d8885a1b01ee47dae37fa5d780c 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 13 01 00 01  0f 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 15 01 00 01  11 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,88 +7,88 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 94 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
-00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 18 00  |................|
-000000a0  16 08 04 08 05 08 06 04  01 04 03 05 01 05 03 06  |................|
-000000b0  01 06 03 02 01 02 03 ff  01 00 01 00 00 12 00 00  |................|
-000000c0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
-000000d0  47 00 45 00 17 00 41 04  1e 18 37 ef 0d 19 51 88  |G.E...A...7...Q.|
-000000e0  35 75 71 b5 e5 54 5b 12  2e 8f 09 67 fd a7 24 20  |5uq..T[....g..$ |
-000000f0  3e b2 56 1c ce 97 28 5e  f8 2b 2d 4f 9e f1 07 9f  |>.V...(^.+-O....|
-00000100  6c 4b 5b 83 56 e2 32 42  e9 58 b6 d7 49 a6 b5 68  |lK[.V.2B.X..I..h|
-00000110  1a 41 03 56 6b dc 5a 89                           |.A.Vk.Z.|
+00000080  01 00 00 96 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
+000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
+000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000d0  33 00 47 00 45 00 17 00  41 04 1e 18 37 ef 0d 19  |3.G.E...A...7...|
+000000e0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
+000000f0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
+00000100  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
+00000110  b5 68 1a 41 03 56 6b dc  5a 89                    |.h.A.Vk.Z.|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 9b 02 00 00  97 03 03 42 8e 0f 88 bb  |...........B....|
-00000010  99 f5 32 74 2a 0a 66 98  59 da 0c 3f df 23 8c 72  |..2t*.f.Y..?.#.r|
-00000020  a7 ba f5 52 78 88 22 a0  db 3d cc 20 00 00 00 00  |...Rx."..=. ....|
+00000000  16 03 03 00 9b 02 00 00  97 03 03 b5 3c c8 fe 64  |............<..d|
+00000010  f6 04 7d 28 a4 25 7c 1b  f5 0b e6 6d 0b f5 2f ec  |..}(.%|....m../.|
+00000020  78 c1 bd 5a cf c8 19 d9  5c 54 72 20 00 00 00 00  |x..Z....\Tr ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
-00000060  42 55 a6 b0 22 e7 51 7f  ce 3c 15 f5 ef db 69 89  |BU..".Q..<....i.|
-00000070  80 e1 5a 54 37 d9 df 4c  bd 83 72 43 5f b5 bf 28  |..ZT7..L..rC_..(|
-00000080  21 41 0f 4c 71 a4 42 ae  90 20 8b 2e 95 88 1d a0  |!A.Lq.B.. ......|
-00000090  4d 50 6f 05 3d 71 26 e2  ca 12 2b bf 5b 18 b6 16  |MPo.=q&...+.[...|
-000000a0  14 03 03 00 01 01 17 03  03 00 17 fd a0 c1 f6 d6  |................|
-000000b0  f5 7c 39 25 4c 67 ad fa  10 18 d1 90 b2 61 90 3f  |.|9%Lg.......a.?|
-000000c0  71 49 17 03 03 02 6d 28  31 4d 75 d8 9d 93 a0 ee  |qI....m(1Mu.....|
-000000d0  ad ef a3 dc 14 12 a8 af  17 b4 46 20 50 96 26 54  |..........F P.&T|
-000000e0  78 4d d7 4f 08 e9 93 61  b6 53 da b2 e9 9c 67 54  |xM.O...a.S....gT|
-000000f0  e8 87 0d 64 0c cc 14 cd  d0 b5 df 1e d7 25 58 ce  |...d.........%X.|
-00000100  0b c9 a6 dc 38 9d 00 85  ce c3 01 29 3a 74 26 d4  |....8......):t&.|
-00000110  71 db c0 92 2b 95 d2 00  d0 38 8d 85 f5 22 05 c7  |q...+....8..."..|
-00000120  3b d4 d5 c7 a6 36 0d 3e  39 2c d5 0f 0d 84 80 22  |;....6.>9,....."|
-00000130  e5 f0 71 24 0d 93 68 21  db 51 e2 24 84 0c 30 2a  |..q$..h!.Q.$..0*|
-00000140  87 e5 b5 a2 b6 b8 9c 53  a1 bb 76 7d e8 10 e4 59  |.......S..v}...Y|
-00000150  f2 be 69 6f 39 75 e2 ed  70 f3 f0 fd 70 2f ce 2a  |..io9u..p...p/.*|
-00000160  24 d0 05 3e 13 ee 76 f5  6b b8 ed ee 34 40 cc e5  |$..>..v.k...4@..|
-00000170  11 58 62 22 99 04 3c 22  43 24 46 78 66 a0 04 11  |.Xb"..<"C$Fxf...|
-00000180  86 b4 b7 87 71 ff f9 ed  6f 4f 7e 9f 2d 08 ed ae  |....q...oO~.-...|
-00000190  cc 03 29 6f 34 9b 18 2c  ae d7 d5 e9 03 51 5d 37  |..)o4..,.....Q]7|
-000001a0  d5 ac 93 07 2a 78 8f 7d  b0 85 ae 19 37 a5 e8 d6  |....*x.}....7...|
-000001b0  e4 b3 01 14 04 fc ab 36  d6 5e 31 45 47 14 f8 d9  |.......6.^1EG...|
-000001c0  c8 a0 a0 49 56 74 68 5b  b4 20 f7 e0 54 34 41 45  |...IVth[. ..T4AE|
-000001d0  c0 5e ed a6 1c 84 d8 3a  c7 2d 17 5a 4c bd 7d d1  |.^.....:.-.ZL.}.|
-000001e0  a8 9e 5e d1 31 b1 6b 48  64 11 d8 89 01 9f ed 12  |..^.1.kHd.......|
-000001f0  60 73 66 80 38 13 23 8d  31 ca 94 06 22 e9 45 ff  |`sf.8.#.1...".E.|
-00000200  d6 a3 0b 7c 30 c8 d7 30  4f c0 62 84 ac f9 b0 3d  |...|0..0O.b....=|
-00000210  68 76 d2 02 27 d9 1e 7e  da ae 85 47 e1 08 0f 4f  |hv..'..~...G...O|
-00000220  74 a9 fc ca f2 38 68 6d  c6 f3 3c e9 99 c5 48 79  |t....8hm..<...Hy|
-00000230  88 37 b6 5d 4f f8 8b 53  41 9a 39 a7 2f 8e 39 81  |.7.]O..SA.9./.9.|
-00000240  75 cf 70 2f 28 4c 10 32  73 9b 6e 4f 58 1f ae 28  |u.p/(L.2s.nOX..(|
-00000250  3f 6c 3d 60 49 48 15 10  2a af ea d7 ce 55 07 47  |?l=`IH..*....U.G|
-00000260  90 3a c8 0d 6a 4a 88 c2  9c d3 08 99 02 c9 88 be  |.:..jJ..........|
-00000270  91 5b c9 41 46 cf b1 5e  fe 28 1e 97 8a 44 5a e0  |.[.AF..^.(...DZ.|
-00000280  d0 a3 a9 ea f7 51 27 87  b3 0f fd dc 7d d4 96 4a  |.....Q'.....}..J|
-00000290  39 2c 0a 58 9c 23 0d 41  89 42 5e fd 19 ab 19 a8  |9,.X.#.A.B^.....|
-000002a0  e4 70 3f ef c6 54 fb ed  80 9b 68 d6 d9 6f 21 53  |.p?..T....h..o!S|
-000002b0  89 40 06 c9 0c 56 40 8c  36 61 91 18 81 ce 76 5d  |.@...V@.6a....v]|
-000002c0  78 f5 01 9f 2e de 3e 89  61 d7 81 a5 f9 32 24 44  |x.....>.a....2$D|
-000002d0  6b fa 0b 9c 8b a4 f6 df  a1 2a 31 91 b2 40 cd 7e  |k........*1..@.~|
-000002e0  6c d1 75 c9 56 48 e3 36  eb 13 00 cf ea d5 d9 98  |l.u.VH.6........|
-000002f0  71 4c d2 af 06 e5 f1 f7  8f ce 79 7a 93 4c 1c 99  |qL........yz.L..|
-00000300  61 8f 93 76 de 1d ca ff  1b e5 c3 8f 99 ac 65 92  |a..v..........e.|
-00000310  74 a9 d6 fd 9d bd a7 da  f6 d5 94 7f 66 87 e1 7e  |t...........f..~|
-00000320  16 43 04 8a 9f 00 cc 89  1b 33 32 a2 26 e1 62 76  |.C.......32.&.bv|
-00000330  30 07 5d 0e 17 03 03 00  99 22 4f 7b 1f 73 59 91  |0.]......"O{.sY.|
-00000340  1e dc 62 ce 8b 32 7f 7d  99 b0 71 7a fb 79 09 5a  |..b..2.}..qz.y.Z|
-00000350  2e 0c b4 f2 00 13 5d ae  7d ae 80 1c 5f 8a a1 99  |......].}..._...|
-00000360  c9 20 39 a9 66 36 f0 2b  de 2e 1d ef 1f e1 ce 34  |. 9.f6.+.......4|
-00000370  9a db f7 7b 17 52 91 ac  76 ff 22 63 8c 07 dd 7d  |...{.R..v."c...}|
-00000380  72 eb 9b 34 0f e9 a4 43  6b e3 fa e1 00 e3 dc 65  |r..4...Ck......e|
-00000390  7a 49 bf a6 cd 97 4f e9  49 ae 91 4c be c3 3a b1  |zI....O.I..L..:.|
-000003a0  a1 ee 09 55 ce 87 e7 59  58 24 cb 43 16 c9 5f d6  |...U...YX$.C.._.|
-000003b0  11 32 83 47 dd 14 8d 11  c9 29 ac b8 57 7d 1e 07  |.2.G.....)..W}..|
-000003c0  34 cc 79 13 22 00 62 39  4c 7e 5f 89 dc 94 b9 ca  |4.y.".b9L~_.....|
-000003d0  d9 ef 17 03 03 00 35 6a  70 22 84 c0 ed d6 70 b1  |......5jp"....p.|
-000003e0  d5 8c 29 f9 0d 03 69 d1  0e 4c 01 79 1b 97 2f 24  |..)...i..L.y../$|
-000003f0  45 08 25 4e 56 58 7c d7  d1 79 67 73 7c e2 30 54  |E.%NVX|..ygs|.0T|
-00000400  54 2f c0 e2 28 e3 5a 87  47 0f f9 33              |T/..(.Z.G..3|
+00000060  d7 63 55 0e 0d 7b fb 09  a9 61 92 70 2b 52 9c 38  |.cU..{...a.p+R.8|
+00000070  2d e8 2a 68 27 b7 15 3e  4a 1e 92 c8 08 7b 5c c9  |-.*h'..>J....{\.|
+00000080  8d d4 aa 97 63 42 a5 3e  4b e8 7d 37 98 d9 8c a6  |....cB.>K.}7....|
+00000090  e7 c7 45 9f 73 48 bd c3  14 82 67 5b bb 19 bd a5  |..E.sH....g[....|
+000000a0  14 03 03 00 01 01 17 03  03 00 17 67 d9 cb 2b d1  |...........g..+.|
+000000b0  d2 30 7d b3 3f c1 77 5a  6c 87 41 2c 29 83 36 19  |.0}.?.wZl.A,).6.|
+000000c0  74 38 17 03 03 02 6d ac  0c 4f fe b5 93 6a fa 9f  |t8....m..O...j..|
+000000d0  e9 76 a7 c3 8a bb 4a 64  7a 04 35 58 e6 a2 d8 7a  |.v....Jdz.5X...z|
+000000e0  cf 99 1c 60 13 1a ca c6  e6 10 11 7a f1 f4 be ec  |...`.......z....|
+000000f0  1d 2d db b1 a5 3a dd 7e  10 2b 65 ca 40 b2 5f fc  |.-...:.~.+e.@._.|
+00000100  3f c9 df 7d 26 c1 fc b7  2d 67 a1 2d a2 22 b3 40  |?..}&...-g.-.".@|
+00000110  79 d4 c8 b6 73 f7 93 8a  97 4f b7 ab b6 0c ca 14  |y...s....O......|
+00000120  3c 1e 6c 27 c0 be 01 d7  98 ef 93 78 f5 14 15 21  |<.l'.......x...!|
+00000130  4c f8 8e a6 f7 72 b2 b7  bc c2 3e 9b b7 e4 0d 15  |L....r....>.....|
+00000140  b5 69 75 e9 61 10 e4 d5  8e 60 44 88 bf 5f df f9  |.iu.a....`D.._..|
+00000150  8d 70 54 4e f6 0f 37 70  ff b8 6b c0 4f fb 61 c1  |.pTN..7p..k.O.a.|
+00000160  48 00 96 9b da 05 0f 78  7a 87 f5 b1 69 f6 4f 8e  |H......xz...i.O.|
+00000170  80 74 7b e0 e5 b7 0f ba  7d 9d 4c ff c9 d7 7c b9  |.t{.....}.L...|.|
+00000180  f0 bd dd 34 8e 77 5f 3b  48 10 10 6f ed c7 84 15  |...4.w_;H..o....|
+00000190  7a 0c 26 3e 5d 9d 58 07  02 8c e3 fa f0 6b 86 df  |z.&>].X......k..|
+000001a0  76 af 3c 13 c4 93 28 7a  17 04 98 91 26 72 5f aa  |v.<...(z....&r_.|
+000001b0  cf b2 9e 37 a9 93 12 bd  1d 92 64 b8 82 60 b0 b5  |...7......d..`..|
+000001c0  1d 2c 4e 18 24 11 3b 52  33 05 f0 3b f2 27 ed a6  |.,N.$.;R3..;.'..|
+000001d0  f6 4a 82 b6 df 05 a0 07  a3 9d 73 0a 3c 7f 02 47  |.J........s.<..G|
+000001e0  60 c8 aa 20 b4 9c cd 48  12 a3 82 fe 99 4e 0c bb  |`.. ...H.....N..|
+000001f0  ec 4f 10 75 26 99 a4 ed  5e 4a 34 51 38 88 2c 3c  |.O.u&...^J4Q8.,<|
+00000200  0b 8d f8 65 84 38 47 c8  31 30 82 71 3f 54 e3 3f  |...e.8G.10.q?T.?|
+00000210  f1 e6 2c ef a3 fe 02 34  16 58 21 55 6e 0f 95 d3  |..,....4.X!Un...|
+00000220  3e 18 e5 c4 fa 95 65 07  d8 4b 31 4b fa a7 85 74  |>.....e..K1K...t|
+00000230  6c 1c a3 7c 7b c6 20 e0  1f 28 33 6d 61 93 d0 7d  |l..|{. ..(3ma..}|
+00000240  e7 c4 5c 27 c9 d9 ca f9  fe 21 6f 7f 05 34 37 54  |..\'.....!o..47T|
+00000250  30 59 68 e1 04 36 60 52  d7 fc 4f 8c 67 f6 42 88  |0Yh..6`R..O.g.B.|
+00000260  bc 41 5f 8e 2c 05 dd 6a  b0 49 6c d8 8e 9c 9e 06  |.A_.,..j.Il.....|
+00000270  35 f9 f1 33 f2 54 b0 3f  9e bd 4f c7 48 aa a3 9e  |5..3.T.?..O.H...|
+00000280  fe 69 79 16 e0 5a ca 48  72 fe 52 4a f1 6f f1 e0  |.iy..Z.Hr.RJ.o..|
+00000290  8c fe 16 15 ce c9 87 dc  9b 66 4d 3a bb 05 21 82  |.........fM:..!.|
+000002a0  21 65 cb 7b da 06 1a 0b  53 ee 60 e4 79 0f bc 5d  |!e.{....S.`.y..]|
+000002b0  b6 52 fd 3b 33 28 97 6c  67 d7 ab 3d b0 da bb ac  |.R.;3(.lg..=....|
+000002c0  0d d9 06 81 a3 6c 1f ad  b8 05 20 63 2b c7 cb 4b  |.....l.... c+..K|
+000002d0  e2 96 6e 3d f1 9c 0a 6a  c6 01 3e 3a d0 54 c8 09  |..n=...j..>:.T..|
+000002e0  9b 17 a0 cc d6 d0 82 d1  02 a8 eb 9d 91 7e 30 b9  |.............~0.|
+000002f0  3d 5e 6d 43 fc 50 f8 9f  80 67 7a e3 33 30 cd b7  |=^mC.P...gz.30..|
+00000300  00 b3 bc 17 50 82 6c 80  67 bd c4 12 11 b1 53 22  |....P.l.g.....S"|
+00000310  96 67 07 90 d4 54 5c f1  5d ca cd f8 b5 35 94 e0  |.g...T\.]....5..|
+00000320  21 e6 58 d7 b0 32 ca 24  90 11 30 f5 2b 1d ca 3d  |!.X..2.$..0.+..=|
+00000330  6a 6d 35 fa 17 03 03 00  99 ad ab 79 79 28 a0 a9  |jm5........yy(..|
+00000340  9a cd 6d 8d 8c 92 2e 83  3d d4 be c7 50 61 f5 49  |..m.....=...Pa.I|
+00000350  97 6c ab 92 d4 a7 1a 6f  fc 5b dd 6e 73 0d bd d2  |.l.....o.[.ns...|
+00000360  09 52 9f c9 de bb 8d 09  0a 4f e0 c5 9a 08 79 4c  |.R.......O....yL|
+00000370  fc 01 b3 94 45 f6 1d bd  8d 23 62 14 14 65 4c 2a  |....E....#b..eL*|
+00000380  d9 ad 8f 76 5a 5e 9d da  68 37 c7 b1 54 1e b4 bd  |...vZ^..h7..T...|
+00000390  d3 15 b8 89 94 87 8b 17  17 0f 4c dc db a8 3b 2f  |..........L...;/|
+000003a0  e5 e2 25 d6 ec f6 f4 bb  ab d0 c5 7f 2a cb c6 57  |..%.........*..W|
+000003b0  84 50 3a e7 62 8b 76 ae  6a 06 6b 85 1c 23 f1 d1  |.P:.b.v.j.k..#..|
+000003c0  10 e2 6f 57 8c 20 7d da  2d f8 bc c5 df 4e 7c 22  |..oW. }.-....N|"|
+000003d0  d8 36 17 03 03 00 35 62  fa d4 65 7f 9a 97 5b ec  |.6....5b..e...[.|
+000003e0  25 4a 3a 43 18 08 08 fb  7f 9d 3b 73 64 9e f3 7a  |%J:C......;sd..z|
+000003f0  28 f1 a0 0e 00 7a 51 74  0e 6b 90 c6 39 7a 09 98  |(....zQt.k..9z..|
+00000400  6e d8 63 cc 1f f0 8f bc  37 66 27 a0              |n.c.....7f'.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 f1 7c 55 b2 e9  |..........5.|U..|
-00000010  01 cd 57 d5 17 17 30 51  43 74 46 00 83 c7 d2 73  |..W...0QCtF....s|
-00000020  2b ff 57 45 5c 13 d9 9e  ec 56 c5 f1 d2 26 00 76  |+.WE\....V...&.v|
-00000030  75 5c f0 3c 80 39 74 4e  38 72 35 39 a3 29 4d ff  |u\.<.9tN8r59.)M.|
-00000040  17 03 03 00 17 43 aa f1  73 de 22 92 8c 54 2c 3f  |.....C..s."..T,?|
-00000050  c6 f2 f1 07 27 b2 f6 0e  54 79 4d 05 17 03 03 00  |....'...TyM.....|
-00000060  13 a5 64 ef ae 3f f0 52  08 71 9e 24 dc ea f1 50  |..d..?.R.q.$...P|
-00000070  b5 27 20 54                                       |.' T|
+00000000  14 03 03 00 01 01 17 03  03 00 35 ba 59 57 3e a3  |..........5.YW>.|
+00000010  cd 02 7f 7c c2 16 f5 6b  ec 42 66 aa a2 7a 3d 47  |...|...k.Bf..z=G|
+00000020  43 c9 02 4b a3 72 d0 4d  fa f8 32 28 1a 19 16 6a  |C..K.r.M..2(...j|
+00000030  7c 0e 4a 75 80 94 34 fe  30 7b d0 52 15 48 10 30  ||.Ju..4.0{.R.H.0|
+00000040  17 03 03 00 17 5d de 53  df 00 21 ca 6d 69 ff 45  |.....].S..!.mi.E|
+00000050  2e 53 57 db 3f 8d d8 6c  5a e1 f8 cc 17 03 03 00  |.SW.?..lZ.......|
+00000060  13 43 d9 94 95 41 af 1d  80 a7 f2 28 2a 44 50 8d  |.C...A.....(*DP.|
+00000070  41 8f 82 09                                       |A...|
index 7de7d279b2b6e7ae45f430e37ab3d3e7164b6ae6..4e3eb760e690669c07f6c9132b24769a9ae92e42 100644 (file)
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f2 01 00 00  ee 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 f4 01 00 00  f0 03 03 00 00 00 00 00  |................|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 00  00 00 00 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,84 @@
 00000050  cc a9 c0 2f c0 2b c0 30  c0 2c c0 27 c0 13 c0 23  |.../.+.0.,.'...#|
 00000060  c0 09 c0 14 c0 0a 00 9c  00 9d 00 3c 00 2f 00 35  |...........<./.5|
 00000070  c0 12 00 0a 00 05 c0 11  c0 07 13 01 13 03 13 02  |................|
-00000080  01 00 00 73 00 05 00 05  01 00 00 00 00 00 0a 00  |...s............|
-00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 18 00  |................|
-000000a0  16 08 04 08 05 08 06 04  01 04 03 05 01 05 03 06  |................|
-000000b0  01 06 03 02 01 02 03 ff  01 00 01 00 00 12 00 00  |................|
-000000c0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
-000000d0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
-000000e0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000000f0  90 99 5f 58 cb 3b 74                              |.._X.;t|
+00000080  01 00 00 75 00 05 00 05  01 00 00 00 00 00 0a 00  |...u............|
+00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
+000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
+000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000d0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
+000000e0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
+000000f0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 cd c7 29 34 e2  |....z...v....)4.|
-00000010  96 86 e5 32 80 01 ea b9  3f d1 c5 90 da 7d 6e b9  |...2....?....}n.|
-00000020  6f c2 f3 de 0f 16 7c c6  be 22 9f 20 00 00 00 00  |o.....|..". ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 5d 2e e6 ba 34  |....z...v..]...4|
+00000010  6c 42 bb 48 58 fe c5 f0  95 f9 34 11 04 b5 2a f4  |lB.HX.....4...*.|
+00000020  f1 16 41 db 14 a0 19 d8  43 7c 09 20 00 00 00 00  |..A.....C|. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 71  |..+.....3.$... q|
-00000060  a3 1e 19 38 17 d7 fb c4  d7 c0 c5 0b 1a 4f 43 b8  |...8.........OC.|
-00000070  36 73 5b ba ac 71 44 76  e5 18 a8 5f f0 e9 53 14  |6s[..qDv..._..S.|
-00000080  03 03 00 01 01 17 03 03  00 17 2b d0 f2 01 36 99  |..........+...6.|
-00000090  3c fe 38 af 22 1c 4f ec  1f 31 a2 48 31 a4 b9 83  |<.8.".O..1.H1...|
-000000a0  74 17 03 03 02 6d 87 69  ac 88 28 88 6e 62 c8 96  |t....m.i..(.nb..|
-000000b0  b9 32 1a 3d f6 a3 10 70  06 bd a6 3b d1 e4 a6 3a  |.2.=...p...;...:|
-000000c0  be e0 93 61 27 d4 bf 1f  b0 17 f0 19 b3 30 e1 5e  |...a'........0.^|
-000000d0  94 18 13 78 9b 9d d5 16  b2 c7 8a 21 54 c9 f0 31  |...x.......!T..1|
-000000e0  09 5b 6c 7f 22 79 9f 33  66 b7 e7 ea d4 11 63 5f  |.[l."y.3f.....c_|
-000000f0  05 21 e2 1a 66 96 ac 62  10 be 4b 51 73 df 29 9e  |.!..f..b..KQs.).|
-00000100  71 92 1a cb d2 d3 99 0c  a7 35 7d 12 b4 44 d7 96  |q........5}..D..|
-00000110  2b 29 9d 49 70 11 8c f8  5c 80 a4 98 56 21 66 2b  |+).Ip...\...V!f+|
-00000120  ac 72 1c 2e 86 e3 62 d2  e5 f1 7f 58 97 7b ac 85  |.r....b....X.{..|
-00000130  a8 c1 99 62 3b 8c 7f 47  95 09 e7 dc 7d 31 ed d2  |...b;..G....}1..|
-00000140  9b f8 71 fb 15 9c 80 1c  cc 28 dd 4d ef 95 89 92  |..q......(.M....|
-00000150  1f e8 c0 c3 78 b9 8f 92  88 e9 57 f6 2b 30 90 f1  |....x.....W.+0..|
-00000160  27 b8 d8 65 0e 12 6d 51  9c e8 f2 5d b0 58 90 88  |'..e..mQ...].X..|
-00000170  22 e3 fb 0e 2e 1f 6b 6b  a2 8e 52 2c a7 2a 32 03  |".....kk..R,.*2.|
-00000180  a4 e9 fc b7 e4 ec f5 73  37 fc bb d3 62 68 90 3d  |.......s7...bh.=|
-00000190  69 02 65 d5 35 6c 9b 89  68 c2 93 df 84 e3 f0 5f  |i.e.5l..h......_|
-000001a0  35 c7 05 d1 4d 60 93 b9  1d 5e 39 78 fd ed 85 f7  |5...M`...^9x....|
-000001b0  1b 82 f6 cc 0a 02 5e f6  e0 7a 78 55 3a 12 e3 b3  |......^..zxU:...|
-000001c0  45 ab 7e f0 12 2e 28 11  fd 73 7e 05 ef e1 c2 a0  |E.~...(..s~.....|
-000001d0  45 ac 2e 3c 0b 00 69 ad  01 78 c7 2b 15 4e 6b eb  |E..<..i..x.+.Nk.|
-000001e0  65 3d d8 c2 4b e6 9d 73  35 62 4f 58 d1 ec 7f 8d  |e=..K..s5bOX....|
-000001f0  6e 56 66 06 cf 90 56 09  70 53 bd ed 16 ff c1 14  |nVf...V.pS......|
-00000200  7f 1b 13 80 73 d2 7d f3  85 99 bd f2 f8 16 65 00  |....s.}.......e.|
-00000210  97 51 12 64 7a 34 20 b1  1a d9 fb 5c 38 e6 b7 ae  |.Q.dz4 ....\8...|
-00000220  99 34 6d 1a 87 30 09 96  13 04 f9 4d 51 b7 f5 76  |.4m..0.....MQ..v|
-00000230  30 ac 18 05 ba e4 0e 3d  28 6e 09 5e ec 52 18 d4  |0......=(n.^.R..|
-00000240  1e da d3 7e b4 16 ff 76  4e 31 10 42 5a 7e 75 ea  |...~...vN1.BZ~u.|
-00000250  86 82 4e ad 7a 11 1d a8  6b ab 5c 7d bd 7b 07 b8  |..N.z...k.\}.{..|
-00000260  aa bb 13 57 4a 24 d1 92  1d bb b9 7b 46 8b 7e 69  |...WJ$.....{F.~i|
-00000270  9c a5 ea a6 9d 20 42 b1  92 4f b6 0e 48 8a 29 be  |..... B..O..H.).|
-00000280  67 19 b8 5b 27 7f fd c0  7e b1 01 e0 19 42 bb 19  |g..['...~....B..|
-00000290  c4 91 b0 52 3e 0b 4c a6  2b 03 ff e3 e2 b9 d7 54  |...R>.L.+......T|
-000002a0  77 4c 04 83 c6 41 3b 8f  ee 8a 70 d8 16 e7 02 6f  |wL...A;...p....o|
-000002b0  13 9c a4 22 1d 1b cc 9e  6a 0e e8 96 94 54 df 2e  |..."....j....T..|
-000002c0  8a 60 53 e2 45 30 7b 8f  46 d2 ab 0e c1 6d 75 e2  |.`S.E0{.F....mu.|
-000002d0  cf 6c fe 9e 2d 31 af 9e  51 73 a6 39 02 ff 7b c2  |.l..-1..Qs.9..{.|
-000002e0  da 66 d6 27 87 9d 51 99  c9 7e 1b e7 43 8d 1e dc  |.f.'..Q..~..C...|
-000002f0  49 93 0e 9c 47 5c d6 97  19 ee 80 6d 4f 92 9d 25  |I...G\.....mO..%|
-00000300  ff ea bf ab 9a 64 a6 d4  70 80 5e 13 42 48 75 4e  |.....d..p.^.BHuN|
-00000310  8c c3 9b 17 03 03 00 99  7b 4a 09 b6 85 dc 5c 10  |........{J....\.|
-00000320  76 05 e8 11 e1 bc 63 ec  ec b8 19 14 f3 95 16 6b  |v.....c........k|
-00000330  2a a6 e1 ae b9 1c e0 5c  94 20 49 62 8c fd 76 7e  |*......\. Ib..v~|
-00000340  0e f9 9f ec 0d 01 47 4b  86 a8 b1 9f a2 bc 83 85  |......GK........|
-00000350  de e8 e0 2f c4 a4 f6 90  72 57 38 ad 2e aa 1e 4f  |.../....rW8....O|
-00000360  d4 8b e1 a2 b8 ba 80 99  ad 57 09 72 98 1c 5b 7b  |.........W.r..[{|
-00000370  a7 35 a2 c5 4a be 76 14  ee d4 63 a9 96 5e 33 7c  |.5..J.v...c..^3||
-00000380  0a e0 15 0d 14 19 f1 5a  5a e4 2c 9c 22 19 db e3  |.......ZZ.,."...|
-00000390  ea ee a1 c6 f8 1d 22 cc  5c 34 94 fa af 02 b0 26  |......".\4.....&|
-000003a0  8d 25 67 e6 f5 74 a9 38  38 37 57 ee 11 ac 0a 73  |.%g..t.887W....s|
-000003b0  01 17 03 03 00 35 bf ef  2c 2e 6c ae 90 ba d7 e0  |.....5..,.l.....|
-000003c0  99 b3 ea 42 db 8e ad 03  5b af 93 1e 35 3a fb f7  |...B....[...5:..|
-000003d0  87 bc 90 b6 98 ad e2 e6  1c 24 3b c1 20 8c 1a 79  |.........$;. ..y|
-000003e0  97 ad e3 8b 08 7b cc 7e  2b 98 fa                 |.....{.~+..|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 82  |..+.....3.$... .|
+00000060  de 1b d1 83 7a e1 46 cc  c7 36 15 62 48 07 6b f6  |....z.F..6.bH.k.|
+00000070  eb 0a 53 a3 34 cd 34 ee  cc 0c d0 c9 02 d5 38 14  |..S.4.4.......8.|
+00000080  03 03 00 01 01 17 03 03  00 17 3d 0c 61 12 1b 55  |..........=.a..U|
+00000090  6e f4 13 59 c8 4a e7 12  63 5d bf be 34 9f d7 2a  |n..Y.J..c]..4..*|
+000000a0  c2 17 03 03 02 6d 82 e8  43 93 e4 80 4d a7 d2 cf  |.....m..C...M...|
+000000b0  43 9d 71 8d cc 78 e8 e9  58 7e 28 53 57 6d 95 1e  |C.q..x..X~(SWm..|
+000000c0  fb 98 05 ec 66 47 d9 a1  6a b5 f4 28 09 4a 6c 4c  |....fG..j..(.JlL|
+000000d0  ee a0 1a 86 e7 29 c0 0e  d8 e0 ca 2d bb 50 e4 34  |.....).....-.P.4|
+000000e0  8d 66 be 54 b5 df 94 fc  69 0e a6 9a 76 8b 8f f5  |.f.T....i...v...|
+000000f0  a9 01 1a 1d 8d b0 ae a9  0c 10 58 13 f9 91 80 43  |..........X....C|
+00000100  69 f8 3f 03 14 8e 73 1a  ce 52 72 86 3d 60 8b 0f  |i.?...s..Rr.=`..|
+00000110  38 e7 4b 43 f0 b3 4b 12  3a a7 cd 4b ac ef 7d fb  |8.KC..K.:..K..}.|
+00000120  27 3a 38 36 ad a5 90 eb  57 80 47 99 bc c6 58 55  |':86....W.G...XU|
+00000130  15 6f 53 f7 83 ca 2b 89  ae be 23 9a 83 3c 6b b1  |.oS...+...#..<k.|
+00000140  10 67 a2 c4 65 e0 3a 25  05 4a 5b dc 10 96 93 b8  |.g..e.:%.J[.....|
+00000150  72 7b 1f 07 6d c7 48 c4  86 b5 a5 cd bf 6f d4 98  |r{..m.H......o..|
+00000160  bc 71 5b 39 36 67 9b 1a  88 a1 74 c4 7d 34 7c 1b  |.q[96g....t.}4|.|
+00000170  a7 31 c1 04 77 b7 cd 30  8e 69 6c 99 c4 9f 0b b8  |.1..w..0.il.....|
+00000180  e4 53 03 b9 86 12 61 b0  fe 0e 37 df 99 77 00 3f  |.S....a...7..w.?|
+00000190  d4 10 c9 73 eb a2 9a 00  d6 cd 6a 5e 67 ec 55 ca  |...s......j^g.U.|
+000001a0  26 89 2f 11 9d 30 8f bd  5a 68 55 20 f5 93 44 5e  |&./..0..ZhU ..D^|
+000001b0  1f f2 24 20 fa 80 94 c7  01 62 c2 95 d3 18 c6 2c  |..$ .....b.....,|
+000001c0  00 42 fa ee 32 75 27 5f  df 81 f2 14 83 30 cd 25  |.B..2u'_.....0.%|
+000001d0  1d 6c 3a c5 f5 3f 6e b7  6a f0 cf 02 f9 a3 8d da  |.l:..?n.j.......|
+000001e0  96 55 31 2c 3c ef 62 c0  19 ac 36 f3 89 44 a4 a4  |.U1,<.b...6..D..|
+000001f0  60 c3 99 b5 db 9f c7 4c  9d fb f1 77 98 dc 90 0e  |`......L...w....|
+00000200  8a e2 0e e2 6a 25 6e 84  2b d6 dc 73 57 7a 6e 1d  |....j%n.+..sWzn.|
+00000210  41 2e d0 de 45 ab 49 f0  e3 64 e4 6a 02 fa 64 6f  |A...E.I..d.j..do|
+00000220  09 22 05 b5 0c 12 b0 57  e2 61 5a 63 b1 4c a4 e5  |.".....W.aZc.L..|
+00000230  79 c4 42 17 36 f0 0c 43  04 a5 d7 7c 3f 59 17 38  |y.B.6..C...|?Y.8|
+00000240  f0 f1 2c 2d be 6c 4e 58  e5 45 c9 c2 d6 df 7b b3  |..,-.lNX.E....{.|
+00000250  08 50 db e6 a8 ae 73 f2  82 09 6e 58 07 d3 87 e4  |.P....s...nX....|
+00000260  c2 70 c6 8f 8f 13 74 09  b1 7d 1a 42 e1 d1 72 41  |.p....t..}.B..rA|
+00000270  bd 71 cc f4 6c 7f 70 a2  99 95 34 b7 2c 08 af 43  |.q..l.p...4.,..C|
+00000280  43 ec 61 66 51 73 e2 87  b3 f3 ef ee 20 f2 55 58  |C.afQs...... .UX|
+00000290  c7 1a 0c ad dd 7b 44 9f  f1 ff 5e 2b 18 63 e1 45  |.....{D...^+.c.E|
+000002a0  88 5d c1 ce cb dc 42 ec  10 03 d4 d7 ae 2f ed ce  |.]....B....../..|
+000002b0  49 01 e3 1e de b0 68 ce  25 e0 69 b1 33 37 3d 0f  |I.....h.%.i.37=.|
+000002c0  b6 96 7e cd 7e 91 fb 82  a2 b8 66 6b 9a 44 83 c7  |..~.~.....fk.D..|
+000002d0  56 86 87 a5 f2 b1 06 16  a3 43 e1 29 fe f7 26 c9  |V........C.)..&.|
+000002e0  39 ea a4 b0 62 7b d5 9e  8a 0f 89 07 f9 a0 fc 45  |9...b{.........E|
+000002f0  bf ce 70 1d 75 7f fa db  2a 5b 32 02 bb 69 cc 72  |..p.u...*[2..i.r|
+00000300  cf 24 3d 92 20 d9 2f ee  a5 9d 72 33 23 f5 99 f5  |.$=. ./...r3#...|
+00000310  b1 82 eb 17 03 03 00 99  01 f0 87 1b 28 83 73 0f  |............(.s.|
+00000320  67 c8 76 69 e7 e6 ae d4  5c fc e0 e7 1c 6b 85 de  |g.vi....\....k..|
+00000330  de a0 9e 6c 1a 7d 90 31  d8 63 92 a1 bc f3 47 54  |...l.}.1.c....GT|
+00000340  c4 00 b9 62 30 db 1d 5b  c9 d5 e5 58 67 5e ab 68  |...b0..[...Xg^.h|
+00000350  3a 41 65 11 8d 9b a2 8c  4f e7 b7 76 ca c6 ca 2e  |:Ae.....O..v....|
+00000360  2d 6b 7b d1 90 41 9f 0c  c6 a5 18 4d d2 99 49 0b  |-k{..A.....M..I.|
+00000370  24 ab c5 84 cd a1 79 0a  0f 48 f3 f6 a4 f3 44 f3  |$.....y..H....D.|
+00000380  42 cb eb 6d 7d 16 b8 42  43 37 78 d9 e3 47 ce ee  |B..m}..BC7x..G..|
+00000390  c9 4b 3d 4f 47 ab 77 15  45 59 dd 31 02 f9 f8 60  |.K=OG.w.EY.1...`|
+000003a0  41 c6 dc e2 e3 25 8f 43  dd 77 c4 ce ba b9 63 c7  |A....%.C.w....c.|
+000003b0  5e 17 03 03 00 35 2a d8  c8 91 25 bb 27 c2 fc cd  |^....5*...%.'...|
+000003c0  b3 d0 c2 57 70 39 fc 81  d7 11 01 6c 72 ca 58 19  |...Wp9.....lr.X.|
+000003d0  c1 5d 72 9e 72 dc 70 2a  3d 1f 35 1c 05 4f 51 26  |.]r.r.p*=.5..OQ&|
+000003e0  30 72 97 a5 7a 7a 0a 7b  9e 91 03                 |0r..zz.{...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 ce 50 b5 dc 27  |..........5.P..'|
-00000010  34 5b ea 1b 27 76 67 d1  9e 24 cf f9 51 4a 9a 6b  |4[..'vg..$..QJ.k|
-00000020  cd 57 12 b2 5a 52 03 be  e8 62 e2 29 64 1e 16 f1  |.W..ZR...b.)d...|
-00000030  61 af 70 a7 11 f1 41 ef  e3 44 da 0e 9b 90 05 ad  |a.p...A..D......|
-00000040  17 03 03 00 17 b4 9d 4e  de fb da 13 02 ad 51 40  |.......N......Q@|
-00000050  b0 55 1d 89 ec 09 2b 52  e5 51 34 1f 17 03 03 00  |.U....+R.Q4.....|
-00000060  13 52 89 42 ba d7 14 f0  53 b4 b1 5a a5 a3 37 55  |.R.B....S..Z..7U|
-00000070  bd f8 e9 e5                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 35 7d 5e 95 38 a2  |..........5}^.8.|
+00000010  d3 f4 04 59 57 2a 1a 86  ac 12 8e 17 88 fb 52 25  |...YW*........R%|
+00000020  1d 19 2c c5 ac 57 c9 bf  af 07 e7 c1 4d f3 dd f0  |..,..W......M...|
+00000030  13 ad a1 73 07 32 a4 c5  7c 9e ad 5a 88 59 57 4b  |...s.2..|..Z.YWK|
+00000040  17 03 03 00 17 e2 65 4f  bd 1f bb 00 a1 6b ae a4  |......eO.....k..|
+00000050  9d d3 d2 6e 7b 62 b5 09  19 d6 8f 1b 17 03 03 00  |...n{b..........|
+00000060  13 96 de 94 2b a7 bb c5  4b 7e 02 b2 27 07 4d 49  |....+...K~..'.MI|
+00000070  32 2b 83 48                                       |2+.H|
index ec9bf7243621b0285ea21ac8a52fbcb9cc6b74c6..0d9f63b00669eb1472f7818ea0750e8f0b4d17ec 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e3 01 00 00  df 03 03 2d 48 5c c5 05  |...........-H\..|
-00000010  19 52 14 d8 ed 53 5d 30  50 4d 3a ae d9 58 53 96  |.R...S]0PM:..XS.|
-00000020  0a ce fb 18 ed ef f1 57  fe 42 75 00 00 38 c0 2c  |.......W.Bu..8.,|
+00000000  16 03 01 00 e3 01 00 00  df 03 03 24 c0 b7 bd da  |...........$....|
+00000010  2a 23 bd 6f a0 8f 94 be  7c 14 56 ad fd a8 87 3f  |*#.o....|.V....?|
+00000020  c1 97 38 14 7a d4 30 28  11 c4 b5 00 00 38 c0 2c  |..8.z.0(.....8.,|
 00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
 00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
 00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
 000002a0  d3 3b e9 fa e7 16 03 03  00 ac 0c 00 00 a8 03 00  |.;..............|
 000002b0  1d 20 2f e5 7d a3 47 cd  62 43 15 28 da ac 5f bb  |. /.}.G.bC.(.._.|
 000002c0  29 07 30 ff f6 84 af c4  cf c2 ed 90 99 5f 58 cb  |).0.........._X.|
-000002d0  3b 74 08 04 00 80 0a 5e  25 64 2c 25 6d 9d 7d da  |;t.....^%d,%m.}.|
-000002e0  18 0a 9b ff c7 6a 0b 89  ed f8 96 00 70 6f ab 35  |.....j......po.5|
-000002f0  d3 3b 56 cc a1 78 c8 60  4e 50 12 1a 59 02 d9 4c  |.;V..x.`NP..Y..L|
-00000300  07 21 03 65 62 9c a4 06  2d ce 34 68 c8 01 57 f1  |.!.eb...-.4h..W.|
-00000310  b5 33 a0 00 72 9f e8 46  87 7c 18 65 e2 2a 18 5e  |.3..r..F.|.e.*.^|
-00000320  d3 9d 60 bc cf b8 38 10  2d 21 c0 9e 2c 5d 89 4c  |..`...8.-!..,].L|
-00000330  93 27 02 6b 5a 04 02 60  b0 f0 3f 7c 54 aa 9a f1  |.'.kZ..`..?|T...|
-00000340  30 10 50 31 36 0e 87 0c  86 29 53 92 3b 91 24 72  |0.P16....)S.;.$r|
-00000350  79 6d 5c 09 15 19 16 03  03 00 04 0e 00 00 00     |ym\............|
+000002d0  3b 74 04 01 00 80 8a b8  11 46 fc 88 8d f3 7d 22  |;t.......F....}"|
+000002e0  e0 1e d6 ac 45 79 e7 4d  fa 46 df 6d a2 b2 67 38  |....Ey.M.F.m..g8|
+000002f0  73 73 d9 20 9e 7c a1 a0  01 0c e7 e3 08 b2 f9 db  |ss. .|..........|
+00000300  97 82 c9 1e 27 33 f6 69  5b 8d 3c ca a8 a3 34 d5  |....'3.i[.<...4.|
+00000310  70 ac f6 62 6e 80 5d 5b  6e 1e bd 2d 27 d2 6d c3  |p..bn.][n..-'.m.|
+00000320  ca 08 8c fc ea 94 d2 99  49 d8 5f 30 6a a2 d9 c4  |........I._0j...|
+00000330  f2 17 d9 50 9e 82 9c 95  93 6d 7c b6 18 16 84 92  |...P.....m|.....|
+00000340  31 29 bd a0 df ed 09 ab  bf 32 ca c5 26 67 bb 28  |1).......2..&g.(|
+00000350  78 1b c6 5b 7a 21 16 03  03 00 04 0e 00 00 00     |x..[z!.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 2e 56 a8 73 0e 9c  |....%...! .V.s..|
-00000010  90 0d aa 07 77 a8 09 17  61 e2 11 5c 3a f6 33 6d  |....w...a..\:.3m|
-00000020  be 6b 08 77 8a 0d eb 68  2f 21 14 03 03 00 01 01  |.k.w...h/!......|
-00000030  16 03 03 00 28 a7 07 30  a2 67 4f 2d 2f 5f 52 7c  |....(..0.gO-/_R||
-00000040  11 81 d0 ea 37 51 73 8a  fc 35 fc 58 b2 e6 6b b7  |....7Qs..5.X..k.|
-00000050  66 a9 f0 cf 16 e7 31 b6  83 58 d3 e4 58           |f.....1..X..X|
+00000000  16 03 03 00 25 10 00 00  21 20 69 44 46 d1 ad ea  |....%...! iDF...|
+00000010  ac b6 dc 35 6a b1 06 77  57 e8 94 58 49 15 4b 35  |...5j..wW..XI.K5|
+00000020  7c c9 40 a0 75 37 f0 77  79 0c 14 03 03 00 01 01  ||.@.u7.wy.......|
+00000030  16 03 03 00 28 2d 84 08  73 fc f7 b7 8d 07 63 4a  |....(-..s.....cJ|
+00000040  c4 42 37 b6 cd e1 87 9f  4f 3b 4e 8c a5 3f 95 67  |.B7.....O;N..?.g|
+00000050  74 02 9a f1 d1 39 0c 7b  7b 8e 82 79 28           |t....9.{{..y(|
 >>> Flow 4 (server to client)
 00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
 00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f ec 80 83 61 8a 3f 4b  ad 3f 5f 7d 74 f9 cc 19  |o...a.?K.?_}t...|
-00000040  2b 27 d5 b0 1b 12 9a 8c  82 0f e5 b5 99 f8 0d 10  |+'..............|
-00000050  88 4a b2 65 62 bc a0 c2  2d 97 79 ad 69 58 08 fa  |.J.eb...-.y.iX..|
-00000060  6e 3b a7 b5 cb 33 94 de  ff b6 49 87 3d d4 c7 0d  |n;...3....I.=...|
-00000070  65 a6 a7 66 f9 40 27 b1  e2 28 9a b2 db 82 ab 0f  |e..f.@'..(......|
-00000080  d8 f6 10 ab f7 d3 d9 14  03 03 00 01 01 16 03 03  |................|
-00000090  00 28 00 00 00 00 00 00  00 00 09 75 fa e0 ab f5  |.(.........u....|
-000000a0  d4 57 a8 a0 0d 15 d1 25  1f b4 f3 2e 39 a3 91 75  |.W.....%....9..u|
-000000b0  5c 37 5e 26 61 6b 95 2f  41 8a 17 03 03 00 25 00  |\7^&ak./A.....%.|
-000000c0  00 00 00 00 00 00 01 64  6b d0 f8 a2 9c 0f 95 11  |.......dk.......|
-000000d0  e6 05 f2 3c 24 c0 d2 95  7f f1 cc 65 ef 5c 6d 80  |...<$......e.\m.|
-000000e0  1d c9 67 f5 15 03 03 00  1a 00 00 00 00 00 00 00  |..g.............|
-000000f0  02 f2 91 0d 39 58 1d 72  61 6e 60 36 96 03 1e 63  |....9X.ran`6...c|
-00000100  e4 d1 4c                                          |..L|
+00000030  6f ec 80 83 61 f2 44 31  c6 93 15 b9 27 68 bc ab  |o...a.D1....'h..|
+00000040  b1 7f 48 8d 99 54 9c 9c  2e 36 11 6f 38 e7 3f 79  |..H..T...6.o8.?y|
+00000050  f9 f1 a5 5d 36 9a 1a 4c  7c f2 ad 84 f4 13 a7 be  |...]6..L|.......|
+00000060  e4 79 39 c6 31 33 94 81  cf d3 85 2e 29 02 44 a8  |.y9.13......).D.|
+00000070  61 4d 70 c3 dd ed b4 a2  f2 4b 44 c0 d5 af 19 8b  |aMp......KD.....|
+00000080  3f e5 fa fa ba dd 2d 14  03 03 00 01 01 16 03 03  |?.....-.........|
+00000090  00 28 00 00 00 00 00 00  00 00 f0 16 42 20 de 60  |.(..........B .`|
+000000a0  a4 a7 12 85 e5 cb b6 53  eb 76 7f 89 62 76 e8 46  |.......S.v..bv.F|
+000000b0  69 a6 bd 1e f5 5e 13 18  1d d3 17 03 03 00 25 00  |i....^........%.|
+000000c0  00 00 00 00 00 00 01 47  51 00 3f dd 64 0c 6f 43  |.......GQ.?.d.oC|
+000000d0  d1 cb 25 22 45 af ee 64  5f a7 6e cf 6c 7e 26 b3  |..%"E..d_.n.l~&.|
+000000e0  7e cd f0 71 15 03 03 00  1a 00 00 00 00 00 00 00  |~..q............|
+000000f0  02 01 f4 16 18 8e 29 27  34 58 c4 9a f8 a7 58 3a  |......)'4X....X:|
+00000100  2e 4a 32                                          |.J2|
index 90f146b5badf07c32c14ebae2f4c575b26ee0bd3..ced69a2acf8ca7ca1ddb5cf3a7c95fe63f299334 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e3 01 00 00  df 03 03 fc a5 8d 79 5f  |..............y_|
-00000010  01 7f 77 df 86 0f 60 10  0a 88 ad 68 7f 7b 3b 63  |..w...`....h.{;c|
-00000020  46 a9 7e c6 4e 7c 47 b5  00 2f a7 00 00 38 c0 2c  |F.~.N|G../...8.,|
+00000000  16 03 01 00 e3 01 00 00  df 03 03 c8 61 61 3d 4e  |............aa=N|
+00000010  9a 5e 9e 0c 59 3f 23 e0  d8 ac d9 28 27 41 6a a0  |.^..Y?#....('Aj.|
+00000020  fb 7e d3 5f 20 aa 40 6c  df cb 07 00 00 38 c0 2c  |.~._ .@l.....8.,|
 00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
 00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
 00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
 00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 ac 0c 00 00  |.\!.;...........|
 000002a0  a8 03 00 1d 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |.... /.}.G.bC.(.|
 000002b0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-000002c0  5f 58 cb 3b 74 08 04 00  80 62 db d2 f4 17 c6 f2  |_X.;t....b......|
-000002d0  73 d1 63 50 1f 26 96 af  9d bd cb 11 9a 95 c4 dd  |s.cP.&..........|
-000002e0  49 c3 9a 06 a3 8d 2a 1e  b9 74 76 22 36 2e fd 08  |I.....*..tv"6...|
-000002f0  a6 d1 9d 2e 20 75 e6 50  59 49 db 3f d9 b1 0e 81  |.... u.PYI.?....|
-00000300  fb 16 25 67 0d 8b 1c af  35 95 59 d4 56 b2 9f 08  |..%g....5.Y.V...|
-00000310  fd 85 68 46 30 59 2b 66  9e 86 b4 35 4c 4a 9f 6f  |..hF0Y+f...5LJ.o|
-00000320  8f 2b 8d 9f 19 c2 9a 4e  91 6e fe 56 cc 9b 39 e7  |.+.....N.n.V..9.|
-00000330  8d e2 5e 07 55 16 76 e0  7f 8b aa 0e 36 94 9f 78  |..^.U.v.....6..x|
-00000340  bd 06 a2 65 a3 f5 83 04  97 16 03 03 00 04 0e 00  |...e............|
+000002c0  5f 58 cb 3b 74 04 01 00  80 a6 d5 2b cf 48 32 3e  |_X.;t......+.H2>|
+000002d0  09 74 c1 e4 2a 69 49 d7  bc ce 5a b7 55 e5 e1 f4  |.t..*iI...Z.U...|
+000002e0  cc 3f 64 90 8a 58 e6 86  58 8b d7 94 60 d4 4e a9  |.?d..X..X...`.N.|
+000002f0  e4 e1 45 f1 7b 14 79 d0  9f 5c e3 17 79 61 f3 7a  |..E.{.y..\..ya.z|
+00000300  0e e6 cc 7c ff d8 61 29  51 eb 36 f6 f1 57 2e c0  |...|..a)Q.6..W..|
+00000310  43 de 54 fd 92 c7 d7 7a  54 77 f3 3f cf 53 b1 1f  |C.T....zTw.?.S..|
+00000320  57 53 7c 6d a3 74 b5 de  ae 0b 22 1f 2c 3e d0 41  |WS|m.t....".,>.A|
+00000330  04 7f df d8 d8 44 8d 8e  97 27 71 bc ff 6c 7f b6  |.....D...'q..l..|
+00000340  bd 05 17 2c 1f 84 c6 f1  64 16 03 03 00 04 0e 00  |...,....d.......|
 00000350  00 00                                             |..|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 56 69 9c 58 80 3e  |....%...! Vi.X.>|
-00000010  72 ee ee b1 05 fd a0 a7  8d 78 9c 5a 7d e0 21 63  |r........x.Z}.!c|
-00000020  d4 19 3c e2 b1 72 92 03  ed 6a 14 03 03 00 01 01  |..<..r...j......|
-00000030  16 03 03 00 28 6b c0 b3  6e 77 df ef 99 2d 7a 93  |....(k..nw...-z.|
-00000040  d5 9d 7f 1e 8c 36 eb 7c  bb 32 f9 a1 b0 65 b3 85  |.....6.|.2...e..|
-00000050  fb 33 64 9f 73 10 41 5a  01 6f d1 6b 73           |.3d.s.AZ.o.ks|
+00000000  16 03 03 00 25 10 00 00  21 20 c8 8e d1 4e a9 96  |....%...! ...N..|
+00000010  d4 73 45 b8 11 6e db db  00 f8 c0 c3 0e 96 62 c3  |.sE..n........b.|
+00000020  7c 04 3b 4a 40 d6 f6 81  e9 0d 14 03 03 00 01 01  ||.;J@...........|
+00000030  16 03 03 00 28 69 f9 fd  75 0d 63 bd ff 62 27 7b  |....(i..u.c..b'{|
+00000040  b2 28 b6 dc 55 c4 4b 10  f5 34 64 0d 85 a4 58 10  |.(..U.K..4d...X.|
+00000050  ee d6 93 77 00 da 6e ab  5e 9f f4 62 41           |...w..n.^..bA|
 >>> Flow 4 (server to client)
 00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
 00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f ec 80 83 61 59 7e 5a  0d 70 cc 83 b5 c8 ed d4  |o...aY~Z.p......|
-00000040  79 ab 28 49 65 f8 52 5f  78 5a 83 1a d4 b6 76 fa  |y.(Ie.R_xZ....v.|
-00000050  b7 e3 ef 12 48 1b 73 42  18 ee 78 5a 4e 05 70 66  |....H.sB..xZN.pf|
-00000060  1a 51 7b 20 e0 33 94 93  4f 86 e2 54 48 67 df 11  |.Q{ .3..O..THg..|
-00000070  ca f2 6d 73 d1 06 3b 88  ef af 91 1c f0 fd 64 4f  |..ms..;.......dO|
-00000080  c8 d7 45 cb cc 90 14 14  03 03 00 01 01 16 03 03  |..E.............|
-00000090  00 28 00 00 00 00 00 00  00 00 58 a6 55 c9 de bc  |.(........X.U...|
-000000a0  04 23 e7 85 cf 8c 44 d1  da ad c2 73 45 3e 42 f0  |.#....D....sE>B.|
-000000b0  05 58 7e 7b 35 24 1c 86  93 1e 17 03 03 00 25 00  |.X~{5$........%.|
-000000c0  00 00 00 00 00 00 01 c8  90 76 8e 60 ca b3 75 47  |.........v.`..uG|
-000000d0  78 f2 5d a8 62 82 10 0f  3c b5 b6 51 d2 0b 40 40  |x.].b...<..Q..@@|
-000000e0  66 b4 82 11 15 03 03 00  1a 00 00 00 00 00 00 00  |f...............|
-000000f0  02 f4 16 23 56 26 87 e1  22 9f d3 30 e9 fa 99 a5  |...#V&.."..0....|
-00000100  f0 5b 2c                                          |.[,|
+00000030  6f ec 80 83 61 8d 11 1d  31 eb f3 00 20 b3 0f 72  |o...a...1... ..r|
+00000040  a0 7d 10 58 c8 5f da e2  cb 82 74 4d 99 0d bb 75  |.}.X._....tM...u|
+00000050  f3 cb 1a 19 11 ba 70 90  82 9e ab 73 be a9 96 58  |......p....s...X|
+00000060  96 b7 98 07 ba 33 94 81  e5 8e d1 39 08 10 01 df  |.....3.....9....|
+00000070  ba dd f7 b1 0c ce 71 96  f6 d2 8a 50 43 9a 56 b9  |......q....PC.V.|
+00000080  2c 29 d7 05 5b 0d ea 14  03 03 00 01 01 16 03 03  |,)..[...........|
+00000090  00 28 00 00 00 00 00 00  00 00 94 0f b0 0f 1a 43  |.(.............C|
+000000a0  e1 77 b5 36 55 21 8a d5  7e ae 37 eb c5 7b dc aa  |.w.6U!..~.7..{..|
+000000b0  28 1b 00 2f 31 e2 5e ca  54 89 17 03 03 00 25 00  |(../1.^.T.....%.|
+000000c0  00 00 00 00 00 00 01 eb  0e 33 bd 20 4f 18 db 26  |.........3. O..&|
+000000d0  b3 48 21 a6 87 e2 a4 1f  fe 84 ae 89 fe cf 41 20  |.H!...........A |
+000000e0  f9 d4 41 67 15 03 03 00  1a 00 00 00 00 00 00 00  |..Ag............|
+000000f0  02 f3 51 22 2e 4e 9e 87  4a 06 06 2f f6 88 0c cf  |..Q".N..J../....|
+00000100  6f 0f 9b                                          |o..|
index cbf7564050feb008f1a20f78502bb6cb97e040bb..ce790fc16f1fbf1a8748dc410546ad4fd3988cc4 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 cb 01 00 00  c7 03 03 7c ce 63 72 4d  |...........|.crM|
-00000010  0b d9 aa 2f b4 22 f4 e3  88 50 10 11 1a d9 ce 5d  |.../."...P.....]|
-00000020  db 14 d4 68 61 48 c1 2d  0d ad dd 00 00 38 c0 2c  |...haH.-.....8.,|
+00000000  16 03 01 00 cb 01 00 00  c7 03 03 44 af b1 f3 8d  |...........D....|
+00000010  81 78 a9 28 a4 31 99 bb  66 17 63 ed 70 88 b7 bb  |.x.(.1..f.c.p...|
+00000020  da ef 4d 1d a2 a6 9e 18  96 97 ec 00 00 38 c0 2c  |..M..........8.,|
 00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
 00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
 00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
 00000210  0e bd 3f a3 8c 25 c1 33  13 83 0d 94 06 bb d4 37  |..?..%.3.......7|
 00000220  7a f6 ec 7a c9 86 2e dd  d7 11 69 7f 85 7c 56 de  |z..z......i..|V.|
 00000230  fb 31 78 2b e4 c7 78 0d  ae cb be 9e 4e 36 24 31  |.1x+..x.....N6$1|
-00000240  7b 6a 0f 39 95 12 07 8f  2a 16 03 03 00 b7 0c 00  |{j.9....*.......|
-00000250  00 b3 03 00 1d 20 2f e5  7d a3 47 cd 62 43 15 28  |..... /.}.G.bC.(|
+00000240  7b 6a 0f 39 95 12 07 8f  2a 16 03 03 00 b6 0c 00  |{j.9....*.......|
+00000250  00 b2 03 00 1d 20 2f e5  7d a3 47 cd 62 43 15 28  |..... /.}.G.bC.(|
 00000260  da ac 5f bb 29 07 30 ff  f6 84 af c4 cf c2 ed 90  |.._.).0.........|
-00000270  99 5f 58 cb 3b 74 04 03  00 8b 30 81 88 02 42 01  |._X.;t....0...B.|
-00000280  f1 77 f4 3f e9 ed b7 55  54 25 08 68 ab b9 42 7c  |.w.?...UT%.h..B||
-00000290  64 71 dc ce c0 13 23 20  f3 cd b7 68 09 23 6d c9  |dq....# ...h.#m.|
-000002a0  c5 1f f3 3a 46 f1 e3 2b  b4 92 6a 1c bd c8 60 7c  |...:F..+..j...`||
-000002b0  da 63 0e c7 4f 4f c4 5e  aa 30 b4 b1 3a d4 11 09  |.c..OO.^.0..:...|
-000002c0  05 02 42 01 dd dc 50 07  2f 51 6c 75 7f 3f fd a2  |..B...P./Qlu.?..|
-000002d0  68 62 1d 7a 49 78 4e 57  1b bc 3a 4d 02 84 d5 f6  |hb.zIxNW..:M....|
-000002e0  2a 37 28 4e c0 30 2b a5  22 cc 28 d8 e0 66 2b 4d  |*7(N.0+.".(..f+M|
-000002f0  2a cd d8 01 3d 76 55 72  56 90 dc d0 99 85 ee 45  |*...=vUrV......E|
-00000300  01 03 91 88 a5 16 03 03  00 04 0e 00 00 00        |..............|
+00000270  99 5f 58 cb 3b 74 04 03  00 8a 30 81 87 02 42 01  |._X.;t....0...B.|
+00000280  96 02 ab 3d 94 2b dc 27  07 6b 1b 59 21 f2 88 3b  |...=.+.'.k.Y!..;|
+00000290  de 7a ce 4e d6 a5 47 30  0d 79 ae a9 e0 cf 9c e7  |.z.N..G0.y......|
+000002a0  0b 14 eb 44 bc a3 b9 5b  cf 01 f0 2f be 63 3e 9f  |...D...[.../.c>.|
+000002b0  63 32 4e ce 4d 4c 70 86  dd 16 09 70 f7 3e 3b f6  |c2N.MLp....p.>;.|
+000002c0  34 02 41 0a 0f a9 75 dd  a8 21 40 8f 05 82 2f e0  |4.A...u..!@.../.|
+000002d0  09 37 08 0a b6 a4 8a 1c  fd 3e 4d 1b e3 19 e1 4d  |.7.......>M....M|
+000002e0  15 90 65 00 2f e0 15 bf  2b 23 b6 2b 44 7a 3f 1a  |..e./...+#.+Dz?.|
+000002f0  4c 82 3a 95 b9 ff 37 0a  1e f2 63 e3 b1 71 81 36  |L.:...7...c..q.6|
+00000300  6d 23 3e 53 16 03 03 00  04 0e 00 00 00           |m#>S.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 5b 72 c3 fc 0c a5  |....%...! [r....|
-00000010  a3 b1 e6 db 1d e7 f2 4a  dd c8 36 97 25 f9 4c 74  |.......J..6.%.Lt|
-00000020  68 04 e5 02 17 ca 67 e2  a6 59 14 03 03 00 01 01  |h.....g..Y......|
-00000030  16 03 03 00 40 f0 40 1c  1a a9 d8 e7 88 c4 9d 6d  |....@.@........m|
-00000040  ad bd e7 5c c4 63 1a 06  5a e9 f5 39 6d 15 ac 41  |...\.c..Z..9m..A|
-00000050  2f ed b9 3b f8 68 13 46  20 be 9b f9 be b6 8a cc  |/..;.h.F .......|
-00000060  f4 87 31 53 b3 ef 79 4e  ce 73 ea a6 45 de 21 3e  |..1S..yN.s..E.!>|
-00000070  99 87 6a cb 4d                                    |..j.M|
+00000000  16 03 03 00 25 10 00 00  21 20 e8 92 71 c8 12 80  |....%...! ..q...|
+00000010  88 d0 7f 00 71 76 83 dc  e6 e3 4c b6 e2 8a d2 0d  |....qv....L.....|
+00000020  61 7e 36 d9 a7 1d 6c 92  75 46 14 03 03 00 01 01  |a~6...l.uF......|
+00000030  16 03 03 00 40 86 48 1a  6f 89 29 b3 8b c1 b6 ad  |....@.H.o.).....|
+00000040  b5 6f af eb 32 44 e9 8f  c2 43 58 d1 71 ad 1f 13  |.o..2D...CX.q...|
+00000050  2b e3 5c bc d5 07 8a 29  9d 30 40 cd 73 2d 0a 80  |+.\....).0@.s-..|
+00000060  49 82 d5 2a 79 eb a5 3c  2e 69 ee 1a 3a d8 1a 69  |I..*y..<.i..:..i|
+00000070  63 a6 30 8e 3f                                    |c.0.?|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 10 1f 05 23 89  |..............#.|
-00000020  1d 50 5f cb 33 09 57 70  32 fc 01 76 f8 e9 dc ec  |.P_.3.Wp2..v....|
-00000030  13 b6 70 95 24 55 52 21  ed e6 5e 59 45 9f c9 c0  |..p.$UR!..^YE...|
-00000040  74 6d d1 2f e6 4d 7c 6e  1e 41 4c 17 03 03 00 40  |tm./.M|n.AL....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 33 ab 9b d6 4a  |...........3...J|
+00000020  bb e7 06 b0 d4 7e 1a 7f  78 cb d1 7a 44 26 a7 e6  |.....~..x..zD&..|
+00000030  93 42 ae ec d3 44 0c dd  b0 74 1b d8 99 75 a2 69  |.B...D...t...u.i|
+00000040  98 d4 ed 2c b8 a0 26 69  80 1c 7f 17 03 03 00 40  |...,..&i.......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  e8 04 12 d8 cd fc 76 19  e0 27 c1 f2 12 66 d8 86  |......v..'...f..|
-00000070  a8 25 b6 3f 13 aa 5c c5  43 c5 83 a1 c0 4a 7c c6  |.%.?..\.C....J|.|
-00000080  7b d4 63 86 b8 87 d1 36  af 99 f3 6f 9d 7e 86 37  |{.c....6...o.~.7|
+00000060  a5 0b 57 10 11 ca 9e fb  f4 8b 24 86 c7 58 b9 4c  |..W.......$..X.L|
+00000070  9a 1d 6a 60 2b 7c b1 21  7e 00 f2 e5 00 6f ab 04  |..j`+|.!~....o..|
+00000080  2f 14 97 ae 70 05 0d 18  31 57 51 4a 0c c7 10 84  |/...p...1WQJ....|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 f0 fe 4c  32 8b c2 63 78 6c ba de  |.......L2..cxl..|
-000000b0  b3 55 0f e4 32 38 53 5e  2b 32 5c b9 23 4a 84 b7  |.U..28S^+2\.#J..|
-000000c0  6f 2f 86 54 11                                    |o/.T.|
+000000a0  00 00 00 00 00 d2 56 41  e1 58 30 76 2e 6e 6f 13  |......VA.X0v.no.|
+000000b0  3b 72 5d bf c4 5c ef 63  2e 0a f0 6a 3a 98 ec 97  |;r]..\.c...j:...|
+000000c0  07 b3 08 94 0d                                    |.....|
index db7199d9a9ea152a92b7da4145122e09f77d2d8f..8959740c3bc1c13943ecc48e30b87e40c9c2fdc4 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 cb 01 00 00  c7 03 03 39 27 e9 a6 45  |...........9'..E|
-00000010  cf a6 18 8c f0 d1 fb 71  81 b6 bf 16 d7 75 af f2  |.......q.....u..|
-00000020  1e 4f 4c 72 2a ce 66 52  a6 87 32 00 00 38 c0 2c  |.OLr*.fR..2..8.,|
+00000000  16 03 01 00 cb 01 00 00  c7 03 03 a6 9c 71 27 48  |.............q'H|
+00000010  24 f6 58 48 c8 2c 32 88  c9 01 eb f0 87 14 ba 7f  |$.XH.,2.........|
+00000020  f0 53 2d fd a1 b2 0a 72  e4 48 8e 00 00 38 c0 2c  |.S-....r.H...8.,|
 00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
 00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
 00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
 00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
 000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
 000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 08 04 00 80 41 cd 5d  a0 ba 92 1f 26 47 6d 72  |t....A.]....&Gmr|
-000002d0  33 44 47 a4 80 66 d8 1c  17 93 1e 25 8e c3 8e 95  |3DG..f.....%....|
-000002e0  9c ae b6 99 7e f6 80 3f  b1 73 cc c3 db 7a 4b 40  |....~..?.s...zK@|
-000002f0  a1 0b bc ff 0e 4b c1 67  11 b2 ca 33 06 41 f9 ac  |.....K.g...3.A..|
-00000300  56 dc f6 26 1b a3 04 2a  28 f9 47 0f 0b 56 05 73  |V..&...*(.G..V.s|
-00000310  93 cb 12 45 4f 6b 93 5d  0f 4c ca d3 f5 64 e2 4a  |...EOk.].L...d.J|
-00000320  eb 36 bb 87 3f 71 9b 36  08 99 79 48 fc a6 02 d6  |.6..?q.6..yH....|
-00000330  38 88 09 68 cf 71 e8 d4  51 f8 b1 77 70 42 8b 18  |8..h.q..Q..wpB..|
-00000340  ab cd e1 52 d9 16 03 03  00 04 0e 00 00 00        |...R..........|
+000002c0  74 04 01 00 80 10 af cc  7e b1 33 b1 87 08 e9 d5  |t.......~.3.....|
+000002d0  b0 fc 70 a6 b6 f9 20 92  60 b2 01 90 e3 e2 0b 71  |..p... .`......q|
+000002e0  4c b9 91 4e c7 28 60 cb  b5 b7 d1 91 1f 01 f3 93  |L..N.(`.........|
+000002f0  56 5b 14 91 bb e4 95 18  f5 0c 23 47 e6 4e d0 9e  |V[........#G.N..|
+00000300  2f 1a 4a d1 f5 08 71 c0  08 70 75 78 c1 c7 89 e4  |/.J...q..pux....|
+00000310  b2 3c b9 49 c8 95 c7 ba  5b b0 04 20 18 b1 5a 3e  |.<.I....[.. ..Z>|
+00000320  2b 9f 7b 2b 9c f8 34 69  4b c2 a8 2f d1 73 ec d1  |+.{+..4iK../.s..|
+00000330  c9 22 19 6b bc aa e4 d3  89 73 5a 88 27 75 4a b6  |.".k.....sZ.'uJ.|
+00000340  c3 6d 32 b0 a2 16 03 03  00 04 0e 00 00 00        |.m2...........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 b5 a5 bc 9f 09 79  |....%...! .....y|
-00000010  25 1a 7b af 52 0f 8a c2  16 a8 20 8d 0c 11 26 11  |%.{.R..... ...&.|
-00000020  32 79 35 b9 2f ee 63 ce  b7 49 14 03 03 00 01 01  |2y5./.c..I......|
-00000030  16 03 03 00 40 d8 eb b7  d7 b4 a6 62 a1 8d c6 a5  |....@......b....|
-00000040  5f 15 8e 1f de d9 98 90  3b d8 dd b1 13 7e 49 9b  |_.......;....~I.|
-00000050  d4 82 15 b9 a9 31 ac ae  eb 77 21 dc 9f e0 8e 5b  |.....1...w!....[|
-00000060  d8 ea 09 fc a2 35 64 af  8d 1a fb a3 f1 97 0e 09  |.....5d.........|
-00000070  b4 5b c9 e9 19                                    |.[...|
+00000000  16 03 03 00 25 10 00 00  21 20 f3 07 eb 86 c5 e2  |....%...! ......|
+00000010  28 7c be 7e 34 8d c5 74  19 0b b3 cc ce ce 90 3f  |(|.~4..t.......?|
+00000020  ac 06 c8 9f 79 3d 42 08  e2 01 14 03 03 00 01 01  |....y=B.........|
+00000030  16 03 03 00 40 9b 6d a1  1e ca fb 27 67 ca 7b 57  |....@.m....'g.{W|
+00000040  60 f4 60 95 b4 56 fd 97  cb 58 c5 cb bc 04 87 1d  |`.`..V...X......|
+00000050  74 a5 98 ec 3c 6f 25 5a  ef c5 af 21 4b 2e 5c 97  |t...<o%Z...!K.\.|
+00000060  52 35 eb c8 10 a7 3e 00  94 f5 46 cc 8e 19 fe f7  |R5....>...F.....|
+00000070  08 62 88 25 1f                                    |.b.%.|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 3b 2a 79 f1 0d  |...........;*y..|
-00000020  65 b8 4a 2a aa a5 87 60  69 8f 8f 87 4b 21 24 9a  |e.J*...`i...K!$.|
-00000030  6e 07 f0 a4 be ce 3d 67  29 85 53 98 fb cf a1 ee  |n.....=g).S.....|
-00000040  b0 e0 52 61 c1 16 e5 09  b9 0b 9c 17 03 03 00 40  |..Ra...........@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 8e a1 9a 44 d4  |..............D.|
+00000020  98 c6 5f 46 2f d9 e5 ac  78 b5 91 3f 15 89 6f fb  |.._F/...x..?..o.|
+00000030  39 79 65 0b c7 09 c7 fc  eb 40 6d 8e 6d b7 8b 94  |9ye......@m.m...|
+00000040  6f 30 5a a6 4c 9d 2a 13  ed f6 f4 17 03 03 00 40  |o0Z.L.*........@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  fe d7 63 a8 10 70 b8 2c  0c 95 da 92 84 2b d3 63  |..c..p.,.....+.c|
-00000070  03 d8 19 94 68 d8 d2 da  f7 e2 83 5b 24 78 87 0f  |....h......[$x..|
-00000080  ca ce 14 3a 8a d4 da b2  90 eb 6f 0e de 14 30 96  |...:......o...0.|
+00000060  5b 96 f1 fa c4 5b a3 22  74 ef 8c 34 52 50 c6 86  |[....[."t..4RP..|
+00000070  32 19 40 b8 80 54 d9 c2  6a 43 a2 c2 fe 07 dd 37  |2.@..T..jC.....7|
+00000080  89 62 bd 68 6a 1e e7 d9  1f ba 3a 1a 83 13 1f 7c  |.b.hj.....:....||
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 ab e5 6b  f9 d3 a6 07 ce 0b 64 7e  |.......k......d~|
-000000b0  14 42 d3 17 6a d4 89 2c  37 7d cd ee 77 23 0c 60  |.B..j..,7}..w#.`|
-000000c0  e0 db 35 5e 96                                    |..5^.|
+000000a0  00 00 00 00 00 92 f0 3e  2e 3c d2 62 ce e8 2e 12  |.......>.<.b....|
+000000b0  4e 1e 77 ba ff 61 97 f9  8e e8 d1 1b a0 00 3f 2c  |N.w..a........?,|
+000000c0  8c 5c 10 ac 05                                    |.\...|
index 07a000a7b4e2c25f2cedae37493c3f6903bd607c..b65a7b70f41fa073890b455f90377a8d09978207 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 f9 a8 6c 6d 8e  |.............lm.|
-00000010  46 32 35 bb 63 0e 00 89  d0 e2 36 04 62 73 5f 1a  |F25.c.....6.bs_.|
-00000020  32 39 a1 a8 0d 5d 65 e1  3d 79 43 00 00 04 00 2f  |29...]e.=yC..../|
+00000000  16 03 01 00 97 01 00 00  93 03 03 75 b5 bf db ae  |...........u....|
+00000010  ee 3a 8d d7 23 e1 22 9a  42 d9 7a de ac 41 81 60  |.:..#.".B.z..A.`|
+00000020  4d 05 6e f1 11 c5 c0 de  21 46 d2 00 00 04 00 2f  |M.n.....!F...../|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
 00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  21 0d 00 00 1d 02 01 40  |;.......!......@|
-000002a0  00 16 08 04 08 05 08 06  04 01 04 03 05 01 05 03  |................|
-000002b0  06 01 06 03 02 01 02 03  00 00 16 03 03 00 04 0e  |................|
-000002c0  00 00 00                                          |...|
+00000290  3b e9 fa e7 16 03 03 00  1d 0d 00 00 19 02 01 40  |;..............@|
+000002a0  00 12 04 01 04 03 08 07  05 01 06 01 05 03 06 03  |................|
+000002b0  02 01 02 03 00 00 16 03  03 00 04 0e 00 00 00     |...............|
 >>> Flow 3 (client to server)
 00000000  16 03 03 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
 00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
 000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
 000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
 00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 03 00 86 10 00 00 82  00 80 9f 2d b7 51 a0 7b  |...........-.Q.{|
-00000220  1f 57 7c 20 9f 8a 3a 23  19 2a 3f 29 31 c9 97 12  |.W| ..:#.*?)1...|
-00000230  fd 40 92 45 eb cd bf 45  19 b1 7a 80 14 22 a4 b7  |.@.E...E..z.."..|
-00000240  68 7a 6e f9 c1 a3 3d 44  ad 22 b1 e1 ae 52 2c a7  |hzn...=D."...R,.|
-00000250  fe 95 30 b7 cc 94 ce 9b  9d 94 ff 80 1f ca 75 90  |..0...........u.|
-00000260  7e d5 20 15 eb 46 b4 78  d8 ca e0 42 fe a0 aa d5  |~. ..F.x...B....|
-00000270  a3 69 34 61 1a 14 93 4e  1b 52 81 6f ae 90 59 3b  |.i4a...N.R.o..Y;|
-00000280  ac 7f a1 23 75 0b 97 7f  16 6f 85 99 68 b0 57 34  |...#u....o..h.W4|
-00000290  de 0e 60 62 61 6d 31 a8  46 9a 16 03 03 00 92 0f  |..`bam1.F.......|
-000002a0  00 00 8e 04 03 00 8a 30  81 87 02 41 74 3c e9 2d  |.......0...At<.-|
-000002b0  47 15 d6 a5 e8 21 b6 2c  d4 a4 83 3f ca 90 35 2f  |G....!.,...?..5/|
-000002c0  ae 36 26 81 49 ae 6c d9  d3 13 17 7f 8f 8a a0 2f  |.6&.I.l......../|
-000002d0  92 a2 6d 29 fb 09 6a 4d  b5 ea bc f0 05 43 bc fa  |..m)..jM.....C..|
-000002e0  6c ab 89 25 84 21 78 1c  f8 86 36 86 1b 02 42 00  |l..%.!x...6...B.|
-000002f0  98 0a bf 1e ee 62 85 43  c1 6c f0 49 9b 9a 46 96  |.....b.C.l.I..F.|
-00000300  32 24 66 3d 1e 09 e1 7e  47 af 6d d1 9e 5d 6f 85  |2$f=...~G.m..]o.|
-00000310  74 dc 7e ac c9 2b b7 e3  40 0a 25 45 76 6b 6e 5c  |t.~..+..@.%Evkn\|
-00000320  6f 42 59 5e 5e a4 b3 3d  4a c2 d7 1c 91 74 15 f9  |oBY^^..=J....t..|
-00000330  e3 14 03 03 00 01 01 16  03 03 00 40 57 f7 7c d6  |...........@W.|.|
-00000340  1a da 14 09 b3 8f 75 cc  c7 dd fe 2b 4d 11 3e 16  |......u....+M.>.|
-00000350  09 5a a0 d7 c3 05 b6 28  75 27 58 64 37 af 46 28  |.Z.....(u'Xd7.F(|
-00000360  74 a8 4d 9b c4 9d 5c 6c  f2 e3 be 45 65 93 be 89  |t.M...\l...Ee...|
-00000370  b6 5f 24 2b 26 3c d0 43  ce 05 91 c7              |._$+&<.C....|
+00000210  03 03 00 86 10 00 00 82  00 80 6c 1d a3 55 fb a0  |..........l..U..|
+00000220  be 6f 49 64 67 b8 da 1c  27 91 f4 5d d9 9d 7e f0  |.oIdg...'..]..~.|
+00000230  53 86 15 96 93 b2 0d 11  1a cf 3c 76 5e 76 24 ac  |S.........<v^v$.|
+00000240  f5 de c0 a3 d7 be db aa  86 f4 ec f4 39 a5 96 b8  |............9...|
+00000250  6a 88 cf b0 cd 02 b4 56  2d 5a 35 4e 15 95 21 94  |j......V-Z5N..!.|
+00000260  ac 2e 90 57 94 b9 a2 31  fe a9 3e 77 4a f2 5f fe  |...W...1..>wJ._.|
+00000270  5f 51 0d 12 61 19 f6 fe  7d f7 b7 06 0d b1 de 09  |_Q..a...}.......|
+00000280  45 17 4b 2a 15 97 ce 96  c5 f5 27 95 fb e8 c5 67  |E.K*......'....g|
+00000290  5e cb 8c 98 c7 c5 68 41  36 99 16 03 03 00 91 0f  |^.....hA6.......|
+000002a0  00 00 8d 04 03 00 89 30  81 86 02 41 48 35 40 6e  |.......0...AH5@n|
+000002b0  03 2a 43 fe f8 a9 c5 f9  c7 05 f8 db 13 5e ee bb  |.*C..........^..|
+000002c0  a8 59 5b fc b4 5d 0a ec  32 18 d5 a0 01 d5 81 a5  |.Y[..]..2.......|
+000002d0  f3 8e 4f 91 54 c7 8f a1  c1 77 4c 94 5c e4 68 c2  |..O.T....wL.\.h.|
+000002e0  0b 22 e2 70 0c 32 e2 9d  6e 47 e4 0d f7 02 41 2d  |.".p.2..nG....A-|
+000002f0  0e bb 28 47 90 23 68 f2  fd 9e 7d 13 f0 ad 40 ed  |..(G.#h...}...@.|
+00000300  cb 32 e5 9d 5e a7 e1 12  d7 de 10 bc 93 df cb 03  |.2..^...........|
+00000310  4e 16 5a cf 8f 25 1e 39  ff 7c 9f 59 55 f0 df b4  |N.Z..%.9.|.YU...|
+00000320  ce 43 6d 15 8f e3 ef 76  5d 0d a9 31 a9 24 c6 58  |.Cm....v]..1.$.X|
+00000330  14 03 03 00 01 01 16 03  03 00 40 71 ca 10 08 a9  |..........@q....|
+00000340  1a f1 78 9d 6f 2d 76 1c  b0 2a f8 26 d2 f6 89 db  |..x.o-v..*.&....|
+00000350  25 50 63 cc bf 12 cb fb  39 93 91 7f 7f f7 e4 fe  |%Pc.....9.......|
+00000360  fc 28 d0 01 3b e9 f9 1b  6a 77 db 16 14 71 3d 35  |.(..;...jw...q=5|
+00000370  67 de b8 1d e3 4a 02 bc  cf 0a a6                 |g....J.....|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 54 54 12 18 10  |...........TT...|
-00000020  cf 34 c3 2d 68 91 25 8e  2f 04 26 74 c1 bc 96 a1  |.4.-h.%./.&t....|
-00000030  65 a5 4e 88 58 fe 95 81  59 57 74 bf 0a 9d f9 98  |e.N.X...YWt.....|
-00000040  cb e2 7d 39 64 3e f4 09  9d e2 aa 17 03 03 00 40  |..}9d>.........@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 0d f1 0c 52 89  |..............R.|
+00000020  61 e6 21 95 8d 6f 5d e9  07 42 23 5f 1c 74 44 57  |a.!..o]..B#_.tDW|
+00000030  38 a3 98 77 f2 62 99 71  d6 fe 03 a3 82 01 7a da  |8..w.b.q......z.|
+00000040  a5 fd 12 62 2b d2 1d e4  e2 51 25 17 03 03 00 40  |...b+....Q%....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  82 e5 1d 01 10 a6 dd 52  42 b6 e7 8b 3f 45 03 39  |.......RB...?E.9|
-00000070  f1 3c 27 73 f0 8b a7 98  99 e9 da b8 88 34 25 49  |.<'s.........4%I|
-00000080  38 4d 6b 3a 8d f8 61 c8  b7 0d 80 4b 7b 83 e3 9a  |8Mk:..a....K{...|
+00000060  81 82 cc a9 4e 6f 78 41  28 b3 e6 c3 44 62 48 0b  |....NoxA(...DbH.|
+00000070  b3 70 f9 f8 7a fc c5 be  36 45 58 41 6f 77 69 40  |.p..z...6EXAowi@|
+00000080  5b 6e fc 69 84 21 eb bc  95 36 e6 48 05 02 37 f5  |[n.i.!...6.H..7.|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 4c b8 9a  e7 90 56 f7 ce 20 41 bf  |.....L....V.. A.|
-000000b0  44 f4 b7 85 ff 97 e9 43  4a 09 9e 7d 0e 91 1d 56  |D......CJ..}...V|
-000000c0  2d eb fb 44 4b                                    |-..DK|
+000000a0  00 00 00 00 00 d3 2f 45  d3 65 3b 64 67 43 ef aa  |....../E.e;dgC..|
+000000b0  a7 bb 98 a0 99 70 7f 56  c6 13 b2 1b 62 35 62 ea  |.....p.V....b5b.|
+000000c0  51 75 94 be 32                                    |Qu..2|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given b/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given
new file mode 100644 (file)
index 0000000..0503b9d
--- /dev/null
@@ -0,0 +1,111 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 cb 01 00 00  c7 03 03 ec bb 63 30 5c  |.............c0\|
+00000010  ea 49 54 dc 44 f7 80 47  c9 4d ff fa d4 77 44 8a  |.IT.D..G.M...wD.|
+00000020  ce 4b bd ce d7 95 b2 0d  f7 2e 88 00 00 38 c0 2c  |.K...........8.,|
+00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
+00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
+00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
+00000060  00 35 00 2f 00 ff 01 00  00 66 00 00 00 0e 00 0c  |.5./.....f......|
+00000070  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
+00000080  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
+00000090  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 30  |...............0|
+000000a0  00 2e 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
+000000b0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 03 03  |................|
+000000c0  02 03 03 01 02 01 03 02  02 02 04 02 05 02 06 02  |................|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 30 00 00  |...DOWNGRD...0..|
+00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
+00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
+00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
+00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
+00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
+00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
+00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
+000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
+000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
+000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
+000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
+000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
+000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
+00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
+00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
+00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
+00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
+00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
+00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
+00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
+00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
+00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
+00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
+000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
+000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
+000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
+000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
+000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
+000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
+00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
+00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
+00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
+00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
+00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
+00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
+00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
+00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
+00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
+00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
+000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
+000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
+000002c0  74 04 01 00 80 94 e2 09  13 e0 7c e8 6d 3b 50 f1  |t.........|.m;P.|
+000002d0  4f f3 58 57 da 87 f4 61  f5 04 fc ec 0d 28 f1 e9  |O.XW...a.....(..|
+000002e0  be 93 20 4a 17 03 17 b1  7f 2c 32 24 2e 02 35 67  |.. J.....,2$..5g|
+000002f0  9f e7 55 0a 6d 3d af ef  e3 b2 27 2e ae 12 cd 2c  |..U.m=....'....,|
+00000300  d9 e1 60 d6 64 94 f5 f2  42 54 43 23 70 36 fe 8e  |..`.d...BTC#p6..|
+00000310  d2 0b a3 cf fd 04 74 6e  55 9b 7a 86 c8 dd 0d 40  |......tnU.z....@|
+00000320  bc b1 4e 05 c2 7f b4 40  3a d9 66 01 af ee fb 54  |..N....@:.f....T|
+00000330  b6 cc e4 5b a2 1a 39 dc  25 7d 5d 8c 37 a1 15 ae  |...[..9.%}].7...|
+00000340  ed 16 b5 25 14 16 03 03  00 1d 0d 00 00 19 02 01  |...%............|
+00000350  40 00 12 04 01 04 03 08  07 05 01 06 01 05 03 06  |@...............|
+00000360  03 02 01 02 03 00 00 16  03 03 00 04 0e 00 00 00  |................|
+>>> Flow 3 (client to server)
+00000000  16 03 03 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
+00000010  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 17 d1 81  |...0............|
+00000020  93 be 2a 8c 21 20 10 25  15 e8 34 23 4f 30 05 06  |..*.! .%..4#O0..|
+00000030  03 2b 65 70 30 12 31 10  30 0e 06 03 55 04 0a 13  |.+ep0.1.0...U...|
+00000040  07 41 63 6d 65 20 43 6f  30 1e 17 0d 31 39 30 35  |.Acme Co0...1905|
+00000050  31 36 32 31 35 34 32 36  5a 17 0d 32 30 30 35 31  |16215426Z..20051|
+00000060  35 32 31 35 34 32 36 5a  30 12 31 10 30 0e 06 03  |5215426Z0.1.0...|
+00000070  55 04 0a 13 07 41 63 6d  65 20 43 6f 30 2a 30 05  |U....Acme Co0*0.|
+00000080  06 03 2b 65 70 03 21 00  0b e0 b5 60 b5 e2 79 30  |..+ep.!....`..y0|
+00000090  3d be e3 1e e0 50 b1 04  c8 6d c7 78 6c 69 2f c5  |=....P...m.xli/.|
+000000a0  14 ad 9a 63 6f 79 12 91  a3 4d 30 4b 30 0e 06 03  |...coy...M0K0...|
+000000b0  55 1d 0f 01 01 ff 04 04  03 02 05 a0 30 13 06 03  |U...........0...|
+000000c0  55 1d 25 04 0c 30 0a 06  08 2b 06 01 05 05 07 03  |U.%..0...+......|
+000000d0  02 30 0c 06 03 55 1d 13  01 01 ff 04 02 30 00 30  |.0...U.......0.0|
+000000e0  16 06 03 55 1d 11 04 0f  30 0d 82 0b 65 78 61 6d  |...U....0...exam|
+000000f0  70 6c 65 2e 63 6f 6d 30  05 06 03 2b 65 70 03 41  |ple.com0...+ep.A|
+00000100  00 fc 19 17 2a 94 a5 31  fa 29 c8 2e 7f 5b a0 5d  |....*..1.)...[.]|
+00000110  8a 4e 34 40 39 d6 b3 10  dc 19 fe a0 22 71 b3 f5  |.N4@9......."q..|
+00000120  8f a1 58 0d cd f4 f1 85  24 bf e6 3d 14 df df ed  |..X.....$..=....|
+00000130  0e e1 17 d8 11 a2 60 d0  8a 37 23 2a c2 46 aa 3a  |......`..7#*.F.:|
+00000140  08 16 03 03 00 25 10 00  00 21 20 f1 58 f8 db 86  |.....%...! .X...|
+00000150  a5 97 07 c8 fc c8 c1 fe  e4 c9 35 13 44 f8 9b 7f  |..........5.D...|
+00000160  4a 22 6a 61 75 70 be 23  76 f4 5f 16 03 03 00 48  |J"jaup.#v._....H|
+00000170  0f 00 00 44 08 07 00 40  fb ab 8f 44 f1 7b cb 95  |...D...@...D.{..|
+00000180  e3 83 4b 85 d0 4f 41 a6  39 f8 ba c1 7c b5 7d f0  |..K..OA.9...|.}.|
+00000190  45 5b 2d e2 90 80 27 1a  b9 88 dd 4b 0d bc e8 1b  |E[-...'....K....|
+000001a0  d4 fc 69 d1 ac 59 d8 b3  0b b6 f7 ae 76 12 da 80  |..i..Y......v...|
+000001b0  6b 39 98 5b 55 c4 c1 09  14 03 03 00 01 01 16 03  |k9.[U...........|
+000001c0  03 00 28 46 3a 98 32 bf  61 b0 d2 74 f8 f4 65 ef  |..(F:.2.a..t..e.|
+000001d0  89 5b f5 ef 49 42 56 67  97 23 f2 18 de 06 30 86  |.[..IBVg.#....0.|
+000001e0  77 66 ac 0a ac 88 98 ab  93 2b 20                 |wf.......+ |
+>>> Flow 4 (server to client)
+00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
+00000010  00 00 00 49 81 2d e8 88  dc 52 2a 44 51 18 2e 62  |...I.-...R*DQ..b|
+00000020  28 9e 91 7a 87 b5 fb 46  89 27 01 5e dc b1 12 00  |(..z...F.'.^....|
+00000030  72 fe 34 17 03 03 00 25  00 00 00 00 00 00 00 01  |r.4....%........|
+00000040  ab a1 6a 44 4b 80 a8 2e  f4 75 ff 09 9f 11 05 74  |..jDK....u.....t|
+00000050  93 ab 97 de 54 16 36 f9  0a 3c a1 89 c0 15 03 03  |....T.6..<......|
+00000060  00 1a 00 00 00 00 00 00  00 02 2d 63 e8 72 ab 7b  |..........-c.r.{|
+00000070  20 de f4 73 05 4a 26 a1  78 7a 1c 02              | ..s.J&.xz..|
index 37c813d559adf2f3769323d5a006eca98c5857e5..aa27d2c2317ed610eebffc6ccbfd96904ef1147c 100644 (file)
@@ -1,11 +1,14 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6b 01 00 00  67 03 03 e1 81 50 38 7b  |....k...g....P8{|
-00000010  dd e5 6f 1c 98 9e 2b 86  2d 50 95 de 00 b7 87 6e  |..o...+.-P.....n|
-00000020  b3 d2 20 0f 61 5c 3e 6d  19 0c 76 00 00 04 00 2f  |.. .a\>m..v..../|
-00000030  00 ff 01 00 00 3a 00 00  00 0e 00 0c 00 00 09 31  |.....:.........1|
+00000000  16 03 01 00 97 01 00 00  93 03 03 de e6 7c 24 10  |.............|$.|
+00000010  d1 3a 48 8f ba 9a cf 0f  4b 8d 81 8b 07 41 4f bd  |.:H.....K....AO.|
+00000020  46 9b c1 dc 24 51 aa 30  83 a2 49 00 00 04 00 2f  |F...$Q.0..I..../|
+00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 04 00 02 08 04  |................|
+00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
+00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
+00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
+00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
 00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  21 0d 00 00 1d 02 01 40  |;.......!......@|
-000002a0  00 16 08 04 08 05 08 06  04 01 04 03 05 01 05 03  |................|
-000002b0  06 01 06 03 02 01 02 03  00 00 16 03 03 00 04 0e  |................|
-000002c0  00 00 00                                          |...|
+00000290  3b e9 fa e7 16 03 03 00  1d 0d 00 00 19 02 01 40  |;..............@|
+000002a0  00 12 04 01 04 03 08 07  05 01 06 01 05 03 06 03  |................|
+000002b0  02 01 02 03 00 00 16 03  03 00 04 0e 00 00 00     |...............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
-00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
-00000020  c1 89 65 83 55 6f dc 0b  c9 b9 93 9f e9 bc 30 0d  |..e.Uo........0.|
-00000030  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 12 31  |..*.H........0.1|
-00000040  10 30 0e 06 03 55 04 0a  13 07 41 63 6d 65 20 43  |.0...U....Acme C|
-00000050  6f 30 1e 17 0d 31 36 30  38 31 37 32 31 35 32 33  |o0...16081721523|
-00000060  31 5a 17 0d 31 37 30 38  31 37 32 31 35 32 33 31  |1Z..170817215231|
-00000070  5a 30 12 31 10 30 0e 06  03 55 04 0a 13 07 41 63  |Z0.1.0...U....Ac|
-00000080  6d 65 20 43 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |me Co0..0...*.H.|
-00000090  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-000000a0  81 00 ba 6f aa 86 bd cf  bf 9f f2 ef 5c 94 60 78  |...o........\.`x|
-000000b0  6f e8 13 f2 d1 96 6f cd  d9 32 6e 22 37 ce 41 f9  |o.....o..2n"7.A.|
-000000c0  ca 5d 29 ac e1 27 da 61  a2 ee 81 cb 10 c7 df 34  |.])..'.a.......4|
-000000d0  58 95 86 e9 3d 19 e6 5c  27 73 60 c8 8d 78 02 f4  |X...=..\'s`..x..|
-000000e0  1d a4 98 09 a3 19 70 69  3c 25 62 66 2a ab 22 23  |......pi<%bf*."#|
-000000f0  c5 7b 85 38 4f 2e 09 73  32 a7 bd 3e 9b ad ca 84  |.{.8O..s2..>....|
-00000100  07 e6 0f 3a ff 77 c5 9d  41 85 00 8a b6 9b ee b0  |...:.w..A.......|
-00000110  a4 3f 2d 4c 4c e6 42 3e  bb 51 c8 dd 48 54 f4 0c  |.?-LL.B>.Q..HT..|
-00000120  8e 47 02 03 01 00 01 a3  46 30 44 30 0e 06 03 55  |.G......F0D0...U|
-00000130  1d 0f 01 01 ff 04 04 03  02 05 a0 30 13 06 03 55  |...........0...U|
-00000140  1d 25 04 0c 30 0a 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-00000150  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 0f  |0...U.......0.0.|
-00000160  06 03 55 1d 11 04 08 30  06 87 04 7f 00 00 01 30  |..U....0.......0|
-00000170  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
-00000180  81 00 46 ab 44 a2 fb 28  54 f8 5a 67 f8 62 94 f1  |..F.D..(T.Zg.b..|
-00000190  9a b2 18 9e f2 b1 de 1d  7e 6f 76 95 a9 ba e7 5d  |........~ov....]|
-000001a0  a8 16 6c 9c f7 09 d3 37  e4 4b 2b 36 7c 01 ad 41  |..l....7.K+6|..A|
-000001b0  d2 32 d8 c3 d2 93 f9 10  6b 8e 95 b9 2c 17 8a a3  |.2......k...,...|
-000001c0  44 48 bc 59 13 83 16 04  88 a4 81 5c 25 0d 98 0c  |DH.Y.......\%...|
-000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
-000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
-000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 94 94 83  |.5..............|
-00000210  d4 bf 82 86 72 fe 90 aa  36 eb 5a 10 df 59 58 f6  |....r...6.Z..YX.|
-00000220  c9 ee 1f c8 00 d1 8d d6  6b 06 bf 73 84 ca cb ef  |........k..s....|
-00000230  08 ba 9f 10 94 70 0f a4  10 e1 de 62 c6 d8 ff e8  |.....p.....b....|
-00000240  2f b1 9d 07 40 1f 34 d4  76 46 53 86 51 66 01 38  |/...@.4.vFS.Qf.8|
-00000250  18 82 16 8c ff e7 29 83  c3 09 25 2d d9 a0 57 d0  |......)...%-..W.|
-00000260  e0 6b 50 dd c2 4a 57 47  b0 1d 5c a0 a5 c3 69 14  |.kP..JWG..\...i.|
-00000270  ec 10 ed 30 b4 c0 25 3c  65 d1 31 59 c1 30 9f 77  |...0..%<e.1Y.0.w|
-00000280  1f 1e 88 a1 18 f0 22 dd  c1 8b 63 a2 6e 16 03 03  |......"...c.n...|
-00000290  00 88 0f 00 00 84 08 04  00 80 aa 26 3c 68 a6 ca  |...........&<h..|
-000002a0  17 8c ec 7e 57 6c 94 e1  a9 e8 c6 8f 9c 8d b8 09  |...~Wl..........|
-000002b0  ba 45 ea 4f 57 f2 14 b9  4a 4e 18 a2 33 05 55 9b  |.E.OW...JN..3.U.|
-000002c0  d7 6a 39 e9 82 9c 66 a0  50 dc 6d 2b 48 2c 76 d1  |.j9...f.P.m+H,v.|
-000002d0  91 4e ef 6d c8 18 00 f4  4b 96 61 1a 58 56 fc 62  |.N.m....K.a.XV.b|
-000002e0  3d 99 9d 12 c9 ea 52 9e  a8 1d cf a5 cf b8 c0 2e  |=.....R.........|
-000002f0  08 64 57 57 69 bd ee c9  19 fa f6 53 ac 3b e2 69  |.dWWi......S.;.i|
-00000300  d9 a1 8a 7a c3 e5 92 95  6f a6 4f 35 7a 08 4e a8  |...z....o.O5z.N.|
-00000310  8e 60 e0 df 20 14 6f f1  28 9e 14 03 03 00 01 01  |.`.. .o.(.......|
-00000320  16 03 03 00 40 d4 8d e3  39 26 9a 21 09 e6 76 bd  |....@...9&.!..v.|
-00000330  93 e6 98 8f 59 b0 4d 5c  cc 96 7d 6e cf 29 fd 58  |....Y.M\..}n.).X|
-00000340  81 c5 ae f5 b6 61 46 e4  55 ff 49 5c 4b 63 03 db  |.....aF.U.I\Kc..|
-00000350  1e ce 76 92 fb 18 d3 ca  2d 62 3e cd 98 f5 34 25  |..v.....-b>...4%|
-00000360  94 63 17 99 fc                                    |.c...|
+00000000  16 03 03 00 07 0b 00 00  03 00 00 00 16 03 03 00  |................|
+00000010  86 10 00 00 82 00 80 2e  43 3b 39 9a be ef de 53  |........C;9....S|
+00000020  4a 94 a3 a3 bd 92 93 44  e7 27 be f9 97 c9 1b fd  |J......D.'......|
+00000030  22 1b 6a 6c c3 79 87 45  01 a8 e0 ee 34 5a 23 61  |".jl.y.E....4Z#a|
+00000040  25 e4 06 88 fd b5 0d a3  dc e4 64 02 14 7e 47 fb  |%.........d..~G.|
+00000050  3b 88 7d 7f a9 e2 63 64  1a 15 db c6 de 03 a0 ed  |;.}...cd........|
+00000060  3c 33 b6 2f cc 2a fe 44  8f d7 be 61 0f e5 ea 2f  |<3./.*.D...a.../|
+00000070  63 7f c1 fa bc de d3 fd  10 3e 89 48 2c cf ab 57  |c........>.H,..W|
+00000080  ee b4 04 11 8c 2e 2d ec  b9 e5 d0 ac e7 b7 4d 60  |......-.......M`|
+00000090  fd fe 7f 88 f1 35 9b 14  03 03 00 01 01 16 03 03  |.....5..........|
+000000a0  00 40 ae 7d 3a a0 36 5b  4c b2 fe d7 3d 8b e8 45  |.@.}:.6[L...=..E|
+000000b0  f3 43 ae c4 d0 62 74 b5  44 38 3e f0 fd 68 f2 0b  |.C...bt.D8>..h..|
+000000c0  4a e6 b9 e8 59 4d 84 6a  cd a3 83 5a 95 8f 7a a8  |J...YM.j...Z..z.|
+000000d0  32 db b7 cd ef e8 5a dc  25 e5 1b 5f 02 7b e7 02  |2.....Z.%.._.{..|
+000000e0  fd d1                                             |..|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 c6 b8 7e 65 f8  |.............~e.|
-00000020  c4 d9 2c 00 11 f4 ae 2b  13 33 84 31 e6 e6 6e d5  |..,....+.3.1..n.|
-00000030  b0 8c 12 c9 6d 26 c2 8c  9c d0 2e 1b 3d 68 98 27  |....m&......=h.'|
-00000040  a2 f9 92 46 60 40 dc a6  12 c1 ee 17 03 03 00 40  |...F`@.........@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 18 1c 14 83 35  |...............5|
+00000020  c3 40 2a 62 72 5d 6f 23  98 1e 1c cf 3c 1f 76 f0  |.@*br]o#....<.v.|
+00000030  49 cb 62 80 32 e6 d8 6d  95 9b 58 47 2d 65 ff 25  |I.b.2..m..XG-e.%|
+00000040  00 99 db 92 58 e0 e9 09  90 c3 72 17 03 03 00 40  |....X.....r....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  70 ae c5 b1 11 36 22 4f  4b 11 cd 75 25 9c 8d 5e  |p....6"OK..u%..^|
-00000070  8b 3b f0 e0 fd 78 22 c7  e1 14 67 2e 12 13 53 44  |.;...x"...g...SD|
-00000080  38 7b f9 53 08 90 c8 95  3a 16 b1 b0 81 ce 44 b3  |8{.S....:.....D.|
+00000060  b5 9c b1 d1 30 6e 93 66  69 07 47 f6 31 ad e9 e1  |....0n.fi.G.1...|
+00000070  c5 d4 5c 98 ac 00 41 cd  84 c3 56 61 b1 36 fd ad  |..\...A...Va.6..|
+00000080  7f c6 b1 27 1d ef b9 ba  43 a1 7e f4 71 d9 55 6e  |...'....C.~.q.Un|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 a1 82 43  82 46 02 07 98 13 cc a1  |.......C.F......|
-000000b0  9f bd 78 9d 7a d0 c3 cc  e1 08 46 84 49 97 fb 5c  |..x.z.....F.I..\|
-000000c0  49 62 01 65 de                                    |Ib.e.|
+000000a0  00 00 00 00 00 3f 1a f4  80 31 9b 60 c0 28 76 79  |.....?...1.`.(vy|
+000000b0  c1 8f 65 f6 d3 b6 6d 99  6d 11 fa bc a6 b8 bf 7f  |..e...m.m.......|
+000000c0  8b ca c5 a1 cd                                    |.....|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled b/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled
deleted file mode 100644 (file)
index cb626a1..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 9e b1 2a 26 04  |.............*&.|
-00000010  8d 66 df 43 cb 0a 85 80  4f f2 99 7d 80 20 64 7e  |.f.C....O..}. d~|
-00000020  30 a0 bb 60 ac 0e d4 ce  f0 ae 98 00 00 04 00 2f  |0..`.........../|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  1b 0d 00 00 17 02 01 40  |;..............@|
-000002a0  00 10 04 01 04 03 05 01  05 03 06 01 06 03 02 01  |................|
-000002b0  02 03 00 00 16 03 03 00  04 0e 00 00 00           |.............|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
-00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
-00000020  c1 89 65 83 55 6f dc 0b  c9 b9 93 9f e9 bc 30 0d  |..e.Uo........0.|
-00000030  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 12 31  |..*.H........0.1|
-00000040  10 30 0e 06 03 55 04 0a  13 07 41 63 6d 65 20 43  |.0...U....Acme C|
-00000050  6f 30 1e 17 0d 31 36 30  38 31 37 32 31 35 32 33  |o0...16081721523|
-00000060  31 5a 17 0d 31 37 30 38  31 37 32 31 35 32 33 31  |1Z..170817215231|
-00000070  5a 30 12 31 10 30 0e 06  03 55 04 0a 13 07 41 63  |Z0.1.0...U....Ac|
-00000080  6d 65 20 43 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |me Co0..0...*.H.|
-00000090  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-000000a0  81 00 ba 6f aa 86 bd cf  bf 9f f2 ef 5c 94 60 78  |...o........\.`x|
-000000b0  6f e8 13 f2 d1 96 6f cd  d9 32 6e 22 37 ce 41 f9  |o.....o..2n"7.A.|
-000000c0  ca 5d 29 ac e1 27 da 61  a2 ee 81 cb 10 c7 df 34  |.])..'.a.......4|
-000000d0  58 95 86 e9 3d 19 e6 5c  27 73 60 c8 8d 78 02 f4  |X...=..\'s`..x..|
-000000e0  1d a4 98 09 a3 19 70 69  3c 25 62 66 2a ab 22 23  |......pi<%bf*."#|
-000000f0  c5 7b 85 38 4f 2e 09 73  32 a7 bd 3e 9b ad ca 84  |.{.8O..s2..>....|
-00000100  07 e6 0f 3a ff 77 c5 9d  41 85 00 8a b6 9b ee b0  |...:.w..A.......|
-00000110  a4 3f 2d 4c 4c e6 42 3e  bb 51 c8 dd 48 54 f4 0c  |.?-LL.B>.Q..HT..|
-00000120  8e 47 02 03 01 00 01 a3  46 30 44 30 0e 06 03 55  |.G......F0D0...U|
-00000130  1d 0f 01 01 ff 04 04 03  02 05 a0 30 13 06 03 55  |...........0...U|
-00000140  1d 25 04 0c 30 0a 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-00000150  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 0f  |0...U.......0.0.|
-00000160  06 03 55 1d 11 04 08 30  06 87 04 7f 00 00 01 30  |..U....0.......0|
-00000170  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
-00000180  81 00 46 ab 44 a2 fb 28  54 f8 5a 67 f8 62 94 f1  |..F.D..(T.Zg.b..|
-00000190  9a b2 18 9e f2 b1 de 1d  7e 6f 76 95 a9 ba e7 5d  |........~ov....]|
-000001a0  a8 16 6c 9c f7 09 d3 37  e4 4b 2b 36 7c 01 ad 41  |..l....7.K+6|..A|
-000001b0  d2 32 d8 c3 d2 93 f9 10  6b 8e 95 b9 2c 17 8a a3  |.2......k...,...|
-000001c0  44 48 bc 59 13 83 16 04  88 a4 81 5c 25 0d 98 0c  |DH.Y.......\%...|
-000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
-000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
-000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 3f 1b ee  |.5...........?..|
-00000210  02 ec a5 9f 6e 38 69 2c  b7 03 89 65 b4 92 79 a0  |....n8i,...e..y.|
-00000220  b2 0b ab 9b 44 9c 68 d1  8e 5c 40 9c b5 1c a5 70  |....D.h..\@....p|
-00000230  00 a2 2e fb 98 b7 45 7b  9c 63 46 68 1d 55 9e 01  |......E{.cFh.U..|
-00000240  7f 84 31 62 07 c4 2f 20  5f 1a 94 8c 1f f4 3a 6d  |..1b../ _.....:m|
-00000250  a8 2b b8 08 5b ec 27 e3  49 9e 51 b3 66 98 09 ba  |.+..[.'.I.Q.f...|
-00000260  64 65 c8 3c 11 fb 14 4a  c9 ea 3c 5e 52 10 a0 0b  |de.<...J..<^R...|
-00000270  a9 fc 10 13 c9 99 0c a0  8b b4 40 66 0e 11 5e 1d  |..........@f..^.|
-00000280  8b 45 5c 4d 0d 39 39 f6  0c 59 8f 06 99 16 03 03  |.E\M.99..Y......|
-00000290  00 88 0f 00 00 84 04 01  00 80 71 1c 9c fd b2 c9  |..........q.....|
-000002a0  b9 7f f3 51 e2 63 96 08  56 d2 bd 19 61 9f 3f be  |...Q.c..V...a.?.|
-000002b0  e5 4c 22 a8 3f 81 98 2d  67 56 4e 2d 61 6e 51 e5  |.L".?..-gVN-anQ.|
-000002c0  11 24 bd 1b 38 ba dc 8c  76 51 1d 3c 6e 81 50 9a  |.$..8...vQ.<n.P.|
-000002d0  b5 24 9c d8 af f7 80 8a  51 43 ec b3 59 18 bd ea  |.$......QC..Y...|
-000002e0  8a be af 11 c8 ac 60 88  e3 67 a2 ae c2 95 16 47  |......`..g.....G|
-000002f0  2b e2 ea 42 0a 0a 3f 2b  8b c8 ec 9d e7 b2 a6 ee  |+..B..?+........|
-00000300  f4 9b ba 28 47 e2 30 ae  05 89 09 65 3d b6 54 8a  |...(G.0....e=.T.|
-00000310  4a df d4 fa a5 4c 30 38  53 f2 14 03 03 00 01 01  |J....L08S.......|
-00000320  16 03 03 00 40 97 50 23  88 56 0d d4 1b ba 6f 3e  |....@.P#.V....o>|
-00000330  8d 82 6c f3 04 55 2c 13  d9 5b 0a 73 88 4f 8b 3c  |..l..U,..[.s.O.<|
-00000340  cd ef 1a a7 15 7c 33 bb  ff fa 01 c4 87 d7 df 47  |.....|3........G|
-00000350  37 b6 fe 1d e6 82 c2 8a  33 b1 c9 ae 85 45 c8 0d  |7.......3....E..|
-00000360  38 47 69 2d 54                                    |8Gi-T|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 20 98 12 44 63  |........... ..Dc|
-00000020  e7 77 e6 e8 c0 c7 d7 b6  f7 c4 4e 13 e3 79 af 33  |.w........N..y.3|
-00000030  3b 6c 86 22 c5 9e dd 25  74 e5 7b 37 fb 24 c6 48  |;l."...%t.{7.$.H|
-00000040  c9 74 a7 9b 9b 32 a7 c1  b9 bb e0 17 03 03 00 40  |.t...2.........@|
-00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  80 d7 ec 51 cf ae d4 1a  af 11 59 d1 0c 62 a6 67  |...Q......Y..b.g|
-00000070  2e 6f 18 23 29 75 92 07  b1 16 09 8f 2d f8 04 fe  |.o.#)u......-...|
-00000080  ce 71 2c b6 00 fd 7b 53  cb 6d 97 06 06 e6 af f4  |.q,...{S.m......|
-00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 73 14 3a  87 3b ca 3a 2b b2 52 30  |.....s.:.;.:+.R0|
-000000b0  98 62 88 1b a7 58 66 47  66 72 fd bb b6 b7 6b 99  |.b...XfGfr....k.|
-000000c0  20 ab e9 22 62                                    | .."b|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required b/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required
deleted file mode 100644 (file)
index 86d5415..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 d7 9c de f8 62  |...............b|
-00000010  7e 32 5b bc d5 12 35 89  42 37 be ca 55 74 24 61  |~2[...5.B7..Ut$a|
-00000020  c0 50 91 0f 1b 42 29 9f  c1 6a cb 00 00 04 00 2f  |.P...B)..j...../|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  1b 0d 00 00 17 02 01 40  |;..............@|
-000002a0  00 10 04 01 04 03 05 01  05 03 06 01 06 03 02 01  |................|
-000002b0  02 03 00 00 16 03 03 00  04 0e 00 00 00           |.............|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 07 0b 00 00  03 00 00 00 16 03 03 00  |................|
-00000010  86 10 00 00 82 00 80 1d  c6 6c b0 b9 b3 41 06 80  |.........l...A..|
-00000020  e0 f5 df 06 ae 0f 2f 5f  72 14 44 47 16 c4 f0 a6  |....../_r.DG....|
-00000030  68 be fa ee ec 9b 38 b0  e4 bd a3 e9 ca 18 5b 25  |h.....8.......[%|
-00000040  33 31 57 86 63 59 0e ce  10 77 f8 42 a6 5c ad 3f  |31W.cY...w.B.\.?|
-00000050  80 85 a5 c1 06 4c 36 aa  f3 ee 62 39 66 69 76 51  |.....L6...b9fivQ|
-00000060  57 cc a0 b1 35 81 d5 38  01 2d 83 0e 2e 6b a9 84  |W...5..8.-...k..|
-00000070  0d 8b 29 93 90 78 2d 0d  33 5f 85 0d 00 0c e2 5f  |..)..x-.3_....._|
-00000080  83 21 28 27 83 ad 9d 19  2d 01 35 6d 85 2e 8d 6b  |.!('....-.5m...k|
-00000090  eb 7a cd 8a 3f 42 e2 14  03 03 00 01 01 16 03 03  |.z..?B..........|
-000000a0  00 40 5e 19 0f d0 4c 17  e0 25 e6 6b a1 d9 ea 59  |.@^...L..%.k...Y|
-000000b0  f4 3a 55 84 2c 50 1e 53  47 78 45 b8 97 f7 7f 3d  |.:U.,P.SGxE....=|
-000000c0  af d9 7a ad 30 30 77 1a  93 05 19 5b 9b 13 70 e0  |..z.00w....[..p.|
-000000d0  e0 f8 ba 6a bd 74 c5 71  0d 5a 2c 3f 2d 98 1a 3c  |...j.t.q.Z,?-..<|
-000000e0  5a 7d                                             |Z}|
->>> Flow 4 (server to client)
-00000000  15 03 03 00 02 02 2a                              |......*|
index ebc16c590b8b984b12c93a31f0bfecb122a13010..1bb602d0787cb717cf422e9e210f7a0be343a820 100644 (file)
@@ -1,11 +1,14 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6b 01 00 00  67 03 03 a5 db 42 40 b5  |....k...g....B@.|
-00000010  57 97 90 6f de 6e 07 7c  3d f6 ce a5 ec 37 52 2e  |W..o.n.|=....7R.|
-00000020  d9 cf 7c dc f9 66 34 7f  ef a3 90 00 00 04 00 2f  |..|..f4......../|
-00000030  00 ff 01 00 00 3a 00 00  00 0e 00 0c 00 00 09 31  |.....:.........1|
+00000000  16 03 01 00 97 01 00 00  93 03 03 b1 59 5d 29 7f  |............Y]).|
+00000010  90 9c ef 9d ae 0a 91 6c  ab 05 fb 58 f7 79 9b c4  |.......l...X.y..|
+00000020  22 e1 ab 55 5c ea d1 24  27 2a 63 00 00 04 00 2f  |"..U\..$'*c..../|
+00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 04 00 02 04 01  |................|
+00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
+00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
+00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
+00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
 00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  21 0d 00 00 1d 02 01 40  |;.......!......@|
-000002a0  00 16 08 04 08 05 08 06  04 01 04 03 05 01 05 03  |................|
-000002b0  06 01 06 03 02 01 02 03  00 00 16 03 03 00 04 0e  |................|
-000002c0  00 00 00                                          |...|
+00000290  3b e9 fa e7 16 03 03 00  1d 0d 00 00 19 02 01 40  |;..............@|
+000002a0  00 12 04 01 04 03 08 07  05 01 06 01 05 03 06 03  |................|
+000002b0  02 01 02 03 00 00 16 03  03 00 04 0e 00 00 00     |...............|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
 000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
 000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
 000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 50 e9 35  |.5...........P.5|
-00000210  02 8f b8 95 2f 2c 00 92  dd 06 c9 0b 41 13 2b 1a  |..../,......A.+.|
-00000220  94 3c 98 24 9e 5b 08 ba  aa d2 8c 25 64 01 2c 19  |.<.$.[.....%d.,.|
-00000230  2a 10 3d 85 de e6 9d 7e  e3 a6 a1 ca 04 85 78 8e  |*.=....~......x.|
-00000240  4e ff 74 d2 0f 5f c9 6a  27 41 71 78 f9 64 e4 b9  |N.t.._.j'Aqx.d..|
-00000250  27 c8 c3 f4 64 f5 e7 9c  5b 02 e5 e7 be a2 aa 5a  |'...d...[......Z|
-00000260  a6 77 83 7e 6a 4b 5f 18  5c a2 f8 b9 42 3d 06 21  |.w.~jK_.\...B=.!|
-00000270  65 88 11 cf 0e 8a 9f c2  0b 7d c4 8e a0 aa 2d d8  |e........}....-.|
-00000280  93 15 88 61 8c c4 7c a8  e0 cb 13 6b b0 16 03 03  |...a..|....k....|
-00000290  00 88 0f 00 00 84 04 01  00 80 27 77 f1 9a 6e d1  |..........'w..n.|
-000002a0  d0 2d e1 cc 69 85 64 67  e0 fa 54 de 93 89 ca e8  |.-..i.dg..T.....|
-000002b0  a2 90 09 7b 96 22 f7 d8  f9 3e a5 c3 d0 31 9b 1e  |...{."...>...1..|
-000002c0  b8 e6 8b 6e 7b 46 87 c2  21 c6 40 b9 d4 ec 54 67  |...n{F..!.@...Tg|
-000002d0  ce 49 5e a6 9f 14 cc 84  ea 71 dd e6 b6 f9 e1 2d  |.I^......q.....-|
-000002e0  d6 dc 35 fa fd ce 39 70  97 15 6e 27 33 a2 da e9  |..5...9p..n'3...|
-000002f0  2c a6 5b 1b 18 57 78 a7  47 b8 04 26 35 55 5a 02  |,.[..Wx.G..&5UZ.|
-00000300  9a e8 48 73 f7 8a ac e8  59 86 61 2d bd c5 02 a6  |..Hs....Y.a-....|
-00000310  72 cc 37 8e ec 93 b5 53  6d f9 14 03 03 00 01 01  |r.7....Sm.......|
-00000320  16 03 03 00 40 e0 2f d8  1c fd 1a d0 e1 0c 92 4a  |....@./........J|
-00000330  8b 2b 01 10 58 8c dc 8f  c8 b3 22 42 9b 10 d1 a6  |.+..X....."B....|
-00000340  3e fe 3b 94 46 2f 41 ec  b6 d3 33 90 95 8c 69 fa  |>.;.F/A...3...i.|
-00000350  f6 1d 6c a2 45 27 1f d3  d9 6b cb 2d e4 e2 c1 39  |..l.E'...k.-...9|
-00000360  5d ed fa a1 b8                                    |]....|
+00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 aa ad 37  |.5.............7|
+00000210  05 40 cc 04 19 d0 de aa  25 9f 20 4e ce 74 f5 70  |.@......%. N.t.p|
+00000220  ae 17 f0 29 a4 37 ac 84  67 06 da 17 9f 26 dc ab  |...).7..g....&..|
+00000230  96 c4 13 d6 a5 e5 93 57  70 17 f2 f1 fb 0e a2 e4  |.......Wp.......|
+00000240  85 82 ea 63 ab 6f 6e 1f  0b 12 e7 35 ce b0 79 da  |...c.on....5..y.|
+00000250  95 cf de 7d 8b be 5e cc  d5 8e 00 02 fe 67 61 b4  |...}..^......ga.|
+00000260  69 2c 09 90 ae 6c df 29  45 67 79 8e fe 91 fb 3e  |i,...l.)Egy....>|
+00000270  1e ec 95 11 6c 6a 15 2f  93 59 41 34 8a 35 b0 7c  |....lj./.YA4.5.||
+00000280  22 ee bb 99 cc 3d 05 1f  7b 1b 96 f6 bc 16 03 03  |"....=..{.......|
+00000290  00 88 0f 00 00 84 04 01  00 80 a5 b1 55 c7 8c 86  |............U...|
+000002a0  c1 c2 60 2d ad 40 f1 ca  56 25 39 e7 c1 83 7f 16  |..`-.@..V%9.....|
+000002b0  08 6a c9 23 6a 82 73 63  bf 1a 32 de 85 82 2a bc  |.j.#j.sc..2...*.|
+000002c0  a0 99 db ea 34 26 27 8f  c6 36 b7 53 b5 76 75 2e  |....4&'..6.S.vu.|
+000002d0  48 26 bb b0 65 55 68 57  12 cb 9c 93 96 fc 88 fc  |H&..eUhW........|
+000002e0  73 56 c1 1e 04 ae 41 aa  ad b7 f8 58 7a 55 a9 74  |sV....A....XzU.t|
+000002f0  5b b5 12 08 25 ef c1 0f  4c 39 7b c5 07 d9 34 66  |[...%...L9{...4f|
+00000300  15 d3 76 a2 65 8c 4c ce  9a 89 0f 1f a9 5f d0 93  |..v.e.L......_..|
+00000310  3e ed 92 be 42 4c fe 23  ea 40 14 03 03 00 01 01  |>...BL.#.@......|
+00000320  16 03 03 00 40 89 ff 92  80 9b 37 4b 6f 8f 3a 22  |....@.....7Ko.:"|
+00000330  aa ab 60 1f 4d 49 ba 75  b2 dc 83 06 22 5a 89 5d  |..`.MI.u...."Z.]|
+00000340  1f 95 fa 0c 18 80 a0 5a  96 09 93 7b 06 cb 6c aa  |.......Z...{..l.|
+00000350  74 79 ea ae 02 e7 a7 c9  44 0b 6d f7 f7 b2 04 8f  |ty......D.m.....|
+00000360  6e 46 2d f1 6b                                    |nF-.k|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 37 e0 14 c7 88  |...........7....|
-00000020  ef de eb 58 7c bc 28 35  0e 5d 42 c0 45 5e 7c 50  |...X|.(5.]B.E^|P|
-00000030  82 5b f6 4d 28 b6 75 7b  b0 bf 01 05 b1 16 e1 d8  |.[.M(.u{........|
-00000040  96 0c 4e c5 84 19 64 1e  ee be 4c 17 03 03 00 40  |..N...d...L....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 67 84 0f 78 e0  |...........g..x.|
+00000020  91 c8 d4 4b 1c 69 95 f8  6c 30 23 55 2b 04 4b 24  |...K.i..l0#U+.K$|
+00000030  58 0a 46 06 94 00 72 95  77 77 4c d7 82 87 69 0a  |X.F...r.wwL...i.|
+00000040  4c 78 8a 12 76 27 ae 65  c9 20 c4 17 03 03 00 40  |Lx..v'.e. .....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  6a ca ba a3 69 e8 b8 74  19 dc 93 50 df 1c 62 71  |j...i..t...P..bq|
-00000070  54 c0 55 c0 aa 40 8e b9  f6 3c fe 54 6f 36 b8 26  |T.U..@...<.To6.&|
-00000080  ea 5b e8 83 fc 7b a0 a8  f6 b1 36 7d 8c db c3 8a  |.[...{....6}....|
+00000060  13 3b e0 4b cd 52 d3 6c  90 91 37 38 1d 9c 75 a2  |.;.K.R.l..78..u.|
+00000070  02 a3 3f 1a 43 6c aa f4  17 da 4e 01 d7 8c 74 5e  |..?.Cl....N...t^|
+00000080  f4 d3 61 cf 3c 7f 55 73  17 e7 d1 c3 a0 da 24 c4  |..a.<.Us......$.|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 2c e0 ed  49 c6 bc 76 c4 9d 2e 1c  |.....,..I..v....|
-000000b0  ca f8 80 61 b8 11 4a 3f  9f ad 7e 0e 79 58 25 bf  |...a..J?..~.yX%.|
-000000c0  c5 3f 95 9a e9                                    |.?...|
+000000a0  00 00 00 00 00 28 75 97  89 88 21 2e fe 9b 81 87  |.....(u...!.....|
+000000b0  2a 37 f0 81 9f 76 a2 27  a4 78 69 30 87 2c 09 6e  |*7...v.'.xi0.,.n|
+000000c0  55 90 fb ab b6                                    |U....|
index 7b38a99abb8cc61c276d72241acdb5bd002ff7ab..5711a3f6b6dcc359aaf08e062b46287e7785ff81 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 23 f3 fb 5f cb  |...........#.._.|
-00000010  3f 63 8a f2 4c c7 41 cd  64 00 4f 7c 63 66 e1 3f  |?c..L.A.d.O|cf.?|
-00000020  b6 8d 4e 24 20 35 9c c5  c3 96 e9 00 00 04 00 2f  |..N$ 5........./|
+00000000  16 03 01 00 97 01 00 00  93 03 03 67 52 bd 6c 6c  |...........gR.ll|
+00000010  76 8e 81 75 11 23 27 99  07 bf 64 96 13 0b 85 78  |v..u.#'...d....x|
+00000020  b4 5b b9 b0 a8 b5 fc 87  ef f2 0e 00 00 04 00 2f  |.[............./|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
 00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  21 0d 00 00 1d 02 01 40  |;.......!......@|
-000002a0  00 16 08 04 08 05 08 06  04 01 04 03 05 01 05 03  |................|
-000002b0  06 01 06 03 02 01 02 03  00 00 16 03 03 00 04 0e  |................|
-000002c0  00 00 00                                          |...|
+00000290  3b e9 fa e7 16 03 03 00  1d 0d 00 00 19 02 01 40  |;..............@|
+000002a0  00 12 04 01 04 03 08 07  05 01 06 01 05 03 06 03  |................|
+000002b0  02 01 02 03 00 00 16 03  03 00 04 0e 00 00 00     |...............|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 07 0b 00 00  03 00 00 00 16 03 03 00  |................|
-00000010  86 10 00 00 82 00 80 d7  50 22 1d 9e b8 81 12 e5  |........P"......|
-00000020  47 e6 65 cf 82 19 a2 43  9a 5c 7b 44 98 eb d9 ac  |G.e....C.\{D....|
-00000030  e1 4e f5 9d ad bd 0a 0e  17 07 81 b9 b5 4b bb b1  |.N...........K..|
-00000040  95 da 0a 82 67 ba 98 1b  cc 45 91 62 ee 36 eb e3  |....g....E.b.6..|
-00000050  18 30 34 f6 38 ab 3d 0c  a7 2b bd 90 94 49 81 af  |.04.8.=..+...I..|
-00000060  67 a0 f2 b4 0f c0 09 eb  c3 23 24 4b 76 3f cb b9  |g........#$Kv?..|
-00000070  4c a3 53 a7 f6 53 34 1b  24 24 2f cc 24 d8 fb 12  |L.S..S4.$$/.$...|
-00000080  65 60 cf 06 92 c3 7c 63  18 b1 92 88 e3 a8 1d 9c  |e`....|c........|
-00000090  f7 c1 9a a4 af 78 7d 14  03 03 00 01 01 16 03 03  |.....x}.........|
-000000a0  00 40 91 9a 6b 71 c5 3e  88 9a 26 b4 af fa 41 26  |.@..kq.>..&...A&|
-000000b0  72 33 a7 72 9b 22 89 d9  a5 ed 3d 0e 0e af c8 ef  |r3.r."....=.....|
-000000c0  3d c8 89 e4 0d 21 df 06  37 23 0f 50 d1 3e ef af  |=....!..7#.P.>..|
-000000d0  d8 cd 30 cc c4 18 3a 12  49 c0 0a 21 20 cd ac 66  |..0...:.I..! ..f|
-000000e0  96 c3                                             |..|
+00000010  86 10 00 00 82 00 80 31  7f 5d 8c 38 ee d7 05 14  |.......1.].8....|
+00000020  4c 0f 9d 01 2d 80 e9 71  0a 51 69 7b af 75 43 76  |L...-..q.Qi{.uCv|
+00000030  d7 eb 18 14 11 00 82 df  f4 e8 d1 83 5e 32 60 6e  |............^2`n|
+00000040  49 6d 1a 3f b2 ac 85 9f  f3 3c 3c cd f2 0d a8 e0  |Im.?.....<<.....|
+00000050  06 f3 6f 96 18 a0 76 06  c3 73 89 b4 de 30 ed 7b  |..o...v..s...0.{|
+00000060  7e 71 2d 13 88 43 ff a7  42 bb 2c 17 73 5f 67 8f  |~q-..C..B.,.s_g.|
+00000070  68 e7 52 84 72 34 08 69  c6 f5 1b e9 2b 42 93 90  |h.R.r4.i....+B..|
+00000080  3f 76 f3 89 9f 70 65 da  9c ce 8c bf a3 38 65 e3  |?v...pe......8e.|
+00000090  cf b9 f9 c6 d9 86 a5 14  03 03 00 01 01 16 03 03  |................|
+000000a0  00 40 e7 dd bf f7 33 bc  f2 90 a3 43 fa 43 ec 7e  |.@....3....C.C.~|
+000000b0  e6 06 28 c1 3f 83 c5 50  65 6d 6b e7 37 cf e7 4b  |..(.?..Pemk.7..K|
+000000c0  85 34 3b df 4f 48 82 30  d0 43 f7 00 c4 3f 03 dd  |.4;.OH.0.C...?..|
+000000d0  ef c0 d4 04 48 b4 9b ec  f0 65 7c 2a bc 87 24 5f  |....H....e|*..$_|
+000000e0  7a d5                                             |z.|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 2d 70 ad 8f ed  |...........-p...|
-00000020  c0 cf ce 73 28 76 8f da  65 41 46 53 dd 06 0d cc  |...s(v..eAFS....|
-00000030  36 cb f3 b8 c7 1f df 53  1a 7d 1e 9f d6 b9 e3 9e  |6......S.}......|
-00000040  fe a8 d9 91 6c 3b d2 ef  b6 30 55 17 03 03 00 40  |....l;...0U....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 da 0a 2a 09 ef  |.............*..|
+00000020  39 6c c9 6d cc c3 ae 56  cd e1 a8 47 26 ec 9c b7  |9l.m...V...G&...|
+00000030  50 eb 2e 10 d4 15 3e 5e  cc 65 78 2e 47 bf 18 e8  |P.....>^.ex.G...|
+00000040  62 59 bb 7c b7 2c 28 b1  ea 82 10 17 03 03 00 40  |bY.|.,(........@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  6a 43 95 20 f0 f9 b4 e0  12 24 ae c1 55 c2 ad ec  |jC. .....$..U...|
-00000070  de 42 1f 0b ff 5b e5 ab  8b aa 72 69 2f 10 12 ca  |.B...[....ri/...|
-00000080  8c f2 77 be 60 81 ef c9  34 dc d7 68 57 d5 17 aa  |..w.`...4..hW...|
+00000060  9e 53 10 86 89 0c 8f 14  0c 22 6c 32 33 34 64 83  |.S......."l234d.|
+00000070  28 7c 02 b3 59 b7 b2 60  5a ec f2 a7 1a 21 04 dd  |(|..Y..`Z....!..|
+00000080  2a c0 ca 68 07 85 8f 7d  6b da 26 97 52 91 40 e8  |*..h...}k.&.R.@.|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 c0 4b 9e  e5 6b 45 60 e1 7b 87 b1  |......K..kE`.{..|
-000000b0  76 06 e4 dc d7 01 eb db  04 9c 9b d4 bd 5c e0 18  |v............\..|
-000000c0  72 7a 73 93 4f                                    |rzs.O|
+000000a0  00 00 00 00 00 f4 ae 69  5a bc af 94 f9 7f 60 d1  |.......iZ.....`.|
+000000b0  36 83 e7 23 13 79 ae c1  5a 3b 35 d0 ed 16 12 ac  |6..#.y..Z;5.....|
+000000c0  52 b5 4e eb 31                                    |R.N.1|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-Ed25519 b/libgo/go/crypto/tls/testdata/Server-TLSv12-Ed25519
new file mode 100644 (file)
index 0000000..f424791
--- /dev/null
@@ -0,0 +1,63 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 cb 01 00 00  c7 03 03 a6 41 b7 62 67  |............A.bg|
+00000010  34 b4 48 22 67 fd e6 a9  12 29 b7 85 6a 27 c9 fc  |4.H"g....)..j'..|
+00000020  70 3a cc 0c 94 61 88 d1  9e 22 3d 00 00 38 c0 2c  |p:...a..."=..8.,|
+00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
+00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
+00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
+00000060  00 35 00 2f 00 ff 01 00  00 66 00 00 00 0e 00 0c  |.5./.....f......|
+00000070  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
+00000080  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
+00000090  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 30  |...............0|
+000000a0  00 2e 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
+000000b0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 03 03  |................|
+000000c0  02 03 03 01 02 01 03 02  02 02 04 02 05 02 06 02  |................|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 2c 00 00  |...DOWNGRD...,..|
+00000030  05 ff 01 00 01 00 16 03  03 01 3c 0b 00 01 38 00  |..........<...8.|
+00000040  01 35 00 01 32 30 82 01  2e 30 81 e1 a0 03 02 01  |.5..20...0......|
+00000050  02 02 10 0f 43 1c 42 57  93 94 1d e9 87 e4 f1 ad  |....C.BW........|
+00000060  15 00 5d 30 05 06 03 2b  65 70 30 12 31 10 30 0e  |..]0...+ep0.1.0.|
+00000070  06 03 55 04 0a 13 07 41  63 6d 65 20 43 6f 30 1e  |..U....Acme Co0.|
+00000080  17 0d 31 39 30 35 31 36  32 31 33 38 30 31 5a 17  |..190516213801Z.|
+00000090  0d 32 30 30 35 31 35 32  31 33 38 30 31 5a 30 12  |.200515213801Z0.|
+000000a0  31 10 30 0e 06 03 55 04  0a 13 07 41 63 6d 65 20  |1.0...U....Acme |
+000000b0  43 6f 30 2a 30 05 06 03  2b 65 70 03 21 00 3f e2  |Co0*0...+ep.!.?.|
+000000c0  15 2e e6 e3 ef 3f 4e 85  4a 75 77 a3 64 9e ed e0  |.....?N.Juw.d...|
+000000d0  bf 84 2c cc 92 26 8f fa  6f 34 83 aa ec 8f a3 4d  |..,..&..o4.....M|
+000000e0  30 4b 30 0e 06 03 55 1d  0f 01 01 ff 04 04 03 02  |0K0...U.........|
+000000f0  05 a0 30 13 06 03 55 1d  25 04 0c 30 0a 06 08 2b  |..0...U.%..0...+|
+00000100  06 01 05 05 07 03 01 30  0c 06 03 55 1d 13 01 01  |.......0...U....|
+00000110  ff 04 02 30 00 30 16 06  03 55 1d 11 04 0f 30 0d  |...0.0...U....0.|
+00000120  82 0b 65 78 61 6d 70 6c  65 2e 63 6f 6d 30 05 06  |..example.com0..|
+00000130  03 2b 65 70 03 41 00 63  44 ed 9c c4 be 53 24 53  |.+ep.A.cD....S$S|
+00000140  9f d2 10 8d 9f e8 21 08  90 95 39 e5 0d c1 55 ff  |......!...9...U.|
+00000150  2c 16 b7 1d fc ab 7d 4d  d4 e0 93 13 d0 a9 42 e0  |,.....}M......B.|
+00000160  b6 6b fe 5d 67 48 d7 9f  50 bc 6c cd 4b 03 83 7c  |.k.]gH..P.l.K..||
+00000170  f2 08 58 cd ac cf 0c 16  03 03 00 6c 0c 00 00 68  |..X........l...h|
+00000180  03 00 1d 20 2f e5 7d a3  47 cd 62 43 15 28 da ac  |... /.}.G.bC.(..|
+00000190  5f bb 29 07 30 ff f6 84  af c4 cf c2 ed 90 99 5f  |_.).0.........._|
+000001a0  58 cb 3b 74 08 07 00 40  b8 a3 37 f4 74 44 64 eb  |X.;t...@..7.tDd.|
+000001b0  1f 4b a1 5c 6e 3b 46 a0  b8 ce ce da 79 8d 03 d8  |.K.\n;F.....y...|
+000001c0  a2 c2 1d ca 25 21 d2 c3  cf 65 02 7e 4c d6 9a 5a  |....%!...e.~L..Z|
+000001d0  ba 60 51 71 e4 37 ab 70  18 73 f1 a0 e5 f9 e3 2d  |.`Qq.7.p.s.....-|
+000001e0  00 37 68 97 cf fa e4 08  16 03 03 00 04 0e 00 00  |.7h.............|
+000001f0  00                                                |.|
+>>> Flow 3 (client to server)
+00000000  16 03 03 00 25 10 00 00  21 20 51 d1 53 24 ee 09  |....%...! Q.S$..|
+00000010  51 02 90 7e 6f 02 a2 54  db 6e 95 a4 af f9 43 51  |Q..~o..T.n....CQ|
+00000020  d2 ff 6b e6 26 d0 88 4d  c1 56 14 03 03 00 01 01  |..k.&..M.V......|
+00000030  16 03 03 00 28 2a 7a 63  66 3f 53 88 0a cf ef 03  |....(*zcf?S.....|
+00000040  ef 21 5b b5 57 ce 9e e5  da 84 e5 a7 d3 6d 90 c9  |.![.W........m..|
+00000050  6c f8 c1 9d cc a2 ff cb  97 5a 7c 1a 62           |l........Z|.b|
+>>> Flow 4 (server to client)
+00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
+00000010  00 00 00 7a ee 1c df b7  14 c9 81 18 f3 51 de 24  |...z.........Q.$|
+00000020  70 ed b7 87 b9 29 b3 f7  ef 43 d0 c9 8f 35 3e 0a  |p....)...C...5>.|
+00000030  a1 c4 72 17 03 03 00 25  00 00 00 00 00 00 00 01  |..r....%........|
+00000040  f6 37 d9 31 d2 1f de a6  43 3b 60 a7 30 8c 76 cd  |.7.1....C;`.0.v.|
+00000050  47 f3 e3 a5 f3 6f e0 fe  fd 93 76 1f 0a 15 03 03  |G....o....v.....|
+00000060  00 1a 00 00 00 00 00 00  00 02 6d 2d 8d 6b f1 e3  |..........m-.k..|
+00000070  8f 21 e4 8e af b2 90 69  5b 10 3a f9              |.!.....i[.:.|
index 7d7ee638616282d25e61db0377be21ac274d8b30..b777c624157421f79e9781cafe50210d3d30b0dd 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 cf 01 00 00  cb 03 03 79 bf 0b 29 ec  |...........y..).|
-00000010  6a 0b 84 1e 2c d5 bf 30  b7 55 b9 7b 77 69 8f 9a  |j...,..0.U.{wi..|
-00000020  71 34 c9 83 d1 af de 50  d5 d6 fc 00 00 38 c0 2c  |q4.....P.....8.,|
+00000000  16 03 01 00 cf 01 00 00  cb 03 03 54 13 f1 1a dc  |...........T....|
+00000010  39 72 b7 e7 86 ac 83 df  9b 75 9e 71 40 7a 14 b3  |9r.......u.q@z..|
+00000020  fc ad 99 d1 8a 4f d0 d9  a3 f0 3d 00 00 38 c0 2c  |.....O....=..8.,|
 00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
 00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
 00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
 00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 ac 0c 00 00  |.\!.;...........|
 000002a0  a8 03 00 1d 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |.... /.}.G.bC.(.|
 000002b0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-000002c0  5f 58 cb 3b 74 08 04 00  80 36 12 82 aa d1 40 60  |_X.;t....6....@`|
-000002d0  6c fb da 0b 04 f6 23 94  3f 3d 8c a5 f4 fe ed 1f  |l.....#.?=......|
-000002e0  be 25 85 94 c9 2f 19 64  52 2b 8a 13 29 52 ae 77  |.%.../.dR+..)R.w|
-000002f0  ca 24 40 f1 31 1c f3 aa  33 29 1f cc b0 a3 8b e6  |.$@.1...3)......|
-00000300  c3 26 90 e4 11 48 e6 91  a6 5d 5e c6 18 8d 4f 2c  |.&...H...]^...O,|
-00000310  21 be bc 13 4d de bb 68  42 0b e1 29 3e 8e fc b9  |!...M..hB..)>...|
-00000320  45 ed c4 87 ed 62 1d 04  c0 4f d5 f5 94 62 65 07  |E....b...O...be.|
-00000330  8c f0 00 3d 47 f6 f5 93  e3 a9 69 ce 79 8a e5 24  |...=G.....i.y..$|
-00000340  01 d4 28 e6 f5 f5 a9 7e  ab 16 03 03 00 04 0e 00  |..(....~........|
+000002c0  5f 58 cb 3b 74 04 01 00  80 8e 2b 18 d7 2c 6d 91  |_X.;t.....+..,m.|
+000002d0  12 b3 ba 39 20 4f 43 60  08 d3 63 6e 55 01 50 3c  |...9 OC`..cnU.P<|
+000002e0  2b 6d 09 ca 27 d6 f7 42  d1 74 19 e1 6b 06 93 06  |+m..'..B.t..k...|
+000002f0  6e e6 c4 23 cc 1b c8 de  8f 30 c2 4d 22 36 10 df  |n..#.....0.M"6..|
+00000300  32 cb f3 4e ec 9a b1 d6  63 7d 11 4e 58 d2 b7 7a  |2..N....c}.NX..z|
+00000310  70 31 4b 92 3e 27 ba f0  85 ca 7d 43 c7 68 04 6a  |p1K.>'....}C.h.j|
+00000320  fa c4 ac c1 16 8b 18 c9  2e 94 2e c2 a6 f3 f0 f3  |................|
+00000330  fb 8a 21 6d 4f 3d bc 0f  fa 21 fd d5 78 57 6c 38  |..!mO=...!..xWl8|
+00000340  09 48 64 d6 ca b6 31 3c  39 16 03 03 00 04 0e 00  |.Hd...1<9.......|
 00000350  00 00                                             |..|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 ea 09 8a 21 18 89  |....%...! ...!..|
-00000010  7d 4f ee 95 8e 6c 1a 07  22 59 e7 f9 05 41 2a c2  |}O...l.."Y...A*.|
-00000020  ad 51 71 9c a4 0e 08 eb  49 71 14 03 03 00 01 01  |.Qq.....Iq......|
-00000030  16 03 03 00 28 6a ab 19  f6 b6 cb 70 34 ee 73 d2  |....(j.....p4.s.|
-00000040  05 bf 99 37 44 b7 f9 1e  b1 8a 3d f9 13 bd 0c 77  |...7D.....=....w|
-00000050  02 b0 64 08 f9 d9 f2 96  b4 5b 87 ff 0b           |..d......[...|
+00000000  16 03 03 00 25 10 00 00  21 20 af 4c 6e 57 5e f7  |....%...! .LnW^.|
+00000010  49 e2 89 33 f9 47 59 7c  81 5c 63 74 cd 27 6a 65  |I..3.GY|.\ct.'je|
+00000020  b6 55 d1 72 ad 60 08 d0  c6 6a 14 03 03 00 01 01  |.U.r.`...j......|
+00000030  16 03 03 00 28 69 f2 a5  05 8c a5 a7 5f 8f 8b cf  |....(i......_...|
+00000040  7a 18 fb f4 45 5e 1f f8  ba 60 2e fa c6 8c c6 57  |z...E^...`.....W|
+00000050  89 ac 8a 85 71 00 21 65  f3 a6 99 5d 3b           |....q.!e...];|
 >>> Flow 4 (server to client)
 00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
 00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f ec 80 83 61 db f0 ce  92 57 a1 db 00 84 5e 78  |o...a....W....^x|
-00000040  0e f7 97 3e f5 f0 e8 73  d6 b0 a7 28 8f bb 24 b1  |...>...s...(..$.|
-00000050  a9 3f 60 a3 7a f2 c1 a6  12 0e 69 3b 72 89 dd 36  |.?`.z.....i;r..6|
-00000060  d8 ff 80 5d 71 33 94 32  01 77 ce 77 5e ac b8 05  |...]q3.2.w.w^...|
-00000070  69 68 e5 81 51 4d 52 f6  e9 c5 cd 70 56 23 3c aa  |ih..QMR....pV#<.|
-00000080  2e c6 a2 d6 e3 5f 29 14  03 03 00 01 01 16 03 03  |....._).........|
-00000090  00 28 00 00 00 00 00 00  00 00 59 27 e3 e7 05 60  |.(........Y'...`|
-000000a0  03 68 93 6d 28 1d 8e 7f  f1 c8 a6 eb b4 57 a5 22  |.h.m(........W."|
-000000b0  98 ce 7e 56 00 44 fe d5  5e 26 17 03 03 00 25 00  |..~V.D..^&....%.|
-000000c0  00 00 00 00 00 00 01 9d  87 53 e9 29 e4 d7 45 29  |.........S.)..E)|
-000000d0  ef 71 a6 7e b8 99 d4 4f  08 da 11 6b 9b d2 20 b9  |.q.~...O...k.. .|
-000000e0  c4 ae 7f 84 15 03 03 00  1a 00 00 00 00 00 00 00  |................|
-000000f0  02 06 17 a2 45 91 d0 b0  50 aa 8f a2 f1 8b 48 cf  |....E...P.....H.|
-00000100  40 87 a4                                          |@..|
+00000030  6f ec 80 83 61 0d 24 39  c2 e0 e0 85 93 37 1f 40  |o...a.$9.....7.@|
+00000040  0a 0e a7 45 0e 81 37 6c  7a 11 ed e6 c0 f1 69 23  |...E..7lz.....i#|
+00000050  df 14 01 ff ff 52 2f ac  da 15 14 5b a2 07 c8 bc  |.....R/....[....|
+00000060  82 4f 2b 5b 71 33 94 09  17 b4 83 76 62 b7 46 9d  |.O+[q3.....vb.F.|
+00000070  6f 0d de c2 8b a8 ce 6e  2e df f4 a3 59 fc af f2  |o......n....Y...|
+00000080  fe 3f 1e d6 75 b5 63 14  03 03 00 01 01 16 03 03  |.?..u.c.........|
+00000090  00 28 00 00 00 00 00 00  00 00 ae 8b f0 21 94 08  |.(...........!..|
+000000a0  ec aa a6 f5 40 81 5a a2  42 f7 0a 9b 6b e6 8d 7a  |....@.Z.B...k..z|
+000000b0  44 e1 85 41 fc 83 f0 e1  c0 c2 17 03 03 00 25 00  |D..A..........%.|
+000000c0  00 00 00 00 00 00 01 c4  a7 e5 72 e4 09 d0 21 b8  |..........r...!.|
+000000d0  99 ae f0 6a 2c 1c a4 ca  ae 44 79 92 ae 25 f8 37  |...j,....Dy..%.7|
+000000e0  d8 49 f3 21 15 03 03 00  1a 00 00 00 00 00 00 00  |.I.!............|
+000000f0  02 76 b5 79 33 82 76 50  e3 2b 03 e9 b8 14 2d 51  |.v.y3.vP.+....-Q|
+00000100  ac f9 6d                                          |..m|
index 5295d60a8df5a9b1762e8c56dc2e16c3885418f0..4e302b374cc5d4f7bfa36487911b8eeefad2e13e 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 8f 01 00 00  8b 03 03 e8 ef f7 4f 44  |..............OD|
-00000010  1a 63 08 10 fe aa 68 d5  75 18 f5 6c de 83 50 d2  |.c....h.u..l..P.|
-00000020  bb 86 6e 48 d0 cb 97 c4  56 46 9f 00 00 04 c0 2f  |..nH....VF...../|
+00000000  16 03 01 00 8f 01 00 00  8b 03 03 b1 a0 04 30 1e  |..............0.|
+00000010  a1 09 cb 31 c4 1a 15 e7  a6 06 b5 fb 51 da d6 01  |...1........Q...|
+00000020  dc c0 cc 17 85 e5 c4 c6  b1 da be 00 00 04 c0 2f  |.............../|
 00000030  00 ff 01 00 00 5e 00 00  00 0e 00 0c 00 00 09 31  |.....^.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 04 00 02 00 17  00 16 00 00 00 17 00 00  |................|
 000002b0  5b 12 2e 8f 09 67 fd a7  24 20 3e b2 56 1c ce 97  |[....g..$ >.V...|
 000002c0  28 5e f8 2b 2d 4f 9e f1  07 9f 6c 4b 5b 83 56 e2  |(^.+-O....lK[.V.|
 000002d0  32 42 e9 58 b6 d7 49 a6  b5 68 1a 41 03 56 6b dc  |2B.X..I..h.A.Vk.|
-000002e0  5a 89 08 04 00 80 b8 fd  6d 56 36 b6 b3 8a 6c cb  |Z.......mV6...l.|
-000002f0  6b 52 79 28 45 97 1e 97  1b 7f 96 2e e0 b0 23 af  |kRy(E.........#.|
-00000300  cb 13 cf dc e6 11 2b 04  88 08 56 2d a4 3a b1 7e  |......+...V-.:.~|
-00000310  79 b5 de 25 35 6b 82 98  d9 9e be 99 d4 37 bf 19  |y..%5k.......7..|
-00000320  bb 0e 25 86 b6 19 e8 58  de ab 63 ed 3c 09 d6 6b  |..%....X..c.<..k|
-00000330  f5 da 16 e6 75 5d e7 7b  e5 54 1b de 03 1d cd fb  |....u].{.T......|
-00000340  3d 9f 24 cc ff 07 d2 cb  f2 0b 4a 61 57 ec 84 dd  |=.$.......JaW...|
-00000350  92 44 da 71 a2 31 ba 2e  68 19 2b ee 90 19 12 a5  |.D.q.1..h.+.....|
-00000360  59 53 28 9d 0a 87 16 03  03 00 04 0e 00 00 00     |YS(............|
+000002e0  5a 89 04 01 00 80 bb 79  4d c9 d6 77 df 13 46 e6  |Z......yM..w..F.|
+000002f0  82 30 7a 03 2e 58 a8 bf  2a 53 c4 58 0a 9a 9a 0f  |.0z..X..*S.X....|
+00000300  72 51 a9 91 5b f7 88 f1  de 28 1d 56 79 2c da 89  |rQ..[....(.Vy,..|
+00000310  a4 de 25 65 20 f7 a1 a4  b1 ff 3c 5a cd 67 24 9b  |..%e .....<Z.g$.|
+00000320  44 fc a4 27 07 1b 75 88  3c 75 78 c7 b9 ec 77 4a  |D..'..u.<ux...wJ|
+00000330  a3 56 c2 e3 e9 e0 51 92  07 7f ac 0c 09 88 11 21  |.V....Q........!|
+00000340  11 40 dd 9f 5b 21 2e de  f9 be 02 de c6 9d ea 06  |.@..[!..........|
+00000350  65 d6 b0 2d 1b 41 21 e8  2d 77 e2 14 96 fc 8f 39  |e..-.A!.-w.....9|
+00000360  6c 0a f8 07 8c d9 16 03  03 00 04 0e 00 00 00     |l..............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 01 9c 4d 77 6b  |....F...BA...Mwk|
-00000010  ce 2f a7 9e 8b ae ba 9d  f2 6d c8 9e 0e 54 07 c9  |./.......m...T..|
-00000020  6d e3 58 67 c6 a8 9a a5  c2 f7 27 26 84 36 e1 6f  |m.Xg......'&.6.o|
-00000030  e3 a1 89 50 7c e0 e6 88  06 b9 94 16 d8 23 cb 2e  |...P|........#..|
-00000040  ff 62 67 1e 93 cb d6 1d  f5 43 79 14 03 03 00 01  |.bg......Cy.....|
-00000050  01 16 03 03 00 28 83 36  85 d0 b7 23 5e 7d 0a 33  |.....(.6...#^}.3|
-00000060  41 0f bd 31 4d a0 32 6a  c2 67 93 cc 8f 41 f5 bd  |A..1M.2j.g...A..|
-00000070  b2 57 af 5c 90 d6 17 24  be 76 6b b4 13 ca        |.W.\...$.vk...|
+00000000  16 03 03 00 46 10 00 00  42 41 04 1b 28 eb 97 c5  |....F...BA..(...|
+00000010  63 cc e1 64 31 f9 b3 5c  61 d8 d9 28 f9 1e 9a 4b  |c..d1..\a..(...K|
+00000020  09 2a 5a b9 64 42 15 d3  06 80 64 67 93 63 e2 c6  |.*Z.dB....dg.c..|
+00000030  51 05 3c 8b 32 41 c2 a0  5a db 73 ba 77 86 7f 1b  |Q.<.2A..Z.s.w...|
+00000040  2e b4 33 9c 20 0a 40 3a  c6 90 f1 14 03 03 00 01  |..3. .@:........|
+00000050  01 16 03 03 00 28 56 75  52 fe f7 13 79 b6 c6 ba  |.....(VuR...y...|
+00000060  f1 6a 6d f2 3d 2c 8c c2  70 3e 19 ba 32 34 88 02  |.jm.=,..p>..24..|
+00000070  73 d7 d5 db b9 52 21 32  34 fb 7e e8 17 49        |s....R!24.~..I|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 80 6a 93 5b 7d  70 3c bc 7c f8 d6 4e 51  |....j.[}p<.|..NQ|
-00000020  5e 34 52 13 06 c4 aa 8c  ed b5 9f aa c6 db c0 0d  |^4R.............|
-00000030  67 97 36 17 03 03 00 25  00 00 00 00 00 00 00 01  |g.6....%........|
-00000040  d6 24 e8 21 4b 2c fb 5e  79 2d ca 7b 6d 44 dd 2d  |.$.!K,.^y-.{mD.-|
-00000050  aa 3a 33 ee ea 6f e3 b7  cd c5 c3 1d 4a 15 03 03  |.:3..o......J...|
-00000060  00 1a 00 00 00 00 00 00  00 02 4f 71 74 9e 63 ad  |..........Oqt.c.|
-00000070  d7 61 b9 c7 47 d6 44 9f  b3 3d 49 34              |.a..G.D..=I4|
+00000010  00 00 00 41 e9 67 42 6b  79 56 59 80 41 c2 3a b9  |...A.gBkyVY.A.:.|
+00000020  b2 3a 06 0e 31 76 18 ba  86 a4 2d 1a 71 19 f3 f1  |.:..1v....-.q...|
+00000030  a3 bc b3 17 03 03 00 25  00 00 00 00 00 00 00 01  |.......%........|
+00000040  57 ee 6f 74 4b 56 28 ca  71 34 c0 85 0e 26 db 9c  |W.otKV(.q4...&..|
+00000050  bb 8f 3c 3f 02 a3 d4 07  61 6e 20 93 5e 15 03 03  |..<?....an .^...|
+00000060  00 1a 00 00 00 00 00 00  00 02 6e 3c 15 67 e9 53  |..........n<.g.S|
+00000070  1d 86 d8 3a ea 6b ac fc  42 bb db 8e              |...:.k..B...|
index 8d1cadf85a79377410fa6ab981048a129851ecac..7bff8eceb067492d74f22d19a9ada9bedace988a 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 48 e2 22 70 f7  |...........H."p.|
-00000010  9a 24 ce 92 69 d1 ff fc  c0 c9 ba b2 da 8e 83 7a  |.$..i..........z|
-00000020  6e 8d 24 60 e2 e2 81 76  e6 72 37 00 00 04 00 0a  |n.$`...v.r7.....|
+00000000  16 03 01 00 97 01 00 00  93 03 03 ed c3 64 89 19  |.............d..|
+00000010  3b fd 11 f4 d8 c9 2a d5  a8 8b 18 b5 92 cb ff c1  |;.....*.........|
+00000020  10 9a b1 a7 e4 d5 bc 78  39 29 30 00 00 04 00 0a  |.......x9)0.....|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 20 44 e6 19 b2  |........... D...|
-00000010  c5 9f 95 af 90 29 b2 5c  e9 c5 29 8c a2 bd 72 49  |.....).\..)...rI|
-00000020  8d c8 ea e8 cc bd 65 d9  1c fe 95 f0 60 0e ee 13  |......e.....`...|
-00000030  ea 7b bf 59 3c 08 21 07  73 b7 04 16 a7 a5 98 2e  |.{.Y<.!.s.......|
-00000040  ab ee db c3 83 ea c8 b2  07 3e 76 a0 8f d4 8f df  |.........>v.....|
-00000050  70 91 b7 ed 12 54 e2 e7  68 cb ed 26 be 84 a9 24  |p....T..h..&...$|
-00000060  fb 89 48 49 4e 9b 14 98  82 ab 64 0c a5 a0 ec 1d  |..HIN.....d.....|
-00000070  96 b7 83 c3 14 cb de a5  97 d1 86 28 b6 d4 65 5d  |...........(..e]|
-00000080  0b 45 04 37 02 53 8c 96  5d f8 d3 14 03 03 00 01  |.E.7.S..].......|
-00000090  01 16 03 03 00 30 04 43  06 c4 96 f5 f6 23 5d 46  |.....0.C.....#]F|
-000000a0  ec 3d f4 18 44 3f f8 d2  e9 74 37 22 56 df f2 35  |.=..D?...t7"V..5|
-000000b0  3d a0 8d 8a 80 be 4e 40  66 28 4c 37 aa f7 43 cf  |=.....N@f(L7..C.|
-000000c0  9e 29 83 7b 39 28                                 |.).{9(|
+00000000  16 03 03 00 86 10 00 00  82 00 80 a3 a7 b7 b2 3e  |...............>|
+00000010  ee 37 62 8e 5b b3 d5 2e  e2 0e b9 24 70 95 4c 4c  |.7b.[......$p.LL|
+00000020  52 e5 9f a3 e2 79 7f a1  dc 93 1f 89 2e f8 a2 8e  |R....y..........|
+00000030  7b d8 82 6c 89 57 64 44  e9 61 66 aa 8d 42 ff d1  |{..l.WdD.af..B..|
+00000040  7f 62 21 55 78 e9 da 87  18 d5 51 dc 91 39 6b b9  |.b!Ux.....Q..9k.|
+00000050  8f ec 76 57 f7 03 62 fa  54 36 0c 18 ad 7c 1c 5d  |..vW..b.T6...|.]|
+00000060  ce fd b4 97 c3 98 15 fc  b5 e5 55 6b aa d5 d5 d4  |..........Uk....|
+00000070  17 9c a7 55 ee 8d d1 85  2e 92 10 32 67 72 d5 27  |...U.......2gr.'|
+00000080  0d aa b3 a9 5a ec d3 8c  df d4 7f 14 03 03 00 01  |....Z...........|
+00000090  01 16 03 03 00 30 8a 3c  9c 7d dd 50 68 ff 79 dc  |.....0.<.}.Ph.y.|
+000000a0  f4 b4 a7 73 8e de 93 01  85 a4 0c 9c cb 9a 2d 4d  |...s..........-M|
+000000b0  34 95 63 d7 73 9f c5 89  e0 81 8f a2 bd c1 3b e4  |4.c.s.........;.|
+000000c0  5a fe 5a ef 6a 75                                 |Z.Z.ju|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 30 00 00 00 00 00  |..........0.....|
-00000010  00 00 00 27 75 8a 8d 43  68 0e af 19 6d d2 63 1c  |...'u..Ch...m.c.|
-00000020  44 51 0b 86 4c fc 16 1c  77 f8 96 1e 72 3d b9 45  |DQ..L...w...r=.E|
-00000030  40 cc 70 bc 72 a3 d3 ff  f6 e5 3f 17 03 03 00 30  |@.p.r.....?....0|
-00000040  00 00 00 00 00 00 00 00  f4 cf bc 55 e6 d7 4f d2  |...........U..O.|
-00000050  8f ae 52 8d 16 d0 44 9a  c9 39 5b a7 69 bb 04 96  |..R...D..9[.i...|
-00000060  c9 d9 0c 92 a0 da b4 52  c5 dd 20 cb 4b 8c ad 51  |.......R.. .K..Q|
-00000070  15 03 03 00 20 00 00 00  00 00 00 00 00 43 52 b5  |.... ........CR.|
-00000080  d2 98 37 93 69 73 49 27  08 75 76 54 e7 39 b3 4c  |..7.isI'.uvT.9.L|
-00000090  da 48 84 00 20                                    |.H.. |
+00000010  00 00 00 f1 00 85 78 65  64 6e 44 50 3e 34 30 87  |......xednDP>40.|
+00000020  b8 c2 b4 ed 76 e2 65 0a  4c 21 68 46 ca ae 97 ea  |....v.e.L!hF....|
+00000030  a2 46 38 b3 65 b8 63 45  8f aa 4c 17 03 03 00 30  |.F8.e.cE..L....0|
+00000040  00 00 00 00 00 00 00 00  fd 9f bb a9 e3 72 fd 5f  |.............r._|
+00000050  5b b7 2d 34 e5 4c 19 f4  ef 1c ce 71 0f d3 0d a6  |[.-4.L.....q....|
+00000060  5f f2 ca b4 3b f8 eb c7  20 85 e7 92 41 8c c8 08  |_...;... ...A...|
+00000070  15 03 03 00 20 00 00 00  00 00 00 00 00 3b b8 8c  |.... ........;..|
+00000080  09 40 aa 11 20 a9 ee f7  e4 bb 80 a2 e6 5d e5 04  |.@.. ........]..|
+00000090  98 65 e8 bd 85                                    |.e...|
index e4d773d4c470db4985297f0faac8e209b6780db5..25f1269e3ae6ce6e575b3f75ab4962939efe6fdd 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 41 7b 60 d8 f5  |...........A{`..|
-00000010  1c 4a 95 f9 03 de 94 0c  b6 34 94 3c 6e 82 f2 de  |.J.......4.<n...|
-00000020  2c 28 00 98 02 56 5e 8d  53 60 da 00 00 04 00 2f  |,(...V^.S`...../|
+00000000  16 03 01 00 97 01 00 00  93 03 03 1b 05 dc 80 93  |................|
+00000010  90 62 51 a6 ce 10 03 8e  f1 02 71 53 b0 9f 80 96  |.bQ.......qS....|
+00000020  a0 48 c9 6f 1d df d9 cd  82 43 48 00 00 04 00 2f  |.H.o.....CH..../|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 15 eb 41 72 e4  |.............Ar.|
-00000010  cf 0f 8b bb 9a ea aa 2a  f1 dc 2e c9 db d8 cf bd  |.......*........|
-00000020  5e fb 86 30 98 b4 22 62  a5 32 d0 e6 3d 38 49 1a  |^..0.."b.2..=8I.|
-00000030  70 6f fa d3 81 c0 8d 00  c6 cd 80 b6 ed 26 8b 98  |po...........&..|
-00000040  3a 26 8b 8e 88 ba 61 a6  8e 19 5a 0e 51 bb 4e 9e  |:&....a...Z.Q.N.|
-00000050  a9 21 09 77 cf 42 eb 26  90 3a 08 bb c5 89 88 2c  |.!.w.B.&.:.....,|
-00000060  19 db b3 1c 7a d0 60 76  be 9a d5 0c ec df dd 11  |....z.`v........|
-00000070  9e a0 85 a5 36 3d 07 f7  36 47 52 92 cd 84 7b 2e  |....6=..6GR...{.|
-00000080  13 18 47 58 8a 00 4b 39  59 bb da 14 03 03 00 01  |..GX..K9Y.......|
-00000090  01 16 03 03 00 40 16 0e  0a 79 db 54 11 36 73 af  |.....@...y.T.6s.|
-000000a0  eb cb 9d e8 b4 42 1a f8  94 f0 fb d1 60 f8 9f 9d  |.....B......`...|
-000000b0  ba 87 f6 27 ef 54 e4 f9  f7 1f a7 61 f5 82 1a 40  |...'.T.....a...@|
-000000c0  96 81 f6 14 db 89 ec 8b  0c 37 ba 11 55 94 d3 df  |.........7..U...|
-000000d0  df 8d 61 ec a7 43                                 |..a..C|
+00000000  16 03 03 00 86 10 00 00  82 00 80 c7 bb d2 ee 1a  |................|
+00000010  38 b1 7b 2f ad ec e6 63  d3 11 f9 69 b6 7e b9 58  |8.{/...c...i.~.X|
+00000020  79 37 c9 6e e5 6b 1e ce  e5 b7 1f 69 ec 2c 71 94  |y7.n.k.....i.,q.|
+00000030  f7 27 16 66 14 24 bd bb  ca ac 80 20 68 46 6e b8  |.'.f.$..... hFn.|
+00000040  3e f4 82 07 0a b7 0c 74  a5 66 1a 86 48 52 6e 80  |>......t.f..HRn.|
+00000050  a1 88 a3 12 8c c9 ef fc  5c 90 a8 f5 2f 0a 69 ba  |........\.../.i.|
+00000060  ce 73 48 ca 25 ea be 3c  9f 1b b6 1c e9 d7 1d bf  |.sH.%..<........|
+00000070  38 0d 6f a1 ed c0 22 16  40 51 2e c3 78 5b 69 8a  |8.o...".@Q..x[i.|
+00000080  91 30 5b 15 b1 a5 c5 ea  5f 34 38 14 03 03 00 01  |.0[....._48.....|
+00000090  01 16 03 03 00 40 78 f5  31 97 86 f4 48 5c 74 8f  |.....@x.1...H\t.|
+000000a0  ac b9 49 42 cb 83 e6 d9  bc a4 6f cc 3f f3 54 66  |..IB......o.?.Tf|
+000000b0  93 01 2c 1a e3 b4 08 09  f8 41 d4 fe 2d fa ab a9  |..,......A..-...|
+000000c0  f1 47 39 13 82 11 9e 7f  04 78 08 df 13 74 97 6c  |.G9......x...t.l|
+000000d0  ba ac a8 26 90 2e                                 |...&..|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 ef 1a ed 92 e1  |................|
-00000020  e1 81 1e a8 e1 ff 2b 2b  64 89 17 55 2d ce eb be  |......++d..U-...|
-00000030  17 a6 b8 a7 55 8a c4 3b  8a 5a c7 56 7c b5 90 c9  |....U..;.Z.V|...|
-00000040  19 bc 13 07 50 91 42 2a  46 13 d1 17 03 03 00 40  |....P.B*F......@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 53 48 ab 5a 17  |...........SH.Z.|
+00000020  07 e4 14 04 4d 96 ae 33  b7 e7 6b 37 10 34 98 66  |....M..3..k7.4.f|
+00000030  b8 38 6b 30 53 17 3e af  80 34 a6 29 0c 3b 8b 05  |.8k0S.>..4.).;..|
+00000040  53 d6 53 fb 65 e3 ec 05  16 f2 c7 17 03 03 00 40  |S.S.e..........@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  9e fe 95 fa 67 a5 af 14  f0 80 fd 65 65 ac 0a 91  |....g......ee...|
-00000070  4a 1d 4a c3 de 3f 35 a7  de 10 94 55 b0 8f be e6  |J.J..?5....U....|
-00000080  76 a2 74 4c 89 47 b9 10  8f 78 a9 01 6b ac bb d9  |v.tL.G...x..k...|
+00000060  46 14 e6 50 23 20 15 9f  a4 cc 39 69 43 e7 35 ea  |F..P# ....9iC.5.|
+00000070  3c c3 71 a6 65 dc ba 66  7b 3e b8 8d bc cc 1b f5  |<.q.e..f{>......|
+00000080  2b 65 55 9b 35 c7 30 08  ff 0b 7c b7 bb 75 f1 5c  |+eU.5.0...|..u.\|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 36 ce 1a  97 3e e3 0e 62 74 70 10  |.....6...>..btp.|
-000000b0  ec a5 30 16 1f 2d e0 5b  c9 38 4d fb 61 2e 45 35  |..0..-.[.8M.a.E5|
-000000c0  4b 69 da 43 39                                    |Ki.C9|
+000000a0  00 00 00 00 00 83 b1 d6  5e 78 d8 7d 8f 22 a2 c9  |........^x.}."..|
+000000b0  81 2d 47 ed 7e a5 65 10  af a0 b4 01 be b3 70 a8  |.-G.~.e.......p.|
+000000c0  9f 5a 07 87 f5                                    |.Z...|
index 01f961208fa1c454943136318026e0785ca06786..9f48c75bab2a9ed69633a55eabfbef67fb2df18b 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 d3 6a 87 ad b2  |............j...|
-00000010  a0 59 86 0e 34 86 c1 b3  c9 64 17 92 aa 87 04 05  |.Y..4....d......|
-00000020  32 d4 2e aa a1 48 94 87  82 a7 ab 00 00 04 c0 2f  |2....H........./|
+00000000  16 03 01 00 97 01 00 00  93 03 03 6d 19 64 2c f0  |...........m.d,.|
+00000010  95 79 38 26 9b e3 db b3  97 ce f8 9c 46 62 08 15  |.y8&........Fb..|
+00000020  a0 f0 7f 20 38 52 bb 27  f8 3b 60 00 00 04 c0 2f  |... 8R.'.;`..../|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
 000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
 000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 08 04 00 80 65 2f 82  18 27 04 84 db 3d c6 5e  |t....e/..'...=.^|
-000002d0  6b 33 f9 87 59 e1 06 0c  ce a7 3a f9 bd e7 54 47  |k3..Y.....:...TG|
-000002e0  03 58 f7 0b a3 16 6a 47  4b 61 b6 d9 0d 04 c8 95  |.X....jGKa......|
-000002f0  f5 d5 e5 0f 1b d2 26 3b  c5 67 c0 87 dd a5 da a8  |......&;.g......|
-00000300  e1 7e 52 a1 6a 0d 10 e8  dd 2e 09 39 21 3e a2 0f  |.~R.j......9!>..|
-00000310  a2 00 e4 a1 a6 df a8 3f  5d 1b d7 22 f8 b8 b5 32  |.......?].."...2|
-00000320  31 3a 36 16 9e 6c ab f1  d5 25 ae 3c 4a 11 c8 ae  |1:6..l...%.<J...|
-00000330  de e1 e6 b5 84 0b 3e 9d  63 75 6f b6 ba e9 fa 0a  |......>.cuo.....|
-00000340  11 40 c9 7f ca 16 03 03  00 04 0e 00 00 00        |.@............|
+000002c0  74 04 01 00 80 99 cc 0d  3d 25 73 2d 21 00 0d 42  |t.......=%s-!..B|
+000002d0  d1 6f 9e ba f4 04 58 30  5f a0 33 e9 b0 3a 69 6d  |.o....X0_.3..:im|
+000002e0  e2 a1 f2 74 f7 09 e7 ef  fb cd 56 22 93 1c 56 8e  |...t......V"..V.|
+000002f0  8f 87 4b 1d 54 f6 34 fd  e6 e0 2f 85 88 9a ab c9  |..K.T.4.../.....|
+00000300  b5 38 cd f3 44 20 7a 68  fd bf 10 ea 14 7e ae 21  |.8..D zh.....~.!|
+00000310  12 ad eb 91 2f 99 44 fb  cf 9e fe 21 19 9f d1 a0  |..../.D....!....|
+00000320  37 19 9e 48 92 0e 80 b7  51 95 45 ee 75 86 f9 52  |7..H....Q.E.u..R|
+00000330  5a f8 67 65 56 af 4d f8  ca 92 8f b7 2a f5 be c1  |Z.geV.M.....*...|
+00000340  04 e0 03 e1 b6 16 03 03  00 04 0e 00 00 00        |..............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 d1 f3 61 78 d1 34  |....%...! ..ax.4|
-00000010  36 b4 9f 5e e5 24 1e 48  02 be f0 13 c2 3d b0 ce  |6..^.$.H.....=..|
-00000020  fb 96 39 6b 96 76 aa 87  18 41 14 03 03 00 01 01  |..9k.v...A......|
-00000030  16 03 03 00 28 27 e1 50  92 20 e1 2c 98 b6 15 8f  |....('.P. .,....|
-00000040  dd bd 26 98 04 12 5d cb  29 66 ab 2d 37 f3 8e eb  |..&...].)f.-7...|
-00000050  3e 14 3b cf 4d 99 c4 2e  ea 7c 04 a5 45           |>.;.M....|..E|
+00000000  16 03 03 00 25 10 00 00  21 20 20 74 90 bd 53 18  |....%...!  t..S.|
+00000010  33 c6 a5 bf 51 71 f7 d7  c3 0c 7f 89 ad b3 73 7b  |3...Qq........s{|
+00000020  48 2f c1 ef 85 32 03 73  28 3b 14 03 03 00 01 01  |H/...2.s(;......|
+00000030  16 03 03 00 28 94 4f 85  68 15 57 b4 8f f4 21 a7  |....(.O.h.W...!.|
+00000040  e5 be 84 7d 3a e0 29 bd  99 20 24 d0 6b 9c 72 3a  |...}:.).. $.k.r:|
+00000050  fc f9 5d 1c 7e cb dd 7a  3b 7c 53 e6 3a           |..].~..z;|S.:|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 88 39 9d c1 8d  8c bb c4 79 ba a5 2a bd  |....9......y..*.|
-00000020  34 62 bf 66 85 b5 cd 2e  f7 1e 6e b4 96 1c f6 b3  |4b.f......n.....|
-00000030  13 ba c9 17 03 03 00 25  00 00 00 00 00 00 00 01  |.......%........|
-00000040  c3 ca b5 57 11 26 ec 18  be 00 6c 8b 79 a5 ed f7  |...W.&....l.y...|
-00000050  7d ae 42 ff a2 8b fb 68  d0 08 0f 2e d1 15 03 03  |}.B....h........|
-00000060  00 1a 00 00 00 00 00 00  00 02 58 ad 11 d2 74 5c  |..........X...t\|
-00000070  17 f2 60 e5 d9 fa 0e 47  5a 48 31 f7              |..`....GZH1.|
+00000010  00 00 00 e3 4f 34 0e 47  ae f2 62 e3 aa 62 f3 37  |....O4.G..b..b.7|
+00000020  cf 78 ba 1d 8a 3c d8 29  0c 3c 9d 0c fa ff fd 9b  |.x...<.).<......|
+00000030  65 1b 3f 17 03 03 00 25  00 00 00 00 00 00 00 01  |e.?....%........|
+00000040  fd e1 49 0e 0d 9f a1 51  9e 19 5c 80 a5 15 dc 05  |..I....Q..\.....|
+00000050  ca f0 46 b3 da 03 5a 32  da 4e 2e 3d 33 15 03 03  |..F...Z2.N.=3...|
+00000060  00 1a 00 00 00 00 00 00  00 02 51 78 d9 14 6e a8  |..........Qx..n.|
+00000070  f4 62 60 6d db e0 d5 8c  c5 17 ac aa              |.b`m........|
index 83a37e0587e043131d22b7902379c7b4746eb672..f6e5856f9cc1d1b3bd8690098467b562a3ac54ce 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 39 40 da f7 9f  |...........9@...|
-00000010  e9 66 91 25 2a d0 74 e1  71 4b 74 ff 47 41 5e f4  |.f.%*.t.qKt.GA^.|
-00000020  d2 71 d0 3e 96 8e 8e 31  ee 81 8b 00 00 04 c0 30  |.q.>...1.......0|
+00000000  16 03 01 00 97 01 00 00  93 03 03 5e 39 96 57 2e  |...........^9.W.|
+00000010  de 43 bd 55 30 40 20 95  29 a0 38 7f 69 a3 02 4d  |.C.U0@ .).8.i..M|
+00000020  df 59 4b 17 f1 d6 0b 2e  87 62 af 00 00 04 c0 30  |.YK......b.....0|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
 000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
 000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 08 04 00 80 67 b9 f4  b4 4e 00 7c 40 80 f1 77  |t....g...N.|@..w|
-000002d0  2e 09 f6 04 17 bb ab f6  e1 13 03 b3 b6 71 22 0b  |.............q".|
-000002e0  38 49 98 65 54 db 3b e0  71 17 2a f3 d4 2a 0d 7e  |8I.eT.;.q.*..*.~|
-000002f0  af 56 37 ea a9 1e df 45  24 fd 90 ad 5e 3c aa 2e  |.V7....E$...^<..|
-00000300  98 74 b5 dc b5 22 0e 77  70 66 2f 6e d7 49 f6 a1  |.t...".wpf/n.I..|
-00000310  93 c9 0a ce 45 2b 55 bb  02 a3 b1 1d 5f 45 08 cd  |....E+U....._E..|
-00000320  4d 34 9e ef 27 f2 f0 af  a8 bd 14 60 45 df b4 54  |M4..'......`E..T|
-00000330  2c 6f c8 c8 dc f1 07 9a  e8 f3 f3 40 1d 29 39 9e  |,o.........@.)9.|
-00000340  a0 28 3a 19 de 16 03 03  00 04 0e 00 00 00        |.(:...........|
+000002c0  74 04 01 00 80 c0 53 9b  58 b3 88 7a 7d 7d 0f 8c  |t.....S.X..z}}..|
+000002d0  c4 10 e3 13 92 ae b4 87  ae a5 e2 2f f9 f0 db a0  |.........../....|
+000002e0  55 72 00 2f 29 eb 12 13  f7 bf 4b 44 be f2 85 f2  |Ur./).....KD....|
+000002f0  00 2d 2c 6a 14 21 44 d5  f8 78 99 67 07 db 27 74  |.-,j.!D..x.g..'t|
+00000300  32 9d 75 8d 7e f5 c2 9b  3e ce 3b aa f4 3a 1d 2d  |2.u.~...>.;..:.-|
+00000310  69 e3 0b 1e a0 95 d9 dc  47 73 42 14 7c 13 60 1f  |i.......GsB.|.`.|
+00000320  73 a9 0f 3b 64 33 18 67  b0 a3 69 f7 da 1d cd d0  |s..;d3.g..i.....|
+00000330  ea 65 9d 79 af aa a6 7f  ea ba 8a c7 d7 3f 80 76  |.e.y.........?.v|
+00000340  73 b0 c4 41 30 16 03 03  00 04 0e 00 00 00        |s..A0.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 73 eb 70 45 10 e4  |....%...! s.pE..|
-00000010  a7 a6 35 b2 51 59 1e 6d  65 9a 0e d4 5a c2 39 13  |..5.QY.me...Z.9.|
-00000020  81 83 41 f8 60 0c 6b 0e  7f 4c 14 03 03 00 01 01  |..A.`.k..L......|
-00000030  16 03 03 00 28 44 ed a7  2b dc 7a 00 b5 26 bd 56  |....(D..+.z..&.V|
-00000040  0d b7 47 f3 2c d8 b7 c5  f6 21 3a e6 1f b8 fd 3a  |..G.,....!:....:|
-00000050  f8 44 65 0d 6e fd b8 32  cf dd f5 25 ce           |.De.n..2...%.|
+00000000  16 03 03 00 25 10 00 00  21 20 75 56 9a 51 e6 99  |....%...! uV.Q..|
+00000010  e2 7f 36 c6 3e 7b e0 17  2a 28 73 77 24 6c e9 af  |..6.>{..*(sw$l..|
+00000020  76 68 30 6a 07 4f 49 26  45 6d 14 03 03 00 01 01  |vh0j.OI&Em......|
+00000030  16 03 03 00 28 8e 42 ee  25 3a e2 8a 1a 51 f1 0c  |....(.B.%:...Q..|
+00000040  5b ce d2 2f 2b 86 c6 0f  10 d2 e2 44 da d8 4f 88  |[../+......D..O.|
+00000050  b5 2b 9c 9f 21 06 da 76  93 06 42 43 1f           |.+..!..v..BC.|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 cb e9 44 b4 25  7e a5 9d ed 8e 8b 5c 4c  |.....D.%~.....\L|
-00000020  b9 c4 85 5b 9b 03 02 34  2c 61 40 fe 4a 84 9d 42  |...[...4,a@.J..B|
-00000030  67 67 53 17 03 03 00 25  00 00 00 00 00 00 00 01  |ggS....%........|
-00000040  ec a1 21 b6 85 61 d1 35  71 50 c1 6d 4d 32 81 3f  |..!..a.5qP.mM2.?|
-00000050  24 38 1d 8a 45 f7 9e 14  3b be e9 ec 37 15 03 03  |$8..E...;...7...|
-00000060  00 1a 00 00 00 00 00 00  00 02 f7 76 a1 1b bb 55  |...........v...U|
-00000070  aa 1d 10 c2 07 61 b3 0d  54 2d 6b e4              |.....a..T-k.|
+00000010  00 00 00 7c d4 b3 85 ea  5e 0c 8d 81 0c 7c 99 90  |...|....^....|..|
+00000020  5f fd cc 32 b5 d8 fd 0c  0a 9c 93 a5 35 4d a8 50  |_..2........5M.P|
+00000030  a8 6f 73 17 03 03 00 25  00 00 00 00 00 00 00 01  |.os....%........|
+00000040  49 5c 12 84 e7 cb a4 fb  b1 55 be 89 79 5c a8 df  |I\.......U..y\..|
+00000050  ab 0a e1 1b 98 e6 0f 40  fb f4 47 1f e1 15 03 03  |.......@..G.....|
+00000060  00 1a 00 00 00 00 00 00  00 02 e7 17 b1 82 70 75  |..............pu|
+00000070  42 d5 8f 2e 29 4b b3 a1  a2 3f c2 f8              |B...)K...?..|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled b/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled
deleted file mode 100644 (file)
index 302e64e..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 cb 01 00 00  c7 03 03 ed 3d 3e 10 95  |............=>..|
-00000010  8b 6f 6c be 5c b7 77 c0  79 91 f8 b3 6f 52 27 18  |.ol.\.w.y...oR'.|
-00000020  0a b7 88 52 df 3c 6c 87  b4 5a 4c 00 00 38 c0 2c  |...R.<l..ZL..8.,|
-00000030  c0 30 00 9f cc a9 cc a8  cc aa c0 2b c0 2f 00 9e  |.0.........+./..|
-00000040  c0 24 c0 28 00 6b c0 23  c0 27 00 67 c0 0a c0 14  |.$.(.k.#.'.g....|
-00000050  00 39 c0 09 c0 13 00 33  00 9d 00 9c 00 3d 00 3c  |.9.....3.....=.<|
-00000060  00 35 00 2f 00 ff 01 00  00 66 00 00 00 0e 00 0c  |.5./.....f......|
-00000070  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
-00000080  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
-00000090  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 30  |...............0|
-000000a0  00 2e 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
-000000b0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 03 03  |................|
-000000c0  02 03 03 01 02 01 03 02  02 02 04 02 05 02 06 02  |................|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 30 00 00  |...DOWNGRD...0..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
-000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
-000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 04 01 00 80 a5 a9 75  be 51 ff dc b3 bb 77 79  |t......u.Q....wy|
-000002d0  ef 5b 9f d9 27 6c 76 ea  ce 5c 66 20 03 2e 94 fd  |.[..'lv..\f ....|
-000002e0  28 94 69 ff 06 ab bd 34  43 51 72 fb 15 42 e6 38  |(.i....4CQr..B.8|
-000002f0  c5 7a 5d 7f 35 a7 3c 85  ec df 95 23 0f 28 c7 dc  |.z].5.<....#.(..|
-00000300  0e a6 ec fe 5e 77 3f 95  1d a7 73 1d d8 7b 68 92  |....^w?...s..{h.|
-00000310  5b a5 b8 ba f5 7c a5 60  2e 43 d6 60 64 3e 33 c7  |[....|.`.C.`d>3.|
-00000320  8b c2 56 68 e3 28 2b 2e  8b 9a 85 29 77 73 24 3e  |..Vh.(+....)ws$>|
-00000330  2b 95 b8 40 a7 f1 60 b5  9e 85 3e 1d ae ab 7f 85  |+..@..`...>.....|
-00000340  63 63 d1 cf 62 16 03 03  00 04 0e 00 00 00        |cc..b.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 43 dd 3e 28 34 9f  |....%...! C.>(4.|
-00000010  a9 0c 8e 14 66 01 a1 dd  15 8e 71 b4 05 83 d9 a3  |....f.....q.....|
-00000020  5f 5c a3 31 ad 5c d5 5a  ad 56 14 03 03 00 01 01  |_\.1.\.Z.V......|
-00000030  16 03 03 00 28 f3 ad d2  ec 9e 1e 85 2d 96 5f bc  |....(.......-._.|
-00000040  70 cc 0a c2 22 ef 0a fe  fb b0 77 f1 59 59 08 a6  |p...".....w.YY..|
-00000050  57 39 16 00 82 0b 60 1e  9a 74 75 3a 8a           |W9....`..tu:.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 cf 63 14 29 73  c7 7b 6c 98 50 db 5f 8e  |....c.)s.{l.P._.|
-00000020  f4 de 68 bc c0 60 2c db  9e 1f d9 48 55 51 05 47  |..h..`,....HUQ.G|
-00000030  7e 43 37 17 03 03 00 25  00 00 00 00 00 00 00 01  |~C7....%........|
-00000040  67 0a e7 77 dd 1a 30 87  27 90 b0 42 31 42 09 53  |g..w..0.'..B1B.S|
-00000050  03 bf 0c 10 3a c3 a7 95  e9 6e 63 57 ad 15 03 03  |....:....ncW....|
-00000060  00 1a 00 00 00 00 00 00  00 02 d5 1a ac 66 50 93  |.............fP.|
-00000070  46 0a da 98 1f cc 30 40  c1 47 c7 88              |F.....0@.G..|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required b/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required
deleted file mode 100644 (file)
index 9e9570f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 91 01 00 00  8d 03 03 5a 8a 66 22 31  |...........Z.f"1|
-00000010  69 92 30 d5 7b 7c 17 a7  7c 14 d6 3c a9 9e ba dd  |i.0.{|..|..<....|
-00000020  7c 73 fe b4 b4 dd d8 28  39 32 0d 00 00 2a c0 30  ||s.....(92...*.0|
-00000030  00 9f cc a8 cc aa c0 2f  00 9e c0 28 00 6b c0 27  |......./...(.k.'|
-00000040  00 67 c0 14 00 39 c0 13  00 33 00 9d 00 9c 00 3d  |.g...9...3.....=|
-00000050  00 3c 00 35 00 2f 00 ff  01 00 00 3a 00 00 00 0e  |.<.5./.....:....|
-00000060  00 0c 00 00 09 31 32 37  2e 30 2e 30 2e 31 00 0b  |.....127.0.0.1..|
-00000070  00 04 03 00 01 02 00 0a  00 0c 00 0a 00 1d 00 17  |................|
-00000080  00 1e 00 19 00 18 00 16  00 00 00 17 00 00 00 0d  |................|
-00000090  00 04 00 02 08 04                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 30 00 00  |...DOWNGRD...0..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 15 03 03 00  02 02 28                 |;.........(|
index da549aa32e05acacd57708b90a719b6bb1c3569f..78ea1ff9293eb3e7a6e094e17520ee86076afe5f 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 c7 7f 29 46 41  |.............)FA|
-00000010  08 97 7c 3f 77 e0 11 8f  14 30 23 3e fa fc ca f3  |..|?w....0#>....|
-00000020  45 10 83 10 1f 8f 25 b6  9d c1 4d 00 00 04 00 05  |E.....%...M.....|
+00000000  16 03 01 00 97 01 00 00  93 03 03 32 12 2b 12 44  |...........2.+.D|
+00000010  4f 0c 98 c0 fc f6 44 06  3a b1 64 89 a5 8b f4 e4  |O.....D.:.d.....|
+00000020  73 e1 60 1e 51 38 92 f3  83 f3 9f 00 00 04 00 05  |s.`.Q8..........|
 00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 d1 b0 57 28 da  |.............W(.|
-00000010  7a f8 46 7c c2 24 0d e0  04 48 33 d4 bc d7 f0 d0  |z.F|.$...H3.....|
-00000020  85 fb ff 22 27 20 91 42  19 55 7b ef d8 fd 72 42  |..."' .B.U{...rB|
-00000030  75 e6 71 e4 9f 67 30 72  68 b6 0e 00 34 d3 2f b8  |u.q..g0rh...4./.|
-00000040  23 1b 00 43 17 68 fd 0f  90 ee 97 16 23 36 90 02  |#..C.h......#6..|
-00000050  5c 71 10 03 80 ea 74 ef  a4 5a ac e4 9f 48 f0 76  |\q....t..Z...H.v|
-00000060  62 43 17 05 7c 8f 59 1d  16 b1 97 48 99 8d 66 5e  |bC..|.Y....H..f^|
-00000070  83 20 b3 02 e4 ac 73 52  b2 24 21 06 5a 49 89 df  |. ....sR.$!.ZI..|
-00000080  4b ad 4e f4 a9 7b 0c 3a  b1 39 5d 14 03 03 00 01  |K.N..{.:.9].....|
-00000090  01 16 03 03 00 24 8b de  7e 10 53 71 e0 0b 68 f6  |.....$..~.Sq..h.|
-000000a0  36 67 66 c2 b9 0a c0 3e  39 0d ab 2e eb 5e eb 06  |6gf....>9....^..|
-000000b0  a6 45 2b d7 48 8f c0 5e  f3 a0                    |.E+.H..^..|
+00000000  16 03 03 00 86 10 00 00  82 00 80 85 ad 31 da a9  |.............1..|
+00000010  fd 0f 5c ca aa 28 d1 08  7d 76 b4 5b b2 09 f4 e0  |..\..(..}v.[....|
+00000020  65 3a 82 7e f8 03 5f c9  82 ae fb 04 f8 f1 dc bc  |e:.~.._.........|
+00000030  b9 2f e8 b4 4c b0 5a de  c8 99 88 99 0b 03 ed 7f  |./..L.Z.........|
+00000040  e4 84 a0 6b 6d 55 1e f6  ea 9f 5a 55 1e 5c e5 f1  |...kmU....ZU.\..|
+00000050  f4 8a f3 7b 7c 20 fc 4b  5d 31 98 c3 bb ce ba 6a  |...{| .K]1.....j|
+00000060  e8 e5 58 a1 db 5a 84 7d  ef cd 17 52 2f 66 31 d2  |..X..Z.}...R/f1.|
+00000070  27 e4 29 1c 9e e0 39 a9  e0 7f 5f 25 d7 49 95 28  |'.)...9..._%.I.(|
+00000080  08 67 1e 25 5f 12 39 b0  a5 63 85 14 03 03 00 01  |.g.%_.9..c......|
+00000090  01 16 03 03 00 24 88 e9  9e 1d 16 8f f7 6e b1 c9  |.....$.......n..|
+000000a0  06 dc 50 e7 40 da 21 84  de 97 e6 a2 8d 78 96 9a  |..P.@.!......x..|
+000000b0  39 9d aa 91 43 15 0f cf  f4 e9                    |9...C.....|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 ee dc 70 d2 3a  |..........$..p.:|
-00000010  f1 9c c6 c8 01 01 84 4f  3c 95 a3 ac 7a 78 92 3d  |.......O<...zx.=|
-00000020  8c 05 a1 db 34 fe 92 f2  9e f3 81 a1 33 a5 7f 17  |....4.......3...|
-00000030  03 03 00 21 6e a9 f8 f9  99 0b c1 f5 8a d0 ab 93  |...!n...........|
-00000040  15 4d 2f 24 1c 0b 43 77  cf 14 60 87 b0 8d f7 80  |.M/$..Cw..`.....|
-00000050  c0 69 ea f6 9e 15 03 03  00 16 ef 09 73 d8 06 ec  |.i..........s...|
-00000060  b8 02 14 9c d3 39 32 d4  3d 94 ec 17 79 1d a9 d3  |.....92.=...y...|
+00000000  14 03 03 00 01 01 16 03  03 00 24 c5 34 41 0f 31  |..........$.4A.1|
+00000010  5a 94 d7 4b a9 0a 4e bf  b9 22 ec 76 2c 1f f5 e9  |Z..K..N..".v,...|
+00000020  6b 7b 26 df 41 62 91 b6  dc db 23 2b 8d 3d 49 17  |k{&.Ab....#+.=I.|
+00000030  03 03 00 21 72 31 77 51  94 c5 d4 eb 7c 18 ab 87  |...!r1wQ....|...|
+00000040  29 43 3b c5 78 aa 5c 4a  06 d3 42 5c 61 39 86 12  |)C;.x.\J..B\a9..|
+00000050  b1 ae f6 f7 97 15 03 03  00 16 8a 0e 1d 5c e0 18  |.............\..|
+00000060  12 93 ac 6c 69 32 59 b8  15 88 82 1c 97 f3 5b 9c  |...li2Y.......[.|
index 6d98a309ee9b494fbbc88285219ca791db560d8a..2c5237153a757a28a91e64a54e3dbff3245f4667 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 91 01 00 00  8d 03 03 c1 6b f6 4d 77  |............k.Mw|
-00000010  95 dc 8a 54 04 62 4a b4  dc e3 06 51 b8 88 4e 9f  |...T.bJ....Q..N.|
-00000020  9a f5 2b 87 82 51 df e9  54 c7 93 00 00 2a c0 30  |..+..Q..T....*.0|
+00000000  16 03 01 00 91 01 00 00  8d 03 03 96 d3 ee ca ff  |................|
+00000010  77 00 8c e4 14 3a ee 2a  bb 39 8c 62 72 c7 ae 46  |w....:.*.9.br..F|
+00000020  8c 7e 8e 90 96 f1 c3 27  4d 37 3f 00 00 2a c0 30  |.~.....'M7?..*.0|
 00000030  00 9f cc a8 cc aa c0 2f  00 9e c0 28 00 6b c0 27  |......./...(.k.'|
 00000040  00 67 c0 14 00 39 c0 13  00 33 00 9d 00 9c 00 3d  |.g...9...3.....=|
 00000050  00 3c 00 35 00 2f 00 ff  01 00 00 3a 00 00 00 0e  |.<.5./.....:....|
 00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
 000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
 000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 04 01 00 80 15 c5 ee  da 37 f8 6d b8 9e 7c 68  |t........7.m..|h|
-000002d0  b2 08 2a 8d 79 6c 6e 95  4e b5 6f 8e 84 24 31 d4  |..*.yln.N.o..$1.|
-000002e0  e7 8c 6c 7e 9c 58 a4 fe  18 59 aa f7 0d 7d ff 7a  |..l~.X...Y...}.z|
-000002f0  f2 b0 eb b6 d3 4f fa 3f  36 0d 2e 43 8e d7 96 14  |.....O.?6..C....|
-00000300  99 a0 34 6a 51 cf 49 48  2f 6a 69 3b e4 ec 8b 61  |..4jQ.IH/ji;...a|
-00000310  a1 f4 ea 20 c5 72 90 b1  c6 54 75 42 4e f6 1f 12  |... .r...TuBN...|
-00000320  da e1 98 36 01 02 30 b4  75 7b 4f 4b f1 4f ac 20  |...6..0.u{OK.O. |
-00000330  ac c8 d2 0f 8f 2a 00 09  b8 2c ab 9e 5f b2 ce 25  |.....*...,.._..%|
-00000340  e3 a3 27 9d 53 16 03 03  00 04 0e 00 00 00        |..'.S.........|
+000002c0  74 04 01 00 80 c9 24 3c  3d dd 65 45 f8 e4 92 b9  |t.....$<=.eE....|
+000002d0  2b 03 c2 9f f5 73 1f 84  dd 9b da 82 2b 44 7c f1  |+....s......+D|.|
+000002e0  7c 55 d8 53 39 e9 d9 ea  f1 6a 23 7f b0 aa 30 94  ||U.S9....j#...0.|
+000002f0  37 b7 06 59 1a fc 09 ba  d9 68 f7 c8 96 5d 80 e1  |7..Y.....h...]..|
+00000300  7c f4 1b 36 0a 8a dd 2e  c5 d0 27 da 4a 75 98 fb  ||..6......'.Ju..|
+00000310  43 51 3f 8e 95 0d 7b 42  93 8a d5 dc 55 59 ef 69  |CQ?...{B....UY.i|
+00000320  91 82 a3 d8 7e 54 a4 7b  05 17 06 58 21 62 79 b7  |....~T.{...X!by.|
+00000330  67 bd ac 8c 9e 23 73 01  17 49 4b 5d 24 7a 29 0b  |g....#s..IK]$z).|
+00000340  05 ec 24 1e cb 16 03 03  00 04 0e 00 00 00        |..$...........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 fe 11 76 84 dd 42  |....%...! ..v..B|
-00000010  d9 fd ad 50 81 7e 62 d4  38 cb b3 5d ec c8 5a 7a  |...P.~b.8..]..Zz|
-00000020  40 d9 10 23 2f e6 c7 a8  95 3b 14 03 03 00 01 01  |@..#/....;......|
-00000030  16 03 03 00 28 61 18 1a  65 0c 24 59 01 fe 28 fc  |....(a..e.$Y..(.|
-00000040  4f 7f d9 c5 6d b7 bf 9c  5c 8b dc 91 e7 48 40 72  |O...m...\....H@r|
-00000050  06 4d 49 a4 4d 32 e2 10  b9 36 a4 06 a6           |.MI.M2...6...|
+00000000  16 03 03 00 25 10 00 00  21 20 8e 76 7a 64 15 47  |....%...! .vzd.G|
+00000010  60 08 88 f8 3c ca 23 ce  e3 f1 52 18 e0 94 6f 7a  |`...<.#...R...oz|
+00000020  be 7b 39 c6 42 eb 14 d9  f3 7a 14 03 03 00 01 01  |.{9.B....z......|
+00000030  16 03 03 00 28 a8 16 b6  f4 4e 1e f1 5a 8a 04 a5  |....(....N..Z...|
+00000040  4b a0 40 b1 9f 7e e7 42  22 45 01 03 52 5a 11 53  |K.@..~.B"E..RZ.S|
+00000050  c1 1f a7 19 14 c0 9c d8  53 c3 41 ae 6f           |........S.A.o|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 6c 7b 84 e6 84  d3 31 8e 6a 3e e7 7e f2  |...l{....1.j>.~.|
-00000020  94 16 6c 6f 01 a9 2d f7  de 5d 94 b2 9c 4b f0 51  |..lo..-..]...K.Q|
-00000030  70 9e 3c 17 03 03 00 25  00 00 00 00 00 00 00 01  |p.<....%........|
-00000040  94 ca c5 e7 58 20 7d 3b  74 9d e0 97 a2 dd 63 ab  |....X };t.....c.|
-00000050  33 08 2f 16 69 59 ba 0e  82 52 75 98 eb 15 03 03  |3./.iY...Ru.....|
-00000060  00 1a 00 00 00 00 00 00  00 02 fc 38 72 72 09 6a  |...........8rr.j|
-00000070  ee c0 61 39 50 71 ad d3  ec a9 d1 0e              |..a9Pq......|
+00000010  00 00 00 e8 93 95 10 51  dd 7c d1 07 72 73 c1 9d  |.......Q.|..rs..|
+00000020  6b 2a 47 ce f5 56 3f e0  2f c4 41 97 ea 6d 83 07  |k*G..V?./.A..m..|
+00000030  3f 80 f5 17 03 03 00 25  00 00 00 00 00 00 00 01  |?......%........|
+00000040  44 c5 ed 59 85 39 66 98  bb de 1a d3 03 f3 29 94  |D..Y.9f.......).|
+00000050  4a 53 bd 25 bc 0a 23 11  10 68 c7 15 ad 15 03 03  |JS.%..#..h......|
+00000060  00 1a 00 00 00 00 00 00  00 02 c8 a1 07 6c d8 6a  |.............l.j|
+00000070  cc f8 6a 5b d1 8c 32 93  71 23 c8 71              |..j[..2.q#.q|
index 5ec0f25a17e8610904db0db87e7ca61a71f0585e..c260afe296ba005428a79e118a41df3c80ceedf9 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 91 01 00 00  8d 03 03 0f 06 da 7d 85  |..............}.|
-00000010  33 d8 3c c3 ad c5 19 f8  06 d8 f6 02 80 9a fb 8c  |3.<.............|
-00000020  55 a5 6b 67 c4 6e 68 11  74 61 28 00 00 2a c0 30  |U.kg.nh.ta(..*.0|
+00000000  16 03 01 00 91 01 00 00  8d 03 03 de a3 85 5b 56  |..............[V|
+00000010  34 e4 d0 57 07 66 8d 3c  39 00 eb 27 02 22 c9 f3  |4..W.f.<9..'."..|
+00000020  23 a6 5e 08 3a 6d 06 09  8f d9 00 00 00 2a c0 30  |#.^.:m.......*.0|
 00000030  00 9f cc a8 cc aa c0 2f  00 9e c0 28 00 6b c0 27  |......./...(.k.'|
 00000040  00 67 c0 14 00 39 c0 13  00 33 00 9d 00 9c 00 3d  |.g...9...3.....=|
 00000050  00 3c 00 35 00 2f 00 ff  01 00 00 3a 00 00 00 0e  |.<.5./.....:....|
 00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
 00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
-000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
-000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 08 04 00 80 49 30 b1  a5 47 19 7f a7 35 61 cb  |t....I0..G...5a.|
-000002d0  dc 41 47 f0 6a 96 e1 63  48 d9 4f d3 a4 ac 06 46  |.AG.j..cH.O....F|
-000002e0  f2 8d 07 95 25 c6 61 59  4a df 35 2e ce dd 71 7e  |....%.aYJ.5...q~|
-000002f0  1e d6 f4 9f 43 93 84 35  6a 98 41 45 16 ee cb 14  |....C..5j.AE....|
-00000300  dd bb 52 27 08 d5 a2 39  e7 6e f6 d6 e4 c6 bd f3  |..R'...9.n......|
-00000310  b6 9b 6d 61 30 2a 07 c6  04 39 87 fd 99 00 15 78  |..ma0*...9.....x|
-00000320  3d bf 20 8c b9 52 fb 5d  c7 b7 77 78 fb 77 2a ac  |=. ..R.]..wx.w*.|
-00000330  f5 3e e5 4b 8f 4d 9b ca  c2 33 1c 66 3c cb e0 1f  |.>.K.M...3.f<...|
-00000340  81 36 78 39 70 16 03 03  00 04 0e 00 00 00        |.6x9p.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 79 9a e7 42 96 52  |....%...! y..B.R|
-00000010  f6 52 7d 10 9a 36 9b aa  a7 2f 96 be 5b 0a 3b 40  |.R}..6.../..[.;@|
-00000020  d9 32 3a 0b 17 7b 8d 92  7c 7b 14 03 03 00 01 01  |.2:..{..|{......|
-00000030  16 03 03 00 28 92 3e da  41 d2 87 60 b3 e1 4f f7  |....(.>.A..`..O.|
-00000040  bb b7 09 50 47 2e 05 d5  fe f6 ed 94 ba 3b 60 aa  |...PG........;`.|
-00000050  38 2d b2 38 c7 07 64 63  dd ca 1a 8e ae           |8-.8..dc.....|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 8e c6 6e 45 21  eb 35 11 7a b5 74 d7 f7  |.....nE!.5.z.t..|
-00000020  67 53 15 23 9d 61 a1 bc  20 10 c8 8e 7e ee 45 fc  |gS.#.a.. ...~.E.|
-00000030  60 13 20 17 03 03 00 25  00 00 00 00 00 00 00 01  |`. ....%........|
-00000040  bf f9 63 b5 b1 39 70 43  c7 62 38 be d1 f5 0d a5  |..c..9pC.b8.....|
-00000050  87 91 95 71 ab 03 c2 08  d0 38 dc 70 9a 15 03 03  |...q.....8.p....|
-00000060  00 1a 00 00 00 00 00 00  00 02 0c 6f b1 f5 45 6d  |...........o..Em|
-00000070  44 2c 1f ec a4 fa 5c c1  aa 23 1e 82              |D,....\..#..|
+00000290  3b e9 fa e7 15 03 03 00  02 02 28                 |;.........(|
index f1c35527d201482d2d79dc51792fa82acb777e3e..380db2abb217b8b2997933448ac7ae0133181782 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 4d 04 34 4d c9  |...........M.4M.|
-00000010  52 17 f0 1c 49 b6 2b d1  a0 16 a2 04 f4 d3 7c ca  |R...I.+.......|.|
-00000020  3d 4e 41 44 3d de 29 60  32 d6 a7 00 00 04 00 2f  |=NAD=.)`2....../|
+00000000  16 03 01 00 99 01 00 00  95 03 03 dd e8 cc 23 63  |..............#c|
+00000010  70 38 e5 f9 db 6c 77 0b  be e9 53 ad 06 97 cb 02  |p8...lw...S.....|
+00000020  d4 a7 bc d2 68 80 bf b8  0c 51 bc 00 00 04 00 2f  |....h....Q...../|
 00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
 00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
 00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 ca 5a ef 73 b7  |............Z.s.|
-00000010  e2 11 b7 9a 45 22 8f 0d  44 ca 44 77 c0 ec 67 95  |....E"..D.Dw..g.|
-00000020  cc 63 2a 55 65 69 34 93  a2 64 fa f8 c0 db 56 91  |.c*Uei4..d....V.|
-00000030  d2 50 d4 a8 8c 89 13 e6  c0 ce 2b 26 46 cb ea 39  |.P........+&F..9|
-00000040  66 4c 89 58 8d 8a da 9c  bd 16 b3 28 40 a1 6f f8  |fL.X.......(@.o.|
-00000050  f7 f5 d9 9f d1 cd 44 ca  b5 ed 19 ea ec fa 97 2d  |......D........-|
-00000060  87 a5 c2 a8 1e f0 0c 70  fd fc a7 e7 1b dc 0c 99  |.......p........|
-00000070  d0 1f 6d 68 df 64 8f cb  ce 7b 3e 38 ab 9d b3 ba  |..mh.d...{>8....|
-00000080  66 a4 17 60 d6 fd ab 1d  d8 a2 b4 14 03 03 00 01  |f..`............|
-00000090  01 16 03 03 00 40 31 e3  94 eb 85 21 63 5e 29 b8  |.....@1....!c^).|
-000000a0  2b 9a 42 d1 4d f1 3c e8  df 66 ed 6f 61 42 aa 46  |+.B.M.<..f.oaB.F|
-000000b0  c0 4b 33 27 93 94 c5 6a  6c 94 f9 ba 6a 81 11 b1  |.K3'...jl...j...|
-000000c0  be 21 00 97 d9 84 9d ee  fd fd 79 18 ad 07 7a a8  |.!........y...z.|
-000000d0  d3 89 e3 2a b0 f0                                 |...*..|
+00000000  16 03 03 00 86 10 00 00  82 00 80 88 3a 3f eb 46  |............:?.F|
+00000010  28 cd 34 8f 95 5a 1e f8  c9 09 7d b0 97 9c 84 62  |(.4..Z....}....b|
+00000020  20 fd c7 cd 2e 09 27 2e  bb b7 1c b6 e1 05 7b f4  | .....'.......{.|
+00000030  cc 52 14 ee 6c 9b 18 4e  31 5a 4d be 8c 84 e3 6c  |.R..l..N1ZM....l|
+00000040  27 ca e9 c4 e9 da 9a 84  cc 7c b5 87 27 e1 be 1c  |'........|..'...|
+00000050  7a 70 3b 2a 71 a4 7d c5  4b ab 28 0e 4b ff 1f c4  |zp;*q.}.K.(.K...|
+00000060  d0 08 0b 9b ce e6 b8 ae  a2 a9 c5 c9 0a 73 1d a0  |.............s..|
+00000070  88 18 11 55 61 e1 1b 83  82 93 19 bb dc 29 f9 aa  |...Ua........)..|
+00000080  44 e0 b0 3b b9 dd 73 98  52 42 7b 14 03 03 00 01  |D..;..s.RB{.....|
+00000090  01 16 03 03 00 40 a4 e7  a1 51 63 e2 d7 df 93 32  |.....@...Qc....2|
+000000a0  01 f2 f1 14 a0 a3 1c 04  f1 c6 19 8c ab cb 51 b5  |..............Q.|
+000000b0  78 12 a4 43 08 62 14 ff  5c a0 5f aa 61 d8 c3 2c  |x..C.b..\._.a..,|
+000000c0  c8 af 05 f8 83 ff fb 6a  d9 a7 06 a9 ea b0 92 f5  |.......j........|
+000000d0  75 5a bc e7 57 c3                                 |uZ..W.|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 98 ae 81 aa e9  |................|
-00000020  4e 1f 93 59 89 05 a2 98  c3 17 dd e1 9d 9a 12 7d  |N..Y...........}|
-00000030  30 c6 6c b4 a6 f3 b7 b2  c5 df dc 9d 81 99 ce 29  |0.l............)|
-00000040  4b 75 04 9e d3 82 06 fa  22 1f a2 17 03 03 00 40  |Ku......"......@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 63 e2 4a 8d 77  |...........c.J.w|
+00000020  d8 d9 50 ae ba b0 44 d9  e2 7d 97 52 e6 65 07 5e  |..P...D..}.R.e.^|
+00000030  a1 03 19 a7 f6 a2 af 89  00 99 da 98 29 43 43 47  |............)CCG|
+00000040  9b 3c 8f 03 1a 36 27 e3  d8 db b7 17 03 03 00 40  |.<...6'........@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  dc 0e 49 1a ad 28 b6 c1  f2 27 ae bf 94 45 57 15  |..I..(...'...EW.|
-00000070  74 33 ae 3a f0 ee e5 76  7e 72 6c d9 56 64 88 58  |t3.:...v~rl.Vd.X|
-00000080  0b 96 35 a9 83 2e 4e 82  f8 a4 f8 f5 5b 08 6f 79  |..5...N.....[.oy|
+00000060  c2 6b 34 e5 79 04 14 ec  cf 14 4c 71 14 02 0d b3  |.k4.y.....Lq....|
+00000070  29 31 ec d8 40 81 12 15  8e 17 8a 42 33 1a 82 9a  |)1..@......B3...|
+00000080  be e9 6c dc dc 49 56 7a  fd 13 0a 20 37 79 e4 71  |..l..IVz... 7y.q|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 63 55 cb  53 f8 b1 48 85 33 aa c6  |.....cU.S..H.3..|
-000000b0  aa 60 c4 d0 b6 bb cc 85  3e a9 92 f9 be 53 8b 8b  |.`......>....S..|
-000000c0  3e 9c ee 8f f4                                    |>....|
+000000a0  00 00 00 00 00 4d 29 ee  b6 bf f8 71 69 4e 96 a4  |.....M)....qiN..|
+000000b0  5d 06 0e ef a9 aa 3f 16  19 c9 5d 8e 89 4f d2 cb  |].....?...]..O..|
+000000c0  17 1a e1 b0 63                                    |....c|
index f407ffd0b53ebd1d424a73a6306c55df857ca820..3e08bd4067f4b89921cf36c7f3be787cba72c16f 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 9d e8 44 6f ac  |.............Do.|
-00000010  b8 f3 4e 96 5e c0 2a 81  4d 71 2e 0e 8a a0 2f 88  |..N.^.*.Mq..../.|
-00000020  4a 87 39 d2 ed 94 0b 41  ad 2b bf 00 00 04 00 2f  |J.9....A.+...../|
+00000000  16 03 01 00 99 01 00 00  95 03 03 78 fd 27 cc 09  |...........x.'..|
+00000010  5e 07 db a2 78 ba 7a 4d  a9 7f 74 f5 d1 6e a7 d2  |^...x.zM..t..n..|
+00000020  bc f2 ee 22 2d 68 e7 59  c4 9c bc 00 00 04 00 2f  |..."-h.Y......./|
 00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
 00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
 00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 a4 d5 09 e3 4c  |...............L|
-00000010  78 eb 7d 76 4f 7f cf c7  2b 9d d1 fe 8f 5e a2 6b  |x.}vO...+....^.k|
-00000020  83 82 cb 93 37 63 47 ec  38 48 42 2a 3e e1 bf 6b  |....7cG.8HB*>..k|
-00000030  02 0a 8c b8 07 a7 11 5d  fd cc 6d dc 3b ed 26 24  |.......]..m.;.&$|
-00000040  18 64 ed 2e 98 93 49 45  ea 49 be 3f 12 43 47 c0  |.d....IE.I.?.CG.|
-00000050  c3 ef 25 e0 be 06 f2 e5  fe 9f 3e c7 e6 23 90 d1  |..%.......>..#..|
-00000060  2e 6f fc e2 72 ba a2 c2  e9 94 ab 7e ca 59 fa 93  |.o..r......~.Y..|
-00000070  40 4a 48 39 f9 5e 5f ac  60 a0 94 61 1c 6e 10 1e  |@JH9.^_.`..a.n..|
-00000080  30 44 1d 28 cb 2b b9 7f  00 dd 23 14 03 03 00 01  |0D.(.+....#.....|
-00000090  01 16 03 03 00 40 81 02  8e b2 b5 e2 b2 0a 95 9e  |.....@..........|
-000000a0  1e 65 4a 63 98 5b f0 30  4b 63 0a 74 87 58 20 fb  |.eJc.[.0Kc.t.X .|
-000000b0  2f 58 f8 10 a5 5f 4e b9  19 21 96 5f 13 8d d6 ed  |/X..._N..!._....|
-000000c0  a3 39 92 e5 4c 0f 31 c3  df 51 2d bb 7c 29 54 34  |.9..L.1..Q-.|)T4|
-000000d0  f6 68 fb f2 49 2d                                 |.h..I-|
+00000000  16 03 03 00 86 10 00 00  82 00 80 1f 30 ae eb ce  |............0...|
+00000010  57 b4 1c 5d f9 d0 5c 62  1e 89 6f b8 92 e3 c5 ef  |W..]..\b..o.....|
+00000020  ad cb 1b c2 86 e2 4e b5  88 4a d1 77 9d 89 07 87  |......N..J.w....|
+00000030  43 a1 90 41 70 3e 5e b6  59 29 9c 05 79 8f 97 92  |C..Ap>^.Y)..y...|
+00000040  77 6a 81 30 ec 30 ca e9  5e 66 10 6b 33 85 c8 c4  |wj.0.0..^f.k3...|
+00000050  4f 9a 0d 8e 4b cb d2 d8  93 9c 9c b8 91 95 15 01  |O...K...........|
+00000060  40 7c 61 cb bf a7 8e a9  ca dc 3e 78 ca 27 17 86  |@|a.......>x.'..|
+00000070  40 50 c5 44 03 ad 87 7a  dc 36 76 f5 79 6d 45 df  |@P.D...z.6v.ymE.|
+00000080  01 c1 d4 4f b0 d8 6a 2c  fe 18 71 14 03 03 00 01  |...O..j,..q.....|
+00000090  01 16 03 03 00 40 bc 90  46 f6 24 2f 68 47 7b 21  |.....@..F.$/hG{!|
+000000a0  01 91 67 d4 94 39 c0 8e  9f d4 75 dc f6 3a ac 22  |..g..9....u..:."|
+000000b0  4a a8 44 c9 ea 90 02 9b  fa 5c d5 17 5c 3d 81 bb  |J.D......\..\=..|
+000000c0  90 72 29 5d 92 d8 b1 2d  b7 a6 18 d1 7b 78 f4 7d  |.r)]...-....{x.}|
+000000d0  66 f8 2b 9c b1 90                                 |f.+...|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 3a 54 5f df 8a  |...........:T_..|
-00000020  c4 53 fb 18 31 f5 72 47  fd ef 38 84 72 80 81 88  |.S..1.rG..8.r...|
-00000030  45 69 81 aa c8 0d d7 4a  95 e9 cf ea b0 0e 07 3b  |Ei.....J.......;|
-00000040  9c f5 b3 47 00 58 55 e3  06 e1 a3 17 03 03 00 40  |...G.XU........@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 c6 d9 32 9f b9  |.............2..|
+00000020  e8 94 29 d3 62 fb ce 1d  de 4e de be e4 bd 58 86  |..).b....N....X.|
+00000030  96 07 c9 8e 34 77 b5 ca  18 67 39 d4 4c 33 c8 f0  |....4w...g9.L3..|
+00000040  4f 6b a2 22 c7 c1 1e 73  a7 9f 91 17 03 03 00 40  |Ok."...s.......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  dd c3 b2 95 87 4d fb ae  ee 0e cd 78 ac f3 2d 06  |.....M.....x..-.|
-00000070  f1 a1 86 91 a3 d3 8f f6  66 b6 1c 6d 3f 6b 5b ba  |........f..m?k[.|
-00000080  4c c8 b2 5e bf 46 2b 05  bd 17 51 29 bd 1a 91 39  |L..^.F+...Q)...9|
+00000060  74 73 d2 d5 5c 5d d7 0d  83 0f c6 8b bd 7c f6 31  |ts..\].......|.1|
+00000070  2e cf 9d 01 14 f8 91 59  3d 2b 2f 4b 12 3f 72 1f  |.......Y=+/K.?r.|
+00000080  31 05 95 c9 a6 ab a4 15  b5 f3 a3 5c 68 15 f3 2f  |1..........\h../|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 17 b0 ba  69 00 94 0c 79 3f f7 39  |........i...y?.9|
-000000b0  be a6 4b 52 b6 5e c7 c1  98 f5 04 b2 78 1f 92 4f  |..KR.^......x..O|
-000000c0  4f 50 2d 59 2d                                    |OP-Y-|
+000000a0  00 00 00 00 00 78 71 a1  35 b1 2b e1 5d 85 d7 9b  |.....xq.5.+.]...|
+000000b0  77 b2 39 20 a9 86 4c 99  0c 96 0d bc 50 f6 a2 ab  |w.9 ..L.....P...|
+000000c0  04 80 30 1b 08                                    |..0..|
index 4139c92aa09b73cfb4b37bbdc7a6aedc86cafa7f..6fbad262a112227c4d5f116f2d2157e832ce4439 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 cf 60 be 69 fc  |............`.i.|
-00000010  d8 3d f8 5e 5a 67 1d 86  93 9a b1 58 4e ca 35 d8  |.=.^Zg.....XN.5.|
-00000020  2d 92 56 f8 74 b0 9a 96  20 75 46 00 00 04 00 2f  |-.V.t... uF..../|
+00000000  16 03 01 00 99 01 00 00  95 03 03 d9 85 58 6e 7f  |.............Xn.|
+00000010  2d b4 cd f0 04 75 ef 4a  41 8a f9 2e 87 ae 63 c8  |-....u.JA.....c.|
+00000020  59 4b a2 4c 4f 46 c4 15  91 2e 7c 00 00 04 00 2f  |YK.LOF....|..../|
 00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
 00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
 00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
 00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
 00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 aa e3 c3 d5 76  |...............v|
-00000010  d7 f7 da d5 93 39 8f 6d  c2 6a ed dc b1 69 c9 2e  |.....9.m.j...i..|
-00000020  74 55 e3 2a c8 7d 03 f5  a6 6a 4e 04 b1 7f 14 86  |tU.*.}...jN.....|
-00000030  4c 5a 0d 55 00 dc 58 2b  b6 34 bb 51 b0 d6 df ff  |LZ.U..X+.4.Q....|
-00000040  ab 0e 1a a8 df b1 58 de  73 9d 94 e4 d1 26 28 df  |......X.s....&(.|
-00000050  64 09 fd b0 bc d5 9e 85  0d e8 0c ff 1a 5c 87 47  |d............\.G|
-00000060  57 d0 3e a8 46 c6 5d c4  57 5c 95 c1 ca 91 69 c3  |W.>.F.].W\....i.|
-00000070  26 2f 93 0a f8 56 51 10  e9 ff f2 82 4f 21 54 30  |&/...VQ.....O!T0|
-00000080  d3 87 fd e9 e6 a1 05 53  d0 b4 10 14 03 03 00 01  |.......S........|
-00000090  01 16 03 03 00 40 1f 6b  ca bc 42 19 fe c6 64 cf  |.....@.k..B...d.|
-000000a0  6f de ff 54 28 56 de 1a  99 fb 19 d7 4a 5e 34 97  |o..T(V......J^4.|
-000000b0  f6 38 99 17 16 fb 06 ae  88 fb a6 07 2f 01 7b 54  |.8........../.{T|
-000000c0  63 8a 4a c1 6b ee 4e 61  4e c1 46 b5 d6 8f 51 a9  |c.J.k.NaN.F...Q.|
-000000d0  fb 07 9b 88 27 20                                 |....' |
+00000000  16 03 03 00 86 10 00 00  82 00 80 5a 46 e5 a3 fb  |...........ZF...|
+00000010  1d 57 11 df 01 db d8 df  8c 2f 25 4a 23 7a 62 38  |.W......./%J#zb8|
+00000020  49 b7 fa 2c 96 94 38 62  b5 9e db 5b 84 d8 8c 24  |I..,..8b...[...$|
+00000030  ec 80 e8 f7 c6 bf 8f fc  ba 2c 46 f6 ea e6 be 02  |.........,F.....|
+00000040  fb 43 2c 97 82 6e 0e ce  1d 16 39 80 09 97 da 65  |.C,..n....9....e|
+00000050  4a ad 87 02 2c f3 6a ce  44 c0 c3 16 ef 67 86 62  |J...,.j.D....g.b|
+00000060  14 1a 85 7a 82 a7 b8 6f  55 8f 1e fb 5d 2d a8 cb  |...z...oU...]-..|
+00000070  ec 77 0d b0 b3 1b a1 99  c9 51 e8 63 98 1a 31 f4  |.w.......Q.c..1.|
+00000080  b2 17 b5 bf 57 fb 23 47  ee 1e d3 14 03 03 00 01  |....W.#G........|
+00000090  01 16 03 03 00 40 61 a2  82 3b 6f c3 f6 8b 1d 93  |.....@a..;o.....|
+000000a0  42 f6 81 a4 e1 3b bd ab  6f d1 9d 04 a6 be f4 1b  |B....;..o.......|
+000000b0  c7 0b 63 c5 d2 4d 8b 69  41 5a 65 8d 8d b1 83 92  |..c..M.iAZe.....|
+000000c0  2d d6 6c c5 45 c7 99 83  89 b7 d5 a1 ae 1b 33 05  |-.l.E.........3.|
+000000d0  d5 00 9f cb 79 50                                 |....yP|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 62 37 c3 c7 5e  |...........b7..^|
-00000020  7a 8c 16 99 2d a4 21 cd  44 ab ae ff 52 d4 a9 6f  |z...-.!.D...R..o|
-00000030  fe 58 9a 61 2e ed 51 47  8b 9f f1 ca be b9 46 78  |.X.a..QG......Fx|
-00000040  9a fc d0 38 45 da a9 41  fd 51 8f 17 03 03 00 40  |...8E..A.Q.....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 29 51 0e ac ef  |...........)Q...|
+00000020  7b ef 53 95 05 d9 4f 28  97 a2 d6 ff 44 e1 0f fb  |{.S...O(....D...|
+00000030  ed e2 ac f4 6c 46 5f 91  07 ba f0 8f 37 37 8d 77  |....lF_.....77.w|
+00000040  7d a8 32 f5 4c f8 fd fc  86 ed 02 17 03 03 00 40  |}.2.L..........@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  7d aa 32 6f 59 1c d9 83  fe 11 2f ff b7 92 fb 22  |}.2oY...../...."|
-00000070  c0 9c 77 d6 73 66 da 10  f1 36 61 34 0f e6 e9 77  |..w.sf...6a4...w|
-00000080  8a 5c c1 8c ba 36 9d cc  8d 3f 48 03 2c c1 a5 1e  |.\...6...?H.,...|
+00000060  2d 65 8c 14 51 77 fb 37  61 b0 37 2b 74 8b 9e 8d  |-e..Qw.7a.7+t...|
+00000070  7e 72 c9 af 46 eb 05 72  8a b4 42 dc e9 6c df 01  |~r..F..r..B..l..|
+00000080  d2 c6 eb 48 f9 a9 a1 fd  6f 58 b2 76 95 13 df 29  |...H....oX.v...)|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 29 14 57  d1 dc f3 ab 63 40 92 00  |.....).W....c@..|
-000000b0  31 3b d5 36 a8 3c e3 cf  b5 64 ee b7 e9 36 86 75  |1;.6.<...d...6.u|
-000000c0  6e d8 91 29 f0                                    |n..).|
+000000a0  00 00 00 00 00 81 a1 ed  82 f3 3d d4 ea af 32 0d  |..........=...2.|
+000000b0  b2 b4 ab 7e 94 1b 88 95  8b 72 22 57 b1 35 96 12  |...~.....r"W.5..|
+000000c0  45 57 68 d7 dc                                    |EWh..|
index f8e6ab38d16fddca4584cbd45638e96c5b8e3f47..ca3e49b93b750221e6e0a47464952b9ee689431f 100644 (file)
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 8f 01 00 00  8b 03 03 77 a6 19 8a 94  |...........w....|
-00000010  4a 1a d4 51 10 98 c3 22  5d 5d 76 2d 4f 27 ea e8  |J..Q..."]]v-O'..|
-00000020  61 d0 10 7a 08 43 23 42  b0 e0 12 00 00 04 c0 2f  |a..z.C#B......./|
+00000000  16 03 01 00 8f 01 00 00  8b 03 03 48 6b c4 66 fd  |...........Hk.f.|
+00000010  74 9f 73 e7 c8 4c 12 5b  6a e0 3d a6 5b ed f7 78  |t.s..L.[j.=.[..x|
+00000020  f1 93 b3 1b 1f ee 2e bc  85 f7 4e 00 00 04 c0 2f  |..........N..../|
 00000030  00 ff 01 00 00 5e 00 00  00 0e 00 0c 00 00 09 31  |.....^.........1|
 00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
 00000050  00 0a 00 04 00 02 00 1d  00 16 00 00 00 17 00 00  |................|
 00000290  3b e9 fa e7 16 03 03 00  ac 0c 00 00 a8 03 00 1d  |;...............|
 000002a0  20 2f e5 7d a3 47 cd 62  43 15 28 da ac 5f bb 29  | /.}.G.bC.(.._.)|
 000002b0  07 30 ff f6 84 af c4 cf  c2 ed 90 99 5f 58 cb 3b  |.0.........._X.;|
-000002c0  74 08 04 00 80 0f e7 f4  b4 b9 f2 83 95 26 d7 70  |t............&.p|
-000002d0  5f b2 e3 5e 42 86 b6 67  0a df 4e 60 2d d2 91 be  |_..^B..g..N`-...|
-000002e0  2c ba c1 24 9c 57 29 eb  aa df 52 e5 8e 5f 9c ab  |,..$.W)...R.._..|
-000002f0  9c 88 c5 8a 92 fd b6 d5  e2 6b 0d ea 1c de 73 22  |.........k....s"|
-00000300  a1 51 05 e0 b6 87 e1 e4  2b 8e 1d 06 26 53 37 4e  |.Q......+...&S7N|
-00000310  c7 8f 05 4a 0c 48 69 d3  7b f8 44 33 7b 2b 54 f5  |...J.Hi.{.D3{+T.|
-00000320  d9 a8 70 f3 6d b5 1c e4  4d 53 5f 0d 29 76 92 d3  |..p.m...MS_.)v..|
-00000330  63 19 25 b0 8c c6 31 13  e4 b5 d5 d0 b9 47 ed 54  |c.%...1......G.T|
-00000340  28 82 6c 04 a9 16 03 03  00 04 0e 00 00 00        |(.l...........|
+000002c0  74 04 01 00 80 6f 80 d8  15 ba df d3 5d d9 71 5f  |t....o......].q_|
+000002d0  25 f0 4f 03 1f 62 11 f4  33 91 34 08 6e d0 49 b9  |%.O..b..3.4.n.I.|
+000002e0  45 a6 37 85 73 36 c6 e7  45 c0 63 c9 66 0f b1 ae  |E.7.s6..E.c.f...|
+000002f0  86 33 b6 2a 24 d3 87 39  c8 62 da 0b 5d ae b0 74  |.3.*$..9.b..]..t|
+00000300  0d b9 36 6b 1b 97 86 d8  65 fa 46 75 6f ef d9 87  |..6k....e.Fuo...|
+00000310  6d b9 91 bb dc 47 42 23  c8 70 2a ba 65 0b 77 df  |m....GB#.p*.e.w.|
+00000320  57 6d 89 22 d8 36 f5 69  14 bc e1 c7 4c 80 22 0a  |Wm.".6.i....L.".|
+00000330  53 11 90 e0 61 30 48 29  2d 7c cf 17 94 a8 47 77  |S...a0H)-|....Gw|
+00000340  24 17 21 ec 04 16 03 03  00 04 0e 00 00 00        |$.!...........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 a4 db 55 a3 5a 6f  |....%...! ..U.Zo|
-00000010  af bf a2 53 ad 81 4d ea  ef c0 d7 02 5d 42 9f ee  |...S..M.....]B..|
-00000020  34 ff bf 08 c9 13 56 8c  e3 26 14 03 03 00 01 01  |4.....V..&......|
-00000030  16 03 03 00 28 bd 32 89  70 2a eb 54 d1 ae 60 08  |....(.2.p*.T..`.|
-00000040  4e 05 c9 e8 bb a7 fc 96  56 1a ba c7 51 a5 4d 2a  |N.......V...Q.M*|
-00000050  de da 6e a9 97 82 aa 37  44 00 4a 1f 0a           |..n....7D.J..|
+00000000  16 03 03 00 25 10 00 00  21 20 a0 e5 33 b9 5e e5  |....%...! ..3.^.|
+00000010  11 68 48 53 f1 06 5b ea  c7 2b 21 60 d1 ec e4 aa  |.hHS..[..+!`....|
+00000020  15 b9 38 bb c5 4d e4 c7  cf 17 14 03 03 00 01 01  |..8..M..........|
+00000030  16 03 03 00 28 41 1f 89  64 4d bb 36 48 36 97 d7  |....(A..dM.6H6..|
+00000040  1c 9c 44 9b 60 77 1e 73  87 7c f5 47 e4 e2 cd f8  |..D.`w.s.|.G....|
+00000050  fc 76 fe f3 38 34 4f ab  4a ce 55 66 6e           |.v..84O.J.Ufn|
 >>> Flow 4 (server to client)
 00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 7e 16 80 9b 85  03 3b 19 35 dc 22 75 4d  |...~.....;.5."uM|
-00000020  08 36 ad ee 24 f2 75 de  fe c2 c6 ba 91 62 1d 29  |.6..$.u......b.)|
-00000030  68 53 d3 17 03 03 00 25  00 00 00 00 00 00 00 01  |hS.....%........|
-00000040  65 36 ef c0 52 ae be bc  94 af 01 d6 c1 a8 2c 04  |e6..R.........,.|
-00000050  3c 83 a2 88 61 7f 41 c0  76 ec aa 52 8d 15 03 03  |<...a.A.v..R....|
-00000060  00 1a 00 00 00 00 00 00  00 02 4a dd b0 50 cf 59  |..........J..P.Y|
-00000070  01 67 74 45 f2 ae 47 f1  38 ef 51 04              |.gtE..G.8.Q.|
+00000010  00 00 00 44 d3 59 7d fc  8a 85 c2 67 f6 b2 6c 43  |...D.Y}....g..lC|
+00000020  5a 77 c0 96 a4 69 0f ec  f6 fa 27 00 4c 04 e1 23  |Zw...i....'.L..#|
+00000030  c5 1e d9 17 03 03 00 25  00 00 00 00 00 00 00 01  |.......%........|
+00000040  3f 7f d6 e8 bb 6c 7f 1c  d2 97 38 88 15 40 9c e5  |?....l....8..@..|
+00000050  1f 0b ac 83 e7 8b 57 0d  6b 62 22 0b 8e 15 03 03  |......W.kb".....|
+00000060  00 1a 00 00 00 00 00 00  00 02 d8 e7 53 15 ab a7  |............S...|
+00000070  e4 62 10 fd 48 be f5 c8  09 98 92 ad              |.b..H.......|
index c26e3c2ed578e7d56d80f623772a31ae1fe87b3e..214ae5eed8d2de57e356fdaf4a5aacf0ef772e98 100644 (file)
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e0 01 00 00  dc 03 03 93 c7 00 24 7c  |..............$||
-00000010  18 0f ec 3a 26 e2 8c 6b  54 d4 34 c0 5d 1e 0d 37  |...:&..kT.4.]..7|
-00000020  d1 cd 67 7a 48 59 0a 11  c3 bf d6 20 f3 37 6c 43  |..gzHY..... .7lC|
-00000030  00 91 4d e9 b4 27 39 77  6e 75 4b bf 41 68 b8 0c  |..M..'9wnuK.Ah..|
-00000040  31 53 bc 48 55 a6 27 71  09 30 01 36 00 08 13 02  |1S.HU.'q.0.6....|
+00000000  16 03 01 00 e0 01 00 00  dc 03 03 1f e8 63 15 2c  |.............c.,|
+00000010  85 dc 46 b7 52 88 cf 82  24 70 b9 7b 22 01 51 ee  |..F.R...$p.{".Q.|
+00000020  2a ff db 20 62 ba e2 18  4e 86 3f 20 d3 f9 0f d8  |*.. b...N.? ....|
+00000030  85 5c 17 5e 95 e9 7a 7e  cb 56 ac 85 3e 75 8f d8  |.\.^..z~.V..>u..|
+00000040  8f 25 be 59 be a7 18 db  b7 5e 19 23 00 08 13 02  |.%.Y.....^.#....|
 00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
 00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
 00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
 00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
 000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
 000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
-000000c0  24 00 1d 00 20 95 28 2e  63 cf 81 4b cd 4b 64 73  |$... .(.c..K.Kds|
-000000d0  19 19 82 2d b7 f5 54 08  4d f4 72 70 21 3e a0 d6  |...-..T.M.rp!>..|
-000000e0  7d 96 92 ac 63                                    |}...c|
+000000c0  24 00 1d 00 20 8d 8e c0  53 e4 17 29 9f 59 9e 80  |$... ...S..).Y..|
+000000d0  1f 4a 99 4b 9d 59 3f 84  93 06 68 6e 45 86 2f 4d  |.J.K.Y?...hnE./M|
+000000e0  04 f5 ba 3e 42                                    |...>B|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 f3 37 6c 43  |........... .7lC|
-00000030  00 91 4d e9 b4 27 39 77  6e 75 4b bf 41 68 b8 0c  |..M..'9wnuK.Ah..|
-00000040  31 53 bc 48 55 a6 27 71  09 30 01 36 13 02 00 00  |1S.HU.'q.0.6....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 d3 f9 0f d8  |........... ....|
+00000030  85 5c 17 5e 95 e9 7a 7e  cb 56 ac 85 3e 75 8f d8  |.\.^..z~.V..>u..|
+00000040  8f 25 be 59 be a7 18 db  b7 5e 19 23 13 02 00 00  |.%.Y.....^.#....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 db 3b a3 78 48 c0  |...........;.xH.|
-00000090  4e d1 ad 99 4d 73 e3 84  27 ff 42 de f6 c9 c9 b5  |N...Ms..'.B.....|
-000000a0  49 17 03 03 00 3c 77 b8  16 13 1d cb 0a 6b 3e 41  |I....<w......k>A|
-000000b0  24 8a 03 b9 88 48 6f b3  d7 61 66 f4 33 67 86 8c  |$....Ho..af.3g..|
-000000c0  2f ad 4f f1 40 ad 63 10  35 ee f7 15 d2 0e e9 31  |/.O.@.c.5......1|
-000000d0  b8 d9 b2 32 28 05 1e 73  3d bd a2 12 26 32 5a bc  |...2(..s=...&2Z.|
-000000e0  0c ea 17 03 03 02 6d e0  8f 50 e0 54 85 74 f0 b8  |......m..P.T.t..|
-000000f0  31 25 df 87 fd 8b 5b 52  d4 fe b0 8e 61 44 b5 28  |1%....[R....aD.(|
-00000100  1d 0e 8a 07 56 bb 77 5d  60 d8 c1 a0 95 ff 5c e9  |....V.w]`.....\.|
-00000110  a2 ca 17 20 3d b1 b1 8e  76 31 2f 0d c9 e3 ee b5  |... =...v1/.....|
-00000120  e6 fe fd dc 2e b9 e5 44  77 d3 fe 7a d5 9f 0e ab  |.......Dw..z....|
-00000130  75 b0 ff 2a 7b aa 64 75  62 ec 15 bd 2e 0c a4 54  |u..*{.dub......T|
-00000140  e6 12 cd 31 13 83 6c 98  e8 00 b3 b6 c6 7b cb 87  |...1..l......{..|
-00000150  82 3a f9 15 50 6b 4d c2  5b 6a 91 42 ce e8 25 14  |.:..PkM.[j.B..%.|
-00000160  0d 5d 17 04 c3 cf d6 23  ad 9e 0e 3b 1c aa 2e 88  |.].....#...;....|
-00000170  02 dc 63 12 3e 33 29 3d  f8 b2 ec f2 15 d6 13 d3  |..c.>3)=........|
-00000180  c9 88 a1 ad a9 27 fd 7c  c4 5e f9 73 eb 45 a7 5f  |.....'.|.^.s.E._|
-00000190  a1 4f be d7 0f e9 d0 da  30 67 3b 9d 63 2d ef b4  |.O......0g;.c-..|
-000001a0  89 3e de 19 20 af 62 52  7c e7 80 96 93 6e ca bf  |.>.. .bR|....n..|
-000001b0  c3 48 e2 c5 23 8d cf b0  a2 e5 dd a8 51 21 6f 99  |.H..#.......Q!o.|
-000001c0  24 03 c8 d8 e0 dd e6 d4  ef 7f 74 17 85 14 ca 81  |$.........t.....|
-000001d0  91 4e c6 5d 80 86 63 6f  97 55 ab 80 1c ab 63 c8  |.N.]..co.U....c.|
-000001e0  01 ca df 11 28 68 b8 75  06 22 33 ba 9c b8 14 a1  |....(h.u."3.....|
-000001f0  7a 1d cb 24 7c 90 44 b1  ed 33 e7 9d 80 6d ce b7  |z..$|.D..3...m..|
-00000200  0a 74 bd 29 53 a2 bb 06  67 4d 4d 53 cc 1c 66 76  |.t.)S...gMMS..fv|
-00000210  a9 4f 86 be 7a da ba 35  23 b6 6f c4 7d 02 2a 9f  |.O..z..5#.o.}.*.|
-00000220  2d 81 3d e2 16 3d 4b 78  ba cb f3 91 c7 39 9c 3d  |-.=..=Kx.....9.=|
-00000230  2e 4d a0 f6 6d 3d ba 15  bd cf 60 3b 8a 4a 18 9f  |.M..m=....`;.J..|
-00000240  87 e4 ee 1a ac f2 b2 bc  a6 9f af b2 9e ca be 60  |...............`|
-00000250  3f 36 54 84 d0 cd 31 d8  60 3b 4e 7e 6c 80 d5 25  |?6T...1.`;N~l..%|
-00000260  1c 1b 1e fb 0f e7 ad b0  30 0d 13 be 27 f8 c3 6a  |........0...'..j|
-00000270  93 d3 f0 55 cb e9 73 6b  e9 72 aa bb ea 24 05 f7  |...U..sk.r...$..|
-00000280  c7 51 d5 66 77 32 53 82  fb 6c 2e fc fb 83 2d f4  |.Q.fw2S..l....-.|
-00000290  5d a1 cc 75 fa d1 ee c2  5b 5d 48 e5 6d 69 87 54  |]..u....[]H.mi.T|
-000002a0  1c b1 03 bd 06 66 7b 6d  b7 46 33 56 b9 1c 62 a1  |.....f{m.F3V..b.|
-000002b0  fd d3 61 50 42 ef 66 f8  97 26 5b 17 82 52 89 09  |..aPB.f..&[..R..|
-000002c0  48 b8 68 50 63 d6 d4 83  7e 1f 5d 9d ad 69 2a 3c  |H.hPc...~.]..i*<|
-000002d0  d6 ab b7 33 1b 07 bc 44  92 d7 23 07 00 64 3f 64  |...3...D..#..d?d|
-000002e0  98 e9 52 11 69 fc 21 04  65 1d f8 0d 06 dd 54 14  |..R.i.!.e.....T.|
-000002f0  93 ae ca 30 06 db 4b 70  00 0b 3a cb 11 19 1a c6  |...0..Kp..:.....|
-00000300  a7 f0 1c 9f 31 f9 30 ec  5f 1c 4e 74 d0 1c 9b 49  |....1.0._.Nt...I|
-00000310  ab 42 c3 72 7d 11 e0 07  3d 3f 51 7a 99 07 32 0f  |.B.r}...=?Qz..2.|
-00000320  d6 b7 b7 ac 83 2e 3b c4  ce 81 1d 1a e0 e8 ba d7  |......;.........|
-00000330  12 d1 14 a9 62 c3 58 30  0d ac 30 6c 7d 06 be 96  |....b.X0..0l}...|
-00000340  e1 e4 14 6b 56 16 17 84  52 32 4c aa ec 83 1d 6c  |...kV...R2L....l|
-00000350  d1 b0 1f 63 17 03 03 00  99 c9 7d 79 9c 0f 73 20  |...c......}y..s |
-00000360  0b 93 09 a6 6e 46 fd 56  12 08 0a 8c 1b 9c b0 9f  |....nF.V........|
-00000370  0a d4 d9 33 e9 22 0e 90  d4 7c b3 4d 5a 95 e9 90  |...3."...|.MZ...|
-00000380  14 69 e5 d2 ad 2e b4 f1  a0 98 7d 24 fa b2 a4 2a  |.i........}$...*|
-00000390  f8 af 6a e3 9d a7 64 cc  ea 51 73 d1 40 23 98 df  |..j...d..Qs.@#..|
-000003a0  9f cc 70 bb c5 3b 8b fc  95 6f ca 04 6d 7d cd 77  |..p..;...o..m}.w|
-000003b0  ba b3 d3 e1 50 38 9c 16  60 d7 2b be 82 b3 a5 70  |....P8..`.+....p|
-000003c0  76 c4 fb ba 7e 78 5c 97  a3 47 fe 23 80 b7 d4 f1  |v...~x\..G.#....|
-000003d0  1f a6 dc 08 68 b4 d7 bb  09 6f 45 37 e5 1d 2b 2f  |....h....oE7..+/|
-000003e0  e1 57 84 4e 95 c1 bc b4  14 a4 45 04 69 ae 79 01  |.W.N......E.i.y.|
-000003f0  07 42 17 03 03 00 45 00  a8 d1 03 76 56 7f b3 7e  |.B....E....vV..~|
-00000400  ec 82 94 7f b7 66 8a 01  c3 ab 50 13 20 f3 ea 3e  |.....f....P. ..>|
-00000410  27 56 e7 49 14 6a d0 2e  f4 04 d1 54 c0 b1 4d 5e  |'V.I.j.....T..M^|
-00000420  2a a5 f1 89 55 f6 b0 ee  e2 15 26 13 ec a4 4c ca  |*...U.....&...L.|
-00000430  ef 1a c7 ff 3e 5e f3 88  15 57 47 43              |....>^...WGC|
+00000080  03 03 00 01 01 17 03 03  00 17 cb a2 26 d8 e7 e0  |............&...|
+00000090  72 cd 3d 39 f6 67 25 78  a3 ce bf 0e 62 bf 2e 2a  |r.=9.g%x....b..*|
+000000a0  b5 17 03 03 00 3e 3e b3  0c 6d 79 88 e8 74 87 a5  |.....>>..my..t..|
+000000b0  ab a1 db 4b 11 d9 15 16  49 a7 ef a5 69 f0 8e 2e  |...K....I...i...|
+000000c0  a3 6c 38 f0 ea 6d 0b fd  4c 78 ea 55 ec e7 48 de  |.l8..m..Lx.U..H.|
+000000d0  87 01 3d de 13 5b 59 7f  b3 15 4a 7d 40 30 d8 9c  |..=..[Y...J}@0..|
+000000e0  55 06 54 2d 17 03 03 02  6d 28 a4 e3 bf 71 d5 93  |U.T-....m(...q..|
+000000f0  50 e1 e7 96 02 28 f1 2f  6d 78 1f b9 7f 1a 8c a4  |P....(./mx......|
+00000100  65 03 15 fb a7 ef f5 91  66 44 00 28 6a 17 46 9c  |e.......fD.(j.F.|
+00000110  e7 90 f9 d5 78 f1 a4 fd  9b 54 09 dc 6e 83 0f 65  |....x....T..n..e|
+00000120  96 51 e1 69 e0 05 7f d4  d6 04 03 fd b8 6b 9c 12  |.Q.i.........k..|
+00000130  02 af 03 9b 02 42 7b ce  e0 81 51 91 3a 01 be a4  |.....B{...Q.:...|
+00000140  72 ef 27 c3 3e f1 8e 5d  3a 9e 46 4c 25 13 98 c2  |r.'.>..]:.FL%...|
+00000150  5c 75 3f b2 30 7c de da  b6 56 4e 7a 2c c3 1d 6f  |\u?.0|...VNz,..o|
+00000160  7a 6e 0d da d2 df a6 df  47 12 6d af 3f d7 66 ad  |zn......G.m.?.f.|
+00000170  54 19 b3 7f 1b 92 5c e6  79 36 ab d9 99 db 1d f9  |T.....\.y6......|
+00000180  e8 13 b4 e9 85 fb ba 9a  7b f3 eb 28 e5 e3 f1 0e  |........{..(....|
+00000190  dc 95 b2 db f3 e4 77 6d  a5 43 14 4c f4 af 0a e4  |......wm.C.L....|
+000001a0  5d bf 1d f4 ef 72 9f c0  74 55 e5 93 e0 7c f0 9a  |]....r..tU...|..|
+000001b0  01 1d e8 43 5d c1 24 6f  75 46 44 f0 bc 15 b6 6b  |...C].$ouFD....k|
+000001c0  7b cd 6d cc 38 06 10 34  ae be 7c b1 24 da 71 58  |{.m.8..4..|.$.qX|
+000001d0  b2 81 1f ea 28 18 73 75  79 d5 eb ef 0c 33 b8 1c  |....(.suy....3..|
+000001e0  14 e9 00 b8 12 f7 b2 9f  b1 f3 a8 23 63 b3 29 49  |...........#c.)I|
+000001f0  0e 84 b8 60 1c c2 32 c5  fd 59 de 88 e2 55 93 0f  |...`..2..Y...U..|
+00000200  63 e6 a7 02 3e 01 0e 5f  df b4 03 f8 a9 d0 96 03  |c...>.._........|
+00000210  5c ea e0 6f 5d 1d 30 41  c7 ec 6a 94 d3 6c ff b7  |\..o].0A..j..l..|
+00000220  1b eb b8 0d 2f df 90 2e  f8 f5 d2 3a c6 8c 47 98  |..../......:..G.|
+00000230  ad 39 13 f2 4d 2f a5 9d  4b 58 f7 bc 92 d6 b1 ca  |.9..M/..KX......|
+00000240  6a a5 c5 64 62 1c 76 21  be b5 ca 25 04 e4 16 b3  |j..db.v!...%....|
+00000250  26 90 42 b8 b8 61 4a da  a3 12 5d f7 74 e6 f1 95  |&.B..aJ...].t...|
+00000260  5d d4 3a 17 fc 33 b1 2a  35 eb 69 16 7e d0 8f 66  |].:..3.*5.i.~..f|
+00000270  ca b1 62 0f 85 d1 b3 f9  b6 cf dc 86 61 0e 34 8a  |..b.........a.4.|
+00000280  a0 69 fc 59 6b fc 3d 6d  7a 19 46 6f 8a 3d 16 56  |.i.Yk.=mz.Fo.=.V|
+00000290  ac 5d ed 05 57 25 2d 85  78 67 bc 50 a3 34 87 3f  |.]..W%-.xg.P.4.?|
+000002a0  e7 ae 0d f0 17 67 2a 08  42 92 1f 25 0e 9c 22 e3  |.....g*.B..%..".|
+000002b0  3f 7f dc 91 52 9e d3 01  39 0f 47 55 26 f3 f2 ce  |?...R...9.GU&...|
+000002c0  75 7d 33 f2 a2 9a 03 70  c0 e7 32 90 a7 50 8c b0  |u}3....p..2..P..|
+000002d0  ab fa b5 ef 25 ae e3 7e  94 99 a9 3f 83 a7 16 5e  |....%..~...?...^|
+000002e0  67 b4 a0 1e 5b f7 10 49  cb 33 73 4d 92 26 49 8d  |g...[..I.3sM.&I.|
+000002f0  63 fc 5b b5 1b a4 1a 97  10 09 5f e0 75 73 50 be  |c.[......._.usP.|
+00000300  d5 6a 62 80 3a 3f c7 94  89 51 f0 c6 fa 38 2e 79  |.jb.:?...Q...8.y|
+00000310  3c 0b 63 bc 7e 6e 2a ed  c6 c5 d5 bc bc 00 31 e3  |<.c.~n*.......1.|
+00000320  5c 2b b7 88 ff 8f ef a7  34 7e c7 3e 3f 16 e6 75  |\+......4~.>?..u|
+00000330  c8 1b 70 4a 2f 18 81 c3  d3 81 63 e8 31 f4 42 f8  |..pJ/.....c.1.B.|
+00000340  02 2d 2e fb d5 65 60 93  df b5 d4 c8 8e 55 29 b3  |.-...e`......U).|
+00000350  72 01 86 19 10 3d 17 03  03 00 99 e9 b1 32 d5 5f  |r....=.......2._|
+00000360  59 fb 7f 80 0e 70 2e 1a  76 ae dd 7f 84 ee 86 69  |Y....p..v......i|
+00000370  37 a6 31 f2 83 78 8d 90  98 eb 43 96 22 9f ba 34  |7.1..x....C."..4|
+00000380  09 e3 78 c9 5f 5a f0 0b  51 58 c9 8e 63 b7 04 88  |..x._Z..QX..c...|
+00000390  74 a2 1c c9 da f3 9e 30  c0 c7 a9 da f4 43 d5 a2  |t......0.....C..|
+000003a0  b7 c4 aa 33 5f be f9 e2  68 d6 73 f2 3d ae 1b e5  |...3_...h.s.=...|
+000003b0  5b b5 7d ce cb 9d 72 a2  2d bc 30 35 43 a1 3f 53  |[.}...r.-.05C.?S|
+000003c0  43 61 a3 4e 6e 90 8c 8a  78 b5 35 74 98 51 d2 33  |Ca.Nn...x.5t.Q.3|
+000003d0  3a 9f c5 39 79 6d 5d fe  ce 5e e2 dc 12 56 ac 56  |:..9ym]..^...V.V|
+000003e0  0b 6c 86 3c 85 cb 12 18  46 dd ed 53 04 9a 88 34  |.l.<....F..S...4|
+000003f0  84 df b0 cf 17 03 03 00  45 f6 a8 20 67 5a d1 87  |........E.. gZ..|
+00000400  ac e4 d7 95 d0 8b 8f 96  cd b6 12 7d eb 3c 28 21  |...........}.<(!|
+00000410  5a 7d 53 86 9e 55 cd 9b  24 1a c3 c7 6a 30 84 6f  |Z}S..U..$...j0.o|
+00000420  f7 96 ac 29 b5 ee 5d 66  32 c6 52 13 79 32 67 27  |...)..]f2.R.y2g'|
+00000430  6b 5b bc 54 1e 28 b2 73  5f 5d 4d 6f 11 fc        |k[.T.(.s_]Mo..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 1e cd 5f bd ff 6b  |............_..k|
-00000010  f7 c8 70 4b cc c8 84 44  c2 d0 7d ea 39 78 5a 6f  |..pK...D..}.9xZo|
-00000020  7a 72 0e 55 d0 76 7c 48  d8 cc 32 b4 08 bf f7 a8  |zr.U.v|H..2.....|
-00000030  32 99 4a c5 83 79 4d 39  ea 0d 63 33 da 89 57 30  |2.J..yM9..c3..W0|
-00000040  ab 31 95 90 f4 8d 4a 63  34 13 c6 4e d6 80 37 b8  |.1....Jc4..N..7.|
-00000050  9b 28 8b 8f e5 b5 2a 16  e1 82 63 6f 1b ca 3a b4  |.(....*...co..:.|
-00000060  b3 0b 36 56 09 d8 1e ab  b4 fb aa 07 df 76 d3 b2  |..6V.........v..|
-00000070  07 8d 56 38 f9 15 c2 1b  c9 97 50 6a c4 23 6f 39  |..V8......Pj.#o9|
-00000080  7b b3 69 b5 c2 6e 29 b4  14 17 9c 3d b7 c5 5f 12  |{.i..n)....=.._.|
-00000090  25 73 89 22 99 1f 77 9d  9c a4 f6 fc 0a 8b af 24  |%s."..w........$|
-000000a0  9b fc c1 b3 c3 cd 88 55  b5 81 8a 6e 73 83 cc da  |.......U...ns...|
-000000b0  fa 64 fe 3b 20 31 75 9a  ce 35 ad a6 4b 3f 6f 49  |.d.; 1u..5..K?oI|
-000000c0  e0 ae 21 23 ac c5 86 bb  ec 91 13 37 76 d9 06 40  |..!#.......7v..@|
-000000d0  ce 32 84 41 3e c0 5c 6d  93 0c 2f af ac af 5e ef  |.2.A>.\m../...^.|
-000000e0  ab 65 fc cc 00 a4 11 94  27 0e 11 ac 2a 00 dc c3  |.e......'...*...|
-000000f0  dc fc 68 ff b3 32 bf 75  ff d0 35 e1 a3 44 68 6e  |..h..2.u..5..Dhn|
-00000100  21 39 ab 68 93 11 50 3b  30 1c 32 2a 03 9a 2a 9c  |!9.h..P;0.2*..*.|
-00000110  ff 2a bf 10 b3 ae 28 33  43 3c b2 04 a3 5d 49 21  |.*....(3C<...]I!|
-00000120  db c4 4e 90 2f bd 20 03  d1 99 78 48 1a fd f2 a8  |..N./. ...xH....|
-00000130  1b 06 1b 4e d1 5f 7c ed  ba 04 3c ad 9c 20 4f 5e  |...N._|...<.. O^|
-00000140  37 5b 75 8e fc 40 2a 09  1c 78 f7 b2 15 ad a6 24  |7[u..@*..x.....$|
-00000150  29 98 74 42 e2 80 28 80  0b 78 22 72 75 e3 33 75  |).tB..(..x"ru.3u|
-00000160  a0 57 37 00 f1 69 bd ab  22 74 2d 6c 4a 1e 46 5b  |.W7..i.."t-lJ.F[|
-00000170  64 e0 47 d7 77 85 18 6b  10 67 6f 83 eb 98 e4 31  |d.G.w..k.go....1|
-00000180  00 35 1d c3 1f d9 7a 86  27 27 3f 2d 0d cb 53 8f  |.5....z.''?-..S.|
-00000190  f4 52 e7 5a ba 02 67 44  a8 19 71 1a 7b f2 b1 80  |.R.Z..gD..q.{...|
-000001a0  c9 82 d0 4b 63 0e d0 e0  bd a1 cc 5e 55 80 9a 51  |...Kc......^U..Q|
-000001b0  21 bf 32 ce 8f 74 ea ed  a6 cd ee b4 8f 3b 8f 6c  |!.2..t.......;.l|
-000001c0  41 5e 3d 1f 00 0b d4 a4  09 9a 8e c3 3f b1 b7 4c  |A^=.........?..L|
-000001d0  7b 6b 57 3f 94 3d ed d7  60 5c d4 04 b0 7b 62 06  |{kW?.=..`\...{b.|
-000001e0  f7 06 f6 f0 f8 44 80 55  97 22 60 e6 dc f3 ec 7d  |.....D.U."`....}|
-000001f0  d2 22 e0 07 5d 52 0c 63  4d 77 f8 c5 16 06 67 5b  |."..]R.cMw....g[|
-00000200  9e 96 f4 1e fa 8e dd f8  42 85 7f 1e dc f9 dc b8  |........B.......|
-00000210  b1 91 b0 c3 04 0d e1 dd  c9 c4 0d fb b7 74 cb e5  |.............t..|
-00000220  57 38 b7 82 8c d1 20 d1  0f 17 03 03 00 a4 79 ad  |W8.... .......y.|
-00000230  66 39 e1 10 c9 96 2c d3  7f 11 c6 7e c4 36 56 4c  |f9....,....~.6VL|
-00000240  70 c3 8f a4 da c2 a5 53  9b 28 25 82 69 d8 90 f0  |p......S.(%.i...|
-00000250  79 52 29 cb e1 d4 48 49  dd 00 82 37 b1 ac 3b 1c  |yR)...HI...7..;.|
-00000260  2c b9 a7 c4 08 ac 08 fd  42 47 79 1f 64 82 57 2a  |,.......BGy.d.W*|
-00000270  63 c0 78 54 55 69 f2 05  9e 8d 81 6e d9 b5 31 08  |c.xTUi.....n..1.|
-00000280  d3 0d 61 61 4f 70 a4 57  67 eb 9d 09 ca 51 01 ff  |..aaOp.Wg....Q..|
-00000290  53 d2 6d 9e 49 ce 40 1f  c9 ab a2 52 e6 56 0c d3  |S.m.I.@....R.V..|
-000002a0  63 b4 44 d7 fe 97 1d d2  55 8d 13 df 23 71 68 b6  |c.D.....U...#qh.|
-000002b0  79 26 a8 a6 cd ca a1 19  6b 21 e8 b6 30 34 b6 6f  |y&......k!..04.o|
-000002c0  66 2d ab 1d 16 7f c6 b1  53 c9 2a 40 87 9d 7d 48  |f-......S.*@..}H|
-000002d0  c9 6a 17 03 03 00 45 43  bf 6e f3 e2 76 56 69 2f  |.j....EC.n..vVi/|
-000002e0  9b c5 d2 46 4f 24 d2 e2  61 13 2b ad b6 3e d8 89  |...FO$..a.+..>..|
-000002f0  1b 31 7c ec 14 44 39 7c  b4 08 44 9d 31 d9 a1 5f  |.1|..D9|..D.1.._|
-00000300  2e 8f a9 8e 5b 5a 91 e2  f5 61 f5 63 be 5c 14 e3  |....[Z...a.c.\..|
-00000310  70 8e 2e 9e fd 6c 54 85  ba ef 85 b7              |p....lT.....|
+00000000  14 03 03 00 01 01 17 03  03 02 1e 60 1c a1 8d ec  |...........`....|
+00000010  40 73 af df e0 a2 e8 c7  0d f5 f3 8c 5b 9e 58 f0  |@s..........[.X.|
+00000020  5d 77 d8 d1 42 bd 30 e4  0d f5 5f b6 68 89 0f bb  |]w..B.0..._.h...|
+00000030  73 ff dc 9b 77 b6 c9 f2  3c a8 5a 95 43 f6 53 22  |s...w...<.Z.C.S"|
+00000040  f3 96 7c 48 b6 df d2 ed  a1 39 00 f1 c5 20 5d bd  |..|H.....9... ].|
+00000050  bd 27 4b d7 5f d7 7e 57  3c 22 84 cf 6f 2c 85 4f  |.'K._.~W<"..o,.O|
+00000060  50 8e 71 0c 70 cb e9 3b  52 31 12 ac 0e 1c d0 0c  |P.q.p..;R1......|
+00000070  a5 c7 20 83 77 95 b5 0d  2f b8 f9 51 83 17 d1 9b  |.. .w.../..Q....|
+00000080  69 ca 0a 9c e1 8e 1d 3d  95 2b 10 56 24 47 e0 6e  |i......=.+.V$G.n|
+00000090  ba 56 94 c9 a8 b5 62 b4  4d da 70 73 e0 a0 0b 15  |.V....b.M.ps....|
+000000a0  60 22 f4 3f a3 e4 c6 86  a9 a3 dd db 5b 69 5c ce  |`".?........[i\.|
+000000b0  99 14 6a 93 8e c7 21 ff  99 4d da 25 3b 87 3a ae  |..j...!..M.%;.:.|
+000000c0  7d 9b 9a 06 6f e4 36 02  64 07 d4 43 84 5b 6f 98  |}...o.6.d..C.[o.|
+000000d0  6c ec 6b 77 92 17 75 2e  ea c5 02 ab ce 8c c2 9a  |l.kw..u.........|
+000000e0  18 e7 90 05 da 68 5a c9  d8 22 8c d2 de 17 b5 87  |.....hZ.."......|
+000000f0  a1 74 e9 bc 54 07 36 ef  61 1f 3a 43 51 15 2a 98  |.t..T.6.a.:CQ.*.|
+00000100  53 84 89 d4 90 a7 f0 a6  e4 35 6c 70 9b f5 a4 51  |S........5lp...Q|
+00000110  b4 69 9c 58 10 df cc 50  04 46 43 0a c5 9d ca f1  |.i.X...P.FC.....|
+00000120  23 2c a5 1e 6c d6 36 82  21 1f db 9a ae 55 f2 77  |#,..l.6.!....U.w|
+00000130  ad 13 e8 97 24 3c c9 c1  a5 b2 18 3c a6 cf ab c6  |....$<.....<....|
+00000140  05 88 06 e1 23 fb b7 85  a6 e8 57 38 6d 58 22 b8  |....#.....W8mX".|
+00000150  02 c6 0d 40 22 10 cd da  dc 21 ef 6b ae 6c 5d c5  |...@"....!.k.l].|
+00000160  8e 62 a7 21 be 7c b7 47  60 af 55 e7 db 6f 47 59  |.b.!.|.G`.U..oGY|
+00000170  62 dd f2 f6 62 9b cd 2c  46 ec b8 05 47 d4 f9 8d  |b...b..,F...G...|
+00000180  ee 89 09 f6 d0 ac 8d 4f  27 d1 f7 4e cb aa 55 0b  |.......O'..N..U.|
+00000190  be 64 ed 69 45 7c 0a b5  95 5c b3 63 c4 1c ff 12  |.d.iE|...\.c....|
+000001a0  de ad 11 f9 d4 de d4 94  d7 cb 31 55 21 51 09 12  |..........1U!Q..|
+000001b0  33 20 df 64 4f 57 f3 da  68 24 20 f7 df 9d b3 4c  |3 .dOW..h$ ....L|
+000001c0  7f b1 c4 5a 85 d2 95 bd  98 e8 05 7b 20 f1 34 97  |...Z.......{ .4.|
+000001d0  6e 73 ed 5d 5f 97 56 a6  9a 6f e7 91 27 be b2 d9  |ns.]_.V..o..'...|
+000001e0  ef 48 9b 3d d8 80 e1 e1  d5 46 de 6c 83 7d 16 24  |.H.=.....F.l.}.$|
+000001f0  03 f0 a1 29 fd 8e a7 db  63 88 51 e3 ac 5d a6 c9  |...)....c.Q..]..|
+00000200  19 e4 a4 40 0f 92 1b 4c  3b 9d 4a fc b2 cf c5 62  |...@...L;.J....b|
+00000210  db 72 d2 9e f8 c0 00 ab  fe af ac 66 46 8d b7 8e  |.r.........fF...|
+00000220  dc ab 07 c4 87 09 0e 9b  04 17 03 03 00 a4 7b 67  |..............{g|
+00000230  11 bf bb 27 7d c0 ab f4  14 a8 44 a1 e1 b1 ba 0c  |...'}.....D.....|
+00000240  4c d0 4e 9d 74 5f dd 60  bb c9 33 ad 29 91 a7 a0  |L.N.t_.`..3.)...|
+00000250  18 61 44 25 bf a1 45 e2  9b 24 93 20 45 0b 2a 09  |.aD%..E..$. E.*.|
+00000260  07 75 4d ad 1a 04 34 df  7b 1b c8 f7 e7 fc 4e 99  |.uM...4.{.....N.|
+00000270  27 97 d5 9a 7f 63 39 00  5c ed ba a4 5b 9b 44 72  |'....c9.\...[.Dr|
+00000280  cb 3e 80 68 9a 78 e9 bc  12 35 94 9d b2 1c 34 f6  |.>.h.x...5....4.|
+00000290  ce c7 cf 61 5e a9 c2 21  79 e9 e3 4c e8 e5 dc fe  |...a^..!y..L....|
+000002a0  e2 1d 7a 2b c3 dd 15 f8  e5 0e 20 6f 99 fd ea ef  |..z+...... o....|
+000002b0  a1 a4 be a9 28 1a d0 f8  3e 0a c2 76 6b 24 b1 56  |....(...>..vk$.V|
+000002c0  0f 52 25 f6 56 65 96 92  4f 07 71 9d 25 25 99 2c  |.R%.Ve..O.q.%%.,|
+000002d0  dc 04 17 03 03 00 45 c5  e8 b3 d0 ca 89 02 da 08  |......E.........|
+000002e0  73 57 9c a6 49 de da b3  e7 92 59 8e 25 29 45 8b  |sW..I.....Y.%)E.|
+000002f0  fb 56 b6 53 dd d1 59 6c  5f 39 7a d4 d8 e6 db e3  |.V.S..Yl_9z.....|
+00000300  60 8c a4 8a 81 2b a5 26  a7 21 89 e9 8a f7 fe 39  |`....+.&.!.....9|
+00000310  44 a2 bd 1c 49 18 47 b9  69 ef 1c 74              |D...I.G.i..t|
 >>> Flow 4 (server to client)
-00000000  17 03 03 02 a8 02 f0 98  42 d8 ab 9d 92 8c 11 ac  |........B.......|
-00000010  16 4d b1 c0 2e 3b 0f ac  53 f8 aa 15 01 36 03 fd  |.M...;..S....6..|
-00000020  1b e1 0f 87 62 5f d4 4e  fc 0d 88 13 30 4f 5e fc  |....b_.N....0O^.|
-00000030  46 1b 3a 22 cc ff a9 5e  29 24 15 67 08 1b 28 18  |F.:"...^)$.g..(.|
-00000040  d3 70 46 fa 92 89 de 69  62 f1 c7 47 d1 24 a2 98  |.pF....ib..G.$..|
-00000050  8d 78 d0 f2 cc 3f fb 4c  3c 5e 03 0c 4e a8 a3 b7  |.x...?.L<^..N...|
-00000060  c5 69 49 19 43 da 07 b4  be 6e 7d cd 12 c3 bf d7  |.iI.C....n}.....|
-00000070  74 9a 3e 30 cd 9d 8e a4  27 bb 66 d1 95 50 ad f7  |t.>0....'.f..P..|
-00000080  91 52 e4 be d5 61 fc 28  fb 33 02 bc f4 fb fb 7f  |.R...a.(.3......|
-00000090  0c 9a dc e4 63 86 c6 f8  f6 bc 67 60 c6 ac b2 52  |....c.....g`...R|
-000000a0  65 3e 0d f7 15 e0 d4 f2  7b 36 ed e2 2e c3 ab 44  |e>......{6.....D|
-000000b0  e4 06 d1 09 e6 c6 9e c3  dd df e9 3b 9c 22 cb 48  |...........;.".H|
-000000c0  1a 18 22 da 8c e7 11 e0  36 0b a9 73 be d8 22 db  |..".....6..s..".|
-000000d0  8b 95 f5 3e cc c0 11 6f  db 40 57 4c 07 14 2b fc  |...>...o.@WL..+.|
-000000e0  9e 6b f8 07 96 9f 3d 8e  cc d2 c3 b5 a8 e1 64 33  |.k....=.......d3|
-000000f0  b6 ab 17 4b aa b2 e0 b6  fe b6 49 69 7d 0b 8e cd  |...K......Ii}...|
-00000100  19 a3 d8 5e 22 5a 02 64  c2 68 ec 69 55 2d fd aa  |...^"Z.d.h.iU-..|
-00000110  1f f6 35 bf b2 14 a5 f9  a0 49 59 a4 84 ff 41 a5  |..5......IY...A.|
-00000120  fb a1 e4 97 72 88 00 98  dd 5a 6f 7b 00 a7 59 fa  |....r....Zo{..Y.|
-00000130  83 73 e7 ca 8f dd 31 e8  ca 02 13 c9 fa 2b 8c 5e  |.s....1......+.^|
-00000140  b5 7b 85 da 2b 1a 75 da  e3 db b7 34 58 c4 da 15  |.{..+.u....4X...|
-00000150  b3 3a f9 a7 b3 7f 15 d2  01 b2 26 b4 c1 fe 83 af  |.:........&.....|
-00000160  d6 f7 8b fb 92 3d 32 ae  4a 1b a2 50 60 70 a6 34  |.....=2.J..P`p.4|
-00000170  98 3f 2d bf 27 2e d3 a0  91 d9 c8 f9 a9 27 f2 23  |.?-.'........'.#|
-00000180  7c 3c 17 96 19 99 6f 09  a7 bd da 2d 94 9e f9 6b  ||<....o....-...k|
-00000190  bb 93 fd bb b1 c0 89 6f  b4 8f 90 86 e1 85 59 98  |.......o......Y.|
-000001a0  ba 98 7c 6c 26 be 98 30  5f cf 46 bf e9 c6 a4 bd  |..|l&..0_.F.....|
-000001b0  08 14 2a 5c 05 d8 c2 0e  ba 46 af 23 e8 f0 71 77  |..*\.....F.#..qw|
-000001c0  78 78 ec c2 af 4a 63 93  2e b1 ed 56 3d b7 7c a5  |xx...Jc....V=.|.|
-000001d0  63 99 2f df 15 d3 ce 79  0e 49 d0 16 ac 3e f3 fa  |c./....y.I...>..|
-000001e0  cd e7 0e e5 ee 4a cd 49  20 f6 9f fa d1 df cb cc  |.....J.I .......|
-000001f0  1b 73 83 12 47 52 69 3c  93 bb 1f 65 64 1e 79 15  |.s..GRi<...ed.y.|
-00000200  72 85 e8 fd fa d6 be d5  61 44 35 bb 75 a7 17 1f  |r.......aD5.u...|
-00000210  dd 7b 60 17 78 1f 11 72  7f ac e7 52 1e 94 13 35  |.{`.x..r...R...5|
-00000220  ab 97 69 17 09 6c 4b 46  cd 34 2d 7e 55 8a 16 d3  |..i..lKF.4-~U...|
-00000230  c2 59 e8 d8 67 9b 29 af  bc f1 31 39 d9 ff 06 d5  |.Y..g.)...19....|
-00000240  80 b8 8d 50 80 5f 2c 0a  30 84 28 32 3d 4c 45 f2  |...P._,.0.(2=LE.|
-00000250  2f 8b b5 d9 3a 7a 47 05  55 22 7a a4 61 c8 8c d1  |/...:zG.U"z.a...|
-00000260  1c 1b 78 e0 87 37 5e 36  88 5c 32 ca 7a d3 76 63  |..x..7^6.\2.z.vc|
-00000270  ee 94 83 9c 9e 5e 9b 01  42 03 e1 e5 0f a8 43 53  |.....^..B.....CS|
-00000280  cd 3d 76 01 88 ba bf 78  b8 d7 b2 e9 8f 69 d1 35  |.=v....x.....i.5|
-00000290  88 44 f1 ef 20 cd 42 c6  99 99 0c a5 25 ec dc 88  |.D.. .B.....%...|
-000002a0  1e b5 28 dd e4 a1 12 20  03 fa ce 38 8a 17 03 03  |..(.... ...8....|
-000002b0  00 1e bc 9a e0 0d 88 a2  71 15 c3 0d 54 d3 13 d8  |........q...T...|
-000002c0  d9 96 ad 95 ee 47 2c c6  ba e9 f9 50 b1 8e 1e 0b  |.....G,....P....|
-000002d0  17 03 03 00 13 d2 56 e3  48 c0 fa 0f 9a 95 22 e9  |......V.H.....".|
-000002e0  51 c1 98 64 b4 03 09 5a                           |Q..d...Z|
+00000000  17 03 03 02 a8 a1 f1 48  20 d7 51 ae a0 ec 04 30  |.......H .Q....0|
+00000010  d3 98 bc b4 87 14 5a 73  c1 57 d9 9b b8 54 c0 cc  |......Zs.W...T..|
+00000020  e9 25 20 5a 1a 49 2c 3c  5d 0b a5 47 8e 58 df 3e  |.% Z.I,<]..G.X.>|
+00000030  44 d8 c7 68 5e e6 cd 78  41 ad 8b e2 83 5e fa 1b  |D..h^..xA....^..|
+00000040  05 93 18 fa c1 df 18 d0  b1 52 bc db ee f7 49 a8  |.........R....I.|
+00000050  d8 fd 9c a9 f7 cd a2 b8  61 2b 09 f0 7e 03 e6 18  |........a+..~...|
+00000060  7f 6b fc c8 5f 01 50 21  c9 99 94 7f 31 a8 0e 60  |.k.._.P!....1..`|
+00000070  ec 21 63 b0 e7 90 0b ca  27 55 80 e2 6f 1d 6e e2  |.!c.....'U..o.n.|
+00000080  47 54 a5 81 fd 65 da 31  7c 70 bf 8b 37 b7 53 fc  |GT...e.1|p..7.S.|
+00000090  fd 2d 46 79 69 7b aa a5  29 a2 11 ac 3c ab 20 29  |.-Fyi{..)...<. )|
+000000a0  51 8d 30 da 9a 1d 0f 32  d8 3d 2a 06 0c 59 b9 5e  |Q.0....2.=*..Y.^|
+000000b0  fe 28 09 d6 49 7f 7c 9c  33 66 91 8e a9 b0 9c 38  |.(..I.|.3f.....8|
+000000c0  94 db 68 f0 a1 60 ce 3d  95 49 3f 0a ba b1 15 f2  |..h..`.=.I?.....|
+000000d0  61 e5 a0 91 72 71 28 af  43 54 0d 75 71 f9 6e 2f  |a...rq(.CT.uq.n/|
+000000e0  3c 6a fd 2f 96 5d a1 bc  5f 88 9f 3f 9f e3 80 94  |<j./.].._..?....|
+000000f0  89 52 96 b0 69 7a 5e 0c  a4 65 af a3 45 c4 7e 32  |.R..iz^..e..E.~2|
+00000100  54 2a c1 5a 73 98 b1 bf  6e f5 05 66 da af 49 70  |T*.Zs...n..f..Ip|
+00000110  16 69 c9 53 c3 f4 a0 f8  c9 91 c4 ea 02 fc e4 72  |.i.S...........r|
+00000120  9b 5f 12 7c 67 0a 4e be  f4 14 e6 97 99 f8 ec 3c  |._.|g.N........<|
+00000130  c8 dc c5 ae a7 72 6f 8a  16 f5 6c 4d a4 98 79 c9  |.....ro...lM..y.|
+00000140  d0 9c 7b 96 b6 82 9a 58  7e a0 db 74 32 6f 38 59  |..{....X~..t2o8Y|
+00000150  0d 44 8b ec f7 e0 69 6d  45 7e 4b ac 0d f4 26 78  |.D....imE~K...&x|
+00000160  31 72 a8 c6 ae b8 0c 19  bc f5 2c 78 a4 14 4c 0c  |1r........,x..L.|
+00000170  3a db 61 c6 c6 91 f9 3b  cf 8a 0c 22 64 bb 18 92  |:.a....;..."d...|
+00000180  0e 08 91 6b 80 e1 a6 39  f2 20 b1 21 43 5a f2 e7  |...k...9. .!CZ..|
+00000190  e8 c7 93 c0 3f cc df 92  1f d8 45 24 f5 d6 de 2f  |....?.....E$.../|
+000001a0  58 f6 f7 e0 da 92 fd 4a  80 79 5d 03 78 8a 7a 18  |X......J.y].x.z.|
+000001b0  ba 21 49 8a 12 41 f3 69  bc 5f e7 28 64 50 fe 50  |.!I..A.i._.(dP.P|
+000001c0  2f 6e 1d e1 15 86 87 54  ae 9d 17 90 cd 02 cd c9  |/n.....T........|
+000001d0  99 19 80 53 07 76 80 49  6d a0 c5 cc 53 56 13 1b  |...S.v.Im...SV..|
+000001e0  b8 97 e2 84 ab cf 86 3d  b6 82 60 06 c8 d2 85 bc  |.......=..`.....|
+000001f0  e0 f6 8c 79 8b d1 1c 90  d2 f2 a6 d4 c0 ac ba 58  |...y...........X|
+00000200  0d 7b b6 99 02 d0 2c 90  ca ef 74 4b 54 e8 6a 1c  |.{....,...tKT.j.|
+00000210  0d 3a ff a5 be a8 b7 1f  73 85 31 2d d7 ea bf 94  |.:......s.1-....|
+00000220  18 63 40 b0 c2 ea 99 53  ff e0 d2 75 2c 0f 48 c8  |.c@....S...u,.H.|
+00000230  42 69 9a fc 17 dc cc 90  ec a4 43 b5 ca 27 f6 5b  |Bi........C..'.[|
+00000240  4b e7 24 30 db 9a 9f 62  4a ed 15 6b 83 ab f8 23  |K.$0...bJ..k...#|
+00000250  03 8f 1b 8c 45 1c 57 97  34 ad 83 d8 08 53 f7 d8  |....E.W.4....S..|
+00000260  b9 14 68 9e 26 f0 9a c3  78 9c e9 e3 5f a6 ae 48  |..h.&...x..._..H|
+00000270  b4 88 0e 95 ce 57 4d 64  39 71 77 96 33 87 27 82  |.....WMd9qw.3.'.|
+00000280  41 ee 97 ec 25 ed 83 ae  36 48 d9 20 c2 8c 0a 98  |A...%...6H. ....|
+00000290  b5 96 c9 e1 e8 04 d6 6b  0a 3e 34 bc 8b 49 b9 e0  |.......k.>4..I..|
+000002a0  b4 6e 11 4f 41 14 ee d8  2a 55 d9 88 1c 17 03 03  |.n.OA...*U......|
+000002b0  00 1e 0b 7a 66 33 ad ae  08 ab 8e 75 dd e8 4b a1  |...zf3.....u..K.|
+000002c0  ff 16 5d 43 c6 24 cc d9  0b 6e 71 a3 5e 18 03 94  |..]C.$...nq.^...|
+000002d0  17 03 03 00 13 7c 2a ec  24 22 fd 49 16 b6 4f a1  |.....|*.$".I..O.|
+000002e0  84 54 bf 3e a8 78 af 64                           |.T.>.x.d|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given b/libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given
new file mode 100644 (file)
index 0000000..7a8d6d0
--- /dev/null
@@ -0,0 +1,154 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 e0 01 00 00  dc 03 03 f4 33 e3 f1 5d  |............3..]|
+00000010  94 d0 5e 26 62 41 72 76  29 ff 09 d9 ba 11 e0 f1  |..^&bArv).......|
+00000020  cb 58 56 ba 7d 37 44 09  31 86 b4 20 88 9f f1 76  |.XV.}7D.1.. ...v|
+00000030  f4 fe 3c 7b 4e 77 fb bb  58 76 90 f2 d7 32 21 07  |..<{Nw..Xv...2!.|
+00000040  d8 bf da 67 93 ba 8f e8  e4 e2 48 c3 00 08 13 02  |...g......H.....|
+00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
+00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
+00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
+00000080  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 1e  |................|
+00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
+000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
+000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
+000000c0  24 00 1d 00 20 72 9a 7f  b9 89 71 2f ab 7d 09 a7  |$... r....q/.}..|
+000000d0  8e eb 17 07 21 41 01 3f  d0 3e eb ae 5e 6a 05 4c  |....!A.?.>..^j.L|
+000000e0  74 c3 bb a2 35                                    |t...5|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 88 9f f1 76  |........... ...v|
+00000030  f4 fe 3c 7b 4e 77 fb bb  58 76 90 f2 d7 32 21 07  |..<{Nw..Xv...2!.|
+00000040  d8 bf da 67 93 ba 8f e8  e4 e2 48 c3 13 02 00 00  |...g......H.....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
+00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
+00000080  03 03 00 01 01 17 03 03  00 17 5c 89 3f 32 3d 88  |..........\.?2=.|
+00000090  9e 8a a3 d1 ae 90 75 c1  20 15 cf 41 9d 95 94 76  |......u. ..A...v|
+000000a0  08 17 03 03 00 3e 7c a9  ca b7 2f 71 e0 4c b9 0d  |.....>|.../q.L..|
+000000b0  82 cd be 73 2f fe d2 21  d9 b3 63 fc 53 e0 ff 13  |...s/..!..c.S...|
+000000c0  39 40 98 a5 7a ee ae 0b  c2 bc 90 ca b6 69 8f 48  |9@..z........i.H|
+000000d0  b8 5d 8f 41 62 d6 ad 92  c5 cd 40 bd 77 1c 6c 23  |.].Ab.....@.w.l#|
+000000e0  5d 20 ce 87 17 03 03 02  6d cc 94 31 f8 57 e9 18  |] ......m..1.W..|
+000000f0  04 31 82 f4 53 17 8d 2d  1d f9 58 15 ad 1b 5c bd  |.1..S..-..X...\.|
+00000100  39 85 02 37 87 c7 00 5f  0f df fd 2c cc b3 be ce  |9..7..._...,....|
+00000110  d1 4d 08 7f a7 5c 12 3f  e7 99 67 48 0f c4 11 9e  |.M...\.?..gH....|
+00000120  52 06 a1 ae 8e 6c 9a 80  02 9e 88 1c 70 59 19 40  |R....l......pY.@|
+00000130  d8 9b 01 35 76 f1 2f cf  ba 2a ba 8c 56 90 d2 98  |...5v./..*..V...|
+00000140  e9 f2 53 60 71 55 ef ca  96 8a 45 ee 6f 6e 99 e6  |..S`qU....E.on..|
+00000150  57 a4 9e c4 b6 fa c4 41  fe 72 b0 2b 69 8c f0 d7  |W......A.r.+i...|
+00000160  ea 27 73 b6 a6 8a bc 3c  5f c9 a3 e3 78 ae 04 4c  |.'s....<_...x..L|
+00000170  a5 2f b5 ac 58 63 06 a2  c5 44 99 2f 97 d7 c5 d7  |./..Xc...D./....|
+00000180  4c ea 01 cb c7 f9 11 0e  6d 27 33 13 57 97 b1 7b  |L.......m'3.W..{|
+00000190  50 48 b2 89 f6 ee 67 36  87 22 3e cb 61 2e d7 ff  |PH....g6.">.a...|
+000001a0  99 c7 19 79 ff d8 af 66  95 f3 19 01 f7 67 67 47  |...y...f.....ggG|
+000001b0  a8 c1 c5 56 78 4f 7d 54  63 53 7f ad 2d 35 57 91  |...VxO}TcS..-5W.|
+000001c0  17 3f b3 b4 ce 69 9f d3  8e 50 eb 2d f4 dc c8 87  |.?...i...P.-....|
+000001d0  49 4a 45 88 55 ab e3 8b  75 ac d2 7d 39 d0 ea a9  |IJE.U...u..}9...|
+000001e0  32 9c 44 9e 81 2c 9e fc  2c 4f 2d b2 b1 30 de 2a  |2.D..,..,O-..0.*|
+000001f0  40 22 da d0 f3 3f d6 9e  51 14 d2 84 41 20 d3 f0  |@"...?..Q...A ..|
+00000200  58 b5 ba 68 62 12 d1 4a  ab 37 72 4e 56 8e 80 0f  |X..hb..J.7rNV...|
+00000210  0d 85 e7 1c 91 d3 1e ee  73 d0 9e 1b 6f 1b 53 1b  |........s...o.S.|
+00000220  c2 28 5b 9b ef 20 e3 c2  aa 4b 87 26 d9 5e 52 ef  |.([.. ...K.&.^R.|
+00000230  79 9d c8 4b b1 38 eb 46  73 85 ac 0b 96 34 22 61  |y..K.8.Fs....4"a|
+00000240  cc cd 11 9e fb 30 b9 b7  4f 09 17 79 98 83 09 65  |.....0..O..y...e|
+00000250  81 de af b1 2e f1 15 0c  4a bd fd 65 da 7b 7c 00  |........J..e.{|.|
+00000260  98 fd 2f 97 de 1c e9 05  16 de b2 50 d2 5c e1 cd  |../........P.\..|
+00000270  19 ef d3 48 5c 03 dd ca  b5 62 ce 17 b4 3c 2d e9  |...H\....b...<-.|
+00000280  a8 78 6c b9 10 9c d9 2f  89 b1 7e 32 05 f7 6d d3  |.xl..../..~2..m.|
+00000290  1c 30 10 1b 30 dc 17 7c  c7 52 cf 93 18 b9 4f b1  |.0..0..|.R....O.|
+000002a0  cd 05 e5 73 e6 00 b5 d0  42 98 cd cd 14 54 b0 01  |...s....B....T..|
+000002b0  92 49 a9 e4 12 27 f9 67  df 3b b3 e9 08 d3 f6 53  |.I...'.g.;.....S|
+000002c0  a7 5b 71 9f 96 3b 7e ca  ac c6 81 a2 14 66 64 bf  |.[q..;~......fd.|
+000002d0  ff 0f 8d 5f 23 63 6e 39  7e 9c 83 3f e8 4c db d6  |..._#cn9~..?.L..|
+000002e0  91 6d 47 8d 54 f3 bd 44  de e8 13 9b fd 84 5c 97  |.mG.T..D......\.|
+000002f0  81 a2 c6 33 d8 d9 4e ce  8d b6 35 2f e3 a2 3a 52  |...3..N...5/..:R|
+00000300  2f 6a fa 1a 22 42 07 19  41 55 5a 20 ac 12 d8 13  |/j.."B..AUZ ....|
+00000310  4c 2e 41 34 81 c7 0d 83  d1 5d 3f f9 02 e6 43 69  |L.A4.....]?...Ci|
+00000320  b6 08 95 fb 8a fc 27 cc  d7 61 52 82 89 a3 bb 84  |......'..aR.....|
+00000330  e4 53 a4 b8 96 cb 8c 53  c0 4d 16 95 a9 d1 70 23  |.S.....S.M....p#|
+00000340  52 5e 7e f6 01 a3 1e 45  28 53 18 23 a0 df ab ee  |R^~....E(S.#....|
+00000350  2f 09 4c 02 8e dc 17 03  03 00 99 b4 38 62 ca 65  |/.L.........8b.e|
+00000360  1c cf 0a ed d7 d9 65 f4  db d2 53 7b f2 bf 2a 98  |......e...S{..*.|
+00000370  72 e8 2d 51 41 c2 b7 af  5e 84 40 23 64 51 16 bc  |r.-QA...^.@#dQ..|
+00000380  cd 3a f4 78 c2 01 c1 4f  ba 6f 4a 60 c4 06 76 df  |.:.x...O.oJ`..v.|
+00000390  f7 19 7a aa b0 22 91 95  11 b0 07 32 50 30 be 6a  |..z..".....2P0.j|
+000003a0  ec 6b 94 49 8b b7 04 35  32 8f b2 71 42 9e d8 e3  |.k.I...52..qB...|
+000003b0  c8 33 32 27 63 d1 fb 6f  21 9b f6 08 aa 6f be 56  |.32'c..o!....o.V|
+000003c0  3c a0 77 af 7c b9 e2 a6  51 27 12 fc b3 81 c0 d7  |<.w.|...Q'......|
+000003d0  53 58 94 b5 2b 34 ff 06  59 42 2e c4 aa 44 07 46  |SX..+4..YB...D.F|
+000003e0  8e af 4d d8 11 d8 56 f1  4c cb 2f aa 87 99 2e 08  |..M...V.L./.....|
+000003f0  9a 4a e5 11 17 03 03 00  45 a6 e5 85 12 20 f0 6d  |.J......E.... .m|
+00000400  2a d0 45 c0 8a f2 12 f9  61 20 ed 30 91 2d a1 a9  |*.E.....a .0.-..|
+00000410  33 6f 2a 70 46 64 b0 2c  79 19 f4 11 0b 7e 3b c0  |3o*pFd.,y....~;.|
+00000420  bb e8 21 bc f6 ab 09 de  ef 16 17 65 32 0a 80 47  |..!........e2..G|
+00000430  25 cd 0b 93 8c 14 e2 1e  1e ff 24 61 6d 4a        |%.........$amJ|
+>>> Flow 3 (client to server)
+00000000  14 03 03 00 01 01 17 03  03 01 50 ff 2c 08 a6 b9  |..........P.,...|
+00000010  a0 6d 5f 39 45 8f 85 d5  95 80 60 2c 9c 13 3f f3  |.m_9E.....`,..?.|
+00000020  e4 e8 c4 34 4d 2f 58 78  a6 51 57 5b 12 85 95 57  |...4M/Xx.QW[...W|
+00000030  a3 04 01 5c f1 01 a0 ae  4f 46 1d c9 ab 92 c3 43  |...\....OF.....C|
+00000040  89 a9 e8 8a 5b e4 eb d9  29 4a bd 80 4a b7 bb 63  |....[...)J..J..c|
+00000050  07 ca 14 47 af 5f 21 dc  85 6b 04 64 aa d3 61 4b  |...G._!..k.d..aK|
+00000060  5b 76 c9 ec 37 71 d8 fe  86 5a 12 a7 0d c3 a3 98  |[v..7q...Z......|
+00000070  09 a9 6f 03 2b a1 e2 43  35 be 9c 34 b5 4e 0c 05  |..o.+..C5..4.N..|
+00000080  fa 64 d8 9e 37 36 83 08  be ba 4d 30 2a d5 9f 43  |.d..76....M0*..C|
+00000090  38 92 af 63 56 1e df 03  51 86 e9 26 5e 28 97 ff  |8..cV...Q..&^(..|
+000000a0  cf 91 6d fe cc a1 02 1a  34 a7 5d d2 25 20 5b ae  |..m.....4.].% [.|
+000000b0  ef 9e fe 0f ef 5d 74 f4  f5 14 54 47 33 f9 15 5d  |.....]t...TG3..]|
+000000c0  6f 85 d8 16 ed 3b 1e 3e  c5 72 2f 17 65 98 5c 4c  |o....;.>.r/.e.\L|
+000000d0  84 c2 f4 44 6b c2 3d 04  5c 81 ef ec b8 40 e6 cb  |...Dk.=.\....@..|
+000000e0  20 87 3c 3b b9 38 92 5e  48 dd 20 fe e9 a8 e6 9b  | .<;.8.^H. .....|
+000000f0  14 2b e7 d3 77 b7 44 ed  c7 eb cb 0c c8 d6 db 06  |.+..w.D.........|
+00000100  3c c7 7f a3 09 b4 00 5c  93 10 79 76 0e 45 f6 d2  |<......\..yv.E..|
+00000110  8b c0 91 91 7a 2d 17 e6  10 95 a2 9a df c4 da 85  |....z-..........|
+00000120  88 66 f4 bb 9b d5 0f 32  f2 f2 dc a6 16 b5 e9 4d  |.f.....2.......M|
+00000130  f3 43 17 77 f5 51 ca 57  b8 db d1 f4 8a 22 b2 ec  |.C.w.Q.W....."..|
+00000140  22 27 cb 22 b8 c1 9a 17  63 01 e7 5d 2a 2b ad 03  |"'."....c..]*+..|
+00000150  65 be 0d 55 c5 aa 46 31  95 df 47 17 03 03 00 59  |e..U..F1..G....Y|
+00000160  d1 98 94 ed e8 1e fb 74  04 5c 11 9b eb 11 29 20  |.......t.\....) |
+00000170  05 39 94 9f c8 e1 2f a5  2d 91 23 69 ca 15 34 8b  |.9..../.-.#i..4.|
+00000180  d7 3c 60 62 3e ae 7f fc  15 14 f1 51 a0 0d 06 30  |.<`b>......Q...0|
+00000190  e7 09 8a ca 60 51 77 6d  31 b5 ac fe a1 40 ca 0c  |....`Qwm1....@..|
+000001a0  78 13 69 18 eb 65 41 72  c1 e9 7c dd 31 db fd 53  |x.i..eAr..|.1..S|
+000001b0  16 b8 82 9e 9f b9 46 68  1c 17 03 03 00 45 46 f7  |......Fh.....EF.|
+000001c0  f1 53 9c 4b 79 76 09 10  00 b6 c0 4c c4 b2 cc 4a  |.S.Kyv.....L...J|
+000001d0  55 41 29 28 bd b6 54 1c  56 ec 85 75 c0 52 11 ce  |UA)(..T.V..u.R..|
+000001e0  93 67 61 a8 52 2c 77 5d  b0 b1 6b e2 02 93 65 f4  |.ga.R,w]..k...e.|
+000001f0  3b d9 65 c5 5f 2b 13 c2  09 c1 c1 5d 83 8a cb 6b  |;.e._+.....]...k|
+00000200  db 40 e3                                          |.@.|
+>>> Flow 4 (server to client)
+00000000  17 03 03 01 da 0d f9 80  98 7a 44 ce b5 d0 2d 10  |.........zD...-.|
+00000010  54 40 c8 5a e4 28 ba df  18 61 f5 d7 84 a5 38 d2  |T@.Z.(...a....8.|
+00000020  d5 81 76 0e 81 d1 da 9e  99 24 81 7b 5a d0 d5 44  |..v......$.{Z..D|
+00000030  df db 71 ee 84 67 f8 74  db 60 77 17 41 1f 90 1e  |..q..g.t.`w.A...|
+00000040  53 1c e2 bf dc d1 b9 4e  50 5b 13 76 93 e5 9b 7a  |S......NP[.v...z|
+00000050  98 48 36 7d fa a8 76 69  49 e4 e9 c4 00 ad 85 c3  |.H6}..viI.......|
+00000060  cf 02 3e 57 90 9b 38 e0  d8 0e 23 c9 f9 34 15 6f  |..>W..8...#..4.o|
+00000070  9f b5 fe 5b 08 f9 87 11  36 7e d6 29 f0 99 ee e0  |...[....6~.)....|
+00000080  4a ec 6a ff 6d 57 26 6d  8c 73 3f f6 1e 25 49 38  |J.j.mW&m.s?..%I8|
+00000090  0c f1 dd 6a 32 90 2f 72  74 fd 33 6e 6a cb f3 b4  |...j2./rt.3nj...|
+000000a0  35 ed 54 44 10 8c 2e 4d  9a 9d 83 e9 27 3e 03 d4  |5.TD...M....'>..|
+000000b0  8c 10 c2 54 99 5c ab 59  ab b6 cd 39 10 4e 74 ba  |...T.\.Y...9.Nt.|
+000000c0  84 96 6f be 53 44 27 16  9f 64 36 63 61 75 ab 56  |..o.SD'..d6cau.V|
+000000d0  c8 27 4c 31 ed cb 46 32  f6 50 f0 00 1c e3 57 40  |.'L1..F2.P....W@|
+000000e0  d5 68 6e 4a 4b 9b 8e 57  ab d3 a4 c5 f5 f5 92 7e  |.hnJK..W.......~|
+000000f0  ac 67 a7 67 e9 e0 74 66  d9 00 53 0f 4f 96 73 4d  |.g.g..tf..S.O.sM|
+00000100  74 7e 47 9b fa 17 72 55  7e f3 a2 88 ad 07 dc 18  |t~G...rU~.......|
+00000110  b2 26 29 6f 70 cc 35 72  af 81 c2 65 5c 88 3a c7  |.&)op.5r...e\.:.|
+00000120  d1 45 73 91 9d 1f f8 85  ee 89 dc af 6e 80 97 a0  |.Es.........n...|
+00000130  d9 32 19 dc 15 2a d5 86  46 ae 7d ba b3 e6 3d 81  |.2...*..F.}...=.|
+00000140  65 b4 69 82 a8 9c 0f 26  63 a6 9c f2 3d ce 0f 79  |e.i....&c...=..y|
+00000150  a8 08 d3 2b c0 e1 9e c7  ef 1a ca 98 95 d6 c3 d5  |...+............|
+00000160  9c d6 ee 0b 12 98 4f 82  2f 98 df 47 6e 7a 04 94  |......O./..Gnz..|
+00000170  5d ae c5 51 a5 d5 21 d4  a6 f7 e7 3a bd 51 53 24  |]..Q..!....:.QS$|
+00000180  b8 a6 ed 5b 34 30 1d 4a  19 40 c1 cf 5f 21 3a 95  |...[40.J.@.._!:.|
+00000190  ee 82 db 5f c8 54 87 da  45 df ff f3 51 b5 43 03  |..._.T..E...Q.C.|
+000001a0  ee c5 84 27 c2 51 1c 23  8c 87 c4 d3 79 e7 5b 44  |...'.Q.#....y.[D|
+000001b0  8f 2e be 2a 86 22 9a 7c  50 c4 09 c7 2f d6 cd d8  |...*.".|P.../...|
+000001c0  b3 d5 d2 e3 33 89 89 04  5f f3 46 34 40 60 91 c2  |....3..._.F4@`..|
+000001d0  35 e1 3c 39 17 62 fb 99  32 b9 9a be 66 3a 36 17  |5.<9.b..2...f:6.|
+000001e0  03 03 00 1e 2a 22 40 15  e6 80 93 5f 27 1a a1 39  |....*"@...._'..9|
+000001f0  d4 b1 a0 b0 e8 d6 46 1d  d7 91 06 67 2a 81 a8 65  |......F....g*..e|
+00000200  57 ad 17 03 03 00 13 11  e9 c2 d1 66 5e 3f 41 14  |W..........f^?A.|
+00000210  82 14 88 58 57 82 2d 0e  ba 8b                    |...XW.-...|
index cbd8c75e9fbc51b364b0ef0911483bddf614d8d2..97fd482c32cd86806516cf2bccfec22c539098ab 100644 (file)
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 c6 01 00 00  c2 03 03 9f dd 5a e8 c2  |.............Z..|
-00000010  fa 2f 38 45 33 8d f2 ab  67 03 f6 cc ba 9d 8b 33  |./8E3...g......3|
-00000020  69 c8 c6 50 f4 2e 1b 2b  dc 2b 2d 20 ab eb f9 db  |i..P...+.+- ....|
-00000030  71 a7 b4 eb 9a e0 17 04  2e a8 d2 c7 65 51 71 a3  |q...........eQq.|
-00000040  9a a3 5a 64 38 45 49 dc  e9 e9 e2 96 00 08 13 02  |..Zd8EI.........|
+00000000  16 03 01 00 c6 01 00 00  c2 03 03 51 9e 53 ed 5f  |...........Q.S._|
+00000010  cd 05 55 f2 c7 47 8c e9  90 25 c7 71 4f 73 45 3b  |..U..G...%.qOsE;|
+00000020  03 bf 42 bd 5a 4a b9 56  ef ba e0 20 04 08 64 e1  |..B.ZJ.V... ..d.|
+00000030  9d db 92 a5 4e 0c 6e 90  71 c3 ed 51 c6 23 f5 6e  |....N.n.q..Q.#.n|
+00000040  64 55 94 28 37 54 58 00  23 a0 53 56 00 08 13 02  |dU.(7TX.#.SV....|
 00000050  13 03 13 01 00 ff 01 00  00 71 00 00 00 0e 00 0c  |.........q......|
 00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
 00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
 00000080  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 04  |................|
 00000090  00 02 08 04 00 2b 00 03  02 03 04 00 2d 00 02 01  |.....+......-...|
-000000a0  01 00 33 00 26 00 24 00  1d 00 20 08 a9 6d 37 e7  |..3.&.$... ..m7.|
-000000b0  3b e8 ab 4c d3 81 41 6e  ac 3d dc 45 94 72 9c 9d  |;..L..An.=.E.r..|
-000000c0  43 32 f7 d0 de 5a e0 6b  b3 11 23                 |C2...Z.k..#|
+000000a0  01 00 33 00 26 00 24 00  1d 00 20 2b 33 eb 7b ec  |..3.&.$... +3.{.|
+000000b0  b5 04 57 a0 f4 f8 3c 19  f2 8f 81 11 b0 2e 91 88  |..W...<.........|
+000000c0  d8 be ba f3 6f 5a 80 db  a3 e6 1e                 |....oZ.....|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 ab eb f9 db  |........... ....|
-00000030  71 a7 b4 eb 9a e0 17 04  2e a8 d2 c7 65 51 71 a3  |q...........eQq.|
-00000040  9a a3 5a 64 38 45 49 dc  e9 e9 e2 96 13 02 00 00  |..Zd8EI.........|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 04 08 64 e1  |........... ..d.|
+00000030  9d db 92 a5 4e 0c 6e 90  71 c3 ed 51 c6 23 f5 6e  |....N.n.q..Q.#.n|
+00000040  64 55 94 28 37 54 58 00  23 a0 53 56 13 02 00 00  |dU.(7TX.#.SV....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 0f f6 f3 45 0e 04  |.............E..|
-00000090  df 70 96 7c 7a a6 a7 31  7a 7f b8 43 53 ab 02 32  |.p.|z..1z..CS..2|
-000000a0  23 17 03 03 00 3c bc 1f  27 c5 81 3d d3 25 22 34  |#....<..'..=.%"4|
-000000b0  af e3 a4 6f 22 14 e0 e8  2b 9e 91 6b b5 a5 19 b7  |...o"...+..k....|
-000000c0  32 5d a9 2a 7a ff 30 71  7b a8 32 01 00 b8 52 cc  |2].*z.0q{.2...R.|
-000000d0  5e 46 ab 4d c0 10 a6 8d  0d 04 8a 26 5c d1 3a 62  |^F.M.......&\.:b|
-000000e0  67 07 17 03 03 02 6d 54  af e4 20 90 dd 21 b4 04  |g.....mT.. ..!..|
-000000f0  46 0c 01 7f 5c c4 4b 08  87 4f f0 fd 9f 64 34 55  |F...\.K..O...d4U|
-00000100  3e 30 81 52 3a c7 a6 3c  7a 0d 3e e8 b0 9c 38 df  |>0.R:..<z.>...8.|
-00000110  2a bf 29 e0 cb 13 04 0a  d0 ab 65 fc d1 0c 6a ae  |*.).......e...j.|
-00000120  36 03 81 56 7b dd 1d 15  a8 81 de e2 85 25 5c e5  |6..V{........%\.|
-00000130  a8 38 44 dd 04 d7 52 18  0e 27 8c a3 be c3 54 f7  |.8D...R..'....T.|
-00000140  54 a2 ec df 6d cb ae cf  dd 77 78 01 e0 0c 02 76  |T...m....wx....v|
-00000150  65 e3 da da 5b 96 2c 57  fa c5 a2 6e 3f 9f 93 f5  |e...[.,W...n?...|
-00000160  af b3 fa 27 d5 46 94 c1  8c 4e 0b d5 c7 f8 21 07  |...'.F...N....!.|
-00000170  08 09 27 87 a6 19 5c b1  a8 d5 c1 66 3d 0a d9 bb  |..'...\....f=...|
-00000180  80 77 2b 24 cf 2e 7a 51  84 37 e1 e7 05 cb e9 90  |.w+$..zQ.7......|
-00000190  47 0e 5f 32 25 60 81 2c  93 43 a5 1a f5 b0 84 13  |G._2%`.,.C......|
-000001a0  2f e8 37 d6 b6 4b bc 4a  ad 23 41 77 b0 b7 7e a7  |/.7..K.J.#Aw..~.|
-000001b0  74 db d2 13 e5 12 ab 43  51 68 da 9a d6 68 f2 82  |t......CQh...h..|
-000001c0  aa 73 49 6e e4 2e 24 41  e3 5c 22 c4 88 8b 03 8b  |.sIn..$A.\".....|
-000001d0  2d 14 b9 55 12 60 50 a2  d3 8a a9 8f 7c c5 d9 f6  |-..U.`P.....|...|
-000001e0  f2 23 93 a2 a6 55 eb 27  3a c5 f5 f8 82 0e 23 43  |.#...U.':.....#C|
-000001f0  bd 3a 2d b5 e3 e3 8f d3  a6 eb 30 56 a4 7f 1c 08  |.:-.......0V....|
-00000200  72 85 77 22 36 f5 7a b8  d4 b8 9c e2 1f 47 f6 81  |r.w"6.z......G..|
-00000210  d6 c7 76 4e 97 51 dd 1e  89 b5 b5 12 88 f9 2d ca  |..vN.Q........-.|
-00000220  2e 85 c8 cc cc 95 0d 7e  a8 7e c3 59 85 b2 ca 14  |.......~.~.Y....|
-00000230  d7 cc 50 3b 5e 03 52 77  d3 50 8d e4 50 76 e2 36  |..P;^.Rw.P..Pv.6|
-00000240  82 df b2 69 a2 cf ee 1b  fb 1d 5c a1 83 8b c9 97  |...i......\.....|
-00000250  23 a6 7f 85 87 df d5 59  fc d5 ad 86 c7 2c 9a 92  |#......Y.....,..|
-00000260  b6 1d d1 ee 92 83 92 f9  d8 9e dd e7 d7 05 c5 c8  |................|
-00000270  a5 c2 10 b3 2f 99 4a 4b  fb 8a 5b c7 26 06 18 7a  |..../.JK..[.&..z|
-00000280  1b d4 c1 f4 d4 2c cf a1  5e d2 f0 90 3d a4 2c b7  |.....,..^...=.,.|
-00000290  d4 0a 7b e4 7f 16 29 1a  ad d1 45 d5 b8 9b 07 4a  |..{...)...E....J|
-000002a0  ab 61 32 bb 27 ac 61 c6  74 56 ec fd 93 01 a0 53  |.a2.'.a.tV.....S|
-000002b0  6b 0c 8b 3f 55 3d 53 fd  cf f6 da d7 5a c6 8e 8f  |k..?U=S.....Z...|
-000002c0  c9 e1 fd 79 6c 85 22 08  2a a4 bc 82 ea f6 53 d6  |...yl.".*.....S.|
-000002d0  80 02 a7 f5 49 0c 1f c3  4c 44 f2 7f 56 3a 5f 65  |....I...LD..V:_e|
-000002e0  d1 4e 62 17 61 6b f9 75  94 e7 f9 5b da 8f 65 dd  |.Nb.ak.u...[..e.|
-000002f0  d0 98 99 72 35 b7 0e 79  3c b5 94 2b a2 19 94 e3  |...r5..y<..+....|
-00000300  7b 31 cb 74 e4 41 c6 c3  92 0b 7a 2e 48 b5 50 2b  |{1.t.A....z.H.P+|
-00000310  23 b6 c1 de 6c 5e 57 c9  36 e8 a1 07 4d d1 73 a8  |#...l^W.6...M.s.|
-00000320  c0 7b 67 1f fb 70 01 da  86 fb e0 73 ad 79 8c 9f  |.{g..p.....s.y..|
-00000330  7f 28 61 e9 2c d5 f0 d5  85 e4 e9 db 87 26 f9 dc  |.(a.,........&..|
-00000340  af e1 ed 4d 79 f0 5d 14  10 08 70 70 66 6d 5b 32  |...My.]...ppfm[2|
-00000350  22 09 7f 78 17 03 03 00  99 16 32 bb fc 9a 38 88  |"..x......2...8.|
-00000360  17 0f d1 03 15 b2 70 f3  ee d7 86 ec 67 f0 f6 aa  |......p.....g...|
-00000370  df 63 cf 4e 4c e3 f5 7f  67 3f ef 80 b0 68 b3 d2  |.c.NL...g?...h..|
-00000380  a6 91 59 1a dd 9c 9b 26  7a 4e f1 e4 cb df cf 9f  |..Y....&zN......|
-00000390  51 26 76 88 02 73 e7 99  15 58 06 af cb 14 52 1e  |Q&v..s...X....R.|
-000003a0  18 4f 81 f9 62 2b 4b bd  dc e6 3b fc 5f ff e6 4b  |.O..b+K...;._..K|
-000003b0  b7 4b 47 39 70 69 69 89  2b ca 9a 5e 32 91 7d e9  |.KG9pii.+..^2.}.|
-000003c0  2f ae d4 b2 f8 13 89 57  4c 59 55 1e e5 41 66 34  |/......WLYU..Af4|
-000003d0  b3 1e c3 e9 b0 79 7b 14  f8 c0 b5 16 c9 e3 7e ce  |.....y{.......~.|
-000003e0  3a 2c 38 85 ea ca 91 3f  cf c0 fb 61 4d 24 b4 c5  |:,8....?...aM$..|
-000003f0  b5 6a 17 03 03 00 45 3a  7a af a4 51 1c f9 07 39  |.j....E:z..Q...9|
-00000400  73 d5 ca e2 6f ab 7c f3  ef b0 16 ea 17 0d 03 cb  |s...o.|.........|
-00000410  07 fb 40 1b ae 9a 5c e9  1f c1 aa c9 e5 f5 1b 4d  |..@...\........M|
-00000420  1b 4b 2c 0b 8d 86 24 06  9a 64 ba a5 fd e3 69 dd  |.K,...$..d....i.|
-00000430  53 e5 ac 9a 2f 37 fc fd  e3 c1 b4 b7              |S.../7......|
+00000080  03 03 00 01 01 17 03 03  00 17 69 01 91 62 e2 e7  |..........i..b..|
+00000090  ee 89 ea b5 55 95 a2 3e  69 09 0a 11 85 42 e8 fd  |....U..>i....B..|
+000000a0  c5 17 03 03 00 3e 2d 4a  1f 1b 45 7a f5 bf f8 50  |.....>-J..Ez...P|
+000000b0  b7 90 b7 19 24 8c c6 da  49 79 83 f4 52 10 ed 5d  |....$...Iy..R..]|
+000000c0  fa 26 91 28 13 bc a9 c2  f9 6b 4c e9 f7 79 cb 87  |.&.(.....kL..y..|
+000000d0  1d ac a4 7a d9 84 25 e8  68 27 67 7f 85 f9 e1 3e  |...z..%.h'g....>|
+000000e0  04 2c fe aa 17 03 03 02  6d ca f8 97 e5 6f f8 f7  |.,......m....o..|
+000000f0  1a 8b a1 c2 81 b5 a4 f3  6d d9 83 30 00 6b 4a 92  |........m..0.kJ.|
+00000100  99 0c c1 71 69 c6 57 0b  c6 09 8c dd 17 19 14 4f  |...qi.W........O|
+00000110  7f 22 f1 d1 28 13 6c b7  e7 89 d7 4b b2 cd 56 e4  |."..(.l....K..V.|
+00000120  b6 b8 7c ca 18 41 43 e7  74 ef 39 c6 b9 dd 3f 23  |..|..AC.t.9...?#|
+00000130  62 fa 59 70 1c 7c ff e9  41 d0 04 fe ae f4 25 75  |b.Yp.|..A.....%u|
+00000140  0f b1 cf b9 b0 bb 95 50  be 9a be 9a 7a 1c 03 3b  |.......P....z..;|
+00000150  ae 01 ee 91 aa f6 7a 47  40 67 f4 1b 5b 86 36 58  |......zG@g..[.6X|
+00000160  88 0f 68 1a 9d cd 1a e1  aa 3e 61 77 67 fd 5a aa  |..h......>awg.Z.|
+00000170  96 b9 8f cd fe 28 68 ed  25 0f 7f 8a a1 31 24 44  |.....(h.%....1$D|
+00000180  bd 4a 03 e8 f8 cc 63 d1  fc 12 eb c0 47 4c 30 1e  |.J....c.....GL0.|
+00000190  82 77 4d 45 50 03 d4 2c  0b a3 d7 af 0c 7e 61 68  |.wMEP..,.....~ah|
+000001a0  98 c0 5f cf b9 54 75 be  76 08 9e 68 07 62 96 8c  |.._..Tu.v..h.b..|
+000001b0  b8 24 0e b9 c4 2a 27 72  72 de 00 d1 38 a5 42 8b  |.$...*'rr...8.B.|
+000001c0  38 23 78 9e 68 c2 d6 62  db 82 5a 46 5b 57 19 a4  |8#x.h..b..ZF[W..|
+000001d0  11 00 7c e9 14 56 79 ea  ac 24 26 c0 d4 16 45 8c  |..|..Vy..$&...E.|
+000001e0  28 ca 88 6f 72 f3 f8 18  26 3f 00 e5 62 c2 9f 67  |(..or...&?..b..g|
+000001f0  46 9f 99 f1 61 af b7 b0  05 42 59 13 5b 0f 0d a7  |F...a....BY.[...|
+00000200  bc 9e 7e 3f 6e 24 74 bf  93 a0 9d 09 89 a8 a6 4d  |..~?n$t........M|
+00000210  07 5d aa 24 2c 86 e5 80  7f 4b a3 c3 02 41 8b e5  |.].$,....K...A..|
+00000220  56 7a be 9f 5f b0 9d 41  51 e6 b8 d8 67 66 df 89  |Vz.._..AQ...gf..|
+00000230  00 07 83 06 8b 5b 84 e6  8a 92 3c de 1f 4c 2b bc  |.....[....<..L+.|
+00000240  9d 7f ec e8 c3 0e ee 4a  80 2c e4 f0 d7 84 b3 a8  |.......J.,......|
+00000250  7d c7 f5 91 b9 91 43 14  45 77 a4 84 f7 a6 72 f0  |}.....C.Ew....r.|
+00000260  cd a2 7f 12 b6 e2 6f d3  93 5a d9 c8 39 4b 95 29  |......o..Z..9K.)|
+00000270  2a be 4c dd a5 82 ec da  ee 98 c9 0f 10 18 e4 da  |*.L.............|
+00000280  f4 3f 33 86 11 e4 5c 36  05 07 02 d1 21 5d 48 5f  |.?3...\6....!]H_|
+00000290  8b ec b1 33 25 65 ef 33  d4 87 6e f9 cf f8 e4 79  |...3%e.3..n....y|
+000002a0  f8 23 82 10 1e 5e c5 e7  60 82 6d b5 57 3c 54 f3  |.#...^..`.m.W<T.|
+000002b0  be ed 1c 17 4c cc 37 87  bd c3 0e a9 36 16 1d 2d  |....L.7.....6..-|
+000002c0  c7 f1 54 a9 62 c4 f9 d1  4e c1 23 db ab f6 f7 56  |..T.b...N.#....V|
+000002d0  93 f1 8b f3 38 1d 3f ed  9f 0f 82 e2 e2 55 49 ef  |....8.?......UI.|
+000002e0  95 88 ff 95 88 f2 98 cd  d6 8a d8 23 d3 ed c5 d0  |...........#....|
+000002f0  3c 30 71 ef 41 77 00 ae  68 24 44 1e ac 1a 8d 98  |<0q.Aw..h$D.....|
+00000300  e5 c9 7b a4 46 c9 61 5f  20 25 0f 0c ef 61 5e 3b  |..{.F.a_ %...a^;|
+00000310  eb 6f 25 fe e8 61 3f 7c  6a e1 74 3f c3 96 bc 40  |.o%..a?|j.t?...@|
+00000320  98 47 33 2e 6b 94 56 d0  74 b9 ac 8c d2 33 ae 87  |.G3.k.V.t....3..|
+00000330  91 84 19 43 d6 4d 9d 2a  0d c7 20 70 43 00 84 19  |...C.M.*.. pC...|
+00000340  f3 55 54 b4 01 18 5c cb  0a a8 7e b0 27 71 f0 ca  |.UT...\...~.'q..|
+00000350  85 f3 c8 8e 12 b1 17 03  03 00 99 c9 43 7b 17 aa  |............C{..|
+00000360  6d 5d 20 4c a9 bb 39 19  d4 c4 3e 12 4f 71 06 6e  |m] L..9...>.Oq.n|
+00000370  b0 04 89 76 d0 4e be 85  cc b1 dc c6 f0 ba 0c a8  |...v.N..........|
+00000380  81 86 0d 8d bf d0 93 c5  3a 28 a8 ac df f9 7c eb  |........:(....|.|
+00000390  10 4b bc dc 1b a7 4d f9  25 b3 09 9a 80 6f 83 0e  |.K....M.%....o..|
+000003a0  9d 62 a9 6e 33 d8 85 96  78 3d f1 1f b7 6b 87 f7  |.b.n3...x=...k..|
+000003b0  30 dd 09 ea 06 f3 cc 7a  82 96 e8 f7 cd f2 99 7f  |0......z........|
+000003c0  53 da dd ab b6 f2 da 94  94 cf b1 6f 21 e2 7b 9f  |S..........o!.{.|
+000003d0  90 ab 18 fc 61 84 d6 97  87 a0 14 2e cf 02 42 74  |....a.........Bt|
+000003e0  68 a0 5b cc 1a 63 fc 4e  e0 a9 ca 59 89 ae fc ef  |h.[..c.N...Y....|
+000003f0  41 54 65 cf 17 03 03 00  45 ba bb ae e4 a3 04 5c  |ATe.....E......\|
+00000400  30 19 79 ff 6a b5 0c dc  ab c8 cd e5 bf 2d 9c 3e  |0.y.j........-.>|
+00000410  44 98 1b cd bb 2a 08 10  75 ab b9 d1 62 a5 e1 21  |D....*..u...b..!|
+00000420  51 32 75 38 89 67 83 3b  3f f5 e7 71 53 8f 2f d0  |Q2u8.g.;?..qS./.|
+00000430  81 98 cb 75 b2 99 40 bf  01 a0 bb 0b b0 0e        |...u..@.......|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 1c af 9f 29 61  |..............)a|
-00000010  e3 1f bf c8 44 89 cf 28  10 cb e5 63 05 0c fa cf  |....D..(...c....|
-00000020  38 79 7c 63 5d 1d 6b 40  68 ea 54 41 3d 3a 39 83  |8y|c].k@h.TA=:9.|
-00000030  8b e2 29 e9 f6 4d 4e e4  14 33 36 78 b2 bb 01 e1  |..)..MN..36x....|
-00000040  84 c4 59 30 01 65 9b 6b  b1 35 2d 3e 02 fa 9b db  |..Y0.e.k.5->....|
-00000050  51 d1 25 bc 4d fa a1 e8  24 e9 7e cc 97 b0 f2 40  |Q.%.M...$.~....@|
-00000060  92 0f b0 1c 0a 0a 24 3e  77 d5 4f 0f c0 54 e7 f5  |......$>w.O..T..|
-00000070  56 87 ff 46 0a 12 7f 49  18 76 40 3d ce 64 53 a8  |V..F...I.v@=.dS.|
-00000080  f8 1a 95 70 dc 8f 1c b0  2d ba 55 42 89 1d fa 9a  |...p....-.UB....|
-00000090  cf d5 ba f0 fb f8 fe ad  c8 5f e0 47 28 ce 48 2f  |........._.G(.H/|
-000000a0  a3 6c 7c 05 04 5f 3f 0a  95 ca 04 2f 6a b3 02 9c  |.l|.._?..../j...|
-000000b0  f3 23 d9 fd 13 75 45 5d  a6 22 3f 72 6d 7e 35 60  |.#...uE]."?rm~5`|
-000000c0  bd c1 b3 8d d4 42 4a b8  69 31 82 0c 83 94 84 76  |.....BJ.i1.....v|
-000000d0  77 5e ca 19 8c d2 4f b1  94 71 2d 3d e9 34 3b 39  |w^....O..q-=.4;9|
-000000e0  7f f0 b1 0b 8c e7 18 7e  37 89 c9 98 38 31 21 39  |.......~7...81!9|
-000000f0  a4 52 b8 d0 0e 09 fb eb  c1 e2 ef f1 37 4f d2 29  |.R..........7O.)|
-00000100  13 4b 87 f9 88 19 71 bd  d7 48 c9 8f 94 a3 51 4e  |.K....q..H....QN|
-00000110  65 4b 66 8a 48 9b 33 bf  14 70 24 24 e3 1c b3 6c  |eKf.H.3..p$$...l|
-00000120  0d f3 b1 74 5a bd a6 a4  f3 e9 1f 95 81 88 6d cb  |...tZ.........m.|
-00000130  19 44 67 b6 ee f7 65 af  bf ec 0a 55 13 a6 65 41  |.Dg...e....U..eA|
-00000140  49 4f be 8f c5 f2 a7 7c  27 ac ad fa 02 a5 75 54  |IO.....|'.....uT|
-00000150  53 a5 a9 b5 7f b9 7d 70  2e 2d 48 27 fe 63 e6 ab  |S.....}p.-H'.c..|
-00000160  ea 13 47 0e 8f a5 8d 19  42 0f 8c 26 ba cd a2 98  |..G.....B..&....|
-00000170  f5 e3 28 a7 a1 6d 56 95  0b 7f a1 c2 5e 77 56 81  |..(..mV.....^wV.|
-00000180  5d c8 7f a8 00 4c a4 09  c1 ed 43 0e a2 65 8f 66  |]....L....C..e.f|
-00000190  47 02 0f 0d 46 d5 42 d8  f5 e8 a7 f2 50 1b 09 02  |G...F.B.....P...|
-000001a0  4d a9 39 78 6b fc 24 23  4b 2a 49 ef b7 60 70 78  |M.9xk.$#K*I..`px|
-000001b0  f3 6f a0 2e 8f e3 20 b6  b9 76 ce 4d e4 56 e0 f3  |.o.... ..v.M.V..|
-000001c0  b8 9f d2 02 f7 63 e9 80  ed 43 16 49 c9 3a c2 41  |.....c...C.I.:.A|
-000001d0  8c f9 98 b7 3a 31 cb e6  78 3b ad ee 5f 52 c3 0a  |....:1..x;.._R..|
-000001e0  d7 dc 5f 67 89 6a 0a db  1f 7f 4b fc 08 0e a2 e1  |.._g.j....K.....|
-000001f0  23 4b d6 a0 36 10 c7 e5  95 71 86 cb 1a 70 89 55  |#K..6....q...p.U|
-00000200  2c 58 8a 55 f8 26 89 b1  40 1e 11 b0 b5 3e 0d eb  |,X.U.&..@....>..|
-00000210  33 cb 37 1c 80 6c b7 0e  84 96 a0 67 17 03 03 00  |3.7..l.....g....|
-00000220  99 ae 4c b5 06 1e 69 cb  7d 28 42 7f 47 c8 1b bf  |..L...i.}(B.G...|
-00000230  8c 0a af 18 fc 5a 4d db  2c c5 b3 7d cc e5 28 be  |.....ZM.,..}..(.|
-00000240  ec 3a f7 e4 ec b1 11 01  67 f6 3b 0e a6 55 03 67  |.:......g.;..U.g|
-00000250  76 8c 3f d3 0a cc 97 90  f2 51 d4 ee 58 3e 9c 78  |v.?......Q..X>.x|
-00000260  e1 b4 57 4d 42 c1 fd e1  4c c5 6e 1f 5e 8e d9 fd  |..WMB...L.n.^...|
-00000270  f9 71 86 c9 63 7c 42 df  53 b0 99 06 3d 21 3e 06  |.q..c|B.S...=!>.|
-00000280  d7 56 2f 90 b8 09 f5 77  8b 8a 4b 7e f5 78 05 73  |.V/....w..K~.x.s|
-00000290  85 10 e7 b4 71 02 77 a0  2c cb db 76 53 0b b4 34  |....q.w.,..vS..4|
-000002a0  56 37 7f 45 13 b4 72 f0  24 24 e4 47 1b ce b2 78  |V7.E..r.$$.G...x|
-000002b0  44 82 73 f6 3a 77 68 5c  ce 02 17 03 03 00 45 17  |D.s.:wh\......E.|
-000002c0  d8 40 a5 44 fe 96 82 bc  27 1c 2f c6 c5 6e 0c 47  |.@.D....'./..n.G|
-000002d0  52 9d 90 cd f6 43 03 d5  f0 1b 4a 11 38 56 f3 0b  |R....C....J.8V..|
-000002e0  73 cb 01 d3 69 33 1a 95  4b 5e 75 55 99 a9 a2 fe  |s...i3..K^uU....|
-000002f0  28 58 4e 54 92 5e 08 71  4b 40 42 a1 e6 94 ec c0  |(XNT.^.qK@B.....|
-00000300  bc ac 82 8e                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 02 11 25 5d 22 6c 20  |...........%]"l |
+00000010  8a 8e d3 aa 97 5a 96 46  a0 69 a3 5c 0f d4 ad c0  |.....Z.F.i.\....|
+00000020  6f e4 6f df 99 28 d3 e1  bd ce a5 8c 69 6a c4 9b  |o.o..(......ij..|
+00000030  a5 eb e2 d8 db a4 1d ea  55 ff be c2 14 dc 63 74  |........U.....ct|
+00000040  b8 4d 44 aa 87 65 5c 1e  a2 10 8c 0f ae 0c 0e 76  |.MD..e\........v|
+00000050  89 4c 05 65 c5 19 e3 d4  d1 eb 9e e5 2d 8a 62 ae  |.L.e........-.b.|
+00000060  55 d6 a3 37 46 9b 3c 4c  ad d0 82 7e 0a 36 48 38  |U..7F.<L...~.6H8|
+00000070  0f 4f 67 c4 b1 9d 33 c3  d8 0b 2e f8 17 40 3d 6e  |.Og...3......@=n|
+00000080  22 ee 2b d6 65 be b0 dd  1b 95 cf fd a4 a0 9f b4  |".+.e...........|
+00000090  2f 36 1e 6e 3c 16 f0 1c  df be 58 47 a0 cd dd a6  |/6.n<.....XG....|
+000000a0  5d 12 38 b8 8b 4b f6 2d  06 86 8c db fd 67 96 03  |].8..K.-.....g..|
+000000b0  20 11 ec 8f e4 91 7f 4a  a5 3f 44 df ff 62 27 ae  | ......J.?D..b'.|
+000000c0  70 cc 20 23 35 2b 02 82  00 b8 a0 75 8c 1a 03 cd  |p. #5+.....u....|
+000000d0  42 57 7d f3 26 07 48 9b  7c d1 88 37 4e 5e 60 dc  |BW}.&.H.|..7N^`.|
+000000e0  b5 63 bb 36 6c 84 40 e6  5a e7 ff 14 b9 e5 7b 91  |.c.6l.@.Z.....{.|
+000000f0  c1 0a ed 62 d0 68 80 2e  24 a5 17 ff 1e 2f 3b 38  |...b.h..$..../;8|
+00000100  4d 12 9d f6 b4 bb 4c d9  b4 8b 69 2b c6 60 ee 68  |M.....L...i+.`.h|
+00000110  ef cb 73 3c b0 f9 5c e2  cc 14 a5 6b 7d 2d c3 e0  |..s<..\....k}-..|
+00000120  ef c3 6e 14 3f 1c 9f 61  60 5e 22 3d 3e 34 61 d5  |..n.?..a`^"=>4a.|
+00000130  a6 1e 18 45 1a c5 1c 8a  aa ad cd 67 bf 37 30 46  |...E.......g.70F|
+00000140  37 eb 13 1f c2 6a 7f 39  47 b8 91 a4 c9 9e 70 7c  |7....j.9G.....p||
+00000150  73 62 69 7b c1 30 99 97  d3 34 2f 83 84 3d de a8  |sbi{.0...4/..=..|
+00000160  dc b5 ce d4 69 ff 5e a8  b8 31 05 e0 6b 3b 14 93  |....i.^..1..k;..|
+00000170  10 11 51 ae e6 29 df 54  34 30 01 6c 46 24 76 3a  |..Q..).T40.lF$v:|
+00000180  dd 24 f1 84 d3 27 a7 45  9a 19 4a 09 63 7b 00 6d  |.$...'.E..J.c{.m|
+00000190  b8 11 72 06 e4 8a aa b2  3b 08 eb 17 ae 88 18 18  |..r.....;.......|
+000001a0  51 8f fb 80 5f 01 2a 2c  bc 47 10 cf da d1 ec 11  |Q..._.*,.G......|
+000001b0  34 6d fd d0 c1 c0 a7 26  f3 3a 2e 43 7f 3a 63 eb  |4m.....&.:.C.:c.|
+000001c0  7b e4 a5 c8 23 ff 6b 7a  e9 8e 70 c4 9d 39 b4 3c  |{...#.kz..p..9.<|
+000001d0  4d 40 bc 1e ff e4 7d 47  13 54 64 e7 98 7f cd df  |M@....}G.Td.....|
+000001e0  90 89 19 89 92 8c 39 1b  5c 53 4b c2 7b 38 5c 5a  |......9.\SK.{8\Z|
+000001f0  01 e3 2f f9 a3 f5 a2 c0  79 ff 99 a9 89 40 91 40  |../.....y....@.@|
+00000200  4e 96 73 15 f5 16 bd ac  be e3 ef fa 8a b8 df bf  |N.s.............|
+00000210  ec 86 3b 67 93 59 45 6a  b8 ce a1 04 17 03 03 00  |..;g.YEj........|
+00000220  99 21 d2 f9 b5 d7 ca 07  c4 b9 f7 80 87 c4 ce 95  |.!..............|
+00000230  8f fa f0 a9 c6 99 89 93  18 50 b6 1b 4c ae ff e7  |.........P..L...|
+00000240  2b 29 81 14 20 6a 13 bc  7f 6c b2 6f e4 09 b7 96  |+).. j...l.o....|
+00000250  49 93 37 2b 1d 7e 16 3f  b0 bd 22 dd 0f 04 71 29  |I.7+.~.?.."...q)|
+00000260  38 eb dc a8 85 48 68 17  59 72 0b f2 4f 78 4c 30  |8....Hh.Yr..OxL0|
+00000270  db bf 60 a0 56 80 be aa  80 fd ab 87 55 2e 49 6d  |..`.V.......U.Im|
+00000280  47 38 b9 b1 b4 c2 05 09  16 28 e5 89 dd f1 3d 32  |G8.......(....=2|
+00000290  83 66 fb ca de 37 9c ed  74 2a 7b a1 3a 50 0c 4d  |.f...7..t*{.:P.M|
+000002a0  4c 44 bd 3b 3a 76 33 1c  e1 46 91 95 02 a7 b7 a3  |LD.;:v3..F......|
+000002b0  9b 3b 9c 19 0a b5 5d 81  32 66 17 03 03 00 45 b6  |.;....].2f....E.|
+000002c0  a2 53 eb aa 3c 74 29 1c  36 1e 9f fb 30 c9 48 5c  |.S..<t).6...0.H\|
+000002d0  8e 38 d6 74 69 02 07 af  c4 72 61 6e 94 84 33 bc  |.8.ti....ran..3.|
+000002e0  fe 15 d9 5d b6 b0 86 33  7b a6 21 01 45 8b 8a 43  |...]...3{.!.E..C|
+000002f0  eb 18 df 27 71 51 db 7d  22 58 c0 81 da 70 0f f2  |...'qQ.}"X...p..|
+00000300  5e 3e d5 7c                                       |^>.||
 >>> Flow 4 (server to client)
-00000000  17 03 03 02 9b bf 6f 39  51 ff 9a ee ff 16 51 98  |......o9Q.....Q.|
-00000010  49 e5 88 3d b3 ea b4 14  1d a7 8c ae 11 da 7b 08  |I..=..........{.|
-00000020  99 ad 7d 23 e7 3a 78 8f  b1 ca c1 2c b5 f7 84 bf  |..}#.:x....,....|
-00000030  0d 48 0b 1e 3f 6d 56 d7  7c 84 df f0 39 ee 77 ff  |.H..?mV.|...9.w.|
-00000040  af 7b f5 f2 6e 59 dc 4e  92 a8 b5 d0 64 03 5a 87  |.{..nY.N....d.Z.|
-00000050  9d 4b 0c d7 00 0c e7 7e  2d 4a e0 da 63 10 cc a6  |.K.....~-J..c...|
-00000060  a0 8e 8b ff 04 e2 49 75  01 4f b9 6a cd 5c 90 82  |......Iu.O.j.\..|
-00000070  3c e3 67 d0 a0 93 b7 9b  4d f3 f8 b6 67 d3 fd f6  |<.g.....M...g...|
-00000080  e3 d2 d0 dd 0f 6c 89 92  95 4f b6 74 56 5c f8 f5  |.....l...O.tV\..|
-00000090  a1 33 3d e6 31 05 93 d8  09 d8 3c 0b e3 a7 9f b9  |.3=.1.....<.....|
-000000a0  4b c7 0a de 1c 71 8a d6  63 44 b8 7d 11 6f 1e 8d  |K....q..cD.}.o..|
-000000b0  d8 7f 3f 9f 39 77 8b 2d  7a fd 01 e1 9e 45 58 b6  |..?.9w.-z....EX.|
-000000c0  f8 eb f6 48 9b f2 fc 95  ba 75 56 42 5c 01 22 39  |...H.....uVB\."9|
-000000d0  ab df c2 2d 32 9c de f6  fa 51 00 d0 77 a8 47 34  |...-2....Q..w.G4|
-000000e0  b2 cf dd 9e d5 d6 c2 fd  0e db 98 71 6a 30 82 4e  |...........qj0.N|
-000000f0  4a 36 ce 6c c8 27 a0 92  77 ec 04 e8 ed 20 0d f4  |J6.l.'..w.... ..|
-00000100  1e 9a 5c ae 71 db 06 6a  ed ba 18 0e 65 94 dc f1  |..\.q..j....e...|
-00000110  60 67 34 d4 6a 9d 4b ed  4b 80 69 2e 52 8b e2 ba  |`g4.j.K.K.i.R...|
-00000120  17 aa b7 75 0f 02 bf b9  95 f1 05 83 2c 2a e8 7d  |...u........,*.}|
-00000130  62 17 0e 89 c5 40 fb bb  98 14 98 f4 68 09 af 73  |b....@......h..s|
-00000140  e2 f9 35 68 19 d7 56 66  dd 36 1f 8e 6e 1c 73 e4  |..5h..Vf.6..n.s.|
-00000150  98 ef b0 f3 31 ae 58 de  91 56 a6 eb ee 4c f6 57  |....1.X..V...L.W|
-00000160  5b 6c e7 f9 c3 51 c7 2c  78 40 c0 37 14 0d c4 12  |[l...Q.,x@.7....|
-00000170  18 4c 96 24 69 19 53 de  07 a3 50 b4 00 fa cd 47  |.L.$i.S...P....G|
-00000180  e4 a3 4f 3a 0c 44 82 b7  90 7d 55 6d 6f b1 68 04  |..O:.D...}Umo.h.|
-00000190  02 3d 60 14 80 8b 4b 7d  13 55 5c 1b d2 73 f2 03  |.=`...K}.U\..s..|
-000001a0  31 a1 12 f3 cc df 5f 2e  14 5d 15 7b 6c a8 66 10  |1....._..].{l.f.|
-000001b0  3d ee 11 e0 bd 0f ff b6  d9 9d 2b b8 59 0c b5 f5  |=.........+.Y...|
-000001c0  ec 78 80 bd 11 85 6b b7  67 01 25 5d 1f 14 26 4c  |.x....k.g.%]..&L|
-000001d0  60 48 0e 40 7f 2e a5 d9  09 25 e9 45 87 6e b3 a9  |`H.@.....%.E.n..|
-000001e0  e2 19 5a 58 4c 3e 53 0e  1f d1 55 42 3f bc d0 26  |..ZXL>S...UB?..&|
-000001f0  4e 9a dc 00 ac 2e 8b ac  4d e2 76 d0 80 80 09 87  |N.......M.v.....|
-00000200  8b fe c6 9b c5 43 2d 56  b6 13 e2 eb 91 94 d9 0c  |.....C-V........|
-00000210  40 4f e6 96 af b2 c5 fb  75 9d 51 24 09 b0 8d 4f  |@O......u.Q$...O|
-00000220  68 c5 b1 7a 0e 22 03 84  21 14 b5 db f7 97 d4 60  |h..z."..!......`|
-00000230  c9 ee 49 a0 9a 14 d4 bb  3c 54 91 61 ac 78 40 0f  |..I.....<T.a.x@.|
-00000240  39 43 bb 49 14 ef 64 0b  36 72 a9 2a 89 7b 0d 55  |9C.I..d.6r.*.{.U|
-00000250  7e 47 77 a1 2c 7f c8 55  68 63 56 d8 41 73 52 33  |~Gw.,..UhcV.AsR3|
-00000260  87 0e 7e 82 ca 42 52 42  37 42 5a d6 b8 45 44 8d  |..~..BRB7BZ..ED.|
-00000270  58 d7 47 65 66 de 4b 2c  0d b9 d5 02 5e 63 a3 db  |X.Gef.K,....^c..|
-00000280  5a de 2e fc a3 4a c4 cc  b3 91 0e 7f 96 0e 80 c8  |Z....J..........|
-00000290  d9 fe 61 b2 f9 9f bf 50  ef 4e ee d2 9c ca 28 50  |..a....P.N....(P|
-000002a0  17 03 03 00 1e 61 3d d9  fb 2e 03 d9 6f 4a 8b 90  |.....a=.....oJ..|
-000002b0  8e d5 66 76 1d 88 47 ea  06 4b 3e d8 6a 0e 63 39  |..fv..G..K>.j.c9|
-000002c0  64 e8 05 17 03 03 00 13  3b b0 06 df 04 01 7a 90  |d.......;.....z.|
-000002d0  46 4a 2e 57 1c 66 26 f0  d8 4c ea                 |FJ.W.f&..L.|
+00000000  17 03 03 02 9b fe 23 52  d0 ff dd ef e2 10 c1 70  |......#R.......p|
+00000010  a1 c1 ac d6 e7 30 63 41  07 d5 04 ef 11 ee e7 57  |.....0cA.......W|
+00000020  81 14 5b 81 9d 35 3f 73  be 44 15 6b ed 8c b7 e0  |..[..5?s.D.k....|
+00000030  59 2c d7 0b 0c aa 7a 18  6a da d6 90 19 64 54 d5  |Y,....z.j....dT.|
+00000040  30 73 cf 0e c8 d1 8a 69  a6 68 a4 ce 61 2f c8 4a  |0s.....i.h..a/.J|
+00000050  58 81 42 1c 5f ee b3 fc  05 66 bf d0 14 45 8f ab  |X.B._....f...E..|
+00000060  da 82 fe 86 da 1f b0 f6  d5 12 14 1e 78 d0 1c e8  |............x...|
+00000070  e7 a3 5e af e6 71 42 45  70 4c 95 4a 16 a0 0e a4  |..^..qBEpL.J....|
+00000080  27 6b c4 53 35 63 2a 19  76 d7 e0 7c 92 a2 89 df  |'k.S5c*.v..|....|
+00000090  be 1f 5d 03 24 06 de 3e  d9 c0 12 91 d4 3d 86 a7  |..].$..>.....=..|
+000000a0  b6 8b ed 31 e5 81 cc 5e  76 72 25 15 ba 78 54 ab  |...1...^vr%..xT.|
+000000b0  5b a1 a7 68 e6 44 3f a3  f5 e9 3d 10 ed b5 21 f5  |[..h.D?...=...!.|
+000000c0  02 fd 48 cc 9f 1a 2c 4e  47 4b 37 39 5a 8b 42 32  |..H...,NGK79Z.B2|
+000000d0  69 52 e6 ae ba 80 80 af  8d 67 d1 38 bb bb 97 55  |iR.......g.8...U|
+000000e0  2a 69 28 ef c5 8e 49 fc  87 7a 45 64 57 cf 76 01  |*i(...I..zEdW.v.|
+000000f0  94 57 a2 11 13 5e 99 05  6c 7c 52 97 fb 4c 81 09  |.W...^..l|R..L..|
+00000100  68 5d c6 91 ef cc 0f 77  71 ac 55 53 d8 2d cb 26  |h].....wq.US.-.&|
+00000110  d5 0e c9 36 70 83 85 dd  7d 7e 0d 22 24 26 91 ec  |...6p...}~."$&..|
+00000120  3d b0 e1 c3 62 22 a9 09  a2 e4 ba e4 4d 53 ec c1  |=...b"......MS..|
+00000130  56 c5 b5 92 9a 33 00 f6  21 2c a3 9e 78 85 8e 65  |V....3..!,..x..e|
+00000140  24 e5 ad b6 02 26 4d 03  8d 02 62 3c b0 16 3c 2e  |$....&M...b<..<.|
+00000150  c2 4a 10 11 45 93 2b 96  87 d0 8e 22 43 ca ad 7f  |.J..E.+...."C...|
+00000160  fe ac db 12 e1 9d e0 ff  03 93 d1 90 cc 9c 27 19  |..............'.|
+00000170  1b c5 ba 62 39 55 38 17  44 76 d4 2a 63 54 47 c9  |...b9U8.Dv.*cTG.|
+00000180  de db f0 59 ee 6e ed 26  11 93 07 15 eb 03 98 87  |...Y.n.&........|
+00000190  bd 15 98 29 14 8b 7a 6c  b2 08 6d 86 35 64 0f 4e  |...)..zl..m.5d.N|
+000001a0  73 e3 60 86 8a 3a 68 0f  e8 74 07 78 1d c2 96 fe  |s.`..:h..t.x....|
+000001b0  b9 0c 4b 0b 31 39 8b 9e  9d 86 57 5e 5c f6 fc 7b  |..K.19....W^\..{|
+000001c0  fc bd 9b 01 6e a2 33 c4  0a 00 89 22 13 45 2b e2  |....n.3....".E+.|
+000001d0  6b 9c 1e 35 b7 df 9e 27  3b 38 26 e4 60 c7 ee a5  |k..5...';8&.`...|
+000001e0  9e c2 24 38 ee 3d 44 79  07 77 bc a9 bc 4a 4c 7d  |..$8.=Dy.w...JL}|
+000001f0  9f d9 e8 9c 91 88 75 92  98 74 a0 e1 ef be 66 3c  |......u..t....f<|
+00000200  77 be 3f 1c 24 4d 96 49  23 a3 cd 80 60 9a b0 5b  |w.?.$M.I#...`..[|
+00000210  fa f2 79 54 0d cb 08 7b  52 93 1c 8d ba 18 f3 ce  |..yT...{R.......|
+00000220  5b 3f c8 c4 4c 12 00 9f  1f 9c 57 d9 16 d5 a2 05  |[?..L.....W.....|
+00000230  c3 fa 4e 6d 7e 78 d5 99  33 0f 07 60 1a e9 58 aa  |..Nm~x..3..`..X.|
+00000240  37 57 4b a4 1c 20 99 29  4c 52 af 1f 02 64 01 87  |7WK.. .)LR...d..|
+00000250  a1 fe 73 09 fa ff 04 f6  91 23 0c 56 16 08 16 ba  |..s......#.V....|
+00000260  3c bb a9 c4 b2 a1 f6 93  45 c0 1a b7 43 9d e2 d5  |<.......E...C...|
+00000270  ea dc d1 03 ec 32 83 55  00 59 40 2e 41 8f 52 0e  |.....2.U.Y@.A.R.|
+00000280  51 22 e9 39 07 04 40 82  ee e8 f9 4a a3 83 63 b6  |Q".9..@....J..c.|
+00000290  2e 9a e8 d2 21 04 dd c0  8f a0 e8 33 55 87 3c f3  |....!......3U.<.|
+000002a0  17 03 03 00 1e 17 c1 06  2e 7b c7 3e a7 12 4f e2  |.........{.>..O.|
+000002b0  96 ac 58 bc 0b 22 95 47  19 5e e0 35 f2 53 0f 78  |..X..".G.^.5.S.x|
+000002c0  1d db 93 17 03 03 00 13  9a da 86 87 00 57 0a a0  |.............W..|
+000002d0  e6 4f 26 1a e8 9c 5a 5d  89 19 9a                 |.O&...Z]...|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled b/libgo/go/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled
deleted file mode 100644 (file)
index 89361f1..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 e0 01 00 00  dc 03 03 32 03 2a b3 ed  |...........2.*..|
-00000010  c2 1a 71 f2 ff ea 0b 1c  fa f9 c6 88 03 7c 84 89  |..q..........|..|
-00000020  4e 45 60 81 d9 58 dc 9f  0a 60 d1 20 ce 4d 59 a5  |NE`..X...`. .MY.|
-00000030  10 b1 76 53 f5 77 26 fd  17 08 f9 e5 14 03 c4 0a  |..vS.w&.........|
-00000040  65 fd 83 bb a9 3b 24 05  24 1b ef 00 00 08 13 02  |e....;$.$.......|
-00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
-00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
-00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
-00000080  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 1e  |................|
-00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
-000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
-000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
-000000c0  24 00 1d 00 20 06 b0 03  80 81 d6 e7 f4 31 85 4c  |$... ........1.L|
-000000d0  e3 50 35 c1 df 6e 28 9f  38 ce c0 7b fc 71 00 8c  |.P5..n(.8..{.q..|
-000000e0  9a 25 07 95 57                                    |.%..W|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 ce 4d 59 a5  |........... .MY.|
-00000030  10 b1 76 53 f5 77 26 fd  17 08 f9 e5 14 03 c4 0a  |..vS.w&.........|
-00000040  65 fd 83 bb a9 3b 24 05  24 1b ef 00 13 02 00 00  |e....;$.$.......|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
-00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 ad ce ff 21 b8 39  |.............!.9|
-00000090  16 f6 10 6e 8d 6c 0f 46  2f 58 55 b3 e4 4f 2d 5c  |...n.l.F/XU..O-\|
-000000a0  26 17 03 03 00 3c fd 24  07 75 28 2b f2 ec d9 74  |&....<.$.u(+...t|
-000000b0  f0 76 e4 02 e6 02 bd 47  58 0f 68 60 ac 6c 59 a8  |.v.....GX.h`.lY.|
-000000c0  87 94 b9 cb c3 fa 41 15  4c 95 b8 58 da 8c d9 ea  |......A.L..X....|
-000000d0  3a ab 0c 06 83 a5 2b d1  39 6f 32 92 bf e1 c0 f4  |:.....+.9o2.....|
-000000e0  49 51 17 03 03 02 6d 22  dc 8c fc ae 21 96 41 17  |IQ....m"....!.A.|
-000000f0  45 93 6e 08 61 6b 46 b9  9a cf 2e 79 a8 1a 46 30  |E.n.akF....y..F0|
-00000100  a4 de 3d 53 87 bf 57 3a  44 4f 5b 3f c9 b2 f0 0e  |..=S..W:DO[?....|
-00000110  56 5f 5a ee 5a 1f df cc  fe f3 54 ab 87 d7 bb 00  |V_Z.Z.....T.....|
-00000120  2c 61 de ad 31 9c d4 cf  43 bf e7 84 d1 1d 3c cb  |,a..1...C.....<.|
-00000130  82 d1 81 9d 13 90 6b c8  fd 01 53 4f 13 a5 91 a4  |......k...SO....|
-00000140  fe 20 ce 2c 34 96 62 b7  6f f0 f0 65 f0 01 18 99  |. .,4.b.o..e....|
-00000150  31 3d cb c6 72 6f 54 d6  ec fa a3 dd 94 67 6b b9  |1=..roT......gk.|
-00000160  ff 2c 41 ba 00 d5 25 ba  b1 7a e5 d2 1c 0b 37 ad  |.,A...%..z....7.|
-00000170  df 0b 62 be b3 69 5b 84  39 2d 72 c2 b9 ec 68 87  |..b..i[.9-r...h.|
-00000180  32 23 92 4b a8 f0 17 25  0f d7 86 97 45 65 73 e1  |2#.K...%....Ees.|
-00000190  49 c4 3c 8d 26 43 34 06  4c be 50 76 ae 63 6f 1d  |I.<.&C4.L.Pv.co.|
-000001a0  ed 57 93 5a 7f 98 e2 1e  5f 94 74 a2 54 59 63 12  |.W.Z...._.t.TYc.|
-000001b0  bb 8b df 77 20 3a 9c ea  c7 40 b0 cf 8e 7f f8 98  |...w :...@......|
-000001c0  06 92 38 be 77 11 17 03  c2 ac af fc 8d 7d d5 6b  |..8.w........}.k|
-000001d0  f7 2b 7a f3 b8 dc b0 cf  3e f7 c5 f4 b3 34 4b 06  |.+z.....>....4K.|
-000001e0  c6 ed b5 dc 0c 2d 4e bc  03 94 cc 03 f2 9f 5d c6  |.....-N.......].|
-000001f0  57 36 5a 01 81 65 27 75  1d 4f 22 9f b5 da 7f e2  |W6Z..e'u.O".....|
-00000200  7d 36 f3 4b 05 3f 40 47  c6 1b af e6 99 c0 ca 35  |}6.K.?@G.......5|
-00000210  98 c8 30 60 7b 42 4e e7  5c 90 28 d7 4e db f3 78  |..0`{BN.\.(.N..x|
-00000220  22 e2 a3 86 0c 9e 19 43  0e 89 d4 f6 78 38 21 16  |"......C....x8!.|
-00000230  84 38 36 6a 2d a5 94 2c  52 2b 00 de 67 16 e8 89  |.86j-..,R+..g...|
-00000240  32 21 0e fd b0 23 91 06  8b fa 82 70 21 bc 1f 29  |2!...#.....p!..)|
-00000250  32 af f4 b9 15 7f aa 22  c1 e8 e3 2c 92 b4 d8 2a  |2......"...,...*|
-00000260  64 58 f4 f1 85 85 14 92  f3 16 8e 2d 5b a6 7e ef  |dX.........-[.~.|
-00000270  22 5a 58 bb 4c f1 36 70  2f ca 03 df fb 0a d0 03  |"ZX.L.6p/.......|
-00000280  55 5d d9 6b 63 48 d2 75  82 d4 56 af 17 5a 60 4f  |U].kcH.u..V..Z`O|
-00000290  af 8b 17 d6 fd 96 be 3d  82 25 0e 73 2e 58 0e 0a  |.......=.%.s.X..|
-000002a0  5c 2d c8 f5 17 b0 ae 7d  39 90 cb 75 bb 4b 33 22  |\-.....}9..u.K3"|
-000002b0  bd a2 02 00 70 43 a8 54  ee 7c 25 d5 d7 88 08 f6  |....pC.T.|%.....|
-000002c0  3f 34 61 55 f5 d3 53 0c  8c b1 9b fd 4e d9 65 7a  |?4aU..S.....N.ez|
-000002d0  2b 6e b4 d5 37 34 18 f3  14 00 9f 56 40 d9 15 ea  |+n..74.....V@...|
-000002e0  59 5a 4b 4a bb f7 19 72  60 4a 08 8f 75 d6 7b a4  |YZKJ...r`J..u.{.|
-000002f0  de 79 c5 21 1a cb 82 97  b3 88 d8 ae 65 30 cc 56  |.y.!........e0.V|
-00000300  da a3 04 5c 63 f4 44 a5  eb 05 55 ad 78 46 44 ac  |...\c.D...U.xFD.|
-00000310  56 2e f6 f7 eb 47 f6 f1  62 8d df 27 7d 86 5e 58  |V....G..b..'}.^X|
-00000320  5f 4c 34 6e f6 c0 fd 56  7d 46 82 5d 53 db 2a 84  |_L4n...V}F.]S.*.|
-00000330  45 db e7 9c b9 23 32 59  cf 85 f7 12 c5 e8 9e 3c  |E....#2Y.......<|
-00000340  2d 3f 81 a5 24 cf 36 ad  d6 65 02 35 84 de 43 f8  |-?..$.6..e.5..C.|
-00000350  04 e2 8b ae 17 03 03 00  99 ce e8 48 a3 34 5e fb  |...........H.4^.|
-00000360  76 f1 e4 3b da 94 0a 25  ee 78 f6 31 24 10 05 25  |v..;...%.x.1$..%|
-00000370  9c e5 ca fc ef c5 66 86  08 15 d8 69 75 d8 49 e9  |......f....iu.I.|
-00000380  9b 86 71 3f 1f 41 ee f0  bc 8d 4e aa bc 30 f0 8f  |..q?.A....N..0..|
-00000390  7b b1 94 7e aa 74 3f eb  23 c5 c9 aa 9a c3 f7 12  |{..~.t?.#.......|
-000003a0  23 30 95 2e e1 1b 9c fe  8b 50 b1 d9 17 cf af a1  |#0.......P......|
-000003b0  ff ce 8d fa 7e bd 23 59  d0 7a fb 30 12 f4 8d 86  |....~.#Y.z.0....|
-000003c0  0c 3c fd 03 50 d4 7f bb  f6 fa ba 1d fc 32 cc 7e  |.<..P........2.~|
-000003d0  12 3a 33 90 c6 82 5d 6a  90 23 6d b8 e6 60 7d d3  |.:3...]j.#m..`}.|
-000003e0  a8 f0 0c 75 bc b5 67 68  ed 58 ef 4d ac 91 47 c9  |...u..gh.X.M..G.|
-000003f0  c4 bc 17 03 03 00 45 ae  0d 8d 76 8d 28 34 1b 09  |......E...v.(4..|
-00000400  4d d5 df 2e aa f8 ff 71  b2 0e 60 a1 ce 8a 58 9c  |M......q..`...X.|
-00000410  45 64 31 6c 9b 46 66 64  27 98 e6 f3 93 e8 92 81  |Ed1l.Ffd'.......|
-00000420  3d 4f db da 98 72 0d b7  71 27 ac 2b 61 81 97 0b  |=O...r..q'.+a...|
-00000430  e7 ae 32 d7 e2 66 4d 5d  f7 01 d0 77              |..2..fM]...w|
->>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 f6 03 90 9e bc  |................|
-00000010  dc 00 9b f9 dd 7b 65 dd  b0 69 b4 b5 42 fc 25 f2  |.....{e..i..B.%.|
-00000020  2b 7e be 52 1a 4b f1 e4  21 94 0d 88 4a 58 07 37  |+~.R.K..!...JX.7|
-00000030  67 c7 e3 c4 62 eb 17 57  5d 52 d4 a9 03 39 0e 7d  |g...b..W]R...9.}|
-00000040  d0 c3 1a 8d ef ec b7 a8  9b 93 50 0d 7f fd a1 10  |..........P.....|
-00000050  b6 82 99 21 3f e3 3d 3d  47 04 c3 cd a7 b3 ab e0  |...!?.==G.......|
-00000060  f6 33 47 0e 1c 30 36 45  21 32 34 c2 2c 72 20 72  |.3G..06E!24.,r r|
-00000070  b6 c7 5b 95 8a 97 84 54  2e d0 5f d5 80 e7 8f 7a  |..[....T.._....z|
-00000080  6f 50 96 8a 33 13 c6 97  85 25 47 6b 8a b2 a0 29  |oP..3....%Gk...)|
-00000090  cd 7f 0e 38 94 53 08 8b  c3 2f 89 a2 10 c2 22 5a  |...8.S.../...."Z|
-000000a0  95 42 a3 45 73 a8 d0 ac  6d ba 95 a4 51 63 b9 b4  |.B.Es...m...Qc..|
-000000b0  79 61 be dd c6 ab 97 72  38 30 63 55 a7 7d 9a eb  |ya.....r80cU.}..|
-000000c0  bb 5a f6 d0 3d 05 81 5d  0e e5 7a 8b ae fe d2 3b  |.Z..=..]..z....;|
-000000d0  db 85 3a 13 81 ee 36 b3  ff 41 47 d1 67 bf 17 5e  |..:...6..AG.g..^|
-000000e0  9d a3 4c 92 51 a9 1b 4b  ca 13 f6 ee 8a e5 b3 01  |..L.Q..K........|
-000000f0  e7 87 ee 1e 2a 9e 56 3d  01 7e 0f cb e5 d6 ea 13  |....*.V=.~......|
-00000100  05 3e 8c 5a 24 d0 36 6b  54 9f 8e 3f 07 73 a0 bf  |.>.Z$.6kT..?.s..|
-00000110  84 c2 90 72 ce 48 50 49  47 27 b3 14 56 5c c7 63  |...r.HPIG'..V\.c|
-00000120  7e 7e b5 8f 9d 6d 70 32  6f 3f 4d 53 80 ae f6 2b  |~~...mp2o?MS...+|
-00000130  fb c9 7a de 76 aa 68 a3  9b a9 a7 47 55 d0 cb f8  |..z.v.h....GU...|
-00000140  e8 c4 1c f5 0f 54 82 5b  c5 45 18 41 05 da 72 ce  |.....T.[.E.A..r.|
-00000150  84 d1 8b 00 40 e9 f9 cf  b5 d5 3e 71 ee 25 dc 7d  |....@.....>q.%.}|
-00000160  3b 00 67 68 9d 78 d2 c0  7b cb 5d 9e 79 2c b5 f4  |;.gh.x..{.].y,..|
-00000170  1b ea b8 d8 de bd 36 71  2a 26 49 44 1b 5b 92 ad  |......6q*&ID.[..|
-00000180  1c 2d 2f ab 8e 15 d7 b3  96 89 da 58 77 75 42 32  |.-/........XwuB2|
-00000190  c3 6b f1 5e 0b da 91 71  1e d5 f1 dd 32 d8 b6 a5  |.k.^...q....2...|
-000001a0  21 a1 1d 5e b1 df 01 37  33 ac 93 11 94 6d b8 e6  |!..^...73....m..|
-000001b0  3b be 86 31 da cf b6 ab  cd f5 12 4f 85 45 24 06  |;..1.......O.E$.|
-000001c0  34 40 7b c5 f8 5f c3 f9  3b cf 9d 2a b3 2e 65 e4  |4@{.._..;..*..e.|
-000001d0  0e ed fc 7c b4 2b 32 bf  0e 8f b3 85 93 74 8b e8  |...|.+2......t..|
-000001e0  25 e0 47 c0 d8 52 8e c9  ed 7f 16 41 3f b3 79 d8  |%.G..R.....A?.y.|
-000001f0  d1 47 19 ae fb ab 97 a5  b2 42 7c a0 73 ad 4f 62  |.G.......B|.s.Ob|
-00000200  cf 35 52 7c d6 47 b8 1f  e9 65 b0 99 f7 67 e7 64  |.5R|.G...e...g.d|
-00000210  14 83 46 c7 90 6e 4d 01  3a c2 e6 19 17 03 03 00  |..F..nM.:.......|
-00000220  99 a5 e0 38 3a 91 4a 1d  87 9a eb a6 95 87 35 fc  |...8:.J.......5.|
-00000230  ae 42 8d 3a fe f6 39 f3  c2 c2 f0 9a f5 8f b5 75  |.B.:..9........u|
-00000240  18 6b 84 c0 5b 96 6a 9c  0c aa 81 fc 9a 2e 01 f7  |.k..[.j.........|
-00000250  d8 b1 5d 4a 54 cf 79 90  fb 79 57 ff d9 d1 46 59  |..]JT.y..yW...FY|
-00000260  02 84 3d ee cc 68 ea 05  1d a2 79 fb 1d 1e d6 ad  |..=..h....y.....|
-00000270  5b 95 3b 6b 9a c9 07 e5  e4 20 07 6a a0 74 c8 1a  |[.;k..... .j.t..|
-00000280  31 53 a4 e6 bb bb 28 61  47 41 d5 f3 45 38 71 86  |1S....(aGA..E8q.|
-00000290  35 12 f4 8a f2 e4 e9 ae  96 a9 14 ce 8a 1c 5d 59  |5.............]Y|
-000002a0  3c d7 3a e7 93 35 c2 53  9f d8 4d cb 98 bd e1 72  |<.:..5.S..M....r|
-000002b0  a8 80 55 a6 cd 9c 50 41  ec 50 17 03 03 00 45 2d  |..U...PA.P....E-|
-000002c0  90 3b 73 cc 24 52 ad 22  90 0e 7d bf 2a a2 44 09  |.;s.$R."..}.*.D.|
-000002d0  e2 43 61 f2 48 9b 73 85  00 05 8b 0a 51 ad a0 c0  |.Ca.H.s.....Q...|
-000002e0  64 ef 5e 11 86 37 b0 32  af 11 f7 98 7b 74 39 90  |d.^..7.2....{t9.|
-000002f0  fa d0 32 f3 fe 4d 01 6b  78 75 31 7e 67 4f 61 0f  |..2..M.kxu1~gOa.|
-00000300  bb c6 3e c0                                       |..>.|
->>> Flow 4 (server to client)
-00000000  17 03 03 02 9b f5 b2 d6  62 fe e0 c8 8d cc 7a cd  |........b.....z.|
-00000010  29 51 b2 77 0d 9a 54 fb  43 6d f6 9c e1 ff 28 be  |)Q.w..T.Cm....(.|
-00000020  fc 50 68 80 2f 1c 4f 50  44 95 64 49 0a 66 fe 79  |.Ph./.OPD.dI.f.y|
-00000030  46 ba 88 e9 03 be 5c 91  60 84 78 03 a8 c6 21 90  |F.....\.`.x...!.|
-00000040  cd 79 de 2d 2f 81 dd 08  1f 52 1a 0e d8 69 16 22  |.y.-/....R...i."|
-00000050  a6 59 5b 2b 85 08 00 16  e7 85 bd 43 9a cc ce e6  |.Y[+.......C....|
-00000060  3a ee 70 25 0b 95 90 4b  c0 42 4a 48 25 d3 50 92  |:.p%...K.BJH%.P.|
-00000070  19 e1 3e b8 72 c5 a1 e8  dd 9f a4 57 2d b0 a6 24  |..>.r......W-..$|
-00000080  8b 8c 55 41 f3 26 45 dd  dd 2b d3 15 8d d9 ca e4  |..UA.&E..+......|
-00000090  15 6e b5 6d 99 79 ba 46  00 e6 5e 75 52 fd f9 26  |.n.m.y.F..^uR..&|
-000000a0  cf cd 69 cf be 29 a7 b9  7d 1b 1d 6b ab 17 ee 4e  |..i..)..}..k...N|
-000000b0  f5 24 b0 89 0f b5 c7 41  4e ea cd 32 98 47 23 bc  |.$.....AN..2.G#.|
-000000c0  91 03 b1 23 e0 5c 5e 37  40 95 da 90 ef eb 95 81  |...#.\^7@.......|
-000000d0  7b 2d c7 15 8f f8 2d ba  69 41 0e a9 eb 19 6c 6c  |{-....-.iA....ll|
-000000e0  73 b0 05 fc b9 f4 76 91  2b 6a 72 fa d6 e5 87 a9  |s.....v.+jr.....|
-000000f0  90 49 81 8c d5 fa 78 a2  a1 8f 77 c7 35 78 1b ba  |.I....x...w.5x..|
-00000100  ac 3c 41 51 ce 4e 99 c9  74 a0 bc 51 12 b5 15 2c  |.<AQ.N..t..Q...,|
-00000110  8e 36 6e e1 c9 bb 0f d2  fd 00 97 56 de 66 a9 19  |.6n........V.f..|
-00000120  c7 2f 18 e5 67 b4 34 73  9e b2 6f 68 26 8d 2f da  |./..g.4s..oh&./.|
-00000130  92 bd 52 13 32 3c 49 80  8c c7 3c 11 9d 9f 05 c0  |..R.2<I...<.....|
-00000140  aa 5d 63 33 8e 07 60 20  6a 01 1f 5a 16 45 4d ba  |.]c3..` j..Z.EM.|
-00000150  b0 2a 5c 26 b1 ea 26 72  59 c5 b0 59 8a 1a cb 9a  |.*\&..&rY..Y....|
-00000160  6a 54 55 06 75 37 a0 c9  04 4e 2f 61 de ef b5 df  |jTU.u7...N/a....|
-00000170  68 ae 42 03 29 91 e3 1d  a0 6b 18 4d 17 23 3d 61  |h.B.)....k.M.#=a|
-00000180  87 72 06 9f 45 98 0d 1e  f7 f1 f5 f3 f7 04 a5 98  |.r..E...........|
-00000190  29 c2 2e 77 d9 2c 95 df  5d 3d 20 41 36 26 1b 46  |)..w.,..]= A6&.F|
-000001a0  ea 54 9e a3 96 05 ba f7  33 01 85 b0 d1 9f 78 3c  |.T......3.....x<|
-000001b0  0f 73 0d 04 52 7f 02 f4  cb 79 f1 e2 d1 63 60 d6  |.s..R....y...c`.|
-000001c0  e1 34 05 23 79 c3 37 eb  d0 5b ea bc f4 f9 bb 7a  |.4.#y.7..[.....z|
-000001d0  85 9e 42 50 3c c8 f8 e6  f4 93 71 c2 6a 46 b9 26  |..BP<.....q.jF.&|
-000001e0  8c 17 b4 c9 65 00 fb 9a  d6 54 ab e6 71 c1 1b 5a  |....e....T..q..Z|
-000001f0  51 a2 6f df 0b 52 29 8c  c3 ec 8e bf 31 36 93 7e  |Q.o..R).....16.~|
-00000200  59 cc ca 49 71 dc ce 84  40 7d 43 81 5c 96 ed ca  |Y..Iq...@}C.\...|
-00000210  d1 e6 15 40 cf 19 f4 ed  61 28 9a e3 6b e7 1c 9b  |...@....a(..k...|
-00000220  c1 71 d0 46 ef 79 3b d8  35 e3 7b 47 3f a2 78 76  |.q.F.y;.5.{G?.xv|
-00000230  17 58 13 67 5f 4e f0 ed  2e e9 84 e1 92 0c a6 36  |.X.g_N.........6|
-00000240  5c 5b de 8e 5c 04 ed d4  a4 75 10 fd 85 9c e5 8e  |\[..\....u......|
-00000250  ca 02 14 fb 91 8b 85 14  79 e5 97 1f 63 46 48 90  |........y...cFH.|
-00000260  26 c7 2f a2 c0 18 71 d9  2e e3 81 78 7b 74 67 e0  |&./...q....x{tg.|
-00000270  e1 ef 48 af 41 96 9f 1a  44 d8 6c 94 49 3e 9b 47  |..H.A...D.l.I>.G|
-00000280  71 63 2f 0c 94 c9 42 ac  bc 4c 0a 16 fe 9a 90 eb  |qc/...B..L......|
-00000290  02 75 16 1a 10 23 b2 75  67 c7 c5 17 55 9b cf 69  |.u...#.ug...U..i|
-000002a0  17 03 03 00 1e 45 8c ed  99 0f 8a 83 d8 89 70 49  |.....E........pI|
-000002b0  17 a8 fd 2b 6e ef ff 53  fa 99 52 89 ee 8b 19 f1  |...+n..S..R.....|
-000002c0  41 09 30 17 03 03 00 13  14 f0 f6 ef c5 f9 52 15  |A.0...........R.|
-000002d0  77 de 5e 46 63 8d 3b 2f  07 84 aa                 |w.^Fc.;/...|
index c9c8728b6e3f304c939ff68c61eddad3cde3962b..5c9675feb49ed26e3a79ccb6f156b43bc8194b38 100644 (file)
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e0 01 00 00  dc 03 03 d7 9c 79 99 50  |.............y.P|
-00000010  c9 4b 3a e0 a1 36 a8 fc  40 bb 51 a9 71 a6 ba 2f  |.K:..6..@.Q.q../|
-00000020  1b ba 13 f3 b6 8b 2b 77  f1 60 27 20 a6 a3 e8 5a  |......+w.`' ...Z|
-00000030  4b cb 7c 64 05 b4 77 3b  af 66 4b e3 5a b3 cb 57  |K.|d..w;.fK.Z..W|
-00000040  84 d3 fa 5d 7f 5a cd 94  62 79 31 4a 00 08 13 02  |...].Z..by1J....|
+00000000  16 03 01 00 e0 01 00 00  dc 03 03 a7 91 25 cb c3  |.............%..|
+00000010  c2 53 ec 92 0f e7 4c 06  3a 35 ee c9 09 f1 6a 94  |.S....L.:5....j.|
+00000020  27 bf 12 7d f8 e5 c3 1a  45 dc a0 20 c8 75 ac df  |'..}....E.. .u..|
+00000030  fc 9f f5 43 eb ee 5a d8  94 3a f8 10 2d 42 d4 fd  |...C..Z..:..-B..|
+00000040  2c 80 9f 13 73 c9 02 77  32 c0 50 59 00 08 13 02  |,...s..w2.PY....|
 00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
 00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
 00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
 00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
 000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
 000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
-000000c0  24 00 1d 00 20 c6 c0 3a  af 99 9f ef 6d 59 6b bd  |$... ..:....mYk.|
-000000d0  c3 b0 8a 94 02 c8 fb 13  7d cb a8 3a f4 f1 e0 40  |........}..:...@|
-000000e0  03 15 7a 95 06                                    |..z..|
+000000c0  24 00 1d 00 20 ab 7a fe  9c a7 15 e8 53 6d 6e be  |$... .z.....Smn.|
+000000d0  8b 1f 25 bb f9 6c 15 4c  ca 78 c0 b6 b1 20 ab 03  |..%..l.L.x... ..|
+000000e0  3d 09 06 cc 49                                    |=...I|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 a6 a3 e8 5a  |........... ...Z|
-00000030  4b cb 7c 64 05 b4 77 3b  af 66 4b e3 5a b3 cb 57  |K.|d..w;.fK.Z..W|
-00000040  84 d3 fa 5d 7f 5a cd 94  62 79 31 4a 13 02 00 00  |...].Z..by1J....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 c8 75 ac df  |........... .u..|
+00000030  fc 9f f5 43 eb ee 5a d8  94 3a f8 10 2d 42 d4 fd  |...C..Z..:..-B..|
+00000040  2c 80 9f 13 73 c9 02 77  32 c0 50 59 13 02 00 00  |,...s..w2.PY....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 d8 15 a1 e7 a9 00  |................|
-00000090  bf 9d 8d 63 5d ba b1 5a  08 c2 de 57 7e 73 61 5d  |...c]..Z...W~sa]|
-000000a0  2f 17 03 03 00 3c 59 ed  f4 2a 62 56 2a 02 73 4f  |/....<Y..*bV*.sO|
-000000b0  d8 a3 79 28 0c 5c c6 d6  da ff f7 80 d1 37 4c 93  |..y(.\.......7L.|
-000000c0  7b 67 e0 6c 0f ce bc 64  3b aa 46 d7 65 b0 b0 27  |{g.l...d;.F.e..'|
-000000d0  62 27 74 68 18 70 70 e4  67 f8 40 0f 83 dd 74 a8  |b'th.pp.g.@...t.|
-000000e0  cf f7 17 03 03 02 6d 92  57 b1 0d 53 fa b4 f7 9e  |......m.W..S....|
-000000f0  43 8f a4 42 00 48 47 ce  ce 30 98 19 c3 af 29 81  |C..B.HG..0....).|
-00000100  3d f0 ae bd 47 89 cc 31  92 11 e1 fd b3 7f 30 68  |=...G..1......0h|
-00000110  71 96 16 4e 4f ea cb 05  47 67 57 f1 fe 02 82 13  |q..NO...GgW.....|
-00000120  81 df 79 7e 66 71 24 97  3d 53 89 2d 3f e4 61 c2  |..y~fq$.=S.-?.a.|
-00000130  2d 79 8f 5a 9d 00 b2 2d  b0 c2 55 67 61 99 1a 4c  |-y.Z...-..Uga..L|
-00000140  3a 1c 16 52 48 7a 94 3f  96 f8 58 4a e6 0c 6c b3  |:..RHz.?..XJ..l.|
-00000150  8d 83 57 bc 74 23 3b 5b  c3 89 86 e4 ce df 5e 96  |..W.t#;[......^.|
-00000160  1b 29 17 4b 25 70 e5 f6  b6 e7 c1 e0 d9 37 f2 9d  |.).K%p.......7..|
-00000170  80 8e 48 7a f2 ad 7c c1  65 56 56 20 ce 28 37 f3  |..Hz..|.eVV .(7.|
-00000180  39 5c 99 74 ba 68 d2 1f  a1 51 1f 2d b5 a9 25 10  |9\.t.h...Q.-..%.|
-00000190  eb c2 3d a1 84 d5 f4 86  6f 20 ba fd c6 6f 42 64  |..=.....o ...oBd|
-000001a0  f5 28 2a 9f 19 58 11 40  e1 a3 c6 ae e6 92 1b 33  |.(*..X.@.......3|
-000001b0  3d 69 be 86 74 f7 bf 7c  98 f6 2d 71 2d 01 b9 47  |=i..t..|..-q-..G|
-000001c0  3a 7a 55 52 95 0f e8 7d  0a fe d3 32 ca 02 85 d6  |:zUR...}...2....|
-000001d0  e5 7b 18 2c 9d ff a3 2c  54 b1 f3 7a 8a 6d ca 07  |.{.,...,T..z.m..|
-000001e0  98 28 d0 a9 18 c3 2d 87  d2 59 80 2e f8 6a fe b1  |.(....-..Y...j..|
-000001f0  0a b1 fe 9e b4 44 bb bc  9d ed 73 69 8d ea 63 cc  |.....D....si..c.|
-00000200  37 10 6d af bb 3f 61 ad  e1 4f 26 8e 01 36 77 1c  |7.m..?a..O&..6w.|
-00000210  95 cd 24 d9 e2 da 01 86  16 44 ab b3 8f 98 5d cc  |..$......D....].|
-00000220  d8 2c b9 a4 12 26 60 5b  89 02 4a ef a9 98 7f 7c  |.,...&`[..J....||
-00000230  b7 f3 e2 45 b5 6d 9b f7  80 d7 ca a8 e3 15 10 d3  |...E.m..........|
-00000240  b6 cd ae 27 e5 29 df 77  5d a4 34 45 af 61 7b 64  |...'.).w].4E.a{d|
-00000250  03 b6 a6 59 16 c7 dc 98  6c f9 83 eb 70 e1 73 90  |...Y....l...p.s.|
-00000260  2c 08 39 cb 61 86 0a 52  2d 45 96 f1 41 0e 31 d4  |,.9.a..R-E..A.1.|
-00000270  de 61 54 b9 8c 8f 9b 70  60 d9 db 19 03 0a f2 14  |.aT....p`.......|
-00000280  c7 ee 47 f0 2c 27 c7 a7  4f 32 b0 9d 98 b9 09 1f  |..G.,'..O2......|
-00000290  0e 8f 7a 55 15 9a 63 c7  7b fb 68 82 36 6c 58 55  |..zU..c.{.h.6lXU|
-000002a0  b2 db 46 2b 1e 7b 87 20  be aa 7a 43 c8 71 8f e8  |..F+.{. ..zC.q..|
-000002b0  f2 05 a9 8b 64 7d 5c 44  81 e9 41 14 2d cf d6 ea  |....d}\D..A.-...|
-000002c0  d4 0d 53 68 60 4f f5 e3  bd 24 47 7b 62 c3 f6 89  |..Sh`O...$G{b...|
-000002d0  7d 3b 65 97 fc ac 60 0a  de 0d 7e 31 8a 04 8e 6f  |};e...`...~1...o|
-000002e0  f6 c2 47 05 d2 64 f1 19  2b 89 c1 8f f8 e8 bb e1  |..G..d..+.......|
-000002f0  19 d5 09 c2 b1 41 3c 0d  4f 9f 13 06 f3 02 27 1d  |.....A<.O.....'.|
-00000300  5d ea 22 1d 1e e0 22 34  2d f0 40 ae c0 a2 b4 1e  |]."..."4-.@.....|
-00000310  93 16 28 43 e1 d0 e6 ee  3b b4 51 43 bd 6f 8e b7  |..(C....;.QC.o..|
-00000320  30 79 7b 29 78 17 52 a6  93 3f c7 9a de 3f fe fb  |0y{)x.R..?...?..|
-00000330  56 8d 2c bc 21 9e 0c a4  a2 6f 51 39 04 65 5b 81  |V.,.!....oQ9.e[.|
-00000340  6e b5 4d 82 ca da 3e 13  a5 16 72 e8 c8 aa ff 34  |n.M...>...r....4|
-00000350  2f 45 81 fe 17 03 03 00  99 ef 4a 43 25 8d dd 0d  |/E........JC%...|
-00000360  e5 af 9e e3 46 e1 84 de  f1 68 5f 9b f6 70 17 6f  |....F....h_..p.o|
-00000370  7e 86 33 45 b6 13 f0 a8  a2 fd 08 1b 4a 4f 92 3f  |~.3E........JO.?|
-00000380  45 ef db 03 ff 1f 54 55  28 cc de 0e f5 6c af 5c  |E.....TU(....l.\|
-00000390  86 cc b1 e2 c7 0e ea 24  47 fb e0 37 e8 a2 e7 47  |.......$G..7...G|
-000003a0  cd 9e da 02 e5 37 1f a9  b2 ea 57 f8 6f 63 be 5e  |.....7....W.oc.^|
-000003b0  38 be 1a 09 38 23 46 52  df cf 79 bc ce c1 da 23  |8...8#FR..y....#|
-000003c0  34 97 c8 ce 81 74 d5 03  f4 71 ff 4b 17 e0 99 7c  |4....t...q.K...||
-000003d0  31 bd c9 1e d5 2b d3 d4  ff dc 56 82 07 f5 a6 57  |1....+....V....W|
-000003e0  0e ab 18 cf db 38 26 ff  d9 51 c2 8f 70 b8 5b 84  |.....8&..Q..p.[.|
-000003f0  80 27 17 03 03 00 45 95  7b 2b 46 29 0a 03 4f c6  |.'....E.{+F)..O.|
-00000400  37 0c 31 e8 72 8a aa 00  db 90 e8 d3 1f c1 e1 eb  |7.1.r...........|
-00000410  03 02 bc ae dd 03 a7 28  55 7e 19 0d 5f 76 e6 fa  |.......(U~.._v..|
-00000420  03 91 c2 5a 10 1d c0 a0  85 3d d2 32 ec 65 af 83  |...Z.....=.2.e..|
-00000430  25 d1 77 0f 41 d9 e7 43  56 04 4e fe              |%.w.A..CV.N.|
+00000080  03 03 00 01 01 17 03 03  00 17 c2 3f e2 45 30 ec  |...........?.E0.|
+00000090  10 bf f7 4e 69 42 22 e6  80 64 0a a2 29 07 c6 92  |...NiB"..d..)...|
+000000a0  4c 17 03 03 00 3e d1 75  9b 8c a1 3f 5d b3 11 da  |L....>.u...?]...|
+000000b0  27 79 d3 9c 7f 54 9b 37  ce 02 b4 60 f6 44 0e cb  |'y...T.7...`.D..|
+000000c0  c3 07 b9 bf 4e 77 7c 4b  ba f7 2c e3 4c 43 a4 f1  |....Nw|K..,.LC..|
+000000d0  ba ec 0f 7b e5 7a 59 ef  8e e6 68 1e 1c ce d3 11  |...{.zY...h.....|
+000000e0  f9 b1 69 32 17 03 03 02  6d aa e1 b7 df 0e 6a 54  |..i2....m.....jT|
+000000f0  41 c5 aa 05 24 fd 4a 1b  8a 05 4f e7 48 29 48 35  |A...$.J...O.H)H5|
+00000100  66 42 f8 1d 23 9b 68 f4  b6 cf 94 16 af e1 82 93  |fB..#.h.........|
+00000110  30 d5 02 3b e4 aa a9 d7  b2 9c 7f 7f 3c a2 be 0d  |0..;........<...|
+00000120  85 96 14 64 1a 6d ff 95  ab 36 1c d1 2b ed a9 89  |...d.m...6..+...|
+00000130  c8 b8 a3 e5 45 e7 18 5a  18 00 c4 d8 96 64 d1 74  |....E..Z.....d.t|
+00000140  1a cb ba ec 9a f4 2d 81  8b 3a 77 e6 57 cc 3a 2b  |......-..:w.W.:+|
+00000150  b8 05 82 bf 59 92 3b 92  04 e8 a6 f2 6a 94 c1 46  |....Y.;.....j..F|
+00000160  bd 79 2e 99 7f 7b ea 32  f9 ac b6 90 78 b9 db c8  |.y...{.2....x...|
+00000170  ce 9a e4 88 65 11 8a 03  79 43 d2 81 ce d0 f8 0d  |....e...yC......|
+00000180  64 8e 8b ef bc 2f 34 87  cf 4e e5 22 44 1f 55 82  |d..../4..N."D.U.|
+00000190  ab 25 61 df 0f bd e2 ad  73 06 ae e6 08 8d f3 23  |.%a.....s......#|
+000001a0  d6 c6 d4 ea e2 22 b9 eb  75 bd 49 58 8f f4 f6 3b  |....."..u.IX...;|
+000001b0  92 e6 a4 18 ba 6d 50 77  65 69 27 ee 82 0f ca 57  |.....mPwei'....W|
+000001c0  db c7 69 e9 7d 6a ff 30  66 e9 8b 6f 10 20 05 fb  |..i.}j.0f..o. ..|
+000001d0  53 a7 01 5f d9 8d 11 e5  c2 cb 37 6a 93 a5 26 a3  |S.._......7j..&.|
+000001e0  e2 1b 45 b3 7f 6f e5 32  52 8e 26 f7 88 d6 de b6  |..E..o.2R.&.....|
+000001f0  75 32 a1 95 54 e8 65 38  9d ee 80 e7 7f 6f d8 2d  |u2..T.e8.....o.-|
+00000200  5f 29 60 c8 89 00 e6 05  06 b4 c0 b0 e5 ad ed 74  |_)`............t|
+00000210  77 93 30 92 82 06 45 b9  0e e3 1e 09 12 bb f8 16  |w.0...E.........|
+00000220  59 31 a8 51 17 e7 a8 d8  82 44 a0 d6 31 d2 a7 d1  |Y1.Q.....D..1...|
+00000230  54 97 c0 49 62 60 82 79  6a 3c 5a b5 92 aa aa f0  |T..Ib`.yj<Z.....|
+00000240  06 a8 2b 26 b6 fe 35 e5  b3 b9 95 34 1f c2 b5 a2  |..+&..5....4....|
+00000250  1e aa 31 82 61 43 4a 3b  b8 b1 c9 2a 13 80 f5 8d  |..1.aCJ;...*....|
+00000260  7a eb 04 59 7d 4e 0e 97  2f de 2b da 98 a5 5d 81  |z..Y}N../.+...].|
+00000270  44 87 8e 8b 7e d2 db 98  9c fc ef dc 75 2d b7 97  |D...~.......u-..|
+00000280  04 f1 3a 45 65 eb 1a be  da 21 d9 e2 24 65 a2 5a  |..:Ee....!..$e.Z|
+00000290  e5 e5 2d 7d 3c 2c 72 69  a7 64 2f e8 c0 a6 e9 f8  |..-}<,ri.d/.....|
+000002a0  56 4f 1e a8 e7 a1 24 6d  17 15 b4 e5 a8 7e 80 fe  |VO....$m.....~..|
+000002b0  e4 a4 46 7c 84 d1 b2 b6  49 47 90 dc 42 df 75 b5  |..F|....IG..B.u.|
+000002c0  50 e8 ea 32 8e 54 70 3e  0c ce fd 76 0a 23 dd 41  |P..2.Tp>...v.#.A|
+000002d0  0f 9e 99 7d eb 73 a2 4d  46 49 71 8e fe ab 5c 3d  |...}.s.MFIq...\=|
+000002e0  ae fb 1d c8 f0 d1 fc 93  99 96 35 f8 7c 8e ab ea  |..........5.|...|
+000002f0  96 eb ea ab f1 e5 71 4e  ce fc 4d 38 23 31 86 57  |......qN..M8#1.W|
+00000300  ac e6 31 55 97 f5 57 b3  58 e9 5a 62 d6 5a 61 a0  |..1U..W.X.Zb.Za.|
+00000310  3b a8 0c a5 66 df dc 62  27 e1 5b 10 80 5a 6a 39  |;...f..b'.[..Zj9|
+00000320  7f 83 5c 27 84 6e 95 d4  b6 c4 3e aa 06 a5 bf 81  |..\'.n....>.....|
+00000330  9d 69 05 c1 c0 e6 b4 e1  81 ff 0d 30 9a 7a 00 a3  |.i.........0.z..|
+00000340  ac a0 e8 f0 54 1d bf 53  9c 4b 10 50 0a 6f c9 a1  |....T..S.K.P.o..|
+00000350  9b e2 15 e4 e8 3a 17 03  03 00 99 8a 93 9f 65 05  |.....:........e.|
+00000360  9d e6 76 d8 25 0d 1a 6f  bc 4c 9f f3 97 23 f3 5b  |..v.%..o.L...#.[|
+00000370  bf 18 13 35 75 de a6 84  d4 d8 b1 ef 5c d4 f0 17  |...5u.......\...|
+00000380  8a 3c c7 f4 00 67 ae ec  65 fa 63 4d 23 86 bf ee  |.<...g..e.cM#...|
+00000390  73 0a 84 d8 32 d6 cd 6d  da 02 64 77 16 f8 96 4b  |s...2..m..dw...K|
+000003a0  ab a8 9f cd 0d ad be de  66 bf 24 24 26 47 38 d3  |........f.$$&G8.|
+000003b0  7e 28 1c 87 98 26 ca d3  ec e6 3a a8 0c 89 19 b5  |~(...&....:.....|
+000003c0  71 8d f3 f8 d5 07 c5 f4  75 f2 c5 17 11 3d d3 d6  |q.......u....=..|
+000003d0  16 e2 ee e9 c9 4c 43 c0  bf 10 fa a2 ff a1 fa 07  |.....LC.........|
+000003e0  db 17 d2 d0 6f 56 cf 67  6c 20 32 42 43 ad 18 a2  |....oV.gl 2BC...|
+000003f0  9d 39 d9 e2 17 03 03 00  45 ba 62 93 44 21 7f 7b  |.9......E.b.D!.{|
+00000400  8c 16 13 4a fe b3 e8 dc  13 70 d7 b4 36 8d 2d e1  |...J.....p..6.-.|
+00000410  aa 64 37 b9 8c 15 b4 f4  e7 00 12 94 f1 11 a5 04  |.d7.............|
+00000420  71 5c d6 ec ab e3 62 15  53 95 8e da f1 a1 c8 22  |q\....b.S......"|
+00000430  cf 02 e5 15 85 b2 35 48  a1 11 67 aa 70 1a        |......5H..g.p.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 19 6c b2 53 5f 6e  |...........l.S_n|
-00000010  a9 6a b2 48 da d7 d5 b2  56 81 47 a9 7d a8 5c 6d  |.j.H....V.G.}.\m|
-00000020  7a a8 23 db 17 03 03 00  45 88 80 32 38 19 22 fd  |z.#.....E..28.".|
-00000030  09 5c a2 40 50 ba 9c 34  ad 4e 4c 70 7c 4d f0 0e  |.\.@P..4.NLp|M..|
-00000040  68 3f da d6 c0 6e 6e 29  fa ec d8 11 2e 20 94 38  |h?...nn)..... .8|
-00000050  12 b9 08 27 3c e3 0a 8f  9a da cb 1f ab c9 f5 0e  |...'<...........|
-00000060  da a9 8c 66 24 de 2f b2  92 22 68 53 2f 68        |...f$./.."hS/h|
+00000000  14 03 03 00 01 01 17 03  03 00 19 44 2e d9 de 51  |...........D...Q|
+00000010  eb 6f 4d a5 6e f7 ca 7e  e2 54 88 5c 10 82 95 25  |.oM.n..~.T.\...%|
+00000020  ef 79 ab ae 17 03 03 00  45 a6 6e 3e 2c b9 c6 97  |.y......E.n>,...|
+00000030  6d 91 e5 a9 05 d8 d9 aa  69 b9 26 8c 51 24 37 4a  |m.......i.&.Q$7J|
+00000040  b7 80 c5 4f 8f bc f5 34  c2 e6 e0 e6 56 c7 af 0a  |...O...4....V...|
+00000050  4a d0 6d 98 76 c3 92 02  c3 82 58 44 fb f8 91 76  |J.m.v.....XD...v|
+00000060  df 57 6f 28 3e 84 6e 61  be 74 53 2c 9a 8e        |.Wo(>.na.tS,..|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 a3 38 95 dc  12 b1 b8 df 96 ef 91 88  |.....8..........|
-00000010  d4 d5 dc 35 ec 19 32 a3  2d 90 0b d5 03 f4 b2 b9  |...5..2.-.......|
-00000020  4e 5f 4d b2 18 ae 44 d6  21 f1 7f ef a2 ab 3a 60  |N_M...D.!.....:`|
-00000030  df a3 f3 6c 90 68 66 12  8c 3c c2 25 13 36 6c 1d  |...l.hf..<.%.6l.|
-00000040  51 e7 7e 75 f1 ac 54 fd  ae 1b e0 b3 03 6f 0e 96  |Q.~u..T......o..|
-00000050  91 5e 88 f5 a7 b6 f0 c5  3c ec a4 e1 3a 46 cd 41  |.^......<...:F.A|
-00000060  60 dc 6f 13 d0 eb 76 7e  b4 46 31 0f 23 22 0f b1  |`.o...v~.F1.#"..|
-00000070  c8 91 14 42 ac 67 6f 83  92 a7 5b 2c 88 16 fc cf  |...B.go...[,....|
-00000080  ef 97 56 2f 2b 64 92 7d  1a ae a7 94 66 5d 35 f3  |..V/+d.}....f]5.|
-00000090  77 63 c2 ef 82 d7 33 6d  0e 60 b2 a3 6b 01 aa 84  |wc....3m.`..k...|
-000000a0  32 d0 df 47 e1 01 52 15  17 03 03 00 1e 05 90 37  |2..G..R........7|
-000000b0  26 ed e0 a9 8d b1 07 26  42 6d 77 7c 19 aa c2 56  |&......&Bmw|...V|
-000000c0  f1 92 eb de 96 46 f2 25  d9 93 df 17 03 03 00 13  |.....F.%........|
-000000d0  ed b0 6c 70 1e 85 32 0d  8b ef 55 32 8c d6 fe 1d  |..lp..2...U2....|
-000000e0  c5 b0 4f                                          |..O|
+00000000  17 03 03 00 a3 5e 44 99  71 b2 70 5b 36 d3 17 a9  |.....^D.q.p[6...|
+00000010  eb 0b 02 b2 28 54 9d f7  3d f2 c4 d0 18 e1 fb 62  |....(T..=......b|
+00000020  e2 8a 37 b7 98 2a 98 39  c0 9d 5a 3c 53 99 31 79  |..7..*.9..Z<S.1y|
+00000030  f0 ab a4 2e ad 75 97 1e  4a 6b 09 5e 40 5d 44 98  |.....u..Jk.^@]D.|
+00000040  11 4d f7 a3 d2 8b 10 d5  87 70 9b f6 8e c8 35 38  |.M.......p....58|
+00000050  15 19 58 03 cb 63 48 c2  7b 25 18 63 7c b4 63 48  |..X..cH.{%.c|.cH|
+00000060  e5 27 d6 45 43 af b4 ea  33 0c 9a 5e 13 bf c1 4d  |.'.EC...3..^...M|
+00000070  91 56 36 fc 35 24 68 8e  33 5f a0 1d 3f ac 40 bf  |.V6.5$h.3_..?.@.|
+00000080  0e 34 d6 cb a0 69 6f 82  03 27 29 d8 0a 96 11 39  |.4...io..')....9|
+00000090  4d ae d7 16 6c d6 e2 5d  b4 a0 d5 87 bc 90 39 03  |M...l..]......9.|
+000000a0  75 31 dd 70 4d c1 08 ff  17 03 03 00 1e 8d 57 68  |u1.pM.........Wh|
+000000b0  8b 4d a9 58 50 26 68 24  32 e0 16 8f 8b ba b6 cd  |.M.XP&h$2.......|
+000000c0  ac 25 d5 80 4d 74 75 a5  02 47 6b 17 03 03 00 13  |.%..Mtu..Gk.....|
+000000d0  8e 57 f2 00 ff 89 b2 36  0e 4e 8d 07 28 4a b7 b6  |.W.....6.N..(J..|
+000000e0  41 ad 06                                          |A..|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv13-Ed25519 b/libgo/go/crypto/tls/testdata/Server-TLSv13-Ed25519
new file mode 100644 (file)
index 0000000..e3dd9db
--- /dev/null
@@ -0,0 +1,81 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 e0 01 00 00  dc 03 03 d8 00 36 18 75  |.............6.u|
+00000010  c8 be 9e c0 c2 8c 7d 8b  b5 e7 f3 ab 31 0f 5e af  |......}.....1.^.|
+00000020  f2 3c d6 e5 93 26 78 2f  94 19 23 20 8e b2 d2 08  |.<...&x/..# ....|
+00000030  7e 69 f5 38 73 13 2f 6d  ba ec ea 29 54 64 32 a0  |~i.8s./m...)Td2.|
+00000040  42 b8 d8 d4 2f 34 db 2f  55 25 54 3f 00 08 13 02  |B.../4./U%T?....|
+00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
+00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
+00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
+00000080  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 1e  |................|
+00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
+000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
+000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
+000000c0  24 00 1d 00 20 39 4b 85  87 27 a7 4c f3 5d 60 0e  |$... 9K..'.L.]`.|
+000000d0  27 d9 31 11 0f 9a fc a8  66 14 e5 57 72 3c c5 2b  |'.1.....f..Wr<.+|
+000000e0  01 e0 bb 26 29                                    |...&)|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 8e b2 d2 08  |........... ....|
+00000030  7e 69 f5 38 73 13 2f 6d  ba ec ea 29 54 64 32 a0  |~i.8s./m...)Td2.|
+00000040  42 b8 d8 d4 2f 34 db 2f  55 25 54 3f 13 02 00 00  |B.../4./U%T?....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
+00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
+00000080  03 03 00 01 01 17 03 03  00 17 34 9b a4 9b 55 78  |..........4...Ux|
+00000090  ad 94 a9 7b 1b 4a 5f 40  23 34 5d 98 87 74 f7 b3  |...{.J_@#4]..t..|
+000000a0  6d 17 03 03 01 50 8d 3f  8c 8d 12 99 a9 bd 78 42  |m....P.?......xB|
+000000b0  cc 8f 26 bf e2 55 12 32  8f 2b 0c c1 e1 13 e4 c0  |..&..U.2.+......|
+000000c0  20 06 4a ce c9 e5 3d 3a  ce d8 86 fc 9a 6d 47 59  | .J...=:.....mGY|
+000000d0  ba 11 70 08 1d f5 3f f4  5d 15 66 7e 8c ea 73 12  |..p...?.].f~..s.|
+000000e0  19 4f 65 29 10 f7 d2 da  b7 7d c5 bd a2 ec 2c 19  |.Oe).....}....,.|
+000000f0  fb a9 c5 d3 eb b2 bc 73  f6 73 e3 ae 95 4f 77 3c  |.......s.s...Ow<|
+00000100  62 e6 4b 46 a9 d3 36 0c  8a 6e a6 e6 a5 1c 8d 9d  |b.KF..6..n......|
+00000110  2c a0 76 c1 f6 ed bf 99  64 fe bc 03 62 8e 89 ac  |,.v.....d...b...|
+00000120  0c 74 56 f4 09 aa 4e f5  fd 89 8f 68 9e ac b2 c8  |.tV...N....h....|
+00000130  e1 d4 e0 cd 9c a8 0a 2b  11 61 fc fc 16 fd cf 09  |.......+.a......|
+00000140  cd 7c bc cd 3f ce 60 f8  7a 71 f1 1b b9 2b a1 93  |.|..?.`.zq...+..|
+00000150  60 1b d1 90 5b 5f bc 57  26 17 c6 e1 a4 6b 4f a4  |`...[_.W&....kO.|
+00000160  4e b2 58 57 c0 f2 61 1c  c9 5c 72 57 3d b2 03 07  |N.XW..a..\rW=...|
+00000170  22 a7 25 d2 2f 06 4d 55  18 26 06 bb 26 5e 58 a6  |".%./.MU.&..&^X.|
+00000180  e1 91 86 bd 02 22 f5 e7  af 6d c1 06 19 a6 fc 0d  |....."...m......|
+00000190  20 68 0e 05 ba 09 56 8d  43 33 9b 04 79 62 66 f0  | h....V.C3..ybf.|
+000001a0  7c 01 4d 74 86 23 64 e7  c5 6b 10 f5 61 6c c1 83  ||.Mt.#d..k..al..|
+000001b0  7a 02 f8 1e 4c 11 e3 81  90 75 a1 ff dd 63 af 07  |z...L....u...c..|
+000001c0  c6 c2 54 22 79 61 1f 2d  01 84 76 38 ee 5b dd 93  |..T"ya.-..v8.[..|
+000001d0  34 4d 06 dc 6f d1 5d cd  c7 31 e0 56 37 06 ea f3  |4M..o.]..1.V7...|
+000001e0  ca e2 00 86 17 73 58 b1  63 f0 91 03 a3 f7 b4 21  |.....sX.c......!|
+000001f0  ca 31 60 c4 a6 b6 17 03  03 00 59 25 ed f6 65 f5  |.1`.......Y%..e.|
+00000200  19 ba 78 3d 2d fb 86 3a  22 8b 9a 00 c1 3b ac 38  |..x=-..:"....;.8|
+00000210  cd ad c1 b7 14 91 fc e0  84 c0 ed 4a 86 ca 49 eb  |...........J..I.|
+00000220  a9 f2 9f dd a3 74 aa f0  a9 e4 fb 18 38 51 0a 10  |.....t......8Q..|
+00000230  13 8e ff a9 d2 3e 68 05  8f 82 5a c7 30 a5 02 f6  |.....>h...Z.0...|
+00000240  d3 38 6e e3 e4 b3 4d ca  c1 83 b2 e3 19 26 3a c2  |.8n...M......&:.|
+00000250  26 5f 38 d1 17 03 03 00  45 df 7e cc 71 f0 9e ca  |&_8.....E.~.q...|
+00000260  00 9a 64 b4 ab 3a b8 50  b9 cd e9 eb 5b be 88 3b  |..d..:.P....[..;|
+00000270  66 cf 15 98 5e 63 0c ad  e3 0c 40 83 87 6e 3e 01  |f...^c....@..n>.|
+00000280  a3 78 03 75 cd 93 0e 7d  d3 dc f2 f0 ed 3f 12 8d  |.x.u...}.....?..|
+00000290  fc c5 c3 c8 36 f2 82 fe  dc 69 02 26 84 8b 17 03  |....6....i.&....|
+000002a0  03 00 a3 d7 77 67 0e 4c  d9 19 f8 bd 86 6e 1c aa  |....wg.L.....n..|
+000002b0  16 ab 1b 48 21 f2 85 3e  c9 22 4b fd 21 8e b5 fa  |...H!..>."K.!...|
+000002c0  43 34 85 86 56 38 d3 4f  ec 9f 25 79 eb bb fe d0  |C4..V8.O..%y....|
+000002d0  69 98 05 1c c8 37 51 cf  cc 77 bc f1 e7 dc 9c c3  |i....7Q..w......|
+000002e0  d9 0b 3f 74 27 46 1e f3  7c 26 7e a4 6b ef c2 40  |..?t'F..|&~.k..@|
+000002f0  5b 23 de b6 ec 80 79 3b  8f d5 56 d4 ea 44 30 7e  |[#....y;..V..D0~|
+00000300  73 2b 09 44 32 5c b9 2c  04 6e 94 50 32 61 80 93  |s+.D2\.,.n.P2a..|
+00000310  41 b6 83 73 19 a0 b4 ee  b1 8b 23 a1 36 9c 5c 33  |A..s......#.6.\3|
+00000320  89 87 cd ef 8a 58 c7 51  a5 31 9c 8e 60 7a 6a ce  |.....X.Q.1..`zj.|
+00000330  5f 7e 13 43 ee 44 8d b7  2c 81 da 3d c6 c6 d2 18  |_~.C.D..,..=....|
+00000340  aa 85 22 63 d7 bd                                 |.."c..|
+>>> Flow 3 (client to server)
+00000000  14 03 03 00 01 01 17 03  03 00 45 03 21 4e 7f 71  |..........E.!N.q|
+00000010  cf b4 fa 18 34 06 57 62  51 99 3d 4a da 52 36 54  |....4.WbQ.=J.R6T|
+00000020  5b 22 2b 66 90 c1 8a 21  ec 5e 8b 3c 40 7a 18 0e  |["+f...!.^.<@z..|
+00000030  b5 82 c1 14 e5 9e 15 72  16 f2 fc 15 cb dd f1 e8  |.......r........|
+00000040  7c 03 5e ba c9 96 86 11  ec 88 44 97 24 a5 b2 5a  ||.^.......D.$..Z|
+>>> Flow 4 (server to client)
+00000000  17 03 03 00 1e 4b 9e 56  c2 1a a7 67 94 04 eb b0  |.....K.V...g....|
+00000010  48 87 44 38 7d f2 c7 b7  6c 1b a5 40 bb 1a 94 22  |H.D8}...l..@..."|
+00000020  a2 f0 9e 17 03 03 00 13  64 42 12 84 e4 d8 64 fd  |........dB....d.|
+00000030  8c 70 ff f5 43 4d 57 39  b2 d3 1e                 |.p..CMW9...|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled b/libgo/go/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled
deleted file mode 100644 (file)
index c13db8d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 e0 01 00 00  dc 03 03 1e 9f 50 05 56  |.............P.V|
-00000010  a7 21 c8 df 56 a8 f3 bb  e4 15 3b b0 04 e5 f5 10  |.!..V.....;.....|
-00000020  d8 5b 0e 68 d3 b4 39 64  b5 89 9c 20 5a 6b 29 6d  |.[.h..9d... Zk)m|
-00000030  22 a0 e0 fb 7f 2d 87 48  e7 b4 c9 b3 5a d0 2b c7  |"....-.H....Z.+.|
-00000040  ad d8 e4 ad d5 eb 81 b3  1f 61 0e 65 00 08 13 02  |.........a.e....|
-00000050  13 03 13 01 00 ff 01 00  00 8b 00 00 00 0e 00 0c  |................|
-00000060  00 00 09 31 32 37 2e 30  2e 30 2e 31 00 0b 00 04  |...127.0.0.1....|
-00000070  03 00 01 02 00 0a 00 0c  00 0a 00 1d 00 17 00 1e  |................|
-00000080  00 19 00 18 00 16 00 00  00 17 00 00 00 0d 00 1e  |................|
-00000090  00 1c 04 03 05 03 06 03  08 07 08 08 08 09 08 0a  |................|
-000000a0  08 0b 08 04 08 05 08 06  04 01 05 01 06 01 00 2b  |...............+|
-000000b0  00 03 02 03 04 00 2d 00  02 01 01 00 33 00 26 00  |......-.....3.&.|
-000000c0  24 00 1d 00 20 ba 67 99  b3 60 71 ed 6c bb 8d 7e  |$... .g..`q.l..~|
-000000d0  4c c3 ea 37 6d 90 b6 f8  91 67 71 2c 84 a7 32 3a  |L..7m....gq,..2:|
-000000e0  23 2a 90 13 35                                    |#*..5|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 5a 6b 29 6d  |........... Zk)m|
-00000030  22 a0 e0 fb 7f 2d 87 48  e7 b4 c9 b3 5a d0 2b c7  |"....-.H....Z.+.|
-00000040  ad d8 e4 ad d5 eb 81 b3  1f 61 0e 65 13 02 00 00  |.........a.e....|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
-00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 d9 74 68 ee e6 54  |...........th..T|
-00000090  e3 7a 0e ee 86 c7 a8 bb  c7 65 fc e4 c4 6c 58 7a  |.z.......e...lXz|
-000000a0  1e 17 03 03 02 6d 98 c3  0c cc 80 fe ea 70 13 4e  |.....m.......p.N|
-000000b0  2f f6 49 99 5f 27 0a f9  4d cf e5 1a 9a 37 fb e7  |/.I._'..M....7..|
-000000c0  3b a4 60 82 43 df fb fa  47 15 6f d8 db d2 3e c3  |;.`.C...G.o...>.|
-000000d0  dd a0 37 ca b2 b4 c9 1b  5c 86 4a e0 7e 06 1e 27  |..7.....\.J.~..'|
-000000e0  73 c6 cd 54 37 df 95 b1  c6 d5 44 85 2c 67 7d a7  |s..T7.....D.,g}.|
-000000f0  2a 7d 87 86 5e f3 e5 60  f8 7c de bf 78 89 35 9b  |*}..^..`.|..x.5.|
-00000100  d1 0b 8a dd 6f 40 d8 5a  55 10 e2 71 b0 7a 5e 4b  |....o@.ZU..q.z^K|
-00000110  86 18 be 18 a7 f8 8e c6  ae 8c 1e df bf 84 77 c5  |..............w.|
-00000120  dc b1 17 26 72 ea bb 9b  28 6c bf 19 8d 1a 22 90  |...&r...(l....".|
-00000130  0f 19 92 5b ff db 07 84  48 61 68 f0 50 20 76 a3  |...[....Hah.P v.|
-00000140  d3 f2 4a 3b 60 f5 73 cb  61 f7 11 63 f2 a7 0e 18  |..J;`.s.a..c....|
-00000150  30 96 d0 17 f1 2f 58 09  49 33 15 3e 31 e4 17 e8  |0..../X.I3.>1...|
-00000160  07 48 b5 43 06 40 60 4f  a0 78 0d 51 0c 3f 0f 1a  |.H.C.@`O.x.Q.?..|
-00000170  8c 95 7a 3e 36 66 36 22  dc 58 4e b7 3e 19 ad de  |..z>6f6".XN.>...|
-00000180  c9 f9 b0 76 e4 e2 8c 04  27 6f 67 8f fe 86 b9 41  |...v....'og....A|
-00000190  53 7d 9f d1 e0 a6 0b ec  fc c0 82 bf 00 36 28 4d  |S}...........6(M|
-000001a0  20 3a e3 42 67 87 16 64  6c 4f e2 54 23 d1 0f 32  | :.Bg..dlO.T#..2|
-000001b0  e9 16 9a da 46 a6 39 18  d5 6e a6 93 25 de a1 77  |....F.9..n..%..w|
-000001c0  d9 26 b5 7c b4 85 8a 69  48 90 11 a9 8c 42 ca b8  |.&.|...iH....B..|
-000001d0  88 63 df ec 6c e3 9f 2c  29 75 9b 57 79 8b 69 66  |.c..l..,)u.Wy.if|
-000001e0  16 9e 93 48 04 8a 41 e0  8b 0e fb a5 9c fd 68 f6  |...H..A.......h.|
-000001f0  5f ab 89 11 e4 aa 4c 6c  92 df b3 a3 39 f0 38 d9  |_.....Ll....9.8.|
-00000200  7d 1b 42 13 ee d1 83 e2  20 3f 60 81 96 d9 63 2c  |}.B..... ?`...c,|
-00000210  e8 54 a5 08 41 9b 1d 02  41 37 a2 ce 0c 9b 34 bf  |.T..A...A7....4.|
-00000220  43 c5 ac 90 67 cd 6b b6  55 31 36 b1 2b 0e ed 8c  |C...g.k.U16.+...|
-00000230  23 ae 71 b2 ab f3 94 68  f2 f6 87 d3 87 61 ca aa  |#.q....h.....a..|
-00000240  0b 65 63 a1 11 dc 6d 74  33 c8 24 a6 ae 40 27 c7  |.ec...mt3.$..@'.|
-00000250  d4 06 51 89 15 35 66 21  b0 82 15 87 70 c5 b8 8d  |..Q..5f!....p...|
-00000260  34 48 ff 41 e0 1a b0 46  f7 38 47 53 64 f7 a3 a2  |4H.A...F.8GSd...|
-00000270  61 96 72 ea 90 de 86 18  64 49 91 ed 97 05 e3 27  |a.r.....dI.....'|
-00000280  47 df ea 06 c6 28 f9 79  51 5e 64 b6 de 52 75 8a  |G....(.yQ^d..Ru.|
-00000290  79 8d 8e a6 d5 b0 f1 a6  ab 76 44 25 4b 80 5e e4  |y........vD%K.^.|
-000002a0  d4 aa c6 2d 77 1a 49 52  16 d6 73 6b 18 2d d1 a6  |...-w.IR..sk.-..|
-000002b0  4c e1 be 4d f8 79 34 a1  4c 81 88 9c 4b 85 f3 28  |L..M.y4.L...K..(|
-000002c0  97 fc 3a 7e cf d4 81 2c  d3 57 df 09 f5 49 f5 cf  |..:~...,.W...I..|
-000002d0  c7 7c 22 b3 8e 95 0f 97  6d d1 56 e3 43 7e 52 0f  |.|".....m.V.C~R.|
-000002e0  d4 da 3f e0 4e 06 b9 84  18 7d 7c 56 49 e0 d7 4a  |..?.N....}|VI..J|
-000002f0  d6 df c4 70 0c 74 5b 1f  4d 76 28 cd 3b b0 9e 27  |...p.t[.Mv(.;..'|
-00000300  cc 6b 1a 13 41 1a 6b bf  0d 2d 93 b2 d5 7e 7e 25  |.k..A.k..-...~~%|
-00000310  0e 8a 9c 17 03 03 00 99  df 4b 8e 3e d0 14 be 76  |.........K.>...v|
-00000320  f1 d3 ca b1 39 c0 7e 6c  4f 8c d9 0d b8 83 07 39  |....9.~lO......9|
-00000330  08 55 13 1e 3d 68 0f 99  9f 9a 68 1f 57 6a aa 41  |.U..=h....h.Wj.A|
-00000340  a4 40 2b 12 f2 4b 6c db  3c 59 fa 99 5c e2 c7 2d  |.@+..Kl.<Y..\..-|
-00000350  4b 55 4c 27 b1 6c bf 99  c3 36 1d 73 7a 8b fd bc  |KUL'.l...6.sz...|
-00000360  93 77 27 f5 9e cd 10 61  bc 8d b5 bf 7b bb 69 00  |.w'....a....{.i.|
-00000370  f9 f0 d3 22 dd 4e 7d 12  5a 61 49 1d d4 29 14 43  |...".N}.ZaI..).C|
-00000380  e5 62 ab d8 c6 78 75 80  4b 7a 6b 3f af 4b 92 2a  |.b...xu.Kzk?.K.*|
-00000390  23 29 da 85 c0 d7 35 03  9d ed 9c f7 83 39 cf cb  |#)....5......9..|
-000003a0  0f 85 5e 9f 29 61 d8 a2  d0 cb 14 2d 71 50 6f d5  |..^.)a.....-qPo.|
-000003b0  c2 17 03 03 00 45 be 9b  ee 5d e1 08 8a c2 d6 67  |.....E...].....g|
-000003c0  df 3b 84 50 28 30 69 bd  11 89 6a ab 02 ad d7 79  |.;.P(0i...j....y|
-000003d0  8b 2c 0a a9 9c ce e5 30  49 2d 59 82 e8 ee d3 03  |.,.....0I-Y.....|
-000003e0  77 d3 fc 22 dd 81 be e6  f4 22 36 8d 8e b1 7c 4a  |w.."....."6...|J|
-000003f0  b9 9c 6a ea 3f f0 aa ac  ec b6 c7 17 03 03 00 a3  |..j.?...........|
-00000400  69 e0 19 38 57 54 62 6c  28 d9 54 94 79 6e 7b 48  |i..8WTbl(.T.yn{H|
-00000410  25 55 7f 5f bb cc 91 07  30 47 55 9b f3 6e b9 ba  |%U._....0GU..n..|
-00000420  50 65 9b e9 81 5d 53 20  cd 27 5d ee 92 93 01 8f  |Pe...]S .'].....|
-00000430  5a d6 02 b9 26 1b 45 c3  40 26 6b 81 c3 ba 1e 3c  |Z...&.E.@&k....<|
-00000440  e6 03 93 b0 18 fe 2d be  07 97 b1 a1 a7 55 8f d8  |......-......U..|
-00000450  96 7a 58 ad 7d c1 72 71  d9 25 07 56 22 9a 7a f9  |.zX.}.rq.%.V".z.|
-00000460  4a 1b 82 30 e9 fb b0 26  81 45 d2 45 5b 1c 7d 97  |J..0...&.E.E[.}.|
-00000470  89 6d 17 69 81 27 a6 4c  be d0 78 1d b5 6c 3f 94  |.m.i.'.L..x..l?.|
-00000480  ef e4 6b ec 02 63 8b bf  f9 00 8a 8a 46 43 5d e0  |..k..c......FC].|
-00000490  52 38 8c d5 76 d7 79 42  a3 6b 35 e2 45 f3 0f b5  |R8..v.yB.k5.E...|
-000004a0  9f 22 f9                                          |.".|
->>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 45 4b 7c c5 9e c6  |..........EK|...|
-00000010  47 4a 90 d8 c2 c0 49 f7  3b c4 26 eb 15 18 9c bc  |GJ....I.;.&.....|
-00000020  c8 44 f0 53 94 2f 0f c8  d7 c1 86 42 ed b7 8f 63  |.D.S./.....B...c|
-00000030  a0 97 5d 5b 15 01 3a 3d  ca a6 d0 1a a4 77 cc 7e  |..][..:=.....w.~|
-00000040  88 fd 0b c9 a0 46 b7 40  25 8a 03 6e 99 66 bb 84  |.....F.@%..n.f..|
->>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 6a 41 80  ca 72 5f c3 ee e1 88 49  |.....jA..r_....I|
-00000010  6d be a4 d9 26 07 5c 2b  2c a7 83 b5 c4 eb 4e 4b  |m...&.\+,.....NK|
-00000020  a1 29 98 17 03 03 00 13  2a f9 33 6c 46 f7 9a 51  |.)......*.3lF..Q|
-00000030  1b 36 cd bc d8 5d 94 0d  9e 4b 72                 |.6...]...Kr|
index 9560176259e21929c4866315ea19d671c99dfff4..c873e43a70bfba9a74fe5d49297efa099ddbef95 100644 (file)
@@ -12,7 +12,7 @@ import (
        "crypto/sha256"
        "crypto/subtle"
        "errors"
-       "internal/x/crypto/cryptobyte"
+       "golang.org/x/crypto/cryptobyte"
        "io"
 )
 
index 578035cf731115ca6afb0c2b9003615fb2171786..ba6d5eba15bbba79b9ba041dab75b7a93ef00208 100644 (file)
@@ -5,14 +5,9 @@
 // Package tls partially implements TLS 1.2, as specified in RFC 5246,
 // and TLS 1.3, as specified in RFC 8446.
 //
-// TLS 1.3 is available only on an opt-in basis in Go 1.12. To enable
+// TLS 1.3 is available on an opt-out basis in Go 1.13. To disable
 // it, set the GODEBUG environment variable (comma-separated key=value
-// options) such that it includes "tls13=1". To enable it from within
-// the process, set the environment variable before any use of TLS:
-//
-//     func init() {
-//         os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",tls13=1")
-//     }
+// options) such that it includes "tls13=0".
 package tls
 
 // BUG(agl): The crypto/tls package only implements some countermeasures
@@ -21,8 +16,10 @@ package tls
 // https://www.imperialviolet.org/2013/02/04/luckythirteen.html.
 
 import (
+       "bytes"
        "crypto"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/rsa"
        "crypto/x509"
        "encoding/pem"
@@ -276,6 +273,14 @@ func X509KeyPair(certPEMBlock, keyPEMBlock []byte) (Certificate, error) {
                if pub.X.Cmp(priv.X) != 0 || pub.Y.Cmp(priv.Y) != 0 {
                        return fail(errors.New("tls: private key does not match public key"))
                }
+       case ed25519.PublicKey:
+               priv, ok := cert.PrivateKey.(ed25519.PrivateKey)
+               if !ok {
+                       return fail(errors.New("tls: private key type does not match public key type"))
+               }
+               if !bytes.Equal(priv.Public().(ed25519.PublicKey), pub) {
+                       return fail(errors.New("tls: private key does not match public key"))
+               }
        default:
                return fail(errors.New("tls: unknown public key algorithm"))
        }
@@ -292,7 +297,7 @@ func parsePrivateKey(der []byte) (crypto.PrivateKey, error) {
        }
        if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
                switch key := key.(type) {
-               case *rsa.PrivateKey, *ecdsa.PrivateKey:
+               case *rsa.PrivateKey, *ecdsa.PrivateKey, ed25519.PrivateKey:
                        return key, nil
                default:
                        return nil, errors.New("tls: found unknown private key type in PKCS#8 wrapping")
index 208c13c195314538f06cd2786cec50d82068d4e4..a07727c92bf2c4f18e7de13c4ed69b3f6d83df84 100644 (file)
@@ -23,17 +23,6 @@ import (
        "time"
 )
 
-var savedSupportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithmsTLS12
-
-func init() {
-       // TLS 1.3 is opt-in for Go 1.12, and RSA-PSS is disabled in TLS 1.2, but we
-       // want to run most tests with both enabled. TestTLS13Switch below and the
-       // "PSS-Disabled" recordings test the disabled behavior. See Issue 30055.
-       tls13Support.Do(func() {}) // defuse the sync.Once
-       tls13Support.cached = true
-       supportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithms
-}
-
 var rsaCertPEM = `-----BEGIN CERTIFICATE-----
 MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
 BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
@@ -48,7 +37,7 @@ r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
 -----END CERTIFICATE-----
 `
 
-var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
+var rsaKeyPEM = testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
 k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
@@ -56,12 +45,12 @@ MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
 SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
 xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
 D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
 
 // keyPEM is the same as rsaKeyPEM, but declares itself as just
 // "PRIVATE KEY", not "RSA PRIVATE KEY".  https://golang.org/issue/4477
-var keyPEM = `-----BEGIN PRIVATE KEY-----
+var keyPEM = testingKey(`-----BEGIN TESTING KEY-----
 MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
 k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
@@ -69,8 +58,8 @@ MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
 SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
 xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
 D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END PRIVATE KEY-----
-`
+-----END TESTING KEY-----
+`)
 
 var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
 MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
@@ -87,17 +76,17 @@ H5jBImIxPL4WxQNiBTexAkF8D1EtpYuWdlVQ80/h/f4pBcGiXPqX5h2PQSQY7hP1
 -----END CERTIFICATE-----
 `
 
-var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
+var ecdsaKeyPEM = testingKey(`-----BEGIN EC PARAMETERS-----
 BgUrgQQAIw==
 -----END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
+-----BEGIN EC TESTING KEY-----
 MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
 NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
 06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
 VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
 kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
------END EC PRIVATE KEY-----
-`
+-----END EC TESTING KEY-----
+`)
 
 var keyPairTests = []struct {
        algo string
@@ -383,7 +372,9 @@ func testVerifyHostnameResumed(t *testing.T, version uint16) {
                ClientSessionCache: NewLRUClientSessionCache(32),
        }
        for i := 0; i < 2; i++ {
-               c, err := Dial("tcp", "mail.google.com:https", config)
+               c, err := DialWithDialer(&net.Dialer{
+                       Timeout: 10 * time.Second,
+               }, "tcp", "mail.google.com:https", config)
                if err != nil {
                        t.Fatalf("Dial #%d: %v", i, err)
                }
@@ -400,12 +391,13 @@ func testVerifyHostnameResumed(t *testing.T, version uint16) {
                if err := c.VerifyHostname("mail.google.com"); err != nil {
                        t.Fatalf("verify mail.google.com #%d: %v", i, err)
                }
-               // Give the client a chance to read the server session tickets.
-               c.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
+               // Have the server send some data so session tickets are delivered.
+               c.SetDeadline(time.Now().Add(5 * time.Second))
+               if _, err := io.WriteString(c, "HEAD / HTTP/1.0\n\n"); err != nil {
+                       t.Fatal(err)
+               }
                if _, err := c.Read(make([]byte, 1)); err != nil {
-                       if err, ok := err.(net.Error); !ok || !err.Timeout() {
-                               t.Fatal(err)
-                       }
+                       t.Fatal(err)
                }
                c.Close()
        }
@@ -1150,3 +1142,5 @@ func TestBuildNameToCertificate_doesntModifyCertificates(t *testing.T) {
                t.Fatalf("Certificates were mutated by BuildNameToCertificate\nGot: %#v\nWant: %#v\n", got, want)
        }
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
index 4c9bc1b87a60f3b41c9f8ff1778ac230f47cf122..2020e37a5b177b94b0094f639a9ca67ea7babbcb 100644 (file)
@@ -63,10 +63,8 @@ type leafSpec struct {
 
 var nameConstraintsTests = []nameConstraintsTest{
        // #0: dummy test for the certificate generation process itself.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                leaf: leafSpec{
                        sans: []string{"dns:example.com"},
                },
@@ -74,13 +72,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #1: dummy test for the certificate generation process itself: single
        // level of intermediate.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -90,16 +86,14 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #2: dummy test for the certificate generation process itself: two
        // levels of intermediates.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -108,15 +102,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #3: matching DNS constraint in root
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -125,13 +119,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #4: matching DNS constraint in intermediate.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:example.com"},
                                },
                        },
@@ -142,15 +134,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #5: .example.com only matches subdomains.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -160,13 +152,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #6: .example.com matches subdomains.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:.example.com"},
                                },
                        },
@@ -177,15 +167,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #7: .example.com matches multiple levels of subdomains
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -195,15 +185,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #8: specifying a permitted list of names does not exclude other name
        // types
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -213,15 +203,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #9: specifying a permitted list of names does not exclude other name
        // types
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:10.0.0.0/8"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -232,15 +222,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        // #10: intermediates can try to permit other names, which isn't
        // forbidden if the leaf doesn't mention them. I.e. name constraints
        // apply to names, not constraints themselves.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:example.com", "dns:foo.com"},
                                },
                        },
@@ -252,15 +242,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #11: intermediates cannot add permitted names that the root doesn't
        // grant them.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:example.com", "dns:foo.com"},
                                },
                        },
@@ -272,15 +262,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #12: intermediates can further limit their scope if they wish.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:.bar.example.com"},
                                },
                        },
@@ -292,15 +282,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #13: intermediates can further limit their scope and that limitation
        // is effective
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:.bar.example.com"},
                                },
                        },
@@ -312,15 +302,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #14: roots can exclude subtrees and that doesn't affect other names.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -329,15 +319,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #15: roots exclusions are effective.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -348,13 +338,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #16: intermediates can also exclude names and that doesn't affect
        // other names.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        bad: []string{"dns:.example.com"},
                                },
                        },
@@ -365,13 +353,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #17: intermediate exclusions are effective.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        bad: []string{"dns:.example.com"},
                                },
                        },
@@ -383,15 +369,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #18: having an exclusion doesn't prohibit other types of names.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"dns:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -401,15 +387,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #19: IP-based exclusions are permitted and don't affect unrelated IP
        // addresses.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:10.0.0.0/8"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -418,15 +404,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #20: IP-based exclusions are effective
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:10.0.0.0/8"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -436,15 +422,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #21: intermediates can further constrain IP ranges.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:0.0.0.0/1"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        bad: []string{"ip:11.0.0.0/8"},
                                },
                        },
@@ -457,16 +443,14 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #22: when multiple intermediates are present, chain building can
        // avoid intermediates with incompatible constraints.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:.foo.com"},
                                },
-                               constraintsSpec{
+                               {
                                        ok: []string{"dns:.example.com"},
                                },
                        },
@@ -479,16 +463,14 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #23: (same as the previous test, but in the other order in ensure
        // that we don't pass it by luck.)
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:.example.com"},
                                },
-                               constraintsSpec{
+                               {
                                        ok: []string{"dns:.foo.com"},
                                },
                        },
@@ -501,16 +483,16 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #24: when multiple roots are valid, chain building can avoid roots
        // with incompatible constraints.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{},
-                       constraintsSpec{
+                       {},
+                       {
                                ok: []string{"dns:foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -521,16 +503,16 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #25: (same as the previous test, but in the other order in ensure
        // that we don't pass it by luck.)
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com"},
                        },
-                       constraintsSpec{},
+                       {},
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -541,26 +523,26 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #26: chain building can find a valid path even with multiple levels
        // of alternative intermediates and alternative roots.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com"},
                        },
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:example.com"},
                        },
-                       constraintsSpec{},
+                       {},
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
-                               constraintsSpec{
+                       {
+                               {},
+                               {
                                        ok: []string{"dns:foo.com"},
                                },
                        },
-                       []constraintsSpec{
-                               constraintsSpec{},
-                               constraintsSpec{
+                       {
+                               {},
+                               {
                                        ok: []string{"dns:foo.com"},
                                },
                        },
@@ -572,27 +554,27 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #27: chain building doesn't get stuck when there is no valid path.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com"},
                        },
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
-                               constraintsSpec{
+                       {
+                               {},
+                               {
                                        ok: []string{"dns:foo.com"},
                                },
                        },
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ok: []string{"dns:bar.com"},
                                },
-                               constraintsSpec{
+                               {
                                        ok: []string{"dns:foo.com"},
                                },
                        },
@@ -604,13 +586,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #28: unknown name types don't cause a problem without constraints.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -619,15 +599,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #29: unknown name types are allowed even in constrained chains.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -636,15 +616,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #30: without SANs, a certificate with a CN is rejected in a constrained chain.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -656,15 +636,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #31: IPv6 addresses work in constraints: roots can permit them as
        // expected.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -674,15 +654,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #32: IPv6 addresses work in constraints: root restrictions are
        // effective.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -692,15 +672,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #33: An IPv6 permitted subtree doesn't affect DNS names.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -709,15 +689,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #34: IPv6 exclusions don't affect unrelated addresses.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -726,15 +706,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #35: IPv6 exclusions are effective.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -744,15 +724,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #36: IPv6 constraints do not permit IPv4 addresses.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:2000:abcd::/32"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -762,15 +742,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #37: IPv4 constraints do not permit IPv6 addresses.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"ip:10.0.0.0/8"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -780,15 +760,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #38: an exclusion of an unknown type doesn't affect other names.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"unknown:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -798,15 +778,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #39: a permitted subtree of an unknown type doesn't affect other
        // name types.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"unknown:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -815,15 +795,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #40: exact email constraints work
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:foo@example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -832,15 +812,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #41: exact email constraints are effective
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:foo@example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -850,15 +830,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #42: email canonicalisation works.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:foo@example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -868,15 +848,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #43: limiting email addresses to a host works.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -885,15 +865,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #44: a leading dot matches hosts one level deep
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -902,15 +882,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #45: a leading dot does not match the host itself
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -920,15 +900,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #46: a leading dot also matches two (or more) levels deep.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:.example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -937,15 +917,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #47: the local part of an email is case-sensitive
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:foo@example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -955,15 +935,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #48: the domain part of an email is not case-sensitive
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:foo@EXAMPLE.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -972,15 +952,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #49: the domain part of a DNS constraint is also not case-sensitive.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:EXAMPLE.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -989,15 +969,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #50: URI constraints only cover the host part of the URI
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1010,15 +990,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #51: URIs with IPs are rejected
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1028,15 +1008,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #52: URIs with IPs and ports are rejected
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1046,15 +1026,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #53: URIs with IPv6 addresses are also rejected
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1064,15 +1044,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #54: URIs with IPv6 addresses with ports are also rejected
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1082,15 +1062,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #55: URI constraints are effective
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1100,15 +1080,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #56: URI constraints are effective
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"uri:foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1118,15 +1098,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #57: URI constraints can allow subdomains
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1136,15 +1116,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #58: excluding an IPv4-mapped-IPv6 address doesn't affect the IPv4
        // version of that address.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"ip:::ffff:1.2.3.4/128"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1153,15 +1133,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #59: a URI constraint isn't matched by a URN.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:example.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1172,16 +1152,16 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #60: excluding all IPv6 addresses doesn't exclude all IPv4 addresses
        // too, even though IPv4 is mapped into the IPv6 range.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok:  []string{"ip:1.2.3.0/24"},
                                bad: []string{"ip:::0/0"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1191,13 +1171,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #61: omitting extended key usage in a CA certificate implies that
        // any usage is ok.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1207,13 +1185,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #62: The “any” EKU also means that any usage is ok.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"any"},
                                },
                        },
@@ -1227,13 +1203,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        // #63: An intermediate with enumerated EKUs causes a failure if we
        // test for an EKU not in that set. (ServerAuth is required by
        // default.)
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"email"},
                                },
                        },
@@ -1247,13 +1221,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #64: an unknown EKU in the leaf doesn't break anything, even if it's not
        // correctly nested.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"email"},
                                },
                        },
@@ -1268,15 +1240,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        // #65: trying to add extra permitted key usages in an intermediate
        // (after a limitation in the root) is acceptable so long as the leaf
        // certificate doesn't use them.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ekus: []string{"serverAuth"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"serverAuth", "email"},
                                },
                        },
@@ -1288,15 +1260,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #66: EKUs in roots are not ignored.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ekus: []string{"email"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"serverAuth"},
                                },
                        },
@@ -1310,13 +1282,13 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #67: in order to support COMODO chains, SGC key usages permit
        // serverAuth and clientAuth.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{},
+                       {},
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"netscapeSGC"},
                                },
                        },
@@ -1329,13 +1301,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #68: in order to support COMODO chains, SGC key usages permit
        // serverAuth and clientAuth.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"msSGC"},
                                },
                        },
@@ -1347,15 +1317,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #69: an empty DNS constraint should allow anything.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1364,15 +1334,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #70: an empty DNS constraint should also reject everything.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"dns:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1382,15 +1352,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #71: an empty email constraint should allow anything
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"email:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1399,15 +1369,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #72: an empty email constraint should also reject everything.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"email:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1417,15 +1387,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #73: an empty URI constraint should allow anything
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"uri:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1434,15 +1404,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #74: an empty URI constraint should also reject everything.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"uri:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1453,13 +1423,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #75: serverAuth in a leaf shouldn't permit clientAuth when requested in
        // VerifyOptions.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1471,13 +1439,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #76: However, MSSGC in a leaf should match a request for serverAuth.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1493,13 +1459,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #77: an invalid DNS or mail SAN will not be detected if name constaint
        // checking is not triggered.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1509,15 +1473,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #78: an invalid DNS SAN will be detected if any name constraint checking
        // is triggered.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"uri:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1528,15 +1492,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #79: an invalid email SAN will be detected if any name constraint
        // checking is triggered.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                bad: []string{"uri:"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1546,13 +1510,11 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #80: if several EKUs are requested, satisfying any of them is sufficient.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1564,13 +1526,11 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #81: EKUs that are not asserted in VerifyOpts are not required to be
        // nested.
-       nameConstraintsTest{
-               roots: []constraintsSpec{
-                       constraintsSpec{},
-               },
+       {
+               roots: make([]constraintsSpec, 1),
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{
+                       {
+                               {
                                        ekus: []string{"serverAuth"},
                                },
                        },
@@ -1584,15 +1544,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #82: a certificate without SANs and CN is accepted in a constrained chain.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1602,15 +1562,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #83: a certificate without SANs and with a CN that does not parse as a
        // hostname is accepted in a constrained chain.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1620,15 +1580,15 @@ var nameConstraintsTests = []nameConstraintsTest{
        },
 
        // #84: a certificate with SANs and CN is accepted in a constrained chain.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -1639,15 +1599,15 @@ var nameConstraintsTests = []nameConstraintsTest{
 
        // #85: without SANs, a certificate with a valid CN is accepted in a
        // constrained chain if x509ignoreCN is set.
-       nameConstraintsTest{
+       {
                roots: []constraintsSpec{
-                       constraintsSpec{
+                       {
                                ok: []string{"dns:foo.com", "dns:.foo.com"},
                        },
                },
                intermediates: [][]constraintsSpec{
-                       []constraintsSpec{
-                               constraintsSpec{},
+                       {
+                               {},
                        },
                },
                leaf: leafSpec{
@@ -2220,10 +2180,8 @@ func TestBadNamesInSANs(t *testing.T) {
                        continue
                }
 
-               if err != nil {
-                       if str := err.Error(); !strings.Contains(str, "cannot parse ") {
-                               t.Errorf("bad name %q triggered unrecognised error: %s", badName, str)
-                       }
+               if str := err.Error(); !strings.Contains(str, "cannot parse ") {
+                       t.Errorf("bad name %q triggered unrecognised error: %s", badName, str)
                }
        }
 }
index 685d5ee15697cb00d4efdb7b60a2d39cdda754a2..dacef8b8617087c9d2db6cf17ab39ceb518678b2 100644 (file)
@@ -80,8 +80,8 @@ var testData = []struct {
        {
                kind:     PEMCipherDES,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: DES-CBC,34F09A4FC8DE22B5
 
@@ -92,7 +92,7 @@ qtHb1kirfGKEtgWTF+ynyco6+2gMXNu70L7nJcnxnV/RLFkHt7AUU1yrclxz7eZz
 XOH9VfTjb52q/I8Suozq9coVQwg4tXfIoYUdT//O+mB7zJb9HI9Ps77b9TxDE6Gm
 4C9brwZ3zg2vqXcwwV6QRZMtyll9rOpxkbw6NPlpfBqkc3xS51bbxivbO/Nve4KD
 r12ymjFNF4stXCfJnNqKoZ50BHmEEUDu5Wb0fpVn82XrGw7CYc4iug==
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MIIBPAIBAAJBAPASZe+tCPU6p80AjHhDkVsLYa51D35e/YGa8QcZyooeZM8EHozo
 KD0fNiKI+53bHdy07N+81VQ8/ejPcRoXPlsCAwEAAQJBAMTxIuSq27VpR+zZ7WJf
@@ -105,8 +105,8 @@ glcRgT6QCEtz2wIhANSyqaFtosIkHKqrDUGfz/bb5tqMYTAnBruVPaf/WEOBAiEA
        {
                kind:     PEMCipher3DES,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: DES-EDE3-CBC,C1F4A6A03682C2C7
 
@@ -117,7 +117,7 @@ Fgx5f84nT+/ovvreG+xeOzWgvtKo0UUZVrhGOgfKLpa57adumcJ6SkUuBtEFpZFB
 ldw5w7WC7d13x2LsRkwo8ZrDKgIV+Y9GNvhuCCkTzNP0V3gNeJpd201HZHR+9n3w
 3z0VjR/MGqsfcy1ziEWMNOO53At3zlG6zP05aHMnMcZoVXadEK6L1gz++inSSDCq
 gI0UJP4e3JVB7AkgYymYAwiYALAkoEIuanxoc50njJk=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MIIBOwIBAAJBANOCXKdoNS/iP/MAbl9cf1/SF3P+Ns7ZeNL27CfmDh0O6Zduaax5
 NBiumd2PmjkaCu7lQ5JOibHfWn+xJsc3kw0CAwEAAQJANX/W8d1Q/sCqzkuAn4xl
@@ -130,8 +130,8 @@ tZZZxCtPAm7shftEib0VU77Lk8MsXJcx2C4voRsjEw==`,
        {
                kind:     PEMCipherAES128,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,D4492E793FC835CC038A728ED174F78A
 
@@ -142,7 +142,7 @@ GZbBpf1jDH/pr0iGonuAdl2PCCZUiy+8eLsD2tyviHUkFLOB+ykYoJ5t8ngZ/B6D
 3NbvRVvYTgs8K9EPk4K+5R+P2kD8J8KvEIGxVa1vz8QoCJ/jr7Ka2rvNgPCex5/E
 080LzLHPCrXKdlr/f50yhNWq08ZxMWQFkui+FDHPDUaEELKAXV8/5PDxw80Rtybo
 AVYoCVIbZXZCuCO81op8UcOgEpTtyU5Lgh3Mw5scQL0=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MIIBOgIBAAJBAMBlj5FxYtqbcy8wY89d/S7n0+r5MzD9F63BA/Lpl78vQKtdJ5dT
 cDGh/rBt1ufRrNp0WihcmZi7Mpl/3jHjiWECAwEAAQJABNOHYnKhtDIqFYj1OAJ3
@@ -155,8 +155,8 @@ B3WlRNTXR2WsJ5JdByezg9xzdXzULqmga0OE339a`,
        {
                kind:     PEMCipherAES192,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-192-CBC,E2C9FB02BCA23ADE1829F8D8BC5F5369
 
@@ -167,7 +167,7 @@ Rb7tshNTMqHbCpyo9Rn3UxeFIf9efdl8YLiMoIqc7J8E5e9VlbeQSdLMQOgDAQJG
 ReUtTw8exmKsY4gsSjhkg5uiw7/ZB1Ihto0qnfQJgjGc680qGkT1d6JfvOfeYAk6
 xn5RqS/h8rYAYm64KnepfC9vIujo4NqpaREDmaLdX5MJPQ+SlytITQvgUsUq3q/t
 Ss85xjQEZH3hzwjQqdJvmA4hYP6SUjxYpBM+02xZ1Xw=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MIIBOwIBAAJBAMGcRrZiNNmtF20zyS6MQ7pdGx17aFDl+lTl+qnLuJRUCMUG05xs
 OmxmL/O1Qlf+bnqR8Bgg65SfKg21SYuLhiMCAwEAAQJBAL94uuHyO4wux2VC+qpj
@@ -180,8 +180,8 @@ uZ3pWbaXf5PNuQIgAcdXarvhelH2w2piY1g3BPeFqhzBSCK/yLGxR82KIh8CIQDD
        {
                kind:     PEMCipherAES256,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-256-CBC,8E7ED5CD731902CE938957A886A5FFBD
 
@@ -192,7 +192,7 @@ Pz3RZScwIuubzTGJ1x8EzdffYOsdCa9Mtgpp3L136+23dOd6L/qK2EG2fzrJSHs/
 2XugkleBFSMKzEp9mxXKRfa++uidQvMZTFLDK9w5YjrRvMBo/l2BoZIsq0jAIE1N
 sv5Z/KwlX+3MDEpPQpUwGPlGGdLnjI3UZ+cjgqBcoMiNc6HfgbBgYJSU6aDSHuCk
 clCwByxWkBNgJ2GrkwNrF26v+bGJJJNR4SKouY1jQf0=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MIIBOgIBAAJBAKy3GFkstoCHIEeUU/qO8207m8WSrjksR+p9B4tf1w5k+2O1V/GY
 AQ5WFCApItcOkQe/I0yZZJk/PmCqMzSxrc8CAwEAAQJAOCAz0F7AW9oNelVQSP8F
@@ -207,15 +207,15 @@ PXHYtPqxQIbD2pScR5qum7iGUh11lEUPkmt+2uqS`,
                // openssl genrsa -aes128 -passout pass:asdf -out server.orig.key 128
                kind:     PEMCipherAES128,
                password: []byte("asdf"),
-               pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+               pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
 
 6ei/MlytjE0FFgZOGQ+jrwomKfpl8kdefeE0NSt/DMRrw8OacHAzBNi3pPEa0eX3
 eND9l7C9meCirWovjj9QWVHrXyugFuDIqgdhQ8iHTgCfF3lrmcttVrbIfMDw+smD
 hTP8O1mS/MHl92NE0nhv0w==
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
                plainDER: `
 MGMCAQACEQC6ssxmYuauuHGOCDAI54RdAgMBAAECEQCWIn6Yv2O+kBcDF7STctKB
 AgkA8SEfu/2i3g0CCQDGNlXbBHX7kQIIK3Ww5o0cYbECCQDCimPb0dYGsQIIeQ7A
@@ -223,14 +223,14 @@ jryIst8=`,
        },
 }
 
-const incompleteBlockPEM = `
------BEGIN RSA PRIVATE KEY-----
+var incompleteBlockPEM = testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
 
 6L8yXK2MTQUWBk4ZD6OvCiYp+mXyR1594TQ1K38MxGvDw5pwcDME2Lek8RrR5fd40P2XsL2Z4KKt
 ai+OP1BZUetfK6AW4MiqB2FDyIdOAJ8XeWuZy21Wtsh8wPD6yYOFM/w7WZL8weX3Y0TSeG/T
------END RSA PRIVATE KEY-----`
+-----END RSA TESTING KEY-----`)
 
 func TestIncompleteBlock(t *testing.T) {
        // incompleteBlockPEM contains ciphertext that is not a multiple of the
@@ -245,3 +245,5 @@ func TestIncompleteBlock(t *testing.T) {
                t.Fatalf("Expected error containing %q but got: %q", expectedSubstr, e)
        }
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
index 82502cfe58129e6c237b87c0536f8d11ac605aca..a48c6f9d64ee51f75eaeef1e67d1d938de363ef0 100644 (file)
@@ -41,7 +41,9 @@ type pkcs1PublicKey struct {
        E int
 }
 
-// ParsePKCS1PrivateKey returns an RSA private key from its ASN.1 PKCS#1 DER encoded form.
+// ParsePKCS1PrivateKey parses an RSA private key in PKCS#1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "RSA PRIVATE KEY".
 func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) {
        var priv pkcs1PrivateKey
        rest, err := asn1.Unmarshal(der, &priv)
@@ -49,6 +51,12 @@ func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) {
                return nil, asn1.SyntaxError{Msg: "trailing data"}
        }
        if err != nil {
+               if _, err := asn1.Unmarshal(der, &ecPrivateKey{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParseECPrivateKey instead for this key format)")
+               }
+               if _, err := asn1.Unmarshal(der, &pkcs8{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)")
+               }
                return nil, err
        }
 
@@ -88,7 +96,11 @@ func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) {
        return key, nil
 }
 
-// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form.
+// MarshalPKCS1PrivateKey converts an RSA private key to PKCS#1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "RSA PRIVATE KEY".
+// For a more flexible key format which is not RSA specific, use
+// MarshalPKCS8PrivateKey.
 func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte {
        key.Precompute()
 
@@ -120,11 +132,16 @@ func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte {
        return b
 }
 
-// ParsePKCS1PublicKey parses a PKCS#1 public key in ASN.1 DER form.
+// ParsePKCS1PublicKey parses an RSA public key in PKCS#1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "RSA PUBLIC KEY".
 func ParsePKCS1PublicKey(der []byte) (*rsa.PublicKey, error) {
        var pub pkcs1PublicKey
        rest, err := asn1.Unmarshal(der, &pub)
        if err != nil {
+               if _, err := asn1.Unmarshal(der, &publicKeyInfo{}); err == nil {
+                       return nil, errors.New("x509: failed to parse public key (use ParsePKIXPublicKey instead for this key format)")
+               }
                return nil, err
        }
        if len(rest) > 0 {
@@ -145,6 +162,8 @@ func ParsePKCS1PublicKey(der []byte) (*rsa.PublicKey, error) {
 }
 
 // MarshalPKCS1PublicKey converts an RSA public key to PKCS#1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "RSA PUBLIC KEY".
 func MarshalPKCS1PublicKey(key *rsa.PublicKey) []byte {
        derBytes, _ := asn1.Marshal(pkcs1PublicKey{
                N: key.N,
index fb1340c6df7b23739785014e3cbb8116ffb70bf4..d37fc9e1b3fedf13caca4cb06b8a94a515ca9610 100644 (file)
@@ -6,6 +6,7 @@ package x509
 
 import (
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/rsa"
        "crypto/x509/pkix"
        "encoding/asn1"
@@ -23,11 +24,21 @@ type pkcs8 struct {
        // optional attributes omitted.
 }
 
-// ParsePKCS8PrivateKey parses an unencrypted, PKCS#8 private key.
-// See RFC 5208.
+// ParsePKCS8PrivateKey parses an unencrypted private key in PKCS#8, ASN.1 DER form.
+//
+// It returns a *rsa.PrivateKey, a *ecdsa.PrivateKey, or a ed25519.PrivateKey.
+// More types might be supported in the future.
+//
+// This kind of key is commonly encoded in PEM blocks of type "PRIVATE KEY".
 func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error) {
        var privKey pkcs8
        if _, err := asn1.Unmarshal(der, &privKey); err != nil {
+               if _, err := asn1.Unmarshal(der, &ecPrivateKey{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParseECPrivateKey instead for this key format)")
+               }
+               if _, err := asn1.Unmarshal(der, &pkcs1PrivateKey{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParsePKCS1PrivateKey instead for this key format)")
+               }
                return nil, err
        }
        switch {
@@ -50,16 +61,30 @@ func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error) {
                }
                return key, nil
 
+       case privKey.Algo.Algorithm.Equal(oidPublicKeyEd25519):
+               if l := len(privKey.Algo.Parameters.FullBytes); l != 0 {
+                       return nil, errors.New("x509: invalid Ed25519 private key parameters")
+               }
+               var curvePrivateKey []byte
+               if _, err := asn1.Unmarshal(privKey.PrivateKey, &curvePrivateKey); err != nil {
+                       return nil, fmt.Errorf("x509: invalid Ed25519 private key: %v", err)
+               }
+               if l := len(curvePrivateKey); l != ed25519.SeedSize {
+                       return nil, fmt.Errorf("x509: invalid Ed25519 private key length: %d", l)
+               }
+               return ed25519.NewKeyFromSeed(curvePrivateKey), nil
+
        default:
                return nil, fmt.Errorf("x509: PKCS#8 wrapping contained private key with unknown algorithm: %v", privKey.Algo.Algorithm)
        }
 }
 
-// MarshalPKCS8PrivateKey converts a private key to PKCS#8 encoded form.
-// The following key types are supported: *rsa.PrivateKey, *ecdsa.PrivateKey.
-// Unsupported key types result in an error.
+// MarshalPKCS8PrivateKey converts an RSA private key to PKCS#8, ASN.1 DER form.
+//
+// The following key types are currently supported: *rsa.PrivateKey, *ecdsa.PrivateKey
+// and ed25519.PrivateKey. Unsupported key types result in an error.
 //
-// See RFC 5208.
+// This kind of key is commonly encoded in PEM blocks of type "PRIVATE KEY".
 func MarshalPKCS8PrivateKey(key interface{}) ([]byte, error) {
        var privKey pkcs8
 
@@ -74,7 +99,7 @@ func MarshalPKCS8PrivateKey(key interface{}) ([]byte, error) {
        case *ecdsa.PrivateKey:
                oid, ok := oidFromNamedCurve(k.Curve)
                if !ok {
-                       return nil, errors.New("x509: unknown curve while marshalling to PKCS#8")
+                       return nil, errors.New("x509: unknown curve while marshaling to PKCS#8")
                }
 
                oidBytes, err := asn1.Marshal(oid)
@@ -93,8 +118,18 @@ func MarshalPKCS8PrivateKey(key interface{}) ([]byte, error) {
                        return nil, errors.New("x509: failed to marshal EC private key while building PKCS#8: " + err.Error())
                }
 
+       case ed25519.PrivateKey:
+               privKey.Algo = pkix.AlgorithmIdentifier{
+                       Algorithm: oidPublicKeyEd25519,
+               }
+               curvePrivateKey, err := asn1.Marshal(k.Seed())
+               if err != nil {
+                       return nil, fmt.Errorf("x509: failed to marshal private key: %v", err)
+               }
+               privKey.PrivateKey = curvePrivateKey
+
        default:
-               return nil, fmt.Errorf("x509: unknown key type while marshalling PKCS#8: %T", key)
+               return nil, fmt.Errorf("x509: unknown key type while marshaling PKCS#8: %T", key)
        }
 
        return asn1.Marshal(privKey)
index c8f11e64d12ebf809eceee259850fdb9d5ec923b..cb7ee4c1627f3b021704a09feaa8f98418ed7ce7 100644 (file)
@@ -7,10 +7,12 @@ package x509
 import (
        "bytes"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/elliptic"
        "crypto/rsa"
        "encoding/hex"
        "reflect"
+       "strings"
        "testing"
 )
 
@@ -39,6 +41,9 @@ var pkcs8P384PrivateKeyHex = `3081b6020100301006072a8648ce3d020106052b8104002204
 // expected and the Go test will fail to recreate it exactly.
 var pkcs8P521PrivateKeyHex = `3081ee020100301006072a8648ce3d020106052b810400230481d63081d3020101044200cfe0b87113a205cf291bb9a8cd1a74ac6c7b2ebb8199aaa9a5010d8b8012276fa3c22ac913369fa61beec2a3b8b4516bc049bde4fb3b745ac11b56ab23ac52e361a1818903818600040138f75acdd03fbafa4f047a8e4b272ba9d555c667962b76f6f232911a5786a0964e5edea6bd21a6f8725720958de049c6e3e6661c1c91b227cebee916c0319ed6ca003db0a3206d372229baf9dd25d868bf81140a518114803ce40c1855074d68c4e9dab9e65efba7064c703b400f1767f217dac82715ac1f6d88c74baf47a7971de4ea`
 
+// From RFC 8410, Section 7.
+var pkcs8Ed25519PrivateKeyHex = `302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842`
+
 func TestPKCS8(t *testing.T) {
        tests := []struct {
                name    string
@@ -75,6 +80,11 @@ func TestPKCS8(t *testing.T) {
                        keyType: reflect.TypeOf(&ecdsa.PrivateKey{}),
                        curve:   elliptic.P521(),
                },
+               {
+                       name:    "Ed25519 private key",
+                       keyHex:  pkcs8Ed25519PrivateKeyHex,
+                       keyType: reflect.TypeOf(ed25519.PrivateKey{}),
+               },
        }
 
        for _, test := range tests {
@@ -102,8 +112,29 @@ func TestPKCS8(t *testing.T) {
                        continue
                }
                if !bytes.Equal(derBytes, reserialised) {
-                       t.Errorf("%s: marshalled PKCS#8 didn't match original: got %x, want %x", test.name, reserialised, derBytes)
+                       t.Errorf("%s: marshaled PKCS#8 didn't match original: got %x, want %x", test.name, reserialised, derBytes)
                        continue
                }
        }
 }
+
+const hexPKCS8TestPKCS1Key = "3082025c02010002818100b1a1e0945b9289c4d3f1329f8a982c4a2dcd59bfd372fb8085a9c517554607ebd2f7990eef216ac9f4605f71a03b04f42a5255b158cf8e0844191f5119348baa44c35056e20609bcf9510f30ead4b481c81d7865fb27b8e0090e112b717f3ee08cdfc4012da1f1f7cf2a1bc34c73a54a12b06372d09714742dd7895eadde4aa5020301000102818062b7fa1db93e993e40237de4d89b7591cc1ea1d04fed4904c643f17ae4334557b4295270d0491c161cb02a9af557978b32b20b59c267a721c4e6c956c2d147046e9ae5f2da36db0106d70021fa9343455f8f973a4b355a26fd19e6b39dee0405ea2b32deddf0f4817759ef705d02b34faab9ca93c6766e9f722290f119f34449024100d9c29a4a013a90e35fd1be14a3f747c589fac613a695282d61812a711906b8a0876c6181f0333ca1066596f57bff47e7cfcabf19c0fc69d9cd76df743038b3cb024100d0d3546fecf879b5551f2bd2c05e6385f2718a08a6face3d2aecc9d7e03645a480a46c81662c12ad6bd6901e3bd4f38029462de7290859567cdf371c79088d4f024100c254150657e460ea58573fcf01a82a4791e3d6223135c8bdfed69afe84fbe7857274f8eb5165180507455f9b4105c6b08b51fe8a481bb986a202245576b713530240045700003b7a867d0041df9547ae2e7f50248febd21c9040b12dae9c2feab0d3d4609668b208e4727a3541557f84d372ac68eaf74ce1018a4c9a0ef92682c8fd02405769731480bb3a4570abf422527c5f34bf732fa6c1e08cc322753c511ce055fac20fc770025663ad3165324314df907f1f1942f0448a7e9cdbf87ecd98b92156"
+const hexPKCS8TestECKey = "3081a40201010430bdb9839c08ee793d1157886a7a758a3c8b2a17a4df48f17ace57c72c56b4723cf21dcda21d4e1ad57ff034f19fcfd98ea00706052b81040022a16403620004feea808b5ee2429cfcce13c32160e1c960990bd050bb0fdf7222f3decd0a55008e32a6aa3c9062051c4cba92a7a3b178b24567412d43cdd2f882fa5addddd726fe3e208d2c26d733a773a597abb749714df7256ead5105fa6e7b3650de236b50"
+
+var pkcs8MismatchKeyTests = []struct {
+       hexKey        string
+       errorContains string
+}{
+       {hexKey: hexPKCS8TestECKey, errorContains: "use ParseECPrivateKey instead"},
+       {hexKey: hexPKCS8TestPKCS1Key, errorContains: "use ParsePKCS1PrivateKey instead"},
+}
+
+func TestPKCS8MismatchKeyFormat(t *testing.T) {
+       for i, test := range pkcs8MismatchKeyTests {
+               derBytes, _ := hex.DecodeString(test.hexKey)
+               _, err := ParsePKCS8PrivateKey(derBytes)
+               if !strings.Contains(err.Error(), test.errorContains) {
+                       t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err)
+               }
+       }
+}
index e6332072d62a50d89398bd4d3677fb9f02efc4aa..255a8d3525ee932f9afd0200e0b13d4a88ef0b55 100644 (file)
@@ -16,7 +16,7 @@ package x509
 #include <CoreFoundation/CoreFoundation.h>
 #include <Security/Security.h>
 
-static bool isSSLPolicy(SecPolicyRef policyRef) {
+static Boolean isSSLPolicy(SecPolicyRef policyRef) {
        if (!policyRef) {
                return false;
        }
@@ -24,13 +24,13 @@ static bool isSSLPolicy(SecPolicyRef policyRef) {
        if (properties == NULL) {
                return false;
        }
+       Boolean isSSL = false;
        CFTypeRef value = NULL;
        if (CFDictionaryGetValueIfPresent(properties, kSecPolicyOid, (const void **)&value)) {
-               CFRelease(properties);
-               return CFEqual(value, kSecPolicyAppleSSL);
+               isSSL = CFEqual(value, kSecPolicyAppleSSL);
        }
        CFRelease(properties);
-       return false;
+       return isSSL;
 }
 
 // sslTrustSettingsResult obtains the final kSecTrustSettingsResult value
@@ -51,6 +51,7 @@ static SInt32 sslTrustSettingsResult(SecCertificateRef cert) {
        }
 
        // > no trust settings [...] means "this certificate must be verified to a known trusted certificate”
+       // (Should this cause a fallback from user to admin domain? It's unclear.)
        if (err != errSecSuccess || trustSettings == NULL) {
                if (trustSettings != NULL) CFRelease(trustSettings);
                return kSecTrustSettingsResultUnspecified;
@@ -77,16 +78,12 @@ static SInt32 sslTrustSettingsResult(SecCertificateRef cert) {
        for (m = 0; m < CFArrayGetCount(trustSettings); m++) {
                CFDictionaryRef tSetting = (CFDictionaryRef)CFArrayGetValueAtIndex(trustSettings, m);
 
-               // First, check if this trust setting applies to our policy. We assume
-               // only one will. The docs suggest that there might be multiple applying
-               // but don't explain how to combine them.
+               // First, check if this trust setting is constrained to a non-SSL policy.
                SecPolicyRef policyRef;
                if (CFDictionaryGetValueIfPresent(tSetting, _kSecTrustSettingsPolicy, (const void**)&policyRef)) {
                        if (!isSSLPolicy(policyRef)) {
                                continue;
                        }
-               } else {
-                       continue;
                }
 
                if (CFDictionaryContainsKey(tSetting, _kSecTrustSettingsPolicyString)) {
@@ -98,13 +95,23 @@ static SInt32 sslTrustSettingsResult(SecCertificateRef cert) {
                if (CFDictionaryGetValueIfPresent(tSetting, _kSecTrustSettingsResult, (const void**)&cfNum)) {
                        CFNumberGetValue(cfNum, kCFNumberSInt32Type, &result);
                } else {
-                       // > If the value of the kSecTrustSettingsResult component is not
-                       // > kSecTrustSettingsResultUnspecified for a usage constraints dictionary that has
-                       // > no constraints, the default value kSecTrustSettingsResultTrustRoot is assumed.
+                       // > If this key is not present, a default value of
+                       // > kSecTrustSettingsResultTrustRoot is assumed.
                        result = kSecTrustSettingsResultTrustRoot;
                }
 
-               break;
+               // If multiple dictionaries match, we are supposed to "OR" them,
+               // the semantics of which are not clear. Since TrustRoot and TrustAsRoot
+               // are mutually exclusive, Deny should probably override, and Invalid and
+               // Unspecified be overridden, approximate this by stopping at the first
+               // TrustRoot, TrustAsRoot or Deny.
+               if (result == kSecTrustSettingsResultTrustRoot) {
+                       break;
+               } else if (result == kSecTrustSettingsResultTrustAsRoot) {
+                       break;
+               } else if (result == kSecTrustSettingsResultDeny) {
+                       break;
+               }
        }
 
        // If trust settings are present, but none of them match the policy...
@@ -143,7 +150,7 @@ static Boolean isRootCertificate(SecCertificateRef cert, CFErrorRef *errRef) {
        return equal;
 }
 
-// FetchPEMRoots fetches the system's list of trusted X.509 root certificates
+// CopyPEMRoots fetches the system's list of trusted X.509 root certificates
 // for the kSecTrustSettingsPolicy SSL.
 //
 // On success it returns 0 and fills pemRoots with a CFDataRef that contains the extracted root
@@ -152,15 +159,15 @@ static Boolean isRootCertificate(SecCertificateRef cert, CFErrorRef *errRef) {
 //
 // Note: The CFDataRef returned in pemRoots and untrustedPemRoots must
 // be released (using CFRelease) after we've consumed its content.
-int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugDarwinRoots) {
+int CopyPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugDarwinRoots) {
        int i;
 
        if (debugDarwinRoots) {
-               printf("crypto/x509: kSecTrustSettingsResultInvalid = %d\n", kSecTrustSettingsResultInvalid);
-               printf("crypto/x509: kSecTrustSettingsResultTrustRoot = %d\n", kSecTrustSettingsResultTrustRoot);
-               printf("crypto/x509: kSecTrustSettingsResultTrustAsRoot = %d\n", kSecTrustSettingsResultTrustAsRoot);
-               printf("crypto/x509: kSecTrustSettingsResultDeny = %d\n", kSecTrustSettingsResultDeny);
-               printf("crypto/x509: kSecTrustSettingsResultUnspecified = %d\n", kSecTrustSettingsResultUnspecified);
+               fprintf(stderr, "crypto/x509: kSecTrustSettingsResultInvalid = %d\n", kSecTrustSettingsResultInvalid);
+               fprintf(stderr, "crypto/x509: kSecTrustSettingsResultTrustRoot = %d\n", kSecTrustSettingsResultTrustRoot);
+               fprintf(stderr, "crypto/x509: kSecTrustSettingsResultTrustAsRoot = %d\n", kSecTrustSettingsResultTrustAsRoot);
+               fprintf(stderr, "crypto/x509: kSecTrustSettingsResultDeny = %d\n", kSecTrustSettingsResultDeny);
+               fprintf(stderr, "crypto/x509: kSecTrustSettingsResultUnspecified = %d\n", kSecTrustSettingsResultUnspecified);
        }
 
        // Get certificates from all domains, not just System, this lets
@@ -170,7 +177,7 @@ int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugD
                kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainUser };
 
        int numDomains = sizeof(domains)/sizeof(SecTrustSettingsDomain);
-       if (pemRoots == NULL) {
+       if (pemRoots == NULL || untrustedPemRoots == NULL) {
                return -1;
        }
 
@@ -186,8 +193,6 @@ int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugD
 
                CFIndex numCerts = CFArrayGetCount(certs);
                for (j = 0; j < numCerts; j++) {
-                       CFDataRef data = NULL;
-                       CFArrayRef trustSettings = NULL;
                        SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(certs, j);
                        if (cert == NULL) {
                                continue;
@@ -206,7 +211,7 @@ int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugD
                                        CFErrorRef errRef = NULL;
                                        CFStringRef summary = SecCertificateCopyShortDescription(NULL, cert, &errRef);
                                        if (errRef != NULL) {
-                                               printf("crypto/x509: SecCertificateCopyShortDescription failed\n");
+                                               fprintf(stderr, "crypto/x509: SecCertificateCopyShortDescription failed\n");
                                                CFRelease(errRef);
                                                continue;
                                        }
@@ -215,7 +220,7 @@ int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugD
                                        CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
                                        char *buffer = malloc(maxSize);
                                        if (CFStringGetCString(summary, buffer, maxSize, kCFStringEncodingUTF8)) {
-                                               printf("crypto/x509: %s returned %d\n", buffer, (int)result);
+                                               fprintf(stderr, "crypto/x509: %s returned %d\n", buffer, (int)result);
                                        }
                                        free(buffer);
                                        CFRelease(summary);
@@ -246,11 +251,16 @@ int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugD
                        } else if (result == kSecTrustSettingsResultDeny) {
                                appendTo = combinedUntrustedData;
                        } else if (result == kSecTrustSettingsResultUnspecified) {
+                               // Certificates with unspecified trust should probably be added to a pool of
+                               // intermediates for chain building, or checked for transitive trust and
+                               // added to the root pool (which is an imprecise approximation because it
+                               // cuts chains short) but we don't support either at the moment. TODO.
                                continue;
                        } else {
                                continue;
                        }
 
+                       CFDataRef data = NULL;
                        err = SecItemExport(cert, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data);
                        if (err != noErr) {
                                continue;
@@ -274,22 +284,22 @@ import (
 )
 
 func loadSystemRoots() (*CertPool, error) {
-       roots := NewCertPool()
-
-       var data C.CFDataRef = 0
-       var untrustedData C.CFDataRef = 0
-       err := C.FetchPEMRoots(&data, &untrustedData, C.bool(debugDarwinRoots))
+       var data, untrustedData C.CFDataRef
+       err := C.CopyPEMRoots(&data, &untrustedData, C.bool(debugDarwinRoots))
        if err == -1 {
                return nil, errors.New("crypto/x509: failed to load darwin system roots with cgo")
        }
-
        defer C.CFRelease(C.CFTypeRef(data))
+       defer C.CFRelease(C.CFTypeRef(untrustedData))
+
        buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data)))
+       roots := NewCertPool()
        roots.AppendCertsFromPEM(buf)
-       if untrustedData == 0 {
+
+       if C.CFDataGetLength(untrustedData) == 0 {
                return roots, nil
        }
-       defer C.CFRelease(C.CFTypeRef(untrustedData))
+
        buf = C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(untrustedData)), C.int(C.CFDataGetLength(untrustedData)))
        untrustedRoots := NewCertPool()
        untrustedRoots.AppendCertsFromPEM(buf)
index 9b8a1cca7dea609908a53efb82f145636b5f0a9f..2f6a8b8d60762703679a6e3d60a6c33d5156793a 100644 (file)
@@ -58,7 +58,7 @@ func execSecurityRoots() (*CertPool, error) {
                return nil, err
        }
        if debugDarwinRoots {
-               fmt.Printf("crypto/x509: %d certs have a trust policy\n", len(hasPolicy))
+               fmt.Fprintf(os.Stderr, "crypto/x509: %d certs have a trust policy\n", len(hasPolicy))
        }
 
        keychains := []string{"/Library/Keychains/System.keychain"}
@@ -68,7 +68,7 @@ func execSecurityRoots() (*CertPool, error) {
        home, err := os.UserHomeDir()
        if err != nil {
                if debugDarwinRoots {
-                       fmt.Printf("crypto/x509: can't get user home directory: %v\n", err)
+                       fmt.Fprintf(os.Stderr, "crypto/x509: can't get user home directory: %v\n", err)
                }
        } else {
                keychains = append(keychains,
@@ -148,7 +148,7 @@ func execSecurityRoots() (*CertPool, error) {
        wg.Wait()
 
        if debugDarwinRoots {
-               fmt.Printf("crypto/x509: ran security verify-cert %d times\n", numVerified)
+               fmt.Fprintf(os.Stderr, "crypto/x509: ran security verify-cert %d times\n", numVerified)
        }
 
        return roots, nil
@@ -205,12 +205,12 @@ func verifyCertWithSystem(cert *Certificate) bool {
        }
        if err := cmd.Run(); err != nil {
                if debugDarwinRoots {
-                       fmt.Printf("crypto/x509: verify-cert rejected %s: %q\n", cert.Subject, bytes.TrimSpace(stderr.Bytes()))
+                       fmt.Fprintf(os.Stderr, "crypto/x509: verify-cert rejected %s: %q\n", cert.Subject, bytes.TrimSpace(stderr.Bytes()))
                }
                return false
        }
        if debugDarwinRoots {
-               fmt.Printf("crypto/x509: verify-cert approved %s\n", cert.Subject)
+               fmt.Fprintf(os.Stderr, "crypto/x509: verify-cert approved %s\n", cert.Subject)
        }
        return true
 }
@@ -243,7 +243,7 @@ func getCertsWithTrustPolicy() (map[string]bool, error) {
                        // localized on macOS, just interpret any failure to mean that
                        // there are no trust settings.
                        if debugDarwinRoots {
-                               fmt.Printf("crypto/x509: exec %q: %v, %s\n", cmd.Args, err, stderr.Bytes())
+                               fmt.Fprintf(os.Stderr, "crypto/x509: exec %q: %v, %s\n", cmd.Args, err, stderr.Bytes())
                        }
                        return nil
                }
index aa1785e4c637508f2d01d0679f271f7ea3d3bc51..267775dc5f0664c51926a0623c8dd9af37de40cf 100644 (file)
@@ -11,4 +11,5 @@ var certFiles = []string{
        "/etc/ssl/ca-bundle.pem",                            // OpenSUSE
        "/etc/pki/tls/cacert.pem",                           // OpenELEC
        "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
+       "/etc/ssl/cert.pem",                                 // Alpine Linux
 }
index 74d395df707dfff6d56fe0d484f08e4e4033f682..1e3ebe894227d3af730aa12d5547b6bd1cdc3d47 100644 (file)
@@ -229,7 +229,11 @@ func loadSystemRoots() (*CertPool, error) {
        // TODO: restore this functionality on Windows. We tried to do
        // it in Go 1.8 but had to revert it. See Issue 18609.
        // Returning (nil, nil) was the old behavior, prior to CL 30578.
-       return nil, nil
+       // The if statement here avoids vet complaining about
+       // unreachable code below.
+       if true {
+               return nil, nil
+       }
 
        const CRYPT_E_NOT_FOUND = 0x80092004
 
index 3008d0df773fcc34814d7913846acac798c6632b..6cffa59d0e97998fad4e7ba7ddd1962cf2424511 100644 (file)
@@ -28,12 +28,18 @@ type ecPrivateKey struct {
        PublicKey     asn1.BitString        `asn1:"optional,explicit,tag:1"`
 }
 
-// ParseECPrivateKey parses an ASN.1 Elliptic Curve Private Key Structure.
+// ParseECPrivateKey parses an EC public key in SEC 1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "EC PUBLIC KEY".
 func ParseECPrivateKey(der []byte) (*ecdsa.PrivateKey, error) {
        return parseECPrivateKey(nil, der)
 }
 
-// MarshalECPrivateKey marshals an EC private key into ASN.1, DER format.
+// MarshalECPrivateKey converts an EC private key to SEC 1, ASN.1 DER form.
+//
+// This kind of key is commonly encoded in PEM blocks of type "EC PRIVATE KEY".
+// For a more flexible key format which is not EC specific, use
+// MarshalPKCS8PrivateKey.
 func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error) {
        oid, ok := oidFromNamedCurve(key.Curve)
        if !ok {
@@ -65,6 +71,12 @@ func marshalECPrivateKeyWithOID(key *ecdsa.PrivateKey, oid asn1.ObjectIdentifier
 func parseECPrivateKey(namedCurveOID *asn1.ObjectIdentifier, der []byte) (key *ecdsa.PrivateKey, err error) {
        var privKey ecPrivateKey
        if _, err := asn1.Unmarshal(der, &privKey); err != nil {
+               if _, err := asn1.Unmarshal(der, &pkcs8{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)")
+               }
+               if _, err := asn1.Unmarshal(der, &pkcs1PrivateKey{}); err == nil {
+                       return nil, errors.New("x509: failed to parse private key (use ParsePKCS1PrivateKey instead for this key format)")
+               }
                return nil, errors.New("x509: failed to parse EC private key: " + err.Error())
        }
        if privKey.Version != ecPrivKeyVersion {
index 573c937cafdf8b8fe5e202a86ef8da6b2b20189a..9ac251896bd995ecebcd70c2831b476750f9619c 100644 (file)
@@ -7,6 +7,7 @@ package x509
 import (
        "bytes"
        "encoding/hex"
+       "strings"
        "testing"
 )
 
@@ -42,3 +43,24 @@ func TestParseECPrivateKey(t *testing.T) {
                }
        }
 }
+
+const hexECTestPKCS1Key = "3082025c02010002818100b1a1e0945b9289c4d3f1329f8a982c4a2dcd59bfd372fb8085a9c517554607ebd2f7990eef216ac9f4605f71a03b04f42a5255b158cf8e0844191f5119348baa44c35056e20609bcf9510f30ead4b481c81d7865fb27b8e0090e112b717f3ee08cdfc4012da1f1f7cf2a1bc34c73a54a12b06372d09714742dd7895eadde4aa5020301000102818062b7fa1db93e993e40237de4d89b7591cc1ea1d04fed4904c643f17ae4334557b4295270d0491c161cb02a9af557978b32b20b59c267a721c4e6c956c2d147046e9ae5f2da36db0106d70021fa9343455f8f973a4b355a26fd19e6b39dee0405ea2b32deddf0f4817759ef705d02b34faab9ca93c6766e9f722290f119f34449024100d9c29a4a013a90e35fd1be14a3f747c589fac613a695282d61812a711906b8a0876c6181f0333ca1066596f57bff47e7cfcabf19c0fc69d9cd76df743038b3cb024100d0d3546fecf879b5551f2bd2c05e6385f2718a08a6face3d2aecc9d7e03645a480a46c81662c12ad6bd6901e3bd4f38029462de7290859567cdf371c79088d4f024100c254150657e460ea58573fcf01a82a4791e3d6223135c8bdfed69afe84fbe7857274f8eb5165180507455f9b4105c6b08b51fe8a481bb986a202245576b713530240045700003b7a867d0041df9547ae2e7f50248febd21c9040b12dae9c2feab0d3d4609668b208e4727a3541557f84d372ac68eaf74ce1018a4c9a0ef92682c8fd02405769731480bb3a4570abf422527c5f34bf732fa6c1e08cc322753c511ce055fac20fc770025663ad3165324314df907f1f1942f0448a7e9cdbf87ecd98b92156"
+const hexECTestPKCS8Key = "30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100cfb1b5bf9685ffa97b4f99df4ff122b70e59ac9b992f3bc2b3dde17d53c1a34928719b02e8fd17839499bfbd515bd6ef99c7a1c47a239718fe36bfd824c0d96060084b5f67f0273443007a24dfaf5634f7772c9346e10eb294c2306671a5a5e719ae24b4de467291bc571014b0e02dec04534d66a9bb171d644b66b091780e8d020301000102818100b595778383c4afdbab95d2bfed12b3f93bb0a73a7ad952f44d7185fd9ec6c34de8f03a48770f2009c8580bcd275e9632714e9a5e3f32f29dc55474b2329ff0ebc08b3ffcb35bc96e6516b483df80a4a59cceb71918cbabf91564e64a39d7e35dce21cb3031824fdbc845dba6458852ec16af5dddf51a8397a8797ae0337b1439024100ea0eb1b914158c70db39031dd8904d6f18f408c85fbbc592d7d20dee7986969efbda081fdf8bc40e1b1336d6b638110c836bfdc3f314560d2e49cd4fbde1e20b024100e32a4e793b574c9c4a94c8803db5152141e72d03de64e54ef2c8ed104988ca780cd11397bc359630d01b97ebd87067c5451ba777cf045ca23f5912f1031308c702406dfcdbbd5a57c9f85abc4edf9e9e29153507b07ce0a7ef6f52e60dcfebe1b8341babd8b789a837485da6c8d55b29bbb142ace3c24a1f5b54b454d01b51e2ad03024100bd6a2b60dee01e1b3bfcef6a2f09ed027c273cdbbaf6ba55a80f6dcc64e4509ee560f84b4f3e076bd03b11e42fe71a3fdd2dffe7e0902c8584f8cad877cdc945024100aa512fa4ada69881f1d8bb8ad6614f192b83200aef5edf4811313d5ef30a86cbd0a90f7b025c71ea06ec6b34db6306c86b1040670fd8654ad7291d066d06d031"
+
+var ecMismatchKeyTests = []struct {
+       hexKey        string
+       errorContains string
+}{
+       {hexKey: hexECTestPKCS8Key, errorContains: "use ParsePKCS8PrivateKey instead"},
+       {hexKey: hexECTestPKCS1Key, errorContains: "use ParsePKCS1PrivateKey instead"},
+}
+
+func TestECMismatchKeyFormat(t *testing.T) {
+       for i, test := range ecMismatchKeyTests {
+               derBytes, _ := hex.DecodeString(test.hexKey)
+               _, err := ParseECPrivateKey(derBytes)
+               if !strings.Contains(err.Error(), test.errorContains) {
+                       t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err)
+               }
+       }
+}
index 56b7948c4155297b2ac18774489892c77cc8234f..3b5b3576bddc72cf34f00424887eafee3e23d81c 100644 (file)
@@ -369,7 +369,7 @@ func domainToReverseLabels(domain string) (reverseLabels []string, ok bool) {
                        reverseLabels = append(reverseLabels, domain)
                        domain = ""
                } else {
-                       reverseLabels = append(reverseLabels, domain[i+1:len(domain)])
+                       reverseLabels = append(reverseLabels, domain[i+1:])
                        domain = domain[:i]
                }
        }
index 58098adc2d5a2c53b0ea5757cd86047481185e7f..1cd8fdeb331e4d33a187c10404814e4406243650 100644 (file)
@@ -14,6 +14,7 @@ import (
        "crypto"
        "crypto/dsa"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/elliptic"
        "crypto/rsa"
        _ "crypto/sha1"
@@ -24,8 +25,8 @@ import (
        "encoding/pem"
        "errors"
        "fmt"
-       "internal/x/crypto/cryptobyte"
-       cryptobyte_asn1 "internal/x/crypto/cryptobyte/asn1"
+       "golang.org/x/crypto/cryptobyte"
+       cryptobyte_asn1 "golang.org/x/crypto/cryptobyte/asn1"
        "io"
        "math/big"
        "net"
@@ -43,17 +44,18 @@ type pkixPublicKey struct {
        BitString asn1.BitString
 }
 
-// ParsePKIXPublicKey parses a DER encoded public key. These values are
-// typically found in PEM blocks with "BEGIN PUBLIC KEY".
+// ParsePKIXPublicKey parses a public key in PKIX, ASN.1 DER form.
 //
-// Supported key types include RSA, DSA, and ECDSA. Unknown key
-// types result in an error.
+// It returns a *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, or
+// ed25519.PublicKey. More types might be supported in the future.
 //
-// On success, pub will be of type *rsa.PublicKey, *dsa.PublicKey,
-// or *ecdsa.PublicKey.
+// This kind of key is commonly encoded in PEM blocks of type "PUBLIC KEY".
 func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error) {
        var pki publicKeyInfo
        if rest, err := asn1.Unmarshal(derBytes, &pki); err != nil {
+               if _, err := asn1.Unmarshal(derBytes, &pkcs1PublicKey{}); err == nil {
+                       return nil, errors.New("x509: failed to parse public key (use ParsePKCS1PublicKey instead for this key format)")
+               }
                return nil, err
        } else if len(rest) != 0 {
                return nil, errors.New("x509: trailing data after ASN.1 of public-key")
@@ -92,6 +94,9 @@ func marshalPublicKey(pub interface{}) (publicKeyBytes []byte, publicKeyAlgorith
                        return
                }
                publicKeyAlgorithm.Parameters.FullBytes = paramBytes
+       case ed25519.PublicKey:
+               publicKeyBytes = pub
+               publicKeyAlgorithm.Algorithm = oidPublicKeyEd25519
        default:
                return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: only RSA and ECDSA public keys supported")
        }
@@ -99,7 +104,12 @@ func marshalPublicKey(pub interface{}) (publicKeyBytes []byte, publicKeyAlgorith
        return publicKeyBytes, publicKeyAlgorithm, nil
 }
 
-// MarshalPKIXPublicKey serialises a public key to DER-encoded PKIX format.
+// MarshalPKIXPublicKey converts a public key to PKIX, ASN.1 DER form.
+//
+// The following key types are currently supported: *rsa.PublicKey, *ecdsa.PublicKey
+// and ed25519.PublicKey. Unsupported key types result in an error.
+//
+// This kind of key is commonly encoded in PEM blocks of type "PUBLIC KEY".
 func MarshalPKIXPublicKey(pub interface{}) ([]byte, error) {
        var publicKeyBytes []byte
        var publicKeyAlgorithm pkix.AlgorithmIdentifier
@@ -188,6 +198,7 @@ const (
        SHA256WithRSAPSS
        SHA384WithRSAPSS
        SHA512WithRSAPSS
+       PureEd25519
 )
 
 func (algo SignatureAlgorithm) isRSAPSS() bool {
@@ -215,12 +226,14 @@ const (
        RSA
        DSA
        ECDSA
+       Ed25519
 )
 
 var publicKeyAlgoName = [...]string{
-       RSA:   "RSA",
-       DSA:   "DSA",
-       ECDSA: "ECDSA",
+       RSA:     "RSA",
+       DSA:     "DSA",
+       ECDSA:   "ECDSA",
+       Ed25519: "Ed25519",
 }
 
 func (algo PublicKeyAlgorithm) String() string {
@@ -279,6 +292,11 @@ func (algo PublicKeyAlgorithm) String() string {
 //
 // ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
 //    us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 }
+//
+//
+// RFC 8410 3 Curve25519 and Curve448 Algorithm Identifiers
+//
+// id-Ed25519   OBJECT IDENTIFIER ::= { 1 3 101 112 }
 
 var (
        oidSignatureMD2WithRSA      = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 2}
@@ -294,6 +312,7 @@ var (
        oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2}
        oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3}
        oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4}
+       oidSignatureEd25519         = asn1.ObjectIdentifier{1, 3, 101, 112}
 
        oidSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 1}
        oidSHA384 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 2}
@@ -330,6 +349,7 @@ var signatureAlgorithmDetails = []struct {
        {ECDSAWithSHA256, "ECDSA-SHA256", oidSignatureECDSAWithSHA256, ECDSA, crypto.SHA256},
        {ECDSAWithSHA384, "ECDSA-SHA384", oidSignatureECDSAWithSHA384, ECDSA, crypto.SHA384},
        {ECDSAWithSHA512, "ECDSA-SHA512", oidSignatureECDSAWithSHA512, ECDSA, crypto.SHA512},
+       {PureEd25519, "Ed25519", oidSignatureEd25519, Ed25519, crypto.Hash(0) /* no pre-hashing */},
 }
 
 // pssParameters reflects the parameters in an AlgorithmIdentifier that
@@ -390,6 +410,14 @@ func rsaPSSParameters(hashFunc crypto.Hash) asn1.RawValue {
 }
 
 func getSignatureAlgorithmFromAI(ai pkix.AlgorithmIdentifier) SignatureAlgorithm {
+       if ai.Algorithm.Equal(oidSignatureEd25519) {
+               // RFC 8410, Section 3
+               // > For all of the OIDs, the parameters MUST be absent.
+               if len(ai.Parameters.FullBytes) != 0 {
+                       return UnknownSignatureAlgorithm
+               }
+       }
+
        if !ai.Algorithm.Equal(oidSignatureRSAPSS) {
                for _, details := range signatureAlgorithmDetails {
                        if ai.Algorithm.Equal(details.oid) {
@@ -452,9 +480,10 @@ func getSignatureAlgorithmFromAI(ai pkix.AlgorithmIdentifier) SignatureAlgorithm
 // id-ecPublicKey OBJECT IDENTIFIER ::= {
 //       iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 }
 var (
-       oidPublicKeyRSA   = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
-       oidPublicKeyDSA   = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 1}
-       oidPublicKeyECDSA = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1}
+       oidPublicKeyRSA     = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
+       oidPublicKeyDSA     = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 1}
+       oidPublicKeyECDSA   = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1}
+       oidPublicKeyEd25519 = oidSignatureEd25519
 )
 
 func getPublicKeyAlgorithmFromOID(oid asn1.ObjectIdentifier) PublicKeyAlgorithm {
@@ -465,6 +494,8 @@ func getPublicKeyAlgorithmFromOID(oid asn1.ObjectIdentifier) PublicKeyAlgorithm
                return DSA
        case oid.Equal(oidPublicKeyECDSA):
                return ECDSA
+       case oid.Equal(oidPublicKeyEd25519):
+               return Ed25519
        }
        return UnknownPublicKeyAlgorithm
 }
@@ -871,28 +902,29 @@ func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey
 
        switch hashType {
        case crypto.Hash(0):
-               return ErrUnsupportedAlgorithm
+               if pubKeyAlgo != Ed25519 {
+                       return ErrUnsupportedAlgorithm
+               }
        case crypto.MD5:
                return InsecureAlgorithmError(algo)
+       default:
+               if !hashType.Available() {
+                       return ErrUnsupportedAlgorithm
+               }
+               h := hashType.New()
+               h.Write(signed)
+               signed = h.Sum(nil)
        }
 
-       if !hashType.Available() {
-               return ErrUnsupportedAlgorithm
-       }
-       h := hashType.New()
-
-       h.Write(signed)
-       digest := h.Sum(nil)
-
        switch pub := publicKey.(type) {
        case *rsa.PublicKey:
                if pubKeyAlgo != RSA {
                        return signaturePublicKeyAlgoMismatchError(pubKeyAlgo, pub)
                }
                if algo.isRSAPSS() {
-                       return rsa.VerifyPSS(pub, hashType, digest, signature, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash})
+                       return rsa.VerifyPSS(pub, hashType, signed, signature, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash})
                } else {
-                       return rsa.VerifyPKCS1v15(pub, hashType, digest, signature)
+                       return rsa.VerifyPKCS1v15(pub, hashType, signed, signature)
                }
        case *dsa.PublicKey:
                if pubKeyAlgo != DSA {
@@ -907,7 +939,7 @@ func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey
                if dsaSig.R.Sign() <= 0 || dsaSig.S.Sign() <= 0 {
                        return errors.New("x509: DSA signature contained zero or negative values")
                }
-               if !dsa.Verify(pub, digest, dsaSig.R, dsaSig.S) {
+               if !dsa.Verify(pub, signed, dsaSig.R, dsaSig.S) {
                        return errors.New("x509: DSA verification failure")
                }
                return
@@ -924,10 +956,18 @@ func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey
                if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
                        return errors.New("x509: ECDSA signature contained zero or negative values")
                }
-               if !ecdsa.Verify(pub, digest, ecdsaSig.R, ecdsaSig.S) {
+               if !ecdsa.Verify(pub, signed, ecdsaSig.R, ecdsaSig.S) {
                        return errors.New("x509: ECDSA verification failure")
                }
                return
+       case ed25519.PublicKey:
+               if pubKeyAlgo != Ed25519 {
+                       return signaturePublicKeyAlgoMismatchError(pubKeyAlgo, pub)
+               }
+               if !ed25519.Verify(pub, signed, signature) {
+                       return errors.New("x509: Ed25519 verification failure")
+               }
+               return
        }
        return ErrUnsupportedAlgorithm
 }
@@ -1065,6 +1105,18 @@ func parsePublicKey(algo PublicKeyAlgorithm, keyData *publicKeyInfo) (interface{
                        Y:     y,
                }
                return pub, nil
+       case Ed25519:
+               // RFC 8410, Section 3
+               // > For all of the OIDs, the parameters MUST be absent.
+               if len(keyData.Algorithm.Parameters.FullBytes) != 0 {
+                       return nil, errors.New("x509: Ed25519 key encoded with illegal parameters")
+               }
+               if len(asn1Data) != ed25519.PublicKeySize {
+                       return nil, errors.New("x509: wrong Ed25519 public key size")
+               }
+               pub := make([]byte, ed25519.PublicKeySize)
+               copy(pub, asn1Data)
+               return ed25519.PublicKey(pub), nil
        default:
                return nil, nil
        }
@@ -1927,7 +1979,7 @@ func buildExtensions(template *Certificate, subjectIsEmpty bool, authorityKeyId
                        dp := distributionPoint{
                                DistributionPoint: distributionPointName{
                                        FullName: []asn1.RawValue{
-                                               asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)},
+                                               {Tag: 6, Class: 2, Bytes: []byte(name)},
                                        },
                                },
                        }
@@ -1986,8 +2038,12 @@ func signingParamsForPublicKey(pub interface{}, requestedSigAlgo SignatureAlgori
                        err = errors.New("x509: unknown elliptic curve")
                }
 
+       case ed25519.PublicKey:
+               pubType = Ed25519
+               sigAlgo.Algorithm = oidSignatureEd25519
+
        default:
-               err = errors.New("x509: only RSA and ECDSA keys supported")
+               err = errors.New("x509: only RSA, ECDSA and Ed25519 keys supported")
        }
 
        if err != nil {
@@ -2006,7 +2062,7 @@ func signingParamsForPublicKey(pub interface{}, requestedSigAlgo SignatureAlgori
                                return
                        }
                        sigAlgo.Algorithm, hashFunc = details.oid, details.hash
-                       if hashFunc == 0 {
+                       if hashFunc == 0 && pubType != Ed25519 {
                                err = errors.New("x509: cannot sign with hash function requested")
                                return
                        }
@@ -2070,8 +2126,9 @@ var emptyASN1Subject = []byte{0x30, 0}
 //
 // The returned slice is the certificate in DER encoding.
 //
-// All keys types that are implemented via crypto.Signer are supported (This
-// includes *rsa.PublicKey and *ecdsa.PublicKey.)
+// The currently supported key types are *rsa.PublicKey, *ecdsa.PublicKey and
+// ed25519.PublicKey. pub must be a supported key type, and priv must be a
+// crypto.Signer with a supported public key.
 //
 // The AuthorityKeyId will be taken from the SubjectKeyId of parent, if any,
 // unless the resulting certificate is self-signed. Otherwise the value from
@@ -2132,15 +2189,16 @@ func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv
        if err != nil {
                return
        }
-
        c.Raw = tbsCertContents
 
-       h := hashFunc.New()
-       h.Write(tbsCertContents)
-       digest := h.Sum(nil)
+       signed := tbsCertContents
+       if hashFunc != 0 {
+               h := hashFunc.New()
+               h.Write(signed)
+               signed = h.Sum(nil)
+       }
 
-       var signerOpts crypto.SignerOpts
-       signerOpts = hashFunc
+       var signerOpts crypto.SignerOpts = hashFunc
        if template.SignatureAlgorithm != 0 && template.SignatureAlgorithm.isRSAPSS() {
                signerOpts = &rsa.PSSOptions{
                        SaltLength: rsa.PSSSaltLengthEqualsHash,
@@ -2149,7 +2207,7 @@ func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv
        }
 
        var signature []byte
-       signature, err = key.Sign(rand, digest, signerOpts)
+       signature, err = key.Sign(rand, signed, signerOpts)
        if err != nil {
                return
        }
@@ -2275,7 +2333,7 @@ type CertificateRequest struct {
        // Attributes contains the CSR attributes that can parse as
        // pkix.AttributeTypeAndValueSET.
        //
-       // Deprecated: use Extensions and ExtraExtensions instead for parsing and
+       // Deprecated: Use Extensions and ExtraExtensions instead for parsing and
        // generating the requestedExtensions attribute.
        Attributes []pkix.AttributeTypeAndValueSET
 
@@ -2400,8 +2458,9 @@ func parseCSRExtensions(rawAttributes []asn1.RawValue) ([]pkix.Extension, error)
 //
 // priv is the private key to sign the CSR with, and the corresponding public
 // key will be included in the CSR. It must implement crypto.Signer and its
-// Public() method must return a *rsa.PublicKey or a *ecdsa.PublicKey. (A
-// *rsa.PrivateKey or *ecdsa.PrivateKey satisfies this.)
+// Public() method must return a *rsa.PublicKey or a *ecdsa.PublicKey or a
+// ed25519.PublicKey. (A *rsa.PrivateKey, *ecdsa.PrivateKey or
+// ed25519.PrivateKey satisfies this.)
 //
 // The returned slice is the certificate request in DER encoding.
 func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error) {
@@ -2550,12 +2609,15 @@ func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv
        }
        tbsCSR.Raw = tbsCSRContents
 
-       h := hashFunc.New()
-       h.Write(tbsCSRContents)
-       digest := h.Sum(nil)
+       signed := tbsCSRContents
+       if hashFunc != 0 {
+               h := hashFunc.New()
+               h.Write(signed)
+               signed = h.Sum(nil)
+       }
 
        var signature []byte
-       signature, err = key.Sign(rand, digest, hashFunc)
+       signature, err = key.Sign(rand, signed, hashFunc)
        if err != nil {
                return
        }
index 388156e209726c37839fadb633a74a315183c815..171509f7c4553d3bd635202d255409b241bf0619 100644 (file)
@@ -8,6 +8,7 @@ import (
        "bytes"
        "crypto/dsa"
        "crypto/ecdsa"
+       "crypto/ed25519"
        "crypto/elliptic"
        "crypto/rand"
        "crypto/rsa"
@@ -54,27 +55,50 @@ func TestParsePKCS1PrivateKey(t *testing.T) {
        }
 }
 
-func TestParsePKIXPublicKey(t *testing.T) {
-       block, _ := pem.Decode([]byte(pemPublicKey))
+func TestPKCS1MismatchPublicKeyFormat(t *testing.T) {
+
+       const pkixPublicKey = "30820122300d06092a864886f70d01010105000382010f003082010a0282010100dd5a0f37d3ca5232852ccc0e81eebec270e2f2c6c44c6231d852971a0aad00aa7399e9b9de444611083c59ea919a9d76c20a7be131a99045ec19a7bb452d647a72429e66b87e28be9e8187ed1d2a2a01ef3eb2360706bd873b07f2d1f1a72337aab5ec94e983e39107f52c480d404915e84d75a3db2cfd601726a128cb1d7f11492d4bdb53272e652276667220795c709b8a9b4af6489cbf48bb8173b8fb607c834a71b6e8bf2d6aab82af3c8ad7ce16d8dcf58373a6edc427f7484d09744d4c08f4e19ed07adbf6cb31243bc5d0d1145e77a08a6fc5efd208eca67d6abf2d6f38f58b6fdd7c28774fb0cc03fc4935c6e074842d2e1479d3d8787249258719f90203010001"
+       const errorContains = "use ParsePKIXPublicKey instead"
+       derBytes, _ := hex.DecodeString(pkixPublicKey)
+       _, err := ParsePKCS1PublicKey(derBytes)
+       if !strings.Contains(err.Error(), errorContains) {
+               t.Errorf("expected error containing %q, got %s", errorContains, err)
+       }
+}
+
+func testParsePKIXPublicKey(t *testing.T, pemBytes string) (pub interface{}) {
+       block, _ := pem.Decode([]byte(pemBytes))
        pub, err := ParsePKIXPublicKey(block.Bytes)
        if err != nil {
-               t.Errorf("Failed to parse RSA public key: %s", err)
-               return
-       }
-       rsaPub, ok := pub.(*rsa.PublicKey)
-       if !ok {
-               t.Errorf("Value returned from ParsePKIXPublicKey was not an RSA public key")
-               return
+               t.Fatalf("Failed to parse public key: %s", err)
        }
 
-       pubBytes2, err := MarshalPKIXPublicKey(rsaPub)
+       pubBytes2, err := MarshalPKIXPublicKey(pub)
        if err != nil {
-               t.Errorf("Failed to marshal RSA public key for the second time: %s", err)
+               t.Errorf("Failed to marshal public key for the second time: %s", err)
                return
        }
        if !bytes.Equal(pubBytes2, block.Bytes) {
                t.Errorf("Reserialization of public key didn't match. got %x, want %x", pubBytes2, block.Bytes)
        }
+       return
+}
+
+func TestParsePKIXPublicKey(t *testing.T) {
+       t.Run("RSA", func(t *testing.T) {
+               pub := testParsePKIXPublicKey(t, pemPublicKey)
+               _, ok := pub.(*rsa.PublicKey)
+               if !ok {
+                       t.Errorf("Value returned from ParsePKIXPublicKey was not an RSA public key")
+               }
+       })
+       t.Run("Ed25519", func(t *testing.T) {
+               pub := testParsePKIXPublicKey(t, pemEd25519Key)
+               _, ok := pub.(ed25519.PublicKey)
+               if !ok {
+                       t.Errorf("Value returned from ParsePKIXPublicKey was not an Ed25519 public key")
+               }
+       })
 }
 
 var pemPublicKey = `-----BEGIN PUBLIC KEY-----
@@ -88,8 +112,8 @@ FF53oIpvxe/SCOymfWq/LW849Ytv3Xwod0+wzAP8STXG4HSELS4UedPYeHJJJYcZ
 -----END PUBLIC KEY-----
 `
 
-var pemPrivateKey = `
------BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey = testingKey(`
+-----BEGIN RSA TESTING KEY-----
 MIICXAIBAAKBgQCxoeCUW5KJxNPxMp+KmCxKLc1Zv9Ny+4CFqcUXVUYH69L3mQ7v
 IWrJ9GBfcaA7BPQqUlWxWM+OCEQZH1EZNIuqRMNQVuIGCbz5UQ8w6tS0gcgdeGX7
 J7jgCQ4RK3F/PuCM38QBLaHx988qG8NMc6VKErBjctCXFHQt14lerd5KpQIDAQAB
@@ -103,9 +127,27 @@ MTXIvf7Wmv6E++eFcnT461FlGAUHRV+bQQXGsItR/opIG7mGogIkVXa3E1MCQARX
 AAA7eoZ9AEHflUeuLn9QJI/r0hyQQLEtrpwv6rDT1GCWaLII5HJ6NUFVf4TTcqxo
 6vdM4QGKTJoO+SaCyP0CQFdpcxSAuzpFcKv0IlJ8XzS/cy+mweCMwyJ1PFEc4FX6
 wg/HcAJWY60xZTJDFN+Qfx8ZQvBEin6c2/h+zZi5IVY=
------END RSA PRIVATE KEY-----
+-----END RSA TESTING KEY-----
+`)
+
+// pemEd25519Key is the example from RFC 8410, Secrion 4.
+var pemEd25519Key = `
+-----BEGIN PUBLIC KEY-----
+MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=
+-----END PUBLIC KEY-----
 `
 
+func TestPKIXMismatchPublicKeyFormat(t *testing.T) {
+
+       const pkcs1PublicKey = "308201080282010100817cfed98bcaa2e2a57087451c7674e0c675686dc33ff1268b0c2a6ee0202dec710858ee1c31bdf5e7783582e8ca800be45f3275c6576adc35d98e26e95bb88ca5beb186f853b8745d88bc9102c5f38753bcda519fb05948d5c77ac429255ff8aaf27d9f45d1586e95e2e9ba8a7cb771b8a09dd8c8fed3f933fd9b439bc9f30c475953418ef25f71a2b6496f53d94d39ce850aa0cc75d445b5f5b4f4ee4db78ab197a9a8d8a852f44529a007ac0ac23d895928d60ba538b16b0b087a7f903ed29770e215019b77eaecc360f35f7ab11b6d735978795b2c4a74e5bdea4dc6594cd67ed752a108e666729a753ab36d6c4f606f8760f507e1765be8cd744007e629020103"
+       const errorContains = "use ParsePKCS1PublicKey instead"
+       derBytes, _ := hex.DecodeString(pkcs1PublicKey)
+       _, err := ParsePKIXPublicKey(derBytes)
+       if !strings.Contains(err.Error(), errorContains) {
+               t.Errorf("expected error containing %q, got %s", errorContains, err)
+       }
+}
+
 var testPrivateKey *rsa.PrivateKey
 
 func init() {
@@ -496,6 +538,11 @@ func TestCreateSelfSignedCertificate(t *testing.T) {
                t.Fatalf("Failed to generate ECDSA key: %s", err)
        }
 
+       ed25519Pub, ed25519Priv, err := ed25519.GenerateKey(random)
+       if err != nil {
+               t.Fatalf("Failed to generate Ed25519 key: %s", err)
+       }
+
        tests := []struct {
                name      string
                pub, priv interface{}
@@ -509,6 +556,7 @@ func TestCreateSelfSignedCertificate(t *testing.T) {
                {"RSAPSS/RSAPSS", &testPrivateKey.PublicKey, testPrivateKey, true, SHA256WithRSAPSS},
                {"ECDSA/RSAPSS", &ecdsaPriv.PublicKey, testPrivateKey, false, SHA256WithRSAPSS},
                {"RSAPSS/ECDSA", &testPrivateKey.PublicKey, ecdsaPriv, false, ECDSAWithSHA384},
+               {"Ed25519", ed25519Pub, ed25519Priv, true, PureEd25519},
        }
 
        testExtKeyUsage := []ExtKeyUsage{ExtKeyUsageClientAuth, ExtKeyUsageServerAuth}
@@ -995,6 +1043,76 @@ func TestRSAPSSSelfSigned(t *testing.T) {
        }
 }
 
+const ed25519Certificate = `
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            0c:83:d8:21:2b:82:cb:23:98:23:63:e2:f7:97:8a:43:5b:f3:bd:92
+        Signature Algorithm: ED25519
+        Issuer: CN = Ed25519 test certificate
+        Validity
+            Not Before: May  6 17:27:16 2019 GMT
+            Not After : Jun  5 17:27:16 2019 GMT
+        Subject: CN = Ed25519 test certificate
+        Subject Public Key Info:
+            Public Key Algorithm: ED25519
+                ED25519 Public-Key:
+                pub:
+                    36:29:c5:6c:0d:4f:14:6c:81:d0:ff:75:d3:6a:70:
+                    5f:69:cd:0f:4d:66:d5:da:98:7e:82:49:89:a3:8a:
+                    3c:fa
+        X509v3 extensions:
+            X509v3 Subject Key Identifier:
+                09:3B:3A:9D:4A:29:D8:95:FF:68:BE:7B:43:54:72:E0:AD:A2:E3:AE
+            X509v3 Authority Key Identifier:
+                keyid:09:3B:3A:9D:4A:29:D8:95:FF:68:BE:7B:43:54:72:E0:AD:A2:E3:AE
+
+            X509v3 Basic Constraints: critical
+                CA:TRUE
+    Signature Algorithm: ED25519
+         53:a5:58:1c:2c:3b:2a:9e:ac:9d:4e:a5:1d:5f:5d:6d:a6:b5:
+         08:de:12:82:f3:97:20:ae:fa:d8:98:f4:1a:83:32:6b:91:f5:
+         24:1d:c4:20:7f:2c:e2:4d:da:13:3b:6d:54:1a:d2:a8:28:dc:
+         60:b9:d4:f4:78:4b:3c:1c:91:00
+-----BEGIN CERTIFICATE-----
+MIIBWzCCAQ2gAwIBAgIUDIPYISuCyyOYI2Pi95eKQ1vzvZIwBQYDK2VwMCMxITAf
+BgNVBAMMGEVkMjU1MTkgdGVzdCBjZXJ0aWZpY2F0ZTAeFw0xOTA1MDYxNzI3MTZa
+Fw0xOTA2MDUxNzI3MTZaMCMxITAfBgNVBAMMGEVkMjU1MTkgdGVzdCBjZXJ0aWZp
+Y2F0ZTAqMAUGAytlcAMhADYpxWwNTxRsgdD/ddNqcF9pzQ9NZtXamH6CSYmjijz6
+o1MwUTAdBgNVHQ4EFgQUCTs6nUop2JX/aL57Q1Ry4K2i464wHwYDVR0jBBgwFoAU
+CTs6nUop2JX/aL57Q1Ry4K2i464wDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBT
+pVgcLDsqnqydTqUdX11tprUI3hKC85cgrvrYmPQagzJrkfUkHcQgfyziTdoTO21U
+GtKoKNxgudT0eEs8HJEA
+-----END CERTIFICATE-----`
+
+func TestEd25519SelfSigned(t *testing.T) {
+       der, _ := pem.Decode([]byte(ed25519Certificate))
+       if der == nil {
+               t.Fatalf("Failed to find PEM block")
+       }
+
+       cert, err := ParseCertificate(der.Bytes)
+       if err != nil {
+               t.Fatalf("Failed to parse: %s", err)
+       }
+
+       if cert.PublicKeyAlgorithm != Ed25519 {
+               t.Fatalf("Parsed key algorithm was not Ed25519")
+       }
+       parsedKey, ok := cert.PublicKey.(ed25519.PublicKey)
+       if !ok {
+               t.Fatalf("Parsed key was not an Ed25519 key: %s", err)
+       }
+       if len(parsedKey) != ed25519.PublicKeySize {
+               t.Fatalf("Invalid Ed25519 key")
+       }
+
+       if err = cert.CheckSignatureFrom(cert); err != nil {
+               t.Fatalf("Signature check failed: %s", err)
+       }
+}
+
 const pemCertificate = `-----BEGIN CERTIFICATE-----
 MIIDATCCAemgAwIBAgIRAKQkkrFx1T/dgB/Go/xBM5swDQYJKoZIhvcNAQELBQAw
 EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNjA4MTcyMDM2MDdaFw0xNzA4MTcyMDM2
@@ -1125,10 +1243,13 @@ func TestParsePEMCRL(t *testing.T) {
 }
 
 func TestImports(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
        testenv.MustHaveGoRun(t)
 
-       if err := exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go").Run(); err != nil {
-               t.Errorf("failed to run x509_test_import.go: %s", err)
+       if out, err := exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go").CombinedOutput(); err != nil {
+               t.Errorf("failed to run x509_test_import.go: %s\n%s", err, out)
        }
 }
 
@@ -1154,6 +1275,11 @@ func TestCreateCertificateRequest(t *testing.T) {
                t.Fatalf("Failed to generate ECDSA key: %s", err)
        }
 
+       _, ed25519Priv, err := ed25519.GenerateKey(random)
+       if err != nil {
+               t.Fatalf("Failed to generate Ed25519 key: %s", err)
+       }
+
        tests := []struct {
                name    string
                priv    interface{}
@@ -1163,6 +1289,7 @@ func TestCreateCertificateRequest(t *testing.T) {
                {"ECDSA-256", ecdsa256Priv, ECDSAWithSHA1},
                {"ECDSA-384", ecdsa384Priv, ECDSAWithSHA1},
                {"ECDSA-521", ecdsa521Priv, ECDSAWithSHA1},
+               {"Ed25519", ed25519Priv, PureEd25519},
        }
 
        for _, test := range tests {
@@ -2017,3 +2144,24 @@ func TestMultipleURLsInCRLDP(t *testing.T) {
                t.Errorf("CRL distribution points = %#v, want #%v", got, want)
        }
 }
+
+const hexPKCS1TestPKCS8Key = "30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100cfb1b5bf9685ffa97b4f99df4ff122b70e59ac9b992f3bc2b3dde17d53c1a34928719b02e8fd17839499bfbd515bd6ef99c7a1c47a239718fe36bfd824c0d96060084b5f67f0273443007a24dfaf5634f7772c9346e10eb294c2306671a5a5e719ae24b4de467291bc571014b0e02dec04534d66a9bb171d644b66b091780e8d020301000102818100b595778383c4afdbab95d2bfed12b3f93bb0a73a7ad952f44d7185fd9ec6c34de8f03a48770f2009c8580bcd275e9632714e9a5e3f32f29dc55474b2329ff0ebc08b3ffcb35bc96e6516b483df80a4a59cceb71918cbabf91564e64a39d7e35dce21cb3031824fdbc845dba6458852ec16af5dddf51a8397a8797ae0337b1439024100ea0eb1b914158c70db39031dd8904d6f18f408c85fbbc592d7d20dee7986969efbda081fdf8bc40e1b1336d6b638110c836bfdc3f314560d2e49cd4fbde1e20b024100e32a4e793b574c9c4a94c8803db5152141e72d03de64e54ef2c8ed104988ca780cd11397bc359630d01b97ebd87067c5451ba777cf045ca23f5912f1031308c702406dfcdbbd5a57c9f85abc4edf9e9e29153507b07ce0a7ef6f52e60dcfebe1b8341babd8b789a837485da6c8d55b29bbb142ace3c24a1f5b54b454d01b51e2ad03024100bd6a2b60dee01e1b3bfcef6a2f09ed027c273cdbbaf6ba55a80f6dcc64e4509ee560f84b4f3e076bd03b11e42fe71a3fdd2dffe7e0902c8584f8cad877cdc945024100aa512fa4ada69881f1d8bb8ad6614f192b83200aef5edf4811313d5ef30a86cbd0a90f7b025c71ea06ec6b34db6306c86b1040670fd8654ad7291d066d06d031"
+const hexPKCS1TestECKey = "3081a40201010430bdb9839c08ee793d1157886a7a758a3c8b2a17a4df48f17ace57c72c56b4723cf21dcda21d4e1ad57ff034f19fcfd98ea00706052b81040022a16403620004feea808b5ee2429cfcce13c32160e1c960990bd050bb0fdf7222f3decd0a55008e32a6aa3c9062051c4cba92a7a3b178b24567412d43cdd2f882fa5addddd726fe3e208d2c26d733a773a597abb749714df7256ead5105fa6e7b3650de236b50"
+
+var pkcs1MismatchKeyTests = []struct {
+       hexKey        string
+       errorContains string
+}{
+       {hexKey: hexPKCS1TestPKCS8Key, errorContains: "use ParsePKCS8PrivateKey instead"},
+       {hexKey: hexPKCS1TestECKey, errorContains: "use ParseECPrivateKey instead"},
+}
+
+func TestPKCS1MismatchKeyFormat(t *testing.T) {
+       for i, test := range pkcs1MismatchKeyTests {
+               derBytes, _ := hex.DecodeString(test.hexKey)
+               _, err := ParsePKCS1PrivateKey(derBytes)
+               if !strings.Contains(err.Error(), test.errorContains) {
+                       t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err)
+               }
+       }
+}
index 3fda7da188c0da0050f09f491fb260c0d9e7d128..b778df261aa84b9373a089a4adb5e99014bb7f5c 100644 (file)
@@ -15,6 +15,7 @@ import (
        "crypto/x509/pkix"
        "encoding/pem"
        "math/big"
+       "strings"
        "time"
 )
 
@@ -41,7 +42,7 @@ func main() {
        }
 }
 
-var pemPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey = testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
 fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
 /ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
@@ -49,5 +50,7 @@ RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
 EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
 IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
 tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
index c450d987a465125db4e858dff1ae48ca05f9ab9c..4c056a1edadfde439ca8085cbe4f5095f09b9fcd 100644 (file)
@@ -98,10 +98,12 @@ func defaultCheckNamedValue(nv *driver.NamedValue) (err error) {
        return err
 }
 
-// driverArgs converts arguments from callers of Stmt.Exec and
+// driverArgsConnLocked converts arguments from callers of Stmt.Exec and
 // Stmt.Query into driver Values.
 //
 // The statement ds may be nil, if no statement is available.
+//
+// ci must be locked.
 func driverArgsConnLocked(ci driver.Conn, ds *driverStmt, args []interface{}) ([]driver.NamedValue, error) {
        nvargs := make([]driver.NamedValue, len(args))
 
@@ -286,6 +288,11 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error {
                        *d = s.AppendFormat((*d)[:0], time.RFC3339Nano)
                        return nil
                }
+       case decimalDecompose:
+               switch d := dest.(type) {
+               case decimalCompose:
+                       return d.Compose(s.Decompose(nil))
+               }
        case nil:
                switch d := dest.(type) {
                case *interface{}:
@@ -420,6 +427,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error {
                dv.Set(reflect.New(dv.Type().Elem()))
                return convertAssignRows(dv.Interface(), src, rows)
        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               if src == nil {
+                       return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind())
+               }
                s := asString(src)
                i64, err := strconv.ParseInt(s, 10, dv.Type().Bits())
                if err != nil {
@@ -429,6 +439,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error {
                dv.SetInt(i64)
                return nil
        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+               if src == nil {
+                       return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind())
+               }
                s := asString(src)
                u64, err := strconv.ParseUint(s, 10, dv.Type().Bits())
                if err != nil {
@@ -438,6 +451,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error {
                dv.SetUint(u64)
                return nil
        case reflect.Float32, reflect.Float64:
+               if src == nil {
+                       return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind())
+               }
                s := asString(src)
                f64, err := strconv.ParseFloat(s, dv.Type().Bits())
                if err != nil {
@@ -447,6 +463,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error {
                dv.SetFloat(f64)
                return nil
        case reflect.String:
+               if src == nil {
+                       return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind())
+               }
                switch v := src.(type) {
                case string:
                        dv.SetString(v)
@@ -539,3 +558,42 @@ func callValuerValue(vr driver.Valuer) (v driver.Value, err error) {
        }
        return vr.Value()
 }
+
+// decimal composes or decomposes a decimal value to and from individual parts.
+// There are four parts: a boolean negative flag, a form byte with three possible states
+// (finite=0, infinite=1, NaN=2), a base-2 big-endian integer
+// coefficient (also known as a significand) as a []byte, and an int32 exponent.
+// These are composed into a final value as "decimal = (neg) (form=finite) coefficient * 10 ^ exponent".
+// A zero length coefficient is a zero value.
+// The big-endian integer coefficent stores the most significant byte first (at coefficent[0]).
+// If the form is not finite the coefficient and exponent should be ignored.
+// The negative parameter may be set to true for any form, although implementations are not required
+// to respect the negative parameter in the non-finite form.
+//
+// Implementations may choose to set the negative parameter to true on a zero or NaN value,
+// but implementations that do not differentiate between negative and positive
+// zero or NaN values should ignore the negative parameter without error.
+// If an implementation does not support Infinity it may be converted into a NaN without error.
+// If a value is set that is larger than what is supported by an implementation,
+// an error must be returned.
+// Implementations must return an error if a NaN or Infinity is attempted to be set while neither
+// are supported.
+//
+// NOTE(kardianos): This is an experimental interface. See https://golang.org/issue/30870
+type decimal interface {
+       decimalDecompose
+       decimalCompose
+}
+
+type decimalDecompose interface {
+       // Decompose returns the internal decimal state in parts.
+       // If the provided buf has sufficient capacity, buf may be returned as the coefficient with
+       // the value set and length set as appropriate.
+       Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32)
+}
+
+type decimalCompose interface {
+       // Compose sets the internal decimal value from parts. If the value cannot be
+       // represented then an error should be returned.
+       Compose(form byte, negative bool, coefficient []byte, exponent int32) error
+}
index b0aff7b1685cdb9f16aedef1c2dd1a4935b502e4..8a82891c2532a43e32d1597b4695f3ff29382c8a 100644 (file)
@@ -439,7 +439,7 @@ func TestDriverArgs(t *testing.T) {
                0: {
                        args: []interface{}{Valuer_V("foo")},
                        want: []driver.NamedValue{
-                               driver.NamedValue{
+                               {
                                        Ordinal: 1,
                                        Value:   "FOO",
                                },
@@ -448,7 +448,7 @@ func TestDriverArgs(t *testing.T) {
                1: {
                        args: []interface{}{nilValuerVPtr},
                        want: []driver.NamedValue{
-                               driver.NamedValue{
+                               {
                                        Ordinal: 1,
                                        Value:   nil,
                                },
@@ -457,7 +457,7 @@ func TestDriverArgs(t *testing.T) {
                2: {
                        args: []interface{}{nilValuerPPtr},
                        want: []driver.NamedValue{
-                               driver.NamedValue{
+                               {
                                        Ordinal: 1,
                                        Value:   "nil-to-str",
                                },
@@ -466,7 +466,7 @@ func TestDriverArgs(t *testing.T) {
                3: {
                        args: []interface{}{"plain-str"},
                        want: []driver.NamedValue{
-                               driver.NamedValue{
+                               {
                                        Ordinal: 1,
                                        Value:   "plain-str",
                                },
@@ -475,7 +475,7 @@ func TestDriverArgs(t *testing.T) {
                4: {
                        args: []interface{}{nilStrPtr},
                        want: []driver.NamedValue{
-                               driver.NamedValue{
+                               {
                                        Ordinal: 1,
                                        Value:   nil,
                                },
@@ -494,3 +494,107 @@ func TestDriverArgs(t *testing.T) {
                }
        }
 }
+
+type dec struct {
+       form        byte
+       neg         bool
+       coefficient [16]byte
+       exponent    int32
+}
+
+func (d dec) Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32) {
+       coef := make([]byte, 16)
+       copy(coef, d.coefficient[:])
+       return d.form, d.neg, coef, d.exponent
+}
+
+func (d *dec) Compose(form byte, negative bool, coefficient []byte, exponent int32) error {
+       switch form {
+       default:
+               return fmt.Errorf("unknown form %d", form)
+       case 1, 2:
+               d.form = form
+               d.neg = negative
+               return nil
+       case 0:
+       }
+       d.form = form
+       d.neg = negative
+       d.exponent = exponent
+
+       // This isn't strictly correct, as the extra bytes could be all zero,
+       // ignore this for this test.
+       if len(coefficient) > 16 {
+               return fmt.Errorf("coefficent too large")
+       }
+       copy(d.coefficient[:], coefficient)
+
+       return nil
+}
+
+type decFinite struct {
+       neg         bool
+       coefficient [16]byte
+       exponent    int32
+}
+
+func (d decFinite) Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32) {
+       coef := make([]byte, 16)
+       copy(coef, d.coefficient[:])
+       return 0, d.neg, coef, d.exponent
+}
+
+func (d *decFinite) Compose(form byte, negative bool, coefficient []byte, exponent int32) error {
+       switch form {
+       default:
+               return fmt.Errorf("unknown form %d", form)
+       case 1, 2:
+               return fmt.Errorf("unsupported form %d", form)
+       case 0:
+       }
+       d.neg = negative
+       d.exponent = exponent
+
+       // This isn't strictly correct, as the extra bytes could be all zero,
+       // ignore this for this test.
+       if len(coefficient) > 16 {
+               return fmt.Errorf("coefficent too large")
+       }
+       copy(d.coefficient[:], coefficient)
+
+       return nil
+}
+
+func TestDecimal(t *testing.T) {
+       list := []struct {
+               name string
+               in   decimalDecompose
+               out  dec
+               err  bool
+       }{
+               {name: "same", in: dec{exponent: -6}, out: dec{exponent: -6}},
+
+               // Ensure reflection is not used to assign the value by using different types.
+               {name: "diff", in: decFinite{exponent: -6}, out: dec{exponent: -6}},
+
+               {name: "bad-form", in: dec{form: 200}, err: true},
+       }
+       for _, item := range list {
+               t.Run(item.name, func(t *testing.T) {
+                       out := dec{}
+                       err := convertAssign(&out, item.in)
+                       if item.err {
+                               if err == nil {
+                                       t.Fatalf("unexpected nil error")
+                               }
+                               return
+                       }
+                       if err != nil {
+                               t.Fatalf("unexpected error: %v", err)
+                       }
+                       if !reflect.DeepEqual(out, item.out) {
+                               t.Fatalf("got %#v want %#v", out, item.out)
+                       }
+               })
+       }
+}
index ecc6547bf371221cf9ebb0c4f1963602ea29f076..316e7cea3754173a510871219976de9fc6c4d052 100644 (file)
@@ -26,7 +26,7 @@ import (
 //   time.Time
 //
 // If the driver supports cursors, a returned Value may also implement the Rows interface
-// in this package. This is used when, for example, when a user selects a cursor
+// in this package. This is used, for example, when a user selects a cursor
 // such as "select cursor(select * from my_table) from dual". If the Rows
 // from the select is closed, the cursor Rows will also be closed.
 type Value interface{}
index 8b3cb6c8f6115a4378fafef45ef4f759626f1f73..24c3a45483637816365a6b5682394d8c600e334e 100644 (file)
@@ -38,6 +38,7 @@ type ValueConverter interface {
 // themselves to a driver Value.
 type Valuer interface {
        // Value returns a driver Value.
+       // Value must not panic.
        Value() (Value, error)
 }
 
@@ -179,6 +180,8 @@ func IsValue(v interface{}) bool {
        switch v.(type) {
        case []byte, bool, float64, int64, string, time.Time:
                return true
+       case decimalDecompose:
+               return true
        }
        return false
 }
@@ -235,7 +238,8 @@ func (defaultConverter) ConvertValue(v interface{}) (Value, error) {
                return v, nil
        }
 
-       if vr, ok := v.(Valuer); ok {
+       switch vr := v.(type) {
+       case Valuer:
                sv, err := callValuerValue(vr)
                if err != nil {
                        return nil, err
@@ -244,6 +248,10 @@ func (defaultConverter) ConvertValue(v interface{}) (Value, error) {
                        return nil, fmt.Errorf("non-Value type %T returned from Value", sv)
                }
                return sv, nil
+
+       // For now, continue to prefer the Valuer interface over the decimal decompose interface.
+       case decimalDecompose:
+               return vr, nil
        }
 
        rv := reflect.ValueOf(v)
@@ -280,3 +288,10 @@ func (defaultConverter) ConvertValue(v interface{}) (Value, error) {
        }
        return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
 }
+
+type decimalDecompose interface {
+       // Decompose returns the internal decimal state into parts.
+       // If the provided buf has sufficient capacity, buf may be returned as the coefficient with
+       // the value set and length set as appropriate.
+       Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32)
+}
index 0379bf8892f54d304ba1c2e83fb885682351b8de..4c2996da85f4eb7853d88884ebd1de2d55fa7c9c 100644 (file)
@@ -57,6 +57,7 @@ var valueConverterTests = []valueConverterTest{
        {DefaultParameterConverter, bs{1}, []byte{1}, ""},
        {DefaultParameterConverter, s("a"), "a", ""},
        {DefaultParameterConverter, is{1}, nil, "unsupported type driver.is, a slice of int"},
+       {DefaultParameterConverter, dec{exponent: -6}, dec{exponent: -6}, ""},
 }
 
 func TestValueConverters(t *testing.T) {
@@ -79,3 +80,16 @@ func TestValueConverters(t *testing.T) {
                }
        }
 }
+
+type dec struct {
+       form        byte
+       neg         bool
+       coefficient [16]byte
+       exponent    int32
+}
+
+func (d dec) Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32) {
+       coef := make([]byte, 16)
+       copy(coef, d.coefficient[:])
+       return d.form, d.neg, coef, d.exponent
+}
index dcdd264baa8422e51ed3a20e1585fc0e5f7c9864..c0371f3e784886f34b0151b9b05cad25a4409571 100644 (file)
@@ -1141,6 +1141,8 @@ func converterForType(typ string) driver.ValueConverter {
                return driver.Null{Converter: driver.Bool}
        case "int32":
                return driver.Int32
+       case "nullint32":
+               return driver.Null{Converter: driver.DefaultParameterConverter}
        case "string":
                return driver.NotNull{Converter: fakeDriverString{}}
        case "nullstring":
@@ -1158,7 +1160,9 @@ func converterForType(typ string) driver.ValueConverter {
                // TODO(coopernurse): add type-specific converter
                return driver.Null{Converter: driver.DefaultParameterConverter}
        case "datetime":
-               return driver.DefaultParameterConverter
+               return driver.NotNull{Converter: driver.DefaultParameterConverter}
+       case "nulldatetime":
+               return driver.Null{Converter: driver.DefaultParameterConverter}
        case "any":
                return anyTypeConverter{}
        }
@@ -1173,6 +1177,8 @@ func colTypeToReflectType(typ string) reflect.Type {
                return reflect.TypeOf(NullBool{})
        case "int32":
                return reflect.TypeOf(int32(0))
+       case "nullint32":
+               return reflect.TypeOf(NullInt32{})
        case "string":
                return reflect.TypeOf("")
        case "nullstring":
index 8cdc903c6808d173e9cddec8be34bddff6d0d771..5c5b7dc7e973e9486eb27706a0b2f5f35dc6e696 100644 (file)
@@ -8,7 +8,7 @@
 // The sql package must be used in conjunction with a database driver.
 // See https://golang.org/s/sqldrivers for a list of drivers.
 //
-// Drivers that do not support context cancelation will not return until
+// Drivers that do not support context cancellation will not return until
 // after the query is completed.
 //
 // For usage examples, see the wiki page at
@@ -234,6 +234,32 @@ func (n NullInt64) Value() (driver.Value, error) {
        return n.Int64, nil
 }
 
+// NullInt32 represents an int32 that may be null.
+// NullInt32 implements the Scanner interface so
+// it can be used as a scan destination, similar to NullString.
+type NullInt32 struct {
+       Int32 int32
+       Valid bool // Valid is true if Int32 is not NULL
+}
+
+// Scan implements the Scanner interface.
+func (n *NullInt32) Scan(value interface{}) error {
+       if value == nil {
+               n.Int32, n.Valid = 0, false
+               return nil
+       }
+       n.Valid = true
+       return convertAssign(&n.Int32, value)
+}
+
+// Value implements the driver Valuer interface.
+func (n NullInt32) Value() (driver.Value, error) {
+       if !n.Valid {
+               return nil, nil
+       }
+       return int64(n.Int32), nil
+}
+
 // NullFloat64 represents a float64 that may be null.
 // NullFloat64 implements the Scanner interface so
 // it can be used as a scan destination, similar to NullString.
@@ -286,6 +312,32 @@ func (n NullBool) Value() (driver.Value, error) {
        return n.Bool, nil
 }
 
+// NullTime represents a time.Time that may be null.
+// NullTime implements the Scanner interface so
+// it can be used as a scan destination, similar to NullString.
+type NullTime struct {
+       Time  time.Time
+       Valid bool // Valid is true if Time is not NULL
+}
+
+// Scan implements the Scanner interface.
+func (n *NullTime) Scan(value interface{}) error {
+       if value == nil {
+               n.Time, n.Valid = time.Time{}, false
+               return nil
+       }
+       n.Valid = true
+       return convertAssign(&n.Time, value)
+}
+
+// Value implements the driver Valuer interface.
+func (n NullTime) Value() (driver.Value, error) {
+       if !n.Valid {
+               return nil, nil
+       }
+       return n.Time, nil
+}
+
 // Scanner is an interface used by Scan.
 type Scanner interface {
        // Scan assigns a value from a database driver.
@@ -1740,6 +1792,8 @@ type Conn struct {
        done int32
 }
 
+// grabConn takes a context to implement stmtConnGrabber
+// but the context is not used.
 func (c *Conn) grabConn(context.Context) (*driverConn, releaseConn, error) {
        if atomic.LoadInt32(&c.done) != 0 {
                return nil, nil, ErrConnDone
@@ -1804,6 +1858,39 @@ func (c *Conn) PrepareContext(ctx context.Context, query string) (*Stmt, error)
        return c.db.prepareDC(ctx, dc, release, c, query)
 }
 
+// Raw executes f exposing the underlying driver connection for the
+// duration of f. The driverConn must not be used outside of f.
+//
+// Once f returns and err is nil, the Conn will continue to be usable
+// until Conn.Close is called.
+func (c *Conn) Raw(f func(driverConn interface{}) error) (err error) {
+       var dc *driverConn
+       var release releaseConn
+
+       // grabConn takes a context to implement stmtConnGrabber, but the context is not used.
+       dc, release, err = c.grabConn(nil)
+       if err != nil {
+               return
+       }
+       fPanic := true
+       dc.Mutex.Lock()
+       defer func() {
+               dc.Mutex.Unlock()
+
+               // If f panics fPanic will remain true.
+               // Ensure an error is passed to release so the connection
+               // may be discarded.
+               if fPanic {
+                       err = driver.ErrBadConn
+               }
+               release(err)
+       }()
+       err = f(dc.ci)
+       fPanic = false
+
+       return
+}
+
 // BeginTx starts a transaction.
 //
 // The provided context is used until the transaction is committed or rolled back.
index 64b9dfea5c21303c25b8d185159a9e3909be1126..f68cefe43aed5ac8243fc39b1dd8fd639933ff25 100644 (file)
@@ -131,6 +131,7 @@ func TestDriverPanic(t *testing.T) {
 }
 
 func exec(t testing.TB, db *DB, query string, args ...interface{}) {
+       t.Helper()
        _, err := db.Exec(query, args...)
        if err != nil {
                t.Fatalf("Exec of %q: %v", query, err)
@@ -1338,6 +1339,54 @@ func TestConnQuery(t *testing.T) {
        }
 }
 
+func TestConnRaw(t *testing.T) {
+       db := newTestDB(t, "people")
+       defer closeDB(t, db)
+
+       ctx, cancel := context.WithCancel(context.Background())
+       defer cancel()
+       conn, err := db.Conn(ctx)
+       if err != nil {
+               t.Fatal(err)
+       }
+       conn.dc.ci.(*fakeConn).skipDirtySession = true
+       defer conn.Close()
+
+       sawFunc := false
+       err = conn.Raw(func(dc interface{}) error {
+               sawFunc = true
+               if _, ok := dc.(*fakeConn); !ok {
+                       return fmt.Errorf("got %T want *fakeConn", dc)
+               }
+               return nil
+       })
+       if err != nil {
+               t.Fatal(err)
+       }
+       if !sawFunc {
+               t.Fatal("Raw func not called")
+       }
+
+       func() {
+               defer func() {
+                       x := recover()
+                       if x == nil {
+                               t.Fatal("expected panic")
+                       }
+                       conn.closemu.Lock()
+                       closed := conn.dc == nil
+                       conn.closemu.Unlock()
+                       if !closed {
+                               t.Fatal("expected connection to be closed after panic")
+                       }
+               }()
+               err = conn.Raw(func(dc interface{}) error {
+                       panic("Conn.Raw panic should return an error")
+               })
+               t.Fatal("expected panic from Raw func")
+       }()
+}
+
 func TestCursorFake(t *testing.T) {
        db := newTestDB(t, "people")
        defer closeDB(t, db)
@@ -1401,7 +1450,7 @@ func TestInvalidNilValues(t *testing.T) {
                {
                        name:          "int",
                        input:         &date2,
-                       expectedError: `sql: Scan error on column index 0, name "bdate": converting driver.Value type <nil> ("<nil>") to a int: invalid syntax`,
+                       expectedError: `sql: Scan error on column index 0, name "bdate": converting NULL to int is unsupported`,
                },
        }
 
@@ -1671,6 +1720,18 @@ func TestNullInt64Param(t *testing.T) {
        nullTestRun(t, spec)
 }
 
+func TestNullInt32Param(t *testing.T) {
+       spec := nullTestSpec{"nullint32", "int32", [6]nullTestRow{
+               {NullInt32{31, true}, 1, NullInt32{31, true}},
+               {NullInt32{-22, false}, 1, NullInt32{0, false}},
+               {22, 1, NullInt32{22, true}},
+               {NullInt32{33, true}, 1, NullInt32{33, true}},
+               {NullInt32{222, false}, 1, NullInt32{0, false}},
+               {0, NullInt32{31, false}, nil},
+       }}
+       nullTestRun(t, spec)
+}
+
 func TestNullFloat64Param(t *testing.T) {
        spec := nullTestSpec{"nullfloat64", "float64", [6]nullTestRow{
                {NullFloat64{31.2, true}, 1, NullFloat64{31.2, true}},
@@ -1695,6 +1756,21 @@ func TestNullBoolParam(t *testing.T) {
        nullTestRun(t, spec)
 }
 
+func TestNullTimeParam(t *testing.T) {
+       t0 := time.Time{}
+       t1 := time.Date(2000, 1, 1, 8, 9, 10, 11, time.UTC)
+       t2 := time.Date(2010, 1, 1, 8, 9, 10, 11, time.UTC)
+       spec := nullTestSpec{"nulldatetime", "datetime", [6]nullTestRow{
+               {NullTime{t1, true}, t2, NullTime{t1, true}},
+               {NullTime{t1, false}, t2, NullTime{t0, false}},
+               {t1, t2, NullTime{t1, true}},
+               {NullTime{t1, true}, t2, NullTime{t1, true}},
+               {NullTime{t1, false}, t2, NullTime{t0, false}},
+               {t2, NullTime{t1, false}, nil},
+       }}
+       nullTestRun(t, spec)
+}
+
 func nullTestRun(t *testing.T, spec nullTestSpec) {
        db := newTestDB(t, "")
        defer closeDB(t, db)
@@ -3530,7 +3606,7 @@ type nvcConn struct {
        skipNamedValueCheck bool
 }
 
-type decimal struct {
+type decimalInt struct {
        value int
 }
 
@@ -3554,7 +3630,7 @@ func (c *nvcConn) CheckNamedValue(nv *driver.NamedValue) error {
                        nv.Value = "OUT:*string"
                }
                return nil
-       case decimal, []int64:
+       case decimalInt, []int64:
                return nil
        case doNotInclude:
                return driver.ErrRemoveArgument
@@ -3583,13 +3659,13 @@ func TestNamedValueChecker(t *testing.T) {
        }
 
        o1 := ""
-       _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A,str1=?,out1=?O1,array1=?", Named("A", decimal{123}), "hello", Named("O1", Out{Dest: &o1}), []int64{42, 128, 707}, doNotInclude{})
+       _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A,str1=?,out1=?O1,array1=?", Named("A", decimalInt{123}), "hello", Named("O1", Out{Dest: &o1}), []int64{42, 128, 707}, doNotInclude{})
        if err != nil {
                t.Fatal("exec insert", err)
        }
        var (
                str1 string
-               dec1 decimal
+               dec1 decimalInt
                arr1 []int64
        )
        err = db.QueryRowContext(ctx, "SELECT|keys|dec1,str1,array1|").Scan(&dec1, &str1, &arr1)
@@ -3599,7 +3675,7 @@ func TestNamedValueChecker(t *testing.T) {
 
        list := []struct{ got, want interface{} }{
                {o1, "from-server"},
-               {dec1, decimal{123}},
+               {dec1, decimalInt{123}},
                {str1, "hello"},
                {arr1, []int64{42, 128, 707}},
        }
@@ -3632,7 +3708,7 @@ func TestNamedValueCheckerSkip(t *testing.T) {
                t.Fatal("exec create", err)
        }
 
-       _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A", Named("A", decimal{123}))
+       _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A", Named("A", decimalInt{123}))
        if err == nil {
                t.Fatalf("expected error with bad argument, got %v", err)
        }
diff --git a/libgo/go/debug/dwarf/testdata/cppunsuptypes.cc b/libgo/go/debug/dwarf/testdata/cppunsuptypes.cc
new file mode 100644 (file)
index 0000000..e9281c7
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// cppunsuptypes.elf built with g++ 7.3
+//    g++ -g -c -o cppunsuptypes.elf cppunsuptypes.cc
+
+int i = 3;
+double d = 3;
+
+// anonymous reference type
+int &culprit = i;
+
+// named reference type
+typedef double &dref;
+dref dr = d;
+
+// incorporated into another type
+typedef struct {
+  dref q;
+  int &r;
+} hasrefs;
+
+hasrefs hr = { d, i };
+
+// This code is intended to trigger a DWARF "pointer to member" type DIE
+struct CS { int dm; };
+
+int foo()
+{
+  int CS::* pdm = &CS::dm;
+  CS cs = {42};
+  return cs.*pdm;
+}
diff --git a/libgo/go/debug/dwarf/testdata/cppunsuptypes.elf b/libgo/go/debug/dwarf/testdata/cppunsuptypes.elf
new file mode 100644 (file)
index 0000000..e955512
Binary files /dev/null and b/libgo/go/debug/dwarf/testdata/cppunsuptypes.elf differ
index 4352092ed0d7bd893941a24c5aa31d2e96d7aec2..316db258f654412406a63153411bfd6253298fd3 100644 (file)
@@ -261,6 +261,20 @@ func (t *TypedefType) String() string { return t.Name }
 
 func (t *TypedefType) Size() int64 { return t.Type.Size() }
 
+// An UnsupportedType is a placeholder returned in situations where we
+// encounter a type that isn't supported.
+type UnsupportedType struct {
+       CommonType
+       Tag Tag
+}
+
+func (t *UnsupportedType) String() string {
+       if t.Name != "" {
+               return t.Name
+       }
+       return t.Name + "(unsupported type " + t.Tag.String() + ")"
+}
+
 // typeReader is used to read from either the info section or the
 // types section.
 type typeReader interface {
@@ -680,6 +694,16 @@ func (d *Data) readType(name string, r typeReader, off Offset, typeCache map[Off
                typ = t
                typeCache[off] = t
                t.Name, _ = e.Val(AttrName).(string)
+
+       default:
+               // This is some other type DIE that we're currently not
+               // equipped to handle. Return an abstract "unsupported type"
+               // object in such cases.
+               t := new(UnsupportedType)
+               typ = t
+               typeCache[off] = t
+               t.Tag = e.Tag
+               t.Name, _ = e.Val(AttrName).(string)
        }
 
        if err != nil {
index 6c06731ea18b86d06216917b421414761a3b754b..aa2fbeca0b3830e1b6b6eb027d6f8abd888e528f 100644 (file)
@@ -9,6 +9,8 @@ import (
        "debug/elf"
        "debug/macho"
        "debug/pe"
+       "fmt"
+       "strconv"
        "testing"
 )
 
@@ -168,3 +170,61 @@ func TestTypedefCycle(t *testing.T) {
                }
        }
 }
+
+var unsupportedTypeTests = []string{
+       // varname:typename:string:size
+       "culprit::(unsupported type ReferenceType):8",
+       "pdm::(unsupported type PtrToMemberType):-1",
+}
+
+func TestUnsupportedTypes(t *testing.T) {
+       // Issue 29601:
+       // When reading DWARF from C++ load modules, we can encounter
+       // oddball type DIEs. These will be returned as "UnsupportedType"
+       // objects; check to make sure this works properly.
+       d := elfData(t, "testdata/cppunsuptypes.elf")
+       r := d.Reader()
+       seen := make(map[string]bool)
+       for {
+               e, err := r.Next()
+               if err != nil {
+                       t.Fatal("r.Next:", err)
+               }
+               if e == nil {
+                       break
+               }
+               if e.Tag == TagVariable {
+                       vname, _ := e.Val(AttrName).(string)
+                       tAttr := e.Val(AttrType)
+                       typOff, ok := tAttr.(Offset)
+                       if !ok {
+                               t.Errorf("variable at offset %v has no type", e.Offset)
+                               continue
+                       }
+                       typ, err := d.Type(typOff)
+                       if err != nil {
+                               t.Errorf("err in type decode: %v\n", err)
+                               continue
+                       }
+                       unsup, isok := typ.(*UnsupportedType)
+                       if !isok {
+                               continue
+                       }
+                       tag := vname + ":" + unsup.Name + ":" + unsup.String() +
+                               ":" + strconv.FormatInt(unsup.Size(), 10)
+                       seen[tag] = true
+               }
+       }
+       dumpseen := false
+       for _, v := range unsupportedTypeTests {
+               if !seen[v] {
+                       t.Errorf("missing %s", v)
+                       dumpseen = true
+               }
+       }
+       if dumpseen {
+               for k, _ := range seen {
+                       fmt.Printf("seen: %s\n", k)
+               }
+       }
+}
index bd6146437c974e424f00072b325396ddbf3d0eec..1a5424f54e82a3557d84b7ed142fc82ce08d59ee 100644 (file)
@@ -276,7 +276,6 @@ func NewFile(r io.ReaderAt) (*File, error) {
        var phentsize, phnum int
        var shoff int64
        var shentsize, shnum, shstrndx int
-       shstrndx = -1
        switch f.Class {
        case ELFCLASS32:
                hdr := new(Header32)
@@ -318,7 +317,11 @@ func NewFile(r io.ReaderAt) (*File, error) {
                shstrndx = int(hdr.Shstrndx)
        }
 
-       if shnum > 0 && shoff > 0 && (shstrndx < 0 || shstrndx >= shnum) {
+       if shoff == 0 && shnum != 0 {
+               return nil, &FormatError{0, "invalid ELF shnum for shoff=0", shnum}
+       }
+
+       if shnum > 0 && shstrndx >= shnum {
                return nil, &FormatError{0, "invalid ELF shstrndx", shstrndx}
        }
 
index d7c1e9f800d8622c17b44cce3b54473718909f5b..b826a0ff050e25321570ae673ae47622e19819b9 100644 (file)
@@ -810,3 +810,14 @@ func TestNoSectionOverlaps(t *testing.T) {
                }
        }
 }
+
+func TestIssue10996(t *testing.T) {
+       data := []byte("\u007fELF\x02\x01\x010000000000000" +
+               "\x010000000000000000000" +
+               "\x00\x00\x00\x00\x00\x00\x00\x0000000000\x00\x00\x00\x00" +
+               "0000")
+       _, err := NewFile(bytes.NewReader(data))
+       if err == nil {
+               t.Fatalf("opening invalid ELF file unexpectedly suceeded")
+       }
+}
index ad99b4dc5a6168d278efef6a92a6b33ea5d333c9..7e54a943510947744270a744eb3ff60934c5a3ce 100644 (file)
@@ -93,7 +93,8 @@ func (t *LineTable) slice(pc uint64) *LineTable {
 }
 
 // PCToLine returns the line number for the given program counter.
-// Callers should use Table's PCToLine method instead.
+//
+// Deprecated: Use Table's PCToLine method instead.
 func (t *LineTable) PCToLine(pc uint64) int {
        if t.isGo12() {
                return t.go12PCToLine(pc)
@@ -104,7 +105,8 @@ func (t *LineTable) PCToLine(pc uint64) int {
 
 // LineToPC returns the program counter for the given line number,
 // considering only program counters before maxpc.
-// Callers should use Table's LineToPC method instead.
+//
+// Deprecated: Use Table's LineToPC method instead.
 func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 {
        if t.isGo12() {
                return 0
index d21f0e24a8324030d4297d3b7a6697807bb20468..6baa53defd15a8048ebb93bbf94d210190d201fb 100644 (file)
@@ -55,7 +55,7 @@ func endtest() {
 // These tests open and examine the test binary, and use elf.Open to do so.
 func skipIfNotELF(t *testing.T) {
        switch runtime.GOOS {
-       case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+       case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
                // OK.
        default:
                t.Skipf("skipping on non-ELF system %s", runtime.GOOS)
@@ -196,6 +196,9 @@ func TestLineAline(t *testing.T) {
 }
 
 func TestPCLine(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
        dotest(t)
        defer endtest()
 
index a84b7f6def1d9cdb14551c989bbca01e619cfe31..3be612e1df7ab0967847033fc7a96b4547f1e29c 100644 (file)
@@ -35,13 +35,21 @@ func (s *Sym) Static() bool { return s.Type >= 'a' }
 // PackageName returns the package part of the symbol name,
 // or the empty string if there is none.
 func (s *Sym) PackageName() string {
-       pathend := strings.LastIndex(s.Name, "/")
+       name := s.Name
+
+       // A prefix of "type." and "go." is a compiler-generated symbol that doesn't belong to any package.
+       // See variable reservedimports in cmd/compile/internal/gc/subr.go
+       if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") {
+               return ""
+       }
+
+       pathend := strings.LastIndex(name, "/")
        if pathend < 0 {
                pathend = 0
        }
 
-       if i := strings.Index(s.Name[pathend:], "."); i != -1 {
-               return s.Name[:pathend+i]
+       if i := strings.Index(name[pathend:], "."); i != -1 {
+               return name[:pathend+i]
        }
        return ""
 }
index 08e86336b8eb67eef7e448b41e5ceee89c982772..b6ed8f554c517d8773b6fd439365556e10844de1 100644 (file)
@@ -41,3 +41,18 @@ func TestRemotePackage(t *testing.T) {
        assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*FlagSet)")
        assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "")
 }
+
+func TestIssue29551(t *testing.T) {
+       symNames := []string{
+               "type..eq.[9]debug/elf.intName",
+               "type..hash.debug/elf.ProgHeader",
+               "type..eq.runtime._panic",
+               "type..hash.struct { runtime.gList; runtime.n int32 }",
+               "go.(*struct { sync.Mutex; math/big.table [64]math/big",
+       }
+
+       for _, symName := range symNames {
+               s := Sym{Name: symName}
+               assertString(t, fmt.Sprintf("package of %q", s.Name), s.PackageName(), "")
+       }
+}
index 003c14e69b1dcfaa06626dab5d2496d86fa0f42b..28b76f93d7ad5b4becbef57e1a7b1eb4a5d5c95a 100644 (file)
@@ -154,7 +154,7 @@ var fileTests = []fileTest{
                nil,
                nil,
                map[string][]Reloc{
-                       "__text": []Reloc{
+                       "__text": {
                                {
                                        Addr:      0x1d,
                                        Type:      uint8(GENERIC_RELOC_VANILLA),
@@ -189,7 +189,7 @@ var fileTests = []fileTest{
                nil,
                nil,
                map[string][]Reloc{
-                       "__text": []Reloc{
+                       "__text": {
                                {
                                        Addr:   0x19,
                                        Type:   uint8(X86_64_RELOC_BRANCH),
@@ -207,7 +207,7 @@ var fileTests = []fileTest{
                                        Value:  2,
                                },
                        },
-                       "__compact_unwind": []Reloc{
+                       "__compact_unwind": {
                                {
                                        Addr:   0x0,
                                        Type:   uint8(X86_64_RELOC_UNSIGNED),
index 7bc1950bfdb12acc37701e875aaae8972eab7cbf..49e107eed3de960df0adf7e12db0c3199b0202d7 100644 (file)
@@ -3,7 +3,12 @@
 // license that can be found in the LICENSE file.
 
 // Mach-O header data structures
-// http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
+// Originally at:
+// http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html (since deleted by Apply)
+// Archived copy at:
+// https://web.archive.org/web/20090819232456/http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/index.html
+// For cloned PDF see:
+// https://github.com/aidansteele/osx-abi-macho-file-format-reference
 
 package macho
 
index 1c308b3dc3b0c9ffe67e48a1dde36c96905aefe5..58814162bcf886afe14212c893c0e66972b1a117 100644 (file)
@@ -324,6 +324,10 @@ type ImportDirectory struct {
 // satisfied by other libraries at dynamic load time.
 // It does not return weak symbols.
 func (f *File) ImportedSymbols() ([]string, error) {
+       if f.OptionalHeader == nil {
+               return nil, nil
+       }
+
        pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
 
        // grab the number of data directory entries
@@ -373,7 +377,7 @@ func (f *File) ImportedSymbols() ([]string, error) {
 
        // start decoding the import directory
        var ida []ImportDirectory
-       for len(d) > 0 {
+       for len(d) >= 20 {
                var dt ImportDirectory
                dt.OriginalFirstThunk = binary.LittleEndian.Uint32(d[0:4])
                dt.TimeDateStamp = binary.LittleEndian.Uint32(d[4:8])
index 9613af3a3c3c00aeedc54023c4a4d63df6aab9f3..6c7fe13caf00958af73b68565c3ca699341293fb 100644 (file)
@@ -5,6 +5,7 @@
 package pe
 
 import (
+       "bytes"
        "debug/dwarf"
        "internal/testenv"
        "io/ioutil"
@@ -627,3 +628,52 @@ func TestImportTableInUnknownSection(t *testing.T) {
                t.Fatalf("unable to locate any imported symbols within file %q.", path)
        }
 }
+
+func TestInvalidFormat(t *testing.T) {
+       crashers := [][]byte{
+               // https://golang.org/issue/30250
+               []byte("\x00\x00\x00\x0000000\x00\x00\x00\x00\x00\x00\x000000" +
+                       "00000000000000000000" +
+                       "000000000\x00\x00\x0000000000" +
+                       "00000000000000000000" +
+                       "0000000000000000"),
+               // https://golang.org/issue/30253
+               []byte("L\x01\b\x00regi\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x0f\x03" +
+                       "\v\x01\x02\x18\x00\x0e\x00\x00\x00\x1e\x00\x00\x00\x02\x00\x00\x80\x12\x00\x00" +
+                       "\x00\x10\x00\x00\x00 \x00\x00\x00\x00@\x00\x00\x10\x00\x00\x00\x02\x00\x00" +
+                       "\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00" +
+                       "\x00\x04\x00\x00\x06S\x00\x00\x03\x00\x00\x00\x00\x00 \x00\x00\x10\x00\x00" +
+                       "\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00`\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x80\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8`\x00\x00|\x00\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x00\x00\x00\x00.text\x00\x00\x00d\f\x00\x00\x00\x10\x00\x00" +
+                       "\x00\x0e\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "`\x00P`.data\x00\x00\x00\x10\x00\x00\x00\x00 \x00\x00" +
+                       "\x00\x02\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "@\x000\xc0.rdata\x00\x004\x01\x00\x00\x000\x00\x00" +
+                       "\x00\x02\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "@\x000@.eh_fram\xa0\x03\x00\x00\x00@\x00\x00" +
+                       "\x00\x04\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "@\x000@.bss\x00\x00\x00\x00`\x00\x00\x00\x00P\x00\x00" +
+                       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+                       "\x80\x000\xc0.idata\x00\x00x\x03\x00\x00\x00`\x00\x00" +
+                       "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00" +
+                       "0\xc0.CRT\x00\x00\x00\x00\x18\x00\x00\x00\x00p\x00\x00\x00\x02" +
+                       "\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00" +
+                       "0\xc0.tls\x00\x00\x00\x00 \x00\x00\x00\x00\x80\x00\x00\x00\x02" +
+                       "\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\xc9" +
+                       "H\x895\x1d"),
+       }
+
+       for _, data := range crashers {
+               f, err := NewFile(bytes.NewReader(data))
+               if err != nil {
+                       t.Error(err)
+               }
+               f.ImportedSymbols()
+       }
+}
index 3fb6caceab485684225135c6db48151a01451dd1..e14d2d49871d8621ed6b244f148a8a5f0f256d36 100644 (file)
@@ -284,7 +284,12 @@ func (e CorruptInputError) Error() string {
 // additional data is an error. This method assumes that src has been
 // stripped of all supported whitespace ('\r' and '\n').
 func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
+       // Lift the nil check outside of the loop.
+       _ = enc.decodeMap
+
+       dsti := 0
        olen := len(src)
+
        for len(src) > 0 && !end {
                // Decode quantum using the base32 alphabet
                var dbuf [8]byte
@@ -292,17 +297,15 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
 
                for j := 0; j < 8; {
 
-                       // We have reached the end and are missing padding
-                       if len(src) == 0 && enc.padChar != NoPadding {
-                               return n, false, CorruptInputError(olen - len(src) - j)
-                       }
-
-                       // We have reached the end and are not expecing any padding
-                       if len(src) == 0 && enc.padChar == NoPadding {
+                       if len(src) == 0 {
+                               if enc.padChar != NoPadding {
+                                       // We have reached the end and are missing padding
+                                       return n, false, CorruptInputError(olen - len(src) - j)
+                               }
+                               // We have reached the end and are not expecing any padding
                                dlen, end = j, true
                                break
                        }
-
                        in := src[0]
                        src = src[1:]
                        if in == byte(enc.padChar) && j >= 2 && len(src) < 8 {
@@ -339,37 +342,26 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
                // quantum
                switch dlen {
                case 8:
-                       dst[4] = dbuf[6]<<5 | dbuf[7]
+                       dst[dsti+4] = dbuf[6]<<5 | dbuf[7]
+                       n++
                        fallthrough
                case 7:
-                       dst[3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3
+                       dst[dsti+3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3
+                       n++
                        fallthrough
                case 5:
-                       dst[2] = dbuf[3]<<4 | dbuf[4]>>1
+                       dst[dsti+2] = dbuf[3]<<4 | dbuf[4]>>1
+                       n++
                        fallthrough
                case 4:
-                       dst[1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4
+                       dst[dsti+1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4
+                       n++
                        fallthrough
                case 2:
-                       dst[0] = dbuf[0]<<3 | dbuf[1]>>2
-               }
-
-               if !end {
-                       dst = dst[5:]
-               }
-
-               switch dlen {
-               case 2:
-                       n += 1
-               case 4:
-                       n += 2
-               case 5:
-                       n += 3
-               case 7:
-                       n += 4
-               case 8:
-                       n += 5
+                       dst[dsti+0] = dbuf[0]<<3 | dbuf[1]>>2
+                       n++
                }
+               dsti += 5
        }
        return n, end, nil
 }
index b74054ba4022764fb5ebc64f414b74917709ee3b..eb14f1eb26a8a5566bb2c02b8a72f6c05624269f 100644 (file)
@@ -119,7 +119,7 @@ func TestDecoder(t *testing.T) {
                testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded))
                testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
                if err != io.EOF {
-                       count, err = decoder.Read(dbuf)
+                       _, err = decoder.Read(dbuf)
                }
                testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
        }
@@ -539,52 +539,52 @@ func TestBufferedDecodingSameError(t *testing.T) {
                // NBSWY3DPO5XXE3DE == helloworld
                // Test with "ZZ" as extra input
                {"helloworld", [][]string{
-                       []string{"NBSW", "Y3DP", "O5XX", "E3DE", "ZZ"},
-                       []string{"NBSWY3DPO5XXE3DE", "ZZ"},
-                       []string{"NBSWY3DPO5XXE3DEZZ"},
-                       []string{"NBS", "WY3", "DPO", "5XX", "E3D", "EZZ"},
-                       []string{"NBSWY3DPO5XXE3", "DEZZ"},
+                       {"NBSW", "Y3DP", "O5XX", "E3DE", "ZZ"},
+                       {"NBSWY3DPO5XXE3DE", "ZZ"},
+                       {"NBSWY3DPO5XXE3DEZZ"},
+                       {"NBS", "WY3", "DPO", "5XX", "E3D", "EZZ"},
+                       {"NBSWY3DPO5XXE3", "DEZZ"},
                }, io.ErrUnexpectedEOF},
 
                // Test with "ZZY" as extra input
                {"helloworld", [][]string{
-                       []string{"NBSW", "Y3DP", "O5XX", "E3DE", "ZZY"},
-                       []string{"NBSWY3DPO5XXE3DE", "ZZY"},
-                       []string{"NBSWY3DPO5XXE3DEZZY"},
-                       []string{"NBS", "WY3", "DPO", "5XX", "E3D", "EZZY"},
-                       []string{"NBSWY3DPO5XXE3", "DEZZY"},
+                       {"NBSW", "Y3DP", "O5XX", "E3DE", "ZZY"},
+                       {"NBSWY3DPO5XXE3DE", "ZZY"},
+                       {"NBSWY3DPO5XXE3DEZZY"},
+                       {"NBS", "WY3", "DPO", "5XX", "E3D", "EZZY"},
+                       {"NBSWY3DPO5XXE3", "DEZZY"},
                }, io.ErrUnexpectedEOF},
 
                // Normal case, this is valid input
                {"helloworld", [][]string{
-                       []string{"NBSW", "Y3DP", "O5XX", "E3DE"},
-                       []string{"NBSWY3DPO5XXE3DE"},
-                       []string{"NBS", "WY3", "DPO", "5XX", "E3D", "E"},
-                       []string{"NBSWY3DPO5XXE3", "DE"},
+                       {"NBSW", "Y3DP", "O5XX", "E3DE"},
+                       {"NBSWY3DPO5XXE3DE"},
+                       {"NBS", "WY3", "DPO", "5XX", "E3D", "E"},
+                       {"NBSWY3DPO5XXE3", "DE"},
                }, nil},
 
                // MZXW6YTB = fooba
                {"fooba", [][]string{
-                       []string{"MZXW6YTBZZ"},
-                       []string{"MZXW6YTBZ", "Z"},
-                       []string{"MZXW6YTB", "ZZ"},
-                       []string{"MZXW6YT", "BZZ"},
-                       []string{"MZXW6Y", "TBZZ"},
-                       []string{"MZXW6Y", "TB", "ZZ"},
-                       []string{"MZXW6", "YTBZZ"},
-                       []string{"MZXW6", "YTB", "ZZ"},
-                       []string{"MZXW6", "YT", "BZZ"},
+                       {"MZXW6YTBZZ"},
+                       {"MZXW6YTBZ", "Z"},
+                       {"MZXW6YTB", "ZZ"},
+                       {"MZXW6YT", "BZZ"},
+                       {"MZXW6Y", "TBZZ"},
+                       {"MZXW6Y", "TB", "ZZ"},
+                       {"MZXW6", "YTBZZ"},
+                       {"MZXW6", "YTB", "ZZ"},
+                       {"MZXW6", "YT", "BZZ"},
                }, io.ErrUnexpectedEOF},
 
                // Normal case, this is valid input
                {"fooba", [][]string{
-                       []string{"MZXW6YTB"},
-                       []string{"MZXW6YT", "B"},
-                       []string{"MZXW6Y", "TB"},
-                       []string{"MZXW6", "YTB"},
-                       []string{"MZXW6", "YT", "B"},
-                       []string{"MZXW", "6YTB"},
-                       []string{"MZXW", "6Y", "TB"},
+                       {"MZXW6YTB"},
+                       {"MZXW6YT", "B"},
+                       {"MZXW6Y", "TB"},
+                       {"MZXW6", "YTB"},
+                       {"MZXW6", "YT", "B"},
+                       {"MZXW", "6YTB"},
+                       {"MZXW", "6Y", "TB"},
                }, nil},
        }
 
index 0bb37b311a0992f9d6055b54b6cc3ba727326c0f..082210198f3800dcfff892075b6acd795302731a 100644 (file)
@@ -123,6 +123,10 @@ func (enc *Encoding) Encode(dst, src []byte) {
        if len(src) == 0 {
                return
        }
+       // enc is a pointer receiver, so the use of enc.encode within the hot
+       // loop below means a nil check at every operation. Lift that nil check
+       // outside of the loop to speed up the encoder.
+       _ = enc.encode
 
        di, si := 0, 0
        n := (len(src) / 3) * 3
@@ -278,7 +282,10 @@ func (e CorruptInputError) Error() string {
 func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err error) {
        // Decode quantum using the base64 alphabet
        var dbuf [4]byte
-       dinc, dlen := 3, 4
+       dlen := 4
+
+       // Lift the nil check outside of the loop.
+       _ = enc.decodeMap
 
        for j := 0; j < len(dbuf); j++ {
                if len(src) == si {
@@ -288,7 +295,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err
                        case j == 1, enc.padChar != NoPadding:
                                return si, 0, CorruptInputError(si - j)
                        }
-                       dinc, dlen = j-1, j
+                       dlen = j
                        break
                }
                in := src[si]
@@ -340,7 +347,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err
                        // trailing garbage
                        err = CorruptInputError(si)
                }
-               dinc, dlen = 3, j
+               dlen = j
                break
        }
 
@@ -365,7 +372,6 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err
                        return si, 0, CorruptInputError(si - 2)
                }
        }
-       dst = dst[dinc:]
 
        return si, dlen - 1, err
 }
@@ -464,9 +470,23 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
                return 0, nil
        }
 
+       // Lift the nil check outside of the loop. enc.decodeMap is directly
+       // used later in this function, to let the compiler know that the
+       // receiver can't be nil.
+       _ = enc.decodeMap
+
        si := 0
        for strconv.IntSize >= 64 && len(src)-si >= 8 && len(dst)-n >= 8 {
-               if dn, ok := enc.decode64(src[si:]); ok {
+               if dn, ok := assemble64(
+                       enc.decodeMap[src[si+0]],
+                       enc.decodeMap[src[si+1]],
+                       enc.decodeMap[src[si+2]],
+                       enc.decodeMap[src[si+3]],
+                       enc.decodeMap[src[si+4]],
+                       enc.decodeMap[src[si+5]],
+                       enc.decodeMap[src[si+6]],
+                       enc.decodeMap[src[si+7]],
+               ); ok {
                        binary.BigEndian.PutUint64(dst[n:], dn)
                        n += 6
                        si += 8
@@ -481,7 +501,12 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
        }
 
        for len(src)-si >= 4 && len(dst)-n >= 4 {
-               if dn, ok := enc.decode32(src[si:]); ok {
+               if dn, ok := assemble32(
+                       enc.decodeMap[src[si+0]],
+                       enc.decodeMap[src[si+1]],
+                       enc.decodeMap[src[si+2]],
+                       enc.decodeMap[src[si+3]],
+               ); ok {
                        binary.BigEndian.PutUint32(dst[n:], dn)
                        n += 3
                        si += 4
@@ -506,70 +531,40 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
        return n, err
 }
 
-// decode32 tries to decode 4 base64 characters into 3 bytes, and returns those
-// bytes. len(src) must be >= 4.
-// Returns (0, false) if decoding failed.
-func (enc *Encoding) decode32(src []byte) (dn uint32, ok bool) {
-       var n uint32
-       _ = src[3]
-       if n = uint32(enc.decodeMap[src[0]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 26
-       if n = uint32(enc.decodeMap[src[1]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 20
-       if n = uint32(enc.decodeMap[src[2]]); n == 0xff {
+// assemble32 assembles 4 base64 digits into 3 bytes.
+// Each digit comes from the decode map, and will be 0xff
+// if it came from an invalid character.
+func assemble32(n1, n2, n3, n4 byte) (dn uint32, ok bool) {
+       // Check that all the digits are valid. If any of them was 0xff, their
+       // bitwise OR will be 0xff.
+       if n1|n2|n3|n4 == 0xff {
                return 0, false
        }
-       dn |= n << 14
-       if n = uint32(enc.decodeMap[src[3]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 8
-       return dn, true
+       return uint32(n1)<<26 |
+                       uint32(n2)<<20 |
+                       uint32(n3)<<14 |
+                       uint32(n4)<<8,
+               true
 }
 
-// decode64 tries to decode 8 base64 characters into 6 bytes, and returns those
-// bytes. len(src) must be >= 8.
-// Returns (0, false) if decoding failed.
-func (enc *Encoding) decode64(src []byte) (dn uint64, ok bool) {
-       var n uint64
-       _ = src[7]
-       if n = uint64(enc.decodeMap[src[0]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 58
-       if n = uint64(enc.decodeMap[src[1]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 52
-       if n = uint64(enc.decodeMap[src[2]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 46
-       if n = uint64(enc.decodeMap[src[3]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 40
-       if n = uint64(enc.decodeMap[src[4]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 34
-       if n = uint64(enc.decodeMap[src[5]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 28
-       if n = uint64(enc.decodeMap[src[6]]); n == 0xff {
-               return 0, false
-       }
-       dn |= n << 22
-       if n = uint64(enc.decodeMap[src[7]]); n == 0xff {
+// assemble64 assembles 8 base64 digits into 6 bytes.
+// Each digit comes from the decode map, and will be 0xff
+// if it came from an invalid character.
+func assemble64(n1, n2, n3, n4, n5, n6, n7, n8 byte) (dn uint64, ok bool) {
+       // Check that all the digits are valid. If any of them was 0xff, their
+       // bitwise OR will be 0xff.
+       if n1|n2|n3|n4|n5|n6|n7|n8 == 0xff {
                return 0, false
        }
-       dn |= n << 16
-       return dn, true
+       return uint64(n1)<<58 |
+                       uint64(n2)<<52 |
+                       uint64(n3)<<46 |
+                       uint64(n4)<<40 |
+                       uint64(n5)<<34 |
+                       uint64(n6)<<28 |
+                       uint64(n7)<<22 |
+                       uint64(n8)<<16,
+               true
 }
 
 type newlineFilteringReader struct {
index f7f312ca39324cafd44931bfbd2c5f7f15f56357..bc67036f5bcfbb81e1b8ddaf2f300599f29962c1 100644 (file)
@@ -11,6 +11,7 @@ import (
        "io"
        "io/ioutil"
        "reflect"
+       "runtime/debug"
        "strings"
        "testing"
        "time"
@@ -175,7 +176,7 @@ func TestDecoder(t *testing.T) {
                testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded))
                testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
                if err != io.EOF {
-                       count, err = decoder.Read(dbuf)
+                       _, err = decoder.Read(dbuf)
                }
                testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
        }
@@ -247,6 +248,20 @@ func TestDecodeCorrupt(t *testing.T) {
        }
 }
 
+func TestDecodeBounds(t *testing.T) {
+       var buf [32]byte
+       s := StdEncoding.EncodeToString(buf[:])
+       defer func() {
+               if err := recover(); err != nil {
+                       t.Fatalf("Decode panicked unexpectedly: %v\n%s", err, debug.Stack())
+               }
+       }()
+       n, err := StdEncoding.Decode(buf[:], []byte(s))
+       if n != len(buf) || err != nil {
+               t.Fatalf("StdEncoding.Decode = %d, %v, want %d, nil", n, err, len(buf))
+       }
+}
+
 func TestEncodedLen(t *testing.T) {
        for _, tt := range []struct {
                enc  *Encoding
diff --git a/libgo/go/encoding/csv/fuzz.go b/libgo/go/encoding/csv/fuzz.go
new file mode 100644 (file)
index 0000000..dc33893
--- /dev/null
@@ -0,0 +1,70 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gofuzz
+
+package csv
+
+import (
+       "bytes"
+       "fmt"
+       "reflect"
+)
+
+func Fuzz(data []byte) int {
+       score := 0
+       buf := new(bytes.Buffer)
+
+       for _, tt := range []Reader{
+               Reader{},
+               Reader{Comma: ';'},
+               Reader{Comma: '\t'},
+               Reader{LazyQuotes: true},
+               Reader{TrimLeadingSpace: true},
+               Reader{Comment: '#'},
+               Reader{Comment: ';'},
+       } {
+               r := NewReader(bytes.NewReader(data))
+               r.Comma = tt.Comma
+               r.Comment = tt.Comment
+               r.LazyQuotes = tt.LazyQuotes
+               r.TrimLeadingSpace = tt.TrimLeadingSpace
+
+               records, err := r.ReadAll()
+               if err != nil {
+                       continue
+               }
+               score = 1
+
+               buf.Reset()
+               w := NewWriter(buf)
+               w.Comma = tt.Comma
+               err = w.WriteAll(records)
+               if err != nil {
+                       fmt.Printf("writer  = %#v\n", w)
+                       fmt.Printf("records = %v\n", records)
+                       panic(err)
+               }
+
+               r = NewReader(buf)
+               r.Comma = tt.Comma
+               r.Comment = tt.Comment
+               r.LazyQuotes = tt.LazyQuotes
+               r.TrimLeadingSpace = tt.TrimLeadingSpace
+               result, err := r.ReadAll()
+               if err != nil {
+                       fmt.Printf("reader  = %#v\n", r)
+                       fmt.Printf("records = %v\n", records)
+                       panic(err)
+               }
+
+               if !reflect.DeepEqual(records, result) {
+                       fmt.Println("records = \n", records)
+                       fmt.Println("result  = \n", records)
+                       panic("not equal")
+               }
+       }
+
+       return score
+}
index a2fd4c0970d17a83fa87843f4aa04ae721b60437..c40aa506b0cbaa505e80ae0cd8b37d5947924ccd 100644 (file)
@@ -80,6 +80,8 @@ func (e *ParseError) Error() string {
        return fmt.Sprintf("parse error on line %d, column %d: %v", e.Line, e.Column, e.Err)
 }
 
+func (e *ParseError) Unwrap() error { return e.Err }
+
 // These are the errors that can be returned in ParseError.Err.
 var (
        ErrTrailingComma = errors.New("extra delimiter at end of line") // Deprecated: No longer used.
index 31c4f9c22dcfe6ffd9abd41e7d72bf7e3a8040d8..b18996a930d307eb3c7f6bbdce0faadfa7a532df 100644 (file)
@@ -12,7 +12,7 @@ import (
        "unicode/utf8"
 )
 
-// A Writer writes records to a CSV encoded file.
+// A Writer writes records using CSV encoding.
 //
 // As returned by NewWriter, a Writer writes records terminated by a
 // newline and uses ',' as the field delimiter. The exported fields can be
@@ -21,6 +21,12 @@ import (
 // Comma is the field delimiter.
 //
 // If UseCRLF is true, the Writer ends each output line with \r\n instead of \n.
+//
+// The writes of individual records are buffered.
+// After all data has been written, the client should call the
+// Flush method to guarantee all data has been forwarded to
+// the underlying io.Writer.  Any errors that occurred should
+// be checked by calling the Error method.
 type Writer struct {
        Comma   rune // Field delimiter (set to ',' by NewWriter)
        UseCRLF bool // True to use \r\n as the line terminator
@@ -37,6 +43,8 @@ func NewWriter(w io.Writer) *Writer {
 
 // Writer writes a single CSV record to w along with any necessary quoting.
 // A record is a slice of strings with each string being one field.
+// Writes are buffered, so Flush must eventually be called to ensure
+// that the record is written to the underlying io.Writer.
 func (w *Writer) Write(record []string) error {
        if !validDelim(w.Comma) {
                return errInvalidDelim
@@ -122,7 +130,8 @@ func (w *Writer) Error() error {
        return err
 }
 
-// WriteAll writes multiple CSV records to w using Write and then calls Flush.
+// WriteAll writes multiple CSV records to w using Write and then calls Flush,
+// returning any error from the Flush.
 func (w *Writer) WriteAll(records [][]string) error {
        for _, record := range records {
                err := w.Write(record)
index 520afde34d5034b697bf2be155ba5126a1832b42..494abc9b9131c9eb8a45af199d34c876710c5cbd 100644 (file)
@@ -1421,8 +1421,7 @@ func encFuzzDec(rng *rand.Rand, in interface{}) error {
 // This does some "fuzz testing" by attempting to decode a sequence of random bytes.
 func TestFuzz(t *testing.T) {
        if !*doFuzzTests {
-               t.Logf("disabled; run with -gob.fuzz to enable")
-               return
+               t.Skipf("disabled; run with -gob.fuzz to enable")
        }
 
        // all possible inputs
@@ -1441,8 +1440,7 @@ func TestFuzz(t *testing.T) {
 
 func TestFuzzRegressions(t *testing.T) {
        if !*doFuzzTests {
-               t.Logf("disabled; run with -gob.fuzz to enable")
-               return
+               t.Skipf("disabled; run with -gob.fuzz to enable")
        }
 
        // An instance triggering a type name of length ~102 GB.
@@ -1465,6 +1463,10 @@ func testFuzz(t *testing.T, seed int64, n int, input ...interface{}) {
 // TestFuzzOneByte tries to decode corrupted input sequences
 // and checks that no panic occurs.
 func TestFuzzOneByte(t *testing.T) {
+       if !*doFuzzTests {
+               t.Skipf("disabled; run with -gob.fuzz to enable")
+       }
+
        buf := new(bytes.Buffer)
        Register(OnTheFly{})
        dt := newDT()
index bad4fe5d92605e552be9af6de6bba6c58ce62273..1c31e66625fd50be566089ee6cd6df61b9b5c1de 100644 (file)
@@ -185,10 +185,12 @@ func main() {
                log.Fatal("source format error:", err)
        }
        fd, err := os.Create(*output)
-       _, err = fd.Write(source)
        if err != nil {
                log.Fatal(err)
        }
+       if _, err := fd.Write(source); err != nil {
+               log.Fatal(err)
+       }
 }
 
 func printMaps(b *bytes.Buffer, upperClass string) {
index fa534313cc9b1a5ce528679ada1db048b316ca2b..c765707139857a64b58fabb2a802c70d2edac0fe 100644 (file)
@@ -193,10 +193,14 @@ pair (-type id, encoded-type) where encoded-type is the gob encoding of a wireTy
 description, constructed from these types:
 
        type wireType struct {
-               ArrayT  *ArrayType
-               SliceT  *SliceType
-               StructT *StructType
-               MapT    *MapType
+               ArrayT           *ArrayType
+               SliceT           *SliceType
+               StructT          *StructType
+               MapT             *MapType
+               GobEncoderT      *gobEncoderType
+               BinaryMarshalerT *gobEncoderType
+               TextMarshalerT   *gobEncoderType
+
        }
        type arrayType struct {
                CommonType
@@ -224,6 +228,9 @@ description, constructed from these types:
                Key  typeId
                Elem typeId
        }
+       type gobEncoderType struct {
+               CommonType
+       }
 
 If there are nested type ids, the types for all inner type ids must be defined
 before the top-level type id is used to describe an encoded-v.
index 0c051d2e844e66c58f594f148011fe66c53fa13d..409b8c9d9525a00d2e031e434db2e449a26e7de2 100644 (file)
@@ -164,10 +164,12 @@ func main() {
                log.Fatal("source format error:", err)
        }
        fd, err := os.Create(*output)
-       _, err = fd.Write(source)
        if err != nil {
                log.Fatal(err)
        }
+       if _, err := fd.Write(source); err != nil {
+               log.Fatal(err)
+       }
 }
 
 func printMaps(b *bytes.Buffer, upperClass string) {
index 5371e7245f4ebb6e4744b72870b09e52241c9f40..8f8f170c1643c14e84b91a2271599bf15c718c9a 100644 (file)
@@ -47,7 +47,7 @@ var encBufferPool = sync.Pool{
        },
 }
 
-func (e *encBuffer) WriteByte(c byte) {
+func (e *encBuffer) writeByte(c byte) {
        e.data = append(e.data, c)
 }
 
@@ -106,7 +106,7 @@ func (enc *Encoder) freeEncoderState(e *encoderState) {
 // encodeUint writes an encoded unsigned integer to state.b.
 func (state *encoderState) encodeUint(x uint64) {
        if x <= 0x7F {
-               state.b.WriteByte(uint8(x))
+               state.b.writeByte(uint8(x))
                return
        }
 
index 2bb2b57df9cd990c7568c0faee6be017f3545574..fbba78ffd215a79cdfabea983d5e29b4bf9f7a54 100644 (file)
@@ -23,11 +23,12 @@ func EncodedLen(n int) int { return n * 2 }
 // of bytes written to dst, but this value is always EncodedLen(len(src)).
 // Encode implements hexadecimal encoding.
 func Encode(dst, src []byte) int {
-       for i, v := range src {
-               dst[i*2] = hextable[v>>4]
-               dst[i*2+1] = hextable[v&0x0f]
+       j := 0
+       for _, v := range src {
+               dst[j] = hextable[v>>4]
+               dst[j+1] = hextable[v&0x0f]
+               j += 2
        }
-
        return len(src) * 2
 }
 
@@ -55,23 +56,24 @@ func DecodedLen(x int) int { return x / 2 }
 // If the input is malformed, Decode returns the number
 // of bytes decoded before the error.
 func Decode(dst, src []byte) (int, error) {
-       var i int
-       for i = 0; i < len(src)/2; i++ {
-               a, ok := fromHexChar(src[i*2])
+       i, j := 0, 1
+       for ; j < len(src); j += 2 {
+               a, ok := fromHexChar(src[j-1])
                if !ok {
-                       return i, InvalidByteError(src[i*2])
+                       return i, InvalidByteError(src[j-1])
                }
-               b, ok := fromHexChar(src[i*2+1])
+               b, ok := fromHexChar(src[j])
                if !ok {
-                       return i, InvalidByteError(src[i*2+1])
+                       return i, InvalidByteError(src[j])
                }
                dst[i] = (a << 4) | b
+               i++
        }
        if len(src)%2 == 1 {
                // Check for invalid char before reporting bad length,
                // since the invalid char (if present) is an earlier problem.
-               if _, ok := fromHexChar(src[i*2]); !ok {
-                       return i, InvalidByteError(src[i*2])
+               if _, ok := fromHexChar(src[j-1]); !ok {
+                       return i, InvalidByteError(src[j-1])
                }
                return i, ErrLength
        }
index e9f4b3a53adefda92097e1429a478426ee04acd4..dbb00b94caca9d6b8d3b9e2914a9d3bdc39d4091 100644 (file)
@@ -242,6 +242,7 @@ func BenchmarkEncode(b *testing.B) {
                sink = make([]byte, 2*size)
 
                b.Run(fmt.Sprintf("%v", size), func(b *testing.B) {
+                       b.SetBytes(int64(size))
                        for i := 0; i < b.N; i++ {
                                Encode(sink, src)
                        }
@@ -249,12 +250,27 @@ func BenchmarkEncode(b *testing.B) {
        }
 }
 
+func BenchmarkDecode(b *testing.B) {
+       for _, size := range []int{256, 1024, 4096, 16384} {
+               src := bytes.Repeat([]byte{'2', 'b', '7', '4', '4', 'f', 'a', 'a'}, size/8)
+               sink = make([]byte, size/2)
+
+               b.Run(fmt.Sprintf("%v", size), func(b *testing.B) {
+                       b.SetBytes(int64(size))
+                       for i := 0; i < b.N; i++ {
+                               Decode(sink, src)
+                       }
+               })
+       }
+}
+
 func BenchmarkDump(b *testing.B) {
        for _, size := range []int{256, 1024, 4096, 16384} {
                src := bytes.Repeat([]byte{2, 3, 5, 7, 9, 11, 13, 17}, size/8)
                sink = make([]byte, 2*size)
 
                b.Run(fmt.Sprintf("%v", size), func(b *testing.B) {
+                       b.SetBytes(int64(size))
                        for i := 0; i < b.N; i++ {
                                Dump(src)
                        }
index 72cb349062c4a85c49bcc586c85c2f88813f04b7..f2592e3dbdf55f04b41006ea9c3272bd3b52d2a6 100644 (file)
@@ -82,6 +82,7 @@ func codeInit() {
 }
 
 func BenchmarkCodeEncoder(b *testing.B) {
+       b.ReportAllocs()
        if codeJSON == nil {
                b.StopTimer()
                codeInit()
@@ -99,6 +100,7 @@ func BenchmarkCodeEncoder(b *testing.B) {
 }
 
 func BenchmarkCodeMarshal(b *testing.B) {
+       b.ReportAllocs()
        if codeJSON == nil {
                b.StopTimer()
                codeInit()
@@ -133,6 +135,7 @@ func benchMarshalBytes(n int) func(*testing.B) {
 }
 
 func BenchmarkMarshalBytes(b *testing.B) {
+       b.ReportAllocs()
        // 32 fits within encodeState.scratch.
        b.Run("32", benchMarshalBytes(32))
        // 256 doesn't fit in encodeState.scratch, but is small enough to
@@ -143,6 +146,7 @@ func BenchmarkMarshalBytes(b *testing.B) {
 }
 
 func BenchmarkCodeDecoder(b *testing.B) {
+       b.ReportAllocs()
        if codeJSON == nil {
                b.StopTimer()
                codeInit()
@@ -167,6 +171,7 @@ func BenchmarkCodeDecoder(b *testing.B) {
 }
 
 func BenchmarkUnicodeDecoder(b *testing.B) {
+       b.ReportAllocs()
        j := []byte(`"\uD83D\uDE01"`)
        b.SetBytes(int64(len(j)))
        r := bytes.NewReader(j)
@@ -182,6 +187,7 @@ func BenchmarkUnicodeDecoder(b *testing.B) {
 }
 
 func BenchmarkDecoderStream(b *testing.B) {
+       b.ReportAllocs()
        b.StopTimer()
        var buf bytes.Buffer
        dec := NewDecoder(&buf)
@@ -204,6 +210,7 @@ func BenchmarkDecoderStream(b *testing.B) {
 }
 
 func BenchmarkCodeUnmarshal(b *testing.B) {
+       b.ReportAllocs()
        if codeJSON == nil {
                b.StopTimer()
                codeInit()
@@ -221,6 +228,7 @@ func BenchmarkCodeUnmarshal(b *testing.B) {
 }
 
 func BenchmarkCodeUnmarshalReuse(b *testing.B) {
+       b.ReportAllocs()
        if codeJSON == nil {
                b.StopTimer()
                codeInit()
@@ -234,10 +242,11 @@ func BenchmarkCodeUnmarshalReuse(b *testing.B) {
                        }
                }
        })
-       // TODO(bcmills): Is there a missing b.SetBytes here?
+       b.SetBytes(int64(len(codeJSON)))
 }
 
 func BenchmarkUnmarshalString(b *testing.B) {
+       b.ReportAllocs()
        data := []byte(`"hello, world"`)
        b.RunParallel(func(pb *testing.PB) {
                var s string
@@ -250,6 +259,7 @@ func BenchmarkUnmarshalString(b *testing.B) {
 }
 
 func BenchmarkUnmarshalFloat64(b *testing.B) {
+       b.ReportAllocs()
        data := []byte(`3.14`)
        b.RunParallel(func(pb *testing.PB) {
                var f float64
@@ -262,6 +272,7 @@ func BenchmarkUnmarshalFloat64(b *testing.B) {
 }
 
 func BenchmarkUnmarshalInt64(b *testing.B) {
+       b.ReportAllocs()
        data := []byte(`3`)
        b.RunParallel(func(pb *testing.PB) {
                var x int64
@@ -300,6 +311,7 @@ func BenchmarkUnmapped(b *testing.B) {
 }
 
 func BenchmarkTypeFieldsCache(b *testing.B) {
+       b.ReportAllocs()
        var maxTypes int = 1e6
        if testenv.Builder() != "" {
                maxTypes = 1e3 // restrict cache sizes on builders
index 731553dca6b4833db215355888c14ffb771ad278..bdd94e34ce649f5fb5669ae3925fc4293b6a7565 100644 (file)
@@ -8,12 +8,12 @@
 package json
 
 import (
-       "bytes"
        "encoding"
        "encoding/base64"
        "fmt"
        "reflect"
        "strconv"
+       "strings"
        "unicode"
        "unicode/utf16"
        "unicode/utf8"
@@ -125,7 +125,7 @@ type UnmarshalTypeError struct {
        Type   reflect.Type // type of Go value it could not be assigned to
        Offset int64        // error occurred after reading Offset bytes
        Struct string       // name of the struct type containing the field
-       Field  string       // name of the field holding the Go value
+       Field  string       // the full path from root node to the field
 }
 
 func (e *UnmarshalTypeError) Error() string {
@@ -266,12 +266,15 @@ type decodeState struct {
        opcode       int // last read result
        scan         scanner
        errorContext struct { // provides context for type errors
-               Struct reflect.Type
-               Field  string
+               Struct     reflect.Type
+               FieldStack []string
        }
        savedError            error
        useNumber             bool
        disallowUnknownFields bool
+       // safeUnquote is the number of current string literal bytes that don't
+       // need to be unquoted. When negative, no bytes need unquoting.
+       safeUnquote int
 }
 
 // readIndex returns the position of the last byte read.
@@ -289,7 +292,9 @@ func (d *decodeState) init(data []byte) *decodeState {
        d.off = 0
        d.savedError = nil
        d.errorContext.Struct = nil
-       d.errorContext.Field = ""
+
+       // Reuse the allocated space for the FieldStack slice.
+       d.errorContext.FieldStack = d.errorContext.FieldStack[:0]
        return d
 }
 
@@ -303,11 +308,11 @@ func (d *decodeState) saveError(err error) {
 
 // addErrorContext returns a new error enhanced with information from d.errorContext
 func (d *decodeState) addErrorContext(err error) error {
-       if d.errorContext.Struct != nil || d.errorContext.Field != "" {
+       if d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0 {
                switch err := err.(type) {
                case *UnmarshalTypeError:
                        err.Struct = d.errorContext.Struct.Name()
-                       err.Field = d.errorContext.Field
+                       err.Field = strings.Join(d.errorContext.FieldStack, ".")
                        return err
                }
        }
@@ -358,6 +363,66 @@ func (d *decodeState) scanWhile(op int) {
        d.opcode = d.scan.eof()
 }
 
+// rescanLiteral is similar to scanWhile(scanContinue), but it specialises the
+// common case where we're decoding a literal. The decoder scans the input
+// twice, once for syntax errors and to check the length of the value, and the
+// second to perform the decoding.
+//
+// Only in the second step do we use decodeState to tokenize literals, so we
+// know there aren't any syntax errors. We can take advantage of that knowledge,
+// and scan a literal's bytes much more quickly.
+func (d *decodeState) rescanLiteral() {
+       data, i := d.data, d.off
+Switch:
+       switch data[i-1] {
+       case '"': // string
+               // safeUnquote is initialized at -1, which means that all bytes
+               // checked so far can be unquoted at a later time with no work
+               // at all. When reaching the closing '"', if safeUnquote is
+               // still -1, all bytes can be unquoted with no work. Otherwise,
+               // only those bytes up until the first '\\' or non-ascii rune
+               // can be safely unquoted.
+               safeUnquote := -1
+               for ; i < len(data); i++ {
+                       if c := data[i]; c == '\\' {
+                               if safeUnquote < 0 { // first unsafe byte
+                                       safeUnquote = int(i - d.off)
+                               }
+                               i++ // escaped char
+                       } else if c == '"' {
+                               d.safeUnquote = safeUnquote
+                               i++ // tokenize the closing quote too
+                               break Switch
+                       } else if c >= utf8.RuneSelf {
+                               if safeUnquote < 0 { // first unsafe byte
+                                       safeUnquote = int(i - d.off)
+                               }
+                       }
+               }
+       case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number
+               for ; i < len(data); i++ {
+                       switch data[i] {
+                       case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                               '.', 'e', 'E', '+', '-':
+                       default:
+                               break Switch
+                       }
+               }
+       case 't': // true
+               i += len("rue")
+       case 'f': // false
+               i += len("alse")
+       case 'n': // null
+               i += len("ull")
+       }
+       if i < len(data) {
+               d.opcode = stateEndValue(&d.scan, data[i])
+       } else {
+               d.opcode = scanEnd
+       }
+       d.off = i + 1
+}
+
 // value consumes a JSON value from d.data[d.off-1:], decoding into v, and
 // reads the following byte ahead. If v is invalid, the value is discarded.
 // The first byte of the value has been read already.
@@ -389,7 +454,7 @@ func (d *decodeState) value(v reflect.Value) error {
        case scanBeginLiteral:
                // All bytes inside literal return scanContinue op code.
                start := d.readIndex()
-               d.scanWhile(scanContinue)
+               d.rescanLiteral()
 
                if v.IsValid() {
                        if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil {
@@ -470,6 +535,14 @@ func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnm
                if v.Elem().Kind() != reflect.Ptr && decodingNull && v.CanSet() {
                        break
                }
+
+               // Prevent infinite loop if v is an interface pointing to its own address:
+               //     var v interface{}
+               //     v = &v
+               if v.Elem().Kind() == reflect.Interface && v.Elem().Elem() == v {
+                       v = v.Elem()
+                       break
+               }
                if v.IsNil() {
                        v.Set(reflect.New(v.Type().Elem()))
                }
@@ -625,7 +698,7 @@ func (d *decodeState) object(v reflect.Value) error {
                return nil
        }
 
-       var fields []field
+       var fields structFields
 
        // Check type of target:
        //   struct or
@@ -659,7 +732,7 @@ func (d *decodeState) object(v reflect.Value) error {
        }
 
        var mapElem reflect.Value
-       originalErrorContext := d.errorContext
+       origErrorContext := d.errorContext
 
        for {
                // Read opening " of string key or closing }.
@@ -674,9 +747,9 @@ func (d *decodeState) object(v reflect.Value) error {
 
                // Read key.
                start := d.readIndex()
-               d.scanWhile(scanContinue)
+               d.rescanLiteral()
                item := d.data[start:d.readIndex()]
-               key, ok := unquoteBytes(item)
+               key, ok := d.unquoteBytes(item)
                if !ok {
                        panic(phasePanicMsg)
                }
@@ -695,14 +768,18 @@ func (d *decodeState) object(v reflect.Value) error {
                        subv = mapElem
                } else {
                        var f *field
-                       for i := range fields {
-                               ff := &fields[i]
-                               if bytes.Equal(ff.nameBytes, key) {
-                                       f = ff
-                                       break
-                               }
-                               if f == nil && ff.equalFold(ff.nameBytes, key) {
-                                       f = ff
+                       if i, ok := fields.nameIndex[string(key)]; ok {
+                               // Found an exact name match.
+                               f = &fields.list[i]
+                       } else {
+                               // Fall back to the expensive case-insensitive
+                               // linear search.
+                               for i := range fields.list {
+                                       ff := &fields.list[i]
+                                       if ff.equalFold(ff.nameBytes, key) {
+                                               f = ff
+                                               break
+                                       }
                                }
                        }
                        if f != nil {
@@ -730,7 +807,7 @@ func (d *decodeState) object(v reflect.Value) error {
                                        }
                                        subv = subv.Field(i)
                                }
-                               d.errorContext.Field = f.name
+                               d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name)
                                d.errorContext.Struct = t
                        } else if d.disallowUnknownFields {
                                d.saveError(fmt.Errorf("json: unknown field %q", key))
@@ -810,14 +887,17 @@ func (d *decodeState) object(v reflect.Value) error {
                if d.opcode == scanSkipSpace {
                        d.scanWhile(scanSkipSpace)
                }
+               // Reset errorContext to its original state.
+               // Keep the same underlying array for FieldStack, to reuse the
+               // space and avoid unnecessary allocs.
+               d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)]
+               d.errorContext.Struct = origErrorContext.Struct
                if d.opcode == scanEndObject {
                        break
                }
                if d.opcode != scanObjectValue {
                        panic(phasePanicMsg)
                }
-
-               d.errorContext = originalErrorContext
        }
        return nil
 }
@@ -870,7 +950,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
                        d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())})
                        return nil
                }
-               s, ok := unquoteBytes(item)
+               s, ok := d.unquoteBytes(item)
                if !ok {
                        if fromQuoted {
                                return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
@@ -921,7 +1001,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
                }
 
        case '"': // string
-               s, ok := unquoteBytes(item)
+               s, ok := d.unquoteBytes(item)
                if !ok {
                        if fromQuoted {
                                return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
@@ -1077,9 +1157,9 @@ func (d *decodeState) objectInterface() map[string]interface{} {
 
                // Read string key.
                start := d.readIndex()
-               d.scanWhile(scanContinue)
+               d.rescanLiteral()
                item := d.data[start:d.readIndex()]
-               key, ok := unquote(item)
+               key, ok := d.unquote(item)
                if !ok {
                        panic(phasePanicMsg)
                }
@@ -1116,7 +1196,7 @@ func (d *decodeState) objectInterface() map[string]interface{} {
 func (d *decodeState) literalInterface() interface{} {
        // All bytes inside literal return scanContinue op code.
        start := d.readIndex()
-       d.scanWhile(scanContinue)
+       d.rescanLiteral()
 
        item := d.data[start:d.readIndex()]
 
@@ -1128,7 +1208,7 @@ func (d *decodeState) literalInterface() interface{} {
                return c == 't'
 
        case '"': // string
-               s, ok := unquote(item)
+               s, ok := d.unquote(item)
                if !ok {
                        panic(phasePanicMsg)
                }
@@ -1171,38 +1251,21 @@ func getu4(s []byte) rune {
 
 // unquote converts a quoted JSON string literal s into an actual string t.
 // The rules are different than for Go, so cannot use strconv.Unquote.
-func unquote(s []byte) (t string, ok bool) {
-       s, ok = unquoteBytes(s)
+func (d *decodeState) unquote(s []byte) (t string, ok bool) {
+       s, ok = d.unquoteBytes(s)
        t = string(s)
        return
 }
 
-func unquoteBytes(s []byte) (t []byte, ok bool) {
-       if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
-               return
-       }
+func (d *decodeState) unquoteBytes(s []byte) (t []byte, ok bool) {
+       r := d.safeUnquote
+       // The bytes have been scanned, so we know that the first and last bytes
+       // are double quotes.
        s = s[1 : len(s)-1]
 
-       // Check for unusual characters. If there are none,
-       // then no unquoting is needed, so return a slice of the
-       // original bytes.
-       r := 0
-       for r < len(s) {
-               c := s[r]
-               if c == '\\' || c == '"' || c < ' ' {
-                       break
-               }
-               if c < utf8.RuneSelf {
-                       r++
-                       continue
-               }
-               rr, size := utf8.DecodeRune(s[r:])
-               if rr == utf8.RuneError && size == 1 {
-                       break
-               }
-               r += size
-       }
-       if r == len(s) {
+       // If there are no unusual characters, no unquoting is needed, so return
+       // a slice of the original bytes.
+       if r == -1 {
                return s, true
        }
 
index 54432600a533a47be9513cd9c4385e9b7314cbf6..719a9fa290c77909555c78792503f5b98fde4964 100644 (file)
@@ -45,6 +45,15 @@ type W struct {
        S SS
 }
 
+type P struct {
+       PP PP
+}
+
+type PP struct {
+       T  T
+       Ts []T
+}
+
 type SS string
 
 func (*SS) UnmarshalJSON(data []byte) error {
@@ -816,7 +825,7 @@ var unmarshalTests = []unmarshalTest{
                err: &UnmarshalTypeError{
                        Value:  "string",
                        Struct: "V",
-                       Field:  "F2",
+                       Field:  "V.F2",
                        Type:   reflect.TypeOf(int32(0)),
                        Offset: 20,
                },
@@ -827,7 +836,7 @@ var unmarshalTests = []unmarshalTest{
                err: &UnmarshalTypeError{
                        Value:  "string",
                        Struct: "V",
-                       Field:  "F2",
+                       Field:  "V.F2",
                        Type:   reflect.TypeOf(int32(0)),
                        Offset: 30,
                },
@@ -923,6 +932,29 @@ var unmarshalTests = []unmarshalTest{
                ptr: new(MustNotUnmarshalText),
                err: &UnmarshalTypeError{Value: "object", Type: reflect.TypeOf(&MustNotUnmarshalText{}), Offset: 1},
        },
+       // #22369
+       {
+               in:  `{"PP": {"T": {"Y": "bad-type"}}}`,
+               ptr: new(P),
+               err: &UnmarshalTypeError{
+                       Value:  "string",
+                       Struct: "T",
+                       Field:  "PP.T.Y",
+                       Type:   reflect.TypeOf(int(0)),
+                       Offset: 29,
+               },
+       },
+       {
+               in:  `{"Ts": [{"Y": 1}, {"Y": 2}, {"Y": "bad-type"}]}`,
+               ptr: new(PP),
+               err: &UnmarshalTypeError{
+                       Value:  "string",
+                       Struct: "T",
+                       Field:  "Ts.Y",
+                       Type:   reflect.TypeOf(int(0)),
+                       Offset: 29,
+               },
+       },
 }
 
 func TestMarshal(t *testing.T) {
@@ -1021,12 +1053,22 @@ func TestMarshalEmbeds(t *testing.T) {
        }
 }
 
+func equalError(a, b error) bool {
+       if a == nil {
+               return b == nil
+       }
+       if b == nil {
+               return a == nil
+       }
+       return a.Error() == b.Error()
+}
+
 func TestUnmarshal(t *testing.T) {
        for i, tt := range unmarshalTests {
                var scan scanner
                in := []byte(tt.in)
                if err := checkValid(in, &scan); err != nil {
-                       if !reflect.DeepEqual(err, tt.err) {
+                       if !equalError(err, tt.err) {
                                t.Errorf("#%d: checkValid: %#v", i, err)
                                continue
                        }
@@ -1044,7 +1086,7 @@ func TestUnmarshal(t *testing.T) {
                if tt.disallowUnknownFields {
                        dec.DisallowUnknownFields()
                }
-               if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
+               if err := dec.Decode(v.Interface()); !equalError(err, tt.err) {
                        t.Errorf("#%d: %v, want %v", i, err, tt.err)
                        continue
                } else if err != nil {
@@ -2270,7 +2312,7 @@ func TestUnmarshalEmbeddedUnexported(t *testing.T) {
 
        for i, tt := range tests {
                err := Unmarshal([]byte(tt.in), tt.ptr)
-               if !reflect.DeepEqual(err, tt.err) {
+               if !equalError(err, tt.err) {
                        t.Errorf("#%d: %v, want %v", i, err, tt.err)
                }
                if !reflect.DeepEqual(tt.ptr, tt.out) {
@@ -2292,3 +2334,15 @@ func TestUnmarshalPanic(t *testing.T) {
        Unmarshal([]byte("{}"), &unmarshalPanic{})
        t.Fatalf("Unmarshal should have panicked")
 }
+
+// The decoder used to hang if decoding into an interface pointing to its own address.
+// See golang.org/issues/31740.
+func TestUnmarshalRecursivePointer(t *testing.T) {
+       var v interface{}
+       v = &v
+       data := []byte(`{"a": "b"}`)
+
+       if err := Unmarshal(data, v); err != nil {
+               t.Fatal(err)
+       }
+}
index dea63f1850fef444dc8a6a3490c6d3983c97afba..464ee3ece4f62cb6ec8cc13f12c4b15beedf75fb 100644 (file)
@@ -45,11 +45,12 @@ import (
 //
 // String values encode as JSON strings coerced to valid UTF-8,
 // replacing invalid bytes with the Unicode replacement rune.
-// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
-// to keep some browsers from misinterpreting JSON output as HTML.
-// Ampersand "&" is also escaped to "\u0026" for the same reason.
-// This escaping can be disabled using an Encoder that had SetEscapeHTML(false)
-// called on it.
+// So that the JSON will be safe to embed inside HTML <script> tags,
+// the string is encoded using HTMLEscape,
+// which replaces "<", ">", "&", U+2028, and U+2029 are escaped
+// to "\u003c","\u003e", "\u0026", "\u2028", and "\u2029".
+// This replacement can be disabled when using an Encoder,
+// by calling SetEscapeHTML(false).
 //
 // Array and slice values encode as JSON arrays, except that
 // []byte encodes as a base64-encoded string, and a nil slice
@@ -269,6 +270,8 @@ func (e *MarshalerError) Error() string {
        return "json: error calling MarshalJSON for type " + e.Type.String() + ": " + e.Err.Error()
 }
 
+func (e *MarshalerError) Unwrap() error { return e.Err }
+
 var hex = "0123456789abcdef"
 
 // An encodeState encodes JSON into a bytes.Buffer.
@@ -392,19 +395,15 @@ func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc {
        if t.Implements(marshalerType) {
                return marshalerEncoder
        }
-       if t.Kind() != reflect.Ptr && allowAddr {
-               if reflect.PtrTo(t).Implements(marshalerType) {
-                       return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false))
-               }
+       if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(marshalerType) {
+               return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false))
        }
 
        if t.Implements(textMarshalerType) {
                return textMarshalerEncoder
        }
-       if t.Kind() != reflect.Ptr && allowAddr {
-               if reflect.PtrTo(t).Implements(textMarshalerType) {
-                       return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false))
-               }
+       if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(textMarshalerType) {
+               return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false))
        }
 
        switch t.Kind() {
@@ -625,14 +624,19 @@ func unsupportedTypeEncoder(e *encodeState, v reflect.Value, _ encOpts) {
 }
 
 type structEncoder struct {
-       fields []field
+       fields structFields
+}
+
+type structFields struct {
+       list      []field
+       nameIndex map[string]int
 }
 
 func (se structEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
        next := byte('{')
 FieldLoop:
-       for i := range se.fields {
-               f := &se.fields[i]
+       for i := range se.fields.list {
+               f := &se.fields.list[i]
 
                // Find the nested struct field by following f.index.
                fv := v
@@ -1067,14 +1071,13 @@ func (x byIndex) Less(i, j int) bool {
 // typeFields returns a list of fields that JSON should recognize for the given type.
 // The algorithm is breadth-first search over the set of structs to include - the top struct
 // and then any reachable anonymous structs.
-func typeFields(t reflect.Type) []field {
+func typeFields(t reflect.Type) structFields {
        // Anonymous fields to explore at the current level and the next.
        current := []field{}
        next := []field{{typ: t}}
 
        // Count of queued names for current level and the next.
-       count := map[reflect.Type]int{}
-       nextCount := map[reflect.Type]int{}
+       var count, nextCount map[reflect.Type]int
 
        // Types already visited at an earlier level.
        visited := map[reflect.Type]bool{}
@@ -1242,7 +1245,11 @@ func typeFields(t reflect.Type) []field {
                f := &fields[i]
                f.encoder = typeEncoder(typeByIndex(t, f.index))
        }
-       return fields
+       nameIndex := make(map[string]int, len(fields))
+       for i, field := range fields {
+               nameIndex[field.name] = i
+       }
+       return structFields{fields, nameIndex}
 }
 
 // dominantField looks through the fields, all of which are known to
@@ -1261,13 +1268,13 @@ func dominantField(fields []field) (field, bool) {
        return fields[0], true
 }
 
-var fieldCache sync.Map // map[reflect.Type][]field
+var fieldCache sync.Map // map[reflect.Type]structFields
 
 // cachedTypeFields is like typeFields but uses a cache to avoid repeated work.
-func cachedTypeFields(t reflect.Type) []field {
+func cachedTypeFields(t reflect.Type) structFields {
        if f, ok := fieldCache.Load(t); ok {
-               return f.([]field)
+               return f.(structFields)
        }
        f, _ := fieldCache.LoadOrStore(t, typeFields(t))
-       return f.([]field)
+       return f.(structFields)
 }
index cd5eadf3c1cd2afab2c6da75b93eb8a367271299..bdf2a9f07923939f5258d6275e7843cd95960348 100644 (file)
@@ -580,6 +580,9 @@ func TestStringBytes(t *testing.T) {
        // Test that encodeState.stringBytes and encodeState.string use the same encoding.
        var r []rune
        for i := '\u0000'; i <= unicode.MaxRune; i++ {
+               if testing.Short() && i > 1000 {
+                       i = unicode.MaxRune
+               }
                r = append(r, i)
        }
        s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
@@ -864,6 +867,9 @@ func TestMarshalFloat(t *testing.T) {
 
        var digits = "1.2345678901234567890123"
        for i := len(digits); i >= 2; i-- {
+               if testing.Short() && i < len(digits)-4 {
+                       break
+               }
                for exp := -30; exp <= 30; exp++ {
                        for _, sign := range "+-" {
                                for bits := 32; bits <= 64; bits += 32 {
diff --git a/libgo/go/encoding/json/fuzz.go b/libgo/go/encoding/json/fuzz.go
new file mode 100644 (file)
index 0000000..4872b6f
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gofuzz
+
+package json
+
+import (
+       "fmt"
+)
+
+func Fuzz(data []byte) (score int) {
+       for _, ctor := range []func() interface{}{
+               func() interface{} { return new(interface{}) },
+               func() interface{} { return new(map[string]interface{}) },
+               func() interface{} { return new([]interface{}) },
+       } {
+               v := ctor()
+               err := Unmarshal(data, v)
+               if err != nil {
+                       continue
+               }
+               score = 1
+
+               m, err := Marshal(v)
+               if err != nil {
+                       fmt.Printf("v=%#v\n", v)
+                       panic(err)
+               }
+
+               u := ctor()
+               err = Unmarshal(m, u)
+               if err != nil {
+                       fmt.Printf("v=%#v\n", v)
+                       fmt.Println("m=%s\n", string(m))
+                       panic(err)
+               }
+       }
+
+       return
+}
index fba19548c92721d2f2fb0c63dd3accaa8a3077d3..1b49a369e3337def391dedd4df1e6a437e8bfee0 100644 (file)
@@ -8,6 +8,9 @@ import "bytes"
 
 // Compact appends to dst the JSON-encoded src with
 // insignificant space characters elided.
+// Like Marshal, Compact applies HTMLEscape to any
+// string literals so that the JSON will be safe to embed
+// inside HTML <script> tags.
 func Compact(dst *bytes.Buffer, src []byte) error {
        return compact(dst, src, false)
 }
index 7d5137fbc716f289f273eac02bd7b39e44f332f7..e29127499b638a1328cae467ccac866ec618088f 100644 (file)
@@ -92,20 +92,23 @@ func (dec *Decoder) readValue() (int, error) {
        scanp := dec.scanp
        var err error
 Input:
-       for {
+       // help the compiler see that scanp is never negative, so it can remove
+       // some bounds checks below.
+       for scanp >= 0 {
+
                // Look in the buffer for a new value.
-               for i, c := range dec.buf[scanp:] {
+               for ; scanp < len(dec.buf); scanp++ {
+                       c := dec.buf[scanp]
                        dec.scan.bytes++
                        switch dec.scan.step(&dec.scan, c) {
                        case scanEnd:
-                               scanp += i
                                break Input
                        case scanEndObject, scanEndArray:
                                // scanEnd is delayed one byte.
                                // We might block trying to get that byte from src,
                                // so instead invent a space byte.
                                if stateEndValue(&dec.scan, ' ') == scanEnd {
-                                       scanp += i + 1
+                                       scanp++
                                        break Input
                                }
                        case scanError:
@@ -113,7 +116,6 @@ Input:
                                return 0, dec.scan.err
                        }
                }
-               scanp = len(dec.buf)
 
                // Did the last read have an error?
                // Delayed until now to allow buffer scan.
index aaf32e0a24ce516dd71bb83b548f47c07e6aa70e..1d1999da251c43c34a809767285857cffa9092fe 100644 (file)
@@ -296,7 +296,7 @@ type decodeThis struct {
        v interface{}
 }
 
-var tokenStreamCases []tokenStreamCase = []tokenStreamCase{
+var tokenStreamCases = []tokenStreamCase{
        // streaming token cases
        {json: `10`, expTokens: []interface{}{float64(10)}},
        {json: ` [10] `, expTokens: []interface{}{
@@ -368,7 +368,6 @@ var tokenStreamCases []tokenStreamCase = []tokenStreamCase{
 }
 
 func TestDecodeInStream(t *testing.T) {
-
        for ci, tcase := range tokenStreamCases {
 
                dec := NewDecoder(strings.NewReader(tcase.json))
@@ -401,7 +400,6 @@ func TestDecodeInStream(t *testing.T) {
                        }
                }
        }
-
 }
 
 // Test from golang.org/issue/11893
index 35058c306bc75be8fc1c46b38656dcef2440edad..a7272da5ad3a81575c3930fd405aafb824375004 100644 (file)
@@ -50,14 +50,22 @@ func getLine(data []byte) (line, rest []byte) {
        return bytes.TrimRight(data[0:i], " \t"), data[j:]
 }
 
-// removeWhitespace returns a copy of its input with all spaces, tab and
-// newline characters removed.
-func removeWhitespace(data []byte) []byte {
+// removeSpacesAndTabs returns a copy of its input with all spaces and tabs
+// removed, if there were any. Otherwise, the input is returned unchanged.
+//
+// The base64 decoder already skips newline characters, so we don't need to
+// filter them out here.
+func removeSpacesAndTabs(data []byte) []byte {
+       if !bytes.ContainsAny(data, " \t") {
+               // Fast path; most base64 data within PEM contains newlines, but
+               // no spaces nor tabs. Skip the extra alloc and work.
+               return data
+       }
        result := make([]byte, len(data))
        n := 0
 
        for _, b := range data {
-               if b == ' ' || b == '\t' || b == '\r' || b == '\n' {
+               if b == ' ' || b == '\t' {
                        continue
                }
                result[n] = b
@@ -155,7 +163,7 @@ func Decode(data []byte) (p *Block, rest []byte) {
                return decodeError(data, rest)
        }
 
-       base64Data := removeWhitespace(rest[:endIndex])
+       base64Data := removeSpacesAndTabs(rest[:endIndex])
        p.Bytes = make([]byte, base64.StdEncoding.DecodedLen(len(base64Data)))
        n, err := base64.StdEncoding.Decode(p.Bytes, base64Data)
        if err != nil {
index 204611bda02d7ac223891d503e934febaa246416..8515b46498d99a38f75f74ea51282d6069a2bf5f 100644 (file)
@@ -285,7 +285,7 @@ func BenchmarkDecode(b *testing.B) {
        }
 }
 
-var pemData = `verify return:0
+var pemData = testingKey(`verify return:0
 -----BEGIN CERTIFICATE-----
 sdlfkjskldfj
   -----BEGIN CERTIFICATE-----
@@ -296,13 +296,13 @@ Certificate chain
 -----BEGIN CERTIFICATE-----
 testing
 -----BEGIN CERTIFICATE-----
------BEGIN CERTIFICATE----- 
+-----BEGIN CERTIFICATE-----
 MIID6TCCA1ICAQEwDQYJKoZIhvcNAQEFBQAwgYsxCzAJBgNVBAYTAlVTMRMwEQYD
 VQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQK
-EwtHb29nbGUgSW5jLjEMMAoGA1UECxMDRW5nMQwwCgYDVQQDEwNhZ2wxHTAbBgkq 
-hkiG9w0BCQEWDmFnbEBnb29nbGUuY29tMB4XDTA5MDkwOTIyMDU0M1oXDTEwMDkw  
-OTIyMDU0M1owajELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAf         
-BgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAxMaZXVyb3Bh                 
+EwtHb29nbGUgSW5jLjEMMAoGA1UECxMDRW5nMQwwCgYDVQQDEwNhZ2wxHTAbBgkq
+hkiG9w0BCQEWDmFnbEBnb29nbGUuY29tMB4XDTA5MDkwOTIyMDU0M1oXDTEwMDkw
+OTIyMDU0M1owajELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAf
+BgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAxMaZXVyb3Bh
 LnNmby5jb3JwLmdvb2dsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
 AoICAQC6pgYt7/EibBDumASF+S0qvqdL/f+nouJw2T1Qc8GmXF/iiUcrsgzh/Fd8
 pDhz/T96Qg9IyR4ztuc2MXrmPra+zAuSf5bevFReSqvpIt8Duv0HbDbcqs/XKPfB
@@ -318,15 +318,15 @@ Pomjn71GNTtDeWAXibjCgdL6iHACCF6Htbl0zGlG0OAK+bdn0QIDAQABMA0GCSqG
 SIb3DQEBBQUAA4GBAOKnQDtqBV24vVqvesL5dnmyFpFPXBn3WdFfwD6DzEb21UVG
 5krmJiu+ViipORJPGMkgoL6BjU21XI95VQbun5P8vvg8Z+FnFsvRFY3e1CCzAVQY
 ZsUkLw2I7zI/dNlWdB8Xp7v+3w9sX5N3J/WuJ1KOO5m26kRlHQo7EzT3974g
------END CERTIFICATE-----   
+-----END CERTIFICATE-----
  1 s:/C=ZA/O=Ca Inc./CN=CA Inc
 
------BEGIN RSA PRIVATE KEY-----        
-Proc-Type: 4,ENCRYPTED   
-DEK-Info: DES-EDE3-CBC,80C7C7A09690757A        
-       
+-----BEGIN RSA TESTING KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,80C7C7A09690757A
+
 eQp5ZkH6CyHBz7BZfUPxyLCCmftsBJ7HlqGb8Ld21cSwnzWZ4/SIlhyrUtsfw7VR
-2TTwA+odo9ex7GdxOTaH8oZFumIRoiEjHsk8U7Bhntp+ekkPP79xunnN7hb7hkhr   
+2TTwA+odo9ex7GdxOTaH8oZFumIRoiEjHsk8U7Bhntp+ekkPP79xunnN7hb7hkhr
 yGDQZgA7s2cQHQ71v3gwT2BACAft26jCjbM1wgNzBnJ8M0Rzn68YWqaPtdBu8qb/
 zVR5JB1mnqvTSbFsfF5yMc6o2WQ9jJCl6KypnMl+BpL+dlvdjYVK4l9lYsB1Hs3d
 +zDBbWxos818zzhS8/y6eIfiSG27cqrbhURbmgiSfDXjncK4m/pLcQ7mmBL6mFOr
@@ -338,7 +338,7 @@ BTiHcL3s3KrJu1vDVrshvxfnz71KTeNnZH8UbOqT5i7fPGyXtY1XJddcbI/Q6tXf
 wHFsZc20TzSdsVLBtwksUacpbDogcEVMctnNrB8FIrB3vZEv9Q0Z1VeY7nmTpF+6
 a+z2P7acL7j6A6Pr3+q8P9CPiPC7zFonVzuVPyB8GchGR2hytyiOVpuD9+k8hcuw
 ZWAaUoVtWIQ52aKS0p19G99hhb+IVANC4akkdHV4SP8i7MVNZhfUmg==
------END RSA PRIVATE KEY-----
+-----END RSA TESTING KEY-----
 
 
 -----BEGIN EMPTY-----
@@ -363,7 +363,7 @@ Header: 1
 -----BEGIN HEADERS-----
 Header: 1
 
------END HEADERS-----`
+-----END HEADERS-----`)
 
 var certificate = &Block{Type: "CERTIFICATE",
        Headers: map[string]string{},
@@ -582,7 +582,7 @@ var privateKey2 = &Block{
        },
 }
 
-var pemPrivateKey2 = `-----BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey2 = testingKey(`-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 Content-Domain: RFC822
 DEK-Info: AES-128-CBC,BFCD243FEDBB40A4AA6DDAA1335473A4
@@ -594,8 +594,8 @@ y9QEsXO5czLWesYpJaXaF5N6EOhB+6UXIPhO6eOPUSATu963k64TivYJ9KZB4CtR
 GjA4DbE7Z4dk9coyZ9HIpT0jcsQGr497Jqw8dZGhABPGXEnVPOeyspng1SX64hKA
 N4XPksobn/NO2IDvPM7N9ZCe+aeyDEkE8QmP6mPScLuGvzSrsgOxWTMWF7Dbdzj0
 tJQLJRZ+ItT5Irl4owSEBNLahC1j3fhQavbj9WVAfKk=
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
 
 func TestBadEncode(t *testing.T) {
        b := &Block{Type: "BAD", Headers: map[string]string{"X:Y": "Z"}}
@@ -610,3 +610,5 @@ func TestBadEncode(t *testing.T) {
                t.Fatalf("EncodeToMemory returned non-nil data")
        }
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/libgo/go/errors/wrap.go b/libgo/go/errors/wrap.go
new file mode 100644 (file)
index 0000000..666d1ff
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package errors
+
+import (
+       "internal/reflectlite"
+)
+
+// Unwrap returns the result of calling the Unwrap method on err, if err's
+// type contains an Unwrap method returning error.
+// Otherwise, Unwrap returns nil.
+func Unwrap(err error) error {
+       u, ok := err.(interface {
+               Unwrap() error
+       })
+       if !ok {
+               return nil
+       }
+       return u.Unwrap()
+}
+
+// Is reports whether any error in err's chain matches target.
+//
+// An error is considered to match a target if it is equal to that target or if
+// it implements a method Is(error) bool such that Is(target) returns true.
+func Is(err, target error) bool {
+       if target == nil {
+               return err == target
+       }
+
+       isComparable := reflectlite.TypeOf(target).Comparable()
+       for {
+               if isComparable && err == target {
+                       return true
+               }
+               if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
+                       return true
+               }
+               // TODO: consider supporing target.Is(err). This would allow
+               // user-definable predicates, but also may allow for coping with sloppy
+               // APIs, thereby making it easier to get away with them.
+               if err = Unwrap(err); err == nil {
+                       return false
+               }
+       }
+}
+
+// As finds the first error in err's chain that matches target, and if so, sets
+// target to that error value and returns true.
+//
+// An error matches target if the error's concrete value is assignable to the value
+// pointed to by target, or if the error has a method As(interface{}) bool such that
+// As(target) returns true. In the latter case, the As method is responsible for
+// setting target.
+//
+// As will panic if target is not a non-nil pointer to either a type that implements
+// error, or to any interface type. As returns false if err is nil.
+func As(err error, target interface{}) bool {
+       if target == nil {
+               panic("errors: target cannot be nil")
+       }
+       val := reflectlite.ValueOf(target)
+       typ := val.Type()
+       if typ.Kind() != reflectlite.Ptr || val.IsNil() {
+               panic("errors: target must be a non-nil pointer")
+       }
+       if e := typ.Elem(); e.Kind() != reflectlite.Interface && !e.Implements(errorType) {
+               panic("errors: *target must be interface or implement error")
+       }
+       targetType := typ.Elem()
+       for err != nil {
+               if reflectlite.TypeOf(err).AssignableTo(targetType) {
+                       val.Elem().Set(reflectlite.ValueOf(err))
+                       return true
+               }
+               if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {
+                       return true
+               }
+               err = Unwrap(err)
+       }
+       return false
+}
+
+var errorType = reflectlite.TypeOf((*error)(nil)).Elem()
diff --git a/libgo/go/errors/wrap_test.go b/libgo/go/errors/wrap_test.go
new file mode 100644 (file)
index 0000000..590c185
--- /dev/null
@@ -0,0 +1,253 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package errors_test
+
+import (
+       "errors"
+       "fmt"
+       "os"
+       "reflect"
+       "testing"
+)
+
+func TestIs(t *testing.T) {
+       err1 := errors.New("1")
+       erra := wrapped{"wrap 2", err1}
+       errb := wrapped{"wrap 3", erra}
+
+       err3 := errors.New("3")
+
+       poser := &poser{"either 1 or 3", func(err error) bool {
+               return err == err1 || err == err3
+       }}
+
+       testCases := []struct {
+               err    error
+               target error
+               match  bool
+       }{
+               {nil, nil, true},
+               {err1, nil, false},
+               {err1, err1, true},
+               {erra, err1, true},
+               {errb, err1, true},
+               {err1, err3, false},
+               {erra, err3, false},
+               {errb, err3, false},
+               {poser, err1, true},
+               {poser, err3, true},
+               {poser, erra, false},
+               {poser, errb, false},
+               {errorUncomparable{}, errorUncomparable{}, true},
+               {errorUncomparable{}, &errorUncomparable{}, false},
+               {&errorUncomparable{}, errorUncomparable{}, true},
+               {&errorUncomparable{}, &errorUncomparable{}, false},
+               {errorUncomparable{}, err1, false},
+               {&errorUncomparable{}, err1, false},
+       }
+       for _, tc := range testCases {
+               t.Run("", func(t *testing.T) {
+                       if got := errors.Is(tc.err, tc.target); got != tc.match {
+                               t.Errorf("Is(%v, %v) = %v, want %v", tc.err, tc.target, got, tc.match)
+                       }
+               })
+       }
+}
+
+type poser struct {
+       msg string
+       f   func(error) bool
+}
+
+var poserPathErr = &os.PathError{Op: "poser"}
+
+func (p *poser) Error() string     { return p.msg }
+func (p *poser) Is(err error) bool { return p.f(err) }
+func (p *poser) As(err interface{}) bool {
+       switch x := err.(type) {
+       case **poser:
+               *x = p
+       case *errorT:
+               *x = errorT{"poser"}
+       case **os.PathError:
+               *x = poserPathErr
+       default:
+               return false
+       }
+       return true
+}
+
+func TestAs(t *testing.T) {
+       var errT errorT
+       var errP *os.PathError
+       var timeout interface{ Timeout() bool }
+       var p *poser
+       _, errF := os.Open("non-existing")
+       poserErr := &poser{"oh no", nil}
+
+       testCases := []struct {
+               err    error
+               target interface{}
+               match  bool
+               want   interface{} // value of target on match
+       }{{
+               nil,
+               &errP,
+               false,
+               nil,
+       }, {
+               wrapped{"pitied the fool", errorT{"T"}},
+               &errT,
+               true,
+               errorT{"T"},
+       }, {
+               errF,
+               &errP,
+               true,
+               errF,
+       }, {
+               errorT{},
+               &errP,
+               false,
+               nil,
+       }, {
+               wrapped{"wrapped", nil},
+               &errT,
+               false,
+               nil,
+       }, {
+               &poser{"error", nil},
+               &errT,
+               true,
+               errorT{"poser"},
+       }, {
+               &poser{"path", nil},
+               &errP,
+               true,
+               poserPathErr,
+       }, {
+               poserErr,
+               &p,
+               true,
+               poserErr,
+       }, {
+               errors.New("err"),
+               &timeout,
+               false,
+               nil,
+       }, {
+               errF,
+               &timeout,
+               true,
+               errF,
+       }, {
+               wrapped{"path error", errF},
+               &timeout,
+               true,
+               errF,
+       }}
+       for i, tc := range testCases {
+               name := fmt.Sprintf("%d:As(Errorf(..., %v), %v)", i, tc.err, tc.target)
+               // Clear the target pointer, in case it was set in a previous test.
+               rtarget := reflect.ValueOf(tc.target)
+               rtarget.Elem().Set(reflect.Zero(reflect.TypeOf(tc.target).Elem()))
+               t.Run(name, func(t *testing.T) {
+                       match := errors.As(tc.err, tc.target)
+                       if match != tc.match {
+                               t.Fatalf("match: got %v; want %v", match, tc.match)
+                       }
+                       if !match {
+                               return
+                       }
+                       if got := rtarget.Elem().Interface(); got != tc.want {
+                               t.Fatalf("got %#v, want %#v", got, tc.want)
+                       }
+               })
+       }
+}
+
+func TestAsValidation(t *testing.T) {
+       var s string
+       testCases := []interface{}{
+               nil,
+               (*int)(nil),
+               "error",
+               &s,
+       }
+       err := errors.New("error")
+       for _, tc := range testCases {
+               t.Run(fmt.Sprintf("%T(%v)", tc, tc), func(t *testing.T) {
+                       defer func() {
+                               recover()
+                       }()
+                       if errors.As(err, tc) {
+                               t.Errorf("As(err, %T(%v)) = true, want false", tc, tc)
+                               return
+                       }
+                       t.Errorf("As(err, %T(%v)) did not panic", tc, tc)
+               })
+       }
+}
+
+func TestUnwrap(t *testing.T) {
+       err1 := errors.New("1")
+       erra := wrapped{"wrap 2", err1}
+
+       testCases := []struct {
+               err  error
+               want error
+       }{
+               {nil, nil},
+               {wrapped{"wrapped", nil}, nil},
+               {err1, nil},
+               {erra, err1},
+               {wrapped{"wrap 3", erra}, erra},
+       }
+       for _, tc := range testCases {
+               if got := errors.Unwrap(tc.err); got != tc.want {
+                       t.Errorf("Unwrap(%v) = %v, want %v", tc.err, got, tc.want)
+               }
+       }
+}
+
+type errorT struct{ s string }
+
+func (e errorT) Error() string { return fmt.Sprintf("errorT(%s)", e.s) }
+
+type wrapped struct {
+       msg string
+       err error
+}
+
+func (e wrapped) Error() string { return e.msg }
+
+func (e wrapped) Unwrap() error { return e.err }
+
+type errorUncomparable struct {
+       f []string
+}
+
+func (errorUncomparable) Error() string {
+       return "uncomparable error"
+}
+
+func (errorUncomparable) Is(target error) bool {
+       _, ok := target.(errorUncomparable)
+       return ok
+}
+
+func ExampleAs() {
+       if _, err := os.Open("non-existing"); err != nil {
+               var pathError *os.PathError
+               if errors.As(err, &pathError) {
+                       fmt.Println("Failed at path:", pathError.Path)
+               } else {
+                       fmt.Println(err)
+               }
+       }
+
+       // Output:
+       // Failed at path: non-existing
+}
index 976b300d63779a927cd11eb82a3150f6983d6649..c0dc0532b1ca4bb2f9e809c87d4afcfdfadc96d4 100644 (file)
@@ -141,8 +141,14 @@ func (v *Map) Init() *Map {
 func (v *Map) addKey(key string) {
        v.keysMu.Lock()
        defer v.keysMu.Unlock()
-       v.keys = append(v.keys, key)
-       sort.Strings(v.keys)
+       // Using insertion sort to place key into the already-sorted v.keys.
+       if i := sort.SearchStrings(v.keys, key); i >= len(v.keys) {
+               v.keys = append(v.keys, key)
+       } else if v.keys[i] != key {
+               v.keys = append(v.keys, "")
+               copy(v.keys[i+1:], v.keys[i:])
+               v.keys[i] = key
+       }
 }
 
 func (v *Map) Get(key string) Var {
index 804b56c1aaaa12a4906f95b7960a4fe99af9e012..7b1f83a7d77f127be9f0b214617f14b916291283 100644 (file)
@@ -6,6 +6,7 @@ package expvar
 
 import (
        "bytes"
+       "crypto/sha1"
        "encoding/json"
        "fmt"
        "net"
@@ -299,6 +300,26 @@ func BenchmarkMapSetDifferent(b *testing.B) {
        })
 }
 
+// BenchmarkMapSetDifferentRandom simulates such a case where the concerned
+// keys of Map.Set are generated dynamically and as a result insertion is
+// out of order and the number of the keys may be large.
+func BenchmarkMapSetDifferentRandom(b *testing.B) {
+       keys := make([]string, 100)
+       for i := range keys {
+               keys[i] = fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprint(i))))
+       }
+
+       v := new(Int)
+       b.ResetTimer()
+
+       for i := 0; i < b.N; i++ {
+               m := new(Map).Init()
+               for _, k := range keys {
+                       m.Set(k, v)
+               }
+       }
+}
+
 func BenchmarkMapSetString(b *testing.B) {
        m := new(Map).Init()
 
@@ -350,6 +371,25 @@ func BenchmarkMapAddDifferent(b *testing.B) {
        })
 }
 
+// BenchmarkMapAddDifferentRandom simulates such a case where that the concerned
+// keys of Map.Add are generated dynamically and as a result insertion is out of
+// order and the number of the keys may be large.
+func BenchmarkMapAddDifferentRandom(b *testing.B) {
+       keys := make([]string, 100)
+       for i := range keys {
+               keys[i] = fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprint(i))))
+       }
+
+       b.ResetTimer()
+
+       for i := 0; i < b.N; i++ {
+               m := new(Map).Init()
+               for _, k := range keys {
+                       m.Add(k, 1)
+               }
+       }
+}
+
 func BenchmarkMapAddSameSteadyState(b *testing.B) {
        m := new(Map).Init()
        b.RunParallel(func(pb *testing.PB) {
index c312c62a582157b342552196104d358218f2a536..9fed4d82b3d11b4ce1539f01bf8ffefe8bc6eaa4 100644 (file)
@@ -341,17 +341,15 @@ type Flag struct {
 
 // sortFlags returns the flags as a slice in lexicographical sorted order.
 func sortFlags(flags map[string]*Flag) []*Flag {
-       list := make(sort.StringSlice, len(flags))
+       result := make([]*Flag, len(flags))
        i := 0
        for _, f := range flags {
-               list[i] = f.Name
+               result[i] = f
                i++
        }
-       list.Sort()
-       result := make([]*Flag, len(list))
-       for i, name := range list {
-               result[i] = flags[name]
-       }
+       sort.Slice(result, func(i, j int) bool {
+               return result[i].Name < result[j].Name
+       })
        return result
 }
 
index 3b657f3681dbabdc6eb60646e5834ec7e9f621b2..a7115809d3dcf7d82c99ace45f55d4a950c7bb5a 100644 (file)
@@ -26,6 +26,7 @@
                %c      the character represented by the corresponding Unicode code point
                %d      base 10
                %o      base 8
+               %O      base 8 with 0o prefix
                %q      a single-quoted character literal safely escaped with Go syntax.
                %x      base 16, with lower-case letters for a-f
                %X      base 16, with upper-case letters for A-F
@@ -40,6 +41,8 @@
                %F      synonym for %f
                %g      %e for large exponents, %f otherwise. Precision is discussed below.
                %G      %E for large exponents, %F otherwise
+               %x      hexadecimal notation (with decimal power of two exponent), e.g. -0x1.23abcp+20
+               %X      upper-case hexadecimal notation, e.g. -0X1.23ABCP+20
        String and slice of bytes (treated equivalently with these verbs):
                %s      the uninterpreted bytes of the string or slice
                %q      a double-quoted string safely escaped with Go syntax
                +       always print a sign for numeric values;
                        guarantee ASCII-only output for %q (%+q)
                -       pad with spaces on the right rather than the left (left-justify the field)
-               #       alternate format: add leading 0 for octal (%#o), 0x for hex (%#x);
-                       0X for hex (%#X); suppress 0x for %p (%#p);
+               #       alternate format: add leading 0b for binary (%#b), 0 for octal (%#o),
+                       0x or 0X for hex (%#x or %#X); suppress 0x for %p (%#p);
                        for %q, print a raw (backquoted) string if strconv.CanBackquote
                        returns true;
                        always print a decimal point for %e, %E, %f, %F, %g and %G;
        description of the problem, as in these examples:
 
                Wrong type or unknown verb: %!verb(type=value)
-                       Printf("%d", hi):          %!d(string=hi)
+                       Printf("%d", "hi"):        %!d(string=hi)
                Too many arguments: %!(EXTRA type=value)
                        Printf("hi", "guys"):      hi%!(EXTRA string=guys)
                Too few arguments: %!verb(MISSING)
        For example, %x will scan an integer as a hexadecimal number,
        and %v will scan the default representation format for the value.
        The Printf verbs %p and %T and the flags # and + are not implemented.
-       The verbs %e %E %f %F %g and %G are all equivalent and scan any
-       floating-point or complex value. For float and complex literals in
-       scientific notation, both the decimal (e) and binary (p) exponent
-       formats are supported (for example: "2.3e+7" and "4.5p-8").
+       For floating-point and complex values, all valid formatting verbs
+       (%b %e %E %f %F %g %G %x %X and %v) are equivalent and accept
+       both decimal and hexadecimal notation (for example: "2.3e+7", "0x4.5p-8")
+       and digit-separating underscores (for example: "3.14159_26535_89793").
 
        Input processed by verbs is implicitly space-delimited: the
        implementation of every verb except %c starts by discarding
        (and %v reading into a string) stops consuming input at the first
        space or newline character.
 
-       The familiar base-setting prefixes 0 (octal) and 0x
-       (hexadecimal) are accepted when scanning integers without
-       a format or with the %v verb.
+       The familiar base-setting prefixes 0b (binary), 0o and 0 (octal),
+       and 0x (hexadecimal) are accepted when scanning integers
+       without a format or with the %v verb, as are digit-separating
+       underscores.
 
        Width is interpreted in the input text but there is no
        syntax for scanning with a precision (no %5.2f, just %5f).
diff --git a/libgo/go/fmt/errors.go b/libgo/go/fmt/errors.go
new file mode 100644 (file)
index 0000000..6ae6c47
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fmt
+
+import "errors"
+
+// Errorf formats according to a format specifier and returns the string as a
+// value that satisfies error.
+//
+// If the format specifier includes a %w verb with an error operand,
+// the returned error will implement an Unwrap method returning the operand. It is
+// invalid to include more than one %w verb or to supply it with an operand
+// that does not implement the error innterface. The %w verb is otherwise
+// a synonym for %v.
+func Errorf(format string, a ...interface{}) error {
+       p := newPrinter()
+       p.wrapErrs = true
+       p.doPrintf(format, a)
+       s := string(p.buf)
+       var err error
+       if p.wrappedErr == nil {
+               err = errors.New(s)
+       } else {
+               err = &wrapError{s, p.wrappedErr}
+       }
+       p.free()
+       return err
+}
+
+type wrapError struct {
+       msg string
+       err error
+}
+
+func (e *wrapError) Error() string {
+       return e.msg
+}
+
+func (e *wrapError) Unwrap() error {
+       return e.err
+}
diff --git a/libgo/go/fmt/errors_test.go b/libgo/go/fmt/errors_test.go
new file mode 100644 (file)
index 0000000..0c774bc
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fmt_test
+
+import (
+       "errors"
+       "fmt"
+       "testing"
+)
+
+func TestErrorf(t *testing.T) {
+       wrapped := errors.New("inner error")
+       for _, test := range []struct {
+               err        error
+               wantText   string
+               wantUnwrap error
+       }{{
+               err:        fmt.Errorf("%w", wrapped),
+               wantText:   "inner error",
+               wantUnwrap: wrapped,
+       }, {
+               err:        fmt.Errorf("added context: %w", wrapped),
+               wantText:   "added context: inner error",
+               wantUnwrap: wrapped,
+       }, {
+               err:        fmt.Errorf("%w with added context", wrapped),
+               wantText:   "inner error with added context",
+               wantUnwrap: wrapped,
+       }, {
+               err:        fmt.Errorf("%s %w %v", "prefix", wrapped, "suffix"),
+               wantText:   "prefix inner error suffix",
+               wantUnwrap: wrapped,
+       }, {
+               err:        fmt.Errorf("%[2]s: %[1]w", wrapped, "positional verb"),
+               wantText:   "positional verb: inner error",
+               wantUnwrap: wrapped,
+       }, {
+               err:      fmt.Errorf("%v", wrapped),
+               wantText: "inner error",
+       }, {
+               err:      fmt.Errorf("added context: %v", wrapped),
+               wantText: "added context: inner error",
+       }, {
+               err:      fmt.Errorf("%v with added context", wrapped),
+               wantText: "inner error with added context",
+       }, {
+               err:      fmt.Errorf("%w is not an error", "not-an-error"),
+               wantText: "%!w(string=not-an-error) is not an error",
+       }, {
+               err:      fmt.Errorf("wrapped two errors: %w %w", errString("1"), errString("2")),
+               wantText: "wrapped two errors: 1 %!w(fmt_test.errString=2)",
+       }, {
+               err:      fmt.Errorf("wrapped three errors: %w %w %w", errString("1"), errString("2"), errString("3")),
+               wantText: "wrapped three errors: 1 %!w(fmt_test.errString=2) %!w(fmt_test.errString=3)",
+       }, {
+               err:        fmt.Errorf("%w", nil),
+               wantText:   "%!w(<nil>)",
+               wantUnwrap: nil, // still nil
+       }} {
+               if got, want := errors.Unwrap(test.err), test.wantUnwrap; got != want {
+                       t.Errorf("Formatted error: %v\nerrors.Unwrap() = %v, want %v", test.err, got, want)
+               }
+               if got, want := test.err.Error(), test.wantText; got != want {
+                       t.Errorf("err.Error() = %q, want %q", got, want)
+               }
+       }
+}
+
+type errString string
+
+func (e errString) Error() string { return string(e) }
index 64821e0daccb3ae5260d062cbabea83036f6cd0c..ae60abef0b29d53a495b6bf1fdfe2d2dec1605b2 100644 (file)
@@ -323,13 +323,13 @@ func Example_formats() {
        // Result: &{Kim 22} 0x010203 // See comment above.
 
        // Arrays and slices are formatted by applying the format to each element.
-       greats := [5]string{"Katano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"}
+       greats := [5]string{"Kitano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"}
        fmt.Printf("%v %q\n", greats, greats)
-       // Result: [Katano Kobayashi Kurosawa Miyazaki Ozu] ["Katano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"]
+       // Result: [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"]
 
        kGreats := greats[:3]
        fmt.Printf("%v %q %#v\n", kGreats, kGreats, kGreats)
-       // Result: [Katano Kobayashi Kurosawa] ["Katano" "Kobayashi" "Kurosawa"] []string{"Katano", "Kobayashi", "Kurosawa"}
+       // Result: [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"}
 
        // Byte slices are special. Integer verbs like %d print the elements in
        // that format. The %s and %q forms treat the slice like a string. The %x
@@ -360,8 +360,8 @@ func Example_formats() {
        // map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true}
        // {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22}
        // &{Kim 22} 0x0
-       // [Katano Kobayashi Kurosawa Miyazaki Ozu] ["Katano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"]
-       // [Katano Kobayashi Kurosawa] ["Katano" "Kobayashi" "Kurosawa"] []string{"Katano", "Kobayashi", "Kurosawa"}
+       // [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"]
+       // [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"}
        // [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98
        // 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC"
 }
index bc184c307ea02d9676006b2a6f821e0fca16d7e5..b9e3bc60f5b94447ab3aa1cab60768d05d3b0f61 100644 (file)
@@ -354,11 +354,17 @@ var fmtTests = []struct {
        {"%+d", -12345, "-12345"},
        {"%b", 7, "111"},
        {"%b", -6, "-110"},
+       {"%#b", 7, "0b111"},
+       {"%#b", -6, "-0b110"},
        {"%b", ^uint32(0), "11111111111111111111111111111111"},
        {"%b", ^uint64(0), "1111111111111111111111111111111111111111111111111111111111111111"},
        {"%b", int64(-1 << 63), zeroFill("-1", 63, "")},
        {"%o", 01234, "1234"},
+       {"%o", -01234, "-1234"},
        {"%#o", 01234, "01234"},
+       {"%#o", -01234, "-01234"},
+       {"%O", 01234, "0o1234"},
+       {"%O", -01234, "-0o1234"},
        {"%o", ^uint32(0), "37777777777"},
        {"%o", ^uint64(0), "1777777777777777777777"},
        {"%#X", 0, "0X0"},
@@ -413,6 +419,8 @@ var fmtTests = []struct {
        // floats
        {"%+.3e", 0.0, "+0.000e+00"},
        {"%+.3e", 1.0, "+1.000e+00"},
+       {"%+.3x", 0.0, "+0x0.000p+00"},
+       {"%+.3x", 1.0, "+0x1.000p+00"},
        {"%+.3f", -1.0, "-1.000"},
        {"%+.3F", -1.0, "-1.000"},
        {"%+.3F", float32(-1.0), "-1.000"},
@@ -428,6 +436,8 @@ var fmtTests = []struct {
        {"%+10.2f", -1.0, "     -1.00"},
        {"% .3E", -1.0, "-1.000E+00"},
        {"% .3e", 1.0, " 1.000e+00"},
+       {"% .3X", -1.0, "-0X1.000P+00"},
+       {"% .3x", 1.0, " 0x1.000p+00"},
        {"%+.3g", 0.0, "+0"},
        {"%+.3g", 1.0, "+1"},
        {"%+.3g", -1.0, "-1"},
@@ -445,17 +455,21 @@ var fmtTests = []struct {
        {"%#g", 1000000.0, "1.00000e+06"},
        {"%#.0f", 1.0, "1."},
        {"%#.0e", 1.0, "1.e+00"},
+       {"%#.0x", 1.0, "0x1.p+00"},
        {"%#.0g", 1.0, "1."},
        {"%#.0g", 1100000.0, "1.e+06"},
        {"%#.4f", 1.0, "1.0000"},
        {"%#.4e", 1.0, "1.0000e+00"},
+       {"%#.4x", 1.0, "0x1.0000p+00"},
        {"%#.4g", 1.0, "1.000"},
        {"%#.4g", 100000.0, "1.000e+05"},
        {"%#.0f", 123.0, "123."},
        {"%#.0e", 123.0, "1.e+02"},
+       {"%#.0x", 123.0, "0x1.p+07"},
        {"%#.0g", 123.0, "1.e+02"},
        {"%#.4f", 123.0, "123.0000"},
        {"%#.4e", 123.0, "1.2300e+02"},
+       {"%#.4x", 123.0, "0x1.ec00p+06"},
        {"%#.4g", 123.0, "123.0"},
        {"%#.4g", 123000.0, "1.230e+05"},
        {"%#9.4g", 1.0, "    1.000"},
@@ -474,17 +488,23 @@ var fmtTests = []struct {
        {"%20f", posInf, "                +Inf"},
        {"% 20F", posInf, "                 Inf"},
        {"% 20e", negInf, "                -Inf"},
+       {"% 20x", negInf, "                -Inf"},
        {"%+20E", negInf, "                -Inf"},
+       {"%+20X", negInf, "                -Inf"},
        {"% +20g", negInf, "                -Inf"},
        {"%+-20G", posInf, "+Inf                "},
        {"%20e", NaN, "                 NaN"},
+       {"%20x", NaN, "                 NaN"},
        {"% +20E", NaN, "                +NaN"},
+       {"% +20X", NaN, "                +NaN"},
        {"% -20g", NaN, " NaN                "},
        {"%+-20G", NaN, "+NaN                "},
        // Zero padding does not apply to infinities and NaN.
        {"%+020e", posInf, "                +Inf"},
+       {"%+020x", posInf, "                +Inf"},
        {"%-020f", negInf, "-Inf                "},
        {"%-020E", NaN, "NaN                 "},
+       {"%-020X", NaN, "NaN                 "},
 
        // complex values
        {"%.f", 0i, "(0+0i)"},
@@ -492,23 +512,29 @@ var fmtTests = []struct {
        {"%+.f", 0i, "(+0+0i)"},
        {"% +.f", 0i, "(+0+0i)"},
        {"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"},
+       {"%+.3x", 0i, "(+0x0.000p+00+0x0.000p+00i)"},
        {"%+.3f", 0i, "(+0.000+0.000i)"},
        {"%+.3g", 0i, "(+0+0i)"},
        {"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"},
+       {"%+.3x", 1 + 2i, "(+0x1.000p+00+0x1.000p+01i)"},
        {"%+.3f", 1 + 2i, "(+1.000+2.000i)"},
        {"%+.3g", 1 + 2i, "(+1+2i)"},
        {"%.3e", 0i, "(0.000e+00+0.000e+00i)"},
+       {"%.3x", 0i, "(0x0.000p+00+0x0.000p+00i)"},
        {"%.3f", 0i, "(0.000+0.000i)"},
        {"%.3F", 0i, "(0.000+0.000i)"},
        {"%.3F", complex64(0i), "(0.000+0.000i)"},
        {"%.3g", 0i, "(0+0i)"},
        {"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"},
+       {"%.3x", 1 + 2i, "(0x1.000p+00+0x1.000p+01i)"},
        {"%.3f", 1 + 2i, "(1.000+2.000i)"},
        {"%.3g", 1 + 2i, "(1+2i)"},
        {"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"},
+       {"%.3x", -1 - 2i, "(-0x1.000p+00-0x1.000p+01i)"},
        {"%.3f", -1 - 2i, "(-1.000-2.000i)"},
        {"%.3g", -1 - 2i, "(-1-2i)"},
        {"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"},
+       {"% .3X", -1 - 2i, "(-0X1.000P+00-0X1.000P+01i)"},
        {"%+.3g", 1 + 2i, "(+1+2i)"},
        {"%+.3g", complex64(1 + 2i), "(+1+2i)"},
        {"%#g", 1 + 2i, "(1.00000+2.00000i)"},
@@ -517,11 +543,13 @@ var fmtTests = []struct {
        {"%#g", -1e10 - 1.11e100i, "(-1.00000e+10-1.11000e+100i)"},
        {"%#.0f", 1.23 + 1.0i, "(1.+1.i)"},
        {"%#.0e", 1.23 + 1.0i, "(1.e+00+1.e+00i)"},
+       {"%#.0x", 1.23 + 1.0i, "(0x1.p+00+0x1.p+00i)"},
        {"%#.0g", 1.23 + 1.0i, "(1.+1.i)"},
        {"%#.0g", 0 + 100000i, "(0.+1.e+05i)"},
        {"%#.0g", 1230000 + 0i, "(1.e+06+0.i)"},
        {"%#.4f", 1 + 1.23i, "(1.0000+1.2300i)"},
        {"%#.4e", 123 + 1i, "(1.2300e+02+1.0000e+00i)"},
+       {"%#.4x", 123 + 1i, "(0x1.ec00p+06+0x1.0000p+00i)"},
        {"%#.4g", 123 + 1.23i, "(123.0+1.230i)"},
        {"%#12.5g", 0 + 100000i, "(      0.0000 +1.0000e+05i)"},
        {"%#12.5g", 1230000 - 0i, "(  1.2300e+06     +0.0000i)"},
@@ -541,7 +569,9 @@ var fmtTests = []struct {
        {"% f", complex(negInf, negInf), "(-Inf-Infi)"},
        {"% f", complex(NaN, NaN), "( NaN+NaNi)"},
        {"%8e", complex(posInf, posInf), "(    +Inf    +Infi)"},
+       {"%8x", complex(posInf, posInf), "(    +Inf    +Infi)"},
        {"% 8E", complex(posInf, posInf), "(     Inf    +Infi)"},
+       {"% 8X", complex(posInf, posInf), "(     Inf    +Infi)"},
        {"%+8f", complex(negInf, negInf), "(    -Inf    -Infi)"},
        {"% +8g", complex(negInf, negInf), "(    -Inf    -Infi)"},
        {"% -8G", complex(NaN, NaN), "( NaN    +NaN    i)"},
index d6da8aed1e3aad72b5c76f381c00333a0cb4f2a6..74e600cab262011d35026edfe492fb2b39206556 100644 (file)
@@ -89,17 +89,17 @@ func (f *fmt) writePadding(n int) {
 // pad appends b to f.buf, padded on left (!f.minus) or right (f.minus).
 func (f *fmt) pad(b []byte) {
        if !f.widPresent || f.wid == 0 {
-               f.buf.Write(b)
+               f.buf.write(b)
                return
        }
        width := f.wid - utf8.RuneCount(b)
        if !f.minus {
                // left padding
                f.writePadding(width)
-               f.buf.Write(b)
+               f.buf.write(b)
        } else {
                // right padding
-               f.buf.Write(b)
+               f.buf.write(b)
                f.writePadding(width)
        }
 }
@@ -107,17 +107,17 @@ func (f *fmt) pad(b []byte) {
 // padString appends s to f.buf, padded on left (!f.minus) or right (f.minus).
 func (f *fmt) padString(s string) {
        if !f.widPresent || f.wid == 0 {
-               f.buf.WriteString(s)
+               f.buf.writeString(s)
                return
        }
        width := f.wid - utf8.RuneCountInString(s)
        if !f.minus {
                // left padding
                f.writePadding(width)
-               f.buf.WriteString(s)
+               f.buf.writeString(s)
        } else {
                // right padding
-               f.buf.WriteString(s)
+               f.buf.writeString(s)
                f.writePadding(width)
        }
 }
@@ -191,7 +191,7 @@ func (f *fmt) fmtUnicode(u uint64) {
 }
 
 // fmtInteger formats signed and unsigned integers.
-func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) {
+func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, verb rune, digits string) {
        negative := isSigned && int64(u) < 0
        if negative {
                u = -u
@@ -275,6 +275,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) {
        // Various prefixes: 0x, -, etc.
        if f.sharp {
                switch base {
+               case 2:
+                       // Add a leading 0b.
+                       i--
+                       buf[i] = 'b'
+                       i--
+                       buf[i] = '0'
                case 8:
                        if buf[i] != '0' {
                                i--
@@ -288,6 +294,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) {
                        buf[i] = '0'
                }
        }
+       if verb == 'O' {
+               i--
+               buf[i] = 'o'
+               i--
+               buf[i] = '0'
+       }
 
        if negative {
                i--
@@ -510,7 +522,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
        if f.sharp && verb != 'b' {
                digits := 0
                switch verb {
-               case 'v', 'g', 'G':
+               case 'v', 'g', 'G', 'x':
                        digits = prec
                        // If no precision is set explicitly use a precision of 6.
                        if digits == -1 {
@@ -519,8 +531,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
                }
 
                // Buffer pre-allocated with enough room for
-               // exponent notations of the form "e+123".
-               var tailBuf [5]byte
+               // exponent notations of the form "e+123" or "p-1023".
+               var tailBuf [6]byte
                tail := tailBuf[:0]
 
                hasDecimalPoint := false
@@ -529,9 +541,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
                        switch num[i] {
                        case '.':
                                hasDecimalPoint = true
-                       case 'e', 'E':
+                       case 'p', 'P':
                                tail = append(tail, num[i:]...)
                                num = num[:i]
+                       case 'e', 'E':
+                               if verb != 'x' && verb != 'X' {
+                                       tail = append(tail, num[i:]...)
+                                       num = num[:i]
+                                       break
+                               }
+                               fallthrough
                        default:
                                digits--
                        }
@@ -550,9 +569,9 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
                // If we're zero padding to the left we want the sign before the leading zeros.
                // Achieve this by writing the sign out and then padding the unsigned number.
                if f.zero && f.widPresent && f.wid > len(num) {
-                       f.buf.WriteByte(num[0])
+                       f.buf.writeByte(num[0])
                        f.writePadding(f.wid - len(num))
-                       f.buf.Write(num[1:])
+                       f.buf.write(num[1:])
                        return
                }
                f.pad(num)
index 42fcd8b979b01e5f1cce657085621c7546636da7..595869140a1f9e619745274048182aca104cd0b7 100644 (file)
@@ -5,7 +5,6 @@
 package fmt
 
 import (
-       "errors"
        "internal/fmtsort"
        "io"
        "os"
@@ -75,19 +74,19 @@ type GoStringer interface {
 // Use simple []byte instead of bytes.Buffer to avoid large dependency.
 type buffer []byte
 
-func (b *buffer) Write(p []byte) {
+func (b *buffer) write(p []byte) {
        *b = append(*b, p...)
 }
 
-func (b *buffer) WriteString(s string) {
+func (b *buffer) writeString(s string) {
        *b = append(*b, s...)
 }
 
-func (b *buffer) WriteByte(c byte) {
+func (b *buffer) writeByte(c byte) {
        *b = append(*b, c)
 }
 
-func (bp *buffer) WriteRune(r rune) {
+func (bp *buffer) writeRune(r rune) {
        if r < utf8.RuneSelf {
                *bp = append(*bp, byte(r))
                return
@@ -123,6 +122,10 @@ type pp struct {
        panicking bool
        // erroring is set when printing an error string to guard against calling handleMethods.
        erroring bool
+       // wrapErrs is set when the format string may contain a %w verb.
+       wrapErrs bool
+       // wrappedErr records the target of the %w verb.
+       wrappedErr error
 }
 
 var ppFree = sync.Pool{
@@ -134,6 +137,7 @@ func newPrinter() *pp {
        p := ppFree.Get().(*pp)
        p.panicking = false
        p.erroring = false
+       p.wrapErrs = false
        p.fmt.init(&p.buf)
        return p
 }
@@ -153,6 +157,7 @@ func (p *pp) free() {
        p.buf = p.buf[:0]
        p.arg = nil
        p.value = reflect.Value{}
+       p.wrappedErr = nil
        ppFree.Put(p)
 }
 
@@ -179,14 +184,14 @@ func (p *pp) Flag(b int) bool {
 // Implement Write so we can call Fprintf on a pp (through State), for
 // recursive use in custom verbs.
 func (p *pp) Write(b []byte) (ret int, err error) {
-       p.buf.Write(b)
+       p.buf.write(b)
        return len(b), nil
 }
 
 // Implement WriteString so that we can call io.WriteString
 // on a pp (through state), for efficiency.
 func (p *pp) WriteString(s string) (ret int, err error) {
-       p.buf.WriteString(s)
+       p.buf.writeString(s)
        return len(s), nil
 }
 
@@ -217,12 +222,6 @@ func Sprintf(format string, a ...interface{}) string {
        return s
 }
 
-// Errorf formats according to a format specifier and returns the string
-// as a value that satisfies error.
-func Errorf(format string, a ...interface{}) error {
-       return errors.New(Sprintf(format, a...))
-}
-
 // These routines do not take a format string
 
 // Fprint formats using the default formats for its operands and writes to w.
@@ -320,32 +319,32 @@ func parsenum(s string, start, end int) (num int, isnum bool, newi int) {
 
 func (p *pp) unknownType(v reflect.Value) {
        if !v.IsValid() {
-               p.buf.WriteString(nilAngleString)
+               p.buf.writeString(nilAngleString)
                return
        }
-       p.buf.WriteByte('?')
-       p.buf.WriteString(v.Type().String())
-       p.buf.WriteByte('?')
+       p.buf.writeByte('?')
+       p.buf.writeString(v.Type().String())
+       p.buf.writeByte('?')
 }
 
 func (p *pp) badVerb(verb rune) {
        p.erroring = true
-       p.buf.WriteString(percentBangString)
-       p.buf.WriteRune(verb)
-       p.buf.WriteByte('(')
+       p.buf.writeString(percentBangString)
+       p.buf.writeRune(verb)
+       p.buf.writeByte('(')
        switch {
        case p.arg != nil:
-               p.buf.WriteString(reflect.TypeOf(p.arg).String())
-               p.buf.WriteByte('=')
+               p.buf.writeString(reflect.TypeOf(p.arg).String())
+               p.buf.writeByte('=')
                p.printArg(p.arg, 'v')
        case p.value.IsValid():
-               p.buf.WriteString(p.value.Type().String())
-               p.buf.WriteByte('=')
+               p.buf.writeString(p.value.Type().String())
+               p.buf.writeByte('=')
                p.printValue(p.value, 'v', 0)
        default:
-               p.buf.WriteString(nilAngleString)
+               p.buf.writeString(nilAngleString)
        }
-       p.buf.WriteByte(')')
+       p.buf.writeByte(')')
        p.erroring = false
 }
 
@@ -363,7 +362,7 @@ func (p *pp) fmtBool(v bool, verb rune) {
 func (p *pp) fmt0x64(v uint64, leading0x bool) {
        sharp := p.fmt.sharp
        p.fmt.sharp = leading0x
-       p.fmt.fmtInteger(v, 16, unsigned, ldigits)
+       p.fmt.fmtInteger(v, 16, unsigned, 'v', ldigits)
        p.fmt.sharp = sharp
 }
 
@@ -374,18 +373,18 @@ func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) {
                if p.fmt.sharpV && !isSigned {
                        p.fmt0x64(v, true)
                } else {
-                       p.fmt.fmtInteger(v, 10, isSigned, ldigits)
+                       p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits)
                }
        case 'd':
-               p.fmt.fmtInteger(v, 10, isSigned, ldigits)
+               p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits)
        case 'b':
-               p.fmt.fmtInteger(v, 2, isSigned, ldigits)
-       case 'o':
-               p.fmt.fmtInteger(v, 8, isSigned, ldigits)
+               p.fmt.fmtInteger(v, 2, isSigned, verb, ldigits)
+       case 'o', 'O':
+               p.fmt.fmtInteger(v, 8, isSigned, verb, ldigits)
        case 'x':
-               p.fmt.fmtInteger(v, 16, isSigned, ldigits)
+               p.fmt.fmtInteger(v, 16, isSigned, verb, ldigits)
        case 'X':
-               p.fmt.fmtInteger(v, 16, isSigned, udigits)
+               p.fmt.fmtInteger(v, 16, isSigned, verb, udigits)
        case 'c':
                p.fmt.fmtC(v)
        case 'q':
@@ -407,7 +406,7 @@ func (p *pp) fmtFloat(v float64, size int, verb rune) {
        switch verb {
        case 'v':
                p.fmt.fmtFloat(v, size, 'g', -1)
-       case 'b', 'g', 'G':
+       case 'b', 'g', 'G', 'x', 'X':
                p.fmt.fmtFloat(v, size, verb, -1)
        case 'f', 'e', 'E':
                p.fmt.fmtFloat(v, size, verb, 6)
@@ -425,14 +424,14 @@ func (p *pp) fmtComplex(v complex128, size int, verb rune) {
        // Make sure any unsupported verbs are found before the
        // calls to fmtFloat to not generate an incorrect error string.
        switch verb {
-       case 'v', 'b', 'g', 'G', 'f', 'F', 'e', 'E':
+       case 'v', 'b', 'g', 'G', 'x', 'X', 'f', 'F', 'e', 'E':
                oldPlus := p.fmt.plus
-               p.buf.WriteByte('(')
+               p.buf.writeByte('(')
                p.fmtFloat(real(v), size/2, verb)
                // Imaginary part always has a sign.
                p.fmt.plus = true
                p.fmtFloat(imag(v), size/2, verb)
-               p.buf.WriteString("i)")
+               p.buf.writeString("i)")
                p.fmt.plus = oldPlus
        default:
                p.badVerb(verb)
@@ -464,28 +463,28 @@ func (p *pp) fmtBytes(v []byte, verb rune, typeString string) {
        switch verb {
        case 'v', 'd':
                if p.fmt.sharpV {
-                       p.buf.WriteString(typeString)
+                       p.buf.writeString(typeString)
                        if v == nil {
-                               p.buf.WriteString(nilParenString)
+                               p.buf.writeString(nilParenString)
                                return
                        }
-                       p.buf.WriteByte('{')
+                       p.buf.writeByte('{')
                        for i, c := range v {
                                if i > 0 {
-                                       p.buf.WriteString(commaSpaceString)
+                                       p.buf.writeString(commaSpaceString)
                                }
                                p.fmt0x64(uint64(c), true)
                        }
-                       p.buf.WriteByte('}')
+                       p.buf.writeByte('}')
                } else {
-                       p.buf.WriteByte('[')
+                       p.buf.writeByte('[')
                        for i, c := range v {
                                if i > 0 {
-                                       p.buf.WriteByte(' ')
+                                       p.buf.writeByte(' ')
                                }
-                               p.fmt.fmtInteger(uint64(c), 10, unsigned, ldigits)
+                               p.fmt.fmtInteger(uint64(c), 10, unsigned, verb, ldigits)
                        }
-                       p.buf.WriteByte(']')
+                       p.buf.writeByte(']')
                }
        case 's':
                p.fmt.fmtBs(v)
@@ -513,15 +512,15 @@ func (p *pp) fmtPointer(value reflect.Value, verb rune) {
        switch verb {
        case 'v':
                if p.fmt.sharpV {
-                       p.buf.WriteByte('(')
-                       p.buf.WriteString(value.Type().String())
-                       p.buf.WriteString(")(")
+                       p.buf.writeByte('(')
+                       p.buf.writeString(value.Type().String())
+                       p.buf.writeString(")(")
                        if u == 0 {
-                               p.buf.WriteString(nilString)
+                               p.buf.writeString(nilString)
                        } else {
                                p.fmt0x64(uint64(u), true)
                        }
-                       p.buf.WriteByte(')')
+                       p.buf.writeByte(')')
                } else {
                        if u == 0 {
                                p.fmt.padString(nilAngleString)
@@ -544,7 +543,7 @@ func (p *pp) catchPanic(arg interface{}, verb rune, method string) {
                // Stringer that fails to guard against nil or a nil pointer for a
                // value receiver, and in either case, "<nil>" is a nice result.
                if v := reflect.ValueOf(arg); v.Kind() == reflect.Ptr && v.IsNil() {
-                       p.buf.WriteString(nilAngleString)
+                       p.buf.writeString(nilAngleString)
                        return
                }
                // Otherwise print a concise panic message. Most of the time the panic
@@ -558,15 +557,15 @@ func (p *pp) catchPanic(arg interface{}, verb rune, method string) {
                // For this output we want default behavior.
                p.fmt.clearflags()
 
-               p.buf.WriteString(percentBangString)
-               p.buf.WriteRune(verb)
-               p.buf.WriteString(panicString)
-               p.buf.WriteString(method)
-               p.buf.WriteString(" method: ")
+               p.buf.writeString(percentBangString)
+               p.buf.writeRune(verb)
+               p.buf.writeString(panicString)
+               p.buf.writeString(method)
+               p.buf.writeString(" method: ")
                p.panicking = true
                p.printArg(err, 'v')
                p.panicking = false
-               p.buf.WriteByte(')')
+               p.buf.writeByte(')')
 
                p.fmt.fmtFlags = oldFlags
        }
@@ -576,6 +575,21 @@ func (p *pp) handleMethods(verb rune) (handled bool) {
        if p.erroring {
                return
        }
+       if verb == 'w' {
+               // It is invalid to use %w other than with Errorf, more than once,
+               // or with a non-error arg.
+               err, ok := p.arg.(error)
+               if !ok || !p.wrapErrs || p.wrappedErr != nil {
+                       p.wrappedErr = nil
+                       p.wrapErrs = false
+                       p.badVerb(verb)
+                       return true
+               }
+               p.wrappedErr = err
+               // If the arg is a Formatter, pass 'v' as the verb to it.
+               verb = 'v'
+       }
+
        // Is it a Formatter?
        if formatter, ok := p.arg.(Formatter); ok {
                handled = true
@@ -720,11 +734,11 @@ func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
        switch f := value; value.Kind() {
        case reflect.Invalid:
                if depth == 0 {
-                       p.buf.WriteString(invReflectString)
+                       p.buf.writeString(invReflectString)
                } else {
                        switch verb {
                        case 'v':
-                               p.buf.WriteString(nilAngleString)
+                               p.buf.writeString(nilAngleString)
                        default:
                                p.badVerb(verb)
                        }
@@ -747,63 +761,63 @@ func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
                p.fmtString(f.String(), verb)
        case reflect.Map:
                if p.fmt.sharpV {
-                       p.buf.WriteString(f.Type().String())
+                       p.buf.writeString(f.Type().String())
                        if f.IsNil() {
-                               p.buf.WriteString(nilParenString)
+                               p.buf.writeString(nilParenString)
                                return
                        }
-                       p.buf.WriteByte('{')
+                       p.buf.writeByte('{')
                } else {
-                       p.buf.WriteString(mapString)
+                       p.buf.writeString(mapString)
                }
                sorted := fmtsort.Sort(f)
                for i, key := range sorted.Key {
                        if i > 0 {
                                if p.fmt.sharpV {
-                                       p.buf.WriteString(commaSpaceString)
+                                       p.buf.writeString(commaSpaceString)
                                } else {
-                                       p.buf.WriteByte(' ')
+                                       p.buf.writeByte(' ')
                                }
                        }
                        p.printValue(key, verb, depth+1)
-                       p.buf.WriteByte(':')
+                       p.buf.writeByte(':')
                        p.printValue(sorted.Value[i], verb, depth+1)
                }
                if p.fmt.sharpV {
-                       p.buf.WriteByte('}')
+                       p.buf.writeByte('}')
                } else {
-                       p.buf.WriteByte(']')
+                       p.buf.writeByte(']')
                }
        case reflect.Struct:
                if p.fmt.sharpV {
-                       p.buf.WriteString(f.Type().String())
+                       p.buf.writeString(f.Type().String())
                }
-               p.buf.WriteByte('{')
+               p.buf.writeByte('{')
                for i := 0; i < f.NumField(); i++ {
                        if i > 0 {
                                if p.fmt.sharpV {
-                                       p.buf.WriteString(commaSpaceString)
+                                       p.buf.writeString(commaSpaceString)
                                } else {
-                                       p.buf.WriteByte(' ')
+                                       p.buf.writeByte(' ')
                                }
                        }
                        if p.fmt.plusV || p.fmt.sharpV {
                                if name := f.Type().Field(i).Name; name != "" {
-                                       p.buf.WriteString(name)
-                                       p.buf.WriteByte(':')
+                                       p.buf.writeString(name)
+                                       p.buf.writeByte(':')
                                }
                        }
                        p.printValue(getField(f, i), verb, depth+1)
                }
-               p.buf.WriteByte('}')
+               p.buf.writeByte('}')
        case reflect.Interface:
                value := f.Elem()
                if !value.IsValid() {
                        if p.fmt.sharpV {
-                               p.buf.WriteString(f.Type().String())
-                               p.buf.WriteString(nilParenString)
+                               p.buf.writeString(f.Type().String())
+                               p.buf.writeString(nilParenString)
                        } else {
-                               p.buf.WriteString(nilAngleString)
+                               p.buf.writeString(nilAngleString)
                        }
                } else {
                        p.printValue(value, verb, depth+1)
@@ -833,28 +847,28 @@ func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
                        }
                }
                if p.fmt.sharpV {
-                       p.buf.WriteString(f.Type().String())
+                       p.buf.writeString(f.Type().String())
                        if f.Kind() == reflect.Slice && f.IsNil() {
-                               p.buf.WriteString(nilParenString)
+                               p.buf.writeString(nilParenString)
                                return
                        }
-                       p.buf.WriteByte('{')
+                       p.buf.writeByte('{')
                        for i := 0; i < f.Len(); i++ {
                                if i > 0 {
-                                       p.buf.WriteString(commaSpaceString)
+                                       p.buf.writeString(commaSpaceString)
                                }
                                p.printValue(f.Index(i), verb, depth+1)
                        }
-                       p.buf.WriteByte('}')
+                       p.buf.writeByte('}')
                } else {
-                       p.buf.WriteByte('[')
+                       p.buf.writeByte('[')
                        for i := 0; i < f.Len(); i++ {
                                if i > 0 {
-                                       p.buf.WriteByte(' ')
+                                       p.buf.writeByte(' ')
                                }
                                p.printValue(f.Index(i), verb, depth+1)
                        }
-                       p.buf.WriteByte(']')
+                       p.buf.writeByte(']')
                }
        case reflect.Ptr:
                // pointer to array or slice or struct? ok at top level
@@ -862,7 +876,7 @@ func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
                if depth == 0 && f.Pointer() != 0 {
                        switch a := f.Elem(); a.Kind() {
                        case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:
-                               p.buf.WriteByte('&')
+                               p.buf.writeByte('&')
                                p.printValue(a, verb, depth+1)
                                return
                        }
@@ -950,15 +964,15 @@ func (p *pp) argNumber(argNum int, format string, i int, numArgs int) (newArgNum
 }
 
 func (p *pp) badArgNum(verb rune) {
-       p.buf.WriteString(percentBangString)
-       p.buf.WriteRune(verb)
-       p.buf.WriteString(badIndexString)
+       p.buf.writeString(percentBangString)
+       p.buf.writeRune(verb)
+       p.buf.writeString(badIndexString)
 }
 
 func (p *pp) missingArg(verb rune) {
-       p.buf.WriteString(percentBangString)
-       p.buf.WriteRune(verb)
-       p.buf.WriteString(missingString)
+       p.buf.writeString(percentBangString)
+       p.buf.writeRune(verb)
+       p.buf.writeString(missingString)
 }
 
 func (p *pp) doPrintf(format string, a []interface{}) {
@@ -974,7 +988,7 @@ formatLoop:
                        i++
                }
                if i > lasti {
-                       p.buf.WriteString(format[lasti:i])
+                       p.buf.writeString(format[lasti:i])
                }
                if i >= end {
                        // done processing format string
@@ -1032,7 +1046,7 @@ formatLoop:
                        p.fmt.wid, p.fmt.widPresent, argNum = intFromArg(a, argNum)
 
                        if !p.fmt.widPresent {
-                               p.buf.WriteString(badWidthString)
+                               p.buf.writeString(badWidthString)
                        }
 
                        // We have a negative width, so take its value and ensure
@@ -1066,7 +1080,7 @@ formatLoop:
                                        p.fmt.precPresent = false
                                }
                                if !p.fmt.precPresent {
-                                       p.buf.WriteString(badPrecString)
+                                       p.buf.writeString(badPrecString)
                                }
                                afterIndex = false
                        } else {
@@ -1083,7 +1097,7 @@ formatLoop:
                }
 
                if i >= end {
-                       p.buf.WriteString(noVerbString)
+                       p.buf.writeString(noVerbString)
                        break
                }
 
@@ -1095,7 +1109,7 @@ formatLoop:
 
                switch {
                case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec.
-                       p.buf.WriteByte('%')
+                       p.buf.writeByte('%')
                case !p.goodArgNum:
                        p.badArgNum(verb)
                case argNum >= len(a): // No argument left over to print for the current verb.
@@ -1119,20 +1133,20 @@ formatLoop:
        // been used and arguably OK if they're not.
        if !p.reordered && argNum < len(a) {
                p.fmt.clearflags()
-               p.buf.WriteString(extraString)
+               p.buf.writeString(extraString)
                for i, arg := range a[argNum:] {
                        if i > 0 {
-                               p.buf.WriteString(commaSpaceString)
+                               p.buf.writeString(commaSpaceString)
                        }
                        if arg == nil {
-                               p.buf.WriteString(nilAngleString)
+                               p.buf.writeString(nilAngleString)
                        } else {
-                               p.buf.WriteString(reflect.TypeOf(arg).String())
-                               p.buf.WriteByte('=')
+                               p.buf.writeString(reflect.TypeOf(arg).String())
+                               p.buf.writeByte('=')
                                p.printArg(arg, 'v')
                        }
                }
-               p.buf.WriteByte(')')
+               p.buf.writeByte(')')
        }
 }
 
@@ -1142,7 +1156,7 @@ func (p *pp) doPrint(a []interface{}) {
                isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String
                // Add a space between two non-string arguments.
                if argNum > 0 && !isString && !prevString {
-                       p.buf.WriteByte(' ')
+                       p.buf.writeByte(' ')
                }
                p.printArg(arg, 'v')
                prevString = isString
@@ -1154,9 +1168,9 @@ func (p *pp) doPrint(a []interface{}) {
 func (p *pp) doPrintln(a []interface{}) {
        for argNum, arg := range a {
                if argNum > 0 {
-                       p.buf.WriteByte(' ')
+                       p.buf.writeByte(' ')
                }
                p.printArg(arg, 'v')
        }
-       p.buf.WriteByte('\n')
+       p.buf.writeByte('\n')
 }
index ae79e39deeae72614c7349c7ffb383b6c905b9e3..74ada20de7a7cf66b91996cbf0318b9aaf703853 100644 (file)
@@ -457,7 +457,7 @@ func (s *ss) token(skipSpace bool, f func(rune) bool) []byte {
                        s.UnreadRune()
                        break
                }
-               s.buf.WriteRune(r)
+               s.buf.writeRune(r)
        }
        return s.buf
 }
@@ -483,7 +483,7 @@ func (s *ss) consume(ok string, accept bool) bool {
        }
        if indexRune(ok, r) >= 0 {
                if accept {
-                       s.buf.WriteRune(r)
+                       s.buf.writeRune(r)
                }
                return true
        }
@@ -562,7 +562,7 @@ const (
        hexadecimalDigits = "0123456789aAbBcCdDeEfF"
        sign              = "+-"
        period            = "."
-       exponent          = "eEp"
+       exponent          = "eEpP"
 )
 
 // getBase returns the numeric base represented by the verb and its digit string.
@@ -609,22 +609,28 @@ func (s *ss) scanRune(bitSize int) int64 {
        return r
 }
 
-// scanBasePrefix reports whether the integer begins with a 0 or 0x,
+// scanBasePrefix reports whether the integer begins with a bas prefix
 // and returns the base, digit string, and whether a zero was found.
 // It is called only if the verb is %v.
-func (s *ss) scanBasePrefix() (base int, digits string, found bool) {
+func (s *ss) scanBasePrefix() (base int, digits string, zeroFound bool) {
        if !s.peek("0") {
-               return 10, decimalDigits, false
+               return 0, decimalDigits + "_", false
        }
        s.accept("0")
-       found = true // We've put a digit into the token buffer.
-       // Special cases for '0' && '0x'
-       base, digits = 8, octalDigits
-       if s.peek("xX") {
-               s.consume("xX", false)
-               base, digits = 16, hexadecimalDigits
+       // Special cases for 0, 0b, 0o, 0x.
+       switch {
+       case s.peek("bB"):
+               s.consume("bB", true)
+               return 0, binaryDigits + "_", true
+       case s.peek("oO"):
+               s.consume("oO", true)
+               return 0, octalDigits + "_", true
+       case s.peek("xX"):
+               s.consume("xX", true)
+               return 0, hexadecimalDigits + "_", true
+       default:
+               return 0, octalDigits + "_", true
        }
-       return
 }
 
 // scanInt returns the value of the integer represented by the next
@@ -705,21 +711,27 @@ func (s *ss) floatToken() string {
        if s.accept("iI") && s.accept("nN") && s.accept("fF") {
                return string(s.buf)
        }
+       digits := decimalDigits + "_"
+       exp := exponent
+       if s.accept("0") && s.accept("xX") {
+               digits = hexadecimalDigits + "_"
+               exp = "pP"
+       }
        // digits?
-       for s.accept(decimalDigits) {
+       for s.accept(digits) {
        }
        // decimal point?
        if s.accept(period) {
                // fraction?
-               for s.accept(decimalDigits) {
+               for s.accept(digits) {
                }
        }
        // exponent?
-       if s.accept(exponent) {
+       if s.accept(exp) {
                // leading sign?
                s.accept(sign)
                // digits?
-               for s.accept(decimalDigits) {
+               for s.accept(decimalDigits + "_") {
                }
        }
        return string(s.buf)
@@ -749,9 +761,21 @@ func (s *ss) complexTokens() (real, imag string) {
        return real, imagSign + imag
 }
 
+func hasX(s string) bool {
+       for i := 0; i < len(s); i++ {
+               if s[i] == 'x' || s[i] == 'X' {
+                       return true
+               }
+       }
+       return false
+}
+
 // convertFloat converts the string to a float64value.
 func (s *ss) convertFloat(str string, n int) float64 {
-       if p := indexRune(str, 'p'); p >= 0 {
+       // strconv.ParseFloat will handle "+0x1.fp+2",
+       // but we have to implement our non-standard
+       // decimal+binary exponent mix (1.2p4) ourselves.
+       if p := indexRune(str, 'p'); p >= 0 && !hasX(str) {
                // Atof doesn't handle power-of-2 exponents,
                // but they're easy to evaluate.
                f, err := strconv.ParseFloat(str[:p], n)
@@ -826,20 +850,20 @@ func (s *ss) quotedString() string {
                        if r == quote {
                                break
                        }
-                       s.buf.WriteRune(r)
+                       s.buf.writeRune(r)
                }
                return string(s.buf)
        case '"':
                // Double-quoted: Include the quotes and let strconv.Unquote do the backslash escapes.
-               s.buf.WriteByte('"')
+               s.buf.writeByte('"')
                for {
                        r := s.mustReadRune()
-                       s.buf.WriteRune(r)
+                       s.buf.writeRune(r)
                        if r == '\\' {
                                // In a legal backslash escape, no matter how long, only the character
                                // immediately after the escape can itself be a backslash or quote.
                                // Thus we only need to protect the first character after the backslash.
-                               s.buf.WriteRune(s.mustReadRune())
+                               s.buf.writeRune(s.mustReadRune())
                        } else if r == '"' {
                                break
                        }
@@ -898,7 +922,7 @@ func (s *ss) hexString() string {
                if !ok {
                        break
                }
-               s.buf.WriteByte(b)
+               s.buf.writeByte(b)
        }
        if len(s.buf) == 0 {
                s.errorString("no hex data for %x string")
index d7019d943942c7d297d6f80eff1372479e3140f8..b14a6f5deb7aa863f9befcfa06964e6ba7124d74 100644 (file)
@@ -124,12 +124,18 @@ var scanTests = []ScanTest{
        {"T\n", &boolVal, true},  // boolean test vals toggle to be sure they are written
        {"F\n", &boolVal, false}, // restored to zero value
        {"21\n", &intVal, 21},
+       {"2_1\n", &intVal, 21},
        {"0\n", &intVal, 0},
        {"000\n", &intVal, 0},
        {"0x10\n", &intVal, 0x10},
+       {"0x_1_0\n", &intVal, 0x10},
        {"-0x10\n", &intVal, -0x10},
        {"0377\n", &intVal, 0377},
+       {"0_3_7_7\n", &intVal, 0377},
+       {"0o377\n", &intVal, 0377},
+       {"0o_3_7_7\n", &intVal, 0377},
        {"-0377\n", &intVal, -0377},
+       {"-0o377\n", &intVal, -0377},
        {"0\n", &uintVal, uint(0)},
        {"000\n", &uintVal, uint(0)},
        {"0x10\n", &uintVal, uint(0x10)},
@@ -163,13 +169,20 @@ var scanTests = []ScanTest{
        {"2.3e2\n", &float64Val, 2.3e2},
        {"2.3p2\n", &float64Val, 2.3 * 4},
        {"2.3p+2\n", &float64Val, 2.3 * 4},
-       {"2.3p+66\n", &float64Val, 2.3 * (1 << 32) * (1 << 32) * 4},
-       {"2.3p-66\n", &float64Val, 2.3 / ((1 << 32) * (1 << 32) * 4)},
+       {"2.3p+66\n", &float64Val, 2.3 * (1 << 66)},
+       {"2.3p-66\n", &float64Val, 2.3 / (1 << 66)},
+       {"0x2.3p-66\n", &float64Val, float64(0x23) / (1 << 70)},
+       {"2_3.4_5\n", &float64Val, 23.45},
        {"2.35\n", &stringVal, "2.35"},
        {"2345678\n", &bytesVal, []byte("2345678")},
        {"(3.4e1-2i)\n", &complex128Val, 3.4e1 - 2i},
        {"-3.45e1-3i\n", &complex64Val, complex64(-3.45e1 - 3i)},
        {"-.45e1-1e2i\n", &complex128Val, complex128(-.45e1 - 100i)},
+       {"-.4_5e1-1E2i\n", &complex128Val, complex128(-.45e1 - 100i)},
+       {"0x1.0p1+0x1.0P2i\n", &complex128Val, complex128(2 + 4i)},
+       {"-0x1p1-0x1p2i\n", &complex128Val, complex128(-2 - 4i)},
+       {"-0x1ep-1-0x1p2i\n", &complex128Val, complex128(-15 - 4i)},
+       {"-0x1_Ep-1-0x1p0_2i\n", &complex128Val, complex128(-15 - 4i)},
        {"hello\n", &stringVal, "hello"},
 
        // Carriage-return followed by newline. (We treat \r\n as \n always.)
@@ -207,8 +220,15 @@ var scanfTests = []ScanfTest{
        {"%v", "TRUE\n", &boolVal, true},
        {"%t", "false\n", &boolVal, false},
        {"%v", "-71\n", &intVal, -71},
+       {"%v", "-7_1\n", &intVal, -71},
+       {"%v", "0b111\n", &intVal, 7},
+       {"%v", "0b_1_1_1\n", &intVal, 7},
        {"%v", "0377\n", &intVal, 0377},
+       {"%v", "0_3_7_7\n", &intVal, 0377},
+       {"%v", "0o377\n", &intVal, 0377},
+       {"%v", "0o_3_7_7\n", &intVal, 0377},
        {"%v", "0x44\n", &intVal, 0x44},
+       {"%v", "0x_4_4\n", &intVal, 0x44},
        {"%d", "72\n", &intVal, 72},
        {"%c", "a\n", &runeVal, 'a'},
        {"%c", "\u5072\n", &runeVal, '\u5072'},
@@ -222,17 +242,31 @@ var scanfTests = []ScanfTest{
        {"%x", "a75\n", &intVal, 0xa75},
        {"%v", "71\n", &uintVal, uint(71)},
        {"%d", "72\n", &uintVal, uint(72)},
+       {"%d", "7_2\n", &uintVal, uint(7)}, // only %v takes underscores
        {"%d", "73\n", &uint8Val, uint8(73)},
        {"%d", "74\n", &uint16Val, uint16(74)},
        {"%d", "75\n", &uint32Val, uint32(75)},
        {"%d", "76\n", &uint64Val, uint64(76)},
        {"%b", "1001001\n", &uintVal, uint(73)},
+       {"%b", "100_1001\n", &uintVal, uint(4)},
        {"%o", "075\n", &uintVal, uint(075)},
+       {"%o", "07_5\n", &uintVal, uint(07)}, // only %v takes underscores
        {"%x", "a75\n", &uintVal, uint(0xa75)},
        {"%x", "A75\n", &uintVal, uint(0xa75)},
+       {"%x", "A7_5\n", &uintVal, uint(0xa7)}, // only %v takes underscores
        {"%U", "U+1234\n", &intVal, int(0x1234)},
        {"%U", "U+4567\n", &uintVal, uint(0x4567)},
 
+       {"%e", "2.3\n", &float64Val, 2.3},
+       {"%E", "2.3e1\n", &float32Val, float32(2.3e1)},
+       {"%f", "2.3e2\n", &float64Val, 2.3e2},
+       {"%g", "2.3p2\n", &float64Val, 2.3 * 4},
+       {"%G", "2.3p+2\n", &float64Val, 2.3 * 4},
+       {"%v", "2.3p+66\n", &float64Val, 2.3 * (1 << 66)},
+       {"%f", "2.3p-66\n", &float64Val, 2.3 / (1 << 66)},
+       {"%G", "0x2.3p-66\n", &float64Val, float64(0x23) / (1 << 70)},
+       {"%E", "2_3.4_5\n", &float64Val, 23.45},
+
        // Strings
        {"%s", "using-%s\n", &stringVal, "using-%s"},
        {"%x", "7573696e672d2578\n", &stringVal, "using-%x"},
index fd109507b8b73f7feba5ff7ebe8e1e1e8a67ad84..d8f6f668cc47e97d8e96158f6548319754c97e55 100644 (file)
@@ -10,8 +10,6 @@ package ast
 import (
        "go/token"
        "strings"
-       "unicode"
-       "unicode/utf8"
 )
 
 // ----------------------------------------------------------------------------
@@ -523,18 +521,13 @@ func (*ChanType) exprNode()      {}
 //
 func NewIdent(name string) *Ident { return &Ident{token.NoPos, name, nil} }
 
-// IsExported reports whether name is an exported Go symbol
-// (that is, whether it begins with an upper-case letter).
+// IsExported reports whether name starts with an upper-case letter.
 //
-func IsExported(name string) bool {
-       ch, _ := utf8.DecodeRuneInString(name)
-       return unicode.IsUpper(ch)
-}
+func IsExported(name string) bool { return token.IsExported(name) }
 
-// IsExported reports whether id is an exported Go symbol
-// (that is, whether it begins with an uppercase letter).
+// IsExported reports whether id starts with an upper-case letter.
 //
-func (id *Ident) IsExported() bool { return IsExported(id.Name) }
+func (id *Ident) IsExported() bool { return token.IsExported(id.Name) }
 
 func (id *Ident) String() string {
        if id != nil {
index be23c7fc43207f87af33626b9b676a6450736a66..7102884c8596444653bd35972c6e6fa737eaba1f 100644 (file)
@@ -30,7 +30,7 @@ func SortImports(fset *token.FileSet, f *File) {
                i := 0
                specs := d.Specs[:0]
                for j, s := range d.Specs {
-                       if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
+                       if j > i && lineAt(fset, s.Pos()) > 1+lineAt(fset, d.Specs[j-1].End()) {
                                // j begins a new run. End this one.
                                specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)
                                i = j
@@ -42,8 +42,8 @@ func SortImports(fset *token.FileSet, f *File) {
                // Deduping can leave a blank line before the rparen; clean that up.
                if len(d.Specs) > 0 {
                        lastSpec := d.Specs[len(d.Specs)-1]
-                       lastLine := fset.Position(lastSpec.Pos()).Line
-                       rParenLine := fset.Position(d.Rparen).Line
+                       lastLine := lineAt(fset, lastSpec.Pos())
+                       rParenLine := lineAt(fset, d.Rparen)
                        for rParenLine > lastLine+1 {
                                rParenLine--
                                fset.File(d.Rparen).MergeLine(rParenLine)
@@ -52,6 +52,10 @@ func SortImports(fset *token.FileSet, f *File) {
        }
 }
 
+func lineAt(fset *token.FileSet, pos token.Pos) int {
+       return fset.PositionFor(pos, false).Line
+}
+
 func importPath(s Spec) string {
        t, err := strconv.Unquote(s.(*ImportSpec).Path.Value)
        if err == nil {
@@ -89,6 +93,11 @@ type posSpan struct {
        End   token.Pos
 }
 
+type cgPos struct {
+       left bool // true if comment is to the left of the spec, false otherwise.
+       cg   *CommentGroup
+}
+
 func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
        // Can't short-circuit here even if specs are already sorted,
        // since they might yet need deduplication.
@@ -104,39 +113,57 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
        }
 
        // Identify comments in this range.
-       // Any comment from pos[0].Start to the final line counts.
-       lastLine := fset.Position(pos[len(pos)-1].End).Line
-       cstart := len(f.Comments)
-       cend := len(f.Comments)
+       begSpecs := pos[0].Start
+       endSpecs := pos[len(pos)-1].End
+       beg := fset.File(begSpecs).LineStart(lineAt(fset, begSpecs))
+       end := fset.File(endSpecs).LineStart(lineAt(fset, endSpecs) + 1) // beginning of next line
+       first := len(f.Comments)
+       last := -1
        for i, g := range f.Comments {
-               if g.Pos() < pos[0].Start {
-                       continue
-               }
-               if i < cstart {
-                       cstart = i
-               }
-               if fset.Position(g.End()).Line > lastLine {
-                       cend = i
+               if g.End() >= end {
                        break
                }
+               // g.End() < end
+               if beg <= g.Pos() {
+                       // comment is within the range [beg, end[ of import declarations
+                       if i < first {
+                               first = i
+                       }
+                       if i > last {
+                               last = i
+                       }
+               }
        }
-       comments := f.Comments[cstart:cend]
 
-       // Assign each comment to the import spec preceding it.
-       importComments := map[*ImportSpec][]*CommentGroup{}
+       var comments []*CommentGroup
+       if last >= 0 {
+               comments = f.Comments[first : last+1]
+       }
+
+       // Assign each comment to the import spec on the same line.
+       importComments := map[*ImportSpec][]cgPos{}
        specIndex := 0
        for _, g := range comments {
                for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
                        specIndex++
                }
+               var left bool
+               // A block comment can appear before the first import spec.
+               if specIndex == 0 && pos[specIndex].Start > g.Pos() {
+                       left = true
+               } else if specIndex+1 < len(specs) && // Or it can appear on the left of an import spec.
+                       lineAt(fset, pos[specIndex].Start)+1 == lineAt(fset, g.Pos()) {
+                       specIndex++
+                       left = true
+               }
                s := specs[specIndex].(*ImportSpec)
-               importComments[s] = append(importComments[s], g)
+               importComments[s] = append(importComments[s], cgPos{left: left, cg: g})
        }
 
        // Sort the import specs by import path.
        // Remove duplicates, when possible without data loss.
        // Reassign the import paths to have the same position sequence.
-       // Reassign each comment to abut the end of its spec.
+       // Reassign each comment to the spec on the same line.
        // Sort the comments by new position.
        sort.Slice(specs, func(i, j int) bool {
                ipath := importPath(specs[i])
@@ -160,7 +187,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
                        deduped = append(deduped, s)
                } else {
                        p := s.Pos()
-                       fset.File(p).MergeLine(fset.Position(p).Line)
+                       fset.File(p).MergeLine(lineAt(fset, p))
                }
        }
        specs = deduped
@@ -174,8 +201,16 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
                s.Path.ValuePos = pos[i].Start
                s.EndPos = pos[i].End
                for _, g := range importComments[s] {
-                       for _, c := range g.List {
-                               c.Slash = pos[i].End
+                       for _, c := range g.cg.List {
+                               if g.left {
+                                       c.Slash = pos[i].Start - 1
+                               } else {
+                                       // An import spec can have both block comment and a line comment
+                                       // to its right. In that case, both of them will have the same pos.
+                                       // But while formatting the AST, the line comment gets moved to
+                                       // after the block comment.
+                                       c.Slash = pos[i].End
+                               }
                        }
                }
        }
index 84c26d9074b58774d9197ba2e11005f565a25204..f108540233f973f2b208c54beced02f3406a72a7 100644 (file)
@@ -13,6 +13,7 @@ import (
        "go/parser"
        "go/token"
        "internal/goroot"
+       "internal/goversion"
        "io"
        "io/ioutil"
        "log"
@@ -292,15 +293,14 @@ func defaultContext() Context {
        c.GOPATH = envOr("GOPATH", defaultGOPATH())
        c.Compiler = runtime.Compiler
 
-       // Each major Go release in the Go 1.x series should add a tag here.
-       // Old tags should not be removed. That is, the go1.x tag is present
-       // in all releases >= Go 1.x. Code that requires Go 1.x or later should
-       // say "+build go1.x", and code that should only be built before Go 1.x
-       // (perhaps it is the stub to use in that case) should say "+build !go1.x".
-       // NOTE: If you add to this list, also update the doc comment in doc.go.
-       // NOTE: The last element in ReleaseTags should be the current release.
-       const version = 12 // go1.12
-       for i := 1; i <= version; i++ {
+       // Each major Go release in the Go 1.x series adds a new
+       // "go1.x" release tag. That is, the go1.x tag is present in
+       // all releases >= Go 1.x. Code that requires Go 1.x or later
+       // should say "+build go1.x", and code that should only be
+       // built before Go 1.x (perhaps it is the stub to use in that
+       // case) should say "+build !go1.x".
+       // The last element in ReleaseTags is the current release.
+       for i := 1; i <= goversion.Version; i++ {
                c.ReleaseTags = append(c.ReleaseTags, "go1."+strconv.Itoa(i))
        }
 
@@ -649,18 +649,28 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa
 
                // Determine directory from import path.
                if ctxt.GOROOT != "" {
-                       dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
-                       if ctxt.Compiler != "gccgo" {
-                               isDir := ctxt.isDir(dir)
-                               binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga))
-                               if isDir || binaryOnly {
-                                       p.Dir = dir
-                                       p.Goroot = true
-                                       p.Root = ctxt.GOROOT
-                                       goto Found
+                       // If the package path starts with "vendor/", only search GOROOT before
+                       // GOPATH if the importer is also within GOROOT. That way, if the user has
+                       // vendored in a package that is subsequently included in the standard
+                       // distribution, they'll continue to pick up their own vendored copy.
+                       gorootFirst := srcDir == "" || !strings.HasPrefix(path, "vendor/")
+                       if !gorootFirst {
+                               _, gorootFirst = ctxt.hasSubdir(ctxt.GOROOT, srcDir)
+                       }
+                       if gorootFirst {
+                               dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
+                               if ctxt.Compiler != "gccgo" {
+                                       isDir := ctxt.isDir(dir)
+                                       binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga))
+                                       if isDir || binaryOnly {
+                                               p.Dir = dir
+                                               p.Goroot = true
+                                               p.Root = ctxt.GOROOT
+                                               goto Found
+                                       }
                                }
+                               tried.goroot = dir
                        }
-                       tried.goroot = dir
                }
                if ctxt.Compiler == "gccgo" && goroot.IsStandardPackage(ctxt.GOROOT, ctxt.Compiler, path) {
                        p.Dir = ctxt.joinPath(ctxt.GOROOT, "src", path)
@@ -680,6 +690,24 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa
                        tried.gopath = append(tried.gopath, dir)
                }
 
+               // If we tried GOPATH first due to a "vendor/" prefix, fall back to GOPATH.
+               // That way, the user can still get useful results from 'go list' for
+               // standard-vendored paths passed on the command line.
+               if ctxt.GOROOT != "" && tried.goroot == "" {
+                       dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
+                       if ctxt.Compiler != "gccgo" {
+                               isDir := ctxt.isDir(dir)
+                               binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga))
+                               if isDir || binaryOnly {
+                                       p.Dir = dir
+                                       p.Goroot = true
+                                       p.Root = ctxt.GOROOT
+                                       goto Found
+                               }
+                       }
+                       tried.goroot = dir
+               }
+
                // package was not found
                var paths []string
                format := "\t%s (vendor tree)"
@@ -976,6 +1004,7 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode,
        }
 
        // If modules are not enabled, then the in-process code works fine and we should keep using it.
+       // TODO(bcmills): This assumes that the default is "auto" instead of "on".
        switch os.Getenv("GO111MODULE") {
        case "off":
                return errNoModules
@@ -991,6 +1020,13 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode,
                }
        }
 
+       // If the source directory is in GOROOT, then the in-process code works fine
+       // and we should keep using it. Moreover, the 'go list' approach below doesn't
+       // take standard-library vendoring into account and will fail.
+       if _, ok := ctxt.hasSubdir(filepath.Join(ctxt.GOROOT, "src"), srcDir); ok {
+               return errNoModules
+       }
+
        // For efficiency, if path is a standard library package, let the usual lookup code handle it.
        if ctxt.GOROOT != "" {
                dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
@@ -1017,7 +1053,12 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode,
        }
 
        cmd := exec.Command("go", "list", "-compiler="+ctxt.Compiler, "-tags="+strings.Join(ctxt.BuildTags, ","), "-installsuffix="+ctxt.InstallSuffix, "-f={{.Dir}}\n{{.ImportPath}}\n{{.Root}}\n{{.Goroot}}\n", path)
+
+       // TODO(bcmills): This is wrong if srcDir is in a vendor directory, or if
+       // srcDir is in some module dependency of the main module. The main module
+       // chooses what the import paths mean: individual packages don't.
        cmd.Dir = srcDir
+
        var stdout, stderr strings.Builder
        cmd.Stdout = &stdout
        cmd.Stderr = &stderr
@@ -1646,6 +1687,9 @@ func (ctxt *Context) match(name string, allTags map[string]bool) bool {
        if ctxt.GOOS == "android" && name == "linux" {
                return true
        }
+       if ctxt.GOOS == "illumos" && name == "solaris" {
+               return true
+       }
 
        // other tags
        for _, tag := range ctxt.BuildTags {
index 19b544746fff2162d2666c91a14709511454b3a8..f86e470a1134850f33b23400de1f0db2b302581c 100644 (file)
@@ -352,6 +352,10 @@ func TestImportDirNotExist(t *testing.T) {
 
 func TestImportVendor(t *testing.T) {
        testenv.MustHaveGoBuild(t) // really must just have source
+
+       defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE"))
+       os.Setenv("GO111MODULE", "off")
+
        ctxt := Default
        wd, err := os.Getwd()
        if err != nil {
@@ -370,6 +374,10 @@ func TestImportVendor(t *testing.T) {
 
 func TestImportVendorFailure(t *testing.T) {
        testenv.MustHaveGoBuild(t) // really must just have source
+
+       defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE"))
+       os.Setenv("GO111MODULE", "off")
+
        ctxt := Default
        wd, err := os.Getwd()
        if err != nil {
@@ -389,6 +397,10 @@ func TestImportVendorFailure(t *testing.T) {
 
 func TestImportVendorParentFailure(t *testing.T) {
        testenv.MustHaveGoBuild(t) // really must just have source
+
+       defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE"))
+       os.Setenv("GO111MODULE", "off")
+
        ctxt := Default
        wd, err := os.Getwd()
        if err != nil {
index 2c29a3e6018f7785dee2cc112951e941ed5b483a..709c43a52a611ce4c1d7478521e2fd4bc356dd64 100644 (file)
@@ -34,7 +34,7 @@ import (
 //
 var pkgDeps = map[string][]string{
        // L0 is the lowest level, core, nearly unavoidable packages.
-       "errors":                  {},
+       "errors":                  {"runtime", "internal/reflectlite"},
        "io":                      {"errors", "sync", "sync/atomic"},
        "runtime":                 {"unsafe", "runtime/internal/atomic", "runtime/internal/sys", "runtime/internal/math", "internal/cpu", "internal/bytealg"},
        "runtime/internal/sys":    {},
@@ -46,6 +46,7 @@ var pkgDeps = map[string][]string{
        "unsafe":                  {},
        "internal/cpu":            {},
        "internal/bytealg":        {"unsafe", "internal/cpu"},
+       "internal/reflectlite":    {"runtime", "unsafe"},
 
        "L0": {
                "errors",
@@ -57,6 +58,7 @@ var pkgDeps = map[string][]string{
                "unsafe",
                "internal/cpu",
                "internal/bytealg",
+               "internal/reflectlite",
        },
 
        // L1 adds simple functions and strings processing,
@@ -117,7 +119,7 @@ var pkgDeps = map[string][]string{
        "image/color/palette":    {"L2", "image/color"},
        "internal/fmtsort":       {"reflect", "sort"},
        "reflect":                {"L2"},
-       "sort":                   {"reflect"},
+       "sort":                   {"internal/reflectlite"},
 
        "L3": {
                "L2",
@@ -137,14 +139,16 @@ var pkgDeps = map[string][]string{
                "image/color",
                "image/color/palette",
                "internal/fmtsort",
+               "internal/oserror",
                "reflect",
        },
 
        // End of linear dependency definitions.
 
        // Operating system access.
-       "syscall":                           {"L0", "internal/race", "internal/syscall/windows/sysdll", "syscall/js", "unicode/utf16"},
+       "syscall":                           {"L0", "internal/oserror", "internal/race", "internal/syscall/windows/sysdll", "syscall/js", "unicode/utf16"},
        "syscall/js":                        {"L0"},
+       "internal/oserror":                  {"L0"},
        "internal/syscall/unix":             {"L0", "syscall"},
        "internal/syscall/windows":          {"L0", "syscall", "internal/syscall/windows/sysdll"},
        "internal/syscall/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
@@ -162,9 +166,9 @@ var pkgDeps = map[string][]string{
                "syscall/js",
        },
 
-       "internal/poll":    {"L0", "internal/race", "syscall", "time", "unicode/utf16", "unicode/utf8", "internal/syscall/windows"},
+       "internal/poll":    {"L0", "internal/oserror", "internal/race", "syscall", "time", "unicode/utf16", "unicode/utf8", "internal/syscall/windows"},
        "internal/testlog": {"L0"},
-       "os":               {"L1", "os", "syscall", "time", "internal/poll", "internal/syscall/windows", "internal/syscall/unix", "internal/testlog"},
+       "os":               {"L1", "os", "syscall", "time", "internal/oserror", "internal/poll", "internal/syscall/windows", "internal/syscall/unix", "internal/testlog"},
        "path/filepath":    {"L2", "os", "syscall", "internal/syscall/windows"},
        "io/ioutil":        {"L2", "os", "path/filepath", "time"},
        "os/exec":          {"L2", "os", "context", "path/filepath", "syscall"},
@@ -192,10 +196,12 @@ var pkgDeps = map[string][]string{
        "runtime/trace":  {"L0", "context", "fmt"},
        "text/tabwriter": {"L2"},
 
-       "testing":          {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"},
-       "testing/iotest":   {"L2", "log"},
-       "testing/quick":    {"L2", "flag", "fmt", "reflect", "time"},
-       "internal/testenv": {"L2", "OS", "flag", "testing", "syscall"},
+       "testing":               {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"},
+       "testing/iotest":        {"L2", "log"},
+       "testing/quick":         {"L2", "flag", "fmt", "reflect", "time"},
+       "internal/testenv":      {"L2", "OS", "flag", "testing", "syscall"},
+       "internal/lazyregexp":   {"L2", "OS", "regexp"},
+       "internal/lazytemplate": {"L2", "OS", "text/template"},
 
        // L4 is defined as L3+fmt+log+time, because in general once
        // you're using L3 packages, use of fmt, log, or time is not a big deal.
@@ -208,7 +214,7 @@ var pkgDeps = map[string][]string{
 
        // Go parser.
        "go/ast":     {"L4", "OS", "go/scanner", "go/token"},
-       "go/doc":     {"L4", "OS", "go/ast", "go/token", "regexp", "text/template"},
+       "go/doc":     {"L4", "OS", "go/ast", "go/token", "regexp", "internal/lazyregexp", "text/template"},
        "go/parser":  {"L4", "OS", "go/ast", "go/scanner", "go/token"},
        "go/printer": {"L4", "OS", "go/ast", "go/scanner", "go/token", "text/tabwriter"},
        "go/scanner": {"L4", "OS", "go/token"},
@@ -243,7 +249,7 @@ var pkgDeps = map[string][]string{
        "compress/gzip":                  {"L4", "compress/flate"},
        "compress/lzw":                   {"L4"},
        "compress/zlib":                  {"L4", "compress/flate"},
-       "context":                        {"errors", "fmt", "reflect", "sync", "time"},
+       "context":                        {"errors", "internal/oserror", "internal/reflectlite", "sync", "time"},
        "database/sql":                   {"L4", "container/list", "context", "database/sql/driver", "database/sql/internal"},
        "database/sql/driver":            {"L4", "context", "time", "database/sql/internal"},
        "debug/dwarf":                    {"L4"},
@@ -262,7 +268,7 @@ var pkgDeps = map[string][]string{
        "encoding/pem":                   {"L4"},
        "encoding/xml":                   {"L4", "encoding"},
        "flag":                           {"L4", "OS"},
-       "go/build":                       {"L4", "OS", "GOPARSER", "internal/goroot"},
+       "go/build":                       {"L4", "OS", "GOPARSER", "internal/goroot", "internal/goversion"},
        "html":                           {"L4"},
        "image/draw":                     {"L4", "image/internal/imageutil"},
        "image/gif":                      {"L4", "compress/lzw", "image/color/palette", "image/draw"},
@@ -318,10 +324,10 @@ var pkgDeps = map[string][]string{
        // do networking portably, it must have a small dependency set: just L0+basic os.
        "net": {
                "L0", "CGO",
-               "context", "math/rand", "os", "reflect", "sort", "syscall", "time",
+               "context", "math/rand", "os", "sort", "syscall", "time",
                "internal/nettrace", "internal/poll", "internal/syscall/unix",
                "internal/syscall/windows", "internal/singleflight", "internal/race",
-               "internal/x/net/dns/dnsmessage", "internal/x/net/lif", "internal/x/net/route",
+               "golang.org/x/net/dns/dnsmessage", "golang.org/x/net/lif", "golang.org/x/net/route",
        },
 
        // NET enables use of basic network-related packages.
@@ -358,9 +364,9 @@ var pkgDeps = map[string][]string{
                "crypto/sha1",
                "crypto/sha256",
                "crypto/sha512",
-               "internal/x/crypto/chacha20poly1305",
-               "internal/x/crypto/curve25519",
-               "internal/x/crypto/poly1305",
+               "golang.org/x/crypto/chacha20poly1305",
+               "golang.org/x/crypto/curve25519",
+               "golang.org/x/crypto/poly1305",
        },
 
        // Random byte, number generation.
@@ -368,6 +374,10 @@ var pkgDeps = map[string][]string{
        // math/big, which imports fmt.
        "crypto/rand": {"L4", "CRYPTO", "OS", "math/big", "syscall", "syscall/js", "internal/syscall/unix"},
 
+       // Not part of CRYPTO because it imports crypto/rand and crypto/sha512.
+       "crypto/ed25519":                       {"L3", "CRYPTO", "crypto/rand", "crypto/ed25519/internal/edwards25519"},
+       "crypto/ed25519/internal/edwards25519": {"encoding/binary"},
+
        // Mathematical crypto: dependencies on fmt (L4) and math/big.
        // We could avoid some of the fmt, but math/big imports fmt anyway.
        "crypto/dsa":      {"L4", "CRYPTO", "math/big"},
@@ -388,13 +398,13 @@ var pkgDeps = map[string][]string{
 
        // SSL/TLS.
        "crypto/tls": {
-               "L4", "CRYPTO-MATH", "OS", "internal/x/crypto/cryptobyte", "internal/x/crypto/hkdf",
-               "container/list", "crypto/x509", "encoding/pem", "net", "syscall",
+               "L4", "CRYPTO-MATH", "OS", "golang.org/x/crypto/cryptobyte", "golang.org/x/crypto/hkdf",
+               "container/list", "crypto/x509", "encoding/pem", "net", "syscall", "crypto/ed25519",
        },
        "crypto/x509": {
-               "L4", "CRYPTO-MATH", "OS", "CGO",
+               "L4", "CRYPTO-MATH", "OS", "CGO", "crypto/ed25519",
                "crypto/x509/pkix", "encoding/pem", "encoding/hex", "net", "os/user", "syscall", "net/url",
-               "internal/x/crypto/cryptobyte", "internal/x/crypto/cryptobyte/asn1",
+               "golang.org/x/crypto/cryptobyte", "golang.org/x/crypto/cryptobyte/asn1",
        },
        "crypto/x509/pkix": {"L4", "CRYPTO-MATH", "encoding/hex"},
 
@@ -410,12 +420,12 @@ var pkgDeps = map[string][]string{
                "context",
                "crypto/rand",
                "crypto/tls",
-               "internal/x/net/http/httpguts",
-               "internal/x/net/http/httpproxy",
-               "internal/x/net/http2/hpack",
-               "internal/x/net/idna",
-               "internal/x/text/unicode/norm",
-               "internal/x/text/width",
+               "golang.org/x/net/http/httpguts",
+               "golang.org/x/net/http/httpproxy",
+               "golang.org/x/net/http2/hpack",
+               "golang.org/x/net/idna",
+               "golang.org/x/text/unicode/norm",
+               "golang.org/x/text/width",
                "internal/nettrace",
                "mime/multipart",
                "net/http/httptrace",
@@ -433,11 +443,11 @@ var pkgDeps = map[string][]string{
        "net/http/fcgi":      {"L4", "NET", "OS", "context", "net/http", "net/http/cgi"},
        "net/http/httptest": {
                "L4", "NET", "OS", "crypto/tls", "flag", "net/http", "net/http/internal", "crypto/x509",
-               "internal/x/net/http/httpguts",
+               "golang.org/x/net/http/httpguts",
        },
-       "net/http/httputil": {"L4", "NET", "OS", "context", "net/http", "net/http/internal", "internal/x/net/http/httpguts"},
+       "net/http/httputil": {"L4", "NET", "OS", "context", "net/http", "net/http/internal", "golang.org/x/net/http/httpguts"},
        "net/http/pprof":    {"L4", "OS", "html/template", "net/http", "runtime/pprof", "runtime/trace"},
-       "net/rpc":           {"L4", "NET", "encoding/gob", "html/template", "net/http"},
+       "net/rpc":           {"L4", "NET", "encoding/gob", "html/template", "net/http", "go/token"},
        "net/rpc/jsonrpc":   {"L4", "NET", "encoding/json", "net/rpc"},
 }
 
@@ -486,7 +496,7 @@ func listStdPkgs(goroot string) ([]string, error) {
                }
 
                name := filepath.ToSlash(path[len(src):])
-               if name == "builtin" || name == "cmd" || strings.Contains(name, "internal/x/") {
+               if name == "builtin" || name == "cmd" || strings.Contains(name, "golang.org/x/") {
                        return filepath.SkipDir
                }
 
@@ -514,15 +524,21 @@ func TestDependencies(t *testing.T) {
        }
        sort.Strings(all)
 
+       sawImport := map[string]map[string]bool{} // from package => to package => true
+
        for _, pkg := range all {
                imports, err := findImports(pkg)
                if err != nil {
                        t.Error(err)
                        continue
                }
+               if sawImport[pkg] == nil {
+                       sawImport[pkg] = map[string]bool{}
+               }
                ok := allowed(pkg)
                var bad []string
                for _, imp := range imports {
+                       sawImport[pkg][imp] = true
                        if !ok[imp] {
                                bad = append(bad, imp)
                        }
@@ -531,6 +547,35 @@ func TestDependencies(t *testing.T) {
                        t.Errorf("unexpected dependency: %s imports %v", pkg, bad)
                }
        }
+
+       // depPath returns the path between the given from and to packages.
+       // It returns the empty string if there's no dependency path.
+       var depPath func(string, string) string
+       depPath = func(from, to string) string {
+               if sawImport[from][to] {
+                       return from + " => " + to
+               }
+               for pkg := range sawImport[from] {
+                       if p := depPath(pkg, to); p != "" {
+                               return from + " => " + p
+                       }
+               }
+               return ""
+       }
+
+       // Also test some high-level policy goals are being met by not finding
+       // these dependency paths:
+       badPaths := []struct{ from, to string }{
+               {"net", "unicode"},
+               {"os", "unicode"},
+       }
+
+       for _, path := range badPaths {
+               if how := depPath(path.from, path.to); how != "" {
+                       t.Errorf("policy violation: %s", how)
+               }
+       }
+
 }
 
 var buildIgnore = []byte("\n// +build ignore")
@@ -545,6 +590,10 @@ func findImports(pkg string) ([]string, error) {
        var haveImport = map[string]bool{}
        for _, file := range files {
                name := file.Name()
+               if name == "slice_go14.go" || name == "slice_go18.go" {
+                       // These files are for compiler bootstrap with older versions of Go and not built in the standard build.
+                       continue
+               }
                if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
                        continue
                }
index 8e3858feea926de6093fb155f5cf32174724f5fa..703825a45d7469f05d9c2e5b68bd12e8348e5961 100644 (file)
 //     - "go1.10", from Go version 1.10 onward
 //     - "go1.11", from Go version 1.11 onward
 //     - "go1.12", from Go version 1.12 onward
+//     - "go1.13", from Go version 1.13 onward
 //     - any additional words listed in ctxt.BuildTags
 //
 // There are no build tags for beta or minor releases.
 // Using GOOS=android matches build tags and files as for GOOS=linux
 // in addition to android tags and files.
 //
+// Using GOOS=illumos matches build tags and files as for GOOS=solaris
+// in addition to illumos tags and files.
+//
 // Binary-Only Packages
 //
-// It is possible to distribute packages in binary form without including the
-// source code used for compiling the package. To do this, the package must
-// be distributed with a source file not excluded by build constraints and
-// containing a "//go:binary-only-package" comment.
-// Like a build constraint, this comment must appear near the top of the file,
-// preceded only by blank lines and other line comments and with a blank line
+// In Go 1.12 and earlier, it was possible to distribute packages in binary
+// form without including the source code used for compiling the package.
+// The package was distributed with a source file not excluded by build
+// constraints and containing a "//go:binary-only-package" comment. Like a
+// build constraint, this comment appeared at the top of a file, preceded
+// only by blank lines and other line comments and with a blank line
 // following the comment, to separate it from the package documentation.
 // Unlike build constraints, this comment is only recognized in non-test
 // Go source files.
 //
-// The minimal source code for a binary-only package is therefore:
+// The minimal source code for a binary-only package was therefore:
 //
 //     //go:binary-only-package
 //
 //     package mypkg
 //
-// The source code may include additional Go code. That code is never compiled
-// but will be processed by tools like godoc and might be useful as end-user
-// documentation.
+// The source code could include additional Go code. That code was never
+// compiled but would be processed by tools like godoc and might be useful
+// as end-user documentation.
+//
+// "go build" and other commands no longer support binary-only-packages.
+// Import and ImportDir will still set the BinaryOnly flag in packages
+// containing these comments for use in tools and error messages.
 //
 package build
index b3f2c8615be25c3573bba35bbadf9a422a7f3e50..1af1ae8e5e5b0a137741367584efc095de151a5b 100644 (file)
@@ -4,5 +4,5 @@
 
 package build
 
-const goosList = "aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9 solaris windows zos "
+const goosList = "aix android darwin dragonfly freebsd hurd illumos js linux nacl netbsd openbsd plan9 solaris windows zos "
 const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm alpha m68k nios2 sh shbe "
index 21f9de7bf58fcb7ba40ab17379442bdafec379cc..c847bb08268ee94d349d4b16d03240a0de801cde 100644 (file)
@@ -10,6 +10,7 @@ import (
        "fmt"
        "go/constant"
        "go/token"
+       "math"
        "sort"
 )
 
@@ -158,3 +159,24 @@ func ExampleSign() {
        //  1 (0 + 1i)
        //  1 (1 + 1i)
 }
+
+func ExampleVal() {
+       maxint := constant.MakeInt64(math.MaxInt64)
+       fmt.Printf("%v\n", constant.Val(maxint))
+
+       e := constant.MakeFloat64(math.E)
+       fmt.Printf("%v\n", constant.Val(e))
+
+       b := constant.MakeBool(true)
+       fmt.Printf("%v\n", constant.Val(b))
+
+       b = constant.Make(false)
+       fmt.Printf("%v\n", constant.Val(b))
+
+       // Output:
+       //
+       // 9223372036854775807
+       // 6121026514868073/2251799813685248
+       // true
+       // false
+}
index 0982243edbf6880be726fb1d28b30c892a73106b..cd77b376d12a946fcf85fe9b0ad976356dc6eeee 100644 (file)
@@ -315,8 +315,9 @@ func makeFloatFromLiteral(lit string) Value {
                                // but it'll take forever to parse as a Rat.
                                lit = "0"
                        }
-                       r, _ := newRat().SetString(lit)
-                       return ratVal{r}
+                       if r, ok := newRat().SetString(lit); ok {
+                               return ratVal{r}
+                       }
                }
                // otherwise use floats
                return makeFloat(f)
@@ -380,8 +381,17 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value {
                panic("MakeFromLiteral called with non-zero last argument")
        }
 
+       // TODO(gri) Remove stripSep and, for token.INT, 0o-octal handling
+       //           below once strconv and math/big can handle separators
+       //           and 0o-octals.
+
        switch tok {
        case token.INT:
+               // TODO(gri) remove 0o-special case once strconv and math/big can handle 0o-octals
+               lit = stripSep(lit)
+               if len(lit) >= 2 && lit[0] == '0' && (lit[1] == 'o' || lit[1] == 'O') {
+                       lit = "0" + lit[2:]
+               }
                if x, err := strconv.ParseInt(lit, 0, 64); err == nil {
                        return int64Val(x)
                }
@@ -390,11 +400,13 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value {
                }
 
        case token.FLOAT:
+               lit = stripSep(lit)
                if x := makeFloatFromLiteral(lit); x != nil {
                        return x
                }
 
        case token.IMAG:
+               lit = stripSep(lit)
                if n := len(lit); n > 0 && lit[n-1] == 'i' {
                        if im := makeFloatFromLiteral(lit[:n-1]); im != nil {
                                return makeComplex(int64Val(0), im)
@@ -420,6 +432,26 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value {
        return unknownVal{}
 }
 
+func stripSep(s string) string {
+       // avoid making a copy if there are no separators (common case)
+       i := 0
+       for i < len(s) && s[i] != '_' {
+               i++
+       }
+       if i == len(s) {
+               return s
+       }
+
+       // make a copy of s without separators
+       var buf []byte
+       for i := 0; i < len(s); i++ {
+               if c := s[i]; c != '_' {
+                       buf = append(buf, c)
+               }
+       }
+       return string(buf)
+}
+
 // ----------------------------------------------------------------------------
 // Accessors
 //
@@ -530,6 +562,68 @@ func Float64Val(x Value) (float64, bool) {
        }
 }
 
+// Val returns the underlying value for a given constant. Since it returns an
+// interface, it is up to the caller to type assert the result to the expected
+// type. The possible dynamic return types are:
+//
+//    x Kind             type of result
+//    -----------------------------------------
+//    Bool               bool
+//    String             string
+//    Int                int64 or *big.Int
+//    Float              *big.Float or *big.Rat
+//    everything else    nil
+//
+func Val(x Value) interface{} {
+       switch x := x.(type) {
+       case boolVal:
+               return bool(x)
+       case *stringVal:
+               return x.string()
+       case int64Val:
+               return int64(x)
+       case intVal:
+               return x.val
+       case ratVal:
+               return x.val
+       case floatVal:
+               return x.val
+       default:
+               return nil
+       }
+}
+
+// Make returns the Value for x.
+//
+//    type of x        result Kind
+//    ----------------------------
+//    bool             Bool
+//    string           String
+//    int64            Int
+//    *big.Int         Int
+//    *big.Float       Float
+//    *big.Rat         Float
+//    anything else    Unknown
+//
+func Make(x interface{}) Value {
+       switch x := x.(type) {
+       case bool:
+               return boolVal(x)
+       case string:
+               return &stringVal{s: x}
+       case int64:
+               return int64Val(x)
+       case *big.Int:
+               return intVal{x}
+       case *big.Rat:
+               return ratVal{x}
+       case *big.Float:
+               return floatVal{x}
+       default:
+               return unknownVal{}
+       }
+}
+
 // BitLen returns the number of bits required to represent
 // the absolute value x in binary representation; x must be an Int or an Unknown.
 // If x is Unknown, the result is 0.
index 68b87eaa5571d88d50b4976511f512f1cea89834..a319039fc6e89d7962666219d105d5e0f2549ce2 100644 (file)
@@ -7,11 +7,156 @@ package constant
 import (
        "fmt"
        "go/token"
+       "math/big"
        "strings"
        "testing"
 )
 
-// TODO(gri) expand this test framework
+var intTests = []string{
+       // 0-octals
+       `0_123 = 0123`,
+       `0123_456 = 0123456`,
+
+       // decimals
+       `1_234 = 1234`,
+       `1_234_567 = 1234567`,
+
+       // hexadecimals
+       `0X_0 = 0`,
+       `0X_1234 = 0x1234`,
+       `0X_CAFE_f00d = 0xcafef00d`,
+
+       // octals
+       `0o0 = 0`,
+       `0o1234 = 01234`,
+       `0o01234567 = 01234567`,
+
+       `0O0 = 0`,
+       `0O1234 = 01234`,
+       `0O01234567 = 01234567`,
+
+       `0o_0 = 0`,
+       `0o_1234 = 01234`,
+       `0o0123_4567 = 01234567`,
+
+       `0O_0 = 0`,
+       `0O_1234 = 01234`,
+       `0O0123_4567 = 01234567`,
+
+       // binaries
+       `0b0 = 0`,
+       `0b1011 = 0xb`,
+       `0b00101101 = 0x2d`,
+
+       `0B0 = 0`,
+       `0B1011 = 0xb`,
+       `0B00101101 = 0x2d`,
+
+       `0b_0 = 0`,
+       `0b10_11 = 0xb`,
+       `0b_0010_1101 = 0x2d`,
+}
+
+// The RHS operand may be a floating-point quotient n/d of two integer values n and d.
+var floatTests = []string{
+       // decimal floats
+       `1_2_3. = 123.`,
+       `0_123. = 123.`,
+
+       `0_0e0 = 0.`,
+       `1_2_3e0 = 123.`,
+       `0_123e0 = 123.`,
+
+       `0e-0_0 = 0.`,
+       `1_2_3E+0 = 123.`,
+       `0123E1_2_3 = 123e123`,
+
+       `0.e+1 = 0.`,
+       `123.E-1_0 = 123e-10`,
+       `01_23.e123 = 123e123`,
+
+       `.0e-1 = .0`,
+       `.123E+10 = .123e10`,
+       `.0123E123 = .0123e123`,
+
+       `1_2_3.123 = 123.123`,
+       `0123.01_23 = 123.0123`,
+
+       // hexadecimal floats
+       `0x0.p+0 = 0.`,
+       `0Xdeadcafe.p-10 = 0xdeadcafe/1024`,
+       `0x1234.P84 = 0x1234000000000000000000000`,
+
+       `0x.1p-0 = 1/16`,
+       `0X.deadcafep4 = 0xdeadcafe/0x10000000`,
+       `0x.1234P+12 = 0x1234/0x10`,
+
+       `0x0p0 = 0.`,
+       `0Xdeadcafep+1 = 0x1bd5b95fc`,
+       `0x1234P-10 = 0x1234/1024`,
+
+       `0x0.0p0 = 0.`,
+       `0Xdead.cafep+1 = 0x1bd5b95fc/0x10000`,
+       `0x12.34P-10 = 0x1234/0x40000`,
+
+       `0Xdead_cafep+1 = 0xdeadcafep+1`,
+       `0x_1234P-10 = 0x1234p-10`,
+
+       `0X_dead_cafe.p-10 = 0xdeadcafe.p-10`,
+       `0x12_34.P1_2_3 = 0x1234.p123`,
+}
+
+var imagTests = []string{
+       `1_234i = 1234i`,
+       `1_234_567i = 1234567i`,
+
+       `0.i = 0i`,
+       `123.i = 123i`,
+       `0123.i = 123i`,
+
+       `0.e+1i = 0i`,
+       `123.E-1_0i = 123e-10i`,
+       `01_23.e123i = 123e123i`,
+}
+
+func testNumbers(t *testing.T, kind token.Token, tests []string) {
+       for _, test := range tests {
+               a := strings.Split(test, " = ")
+               if len(a) != 2 {
+                       t.Errorf("invalid test case: %s", test)
+                       continue
+               }
+
+               x := MakeFromLiteral(a[0], kind, 0)
+               var y Value
+               if i := strings.Index(a[1], "/"); i >= 0 && kind == token.FLOAT {
+                       n := MakeFromLiteral(a[1][:i], token.INT, 0)
+                       d := MakeFromLiteral(a[1][i+1:], token.INT, 0)
+                       y = BinaryOp(n, token.QUO, d)
+               } else {
+                       y = MakeFromLiteral(a[1], kind, 0)
+               }
+
+               xk := x.Kind()
+               yk := y.Kind()
+               if xk != yk || xk == Unknown {
+                       t.Errorf("%s: got kind %d != %d", test, xk, yk)
+                       continue
+               }
+
+               if !Compare(x, token.EQL, y) {
+                       t.Errorf("%s: %s != %s", test, x, y)
+               }
+       }
+}
+
+// TestNumbers verifies that differently written literals
+// representing the same number do have the same value.
+func TestNumbers(t *testing.T) {
+       testNumbers(t, token.INT, intTests)
+       testNumbers(t, token.FLOAT, floatTests)
+       testNumbers(t, token.IMAG, imagTests)
+}
 
 var opTests = []string{
        // unary operations
@@ -452,6 +597,22 @@ func TestUnknown(t *testing.T) {
        }
 }
 
+func TestMake(t *testing.T) {
+       for _, want := range []interface{}{
+               false,
+               "hello",
+               int64(1),
+               big.NewInt(10),
+               big.NewFloat(2.0),
+               big.NewRat(1, 3),
+       } {
+               got := Val(Make(want))
+               if got != want {
+                       t.Errorf("got %v; want %v", got, want)
+               }
+       }
+}
+
 func BenchmarkStringAdd(b *testing.B) {
        for size := 1; size <= 65536; size *= 4 {
                b.Run(fmt.Sprint(size), func(b *testing.B) {
index 0ec42643fdf82fa5f3c5fba537602b70dfc83fae..88be45bb8fbdc8ef23bd435d181bfb2c21093572 100644 (file)
@@ -8,6 +8,7 @@ package doc
 
 import (
        "bytes"
+       "internal/lazyregexp"
        "io"
        "strings"
        "text/template" // for HTMLEscape
@@ -69,7 +70,7 @@ const (
        urlRx = protoPart + `://` + hostPart + pathPart
 )
 
-var matchRx = newLazyRE(`(` + urlRx + `)|(` + identRx + `)`)
+var matchRx = lazyregexp.New(`(` + urlRx + `)|(` + identRx + `)`)
 
 var (
        html_a      = []byte(`<a href="`)
@@ -273,7 +274,7 @@ type block struct {
        lines []string
 }
 
-var nonAlphaNumRx = newLazyRE(`[^a-zA-Z0-9]`)
+var nonAlphaNumRx = lazyregexp.New(`[^a-zA-Z0-9]`)
 
 func anchorID(line string) string {
        // Add a "hdr-" prefix to avoid conflicting with IDs used for package symbols.
@@ -445,7 +446,6 @@ func ToText(w io.Writer, text string, indent, preIndent string, width int) {
                                        w.Write([]byte("\n"))
                                } else {
                                        w.Write([]byte(preIndent))
-                                       line = convertQuotes(line)
                                        w.Write([]byte(line))
                                }
                        }
@@ -464,6 +464,7 @@ type lineWrapper struct {
 
 var nl = []byte("\n")
 var space = []byte(" ")
+var prefix = []byte("// ")
 
 func (l *lineWrapper) write(text string) {
        if l.n == 0 && l.printed {
@@ -471,6 +472,8 @@ func (l *lineWrapper) write(text string) {
        }
        l.printed = true
 
+       needsPrefix := false
+       isComment := strings.HasPrefix(text, "//")
        for _, f := range strings.Fields(text) {
                w := utf8.RuneCountInString(f)
                // wrap if line is too long
@@ -478,10 +481,15 @@ func (l *lineWrapper) write(text string) {
                        l.out.Write(nl)
                        l.n = 0
                        l.pendSpace = 0
+                       needsPrefix = isComment
                }
                if l.n == 0 {
                        l.out.Write([]byte(l.indent))
                }
+               if needsPrefix {
+                       l.out.Write(prefix)
+                       needsPrefix = false
+               }
                l.out.Write(space[:l.pendSpace])
                l.out.Write([]byte(f))
                l.n += l.pendSpace + w
index e0adeb2f5cf107d50c4d291cc998377d3db6672d..101f4462878b9d05a8be1dd80e8d861659283c67 100644 (file)
@@ -124,6 +124,34 @@ $  pre2
 
 $      pre
 $      pre2
+`,
+       },
+       {
+               in: "Para.\n\tshould not be ``escaped''",
+               out: []block{
+                       {opPara, []string{"Para.\n"}},
+                       {opPre, []string{"should not be ``escaped''"}},
+               },
+               text: ".   Para.\n\n$   should not be ``escaped''",
+       },
+       {
+               in: "// A very long line of 46 char for line wrapping.",
+               out: []block{
+                       {opPara, []string{"// A very long line of 46 char for line wrapping."}},
+               },
+               text: `.   // A very long line of 46 char for line
+.   // wrapping.
+`,
+       },
+       {
+               in: `/* A very long line of 46 char for line wrapping.
+A very long line of 46 char for line wrapping. */`,
+               out: []block{
+                       {opPara, []string{"/* A very long line of 46 char for line wrapping.\n", "A very long line of 46 char for line wrapping. */"}},
+               },
+               text: `.   /* A very long line of 46 char for line
+.   wrapping. A very long line of 46 char
+.   for line wrapping. */
 `,
        },
 }
index 81956f2fdbfe0158f8a20687da4e37dcbfa027a5..7d1a57058ae045de76400e6cb16651934394fdac 100644 (file)
@@ -9,8 +9,8 @@ package doc
 import (
        "go/ast"
        "go/token"
+       "internal/lazyregexp"
        "path"
-       "regexp"
        "sort"
        "strconv"
        "strings"
@@ -104,7 +104,7 @@ func Examples(files ...*ast.File) []*Example {
        return list
 }
 
-var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*(unordered )?output:`)
+var outputPrefix = lazyregexp.New(`(?i)^[[:space:]]*(unordered )?output:`)
 
 // Extracts the expected output and whether there was a valid output comment
 func exampleOutput(b *ast.BlockStmt, comments []*ast.CommentGroup) (output string, unordered, ok bool) {
index 5f99bf7772c175e8376833337605e6578ed4b709..819c030c9bf51c9f7f36f50a20688df98bd04c14 100644 (file)
@@ -17,7 +17,7 @@ import (
 func filterIdentList(list []*ast.Ident) []*ast.Ident {
        j := 0
        for _, x := range list {
-               if ast.IsExported(x.Name) {
+               if token.IsExported(x.Name) {
                        list[j] = x
                        j++
                }
@@ -59,7 +59,7 @@ func filterExprList(list []ast.Expr, filter Filter, export bool) []ast.Expr {
 // and reports whether at least one exported name exists.
 func updateIdentList(list []*ast.Ident) (hasExported bool) {
        for i, x := range list {
-               if ast.IsExported(x.Name) {
+               if token.IsExported(x.Name) {
                        hasExported = true
                } else {
                        list[i] = underscore
@@ -121,7 +121,7 @@ func (r *reader) filterFieldList(parent *namedType, fields *ast.FieldList, ityp
                if n := len(field.Names); n == 0 {
                        // anonymous field
                        fname := r.recordAnonymousField(parent, field.Type)
-                       if ast.IsExported(fname) {
+                       if token.IsExported(fname) {
                                keepField = true
                        } else if ityp != nil && fname == "error" {
                                // possibly the predeclared error interface; keep
@@ -199,7 +199,7 @@ func (r *reader) filterSpec(spec ast.Spec) bool {
                // always keep imports so we can collect them
                return true
        case *ast.ValueSpec:
-               s.Values = filterExprList(s.Values, ast.IsExported, true)
+               s.Values = filterExprList(s.Values, token.IsExported, true)
                if len(s.Values) > 0 || s.Type == nil && len(s.Values) == 0 {
                        // If there are values declared on RHS, just replace the unexported
                        // identifiers on the LHS with underscore, so that it matches
@@ -219,7 +219,7 @@ func (r *reader) filterSpec(spec ast.Spec) bool {
                        }
                }
        case *ast.TypeSpec:
-               if name := s.Name.Name; ast.IsExported(name) {
+               if name := s.Name.Name; token.IsExported(name) {
                        r.filterType(r.lookupType(s.Name.Name), s.Type)
                        return true
                } else if name == "error" {
@@ -290,7 +290,7 @@ func (r *reader) filterDecl(decl ast.Decl) bool {
                // conflicting method will be filtered here, too -
                // thus, removing these methods early will not lead
                // to the false removal of possible conflicts
-               return ast.IsExported(d.Name.Name)
+               return token.IsExported(d.Name.Name)
        }
        return false
 }
index 1ccaa158194534c0fb0078d04d07410805967f97..3f782cc1b4bb38d3906ac2321d0a20a758e1d7cf 100644 (file)
@@ -22,9 +22,9 @@ import (
        "go/doc"
        "go/parser"
        "go/token"
+       "internal/lazyregexp"
        "os"
        "path/filepath"
-       "regexp"
        "runtime"
        "strings"
 )
@@ -35,7 +35,7 @@ var (
 )
 
 // ToHTML in comment.go assigns a (possibly blank) ID to each heading
-var html_h = regexp.MustCompile(`<h3 id="[^"]*">`)
+var html_h = lazyregexp.New(`<h3 id="[^"]*">`)
 
 const html_endh = "</h3>\n"
 
diff --git a/libgo/go/go/doc/lazyre.go b/libgo/go/go/doc/lazyre.go
deleted file mode 100644 (file)
index 3fd97d4..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import (
-       "os"
-       "regexp"
-       "strings"
-       "sync"
-)
-
-type lazyRE struct {
-       str  string
-       once sync.Once
-       rx   *regexp.Regexp
-}
-
-func (r *lazyRE) re() *regexp.Regexp {
-       r.once.Do(r.build)
-       return r.rx
-}
-
-func (r *lazyRE) build() {
-       r.rx = regexp.MustCompile(r.str)
-       r.str = ""
-}
-
-func (r *lazyRE) FindStringSubmatchIndex(s string) []int {
-       return r.re().FindStringSubmatchIndex(s)
-}
-
-func (r *lazyRE) ReplaceAllString(src, repl string) string {
-       return r.re().ReplaceAllString(src, repl)
-}
-
-func (r *lazyRE) MatchString(s string) bool {
-       return r.re().MatchString(s)
-}
-
-var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
-
-func newLazyRE(str string) *lazyRE {
-       lr := &lazyRE{str: str}
-       if inTest {
-               // In tests, always compile the regexps early.
-               lr.re()
-       }
-       return lr
-}
index 6db5c21c4a222cf8585aa9d21b81d0a576ba3a99..c277b35e89420acfe14bd95ee5a6af7393e91ded 100644 (file)
@@ -7,6 +7,7 @@ package doc
 import (
        "go/ast"
        "go/token"
+       "internal/lazyregexp"
        "sort"
        "strconv"
 )
@@ -168,7 +169,7 @@ type reader struct {
 }
 
 func (r *reader) isVisible(name string) bool {
-       return r.mode&AllDecls != 0 || ast.IsExported(name)
+       return r.mode&AllDecls != 0 || token.IsExported(name)
 }
 
 // lookupType returns the base type with the given name.
@@ -439,9 +440,9 @@ func (r *reader) readFunc(fun *ast.FuncDecl) {
 }
 
 var (
-       noteMarker    = `([A-Z][A-Z]+)\(([^)]+)\):?`           // MARKER(uid), MARKER at least 2 chars, uid at least 1 char
-       noteMarkerRx  = newLazyRE(`^[ \t]*` + noteMarker)      // MARKER(uid) at text start
-       noteCommentRx = newLazyRE(`^/[/*][ \t]*` + noteMarker) // MARKER(uid) at comment start
+       noteMarker    = `([A-Z][A-Z]+)\(([^)]+)\):?`                // MARKER(uid), MARKER at least 2 chars, uid at least 1 char
+       noteMarkerRx  = lazyregexp.New(`^[ \t]*` + noteMarker)      // MARKER(uid) at text start
+       noteCommentRx = lazyregexp.New(`^/[/*][ \t]*` + noteMarker) // MARKER(uid) at comment start
 )
 
 // readNote collects a single note from a sequence of comments.
@@ -832,7 +833,7 @@ func sortedFuncs(m methodSet, allMethods bool) []*Func {
                switch {
                case m.Decl == nil:
                        // exclude conflict entry
-               case allMethods, m.Level == 0, !ast.IsExported(removeStar(m.Orig)):
+               case allMethods, m.Level == 0, !token.IsExported(removeStar(m.Orig)):
                        // forced inclusion, method not embedded, or method
                        // embedded but original receiver type not exported
                        list[i] = m
diff --git a/libgo/go/go/doc/testdata/issue10858.0.golden b/libgo/go/go/doc/testdata/issue10858.0.golden
new file mode 100644 (file)
index 0000000..51f8f1e
--- /dev/null
@@ -0,0 +1,79 @@
+// 
+PACKAGE issue10858
+
+IMPORTPATH
+       testdata/issue10858
+
+IMPORTS
+       unsafe
+
+FILENAMES
+       testdata/issue10858.go
+
+CONSTANTS
+       // First line  Second line 
+       const (
+       
+               // C1 comment
+               C1      int     = 1 << 0
+       
+               C2      int     = 1 << 1
+       
+               // C3 comment
+               //
+               // with a line gap
+               C3      int     = 1 << 2
+       )
+
+
+TYPES
+       // StructTag is a comment  with 2 connecting lines 
+       type StructTag string   // adjacent comment
+
+       // Get returns the value associated with key in the tag string. 
+       func (tag StructTag) Get(key string) string
+
+       // First line  Second line 
+       type Type interface {
+               // Should be present
+       
+               // Align returns the alignment in bytes of a value of
+               // this type when allocated in memory.
+               Align() int
+       
+               // FieldAlign returns the alignment in bytes of a value of
+               // this type when used as a field in a struct.
+               FieldAlign() int        // adjacent comment
+       
+               //      Ptr: Elem
+               //      Slice: Elem
+       
+               // Bits returns the size of the type in bits.
+       
+               //
+               // It panics if the type's Kind is not one of the
+               // sized or unsized Int, Uint, Float, or Complex kinds.
+               Bits() int
+       }
+
+       // NewType is a comment  ending with this line. 
+       func NewType() Type
+
+       // TypeAlg is a copy of runtime.typeAlg 
+       type TypeAlg struct {
+               // function for hashing objects of this type
+               //
+               //
+               // (ptr to object, seed) -> hash
+               Hash    func(unsafe.Pointer, uintptr) uintptr
+       
+               // include
+               // include
+       
+               // include
+       
+               // function for comparing objects of this type
+               // (ptr to object A, ptr to object B) -> ==?
+               Equal   func(unsafe.Pointer, unsafe.Pointer) bool
+       }
+
diff --git a/libgo/go/go/doc/testdata/issue10858.1.golden b/libgo/go/go/doc/testdata/issue10858.1.golden
new file mode 100644 (file)
index 0000000..51f8f1e
--- /dev/null
@@ -0,0 +1,79 @@
+// 
+PACKAGE issue10858
+
+IMPORTPATH
+       testdata/issue10858
+
+IMPORTS
+       unsafe
+
+FILENAMES
+       testdata/issue10858.go
+
+CONSTANTS
+       // First line  Second line 
+       const (
+       
+               // C1 comment
+               C1      int     = 1 << 0
+       
+               C2      int     = 1 << 1
+       
+               // C3 comment
+               //
+               // with a line gap
+               C3      int     = 1 << 2
+       )
+
+
+TYPES
+       // StructTag is a comment  with 2 connecting lines 
+       type StructTag string   // adjacent comment
+
+       // Get returns the value associated with key in the tag string. 
+       func (tag StructTag) Get(key string) string
+
+       // First line  Second line 
+       type Type interface {
+               // Should be present
+       
+               // Align returns the alignment in bytes of a value of
+               // this type when allocated in memory.
+               Align() int
+       
+               // FieldAlign returns the alignment in bytes of a value of
+               // this type when used as a field in a struct.
+               FieldAlign() int        // adjacent comment
+       
+               //      Ptr: Elem
+               //      Slice: Elem
+       
+               // Bits returns the size of the type in bits.
+       
+               //
+               // It panics if the type's Kind is not one of the
+               // sized or unsized Int, Uint, Float, or Complex kinds.
+               Bits() int
+       }
+
+       // NewType is a comment  ending with this line. 
+       func NewType() Type
+
+       // TypeAlg is a copy of runtime.typeAlg 
+       type TypeAlg struct {
+               // function for hashing objects of this type
+               //
+               //
+               // (ptr to object, seed) -> hash
+               Hash    func(unsafe.Pointer, uintptr) uintptr
+       
+               // include
+               // include
+       
+               // include
+       
+               // function for comparing objects of this type
+               // (ptr to object A, ptr to object B) -> ==?
+               Equal   func(unsafe.Pointer, unsafe.Pointer) bool
+       }
+
diff --git a/libgo/go/go/doc/testdata/issue10858.2.golden b/libgo/go/go/doc/testdata/issue10858.2.golden
new file mode 100644 (file)
index 0000000..51f8f1e
--- /dev/null
@@ -0,0 +1,79 @@
+// 
+PACKAGE issue10858
+
+IMPORTPATH
+       testdata/issue10858
+
+IMPORTS
+       unsafe
+
+FILENAMES
+       testdata/issue10858.go
+
+CONSTANTS
+       // First line  Second line 
+       const (
+       
+               // C1 comment
+               C1      int     = 1 << 0
+       
+               C2      int     = 1 << 1
+       
+               // C3 comment
+               //
+               // with a line gap
+               C3      int     = 1 << 2
+       )
+
+
+TYPES
+       // StructTag is a comment  with 2 connecting lines 
+       type StructTag string   // adjacent comment
+
+       // Get returns the value associated with key in the tag string. 
+       func (tag StructTag) Get(key string) string
+
+       // First line  Second line 
+       type Type interface {
+               // Should be present
+       
+               // Align returns the alignment in bytes of a value of
+               // this type when allocated in memory.
+               Align() int
+       
+               // FieldAlign returns the alignment in bytes of a value of
+               // this type when used as a field in a struct.
+               FieldAlign() int        // adjacent comment
+       
+               //      Ptr: Elem
+               //      Slice: Elem
+       
+               // Bits returns the size of the type in bits.
+       
+               //
+               // It panics if the type's Kind is not one of the
+               // sized or unsized Int, Uint, Float, or Complex kinds.
+               Bits() int
+       }
+
+       // NewType is a comment  ending with this line. 
+       func NewType() Type
+
+       // TypeAlg is a copy of runtime.typeAlg 
+       type TypeAlg struct {
+               // function for hashing objects of this type
+               //
+               //
+               // (ptr to object, seed) -> hash
+               Hash    func(unsafe.Pointer, uintptr) uintptr
+       
+               // include
+               // include
+       
+               // include
+       
+               // function for comparing objects of this type
+               // (ptr to object A, ptr to object B) -> ==?
+               Equal   func(unsafe.Pointer, unsafe.Pointer) bool
+       }
+
diff --git a/libgo/go/go/doc/testdata/issue10858.go b/libgo/go/go/doc/testdata/issue10858.go
new file mode 100644 (file)
index 0000000..aebea50
--- /dev/null
@@ -0,0 +1,102 @@
+package issue10858
+
+import "unsafe"
+
+// Should be ignored
+
+// First line
+//
+// Second line
+type Type interface {
+       // Should be present
+
+       // Align returns the alignment in bytes of a value of
+       // this type when allocated in memory.
+       Align() int
+
+       // FieldAlign returns the alignment in bytes of a value of
+       // this type when used as a field in a struct.
+       FieldAlign() int // adjacent comment
+
+       //      Ptr: Elem
+       //      Slice: Elem
+
+       // Bits returns the size of the type in bits.
+
+       //
+       // It panics if the type's Kind is not one of the
+       // sized or unsized Int, Uint, Float, or Complex kinds.
+       Bits() int
+
+       // Should be ignored
+}
+
+// Should be ignored
+
+// NewType is a comment
+//
+// ending with this line.
+func NewType() Type {}
+
+// Ignore
+
+// First line
+//
+// Second line
+const (
+       // Should be ignored
+
+       // C1 comment
+       C1 int = 1 << 0
+
+       // Should
+       //
+       // be ignored
+
+       C2 int = 1 << 1
+
+       // C3 comment
+       //
+       // with a line gap
+       C3 int = 1 << 2
+
+       // Should be ignored
+)
+
+// Should be ignored
+
+// Should be ignored
+
+// TypeAlg is a
+// copy of runtime.typeAlg
+type TypeAlg struct {
+       // function for hashing objects of this type
+       //
+       //
+       // (ptr to object, seed) -> hash
+       Hash func(unsafe.Pointer, uintptr) uintptr
+
+       // include
+       // include
+
+       // include
+
+       // function for comparing objects of this type
+       // (ptr to object A, ptr to object B) -> ==?
+       Equal func(unsafe.Pointer, unsafe.Pointer) bool
+       // Should be ignored
+}
+
+// Should be ignored
+
+// StructTag is a comment
+//
+//
+// with 2 connecting lines
+type StructTag string // adjacent comment
+
+// Should be ignored
+
+// Get returns the value associated with key in the tag string.
+func (tag StructTag) Get(key string) string {
+}
index 7882963506cf32b02d63adb8587418dbbba80030..703090b7b6bf8fdaaba04d9419e4db4db66cd85f 100644 (file)
@@ -78,7 +78,7 @@ func ForCompiler(fset *token.FileSet, compiler string, lookup Lookup) types.Impo
 
 // For calls ForCompiler with a new FileSet.
 //
-// Deprecated: use ForCompiler, which populates a FileSet
+// Deprecated: Use ForCompiler, which populates a FileSet
 // with the positions of objects created by the importer.
 func For(compiler string, lookup Lookup) types.Importer {
        return ForCompiler(token.NewFileSet(), compiler, lookup)
index 58fa8c8cf5ccad8aeede19bc01e18c19b886ec31..beb39e6089adb835aab555a127f103e861063dd2 100644 (file)
@@ -19,6 +19,7 @@ import (
 type importerTest struct {
        pkgpath, name, want, wantval string
        wantinits                    []string
+       gccgoVersion                 int // minimum gccgo version (0 => any)
 }
 
 func runImporterTest(t *testing.T, imp Importer, initmap map[*types.Package]InitData, test *importerTest) {
@@ -71,6 +72,8 @@ func runImporterTest(t *testing.T, imp Importer, initmap map[*types.Package]Init
        }
 }
 
+// When adding tests to this list, be sure to set the 'gccgoVersion'
+// field if the testcases uses a "recent" Go addition (ex: aliases).
 var importerTests = [...]importerTest{
        {pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"},
        {pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1 + -1i)"},
@@ -84,13 +87,15 @@ var importerTests = [...]importerTest{
        {pkgpath: "unicode", name: "MaxRune", want: "const MaxRune untyped rune", wantval: "1114111"},
        {pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import"}},
        {pkgpath: "importsar", name: "Hello", want: "var Hello string"},
-       {pkgpath: "aliases", name: "A14", want: "type A14 = func(int, T0) chan T2"},
-       {pkgpath: "aliases", name: "C0", want: "type C0 struct{f1 C1; f2 C1}"},
+       {pkgpath: "aliases", name: "A14", gccgoVersion: 7, want: "type A14 = func(int, T0) chan T2"},
+       {pkgpath: "aliases", name: "C0", gccgoVersion: 7, want: "type C0 struct{f1 C1; f2 C1}"},
        {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"},
-       {pkgpath: "issue27856", name: "M", want: "type M struct{E F}"},
+       {pkgpath: "issue27856", name: "M", gccgoVersion: 7, want: "type M struct{E F}"},
        {pkgpath: "v1reflect", name: "Type", want: "type Type interface{Align() int; AssignableTo(u Type) bool; Bits() int; ChanDir() ChanDir; Elem() Type; Field(i int) StructField; FieldAlign() int; FieldByIndex(index []int) StructField; FieldByName(name string) (StructField, bool); FieldByNameFunc(match func(string) bool) (StructField, bool); Implements(u Type) bool; In(i int) Type; IsVariadic() bool; Key() Type; Kind() Kind; Len() int; Method(int) Method; MethodByName(string) (Method, bool); Name() string; NumField() int; NumIn() int; NumMethod() int; NumOut() int; Out(i int) Type; PkgPath() string; Size() uintptr; String() string; common() *commonType; rawString() string; runtimeType() *runtimeType; uncommon() *uncommonType}"},
        {pkgpath: "nointerface", name: "I", want: "type I int"},
-       {pkgpath: "issue29198", name: "FooServer", want: "type FooServer struct{FooServer *FooServer; user string; ctx context.Context}"},
+       {pkgpath: "issue29198", name: "FooServer", gccgoVersion: 7, want: "type FooServer struct{FooServer *FooServer; user string; ctx context.Context}"},
+       {pkgpath: "issue30628", name: "Apple", want: "type Apple struct{hey sync.RWMutex; x int; RQ [517]struct{Count uintptr; NumBytes uintptr; Last uintptr}}"},
+       {pkgpath: "issue31540", name: "S", gccgoVersion: 7, want: "type S struct{b int; map[Y]Z}"},
 }
 
 func TestGoxImporter(t *testing.T) {
@@ -162,12 +167,10 @@ func TestObjImporter(t *testing.T) {
        arimp := GetImporter([]string{artmpdir}, arinitmap)
 
        for _, test := range importerTests {
-               // Support for type aliases was added in GCC 7.
-               if test.pkgpath == "aliases" || test.pkgpath == "issue27856" || test.pkgpath == "issue29198" {
-                       if major < 7 {
-                               t.Logf("skipping %q: not supported before gccgo version 7", test.pkgpath)
-                               continue
-                       }
+               if major < test.gccgoVersion {
+                       // Support for type aliases was added in GCC 7.
+                       t.Logf("skipping %q: not supported before gccgo version %d", test.pkgpath, test.gccgoVersion)
+                       continue
                }
 
                gofile := filepath.Join("testdata", test.pkgpath+".go")
index 5881d9c79cb7363373c6854a0507d053aeee7bec..76f30bb9ca5522c7809acaa3b612383940fb6984 100644 (file)
@@ -31,6 +31,7 @@ type parser struct {
        typeData []string                  // unparsed type data (v3 and later)
        fixups   []fixupRecord             // fixups to apply at end of parsing
        initdata InitData                  // package init priority data
+       aliases  map[int]string            // maps saved type number to alias name
 }
 
 // When reading export data it's possible to encounter a defined type
@@ -57,6 +58,7 @@ func (p *parser) init(filename string, src io.Reader, imports map[string]*types.
        p.scanner = new(scanner.Scanner)
        p.initScanner(filename, src)
        p.imports = imports
+       p.aliases = make(map[int]string)
        p.typeList = make([]types.Type, 1 /* type numbers start at 1 */, 16)
 }
 
@@ -238,17 +240,22 @@ func deref(typ types.Type) types.Type {
 // Field = Name Type [string] .
 func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) {
        name := p.parseName()
-       typ := p.parseType(pkg)
+       typ, n := p.parseTypeExtended(pkg)
        anon := false
        if name == "" {
                anon = true
-               switch typ := deref(typ).(type) {
-               case *types.Basic:
-                       name = typ.Name()
-               case *types.Named:
-                       name = typ.Obj().Name()
-               default:
-                       p.error("anonymous field expected")
+               // Alias?
+               if aname, ok := p.aliases[n]; ok {
+                       name = aname
+               } else {
+                       switch typ := deref(typ).(type) {
+                       case *types.Basic:
+                               name = typ.Name()
+                       case *types.Named:
+                               name = typ.Obj().Name()
+                       default:
+                               p.error("anonymous field expected")
+                       }
                }
        }
        field = types.NewField(token.NoPos, pkg, name, typ, anon)
@@ -497,6 +504,7 @@ func (p *parser) parseNamedType(nlist []int) types.Type {
        // type alias
        if p.tok == '=' {
                p.next()
+               p.aliases[nlist[len(nlist)-1]] = name
                if obj != nil {
                        // use the previously imported (canonical) type
                        t := obj.Type()
@@ -715,7 +723,8 @@ func (p *parser) parseResultList(pkg *types.Package) *types.Tuple {
                if p.tok == scanner.Ident && p.lit == "inl" {
                        return nil
                }
-               return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseTypeAfterAngle(pkg)))
+               taa, _ := p.parseTypeAfterAngle(pkg)
+               return types.NewTuple(types.NewParam(token.NoPos, pkg, "", taa))
 
        case '(':
                params, _ := p.parseParamList(pkg)
@@ -905,16 +914,18 @@ func lookupBuiltinType(typ int) types.Type {
 //
 func (p *parser) parseType(pkg *types.Package, n ...int) types.Type {
        p.expect('<')
-       return p.parseTypeAfterAngle(pkg, n...)
+       t, _ := p.parseTypeAfterAngle(pkg, n...)
+       return t
 }
 
 // (*parser).Type after reading the "<".
-func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type) {
+func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type, n1 int) {
        p.expectKeyword("type")
 
+       n1 = 0
        switch p.tok {
        case scanner.Int:
-               n1 := p.parseInt()
+               n1 = p.parseInt()
                if p.tok == '>' {
                        if len(p.typeData) > 0 && p.typeList[n1] == nil {
                                p.parseSavedType(pkg, n1, n)
@@ -937,7 +948,7 @@ func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type
 
        default:
                p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-               return nil
+               return nil, 0
        }
 
        if t == nil || t == reserved {
@@ -948,6 +959,15 @@ func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type
        return
 }
 
+// parseTypeExtended is identical to parseType, but if the type in
+// question is a saved type, returns the index as well as the type
+// pointer (index returned is zero if we parsed a builtin).
+func (p *parser) parseTypeExtended(pkg *types.Package, n ...int) (t types.Type, n1 int) {
+       p.expect('<')
+       t, n1 = p.parseTypeAfterAngle(pkg, n...)
+       return
+}
+
 // InlineBody = "<inl:NN>" .{NN}
 // Reports whether a body was skipped.
 func (p *parser) skipInlineBody() {
diff --git a/libgo/go/go/internal/gccgoimporter/testdata/issue30628.go b/libgo/go/go/internal/gccgoimporter/testdata/issue30628.go
new file mode 100644 (file)
index 0000000..8fd7c13
--- /dev/null
@@ -0,0 +1,18 @@
+package issue30628
+
+import (
+       "os"
+       "sync"
+)
+
+const numR = int32(os.O_TRUNC + 5)
+
+type Apple struct {
+       hey sync.RWMutex
+       x   int
+       RQ  [numR]struct {
+               Count    uintptr
+               NumBytes uintptr
+               Last     uintptr
+       }
+}
diff --git a/libgo/go/go/internal/gccgoimporter/testdata/issue30628.gox b/libgo/go/go/internal/gccgoimporter/testdata/issue30628.gox
new file mode 100644 (file)
index 0000000..0ff6259
--- /dev/null
@@ -0,0 +1,28 @@
+v3;
+package issue30628
+pkgpath issue30628
+import os os "os"
+import sync sync "sync"
+init cpu internal..z2fcpu..import poll internal..z2fpoll..import testlog internal..z2ftestlog..import io io..import os os..import runtime runtime..import sys runtime..z2finternal..z2fsys..import sync sync..import syscall syscall..import time time..import
+init_graph 1 0 1 3 1 5 1 6 1 7 1 8 1 9 3 0 3 5 3 6 3 7 4 0 4 1 4 2 4 3 4 5 4 6 4 7 4 8 4 9 5 0 5 6 7 0 7 5 7 6 8 0 8 5 8 6 8 7 9 0 9 5 9 6 9 7 9 8
+types 13 2 24 84 208 17 30 41 147 86 17 64 25 75
+type 1 "Apple" <type 2>
+type 2 struct { .issue30628.hey <type 3>; .issue30628.x <type -11>; RQ <type 11>; }
+type 3 "sync.RWMutex" <type 7>
+ func (rw <type 4>) Lock ()
+ func (rw <esc:0x12> <type 4>) RLocker () ($ret8 <type 5>)
+ func (rw <type 4>) RUnlock ()
+ func (rw <type 4>) Unlock ()
+ func (rw <type 4>) RLock ()
+type 4 *<type 3>
+type 5 "sync.Locker" <type 6>
+type 6 interface { Lock (); Unlock (); }
+type 7 struct { .sync.w <type 8>; .sync.writerSem <type -7>; .sync.readerSem <type -7>; .sync.readerCount <type -3>; .sync.readerWait <type -3>; }
+type 8 "sync.Mutex" <type 10>
+ func (m <type 9>) Unlock ()
+ func (m <type 9>) Lock ()
+type 9 *<type 8>
+type 10 struct { .sync.state <type -3>; .sync.sema <type -7>; }
+type 11 [517 ] <type 12>
+type 12 struct { Count <type -13>; NumBytes <type -13>; Last <type -13>; }
+checksum 199DCF6D3EE2FCF39F715B4E42B5F87F5B15D3AF
diff --git a/libgo/go/go/internal/gccgoimporter/testdata/issue31540.go b/libgo/go/go/internal/gccgoimporter/testdata/issue31540.go
new file mode 100644 (file)
index 0000000..2c6799e
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue31540
+
+type Y struct {
+       q int
+}
+
+type Z map[int]int
+
+type X = map[Y]Z
+
+type A1 = X
+
+type A2 = A1
+
+type S struct {
+       b int
+       A2
+}
+
+func Hallo() S {
+       return S{}
+}
diff --git a/libgo/go/go/internal/gccgoimporter/testdata/issue31540.gox b/libgo/go/go/internal/gccgoimporter/testdata/issue31540.gox
new file mode 100644 (file)
index 0000000..abdc696
--- /dev/null
@@ -0,0 +1,16 @@
+v3;
+package issue31540
+pkgpath issue31540
+types 11 7 23 23 20 22 20 21 57 31 45 36
+type 1 "A1" = <type 4>
+type 2 "A2" = <type 1>
+type 3 "S" <type 7>
+type 4 "X" = <type 8>
+type 5 "Y" <type 9>
+type 6 "Z" <type 10>
+type 7 struct { .go.mapalias.b <type -11>; ? <type 2>; }
+type 8 map [<type 5>] <type 6>
+type 9 struct { .go.mapalias.q <type -11>; }
+type 10 map [<type -11>] <type -11>
+func Hallo () <type 3>
+checksum C3FAF2524A90BC11225EE65D059BF27DFB69134B
index 4e3023b906e031db38a111053922a9c68b559950..cf03632aa201bd923cc4f43d454b13c212c5cd57 100644 (file)
@@ -14,8 +14,6 @@ import (
        "strconv"
        "strings"
        "sync"
-       "unicode"
-       "unicode/utf8"
 )
 
 type importer struct {
@@ -446,7 +444,7 @@ func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type {
                        // TODO(gri) replace this with something closer to fieldName
                        pos := p.pos()
                        name := p.string()
-                       if !exported(name) {
+                       if !token.IsExported(name) {
                                p.pkg()
                        }
 
@@ -675,7 +673,7 @@ func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name st
                alias = true
                fallthrough
        default:
-               if !exported(name) {
+               if !token.IsExported(name) {
                        pkg = p.pkg()
                }
        }
@@ -730,11 +728,6 @@ func (p *importer) param(named bool) (*types.Var, bool) {
        return types.NewVar(token.NoPos, pkg, name, t), isddd
 }
 
-func exported(name string) bool {
-       ch, _ := utf8.DecodeRuneInString(name)
-       return unicode.IsUpper(ch)
-}
-
 func (p *importer) value() constant.Value {
        switch tag := p.tagOrIndex(); tag {
        case falseTag:
index 9a0273ba2070fd0b62ea18c9e3cde41e63d6b7c6..8ba3242102779d2917640f48f9178a75f503ff3b 100644 (file)
@@ -19,7 +19,7 @@ const (
        C1     = 3.14159265
        C2     = 2.718281828i
        C3     = -123.456e-789
-       C4     = +123.456E+789
+       C4     = +123.456e+789
        C5     = 1234i
        C6     = "foo\n"
        C7     = `bar\n`
index b84672610c6f8be8875062192fcb11b8d64c505e..56549434d14d3ec15611d46a8b265d1fc212b7e2 100644 (file)
@@ -81,10 +81,10 @@ func TestImportStdLib(t *testing.T) {
                t.Skip("no source code available")
        }
 
-       dt := maxTime
        if testing.Short() && testenv.Builder() == "" {
-               dt = 500 * time.Millisecond
+               t.Skip("skipping in -short mode")
        }
+       dt := maxTime
        nimports, _ := walkDir(t, "", time.Now().Add(dt)) // installed packages
        t.Logf("tested %d imports", nimports)
 }
@@ -99,7 +99,7 @@ var importedObjectTests = []struct {
        {"math.Pi", "const Pi untyped float"},
        {"math.Sin", "func Sin(x float64) float64"},
        {"math/big.Int", "type Int struct{neg bool; abs nat}"},
-       {"internal/x/text/unicode/norm.MaxSegmentSize", "const MaxSegmentSize untyped int"},
+       {"golang.org/x/text/unicode/norm.MaxSegmentSize", "const MaxSegmentSize untyped int"},
 }
 
 func TestImportedTypes(t *testing.T) {
@@ -108,12 +108,12 @@ func TestImportedTypes(t *testing.T) {
        }
 
        for _, test := range importedObjectTests {
-               s := strings.Split(test.name, ".")
-               if len(s) != 2 {
+               i := strings.LastIndex(test.name, ".")
+               if i < 0 {
                        t.Fatal("invalid test data format")
                }
-               importPath := s[0]
-               objName := s[1]
+               importPath := test.name[:i]
+               objName := test.name[i+1:]
 
                pkg, err := importer.ImportFrom(importPath, ".", 0)
                if err != nil {
index ba16b652246f11bcae4c99e21ca29420fb830f53..9294bb6b3ef690f78b60f681dfd781c6d2448097 100644 (file)
@@ -63,6 +63,7 @@ type parser struct {
        topScope   *ast.Scope        // top-most scope; may be pkgScope
        unresolved []*ast.Ident      // unresolved identifiers
        imports    []*ast.ImportSpec // list of imports
+       inStruct   bool              // if set, parser is parsing a struct or interface (for comment collection)
 
        // Label scopes
        // (maintained by open/close LabelScope)
@@ -337,7 +338,15 @@ func (p *parser) next() {
                // consume successor comments, if any
                endline = -1
                for p.tok == token.COMMENT {
-                       comment, endline = p.consumeCommentGroup(1)
+                       n := 1
+                       // When inside a struct (or interface), we don't want to lose comments
+                       // separated from individual field (or method) documentation by empty
+                       // lines. Allow for some white space in this case and collect those
+                       // comments as a group. See issue #10858 for details.
+                       if p.inStruct {
+                               n = 2
+                       }
+                       comment, endline = p.consumeCommentGroup(n)
                }
 
                if endline+1 == p.file.Line(p.pos) {
@@ -748,6 +757,7 @@ func (p *parser) parseStructType() *ast.StructType {
        }
 
        pos := p.expect(token.STRUCT)
+       p.inStruct = true
        lbrace := p.expect(token.LBRACE)
        scope := ast.NewScope(nil) // struct scope
        var list []*ast.Field
@@ -758,6 +768,7 @@ func (p *parser) parseStructType() *ast.StructType {
                list = append(list, p.parseFieldDecl(scope))
        }
        rbrace := p.expect(token.RBRACE)
+       p.inStruct = false
 
        return &ast.StructType{
                Struct: pos,
@@ -959,6 +970,7 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType {
        }
 
        pos := p.expect(token.INTERFACE)
+       p.inStruct = true
        lbrace := p.expect(token.LBRACE)
        scope := ast.NewScope(nil) // interface scope
        var list []*ast.Field
@@ -966,6 +978,7 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType {
                list = append(list, p.parseMethodSpec(scope))
        }
        rbrace := p.expect(token.RBRACE)
+       p.inStruct = false
 
        return &ast.InterfaceType{
                Interface: pos,
index 0f2029cadaa7d136def1a4407ba9c73e5a082586..fa7589e86841a62683ddd6523b0307bf0e367161 100644 (file)
@@ -1568,7 +1568,7 @@ func (p *printer) genDecl(d *ast.GenDecl) {
                }
                p.print(d.Rparen, token.RPAREN)
 
-       } else {
+       } else if len(d.Specs) > 0 {
                // single declaration
                p.spec(d.Specs[0], 1, true)
        }
index 91eca585c09563cfc4657c81a4081d7ae1e9798a..a240bf48465e8fe90e3d8b4134b2f9f7e3d1ae1a 100644 (file)
@@ -153,6 +153,10 @@ func runcheck(t *testing.T, source, golden string, mode checkMode) {
                // (This is very difficult to achieve in general and for now
                // it is only checked for files explicitly marked as such.)
                res, err = format(gld, mode)
+               if err != nil {
+                       t.Error(err)
+                       return
+               }
                if err := diff(golden, fmt.Sprintf("format(%s)", golden), gld, res); err != nil {
                        t.Errorf("golden is not idempotent: %s", err)
                }
@@ -744,6 +748,9 @@ func TestParenthesizedDecl(t *testing.T) {
        const src = "package p; var ( a float64; b int )"
        fset := token.NewFileSet()
        f, err := parser.ParseFile(fset, "", src, 0)
+       if err != nil {
+               t.Fatal(err)
+       }
 
        // print the original package
        var buf bytes.Buffer
index e78abf12a27cf445c7cc129877fc3f3fa493927c..00fe2dc0b19fd0b66bbe3fb48d27d1b0d27b972f 100644 (file)
@@ -150,6 +150,10 @@ func (s *Scanner) error(offs int, msg string) {
        s.ErrorCount++
 }
 
+func (s *Scanner) errorf(offs int, format string, args ...interface{}) {
+       s.error(offs, fmt.Sprintf(format, args...))
+}
+
 func (s *Scanner) scanComment() string {
        // initial '/' already consumed; s.ch == '/' || s.ch == '*'
        offs := s.offset - 1 // position of initial '/'
@@ -336,11 +340,11 @@ func (s *Scanner) findLineEnd() bool {
 }
 
 func isLetter(ch rune) bool {
-       return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= utf8.RuneSelf && unicode.IsLetter(ch)
+       return 'a' <= lower(ch) && lower(ch) <= 'z' || ch == '_' || ch >= utf8.RuneSelf && unicode.IsLetter(ch)
 }
 
 func isDigit(ch rune) bool {
-       return '0' <= ch && ch <= '9' || ch >= utf8.RuneSelf && unicode.IsDigit(ch)
+       return isDecimal(ch) || ch >= utf8.RuneSelf && unicode.IsDigit(ch)
 }
 
 func (s *Scanner) scanIdentifier() string {
@@ -355,95 +359,185 @@ func digitVal(ch rune) int {
        switch {
        case '0' <= ch && ch <= '9':
                return int(ch - '0')
-       case 'a' <= ch && ch <= 'f':
-               return int(ch - 'a' + 10)
-       case 'A' <= ch && ch <= 'F':
-               return int(ch - 'A' + 10)
+       case 'a' <= lower(ch) && lower(ch) <= 'f':
+               return int(lower(ch) - 'a' + 10)
        }
        return 16 // larger than any legal digit val
 }
 
-func (s *Scanner) scanMantissa(base int) {
-       for digitVal(s.ch) < base {
-               s.next()
+func lower(ch rune) rune     { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter
+func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' }
+func isHex(ch rune) bool     { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' }
+
+// digits accepts the sequence { digit | '_' }.
+// If base <= 10, digits accepts any decimal digit but records
+// the offset (relative to the source start) of a digit >= base
+// in *invalid, if *invalid < 0.
+// digits returns a bitset describing whether the sequence contained
+// digits (bit 0 is set), or separators '_' (bit 1 is set).
+func (s *Scanner) digits(base int, invalid *int) (digsep int) {
+       if base <= 10 {
+               max := rune('0' + base)
+               for isDecimal(s.ch) || s.ch == '_' {
+                       ds := 1
+                       if s.ch == '_' {
+                               ds = 2
+                       } else if s.ch >= max && *invalid < 0 {
+                               *invalid = int(s.offset) // record invalid rune offset
+                       }
+                       digsep |= ds
+                       s.next()
+               }
+       } else {
+               for isHex(s.ch) || s.ch == '_' {
+                       ds := 1
+                       if s.ch == '_' {
+                               ds = 2
+                       }
+                       digsep |= ds
+                       s.next()
+               }
        }
+       return
 }
 
-func (s *Scanner) scanNumber(seenDecimalPoint bool) (token.Token, string) {
-       // digitVal(s.ch) < 10
+func (s *Scanner) scanNumber() (token.Token, string) {
        offs := s.offset
-       tok := token.INT
+       tok := token.ILLEGAL
 
-       if seenDecimalPoint {
-               offs--
-               tok = token.FLOAT
-               s.scanMantissa(10)
-               goto exponent
-       }
+       base := 10        // number base
+       prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b'
+       digsep := 0       // bit 0: digit present, bit 1: '_' present
+       invalid := -1     // index of invalid digit in literal, or < 0
 
-       if s.ch == '0' {
-               // int or float
-               offs := s.offset
-               s.next()
-               if s.ch == 'x' || s.ch == 'X' {
-                       // hexadecimal int
+       // integer part
+       if s.ch != '.' {
+               tok = token.INT
+               if s.ch == '0' {
                        s.next()
-                       s.scanMantissa(16)
-                       if s.offset-offs <= 2 {
-                               // only scanned "0x" or "0X"
-                               s.error(offs, "illegal hexadecimal number")
-                       }
-               } else {
-                       // octal int or float
-                       seenDecimalDigit := false
-                       s.scanMantissa(8)
-                       if s.ch == '8' || s.ch == '9' {
-                               // illegal octal int or float
-                               seenDecimalDigit = true
-                               s.scanMantissa(10)
-                       }
-                       if s.ch == '.' || s.ch == 'e' || s.ch == 'E' || s.ch == 'i' {
-                               goto fraction
-                       }
-                       // octal int
-                       if seenDecimalDigit {
-                               s.error(offs, "illegal octal number")
+                       switch lower(s.ch) {
+                       case 'x':
+                               s.next()
+                               base, prefix = 16, 'x'
+                       case 'o':
+                               s.next()
+                               base, prefix = 8, 'o'
+                       case 'b':
+                               s.next()
+                               base, prefix = 2, 'b'
+                       default:
+                               base, prefix = 8, '0'
+                               digsep = 1 // leading 0
                        }
                }
-               goto exit
+               digsep |= s.digits(base, &invalid)
        }
 
-       // decimal int or float
-       s.scanMantissa(10)
-
-fraction:
+       // fractional part
        if s.ch == '.' {
                tok = token.FLOAT
+               if prefix == 'o' || prefix == 'b' {
+                       s.error(s.offset, "invalid radix point in "+litname(prefix))
+               }
                s.next()
-               s.scanMantissa(10)
+               digsep |= s.digits(base, &invalid)
        }
 
-exponent:
-       if s.ch == 'e' || s.ch == 'E' {
-               tok = token.FLOAT
+       if digsep&1 == 0 {
+               s.error(s.offset, litname(prefix)+" has no digits")
+       }
+
+       // exponent
+       if e := lower(s.ch); e == 'e' || e == 'p' {
+               switch {
+               case e == 'e' && prefix != 0 && prefix != '0':
+                       s.errorf(s.offset, "%q exponent requires decimal mantissa", s.ch)
+               case e == 'p' && prefix != 'x':
+                       s.errorf(s.offset, "%q exponent requires hexadecimal mantissa", s.ch)
+               }
                s.next()
-               if s.ch == '-' || s.ch == '+' {
+               tok = token.FLOAT
+               if s.ch == '+' || s.ch == '-' {
                        s.next()
                }
-               if digitVal(s.ch) < 10 {
-                       s.scanMantissa(10)
-               } else {
-                       s.error(offs, "illegal floating-point exponent")
+               ds := s.digits(10, nil)
+               digsep |= ds
+               if ds&1 == 0 {
+                       s.error(s.offset, "exponent has no digits")
                }
+       } else if prefix == 'x' && tok == token.FLOAT {
+               s.error(s.offset, "hexadecimal mantissa requires a 'p' exponent")
        }
 
+       // suffix 'i'
        if s.ch == 'i' {
                tok = token.IMAG
                s.next()
        }
 
-exit:
-       return tok, string(s.src[offs:s.offset])
+       lit := string(s.src[offs:s.offset])
+       if tok == token.INT && invalid >= 0 {
+               s.errorf(invalid, "invalid digit %q in %s", lit[invalid-offs], litname(prefix))
+       }
+       if digsep&2 != 0 {
+               if i := invalidSep(lit); i >= 0 {
+                       s.error(offs+i, "'_' must separate successive digits")
+               }
+       }
+
+       return tok, lit
+}
+
+func litname(prefix rune) string {
+       switch prefix {
+       case 'x':
+               return "hexadecimal literal"
+       case 'o', '0':
+               return "octal literal"
+       case 'b':
+               return "binary literal"
+       }
+       return "decimal literal"
+}
+
+// invalidSep returns the index of the first invalid separator in x, or -1.
+func invalidSep(x string) int {
+       x1 := ' ' // prefix char, we only care if it's 'x'
+       d := '.'  // digit, one of '_', '0' (a digit), or '.' (anything else)
+       i := 0
+
+       // a prefix counts as a digit
+       if len(x) >= 2 && x[0] == '0' {
+               x1 = lower(rune(x[1]))
+               if x1 == 'x' || x1 == 'o' || x1 == 'b' {
+                       d = '0'
+                       i = 2
+               }
+       }
+
+       // mantissa and exponent
+       for ; i < len(x); i++ {
+               p := d // previous digit
+               d = rune(x[i])
+               switch {
+               case d == '_':
+                       if p != '0' {
+                               return i
+                       }
+               case isDecimal(d) || x1 == 'x' && isHex(d):
+                       d = '0'
+               default:
+                       if p == '_' {
+                               return i - 1
+                       }
+                       d = '.'
+               }
+       }
+       if d == '_' {
+               return len(x) - 1
+       }
+
+       return -1
 }
 
 // scanEscape parses an escape sequence where rune is the accepted
@@ -708,9 +802,9 @@ scanAgain:
                        insertSemi = true
                        tok = token.IDENT
                }
-       case '0' <= ch && ch <= '9':
+       case isDecimal(ch) || ch == '.' && isDecimal(rune(s.peek())):
                insertSemi = true
-               tok, lit = s.scanNumber(false)
+               tok, lit = s.scanNumber()
        default:
                s.next() // always make progress
                switch ch {
@@ -741,16 +835,12 @@ scanAgain:
                case ':':
                        tok = s.switch2(token.COLON, token.DEFINE)
                case '.':
-                       if '0' <= s.ch && s.ch <= '9' {
-                               insertSemi = true
-                               tok, lit = s.scanNumber(true)
-                       } else {
-                               tok = token.PERIOD
-                               if s.ch == '.' && s.peek() == '.' {
-                                       s.next()
-                                       s.next() // consume last '.'
-                                       tok = token.ELLIPSIS
-                               }
+                       // fractions starting with a '.' are handled by outer switch
+                       tok = token.PERIOD
+                       if s.ch == '.' && s.peek() == '.' {
+                               s.next()
+                               s.next() // consume last '.'
+                               tok = token.ELLIPSIS
                        }
                case ',':
                        tok = token.COMMA
@@ -835,7 +925,7 @@ scanAgain:
                default:
                        // next reports unexpected BOMs - don't repeat
                        if ch != bom {
-                               s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch))
+                               s.errorf(s.file.Offset(pos), "illegal character %#U", ch)
                        }
                        insertSemi = s.insertSemi // preserve insertSemi info
                        tok = token.ILLEGAL
index 36c962209ce1dc5addb02c071dce54ffc77a2c7c..9d3bbbbb24e8a5db8667e7ba1cf62c9b7db9986d 100644 (file)
@@ -10,6 +10,7 @@ import (
        "os"
        "path/filepath"
        "runtime"
+       "strings"
        "testing"
 )
 
@@ -802,11 +803,10 @@ var errors = []struct {
        {"078.", token.FLOAT, 0, "078.", ""},
        {"07801234567.", token.FLOAT, 0, "07801234567.", ""},
        {"078e0", token.FLOAT, 0, "078e0", ""},
-       {"0E", token.FLOAT, 0, "0E", "illegal floating-point exponent"}, // issue 17621
-       {"078", token.INT, 0, "078", "illegal octal number"},
-       {"07800000009", token.INT, 0, "07800000009", "illegal octal number"},
-       {"0x", token.INT, 0, "0x", "illegal hexadecimal number"},
-       {"0X", token.INT, 0, "0X", "illegal hexadecimal number"},
+       {"0E", token.FLOAT, 2, "0E", "exponent has no digits"}, // issue 17621
+       {"078", token.INT, 2, "078", "invalid digit '8' in octal literal"},
+       {"07090000008", token.INT, 3, "07090000008", "invalid digit '9' in octal literal"},
+       {"0x", token.INT, 2, "0x", "hexadecimal literal has no digits"},
        {"\"abc\x00def\"", token.STRING, 4, "\"abc\x00def\"", "illegal character NUL"},
        {"\"abc\x80def\"", token.STRING, 4, "\"abc\x80def\"", "illegal UTF-8 encoding"},
        {"\ufeff\ufeff", token.ILLEGAL, 3, "\ufeff\ufeff", "illegal byte order mark"},                        // only first BOM is ignored
@@ -912,3 +912,203 @@ func BenchmarkScanFile(b *testing.B) {
                }
        }
 }
+
+func TestNumbers(t *testing.T) {
+       for _, test := range []struct {
+               tok              token.Token
+               src, tokens, err string
+       }{
+               // binaries
+               {token.INT, "0b0", "0b0", ""},
+               {token.INT, "0b1010", "0b1010", ""},
+               {token.INT, "0B1110", "0B1110", ""},
+
+               {token.INT, "0b", "0b", "binary literal has no digits"},
+               {token.INT, "0b0190", "0b0190", "invalid digit '9' in binary literal"},
+               {token.INT, "0b01a0", "0b01 a0", ""}, // only accept 0-9
+
+               {token.FLOAT, "0b.", "0b.", "invalid radix point in binary literal"},
+               {token.FLOAT, "0b.1", "0b.1", "invalid radix point in binary literal"},
+               {token.FLOAT, "0b1.0", "0b1.0", "invalid radix point in binary literal"},
+               {token.FLOAT, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"},
+               {token.FLOAT, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"},
+
+               {token.IMAG, "0b10i", "0b10i", ""},
+               {token.IMAG, "0b10.0i", "0b10.0i", "invalid radix point in binary literal"},
+
+               // octals
+               {token.INT, "0o0", "0o0", ""},
+               {token.INT, "0o1234", "0o1234", ""},
+               {token.INT, "0O1234", "0O1234", ""},
+
+               {token.INT, "0o", "0o", "octal literal has no digits"},
+               {token.INT, "0o8123", "0o8123", "invalid digit '8' in octal literal"},
+               {token.INT, "0o1293", "0o1293", "invalid digit '9' in octal literal"},
+               {token.INT, "0o12a3", "0o12 a3", ""}, // only accept 0-9
+
+               {token.FLOAT, "0o.", "0o.", "invalid radix point in octal literal"},
+               {token.FLOAT, "0o.2", "0o.2", "invalid radix point in octal literal"},
+               {token.FLOAT, "0o1.2", "0o1.2", "invalid radix point in octal literal"},
+               {token.FLOAT, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"},
+               {token.FLOAT, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"},
+
+               {token.IMAG, "0o10i", "0o10i", ""},
+               {token.IMAG, "0o10e0i", "0o10e0i", "'e' exponent requires decimal mantissa"},
+
+               // 0-octals
+               {token.INT, "0", "0", ""},
+               {token.INT, "0123", "0123", ""},
+
+               {token.INT, "08123", "08123", "invalid digit '8' in octal literal"},
+               {token.INT, "01293", "01293", "invalid digit '9' in octal literal"},
+               {token.INT, "0F.", "0 F .", ""}, // only accept 0-9
+               {token.INT, "0123F.", "0123 F .", ""},
+               {token.INT, "0123456x", "0123456 x", ""},
+
+               // decimals
+               {token.INT, "1", "1", ""},
+               {token.INT, "1234", "1234", ""},
+
+               {token.INT, "1f", "1 f", ""}, // only accept 0-9
+
+               {token.IMAG, "0i", "0i", ""},
+               {token.IMAG, "0678i", "0678i", ""},
+
+               // decimal floats
+               {token.FLOAT, "0.", "0.", ""},
+               {token.FLOAT, "123.", "123.", ""},
+               {token.FLOAT, "0123.", "0123.", ""},
+
+               {token.FLOAT, ".0", ".0", ""},
+               {token.FLOAT, ".123", ".123", ""},
+               {token.FLOAT, ".0123", ".0123", ""},
+
+               {token.FLOAT, "0.0", "0.0", ""},
+               {token.FLOAT, "123.123", "123.123", ""},
+               {token.FLOAT, "0123.0123", "0123.0123", ""},
+
+               {token.FLOAT, "0e0", "0e0", ""},
+               {token.FLOAT, "123e+0", "123e+0", ""},
+               {token.FLOAT, "0123E-1", "0123E-1", ""},
+
+               {token.FLOAT, "0.e+1", "0.e+1", ""},
+               {token.FLOAT, "123.E-10", "123.E-10", ""},
+               {token.FLOAT, "0123.e123", "0123.e123", ""},
+
+               {token.FLOAT, ".0e-1", ".0e-1", ""},
+               {token.FLOAT, ".123E+10", ".123E+10", ""},
+               {token.FLOAT, ".0123E123", ".0123E123", ""},
+
+               {token.FLOAT, "0.0e1", "0.0e1", ""},
+               {token.FLOAT, "123.123E-10", "123.123E-10", ""},
+               {token.FLOAT, "0123.0123e+456", "0123.0123e+456", ""},
+
+               {token.FLOAT, "0e", "0e", "exponent has no digits"},
+               {token.FLOAT, "0E+", "0E+", "exponent has no digits"},
+               {token.FLOAT, "1e+f", "1e+ f", "exponent has no digits"},
+               {token.FLOAT, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"},
+               {token.FLOAT, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"},
+
+               {token.IMAG, "0.i", "0.i", ""},
+               {token.IMAG, ".123i", ".123i", ""},
+               {token.IMAG, "123.123i", "123.123i", ""},
+               {token.IMAG, "123e+0i", "123e+0i", ""},
+               {token.IMAG, "123.E-10i", "123.E-10i", ""},
+               {token.IMAG, ".123E+10i", ".123E+10i", ""},
+
+               // hexadecimals
+               {token.INT, "0x0", "0x0", ""},
+               {token.INT, "0x1234", "0x1234", ""},
+               {token.INT, "0xcafef00d", "0xcafef00d", ""},
+               {token.INT, "0XCAFEF00D", "0XCAFEF00D", ""},
+
+               {token.INT, "0x", "0x", "hexadecimal literal has no digits"},
+               {token.INT, "0x1g", "0x1 g", ""},
+
+               {token.IMAG, "0xf00i", "0xf00i", ""},
+
+               // hexadecimal floats
+               {token.FLOAT, "0x0p0", "0x0p0", ""},
+               {token.FLOAT, "0x12efp-123", "0x12efp-123", ""},
+               {token.FLOAT, "0xABCD.p+0", "0xABCD.p+0", ""},
+               {token.FLOAT, "0x.0189P-0", "0x.0189P-0", ""},
+               {token.FLOAT, "0x1.ffffp+1023", "0x1.ffffp+1023", ""},
+
+               {token.FLOAT, "0x.", "0x.", "hexadecimal literal has no digits"},
+               {token.FLOAT, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"},
+               {token.FLOAT, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"},
+               {token.FLOAT, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"},
+               {token.FLOAT, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"},
+               {token.FLOAT, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"},
+               {token.FLOAT, "0x0p", "0x0p", "exponent has no digits"},
+               {token.FLOAT, "0xeP-", "0xeP-", "exponent has no digits"},
+               {token.FLOAT, "0x1234PAB", "0x1234P AB", "exponent has no digits"},
+               {token.FLOAT, "0x1.2p1a", "0x1.2p1 a", ""},
+
+               {token.IMAG, "0xf00.bap+12i", "0xf00.bap+12i", ""},
+
+               // separators
+               {token.INT, "0b_1000_0001", "0b_1000_0001", ""},
+               {token.INT, "0o_600", "0o_600", ""},
+               {token.INT, "0_466", "0_466", ""},
+               {token.INT, "1_000", "1_000", ""},
+               {token.FLOAT, "1_000.000_1", "1_000.000_1", ""},
+               {token.IMAG, "10e+1_2_3i", "10e+1_2_3i", ""},
+               {token.INT, "0x_f00d", "0x_f00d", ""},
+               {token.FLOAT, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""},
+
+               {token.INT, "0b__1000", "0b__1000", "'_' must separate successive digits"},
+               {token.INT, "0o60___0", "0o60___0", "'_' must separate successive digits"},
+               {token.INT, "0466_", "0466_", "'_' must separate successive digits"},
+               {token.FLOAT, "1_.", "1_.", "'_' must separate successive digits"},
+               {token.FLOAT, "0._1", "0._1", "'_' must separate successive digits"},
+               {token.FLOAT, "2.7_e0", "2.7_e0", "'_' must separate successive digits"},
+               {token.IMAG, "10e+12_i", "10e+12_i", "'_' must separate successive digits"},
+               {token.INT, "0x___0", "0x___0", "'_' must separate successive digits"},
+               {token.FLOAT, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"},
+       } {
+               var s Scanner
+               var err string
+               s.Init(fset.AddFile("", fset.Base(), len(test.src)), []byte(test.src), func(_ token.Position, msg string) {
+                       if err == "" {
+                               err = msg
+                       }
+               }, 0)
+               for i, want := range strings.Split(test.tokens, " ") {
+                       err = ""
+                       _, tok, lit := s.Scan()
+
+                       // compute lit where for tokens where lit is not defined
+                       switch tok {
+                       case token.PERIOD:
+                               lit = "."
+                       case token.ADD:
+                               lit = "+"
+                       case token.SUB:
+                               lit = "-"
+                       }
+
+                       if i == 0 {
+                               if tok != test.tok {
+                                       t.Errorf("%q: got token %s; want %s", test.src, tok, test.tok)
+                               }
+                               if err != test.err {
+                                       t.Errorf("%q: got error %q; want %q", test.src, err, test.err)
+                               }
+                       }
+
+                       if lit != want {
+                               t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, tok, want)
+                       }
+               }
+
+               // make sure we read all
+               _, tok, _ := s.Scan()
+               if tok == token.SEMICOLON {
+                       _, tok, _ = s.Scan()
+               }
+               if tok != token.EOF {
+                       t.Errorf("%q: got %s; want EOF", test.src, tok)
+               }
+       }
+}
index 865f63f4a146ca03da07074106c59f466a9b9c07..96a1079ec37c4668969721700df0a682087c00f9 100644 (file)
@@ -7,7 +7,11 @@
 //
 package token
 
-import "strconv"
+import (
+       "strconv"
+       "unicode"
+       "unicode/utf8"
+)
 
 // Token is the set of lexical tokens of the Go programming language.
 type Token int
@@ -306,3 +310,31 @@ func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator
 // it returns false otherwise.
 //
 func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }
+
+// IsExported reports whether name starts with an upper-case letter.
+//
+func IsExported(name string) bool {
+       ch, _ := utf8.DecodeRuneInString(name)
+       return unicode.IsUpper(ch)
+}
+
+// IsKeyword reports whether name is a Go keyword, such as "func" or "return".
+//
+func IsKeyword(name string) bool {
+       // TODO: opt: use a perfect hash function instead of a global map.
+       _, ok := keywords[name]
+       return ok
+}
+
+// IsIdentifier reports whether name is a Go identifier, that is, a non-empty
+// string made up of letters, digits, and underscores, where the first character
+// is not a digit. Keywords are not identifiers.
+//
+func IsIdentifier(name string) bool {
+       for i, c := range name {
+               if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) {
+                       return false
+               }
+       }
+       return name != "" && !IsKeyword(name)
+}
diff --git a/libgo/go/go/token/token_test.go b/libgo/go/go/token/token_test.go
new file mode 100644 (file)
index 0000000..eff38cc
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package token
+
+import "testing"
+
+func TestIsIdentifier(t *testing.T) {
+       tests := []struct {
+               name string
+               in   string
+               want bool
+       }{
+               {"Empty", "", false},
+               {"Space", " ", false},
+               {"SpaceSuffix", "foo ", false},
+               {"Number", "123", false},
+               {"Keyword", "func", false},
+
+               {"LettersASCII", "foo", true},
+               {"MixedASCII", "_bar123", true},
+               {"UppercaseKeyword", "Func", true},
+               {"LettersUnicode", "fóö", true},
+       }
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       if got := IsIdentifier(test.in); got != test.want {
+                               t.Fatalf("IsIdentifier(%q) = %t, want %v", test.in, got, test.want)
+                       }
+               })
+       }
+}
index 1abc1d8a5e47d68237b3dddcb8f6302cd9b98388..88e3336136ebbd093d04991abc6c3d70c5d3d4e3 100644 (file)
@@ -241,7 +241,7 @@ func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature,
                        if i == n-1 && call.Ellipsis.IsValid() {
                                ellipsis = call.Ellipsis
                        }
-                       check.argument(call.Fun, sig, i, x, ellipsis, context)
+                       check.argument(sig, i, x, ellipsis, context)
                }
        }
 
@@ -259,7 +259,7 @@ func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature,
 
 // argument checks passing of argument x to the i'th parameter of the given signature.
 // If ellipsis is valid, the argument is followed by ... at that position in the call.
-func (check *Checker) argument(fun ast.Expr, sig *Signature, i int, x *operand, ellipsis token.Pos, context string) {
+func (check *Checker) argument(sig *Signature, i int, x *operand, ellipsis token.Pos, context string) {
        check.singleValue(x)
        if x.mode == invalid {
                return
index 45e1fcb60561f05249364ccae92646fc5059c45a..358e7c5cc81c8f675c9b05f2646127c30ac7f2d9 100644 (file)
@@ -88,6 +88,7 @@ var tests = [][]string{
        {"testdata/stmt1.src"},
        {"testdata/gotos.src"},
        {"testdata/labels.src"},
+       {"testdata/literals.src"},
        {"testdata/issues.src"},
        {"testdata/blank.src"},
        {"testdata/issue25008b.src", "testdata/issue25008a.src"}, // order (b before a) is crucial!
index 8d4db48a9f90fccf7ac6f34e1543d883d01b2d2b..51259604c984c5d6d74274e9341de8349ba866b5 100644 (file)
@@ -6,6 +6,7 @@ package types
 
 import (
        "fmt"
+       "go/ast"
        "go/parser"
        "go/token"
 )
@@ -16,22 +17,43 @@ import (
 // complete position information relative to the provided file
 // set.
 //
+// The meaning of the parameters fset, pkg, and pos is the
+// same as in CheckExpr. An error is returned if expr cannot
+// be parsed successfully, or the resulting expr AST cannot be
+// type-checked.
+func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (_ TypeAndValue, err error) {
+       // parse expressions
+       node, err := parser.ParseExprFrom(fset, "eval", expr, 0)
+       if err != nil {
+               return TypeAndValue{}, err
+       }
+
+       info := &Info{
+               Types: make(map[ast.Expr]TypeAndValue),
+       }
+       err = CheckExpr(fset, pkg, pos, node, info)
+       return info.Types[node], err
+}
+
+// CheckExpr type checks the expression expr as if it had appeared at
+// position pos of package pkg. Type information about the expression
+// is recorded in info.
+//
 // If pkg == nil, the Universe scope is used and the provided
 // position pos is ignored. If pkg != nil, and pos is invalid,
 // the package scope is used. Otherwise, pos must belong to the
 // package.
 //
 // An error is returned if pos is not within the package or
-// if the node cannot be evaluated.
+// if the node cannot be type-checked.
 //
-// Note: Eval should not be used instead of running Check to compute
-// types and values, but in addition to Check. Eval will re-evaluate
-// its argument each time, and it also does not know about the context
-// in which an expression is used (e.g., an assignment). Thus, top-
-// level untyped constants will return an untyped type rather then the
-// respective context-specific type.
+// Note: Eval and CheckExpr should not be used instead of running Check
+// to compute types and values, but in addition to Check, as these
+// functions ignore the context in which an expression is used (e.g., an
+// assignment). Thus, top-level untyped constants will return an
+// untyped type rather then the respective context-specific type.
 //
-func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (_ TypeAndValue, err error) {
+func CheckExpr(fset *token.FileSet, pkg *Package, pos token.Pos, expr ast.Expr, info *Info) (err error) {
        // determine scope
        var scope *Scope
        if pkg == nil {
@@ -56,27 +78,22 @@ func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (_ Type
                        }
                        // s == nil || s == pkg.scope
                        if s == nil {
-                               return TypeAndValue{}, fmt.Errorf("no position %s found in package %s", fset.Position(pos), pkg.name)
+                               return fmt.Errorf("no position %s found in package %s", fset.Position(pos), pkg.name)
                        }
                }
        }
 
-       // parse expressions
-       node, err := parser.ParseExprFrom(fset, "eval", expr, 0)
-       if err != nil {
-               return TypeAndValue{}, err
-       }
-
        // initialize checker
-       check := NewChecker(nil, fset, pkg, nil)
+       check := NewChecker(nil, fset, pkg, info)
        check.scope = scope
        check.pos = pos
        defer check.handleBailout(&err)
 
        // evaluate node
        var x operand
-       check.rawExpr(&x, node, nil)
+       check.rawExpr(&x, expr, nil)
        check.processDelayed(0) // incl. all functions
+       check.recordUntyped()
 
-       return TypeAndValue{x.mode, x.typ, x.val}, nil
+       return nil
 }
index d3b3fec66fc04c7caeea0d7b443a7ade217c7d55..d940bf0e80a9cb89956badca19249e2798dd88ae 100644 (file)
@@ -7,6 +7,7 @@
 package types_test
 
 import (
+       "fmt"
        "go/ast"
        "go/importer"
        "go/parser"
@@ -199,3 +200,98 @@ func split(s, sep string) (string, string) {
        i := strings.Index(s, sep)
        return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+len(sep):])
 }
+
+func TestCheckExpr(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+
+       // Each comment has the form /* expr => object */:
+       // expr is an identifier or selector expression that is passed
+       // to CheckExpr at the position of the comment, and object is
+       // the string form of the object it denotes.
+       const src = `
+package p
+
+import "fmt"
+
+const c = 3.0
+type T []int
+type S struct{ X int }
+
+func f(a int, s string) S {
+       /* fmt.Println => func fmt.Println(a ...interface{}) (n int, err error) */
+       /* fmt.Stringer.String => func (fmt.Stringer).String() string */
+       fmt.Println("calling f")
+
+       var fmt struct{ Println int }
+       /* fmt => var fmt struct{Println int} */
+       /* fmt.Println => field Println int */
+       /* f(1, "").X => field X int */
+       fmt.Println = 1
+
+       /* append => builtin append */
+
+       /* new(S).X => field X int */
+
+       return S{}
+}`
+
+       fset := token.NewFileSet()
+       f, err := parser.ParseFile(fset, "p", src, parser.ParseComments)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       conf := Config{Importer: importer.Default()}
+       pkg, err := conf.Check("p", fset, []*ast.File{f}, nil)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       checkExpr := func(pos token.Pos, str string) (Object, error) {
+               expr, err := parser.ParseExprFrom(fset, "eval", str, 0)
+               if err != nil {
+                       return nil, err
+               }
+
+               info := &Info{
+                       Uses:       make(map[*ast.Ident]Object),
+                       Selections: make(map[*ast.SelectorExpr]*Selection),
+               }
+               if err := CheckExpr(fset, pkg, pos, expr, info); err != nil {
+                       return nil, fmt.Errorf("CheckExpr(%q) failed: %s", str, err)
+               }
+               switch expr := expr.(type) {
+               case *ast.Ident:
+                       if obj, ok := info.Uses[expr]; ok {
+                               return obj, nil
+                       }
+               case *ast.SelectorExpr:
+                       if sel, ok := info.Selections[expr]; ok {
+                               return sel.Obj(), nil
+                       }
+                       if obj, ok := info.Uses[expr.Sel]; ok {
+                               return obj, nil // qualified identifier
+                       }
+               }
+               return nil, fmt.Errorf("no object for %s", str)
+       }
+
+       for _, group := range f.Comments {
+               for _, comment := range group.List {
+                       s := comment.Text
+                       if len(s) >= 4 && strings.HasPrefix(s, "/*") && strings.HasSuffix(s, "*/") {
+                               pos := comment.Pos()
+                               expr, wantObj := split(s[2:len(s)-2], "=>")
+                               obj, err := checkExpr(pos, expr)
+                               if err != nil {
+                                       t.Errorf("%s: %s", fset.Position(pos), err)
+                                       continue
+                               }
+                               if obj.String() != wantObj {
+                                       t.Errorf("%s: checkExpr(%s) = %s, want %v",
+                                               fset.Position(pos), expr, obj, wantObj)
+                               }
+                       }
+               }
+       }
+}
index 0dc007069fadfff623587568d486f35b3b7a9780..66d62d68856d5f3a7a1718b7ef32b1bfc36ebef0 100644 (file)
@@ -655,11 +655,10 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) {
                return
        }
 
-       // spec: "The right operand in a shift expression must have unsigned
-       // integer type or be an untyped constant representable by a value of
-       // type uint."
+       // spec: "The right operand in a shift expression must have integer type
+       // or be an untyped constant representable by a value of type uint."
        switch {
-       case isUnsigned(y.typ):
+       case isInteger(y.typ):
                // nothing to do
        case isUntyped(y.typ):
                check.convertUntyped(y, Typ[Uint])
@@ -668,21 +667,28 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) {
                        return
                }
        default:
-               check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
+               check.invalidOp(y.pos(), "shift count %s must be integer", y)
                x.mode = invalid
                return
        }
 
+       var yval constant.Value
+       if y.mode == constant_ {
+               // rhs must be an integer value
+               // (Either it was of an integer type already, or it was
+               // untyped and successfully converted to a uint above.)
+               yval = constant.ToInt(y.val)
+               assert(yval.Kind() == constant.Int)
+               if constant.Sign(yval) < 0 {
+                       check.invalidOp(y.pos(), "negative shift count %s", y)
+                       x.mode = invalid
+                       return
+               }
+       }
+
        if x.mode == constant_ {
                if y.mode == constant_ {
-                       // rhs must be an integer value
-                       yval := constant.ToInt(y.val)
-                       if yval.Kind() != constant.Int {
-                               check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
-                               x.mode = invalid
-                               return
-                       }
-                       // rhs must be within reasonable bounds
+                       // rhs must be within reasonable bounds in constant shifts
                        const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64
                        s, ok := constant.Uint64Val(yval)
                        if !ok || s > shiftBound {
@@ -741,11 +747,6 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) {
                }
        }
 
-       // constant rhs must be >= 0
-       if y.mode == constant_ && constant.Sign(y.val) < 0 {
-               check.invalidOp(y.pos(), "shift count %s must not be negative", y)
-       }
-
        // non-constant shift - lhs must be an integer
        if !isInteger(x.typ) {
                check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
diff --git a/libgo/go/go/types/gccgosizes.go b/libgo/go/go/types/gccgosizes.go
new file mode 100644 (file)
index 0000000..05461e9
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+// This is a copy of the file generated during the gccgo build process.
+// Last update 2019-01-22.
+
+package types
+
+var gccgoArchSizes = map[string]*StdSizes{
+       "386":         {4, 4},
+       "alpha":       {8, 8},
+       "amd64":       {8, 8},
+       "amd64p32":    {4, 8},
+       "arm":         {4, 8},
+       "armbe":       {4, 8},
+       "arm64":       {8, 8},
+       "arm64be":     {8, 8},
+       "ia64":        {8, 8},
+       "m68k":        {4, 2},
+       "mips":        {4, 8},
+       "mipsle":      {4, 8},
+       "mips64":      {8, 8},
+       "mips64le":    {8, 8},
+       "mips64p32":   {4, 8},
+       "mips64p32le": {4, 8},
+       "nios2":       {4, 8},
+       "ppc":         {4, 8},
+       "ppc64":       {8, 8},
+       "ppc64le":     {8, 8},
+       "riscv":       {4, 8},
+       "riscv64":     {8, 8},
+       "s390":        {4, 8},
+       "s390x":       {8, 8},
+       "sh":          {4, 8},
+       "shbe":        {4, 8},
+       "sparc":       {4, 8},
+       "sparc64":     {8, 8},
+       "wasm":        {8, 8},
+}
index cf773238a0df6e023c0d1933763737597b854ec4..374b24d1acfa03e47da92ba7dd49f9e5297db13c 100644 (file)
@@ -7,7 +7,6 @@ package types
 import (
        "bytes"
        "fmt"
-       "go/ast"
        "go/constant"
        "go/token"
 )
@@ -59,7 +58,7 @@ type Object interface {
 // Id returns name if it is exported, otherwise it
 // returns the name qualified with the package path.
 func Id(pkg *Package, name string) string {
-       if ast.IsExported(name) {
+       if token.IsExported(name) {
                return name
        }
        // unexported names need the package path for differentiation
@@ -139,7 +138,7 @@ func (obj *object) Type() Type { return obj.typ }
 // Exported reports whether the object is exported (starts with a capital letter).
 // It doesn't take into account whether the object is in a local (function) scope
 // or not.
-func (obj *object) Exported() bool { return ast.IsExported(obj.name) }
+func (obj *object) Exported() bool { return token.IsExported(obj.name) }
 
 // Id is a wrapper for Id(obj.Pkg(), obj.Name()).
 func (obj *object) Id() string { return Id(obj.pkg, obj.name) }
index 41741e5882de5f4bbaf688730e46c4b12b098b1d..417e4e79aa00bf3f9572e3a32411a5a43e203ac8 100644 (file)
@@ -301,15 +301,15 @@ func (check *Checker) collectObjects() {
                                                                // A package scope may contain non-exported objects,
                                                                // do not import them!
                                                                if obj.Exported() {
-                                                                       // TODO(gri) When we import a package, we create
-                                                                       // a new local package object. We should do the
-                                                                       // same for each dot-imported object. That way
-                                                                       // they can have correct position information.
-                                                                       // (We must not modify their existing position
-                                                                       // information because the same package - found
-                                                                       // via Config.Packages - may be dot-imported in
-                                                                       // another package!)
-                                                                       check.declare(fileScope, nil, obj, token.NoPos)
+                                                                       // declare dot-imported object
+                                                                       // (Do not use check.declare because it modifies the object
+                                                                       // via Object.setScopePos, which leads to a race condition;
+                                                                       // the object may be imported into more than one file scope
+                                                                       // concurrently. See issue #32154.)
+                                                                       if alt := fileScope.Insert(obj); alt != nil {
+                                                                               check.errorf(s.Name.Pos(), "%s redeclared in this block", obj.Name())
+                                                                               check.reportAltDecl(alt)
+                                                                       }
                                                                }
                                                        }
                                                        // add position to set of dot-import positions for this file
@@ -317,6 +317,7 @@ func (check *Checker) collectObjects() {
                                                        check.addUnusedDotImport(fileScope, imp, s.Pos())
                                                } else {
                                                        // declare imported package object in file scope
+                                                       // (no need to provide s.Name since we called check.recordDef earlier)
                                                        check.declare(fileScope, nil, obj, token.NoPos)
                                                }
 
index fde44950dd995173aee44694eae8ed1c2c5ae73a..dc189870bc976f301a6533f03b5c4a13d560984a 100644 (file)
@@ -185,6 +185,7 @@ func TestStdFixed(t *testing.T) {
                "issue22200b.go", // go/types does not have constraints on stack size
                "issue25507.go",  // go/types does not have constraints on stack size
                "issue20780.go",  // go/types does not have constraints on stack size
+               "issue31747.go",  // go/types does not have constraints on language level (-lang=go1.12) (see #31793)
        )
 }
 
diff --git a/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go b/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go
new file mode 100644 (file)
index 0000000..bbb86ef
--- /dev/null
@@ -0,0 +1,101 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539,
+// and its extended nonce variant XChaCha20-Poly1305.
+package chacha20poly1305 // import "golang.org/x/crypto/chacha20poly1305"
+
+import (
+       "crypto/cipher"
+       "encoding/binary"
+       "errors"
+)
+
+const (
+       // KeySize is the size of the key used by this AEAD, in bytes.
+       KeySize = 32
+
+       // NonceSize is the size of the nonce used with the standard variant of this
+       // AEAD, in bytes.
+       //
+       // Note that this is too short to be safely generated at random if the same
+       // key is reused more than 2³² times.
+       NonceSize = 12
+
+       // NonceSizeX is the size of the nonce used with the XChaCha20-Poly1305
+       // variant of this AEAD, in bytes.
+       NonceSizeX = 24
+)
+
+type chacha20poly1305 struct {
+       key [8]uint32
+}
+
+// New returns a ChaCha20-Poly1305 AEAD that uses the given 256-bit key.
+func New(key []byte) (cipher.AEAD, error) {
+       if len(key) != KeySize {
+               return nil, errors.New("chacha20poly1305: bad key length")
+       }
+       ret := new(chacha20poly1305)
+       ret.key[0] = binary.LittleEndian.Uint32(key[0:4])
+       ret.key[1] = binary.LittleEndian.Uint32(key[4:8])
+       ret.key[2] = binary.LittleEndian.Uint32(key[8:12])
+       ret.key[3] = binary.LittleEndian.Uint32(key[12:16])
+       ret.key[4] = binary.LittleEndian.Uint32(key[16:20])
+       ret.key[5] = binary.LittleEndian.Uint32(key[20:24])
+       ret.key[6] = binary.LittleEndian.Uint32(key[24:28])
+       ret.key[7] = binary.LittleEndian.Uint32(key[28:32])
+       return ret, nil
+}
+
+func (c *chacha20poly1305) NonceSize() int {
+       return NonceSize
+}
+
+func (c *chacha20poly1305) Overhead() int {
+       return 16
+}
+
+func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte {
+       if len(nonce) != NonceSize {
+               panic("chacha20poly1305: bad nonce length passed to Seal")
+       }
+
+       if uint64(len(plaintext)) > (1<<38)-64 {
+               panic("chacha20poly1305: plaintext too large")
+       }
+
+       return c.seal(dst, nonce, plaintext, additionalData)
+}
+
+var errOpen = errors.New("chacha20poly1305: message authentication failed")
+
+func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
+       if len(nonce) != NonceSize {
+               panic("chacha20poly1305: bad nonce length passed to Open")
+       }
+       if len(ciphertext) < 16 {
+               return nil, errOpen
+       }
+       if uint64(len(ciphertext)) > (1<<38)-48 {
+               panic("chacha20poly1305: ciphertext too large")
+       }
+
+       return c.open(dst, nonce, ciphertext, additionalData)
+}
+
+// sliceForAppend takes a slice and a requested number of bytes. It returns a
+// slice with the contents of the given slice followed by that many bytes and a
+// second slice that aliases into it and contains only the extra bytes. If the
+// original slice has sufficient capacity then no allocation is performed.
+func sliceForAppend(in []byte, n int) (head, tail []byte) {
+       if total := len(in) + n; cap(in) >= total {
+               head = in[:total]
+       } else {
+               head = make([]byte, total)
+               copy(head, in)
+       }
+       tail = head[len(in):]
+       return
+}
diff --git a/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go
new file mode 100644 (file)
index 0000000..2aa4fd8
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.7,amd64,!gccgo,!appengine
+
+package chacha20poly1305
+
+import (
+       "encoding/binary"
+
+       "golang.org/x/crypto/internal/subtle"
+       "golang.org/x/sys/cpu"
+)
+
+//go:noescape
+func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool
+
+//go:noescape
+func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte)
+
+var (
+       useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI2
+)
+
+// setupState writes a ChaCha20 input matrix to state. See
+// https://tools.ietf.org/html/rfc7539#section-2.3.
+func setupState(state *[16]uint32, key *[8]uint32, nonce []byte) {
+       state[0] = 0x61707865
+       state[1] = 0x3320646e
+       state[2] = 0x79622d32
+       state[3] = 0x6b206574
+
+       state[4] = key[0]
+       state[5] = key[1]
+       state[6] = key[2]
+       state[7] = key[3]
+       state[8] = key[4]
+       state[9] = key[5]
+       state[10] = key[6]
+       state[11] = key[7]
+
+       state[12] = 0
+       state[13] = binary.LittleEndian.Uint32(nonce[:4])
+       state[14] = binary.LittleEndian.Uint32(nonce[4:8])
+       state[15] = binary.LittleEndian.Uint32(nonce[8:12])
+}
+
+func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte {
+       if !cpu.X86.HasSSSE3 {
+               return c.sealGeneric(dst, nonce, plaintext, additionalData)
+       }
+
+       var state [16]uint32
+       setupState(&state, &c.key, nonce)
+
+       ret, out := sliceForAppend(dst, len(plaintext)+16)
+       if subtle.InexactOverlap(out, plaintext) {
+               panic("chacha20poly1305: invalid buffer overlap")
+       }
+       chacha20Poly1305Seal(out[:], state[:], plaintext, additionalData)
+       return ret
+}
+
+func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
+       if !cpu.X86.HasSSSE3 {
+               return c.openGeneric(dst, nonce, ciphertext, additionalData)
+       }
+
+       var state [16]uint32
+       setupState(&state, &c.key, nonce)
+
+       ciphertext = ciphertext[:len(ciphertext)-16]
+       ret, out := sliceForAppend(dst, len(ciphertext))
+       if subtle.InexactOverlap(out, ciphertext) {
+               panic("chacha20poly1305: invalid buffer overlap")
+       }
+       if !chacha20Poly1305Open(out, state[:], ciphertext, additionalData) {
+               for i := range out {
+                       out[i] = 0
+               }
+               return nil, errOpen
+       }
+
+       return ret, nil
+}
diff --git a/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go b/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go
new file mode 100644 (file)
index 0000000..c279712
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package chacha20poly1305
+
+import (
+       "encoding/binary"
+
+       "golang.org/x/crypto/internal/chacha20"
+       "golang.org/x/crypto/internal/subtle"
+       "golang.org/x/crypto/poly1305"
+)
+
+func roundTo16(n int) int {
+       return 16 * ((n + 15) / 16)
+}
+
+func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte {
+       ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize)
+       if subtle.InexactOverlap(out, plaintext) {
+               panic("chacha20poly1305: invalid buffer overlap")
+       }
+
+       var polyKey [32]byte
+       s := chacha20.New(c.key, [3]uint32{
+               binary.LittleEndian.Uint32(nonce[0:4]),
+               binary.LittleEndian.Uint32(nonce[4:8]),
+               binary.LittleEndian.Uint32(nonce[8:12]),
+       })
+       s.XORKeyStream(polyKey[:], polyKey[:])
+       s.Advance() // skip the next 32 bytes
+       s.XORKeyStream(out, plaintext)
+
+       polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8)
+       copy(polyInput, additionalData)
+       copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)])
+       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData)))
+       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext)))
+
+       var tag [poly1305.TagSize]byte
+       poly1305.Sum(&tag, polyInput, &polyKey)
+       copy(out[len(plaintext):], tag[:])
+
+       return ret
+}
+
+func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
+       var tag [poly1305.TagSize]byte
+       copy(tag[:], ciphertext[len(ciphertext)-16:])
+       ciphertext = ciphertext[:len(ciphertext)-16]
+
+       var polyKey [32]byte
+       s := chacha20.New(c.key, [3]uint32{
+               binary.LittleEndian.Uint32(nonce[0:4]),
+               binary.LittleEndian.Uint32(nonce[4:8]),
+               binary.LittleEndian.Uint32(nonce[8:12]),
+       })
+       s.XORKeyStream(polyKey[:], polyKey[:])
+       s.Advance() // skip the next 32 bytes
+
+       polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8)
+       copy(polyInput, additionalData)
+       copy(polyInput[roundTo16(len(additionalData)):], ciphertext)
+       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData)))
+       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext)))
+
+       ret, out := sliceForAppend(dst, len(ciphertext))
+       if subtle.InexactOverlap(out, ciphertext) {
+               panic("chacha20poly1305: invalid buffer overlap")
+       }
+       if !poly1305.Verify(&tag, polyInput, &polyKey) {
+               for i := range out {
+                       out[i] = 0
+               }
+               return nil, errOpen
+       }
+
+       s.XORKeyStream(out, ciphertext)
+       return ret, nil
+}
diff --git a/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/libgo/go/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go
new file mode 100644 (file)
index 0000000..4c2eb70
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !amd64 !go1.7 gccgo appengine
+
+package chacha20poly1305
+
+func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte {
+       return c.sealGeneric(dst, nonce, plaintext, additionalData)
+}
+
+func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
+       return c.openGeneric(dst, nonce, ciphertext, additionalData)
+}
diff --git a/libgo/go/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go b/libgo/go/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go
new file mode 100644 (file)
index 0000000..a02fa57
--- /dev/null
@@ -0,0 +1,104 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package chacha20poly1305
+
+import (
+       "crypto/cipher"
+       "encoding/binary"
+       "errors"
+
+       "golang.org/x/crypto/internal/chacha20"
+)
+
+type xchacha20poly1305 struct {
+       key [8]uint32
+}
+
+// NewX returns a XChaCha20-Poly1305 AEAD that uses the given 256-bit key.
+//
+// XChaCha20-Poly1305 is a ChaCha20-Poly1305 variant that takes a longer nonce,
+// suitable to be generated randomly without risk of collisions. It should be
+// preferred when nonce uniqueness cannot be trivially ensured, or whenever
+// nonces are randomly generated.
+func NewX(key []byte) (cipher.AEAD, error) {
+       if len(key) != KeySize {
+               return nil, errors.New("chacha20poly1305: bad key length")
+       }
+       ret := new(xchacha20poly1305)
+       ret.key[0] = binary.LittleEndian.Uint32(key[0:4])
+       ret.key[1] = binary.LittleEndian.Uint32(key[4:8])
+       ret.key[2] = binary.LittleEndian.Uint32(key[8:12])
+       ret.key[3] = binary.LittleEndian.Uint32(key[12:16])
+       ret.key[4] = binary.LittleEndian.Uint32(key[16:20])
+       ret.key[5] = binary.LittleEndian.Uint32(key[20:24])
+       ret.key[6] = binary.LittleEndian.Uint32(key[24:28])
+       ret.key[7] = binary.LittleEndian.Uint32(key[28:32])
+       return ret, nil
+}
+
+func (*xchacha20poly1305) NonceSize() int {
+       return NonceSizeX
+}
+
+func (*xchacha20poly1305) Overhead() int {
+       return 16
+}
+
+func (x *xchacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte {
+       if len(nonce) != NonceSizeX {
+               panic("chacha20poly1305: bad nonce length passed to Seal")
+       }
+
+       // XChaCha20-Poly1305 technically supports a 64-bit counter, so there is no
+       // size limit. However, since we reuse the ChaCha20-Poly1305 implementation,
+       // the second half of the counter is not available. This is unlikely to be
+       // an issue because the cipher.AEAD API requires the entire message to be in
+       // memory, and the counter overflows at 256 GB.
+       if uint64(len(plaintext)) > (1<<38)-64 {
+               panic("chacha20poly1305: plaintext too large")
+       }
+
+       hNonce := [4]uint32{
+               binary.LittleEndian.Uint32(nonce[0:4]),
+               binary.LittleEndian.Uint32(nonce[4:8]),
+               binary.LittleEndian.Uint32(nonce[8:12]),
+               binary.LittleEndian.Uint32(nonce[12:16]),
+       }
+       c := &chacha20poly1305{
+               key: chacha20.HChaCha20(&x.key, &hNonce),
+       }
+       // The first 4 bytes of the final nonce are unused counter space.
+       cNonce := make([]byte, NonceSize)
+       copy(cNonce[4:12], nonce[16:24])
+
+       return c.seal(dst, cNonce[:], plaintext, additionalData)
+}
+
+func (x *xchacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
+       if len(nonce) != NonceSizeX {
+               panic("chacha20poly1305: bad nonce length passed to Open")
+       }
+       if len(ciphertext) < 16 {
+               return nil, errOpen
+       }
+       if uint64(len(ciphertext)) > (1<<38)-48 {
+               panic("chacha20poly1305: ciphertext too large")
+       }
+
+       hNonce := [4]uint32{
+               binary.LittleEndian.Uint32(nonce[0:4]),
+               binary.LittleEndian.Uint32(nonce[4:8]),
+               binary.LittleEndian.Uint32(nonce[8:12]),
+               binary.LittleEndian.Uint32(nonce[12:16]),
+       }
+       c := &chacha20poly1305{
+               key: chacha20.HChaCha20(&x.key, &hNonce),
+       }
+       // The first 4 bytes of the final nonce are unused counter space.
+       cNonce := make([]byte, NonceSize)
+       copy(cNonce[4:12], nonce[16:24])
+
+       return c.open(dst, cNonce[:], ciphertext, additionalData)
+}
diff --git a/libgo/go/golang.org/x/crypto/cryptobyte/asn1.go b/libgo/go/golang.org/x/crypto/cryptobyte/asn1.go
new file mode 100644 (file)
index 0000000..528b9bf
--- /dev/null
@@ -0,0 +1,751 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cryptobyte
+
+import (
+       encoding_asn1 "encoding/asn1"
+       "fmt"
+       "math/big"
+       "reflect"
+       "time"
+
+       "golang.org/x/crypto/cryptobyte/asn1"
+)
+
+// This file contains ASN.1-related methods for String and Builder.
+
+// Builder
+
+// AddASN1Int64 appends a DER-encoded ASN.1 INTEGER.
+func (b *Builder) AddASN1Int64(v int64) {
+       b.addASN1Signed(asn1.INTEGER, v)
+}
+
+// AddASN1Int64WithTag appends a DER-encoded ASN.1 INTEGER with the
+// given tag.
+func (b *Builder) AddASN1Int64WithTag(v int64, tag asn1.Tag) {
+       b.addASN1Signed(tag, v)
+}
+
+// AddASN1Enum appends a DER-encoded ASN.1 ENUMERATION.
+func (b *Builder) AddASN1Enum(v int64) {
+       b.addASN1Signed(asn1.ENUM, v)
+}
+
+func (b *Builder) addASN1Signed(tag asn1.Tag, v int64) {
+       b.AddASN1(tag, func(c *Builder) {
+               length := 1
+               for i := v; i >= 0x80 || i < -0x80; i >>= 8 {
+                       length++
+               }
+
+               for ; length > 0; length-- {
+                       i := v >> uint((length-1)*8) & 0xff
+                       c.AddUint8(uint8(i))
+               }
+       })
+}
+
+// AddASN1Uint64 appends a DER-encoded ASN.1 INTEGER.
+func (b *Builder) AddASN1Uint64(v uint64) {
+       b.AddASN1(asn1.INTEGER, func(c *Builder) {
+               length := 1
+               for i := v; i >= 0x80; i >>= 8 {
+                       length++
+               }
+
+               for ; length > 0; length-- {
+                       i := v >> uint((length-1)*8) & 0xff
+                       c.AddUint8(uint8(i))
+               }
+       })
+}
+
+// AddASN1BigInt appends a DER-encoded ASN.1 INTEGER.
+func (b *Builder) AddASN1BigInt(n *big.Int) {
+       if b.err != nil {
+               return
+       }
+
+       b.AddASN1(asn1.INTEGER, func(c *Builder) {
+               if n.Sign() < 0 {
+                       // A negative number has to be converted to two's-complement form. So we
+                       // invert and subtract 1. If the most-significant-bit isn't set then
+                       // we'll need to pad the beginning with 0xff in order to keep the number
+                       // negative.
+                       nMinus1 := new(big.Int).Neg(n)
+                       nMinus1.Sub(nMinus1, bigOne)
+                       bytes := nMinus1.Bytes()
+                       for i := range bytes {
+                               bytes[i] ^= 0xff
+                       }
+                       if bytes[0]&0x80 == 0 {
+                               c.add(0xff)
+                       }
+                       c.add(bytes...)
+               } else if n.Sign() == 0 {
+                       c.add(0)
+               } else {
+                       bytes := n.Bytes()
+                       if bytes[0]&0x80 != 0 {
+                               c.add(0)
+                       }
+                       c.add(bytes...)
+               }
+       })
+}
+
+// AddASN1OctetString appends a DER-encoded ASN.1 OCTET STRING.
+func (b *Builder) AddASN1OctetString(bytes []byte) {
+       b.AddASN1(asn1.OCTET_STRING, func(c *Builder) {
+               c.AddBytes(bytes)
+       })
+}
+
+const generalizedTimeFormatStr = "20060102150405Z0700"
+
+// AddASN1GeneralizedTime appends a DER-encoded ASN.1 GENERALIZEDTIME.
+func (b *Builder) AddASN1GeneralizedTime(t time.Time) {
+       if t.Year() < 0 || t.Year() > 9999 {
+               b.err = fmt.Errorf("cryptobyte: cannot represent %v as a GeneralizedTime", t)
+               return
+       }
+       b.AddASN1(asn1.GeneralizedTime, func(c *Builder) {
+               c.AddBytes([]byte(t.Format(generalizedTimeFormatStr)))
+       })
+}
+
+// AddASN1BitString appends a DER-encoded ASN.1 BIT STRING. This does not
+// support BIT STRINGs that are not a whole number of bytes.
+func (b *Builder) AddASN1BitString(data []byte) {
+       b.AddASN1(asn1.BIT_STRING, func(b *Builder) {
+               b.AddUint8(0)
+               b.AddBytes(data)
+       })
+}
+
+func (b *Builder) addBase128Int(n int64) {
+       var length int
+       if n == 0 {
+               length = 1
+       } else {
+               for i := n; i > 0; i >>= 7 {
+                       length++
+               }
+       }
+
+       for i := length - 1; i >= 0; i-- {
+               o := byte(n >> uint(i*7))
+               o &= 0x7f
+               if i != 0 {
+                       o |= 0x80
+               }
+
+               b.add(o)
+       }
+}
+
+func isValidOID(oid encoding_asn1.ObjectIdentifier) bool {
+       if len(oid) < 2 {
+               return false
+       }
+
+       if oid[0] > 2 || (oid[0] <= 1 && oid[1] >= 40) {
+               return false
+       }
+
+       for _, v := range oid {
+               if v < 0 {
+                       return false
+               }
+       }
+
+       return true
+}
+
+func (b *Builder) AddASN1ObjectIdentifier(oid encoding_asn1.ObjectIdentifier) {
+       b.AddASN1(asn1.OBJECT_IDENTIFIER, func(b *Builder) {
+               if !isValidOID(oid) {
+                       b.err = fmt.Errorf("cryptobyte: invalid OID: %v", oid)
+                       return
+               }
+
+               b.addBase128Int(int64(oid[0])*40 + int64(oid[1]))
+               for _, v := range oid[2:] {
+                       b.addBase128Int(int64(v))
+               }
+       })
+}
+
+func (b *Builder) AddASN1Boolean(v bool) {
+       b.AddASN1(asn1.BOOLEAN, func(b *Builder) {
+               if v {
+                       b.AddUint8(0xff)
+               } else {
+                       b.AddUint8(0)
+               }
+       })
+}
+
+func (b *Builder) AddASN1NULL() {
+       b.add(uint8(asn1.NULL), 0)
+}
+
+// MarshalASN1 calls encoding_asn1.Marshal on its input and appends the result if
+// successful or records an error if one occurred.
+func (b *Builder) MarshalASN1(v interface{}) {
+       // NOTE(martinkr): This is somewhat of a hack to allow propagation of
+       // encoding_asn1.Marshal errors into Builder.err. N.B. if you call MarshalASN1 with a
+       // value embedded into a struct, its tag information is lost.
+       if b.err != nil {
+               return
+       }
+       bytes, err := encoding_asn1.Marshal(v)
+       if err != nil {
+               b.err = err
+               return
+       }
+       b.AddBytes(bytes)
+}
+
+// AddASN1 appends an ASN.1 object. The object is prefixed with the given tag.
+// Tags greater than 30 are not supported and result in an error (i.e.
+// low-tag-number form only). The child builder passed to the
+// BuilderContinuation can be used to build the content of the ASN.1 object.
+func (b *Builder) AddASN1(tag asn1.Tag, f BuilderContinuation) {
+       if b.err != nil {
+               return
+       }
+       // Identifiers with the low five bits set indicate high-tag-number format
+       // (two or more octets), which we don't support.
+       if tag&0x1f == 0x1f {
+               b.err = fmt.Errorf("cryptobyte: high-tag number identifier octects not supported: 0x%x", tag)
+               return
+       }
+       b.AddUint8(uint8(tag))
+       b.addLengthPrefixed(1, true, f)
+}
+
+// String
+
+// ReadASN1Boolean decodes an ASN.1 INTEGER and converts it to a boolean
+// representation into out and advances. It reports whether the read
+// was successful.
+func (s *String) ReadASN1Boolean(out *bool) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.INTEGER) || len(bytes) != 1 {
+               return false
+       }
+
+       switch bytes[0] {
+       case 0:
+               *out = false
+       case 0xff:
+               *out = true
+       default:
+               return false
+       }
+
+       return true
+}
+
+var bigIntType = reflect.TypeOf((*big.Int)(nil)).Elem()
+
+// ReadASN1Integer decodes an ASN.1 INTEGER into out and advances. If out does
+// not point to an integer or to a big.Int, it panics. It reports whether the
+// read was successful.
+func (s *String) ReadASN1Integer(out interface{}) bool {
+       if reflect.TypeOf(out).Kind() != reflect.Ptr {
+               panic("out is not a pointer")
+       }
+       switch reflect.ValueOf(out).Elem().Kind() {
+       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               var i int64
+               if !s.readASN1Int64(&i) || reflect.ValueOf(out).Elem().OverflowInt(i) {
+                       return false
+               }
+               reflect.ValueOf(out).Elem().SetInt(i)
+               return true
+       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+               var u uint64
+               if !s.readASN1Uint64(&u) || reflect.ValueOf(out).Elem().OverflowUint(u) {
+                       return false
+               }
+               reflect.ValueOf(out).Elem().SetUint(u)
+               return true
+       case reflect.Struct:
+               if reflect.TypeOf(out).Elem() == bigIntType {
+                       return s.readASN1BigInt(out.(*big.Int))
+               }
+       }
+       panic("out does not point to an integer type")
+}
+
+func checkASN1Integer(bytes []byte) bool {
+       if len(bytes) == 0 {
+               // An INTEGER is encoded with at least one octet.
+               return false
+       }
+       if len(bytes) == 1 {
+               return true
+       }
+       if bytes[0] == 0 && bytes[1]&0x80 == 0 || bytes[0] == 0xff && bytes[1]&0x80 == 0x80 {
+               // Value is not minimally encoded.
+               return false
+       }
+       return true
+}
+
+var bigOne = big.NewInt(1)
+
+func (s *String) readASN1BigInt(out *big.Int) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) {
+               return false
+       }
+       if bytes[0]&0x80 == 0x80 {
+               // Negative number.
+               neg := make([]byte, len(bytes))
+               for i, b := range bytes {
+                       neg[i] = ^b
+               }
+               out.SetBytes(neg)
+               out.Add(out, bigOne)
+               out.Neg(out)
+       } else {
+               out.SetBytes(bytes)
+       }
+       return true
+}
+
+func (s *String) readASN1Int64(out *int64) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) || !asn1Signed(out, bytes) {
+               return false
+       }
+       return true
+}
+
+func asn1Signed(out *int64, n []byte) bool {
+       length := len(n)
+       if length > 8 {
+               return false
+       }
+       for i := 0; i < length; i++ {
+               *out <<= 8
+               *out |= int64(n[i])
+       }
+       // Shift up and down in order to sign extend the result.
+       *out <<= 64 - uint8(length)*8
+       *out >>= 64 - uint8(length)*8
+       return true
+}
+
+func (s *String) readASN1Uint64(out *uint64) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) || !asn1Unsigned(out, bytes) {
+               return false
+       }
+       return true
+}
+
+func asn1Unsigned(out *uint64, n []byte) bool {
+       length := len(n)
+       if length > 9 || length == 9 && n[0] != 0 {
+               // Too large for uint64.
+               return false
+       }
+       if n[0]&0x80 != 0 {
+               // Negative number.
+               return false
+       }
+       for i := 0; i < length; i++ {
+               *out <<= 8
+               *out |= uint64(n[i])
+       }
+       return true
+}
+
+// ReadASN1Int64WithTag decodes an ASN.1 INTEGER with the given tag into out
+// and advances. It reports whether the read was successful and resulted in a
+// value that can be represented in an int64.
+func (s *String) ReadASN1Int64WithTag(out *int64, tag asn1.Tag) bool {
+       var bytes String
+       return s.ReadASN1(&bytes, tag) && checkASN1Integer(bytes) && asn1Signed(out, bytes)
+}
+
+// ReadASN1Enum decodes an ASN.1 ENUMERATION into out and advances. It reports
+// whether the read was successful.
+func (s *String) ReadASN1Enum(out *int) bool {
+       var bytes String
+       var i int64
+       if !s.ReadASN1(&bytes, asn1.ENUM) || !checkASN1Integer(bytes) || !asn1Signed(&i, bytes) {
+               return false
+       }
+       if int64(int(i)) != i {
+               return false
+       }
+       *out = int(i)
+       return true
+}
+
+func (s *String) readBase128Int(out *int) bool {
+       ret := 0
+       for i := 0; len(*s) > 0; i++ {
+               if i == 4 {
+                       return false
+               }
+               ret <<= 7
+               b := s.read(1)[0]
+               ret |= int(b & 0x7f)
+               if b&0x80 == 0 {
+                       *out = ret
+                       return true
+               }
+       }
+       return false // truncated
+}
+
+// ReadASN1ObjectIdentifier decodes an ASN.1 OBJECT IDENTIFIER into out and
+// advances. It reports whether the read was successful.
+func (s *String) ReadASN1ObjectIdentifier(out *encoding_asn1.ObjectIdentifier) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.OBJECT_IDENTIFIER) || len(bytes) == 0 {
+               return false
+       }
+
+       // In the worst case, we get two elements from the first byte (which is
+       // encoded differently) and then every varint is a single byte long.
+       components := make([]int, len(bytes)+1)
+
+       // The first varint is 40*value1 + value2:
+       // According to this packing, value1 can take the values 0, 1 and 2 only.
+       // When value1 = 0 or value1 = 1, then value2 is <= 39. When value1 = 2,
+       // then there are no restrictions on value2.
+       var v int
+       if !bytes.readBase128Int(&v) {
+               return false
+       }
+       if v < 80 {
+               components[0] = v / 40
+               components[1] = v % 40
+       } else {
+               components[0] = 2
+               components[1] = v - 80
+       }
+
+       i := 2
+       for ; len(bytes) > 0; i++ {
+               if !bytes.readBase128Int(&v) {
+                       return false
+               }
+               components[i] = v
+       }
+       *out = components[:i]
+       return true
+}
+
+// ReadASN1GeneralizedTime decodes an ASN.1 GENERALIZEDTIME into out and
+// advances. It reports whether the read was successful.
+func (s *String) ReadASN1GeneralizedTime(out *time.Time) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.GeneralizedTime) {
+               return false
+       }
+       t := string(bytes)
+       res, err := time.Parse(generalizedTimeFormatStr, t)
+       if err != nil {
+               return false
+       }
+       if serialized := res.Format(generalizedTimeFormatStr); serialized != t {
+               return false
+       }
+       *out = res
+       return true
+}
+
+// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances.
+// It reports whether the read was successful.
+func (s *String) ReadASN1BitString(out *encoding_asn1.BitString) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 {
+               return false
+       }
+
+       paddingBits := uint8(bytes[0])
+       bytes = bytes[1:]
+       if paddingBits > 7 ||
+               len(bytes) == 0 && paddingBits != 0 ||
+               len(bytes) > 0 && bytes[len(bytes)-1]&(1<<paddingBits-1) != 0 {
+               return false
+       }
+
+       out.BitLength = len(bytes)*8 - int(paddingBits)
+       out.Bytes = bytes
+       return true
+}
+
+// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances. It is
+// an error if the BIT STRING is not a whole number of bytes. It reports
+// whether the read was successful.
+func (s *String) ReadASN1BitStringAsBytes(out *[]byte) bool {
+       var bytes String
+       if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 {
+               return false
+       }
+
+       paddingBits := uint8(bytes[0])
+       if paddingBits != 0 {
+               return false
+       }
+       *out = bytes[1:]
+       return true
+}
+
+// ReadASN1Bytes reads the contents of a DER-encoded ASN.1 element (not including
+// tag and length bytes) into out, and advances. The element must match the
+// given tag. It reports whether the read was successful.
+func (s *String) ReadASN1Bytes(out *[]byte, tag asn1.Tag) bool {
+       return s.ReadASN1((*String)(out), tag)
+}
+
+// ReadASN1 reads the contents of a DER-encoded ASN.1 element (not including
+// tag and length bytes) into out, and advances. The element must match the
+// given tag. It reports whether the read was successful.
+//
+// Tags greater than 30 are not supported (i.e. low-tag-number format only).
+func (s *String) ReadASN1(out *String, tag asn1.Tag) bool {
+       var t asn1.Tag
+       if !s.ReadAnyASN1(out, &t) || t != tag {
+               return false
+       }
+       return true
+}
+
+// ReadASN1Element reads the contents of a DER-encoded ASN.1 element (including
+// tag and length bytes) into out, and advances. The element must match the
+// given tag. It reports whether the read was successful.
+//
+// Tags greater than 30 are not supported (i.e. low-tag-number format only).
+func (s *String) ReadASN1Element(out *String, tag asn1.Tag) bool {
+       var t asn1.Tag
+       if !s.ReadAnyASN1Element(out, &t) || t != tag {
+               return false
+       }
+       return true
+}
+
+// ReadAnyASN1 reads the contents of a DER-encoded ASN.1 element (not including
+// tag and length bytes) into out, sets outTag to its tag, and advances.
+// It reports whether the read was successful.
+//
+// Tags greater than 30 are not supported (i.e. low-tag-number format only).
+func (s *String) ReadAnyASN1(out *String, outTag *asn1.Tag) bool {
+       return s.readASN1(out, outTag, true /* skip header */)
+}
+
+// ReadAnyASN1Element reads the contents of a DER-encoded ASN.1 element
+// (including tag and length bytes) into out, sets outTag to is tag, and
+// advances. It reports whether the read was successful.
+//
+// Tags greater than 30 are not supported (i.e. low-tag-number format only).
+func (s *String) ReadAnyASN1Element(out *String, outTag *asn1.Tag) bool {
+       return s.readASN1(out, outTag, false /* include header */)
+}
+
+// PeekASN1Tag reports whether the next ASN.1 value on the string starts with
+// the given tag.
+func (s String) PeekASN1Tag(tag asn1.Tag) bool {
+       if len(s) == 0 {
+               return false
+       }
+       return asn1.Tag(s[0]) == tag
+}
+
+// SkipASN1 reads and discards an ASN.1 element with the given tag. It
+// reports whether the operation was successful.
+func (s *String) SkipASN1(tag asn1.Tag) bool {
+       var unused String
+       return s.ReadASN1(&unused, tag)
+}
+
+// ReadOptionalASN1 attempts to read the contents of a DER-encoded ASN.1
+// element (not including tag and length bytes) tagged with the given tag into
+// out. It stores whether an element with the tag was found in outPresent,
+// unless outPresent is nil. It reports whether the read was successful.
+func (s *String) ReadOptionalASN1(out *String, outPresent *bool, tag asn1.Tag) bool {
+       present := s.PeekASN1Tag(tag)
+       if outPresent != nil {
+               *outPresent = present
+       }
+       if present && !s.ReadASN1(out, tag) {
+               return false
+       }
+       return true
+}
+
+// SkipOptionalASN1 advances s over an ASN.1 element with the given tag, or
+// else leaves s unchanged. It reports whether the operation was successful.
+func (s *String) SkipOptionalASN1(tag asn1.Tag) bool {
+       if !s.PeekASN1Tag(tag) {
+               return true
+       }
+       var unused String
+       return s.ReadASN1(&unused, tag)
+}
+
+// ReadOptionalASN1Integer attempts to read an optional ASN.1 INTEGER
+// explicitly tagged with tag into out and advances. If no element with a
+// matching tag is present, it writes defaultValue into out instead. If out
+// does not point to an integer or to a big.Int, it panics. It reports
+// whether the read was successful.
+func (s *String) ReadOptionalASN1Integer(out interface{}, tag asn1.Tag, defaultValue interface{}) bool {
+       if reflect.TypeOf(out).Kind() != reflect.Ptr {
+               panic("out is not a pointer")
+       }
+       var present bool
+       var i String
+       if !s.ReadOptionalASN1(&i, &present, tag) {
+               return false
+       }
+       if !present {
+               switch reflect.ValueOf(out).Elem().Kind() {
+               case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
+                       reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+                       reflect.ValueOf(out).Elem().Set(reflect.ValueOf(defaultValue))
+               case reflect.Struct:
+                       if reflect.TypeOf(out).Elem() != bigIntType {
+                               panic("invalid integer type")
+                       }
+                       if reflect.TypeOf(defaultValue).Kind() != reflect.Ptr ||
+                               reflect.TypeOf(defaultValue).Elem() != bigIntType {
+                               panic("out points to big.Int, but defaultValue does not")
+                       }
+                       out.(*big.Int).Set(defaultValue.(*big.Int))
+               default:
+                       panic("invalid integer type")
+               }
+               return true
+       }
+       if !i.ReadASN1Integer(out) || !i.Empty() {
+               return false
+       }
+       return true
+}
+
+// ReadOptionalASN1OctetString attempts to read an optional ASN.1 OCTET STRING
+// explicitly tagged with tag into out and advances. If no element with a
+// matching tag is present, it sets "out" to nil instead. It reports
+// whether the read was successful.
+func (s *String) ReadOptionalASN1OctetString(out *[]byte, outPresent *bool, tag asn1.Tag) bool {
+       var present bool
+       var child String
+       if !s.ReadOptionalASN1(&child, &present, tag) {
+               return false
+       }
+       if outPresent != nil {
+               *outPresent = present
+       }
+       if present {
+               var oct String
+               if !child.ReadASN1(&oct, asn1.OCTET_STRING) || !child.Empty() {
+                       return false
+               }
+               *out = oct
+       } else {
+               *out = nil
+       }
+       return true
+}
+
+// ReadOptionalASN1Boolean sets *out to the value of the next ASN.1 BOOLEAN or,
+// if the next bytes are not an ASN.1 BOOLEAN, to the value of defaultValue.
+// It reports whether the operation was successful.
+func (s *String) ReadOptionalASN1Boolean(out *bool, defaultValue bool) bool {
+       var present bool
+       var child String
+       if !s.ReadOptionalASN1(&child, &present, asn1.BOOLEAN) {
+               return false
+       }
+
+       if !present {
+               *out = defaultValue
+               return true
+       }
+
+       return s.ReadASN1Boolean(out)
+}
+
+func (s *String) readASN1(out *String, outTag *asn1.Tag, skipHeader bool) bool {
+       if len(*s) < 2 {
+               return false
+       }
+       tag, lenByte := (*s)[0], (*s)[1]
+
+       if tag&0x1f == 0x1f {
+               // ITU-T X.690 section 8.1.2
+               //
+               // An identifier octet with a tag part of 0x1f indicates a high-tag-number
+               // form identifier with two or more octets. We only support tags less than
+               // 31 (i.e. low-tag-number form, single octet identifier).
+               return false
+       }
+
+       if outTag != nil {
+               *outTag = asn1.Tag(tag)
+       }
+
+       // ITU-T X.690 section 8.1.3
+       //
+       // Bit 8 of the first length byte indicates whether the length is short- or
+       // long-form.
+       var length, headerLen uint32 // length includes headerLen
+       if lenByte&0x80 == 0 {
+               // Short-form length (section 8.1.3.4), encoded in bits 1-7.
+               length = uint32(lenByte) + 2
+               headerLen = 2
+       } else {
+               // Long-form length (section 8.1.3.5). Bits 1-7 encode the number of octets
+               // used to encode the length.
+               lenLen := lenByte & 0x7f
+               var len32 uint32
+
+               if lenLen == 0 || lenLen > 4 || len(*s) < int(2+lenLen) {
+                       return false
+               }
+
+               lenBytes := String((*s)[2 : 2+lenLen])
+               if !lenBytes.readUnsigned(&len32, int(lenLen)) {
+                       return false
+               }
+
+               // ITU-T X.690 section 10.1 (DER length forms) requires encoding the length
+               // with the minimum number of octets.
+               if len32 < 128 {
+                       // Length should have used short-form encoding.
+                       return false
+               }
+               if len32>>((lenLen-1)*8) == 0 {
+                       // Leading octet is 0. Length should have been at least one byte shorter.
+                       return false
+               }
+
+               headerLen = 2 + uint32(lenLen)
+               if headerLen+len32 < len32 {
+                       // Overflow.
+                       return false
+               }
+               length = headerLen + len32
+       }
+
+       if uint32(int(length)) != length || !s.ReadBytes((*[]byte)(out), int(length)) {
+               return false
+       }
+       if skipHeader && !out.Skip(int(headerLen)) {
+               panic("cryptobyte: internal error")
+       }
+
+       return true
+}
diff --git a/libgo/go/golang.org/x/crypto/cryptobyte/asn1/asn1.go b/libgo/go/golang.org/x/crypto/cryptobyte/asn1/asn1.go
new file mode 100644 (file)
index 0000000..cda8e3e
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package asn1 contains supporting types for parsing and building ASN.1
+// messages with the cryptobyte package.
+package asn1 // import "golang.org/x/crypto/cryptobyte/asn1"
+
+// Tag represents an ASN.1 identifier octet, consisting of a tag number
+// (indicating a type) and class (such as context-specific or constructed).
+//
+// Methods in the cryptobyte package only support the low-tag-number form, i.e.
+// a single identifier octet with bits 7-8 encoding the class and bits 1-6
+// encoding the tag number.
+type Tag uint8
+
+const (
+       classConstructed     = 0x20
+       classContextSpecific = 0x80
+)
+
+// Constructed returns t with the constructed class bit set.
+func (t Tag) Constructed() Tag { return t | classConstructed }
+
+// ContextSpecific returns t with the context-specific class bit set.
+func (t Tag) ContextSpecific() Tag { return t | classContextSpecific }
+
+// The following is a list of standard tag and class combinations.
+const (
+       BOOLEAN           = Tag(1)
+       INTEGER           = Tag(2)
+       BIT_STRING        = Tag(3)
+       OCTET_STRING      = Tag(4)
+       NULL              = Tag(5)
+       OBJECT_IDENTIFIER = Tag(6)
+       ENUM              = Tag(10)
+       UTF8String        = Tag(12)
+       SEQUENCE          = Tag(16 | classConstructed)
+       SET               = Tag(17 | classConstructed)
+       PrintableString   = Tag(19)
+       T61String         = Tag(20)
+       IA5String         = Tag(22)
+       UTCTime           = Tag(23)
+       GeneralizedTime   = Tag(24)
+       GeneralString     = Tag(27)
+)
diff --git a/libgo/go/golang.org/x/crypto/cryptobyte/builder.go b/libgo/go/golang.org/x/crypto/cryptobyte/builder.go
new file mode 100644 (file)
index 0000000..ca7b1db
--- /dev/null
@@ -0,0 +1,337 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cryptobyte
+
+import (
+       "errors"
+       "fmt"
+)
+
+// A Builder builds byte strings from fixed-length and length-prefixed values.
+// Builders either allocate space as needed, or are ‘fixed’, which means that
+// they write into a given buffer and produce an error if it's exhausted.
+//
+// The zero value is a usable Builder that allocates space as needed.
+//
+// Simple values are marshaled and appended to a Builder using methods on the
+// Builder. Length-prefixed values are marshaled by providing a
+// BuilderContinuation, which is a function that writes the inner contents of
+// the value to a given Builder. See the documentation for BuilderContinuation
+// for details.
+type Builder struct {
+       err            error
+       result         []byte
+       fixedSize      bool
+       child          *Builder
+       offset         int
+       pendingLenLen  int
+       pendingIsASN1  bool
+       inContinuation *bool
+}
+
+// NewBuilder creates a Builder that appends its output to the given buffer.
+// Like append(), the slice will be reallocated if its capacity is exceeded.
+// Use Bytes to get the final buffer.
+func NewBuilder(buffer []byte) *Builder {
+       return &Builder{
+               result: buffer,
+       }
+}
+
+// NewFixedBuilder creates a Builder that appends its output into the given
+// buffer. This builder does not reallocate the output buffer. Writes that
+// would exceed the buffer's capacity are treated as an error.
+func NewFixedBuilder(buffer []byte) *Builder {
+       return &Builder{
+               result:    buffer,
+               fixedSize: true,
+       }
+}
+
+// SetError sets the value to be returned as the error from Bytes. Writes
+// performed after calling SetError are ignored.
+func (b *Builder) SetError(err error) {
+       b.err = err
+}
+
+// Bytes returns the bytes written by the builder or an error if one has
+// occurred during building.
+func (b *Builder) Bytes() ([]byte, error) {
+       if b.err != nil {
+               return nil, b.err
+       }
+       return b.result[b.offset:], nil
+}
+
+// BytesOrPanic returns the bytes written by the builder or panics if an error
+// has occurred during building.
+func (b *Builder) BytesOrPanic() []byte {
+       if b.err != nil {
+               panic(b.err)
+       }
+       return b.result[b.offset:]
+}
+
+// AddUint8 appends an 8-bit value to the byte string.
+func (b *Builder) AddUint8(v uint8) {
+       b.add(byte(v))
+}
+
+// AddUint16 appends a big-endian, 16-bit value to the byte string.
+func (b *Builder) AddUint16(v uint16) {
+       b.add(byte(v>>8), byte(v))
+}
+
+// AddUint24 appends a big-endian, 24-bit value to the byte string. The highest
+// byte of the 32-bit input value is silently truncated.
+func (b *Builder) AddUint24(v uint32) {
+       b.add(byte(v>>16), byte(v>>8), byte(v))
+}
+
+// AddUint32 appends a big-endian, 32-bit value to the byte string.
+func (b *Builder) AddUint32(v uint32) {
+       b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
+}
+
+// AddBytes appends a sequence of bytes to the byte string.
+func (b *Builder) AddBytes(v []byte) {
+       b.add(v...)
+}
+
+// BuilderContinuation is a continuation-passing interface for building
+// length-prefixed byte sequences. Builder methods for length-prefixed
+// sequences (AddUint8LengthPrefixed etc) will invoke the BuilderContinuation
+// supplied to them. The child builder passed to the continuation can be used
+// to build the content of the length-prefixed sequence. For example:
+//
+//   parent := cryptobyte.NewBuilder()
+//   parent.AddUint8LengthPrefixed(func (child *Builder) {
+//     child.AddUint8(42)
+//     child.AddUint8LengthPrefixed(func (grandchild *Builder) {
+//       grandchild.AddUint8(5)
+//     })
+//   })
+//
+// It is an error to write more bytes to the child than allowed by the reserved
+// length prefix. After the continuation returns, the child must be considered
+// invalid, i.e. users must not store any copies or references of the child
+// that outlive the continuation.
+//
+// If the continuation panics with a value of type BuildError then the inner
+// error will be returned as the error from Bytes. If the child panics
+// otherwise then Bytes will repanic with the same value.
+type BuilderContinuation func(child *Builder)
+
+// BuildError wraps an error. If a BuilderContinuation panics with this value,
+// the panic will be recovered and the inner error will be returned from
+// Builder.Bytes.
+type BuildError struct {
+       Err error
+}
+
+// AddUint8LengthPrefixed adds a 8-bit length-prefixed byte sequence.
+func (b *Builder) AddUint8LengthPrefixed(f BuilderContinuation) {
+       b.addLengthPrefixed(1, false, f)
+}
+
+// AddUint16LengthPrefixed adds a big-endian, 16-bit length-prefixed byte sequence.
+func (b *Builder) AddUint16LengthPrefixed(f BuilderContinuation) {
+       b.addLengthPrefixed(2, false, f)
+}
+
+// AddUint24LengthPrefixed adds a big-endian, 24-bit length-prefixed byte sequence.
+func (b *Builder) AddUint24LengthPrefixed(f BuilderContinuation) {
+       b.addLengthPrefixed(3, false, f)
+}
+
+// AddUint32LengthPrefixed adds a big-endian, 32-bit length-prefixed byte sequence.
+func (b *Builder) AddUint32LengthPrefixed(f BuilderContinuation) {
+       b.addLengthPrefixed(4, false, f)
+}
+
+func (b *Builder) callContinuation(f BuilderContinuation, arg *Builder) {
+       if !*b.inContinuation {
+               *b.inContinuation = true
+
+               defer func() {
+                       *b.inContinuation = false
+
+                       r := recover()
+                       if r == nil {
+                               return
+                       }
+
+                       if buildError, ok := r.(BuildError); ok {
+                               b.err = buildError.Err
+                       } else {
+                               panic(r)
+                       }
+               }()
+       }
+
+       f(arg)
+}
+
+func (b *Builder) addLengthPrefixed(lenLen int, isASN1 bool, f BuilderContinuation) {
+       // Subsequent writes can be ignored if the builder has encountered an error.
+       if b.err != nil {
+               return
+       }
+
+       offset := len(b.result)
+       b.add(make([]byte, lenLen)...)
+
+       if b.inContinuation == nil {
+               b.inContinuation = new(bool)
+       }
+
+       b.child = &Builder{
+               result:         b.result,
+               fixedSize:      b.fixedSize,
+               offset:         offset,
+               pendingLenLen:  lenLen,
+               pendingIsASN1:  isASN1,
+               inContinuation: b.inContinuation,
+       }
+
+       b.callContinuation(f, b.child)
+       b.flushChild()
+       if b.child != nil {
+               panic("cryptobyte: internal error")
+       }
+}
+
+func (b *Builder) flushChild() {
+       if b.child == nil {
+               return
+       }
+       b.child.flushChild()
+       child := b.child
+       b.child = nil
+
+       if child.err != nil {
+               b.err = child.err
+               return
+       }
+
+       length := len(child.result) - child.pendingLenLen - child.offset
+
+       if length < 0 {
+               panic("cryptobyte: internal error") // result unexpectedly shrunk
+       }
+
+       if child.pendingIsASN1 {
+               // For ASN.1, we reserved a single byte for the length. If that turned out
+               // to be incorrect, we have to move the contents along in order to make
+               // space.
+               if child.pendingLenLen != 1 {
+                       panic("cryptobyte: internal error")
+               }
+               var lenLen, lenByte uint8
+               if int64(length) > 0xfffffffe {
+                       b.err = errors.New("pending ASN.1 child too long")
+                       return
+               } else if length > 0xffffff {
+                       lenLen = 5
+                       lenByte = 0x80 | 4
+               } else if length > 0xffff {
+                       lenLen = 4
+                       lenByte = 0x80 | 3
+               } else if length > 0xff {
+                       lenLen = 3
+                       lenByte = 0x80 | 2
+               } else if length > 0x7f {
+                       lenLen = 2
+                       lenByte = 0x80 | 1
+               } else {
+                       lenLen = 1
+                       lenByte = uint8(length)
+                       length = 0
+               }
+
+               // Insert the initial length byte, make space for successive length bytes,
+               // and adjust the offset.
+               child.result[child.offset] = lenByte
+               extraBytes := int(lenLen - 1)
+               if extraBytes != 0 {
+                       child.add(make([]byte, extraBytes)...)
+                       childStart := child.offset + child.pendingLenLen
+                       copy(child.result[childStart+extraBytes:], child.result[childStart:])
+               }
+               child.offset++
+               child.pendingLenLen = extraBytes
+       }
+
+       l := length
+       for i := child.pendingLenLen - 1; i >= 0; i-- {
+               child.result[child.offset+i] = uint8(l)
+               l >>= 8
+       }
+       if l != 0 {
+               b.err = fmt.Errorf("cryptobyte: pending child length %d exceeds %d-byte length prefix", length, child.pendingLenLen)
+               return
+       }
+
+       if b.fixedSize && &b.result[0] != &child.result[0] {
+               panic("cryptobyte: BuilderContinuation reallocated a fixed-size buffer")
+       }
+
+       b.result = child.result
+}
+
+func (b *Builder) add(bytes ...byte) {
+       if b.err != nil {
+               return
+       }
+       if b.child != nil {
+               panic("cryptobyte: attempted write while child is pending")
+       }
+       if len(b.result)+len(bytes) < len(bytes) {
+               b.err = errors.New("cryptobyte: length overflow")
+       }
+       if b.fixedSize && len(b.result)+len(bytes) > cap(b.result) {
+               b.err = errors.New("cryptobyte: Builder is exceeding its fixed-size buffer")
+               return
+       }
+       b.result = append(b.result, bytes...)
+}
+
+// Unwrite rolls back n bytes written directly to the Builder. An attempt by a
+// child builder passed to a continuation to unwrite bytes from its parent will
+// panic.
+func (b *Builder) Unwrite(n int) {
+       if b.err != nil {
+               return
+       }
+       if b.child != nil {
+               panic("cryptobyte: attempted unwrite while child is pending")
+       }
+       length := len(b.result) - b.pendingLenLen - b.offset
+       if length < 0 {
+               panic("cryptobyte: internal error")
+       }
+       if n > length {
+               panic("cryptobyte: attempted to unwrite more than was written")
+       }
+       b.result = b.result[:len(b.result)-n]
+}
+
+// A MarshalingValue marshals itself into a Builder.
+type MarshalingValue interface {
+       // Marshal is called by Builder.AddValue. It receives a pointer to a builder
+       // to marshal itself into. It may return an error that occurred during
+       // marshaling, such as unset or invalid values.
+       Marshal(b *Builder) error
+}
+
+// AddValue calls Marshal on v, passing a pointer to the builder to append to.
+// If Marshal returns an error, it is set on the Builder so that subsequent
+// appends don't have an effect.
+func (b *Builder) AddValue(v MarshalingValue) {
+       err := v.Marshal(b)
+       if err != nil {
+               b.err = err
+       }
+}
diff --git a/libgo/go/golang.org/x/crypto/cryptobyte/string.go b/libgo/go/golang.org/x/crypto/cryptobyte/string.go
new file mode 100644 (file)
index 0000000..39bf98a
--- /dev/null
@@ -0,0 +1,166 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cryptobyte contains types that help with parsing and constructing
+// length-prefixed, binary messages, including ASN.1 DER. (The asn1 subpackage
+// contains useful ASN.1 constants.)
+//
+// The String type is for parsing. It wraps a []byte slice and provides helper
+// functions for consuming structures, value by value.
+//
+// The Builder type is for constructing messages. It providers helper functions
+// for appending values and also for appending length-prefixed submessages –
+// without having to worry about calculating the length prefix ahead of time.
+//
+// See the documentation and examples for the Builder and String types to get
+// started.
+package cryptobyte // import "golang.org/x/crypto/cryptobyte"
+
+// String represents a string of bytes. It provides methods for parsing
+// fixed-length and length-prefixed values from it.
+type String []byte
+
+// read advances a String by n bytes and returns them. If less than n bytes
+// remain, it returns nil.
+func (s *String) read(n int) []byte {
+       if len(*s) < n {
+               return nil
+       }
+       v := (*s)[:n]
+       *s = (*s)[n:]
+       return v
+}
+
+// Skip advances the String by n byte and reports whether it was successful.
+func (s *String) Skip(n int) bool {
+       return s.read(n) != nil
+}
+
+// ReadUint8 decodes an 8-bit value into out and advances over it.
+// It reports whether the read was successful.
+func (s *String) ReadUint8(out *uint8) bool {
+       v := s.read(1)
+       if v == nil {
+               return false
+       }
+       *out = uint8(v[0])
+       return true
+}
+
+// ReadUint16 decodes a big-endian, 16-bit value into out and advances over it.
+// It reports whether the read was successful.
+func (s *String) ReadUint16(out *uint16) bool {
+       v := s.read(2)
+       if v == nil {
+               return false
+       }
+       *out = uint16(v[0])<<8 | uint16(v[1])
+       return true
+}
+
+// ReadUint24 decodes a big-endian, 24-bit value into out and advances over it.
+// It reports whether the read was successful.
+func (s *String) ReadUint24(out *uint32) bool {
+       v := s.read(3)
+       if v == nil {
+               return false
+       }
+       *out = uint32(v[0])<<16 | uint32(v[1])<<8 | uint32(v[2])
+       return true
+}
+
+// ReadUint32 decodes a big-endian, 32-bit value into out and advances over it.
+// It reports whether the read was successful.
+func (s *String) ReadUint32(out *uint32) bool {
+       v := s.read(4)
+       if v == nil {
+               return false
+       }
+       *out = uint32(v[0])<<24 | uint32(v[1])<<16 | uint32(v[2])<<8 | uint32(v[3])
+       return true
+}
+
+func (s *String) readUnsigned(out *uint32, length int) bool {
+       v := s.read(length)
+       if v == nil {
+               return false
+       }
+       var result uint32
+       for i := 0; i < length; i++ {
+               result <<= 8
+               result |= uint32(v[i])
+       }
+       *out = result
+       return true
+}
+
+func (s *String) readLengthPrefixed(lenLen int, outChild *String) bool {
+       lenBytes := s.read(lenLen)
+       if lenBytes == nil {
+               return false
+       }
+       var length uint32
+       for _, b := range lenBytes {
+               length = length << 8
+               length = length | uint32(b)
+       }
+       if int(length) < 0 {
+               // This currently cannot overflow because we read uint24 at most, but check
+               // anyway in case that changes in the future.
+               return false
+       }
+       v := s.read(int(length))
+       if v == nil {
+               return false
+       }
+       *outChild = v
+       return true
+}
+
+// ReadUint8LengthPrefixed reads the content of an 8-bit length-prefixed value
+// into out and advances over it. It reports whether the read was successful.
+func (s *String) ReadUint8LengthPrefixed(out *String) bool {
+       return s.readLengthPrefixed(1, out)
+}
+
+// ReadUint16LengthPrefixed reads the content of a big-endian, 16-bit
+// length-prefixed value into out and advances over it. It reports whether the
+// read was successful.
+func (s *String) ReadUint16LengthPrefixed(out *String) bool {
+       return s.readLengthPrefixed(2, out)
+}
+
+// ReadUint24LengthPrefixed reads the content of a big-endian, 24-bit
+// length-prefixed value into out and advances over it. It reports whether
+// the read was successful.
+func (s *String) ReadUint24LengthPrefixed(out *String) bool {
+       return s.readLengthPrefixed(3, out)
+}
+
+// ReadBytes reads n bytes into out and advances over them. It reports
+// whether the read was successful.
+func (s *String) ReadBytes(out *[]byte, n int) bool {
+       v := s.read(n)
+       if v == nil {
+               return false
+       }
+       *out = v
+       return true
+}
+
+// CopyBytes copies len(out) bytes into out and advances over them. It reports
+// whether the copy operation was successful
+func (s *String) CopyBytes(out []byte) bool {
+       n := len(out)
+       v := s.read(n)
+       if v == nil {
+               return false
+       }
+       return copy(out, v) == n
+}
+
+// Empty reports whether the string does not contain any bytes.
+func (s String) Empty() bool {
+       return len(s) == 0
+}
diff --git a/libgo/go/golang.org/x/crypto/curve25519/curve25519.go b/libgo/go/golang.org/x/crypto/curve25519/curve25519.go
new file mode 100644 (file)
index 0000000..75f24ba
--- /dev/null
@@ -0,0 +1,834 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// We have an implementation in amd64 assembly so this code is only run on
+// non-amd64 platforms. The amd64 assembly does not support gccgo.
+// +build !amd64 gccgo appengine
+
+package curve25519
+
+import (
+       "encoding/binary"
+)
+
+// This code is a port of the public domain, "ref10" implementation of
+// curve25519 from SUPERCOP 20130419 by D. J. Bernstein.
+
+// fieldElement represents an element of the field GF(2^255 - 19). An element
+// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
+// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on
+// context.
+type fieldElement [10]int32
+
+func feZero(fe *fieldElement) {
+       for i := range fe {
+               fe[i] = 0
+       }
+}
+
+func feOne(fe *fieldElement) {
+       feZero(fe)
+       fe[0] = 1
+}
+
+func feAdd(dst, a, b *fieldElement) {
+       for i := range dst {
+               dst[i] = a[i] + b[i]
+       }
+}
+
+func feSub(dst, a, b *fieldElement) {
+       for i := range dst {
+               dst[i] = a[i] - b[i]
+       }
+}
+
+func feCopy(dst, src *fieldElement) {
+       for i := range dst {
+               dst[i] = src[i]
+       }
+}
+
+// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0.
+//
+// Preconditions: b in {0,1}.
+func feCSwap(f, g *fieldElement, b int32) {
+       b = -b
+       for i := range f {
+               t := b & (f[i] ^ g[i])
+               f[i] ^= t
+               g[i] ^= t
+       }
+}
+
+// load3 reads a 24-bit, little-endian value from in.
+func load3(in []byte) int64 {
+       var r int64
+       r = int64(in[0])
+       r |= int64(in[1]) << 8
+       r |= int64(in[2]) << 16
+       return r
+}
+
+// load4 reads a 32-bit, little-endian value from in.
+func load4(in []byte) int64 {
+       return int64(binary.LittleEndian.Uint32(in))
+}
+
+func feFromBytes(dst *fieldElement, src *[32]byte) {
+       h0 := load4(src[:])
+       h1 := load3(src[4:]) << 6
+       h2 := load3(src[7:]) << 5
+       h3 := load3(src[10:]) << 3
+       h4 := load3(src[13:]) << 2
+       h5 := load4(src[16:])
+       h6 := load3(src[20:]) << 7
+       h7 := load3(src[23:]) << 5
+       h8 := load3(src[26:]) << 4
+       h9 := (load3(src[29:]) & 0x7fffff) << 2
+
+       var carry [10]int64
+       carry[9] = (h9 + 1<<24) >> 25
+       h0 += carry[9] * 19
+       h9 -= carry[9] << 25
+       carry[1] = (h1 + 1<<24) >> 25
+       h2 += carry[1]
+       h1 -= carry[1] << 25
+       carry[3] = (h3 + 1<<24) >> 25
+       h4 += carry[3]
+       h3 -= carry[3] << 25
+       carry[5] = (h5 + 1<<24) >> 25
+       h6 += carry[5]
+       h5 -= carry[5] << 25
+       carry[7] = (h7 + 1<<24) >> 25
+       h8 += carry[7]
+       h7 -= carry[7] << 25
+
+       carry[0] = (h0 + 1<<25) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+       carry[2] = (h2 + 1<<25) >> 26
+       h3 += carry[2]
+       h2 -= carry[2] << 26
+       carry[4] = (h4 + 1<<25) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+       carry[6] = (h6 + 1<<25) >> 26
+       h7 += carry[6]
+       h6 -= carry[6] << 26
+       carry[8] = (h8 + 1<<25) >> 26
+       h9 += carry[8]
+       h8 -= carry[8] << 26
+
+       dst[0] = int32(h0)
+       dst[1] = int32(h1)
+       dst[2] = int32(h2)
+       dst[3] = int32(h3)
+       dst[4] = int32(h4)
+       dst[5] = int32(h5)
+       dst[6] = int32(h6)
+       dst[7] = int32(h7)
+       dst[8] = int32(h8)
+       dst[9] = int32(h9)
+}
+
+// feToBytes marshals h to s.
+// Preconditions:
+//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Write p=2^255-19; q=floor(h/p).
+// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
+//
+// Proof:
+//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
+//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
+//
+//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
+//   Then 0<y<1.
+//
+//   Write r=h-pq.
+//   Have 0<=r<=p-1=2^255-20.
+//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
+//
+//   Write x=r+19(2^-255)r+y.
+//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
+//
+//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
+//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
+func feToBytes(s *[32]byte, h *fieldElement) {
+       var carry [10]int32
+
+       q := (19*h[9] + (1 << 24)) >> 25
+       q = (h[0] + q) >> 26
+       q = (h[1] + q) >> 25
+       q = (h[2] + q) >> 26
+       q = (h[3] + q) >> 25
+       q = (h[4] + q) >> 26
+       q = (h[5] + q) >> 25
+       q = (h[6] + q) >> 26
+       q = (h[7] + q) >> 25
+       q = (h[8] + q) >> 26
+       q = (h[9] + q) >> 25
+
+       // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
+       h[0] += 19 * q
+       // Goal: Output h-2^255 q, which is between 0 and 2^255-20.
+
+       carry[0] = h[0] >> 26
+       h[1] += carry[0]
+       h[0] -= carry[0] << 26
+       carry[1] = h[1] >> 25
+       h[2] += carry[1]
+       h[1] -= carry[1] << 25
+       carry[2] = h[2] >> 26
+       h[3] += carry[2]
+       h[2] -= carry[2] << 26
+       carry[3] = h[3] >> 25
+       h[4] += carry[3]
+       h[3] -= carry[3] << 25
+       carry[4] = h[4] >> 26
+       h[5] += carry[4]
+       h[4] -= carry[4] << 26
+       carry[5] = h[5] >> 25
+       h[6] += carry[5]
+       h[5] -= carry[5] << 25
+       carry[6] = h[6] >> 26
+       h[7] += carry[6]
+       h[6] -= carry[6] << 26
+       carry[7] = h[7] >> 25
+       h[8] += carry[7]
+       h[7] -= carry[7] << 25
+       carry[8] = h[8] >> 26
+       h[9] += carry[8]
+       h[8] -= carry[8] << 26
+       carry[9] = h[9] >> 25
+       h[9] -= carry[9] << 25
+       // h10 = carry9
+
+       // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
+       // Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
+       // evidently 2^255 h10-2^255 q = 0.
+       // Goal: Output h[0]+...+2^230 h[9].
+
+       s[0] = byte(h[0] >> 0)
+       s[1] = byte(h[0] >> 8)
+       s[2] = byte(h[0] >> 16)
+       s[3] = byte((h[0] >> 24) | (h[1] << 2))
+       s[4] = byte(h[1] >> 6)
+       s[5] = byte(h[1] >> 14)
+       s[6] = byte((h[1] >> 22) | (h[2] << 3))
+       s[7] = byte(h[2] >> 5)
+       s[8] = byte(h[2] >> 13)
+       s[9] = byte((h[2] >> 21) | (h[3] << 5))
+       s[10] = byte(h[3] >> 3)
+       s[11] = byte(h[3] >> 11)
+       s[12] = byte((h[3] >> 19) | (h[4] << 6))
+       s[13] = byte(h[4] >> 2)
+       s[14] = byte(h[4] >> 10)
+       s[15] = byte(h[4] >> 18)
+       s[16] = byte(h[5] >> 0)
+       s[17] = byte(h[5] >> 8)
+       s[18] = byte(h[5] >> 16)
+       s[19] = byte((h[5] >> 24) | (h[6] << 1))
+       s[20] = byte(h[6] >> 7)
+       s[21] = byte(h[6] >> 15)
+       s[22] = byte((h[6] >> 23) | (h[7] << 3))
+       s[23] = byte(h[7] >> 5)
+       s[24] = byte(h[7] >> 13)
+       s[25] = byte((h[7] >> 21) | (h[8] << 4))
+       s[26] = byte(h[8] >> 4)
+       s[27] = byte(h[8] >> 12)
+       s[28] = byte((h[8] >> 20) | (h[9] << 6))
+       s[29] = byte(h[9] >> 2)
+       s[30] = byte(h[9] >> 10)
+       s[31] = byte(h[9] >> 18)
+}
+
+// feMul calculates h = f * g
+// Can overlap h with f or g.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Notes on implementation strategy:
+//
+// Using schoolbook multiplication.
+// Karatsuba would save a little in some cost models.
+//
+// Most multiplications by 2 and 19 are 32-bit precomputations;
+// cheaper than 64-bit postcomputations.
+//
+// There is one remaining multiplication by 19 in the carry chain;
+// one *19 precomputation can be merged into this,
+// but the resulting data flow is considerably less clean.
+//
+// There are 12 carries below.
+// 10 of them are 2-way parallelizable and vectorizable.
+// Can get away with 11 carries, but then data flow is much deeper.
+//
+// With tighter constraints on inputs can squeeze carries into int32.
+func feMul(h, f, g *fieldElement) {
+       f0 := f[0]
+       f1 := f[1]
+       f2 := f[2]
+       f3 := f[3]
+       f4 := f[4]
+       f5 := f[5]
+       f6 := f[6]
+       f7 := f[7]
+       f8 := f[8]
+       f9 := f[9]
+       g0 := g[0]
+       g1 := g[1]
+       g2 := g[2]
+       g3 := g[3]
+       g4 := g[4]
+       g5 := g[5]
+       g6 := g[6]
+       g7 := g[7]
+       g8 := g[8]
+       g9 := g[9]
+       g1_19 := 19 * g1 // 1.4*2^29
+       g2_19 := 19 * g2 // 1.4*2^30; still ok
+       g3_19 := 19 * g3
+       g4_19 := 19 * g4
+       g5_19 := 19 * g5
+       g6_19 := 19 * g6
+       g7_19 := 19 * g7
+       g8_19 := 19 * g8
+       g9_19 := 19 * g9
+       f1_2 := 2 * f1
+       f3_2 := 2 * f3
+       f5_2 := 2 * f5
+       f7_2 := 2 * f7
+       f9_2 := 2 * f9
+       f0g0 := int64(f0) * int64(g0)
+       f0g1 := int64(f0) * int64(g1)
+       f0g2 := int64(f0) * int64(g2)
+       f0g3 := int64(f0) * int64(g3)
+       f0g4 := int64(f0) * int64(g4)
+       f0g5 := int64(f0) * int64(g5)
+       f0g6 := int64(f0) * int64(g6)
+       f0g7 := int64(f0) * int64(g7)
+       f0g8 := int64(f0) * int64(g8)
+       f0g9 := int64(f0) * int64(g9)
+       f1g0 := int64(f1) * int64(g0)
+       f1g1_2 := int64(f1_2) * int64(g1)
+       f1g2 := int64(f1) * int64(g2)
+       f1g3_2 := int64(f1_2) * int64(g3)
+       f1g4 := int64(f1) * int64(g4)
+       f1g5_2 := int64(f1_2) * int64(g5)
+       f1g6 := int64(f1) * int64(g6)
+       f1g7_2 := int64(f1_2) * int64(g7)
+       f1g8 := int64(f1) * int64(g8)
+       f1g9_38 := int64(f1_2) * int64(g9_19)
+       f2g0 := int64(f2) * int64(g0)
+       f2g1 := int64(f2) * int64(g1)
+       f2g2 := int64(f2) * int64(g2)
+       f2g3 := int64(f2) * int64(g3)
+       f2g4 := int64(f2) * int64(g4)
+       f2g5 := int64(f2) * int64(g5)
+       f2g6 := int64(f2) * int64(g6)
+       f2g7 := int64(f2) * int64(g7)
+       f2g8_19 := int64(f2) * int64(g8_19)
+       f2g9_19 := int64(f2) * int64(g9_19)
+       f3g0 := int64(f3) * int64(g0)
+       f3g1_2 := int64(f3_2) * int64(g1)
+       f3g2 := int64(f3) * int64(g2)
+       f3g3_2 := int64(f3_2) * int64(g3)
+       f3g4 := int64(f3) * int64(g4)
+       f3g5_2 := int64(f3_2) * int64(g5)
+       f3g6 := int64(f3) * int64(g6)
+       f3g7_38 := int64(f3_2) * int64(g7_19)
+       f3g8_19 := int64(f3) * int64(g8_19)
+       f3g9_38 := int64(f3_2) * int64(g9_19)
+       f4g0 := int64(f4) * int64(g0)
+       f4g1 := int64(f4) * int64(g1)
+       f4g2 := int64(f4) * int64(g2)
+       f4g3 := int64(f4) * int64(g3)
+       f4g4 := int64(f4) * int64(g4)
+       f4g5 := int64(f4) * int64(g5)
+       f4g6_19 := int64(f4) * int64(g6_19)
+       f4g7_19 := int64(f4) * int64(g7_19)
+       f4g8_19 := int64(f4) * int64(g8_19)
+       f4g9_19 := int64(f4) * int64(g9_19)
+       f5g0 := int64(f5) * int64(g0)
+       f5g1_2 := int64(f5_2) * int64(g1)
+       f5g2 := int64(f5) * int64(g2)
+       f5g3_2 := int64(f5_2) * int64(g3)
+       f5g4 := int64(f5) * int64(g4)
+       f5g5_38 := int64(f5_2) * int64(g5_19)
+       f5g6_19 := int64(f5) * int64(g6_19)
+       f5g7_38 := int64(f5_2) * int64(g7_19)
+       f5g8_19 := int64(f5) * int64(g8_19)
+       f5g9_38 := int64(f5_2) * int64(g9_19)
+       f6g0 := int64(f6) * int64(g0)
+       f6g1 := int64(f6) * int64(g1)
+       f6g2 := int64(f6) * int64(g2)
+       f6g3 := int64(f6) * int64(g3)
+       f6g4_19 := int64(f6) * int64(g4_19)
+       f6g5_19 := int64(f6) * int64(g5_19)
+       f6g6_19 := int64(f6) * int64(g6_19)
+       f6g7_19 := int64(f6) * int64(g7_19)
+       f6g8_19 := int64(f6) * int64(g8_19)
+       f6g9_19 := int64(f6) * int64(g9_19)
+       f7g0 := int64(f7) * int64(g0)
+       f7g1_2 := int64(f7_2) * int64(g1)
+       f7g2 := int64(f7) * int64(g2)
+       f7g3_38 := int64(f7_2) * int64(g3_19)
+       f7g4_19 := int64(f7) * int64(g4_19)
+       f7g5_38 := int64(f7_2) * int64(g5_19)
+       f7g6_19 := int64(f7) * int64(g6_19)
+       f7g7_38 := int64(f7_2) * int64(g7_19)
+       f7g8_19 := int64(f7) * int64(g8_19)
+       f7g9_38 := int64(f7_2) * int64(g9_19)
+       f8g0 := int64(f8) * int64(g0)
+       f8g1 := int64(f8) * int64(g1)
+       f8g2_19 := int64(f8) * int64(g2_19)
+       f8g3_19 := int64(f8) * int64(g3_19)
+       f8g4_19 := int64(f8) * int64(g4_19)
+       f8g5_19 := int64(f8) * int64(g5_19)
+       f8g6_19 := int64(f8) * int64(g6_19)
+       f8g7_19 := int64(f8) * int64(g7_19)
+       f8g8_19 := int64(f8) * int64(g8_19)
+       f8g9_19 := int64(f8) * int64(g9_19)
+       f9g0 := int64(f9) * int64(g0)
+       f9g1_38 := int64(f9_2) * int64(g1_19)
+       f9g2_19 := int64(f9) * int64(g2_19)
+       f9g3_38 := int64(f9_2) * int64(g3_19)
+       f9g4_19 := int64(f9) * int64(g4_19)
+       f9g5_38 := int64(f9_2) * int64(g5_19)
+       f9g6_19 := int64(f9) * int64(g6_19)
+       f9g7_38 := int64(f9_2) * int64(g7_19)
+       f9g8_19 := int64(f9) * int64(g8_19)
+       f9g9_38 := int64(f9_2) * int64(g9_19)
+       h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38
+       h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19
+       h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38
+       h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19
+       h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38
+       h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19
+       h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38
+       h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19
+       h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38
+       h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0
+       var carry [10]int64
+
+       // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
+       //   i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
+       // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
+       //   i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
+
+       carry[0] = (h0 + (1 << 25)) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+       carry[4] = (h4 + (1 << 25)) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+       // |h0| <= 2^25
+       // |h4| <= 2^25
+       // |h1| <= 1.51*2^58
+       // |h5| <= 1.51*2^58
+
+       carry[1] = (h1 + (1 << 24)) >> 25
+       h2 += carry[1]
+       h1 -= carry[1] << 25
+       carry[5] = (h5 + (1 << 24)) >> 25
+       h6 += carry[5]
+       h5 -= carry[5] << 25
+       // |h1| <= 2^24; from now on fits into int32
+       // |h5| <= 2^24; from now on fits into int32
+       // |h2| <= 1.21*2^59
+       // |h6| <= 1.21*2^59
+
+       carry[2] = (h2 + (1 << 25)) >> 26
+       h3 += carry[2]
+       h2 -= carry[2] << 26
+       carry[6] = (h6 + (1 << 25)) >> 26
+       h7 += carry[6]
+       h6 -= carry[6] << 26
+       // |h2| <= 2^25; from now on fits into int32 unchanged
+       // |h6| <= 2^25; from now on fits into int32 unchanged
+       // |h3| <= 1.51*2^58
+       // |h7| <= 1.51*2^58
+
+       carry[3] = (h3 + (1 << 24)) >> 25
+       h4 += carry[3]
+       h3 -= carry[3] << 25
+       carry[7] = (h7 + (1 << 24)) >> 25
+       h8 += carry[7]
+       h7 -= carry[7] << 25
+       // |h3| <= 2^24; from now on fits into int32 unchanged
+       // |h7| <= 2^24; from now on fits into int32 unchanged
+       // |h4| <= 1.52*2^33
+       // |h8| <= 1.52*2^33
+
+       carry[4] = (h4 + (1 << 25)) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+       carry[8] = (h8 + (1 << 25)) >> 26
+       h9 += carry[8]
+       h8 -= carry[8] << 26
+       // |h4| <= 2^25; from now on fits into int32 unchanged
+       // |h8| <= 2^25; from now on fits into int32 unchanged
+       // |h5| <= 1.01*2^24
+       // |h9| <= 1.51*2^58
+
+       carry[9] = (h9 + (1 << 24)) >> 25
+       h0 += carry[9] * 19
+       h9 -= carry[9] << 25
+       // |h9| <= 2^24; from now on fits into int32 unchanged
+       // |h0| <= 1.8*2^37
+
+       carry[0] = (h0 + (1 << 25)) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+       // |h0| <= 2^25; from now on fits into int32 unchanged
+       // |h1| <= 1.01*2^24
+
+       h[0] = int32(h0)
+       h[1] = int32(h1)
+       h[2] = int32(h2)
+       h[3] = int32(h3)
+       h[4] = int32(h4)
+       h[5] = int32(h5)
+       h[6] = int32(h6)
+       h[7] = int32(h7)
+       h[8] = int32(h8)
+       h[9] = int32(h9)
+}
+
+// feSquare calculates h = f*f. Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func feSquare(h, f *fieldElement) {
+       f0 := f[0]
+       f1 := f[1]
+       f2 := f[2]
+       f3 := f[3]
+       f4 := f[4]
+       f5 := f[5]
+       f6 := f[6]
+       f7 := f[7]
+       f8 := f[8]
+       f9 := f[9]
+       f0_2 := 2 * f0
+       f1_2 := 2 * f1
+       f2_2 := 2 * f2
+       f3_2 := 2 * f3
+       f4_2 := 2 * f4
+       f5_2 := 2 * f5
+       f6_2 := 2 * f6
+       f7_2 := 2 * f7
+       f5_38 := 38 * f5 // 1.31*2^30
+       f6_19 := 19 * f6 // 1.31*2^30
+       f7_38 := 38 * f7 // 1.31*2^30
+       f8_19 := 19 * f8 // 1.31*2^30
+       f9_38 := 38 * f9 // 1.31*2^30
+       f0f0 := int64(f0) * int64(f0)
+       f0f1_2 := int64(f0_2) * int64(f1)
+       f0f2_2 := int64(f0_2) * int64(f2)
+       f0f3_2 := int64(f0_2) * int64(f3)
+       f0f4_2 := int64(f0_2) * int64(f4)
+       f0f5_2 := int64(f0_2) * int64(f5)
+       f0f6_2 := int64(f0_2) * int64(f6)
+       f0f7_2 := int64(f0_2) * int64(f7)
+       f0f8_2 := int64(f0_2) * int64(f8)
+       f0f9_2 := int64(f0_2) * int64(f9)
+       f1f1_2 := int64(f1_2) * int64(f1)
+       f1f2_2 := int64(f1_2) * int64(f2)
+       f1f3_4 := int64(f1_2) * int64(f3_2)
+       f1f4_2 := int64(f1_2) * int64(f4)
+       f1f5_4 := int64(f1_2) * int64(f5_2)
+       f1f6_2 := int64(f1_2) * int64(f6)
+       f1f7_4 := int64(f1_2) * int64(f7_2)
+       f1f8_2 := int64(f1_2) * int64(f8)
+       f1f9_76 := int64(f1_2) * int64(f9_38)
+       f2f2 := int64(f2) * int64(f2)
+       f2f3_2 := int64(f2_2) * int64(f3)
+       f2f4_2 := int64(f2_2) * int64(f4)
+       f2f5_2 := int64(f2_2) * int64(f5)
+       f2f6_2 := int64(f2_2) * int64(f6)
+       f2f7_2 := int64(f2_2) * int64(f7)
+       f2f8_38 := int64(f2_2) * int64(f8_19)
+       f2f9_38 := int64(f2) * int64(f9_38)
+       f3f3_2 := int64(f3_2) * int64(f3)
+       f3f4_2 := int64(f3_2) * int64(f4)
+       f3f5_4 := int64(f3_2) * int64(f5_2)
+       f3f6_2 := int64(f3_2) * int64(f6)
+       f3f7_76 := int64(f3_2) * int64(f7_38)
+       f3f8_38 := int64(f3_2) * int64(f8_19)
+       f3f9_76 := int64(f3_2) * int64(f9_38)
+       f4f4 := int64(f4) * int64(f4)
+       f4f5_2 := int64(f4_2) * int64(f5)
+       f4f6_38 := int64(f4_2) * int64(f6_19)
+       f4f7_38 := int64(f4) * int64(f7_38)
+       f4f8_38 := int64(f4_2) * int64(f8_19)
+       f4f9_38 := int64(f4) * int64(f9_38)
+       f5f5_38 := int64(f5) * int64(f5_38)
+       f5f6_38 := int64(f5_2) * int64(f6_19)
+       f5f7_76 := int64(f5_2) * int64(f7_38)
+       f5f8_38 := int64(f5_2) * int64(f8_19)
+       f5f9_76 := int64(f5_2) * int64(f9_38)
+       f6f6_19 := int64(f6) * int64(f6_19)
+       f6f7_38 := int64(f6) * int64(f7_38)
+       f6f8_38 := int64(f6_2) * int64(f8_19)
+       f6f9_38 := int64(f6) * int64(f9_38)
+       f7f7_38 := int64(f7) * int64(f7_38)
+       f7f8_38 := int64(f7_2) * int64(f8_19)
+       f7f9_76 := int64(f7_2) * int64(f9_38)
+       f8f8_19 := int64(f8) * int64(f8_19)
+       f8f9_38 := int64(f8) * int64(f9_38)
+       f9f9_38 := int64(f9) * int64(f9_38)
+       h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38
+       h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38
+       h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19
+       h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38
+       h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38
+       h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38
+       h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19
+       h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38
+       h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38
+       h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2
+       var carry [10]int64
+
+       carry[0] = (h0 + (1 << 25)) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+       carry[4] = (h4 + (1 << 25)) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+
+       carry[1] = (h1 + (1 << 24)) >> 25
+       h2 += carry[1]
+       h1 -= carry[1] << 25
+       carry[5] = (h5 + (1 << 24)) >> 25
+       h6 += carry[5]
+       h5 -= carry[5] << 25
+
+       carry[2] = (h2 + (1 << 25)) >> 26
+       h3 += carry[2]
+       h2 -= carry[2] << 26
+       carry[6] = (h6 + (1 << 25)) >> 26
+       h7 += carry[6]
+       h6 -= carry[6] << 26
+
+       carry[3] = (h3 + (1 << 24)) >> 25
+       h4 += carry[3]
+       h3 -= carry[3] << 25
+       carry[7] = (h7 + (1 << 24)) >> 25
+       h8 += carry[7]
+       h7 -= carry[7] << 25
+
+       carry[4] = (h4 + (1 << 25)) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+       carry[8] = (h8 + (1 << 25)) >> 26
+       h9 += carry[8]
+       h8 -= carry[8] << 26
+
+       carry[9] = (h9 + (1 << 24)) >> 25
+       h0 += carry[9] * 19
+       h9 -= carry[9] << 25
+
+       carry[0] = (h0 + (1 << 25)) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+
+       h[0] = int32(h0)
+       h[1] = int32(h1)
+       h[2] = int32(h2)
+       h[3] = int32(h3)
+       h[4] = int32(h4)
+       h[5] = int32(h5)
+       h[6] = int32(h6)
+       h[7] = int32(h7)
+       h[8] = int32(h8)
+       h[9] = int32(h9)
+}
+
+// feMul121666 calculates h = f * 121666. Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func feMul121666(h, f *fieldElement) {
+       h0 := int64(f[0]) * 121666
+       h1 := int64(f[1]) * 121666
+       h2 := int64(f[2]) * 121666
+       h3 := int64(f[3]) * 121666
+       h4 := int64(f[4]) * 121666
+       h5 := int64(f[5]) * 121666
+       h6 := int64(f[6]) * 121666
+       h7 := int64(f[7]) * 121666
+       h8 := int64(f[8]) * 121666
+       h9 := int64(f[9]) * 121666
+       var carry [10]int64
+
+       carry[9] = (h9 + (1 << 24)) >> 25
+       h0 += carry[9] * 19
+       h9 -= carry[9] << 25
+       carry[1] = (h1 + (1 << 24)) >> 25
+       h2 += carry[1]
+       h1 -= carry[1] << 25
+       carry[3] = (h3 + (1 << 24)) >> 25
+       h4 += carry[3]
+       h3 -= carry[3] << 25
+       carry[5] = (h5 + (1 << 24)) >> 25
+       h6 += carry[5]
+       h5 -= carry[5] << 25
+       carry[7] = (h7 + (1 << 24)) >> 25
+       h8 += carry[7]
+       h7 -= carry[7] << 25
+
+       carry[0] = (h0 + (1 << 25)) >> 26
+       h1 += carry[0]
+       h0 -= carry[0] << 26
+       carry[2] = (h2 + (1 << 25)) >> 26
+       h3 += carry[2]
+       h2 -= carry[2] << 26
+       carry[4] = (h4 + (1 << 25)) >> 26
+       h5 += carry[4]
+       h4 -= carry[4] << 26
+       carry[6] = (h6 + (1 << 25)) >> 26
+       h7 += carry[6]
+       h6 -= carry[6] << 26
+       carry[8] = (h8 + (1 << 25)) >> 26
+       h9 += carry[8]
+       h8 -= carry[8] << 26
+
+       h[0] = int32(h0)
+       h[1] = int32(h1)
+       h[2] = int32(h2)
+       h[3] = int32(h3)
+       h[4] = int32(h4)
+       h[5] = int32(h5)
+       h[6] = int32(h6)
+       h[7] = int32(h7)
+       h[8] = int32(h8)
+       h[9] = int32(h9)
+}
+
+// feInvert sets out = z^-1.
+func feInvert(out, z *fieldElement) {
+       var t0, t1, t2, t3 fieldElement
+       var i int
+
+       feSquare(&t0, z)
+       for i = 1; i < 1; i++ {
+               feSquare(&t0, &t0)
+       }
+       feSquare(&t1, &t0)
+       for i = 1; i < 2; i++ {
+               feSquare(&t1, &t1)
+       }
+       feMul(&t1, z, &t1)
+       feMul(&t0, &t0, &t1)
+       feSquare(&t2, &t0)
+       for i = 1; i < 1; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t1, &t1, &t2)
+       feSquare(&t2, &t1)
+       for i = 1; i < 5; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t1, &t2, &t1)
+       feSquare(&t2, &t1)
+       for i = 1; i < 10; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t2, &t2, &t1)
+       feSquare(&t3, &t2)
+       for i = 1; i < 20; i++ {
+               feSquare(&t3, &t3)
+       }
+       feMul(&t2, &t3, &t2)
+       feSquare(&t2, &t2)
+       for i = 1; i < 10; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t1, &t2, &t1)
+       feSquare(&t2, &t1)
+       for i = 1; i < 50; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t2, &t2, &t1)
+       feSquare(&t3, &t2)
+       for i = 1; i < 100; i++ {
+               feSquare(&t3, &t3)
+       }
+       feMul(&t2, &t3, &t2)
+       feSquare(&t2, &t2)
+       for i = 1; i < 50; i++ {
+               feSquare(&t2, &t2)
+       }
+       feMul(&t1, &t2, &t1)
+       feSquare(&t1, &t1)
+       for i = 1; i < 5; i++ {
+               feSquare(&t1, &t1)
+       }
+       feMul(out, &t1, &t0)
+}
+
+func scalarMult(out, in, base *[32]byte) {
+       var e [32]byte
+
+       copy(e[:], in[:])
+       e[0] &= 248
+       e[31] &= 127
+       e[31] |= 64
+
+       var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement
+       feFromBytes(&x1, base)
+       feOne(&x2)
+       feCopy(&x3, &x1)
+       feOne(&z3)
+
+       swap := int32(0)
+       for pos := 254; pos >= 0; pos-- {
+               b := e[pos/8] >> uint(pos&7)
+               b &= 1
+               swap ^= int32(b)
+               feCSwap(&x2, &x3, swap)
+               feCSwap(&z2, &z3, swap)
+               swap = int32(b)
+
+               feSub(&tmp0, &x3, &z3)
+               feSub(&tmp1, &x2, &z2)
+               feAdd(&x2, &x2, &z2)
+               feAdd(&z2, &x3, &z3)
+               feMul(&z3, &tmp0, &x2)
+               feMul(&z2, &z2, &tmp1)
+               feSquare(&tmp0, &tmp1)
+               feSquare(&tmp1, &x2)
+               feAdd(&x3, &z3, &z2)
+               feSub(&z2, &z3, &z2)
+               feMul(&x2, &tmp1, &tmp0)
+               feSub(&tmp1, &tmp1, &tmp0)
+               feSquare(&z2, &z2)
+               feMul121666(&z3, &tmp1)
+               feSquare(&x3, &x3)
+               feAdd(&tmp0, &tmp0, &z3)
+               feMul(&z3, &x1, &z2)
+               feMul(&z2, &tmp1, &tmp0)
+       }
+
+       feCSwap(&x2, &x3, swap)
+       feCSwap(&z2, &z3, swap)
+
+       feInvert(&z2, &z2)
+       feMul(&x2, &x2, &z2)
+       feToBytes(out, &x2)
+}
diff --git a/libgo/go/golang.org/x/crypto/curve25519/doc.go b/libgo/go/golang.org/x/crypto/curve25519/doc.go
new file mode 100644 (file)
index 0000000..da9b10d
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package curve25519 provides an implementation of scalar multiplication on
+// the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html
+package curve25519 // import "golang.org/x/crypto/curve25519"
+
+// basePoint is the x coordinate of the generator of the curve.
+var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+
+// ScalarMult sets dst to the product in*base where dst and base are the x
+// coordinates of group points and all values are in little-endian form.
+func ScalarMult(dst, in, base *[32]byte) {
+       scalarMult(dst, in, base)
+}
+
+// ScalarBaseMult sets dst to the product in*base where dst and base are the x
+// coordinates of group points, base is the standard generator and all values
+// are in little-endian form.
+func ScalarBaseMult(dst, in *[32]byte) {
+       ScalarMult(dst, in, &basePoint)
+}
diff --git a/libgo/go/golang.org/x/crypto/curve25519/mont25519_amd64.go b/libgo/go/golang.org/x/crypto/curve25519/mont25519_amd64.go
new file mode 100644 (file)
index 0000000..5822bd5
--- /dev/null
@@ -0,0 +1,240 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64,!gccgo,!appengine
+
+package curve25519
+
+// These functions are implemented in the .s files. The names of the functions
+// in the rest of the file are also taken from the SUPERCOP sources to help
+// people following along.
+
+//go:noescape
+
+func cswap(inout *[5]uint64, v uint64)
+
+//go:noescape
+
+func ladderstep(inout *[5][5]uint64)
+
+//go:noescape
+
+func freeze(inout *[5]uint64)
+
+//go:noescape
+
+func mul(dest, a, b *[5]uint64)
+
+//go:noescape
+
+func square(out, in *[5]uint64)
+
+// mladder uses a Montgomery ladder to calculate (xr/zr) *= s.
+func mladder(xr, zr *[5]uint64, s *[32]byte) {
+       var work [5][5]uint64
+
+       work[0] = *xr
+       setint(&work[1], 1)
+       setint(&work[2], 0)
+       work[3] = *xr
+       setint(&work[4], 1)
+
+       j := uint(6)
+       var prevbit byte
+
+       for i := 31; i >= 0; i-- {
+               for j < 8 {
+                       bit := ((*s)[i] >> j) & 1
+                       swap := bit ^ prevbit
+                       prevbit = bit
+                       cswap(&work[1], uint64(swap))
+                       ladderstep(&work)
+                       j--
+               }
+               j = 7
+       }
+
+       *xr = work[1]
+       *zr = work[2]
+}
+
+func scalarMult(out, in, base *[32]byte) {
+       var e [32]byte
+       copy(e[:], (*in)[:])
+       e[0] &= 248
+       e[31] &= 127
+       e[31] |= 64
+
+       var t, z [5]uint64
+       unpack(&t, base)
+       mladder(&t, &z, &e)
+       invert(&z, &z)
+       mul(&t, &t, &z)
+       pack(out, &t)
+}
+
+func setint(r *[5]uint64, v uint64) {
+       r[0] = v
+       r[1] = 0
+       r[2] = 0
+       r[3] = 0
+       r[4] = 0
+}
+
+// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian
+// order.
+func unpack(r *[5]uint64, x *[32]byte) {
+       r[0] = uint64(x[0]) |
+               uint64(x[1])<<8 |
+               uint64(x[2])<<16 |
+               uint64(x[3])<<24 |
+               uint64(x[4])<<32 |
+               uint64(x[5])<<40 |
+               uint64(x[6]&7)<<48
+
+       r[1] = uint64(x[6])>>3 |
+               uint64(x[7])<<5 |
+               uint64(x[8])<<13 |
+               uint64(x[9])<<21 |
+               uint64(x[10])<<29 |
+               uint64(x[11])<<37 |
+               uint64(x[12]&63)<<45
+
+       r[2] = uint64(x[12])>>6 |
+               uint64(x[13])<<2 |
+               uint64(x[14])<<10 |
+               uint64(x[15])<<18 |
+               uint64(x[16])<<26 |
+               uint64(x[17])<<34 |
+               uint64(x[18])<<42 |
+               uint64(x[19]&1)<<50
+
+       r[3] = uint64(x[19])>>1 |
+               uint64(x[20])<<7 |
+               uint64(x[21])<<15 |
+               uint64(x[22])<<23 |
+               uint64(x[23])<<31 |
+               uint64(x[24])<<39 |
+               uint64(x[25]&15)<<47
+
+       r[4] = uint64(x[25])>>4 |
+               uint64(x[26])<<4 |
+               uint64(x[27])<<12 |
+               uint64(x[28])<<20 |
+               uint64(x[29])<<28 |
+               uint64(x[30])<<36 |
+               uint64(x[31]&127)<<44
+}
+
+// pack sets out = x where out is the usual, little-endian form of the 5,
+// 51-bit limbs in x.
+func pack(out *[32]byte, x *[5]uint64) {
+       t := *x
+       freeze(&t)
+
+       out[0] = byte(t[0])
+       out[1] = byte(t[0] >> 8)
+       out[2] = byte(t[0] >> 16)
+       out[3] = byte(t[0] >> 24)
+       out[4] = byte(t[0] >> 32)
+       out[5] = byte(t[0] >> 40)
+       out[6] = byte(t[0] >> 48)
+
+       out[6] ^= byte(t[1]<<3) & 0xf8
+       out[7] = byte(t[1] >> 5)
+       out[8] = byte(t[1] >> 13)
+       out[9] = byte(t[1] >> 21)
+       out[10] = byte(t[1] >> 29)
+       out[11] = byte(t[1] >> 37)
+       out[12] = byte(t[1] >> 45)
+
+       out[12] ^= byte(t[2]<<6) & 0xc0
+       out[13] = byte(t[2] >> 2)
+       out[14] = byte(t[2] >> 10)
+       out[15] = byte(t[2] >> 18)
+       out[16] = byte(t[2] >> 26)
+       out[17] = byte(t[2] >> 34)
+       out[18] = byte(t[2] >> 42)
+       out[19] = byte(t[2] >> 50)
+
+       out[19] ^= byte(t[3]<<1) & 0xfe
+       out[20] = byte(t[3] >> 7)
+       out[21] = byte(t[3] >> 15)
+       out[22] = byte(t[3] >> 23)
+       out[23] = byte(t[3] >> 31)
+       out[24] = byte(t[3] >> 39)
+       out[25] = byte(t[3] >> 47)
+
+       out[25] ^= byte(t[4]<<4) & 0xf0
+       out[26] = byte(t[4] >> 4)
+       out[27] = byte(t[4] >> 12)
+       out[28] = byte(t[4] >> 20)
+       out[29] = byte(t[4] >> 28)
+       out[30] = byte(t[4] >> 36)
+       out[31] = byte(t[4] >> 44)
+}
+
+// invert calculates r = x^-1 mod p using Fermat's little theorem.
+func invert(r *[5]uint64, x *[5]uint64) {
+       var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64
+
+       square(&z2, x)        /* 2 */
+       square(&t, &z2)       /* 4 */
+       square(&t, &t)        /* 8 */
+       mul(&z9, &t, x)       /* 9 */
+       mul(&z11, &z9, &z2)   /* 11 */
+       square(&t, &z11)      /* 22 */
+       mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */
+
+       square(&t, &z2_5_0)      /* 2^6 - 2^1 */
+       for i := 1; i < 5; i++ { /* 2^20 - 2^10 */
+               square(&t, &t)
+       }
+       mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */
+
+       square(&t, &z2_10_0)      /* 2^11 - 2^1 */
+       for i := 1; i < 10; i++ { /* 2^20 - 2^10 */
+               square(&t, &t)
+       }
+       mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */
+
+       square(&t, &z2_20_0)      /* 2^21 - 2^1 */
+       for i := 1; i < 20; i++ { /* 2^40 - 2^20 */
+               square(&t, &t)
+       }
+       mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */
+
+       square(&t, &t)            /* 2^41 - 2^1 */
+       for i := 1; i < 10; i++ { /* 2^50 - 2^10 */
+               square(&t, &t)
+       }
+       mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */
+
+       square(&t, &z2_50_0)      /* 2^51 - 2^1 */
+       for i := 1; i < 50; i++ { /* 2^100 - 2^50 */
+               square(&t, &t)
+       }
+       mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */
+
+       square(&t, &z2_100_0)      /* 2^101 - 2^1 */
+       for i := 1; i < 100; i++ { /* 2^200 - 2^100 */
+               square(&t, &t)
+       }
+       mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */
+
+       square(&t, &t)            /* 2^201 - 2^1 */
+       for i := 1; i < 50; i++ { /* 2^250 - 2^50 */
+               square(&t, &t)
+       }
+       mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */
+
+       square(&t, &t) /* 2^251 - 2^1 */
+       square(&t, &t) /* 2^252 - 2^2 */
+       square(&t, &t) /* 2^253 - 2^3 */
+
+       square(&t, &t) /* 2^254 - 2^4 */
+
+       square(&t, &t)   /* 2^255 - 2^5 */
+       mul(r, &t, &z11) /* 2^255 - 21 */
+}
diff --git a/libgo/go/golang.org/x/crypto/hkdf/hkdf.go b/libgo/go/golang.org/x/crypto/hkdf/hkdf.go
new file mode 100644 (file)
index 0000000..dda3f14
--- /dev/null
@@ -0,0 +1,93 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package hkdf implements the HMAC-based Extract-and-Expand Key Derivation
+// Function (HKDF) as defined in RFC 5869.
+//
+// HKDF is a cryptographic key derivation function (KDF) with the goal of
+// expanding limited input keying material into one or more cryptographically
+// strong secret keys.
+package hkdf // import "golang.org/x/crypto/hkdf"
+
+import (
+       "crypto/hmac"
+       "errors"
+       "hash"
+       "io"
+)
+
+// Extract generates a pseudorandom key for use with Expand from an input secret
+// and an optional independent salt.
+//
+// Only use this function if you need to reuse the extracted key with multiple
+// Expand invocations and different context values. Most common scenarios,
+// including the generation of multiple keys, should use New instead.
+func Extract(hash func() hash.Hash, secret, salt []byte) []byte {
+       if salt == nil {
+               salt = make([]byte, hash().Size())
+       }
+       extractor := hmac.New(hash, salt)
+       extractor.Write(secret)
+       return extractor.Sum(nil)
+}
+
+type hkdf struct {
+       expander hash.Hash
+       size     int
+
+       info    []byte
+       counter byte
+
+       prev []byte
+       buf  []byte
+}
+
+func (f *hkdf) Read(p []byte) (int, error) {
+       // Check whether enough data can be generated
+       need := len(p)
+       remains := len(f.buf) + int(255-f.counter+1)*f.size
+       if remains < need {
+               return 0, errors.New("hkdf: entropy limit reached")
+       }
+       // Read any leftover from the buffer
+       n := copy(p, f.buf)
+       p = p[n:]
+
+       // Fill the rest of the buffer
+       for len(p) > 0 {
+               f.expander.Reset()
+               f.expander.Write(f.prev)
+               f.expander.Write(f.info)
+               f.expander.Write([]byte{f.counter})
+               f.prev = f.expander.Sum(f.prev[:0])
+               f.counter++
+
+               // Copy the new batch into p
+               f.buf = f.prev
+               n = copy(p, f.buf)
+               p = p[n:]
+       }
+       // Save leftovers for next run
+       f.buf = f.buf[n:]
+
+       return need, nil
+}
+
+// Expand returns a Reader, from which keys can be read, using the given
+// pseudorandom key and optional context info, skipping the extraction step.
+//
+// The pseudorandomKey should have been generated by Extract, or be a uniformly
+// random or pseudorandom cryptographically strong key. See RFC 5869, Section
+// 3.3. Most common scenarios will want to use New instead.
+func Expand(hash func() hash.Hash, pseudorandomKey, info []byte) io.Reader {
+       expander := hmac.New(hash, pseudorandomKey)
+       return &hkdf{expander, expander.Size(), info, 1, nil, nil}
+}
+
+// New returns a Reader, from which keys can be read, using the given hash,
+// secret, salt and context info. Salt and info can be nil.
+func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader {
+       prk := Extract(hash, secret, salt)
+       return Expand(hash, prk, info)
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_arm64.go b/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_arm64.go
new file mode 100644 (file)
index 0000000..ad74e23
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.11
+// +build !gccgo
+
+package chacha20
+
+const (
+       haveAsm = true
+       bufSize = 256
+)
+
+//go:noescape
+func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32)
+
+func (c *Cipher) xorKeyStreamAsm(dst, src []byte) {
+
+       if len(src) >= bufSize {
+               xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter)
+       }
+
+       if len(src)%bufSize != 0 {
+               i := len(src) - len(src)%bufSize
+               c.buf = [bufSize]byte{}
+               copy(c.buf[:], src[i:])
+               xorKeyStreamVX(c.buf[:], c.buf[:], &c.key, &c.nonce, &c.counter)
+               c.len = bufSize - copy(dst[i:], c.buf[:len(src)%bufSize])
+       }
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_generic.go b/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_generic.go
new file mode 100644 (file)
index 0000000..6570847
--- /dev/null
@@ -0,0 +1,264 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package ChaCha20 implements the core ChaCha20 function as specified
+// in https://tools.ietf.org/html/rfc7539#section-2.3.
+package chacha20
+
+import (
+       "crypto/cipher"
+       "encoding/binary"
+
+       "golang.org/x/crypto/internal/subtle"
+)
+
+// assert that *Cipher implements cipher.Stream
+var _ cipher.Stream = (*Cipher)(nil)
+
+// Cipher is a stateful instance of ChaCha20 using a particular key
+// and nonce. A *Cipher implements the cipher.Stream interface.
+type Cipher struct {
+       key     [8]uint32
+       counter uint32 // incremented after each block
+       nonce   [3]uint32
+       buf     [bufSize]byte // buffer for unused keystream bytes
+       len     int           // number of unused keystream bytes at end of buf
+}
+
+// New creates a new ChaCha20 stream cipher with the given key and nonce.
+// The initial counter value is set to 0.
+func New(key [8]uint32, nonce [3]uint32) *Cipher {
+       return &Cipher{key: key, nonce: nonce}
+}
+
+// ChaCha20 constants spelling "expand 32-byte k"
+const (
+       j0 uint32 = 0x61707865
+       j1 uint32 = 0x3320646e
+       j2 uint32 = 0x79622d32
+       j3 uint32 = 0x6b206574
+)
+
+func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) {
+       a += b
+       d ^= a
+       d = (d << 16) | (d >> 16)
+       c += d
+       b ^= c
+       b = (b << 12) | (b >> 20)
+       a += b
+       d ^= a
+       d = (d << 8) | (d >> 24)
+       c += d
+       b ^= c
+       b = (b << 7) | (b >> 25)
+       return a, b, c, d
+}
+
+// XORKeyStream XORs each byte in the given slice with a byte from the
+// cipher's key stream. Dst and src must overlap entirely or not at all.
+//
+// If len(dst) < len(src), XORKeyStream will panic. It is acceptable
+// to pass a dst bigger than src, and in that case, XORKeyStream will
+// only update dst[:len(src)] and will not touch the rest of dst.
+//
+// Multiple calls to XORKeyStream behave as if the concatenation of
+// the src buffers was passed in a single run. That is, Cipher
+// maintains state and does not reset at each XORKeyStream call.
+func (s *Cipher) XORKeyStream(dst, src []byte) {
+       if len(dst) < len(src) {
+               panic("chacha20: output smaller than input")
+       }
+       if subtle.InexactOverlap(dst[:len(src)], src) {
+               panic("chacha20: invalid buffer overlap")
+       }
+
+       // xor src with buffered keystream first
+       if s.len != 0 {
+               buf := s.buf[len(s.buf)-s.len:]
+               if len(src) < len(buf) {
+                       buf = buf[:len(src)]
+               }
+               td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint
+               for i, b := range buf {
+                       td[i] = ts[i] ^ b
+               }
+               s.len -= len(buf)
+               if s.len != 0 {
+                       return
+               }
+               s.buf = [len(s.buf)]byte{} // zero the empty buffer
+               src = src[len(buf):]
+               dst = dst[len(buf):]
+       }
+
+       if len(src) == 0 {
+               return
+       }
+       if haveAsm {
+               if uint64(len(src))+uint64(s.counter)*64 > (1<<38)-64 {
+                       panic("chacha20: counter overflow")
+               }
+               s.xorKeyStreamAsm(dst, src)
+               return
+       }
+
+       // set up a 64-byte buffer to pad out the final block if needed
+       // (hoisted out of the main loop to avoid spills)
+       rem := len(src) % 64  // length of final block
+       fin := len(src) - rem // index of final block
+       if rem > 0 {
+               copy(s.buf[len(s.buf)-64:], src[fin:])
+       }
+
+       // pre-calculate most of the first round
+       s1, s5, s9, s13 := quarterRound(j1, s.key[1], s.key[5], s.nonce[0])
+       s2, s6, s10, s14 := quarterRound(j2, s.key[2], s.key[6], s.nonce[1])
+       s3, s7, s11, s15 := quarterRound(j3, s.key[3], s.key[7], s.nonce[2])
+
+       n := len(src)
+       src, dst = src[:n:n], dst[:n:n] // BCE hint
+       for i := 0; i < n; i += 64 {
+               // calculate the remainder of the first round
+               s0, s4, s8, s12 := quarterRound(j0, s.key[0], s.key[4], s.counter)
+
+               // execute the second round
+               x0, x5, x10, x15 := quarterRound(s0, s5, s10, s15)
+               x1, x6, x11, x12 := quarterRound(s1, s6, s11, s12)
+               x2, x7, x8, x13 := quarterRound(s2, s7, s8, s13)
+               x3, x4, x9, x14 := quarterRound(s3, s4, s9, s14)
+
+               // execute the remaining 18 rounds
+               for i := 0; i < 9; i++ {
+                       x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12)
+                       x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13)
+                       x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14)
+                       x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15)
+
+                       x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15)
+                       x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12)
+                       x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13)
+                       x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14)
+               }
+
+               x0 += j0
+               x1 += j1
+               x2 += j2
+               x3 += j3
+
+               x4 += s.key[0]
+               x5 += s.key[1]
+               x6 += s.key[2]
+               x7 += s.key[3]
+               x8 += s.key[4]
+               x9 += s.key[5]
+               x10 += s.key[6]
+               x11 += s.key[7]
+
+               x12 += s.counter
+               x13 += s.nonce[0]
+               x14 += s.nonce[1]
+               x15 += s.nonce[2]
+
+               // increment the counter
+               s.counter += 1
+               if s.counter == 0 {
+                       panic("chacha20: counter overflow")
+               }
+
+               // pad to 64 bytes if needed
+               in, out := src[i:], dst[i:]
+               if i == fin {
+                       // src[fin:] has already been copied into s.buf before
+                       // the main loop
+                       in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:]
+               }
+               in, out = in[:64], out[:64] // BCE hint
+
+               // XOR the key stream with the source and write out the result
+               xor(out[0:], in[0:], x0)
+               xor(out[4:], in[4:], x1)
+               xor(out[8:], in[8:], x2)
+               xor(out[12:], in[12:], x3)
+               xor(out[16:], in[16:], x4)
+               xor(out[20:], in[20:], x5)
+               xor(out[24:], in[24:], x6)
+               xor(out[28:], in[28:], x7)
+               xor(out[32:], in[32:], x8)
+               xor(out[36:], in[36:], x9)
+               xor(out[40:], in[40:], x10)
+               xor(out[44:], in[44:], x11)
+               xor(out[48:], in[48:], x12)
+               xor(out[52:], in[52:], x13)
+               xor(out[56:], in[56:], x14)
+               xor(out[60:], in[60:], x15)
+       }
+       // copy any trailing bytes out of the buffer and into dst
+       if rem != 0 {
+               s.len = 64 - rem
+               copy(dst[fin:], s.buf[len(s.buf)-64:])
+       }
+}
+
+// Advance discards bytes in the key stream until the next 64 byte block
+// boundary is reached and updates the counter accordingly. If the key
+// stream is already at a block boundary no bytes will be discarded and
+// the counter will be unchanged.
+func (s *Cipher) Advance() {
+       s.len -= s.len % 64
+       if s.len == 0 {
+               s.buf = [len(s.buf)]byte{}
+       }
+}
+
+// XORKeyStream crypts bytes from in to out using the given key and counters.
+// In and out must overlap entirely or not at all. Counter contains the raw
+// ChaCha20 counter bytes (i.e. block counter followed by nonce).
+func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) {
+       s := Cipher{
+               key: [8]uint32{
+                       binary.LittleEndian.Uint32(key[0:4]),
+                       binary.LittleEndian.Uint32(key[4:8]),
+                       binary.LittleEndian.Uint32(key[8:12]),
+                       binary.LittleEndian.Uint32(key[12:16]),
+                       binary.LittleEndian.Uint32(key[16:20]),
+                       binary.LittleEndian.Uint32(key[20:24]),
+                       binary.LittleEndian.Uint32(key[24:28]),
+                       binary.LittleEndian.Uint32(key[28:32]),
+               },
+               nonce: [3]uint32{
+                       binary.LittleEndian.Uint32(counter[4:8]),
+                       binary.LittleEndian.Uint32(counter[8:12]),
+                       binary.LittleEndian.Uint32(counter[12:16]),
+               },
+               counter: binary.LittleEndian.Uint32(counter[0:4]),
+       }
+       s.XORKeyStream(out, in)
+}
+
+// HChaCha20 uses the ChaCha20 core to generate a derived key from a key and a
+// nonce. It should only be used as part of the XChaCha20 construction.
+func HChaCha20(key *[8]uint32, nonce *[4]uint32) [8]uint32 {
+       x0, x1, x2, x3 := j0, j1, j2, j3
+       x4, x5, x6, x7 := key[0], key[1], key[2], key[3]
+       x8, x9, x10, x11 := key[4], key[5], key[6], key[7]
+       x12, x13, x14, x15 := nonce[0], nonce[1], nonce[2], nonce[3]
+
+       for i := 0; i < 10; i++ {
+               x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12)
+               x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13)
+               x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14)
+               x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15)
+
+               x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15)
+               x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12)
+               x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13)
+               x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14)
+       }
+
+       var out [8]uint32
+       out[0], out[1], out[2], out[3] = x0, x1, x2, x3
+       out[4], out[5], out[6], out[7] = x12, x13, x14, x15
+       return out
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_noasm.go
new file mode 100644 (file)
index 0000000..bf8beba
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !ppc64le,!arm64,!s390x arm64,!go1.11 gccgo appengine
+
+package chacha20
+
+const (
+       bufSize = 64
+       haveAsm = false
+)
+
+func (*Cipher) xorKeyStreamAsm(dst, src []byte) {
+       panic("not implemented")
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go b/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go
new file mode 100644 (file)
index 0000000..638cb5e
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ppc64le,!gccgo,!appengine
+
+package chacha20
+
+import "encoding/binary"
+
+const (
+       bufSize = 256
+       haveAsm = true
+)
+
+//go:noescape
+func chaCha20_ctr32_vmx(out, inp *byte, len int, key *[8]uint32, counter *uint32)
+
+func (c *Cipher) xorKeyStreamAsm(dst, src []byte) {
+       if len(src) >= bufSize {
+               chaCha20_ctr32_vmx(&dst[0], &src[0], len(src)-len(src)%bufSize, &c.key, &c.counter)
+       }
+       if len(src)%bufSize != 0 {
+               chaCha20_ctr32_vmx(&c.buf[0], &c.buf[0], bufSize, &c.key, &c.counter)
+               start := len(src) - len(src)%bufSize
+               ts, td, tb := src[start:], dst[start:], c.buf[:]
+               // Unroll loop to XOR 32 bytes per iteration.
+               for i := 0; i < len(ts)-32; i += 32 {
+                       td, tb = td[:len(ts)], tb[:len(ts)] // bounds check elimination
+                       s0 := binary.LittleEndian.Uint64(ts[0:8])
+                       s1 := binary.LittleEndian.Uint64(ts[8:16])
+                       s2 := binary.LittleEndian.Uint64(ts[16:24])
+                       s3 := binary.LittleEndian.Uint64(ts[24:32])
+                       b0 := binary.LittleEndian.Uint64(tb[0:8])
+                       b1 := binary.LittleEndian.Uint64(tb[8:16])
+                       b2 := binary.LittleEndian.Uint64(tb[16:24])
+                       b3 := binary.LittleEndian.Uint64(tb[24:32])
+                       binary.LittleEndian.PutUint64(td[0:8], s0^b0)
+                       binary.LittleEndian.PutUint64(td[8:16], s1^b1)
+                       binary.LittleEndian.PutUint64(td[16:24], s2^b2)
+                       binary.LittleEndian.PutUint64(td[24:32], s3^b3)
+                       ts, td, tb = ts[32:], td[32:], tb[32:]
+               }
+               td, tb = td[:len(ts)], tb[:len(ts)] // bounds check elimination
+               for i, v := range ts {
+                       td[i] = tb[i] ^ v
+               }
+               c.len = bufSize - (len(src) % bufSize)
+
+       }
+
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_s390x.go b/libgo/go/golang.org/x/crypto/internal/chacha20/chacha_s390x.go
new file mode 100644 (file)
index 0000000..aad645b
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,!gccgo,!appengine
+
+package chacha20
+
+import (
+       "golang.org/x/sys/cpu"
+)
+
+var haveAsm = cpu.S390X.HasVX
+
+const bufSize = 256
+
+// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only
+// be called when the vector facility is available.
+// Implementation in asm_s390x.s.
+//go:noescape
+func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int)
+
+func (c *Cipher) xorKeyStreamAsm(dst, src []byte) {
+       xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len)
+}
+
+// EXRL targets, DO NOT CALL!
+func mvcSrcToBuf()
+func mvcBufToDst()
diff --git a/libgo/go/golang.org/x/crypto/internal/chacha20/xor.go b/libgo/go/golang.org/x/crypto/internal/chacha20/xor.go
new file mode 100644 (file)
index 0000000..9c5ba0b
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found src the LICENSE file.
+
+package chacha20
+
+import (
+       "runtime"
+)
+
+// Platforms that have fast unaligned 32-bit little endian accesses.
+const unaligned = runtime.GOARCH == "386" ||
+       runtime.GOARCH == "amd64" ||
+       runtime.GOARCH == "arm64" ||
+       runtime.GOARCH == "ppc64le" ||
+       runtime.GOARCH == "s390x"
+
+// xor reads a little endian uint32 from src, XORs it with u and
+// places the result in little endian byte order in dst.
+func xor(dst, src []byte, u uint32) {
+       _, _ = src[3], dst[3] // eliminate bounds checks
+       if unaligned {
+               // The compiler should optimize this code into
+               // 32-bit unaligned little endian loads and stores.
+               // TODO: delete once the compiler does a reliably
+               // good job with the generic code below.
+               // See issue #25111 for more details.
+               v := uint32(src[0])
+               v |= uint32(src[1]) << 8
+               v |= uint32(src[2]) << 16
+               v |= uint32(src[3]) << 24
+               v ^= u
+               dst[0] = byte(v)
+               dst[1] = byte(v >> 8)
+               dst[2] = byte(v >> 16)
+               dst[3] = byte(v >> 24)
+       } else {
+               dst[0] = src[0] ^ byte(u)
+               dst[1] = src[1] ^ byte(u>>8)
+               dst[2] = src[2] ^ byte(u>>16)
+               dst[3] = src[3] ^ byte(u>>24)
+       }
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/subtle/aliasing.go b/libgo/go/golang.org/x/crypto/internal/subtle/aliasing.go
new file mode 100644 (file)
index 0000000..f38797b
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !appengine
+
+// Package subtle implements functions that are often useful in cryptographic
+// code but require careful thought to use correctly.
+package subtle // import "golang.org/x/crypto/internal/subtle"
+
+import "unsafe"
+
+// AnyOverlap reports whether x and y share memory at any (not necessarily
+// corresponding) index. The memory beyond the slice length is ignored.
+func AnyOverlap(x, y []byte) bool {
+       return len(x) > 0 && len(y) > 0 &&
+               uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) &&
+               uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1]))
+}
+
+// InexactOverlap reports whether x and y share memory at any non-corresponding
+// index. The memory beyond the slice length is ignored. Note that x and y can
+// have different lengths and still not have any inexact overlap.
+//
+// InexactOverlap can be used to implement the requirements of the crypto/cipher
+// AEAD, Block, BlockMode and Stream interfaces.
+func InexactOverlap(x, y []byte) bool {
+       if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] {
+               return false
+       }
+       return AnyOverlap(x, y)
+}
diff --git a/libgo/go/golang.org/x/crypto/internal/subtle/aliasing_appengine.go b/libgo/go/golang.org/x/crypto/internal/subtle/aliasing_appengine.go
new file mode 100644 (file)
index 0000000..0cc4a8a
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build appengine
+
+// Package subtle implements functions that are often useful in cryptographic
+// code but require careful thought to use correctly.
+package subtle // import "golang.org/x/crypto/internal/subtle"
+
+// This is the Google App Engine standard variant based on reflect
+// because the unsafe package and cgo are disallowed.
+
+import "reflect"
+
+// AnyOverlap reports whether x and y share memory at any (not necessarily
+// corresponding) index. The memory beyond the slice length is ignored.
+func AnyOverlap(x, y []byte) bool {
+       return len(x) > 0 && len(y) > 0 &&
+               reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() &&
+               reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer()
+}
+
+// InexactOverlap reports whether x and y share memory at any non-corresponding
+// index. The memory beyond the slice length is ignored. Note that x and y can
+// have different lengths and still not have any inexact overlap.
+//
+// InexactOverlap can be used to implement the requirements of the crypto/cipher
+// AEAD, Block, BlockMode and Stream interfaces.
+func InexactOverlap(x, y []byte) bool {
+       if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] {
+               return false
+       }
+       return AnyOverlap(x, y)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/mac_noasm.go b/libgo/go/golang.org/x/crypto/poly1305/mac_noasm.go
new file mode 100644 (file)
index 0000000..a8dd589
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !amd64,!ppc64le gccgo appengine
+
+package poly1305
+
+type mac struct{ macGeneric }
+
+func newMAC(key *[32]byte) mac { return mac{newMACGeneric(key)} }
diff --git a/libgo/go/golang.org/x/crypto/poly1305/poly1305.go b/libgo/go/golang.org/x/crypto/poly1305/poly1305.go
new file mode 100644 (file)
index 0000000..d076a56
--- /dev/null
@@ -0,0 +1,83 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package poly1305 implements Poly1305 one-time message authentication code as
+// specified in https://cr.yp.to/mac/poly1305-20050329.pdf.
+//
+// Poly1305 is a fast, one-time authentication function. It is infeasible for an
+// attacker to generate an authenticator for a message without the key. However, a
+// key must only be used for a single message. Authenticating two different
+// messages with the same key allows an attacker to forge authenticators for other
+// messages with the same key.
+//
+// Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was
+// used with a fixed key in order to generate one-time keys from an nonce.
+// However, in this package AES isn't used and the one-time key is specified
+// directly.
+package poly1305 // import "golang.org/x/crypto/poly1305"
+
+import "crypto/subtle"
+
+// TagSize is the size, in bytes, of a poly1305 authenticator.
+const TagSize = 16
+
+// Verify returns true if mac is a valid authenticator for m with the given
+// key.
+func Verify(mac *[16]byte, m []byte, key *[32]byte) bool {
+       var tmp [16]byte
+       Sum(&tmp, m, key)
+       return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1
+}
+
+// New returns a new MAC computing an authentication
+// tag of all data written to it with the given key.
+// This allows writing the message progressively instead
+// of passing it as a single slice. Common users should use
+// the Sum function instead.
+//
+// The key must be unique for each message, as authenticating
+// two different messages with the same key allows an attacker
+// to forge messages at will.
+func New(key *[32]byte) *MAC {
+       return &MAC{
+               mac:       newMAC(key),
+               finalized: false,
+       }
+}
+
+// MAC is an io.Writer computing an authentication tag
+// of the data written to it.
+//
+// MAC cannot be used like common hash.Hash implementations,
+// because using a poly1305 key twice breaks its security.
+// Therefore writing data to a running MAC after calling
+// Sum causes it to panic.
+type MAC struct {
+       mac // platform-dependent implementation
+
+       finalized bool
+}
+
+// Size returns the number of bytes Sum will return.
+func (h *MAC) Size() int { return TagSize }
+
+// Write adds more data to the running message authentication code.
+// It never returns an error.
+//
+// It must not be called after the first call of Sum.
+func (h *MAC) Write(p []byte) (n int, err error) {
+       if h.finalized {
+               panic("poly1305: write to MAC after Sum")
+       }
+       return h.mac.Write(p)
+}
+
+// Sum computes the authenticator of all data written to the
+// message authentication code.
+func (h *MAC) Sum(b []byte) []byte {
+       var mac [TagSize]byte
+       h.mac.Sum(&mac)
+       h.finalized = true
+       return append(b, mac[:]...)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_amd64.go b/libgo/go/golang.org/x/crypto/poly1305/sum_amd64.go
new file mode 100644 (file)
index 0000000..2dbf42a
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64,!gccgo,!appengine
+
+package poly1305
+
+//go:noescape
+func initialize(state *[7]uint64, key *[32]byte)
+
+//go:noescape
+func update(state *[7]uint64, msg []byte)
+
+//go:noescape
+func finalize(tag *[TagSize]byte, state *[7]uint64)
+
+// Sum generates an authenticator for m using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[16]byte, m []byte, key *[32]byte) {
+       h := newMAC(key)
+       h.Write(m)
+       h.Sum(out)
+}
+
+func newMAC(key *[32]byte) (h mac) {
+       initialize(&h.state, key)
+       return
+}
+
+type mac struct {
+       state [7]uint64 // := uint64{ h0, h1, h2, r0, r1, pad0, pad1 }
+
+       buffer [TagSize]byte
+       offset int
+}
+
+func (h *mac) Write(p []byte) (n int, err error) {
+       n = len(p)
+       if h.offset > 0 {
+               remaining := TagSize - h.offset
+               if n < remaining {
+                       h.offset += copy(h.buffer[h.offset:], p)
+                       return n, nil
+               }
+               copy(h.buffer[h.offset:], p[:remaining])
+               p = p[remaining:]
+               h.offset = 0
+               update(&h.state, h.buffer[:])
+       }
+       if nn := len(p) - (len(p) % TagSize); nn > 0 {
+               update(&h.state, p[:nn])
+               p = p[nn:]
+       }
+       if len(p) > 0 {
+               h.offset += copy(h.buffer[h.offset:], p)
+       }
+       return n, nil
+}
+
+func (h *mac) Sum(out *[16]byte) {
+       state := h.state
+       if h.offset > 0 {
+               update(&state, h.buffer[:h.offset])
+       }
+       finalize(out, &state)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_arm.go b/libgo/go/golang.org/x/crypto/poly1305/sum_arm.go
new file mode 100644 (file)
index 0000000..5dc321c
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm,!gccgo,!appengine,!nacl
+
+package poly1305
+
+// This function is implemented in sum_arm.s
+//go:noescape
+func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte)
+
+// Sum generates an authenticator for m using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[16]byte, m []byte, key *[32]byte) {
+       var mPtr *byte
+       if len(m) > 0 {
+               mPtr = &m[0]
+       }
+       poly1305_auth_armv6(out, mPtr, uint32(len(m)), key)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_generic.go b/libgo/go/golang.org/x/crypto/poly1305/sum_generic.go
new file mode 100644 (file)
index 0000000..bab76ef
--- /dev/null
@@ -0,0 +1,172 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poly1305
+
+import "encoding/binary"
+
+const (
+       msgBlock   = uint32(1 << 24)
+       finalBlock = uint32(0)
+)
+
+// sumGeneric generates an authenticator for msg using a one-time key and
+// puts the 16-byte result into out. This is the generic implementation of
+// Sum and should be called if no assembly implementation is available.
+func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) {
+       h := newMACGeneric(key)
+       h.Write(msg)
+       h.Sum(out)
+}
+
+func newMACGeneric(key *[32]byte) (h macGeneric) {
+       h.r[0] = binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff
+       h.r[1] = (binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03
+       h.r[2] = (binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff
+       h.r[3] = (binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff
+       h.r[4] = (binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff
+
+       h.s[0] = binary.LittleEndian.Uint32(key[16:])
+       h.s[1] = binary.LittleEndian.Uint32(key[20:])
+       h.s[2] = binary.LittleEndian.Uint32(key[24:])
+       h.s[3] = binary.LittleEndian.Uint32(key[28:])
+       return
+}
+
+type macGeneric struct {
+       h, r [5]uint32
+       s    [4]uint32
+
+       buffer [TagSize]byte
+       offset int
+}
+
+func (h *macGeneric) Write(p []byte) (n int, err error) {
+       n = len(p)
+       if h.offset > 0 {
+               remaining := TagSize - h.offset
+               if n < remaining {
+                       h.offset += copy(h.buffer[h.offset:], p)
+                       return n, nil
+               }
+               copy(h.buffer[h.offset:], p[:remaining])
+               p = p[remaining:]
+               h.offset = 0
+               updateGeneric(h.buffer[:], msgBlock, &(h.h), &(h.r))
+       }
+       if nn := len(p) - (len(p) % TagSize); nn > 0 {
+               updateGeneric(p, msgBlock, &(h.h), &(h.r))
+               p = p[nn:]
+       }
+       if len(p) > 0 {
+               h.offset += copy(h.buffer[h.offset:], p)
+       }
+       return n, nil
+}
+
+func (h *macGeneric) Sum(out *[16]byte) {
+       H, R := h.h, h.r
+       if h.offset > 0 {
+               var buffer [TagSize]byte
+               copy(buffer[:], h.buffer[:h.offset])
+               buffer[h.offset] = 1 // invariant: h.offset < TagSize
+               updateGeneric(buffer[:], finalBlock, &H, &R)
+       }
+       finalizeGeneric(out, &H, &(h.s))
+}
+
+func updateGeneric(msg []byte, flag uint32, h, r *[5]uint32) {
+       h0, h1, h2, h3, h4 := h[0], h[1], h[2], h[3], h[4]
+       r0, r1, r2, r3, r4 := uint64(r[0]), uint64(r[1]), uint64(r[2]), uint64(r[3]), uint64(r[4])
+       R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5
+
+       for len(msg) >= TagSize {
+               // h += msg
+               h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff
+               h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff
+               h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff
+               h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff
+               h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | flag
+
+               // h *= r
+               d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1)
+               d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2)
+               d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3)
+               d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4)
+               d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0)
+
+               // h %= p
+               h0 = uint32(d0) & 0x3ffffff
+               h1 = uint32(d1) & 0x3ffffff
+               h2 = uint32(d2) & 0x3ffffff
+               h3 = uint32(d3) & 0x3ffffff
+               h4 = uint32(d4) & 0x3ffffff
+
+               h0 += uint32(d4>>26) * 5
+               h1 += h0 >> 26
+               h0 = h0 & 0x3ffffff
+
+               msg = msg[TagSize:]
+       }
+
+       h[0], h[1], h[2], h[3], h[4] = h0, h1, h2, h3, h4
+}
+
+func finalizeGeneric(out *[TagSize]byte, h *[5]uint32, s *[4]uint32) {
+       h0, h1, h2, h3, h4 := h[0], h[1], h[2], h[3], h[4]
+
+       // h %= p reduction
+       h2 += h1 >> 26
+       h1 &= 0x3ffffff
+       h3 += h2 >> 26
+       h2 &= 0x3ffffff
+       h4 += h3 >> 26
+       h3 &= 0x3ffffff
+       h0 += 5 * (h4 >> 26)
+       h4 &= 0x3ffffff
+       h1 += h0 >> 26
+       h0 &= 0x3ffffff
+
+       // h - p
+       t0 := h0 + 5
+       t1 := h1 + (t0 >> 26)
+       t2 := h2 + (t1 >> 26)
+       t3 := h3 + (t2 >> 26)
+       t4 := h4 + (t3 >> 26) - (1 << 26)
+       t0 &= 0x3ffffff
+       t1 &= 0x3ffffff
+       t2 &= 0x3ffffff
+       t3 &= 0x3ffffff
+
+       // select h if h < p else h - p
+       t_mask := (t4 >> 31) - 1
+       h_mask := ^t_mask
+       h0 = (h0 & h_mask) | (t0 & t_mask)
+       h1 = (h1 & h_mask) | (t1 & t_mask)
+       h2 = (h2 & h_mask) | (t2 & t_mask)
+       h3 = (h3 & h_mask) | (t3 & t_mask)
+       h4 = (h4 & h_mask) | (t4 & t_mask)
+
+       // h %= 2^128
+       h0 |= h1 << 26
+       h1 = ((h1 >> 6) | (h2 << 20))
+       h2 = ((h2 >> 12) | (h3 << 14))
+       h3 = ((h3 >> 18) | (h4 << 8))
+
+       // s: the s part of the key
+       // tag = (h + s) % (2^128)
+       t := uint64(h0) + uint64(s[0])
+       h0 = uint32(t)
+       t = uint64(h1) + uint64(s[1]) + (t >> 32)
+       h1 = uint32(t)
+       t = uint64(h2) + uint64(s[2]) + (t >> 32)
+       h2 = uint32(t)
+       t = uint64(h3) + uint64(s[3]) + (t >> 32)
+       h3 = uint32(t)
+
+       binary.LittleEndian.PutUint32(out[0:], h0)
+       binary.LittleEndian.PutUint32(out[4:], h1)
+       binary.LittleEndian.PutUint32(out[8:], h2)
+       binary.LittleEndian.PutUint32(out[12:], h3)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_noasm.go b/libgo/go/golang.org/x/crypto/poly1305/sum_noasm.go
new file mode 100644 (file)
index 0000000..8a9c207
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,!go1.11 !arm,!amd64,!s390x,!ppc64le gccgo appengine nacl
+
+package poly1305
+
+// Sum generates an authenticator for msg using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
+       h := newMAC(key)
+       h.Write(msg)
+       h.Sum(out)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_ppc64le.go b/libgo/go/golang.org/x/crypto/poly1305/sum_ppc64le.go
new file mode 100644 (file)
index 0000000..2402b63
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ppc64le,!gccgo,!appengine
+
+package poly1305
+
+//go:noescape
+func initialize(state *[7]uint64, key *[32]byte)
+
+//go:noescape
+func update(state *[7]uint64, msg []byte)
+
+//go:noescape
+func finalize(tag *[TagSize]byte, state *[7]uint64)
+
+// Sum generates an authenticator for m using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[16]byte, m []byte, key *[32]byte) {
+       h := newMAC(key)
+       h.Write(m)
+       h.Sum(out)
+}
+
+func newMAC(key *[32]byte) (h mac) {
+       initialize(&h.state, key)
+       return
+}
+
+type mac struct {
+       state [7]uint64 // := uint64{ h0, h1, h2, r0, r1, pad0, pad1 }
+
+       buffer [TagSize]byte
+       offset int
+}
+
+func (h *mac) Write(p []byte) (n int, err error) {
+       n = len(p)
+       if h.offset > 0 {
+               remaining := TagSize - h.offset
+               if n < remaining {
+                       h.offset += copy(h.buffer[h.offset:], p)
+                       return n, nil
+               }
+               copy(h.buffer[h.offset:], p[:remaining])
+               p = p[remaining:]
+               h.offset = 0
+               update(&h.state, h.buffer[:])
+       }
+       if nn := len(p) - (len(p) % TagSize); nn > 0 {
+               update(&h.state, p[:nn])
+               p = p[nn:]
+       }
+       if len(p) > 0 {
+               h.offset += copy(h.buffer[h.offset:], p)
+       }
+       return n, nil
+}
+
+func (h *mac) Sum(out *[16]byte) {
+       state := h.state
+       if h.offset > 0 {
+               update(&state, h.buffer[:h.offset])
+       }
+       finalize(out, &state)
+}
diff --git a/libgo/go/golang.org/x/crypto/poly1305/sum_s390x.go b/libgo/go/golang.org/x/crypto/poly1305/sum_s390x.go
new file mode 100644 (file)
index 0000000..ec99e07
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,go1.11,!gccgo,!appengine
+
+package poly1305
+
+import (
+       "golang.org/x/sys/cpu"
+)
+
+// poly1305vx is an assembly implementation of Poly1305 that uses vector
+// instructions. It must only be called if the vector facility (vx) is
+// available.
+//go:noescape
+func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
+
+// poly1305vmsl is an assembly implementation of Poly1305 that uses vector
+// instructions, including VMSL. It must only be called if the vector facility (vx) is
+// available and if VMSL is supported.
+//go:noescape
+func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
+
+// Sum generates an authenticator for m using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[16]byte, m []byte, key *[32]byte) {
+       if cpu.S390X.HasVX {
+               var mPtr *byte
+               if len(m) > 0 {
+                       mPtr = &m[0]
+               }
+               if cpu.S390X.HasVXE && len(m) > 256 {
+                       poly1305vmsl(out, mPtr, uint64(len(m)), key)
+               } else {
+                       poly1305vx(out, mPtr, uint64(len(m)), key)
+               }
+       } else {
+               sumGeneric(out, m, key)
+       }
+}
diff --git a/libgo/go/golang.org/x/net/dns/dnsmessage/message.go b/libgo/go/golang.org/x/net/dns/dnsmessage/message.go
new file mode 100644 (file)
index 0000000..13fbc08
--- /dev/null
@@ -0,0 +1,2606 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package dnsmessage provides a mostly RFC 1035 compliant implementation of
+// DNS message packing and unpacking.
+//
+// The package also supports messages with Extension Mechanisms for DNS
+// (EDNS(0)) as defined in RFC 6891.
+//
+// This implementation is designed to minimize heap allocations and avoid
+// unnecessary packing and unpacking as much as possible.
+package dnsmessage
+
+import (
+       "errors"
+)
+
+// Message formats
+
+// A Type is a type of DNS request and response.
+type Type uint16
+
+const (
+       // ResourceHeader.Type and Question.Type
+       TypeA     Type = 1
+       TypeNS    Type = 2
+       TypeCNAME Type = 5
+       TypeSOA   Type = 6
+       TypePTR   Type = 12
+       TypeMX    Type = 15
+       TypeTXT   Type = 16
+       TypeAAAA  Type = 28
+       TypeSRV   Type = 33
+       TypeOPT   Type = 41
+
+       // Question.Type
+       TypeWKS   Type = 11
+       TypeHINFO Type = 13
+       TypeMINFO Type = 14
+       TypeAXFR  Type = 252
+       TypeALL   Type = 255
+)
+
+var typeNames = map[Type]string{
+       TypeA:     "TypeA",
+       TypeNS:    "TypeNS",
+       TypeCNAME: "TypeCNAME",
+       TypeSOA:   "TypeSOA",
+       TypePTR:   "TypePTR",
+       TypeMX:    "TypeMX",
+       TypeTXT:   "TypeTXT",
+       TypeAAAA:  "TypeAAAA",
+       TypeSRV:   "TypeSRV",
+       TypeOPT:   "TypeOPT",
+       TypeWKS:   "TypeWKS",
+       TypeHINFO: "TypeHINFO",
+       TypeMINFO: "TypeMINFO",
+       TypeAXFR:  "TypeAXFR",
+       TypeALL:   "TypeALL",
+}
+
+// String implements fmt.Stringer.String.
+func (t Type) String() string {
+       if n, ok := typeNames[t]; ok {
+               return n
+       }
+       return printUint16(uint16(t))
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (t Type) GoString() string {
+       if n, ok := typeNames[t]; ok {
+               return "dnsmessage." + n
+       }
+       return printUint16(uint16(t))
+}
+
+// A Class is a type of network.
+type Class uint16
+
+const (
+       // ResourceHeader.Class and Question.Class
+       ClassINET   Class = 1
+       ClassCSNET  Class = 2
+       ClassCHAOS  Class = 3
+       ClassHESIOD Class = 4
+
+       // Question.Class
+       ClassANY Class = 255
+)
+
+var classNames = map[Class]string{
+       ClassINET:   "ClassINET",
+       ClassCSNET:  "ClassCSNET",
+       ClassCHAOS:  "ClassCHAOS",
+       ClassHESIOD: "ClassHESIOD",
+       ClassANY:    "ClassANY",
+}
+
+// String implements fmt.Stringer.String.
+func (c Class) String() string {
+       if n, ok := classNames[c]; ok {
+               return n
+       }
+       return printUint16(uint16(c))
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (c Class) GoString() string {
+       if n, ok := classNames[c]; ok {
+               return "dnsmessage." + n
+       }
+       return printUint16(uint16(c))
+}
+
+// An OpCode is a DNS operation code.
+type OpCode uint16
+
+// GoString implements fmt.GoStringer.GoString.
+func (o OpCode) GoString() string {
+       return printUint16(uint16(o))
+}
+
+// An RCode is a DNS response status code.
+type RCode uint16
+
+const (
+       // Message.Rcode
+       RCodeSuccess        RCode = 0
+       RCodeFormatError    RCode = 1
+       RCodeServerFailure  RCode = 2
+       RCodeNameError      RCode = 3
+       RCodeNotImplemented RCode = 4
+       RCodeRefused        RCode = 5
+)
+
+var rCodeNames = map[RCode]string{
+       RCodeSuccess:        "RCodeSuccess",
+       RCodeFormatError:    "RCodeFormatError",
+       RCodeServerFailure:  "RCodeServerFailure",
+       RCodeNameError:      "RCodeNameError",
+       RCodeNotImplemented: "RCodeNotImplemented",
+       RCodeRefused:        "RCodeRefused",
+}
+
+// String implements fmt.Stringer.String.
+func (r RCode) String() string {
+       if n, ok := rCodeNames[r]; ok {
+               return n
+       }
+       return printUint16(uint16(r))
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r RCode) GoString() string {
+       if n, ok := rCodeNames[r]; ok {
+               return "dnsmessage." + n
+       }
+       return printUint16(uint16(r))
+}
+
+func printPaddedUint8(i uint8) string {
+       b := byte(i)
+       return string([]byte{
+               b/100 + '0',
+               b/10%10 + '0',
+               b%10 + '0',
+       })
+}
+
+func printUint8Bytes(buf []byte, i uint8) []byte {
+       b := byte(i)
+       if i >= 100 {
+               buf = append(buf, b/100+'0')
+       }
+       if i >= 10 {
+               buf = append(buf, b/10%10+'0')
+       }
+       return append(buf, b%10+'0')
+}
+
+func printByteSlice(b []byte) string {
+       if len(b) == 0 {
+               return ""
+       }
+       buf := make([]byte, 0, 5*len(b))
+       buf = printUint8Bytes(buf, uint8(b[0]))
+       for _, n := range b[1:] {
+               buf = append(buf, ',', ' ')
+               buf = printUint8Bytes(buf, uint8(n))
+       }
+       return string(buf)
+}
+
+const hexDigits = "0123456789abcdef"
+
+func printString(str []byte) string {
+       buf := make([]byte, 0, len(str))
+       for i := 0; i < len(str); i++ {
+               c := str[i]
+               if c == '.' || c == '-' || c == ' ' ||
+                       'A' <= c && c <= 'Z' ||
+                       'a' <= c && c <= 'z' ||
+                       '0' <= c && c <= '9' {
+                       buf = append(buf, c)
+                       continue
+               }
+
+               upper := c >> 4
+               lower := (c << 4) >> 4
+               buf = append(
+                       buf,
+                       '\\',
+                       'x',
+                       hexDigits[upper],
+                       hexDigits[lower],
+               )
+       }
+       return string(buf)
+}
+
+func printUint16(i uint16) string {
+       return printUint32(uint32(i))
+}
+
+func printUint32(i uint32) string {
+       // Max value is 4294967295.
+       buf := make([]byte, 10)
+       for b, d := buf, uint32(1000000000); d > 0; d /= 10 {
+               b[0] = byte(i/d%10 + '0')
+               if b[0] == '0' && len(b) == len(buf) && len(buf) > 1 {
+                       buf = buf[1:]
+               }
+               b = b[1:]
+               i %= d
+       }
+       return string(buf)
+}
+
+func printBool(b bool) string {
+       if b {
+               return "true"
+       }
+       return "false"
+}
+
+var (
+       // ErrNotStarted indicates that the prerequisite information isn't
+       // available yet because the previous records haven't been appropriately
+       // parsed, skipped or finished.
+       ErrNotStarted = errors.New("parsing/packing of this type isn't available yet")
+
+       // ErrSectionDone indicated that all records in the section have been
+       // parsed or finished.
+       ErrSectionDone = errors.New("parsing/packing of this section has completed")
+
+       errBaseLen            = errors.New("insufficient data for base length type")
+       errCalcLen            = errors.New("insufficient data for calculated length type")
+       errReserved           = errors.New("segment prefix is reserved")
+       errTooManyPtr         = errors.New("too many pointers (>10)")
+       errInvalidPtr         = errors.New("invalid pointer")
+       errNilResouceBody     = errors.New("nil resource body")
+       errResourceLen        = errors.New("insufficient data for resource body length")
+       errSegTooLong         = errors.New("segment length too long")
+       errZeroSegLen         = errors.New("zero length segment")
+       errResTooLong         = errors.New("resource length too long")
+       errTooManyQuestions   = errors.New("too many Questions to pack (>65535)")
+       errTooManyAnswers     = errors.New("too many Answers to pack (>65535)")
+       errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)")
+       errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)")
+       errNonCanonicalName   = errors.New("name is not in canonical format (it must end with a .)")
+       errStringTooLong      = errors.New("character string exceeds maximum length (255)")
+       errCompressedSRV      = errors.New("compressed name in SRV resource data")
+)
+
+// Internal constants.
+const (
+       // packStartingCap is the default initial buffer size allocated during
+       // packing.
+       //
+       // The starting capacity doesn't matter too much, but most DNS responses
+       // Will be <= 512 bytes as it is the limit for DNS over UDP.
+       packStartingCap = 512
+
+       // uint16Len is the length (in bytes) of a uint16.
+       uint16Len = 2
+
+       // uint32Len is the length (in bytes) of a uint32.
+       uint32Len = 4
+
+       // headerLen is the length (in bytes) of a DNS header.
+       //
+       // A header is comprised of 6 uint16s and no padding.
+       headerLen = 6 * uint16Len
+)
+
+type nestedError struct {
+       // s is the current level's error message.
+       s string
+
+       // err is the nested error.
+       err error
+}
+
+// nestedError implements error.Error.
+func (e *nestedError) Error() string {
+       return e.s + ": " + e.err.Error()
+}
+
+// Header is a representation of a DNS message header.
+type Header struct {
+       ID                 uint16
+       Response           bool
+       OpCode             OpCode
+       Authoritative      bool
+       Truncated          bool
+       RecursionDesired   bool
+       RecursionAvailable bool
+       RCode              RCode
+}
+
+func (m *Header) pack() (id uint16, bits uint16) {
+       id = m.ID
+       bits = uint16(m.OpCode)<<11 | uint16(m.RCode)
+       if m.RecursionAvailable {
+               bits |= headerBitRA
+       }
+       if m.RecursionDesired {
+               bits |= headerBitRD
+       }
+       if m.Truncated {
+               bits |= headerBitTC
+       }
+       if m.Authoritative {
+               bits |= headerBitAA
+       }
+       if m.Response {
+               bits |= headerBitQR
+       }
+       return
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (m *Header) GoString() string {
+       return "dnsmessage.Header{" +
+               "ID: " + printUint16(m.ID) + ", " +
+               "Response: " + printBool(m.Response) + ", " +
+               "OpCode: " + m.OpCode.GoString() + ", " +
+               "Authoritative: " + printBool(m.Authoritative) + ", " +
+               "Truncated: " + printBool(m.Truncated) + ", " +
+               "RecursionDesired: " + printBool(m.RecursionDesired) + ", " +
+               "RecursionAvailable: " + printBool(m.RecursionAvailable) + ", " +
+               "RCode: " + m.RCode.GoString() + "}"
+}
+
+// Message is a representation of a DNS message.
+type Message struct {
+       Header
+       Questions   []Question
+       Answers     []Resource
+       Authorities []Resource
+       Additionals []Resource
+}
+
+type section uint8
+
+const (
+       sectionNotStarted section = iota
+       sectionHeader
+       sectionQuestions
+       sectionAnswers
+       sectionAuthorities
+       sectionAdditionals
+       sectionDone
+
+       headerBitQR = 1 << 15 // query/response (response=1)
+       headerBitAA = 1 << 10 // authoritative
+       headerBitTC = 1 << 9  // truncated
+       headerBitRD = 1 << 8  // recursion desired
+       headerBitRA = 1 << 7  // recursion available
+)
+
+var sectionNames = map[section]string{
+       sectionHeader:      "header",
+       sectionQuestions:   "Question",
+       sectionAnswers:     "Answer",
+       sectionAuthorities: "Authority",
+       sectionAdditionals: "Additional",
+}
+
+// header is the wire format for a DNS message header.
+type header struct {
+       id          uint16
+       bits        uint16
+       questions   uint16
+       answers     uint16
+       authorities uint16
+       additionals uint16
+}
+
+func (h *header) count(sec section) uint16 {
+       switch sec {
+       case sectionQuestions:
+               return h.questions
+       case sectionAnswers:
+               return h.answers
+       case sectionAuthorities:
+               return h.authorities
+       case sectionAdditionals:
+               return h.additionals
+       }
+       return 0
+}
+
+// pack appends the wire format of the header to msg.
+func (h *header) pack(msg []byte) []byte {
+       msg = packUint16(msg, h.id)
+       msg = packUint16(msg, h.bits)
+       msg = packUint16(msg, h.questions)
+       msg = packUint16(msg, h.answers)
+       msg = packUint16(msg, h.authorities)
+       return packUint16(msg, h.additionals)
+}
+
+func (h *header) unpack(msg []byte, off int) (int, error) {
+       newOff := off
+       var err error
+       if h.id, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"id", err}
+       }
+       if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"bits", err}
+       }
+       if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"questions", err}
+       }
+       if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"answers", err}
+       }
+       if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"authorities", err}
+       }
+       if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"additionals", err}
+       }
+       return newOff, nil
+}
+
+func (h *header) header() Header {
+       return Header{
+               ID:                 h.id,
+               Response:           (h.bits & headerBitQR) != 0,
+               OpCode:             OpCode(h.bits>>11) & 0xF,
+               Authoritative:      (h.bits & headerBitAA) != 0,
+               Truncated:          (h.bits & headerBitTC) != 0,
+               RecursionDesired:   (h.bits & headerBitRD) != 0,
+               RecursionAvailable: (h.bits & headerBitRA) != 0,
+               RCode:              RCode(h.bits & 0xF),
+       }
+}
+
+// A Resource is a DNS resource record.
+type Resource struct {
+       Header ResourceHeader
+       Body   ResourceBody
+}
+
+func (r *Resource) GoString() string {
+       return "dnsmessage.Resource{" +
+               "Header: " + r.Header.GoString() +
+               ", Body: &" + r.Body.GoString() +
+               "}"
+}
+
+// A ResourceBody is a DNS resource record minus the header.
+type ResourceBody interface {
+       // pack packs a Resource except for its header.
+       pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error)
+
+       // realType returns the actual type of the Resource. This is used to
+       // fill in the header Type field.
+       realType() Type
+
+       // GoString implements fmt.GoStringer.GoString.
+       GoString() string
+}
+
+// pack appends the wire format of the Resource to msg.
+func (r *Resource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       if r.Body == nil {
+               return msg, errNilResouceBody
+       }
+       oldMsg := msg
+       r.Header.Type = r.Body.realType()
+       msg, lenOff, err := r.Header.pack(msg, compression, compressionOff)
+       if err != nil {
+               return msg, &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       msg, err = r.Body.pack(msg, compression, compressionOff)
+       if err != nil {
+               return msg, &nestedError{"content", err}
+       }
+       if err := r.Header.fixLen(msg, lenOff, preLen); err != nil {
+               return oldMsg, err
+       }
+       return msg, nil
+}
+
+// A Parser allows incrementally parsing a DNS message.
+//
+// When parsing is started, the Header is parsed. Next, each Question can be
+// either parsed or skipped. Alternatively, all Questions can be skipped at
+// once. When all Questions have been parsed, attempting to parse Questions
+// will return (nil, nil) and attempting to skip Questions will return
+// (true, nil). After all Questions have been either parsed or skipped, all
+// Answers, Authorities and Additionals can be either parsed or skipped in the
+// same way, and each type of Resource must be fully parsed or skipped before
+// proceeding to the next type of Resource.
+//
+// Note that there is no requirement to fully skip or parse the message.
+type Parser struct {
+       msg    []byte
+       header header
+
+       section        section
+       off            int
+       index          int
+       resHeaderValid bool
+       resHeader      ResourceHeader
+}
+
+// Start parses the header and enables the parsing of Questions.
+func (p *Parser) Start(msg []byte) (Header, error) {
+       if p.msg != nil {
+               *p = Parser{}
+       }
+       p.msg = msg
+       var err error
+       if p.off, err = p.header.unpack(msg, 0); err != nil {
+               return Header{}, &nestedError{"unpacking header", err}
+       }
+       p.section = sectionQuestions
+       return p.header.header(), nil
+}
+
+func (p *Parser) checkAdvance(sec section) error {
+       if p.section < sec {
+               return ErrNotStarted
+       }
+       if p.section > sec {
+               return ErrSectionDone
+       }
+       p.resHeaderValid = false
+       if p.index == int(p.header.count(sec)) {
+               p.index = 0
+               p.section++
+               return ErrSectionDone
+       }
+       return nil
+}
+
+func (p *Parser) resource(sec section) (Resource, error) {
+       var r Resource
+       var err error
+       r.Header, err = p.resourceHeader(sec)
+       if err != nil {
+               return r, err
+       }
+       p.resHeaderValid = false
+       r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header)
+       if err != nil {
+               return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err}
+       }
+       p.index++
+       return r, nil
+}
+
+func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) {
+       if p.resHeaderValid {
+               return p.resHeader, nil
+       }
+       if err := p.checkAdvance(sec); err != nil {
+               return ResourceHeader{}, err
+       }
+       var hdr ResourceHeader
+       off, err := hdr.unpack(p.msg, p.off)
+       if err != nil {
+               return ResourceHeader{}, err
+       }
+       p.resHeaderValid = true
+       p.resHeader = hdr
+       p.off = off
+       return hdr, nil
+}
+
+func (p *Parser) skipResource(sec section) error {
+       if p.resHeaderValid {
+               newOff := p.off + int(p.resHeader.Length)
+               if newOff > len(p.msg) {
+                       return errResourceLen
+               }
+               p.off = newOff
+               p.resHeaderValid = false
+               p.index++
+               return nil
+       }
+       if err := p.checkAdvance(sec); err != nil {
+               return err
+       }
+       var err error
+       p.off, err = skipResource(p.msg, p.off)
+       if err != nil {
+               return &nestedError{"skipping: " + sectionNames[sec], err}
+       }
+       p.index++
+       return nil
+}
+
+// Question parses a single Question.
+func (p *Parser) Question() (Question, error) {
+       if err := p.checkAdvance(sectionQuestions); err != nil {
+               return Question{}, err
+       }
+       var name Name
+       off, err := name.unpack(p.msg, p.off)
+       if err != nil {
+               return Question{}, &nestedError{"unpacking Question.Name", err}
+       }
+       typ, off, err := unpackType(p.msg, off)
+       if err != nil {
+               return Question{}, &nestedError{"unpacking Question.Type", err}
+       }
+       class, off, err := unpackClass(p.msg, off)
+       if err != nil {
+               return Question{}, &nestedError{"unpacking Question.Class", err}
+       }
+       p.off = off
+       p.index++
+       return Question{name, typ, class}, nil
+}
+
+// AllQuestions parses all Questions.
+func (p *Parser) AllQuestions() ([]Question, error) {
+       // Multiple questions are valid according to the spec,
+       // but servers don't actually support them. There will
+       // be at most one question here.
+       //
+       // Do not pre-allocate based on info in p.header, since
+       // the data is untrusted.
+       qs := []Question{}
+       for {
+               q, err := p.Question()
+               if err == ErrSectionDone {
+                       return qs, nil
+               }
+               if err != nil {
+                       return nil, err
+               }
+               qs = append(qs, q)
+       }
+}
+
+// SkipQuestion skips a single Question.
+func (p *Parser) SkipQuestion() error {
+       if err := p.checkAdvance(sectionQuestions); err != nil {
+               return err
+       }
+       off, err := skipName(p.msg, p.off)
+       if err != nil {
+               return &nestedError{"skipping Question Name", err}
+       }
+       if off, err = skipType(p.msg, off); err != nil {
+               return &nestedError{"skipping Question Type", err}
+       }
+       if off, err = skipClass(p.msg, off); err != nil {
+               return &nestedError{"skipping Question Class", err}
+       }
+       p.off = off
+       p.index++
+       return nil
+}
+
+// SkipAllQuestions skips all Questions.
+func (p *Parser) SkipAllQuestions() error {
+       for {
+               if err := p.SkipQuestion(); err == ErrSectionDone {
+                       return nil
+               } else if err != nil {
+                       return err
+               }
+       }
+}
+
+// AnswerHeader parses a single Answer ResourceHeader.
+func (p *Parser) AnswerHeader() (ResourceHeader, error) {
+       return p.resourceHeader(sectionAnswers)
+}
+
+// Answer parses a single Answer Resource.
+func (p *Parser) Answer() (Resource, error) {
+       return p.resource(sectionAnswers)
+}
+
+// AllAnswers parses all Answer Resources.
+func (p *Parser) AllAnswers() ([]Resource, error) {
+       // The most common query is for A/AAAA, which usually returns
+       // a handful of IPs.
+       //
+       // Pre-allocate up to a certain limit, since p.header is
+       // untrusted data.
+       n := int(p.header.answers)
+       if n > 20 {
+               n = 20
+       }
+       as := make([]Resource, 0, n)
+       for {
+               a, err := p.Answer()
+               if err == ErrSectionDone {
+                       return as, nil
+               }
+               if err != nil {
+                       return nil, err
+               }
+               as = append(as, a)
+       }
+}
+
+// SkipAnswer skips a single Answer Resource.
+func (p *Parser) SkipAnswer() error {
+       return p.skipResource(sectionAnswers)
+}
+
+// SkipAllAnswers skips all Answer Resources.
+func (p *Parser) SkipAllAnswers() error {
+       for {
+               if err := p.SkipAnswer(); err == ErrSectionDone {
+                       return nil
+               } else if err != nil {
+                       return err
+               }
+       }
+}
+
+// AuthorityHeader parses a single Authority ResourceHeader.
+func (p *Parser) AuthorityHeader() (ResourceHeader, error) {
+       return p.resourceHeader(sectionAuthorities)
+}
+
+// Authority parses a single Authority Resource.
+func (p *Parser) Authority() (Resource, error) {
+       return p.resource(sectionAuthorities)
+}
+
+// AllAuthorities parses all Authority Resources.
+func (p *Parser) AllAuthorities() ([]Resource, error) {
+       // Authorities contains SOA in case of NXDOMAIN and friends,
+       // otherwise it is empty.
+       //
+       // Pre-allocate up to a certain limit, since p.header is
+       // untrusted data.
+       n := int(p.header.authorities)
+       if n > 10 {
+               n = 10
+       }
+       as := make([]Resource, 0, n)
+       for {
+               a, err := p.Authority()
+               if err == ErrSectionDone {
+                       return as, nil
+               }
+               if err != nil {
+                       return nil, err
+               }
+               as = append(as, a)
+       }
+}
+
+// SkipAuthority skips a single Authority Resource.
+func (p *Parser) SkipAuthority() error {
+       return p.skipResource(sectionAuthorities)
+}
+
+// SkipAllAuthorities skips all Authority Resources.
+func (p *Parser) SkipAllAuthorities() error {
+       for {
+               if err := p.SkipAuthority(); err == ErrSectionDone {
+                       return nil
+               } else if err != nil {
+                       return err
+               }
+       }
+}
+
+// AdditionalHeader parses a single Additional ResourceHeader.
+func (p *Parser) AdditionalHeader() (ResourceHeader, error) {
+       return p.resourceHeader(sectionAdditionals)
+}
+
+// Additional parses a single Additional Resource.
+func (p *Parser) Additional() (Resource, error) {
+       return p.resource(sectionAdditionals)
+}
+
+// AllAdditionals parses all Additional Resources.
+func (p *Parser) AllAdditionals() ([]Resource, error) {
+       // Additionals usually contain OPT, and sometimes A/AAAA
+       // glue records.
+       //
+       // Pre-allocate up to a certain limit, since p.header is
+       // untrusted data.
+       n := int(p.header.additionals)
+       if n > 10 {
+               n = 10
+       }
+       as := make([]Resource, 0, n)
+       for {
+               a, err := p.Additional()
+               if err == ErrSectionDone {
+                       return as, nil
+               }
+               if err != nil {
+                       return nil, err
+               }
+               as = append(as, a)
+       }
+}
+
+// SkipAdditional skips a single Additional Resource.
+func (p *Parser) SkipAdditional() error {
+       return p.skipResource(sectionAdditionals)
+}
+
+// SkipAllAdditionals skips all Additional Resources.
+func (p *Parser) SkipAllAdditionals() error {
+       for {
+               if err := p.SkipAdditional(); err == ErrSectionDone {
+                       return nil
+               } else if err != nil {
+                       return err
+               }
+       }
+}
+
+// CNAMEResource parses a single CNAMEResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) CNAMEResource() (CNAMEResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeCNAME {
+               return CNAMEResource{}, ErrNotStarted
+       }
+       r, err := unpackCNAMEResource(p.msg, p.off)
+       if err != nil {
+               return CNAMEResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// MXResource parses a single MXResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) MXResource() (MXResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeMX {
+               return MXResource{}, ErrNotStarted
+       }
+       r, err := unpackMXResource(p.msg, p.off)
+       if err != nil {
+               return MXResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// NSResource parses a single NSResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) NSResource() (NSResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeNS {
+               return NSResource{}, ErrNotStarted
+       }
+       r, err := unpackNSResource(p.msg, p.off)
+       if err != nil {
+               return NSResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// PTRResource parses a single PTRResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) PTRResource() (PTRResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypePTR {
+               return PTRResource{}, ErrNotStarted
+       }
+       r, err := unpackPTRResource(p.msg, p.off)
+       if err != nil {
+               return PTRResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// SOAResource parses a single SOAResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) SOAResource() (SOAResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeSOA {
+               return SOAResource{}, ErrNotStarted
+       }
+       r, err := unpackSOAResource(p.msg, p.off)
+       if err != nil {
+               return SOAResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// TXTResource parses a single TXTResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) TXTResource() (TXTResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeTXT {
+               return TXTResource{}, ErrNotStarted
+       }
+       r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length)
+       if err != nil {
+               return TXTResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// SRVResource parses a single SRVResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) SRVResource() (SRVResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeSRV {
+               return SRVResource{}, ErrNotStarted
+       }
+       r, err := unpackSRVResource(p.msg, p.off)
+       if err != nil {
+               return SRVResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// AResource parses a single AResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) AResource() (AResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeA {
+               return AResource{}, ErrNotStarted
+       }
+       r, err := unpackAResource(p.msg, p.off)
+       if err != nil {
+               return AResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// AAAAResource parses a single AAAAResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) AAAAResource() (AAAAResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeAAAA {
+               return AAAAResource{}, ErrNotStarted
+       }
+       r, err := unpackAAAAResource(p.msg, p.off)
+       if err != nil {
+               return AAAAResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// OPTResource parses a single OPTResource.
+//
+// One of the XXXHeader methods must have been called before calling this
+// method.
+func (p *Parser) OPTResource() (OPTResource, error) {
+       if !p.resHeaderValid || p.resHeader.Type != TypeOPT {
+               return OPTResource{}, ErrNotStarted
+       }
+       r, err := unpackOPTResource(p.msg, p.off, p.resHeader.Length)
+       if err != nil {
+               return OPTResource{}, err
+       }
+       p.off += int(p.resHeader.Length)
+       p.resHeaderValid = false
+       p.index++
+       return r, nil
+}
+
+// Unpack parses a full Message.
+func (m *Message) Unpack(msg []byte) error {
+       var p Parser
+       var err error
+       if m.Header, err = p.Start(msg); err != nil {
+               return err
+       }
+       if m.Questions, err = p.AllQuestions(); err != nil {
+               return err
+       }
+       if m.Answers, err = p.AllAnswers(); err != nil {
+               return err
+       }
+       if m.Authorities, err = p.AllAuthorities(); err != nil {
+               return err
+       }
+       if m.Additionals, err = p.AllAdditionals(); err != nil {
+               return err
+       }
+       return nil
+}
+
+// Pack packs a full Message.
+func (m *Message) Pack() ([]byte, error) {
+       return m.AppendPack(make([]byte, 0, packStartingCap))
+}
+
+// AppendPack is like Pack but appends the full Message to b and returns the
+// extended buffer.
+func (m *Message) AppendPack(b []byte) ([]byte, error) {
+       // Validate the lengths. It is very unlikely that anyone will try to
+       // pack more than 65535 of any particular type, but it is possible and
+       // we should fail gracefully.
+       if len(m.Questions) > int(^uint16(0)) {
+               return nil, errTooManyQuestions
+       }
+       if len(m.Answers) > int(^uint16(0)) {
+               return nil, errTooManyAnswers
+       }
+       if len(m.Authorities) > int(^uint16(0)) {
+               return nil, errTooManyAuthorities
+       }
+       if len(m.Additionals) > int(^uint16(0)) {
+               return nil, errTooManyAdditionals
+       }
+
+       var h header
+       h.id, h.bits = m.Header.pack()
+
+       h.questions = uint16(len(m.Questions))
+       h.answers = uint16(len(m.Answers))
+       h.authorities = uint16(len(m.Authorities))
+       h.additionals = uint16(len(m.Additionals))
+
+       compressionOff := len(b)
+       msg := h.pack(b)
+
+       // RFC 1035 allows (but does not require) compression for packing. RFC
+       // 1035 requires unpacking implementations to support compression, so
+       // unconditionally enabling it is fine.
+       //
+       // DNS lookups are typically done over UDP, and RFC 1035 states that UDP
+       // DNS messages can be a maximum of 512 bytes long. Without compression,
+       // many DNS response messages are over this limit, so enabling
+       // compression will help ensure compliance.
+       compression := map[string]int{}
+
+       for i := range m.Questions {
+               var err error
+               if msg, err = m.Questions[i].pack(msg, compression, compressionOff); err != nil {
+                       return nil, &nestedError{"packing Question", err}
+               }
+       }
+       for i := range m.Answers {
+               var err error
+               if msg, err = m.Answers[i].pack(msg, compression, compressionOff); err != nil {
+                       return nil, &nestedError{"packing Answer", err}
+               }
+       }
+       for i := range m.Authorities {
+               var err error
+               if msg, err = m.Authorities[i].pack(msg, compression, compressionOff); err != nil {
+                       return nil, &nestedError{"packing Authority", err}
+               }
+       }
+       for i := range m.Additionals {
+               var err error
+               if msg, err = m.Additionals[i].pack(msg, compression, compressionOff); err != nil {
+                       return nil, &nestedError{"packing Additional", err}
+               }
+       }
+
+       return msg, nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (m *Message) GoString() string {
+       s := "dnsmessage.Message{Header: " + m.Header.GoString() + ", " +
+               "Questions: []dnsmessage.Question{"
+       if len(m.Questions) > 0 {
+               s += m.Questions[0].GoString()
+               for _, q := range m.Questions[1:] {
+                       s += ", " + q.GoString()
+               }
+       }
+       s += "}, Answers: []dnsmessage.Resource{"
+       if len(m.Answers) > 0 {
+               s += m.Answers[0].GoString()
+               for _, a := range m.Answers[1:] {
+                       s += ", " + a.GoString()
+               }
+       }
+       s += "}, Authorities: []dnsmessage.Resource{"
+       if len(m.Authorities) > 0 {
+               s += m.Authorities[0].GoString()
+               for _, a := range m.Authorities[1:] {
+                       s += ", " + a.GoString()
+               }
+       }
+       s += "}, Additionals: []dnsmessage.Resource{"
+       if len(m.Additionals) > 0 {
+               s += m.Additionals[0].GoString()
+               for _, a := range m.Additionals[1:] {
+                       s += ", " + a.GoString()
+               }
+       }
+       return s + "}}"
+}
+
+// A Builder allows incrementally packing a DNS message.
+//
+// Example usage:
+//     buf := make([]byte, 2, 514)
+//     b := NewBuilder(buf, Header{...})
+//     b.EnableCompression()
+//     // Optionally start a section and add things to that section.
+//     // Repeat adding sections as necessary.
+//     buf, err := b.Finish()
+//     // If err is nil, buf[2:] will contain the built bytes.
+type Builder struct {
+       // msg is the storage for the message being built.
+       msg []byte
+
+       // section keeps track of the current section being built.
+       section section
+
+       // header keeps track of what should go in the header when Finish is
+       // called.
+       header header
+
+       // start is the starting index of the bytes allocated in msg for header.
+       start int
+
+       // compression is a mapping from name suffixes to their starting index
+       // in msg.
+       compression map[string]int
+}
+
+// NewBuilder creates a new builder with compression disabled.
+//
+// Note: Most users will want to immediately enable compression with the
+// EnableCompression method. See that method's comment for why you may or may
+// not want to enable compression.
+//
+// The DNS message is appended to the provided initial buffer buf (which may be
+// nil) as it is built. The final message is returned by the (*Builder).Finish
+// method, which may return the same underlying array if there was sufficient
+// capacity in the slice.
+func NewBuilder(buf []byte, h Header) Builder {
+       if buf == nil {
+               buf = make([]byte, 0, packStartingCap)
+       }
+       b := Builder{msg: buf, start: len(buf)}
+       b.header.id, b.header.bits = h.pack()
+       var hb [headerLen]byte
+       b.msg = append(b.msg, hb[:]...)
+       b.section = sectionHeader
+       return b
+}
+
+// EnableCompression enables compression in the Builder.
+//
+// Leaving compression disabled avoids compression related allocations, but can
+// result in larger message sizes. Be careful with this mode as it can cause
+// messages to exceed the UDP size limit.
+//
+// According to RFC 1035, section 4.1.4, the use of compression is optional, but
+// all implementations must accept both compressed and uncompressed DNS
+// messages.
+//
+// Compression should be enabled before any sections are added for best results.
+func (b *Builder) EnableCompression() {
+       b.compression = map[string]int{}
+}
+
+func (b *Builder) startCheck(s section) error {
+       if b.section <= sectionNotStarted {
+               return ErrNotStarted
+       }
+       if b.section > s {
+               return ErrSectionDone
+       }
+       return nil
+}
+
+// StartQuestions prepares the builder for packing Questions.
+func (b *Builder) StartQuestions() error {
+       if err := b.startCheck(sectionQuestions); err != nil {
+               return err
+       }
+       b.section = sectionQuestions
+       return nil
+}
+
+// StartAnswers prepares the builder for packing Answers.
+func (b *Builder) StartAnswers() error {
+       if err := b.startCheck(sectionAnswers); err != nil {
+               return err
+       }
+       b.section = sectionAnswers
+       return nil
+}
+
+// StartAuthorities prepares the builder for packing Authorities.
+func (b *Builder) StartAuthorities() error {
+       if err := b.startCheck(sectionAuthorities); err != nil {
+               return err
+       }
+       b.section = sectionAuthorities
+       return nil
+}
+
+// StartAdditionals prepares the builder for packing Additionals.
+func (b *Builder) StartAdditionals() error {
+       if err := b.startCheck(sectionAdditionals); err != nil {
+               return err
+       }
+       b.section = sectionAdditionals
+       return nil
+}
+
+func (b *Builder) incrementSectionCount() error {
+       var count *uint16
+       var err error
+       switch b.section {
+       case sectionQuestions:
+               count = &b.header.questions
+               err = errTooManyQuestions
+       case sectionAnswers:
+               count = &b.header.answers
+               err = errTooManyAnswers
+       case sectionAuthorities:
+               count = &b.header.authorities
+               err = errTooManyAuthorities
+       case sectionAdditionals:
+               count = &b.header.additionals
+               err = errTooManyAdditionals
+       }
+       if *count == ^uint16(0) {
+               return err
+       }
+       *count++
+       return nil
+}
+
+// Question adds a single Question.
+func (b *Builder) Question(q Question) error {
+       if b.section < sectionQuestions {
+               return ErrNotStarted
+       }
+       if b.section > sectionQuestions {
+               return ErrSectionDone
+       }
+       msg, err := q.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+func (b *Builder) checkResourceSection() error {
+       if b.section < sectionAnswers {
+               return ErrNotStarted
+       }
+       if b.section > sectionAdditionals {
+               return ErrSectionDone
+       }
+       return nil
+}
+
+// CNAMEResource adds a single CNAMEResource.
+func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"CNAMEResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// MXResource adds a single MXResource.
+func (b *Builder) MXResource(h ResourceHeader, r MXResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"MXResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// NSResource adds a single NSResource.
+func (b *Builder) NSResource(h ResourceHeader, r NSResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"NSResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// PTRResource adds a single PTRResource.
+func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"PTRResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// SOAResource adds a single SOAResource.
+func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"SOAResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// TXTResource adds a single TXTResource.
+func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"TXTResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// SRVResource adds a single SRVResource.
+func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"SRVResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// AResource adds a single AResource.
+func (b *Builder) AResource(h ResourceHeader, r AResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"AResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// AAAAResource adds a single AAAAResource.
+func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"AAAAResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// OPTResource adds a single OPTResource.
+func (b *Builder) OPTResource(h ResourceHeader, r OPTResource) error {
+       if err := b.checkResourceSection(); err != nil {
+               return err
+       }
+       h.Type = r.realType()
+       msg, lenOff, err := h.pack(b.msg, b.compression, b.start)
+       if err != nil {
+               return &nestedError{"ResourceHeader", err}
+       }
+       preLen := len(msg)
+       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
+               return &nestedError{"OPTResource body", err}
+       }
+       if err := h.fixLen(msg, lenOff, preLen); err != nil {
+               return err
+       }
+       if err := b.incrementSectionCount(); err != nil {
+               return err
+       }
+       b.msg = msg
+       return nil
+}
+
+// Finish ends message building and generates a binary message.
+func (b *Builder) Finish() ([]byte, error) {
+       if b.section < sectionHeader {
+               return nil, ErrNotStarted
+       }
+       b.section = sectionDone
+       // Space for the header was allocated in NewBuilder.
+       b.header.pack(b.msg[b.start:b.start])
+       return b.msg, nil
+}
+
+// A ResourceHeader is the header of a DNS resource record. There are
+// many types of DNS resource records, but they all share the same header.
+type ResourceHeader struct {
+       // Name is the domain name for which this resource record pertains.
+       Name Name
+
+       // Type is the type of DNS resource record.
+       //
+       // This field will be set automatically during packing.
+       Type Type
+
+       // Class is the class of network to which this DNS resource record
+       // pertains.
+       Class Class
+
+       // TTL is the length of time (measured in seconds) which this resource
+       // record is valid for (time to live). All Resources in a set should
+       // have the same TTL (RFC 2181 Section 5.2).
+       TTL uint32
+
+       // Length is the length of data in the resource record after the header.
+       //
+       // This field will be set automatically during packing.
+       Length uint16
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (h *ResourceHeader) GoString() string {
+       return "dnsmessage.ResourceHeader{" +
+               "Name: " + h.Name.GoString() + ", " +
+               "Type: " + h.Type.GoString() + ", " +
+               "Class: " + h.Class.GoString() + ", " +
+               "TTL: " + printUint32(h.TTL) + ", " +
+               "Length: " + printUint16(h.Length) + "}"
+}
+
+// pack appends the wire format of the ResourceHeader to oldMsg.
+//
+// lenOff is the offset in msg where the Length field was packed.
+func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int, compressionOff int) (msg []byte, lenOff int, err error) {
+       msg = oldMsg
+       if msg, err = h.Name.pack(msg, compression, compressionOff); err != nil {
+               return oldMsg, 0, &nestedError{"Name", err}
+       }
+       msg = packType(msg, h.Type)
+       msg = packClass(msg, h.Class)
+       msg = packUint32(msg, h.TTL)
+       lenOff = len(msg)
+       msg = packUint16(msg, h.Length)
+       return msg, lenOff, nil
+}
+
+func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) {
+       newOff := off
+       var err error
+       if newOff, err = h.Name.unpack(msg, newOff); err != nil {
+               return off, &nestedError{"Name", err}
+       }
+       if h.Type, newOff, err = unpackType(msg, newOff); err != nil {
+               return off, &nestedError{"Type", err}
+       }
+       if h.Class, newOff, err = unpackClass(msg, newOff); err != nil {
+               return off, &nestedError{"Class", err}
+       }
+       if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil {
+               return off, &nestedError{"TTL", err}
+       }
+       if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil {
+               return off, &nestedError{"Length", err}
+       }
+       return newOff, nil
+}
+
+// fixLen updates a packed ResourceHeader to include the length of the
+// ResourceBody.
+//
+// lenOff is the offset of the ResourceHeader.Length field in msg.
+//
+// preLen is the length that msg was before the ResourceBody was packed.
+func (h *ResourceHeader) fixLen(msg []byte, lenOff int, preLen int) error {
+       conLen := len(msg) - preLen
+       if conLen > int(^uint16(0)) {
+               return errResTooLong
+       }
+
+       // Fill in the length now that we know how long the content is.
+       packUint16(msg[lenOff:lenOff], uint16(conLen))
+       h.Length = uint16(conLen)
+
+       return nil
+}
+
+// EDNS(0) wire costants.
+const (
+       edns0Version = 0
+
+       edns0DNSSECOK     = 0x00008000
+       ednsVersionMask   = 0x00ff0000
+       edns0DNSSECOKMask = 0x00ff8000
+)
+
+// SetEDNS0 configures h for EDNS(0).
+//
+// The provided extRCode must be an extedned RCode.
+func (h *ResourceHeader) SetEDNS0(udpPayloadLen int, extRCode RCode, dnssecOK bool) error {
+       h.Name = Name{Data: [nameLen]byte{'.'}, Length: 1} // RFC 6891 section 6.1.2
+       h.Type = TypeOPT
+       h.Class = Class(udpPayloadLen)
+       h.TTL = uint32(extRCode) >> 4 << 24
+       if dnssecOK {
+               h.TTL |= edns0DNSSECOK
+       }
+       return nil
+}
+
+// DNSSECAllowed reports whether the DNSSEC OK bit is set.
+func (h *ResourceHeader) DNSSECAllowed() bool {
+       return h.TTL&edns0DNSSECOKMask == edns0DNSSECOK // RFC 6891 section 6.1.3
+}
+
+// ExtendedRCode returns an extended RCode.
+//
+// The provided rcode must be the RCode in DNS message header.
+func (h *ResourceHeader) ExtendedRCode(rcode RCode) RCode {
+       if h.TTL&ednsVersionMask == edns0Version { // RFC 6891 section 6.1.3
+               return RCode(h.TTL>>24<<4) | rcode
+       }
+       return rcode
+}
+
+func skipResource(msg []byte, off int) (int, error) {
+       newOff, err := skipName(msg, off)
+       if err != nil {
+               return off, &nestedError{"Name", err}
+       }
+       if newOff, err = skipType(msg, newOff); err != nil {
+               return off, &nestedError{"Type", err}
+       }
+       if newOff, err = skipClass(msg, newOff); err != nil {
+               return off, &nestedError{"Class", err}
+       }
+       if newOff, err = skipUint32(msg, newOff); err != nil {
+               return off, &nestedError{"TTL", err}
+       }
+       length, newOff, err := unpackUint16(msg, newOff)
+       if err != nil {
+               return off, &nestedError{"Length", err}
+       }
+       if newOff += int(length); newOff > len(msg) {
+               return off, errResourceLen
+       }
+       return newOff, nil
+}
+
+// packUint16 appends the wire format of field to msg.
+func packUint16(msg []byte, field uint16) []byte {
+       return append(msg, byte(field>>8), byte(field))
+}
+
+func unpackUint16(msg []byte, off int) (uint16, int, error) {
+       if off+uint16Len > len(msg) {
+               return 0, off, errBaseLen
+       }
+       return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil
+}
+
+func skipUint16(msg []byte, off int) (int, error) {
+       if off+uint16Len > len(msg) {
+               return off, errBaseLen
+       }
+       return off + uint16Len, nil
+}
+
+// packType appends the wire format of field to msg.
+func packType(msg []byte, field Type) []byte {
+       return packUint16(msg, uint16(field))
+}
+
+func unpackType(msg []byte, off int) (Type, int, error) {
+       t, o, err := unpackUint16(msg, off)
+       return Type(t), o, err
+}
+
+func skipType(msg []byte, off int) (int, error) {
+       return skipUint16(msg, off)
+}
+
+// packClass appends the wire format of field to msg.
+func packClass(msg []byte, field Class) []byte {
+       return packUint16(msg, uint16(field))
+}
+
+func unpackClass(msg []byte, off int) (Class, int, error) {
+       c, o, err := unpackUint16(msg, off)
+       return Class(c), o, err
+}
+
+func skipClass(msg []byte, off int) (int, error) {
+       return skipUint16(msg, off)
+}
+
+// packUint32 appends the wire format of field to msg.
+func packUint32(msg []byte, field uint32) []byte {
+       return append(
+               msg,
+               byte(field>>24),
+               byte(field>>16),
+               byte(field>>8),
+               byte(field),
+       )
+}
+
+func unpackUint32(msg []byte, off int) (uint32, int, error) {
+       if off+uint32Len > len(msg) {
+               return 0, off, errBaseLen
+       }
+       v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3])
+       return v, off + uint32Len, nil
+}
+
+func skipUint32(msg []byte, off int) (int, error) {
+       if off+uint32Len > len(msg) {
+               return off, errBaseLen
+       }
+       return off + uint32Len, nil
+}
+
+// packText appends the wire format of field to msg.
+func packText(msg []byte, field string) ([]byte, error) {
+       l := len(field)
+       if l > 255 {
+               return nil, errStringTooLong
+       }
+       msg = append(msg, byte(l))
+       msg = append(msg, field...)
+
+       return msg, nil
+}
+
+func unpackText(msg []byte, off int) (string, int, error) {
+       if off >= len(msg) {
+               return "", off, errBaseLen
+       }
+       beginOff := off + 1
+       endOff := beginOff + int(msg[off])
+       if endOff > len(msg) {
+               return "", off, errCalcLen
+       }
+       return string(msg[beginOff:endOff]), endOff, nil
+}
+
+func skipText(msg []byte, off int) (int, error) {
+       if off >= len(msg) {
+               return off, errBaseLen
+       }
+       endOff := off + 1 + int(msg[off])
+       if endOff > len(msg) {
+               return off, errCalcLen
+       }
+       return endOff, nil
+}
+
+// packBytes appends the wire format of field to msg.
+func packBytes(msg []byte, field []byte) []byte {
+       return append(msg, field...)
+}
+
+func unpackBytes(msg []byte, off int, field []byte) (int, error) {
+       newOff := off + len(field)
+       if newOff > len(msg) {
+               return off, errBaseLen
+       }
+       copy(field, msg[off:newOff])
+       return newOff, nil
+}
+
+func skipBytes(msg []byte, off int, field []byte) (int, error) {
+       newOff := off + len(field)
+       if newOff > len(msg) {
+               return off, errBaseLen
+       }
+       return newOff, nil
+}
+
+const nameLen = 255
+
+// A Name is a non-encoded domain name. It is used instead of strings to avoid
+// allocations.
+type Name struct {
+       Data   [nameLen]byte
+       Length uint8
+}
+
+// NewName creates a new Name from a string.
+func NewName(name string) (Name, error) {
+       if len([]byte(name)) > nameLen {
+               return Name{}, errCalcLen
+       }
+       n := Name{Length: uint8(len(name))}
+       copy(n.Data[:], []byte(name))
+       return n, nil
+}
+
+// MustNewName creates a new Name from a string and panics on error.
+func MustNewName(name string) Name {
+       n, err := NewName(name)
+       if err != nil {
+               panic("creating name: " + err.Error())
+       }
+       return n
+}
+
+// String implements fmt.Stringer.String.
+func (n Name) String() string {
+       return string(n.Data[:n.Length])
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (n *Name) GoString() string {
+       return `dnsmessage.MustNewName("` + printString(n.Data[:n.Length]) + `")`
+}
+
+// pack appends the wire format of the Name to msg.
+//
+// Domain names are a sequence of counted strings split at the dots. They end
+// with a zero-length string. Compression can be used to reuse domain suffixes.
+//
+// The compression map will be updated with new domain suffixes. If compression
+// is nil, compression will not be used.
+func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       oldMsg := msg
+
+       // Add a trailing dot to canonicalize name.
+       if n.Length == 0 || n.Data[n.Length-1] != '.' {
+               return oldMsg, errNonCanonicalName
+       }
+
+       // Allow root domain.
+       if n.Data[0] == '.' && n.Length == 1 {
+               return append(msg, 0), nil
+       }
+
+       // Emit sequence of counted strings, chopping at dots.
+       for i, begin := 0, 0; i < int(n.Length); i++ {
+               // Check for the end of the segment.
+               if n.Data[i] == '.' {
+                       // The two most significant bits have special meaning.
+                       // It isn't allowed for segments to be long enough to
+                       // need them.
+                       if i-begin >= 1<<6 {
+                               return oldMsg, errSegTooLong
+                       }
+
+                       // Segments must have a non-zero length.
+                       if i-begin == 0 {
+                               return oldMsg, errZeroSegLen
+                       }
+
+                       msg = append(msg, byte(i-begin))
+
+                       for j := begin; j < i; j++ {
+                               msg = append(msg, n.Data[j])
+                       }
+
+                       begin = i + 1
+                       continue
+               }
+
+               // We can only compress domain suffixes starting with a new
+               // segment. A pointer is two bytes with the two most significant
+               // bits set to 1 to indicate that it is a pointer.
+               if (i == 0 || n.Data[i-1] == '.') && compression != nil {
+                       if ptr, ok := compression[string(n.Data[i:])]; ok {
+                               // Hit. Emit a pointer instead of the rest of
+                               // the domain.
+                               return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil
+                       }
+
+                       // Miss. Add the suffix to the compression table if the
+                       // offset can be stored in the available 14 bytes.
+                       if len(msg) <= int(^uint16(0)>>2) {
+                               compression[string(n.Data[i:])] = len(msg) - compressionOff
+                       }
+               }
+       }
+       return append(msg, 0), nil
+}
+
+// unpack unpacks a domain name.
+func (n *Name) unpack(msg []byte, off int) (int, error) {
+       return n.unpackCompressed(msg, off, true /* allowCompression */)
+}
+
+func (n *Name) unpackCompressed(msg []byte, off int, allowCompression bool) (int, error) {
+       // currOff is the current working offset.
+       currOff := off
+
+       // newOff is the offset where the next record will start. Pointers lead
+       // to data that belongs to other names and thus doesn't count towards to
+       // the usage of this name.
+       newOff := off
+
+       // ptr is the number of pointers followed.
+       var ptr int
+
+       // Name is a slice representation of the name data.
+       name := n.Data[:0]
+
+Loop:
+       for {
+               if currOff >= len(msg) {
+                       return off, errBaseLen
+               }
+               c := int(msg[currOff])
+               currOff++
+               switch c & 0xC0 {
+               case 0x00: // String segment
+                       if c == 0x00 {
+                               // A zero length signals the end of the name.
+                               break Loop
+                       }
+                       endOff := currOff + c
+                       if endOff > len(msg) {
+                               return off, errCalcLen
+                       }
+                       name = append(name, msg[currOff:endOff]...)
+                       name = append(name, '.')
+                       currOff = endOff
+               case 0xC0: // Pointer
+                       if !allowCompression {
+                               return off, errCompressedSRV
+                       }
+                       if currOff >= len(msg) {
+                               return off, errInvalidPtr
+                       }
+                       c1 := msg[currOff]
+                       currOff++
+                       if ptr == 0 {
+                               newOff = currOff
+                       }
+                       // Don't follow too many pointers, maybe there's a loop.
+                       if ptr++; ptr > 10 {
+                               return off, errTooManyPtr
+                       }
+                       currOff = (c^0xC0)<<8 | int(c1)
+               default:
+                       // Prefixes 0x80 and 0x40 are reserved.
+                       return off, errReserved
+               }
+       }
+       if len(name) == 0 {
+               name = append(name, '.')
+       }
+       if len(name) > len(n.Data) {
+               return off, errCalcLen
+       }
+       n.Length = uint8(len(name))
+       if ptr == 0 {
+               newOff = currOff
+       }
+       return newOff, nil
+}
+
+func skipName(msg []byte, off int) (int, error) {
+       // newOff is the offset where the next record will start. Pointers lead
+       // to data that belongs to other names and thus doesn't count towards to
+       // the usage of this name.
+       newOff := off
+
+Loop:
+       for {
+               if newOff >= len(msg) {
+                       return off, errBaseLen
+               }
+               c := int(msg[newOff])
+               newOff++
+               switch c & 0xC0 {
+               case 0x00:
+                       if c == 0x00 {
+                               // A zero length signals the end of the name.
+                               break Loop
+                       }
+                       // literal string
+                       newOff += c
+                       if newOff > len(msg) {
+                               return off, errCalcLen
+                       }
+               case 0xC0:
+                       // Pointer to somewhere else in msg.
+
+                       // Pointers are two bytes.
+                       newOff++
+
+                       // Don't follow the pointer as the data here has ended.
+                       break Loop
+               default:
+                       // Prefixes 0x80 and 0x40 are reserved.
+                       return off, errReserved
+               }
+       }
+
+       return newOff, nil
+}
+
+// A Question is a DNS query.
+type Question struct {
+       Name  Name
+       Type  Type
+       Class Class
+}
+
+// pack appends the wire format of the Question to msg.
+func (q *Question) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       msg, err := q.Name.pack(msg, compression, compressionOff)
+       if err != nil {
+               return msg, &nestedError{"Name", err}
+       }
+       msg = packType(msg, q.Type)
+       return packClass(msg, q.Class), nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (q *Question) GoString() string {
+       return "dnsmessage.Question{" +
+               "Name: " + q.Name.GoString() + ", " +
+               "Type: " + q.Type.GoString() + ", " +
+               "Class: " + q.Class.GoString() + "}"
+}
+
+func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) {
+       var (
+               r    ResourceBody
+               err  error
+               name string
+       )
+       switch hdr.Type {
+       case TypeA:
+               var rb AResource
+               rb, err = unpackAResource(msg, off)
+               r = &rb
+               name = "A"
+       case TypeNS:
+               var rb NSResource
+               rb, err = unpackNSResource(msg, off)
+               r = &rb
+               name = "NS"
+       case TypeCNAME:
+               var rb CNAMEResource
+               rb, err = unpackCNAMEResource(msg, off)
+               r = &rb
+               name = "CNAME"
+       case TypeSOA:
+               var rb SOAResource
+               rb, err = unpackSOAResource(msg, off)
+               r = &rb
+               name = "SOA"
+       case TypePTR:
+               var rb PTRResource
+               rb, err = unpackPTRResource(msg, off)
+               r = &rb
+               name = "PTR"
+       case TypeMX:
+               var rb MXResource
+               rb, err = unpackMXResource(msg, off)
+               r = &rb
+               name = "MX"
+       case TypeTXT:
+               var rb TXTResource
+               rb, err = unpackTXTResource(msg, off, hdr.Length)
+               r = &rb
+               name = "TXT"
+       case TypeAAAA:
+               var rb AAAAResource
+               rb, err = unpackAAAAResource(msg, off)
+               r = &rb
+               name = "AAAA"
+       case TypeSRV:
+               var rb SRVResource
+               rb, err = unpackSRVResource(msg, off)
+               r = &rb
+               name = "SRV"
+       case TypeOPT:
+               var rb OPTResource
+               rb, err = unpackOPTResource(msg, off, hdr.Length)
+               r = &rb
+               name = "OPT"
+       }
+       if err != nil {
+               return nil, off, &nestedError{name + " record", err}
+       }
+       if r == nil {
+               return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0'))
+       }
+       return r, off + int(hdr.Length), nil
+}
+
+// A CNAMEResource is a CNAME Resource record.
+type CNAMEResource struct {
+       CNAME Name
+}
+
+func (r *CNAMEResource) realType() Type {
+       return TypeCNAME
+}
+
+// pack appends the wire format of the CNAMEResource to msg.
+func (r *CNAMEResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       return r.CNAME.pack(msg, compression, compressionOff)
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *CNAMEResource) GoString() string {
+       return "dnsmessage.CNAMEResource{CNAME: " + r.CNAME.GoString() + "}"
+}
+
+func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) {
+       var cname Name
+       if _, err := cname.unpack(msg, off); err != nil {
+               return CNAMEResource{}, err
+       }
+       return CNAMEResource{cname}, nil
+}
+
+// An MXResource is an MX Resource record.
+type MXResource struct {
+       Pref uint16
+       MX   Name
+}
+
+func (r *MXResource) realType() Type {
+       return TypeMX
+}
+
+// pack appends the wire format of the MXResource to msg.
+func (r *MXResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       oldMsg := msg
+       msg = packUint16(msg, r.Pref)
+       msg, err := r.MX.pack(msg, compression, compressionOff)
+       if err != nil {
+               return oldMsg, &nestedError{"MXResource.MX", err}
+       }
+       return msg, nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *MXResource) GoString() string {
+       return "dnsmessage.MXResource{" +
+               "Pref: " + printUint16(r.Pref) + ", " +
+               "MX: " + r.MX.GoString() + "}"
+}
+
+func unpackMXResource(msg []byte, off int) (MXResource, error) {
+       pref, off, err := unpackUint16(msg, off)
+       if err != nil {
+               return MXResource{}, &nestedError{"Pref", err}
+       }
+       var mx Name
+       if _, err := mx.unpack(msg, off); err != nil {
+               return MXResource{}, &nestedError{"MX", err}
+       }
+       return MXResource{pref, mx}, nil
+}
+
+// An NSResource is an NS Resource record.
+type NSResource struct {
+       NS Name
+}
+
+func (r *NSResource) realType() Type {
+       return TypeNS
+}
+
+// pack appends the wire format of the NSResource to msg.
+func (r *NSResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       return r.NS.pack(msg, compression, compressionOff)
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *NSResource) GoString() string {
+       return "dnsmessage.NSResource{NS: " + r.NS.GoString() + "}"
+}
+
+func unpackNSResource(msg []byte, off int) (NSResource, error) {
+       var ns Name
+       if _, err := ns.unpack(msg, off); err != nil {
+               return NSResource{}, err
+       }
+       return NSResource{ns}, nil
+}
+
+// A PTRResource is a PTR Resource record.
+type PTRResource struct {
+       PTR Name
+}
+
+func (r *PTRResource) realType() Type {
+       return TypePTR
+}
+
+// pack appends the wire format of the PTRResource to msg.
+func (r *PTRResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       return r.PTR.pack(msg, compression, compressionOff)
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *PTRResource) GoString() string {
+       return "dnsmessage.PTRResource{PTR: " + r.PTR.GoString() + "}"
+}
+
+func unpackPTRResource(msg []byte, off int) (PTRResource, error) {
+       var ptr Name
+       if _, err := ptr.unpack(msg, off); err != nil {
+               return PTRResource{}, err
+       }
+       return PTRResource{ptr}, nil
+}
+
+// An SOAResource is an SOA Resource record.
+type SOAResource struct {
+       NS      Name
+       MBox    Name
+       Serial  uint32
+       Refresh uint32
+       Retry   uint32
+       Expire  uint32
+
+       // MinTTL the is the default TTL of Resources records which did not
+       // contain a TTL value and the TTL of negative responses. (RFC 2308
+       // Section 4)
+       MinTTL uint32
+}
+
+func (r *SOAResource) realType() Type {
+       return TypeSOA
+}
+
+// pack appends the wire format of the SOAResource to msg.
+func (r *SOAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       oldMsg := msg
+       msg, err := r.NS.pack(msg, compression, compressionOff)
+       if err != nil {
+               return oldMsg, &nestedError{"SOAResource.NS", err}
+       }
+       msg, err = r.MBox.pack(msg, compression, compressionOff)
+       if err != nil {
+               return oldMsg, &nestedError{"SOAResource.MBox", err}
+       }
+       msg = packUint32(msg, r.Serial)
+       msg = packUint32(msg, r.Refresh)
+       msg = packUint32(msg, r.Retry)
+       msg = packUint32(msg, r.Expire)
+       return packUint32(msg, r.MinTTL), nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *SOAResource) GoString() string {
+       return "dnsmessage.SOAResource{" +
+               "NS: " + r.NS.GoString() + ", " +
+               "MBox: " + r.MBox.GoString() + ", " +
+               "Serial: " + printUint32(r.Serial) + ", " +
+               "Refresh: " + printUint32(r.Refresh) + ", " +
+               "Retry: " + printUint32(r.Retry) + ", " +
+               "Expire: " + printUint32(r.Expire) + ", " +
+               "MinTTL: " + printUint32(r.MinTTL) + "}"
+}
+
+func unpackSOAResource(msg []byte, off int) (SOAResource, error) {
+       var ns Name
+       off, err := ns.unpack(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"NS", err}
+       }
+       var mbox Name
+       if off, err = mbox.unpack(msg, off); err != nil {
+               return SOAResource{}, &nestedError{"MBox", err}
+       }
+       serial, off, err := unpackUint32(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"Serial", err}
+       }
+       refresh, off, err := unpackUint32(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"Refresh", err}
+       }
+       retry, off, err := unpackUint32(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"Retry", err}
+       }
+       expire, off, err := unpackUint32(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"Expire", err}
+       }
+       minTTL, _, err := unpackUint32(msg, off)
+       if err != nil {
+               return SOAResource{}, &nestedError{"MinTTL", err}
+       }
+       return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil
+}
+
+// A TXTResource is a TXT Resource record.
+type TXTResource struct {
+       TXT []string
+}
+
+func (r *TXTResource) realType() Type {
+       return TypeTXT
+}
+
+// pack appends the wire format of the TXTResource to msg.
+func (r *TXTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       oldMsg := msg
+       for _, s := range r.TXT {
+               var err error
+               msg, err = packText(msg, s)
+               if err != nil {
+                       return oldMsg, err
+               }
+       }
+       return msg, nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *TXTResource) GoString() string {
+       s := "dnsmessage.TXTResource{TXT: []string{"
+       if len(r.TXT) == 0 {
+               return s + "}}"
+       }
+       s += `"` + printString([]byte(r.TXT[0]))
+       for _, t := range r.TXT[1:] {
+               s += `", "` + printString([]byte(t))
+       }
+       return s + `"}}`
+}
+
+func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) {
+       txts := make([]string, 0, 1)
+       for n := uint16(0); n < length; {
+               var t string
+               var err error
+               if t, off, err = unpackText(msg, off); err != nil {
+                       return TXTResource{}, &nestedError{"text", err}
+               }
+               // Check if we got too many bytes.
+               if length-n < uint16(len(t))+1 {
+                       return TXTResource{}, errCalcLen
+               }
+               n += uint16(len(t)) + 1
+               txts = append(txts, t)
+       }
+       return TXTResource{txts}, nil
+}
+
+// An SRVResource is an SRV Resource record.
+type SRVResource struct {
+       Priority uint16
+       Weight   uint16
+       Port     uint16
+       Target   Name // Not compressed as per RFC 2782.
+}
+
+func (r *SRVResource) realType() Type {
+       return TypeSRV
+}
+
+// pack appends the wire format of the SRVResource to msg.
+func (r *SRVResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       oldMsg := msg
+       msg = packUint16(msg, r.Priority)
+       msg = packUint16(msg, r.Weight)
+       msg = packUint16(msg, r.Port)
+       msg, err := r.Target.pack(msg, nil, compressionOff)
+       if err != nil {
+               return oldMsg, &nestedError{"SRVResource.Target", err}
+       }
+       return msg, nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *SRVResource) GoString() string {
+       return "dnsmessage.SRVResource{" +
+               "Priority: " + printUint16(r.Priority) + ", " +
+               "Weight: " + printUint16(r.Weight) + ", " +
+               "Port: " + printUint16(r.Port) + ", " +
+               "Target: " + r.Target.GoString() + "}"
+}
+
+func unpackSRVResource(msg []byte, off int) (SRVResource, error) {
+       priority, off, err := unpackUint16(msg, off)
+       if err != nil {
+               return SRVResource{}, &nestedError{"Priority", err}
+       }
+       weight, off, err := unpackUint16(msg, off)
+       if err != nil {
+               return SRVResource{}, &nestedError{"Weight", err}
+       }
+       port, off, err := unpackUint16(msg, off)
+       if err != nil {
+               return SRVResource{}, &nestedError{"Port", err}
+       }
+       var target Name
+       if _, err := target.unpackCompressed(msg, off, false /* allowCompression */); err != nil {
+               return SRVResource{}, &nestedError{"Target", err}
+       }
+       return SRVResource{priority, weight, port, target}, nil
+}
+
+// An AResource is an A Resource record.
+type AResource struct {
+       A [4]byte
+}
+
+func (r *AResource) realType() Type {
+       return TypeA
+}
+
+// pack appends the wire format of the AResource to msg.
+func (r *AResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       return packBytes(msg, r.A[:]), nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *AResource) GoString() string {
+       return "dnsmessage.AResource{" +
+               "A: [4]byte{" + printByteSlice(r.A[:]) + "}}"
+}
+
+func unpackAResource(msg []byte, off int) (AResource, error) {
+       var a [4]byte
+       if _, err := unpackBytes(msg, off, a[:]); err != nil {
+               return AResource{}, err
+       }
+       return AResource{a}, nil
+}
+
+// An AAAAResource is an AAAA Resource record.
+type AAAAResource struct {
+       AAAA [16]byte
+}
+
+func (r *AAAAResource) realType() Type {
+       return TypeAAAA
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *AAAAResource) GoString() string {
+       return "dnsmessage.AAAAResource{" +
+               "AAAA: [16]byte{" + printByteSlice(r.AAAA[:]) + "}}"
+}
+
+// pack appends the wire format of the AAAAResource to msg.
+func (r *AAAAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       return packBytes(msg, r.AAAA[:]), nil
+}
+
+func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) {
+       var aaaa [16]byte
+       if _, err := unpackBytes(msg, off, aaaa[:]); err != nil {
+               return AAAAResource{}, err
+       }
+       return AAAAResource{aaaa}, nil
+}
+
+// An OPTResource is an OPT pseudo Resource record.
+//
+// The pseudo resource record is part of the extension mechanisms for DNS
+// as defined in RFC 6891.
+type OPTResource struct {
+       Options []Option
+}
+
+// An Option represents a DNS message option within OPTResource.
+//
+// The message option is part of the extension mechanisms for DNS as
+// defined in RFC 6891.
+type Option struct {
+       Code uint16 // option code
+       Data []byte
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (o *Option) GoString() string {
+       return "dnsmessage.Option{" +
+               "Code: " + printUint16(o.Code) + ", " +
+               "Data: []byte{" + printByteSlice(o.Data) + "}}"
+}
+
+func (r *OPTResource) realType() Type {
+       return TypeOPT
+}
+
+func (r *OPTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
+       for _, opt := range r.Options {
+               msg = packUint16(msg, opt.Code)
+               l := uint16(len(opt.Data))
+               msg = packUint16(msg, l)
+               msg = packBytes(msg, opt.Data)
+       }
+       return msg, nil
+}
+
+// GoString implements fmt.GoStringer.GoString.
+func (r *OPTResource) GoString() string {
+       s := "dnsmessage.OPTResource{Options: []dnsmessage.Option{"
+       if len(r.Options) == 0 {
+               return s + "}}"
+       }
+       s += r.Options[0].GoString()
+       for _, o := range r.Options[1:] {
+               s += ", " + o.GoString()
+       }
+       return s + "}}"
+}
+
+func unpackOPTResource(msg []byte, off int, length uint16) (OPTResource, error) {
+       var opts []Option
+       for oldOff := off; off < oldOff+int(length); {
+               var err error
+               var o Option
+               o.Code, off, err = unpackUint16(msg, off)
+               if err != nil {
+                       return OPTResource{}, &nestedError{"Code", err}
+               }
+               var l uint16
+               l, off, err = unpackUint16(msg, off)
+               if err != nil {
+                       return OPTResource{}, &nestedError{"Data", err}
+               }
+               o.Data = make([]byte, l)
+               if copy(o.Data, msg[off:]) != int(l) {
+                       return OPTResource{}, &nestedError{"Data", errCalcLen}
+               }
+               off += int(l)
+               opts = append(opts, o)
+       }
+       return OPTResource{opts}, nil
+}
diff --git a/libgo/go/golang.org/x/net/http/httpguts/guts.go b/libgo/go/golang.org/x/net/http/httpguts/guts.go
new file mode 100644 (file)
index 0000000..e6cd0ce
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package httpguts provides functions implementing various details
+// of the HTTP specification.
+//
+// This package is shared by the standard library (which vendors it)
+// and x/net/http2. It comes with no API stability promise.
+package httpguts
+
+import (
+       "net/textproto"
+       "strings"
+)
+
+// ValidTrailerHeader reports whether name is a valid header field name to appear
+// in trailers.
+// See RFC 7230, Section 4.1.2
+func ValidTrailerHeader(name string) bool {
+       name = textproto.CanonicalMIMEHeaderKey(name)
+       if strings.HasPrefix(name, "If-") || badTrailer[name] {
+               return false
+       }
+       return true
+}
+
+var badTrailer = map[string]bool{
+       "Authorization":       true,
+       "Cache-Control":       true,
+       "Connection":          true,
+       "Content-Encoding":    true,
+       "Content-Length":      true,
+       "Content-Range":       true,
+       "Content-Type":        true,
+       "Expect":              true,
+       "Host":                true,
+       "Keep-Alive":          true,
+       "Max-Forwards":        true,
+       "Pragma":              true,
+       "Proxy-Authenticate":  true,
+       "Proxy-Authorization": true,
+       "Proxy-Connection":    true,
+       "Range":               true,
+       "Realm":               true,
+       "Te":                  true,
+       "Trailer":             true,
+       "Transfer-Encoding":   true,
+       "Www-Authenticate":    true,
+}
diff --git a/libgo/go/golang.org/x/net/http/httpguts/httplex.go b/libgo/go/golang.org/x/net/http/httpguts/httplex.go
new file mode 100644 (file)
index 0000000..e7de24e
--- /dev/null
@@ -0,0 +1,346 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package httpguts
+
+import (
+       "net"
+       "strings"
+       "unicode/utf8"
+
+       "golang.org/x/net/idna"
+)
+
+var isTokenTable = [127]bool{
+       '!':  true,
+       '#':  true,
+       '$':  true,
+       '%':  true,
+       '&':  true,
+       '\'': true,
+       '*':  true,
+       '+':  true,
+       '-':  true,
+       '.':  true,
+       '0':  true,
+       '1':  true,
+       '2':  true,
+       '3':  true,
+       '4':  true,
+       '5':  true,
+       '6':  true,
+       '7':  true,
+       '8':  true,
+       '9':  true,
+       'A':  true,
+       'B':  true,
+       'C':  true,
+       'D':  true,
+       'E':  true,
+       'F':  true,
+       'G':  true,
+       'H':  true,
+       'I':  true,
+       'J':  true,
+       'K':  true,
+       'L':  true,
+       'M':  true,
+       'N':  true,
+       'O':  true,
+       'P':  true,
+       'Q':  true,
+       'R':  true,
+       'S':  true,
+       'T':  true,
+       'U':  true,
+       'W':  true,
+       'V':  true,
+       'X':  true,
+       'Y':  true,
+       'Z':  true,
+       '^':  true,
+       '_':  true,
+       '`':  true,
+       'a':  true,
+       'b':  true,
+       'c':  true,
+       'd':  true,
+       'e':  true,
+       'f':  true,
+       'g':  true,
+       'h':  true,
+       'i':  true,
+       'j':  true,
+       'k':  true,
+       'l':  true,
+       'm':  true,
+       'n':  true,
+       'o':  true,
+       'p':  true,
+       'q':  true,
+       'r':  true,
+       's':  true,
+       't':  true,
+       'u':  true,
+       'v':  true,
+       'w':  true,
+       'x':  true,
+       'y':  true,
+       'z':  true,
+       '|':  true,
+       '~':  true,
+}
+
+func IsTokenRune(r rune) bool {
+       i := int(r)
+       return i < len(isTokenTable) && isTokenTable[i]
+}
+
+func isNotToken(r rune) bool {
+       return !IsTokenRune(r)
+}
+
+// HeaderValuesContainsToken reports whether any string in values
+// contains the provided token, ASCII case-insensitively.
+func HeaderValuesContainsToken(values []string, token string) bool {
+       for _, v := range values {
+               if headerValueContainsToken(v, token) {
+                       return true
+               }
+       }
+       return false
+}
+
+// isOWS reports whether b is an optional whitespace byte, as defined
+// by RFC 7230 section 3.2.3.
+func isOWS(b byte) bool { return b == ' ' || b == '\t' }
+
+// trimOWS returns x with all optional whitespace removes from the
+// beginning and end.
+func trimOWS(x string) string {
+       // TODO: consider using strings.Trim(x, " \t") instead,
+       // if and when it's fast enough. See issue 10292.
+       // But this ASCII-only code will probably always beat UTF-8
+       // aware code.
+       for len(x) > 0 && isOWS(x[0]) {
+               x = x[1:]
+       }
+       for len(x) > 0 && isOWS(x[len(x)-1]) {
+               x = x[:len(x)-1]
+       }
+       return x
+}
+
+// headerValueContainsToken reports whether v (assumed to be a
+// 0#element, in the ABNF extension described in RFC 7230 section 7)
+// contains token amongst its comma-separated tokens, ASCII
+// case-insensitively.
+func headerValueContainsToken(v string, token string) bool {
+       v = trimOWS(v)
+       if comma := strings.IndexByte(v, ','); comma != -1 {
+               return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token)
+       }
+       return tokenEqual(v, token)
+}
+
+// lowerASCII returns the ASCII lowercase version of b.
+func lowerASCII(b byte) byte {
+       if 'A' <= b && b <= 'Z' {
+               return b + ('a' - 'A')
+       }
+       return b
+}
+
+// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively.
+func tokenEqual(t1, t2 string) bool {
+       if len(t1) != len(t2) {
+               return false
+       }
+       for i, b := range t1 {
+               if b >= utf8.RuneSelf {
+                       // No UTF-8 or non-ASCII allowed in tokens.
+                       return false
+               }
+               if lowerASCII(byte(b)) != lowerASCII(t2[i]) {
+                       return false
+               }
+       }
+       return true
+}
+
+// isLWS reports whether b is linear white space, according
+// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
+//      LWS            = [CRLF] 1*( SP | HT )
+func isLWS(b byte) bool { return b == ' ' || b == '\t' }
+
+// isCTL reports whether b is a control byte, according
+// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
+//      CTL            = <any US-ASCII control character
+//                       (octets 0 - 31) and DEL (127)>
+func isCTL(b byte) bool {
+       const del = 0x7f // a CTL
+       return b < ' ' || b == del
+}
+
+// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name.
+// HTTP/2 imposes the additional restriction that uppercase ASCII
+// letters are not allowed.
+//
+//  RFC 7230 says:
+//   header-field   = field-name ":" OWS field-value OWS
+//   field-name     = token
+//   token          = 1*tchar
+//   tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
+//           "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
+func ValidHeaderFieldName(v string) bool {
+       if len(v) == 0 {
+               return false
+       }
+       for _, r := range v {
+               if !IsTokenRune(r) {
+                       return false
+               }
+       }
+       return true
+}
+
+// ValidHostHeader reports whether h is a valid host header.
+func ValidHostHeader(h string) bool {
+       // The latest spec is actually this:
+       //
+       // http://tools.ietf.org/html/rfc7230#section-5.4
+       //     Host = uri-host [ ":" port ]
+       //
+       // Where uri-host is:
+       //     http://tools.ietf.org/html/rfc3986#section-3.2.2
+       //
+       // But we're going to be much more lenient for now and just
+       // search for any byte that's not a valid byte in any of those
+       // expressions.
+       for i := 0; i < len(h); i++ {
+               if !validHostByte[h[i]] {
+                       return false
+               }
+       }
+       return true
+}
+
+// See the validHostHeader comment.
+var validHostByte = [256]bool{
+       '0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true,
+       '8': true, '9': true,
+
+       'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true,
+       'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true,
+       'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true,
+       'y': true, 'z': true,
+
+       'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true,
+       'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true,
+       'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true,
+       'Y': true, 'Z': true,
+
+       '!':  true, // sub-delims
+       '$':  true, // sub-delims
+       '%':  true, // pct-encoded (and used in IPv6 zones)
+       '&':  true, // sub-delims
+       '(':  true, // sub-delims
+       ')':  true, // sub-delims
+       '*':  true, // sub-delims
+       '+':  true, // sub-delims
+       ',':  true, // sub-delims
+       '-':  true, // unreserved
+       '.':  true, // unreserved
+       ':':  true, // IPv6address + Host expression's optional port
+       ';':  true, // sub-delims
+       '=':  true, // sub-delims
+       '[':  true,
+       '\'': true, // sub-delims
+       ']':  true,
+       '_':  true, // unreserved
+       '~':  true, // unreserved
+}
+
+// ValidHeaderFieldValue reports whether v is a valid "field-value" according to
+// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 :
+//
+//        message-header = field-name ":" [ field-value ]
+//        field-value    = *( field-content | LWS )
+//        field-content  = <the OCTETs making up the field-value
+//                         and consisting of either *TEXT or combinations
+//                         of token, separators, and quoted-string>
+//
+// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 :
+//
+//        TEXT           = <any OCTET except CTLs,
+//                          but including LWS>
+//        LWS            = [CRLF] 1*( SP | HT )
+//        CTL            = <any US-ASCII control character
+//                         (octets 0 - 31) and DEL (127)>
+//
+// RFC 7230 says:
+//  field-value    = *( field-content / obs-fold )
+//  obj-fold       =  N/A to http2, and deprecated
+//  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
+//  field-vchar    = VCHAR / obs-text
+//  obs-text       = %x80-FF
+//  VCHAR          = "any visible [USASCII] character"
+//
+// http2 further says: "Similarly, HTTP/2 allows header field values
+// that are not valid. While most of the values that can be encoded
+// will not alter header field parsing, carriage return (CR, ASCII
+// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII
+// 0x0) might be exploited by an attacker if they are translated
+// verbatim. Any request or response that contains a character not
+// permitted in a header field value MUST be treated as malformed
+// (Section 8.1.2.6). Valid characters are defined by the
+// field-content ABNF rule in Section 3.2 of [RFC7230]."
+//
+// This function does not (yet?) properly handle the rejection of
+// strings that begin or end with SP or HTAB.
+func ValidHeaderFieldValue(v string) bool {
+       for i := 0; i < len(v); i++ {
+               b := v[i]
+               if isCTL(b) && !isLWS(b) {
+                       return false
+               }
+       }
+       return true
+}
+
+func isASCII(s string) bool {
+       for i := 0; i < len(s); i++ {
+               if s[i] >= utf8.RuneSelf {
+                       return false
+               }
+       }
+       return true
+}
+
+// PunycodeHostPort returns the IDNA Punycode version
+// of the provided "host" or "host:port" string.
+func PunycodeHostPort(v string) (string, error) {
+       if isASCII(v) {
+               return v, nil
+       }
+
+       host, port, err := net.SplitHostPort(v)
+       if err != nil {
+               // The input 'v' argument was just a "host" argument,
+               // without a port. This error should not be returned
+               // to the caller.
+               host = v
+               port = ""
+       }
+       host, err = idna.ToASCII(host)
+       if err != nil {
+               // Non-UTF-8? Not representable in Punycode, in any
+               // case.
+               return "", err
+       }
+       if port == "" {
+               return host, nil
+       }
+       return net.JoinHostPort(host, port), nil
+}
diff --git a/libgo/go/golang.org/x/net/http/httpproxy/proxy.go b/libgo/go/golang.org/x/net/http/httpproxy/proxy.go
new file mode 100644 (file)
index 0000000..163645b
--- /dev/null
@@ -0,0 +1,370 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package httpproxy provides support for HTTP proxy determination
+// based on environment variables, as provided by net/http's
+// ProxyFromEnvironment function.
+//
+// The API is not subject to the Go 1 compatibility promise and may change at
+// any time.
+package httpproxy
+
+import (
+       "errors"
+       "fmt"
+       "net"
+       "net/url"
+       "os"
+       "strings"
+       "unicode/utf8"
+
+       "golang.org/x/net/idna"
+)
+
+// Config holds configuration for HTTP proxy settings. See
+// FromEnvironment for details.
+type Config struct {
+       // HTTPProxy represents the value of the HTTP_PROXY or
+       // http_proxy environment variable. It will be used as the proxy
+       // URL for HTTP requests and HTTPS requests unless overridden by
+       // HTTPSProxy or NoProxy.
+       HTTPProxy string
+
+       // HTTPSProxy represents the HTTPS_PROXY or https_proxy
+       // environment variable. It will be used as the proxy URL for
+       // HTTPS requests unless overridden by NoProxy.
+       HTTPSProxy string
+
+       // NoProxy represents the NO_PROXY or no_proxy environment
+       // variable. It specifies a string that contains comma-separated values
+       // specifying hosts that should be excluded from proxying. Each value is
+       // represented by an IP address prefix (1.2.3.4), an IP address prefix in
+       // CIDR notation (1.2.3.4/8), a domain name, or a special DNS label (*).
+       // An IP address prefix and domain name can also include a literal port
+       // number (1.2.3.4:80).
+       // A domain name matches that name and all subdomains. A domain name with
+       // a leading "." matches subdomains only. For example "foo.com" matches
+       // "foo.com" and "bar.foo.com"; ".y.com" matches "x.y.com" but not "y.com".
+       // A single asterisk (*) indicates that no proxying should be done.
+       // A best effort is made to parse the string and errors are
+       // ignored.
+       NoProxy string
+
+       // CGI holds whether the current process is running
+       // as a CGI handler (FromEnvironment infers this from the
+       // presence of a REQUEST_METHOD environment variable).
+       // When this is set, ProxyForURL will return an error
+       // when HTTPProxy applies, because a client could be
+       // setting HTTP_PROXY maliciously. See https://golang.org/s/cgihttpproxy.
+       CGI bool
+}
+
+// config holds the parsed configuration for HTTP proxy settings.
+type config struct {
+       // Config represents the original configuration as defined above.
+       Config
+
+       // httpsProxy is the parsed URL of the HTTPSProxy if defined.
+       httpsProxy *url.URL
+
+       // httpProxy is the parsed URL of the HTTPProxy if defined.
+       httpProxy *url.URL
+
+       // ipMatchers represent all values in the NoProxy that are IP address
+       // prefixes or an IP address in CIDR notation.
+       ipMatchers []matcher
+
+       // domainMatchers represent all values in the NoProxy that are a domain
+       // name or hostname & domain name
+       domainMatchers []matcher
+}
+
+// FromEnvironment returns a Config instance populated from the
+// environment variables HTTP_PROXY, HTTPS_PROXY and NO_PROXY (or the
+// lowercase versions thereof). HTTPS_PROXY takes precedence over
+// HTTP_PROXY for https requests.
+//
+// The environment values may be either a complete URL or a
+// "host[:port]", in which case the "http" scheme is assumed. An error
+// is returned if the value is a different form.
+func FromEnvironment() *Config {
+       return &Config{
+               HTTPProxy:  getEnvAny("HTTP_PROXY", "http_proxy"),
+               HTTPSProxy: getEnvAny("HTTPS_PROXY", "https_proxy"),
+               NoProxy:    getEnvAny("NO_PROXY", "no_proxy"),
+               CGI:        os.Getenv("REQUEST_METHOD") != "",
+       }
+}
+
+func getEnvAny(names ...string) string {
+       for _, n := range names {
+               if val := os.Getenv(n); val != "" {
+                       return val
+               }
+       }
+       return ""
+}
+
+// ProxyFunc returns a function that determines the proxy URL to use for
+// a given request URL. Changing the contents of cfg will not affect
+// proxy functions created earlier.
+//
+// A nil URL and nil error are returned if no proxy is defined in the
+// environment, or a proxy should not be used for the given request, as
+// defined by NO_PROXY.
+//
+// As a special case, if req.URL.Host is "localhost" (with or without a
+// port number), then a nil URL and nil error will be returned.
+func (cfg *Config) ProxyFunc() func(reqURL *url.URL) (*url.URL, error) {
+       // Preprocess the Config settings for more efficient evaluation.
+       cfg1 := &config{
+               Config: *cfg,
+       }
+       cfg1.init()
+       return cfg1.proxyForURL
+}
+
+func (cfg *config) proxyForURL(reqURL *url.URL) (*url.URL, error) {
+       var proxy *url.URL
+       if reqURL.Scheme == "https" {
+               proxy = cfg.httpsProxy
+       }
+       if proxy == nil {
+               proxy = cfg.httpProxy
+               if proxy != nil && cfg.CGI {
+                       return nil, errors.New("refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy")
+               }
+       }
+       if proxy == nil {
+               return nil, nil
+       }
+       if !cfg.useProxy(canonicalAddr(reqURL)) {
+               return nil, nil
+       }
+
+       return proxy, nil
+}
+
+func parseProxy(proxy string) (*url.URL, error) {
+       if proxy == "" {
+               return nil, nil
+       }
+
+       proxyURL, err := url.Parse(proxy)
+       if err != nil ||
+               (proxyURL.Scheme != "http" &&
+                       proxyURL.Scheme != "https" &&
+                       proxyURL.Scheme != "socks5") {
+               // proxy was bogus. Try prepending "http://" to it and
+               // see if that parses correctly. If not, we fall
+               // through and complain about the original one.
+               if proxyURL, err := url.Parse("http://" + proxy); err == nil {
+                       return proxyURL, nil
+               }
+       }
+       if err != nil {
+               return nil, fmt.Errorf("invalid proxy address %q: %v", proxy, err)
+       }
+       return proxyURL, nil
+}
+
+// useProxy reports whether requests to addr should use a proxy,
+// according to the NO_PROXY or no_proxy environment variable.
+// addr is always a canonicalAddr with a host and port.
+func (cfg *config) useProxy(addr string) bool {
+       if len(addr) == 0 {
+               return true
+       }
+       host, port, err := net.SplitHostPort(addr)
+       if err != nil {
+               return false
+       }
+       if host == "localhost" {
+               return false
+       }
+       ip := net.ParseIP(host)
+       if ip != nil {
+               if ip.IsLoopback() {
+                       return false
+               }
+       }
+
+       addr = strings.ToLower(strings.TrimSpace(host))
+
+       if ip != nil {
+               for _, m := range cfg.ipMatchers {
+                       if m.match(addr, port, ip) {
+                               return false
+                       }
+               }
+       }
+       for _, m := range cfg.domainMatchers {
+               if m.match(addr, port, ip) {
+                       return false
+               }
+       }
+       return true
+}
+
+func (c *config) init() {
+       if parsed, err := parseProxy(c.HTTPProxy); err == nil {
+               c.httpProxy = parsed
+       }
+       if parsed, err := parseProxy(c.HTTPSProxy); err == nil {
+               c.httpsProxy = parsed
+       }
+
+       for _, p := range strings.Split(c.NoProxy, ",") {
+               p = strings.ToLower(strings.TrimSpace(p))
+               if len(p) == 0 {
+                       continue
+               }
+
+               if p == "*" {
+                       c.ipMatchers = []matcher{allMatch{}}
+                       c.domainMatchers = []matcher{allMatch{}}
+                       return
+               }
+
+               // IPv4/CIDR, IPv6/CIDR
+               if _, pnet, err := net.ParseCIDR(p); err == nil {
+                       c.ipMatchers = append(c.ipMatchers, cidrMatch{cidr: pnet})
+                       continue
+               }
+
+               // IPv4:port, [IPv6]:port
+               phost, pport, err := net.SplitHostPort(p)
+               if err == nil {
+                       if len(phost) == 0 {
+                               // There is no host part, likely the entry is malformed; ignore.
+                               continue
+                       }
+                       if phost[0] == '[' && phost[len(phost)-1] == ']' {
+                               phost = phost[1 : len(phost)-1]
+                       }
+               } else {
+                       phost = p
+               }
+               // IPv4, IPv6
+               if pip := net.ParseIP(phost); pip != nil {
+                       c.ipMatchers = append(c.ipMatchers, ipMatch{ip: pip, port: pport})
+                       continue
+               }
+
+               if len(phost) == 0 {
+                       // There is no host part, likely the entry is malformed; ignore.
+                       continue
+               }
+
+               // domain.com or domain.com:80
+               // foo.com matches bar.foo.com
+               // .domain.com or .domain.com:port
+               // *.domain.com or *.domain.com:port
+               if strings.HasPrefix(phost, "*.") {
+                       phost = phost[1:]
+               }
+               matchHost := false
+               if phost[0] != '.' {
+                       matchHost = true
+                       phost = "." + phost
+               }
+               c.domainMatchers = append(c.domainMatchers, domainMatch{host: phost, port: pport, matchHost: matchHost})
+       }
+}
+
+var portMap = map[string]string{
+       "http":   "80",
+       "https":  "443",
+       "socks5": "1080",
+}
+
+// canonicalAddr returns url.Host but always with a ":port" suffix
+func canonicalAddr(url *url.URL) string {
+       addr := url.Hostname()
+       if v, err := idnaASCII(addr); err == nil {
+               addr = v
+       }
+       port := url.Port()
+       if port == "" {
+               port = portMap[url.Scheme]
+       }
+       return net.JoinHostPort(addr, port)
+}
+
+// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
+// return true if the string includes a port.
+func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
+
+func idnaASCII(v string) (string, error) {
+       // TODO: Consider removing this check after verifying performance is okay.
+       // Right now punycode verification, length checks, context checks, and the
+       // permissible character tests are all omitted. It also prevents the ToASCII
+       // call from salvaging an invalid IDN, when possible. As a result it may be
+       // possible to have two IDNs that appear identical to the user where the
+       // ASCII-only version causes an error downstream whereas the non-ASCII
+       // version does not.
+       // Note that for correct ASCII IDNs ToASCII will only do considerably more
+       // work, but it will not cause an allocation.
+       if isASCII(v) {
+               return v, nil
+       }
+       return idna.Lookup.ToASCII(v)
+}
+
+func isASCII(s string) bool {
+       for i := 0; i < len(s); i++ {
+               if s[i] >= utf8.RuneSelf {
+                       return false
+               }
+       }
+       return true
+}
+
+// matcher represents the matching rule for a given value in the NO_PROXY list
+type matcher interface {
+       // match returns true if the host and optional port or ip and optional port
+       // are allowed
+       match(host, port string, ip net.IP) bool
+}
+
+// allMatch matches on all possible inputs
+type allMatch struct{}
+
+func (a allMatch) match(host, port string, ip net.IP) bool {
+       return true
+}
+
+type cidrMatch struct {
+       cidr *net.IPNet
+}
+
+func (m cidrMatch) match(host, port string, ip net.IP) bool {
+       return m.cidr.Contains(ip)
+}
+
+type ipMatch struct {
+       ip   net.IP
+       port string
+}
+
+func (m ipMatch) match(host, port string, ip net.IP) bool {
+       if m.ip.Equal(ip) {
+               return m.port == "" || m.port == port
+       }
+       return false
+}
+
+type domainMatch struct {
+       host string
+       port string
+
+       matchHost bool
+}
+
+func (m domainMatch) match(host, port string, ip net.IP) bool {
+       if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) {
+               return m.port == "" || m.port == port
+       }
+       return false
+}
diff --git a/libgo/go/golang.org/x/net/http2/hpack/encode.go b/libgo/go/golang.org/x/net/http2/hpack/encode.go
new file mode 100644 (file)
index 0000000..1565cf2
--- /dev/null
@@ -0,0 +1,240 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package hpack
+
+import (
+       "io"
+)
+
+const (
+       uint32Max              = ^uint32(0)
+       initialHeaderTableSize = 4096
+)
+
+type Encoder struct {
+       dynTab dynamicTable
+       // minSize is the minimum table size set by
+       // SetMaxDynamicTableSize after the previous Header Table Size
+       // Update.
+       minSize uint32
+       // maxSizeLimit is the maximum table size this encoder
+       // supports. This will protect the encoder from too large
+       // size.
+       maxSizeLimit uint32
+       // tableSizeUpdate indicates whether "Header Table Size
+       // Update" is required.
+       tableSizeUpdate bool
+       w               io.Writer
+       buf             []byte
+}
+
+// NewEncoder returns a new Encoder which performs HPACK encoding. An
+// encoded data is written to w.
+func NewEncoder(w io.Writer) *Encoder {
+       e := &Encoder{
+               minSize:         uint32Max,
+               maxSizeLimit:    initialHeaderTableSize,
+               tableSizeUpdate: false,
+               w:               w,
+       }
+       e.dynTab.table.init()
+       e.dynTab.setMaxSize(initialHeaderTableSize)
+       return e
+}
+
+// WriteField encodes f into a single Write to e's underlying Writer.
+// This function may also produce bytes for "Header Table Size Update"
+// if necessary. If produced, it is done before encoding f.
+func (e *Encoder) WriteField(f HeaderField) error {
+       e.buf = e.buf[:0]
+
+       if e.tableSizeUpdate {
+               e.tableSizeUpdate = false
+               if e.minSize < e.dynTab.maxSize {
+                       e.buf = appendTableSize(e.buf, e.minSize)
+               }
+               e.minSize = uint32Max
+               e.buf = appendTableSize(e.buf, e.dynTab.maxSize)
+       }
+
+       idx, nameValueMatch := e.searchTable(f)
+       if nameValueMatch {
+               e.buf = appendIndexed(e.buf, idx)
+       } else {
+               indexing := e.shouldIndex(f)
+               if indexing {
+                       e.dynTab.add(f)
+               }
+
+               if idx == 0 {
+                       e.buf = appendNewName(e.buf, f, indexing)
+               } else {
+                       e.buf = appendIndexedName(e.buf, f, idx, indexing)
+               }
+       }
+       n, err := e.w.Write(e.buf)
+       if err == nil && n != len(e.buf) {
+               err = io.ErrShortWrite
+       }
+       return err
+}
+
+// searchTable searches f in both stable and dynamic header tables.
+// The static header table is searched first. Only when there is no
+// exact match for both name and value, the dynamic header table is
+// then searched. If there is no match, i is 0. If both name and value
+// match, i is the matched index and nameValueMatch becomes true. If
+// only name matches, i points to that index and nameValueMatch
+// becomes false.
+func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) {
+       i, nameValueMatch = staticTable.search(f)
+       if nameValueMatch {
+               return i, true
+       }
+
+       j, nameValueMatch := e.dynTab.table.search(f)
+       if nameValueMatch || (i == 0 && j != 0) {
+               return j + uint64(staticTable.len()), nameValueMatch
+       }
+
+       return i, false
+}
+
+// SetMaxDynamicTableSize changes the dynamic header table size to v.
+// The actual size is bounded by the value passed to
+// SetMaxDynamicTableSizeLimit.
+func (e *Encoder) SetMaxDynamicTableSize(v uint32) {
+       if v > e.maxSizeLimit {
+               v = e.maxSizeLimit
+       }
+       if v < e.minSize {
+               e.minSize = v
+       }
+       e.tableSizeUpdate = true
+       e.dynTab.setMaxSize(v)
+}
+
+// SetMaxDynamicTableSizeLimit changes the maximum value that can be
+// specified in SetMaxDynamicTableSize to v. By default, it is set to
+// 4096, which is the same size of the default dynamic header table
+// size described in HPACK specification. If the current maximum
+// dynamic header table size is strictly greater than v, "Header Table
+// Size Update" will be done in the next WriteField call and the
+// maximum dynamic header table size is truncated to v.
+func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) {
+       e.maxSizeLimit = v
+       if e.dynTab.maxSize > v {
+               e.tableSizeUpdate = true
+               e.dynTab.setMaxSize(v)
+       }
+}
+
+// shouldIndex reports whether f should be indexed.
+func (e *Encoder) shouldIndex(f HeaderField) bool {
+       return !f.Sensitive && f.Size() <= e.dynTab.maxSize
+}
+
+// appendIndexed appends index i, as encoded in "Indexed Header Field"
+// representation, to dst and returns the extended buffer.
+func appendIndexed(dst []byte, i uint64) []byte {
+       first := len(dst)
+       dst = appendVarInt(dst, 7, i)
+       dst[first] |= 0x80
+       return dst
+}
+
+// appendNewName appends f, as encoded in one of "Literal Header field
+// - New Name" representation variants, to dst and returns the
+// extended buffer.
+//
+// If f.Sensitive is true, "Never Indexed" representation is used. If
+// f.Sensitive is false and indexing is true, "Inremental Indexing"
+// representation is used.
+func appendNewName(dst []byte, f HeaderField, indexing bool) []byte {
+       dst = append(dst, encodeTypeByte(indexing, f.Sensitive))
+       dst = appendHpackString(dst, f.Name)
+       return appendHpackString(dst, f.Value)
+}
+
+// appendIndexedName appends f and index i referring indexed name
+// entry, as encoded in one of "Literal Header field - Indexed Name"
+// representation variants, to dst and returns the extended buffer.
+//
+// If f.Sensitive is true, "Never Indexed" representation is used. If
+// f.Sensitive is false and indexing is true, "Incremental Indexing"
+// representation is used.
+func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte {
+       first := len(dst)
+       var n byte
+       if indexing {
+               n = 6
+       } else {
+               n = 4
+       }
+       dst = appendVarInt(dst, n, i)
+       dst[first] |= encodeTypeByte(indexing, f.Sensitive)
+       return appendHpackString(dst, f.Value)
+}
+
+// appendTableSize appends v, as encoded in "Header Table Size Update"
+// representation, to dst and returns the extended buffer.
+func appendTableSize(dst []byte, v uint32) []byte {
+       first := len(dst)
+       dst = appendVarInt(dst, 5, uint64(v))
+       dst[first] |= 0x20
+       return dst
+}
+
+// appendVarInt appends i, as encoded in variable integer form using n
+// bit prefix, to dst and returns the extended buffer.
+//
+// See
+// http://http2.github.io/http2-spec/compression.html#integer.representation
+func appendVarInt(dst []byte, n byte, i uint64) []byte {
+       k := uint64((1 << n) - 1)
+       if i < k {
+               return append(dst, byte(i))
+       }
+       dst = append(dst, byte(k))
+       i -= k
+       for ; i >= 128; i >>= 7 {
+               dst = append(dst, byte(0x80|(i&0x7f)))
+       }
+       return append(dst, byte(i))
+}
+
+// appendHpackString appends s, as encoded in "String Literal"
+// representation, to dst and returns the extended buffer.
+//
+// s will be encoded in Huffman codes only when it produces strictly
+// shorter byte string.
+func appendHpackString(dst []byte, s string) []byte {
+       huffmanLength := HuffmanEncodeLength(s)
+       if huffmanLength < uint64(len(s)) {
+               first := len(dst)
+               dst = appendVarInt(dst, 7, huffmanLength)
+               dst = AppendHuffmanString(dst, s)
+               dst[first] |= 0x80
+       } else {
+               dst = appendVarInt(dst, 7, uint64(len(s)))
+               dst = append(dst, s...)
+       }
+       return dst
+}
+
+// encodeTypeByte returns type byte. If sensitive is true, type byte
+// for "Never Indexed" representation is returned. If sensitive is
+// false and indexing is true, type byte for "Incremental Indexing"
+// representation is returned. Otherwise, type byte for "Without
+// Indexing" is returned.
+func encodeTypeByte(indexing, sensitive bool) byte {
+       if sensitive {
+               return 0x10
+       }
+       if indexing {
+               return 0x40
+       }
+       return 0
+}
diff --git a/libgo/go/golang.org/x/net/http2/hpack/hpack.go b/libgo/go/golang.org/x/net/http2/hpack/hpack.go
new file mode 100644 (file)
index 0000000..85f18a2
--- /dev/null
@@ -0,0 +1,504 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package hpack implements HPACK, a compression format for
+// efficiently representing HTTP header fields in the context of HTTP/2.
+//
+// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09
+package hpack
+
+import (
+       "bytes"
+       "errors"
+       "fmt"
+)
+
+// A DecodingError is something the spec defines as a decoding error.
+type DecodingError struct {
+       Err error
+}
+
+func (de DecodingError) Error() string {
+       return fmt.Sprintf("decoding error: %v", de.Err)
+}
+
+// An InvalidIndexError is returned when an encoder references a table
+// entry before the static table or after the end of the dynamic table.
+type InvalidIndexError int
+
+func (e InvalidIndexError) Error() string {
+       return fmt.Sprintf("invalid indexed representation index %d", int(e))
+}
+
+// A HeaderField is a name-value pair. Both the name and value are
+// treated as opaque sequences of octets.
+type HeaderField struct {
+       Name, Value string
+
+       // Sensitive means that this header field should never be
+       // indexed.
+       Sensitive bool
+}
+
+// IsPseudo reports whether the header field is an http2 pseudo header.
+// That is, it reports whether it starts with a colon.
+// It is not otherwise guaranteed to be a valid pseudo header field,
+// though.
+func (hf HeaderField) IsPseudo() bool {
+       return len(hf.Name) != 0 && hf.Name[0] == ':'
+}
+
+func (hf HeaderField) String() string {
+       var suffix string
+       if hf.Sensitive {
+               suffix = " (sensitive)"
+       }
+       return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix)
+}
+
+// Size returns the size of an entry per RFC 7541 section 4.1.
+func (hf HeaderField) Size() uint32 {
+       // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1
+       // "The size of the dynamic table is the sum of the size of
+       // its entries. The size of an entry is the sum of its name's
+       // length in octets (as defined in Section 5.2), its value's
+       // length in octets (see Section 5.2), plus 32.  The size of
+       // an entry is calculated using the length of the name and
+       // value without any Huffman encoding applied."
+
+       // This can overflow if somebody makes a large HeaderField
+       // Name and/or Value by hand, but we don't care, because that
+       // won't happen on the wire because the encoding doesn't allow
+       // it.
+       return uint32(len(hf.Name) + len(hf.Value) + 32)
+}
+
+// A Decoder is the decoding context for incremental processing of
+// header blocks.
+type Decoder struct {
+       dynTab dynamicTable
+       emit   func(f HeaderField)
+
+       emitEnabled bool // whether calls to emit are enabled
+       maxStrLen   int  // 0 means unlimited
+
+       // buf is the unparsed buffer. It's only written to
+       // saveBuf if it was truncated in the middle of a header
+       // block. Because it's usually not owned, we can only
+       // process it under Write.
+       buf []byte // not owned; only valid during Write
+
+       // saveBuf is previous data passed to Write which we weren't able
+       // to fully parse before. Unlike buf, we own this data.
+       saveBuf bytes.Buffer
+
+       firstField bool // processing the first field of the header block
+}
+
+// NewDecoder returns a new decoder with the provided maximum dynamic
+// table size. The emitFunc will be called for each valid field
+// parsed, in the same goroutine as calls to Write, before Write returns.
+func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder {
+       d := &Decoder{
+               emit:        emitFunc,
+               emitEnabled: true,
+               firstField:  true,
+       }
+       d.dynTab.table.init()
+       d.dynTab.allowedMaxSize = maxDynamicTableSize
+       d.dynTab.setMaxSize(maxDynamicTableSize)
+       return d
+}
+
+// ErrStringLength is returned by Decoder.Write when the max string length
+// (as configured by Decoder.SetMaxStringLength) would be violated.
+var ErrStringLength = errors.New("hpack: string too long")
+
+// SetMaxStringLength sets the maximum size of a HeaderField name or
+// value string. If a string exceeds this length (even after any
+// decompression), Write will return ErrStringLength.
+// A value of 0 means unlimited and is the default from NewDecoder.
+func (d *Decoder) SetMaxStringLength(n int) {
+       d.maxStrLen = n
+}
+
+// SetEmitFunc changes the callback used when new header fields
+// are decoded.
+// It must be non-nil. It does not affect EmitEnabled.
+func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) {
+       d.emit = emitFunc
+}
+
+// SetEmitEnabled controls whether the emitFunc provided to NewDecoder
+// should be called. The default is true.
+//
+// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE
+// while still decoding and keeping in-sync with decoder state, but
+// without doing unnecessary decompression or generating unnecessary
+// garbage for header fields past the limit.
+func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v }
+
+// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder
+// are currently enabled. The default is true.
+func (d *Decoder) EmitEnabled() bool { return d.emitEnabled }
+
+// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their
+// underlying buffers for garbage reasons.
+
+func (d *Decoder) SetMaxDynamicTableSize(v uint32) {
+       d.dynTab.setMaxSize(v)
+}
+
+// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded
+// stream (via dynamic table size updates) may set the maximum size
+// to.
+func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) {
+       d.dynTab.allowedMaxSize = v
+}
+
+type dynamicTable struct {
+       // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2
+       table          headerFieldTable
+       size           uint32 // in bytes
+       maxSize        uint32 // current maxSize
+       allowedMaxSize uint32 // maxSize may go up to this, inclusive
+}
+
+func (dt *dynamicTable) setMaxSize(v uint32) {
+       dt.maxSize = v
+       dt.evict()
+}
+
+func (dt *dynamicTable) add(f HeaderField) {
+       dt.table.addEntry(f)
+       dt.size += f.Size()
+       dt.evict()
+}
+
+// If we're too big, evict old stuff.
+func (dt *dynamicTable) evict() {
+       var n int
+       for dt.size > dt.maxSize && n < dt.table.len() {
+               dt.size -= dt.table.ents[n].Size()
+               n++
+       }
+       dt.table.evictOldest(n)
+}
+
+func (d *Decoder) maxTableIndex() int {
+       // This should never overflow. RFC 7540 Section 6.5.2 limits the size of
+       // the dynamic table to 2^32 bytes, where each entry will occupy more than
+       // one byte. Further, the staticTable has a fixed, small length.
+       return d.dynTab.table.len() + staticTable.len()
+}
+
+func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) {
+       // See Section 2.3.3.
+       if i == 0 {
+               return
+       }
+       if i <= uint64(staticTable.len()) {
+               return staticTable.ents[i-1], true
+       }
+       if i > uint64(d.maxTableIndex()) {
+               return
+       }
+       // In the dynamic table, newer entries have lower indices.
+       // However, dt.ents[0] is the oldest entry. Hence, dt.ents is
+       // the reversed dynamic table.
+       dt := d.dynTab.table
+       return dt.ents[dt.len()-(int(i)-staticTable.len())], true
+}
+
+// Decode decodes an entire block.
+//
+// TODO: remove this method and make it incremental later? This is
+// easier for debugging now.
+func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
+       var hf []HeaderField
+       saveFunc := d.emit
+       defer func() { d.emit = saveFunc }()
+       d.emit = func(f HeaderField) { hf = append(hf, f) }
+       if _, err := d.Write(p); err != nil {
+               return nil, err
+       }
+       if err := d.Close(); err != nil {
+               return nil, err
+       }
+       return hf, nil
+}
+
+// Close declares that the decoding is complete and resets the Decoder
+// to be reused again for a new header block. If there is any remaining
+// data in the decoder's buffer, Close returns an error.
+func (d *Decoder) Close() error {
+       if d.saveBuf.Len() > 0 {
+               d.saveBuf.Reset()
+               return DecodingError{errors.New("truncated headers")}
+       }
+       d.firstField = true
+       return nil
+}
+
+func (d *Decoder) Write(p []byte) (n int, err error) {
+       if len(p) == 0 {
+               // Prevent state machine CPU attacks (making us redo
+               // work up to the point of finding out we don't have
+               // enough data)
+               return
+       }
+       // Only copy the data if we have to. Optimistically assume
+       // that p will contain a complete header block.
+       if d.saveBuf.Len() == 0 {
+               d.buf = p
+       } else {
+               d.saveBuf.Write(p)
+               d.buf = d.saveBuf.Bytes()
+               d.saveBuf.Reset()
+       }
+
+       for len(d.buf) > 0 {
+               err = d.parseHeaderFieldRepr()
+               if err == errNeedMore {
+                       // Extra paranoia, making sure saveBuf won't
+                       // get too large. All the varint and string
+                       // reading code earlier should already catch
+                       // overlong things and return ErrStringLength,
+                       // but keep this as a last resort.
+                       const varIntOverhead = 8 // conservative
+                       if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) {
+                               return 0, ErrStringLength
+                       }
+                       d.saveBuf.Write(d.buf)
+                       return len(p), nil
+               }
+               d.firstField = false
+               if err != nil {
+                       break
+               }
+       }
+       return len(p), err
+}
+
+// errNeedMore is an internal sentinel error value that means the
+// buffer is truncated and we need to read more data before we can
+// continue parsing.
+var errNeedMore = errors.New("need more data")
+
+type indexType int
+
+const (
+       indexedTrue indexType = iota
+       indexedFalse
+       indexedNever
+)
+
+func (v indexType) indexed() bool   { return v == indexedTrue }
+func (v indexType) sensitive() bool { return v == indexedNever }
+
+// returns errNeedMore if there isn't enough data available.
+// any other error is fatal.
+// consumes d.buf iff it returns nil.
+// precondition: must be called with len(d.buf) > 0
+func (d *Decoder) parseHeaderFieldRepr() error {
+       b := d.buf[0]
+       switch {
+       case b&128 != 0:
+               // Indexed representation.
+               // High bit set?
+               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1
+               return d.parseFieldIndexed()
+       case b&192 == 64:
+               // 6.2.1 Literal Header Field with Incremental Indexing
+               // 0b10xxxxxx: top two bits are 10
+               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1
+               return d.parseFieldLiteral(6, indexedTrue)
+       case b&240 == 0:
+               // 6.2.2 Literal Header Field without Indexing
+               // 0b0000xxxx: top four bits are 0000
+               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2
+               return d.parseFieldLiteral(4, indexedFalse)
+       case b&240 == 16:
+               // 6.2.3 Literal Header Field never Indexed
+               // 0b0001xxxx: top four bits are 0001
+               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3
+               return d.parseFieldLiteral(4, indexedNever)
+       case b&224 == 32:
+               // 6.3 Dynamic Table Size Update
+               // Top three bits are '001'.
+               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3
+               return d.parseDynamicTableSizeUpdate()
+       }
+
+       return DecodingError{errors.New("invalid encoding")}
+}
+
+// (same invariants and behavior as parseHeaderFieldRepr)
+func (d *Decoder) parseFieldIndexed() error {
+       buf := d.buf
+       idx, buf, err := readVarInt(7, buf)
+       if err != nil {
+               return err
+       }
+       hf, ok := d.at(idx)
+       if !ok {
+               return DecodingError{InvalidIndexError(idx)}
+       }
+       d.buf = buf
+       return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value})
+}
+
+// (same invariants and behavior as parseHeaderFieldRepr)
+func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error {
+       buf := d.buf
+       nameIdx, buf, err := readVarInt(n, buf)
+       if err != nil {
+               return err
+       }
+
+       var hf HeaderField
+       wantStr := d.emitEnabled || it.indexed()
+       if nameIdx > 0 {
+               ihf, ok := d.at(nameIdx)
+               if !ok {
+                       return DecodingError{InvalidIndexError(nameIdx)}
+               }
+               hf.Name = ihf.Name
+       } else {
+               hf.Name, buf, err = d.readString(buf, wantStr)
+               if err != nil {
+                       return err
+               }
+       }
+       hf.Value, buf, err = d.readString(buf, wantStr)
+       if err != nil {
+               return err
+       }
+       d.buf = buf
+       if it.indexed() {
+               d.dynTab.add(hf)
+       }
+       hf.Sensitive = it.sensitive()
+       return d.callEmit(hf)
+}
+
+func (d *Decoder) callEmit(hf HeaderField) error {
+       if d.maxStrLen != 0 {
+               if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen {
+                       return ErrStringLength
+               }
+       }
+       if d.emitEnabled {
+               d.emit(hf)
+       }
+       return nil
+}
+
+// (same invariants and behavior as parseHeaderFieldRepr)
+func (d *Decoder) parseDynamicTableSizeUpdate() error {
+       // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
+       // beginning of the first header block following the change to the dynamic table size.
+       if !d.firstField && d.dynTab.size > 0 {
+               return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
+       }
+
+       buf := d.buf
+       size, buf, err := readVarInt(5, buf)
+       if err != nil {
+               return err
+       }
+       if size > uint64(d.dynTab.allowedMaxSize) {
+               return DecodingError{errors.New("dynamic table size update too large")}
+       }
+       d.dynTab.setMaxSize(uint32(size))
+       d.buf = buf
+       return nil
+}
+
+var errVarintOverflow = DecodingError{errors.New("varint integer overflow")}
+
+// readVarInt reads an unsigned variable length integer off the
+// beginning of p. n is the parameter as described in
+// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1.
+//
+// n must always be between 1 and 8.
+//
+// The returned remain buffer is either a smaller suffix of p, or err != nil.
+// The error is errNeedMore if p doesn't contain a complete integer.
+func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) {
+       if n < 1 || n > 8 {
+               panic("bad n")
+       }
+       if len(p) == 0 {
+               return 0, p, errNeedMore
+       }
+       i = uint64(p[0])
+       if n < 8 {
+               i &= (1 << uint64(n)) - 1
+       }
+       if i < (1<<uint64(n))-1 {
+               return i, p[1:], nil
+       }
+
+       origP := p
+       p = p[1:]
+       var m uint64
+       for len(p) > 0 {
+               b := p[0]
+               p = p[1:]
+               i += uint64(b&127) << m
+               if b&128 == 0 {
+                       return i, p, nil
+               }
+               m += 7
+               if m >= 63 { // TODO: proper overflow check. making this up.
+                       return 0, origP, errVarintOverflow
+               }
+       }
+       return 0, origP, errNeedMore
+}
+
+// readString decodes an hpack string from p.
+//
+// wantStr is whether s will be used. If false, decompression and
+// []byte->string garbage are skipped if s will be ignored
+// anyway. This does mean that huffman decoding errors for non-indexed
+// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server
+// is returning an error anyway, and because they're not indexed, the error
+// won't affect the decoding state.
+func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) {
+       if len(p) == 0 {
+               return "", p, errNeedMore
+       }
+       isHuff := p[0]&128 != 0
+       strLen, p, err := readVarInt(7, p)
+       if err != nil {
+               return "", p, err
+       }
+       if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) {
+               return "", nil, ErrStringLength
+       }
+       if uint64(len(p)) < strLen {
+               return "", p, errNeedMore
+       }
+       if !isHuff {
+               if wantStr {
+                       s = string(p[:strLen])
+               }
+               return s, p[strLen:], nil
+       }
+
+       if wantStr {
+               buf := bufPool.Get().(*bytes.Buffer)
+               buf.Reset() // don't trust others
+               defer bufPool.Put(buf)
+               if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil {
+                       buf.Reset()
+                       return "", nil, err
+               }
+               s = buf.String()
+               buf.Reset() // be nice to GC
+       }
+       return s, p[strLen:], nil
+}
diff --git a/libgo/go/golang.org/x/net/http2/hpack/huffman.go b/libgo/go/golang.org/x/net/http2/hpack/huffman.go
new file mode 100644 (file)
index 0000000..b412a96
--- /dev/null
@@ -0,0 +1,222 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package hpack
+
+import (
+       "bytes"
+       "errors"
+       "io"
+       "sync"
+)
+
+var bufPool = sync.Pool{
+       New: func() interface{} { return new(bytes.Buffer) },
+}
+
+// HuffmanDecode decodes the string in v and writes the expanded
+// result to w, returning the number of bytes written to w and the
+// Write call's return value. At most one Write call is made.
+func HuffmanDecode(w io.Writer, v []byte) (int, error) {
+       buf := bufPool.Get().(*bytes.Buffer)
+       buf.Reset()
+       defer bufPool.Put(buf)
+       if err := huffmanDecode(buf, 0, v); err != nil {
+               return 0, err
+       }
+       return w.Write(buf.Bytes())
+}
+
+// HuffmanDecodeToString decodes the string in v.
+func HuffmanDecodeToString(v []byte) (string, error) {
+       buf := bufPool.Get().(*bytes.Buffer)
+       buf.Reset()
+       defer bufPool.Put(buf)
+       if err := huffmanDecode(buf, 0, v); err != nil {
+               return "", err
+       }
+       return buf.String(), nil
+}
+
+// ErrInvalidHuffman is returned for errors found decoding
+// Huffman-encoded strings.
+var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data")
+
+// huffmanDecode decodes v to buf.
+// If maxLen is greater than 0, attempts to write more to buf than
+// maxLen bytes will return ErrStringLength.
+func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
+       rootHuffmanNode := getRootHuffmanNode()
+       n := rootHuffmanNode
+       // cur is the bit buffer that has not been fed into n.
+       // cbits is the number of low order bits in cur that are valid.
+       // sbits is the number of bits of the symbol prefix being decoded.
+       cur, cbits, sbits := uint(0), uint8(0), uint8(0)
+       for _, b := range v {
+               cur = cur<<8 | uint(b)
+               cbits += 8
+               sbits += 8
+               for cbits >= 8 {
+                       idx := byte(cur >> (cbits - 8))
+                       n = n.children[idx]
+                       if n == nil {
+                               return ErrInvalidHuffman
+                       }
+                       if n.children == nil {
+                               if maxLen != 0 && buf.Len() == maxLen {
+                                       return ErrStringLength
+                               }
+                               buf.WriteByte(n.sym)
+                               cbits -= n.codeLen
+                               n = rootHuffmanNode
+                               sbits = cbits
+                       } else {
+                               cbits -= 8
+                       }
+               }
+       }
+       for cbits > 0 {
+               n = n.children[byte(cur<<(8-cbits))]
+               if n == nil {
+                       return ErrInvalidHuffman
+               }
+               if n.children != nil || n.codeLen > cbits {
+                       break
+               }
+               if maxLen != 0 && buf.Len() == maxLen {
+                       return ErrStringLength
+               }
+               buf.WriteByte(n.sym)
+               cbits -= n.codeLen
+               n = rootHuffmanNode
+               sbits = cbits
+       }
+       if sbits > 7 {
+               // Either there was an incomplete symbol, or overlong padding.
+               // Both are decoding errors per RFC 7541 section 5.2.
+               return ErrInvalidHuffman
+       }
+       if mask := uint(1<<cbits - 1); cur&mask != mask {
+               // Trailing bits must be a prefix of EOS per RFC 7541 section 5.2.
+               return ErrInvalidHuffman
+       }
+
+       return nil
+}
+
+type node struct {
+       // children is non-nil for internal nodes
+       children *[256]*node
+
+       // The following are only valid if children is nil:
+       codeLen uint8 // number of bits that led to the output of sym
+       sym     byte  // output symbol
+}
+
+func newInternalNode() *node {
+       return &node{children: new([256]*node)}
+}
+
+var (
+       buildRootOnce       sync.Once
+       lazyRootHuffmanNode *node
+)
+
+func getRootHuffmanNode() *node {
+       buildRootOnce.Do(buildRootHuffmanNode)
+       return lazyRootHuffmanNode
+}
+
+func buildRootHuffmanNode() {
+       if len(huffmanCodes) != 256 {
+               panic("unexpected size")
+       }
+       lazyRootHuffmanNode = newInternalNode()
+       for i, code := range huffmanCodes {
+               addDecoderNode(byte(i), code, huffmanCodeLen[i])
+       }
+}
+
+func addDecoderNode(sym byte, code uint32, codeLen uint8) {
+       cur := lazyRootHuffmanNode
+       for codeLen > 8 {
+               codeLen -= 8
+               i := uint8(code >> codeLen)
+               if cur.children[i] == nil {
+                       cur.children[i] = newInternalNode()
+               }
+               cur = cur.children[i]
+       }
+       shift := 8 - codeLen
+       start, end := int(uint8(code<<shift)), int(1<<shift)
+       for i := start; i < start+end; i++ {
+               cur.children[i] = &node{sym: sym, codeLen: codeLen}
+       }
+}
+
+// AppendHuffmanString appends s, as encoded in Huffman codes, to dst
+// and returns the extended buffer.
+func AppendHuffmanString(dst []byte, s string) []byte {
+       rembits := uint8(8)
+
+       for i := 0; i < len(s); i++ {
+               if rembits == 8 {
+                       dst = append(dst, 0)
+               }
+               dst, rembits = appendByteToHuffmanCode(dst, rembits, s[i])
+       }
+
+       if rembits < 8 {
+               // special EOS symbol
+               code := uint32(0x3fffffff)
+               nbits := uint8(30)
+
+               t := uint8(code >> (nbits - rembits))
+               dst[len(dst)-1] |= t
+       }
+
+       return dst
+}
+
+// HuffmanEncodeLength returns the number of bytes required to encode
+// s in Huffman codes. The result is round up to byte boundary.
+func HuffmanEncodeLength(s string) uint64 {
+       n := uint64(0)
+       for i := 0; i < len(s); i++ {
+               n += uint64(huffmanCodeLen[s[i]])
+       }
+       return (n + 7) / 8
+}
+
+// appendByteToHuffmanCode appends Huffman code for c to dst and
+// returns the extended buffer and the remaining bits in the last
+// element. The appending is not byte aligned and the remaining bits
+// in the last element of dst is given in rembits.
+func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) {
+       code := huffmanCodes[c]
+       nbits := huffmanCodeLen[c]
+
+       for {
+               if rembits > nbits {
+                       t := uint8(code << (rembits - nbits))
+                       dst[len(dst)-1] |= t
+                       rembits -= nbits
+                       break
+               }
+
+               t := uint8(code >> (nbits - rembits))
+               dst[len(dst)-1] |= t
+
+               nbits -= rembits
+               rembits = 8
+
+               if nbits == 0 {
+                       break
+               }
+
+               dst = append(dst, 0)
+       }
+
+       return dst, rembits
+}
diff --git a/libgo/go/golang.org/x/net/http2/hpack/tables.go b/libgo/go/golang.org/x/net/http2/hpack/tables.go
new file mode 100644 (file)
index 0000000..a66cfbe
--- /dev/null
@@ -0,0 +1,479 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package hpack
+
+import (
+       "fmt"
+)
+
+// headerFieldTable implements a list of HeaderFields.
+// This is used to implement the static and dynamic tables.
+type headerFieldTable struct {
+       // For static tables, entries are never evicted.
+       //
+       // For dynamic tables, entries are evicted from ents[0] and added to the end.
+       // Each entry has a unique id that starts at one and increments for each
+       // entry that is added. This unique id is stable across evictions, meaning
+       // it can be used as a pointer to a specific entry. As in hpack, unique ids
+       // are 1-based. The unique id for ents[k] is k + evictCount + 1.
+       //
+       // Zero is not a valid unique id.
+       //
+       // evictCount should not overflow in any remotely practical situation. In
+       // practice, we will have one dynamic table per HTTP/2 connection. If we
+       // assume a very powerful server that handles 1M QPS per connection and each
+       // request adds (then evicts) 100 entries from the table, it would still take
+       // 2M years for evictCount to overflow.
+       ents       []HeaderField
+       evictCount uint64
+
+       // byName maps a HeaderField name to the unique id of the newest entry with
+       // the same name. See above for a definition of "unique id".
+       byName map[string]uint64
+
+       // byNameValue maps a HeaderField name/value pair to the unique id of the newest
+       // entry with the same name and value. See above for a definition of "unique id".
+       byNameValue map[pairNameValue]uint64
+}
+
+type pairNameValue struct {
+       name, value string
+}
+
+func (t *headerFieldTable) init() {
+       t.byName = make(map[string]uint64)
+       t.byNameValue = make(map[pairNameValue]uint64)
+}
+
+// len reports the number of entries in the table.
+func (t *headerFieldTable) len() int {
+       return len(t.ents)
+}
+
+// addEntry adds a new entry.
+func (t *headerFieldTable) addEntry(f HeaderField) {
+       id := uint64(t.len()) + t.evictCount + 1
+       t.byName[f.Name] = id
+       t.byNameValue[pairNameValue{f.Name, f.Value}] = id
+       t.ents = append(t.ents, f)
+}
+
+// evictOldest evicts the n oldest entries in the table.
+func (t *headerFieldTable) evictOldest(n int) {
+       if n > t.len() {
+               panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len()))
+       }
+       for k := 0; k < n; k++ {
+               f := t.ents[k]
+               id := t.evictCount + uint64(k) + 1
+               if t.byName[f.Name] == id {
+                       delete(t.byName, f.Name)
+               }
+               if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id {
+                       delete(t.byNameValue, p)
+               }
+       }
+       copy(t.ents, t.ents[n:])
+       for k := t.len() - n; k < t.len(); k++ {
+               t.ents[k] = HeaderField{} // so strings can be garbage collected
+       }
+       t.ents = t.ents[:t.len()-n]
+       if t.evictCount+uint64(n) < t.evictCount {
+               panic("evictCount overflow")
+       }
+       t.evictCount += uint64(n)
+}
+
+// search finds f in the table. If there is no match, i is 0.
+// If both name and value match, i is the matched index and nameValueMatch
+// becomes true. If only name matches, i points to that index and
+// nameValueMatch becomes false.
+//
+// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says
+// that index 1 should be the newest entry, but t.ents[0] is the oldest entry,
+// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic
+// table, the return value i actually refers to the entry t.ents[t.len()-i].
+//
+// All tables are assumed to be a dynamic tables except for the global
+// staticTable pointer.
+//
+// See Section 2.3.3.
+func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) {
+       if !f.Sensitive {
+               if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 {
+                       return t.idToIndex(id), true
+               }
+       }
+       if id := t.byName[f.Name]; id != 0 {
+               return t.idToIndex(id), false
+       }
+       return 0, false
+}
+
+// idToIndex converts a unique id to an HPACK index.
+// See Section 2.3.3.
+func (t *headerFieldTable) idToIndex(id uint64) uint64 {
+       if id <= t.evictCount {
+               panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount))
+       }
+       k := id - t.evictCount - 1 // convert id to an index t.ents[k]
+       if t != staticTable {
+               return uint64(t.len()) - k // dynamic table
+       }
+       return k + 1
+}
+
+// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B
+var staticTable = newStaticTable()
+var staticTableEntries = [...]HeaderField{
+       {Name: ":authority"},
+       {Name: ":method", Value: "GET"},
+       {Name: ":method", Value: "POST"},
+       {Name: ":path", Value: "/"},
+       {Name: ":path", Value: "/index.html"},
+       {Name: ":scheme", Value: "http"},
+       {Name: ":scheme", Value: "https"},
+       {Name: ":status", Value: "200"},
+       {Name: ":status", Value: "204"},
+       {Name: ":status", Value: "206"},
+       {Name: ":status", Value: "304"},
+       {Name: ":status", Value: "400"},
+       {Name: ":status", Value: "404"},
+       {Name: ":status", Value: "500"},
+       {Name: "accept-charset"},
+       {Name: "accept-encoding", Value: "gzip, deflate"},
+       {Name: "accept-language"},
+       {Name: "accept-ranges"},
+       {Name: "accept"},
+       {Name: "access-control-allow-origin"},
+       {Name: "age"},
+       {Name: "allow"},
+       {Name: "authorization"},
+       {Name: "cache-control"},
+       {Name: "content-disposition"},
+       {Name: "content-encoding"},
+       {Name: "content-language"},
+       {Name: "content-length"},
+       {Name: "content-location"},
+       {Name: "content-range"},
+       {Name: "content-type"},
+       {Name: "cookie"},
+       {Name: "date"},
+       {Name: "etag"},
+       {Name: "expect"},
+       {Name: "expires"},
+       {Name: "from"},
+       {Name: "host"},
+       {Name: "if-match"},
+       {Name: "if-modified-since"},
+       {Name: "if-none-match"},
+       {Name: "if-range"},
+       {Name: "if-unmodified-since"},
+       {Name: "last-modified"},
+       {Name: "link"},
+       {Name: "location"},
+       {Name: "max-forwards"},
+       {Name: "proxy-authenticate"},
+       {Name: "proxy-authorization"},
+       {Name: "range"},
+       {Name: "referer"},
+       {Name: "refresh"},
+       {Name: "retry-after"},
+       {Name: "server"},
+       {Name: "set-cookie"},
+       {Name: "strict-transport-security"},
+       {Name: "transfer-encoding"},
+       {Name: "user-agent"},
+       {Name: "vary"},
+       {Name: "via"},
+       {Name: "www-authenticate"},
+}
+
+func newStaticTable() *headerFieldTable {
+       t := &headerFieldTable{}
+       t.init()
+       for _, e := range staticTableEntries[:] {
+               t.addEntry(e)
+       }
+       return t
+}
+
+var huffmanCodes = [256]uint32{
+       0x1ff8,
+       0x7fffd8,
+       0xfffffe2,
+       0xfffffe3,
+       0xfffffe4,
+       0xfffffe5,
+       0xfffffe6,
+       0xfffffe7,
+       0xfffffe8,
+       0xffffea,
+       0x3ffffffc,
+       0xfffffe9,
+       0xfffffea,
+       0x3ffffffd,
+       0xfffffeb,
+       0xfffffec,
+       0xfffffed,
+       0xfffffee,
+       0xfffffef,
+       0xffffff0,
+       0xffffff1,
+       0xffffff2,
+       0x3ffffffe,
+       0xffffff3,
+       0xffffff4,
+       0xffffff5,
+       0xffffff6,
+       0xffffff7,
+       0xffffff8,
+       0xffffff9,
+       0xffffffa,
+       0xffffffb,
+       0x14,
+       0x3f8,
+       0x3f9,
+       0xffa,
+       0x1ff9,
+       0x15,
+       0xf8,
+       0x7fa,
+       0x3fa,
+       0x3fb,
+       0xf9,
+       0x7fb,
+       0xfa,
+       0x16,
+       0x17,
+       0x18,
+       0x0,
+       0x1,
+       0x2,
+       0x19,
+       0x1a,
+       0x1b,
+       0x1c,
+       0x1d,
+       0x1e,
+       0x1f,
+       0x5c,
+       0xfb,
+       0x7ffc,
+       0x20,
+       0xffb,
+       0x3fc,
+       0x1ffa,
+       0x21,
+       0x5d,
+       0x5e,
+       0x5f,
+       0x60,
+       0x61,
+       0x62,
+       0x63,
+       0x64,
+       0x65,
+       0x66,
+       0x67,
+       0x68,
+       0x69,
+       0x6a,
+       0x6b,
+       0x6c,
+       0x6d,
+       0x6e,
+       0x6f,
+       0x70,
+       0x71,
+       0x72,
+       0xfc,
+       0x73,
+       0xfd,
+       0x1ffb,
+       0x7fff0,
+       0x1ffc,
+       0x3ffc,
+       0x22,
+       0x7ffd,
+       0x3,
+       0x23,
+       0x4,
+       0x24,
+       0x5,
+       0x25,
+       0x26,
+       0x27,
+       0x6,
+       0x74,
+       0x75,
+       0x28,
+       0x29,
+       0x2a,
+       0x7,
+       0x2b,
+       0x76,
+       0x2c,
+       0x8,
+       0x9,
+       0x2d,
+       0x77,
+       0x78,
+       0x79,
+       0x7a,
+       0x7b,
+       0x7ffe,
+       0x7fc,
+       0x3ffd,
+       0x1ffd,
+       0xffffffc,
+       0xfffe6,
+       0x3fffd2,
+       0xfffe7,
+       0xfffe8,
+       0x3fffd3,
+       0x3fffd4,
+       0x3fffd5,
+       0x7fffd9,
+       0x3fffd6,
+       0x7fffda,
+       0x7fffdb,
+       0x7fffdc,
+       0x7fffdd,
+       0x7fffde,
+       0xffffeb,
+       0x7fffdf,
+       0xffffec,
+       0xffffed,
+       0x3fffd7,
+       0x7fffe0,
+       0xffffee,
+       0x7fffe1,
+       0x7fffe2,
+       0x7fffe3,
+       0x7fffe4,
+       0x1fffdc,
+       0x3fffd8,
+       0x7fffe5,
+       0x3fffd9,
+       0x7fffe6,
+       0x7fffe7,
+       0xffffef,
+       0x3fffda,
+       0x1fffdd,
+       0xfffe9,
+       0x3fffdb,
+       0x3fffdc,
+       0x7fffe8,
+       0x7fffe9,
+       0x1fffde,
+       0x7fffea,
+       0x3fffdd,
+       0x3fffde,
+       0xfffff0,
+       0x1fffdf,
+       0x3fffdf,
+       0x7fffeb,
+       0x7fffec,
+       0x1fffe0,
+       0x1fffe1,
+       0x3fffe0,
+       0x1fffe2,
+       0x7fffed,
+       0x3fffe1,
+       0x7fffee,
+       0x7fffef,
+       0xfffea,
+       0x3fffe2,
+       0x3fffe3,
+       0x3fffe4,
+       0x7ffff0,
+       0x3fffe5,
+       0x3fffe6,
+       0x7ffff1,
+       0x3ffffe0,
+       0x3ffffe1,
+       0xfffeb,
+       0x7fff1,
+       0x3fffe7,
+       0x7ffff2,
+       0x3fffe8,
+       0x1ffffec,
+       0x3ffffe2,
+       0x3ffffe3,
+       0x3ffffe4,
+       0x7ffffde,
+       0x7ffffdf,
+       0x3ffffe5,
+       0xfffff1,
+       0x1ffffed,
+       0x7fff2,
+       0x1fffe3,
+       0x3ffffe6,
+       0x7ffffe0,
+       0x7ffffe1,
+       0x3ffffe7,
+       0x7ffffe2,
+       0xfffff2,
+       0x1fffe4,
+       0x1fffe5,
+       0x3ffffe8,
+       0x3ffffe9,
+       0xffffffd,
+       0x7ffffe3,
+       0x7ffffe4,
+       0x7ffffe5,
+       0xfffec,
+       0xfffff3,
+       0xfffed,
+       0x1fffe6,
+       0x3fffe9,
+       0x1fffe7,
+       0x1fffe8,
+       0x7ffff3,
+       0x3fffea,
+       0x3fffeb,
+       0x1ffffee,
+       0x1ffffef,
+       0xfffff4,
+       0xfffff5,
+       0x3ffffea,
+       0x7ffff4,
+       0x3ffffeb,
+       0x7ffffe6,
+       0x3ffffec,
+       0x3ffffed,
+       0x7ffffe7,
+       0x7ffffe8,
+       0x7ffffe9,
+       0x7ffffea,
+       0x7ffffeb,
+       0xffffffe,
+       0x7ffffec,
+       0x7ffffed,
+       0x7ffffee,
+       0x7ffffef,
+       0x7fffff0,
+       0x3ffffee,
+}
+
+var huffmanCodeLen = [256]uint8{
+       13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28,
+       28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+       6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6,
+       5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10,
+       13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+       7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6,
+       15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5,
+       6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28,
+       20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23,
+       24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24,
+       22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23,
+       21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23,
+       26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25,
+       19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27,
+       20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23,
+       26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26,
+}
diff --git a/libgo/go/golang.org/x/net/idna/idna10.0.0.go b/libgo/go/golang.org/x/net/idna/idna10.0.0.go
new file mode 100644 (file)
index 0000000..a98a31f
--- /dev/null
@@ -0,0 +1,734 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.10
+
+// Package idna implements IDNA2008 using the compatibility processing
+// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
+// deal with the transition from IDNA2003.
+//
+// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
+// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
+// UTS #46 is defined in https://www.unicode.org/reports/tr46.
+// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
+// differences between these two standards.
+package idna // import "golang.org/x/net/idna"
+
+import (
+       "fmt"
+       "strings"
+       "unicode/utf8"
+
+       "golang.org/x/text/secure/bidirule"
+       "golang.org/x/text/unicode/bidi"
+       "golang.org/x/text/unicode/norm"
+)
+
+// NOTE: Unlike common practice in Go APIs, the functions will return a
+// sanitized domain name in case of errors. Browsers sometimes use a partially
+// evaluated string as lookup.
+// TODO: the current error handling is, in my opinion, the least opinionated.
+// Other strategies are also viable, though:
+// Option 1) Return an empty string in case of error, but allow the user to
+//    specify explicitly which errors to ignore.
+// Option 2) Return the partially evaluated string if it is itself a valid
+//    string, otherwise return the empty string in case of error.
+// Option 3) Option 1 and 2.
+// Option 4) Always return an empty string for now and implement Option 1 as
+//    needed, and document that the return string may not be empty in case of
+//    error in the future.
+// I think Option 1 is best, but it is quite opinionated.
+
+// ToASCII is a wrapper for Punycode.ToASCII.
+func ToASCII(s string) (string, error) {
+       return Punycode.process(s, true)
+}
+
+// ToUnicode is a wrapper for Punycode.ToUnicode.
+func ToUnicode(s string) (string, error) {
+       return Punycode.process(s, false)
+}
+
+// An Option configures a Profile at creation time.
+type Option func(*options)
+
+// Transitional sets a Profile to use the Transitional mapping as defined in UTS
+// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
+// transitional mapping provides a compromise between IDNA2003 and IDNA2008
+// compatibility. It is used by most browsers when resolving domain names. This
+// option is only meaningful if combined with MapForLookup.
+func Transitional(transitional bool) Option {
+       return func(o *options) { o.transitional = true }
+}
+
+// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
+// are longer than allowed by the RFC.
+func VerifyDNSLength(verify bool) Option {
+       return func(o *options) { o.verifyDNSLength = verify }
+}
+
+// RemoveLeadingDots removes leading label separators. Leading runes that map to
+// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
+//
+// This is the behavior suggested by the UTS #46 and is adopted by some
+// browsers.
+func RemoveLeadingDots(remove bool) Option {
+       return func(o *options) { o.removeLeadingDots = remove }
+}
+
+// ValidateLabels sets whether to check the mandatory label validation criteria
+// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
+// of hyphens ('-'), normalization, validity of runes, and the context rules.
+func ValidateLabels(enable bool) Option {
+       return func(o *options) {
+               // Don't override existing mappings, but set one that at least checks
+               // normalization if it is not set.
+               if o.mapping == nil && enable {
+                       o.mapping = normalize
+               }
+               o.trie = trie
+               o.validateLabels = enable
+               o.fromPuny = validateFromPunycode
+       }
+}
+
+// StrictDomainName limits the set of permissible ASCII characters to those
+// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
+// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
+//
+// This option is useful, for instance, for browsers that allow characters
+// outside this range, for example a '_' (U+005F LOW LINE). See
+// http://www.rfc-editor.org/std/std3.txt for more details This option
+// corresponds to the UseSTD3ASCIIRules option in UTS #46.
+func StrictDomainName(use bool) Option {
+       return func(o *options) {
+               o.trie = trie
+               o.useSTD3Rules = use
+               o.fromPuny = validateFromPunycode
+       }
+}
+
+// NOTE: the following options pull in tables. The tables should not be linked
+// in as long as the options are not used.
+
+// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
+// that relies on proper validation of labels should include this rule.
+func BidiRule() Option {
+       return func(o *options) { o.bidirule = bidirule.ValidString }
+}
+
+// ValidateForRegistration sets validation options to verify that a given IDN is
+// properly formatted for registration as defined by Section 4 of RFC 5891.
+func ValidateForRegistration() Option {
+       return func(o *options) {
+               o.mapping = validateRegistration
+               StrictDomainName(true)(o)
+               ValidateLabels(true)(o)
+               VerifyDNSLength(true)(o)
+               BidiRule()(o)
+       }
+}
+
+// MapForLookup sets validation and mapping options such that a given IDN is
+// transformed for domain name lookup according to the requirements set out in
+// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
+// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
+// to add this check.
+//
+// The mappings include normalization and mapping case, width and other
+// compatibility mappings.
+func MapForLookup() Option {
+       return func(o *options) {
+               o.mapping = validateAndMap
+               StrictDomainName(true)(o)
+               ValidateLabels(true)(o)
+       }
+}
+
+type options struct {
+       transitional      bool
+       useSTD3Rules      bool
+       validateLabels    bool
+       verifyDNSLength   bool
+       removeLeadingDots bool
+
+       trie *idnaTrie
+
+       // fromPuny calls validation rules when converting A-labels to U-labels.
+       fromPuny func(p *Profile, s string) error
+
+       // mapping implements a validation and mapping step as defined in RFC 5895
+       // or UTS 46, tailored to, for example, domain registration or lookup.
+       mapping func(p *Profile, s string) (mapped string, isBidi bool, err error)
+
+       // bidirule, if specified, checks whether s conforms to the Bidi Rule
+       // defined in RFC 5893.
+       bidirule func(s string) bool
+}
+
+// A Profile defines the configuration of an IDNA mapper.
+type Profile struct {
+       options
+}
+
+func apply(o *options, opts []Option) {
+       for _, f := range opts {
+               f(o)
+       }
+}
+
+// New creates a new Profile.
+//
+// With no options, the returned Profile is the most permissive and equals the
+// Punycode Profile. Options can be passed to further restrict the Profile. The
+// MapForLookup and ValidateForRegistration options set a collection of options,
+// for lookup and registration purposes respectively, which can be tailored by
+// adding more fine-grained options, where later options override earlier
+// options.
+func New(o ...Option) *Profile {
+       p := &Profile{}
+       apply(&p.options, o)
+       return p
+}
+
+// ToASCII converts a domain or domain label to its ASCII form. For example,
+// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
+// ToASCII("golang") is "golang". If an error is encountered it will return
+// an error and a (partially) processed result.
+func (p *Profile) ToASCII(s string) (string, error) {
+       return p.process(s, true)
+}
+
+// ToUnicode converts a domain or domain label to its Unicode form. For example,
+// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
+// ToUnicode("golang") is "golang". If an error is encountered it will return
+// an error and a (partially) processed result.
+func (p *Profile) ToUnicode(s string) (string, error) {
+       pp := *p
+       pp.transitional = false
+       return pp.process(s, false)
+}
+
+// String reports a string with a description of the profile for debugging
+// purposes. The string format may change with different versions.
+func (p *Profile) String() string {
+       s := ""
+       if p.transitional {
+               s = "Transitional"
+       } else {
+               s = "NonTransitional"
+       }
+       if p.useSTD3Rules {
+               s += ":UseSTD3Rules"
+       }
+       if p.validateLabels {
+               s += ":ValidateLabels"
+       }
+       if p.verifyDNSLength {
+               s += ":VerifyDNSLength"
+       }
+       return s
+}
+
+var (
+       // Punycode is a Profile that does raw punycode processing with a minimum
+       // of validation.
+       Punycode *Profile = punycode
+
+       // Lookup is the recommended profile for looking up domain names, according
+       // to Section 5 of RFC 5891. The exact configuration of this profile may
+       // change over time.
+       Lookup *Profile = lookup
+
+       // Display is the recommended profile for displaying domain names.
+       // The configuration of this profile may change over time.
+       Display *Profile = display
+
+       // Registration is the recommended profile for checking whether a given
+       // IDN is valid for registration, according to Section 4 of RFC 5891.
+       Registration *Profile = registration
+
+       punycode = &Profile{}
+       lookup   = &Profile{options{
+               transitional:   true,
+               useSTD3Rules:   true,
+               validateLabels: true,
+               trie:           trie,
+               fromPuny:       validateFromPunycode,
+               mapping:        validateAndMap,
+               bidirule:       bidirule.ValidString,
+       }}
+       display = &Profile{options{
+               useSTD3Rules:   true,
+               validateLabels: true,
+               trie:           trie,
+               fromPuny:       validateFromPunycode,
+               mapping:        validateAndMap,
+               bidirule:       bidirule.ValidString,
+       }}
+       registration = &Profile{options{
+               useSTD3Rules:    true,
+               validateLabels:  true,
+               verifyDNSLength: true,
+               trie:            trie,
+               fromPuny:        validateFromPunycode,
+               mapping:         validateRegistration,
+               bidirule:        bidirule.ValidString,
+       }}
+
+       // TODO: profiles
+       // Register: recommended for approving domain names: don't do any mappings
+       // but rather reject on invalid input. Bundle or block deviation characters.
+)
+
+type labelError struct{ label, code_ string }
+
+func (e labelError) code() string { return e.code_ }
+func (e labelError) Error() string {
+       return fmt.Sprintf("idna: invalid label %q", e.label)
+}
+
+type runeError rune
+
+func (e runeError) code() string { return "P1" }
+func (e runeError) Error() string {
+       return fmt.Sprintf("idna: disallowed rune %U", e)
+}
+
+// process implements the algorithm described in section 4 of UTS #46,
+// see https://www.unicode.org/reports/tr46.
+func (p *Profile) process(s string, toASCII bool) (string, error) {
+       var err error
+       var isBidi bool
+       if p.mapping != nil {
+               s, isBidi, err = p.mapping(p, s)
+       }
+       // Remove leading empty labels.
+       if p.removeLeadingDots {
+               for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
+               }
+       }
+       // TODO: allow for a quick check of the tables data.
+       // It seems like we should only create this error on ToASCII, but the
+       // UTS 46 conformance tests suggests we should always check this.
+       if err == nil && p.verifyDNSLength && s == "" {
+               err = &labelError{s, "A4"}
+       }
+       labels := labelIter{orig: s}
+       for ; !labels.done(); labels.next() {
+               label := labels.label()
+               if label == "" {
+                       // Empty labels are not okay. The label iterator skips the last
+                       // label if it is empty.
+                       if err == nil && p.verifyDNSLength {
+                               err = &labelError{s, "A4"}
+                       }
+                       continue
+               }
+               if strings.HasPrefix(label, acePrefix) {
+                       u, err2 := decode(label[len(acePrefix):])
+                       if err2 != nil {
+                               if err == nil {
+                                       err = err2
+                               }
+                               // Spec says keep the old label.
+                               continue
+                       }
+                       isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight
+                       labels.set(u)
+                       if err == nil && p.validateLabels {
+                               err = p.fromPuny(p, u)
+                       }
+                       if err == nil {
+                               // This should be called on NonTransitional, according to the
+                               // spec, but that currently does not have any effect. Use the
+                               // original profile to preserve options.
+                               err = p.validateLabel(u)
+                       }
+               } else if err == nil {
+                       err = p.validateLabel(label)
+               }
+       }
+       if isBidi && p.bidirule != nil && err == nil {
+               for labels.reset(); !labels.done(); labels.next() {
+                       if !p.bidirule(labels.label()) {
+                               err = &labelError{s, "B"}
+                               break
+                       }
+               }
+       }
+       if toASCII {
+               for labels.reset(); !labels.done(); labels.next() {
+                       label := labels.label()
+                       if !ascii(label) {
+                               a, err2 := encode(acePrefix, label)
+                               if err == nil {
+                                       err = err2
+                               }
+                               label = a
+                               labels.set(a)
+                       }
+                       n := len(label)
+                       if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
+                               err = &labelError{label, "A4"}
+                       }
+               }
+       }
+       s = labels.result()
+       if toASCII && p.verifyDNSLength && err == nil {
+               // Compute the length of the domain name minus the root label and its dot.
+               n := len(s)
+               if n > 0 && s[n-1] == '.' {
+                       n--
+               }
+               if len(s) < 1 || n > 253 {
+                       err = &labelError{s, "A4"}
+               }
+       }
+       return s, err
+}
+
+func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) {
+       // TODO: consider first doing a quick check to see if any of these checks
+       // need to be done. This will make it slower in the general case, but
+       // faster in the common case.
+       mapped = norm.NFC.String(s)
+       isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft
+       return mapped, isBidi, nil
+}
+
+func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) {
+       // TODO: filter need for normalization in loop below.
+       if !norm.NFC.IsNormalString(s) {
+               return s, false, &labelError{s, "V1"}
+       }
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               if sz == 0 {
+                       return s, bidi, runeError(utf8.RuneError)
+               }
+               bidi = bidi || info(v).isBidi(s[i:])
+               // Copy bytes not copied so far.
+               switch p.simplify(info(v).category()) {
+               // TODO: handle the NV8 defined in the Unicode idna data set to allow
+               // for strict conformance to IDNA2008.
+               case valid, deviation:
+               case disallowed, mapped, unknown, ignored:
+                       r, _ := utf8.DecodeRuneInString(s[i:])
+                       return s, bidi, runeError(r)
+               }
+               i += sz
+       }
+       return s, bidi, nil
+}
+
+func (c info) isBidi(s string) bool {
+       if !c.isMapped() {
+               return c&attributesMask == rtl
+       }
+       // TODO: also store bidi info for mapped data. This is possible, but a bit
+       // cumbersome and not for the common case.
+       p, _ := bidi.LookupString(s)
+       switch p.Class() {
+       case bidi.R, bidi.AL, bidi.AN:
+               return true
+       }
+       return false
+}
+
+func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {
+       var (
+               b []byte
+               k int
+       )
+       // combinedInfoBits contains the or-ed bits of all runes. We use this
+       // to derive the mayNeedNorm bit later. This may trigger normalization
+       // overeagerly, but it will not do so in the common case. The end result
+       // is another 10% saving on BenchmarkProfile for the common case.
+       var combinedInfoBits info
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               if sz == 0 {
+                       b = append(b, s[k:i]...)
+                       b = append(b, "\ufffd"...)
+                       k = len(s)
+                       if err == nil {
+                               err = runeError(utf8.RuneError)
+                       }
+                       break
+               }
+               combinedInfoBits |= info(v)
+               bidi = bidi || info(v).isBidi(s[i:])
+               start := i
+               i += sz
+               // Copy bytes not copied so far.
+               switch p.simplify(info(v).category()) {
+               case valid:
+                       continue
+               case disallowed:
+                       if err == nil {
+                               r, _ := utf8.DecodeRuneInString(s[start:])
+                               err = runeError(r)
+                       }
+                       continue
+               case mapped, deviation:
+                       b = append(b, s[k:start]...)
+                       b = info(v).appendMapping(b, s[start:i])
+               case ignored:
+                       b = append(b, s[k:start]...)
+                       // drop the rune
+               case unknown:
+                       b = append(b, s[k:start]...)
+                       b = append(b, "\ufffd"...)
+               }
+               k = i
+       }
+       if k == 0 {
+               // No changes so far.
+               if combinedInfoBits&mayNeedNorm != 0 {
+                       s = norm.NFC.String(s)
+               }
+       } else {
+               b = append(b, s[k:]...)
+               if norm.NFC.QuickSpan(b) != len(b) {
+                       b = norm.NFC.Bytes(b)
+               }
+               // TODO: the punycode converters require strings as input.
+               s = string(b)
+       }
+       return s, bidi, err
+}
+
+// A labelIter allows iterating over domain name labels.
+type labelIter struct {
+       orig     string
+       slice    []string
+       curStart int
+       curEnd   int
+       i        int
+}
+
+func (l *labelIter) reset() {
+       l.curStart = 0
+       l.curEnd = 0
+       l.i = 0
+}
+
+func (l *labelIter) done() bool {
+       return l.curStart >= len(l.orig)
+}
+
+func (l *labelIter) result() string {
+       if l.slice != nil {
+               return strings.Join(l.slice, ".")
+       }
+       return l.orig
+}
+
+func (l *labelIter) label() string {
+       if l.slice != nil {
+               return l.slice[l.i]
+       }
+       p := strings.IndexByte(l.orig[l.curStart:], '.')
+       l.curEnd = l.curStart + p
+       if p == -1 {
+               l.curEnd = len(l.orig)
+       }
+       return l.orig[l.curStart:l.curEnd]
+}
+
+// next sets the value to the next label. It skips the last label if it is empty.
+func (l *labelIter) next() {
+       l.i++
+       if l.slice != nil {
+               if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
+                       l.curStart = len(l.orig)
+               }
+       } else {
+               l.curStart = l.curEnd + 1
+               if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
+                       l.curStart = len(l.orig)
+               }
+       }
+}
+
+func (l *labelIter) set(s string) {
+       if l.slice == nil {
+               l.slice = strings.Split(l.orig, ".")
+       }
+       l.slice[l.i] = s
+}
+
+// acePrefix is the ASCII Compatible Encoding prefix.
+const acePrefix = "xn--"
+
+func (p *Profile) simplify(cat category) category {
+       switch cat {
+       case disallowedSTD3Mapped:
+               if p.useSTD3Rules {
+                       cat = disallowed
+               } else {
+                       cat = mapped
+               }
+       case disallowedSTD3Valid:
+               if p.useSTD3Rules {
+                       cat = disallowed
+               } else {
+                       cat = valid
+               }
+       case deviation:
+               if !p.transitional {
+                       cat = valid
+               }
+       case validNV8, validXV8:
+               // TODO: handle V2008
+               cat = valid
+       }
+       return cat
+}
+
+func validateFromPunycode(p *Profile, s string) error {
+       if !norm.NFC.IsNormalString(s) {
+               return &labelError{s, "V1"}
+       }
+       // TODO: detect whether string may have to be normalized in the following
+       // loop.
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               if sz == 0 {
+                       return runeError(utf8.RuneError)
+               }
+               if c := p.simplify(info(v).category()); c != valid && c != deviation {
+                       return &labelError{s, "V6"}
+               }
+               i += sz
+       }
+       return nil
+}
+
+const (
+       zwnj = "\u200c"
+       zwj  = "\u200d"
+)
+
+type joinState int8
+
+const (
+       stateStart joinState = iota
+       stateVirama
+       stateBefore
+       stateBeforeVirama
+       stateAfter
+       stateFAIL
+)
+
+var joinStates = [][numJoinTypes]joinState{
+       stateStart: {
+               joiningL:   stateBefore,
+               joiningD:   stateBefore,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateVirama,
+       },
+       stateVirama: {
+               joiningL: stateBefore,
+               joiningD: stateBefore,
+       },
+       stateBefore: {
+               joiningL:   stateBefore,
+               joiningD:   stateBefore,
+               joiningT:   stateBefore,
+               joinZWNJ:   stateAfter,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateBeforeVirama,
+       },
+       stateBeforeVirama: {
+               joiningL: stateBefore,
+               joiningD: stateBefore,
+               joiningT: stateBefore,
+       },
+       stateAfter: {
+               joiningL:   stateFAIL,
+               joiningD:   stateBefore,
+               joiningT:   stateAfter,
+               joiningR:   stateStart,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateAfter, // no-op as we can't accept joiners here
+       },
+       stateFAIL: {
+               0:          stateFAIL,
+               joiningL:   stateFAIL,
+               joiningD:   stateFAIL,
+               joiningT:   stateFAIL,
+               joiningR:   stateFAIL,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateFAIL,
+       },
+}
+
+// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
+// already implicitly satisfied by the overall implementation.
+func (p *Profile) validateLabel(s string) (err error) {
+       if s == "" {
+               if p.verifyDNSLength {
+                       return &labelError{s, "A4"}
+               }
+               return nil
+       }
+       if !p.validateLabels {
+               return nil
+       }
+       trie := p.trie // p.validateLabels is only set if trie is set.
+       if len(s) > 4 && s[2] == '-' && s[3] == '-' {
+               return &labelError{s, "V2"}
+       }
+       if s[0] == '-' || s[len(s)-1] == '-' {
+               return &labelError{s, "V3"}
+       }
+       // TODO: merge the use of this in the trie.
+       v, sz := trie.lookupString(s)
+       x := info(v)
+       if x.isModifier() {
+               return &labelError{s, "V5"}
+       }
+       // Quickly return in the absence of zero-width (non) joiners.
+       if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
+               return nil
+       }
+       st := stateStart
+       for i := 0; ; {
+               jt := x.joinType()
+               if s[i:i+sz] == zwj {
+                       jt = joinZWJ
+               } else if s[i:i+sz] == zwnj {
+                       jt = joinZWNJ
+               }
+               st = joinStates[st][jt]
+               if x.isViramaModifier() {
+                       st = joinStates[st][joinVirama]
+               }
+               if i += sz; i == len(s) {
+                       break
+               }
+               v, sz = trie.lookupString(s[i:])
+               x = info(v)
+       }
+       if st == stateFAIL || st == stateAfter {
+               return &labelError{s, "C"}
+       }
+       return nil
+}
+
+func ascii(s string) bool {
+       for i := 0; i < len(s); i++ {
+               if s[i] >= utf8.RuneSelf {
+                       return false
+               }
+       }
+       return true
+}
diff --git a/libgo/go/golang.org/x/net/idna/idna9.0.0.go b/libgo/go/golang.org/x/net/idna/idna9.0.0.go
new file mode 100644 (file)
index 0000000..8842146
--- /dev/null
@@ -0,0 +1,682 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.10
+
+// Package idna implements IDNA2008 using the compatibility processing
+// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
+// deal with the transition from IDNA2003.
+//
+// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
+// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
+// UTS #46 is defined in https://www.unicode.org/reports/tr46.
+// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
+// differences between these two standards.
+package idna // import "golang.org/x/net/idna"
+
+import (
+       "fmt"
+       "strings"
+       "unicode/utf8"
+
+       "golang.org/x/text/secure/bidirule"
+       "golang.org/x/text/unicode/norm"
+)
+
+// NOTE: Unlike common practice in Go APIs, the functions will return a
+// sanitized domain name in case of errors. Browsers sometimes use a partially
+// evaluated string as lookup.
+// TODO: the current error handling is, in my opinion, the least opinionated.
+// Other strategies are also viable, though:
+// Option 1) Return an empty string in case of error, but allow the user to
+//    specify explicitly which errors to ignore.
+// Option 2) Return the partially evaluated string if it is itself a valid
+//    string, otherwise return the empty string in case of error.
+// Option 3) Option 1 and 2.
+// Option 4) Always return an empty string for now and implement Option 1 as
+//    needed, and document that the return string may not be empty in case of
+//    error in the future.
+// I think Option 1 is best, but it is quite opinionated.
+
+// ToASCII is a wrapper for Punycode.ToASCII.
+func ToASCII(s string) (string, error) {
+       return Punycode.process(s, true)
+}
+
+// ToUnicode is a wrapper for Punycode.ToUnicode.
+func ToUnicode(s string) (string, error) {
+       return Punycode.process(s, false)
+}
+
+// An Option configures a Profile at creation time.
+type Option func(*options)
+
+// Transitional sets a Profile to use the Transitional mapping as defined in UTS
+// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
+// transitional mapping provides a compromise between IDNA2003 and IDNA2008
+// compatibility. It is used by most browsers when resolving domain names. This
+// option is only meaningful if combined with MapForLookup.
+func Transitional(transitional bool) Option {
+       return func(o *options) { o.transitional = true }
+}
+
+// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
+// are longer than allowed by the RFC.
+func VerifyDNSLength(verify bool) Option {
+       return func(o *options) { o.verifyDNSLength = verify }
+}
+
+// RemoveLeadingDots removes leading label separators. Leading runes that map to
+// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
+//
+// This is the behavior suggested by the UTS #46 and is adopted by some
+// browsers.
+func RemoveLeadingDots(remove bool) Option {
+       return func(o *options) { o.removeLeadingDots = remove }
+}
+
+// ValidateLabels sets whether to check the mandatory label validation criteria
+// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
+// of hyphens ('-'), normalization, validity of runes, and the context rules.
+func ValidateLabels(enable bool) Option {
+       return func(o *options) {
+               // Don't override existing mappings, but set one that at least checks
+               // normalization if it is not set.
+               if o.mapping == nil && enable {
+                       o.mapping = normalize
+               }
+               o.trie = trie
+               o.validateLabels = enable
+               o.fromPuny = validateFromPunycode
+       }
+}
+
+// StrictDomainName limits the set of permissable ASCII characters to those
+// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
+// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
+//
+// This option is useful, for instance, for browsers that allow characters
+// outside this range, for example a '_' (U+005F LOW LINE). See
+// http://www.rfc-editor.org/std/std3.txt for more details This option
+// corresponds to the UseSTD3ASCIIRules option in UTS #46.
+func StrictDomainName(use bool) Option {
+       return func(o *options) {
+               o.trie = trie
+               o.useSTD3Rules = use
+               o.fromPuny = validateFromPunycode
+       }
+}
+
+// NOTE: the following options pull in tables. The tables should not be linked
+// in as long as the options are not used.
+
+// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
+// that relies on proper validation of labels should include this rule.
+func BidiRule() Option {
+       return func(o *options) { o.bidirule = bidirule.ValidString }
+}
+
+// ValidateForRegistration sets validation options to verify that a given IDN is
+// properly formatted for registration as defined by Section 4 of RFC 5891.
+func ValidateForRegistration() Option {
+       return func(o *options) {
+               o.mapping = validateRegistration
+               StrictDomainName(true)(o)
+               ValidateLabels(true)(o)
+               VerifyDNSLength(true)(o)
+               BidiRule()(o)
+       }
+}
+
+// MapForLookup sets validation and mapping options such that a given IDN is
+// transformed for domain name lookup according to the requirements set out in
+// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
+// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
+// to add this check.
+//
+// The mappings include normalization and mapping case, width and other
+// compatibility mappings.
+func MapForLookup() Option {
+       return func(o *options) {
+               o.mapping = validateAndMap
+               StrictDomainName(true)(o)
+               ValidateLabels(true)(o)
+               RemoveLeadingDots(true)(o)
+       }
+}
+
+type options struct {
+       transitional      bool
+       useSTD3Rules      bool
+       validateLabels    bool
+       verifyDNSLength   bool
+       removeLeadingDots bool
+
+       trie *idnaTrie
+
+       // fromPuny calls validation rules when converting A-labels to U-labels.
+       fromPuny func(p *Profile, s string) error
+
+       // mapping implements a validation and mapping step as defined in RFC 5895
+       // or UTS 46, tailored to, for example, domain registration or lookup.
+       mapping func(p *Profile, s string) (string, error)
+
+       // bidirule, if specified, checks whether s conforms to the Bidi Rule
+       // defined in RFC 5893.
+       bidirule func(s string) bool
+}
+
+// A Profile defines the configuration of a IDNA mapper.
+type Profile struct {
+       options
+}
+
+func apply(o *options, opts []Option) {
+       for _, f := range opts {
+               f(o)
+       }
+}
+
+// New creates a new Profile.
+//
+// With no options, the returned Profile is the most permissive and equals the
+// Punycode Profile. Options can be passed to further restrict the Profile. The
+// MapForLookup and ValidateForRegistration options set a collection of options,
+// for lookup and registration purposes respectively, which can be tailored by
+// adding more fine-grained options, where later options override earlier
+// options.
+func New(o ...Option) *Profile {
+       p := &Profile{}
+       apply(&p.options, o)
+       return p
+}
+
+// ToASCII converts a domain or domain label to its ASCII form. For example,
+// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
+// ToASCII("golang") is "golang". If an error is encountered it will return
+// an error and a (partially) processed result.
+func (p *Profile) ToASCII(s string) (string, error) {
+       return p.process(s, true)
+}
+
+// ToUnicode converts a domain or domain label to its Unicode form. For example,
+// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
+// ToUnicode("golang") is "golang". If an error is encountered it will return
+// an error and a (partially) processed result.
+func (p *Profile) ToUnicode(s string) (string, error) {
+       pp := *p
+       pp.transitional = false
+       return pp.process(s, false)
+}
+
+// String reports a string with a description of the profile for debugging
+// purposes. The string format may change with different versions.
+func (p *Profile) String() string {
+       s := ""
+       if p.transitional {
+               s = "Transitional"
+       } else {
+               s = "NonTransitional"
+       }
+       if p.useSTD3Rules {
+               s += ":UseSTD3Rules"
+       }
+       if p.validateLabels {
+               s += ":ValidateLabels"
+       }
+       if p.verifyDNSLength {
+               s += ":VerifyDNSLength"
+       }
+       return s
+}
+
+var (
+       // Punycode is a Profile that does raw punycode processing with a minimum
+       // of validation.
+       Punycode *Profile = punycode
+
+       // Lookup is the recommended profile for looking up domain names, according
+       // to Section 5 of RFC 5891. The exact configuration of this profile may
+       // change over time.
+       Lookup *Profile = lookup
+
+       // Display is the recommended profile for displaying domain names.
+       // The configuration of this profile may change over time.
+       Display *Profile = display
+
+       // Registration is the recommended profile for checking whether a given
+       // IDN is valid for registration, according to Section 4 of RFC 5891.
+       Registration *Profile = registration
+
+       punycode = &Profile{}
+       lookup   = &Profile{options{
+               transitional:      true,
+               useSTD3Rules:      true,
+               validateLabels:    true,
+               removeLeadingDots: true,
+               trie:              trie,
+               fromPuny:          validateFromPunycode,
+               mapping:           validateAndMap,
+               bidirule:          bidirule.ValidString,
+       }}
+       display = &Profile{options{
+               useSTD3Rules:      true,
+               validateLabels:    true,
+               removeLeadingDots: true,
+               trie:              trie,
+               fromPuny:          validateFromPunycode,
+               mapping:           validateAndMap,
+               bidirule:          bidirule.ValidString,
+       }}
+       registration = &Profile{options{
+               useSTD3Rules:    true,
+               validateLabels:  true,
+               verifyDNSLength: true,
+               trie:            trie,
+               fromPuny:        validateFromPunycode,
+               mapping:         validateRegistration,
+               bidirule:        bidirule.ValidString,
+       }}
+
+       // TODO: profiles
+       // Register: recommended for approving domain names: don't do any mappings
+       // but rather reject on invalid input. Bundle or block deviation characters.
+)
+
+type labelError struct{ label, code_ string }
+
+func (e labelError) code() string { return e.code_ }
+func (e labelError) Error() string {
+       return fmt.Sprintf("idna: invalid label %q", e.label)
+}
+
+type runeError rune
+
+func (e runeError) code() string { return "P1" }
+func (e runeError) Error() string {
+       return fmt.Sprintf("idna: disallowed rune %U", e)
+}
+
+// process implements the algorithm described in section 4 of UTS #46,
+// see https://www.unicode.org/reports/tr46.
+func (p *Profile) process(s string, toASCII bool) (string, error) {
+       var err error
+       if p.mapping != nil {
+               s, err = p.mapping(p, s)
+       }
+       // Remove leading empty labels.
+       if p.removeLeadingDots {
+               for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
+               }
+       }
+       // It seems like we should only create this error on ToASCII, but the
+       // UTS 46 conformance tests suggests we should always check this.
+       if err == nil && p.verifyDNSLength && s == "" {
+               err = &labelError{s, "A4"}
+       }
+       labels := labelIter{orig: s}
+       for ; !labels.done(); labels.next() {
+               label := labels.label()
+               if label == "" {
+                       // Empty labels are not okay. The label iterator skips the last
+                       // label if it is empty.
+                       if err == nil && p.verifyDNSLength {
+                               err = &labelError{s, "A4"}
+                       }
+                       continue
+               }
+               if strings.HasPrefix(label, acePrefix) {
+                       u, err2 := decode(label[len(acePrefix):])
+                       if err2 != nil {
+                               if err == nil {
+                                       err = err2
+                               }
+                               // Spec says keep the old label.
+                               continue
+                       }
+                       labels.set(u)
+                       if err == nil && p.validateLabels {
+                               err = p.fromPuny(p, u)
+                       }
+                       if err == nil {
+                               // This should be called on NonTransitional, according to the
+                               // spec, but that currently does not have any effect. Use the
+                               // original profile to preserve options.
+                               err = p.validateLabel(u)
+                       }
+               } else if err == nil {
+                       err = p.validateLabel(label)
+               }
+       }
+       if toASCII {
+               for labels.reset(); !labels.done(); labels.next() {
+                       label := labels.label()
+                       if !ascii(label) {
+                               a, err2 := encode(acePrefix, label)
+                               if err == nil {
+                                       err = err2
+                               }
+                               label = a
+                               labels.set(a)
+                       }
+                       n := len(label)
+                       if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
+                               err = &labelError{label, "A4"}
+                       }
+               }
+       }
+       s = labels.result()
+       if toASCII && p.verifyDNSLength && err == nil {
+               // Compute the length of the domain name minus the root label and its dot.
+               n := len(s)
+               if n > 0 && s[n-1] == '.' {
+                       n--
+               }
+               if len(s) < 1 || n > 253 {
+                       err = &labelError{s, "A4"}
+               }
+       }
+       return s, err
+}
+
+func normalize(p *Profile, s string) (string, error) {
+       return norm.NFC.String(s), nil
+}
+
+func validateRegistration(p *Profile, s string) (string, error) {
+       if !norm.NFC.IsNormalString(s) {
+               return s, &labelError{s, "V1"}
+       }
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               // Copy bytes not copied so far.
+               switch p.simplify(info(v).category()) {
+               // TODO: handle the NV8 defined in the Unicode idna data set to allow
+               // for strict conformance to IDNA2008.
+               case valid, deviation:
+               case disallowed, mapped, unknown, ignored:
+                       r, _ := utf8.DecodeRuneInString(s[i:])
+                       return s, runeError(r)
+               }
+               i += sz
+       }
+       return s, nil
+}
+
+func validateAndMap(p *Profile, s string) (string, error) {
+       var (
+               err error
+               b   []byte
+               k   int
+       )
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               start := i
+               i += sz
+               // Copy bytes not copied so far.
+               switch p.simplify(info(v).category()) {
+               case valid:
+                       continue
+               case disallowed:
+                       if err == nil {
+                               r, _ := utf8.DecodeRuneInString(s[start:])
+                               err = runeError(r)
+                       }
+                       continue
+               case mapped, deviation:
+                       b = append(b, s[k:start]...)
+                       b = info(v).appendMapping(b, s[start:i])
+               case ignored:
+                       b = append(b, s[k:start]...)
+                       // drop the rune
+               case unknown:
+                       b = append(b, s[k:start]...)
+                       b = append(b, "\ufffd"...)
+               }
+               k = i
+       }
+       if k == 0 {
+               // No changes so far.
+               s = norm.NFC.String(s)
+       } else {
+               b = append(b, s[k:]...)
+               if norm.NFC.QuickSpan(b) != len(b) {
+                       b = norm.NFC.Bytes(b)
+               }
+               // TODO: the punycode converters require strings as input.
+               s = string(b)
+       }
+       return s, err
+}
+
+// A labelIter allows iterating over domain name labels.
+type labelIter struct {
+       orig     string
+       slice    []string
+       curStart int
+       curEnd   int
+       i        int
+}
+
+func (l *labelIter) reset() {
+       l.curStart = 0
+       l.curEnd = 0
+       l.i = 0
+}
+
+func (l *labelIter) done() bool {
+       return l.curStart >= len(l.orig)
+}
+
+func (l *labelIter) result() string {
+       if l.slice != nil {
+               return strings.Join(l.slice, ".")
+       }
+       return l.orig
+}
+
+func (l *labelIter) label() string {
+       if l.slice != nil {
+               return l.slice[l.i]
+       }
+       p := strings.IndexByte(l.orig[l.curStart:], '.')
+       l.curEnd = l.curStart + p
+       if p == -1 {
+               l.curEnd = len(l.orig)
+       }
+       return l.orig[l.curStart:l.curEnd]
+}
+
+// next sets the value to the next label. It skips the last label if it is empty.
+func (l *labelIter) next() {
+       l.i++
+       if l.slice != nil {
+               if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
+                       l.curStart = len(l.orig)
+               }
+       } else {
+               l.curStart = l.curEnd + 1
+               if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
+                       l.curStart = len(l.orig)
+               }
+       }
+}
+
+func (l *labelIter) set(s string) {
+       if l.slice == nil {
+               l.slice = strings.Split(l.orig, ".")
+       }
+       l.slice[l.i] = s
+}
+
+// acePrefix is the ASCII Compatible Encoding prefix.
+const acePrefix = "xn--"
+
+func (p *Profile) simplify(cat category) category {
+       switch cat {
+       case disallowedSTD3Mapped:
+               if p.useSTD3Rules {
+                       cat = disallowed
+               } else {
+                       cat = mapped
+               }
+       case disallowedSTD3Valid:
+               if p.useSTD3Rules {
+                       cat = disallowed
+               } else {
+                       cat = valid
+               }
+       case deviation:
+               if !p.transitional {
+                       cat = valid
+               }
+       case validNV8, validXV8:
+               // TODO: handle V2008
+               cat = valid
+       }
+       return cat
+}
+
+func validateFromPunycode(p *Profile, s string) error {
+       if !norm.NFC.IsNormalString(s) {
+               return &labelError{s, "V1"}
+       }
+       for i := 0; i < len(s); {
+               v, sz := trie.lookupString(s[i:])
+               if c := p.simplify(info(v).category()); c != valid && c != deviation {
+                       return &labelError{s, "V6"}
+               }
+               i += sz
+       }
+       return nil
+}
+
+const (
+       zwnj = "\u200c"
+       zwj  = "\u200d"
+)
+
+type joinState int8
+
+const (
+       stateStart joinState = iota
+       stateVirama
+       stateBefore
+       stateBeforeVirama
+       stateAfter
+       stateFAIL
+)
+
+var joinStates = [][numJoinTypes]joinState{
+       stateStart: {
+               joiningL:   stateBefore,
+               joiningD:   stateBefore,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateVirama,
+       },
+       stateVirama: {
+               joiningL: stateBefore,
+               joiningD: stateBefore,
+       },
+       stateBefore: {
+               joiningL:   stateBefore,
+               joiningD:   stateBefore,
+               joiningT:   stateBefore,
+               joinZWNJ:   stateAfter,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateBeforeVirama,
+       },
+       stateBeforeVirama: {
+               joiningL: stateBefore,
+               joiningD: stateBefore,
+               joiningT: stateBefore,
+       },
+       stateAfter: {
+               joiningL:   stateFAIL,
+               joiningD:   stateBefore,
+               joiningT:   stateAfter,
+               joiningR:   stateStart,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateAfter, // no-op as we can't accept joiners here
+       },
+       stateFAIL: {
+               0:          stateFAIL,
+               joiningL:   stateFAIL,
+               joiningD:   stateFAIL,
+               joiningT:   stateFAIL,
+               joiningR:   stateFAIL,
+               joinZWNJ:   stateFAIL,
+               joinZWJ:    stateFAIL,
+               joinVirama: stateFAIL,
+       },
+}
+
+// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
+// already implicitly satisfied by the overall implementation.
+func (p *Profile) validateLabel(s string) error {
+       if s == "" {
+               if p.verifyDNSLength {
+                       return &labelError{s, "A4"}
+               }
+               return nil
+       }
+       if p.bidirule != nil && !p.bidirule(s) {
+               return &labelError{s, "B"}
+       }
+       if !p.validateLabels {
+               return nil
+       }
+       trie := p.trie // p.validateLabels is only set if trie is set.
+       if len(s) > 4 && s[2] == '-' && s[3] == '-' {
+               return &labelError{s, "V2"}
+       }
+       if s[0] == '-' || s[len(s)-1] == '-' {
+               return &labelError{s, "V3"}
+       }
+       // TODO: merge the use of this in the trie.
+       v, sz := trie.lookupString(s)
+       x := info(v)
+       if x.isModifier() {
+               return &labelError{s, "V5"}
+       }
+       // Quickly return in the absence of zero-width (non) joiners.
+       if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
+               return nil
+       }
+       st := stateStart
+       for i := 0; ; {
+               jt := x.joinType()
+               if s[i:i+sz] == zwj {
+                       jt = joinZWJ
+               } else if s[i:i+sz] == zwnj {
+                       jt = joinZWNJ
+               }
+               st = joinStates[st][jt]
+               if x.isViramaModifier() {
+                       st = joinStates[st][joinVirama]
+               }
+               if i += sz; i == len(s) {
+                       break
+               }
+               v, sz = trie.lookupString(s[i:])
+               x = info(v)
+       }
+       if st == stateFAIL || st == stateAfter {
+               return &labelError{s, "C"}
+       }
+       return nil
+}
+
+func ascii(s string) bool {
+       for i := 0; i < len(s); i++ {
+               if s[i] >= utf8.RuneSelf {
+                       return false
+               }
+       }
+       return true
+}
diff --git a/libgo/go/golang.org/x/net/idna/punycode.go b/libgo/go/golang.org/x/net/idna/punycode.go
new file mode 100644 (file)
index 0000000..02c7d59
--- /dev/null
@@ -0,0 +1,203 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package idna
+
+// This file implements the Punycode algorithm from RFC 3492.
+
+import (
+       "math"
+       "strings"
+       "unicode/utf8"
+)
+
+// These parameter values are specified in section 5.
+//
+// All computation is done with int32s, so that overflow behavior is identical
+// regardless of whether int is 32-bit or 64-bit.
+const (
+       base        int32 = 36
+       damp        int32 = 700
+       initialBias int32 = 72
+       initialN    int32 = 128
+       skew        int32 = 38
+       tmax        int32 = 26
+       tmin        int32 = 1
+)
+
+func punyError(s string) error { return &labelError{s, "A3"} }
+
+// decode decodes a string as specified in section 6.2.
+func decode(encoded string) (string, error) {
+       if encoded == "" {
+               return "", nil
+       }
+       pos := 1 + strings.LastIndex(encoded, "-")
+       if pos == 1 {
+               return "", punyError(encoded)
+       }
+       if pos == len(encoded) {
+               return encoded[:len(encoded)-1], nil
+       }
+       output := make([]rune, 0, len(encoded))
+       if pos != 0 {
+               for _, r := range encoded[:pos-1] {
+                       output = append(output, r)
+               }
+       }
+       i, n, bias := int32(0), initialN, initialBias
+       for pos < len(encoded) {
+               oldI, w := i, int32(1)
+               for k := base; ; k += base {
+                       if pos == len(encoded) {
+                               return "", punyError(encoded)
+                       }
+                       digit, ok := decodeDigit(encoded[pos])
+                       if !ok {
+                               return "", punyError(encoded)
+                       }
+                       pos++
+                       i += digit * w
+                       if i < 0 {
+                               return "", punyError(encoded)
+                       }
+                       t := k - bias
+                       if t < tmin {
+                               t = tmin
+                       } else if t > tmax {
+                               t = tmax
+                       }
+                       if digit < t {
+                               break
+                       }
+                       w *= base - t
+                       if w >= math.MaxInt32/base {
+                               return "", punyError(encoded)
+                       }
+               }
+               x := int32(len(output) + 1)
+               bias = adapt(i-oldI, x, oldI == 0)
+               n += i / x
+               i %= x
+               if n > utf8.MaxRune || len(output) >= 1024 {
+                       return "", punyError(encoded)
+               }
+               output = append(output, 0)
+               copy(output[i+1:], output[i:])
+               output[i] = n
+               i++
+       }
+       return string(output), nil
+}
+
+// encode encodes a string as specified in section 6.3 and prepends prefix to
+// the result.
+//
+// The "while h < length(input)" line in the specification becomes "for
+// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
+func encode(prefix, s string) (string, error) {
+       output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
+       copy(output, prefix)
+       delta, n, bias := int32(0), initialN, initialBias
+       b, remaining := int32(0), int32(0)
+       for _, r := range s {
+               if r < 0x80 {
+                       b++
+                       output = append(output, byte(r))
+               } else {
+                       remaining++
+               }
+       }
+       h := b
+       if b > 0 {
+               output = append(output, '-')
+       }
+       for remaining != 0 {
+               m := int32(0x7fffffff)
+               for _, r := range s {
+                       if m > r && r >= n {
+                               m = r
+                       }
+               }
+               delta += (m - n) * (h + 1)
+               if delta < 0 {
+                       return "", punyError(s)
+               }
+               n = m
+               for _, r := range s {
+                       if r < n {
+                               delta++
+                               if delta < 0 {
+                                       return "", punyError(s)
+                               }
+                               continue
+                       }
+                       if r > n {
+                               continue
+                       }
+                       q := delta
+                       for k := base; ; k += base {
+                               t := k - bias
+                               if t < tmin {
+                                       t = tmin
+                               } else if t > tmax {
+                                       t = tmax
+                               }
+                               if q < t {
+                                       break
+                               }
+                               output = append(output, encodeDigit(t+(q-t)%(base-t)))
+                               q = (q - t) / (base - t)
+                       }
+                       output = append(output, encodeDigit(q))
+                       bias = adapt(delta, h+1, h == b)
+                       delta = 0
+                       h++
+                       remaining--
+               }
+               delta++
+               n++
+       }
+       return string(output), nil
+}
+
+func decodeDigit(x byte) (digit int32, ok bool) {
+       switch {
+       case '0' <= x && x <= '9':
+               return int32(x - ('0' - 26)), true
+       case 'A' <= x && x <= 'Z':
+               return int32(x - 'A'), true
+       case 'a' <= x && x <= 'z':
+               return int32(x - 'a'), true
+       }
+       return 0, false
+}
+
+func encodeDigit(digit int32) byte {
+       switch {
+       case 0 <= digit && digit < 26:
+               return byte(digit + 'a')
+       case 26 <= digit && digit < 36:
+               return byte(digit + ('0' - 26))
+       }
+       panic("idna: internal error in punycode encoding")
+}
+
+// adapt is the bias adaptation function specified in section 6.1.
+func adapt(delta, numPoints int32, firstTime bool) int32 {
+       if firstTime {
+               delta /= damp
+       } else {
+               delta /= 2
+       }
+       delta += delta / numPoints
+       k := int32(0)
+       for delta > ((base-tmin)*tmax)/2 {
+               delta /= base - tmin
+               k += base
+       }
+       return k + (base-tmin+1)*delta/(delta+skew)
+}
diff --git a/libgo/go/golang.org/x/net/idna/tables10.0.0.go b/libgo/go/golang.org/x/net/idna/tables10.0.0.go
new file mode 100644 (file)
index 0000000..54fddb4
--- /dev/null
@@ -0,0 +1,4559 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.10,!go1.13
+
+package idna
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "10.0.0"
+
+var mappings string = "" + // Size: 8175 bytes
+       "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
+       "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
+       "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
+       "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" +
+       "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" +
+       "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" +
+       "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" +
+       "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" +
+       "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" +
+       "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" +
+       "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" +
+       "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" +
+       "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" +
+       "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" +
+       "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" +
+       "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" +
+       "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" +
+       "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" +
+       "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" +
+       "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" +
+       "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" +
+       "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" +
+       "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" +
+       "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" +
+       "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" +
+       "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" +
+       ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" +
+       "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" +
+       "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" +
+       "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" +
+       "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" +
+       "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" +
+       "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" +
+       "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" +
+       "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" +
+       "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" +
+       "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" +
+       "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" +
+       "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" +
+       "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" +
+       "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" +
+       "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" +
+       "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" +
+       "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" +
+       "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" +
+       "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" +
+       "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" +
+       "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" +
+       "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" +
+       "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" +
+       "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" +
+       "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" +
+       "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" +
+       "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" +
+       "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" +
+       "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" +
+       "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" +
+       "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" +
+       "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" +
+       "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" +
+       "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" +
+       "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" +
+       "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" +
+       "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" +
+       "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" +
+       "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" +
+       "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" +
+       "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" +
+       "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" +
+       "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" +
+       "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" +
+       "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" +
+       "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" +
+       " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" +
+       "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" +
+       "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" +
+       "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" +
+       "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" +
+       "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" +
+       "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" +
+       "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" +
+       "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" +
+       "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" +
+       "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" +
+       "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" +
+       "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" +
+       "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" +
+       "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" +
+       "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" +
+       "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" +
+       "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" +
+       "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" +
+       "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" +
+       "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" +
+       "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" +
+       "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" +
+       "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" +
+       "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" +
+       "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" +
+       "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" +
+       "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" +
+       "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" +
+       "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" +
+       "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" +
+       "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" +
+       "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" +
+       "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" +
+       "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" +
+       "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" +
+       "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" +
+       "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" +
+       "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" +
+       "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" +
+       "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" +
+       "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" +
+       "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" +
+       "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" +
+       "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" +
+       "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" +
+       "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" +
+       "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" +
+       "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" +
+       "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" +
+       "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" +
+       "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" +
+       "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" +
+       "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" +
+       "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" +
+       "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" +
+       "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" +
+       "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" +
+       "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" +
+       "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" +
+       "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" +
+       "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" +
+       "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" +
+       "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻"
+
+var xorData string = "" + // Size: 4855 bytes
+       "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
+       "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" +
+       "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" +
+       "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" +
+       "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" +
+       "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" +
+       "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" +
+       "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" +
+       "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" +
+       "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" +
+       "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" +
+       "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" +
+       "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" +
+       "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" +
+       "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" +
+       "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" +
+       "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" +
+       "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" +
+       "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" +
+       "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" +
+       "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" +
+       "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" +
+       "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" +
+       "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" +
+       "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" +
+       "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" +
+       "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" +
+       "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" +
+       "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" +
+       "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" +
+       "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" +
+       "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" +
+       "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" +
+       "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" +
+       "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" +
+       "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" +
+       "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " +
+       "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" +
+       "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" +
+       "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" +
+       "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" +
+       "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" +
+       ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" +
+       "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" +
+       "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" +
+       "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" +
+       "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" +
+       "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" +
+       "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" +
+       "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" +
+       "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" +
+       "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" +
+       "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" +
+       "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" +
+       "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" +
+       "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" +
+       "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" +
+       "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" +
+       "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" +
+       "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" +
+       "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" +
+       "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" +
+       "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" +
+       "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" +
+       "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" +
+       "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" +
+       "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" +
+       "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" +
+       "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" +
+       "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" +
+       "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" +
+       "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" +
+       "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" +
+       "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" +
+       "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" +
+       "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" +
+       "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" +
+       "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" +
+       "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" +
+       "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" +
+       "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" +
+       "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" +
+       "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" +
+       "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" +
+       "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" +
+       "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" +
+       "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" +
+       "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" +
+       "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," +
+       "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" +
+       "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" +
+       "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" +
+       "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" +
+       ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" +
+       "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" +
+       "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" +
+       "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" +
+       "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" +
+       "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" +
+       "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" +
+       "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" +
+       "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" +
+       "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" +
+       "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" +
+       "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" +
+       "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" +
+       "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" +
+       "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" +
+       "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" +
+       "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" +
+       "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" +
+       "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" +
+       "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" +
+       "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" +
+       "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" +
+       "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" +
+       "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" +
+       "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" +
+       "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" +
+       "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" +
+       "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" +
+       "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" +
+       "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" +
+       "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" +
+       "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" +
+       "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" +
+       "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" +
+       "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" +
+       "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" +
+       "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." +
+       "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" +
+       "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" +
+       "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " +
+       "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" +
+       "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" +
+       "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" +
+       "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" +
+       "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" +
+       "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" +
+       "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," +
+       "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" +
+       "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" +
+       "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" +
+       "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" +
+       "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" +
+       "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" +
+       "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" +
+       "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" +
+       "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" +
+       "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" +
+       "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" +
+       "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" +
+       "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" +
+       "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" +
+       "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" +
+       "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" +
+       "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" +
+       "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" +
+       "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" +
+       "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" +
+       "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" +
+       "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" +
+       "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" +
+       "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" +
+       "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" +
+       "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" +
+       "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" +
+       "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" +
+       "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" +
+       "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" +
+       "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" +
+       "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" +
+       "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" +
+       "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" +
+       "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" +
+       "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" +
+       "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" +
+       "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" +
+       "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," +
+       "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" +
+       "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" +
+       "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" +
+       "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" +
+       "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" +
+       "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" +
+       "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" +
+       "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" +
+       "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" +
+       "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" +
+       "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" +
+       "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" +
+       "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" +
+       "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" +
+       "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" +
+       "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" +
+       "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" +
+       "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" +
+       "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" +
+       "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" +
+       "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" +
+       "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" +
+       "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" +
+       "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" +
+       "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" +
+       "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" +
+       "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" +
+       "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" +
+       "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" +
+       "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" +
+       "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" +
+       "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" +
+       "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" +
+       "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" +
+       "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" +
+       "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" +
+       "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" +
+       "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" +
+       "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" +
+       "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" +
+       "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" +
+       "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" +
+       "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" +
+       "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" +
+       "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" +
+       "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" +
+       "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" +
+       "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" +
+       "\x05\x22\x05\x03\x050\x1d"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd.
+type idnaTrie struct{}
+
+func newIdnaTrie(i int) *idnaTrie {
+       return &idnaTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 125:
+               return uint16(idnaValues[n<<6+uint32(b)])
+       default:
+               n -= 125
+               return uint16(idnaSparse.lookup(n, b))
+       }
+}
+
+// idnaValues: 127 blocks, 8128 entries, 16256 bytes
+// The third block is the zero block.
+var idnaValues = [8128]uint16{
+       // Block 0x0, offset 0x0
+       0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
+       0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
+       0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,
+       0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,
+       0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,
+       0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,
+       0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,
+       0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,
+       0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,
+       0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,
+       0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,
+       // Block 0x1, offset 0x40
+       0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,
+       0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,
+       0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,
+       0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,
+       0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,
+       0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,
+       0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,
+       0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,
+       0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,
+       0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,
+       0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,
+       0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,
+       0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,
+       0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
+       0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
+       0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
+       0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,
+       0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,
+       0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,
+       0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,
+       0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,
+       // Block 0x4, offset 0x100
+       0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
+       0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
+       0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,
+       0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,
+       0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,
+       0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
+       0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
+       0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
+       0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
+       0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
+       0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,
+       // Block 0x5, offset 0x140
+       0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
+       0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,
+       0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
+       0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
+       0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
+       0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,
+       0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,
+       0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
+       0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
+       0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
+       0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,
+       // Block 0x6, offset 0x180
+       0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
+       0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
+       0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,
+       0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,
+       0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,
+       0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,
+       0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,
+       0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,
+       0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,
+       0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
+       0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,
+       0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
+       0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
+       0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
+       0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
+       0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,
+       0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,
+       0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,
+       0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,
+       0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,
+       0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,
+       // Block 0x8, offset 0x200
+       0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,
+       0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,
+       0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,
+       0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,
+       0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,
+       0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,
+       0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
+       0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
+       0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
+       0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,
+       0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,
+       // Block 0x9, offset 0x240
+       0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
+       0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
+       0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
+       0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
+       0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,
+       0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,
+       0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
+       0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
+       0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
+       0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
+       0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
+       // Block 0xa, offset 0x280
+       0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
+       0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
+       0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
+       0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
+       0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
+       0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
+       0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
+       0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
+       0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
+       0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
+       0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,
+       0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
+       0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
+       0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
+       0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,
+       0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,
+       0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,
+       0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,
+       0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,
+       0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,
+       0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,
+       // Block 0xc, offset 0x300
+       0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,
+       0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,
+       0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,
+       0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,
+       0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,
+       0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,
+       0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,
+       0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,
+       0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,
+       0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,
+       0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,
+       // Block 0xd, offset 0x340
+       0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,
+       0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,
+       0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,
+       0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,
+       0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,
+       0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,
+       0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,
+       0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,
+       0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,
+       0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
+       0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
+       // Block 0xe, offset 0x380
+       0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
+       0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
+       0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
+       0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
+       0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
+       0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,
+       0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,
+       0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,
+       0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,
+       0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,
+       0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,
+       0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,
+       0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,
+       0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,
+       0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,
+       0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,
+       0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,
+       0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,
+       0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,
+       0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,
+       0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,
+       // Block 0x10, offset 0x400
+       0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,
+       0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,
+       0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,
+       0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,
+       0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,
+       0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,
+       0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,
+       0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,
+       0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,
+       0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
+       0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
+       // Block 0x11, offset 0x440
+       0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
+       0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
+       0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
+       0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
+       0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,
+       0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
+       0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
+       0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
+       0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
+       0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
+       0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
+       // Block 0x12, offset 0x480
+       0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
+       0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
+       0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
+       0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
+       0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
+       0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
+       0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
+       0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
+       0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
+       0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+       0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
+       0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
+       0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
+       0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
+       0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
+       0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
+       0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
+       0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
+       0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
+       0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
+       0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
+       // Block 0x14, offset 0x500
+       0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
+       0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
+       0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
+       0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
+       0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
+       0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
+       0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
+       0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
+       0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
+       0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
+       0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
+       // Block 0x15, offset 0x540
+       0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,
+       0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,
+       0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,
+       0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808,
+       0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,
+       0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,
+       0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,
+       0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,
+       0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,
+       0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040,
+       0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040,
+       // Block 0x16, offset 0x580
+       0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308,
+       0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,
+       0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,
+       0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,
+       0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,
+       0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
+       0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
+       0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
+       0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,
+       0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008,
+       0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008,
+       0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008,
+       0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,
+       0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008,
+       0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008,
+       0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008,
+       0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040,
+       0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
+       0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040,
+       0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,
+       0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008,
+       // Block 0x18, offset 0x600
+       0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040,
+       0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,
+       0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,
+       0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,
+       0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,
+       0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
+       0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,
+       0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
+       0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,
+       0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018,
+       0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040,
+       // Block 0x19, offset 0x640
+       0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008,
+       0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040,
+       0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040,
+       0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008,
+       0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008,
+       0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,
+       0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,
+       0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
+       0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,
+       0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
+       0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,
+       // Block 0x1a, offset 0x680
+       0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,
+       0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,
+       0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,
+       0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,
+       0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,
+       0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
+       0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,
+       0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
+       0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,
+       0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040,
+       0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008,
+       0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008,
+       0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008,
+       0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008,
+       0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008,
+       0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008,
+       0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040,
+       0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
+       0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008,
+       0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,
+       0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008,
+       // Block 0x1c, offset 0x700
+       0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308,
+       0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008,
+       0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040,
+       0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040,
+       0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040,
+       0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308,
+       0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008,
+       0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
+       0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040,
+       0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308,
+       0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308,
+       // Block 0x1d, offset 0x740
+       0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008,
+       0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008,
+       0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,
+       0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008,
+       0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008,
+       0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008,
+       0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040,
+       0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
+       0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008,
+       0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040,
+       0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308,
+       // Block 0x1e, offset 0x780
+       0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040,
+       0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,
+       0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
+       0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008,
+       0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,
+       0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,
+       0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,
+       0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
+       0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018,
+       0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040,
+       0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008,
+       0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040,
+       0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,
+       0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040,
+       0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040,
+       0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008,
+       0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008,
+       0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008,
+       0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008,
+       0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040,
+       0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008,
+       // Block 0x20, offset 0x800
+       0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040,
+       0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308,
+       0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,
+       0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040,
+       0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,
+       0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308,
+       0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008,
+       0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,
+       0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,
+       0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018,
+       0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018,
+       // Block 0x21, offset 0x840
+       0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008,
+       0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008,
+       0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040,
+       0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008,
+       0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008,
+       0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008,
+       0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040,
+       0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
+       0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008,
+       0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040,
+       0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308,
+       // Block 0x22, offset 0x880
+       0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040,
+       0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,
+       0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,
+       0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040,
+       0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040,
+       0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,
+       0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,
+       0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
+       0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040,
+       0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040,
+       0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040,
+       0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,
+       0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040,
+       0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008,
+       0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018,
+       0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,
+       0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,
+       0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
+       0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018,
+       0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008,
+       0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008,
+       // Block 0x24, offset 0x900
+       0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040,
+       0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040,
+       0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040,
+       0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008,
+       0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008,
+       0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
+       0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040,
+       0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
+       0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,
+       0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308,
+       0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,
+       // Block 0x25, offset 0x940
+       0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,
+       0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
+       0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
+       0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,
+       0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,
+       0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
+       0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,
+       0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,
+       0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,
+       0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,
+       0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,
+       // Block 0x26, offset 0x980
+       0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
+       0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
+       0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,
+       0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
+       0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,
+       0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,
+       0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,
+       0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
+       0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,
+       0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,
+       0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,
+       0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,
+       0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008,
+       0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008,
+       0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,
+       0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,
+       0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,
+       0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,
+       0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,
+       0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,
+       0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,
+       0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,
+       0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,
+       0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9,
+       0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099,
+       0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,
+       0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,
+       0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
+       0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,
+       0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
+       0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,
+       0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,
+       0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,
+       0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
+       0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,
+       0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,
+       0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251,
+       0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,
+       0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,
+       0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,
+       0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
+       0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
+       0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,
+       0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008,
+       0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008,
+       0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,
+       0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,
+       0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,
+       0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,
+       0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,
+       0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,
+       0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,
+       0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
+       0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
+       0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008,
+       0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
+       0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
+       0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
+       0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
+       0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,
+       0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008,
+       0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045,
+       0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008,
+       0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,
+       0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045,
+       0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,
+       0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,
+       0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,
+       0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,
+       0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,
+       0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,
+       0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,
+       0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,
+       0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,
+       0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,
+       0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,
+       0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,
+       0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,
+       0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,
+       0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459,
+       0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,
+       0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489,
+       0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,
+       0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
+       0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,
+       0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,
+       0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,
+       0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,
+       0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,
+       0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,
+       0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,
+       0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,
+       0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d,
+       0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e,
+       0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,
+       0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
+       0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,
+       0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,
+       0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,
+       0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
+       0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,
+       0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,
+       0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,
+       0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,
+       0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
+       0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,
+       0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,
+       0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,
+       0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,
+       0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd,
+       0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,
+       0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5,
+       0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,
+       0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,
+       0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,
+       0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,
+       0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,
+       0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,
+       0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,
+       0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,
+       0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e,
+       0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249,
+       0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,
+       0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,
+       0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,
+       0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018,
+       0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,
+       0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,
+       0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,
+       0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd,
+       0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,
+       0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,
+       0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,
+       0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,
+       0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,
+       0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439,
+       0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,
+       0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,
+       0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,
+       0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5,
+       0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,
+       0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,
+       0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
+       0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
+       0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,
+       0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,
+       0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,
+       0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,
+       0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26,
+       0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6,
+       0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,
+       0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
+       0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
+       0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
+       0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46,
+       0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06,
+       0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6,
+       0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86,
+       0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46,
+       0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,
+       0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,
+       0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,
+       0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,
+       0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,
+       0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,
+       0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,
+       0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,
+       0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
+       0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,
+       0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
+       0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008,
+       0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008,
+       0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,
+       0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,
+       0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,
+       0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd,
+       0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
+       0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,
+       0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
+       0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,
+       0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,
+       // Block 0x38, offset 0xe00
+       0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,
+       0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,
+       0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008,
+       0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008,
+       0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008,
+       0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008,
+       0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,
+       0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308,
+       0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040,
+       0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018,
+       0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d,
+       0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d,
+       0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d,
+       0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040,
+       0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040,
+       0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040,
+       0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040,
+       0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040,
+       0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040,
+       0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,
+       0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
+       0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,
+       0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,
+       0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,
+       0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018,
+       0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018,
+       0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018,
+       0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018,
+       0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018,
+       0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018,
+       0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd,
+       0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd,
+       0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d,
+       0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d,
+       0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d,
+       0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd,
+       0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d,
+       0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd,
+       0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d,
+       0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd,
+       0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d,
+       // Block 0x3c, offset 0xf00
+       0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd,
+       0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d,
+       0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018,
+       0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd,
+       0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d,
+       0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008,
+       0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008,
+       0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008,
+       0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008,
+       0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040,
+       0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040,
+       // Block 0x3d, offset 0xf40
+       0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd,
+       0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,
+       0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761,
+       0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,
+       0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,
+       0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd,
+       0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d,
+       0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d,
+       0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd,
+       0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d,
+       0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d,
+       0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d,
+       0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd,
+       0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd,
+       0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d,
+       0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d,
+       0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd,
+       0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d,
+       0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,
+       0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,
+       0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,
+       0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,
+       0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15,
+       0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75,
+       0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded,
+       0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d,
+       0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5,
+       0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d,
+       0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d,
+       0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd,
+       0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9,
+       0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1,
+       0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9,
+       0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549,
+       0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1,
+       0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11,
+       0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91,
+       0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9,
+       0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011,
+       0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209,
+       0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541,
+       0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781,
+       0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979,
+       0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89,
+       0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1,
+       0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99,
+       0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9,
+       0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9,
+       0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069,
+       0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9,
+       0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9,
+       // Block 0x42, offset 0x1080
+       0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271,
+       0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9,
+       0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed,
+       0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371,
+       0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9,
+       0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d,
+       0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211,
+       0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1,
+       0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599,
+       0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9,
+       0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611,
+       // Block 0x43, offset 0x10c0
+       0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671,
+       0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709,
+       0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781,
+       0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1,
+       0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811,
+       0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901,
+       0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1,
+       0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11,
+       0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31,
+       0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51,
+       0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d,
+       // Block 0x44, offset 0x1100
+       0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
+       0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
+       0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
+       0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
+       0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,
+       0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,
+       0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,
+       0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,
+       0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,
+       0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,
+       0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,
+       // Block 0x45, offset 0x1140
+       0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,
+       0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,
+       0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,
+       0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,
+       0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11,
+       0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,
+       0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,
+       0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,
+       0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
+       0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,
+       0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,
+       0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,
+       0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,
+       0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,
+       0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,
+       0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+       0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
+       0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
+       0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,
+       0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,
+       0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,
+       // Block 0x47, offset 0x11c0
+       0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
+       0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,
+       0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
+       0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
+       0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
+       0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
+       0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
+       0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,
+       0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,
+       0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,
+       0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008,
+       // Block 0x48, offset 0x1200
+       0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,
+       0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,
+       0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,
+       0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
+       0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,
+       0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,
+       0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,
+       0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040,
+       0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008,
+       0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,
+       0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575,
+       0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635,
+       0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008,
+       0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715,
+       0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5,
+       0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008,
+       0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
+       0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935,
+       0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5,
+       0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5,
+       0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35,
+       0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5,
+       0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19,
+       0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91,
+       0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
+       0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
+       0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
+       0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
+       0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
+       0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
+       0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
+       // Block 0x4b, offset 0x12c0
+       0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001,
+       0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
+       0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
+       0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9,
+       0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1,
+       0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149,
+       0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2,
+       0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1,
+       0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1,
+       0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479,
+       0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040,
+       0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659,
+       0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721,
+       0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751,
+       0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769,
+       0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799,
+       0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1,
+       0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1,
+       0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9,
+       0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829,
+       0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841,
+       // Block 0x4d, offset 0x1340
+       0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871,
+       0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9,
+       0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9,
+       0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919,
+       0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931,
+       0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961,
+       0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991,
+       0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1,
+       0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
+       0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
+       0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
+       0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
+       0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
+       0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09,
+       0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479,
+       0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81,
+       0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1,
+       0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19,
+       0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91,
+       0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1,
+       0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1,
+       0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1,
+       0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1,
+       0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991,
+       0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81,
+       0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a,
+       0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99,
+       0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89,
+       0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79,
+       0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19,
+       0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649,
+       0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9,
+       0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49,
+       0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21,
+       0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9,
+       0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01,
+       0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91,
+       0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9,
+       0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171,
+       0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289,
+       0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1,
+       0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621,
+       0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739,
+       0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1,
+       0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9,
+       0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29,
+       0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079,
+       0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1,
+       0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171,
+       0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261,
+       0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1,
+       0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1,
+       0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171,
+       0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261,
+       0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351,
+       0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441,
+       0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509,
+       0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1,
+       0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081,
+       0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239,
+       0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,
+       0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
+       0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609,
+       0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721,
+       0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839,
+       0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919,
+       0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9,
+       0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9,
+       0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9,
+       0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1,
+       0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79,
+       // Block 0x54, offset 0x1500
+       0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989,
+       0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
+       0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,
+       0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
+       0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
+       0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
+       0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
+       0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
+       0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9,
+       0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12,
+       0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
+       0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
+       0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55,
+       0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75,
+       0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
+       0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
+       0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
+       0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
+       0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2,
+       0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35,
+       0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018,
+       0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56,
+       0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95,
+       0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa,
+       0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95,
+       0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99,
+       0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda,
+       0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
+       0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040,
+       0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081,
+       0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141,
+       0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171,
+       0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1,
+       0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1,
+       0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201,
+       0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219,
+       0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249,
+       0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291,
+       0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1,
+       0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9,
+       0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1,
+       // Block 0x58, offset 0x1600
+       0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321,
+       0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339,
+       0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369,
+       0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381,
+       0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1,
+       0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9,
+       0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9,
+       0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1,
+       0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441,
+       0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9,
+       0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea,
+       0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2,
+       0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9,
+       0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,
+       0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2,
+       0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,
+       0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,
+       0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,
+       0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,
+       0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a,
+       0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,
+       0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,
+       0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,
+       0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,
+       0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a,
+       0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115,
+       0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5,
+       0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295,
+       0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355,
+       0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415,
+       0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515,
+       0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595,
+       0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5,
+       0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655,
+       0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115,
+       0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735,
+       0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5,
+       0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5,
+       0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5,
+       0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5,
+       0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5,
+       0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715,
+       0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040,
+       0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935,
+       0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040,
+       0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6,
+       0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35,
+       0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040,
+       0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
+       0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
+       0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,
+       0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,
+       0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,
+       0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,
+       0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,
+       0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,
+       0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
+       0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,
+       0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,
+       0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
+       0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
+       // Block 0x5e, offset 0x1780
+       0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,
+       0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,
+       0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,
+       0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,
+       0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,
+       0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,
+       0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,
+       0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,
+       0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,
+       0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,
+       0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
+       // Block 0x5f, offset 0x17c0
+       0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,
+       0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,
+       0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,
+       0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,
+       0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,
+       0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,
+       0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,
+       0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,
+       0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,
+       0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040,
+       0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,
+       0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,
+       0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,
+       0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,
+       0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,
+       0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,
+       0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,
+       0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,
+       0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,
+       0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
+       0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199,
+       0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359,
+       0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269,
+       0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369,
+       0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9,
+       0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259,
+       0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99,
+       0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089,
+       0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9,
+       0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249,
+       0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269,
+       0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369,
+       0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9,
+       0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259,
+       0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99,
+       0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089,
+       0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9,
+       0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249,
+       0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71,
+       0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9,
+       0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9,
+       0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259,
+       0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99,
+       0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089,
+       0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040,
+       0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040,
+       0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71,
+       0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9,
+       0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1,
+       0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199,
+       0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99,
+       0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089,
+       0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9,
+       0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249,
+       0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71,
+       0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9,
+       0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1,
+       0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199,
+       0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359,
+       0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269,
+       0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9,
+       0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040,
+       0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71,
+       0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9,
+       0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040,
+       0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199,
+       0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359,
+       0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269,
+       0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369,
+       0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9,
+       0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040,
+       0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9,
+       0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040,
+       0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199,
+       0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359,
+       0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269,
+       0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369,
+       0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9,
+       0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259,
+       0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99,
+       0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9,
+       // Block 0x67, offset 0x19c0
+       0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1,
+       0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199,
+       0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359,
+       0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269,
+       0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369,
+       0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9,
+       0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259,
+       0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99,
+       0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089,
+       0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9,
+       0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199,
+       // Block 0x68, offset 0x1a00
+       0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359,
+       0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269,
+       0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369,
+       0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9,
+       0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259,
+       0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99,
+       0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089,
+       0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9,
+       0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249,
+       0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71,
+       0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269,
+       // Block 0x69, offset 0x1a40
+       0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369,
+       0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9,
+       0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259,
+       0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99,
+       0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089,
+       0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9,
+       0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249,
+       0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71,
+       0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9,
+       0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1,
+       0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9,
+       // Block 0x6a, offset 0x1a80
+       0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259,
+       0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99,
+       0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089,
+       0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9,
+       0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249,
+       0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71,
+       0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9,
+       0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1,
+       0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199,
+       0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359,
+       0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089,
+       0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9,
+       0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249,
+       0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71,
+       0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9,
+       0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1,
+       0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099,
+       0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429,
+       0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71,
+       0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9,
+       0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9,
+       0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11,
+       0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109,
+       0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1,
+       0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429,
+       0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099,
+       0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429,
+       0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71,
+       0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9,
+       0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01,
+       0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11,
+       0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109,
+       0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1,
+       0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429,
+       0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099,
+       0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429,
+       0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71,
+       0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9,
+       0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01,
+       0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1,
+       0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109,
+       0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1,
+       0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429,
+       0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099,
+       0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429,
+       0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71,
+       0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9,
+       0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01,
+       0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1,
+       0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41,
+       0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1,
+       0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429,
+       0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099,
+       0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429,
+       0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71,
+       0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9,
+       0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01,
+       0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1,
+       0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41,
+       0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1,
+       0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1,
+       // Block 0x70, offset 0x1c00
+       0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429,
+       0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41,
+       0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079,
+       0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1,
+       0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61,
+       0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9,
+       0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81,
+       0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079,
+       0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1,
+       0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61,
+       0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1,
+       // Block 0x71, offset 0x1c40
+       0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115,
+       0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135,
+       0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115,
+       0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175,
+       0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115,
+       0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08,
+       0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08,
+       0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08,
+       0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08,
+       0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08,
+       0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08,
+       // Block 0x72, offset 0x1c80
+       0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411,
+       0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1,
+       0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9,
+       0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231,
+       0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949,
+       0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,
+       0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429,
+       0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
+       0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
+       0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351,
+       0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040,
+       // Block 0x73, offset 0x1cc0
+       0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040,
+       0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,
+       0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9,
+       0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231,
+       0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949,
+       0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040,
+       0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,
+       0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,
+       0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,
+       0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,
+       0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040,
+       // Block 0x74, offset 0x1d00
+       0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411,
+       0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1,
+       0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9,
+       0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231,
+       0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040,
+       0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249,
+       0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429,
+       0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339,
+       0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1,
+       0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351,
+       0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040,
+       // Block 0x75, offset 0x1d40
+       0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02,
+       0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018,
+       0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2,
+       0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72,
+       0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32,
+       0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2,
+       0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2,
+       0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040,
+       0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199,
+       0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359,
+       0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99,
+       // Block 0x76, offset 0x1d80
+       0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089,
+       0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1,
+       0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018,
+       0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018,
+       0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018,
+       0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018,
+       0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018,
+       0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040,
+       0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018,
+       0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018,
+       0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018,
+       // Block 0x77, offset 0x1dc0
+       0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040,
+       0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040,
+       0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289,
+       0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349,
+       0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409,
+       0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9,
+       0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589,
+       0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649,
+       0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709,
+       0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9,
+       0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040,
+       // Block 0x78, offset 0x1e00
+       0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79,
+       0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39,
+       0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9,
+       0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39,
+       0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9,
+       0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79,
+       0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39,
+       0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9,
+       0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059,
+       0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9,
+       0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179,
+       // Block 0x79, offset 0x1e40
+       0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239,
+       0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9,
+       0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399,
+       0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459,
+       0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309,
+       0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559,
+       0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9,
+       0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679,
+       0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9,
+       0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d,
+       0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9,
+       // Block 0x7a, offset 0x1e80
+       0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9,
+       0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959,
+       0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d,
+       0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d,
+       0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9,
+       0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99,
+       0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9,
+       0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9,
+       0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99,
+       0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39,
+       0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99,
+       // Block 0x7b, offset 0x1ec0
+       0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639,
+       0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9,
+       0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d,
+       0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9,
+       0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d,
+       0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd,
+       0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979,
+       0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19,
+       0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d,
+       0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d,
+       0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59,
+       // Block 0x7c, offset 0x1f00
+       0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99,
+       0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39,
+       0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9,
+       0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39,
+       0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd,
+       0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19,
+       0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9,
+       0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59,
+       0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd,
+       0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d,
+       0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079,
+       // Block 0x7d, offset 0x1f40
+       0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d,
+       0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d,
+       0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879,
+       0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919,
+       0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd,
+       0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9,
+       0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99,
+       0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39,
+       0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9,
+       0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d,
+       0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79,
+       // Block 0x7e, offset 0x1f80
+       0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19,
+       0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9,
+       0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59,
+       0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9,
+       0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d,
+       0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040,
+       0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040,
+       0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040,
+       0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040,
+       0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040,
+       0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040,
+}
+
+// idnaIndex: 36 blocks, 2304 entries, 4608 bytes
+// Block 0 is the zero block.
+var idnaIndex = [2304]uint16{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
+       0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
+       0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84,
+       0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
+       0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,
+       0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21,
+       // Block 0x4, offset 0x100
+       0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16,
+       0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d,
+       0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91,
+       0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96,
+       // Block 0x5, offset 0x140
+       0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,
+       0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,
+       0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,
+       0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,
+       0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,
+       0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,
+       0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3,
+       0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c,
+       // Block 0x6, offset 0x180
+       0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b,
+       0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b,
+       0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
+       0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,
+       0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,
+       0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0,
+       0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5,
+       0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,
+       0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,
+       0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,
+       0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,
+       0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,
+       0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,
+       0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,
+       0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,
+       0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,
+       0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,
+       0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,
+       0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,
+       0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,
+       0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,
+       0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,
+       // Block 0x9, offset 0x240
+       0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,
+       0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,
+       0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,
+       0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,
+       0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,
+       0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,
+       0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,
+       0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,
+       // Block 0xa, offset 0x280
+       0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,
+       0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,
+       0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,
+       0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,
+       0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,
+       0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,
+       0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,
+       0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,
+       0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,
+       0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,
+       0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,
+       0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,
+       0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,
+       0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,
+       0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,
+       // Block 0xc, offset 0x300
+       0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,
+       0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,
+       0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,
+       0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa,
+       // Block 0xd, offset 0x340
+       0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,
+       0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,
+       0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,
+       0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,
+       0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,
+       0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,
+       0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,
+       0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,
+       // Block 0xe, offset 0x380
+       0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,
+       0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,
+       0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,
+       0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,
+       0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe,
+       0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,
+       0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52,
+       0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108,
+       0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e,
+       0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba,
+       0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba,
+       0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c,
+       0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba,
+       0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,
+       0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba,
+       // Block 0x10, offset 0x400
+       0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e,
+       0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba,
+       0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137,
+       0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,
+       0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,
+       0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,
+       0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba,
+       0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,
+       // Block 0x11, offset 0x440
+       0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,
+       0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba,
+       0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba,
+       0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,
+       0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,
+       0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,
+       0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,
+       0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,
+       // Block 0x12, offset 0x480
+       0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,
+       0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,
+       0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,
+       0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,
+       0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,
+       0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,
+       0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,
+       0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,
+       0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,
+       0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,
+       0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,
+       0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,
+       0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,
+       0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,
+       0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,
+       // Block 0x14, offset 0x500
+       0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,
+       0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,
+       0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,
+       0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,
+       0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,
+       0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba,
+       0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,
+       0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154,
+       // Block 0x15, offset 0x540
+       0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,
+       0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,
+       0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,
+       0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155,
+       0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,
+       0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,
+       0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,
+       0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,
+       // Block 0x16, offset 0x580
+       0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f,
+       0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,
+       0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,
+       0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,
+       0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,
+       0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,
+       0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,
+       0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160,
+       0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba,
+       0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66,
+       0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e,
+       0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,
+       0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,
+       0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,
+       0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,
+       // Block 0x18, offset 0x600
+       0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,
+       0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,
+       0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,
+       0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,
+       0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba,
+       0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,
+       0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,
+       0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,
+       // Block 0x19, offset 0x640
+       0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e,
+       0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
+       0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,
+       0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172,
+       0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179,
+       0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,
+       0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,
+       0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,
+       // Block 0x1a, offset 0x680
+       0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,
+       0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,
+       0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,
+       0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,
+       0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,
+       0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,
+       0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,
+       0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,
+       0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,
+       0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,
+       0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,
+       0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,
+       0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,
+       0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,
+       0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,
+       // Block 0x1c, offset 0x700
+       0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,
+       0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,
+       0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,
+       0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,
+       0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,
+       0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,
+       0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,
+       0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f,
+       // Block 0x1d, offset 0x740
+       0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f,
+       0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f,
+       0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f,
+       0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f,
+       0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f,
+       0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e,
+       0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,
+       0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,
+       // Block 0x1e, offset 0x780
+       0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba,
+       0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba,
+       0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba,
+       0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba,
+       0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b,
+       0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba,
+       0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba,
+       0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba,
+       // Block 0x1f, offset 0x7c0
+       0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07,
+       0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17,
+       0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07,
+       0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c,
+       0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,
+       0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,
+       // Block 0x20, offset 0x800
+       0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b,
+       0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b,
+       0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b,
+       0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b,
+       0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b,
+       0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b,
+       0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b,
+       0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b,
+       // Block 0x21, offset 0x840
+       0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184,
+       0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba,
+       0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba,
+       0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba,
+       0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba,
+       0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba,
+       0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba,
+       0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba,
+       // Block 0x22, offset 0x880
+       0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,
+       0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,
+       0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b,
+       0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b,
+       0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b,
+       0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b,
+       0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b,
+       0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,
+       0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,
+}
+
+// idnaSparseOffset: 264 entries, 528 bytes
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778}
+
+// idnaSparseValues: 1915 entries, 7660 bytes
+var idnaSparseValues = [1915]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x07},
+       {value: 0xe105, lo: 0x80, hi: 0x96},
+       {value: 0x0018, lo: 0x97, hi: 0x97},
+       {value: 0xe105, lo: 0x98, hi: 0x9e},
+       {value: 0x001f, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbf},
+       // Block 0x1, offset 0x8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0xe01d, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0335, lo: 0x83, hi: 0x83},
+       {value: 0x034d, lo: 0x84, hi: 0x84},
+       {value: 0x0365, lo: 0x85, hi: 0x85},
+       {value: 0xe00d, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0xe00d, lo: 0x88, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x89},
+       {value: 0xe00d, lo: 0x8a, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe00d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0x8d},
+       {value: 0xe00d, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0xbf},
+       // Block 0x2, offset 0x19
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x0249, lo: 0xb0, hi: 0xb0},
+       {value: 0x037d, lo: 0xb1, hi: 0xb1},
+       {value: 0x0259, lo: 0xb2, hi: 0xb2},
+       {value: 0x0269, lo: 0xb3, hi: 0xb3},
+       {value: 0x034d, lo: 0xb4, hi: 0xb4},
+       {value: 0x0395, lo: 0xb5, hi: 0xb5},
+       {value: 0xe1bd, lo: 0xb6, hi: 0xb6},
+       {value: 0x0279, lo: 0xb7, hi: 0xb7},
+       {value: 0x0289, lo: 0xb8, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbf},
+       // Block 0x3, offset 0x25
+       {value: 0x0000, lo: 0x01},
+       {value: 0x3308, lo: 0x80, hi: 0xbf},
+       // Block 0x4, offset 0x27
+       {value: 0x0000, lo: 0x04},
+       {value: 0x03f5, lo: 0x80, hi: 0x8f},
+       {value: 0xe105, lo: 0x90, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x5, offset 0x2c
+       {value: 0x0000, lo: 0x07},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x0545, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x0008, lo: 0x99, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xbf},
+       // Block 0x6, offset 0x34
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0401, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x88},
+       {value: 0x0018, lo: 0x89, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x3308, lo: 0x91, hi: 0xbd},
+       {value: 0x0818, lo: 0xbe, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x7, offset 0x3f
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0818, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x82},
+       {value: 0x0818, lo: 0x83, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x85},
+       {value: 0x0818, lo: 0x86, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0808, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x8, offset 0x4b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0a08, lo: 0x80, hi: 0x87},
+       {value: 0x0c08, lo: 0x88, hi: 0x99},
+       {value: 0x0a08, lo: 0x9a, hi: 0xbf},
+       // Block 0x9, offset 0x4f
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3308, lo: 0x80, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0c08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0a08, lo: 0x8e, hi: 0x98},
+       {value: 0x0c08, lo: 0x99, hi: 0x9b},
+       {value: 0x0a08, lo: 0x9c, hi: 0xaa},
+       {value: 0x0c08, lo: 0xab, hi: 0xac},
+       {value: 0x0a08, lo: 0xad, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb1},
+       {value: 0x0a08, lo: 0xb2, hi: 0xb2},
+       {value: 0x0c08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0a08, lo: 0xb5, hi: 0xb7},
+       {value: 0x0c08, lo: 0xb8, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbf},
+       // Block 0xa, offset 0x5e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xb0},
+       {value: 0x0808, lo: 0xb1, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xb, offset 0x63
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x89},
+       {value: 0x0a08, lo: 0x8a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0xc, offset 0x6b
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x99},
+       {value: 0x0808, lo: 0x9a, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa3},
+       {value: 0x0808, lo: 0xa4, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa7},
+       {value: 0x0808, lo: 0xa8, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0818, lo: 0xb0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xd, offset 0x77
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0a08, lo: 0xa0, hi: 0xa9},
+       {value: 0x0c08, lo: 0xaa, hi: 0xac},
+       {value: 0x0808, lo: 0xad, hi: 0xad},
+       {value: 0x0c08, lo: 0xae, hi: 0xae},
+       {value: 0x0a08, lo: 0xaf, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb2},
+       {value: 0x0a08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0a08, lo: 0xb6, hi: 0xb8},
+       {value: 0x0c08, lo: 0xb9, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0xe, offset 0x85
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x93},
+       {value: 0x3308, lo: 0x94, hi: 0xa1},
+       {value: 0x0840, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xbf},
+       // Block 0xf, offset 0x8a
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x10, offset 0x93
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x85},
+       {value: 0x3008, lo: 0x86, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x3008, lo: 0x8a, hi: 0x8c},
+       {value: 0x3b08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x11, offset 0xa3
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xa9},
+       {value: 0x0008, lo: 0xaa, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x12, offset 0xb1
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xba},
+       {value: 0x3b08, lo: 0xbb, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x13, offset 0xbd
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0040, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x14, offset 0xc9
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x89},
+       {value: 0x3b08, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x3008, lo: 0x98, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x15, offset 0xda
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb2},
+       {value: 0x08f1, lo: 0xb3, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb9},
+       {value: 0x3b08, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x0018, lo: 0xbf, hi: 0xbf},
+       // Block 0x16, offset 0xe4
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x8e},
+       {value: 0x0018, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0xbf},
+       // Block 0x17, offset 0xeb
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0961, lo: 0x9c, hi: 0x9c},
+       {value: 0x0999, lo: 0x9d, hi: 0x9d},
+       {value: 0x0008, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x18, offset 0xf8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe03d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x19, offset 0x109
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0xbf},
+       // Block 0x1a, offset 0x110
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x1b, offset 0x11b
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x3008, lo: 0x96, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x3308, lo: 0x9e, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3008, lo: 0xa2, hi: 0xa4},
+       {value: 0x0008, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xbf},
+       // Block 0x1c, offset 0x12a
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x8c},
+       {value: 0x3308, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x3008, lo: 0x9a, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x1d, offset 0x138
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x86},
+       {value: 0x055d, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8c},
+       {value: 0x055d, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbb},
+       {value: 0xe105, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0x1e, offset 0x142
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0018, lo: 0x80, hi: 0xbf},
+       // Block 0x1f, offset 0x144
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa0},
+       {value: 0x2018, lo: 0xa1, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x20, offset 0x149
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa7},
+       {value: 0x2018, lo: 0xa8, hi: 0xbf},
+       // Block 0x21, offset 0x14c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2018, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0xbf},
+       // Block 0x22, offset 0x14f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0008, lo: 0x80, hi: 0xbf},
+       // Block 0x23, offset 0x151
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x24, offset 0x15d
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x25, offset 0x168
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x26, offset 0x170
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x27, offset 0x176
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x28, offset 0x17c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x29, offset 0x181
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x2a, offset 0x186
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x2b, offset 0x189
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xbf},
+       // Block 0x2c, offset 0x18d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x2d, offset 0x193
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0x2e, offset 0x198
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x3b08, lo: 0x94, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x2f, offset 0x1a4
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x30, offset 0x1ae
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xb3},
+       {value: 0x3340, lo: 0xb4, hi: 0xb5},
+       {value: 0x3008, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x31, offset 0x1b4
+       {value: 0x0000, lo: 0x10},
+       {value: 0x3008, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x88},
+       {value: 0x3308, lo: 0x89, hi: 0x91},
+       {value: 0x3b08, lo: 0x92, hi: 0x92},
+       {value: 0x3308, lo: 0x93, hi: 0x93},
+       {value: 0x0018, lo: 0x94, hi: 0x96},
+       {value: 0x0008, lo: 0x97, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x32, offset 0x1c5
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x86},
+       {value: 0x0218, lo: 0x87, hi: 0x87},
+       {value: 0x0018, lo: 0x88, hi: 0x8a},
+       {value: 0x33c0, lo: 0x8b, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0208, lo: 0xa0, hi: 0xbf},
+       // Block 0x33, offset 0x1cf
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0208, lo: 0x80, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x34, offset 0x1d2
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0208, lo: 0x87, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xa9},
+       {value: 0x0208, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x35, offset 0x1da
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0x36, offset 0x1dd
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x37, offset 0x1ea
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x38, offset 0x1f2
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x39, offset 0x1f6
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0028, lo: 0x9a, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0xbf},
+       // Block 0x3a, offset 0x1fd
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x3308, lo: 0x97, hi: 0x98},
+       {value: 0x3008, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x3b, offset 0x205
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x94},
+       {value: 0x3008, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3b08, lo: 0xa0, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xac},
+       {value: 0x3008, lo: 0xad, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x3c, offset 0x215
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xbd},
+       {value: 0x3318, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x221
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0040, lo: 0x80, hi: 0xbf},
+       // Block 0x3e, offset 0x223
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x83},
+       {value: 0x3008, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x3f, offset 0x22d
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x3808, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x40, offset 0x239
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3808, lo: 0xaa, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xbf},
+       // Block 0x41, offset 0x245
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3008, lo: 0xaa, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3808, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbf},
+       // Block 0x42, offset 0x251
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x3008, lo: 0xa4, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbf},
+       // Block 0x43, offset 0x259
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x44, offset 0x25e
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0e29, lo: 0x80, hi: 0x80},
+       {value: 0x0e41, lo: 0x81, hi: 0x81},
+       {value: 0x0e59, lo: 0x82, hi: 0x82},
+       {value: 0x0e71, lo: 0x83, hi: 0x83},
+       {value: 0x0e89, lo: 0x84, hi: 0x85},
+       {value: 0x0ea1, lo: 0x86, hi: 0x86},
+       {value: 0x0eb9, lo: 0x87, hi: 0x87},
+       {value: 0x057d, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0x45, offset 0x268
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x92},
+       {value: 0x0018, lo: 0x93, hi: 0x93},
+       {value: 0x3308, lo: 0x94, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa8},
+       {value: 0x0008, lo: 0xa9, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x3008, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x46, offset 0x279
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0x47, offset 0x27d
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x87},
+       {value: 0xe045, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0xe045, lo: 0x98, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0xe045, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbf},
+       // Block 0x48, offset 0x288
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x3318, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbf},
+       // Block 0x49, offset 0x28c
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x88},
+       {value: 0x24c1, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x4a, offset 0x295
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x24f1, lo: 0xac, hi: 0xac},
+       {value: 0x2529, lo: 0xad, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xae},
+       {value: 0x2579, lo: 0xaf, hi: 0xaf},
+       {value: 0x25b1, lo: 0xb0, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0x4b, offset 0x29d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x9f},
+       {value: 0x0080, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xad},
+       {value: 0x0080, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x4c, offset 0x2a3
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xa8},
+       {value: 0x09c5, lo: 0xa9, hi: 0xa9},
+       {value: 0x09e5, lo: 0xaa, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xbf},
+       // Block 0x4d, offset 0x2a8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xbf},
+       // Block 0x4e, offset 0x2ab
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x28c1, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0xbf},
+       // Block 0x4f, offset 0x2af
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0e66, lo: 0xb4, hi: 0xb4},
+       {value: 0x292a, lo: 0xb5, hi: 0xb5},
+       {value: 0x0e86, lo: 0xb6, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x50, offset 0x2b5
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x9b},
+       {value: 0x2941, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0xbf},
+       // Block 0x51, offset 0x2b9
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x52, offset 0x2bd
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbc},
+       {value: 0x0018, lo: 0xbd, hi: 0xbf},
+       // Block 0x53, offset 0x2c3
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x92},
+       {value: 0x0040, lo: 0x93, hi: 0xab},
+       {value: 0x0018, lo: 0xac, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x54, offset 0x2ca
+       {value: 0x0000, lo: 0x05},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x03f5, lo: 0x90, hi: 0x9f},
+       {value: 0x0ea5, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x55, offset 0x2d0
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xac},
+       {value: 0x0008, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x56, offset 0x2d8
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xae},
+       {value: 0xe075, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0x57, offset 0x2df
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x58, offset 0x2ea
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xbf},
+       // Block 0x59, offset 0x2f4
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x5a, offset 0x2f8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0xbf},
+       // Block 0x5b, offset 0x2fb
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9e},
+       {value: 0x0edd, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0x5c, offset 0x301
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb2},
+       {value: 0x0efd, lo: 0xb3, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x5d, offset 0x305
+       {value: 0x0020, lo: 0x01},
+       {value: 0x0f1d, lo: 0x80, hi: 0xbf},
+       // Block 0x5e, offset 0x307
+       {value: 0x0020, lo: 0x02},
+       {value: 0x171d, lo: 0x80, hi: 0x8f},
+       {value: 0x18fd, lo: 0x90, hi: 0xbf},
+       // Block 0x5f, offset 0x30a
+       {value: 0x0020, lo: 0x01},
+       {value: 0x1efd, lo: 0x80, hi: 0xbf},
+       // Block 0x60, offset 0x30c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x61, offset 0x30f
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9a},
+       {value: 0x29e2, lo: 0x9b, hi: 0x9b},
+       {value: 0x2a0a, lo: 0x9c, hi: 0x9c},
+       {value: 0x0008, lo: 0x9d, hi: 0x9e},
+       {value: 0x2a31, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xbf},
+       // Block 0x62, offset 0x319
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xbe},
+       {value: 0x2a69, lo: 0xbf, hi: 0xbf},
+       // Block 0x63, offset 0x31c
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0040, lo: 0x80, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xb0},
+       {value: 0x2a1d, lo: 0xb1, hi: 0xb1},
+       {value: 0x2a3d, lo: 0xb2, hi: 0xb2},
+       {value: 0x2a5d, lo: 0xb3, hi: 0xb3},
+       {value: 0x2a7d, lo: 0xb4, hi: 0xb4},
+       {value: 0x2a5d, lo: 0xb5, hi: 0xb5},
+       {value: 0x2a9d, lo: 0xb6, hi: 0xb6},
+       {value: 0x2abd, lo: 0xb7, hi: 0xb7},
+       {value: 0x2add, lo: 0xb8, hi: 0xb9},
+       {value: 0x2afd, lo: 0xba, hi: 0xbb},
+       {value: 0x2b1d, lo: 0xbc, hi: 0xbd},
+       {value: 0x2afd, lo: 0xbe, hi: 0xbf},
+       // Block 0x64, offset 0x32b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x65, offset 0x32f
+       {value: 0x0030, lo: 0x04},
+       {value: 0x2aa2, lo: 0x80, hi: 0x9d},
+       {value: 0x305a, lo: 0x9e, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x30a2, lo: 0xa0, hi: 0xbf},
+       // Block 0x66, offset 0x334
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xbf},
+       // Block 0x67, offset 0x337
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x68, offset 0x33b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x69, offset 0x340
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xbf},
+       // Block 0x6a, offset 0x345
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb1},
+       {value: 0x0018, lo: 0xb2, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x6b, offset 0x34b
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0xb6},
+       {value: 0x0008, lo: 0xb7, hi: 0xb7},
+       {value: 0x2009, lo: 0xb8, hi: 0xb8},
+       {value: 0x6e89, lo: 0xb9, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xbf},
+       // Block 0x6c, offset 0x351
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x3308, lo: 0x8b, hi: 0x8b},
+       {value: 0x0008, lo: 0x8c, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x6d, offset 0x360
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0208, lo: 0x80, hi: 0xb1},
+       {value: 0x0108, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x6e, offset 0x366
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xbf},
+       // Block 0x6f, offset 0x36a
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3008, lo: 0x80, hi: 0x83},
+       {value: 0x3b08, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xba},
+       {value: 0x0008, lo: 0xbb, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x70, offset 0x379
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x71, offset 0x37e
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x91},
+       {value: 0x3008, lo: 0x92, hi: 0x92},
+       {value: 0x3808, lo: 0x93, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x72, offset 0x386
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb9},
+       {value: 0x3008, lo: 0xba, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x73, offset 0x390
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x74, offset 0x39b
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x75, offset 0x3a3
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8c},
+       {value: 0x3008, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0008, lo: 0xbe, hi: 0xbf},
+       // Block 0x76, offset 0x3b4
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x77, offset 0x3bd
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x9a},
+       {value: 0x0008, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3b08, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x78, offset 0x3cd
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x90},
+       {value: 0x0008, lo: 0x91, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x79, offset 0x3da
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x4465, lo: 0x9c, hi: 0x9c},
+       {value: 0x447d, lo: 0x9d, hi: 0x9d},
+       {value: 0x2971, lo: 0x9e, hi: 0x9e},
+       {value: 0xe06d, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xaf},
+       {value: 0x4495, lo: 0xb0, hi: 0xbf},
+       // Block 0x7a, offset 0x3e4
+       {value: 0x0000, lo: 0x04},
+       {value: 0x44b5, lo: 0x80, hi: 0x8f},
+       {value: 0x44d5, lo: 0x90, hi: 0x9f},
+       {value: 0x44f5, lo: 0xa0, hi: 0xaf},
+       {value: 0x44d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x7b, offset 0x3e9
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3b08, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x7c, offset 0x3f6
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x7d, offset 0x3fa
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x7e, offset 0x3ff
+       {value: 0x0020, lo: 0x01},
+       {value: 0x4515, lo: 0x80, hi: 0xbf},
+       // Block 0x7f, offset 0x401
+       {value: 0x0020, lo: 0x03},
+       {value: 0x4d15, lo: 0x80, hi: 0x94},
+       {value: 0x4ad5, lo: 0x95, hi: 0x95},
+       {value: 0x4fb5, lo: 0x96, hi: 0xbf},
+       // Block 0x80, offset 0x405
+       {value: 0x0020, lo: 0x01},
+       {value: 0x54f5, lo: 0x80, hi: 0xbf},
+       // Block 0x81, offset 0x407
+       {value: 0x0020, lo: 0x03},
+       {value: 0x5cf5, lo: 0x80, hi: 0x84},
+       {value: 0x5655, lo: 0x85, hi: 0x85},
+       {value: 0x5d95, lo: 0x86, hi: 0xbf},
+       // Block 0x82, offset 0x40b
+       {value: 0x0020, lo: 0x08},
+       {value: 0x6b55, lo: 0x80, hi: 0x8f},
+       {value: 0x6d15, lo: 0x90, hi: 0x90},
+       {value: 0x6d55, lo: 0x91, hi: 0xab},
+       {value: 0x6ea1, lo: 0xac, hi: 0xac},
+       {value: 0x70b5, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x70d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x83, offset 0x414
+       {value: 0x0020, lo: 0x05},
+       {value: 0x72d5, lo: 0x80, hi: 0xad},
+       {value: 0x6535, lo: 0xae, hi: 0xae},
+       {value: 0x7895, lo: 0xaf, hi: 0xb5},
+       {value: 0x6f55, lo: 0xb6, hi: 0xb6},
+       {value: 0x7975, lo: 0xb7, hi: 0xbf},
+       // Block 0x84, offset 0x41a
+       {value: 0x0028, lo: 0x03},
+       {value: 0x7c21, lo: 0x80, hi: 0x82},
+       {value: 0x7be1, lo: 0x83, hi: 0x83},
+       {value: 0x7c99, lo: 0x84, hi: 0xbf},
+       // Block 0x85, offset 0x41e
+       {value: 0x0038, lo: 0x0f},
+       {value: 0x9db1, lo: 0x80, hi: 0x83},
+       {value: 0x9e59, lo: 0x84, hi: 0x85},
+       {value: 0x9e91, lo: 0x86, hi: 0x87},
+       {value: 0x9ec9, lo: 0x88, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0xa089, lo: 0x92, hi: 0x97},
+       {value: 0xa1a1, lo: 0x98, hi: 0x9c},
+       {value: 0xa281, lo: 0x9d, hi: 0xb3},
+       {value: 0x9d41, lo: 0xb4, hi: 0xb4},
+       {value: 0x9db1, lo: 0xb5, hi: 0xb5},
+       {value: 0xa789, lo: 0xb6, hi: 0xbb},
+       {value: 0xa869, lo: 0xbc, hi: 0xbc},
+       {value: 0xa7f9, lo: 0xbd, hi: 0xbd},
+       {value: 0xa8d9, lo: 0xbe, hi: 0xbf},
+       // Block 0x86, offset 0x42e
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x0008, lo: 0xbc, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x87, offset 0x438
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0x88, offset 0x43d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x89, offset 0x440
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x8a, offset 0x446
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0x8b, offset 0x44d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x8c, offset 0x452
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x8d, offset 0x456
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x8e, offset 0x45c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xac},
+       {value: 0x0008, lo: 0xad, hi: 0xbf},
+       // Block 0x8f, offset 0x461
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x90, offset 0x46a
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x91, offset 0x46f
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0xbf},
+       // Block 0x92, offset 0x475
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x97},
+       {value: 0x8ad5, lo: 0x98, hi: 0x9f},
+       {value: 0x8aed, lo: 0xa0, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xbf},
+       // Block 0x93, offset 0x47c
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x8aed, lo: 0xb0, hi: 0xb7},
+       {value: 0x8ad5, lo: 0xb8, hi: 0xbf},
+       // Block 0x94, offset 0x483
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x95, offset 0x48a
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x96, offset 0x48e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xae},
+       {value: 0x0018, lo: 0xaf, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x97, offset 0x493
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x98, offset 0x496
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xbf},
+       // Block 0x99, offset 0x49b
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0808, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0808, lo: 0x8a, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb6},
+       {value: 0x0808, lo: 0xb7, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbb},
+       {value: 0x0808, lo: 0xbc, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x0808, lo: 0xbf, hi: 0xbf},
+       // Block 0x9a, offset 0x4a7
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x96},
+       {value: 0x0818, lo: 0x97, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb6},
+       {value: 0x0818, lo: 0xb7, hi: 0xbf},
+       // Block 0x9b, offset 0x4ad
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa6},
+       {value: 0x0818, lo: 0xa7, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x9c, offset 0x4b2
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xba},
+       {value: 0x0818, lo: 0xbb, hi: 0xbf},
+       // Block 0x9d, offset 0x4b9
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0818, lo: 0x96, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbe},
+       {value: 0x0818, lo: 0xbf, hi: 0xbf},
+       // Block 0x9e, offset 0x4c1
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbb},
+       {value: 0x0818, lo: 0xbc, hi: 0xbd},
+       {value: 0x0808, lo: 0xbe, hi: 0xbf},
+       // Block 0x9f, offset 0x4c6
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0818, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x0818, lo: 0x92, hi: 0xbf},
+       // Block 0xa0, offset 0x4ca
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0808, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x94},
+       {value: 0x0808, lo: 0x95, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0x98},
+       {value: 0x0808, lo: 0x99, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xa1, offset 0x4da
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0818, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0818, lo: 0x90, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xbc},
+       {value: 0x0818, lo: 0xbd, hi: 0xbf},
+       // Block 0xa2, offset 0x4e1
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0x9c},
+       {value: 0x0818, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xa3, offset 0x4e5
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb8},
+       {value: 0x0018, lo: 0xb9, hi: 0xbf},
+       // Block 0xa4, offset 0x4e9
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0818, lo: 0x98, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb7},
+       {value: 0x0818, lo: 0xb8, hi: 0xbf},
+       // Block 0xa5, offset 0x4f0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0808, lo: 0x80, hi: 0xbf},
+       // Block 0xa6, offset 0x4f2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0808, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0xa7, offset 0x4f5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x03dd, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xa8, offset 0x4f8
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xbf},
+       // Block 0xa9, offset 0x4fc
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0818, lo: 0xa0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xaa, offset 0x500
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xab, offset 0x506
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x91},
+       {value: 0x0018, lo: 0x92, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xac, offset 0x50f
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb6},
+       {value: 0x3008, lo: 0xb7, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbc},
+       {value: 0x0340, lo: 0xbd, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0xad, offset 0x51b
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xae, offset 0x522
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb2},
+       {value: 0x3b08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xbf},
+       // Block 0xaf, offset 0x52b
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xb0, offset 0x533
+       {value: 0x0000, lo: 0x06},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xbe},
+       {value: 0x3008, lo: 0xbf, hi: 0xbf},
+       // Block 0xb1, offset 0x53a
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x89},
+       {value: 0x3308, lo: 0x8a, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xb2, offset 0x548
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3808, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xb3, offset 0x555
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0008, lo: 0x9f, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0xb4, offset 0x562
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x3308, lo: 0x9f, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa9},
+       {value: 0x3b08, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xb5, offset 0x56b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xb6, offset 0x56f
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x84},
+       {value: 0x3008, lo: 0x85, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0xb7, offset 0x57d
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb8},
+       {value: 0x3008, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0xb8, offset 0x585
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x85},
+       {value: 0x0018, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xb9, offset 0x590
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xba, offset 0x599
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9b},
+       {value: 0x3308, lo: 0x9c, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0xbb, offset 0x59f
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xbc, offset 0x5a7
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xbd, offset 0x5b0
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb5},
+       {value: 0x3808, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0xbe, offset 0x5ba
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0xbf},
+       // Block 0xbf, offset 0x5bd
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbf},
+       // Block 0xc0, offset 0x5c9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xbf},
+       // Block 0xc1, offset 0x5cc
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0xc2, offset 0x5d1
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x88},
+       {value: 0x3308, lo: 0x89, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb8},
+       {value: 0x3008, lo: 0xb9, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbe},
+       {value: 0x0018, lo: 0xbf, hi: 0xbf},
+       // Block 0xc3, offset 0x5de
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x3b08, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x3308, lo: 0x91, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0xbf},
+       // Block 0xc4, offset 0x5e7
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x89},
+       {value: 0x3308, lo: 0x8a, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x98},
+       {value: 0x3b08, lo: 0x99, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0xa2},
+       {value: 0x0040, lo: 0xa3, hi: 0xbf},
+       // Block 0xc5, offset 0x5f3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xc6, offset 0x5f6
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xc7, offset 0x600
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xbf},
+       // Block 0xc8, offset 0x609
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xa9},
+       {value: 0x3308, lo: 0xaa, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xc9, offset 0x615
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0xca, offset 0x622
+       {value: 0x0000, lo: 0x07},
+       {value: 0x3308, lo: 0x80, hi: 0x83},
+       {value: 0x3b08, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xcb, offset 0x62a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xcc, offset 0x62d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xcd, offset 0x632
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0xbf},
+       // Block 0xce, offset 0x635
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xbf},
+       // Block 0xcf, offset 0x638
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0xbf},
+       // Block 0xd0, offset 0x63b
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xd1, offset 0x642
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xd2, offset 0x649
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0xd3, offset 0x64d
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x0008, lo: 0xa3, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0xd4, offset 0x658
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0xbf},
+       // Block 0xd5, offset 0x65b
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x3008, lo: 0x91, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xd6, offset 0x661
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8e},
+       {value: 0x3308, lo: 0x8f, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xd7, offset 0x666
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xbf},
+       // Block 0xd8, offset 0x66a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xd9, offset 0x66d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xda, offset 0x670
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xbf},
+       // Block 0xdb, offset 0x673
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0xdc, offset 0x676
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0xdd, offset 0x679
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0xde, offset 0x67e
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x03c0, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xbf},
+       // Block 0xdf, offset 0x688
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xe0, offset 0x68b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xbf},
+       // Block 0xe1, offset 0x68f
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0018, lo: 0x80, hi: 0x9d},
+       {value: 0xb5b9, lo: 0x9e, hi: 0x9e},
+       {value: 0xb601, lo: 0x9f, hi: 0x9f},
+       {value: 0xb649, lo: 0xa0, hi: 0xa0},
+       {value: 0xb6b1, lo: 0xa1, hi: 0xa1},
+       {value: 0xb719, lo: 0xa2, hi: 0xa2},
+       {value: 0xb781, lo: 0xa3, hi: 0xa3},
+       {value: 0xb7e9, lo: 0xa4, hi: 0xa4},
+       {value: 0x3018, lo: 0xa5, hi: 0xa6},
+       {value: 0x3318, lo: 0xa7, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xac},
+       {value: 0x3018, lo: 0xad, hi: 0xb2},
+       {value: 0x0340, lo: 0xb3, hi: 0xba},
+       {value: 0x3318, lo: 0xbb, hi: 0xbf},
+       // Block 0xe2, offset 0x69e
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3318, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0x84},
+       {value: 0x3318, lo: 0x85, hi: 0x8b},
+       {value: 0x0018, lo: 0x8c, hi: 0xa9},
+       {value: 0x3318, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xba},
+       {value: 0xb851, lo: 0xbb, hi: 0xbb},
+       {value: 0xb899, lo: 0xbc, hi: 0xbc},
+       {value: 0xb8e1, lo: 0xbd, hi: 0xbd},
+       {value: 0xb949, lo: 0xbe, hi: 0xbe},
+       {value: 0xb9b1, lo: 0xbf, hi: 0xbf},
+       // Block 0xe3, offset 0x6aa
+       {value: 0x0000, lo: 0x03},
+       {value: 0xba19, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xbf},
+       // Block 0xe4, offset 0x6ae
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x3318, lo: 0x82, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0xbf},
+       // Block 0xe5, offset 0x6b3
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xe6, offset 0x6b8
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0xe7, offset 0x6bc
+       {value: 0x0000, lo: 0x04},
+       {value: 0x3308, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0xe8, offset 0x6c1
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x3308, lo: 0xa1, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xe9, offset 0x6ca
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa4},
+       {value: 0x0040, lo: 0xa5, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xbf},
+       // Block 0xea, offset 0x6d5
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x86},
+       {value: 0x0818, lo: 0x87, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0xeb, offset 0x6db
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0a08, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0818, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xec, offset 0x6e3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xed, offset 0x6e7
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0xee, offset 0x6eb
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0xef, offset 0x6f1
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xf0, offset 0x6f7
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8f},
+       {value: 0xc1c1, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xf1, offset 0x6fc
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xbf},
+       // Block 0xf2, offset 0x6ff
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xc7e9, lo: 0x80, hi: 0x80},
+       {value: 0xc839, lo: 0x81, hi: 0x81},
+       {value: 0xc889, lo: 0x82, hi: 0x82},
+       {value: 0xc8d9, lo: 0x83, hi: 0x83},
+       {value: 0xc929, lo: 0x84, hi: 0x84},
+       {value: 0xc979, lo: 0x85, hi: 0x85},
+       {value: 0xc9c9, lo: 0x86, hi: 0x86},
+       {value: 0xca19, lo: 0x87, hi: 0x87},
+       {value: 0xca69, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0xcab9, lo: 0x90, hi: 0x90},
+       {value: 0xcad9, lo: 0x91, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xbf},
+       // Block 0xf3, offset 0x70f
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xf4, offset 0x716
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0xf5, offset 0x719
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0xbf},
+       // Block 0xf6, offset 0x71c
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0xf7, offset 0x720
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0xf8, offset 0x726
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xbf},
+       // Block 0xf9, offset 0x72b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xfa, offset 0x730
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xbf},
+       // Block 0xfb, offset 0x735
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0xbf},
+       // Block 0xfc, offset 0x738
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xbf},
+       // Block 0xfd, offset 0x73d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0xfe, offset 0x740
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xff, offset 0x743
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x100, offset 0x747
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x101, offset 0x74b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0x102, offset 0x74e
+       {value: 0x0020, lo: 0x0f},
+       {value: 0xdeb9, lo: 0x80, hi: 0x89},
+       {value: 0x8dfd, lo: 0x8a, hi: 0x8a},
+       {value: 0xdff9, lo: 0x8b, hi: 0x9c},
+       {value: 0x8e1d, lo: 0x9d, hi: 0x9d},
+       {value: 0xe239, lo: 0x9e, hi: 0xa2},
+       {value: 0x8e3d, lo: 0xa3, hi: 0xa3},
+       {value: 0xe2d9, lo: 0xa4, hi: 0xab},
+       {value: 0x7ed5, lo: 0xac, hi: 0xac},
+       {value: 0xe3d9, lo: 0xad, hi: 0xaf},
+       {value: 0x8e5d, lo: 0xb0, hi: 0xb0},
+       {value: 0xe439, lo: 0xb1, hi: 0xb6},
+       {value: 0x8e7d, lo: 0xb7, hi: 0xb9},
+       {value: 0xe4f9, lo: 0xba, hi: 0xba},
+       {value: 0x8edd, lo: 0xbb, hi: 0xbb},
+       {value: 0xe519, lo: 0xbc, hi: 0xbf},
+       // Block 0x103, offset 0x75e
+       {value: 0x0020, lo: 0x10},
+       {value: 0x937d, lo: 0x80, hi: 0x80},
+       {value: 0xf099, lo: 0x81, hi: 0x86},
+       {value: 0x939d, lo: 0x87, hi: 0x8a},
+       {value: 0xd9f9, lo: 0x8b, hi: 0x8b},
+       {value: 0xf159, lo: 0x8c, hi: 0x96},
+       {value: 0x941d, lo: 0x97, hi: 0x97},
+       {value: 0xf2b9, lo: 0x98, hi: 0xa3},
+       {value: 0x943d, lo: 0xa4, hi: 0xa6},
+       {value: 0xf439, lo: 0xa7, hi: 0xaa},
+       {value: 0x949d, lo: 0xab, hi: 0xab},
+       {value: 0xf4b9, lo: 0xac, hi: 0xac},
+       {value: 0x94bd, lo: 0xad, hi: 0xad},
+       {value: 0xf4d9, lo: 0xae, hi: 0xaf},
+       {value: 0x94dd, lo: 0xb0, hi: 0xb1},
+       {value: 0xf519, lo: 0xb2, hi: 0xbe},
+       {value: 0x2040, lo: 0xbf, hi: 0xbf},
+       // Block 0x104, offset 0x76f
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0340, lo: 0x81, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x9f},
+       {value: 0x0340, lo: 0xa0, hi: 0xbf},
+       // Block 0x105, offset 0x774
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0340, lo: 0x80, hi: 0xbf},
+       // Block 0x106, offset 0x776
+       {value: 0x0000, lo: 0x01},
+       {value: 0x33c0, lo: 0x80, hi: 0xbf},
+       // Block 0x107, offset 0x778
+       {value: 0x0000, lo: 0x02},
+       {value: 0x33c0, lo: 0x80, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+}
+
+// Total table size 42114 bytes (41KiB); checksum: 355A58A4
diff --git a/libgo/go/golang.org/x/net/idna/tables11.0.0.go b/libgo/go/golang.org/x/net/idna/tables11.0.0.go
new file mode 100644 (file)
index 0000000..c515d7a
--- /dev/null
@@ -0,0 +1,4653 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.13
+
+package idna
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "11.0.0"
+
+var mappings string = "" + // Size: 8175 bytes
+       "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
+       "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
+       "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
+       "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" +
+       "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" +
+       "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" +
+       "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" +
+       "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" +
+       "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" +
+       "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" +
+       "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" +
+       "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" +
+       "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" +
+       "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" +
+       "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" +
+       "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" +
+       "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" +
+       "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" +
+       "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" +
+       "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" +
+       "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" +
+       "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" +
+       "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" +
+       "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" +
+       "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" +
+       "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" +
+       ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" +
+       "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" +
+       "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" +
+       "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" +
+       "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" +
+       "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" +
+       "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" +
+       "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" +
+       "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" +
+       "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" +
+       "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" +
+       "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" +
+       "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" +
+       "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" +
+       "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" +
+       "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" +
+       "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" +
+       "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" +
+       "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" +
+       "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" +
+       "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" +
+       "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" +
+       "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" +
+       "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" +
+       "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" +
+       "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" +
+       "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" +
+       "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" +
+       "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" +
+       "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" +
+       "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" +
+       "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" +
+       "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" +
+       "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" +
+       "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" +
+       "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" +
+       "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" +
+       "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" +
+       "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" +
+       "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" +
+       "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" +
+       "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" +
+       "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" +
+       "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" +
+       "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" +
+       "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" +
+       "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" +
+       " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" +
+       "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" +
+       "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" +
+       "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" +
+       "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" +
+       "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" +
+       "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" +
+       "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" +
+       "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" +
+       "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" +
+       "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" +
+       "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" +
+       "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" +
+       "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" +
+       "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" +
+       "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" +
+       "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" +
+       "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" +
+       "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" +
+       "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" +
+       "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" +
+       "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" +
+       "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" +
+       "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" +
+       "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" +
+       "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" +
+       "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" +
+       "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" +
+       "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" +
+       "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" +
+       "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" +
+       "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" +
+       "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" +
+       "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" +
+       "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" +
+       "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" +
+       "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" +
+       "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" +
+       "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" +
+       "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" +
+       "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" +
+       "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" +
+       "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" +
+       "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" +
+       "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" +
+       "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" +
+       "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" +
+       "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" +
+       "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" +
+       "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" +
+       "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" +
+       "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" +
+       "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" +
+       "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" +
+       "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" +
+       "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" +
+       "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" +
+       "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" +
+       "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" +
+       "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" +
+       "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" +
+       "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" +
+       "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" +
+       "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻"
+
+var xorData string = "" + // Size: 4855 bytes
+       "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
+       "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" +
+       "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" +
+       "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" +
+       "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" +
+       "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" +
+       "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" +
+       "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" +
+       "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" +
+       "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" +
+       "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" +
+       "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" +
+       "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" +
+       "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" +
+       "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" +
+       "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" +
+       "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" +
+       "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" +
+       "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" +
+       "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" +
+       "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" +
+       "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" +
+       "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" +
+       "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" +
+       "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" +
+       "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" +
+       "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" +
+       "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" +
+       "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" +
+       "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" +
+       "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" +
+       "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" +
+       "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" +
+       "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" +
+       "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" +
+       "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" +
+       "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " +
+       "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" +
+       "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" +
+       "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" +
+       "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" +
+       "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" +
+       ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" +
+       "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" +
+       "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" +
+       "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" +
+       "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" +
+       "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" +
+       "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" +
+       "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" +
+       "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" +
+       "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" +
+       "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" +
+       "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" +
+       "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" +
+       "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" +
+       "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" +
+       "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" +
+       "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" +
+       "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" +
+       "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" +
+       "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" +
+       "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" +
+       "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" +
+       "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" +
+       "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" +
+       "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" +
+       "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" +
+       "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" +
+       "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" +
+       "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" +
+       "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" +
+       "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" +
+       "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" +
+       "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" +
+       "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" +
+       "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" +
+       "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" +
+       "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" +
+       "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" +
+       "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" +
+       "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" +
+       "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" +
+       "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" +
+       "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" +
+       "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" +
+       "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" +
+       "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" +
+       "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," +
+       "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" +
+       "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" +
+       "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" +
+       "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" +
+       ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" +
+       "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" +
+       "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" +
+       "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" +
+       "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" +
+       "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" +
+       "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" +
+       "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" +
+       "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" +
+       "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" +
+       "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" +
+       "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" +
+       "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" +
+       "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" +
+       "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" +
+       "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" +
+       "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" +
+       "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" +
+       "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" +
+       "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" +
+       "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" +
+       "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" +
+       "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" +
+       "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" +
+       "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" +
+       "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" +
+       "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" +
+       "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" +
+       "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" +
+       "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" +
+       "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" +
+       "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" +
+       "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" +
+       "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" +
+       "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" +
+       "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" +
+       "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." +
+       "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" +
+       "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" +
+       "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " +
+       "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" +
+       "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" +
+       "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" +
+       "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" +
+       "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" +
+       "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" +
+       "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," +
+       "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" +
+       "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" +
+       "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" +
+       "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" +
+       "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" +
+       "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" +
+       "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" +
+       "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" +
+       "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" +
+       "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" +
+       "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" +
+       "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" +
+       "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" +
+       "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" +
+       "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" +
+       "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" +
+       "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" +
+       "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" +
+       "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" +
+       "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" +
+       "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" +
+       "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" +
+       "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" +
+       "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" +
+       "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" +
+       "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" +
+       "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" +
+       "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" +
+       "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" +
+       "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" +
+       "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" +
+       "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" +
+       "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" +
+       "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" +
+       "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" +
+       "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" +
+       "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" +
+       "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" +
+       "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," +
+       "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" +
+       "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" +
+       "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" +
+       "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" +
+       "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" +
+       "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" +
+       "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" +
+       "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" +
+       "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" +
+       "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" +
+       "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" +
+       "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" +
+       "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" +
+       "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" +
+       "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" +
+       "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" +
+       "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" +
+       "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" +
+       "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" +
+       "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" +
+       "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" +
+       "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" +
+       "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" +
+       "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" +
+       "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" +
+       "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" +
+       "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" +
+       "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" +
+       "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" +
+       "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" +
+       "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" +
+       "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" +
+       "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" +
+       "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" +
+       "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" +
+       "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" +
+       "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" +
+       "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" +
+       "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" +
+       "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" +
+       "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" +
+       "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" +
+       "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" +
+       "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" +
+       "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" +
+       "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" +
+       "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" +
+       "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" +
+       "\x05\x22\x05\x03\x050\x1d"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// idnaTrie. Total size: 29404 bytes (28.71 KiB). Checksum: 848c45acb5f7991c.
+type idnaTrie struct{}
+
+func newIdnaTrie(i int) *idnaTrie {
+       return &idnaTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 125:
+               return uint16(idnaValues[n<<6+uint32(b)])
+       default:
+               n -= 125
+               return uint16(idnaSparse.lookup(n, b))
+       }
+}
+
+// idnaValues: 127 blocks, 8128 entries, 16256 bytes
+// The third block is the zero block.
+var idnaValues = [8128]uint16{
+       // Block 0x0, offset 0x0
+       0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
+       0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
+       0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,
+       0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,
+       0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,
+       0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,
+       0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,
+       0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,
+       0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,
+       0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,
+       0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,
+       // Block 0x1, offset 0x40
+       0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,
+       0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,
+       0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,
+       0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,
+       0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,
+       0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,
+       0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,
+       0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,
+       0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,
+       0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,
+       0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,
+       0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,
+       0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,
+       0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
+       0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
+       0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
+       0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,
+       0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,
+       0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,
+       0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,
+       0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,
+       // Block 0x4, offset 0x100
+       0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
+       0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
+       0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,
+       0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,
+       0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,
+       0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
+       0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
+       0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
+       0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
+       0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
+       0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,
+       // Block 0x5, offset 0x140
+       0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
+       0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,
+       0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
+       0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
+       0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
+       0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,
+       0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,
+       0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
+       0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
+       0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
+       0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,
+       // Block 0x6, offset 0x180
+       0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
+       0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
+       0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,
+       0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,
+       0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,
+       0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,
+       0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,
+       0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,
+       0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,
+       0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
+       0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,
+       0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
+       0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
+       0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
+       0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
+       0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,
+       0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,
+       0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,
+       0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,
+       0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,
+       0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,
+       // Block 0x8, offset 0x200
+       0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,
+       0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,
+       0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,
+       0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,
+       0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,
+       0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,
+       0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
+       0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
+       0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
+       0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,
+       0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,
+       // Block 0x9, offset 0x240
+       0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
+       0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
+       0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
+       0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
+       0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,
+       0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,
+       0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
+       0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
+       0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
+       0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
+       0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
+       // Block 0xa, offset 0x280
+       0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
+       0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
+       0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
+       0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
+       0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
+       0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
+       0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
+       0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
+       0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
+       0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
+       0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,
+       0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
+       0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
+       0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
+       0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,
+       0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,
+       0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,
+       0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,
+       0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,
+       0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,
+       0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,
+       // Block 0xc, offset 0x300
+       0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,
+       0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,
+       0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,
+       0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,
+       0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,
+       0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,
+       0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,
+       0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,
+       0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,
+       0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,
+       0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,
+       // Block 0xd, offset 0x340
+       0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,
+       0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,
+       0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,
+       0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,
+       0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,
+       0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,
+       0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,
+       0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,
+       0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,
+       0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
+       0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
+       // Block 0xe, offset 0x380
+       0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
+       0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
+       0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
+       0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
+       0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
+       0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,
+       0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,
+       0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,
+       0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,
+       0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,
+       0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,
+       0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,
+       0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,
+       0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,
+       0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,
+       0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,
+       0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,
+       0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,
+       0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,
+       0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,
+       0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,
+       // Block 0x10, offset 0x400
+       0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,
+       0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,
+       0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,
+       0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,
+       0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,
+       0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,
+       0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,
+       0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,
+       0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,
+       0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
+       0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
+       // Block 0x11, offset 0x440
+       0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
+       0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
+       0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
+       0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
+       0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,
+       0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
+       0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
+       0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
+       0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
+       0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
+       0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
+       // Block 0x12, offset 0x480
+       0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
+       0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
+       0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
+       0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
+       0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
+       0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
+       0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
+       0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
+       0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
+       0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+       0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
+       0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
+       0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
+       0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
+       0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
+       0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
+       0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
+       0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
+       0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
+       0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
+       0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
+       // Block 0x14, offset 0x500
+       0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
+       0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
+       0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
+       0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
+       0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
+       0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
+       0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
+       0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
+       0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
+       0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
+       0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
+       // Block 0x15, offset 0x540
+       0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,
+       0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,
+       0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,
+       0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808,
+       0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,
+       0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,
+       0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,
+       0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,
+       0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,
+       0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040,
+       0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040,
+       // Block 0x16, offset 0x580
+       0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308,
+       0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,
+       0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,
+       0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,
+       0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,
+       0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
+       0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
+       0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
+       0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,
+       0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008,
+       0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008,
+       0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008,
+       0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,
+       0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008,
+       0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008,
+       0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008,
+       0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040,
+       0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
+       0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040,
+       0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,
+       0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008,
+       // Block 0x18, offset 0x600
+       0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040,
+       0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,
+       0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,
+       0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,
+       0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,
+       0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
+       0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,
+       0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
+       0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,
+       0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018,
+       0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x3308, 0x63f: 0x0040,
+       // Block 0x19, offset 0x640
+       0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008,
+       0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040,
+       0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040,
+       0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008,
+       0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008,
+       0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,
+       0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,
+       0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
+       0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,
+       0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
+       0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,
+       // Block 0x1a, offset 0x680
+       0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,
+       0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,
+       0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,
+       0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,
+       0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,
+       0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
+       0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,
+       0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
+       0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,
+       0x6b6: 0x0018, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040,
+       0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008,
+       0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008,
+       0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008,
+       0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008,
+       0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008,
+       0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008,
+       0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040,
+       0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
+       0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008,
+       0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,
+       0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008,
+       // Block 0x1c, offset 0x700
+       0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308,
+       0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008,
+       0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040,
+       0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040,
+       0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040,
+       0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308,
+       0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008,
+       0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
+       0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040,
+       0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308,
+       0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308,
+       // Block 0x1d, offset 0x740
+       0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008,
+       0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008,
+       0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,
+       0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008,
+       0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008,
+       0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008,
+       0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040,
+       0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
+       0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008,
+       0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040,
+       0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308,
+       // Block 0x1e, offset 0x780
+       0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040,
+       0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,
+       0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
+       0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008,
+       0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,
+       0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,
+       0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,
+       0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
+       0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018,
+       0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040,
+       0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008,
+       0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040,
+       0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,
+       0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040,
+       0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040,
+       0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008,
+       0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008,
+       0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008,
+       0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008,
+       0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040,
+       0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008,
+       // Block 0x20, offset 0x800
+       0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040,
+       0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308,
+       0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,
+       0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040,
+       0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,
+       0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308,
+       0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008,
+       0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,
+       0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,
+       0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018,
+       0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018,
+       // Block 0x21, offset 0x840
+       0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0018, 0x845: 0x0008,
+       0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008,
+       0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040,
+       0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008,
+       0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008,
+       0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008,
+       0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040,
+       0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
+       0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008,
+       0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040,
+       0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308,
+       // Block 0x22, offset 0x880
+       0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040,
+       0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,
+       0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,
+       0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040,
+       0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040,
+       0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,
+       0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,
+       0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
+       0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040,
+       0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040,
+       0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040,
+       0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,
+       0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040,
+       0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008,
+       0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018,
+       0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,
+       0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,
+       0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
+       0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018,
+       0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008,
+       0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008,
+       // Block 0x24, offset 0x900
+       0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040,
+       0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040,
+       0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040,
+       0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008,
+       0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008,
+       0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
+       0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040,
+       0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
+       0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,
+       0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308,
+       0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,
+       // Block 0x25, offset 0x940
+       0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,
+       0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
+       0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
+       0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,
+       0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,
+       0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
+       0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,
+       0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,
+       0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,
+       0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,
+       0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,
+       // Block 0x26, offset 0x980
+       0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
+       0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
+       0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,
+       0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
+       0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,
+       0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,
+       0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,
+       0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
+       0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,
+       0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,
+       0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,
+       0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,
+       0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008,
+       0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008,
+       0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,
+       0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,
+       0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,
+       0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,
+       0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,
+       0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,
+       0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,
+       0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,
+       0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,
+       0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9,
+       0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099,
+       0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,
+       0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,
+       0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
+       0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,
+       0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
+       0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,
+       0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,
+       0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,
+       0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
+       0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,
+       0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,
+       0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251,
+       0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,
+       0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,
+       0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,
+       0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
+       0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
+       0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,
+       0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008,
+       0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008,
+       0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,
+       0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,
+       0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,
+       0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,
+       0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,
+       0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,
+       0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,
+       0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
+       0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
+       0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008,
+       0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
+       0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
+       0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
+       0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
+       0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,
+       0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008,
+       0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045,
+       0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008,
+       0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,
+       0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045,
+       0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,
+       0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,
+       0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,
+       0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,
+       0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,
+       0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,
+       0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,
+       0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,
+       0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,
+       0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,
+       0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,
+       0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,
+       0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,
+       0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,
+       0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459,
+       0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,
+       0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489,
+       0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,
+       0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
+       0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,
+       0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,
+       0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,
+       0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,
+       0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,
+       0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,
+       0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,
+       0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,
+       0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d,
+       0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e,
+       0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,
+       0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
+       0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,
+       0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,
+       0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,
+       0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
+       0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,
+       0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,
+       0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,
+       0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,
+       0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
+       0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,
+       0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,
+       0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,
+       0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,
+       0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd,
+       0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,
+       0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5,
+       0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,
+       0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,
+       0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,
+       0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,
+       0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,
+       0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,
+       0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,
+       0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,
+       0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e,
+       0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249,
+       0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,
+       0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,
+       0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,
+       0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018,
+       0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,
+       0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,
+       0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,
+       0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd,
+       0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,
+       0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,
+       0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,
+       0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,
+       0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,
+       0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439,
+       0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,
+       0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,
+       0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,
+       0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5,
+       0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,
+       0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,
+       0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
+       0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
+       0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,
+       0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,
+       0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,
+       0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,
+       0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26,
+       0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6,
+       0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,
+       0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
+       0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
+       0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
+       0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46,
+       0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06,
+       0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6,
+       0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86,
+       0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46,
+       0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,
+       0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,
+       0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,
+       0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,
+       0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,
+       0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,
+       0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,
+       0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,
+       0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
+       0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,
+       0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
+       0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008,
+       0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008,
+       0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,
+       0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,
+       0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,
+       0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd,
+       0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
+       0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,
+       0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
+       0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,
+       0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,
+       // Block 0x38, offset 0xe00
+       0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,
+       0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,
+       0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008,
+       0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008,
+       0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008,
+       0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008,
+       0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,
+       0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308,
+       0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040,
+       0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018,
+       0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d,
+       0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d,
+       0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d,
+       0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040,
+       0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040,
+       0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040,
+       0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040,
+       0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040,
+       0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040,
+       0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,
+       0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
+       0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,
+       0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,
+       0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,
+       0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018,
+       0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018,
+       0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018,
+       0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018,
+       0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018,
+       0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018,
+       0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd,
+       0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd,
+       0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d,
+       0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d,
+       0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d,
+       0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd,
+       0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d,
+       0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd,
+       0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d,
+       0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd,
+       0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d,
+       // Block 0x3c, offset 0xf00
+       0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd,
+       0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d,
+       0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018,
+       0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd,
+       0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d,
+       0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008,
+       0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008,
+       0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008,
+       0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008,
+       0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040,
+       0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040,
+       // Block 0x3d, offset 0xf40
+       0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd,
+       0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,
+       0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761,
+       0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,
+       0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,
+       0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd,
+       0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d,
+       0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d,
+       0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd,
+       0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d,
+       0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d,
+       0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d,
+       0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd,
+       0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd,
+       0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d,
+       0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d,
+       0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd,
+       0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d,
+       0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,
+       0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,
+       0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,
+       0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,
+       0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15,
+       0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75,
+       0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded,
+       0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d,
+       0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5,
+       0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d,
+       0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d,
+       0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd,
+       0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9,
+       0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1,
+       0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9,
+       0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549,
+       0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1,
+       0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11,
+       0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91,
+       0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9,
+       0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011,
+       0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209,
+       0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541,
+       0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781,
+       0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979,
+       0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89,
+       0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1,
+       0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99,
+       0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9,
+       0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9,
+       0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069,
+       0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9,
+       0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9,
+       // Block 0x42, offset 0x1080
+       0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271,
+       0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9,
+       0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed,
+       0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371,
+       0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9,
+       0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d,
+       0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211,
+       0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1,
+       0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599,
+       0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9,
+       0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611,
+       // Block 0x43, offset 0x10c0
+       0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671,
+       0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709,
+       0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781,
+       0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1,
+       0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811,
+       0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901,
+       0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1,
+       0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11,
+       0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31,
+       0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51,
+       0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d,
+       // Block 0x44, offset 0x1100
+       0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
+       0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
+       0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
+       0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
+       0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,
+       0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,
+       0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,
+       0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,
+       0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,
+       0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,
+       0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,
+       // Block 0x45, offset 0x1140
+       0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,
+       0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,
+       0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,
+       0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,
+       0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11,
+       0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,
+       0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,
+       0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,
+       0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
+       0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,
+       0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,
+       0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,
+       0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,
+       0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,
+       0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,
+       0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+       0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
+       0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
+       0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,
+       0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,
+       0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,
+       // Block 0x47, offset 0x11c0
+       0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
+       0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,
+       0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
+       0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
+       0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
+       0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
+       0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
+       0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,
+       0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,
+       0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,
+       0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008,
+       // Block 0x48, offset 0x1200
+       0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,
+       0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,
+       0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,
+       0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
+       0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,
+       0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,
+       0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,
+       0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0008,
+       0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008,
+       0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0008, 0x123a: 0x0040, 0x123b: 0x0040,
+       0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575,
+       0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635,
+       0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008,
+       0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715,
+       0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5,
+       0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008,
+       0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
+       0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935,
+       0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5,
+       0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5,
+       0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35,
+       0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5,
+       0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19,
+       0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91,
+       0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
+       0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
+       0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
+       0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
+       0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
+       0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
+       0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
+       // Block 0x4b, offset 0x12c0
+       0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001,
+       0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
+       0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
+       0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9,
+       0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1,
+       0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149,
+       0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2,
+       0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1,
+       0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1,
+       0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479,
+       0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040,
+       0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659,
+       0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721,
+       0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751,
+       0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769,
+       0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799,
+       0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1,
+       0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1,
+       0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9,
+       0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829,
+       0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841,
+       // Block 0x4d, offset 0x1340
+       0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871,
+       0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9,
+       0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9,
+       0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919,
+       0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931,
+       0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961,
+       0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991,
+       0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1,
+       0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
+       0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
+       0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
+       0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
+       0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
+       0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09,
+       0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479,
+       0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81,
+       0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1,
+       0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19,
+       0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91,
+       0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1,
+       0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1,
+       0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1,
+       0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1,
+       0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991,
+       0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81,
+       0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a,
+       0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99,
+       0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89,
+       0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79,
+       0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19,
+       0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649,
+       0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9,
+       0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49,
+       0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21,
+       0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9,
+       0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01,
+       0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91,
+       0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9,
+       0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171,
+       0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289,
+       0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1,
+       0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621,
+       0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739,
+       0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1,
+       0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9,
+       0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29,
+       0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079,
+       0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1,
+       0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171,
+       0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261,
+       0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1,
+       0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1,
+       0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171,
+       0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261,
+       0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351,
+       0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441,
+       0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509,
+       0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1,
+       0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081,
+       0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239,
+       0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,
+       0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
+       0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609,
+       0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721,
+       0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839,
+       0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919,
+       0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9,
+       0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9,
+       0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9,
+       0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1,
+       0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79,
+       // Block 0x54, offset 0x1500
+       0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989,
+       0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
+       0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,
+       0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
+       0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
+       0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
+       0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
+       0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
+       0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9,
+       0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12,
+       0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
+       0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
+       0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55,
+       0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75,
+       0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
+       0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
+       0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
+       0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
+       0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2,
+       0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35,
+       0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018,
+       0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56,
+       0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95,
+       0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa,
+       0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95,
+       0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99,
+       0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda,
+       0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
+       0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040,
+       0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081,
+       0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141,
+       0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171,
+       0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1,
+       0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1,
+       0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201,
+       0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219,
+       0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249,
+       0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291,
+       0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1,
+       0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9,
+       0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1,
+       // Block 0x58, offset 0x1600
+       0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321,
+       0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339,
+       0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369,
+       0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381,
+       0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1,
+       0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9,
+       0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9,
+       0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1,
+       0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441,
+       0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9,
+       0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea,
+       0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2,
+       0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9,
+       0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,
+       0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2,
+       0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,
+       0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,
+       0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,
+       0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,
+       0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a,
+       0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,
+       0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,
+       0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,
+       0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,
+       0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a,
+       0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115,
+       0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5,
+       0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295,
+       0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355,
+       0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415,
+       0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515,
+       0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595,
+       0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5,
+       0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655,
+       0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115,
+       0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735,
+       0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5,
+       0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5,
+       0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5,
+       0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5,
+       0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5,
+       0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715,
+       0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040,
+       0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935,
+       0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040,
+       0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6,
+       0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35,
+       0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040,
+       0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
+       0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
+       0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,
+       0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,
+       0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,
+       0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,
+       0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,
+       0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,
+       0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
+       0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,
+       0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,
+       0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
+       0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
+       // Block 0x5e, offset 0x1780
+       0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,
+       0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,
+       0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,
+       0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,
+       0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,
+       0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,
+       0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,
+       0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,
+       0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,
+       0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,
+       0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
+       // Block 0x5f, offset 0x17c0
+       0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,
+       0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,
+       0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,
+       0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,
+       0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,
+       0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,
+       0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,
+       0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,
+       0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,
+       0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308,
+       0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,
+       0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,
+       0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,
+       0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,
+       0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,
+       0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,
+       0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,
+       0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,
+       0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,
+       0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
+       0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199,
+       0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359,
+       0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269,
+       0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369,
+       0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9,
+       0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259,
+       0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99,
+       0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089,
+       0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9,
+       0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249,
+       0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269,
+       0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369,
+       0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9,
+       0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259,
+       0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99,
+       0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089,
+       0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9,
+       0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249,
+       0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71,
+       0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9,
+       0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9,
+       0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259,
+       0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99,
+       0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089,
+       0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040,
+       0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040,
+       0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71,
+       0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9,
+       0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1,
+       0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199,
+       0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99,
+       0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089,
+       0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9,
+       0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249,
+       0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71,
+       0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9,
+       0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1,
+       0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199,
+       0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359,
+       0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269,
+       0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9,
+       0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040,
+       0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71,
+       0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9,
+       0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040,
+       0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199,
+       0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359,
+       0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269,
+       0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369,
+       0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9,
+       0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040,
+       0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9,
+       0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040,
+       0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199,
+       0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359,
+       0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269,
+       0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369,
+       0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9,
+       0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259,
+       0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99,
+       0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9,
+       // Block 0x67, offset 0x19c0
+       0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1,
+       0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199,
+       0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359,
+       0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269,
+       0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369,
+       0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9,
+       0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259,
+       0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99,
+       0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089,
+       0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9,
+       0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199,
+       // Block 0x68, offset 0x1a00
+       0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359,
+       0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269,
+       0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369,
+       0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9,
+       0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259,
+       0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99,
+       0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089,
+       0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9,
+       0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249,
+       0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71,
+       0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269,
+       // Block 0x69, offset 0x1a40
+       0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369,
+       0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9,
+       0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259,
+       0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99,
+       0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089,
+       0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9,
+       0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249,
+       0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71,
+       0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9,
+       0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1,
+       0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9,
+       // Block 0x6a, offset 0x1a80
+       0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259,
+       0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99,
+       0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089,
+       0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9,
+       0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249,
+       0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71,
+       0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9,
+       0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1,
+       0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199,
+       0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359,
+       0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089,
+       0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9,
+       0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249,
+       0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71,
+       0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9,
+       0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1,
+       0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099,
+       0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429,
+       0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71,
+       0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9,
+       0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9,
+       0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11,
+       0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109,
+       0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1,
+       0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429,
+       0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099,
+       0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429,
+       0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71,
+       0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9,
+       0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01,
+       0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11,
+       0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109,
+       0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1,
+       0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429,
+       0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099,
+       0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429,
+       0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71,
+       0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9,
+       0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01,
+       0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1,
+       0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109,
+       0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1,
+       0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429,
+       0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099,
+       0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429,
+       0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71,
+       0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9,
+       0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01,
+       0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1,
+       0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41,
+       0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1,
+       0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429,
+       0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099,
+       0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429,
+       0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71,
+       0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9,
+       0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01,
+       0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1,
+       0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41,
+       0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1,
+       0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1,
+       // Block 0x70, offset 0x1c00
+       0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429,
+       0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41,
+       0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079,
+       0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1,
+       0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61,
+       0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9,
+       0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81,
+       0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079,
+       0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1,
+       0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61,
+       0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1,
+       // Block 0x71, offset 0x1c40
+       0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115,
+       0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135,
+       0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115,
+       0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175,
+       0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115,
+       0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08,
+       0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08,
+       0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08,
+       0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08,
+       0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08,
+       0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08,
+       // Block 0x72, offset 0x1c80
+       0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411,
+       0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1,
+       0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9,
+       0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231,
+       0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949,
+       0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,
+       0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429,
+       0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
+       0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
+       0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351,
+       0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040,
+       // Block 0x73, offset 0x1cc0
+       0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040,
+       0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,
+       0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9,
+       0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231,
+       0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949,
+       0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040,
+       0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,
+       0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,
+       0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,
+       0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,
+       0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040,
+       // Block 0x74, offset 0x1d00
+       0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411,
+       0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1,
+       0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9,
+       0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231,
+       0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040,
+       0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249,
+       0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429,
+       0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339,
+       0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1,
+       0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351,
+       0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040,
+       // Block 0x75, offset 0x1d40
+       0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02,
+       0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018,
+       0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2,
+       0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72,
+       0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32,
+       0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2,
+       0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2,
+       0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0018,
+       0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199,
+       0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359,
+       0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99,
+       // Block 0x76, offset 0x1d80
+       0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089,
+       0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1,
+       0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018,
+       0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018,
+       0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018,
+       0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018,
+       0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018,
+       0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040,
+       0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018,
+       0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018,
+       0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018,
+       // Block 0x77, offset 0x1dc0
+       0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040,
+       0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040,
+       0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289,
+       0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349,
+       0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409,
+       0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9,
+       0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589,
+       0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649,
+       0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709,
+       0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9,
+       0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040,
+       // Block 0x78, offset 0x1e00
+       0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79,
+       0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39,
+       0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9,
+       0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39,
+       0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9,
+       0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79,
+       0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39,
+       0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9,
+       0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059,
+       0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9,
+       0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179,
+       // Block 0x79, offset 0x1e40
+       0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239,
+       0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9,
+       0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399,
+       0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459,
+       0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309,
+       0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559,
+       0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9,
+       0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679,
+       0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9,
+       0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d,
+       0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9,
+       // Block 0x7a, offset 0x1e80
+       0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9,
+       0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959,
+       0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d,
+       0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d,
+       0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9,
+       0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99,
+       0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9,
+       0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9,
+       0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99,
+       0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39,
+       0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99,
+       // Block 0x7b, offset 0x1ec0
+       0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639,
+       0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9,
+       0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d,
+       0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9,
+       0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d,
+       0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd,
+       0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979,
+       0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19,
+       0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d,
+       0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d,
+       0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59,
+       // Block 0x7c, offset 0x1f00
+       0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99,
+       0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39,
+       0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9,
+       0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39,
+       0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd,
+       0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19,
+       0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9,
+       0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59,
+       0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd,
+       0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d,
+       0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079,
+       // Block 0x7d, offset 0x1f40
+       0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d,
+       0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d,
+       0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879,
+       0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919,
+       0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd,
+       0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9,
+       0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99,
+       0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39,
+       0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9,
+       0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d,
+       0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79,
+       // Block 0x7e, offset 0x1f80
+       0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19,
+       0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9,
+       0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59,
+       0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9,
+       0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d,
+       0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040,
+       0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040,
+       0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040,
+       0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040,
+       0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040,
+       0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040,
+}
+
+// idnaIndex: 36 blocks, 2304 entries, 4608 bytes
+// Block 0 is the zero block.
+var idnaIndex = [2304]uint16{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
+       0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
+       0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84,
+       0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
+       0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,
+       0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21,
+       // Block 0x4, offset 0x100
+       0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16,
+       0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d,
+       0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91,
+       0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96,
+       // Block 0x5, offset 0x140
+       0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,
+       0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,
+       0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,
+       0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,
+       0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,
+       0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,
+       0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3,
+       0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c,
+       // Block 0x6, offset 0x180
+       0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b,
+       0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b,
+       0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
+       0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,
+       0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,
+       0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0,
+       0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5,
+       0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,
+       0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,
+       0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,
+       0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,
+       0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,
+       0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,
+       0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,
+       0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,
+       0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,
+       0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,
+       0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,
+       0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,
+       0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,
+       0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,
+       0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,
+       // Block 0x9, offset 0x240
+       0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,
+       0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,
+       0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,
+       0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,
+       0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,
+       0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,
+       0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,
+       0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,
+       // Block 0xa, offset 0x280
+       0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,
+       0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,
+       0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,
+       0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,
+       0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,
+       0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,
+       0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,
+       0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,
+       0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,
+       0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,
+       0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,
+       0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,
+       0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,
+       0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,
+       0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,
+       // Block 0xc, offset 0x300
+       0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,
+       0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,
+       0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,
+       0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa,
+       // Block 0xd, offset 0x340
+       0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,
+       0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,
+       0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,
+       0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,
+       0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,
+       0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,
+       0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,
+       0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,
+       // Block 0xe, offset 0x380
+       0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,
+       0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,
+       0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,
+       0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,
+       0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe,
+       0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,
+       0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52,
+       0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108,
+       0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e,
+       0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba,
+       0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba,
+       0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c,
+       0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba,
+       0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0x126, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,
+       0x3f8: 0xba, 0x3f9: 0x127, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0x128, 0x3fd: 0x129, 0x3fe: 0xba, 0x3ff: 0xba,
+       // Block 0x10, offset 0x400
+       0x400: 0x12a, 0x401: 0x12b, 0x402: 0x12c, 0x403: 0x12d, 0x404: 0x12e, 0x405: 0x12f, 0x406: 0x130, 0x407: 0x131,
+       0x408: 0x132, 0x409: 0xba, 0x40a: 0x133, 0x40b: 0x134, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba,
+       0x410: 0x135, 0x411: 0x136, 0x412: 0x137, 0x413: 0x138, 0x414: 0xba, 0x415: 0xba, 0x416: 0x139, 0x417: 0x13a,
+       0x418: 0x13b, 0x419: 0x13c, 0x41a: 0x13d, 0x41b: 0x13e, 0x41c: 0x13f, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,
+       0x420: 0x140, 0x421: 0xba, 0x422: 0x141, 0x423: 0x142, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,
+       0x428: 0x143, 0x429: 0x144, 0x42a: 0x145, 0x42b: 0x146, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,
+       0x430: 0x147, 0x431: 0x148, 0x432: 0x149, 0x433: 0xba, 0x434: 0x14a, 0x435: 0x14b, 0x436: 0x14c, 0x437: 0xba,
+       0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0x14d, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,
+       // Block 0x11, offset 0x440
+       0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,
+       0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x14e, 0x44f: 0xba,
+       0x450: 0x9b, 0x451: 0x14f, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x150, 0x456: 0xba, 0x457: 0xba,
+       0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,
+       0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,
+       0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,
+       0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,
+       0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,
+       // Block 0x12, offset 0x480
+       0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,
+       0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,
+       0x490: 0x151, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,
+       0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,
+       0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,
+       0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,
+       0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,
+       0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,
+       0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,
+       0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,
+       0x4d8: 0x9f, 0x4d9: 0x152, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,
+       0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,
+       0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,
+       0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,
+       0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,
+       // Block 0x14, offset 0x500
+       0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,
+       0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,
+       0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,
+       0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,
+       0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,
+       0x528: 0x146, 0x529: 0x153, 0x52a: 0xba, 0x52b: 0x154, 0x52c: 0x155, 0x52d: 0x156, 0x52e: 0x157, 0x52f: 0xba,
+       0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,
+       0x538: 0xba, 0x539: 0x158, 0x53a: 0x159, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x15a, 0x53e: 0x15b, 0x53f: 0x15c,
+       // Block 0x15, offset 0x540
+       0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,
+       0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,
+       0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,
+       0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x15d,
+       0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,
+       0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x15e, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,
+       0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,
+       0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,
+       // Block 0x16, offset 0x580
+       0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x15f, 0x585: 0x160, 0x586: 0x9f, 0x587: 0x9f,
+       0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x161, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,
+       0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,
+       0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,
+       0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,
+       0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,
+       0x5b0: 0x9f, 0x5b1: 0x162, 0x5b2: 0x163, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,
+       0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x164, 0x5c4: 0x165, 0x5c5: 0x166, 0x5c6: 0x167, 0x5c7: 0x168,
+       0x5c8: 0x9b, 0x5c9: 0x169, 0x5ca: 0xba, 0x5cb: 0x16a, 0x5cc: 0x9b, 0x5cd: 0x16b, 0x5ce: 0xba, 0x5cf: 0xba,
+       0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66,
+       0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e,
+       0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,
+       0x5e8: 0x16c, 0x5e9: 0x16d, 0x5ea: 0x16e, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,
+       0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,
+       0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,
+       // Block 0x18, offset 0x600
+       0x600: 0x16f, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,
+       0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,
+       0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,
+       0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,
+       0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x170, 0x624: 0x6f, 0x625: 0x171, 0x626: 0xba, 0x627: 0xba,
+       0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,
+       0x630: 0xba, 0x631: 0x172, 0x632: 0x173, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,
+       0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x174, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,
+       // Block 0x19, offset 0x640
+       0x640: 0x175, 0x641: 0x9b, 0x642: 0x176, 0x643: 0x177, 0x644: 0x73, 0x645: 0x74, 0x646: 0x178, 0x647: 0x179,
+       0x648: 0x75, 0x649: 0x17a, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
+       0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,
+       0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x17b, 0x65c: 0x9b, 0x65d: 0x17c, 0x65e: 0x9b, 0x65f: 0x17d,
+       0x660: 0x17e, 0x661: 0x17f, 0x662: 0x180, 0x663: 0xba, 0x664: 0x181, 0x665: 0x182, 0x666: 0x183, 0x667: 0x184,
+       0x668: 0xba, 0x669: 0x185, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,
+       0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,
+       0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,
+       // Block 0x1a, offset 0x680
+       0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,
+       0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,
+       0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,
+       0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x186, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,
+       0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,
+       0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,
+       0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,
+       0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,
+       0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,
+       0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,
+       0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x187, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,
+       0x6e0: 0x188, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,
+       0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,
+       0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,
+       0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,
+       // Block 0x1c, offset 0x700
+       0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,
+       0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,
+       0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,
+       0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,
+       0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,
+       0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,
+       0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,
+       0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x189, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f,
+       // Block 0x1d, offset 0x740
+       0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f,
+       0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f,
+       0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f,
+       0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f,
+       0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f,
+       0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x18a,
+       0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,
+       0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,
+       // Block 0x1e, offset 0x780
+       0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba,
+       0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba,
+       0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba,
+       0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba,
+       0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x18b, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x18c, 0x7a7: 0x7b,
+       0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba,
+       0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba,
+       0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba,
+       // Block 0x1f, offset 0x7c0
+       0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07,
+       0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17,
+       0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07,
+       0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c,
+       0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,
+       0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,
+       // Block 0x20, offset 0x800
+       0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b,
+       0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b,
+       0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b,
+       0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b,
+       0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b,
+       0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b,
+       0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b,
+       0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b,
+       // Block 0x21, offset 0x840
+       0x840: 0x18d, 0x841: 0x18e, 0x842: 0xba, 0x843: 0xba, 0x844: 0x18f, 0x845: 0x18f, 0x846: 0x18f, 0x847: 0x190,
+       0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba,
+       0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba,
+       0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba,
+       0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba,
+       0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba,
+       0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba,
+       0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba,
+       // Block 0x22, offset 0x880
+       0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,
+       0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,
+       0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b,
+       0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b,
+       0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b,
+       0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b,
+       0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b,
+       0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,
+       0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,
+}
+
+// idnaSparseOffset: 276 entries, 552 bytes
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x86, 0x8b, 0x94, 0xa4, 0xb2, 0xbe, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x224, 0x22e, 0x23a, 0x246, 0x252, 0x25a, 0x25f, 0x269, 0x27a, 0x27e, 0x289, 0x28d, 0x296, 0x29e, 0x2a4, 0x2a9, 0x2ac, 0x2b0, 0x2b6, 0x2ba, 0x2be, 0x2c2, 0x2c7, 0x2cd, 0x2d5, 0x2dc, 0x2e7, 0x2f1, 0x2f5, 0x2f8, 0x2fe, 0x302, 0x304, 0x307, 0x309, 0x30c, 0x316, 0x319, 0x328, 0x32c, 0x331, 0x334, 0x338, 0x33d, 0x342, 0x348, 0x34e, 0x35d, 0x363, 0x367, 0x376, 0x37b, 0x383, 0x38d, 0x398, 0x3a0, 0x3b1, 0x3ba, 0x3ca, 0x3d7, 0x3e1, 0x3e6, 0x3f3, 0x3f7, 0x3fc, 0x3fe, 0x402, 0x404, 0x408, 0x411, 0x417, 0x41b, 0x42b, 0x435, 0x43a, 0x43d, 0x443, 0x44a, 0x44f, 0x453, 0x459, 0x45e, 0x467, 0x46c, 0x472, 0x479, 0x480, 0x487, 0x48b, 0x490, 0x493, 0x498, 0x4a4, 0x4aa, 0x4af, 0x4b6, 0x4be, 0x4c3, 0x4c7, 0x4d7, 0x4de, 0x4e2, 0x4e6, 0x4ed, 0x4ef, 0x4f2, 0x4f5, 0x4f9, 0x502, 0x506, 0x50e, 0x516, 0x51c, 0x525, 0x531, 0x538, 0x541, 0x54b, 0x552, 0x560, 0x56d, 0x57a, 0x583, 0x587, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5eb, 0x5ee, 0x5f3, 0x5fe, 0x607, 0x613, 0x616, 0x620, 0x629, 0x635, 0x642, 0x64f, 0x65d, 0x664, 0x667, 0x66c, 0x66f, 0x672, 0x675, 0x67c, 0x683, 0x687, 0x692, 0x695, 0x698, 0x69b, 0x6a1, 0x6a6, 0x6aa, 0x6ad, 0x6b0, 0x6b3, 0x6b6, 0x6b9, 0x6be, 0x6c8, 0x6cb, 0x6cf, 0x6de, 0x6ea, 0x6ee, 0x6f3, 0x6f7, 0x6fc, 0x700, 0x705, 0x70e, 0x719, 0x71f, 0x727, 0x72a, 0x72d, 0x731, 0x735, 0x73b, 0x741, 0x746, 0x749, 0x759, 0x760, 0x763, 0x766, 0x76a, 0x770, 0x775, 0x77a, 0x782, 0x787, 0x78b, 0x78f, 0x792, 0x795, 0x799, 0x79d, 0x7a0, 0x7b0, 0x7c1, 0x7c6, 0x7c8, 0x7ca}
+
+// idnaSparseValues: 1997 entries, 7988 bytes
+var idnaSparseValues = [1997]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x07},
+       {value: 0xe105, lo: 0x80, hi: 0x96},
+       {value: 0x0018, lo: 0x97, hi: 0x97},
+       {value: 0xe105, lo: 0x98, hi: 0x9e},
+       {value: 0x001f, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbf},
+       // Block 0x1, offset 0x8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0xe01d, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0335, lo: 0x83, hi: 0x83},
+       {value: 0x034d, lo: 0x84, hi: 0x84},
+       {value: 0x0365, lo: 0x85, hi: 0x85},
+       {value: 0xe00d, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0xe00d, lo: 0x88, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x89},
+       {value: 0xe00d, lo: 0x8a, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe00d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0x8d},
+       {value: 0xe00d, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0xbf},
+       // Block 0x2, offset 0x19
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x0249, lo: 0xb0, hi: 0xb0},
+       {value: 0x037d, lo: 0xb1, hi: 0xb1},
+       {value: 0x0259, lo: 0xb2, hi: 0xb2},
+       {value: 0x0269, lo: 0xb3, hi: 0xb3},
+       {value: 0x034d, lo: 0xb4, hi: 0xb4},
+       {value: 0x0395, lo: 0xb5, hi: 0xb5},
+       {value: 0xe1bd, lo: 0xb6, hi: 0xb6},
+       {value: 0x0279, lo: 0xb7, hi: 0xb7},
+       {value: 0x0289, lo: 0xb8, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbf},
+       // Block 0x3, offset 0x25
+       {value: 0x0000, lo: 0x01},
+       {value: 0x3308, lo: 0x80, hi: 0xbf},
+       // Block 0x4, offset 0x27
+       {value: 0x0000, lo: 0x04},
+       {value: 0x03f5, lo: 0x80, hi: 0x8f},
+       {value: 0xe105, lo: 0x90, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x5, offset 0x2c
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x0545, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x0008, lo: 0x99, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x6, offset 0x33
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0401, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x88},
+       {value: 0x0018, lo: 0x89, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x3308, lo: 0x91, hi: 0xbd},
+       {value: 0x0818, lo: 0xbe, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x7, offset 0x3e
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0818, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x82},
+       {value: 0x0818, lo: 0x83, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x85},
+       {value: 0x0818, lo: 0x86, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xae},
+       {value: 0x0808, lo: 0xaf, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x8, offset 0x4a
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0a08, lo: 0x80, hi: 0x87},
+       {value: 0x0c08, lo: 0x88, hi: 0x99},
+       {value: 0x0a08, lo: 0x9a, hi: 0xbf},
+       // Block 0x9, offset 0x4e
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3308, lo: 0x80, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0c08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0a08, lo: 0x8e, hi: 0x98},
+       {value: 0x0c08, lo: 0x99, hi: 0x9b},
+       {value: 0x0a08, lo: 0x9c, hi: 0xaa},
+       {value: 0x0c08, lo: 0xab, hi: 0xac},
+       {value: 0x0a08, lo: 0xad, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb1},
+       {value: 0x0a08, lo: 0xb2, hi: 0xb2},
+       {value: 0x0c08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0a08, lo: 0xb5, hi: 0xb7},
+       {value: 0x0c08, lo: 0xb8, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbf},
+       // Block 0xa, offset 0x5d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xb0},
+       {value: 0x0808, lo: 0xb1, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xb, offset 0x62
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0808, lo: 0x80, hi: 0x89},
+       {value: 0x0a08, lo: 0x8a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x0818, lo: 0xbe, hi: 0xbf},
+       // Block 0xc, offset 0x6c
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x99},
+       {value: 0x0808, lo: 0x9a, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa3},
+       {value: 0x0808, lo: 0xa4, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa7},
+       {value: 0x0808, lo: 0xa8, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0818, lo: 0xb0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xd, offset 0x78
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0a08, lo: 0xa0, hi: 0xa9},
+       {value: 0x0c08, lo: 0xaa, hi: 0xac},
+       {value: 0x0808, lo: 0xad, hi: 0xad},
+       {value: 0x0c08, lo: 0xae, hi: 0xae},
+       {value: 0x0a08, lo: 0xaf, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb2},
+       {value: 0x0a08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0a08, lo: 0xb6, hi: 0xb8},
+       {value: 0x0c08, lo: 0xb9, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0xe, offset 0x86
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x92},
+       {value: 0x3308, lo: 0x93, hi: 0xa1},
+       {value: 0x0840, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xbf},
+       // Block 0xf, offset 0x8b
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x10, offset 0x94
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x85},
+       {value: 0x3008, lo: 0x86, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x3008, lo: 0x8a, hi: 0x8c},
+       {value: 0x3b08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x11, offset 0xa4
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xa9},
+       {value: 0x0008, lo: 0xaa, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x12, offset 0xb2
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xba},
+       {value: 0x3b08, lo: 0xbb, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x13, offset 0xbe
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0040, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x14, offset 0xca
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x89},
+       {value: 0x3b08, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x3008, lo: 0x98, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x15, offset 0xdb
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb2},
+       {value: 0x08f1, lo: 0xb3, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb9},
+       {value: 0x3b08, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x0018, lo: 0xbf, hi: 0xbf},
+       // Block 0x16, offset 0xe5
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x8e},
+       {value: 0x0018, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0xbf},
+       // Block 0x17, offset 0xec
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0961, lo: 0x9c, hi: 0x9c},
+       {value: 0x0999, lo: 0x9d, hi: 0x9d},
+       {value: 0x0008, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x18, offset 0xf9
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe03d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x19, offset 0x10a
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0xbf},
+       // Block 0x1a, offset 0x111
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x1b, offset 0x11c
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x3008, lo: 0x96, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x3308, lo: 0x9e, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3008, lo: 0xa2, hi: 0xa4},
+       {value: 0x0008, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xbf},
+       // Block 0x1c, offset 0x12b
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x8c},
+       {value: 0x3308, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x3008, lo: 0x9a, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x1d, offset 0x139
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x86},
+       {value: 0x055d, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8c},
+       {value: 0x055d, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbb},
+       {value: 0xe105, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0x1e, offset 0x143
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0018, lo: 0x80, hi: 0xbf},
+       // Block 0x1f, offset 0x145
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa0},
+       {value: 0x2018, lo: 0xa1, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x20, offset 0x14a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa7},
+       {value: 0x2018, lo: 0xa8, hi: 0xbf},
+       // Block 0x21, offset 0x14d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2018, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0xbf},
+       // Block 0x22, offset 0x150
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0008, lo: 0x80, hi: 0xbf},
+       // Block 0x23, offset 0x152
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x24, offset 0x15e
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x25, offset 0x169
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x26, offset 0x171
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x27, offset 0x177
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x28, offset 0x17d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x29, offset 0x182
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x2a, offset 0x187
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x2b, offset 0x18a
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xbf},
+       // Block 0x2c, offset 0x18e
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x2d, offset 0x194
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0x2e, offset 0x199
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x3b08, lo: 0x94, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x2f, offset 0x1a5
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x30, offset 0x1af
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xb3},
+       {value: 0x3340, lo: 0xb4, hi: 0xb5},
+       {value: 0x3008, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x31, offset 0x1b5
+       {value: 0x0000, lo: 0x10},
+       {value: 0x3008, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x88},
+       {value: 0x3308, lo: 0x89, hi: 0x91},
+       {value: 0x3b08, lo: 0x92, hi: 0x92},
+       {value: 0x3308, lo: 0x93, hi: 0x93},
+       {value: 0x0018, lo: 0x94, hi: 0x96},
+       {value: 0x0008, lo: 0x97, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x32, offset 0x1c6
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x86},
+       {value: 0x0218, lo: 0x87, hi: 0x87},
+       {value: 0x0018, lo: 0x88, hi: 0x8a},
+       {value: 0x33c0, lo: 0x8b, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0208, lo: 0xa0, hi: 0xbf},
+       // Block 0x33, offset 0x1d0
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0208, lo: 0x80, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0x34, offset 0x1d3
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0208, lo: 0x87, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xa9},
+       {value: 0x0208, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x35, offset 0x1db
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0x36, offset 0x1de
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x37, offset 0x1eb
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x38, offset 0x1f3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x39, offset 0x1f7
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0028, lo: 0x9a, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0xbf},
+       // Block 0x3a, offset 0x1fe
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x3308, lo: 0x97, hi: 0x98},
+       {value: 0x3008, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x3b, offset 0x206
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x94},
+       {value: 0x3008, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3b08, lo: 0xa0, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xac},
+       {value: 0x3008, lo: 0xad, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x3c, offset 0x216
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xbd},
+       {value: 0x3318, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x222
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0040, lo: 0x80, hi: 0xbf},
+       // Block 0x3e, offset 0x224
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x83},
+       {value: 0x3008, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x3f, offset 0x22e
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x3808, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x40, offset 0x23a
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3808, lo: 0xaa, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xbf},
+       // Block 0x41, offset 0x246
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3008, lo: 0xaa, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3808, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbf},
+       // Block 0x42, offset 0x252
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x3008, lo: 0xa4, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbf},
+       // Block 0x43, offset 0x25a
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x44, offset 0x25f
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0e29, lo: 0x80, hi: 0x80},
+       {value: 0x0e41, lo: 0x81, hi: 0x81},
+       {value: 0x0e59, lo: 0x82, hi: 0x82},
+       {value: 0x0e71, lo: 0x83, hi: 0x83},
+       {value: 0x0e89, lo: 0x84, hi: 0x85},
+       {value: 0x0ea1, lo: 0x86, hi: 0x86},
+       {value: 0x0eb9, lo: 0x87, hi: 0x87},
+       {value: 0x057d, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0x45, offset 0x269
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x92},
+       {value: 0x0018, lo: 0x93, hi: 0x93},
+       {value: 0x3308, lo: 0x94, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa8},
+       {value: 0x0008, lo: 0xa9, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x3008, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x46, offset 0x27a
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0x47, offset 0x27e
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x87},
+       {value: 0xe045, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0xe045, lo: 0x98, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0xe045, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbf},
+       // Block 0x48, offset 0x289
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x3318, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbf},
+       // Block 0x49, offset 0x28d
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x88},
+       {value: 0x24c1, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x4a, offset 0x296
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x24f1, lo: 0xac, hi: 0xac},
+       {value: 0x2529, lo: 0xad, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xae},
+       {value: 0x2579, lo: 0xaf, hi: 0xaf},
+       {value: 0x25b1, lo: 0xb0, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0x4b, offset 0x29e
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x9f},
+       {value: 0x0080, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xad},
+       {value: 0x0080, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x4c, offset 0x2a4
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xa8},
+       {value: 0x09c5, lo: 0xa9, hi: 0xa9},
+       {value: 0x09e5, lo: 0xaa, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xbf},
+       // Block 0x4d, offset 0x2a9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xbf},
+       // Block 0x4e, offset 0x2ac
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x28c1, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0xbf},
+       // Block 0x4f, offset 0x2b0
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0e66, lo: 0xb4, hi: 0xb4},
+       {value: 0x292a, lo: 0xb5, hi: 0xb5},
+       {value: 0x0e86, lo: 0xb6, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x50, offset 0x2b6
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x9b},
+       {value: 0x2941, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0xbf},
+       // Block 0x51, offset 0x2ba
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x52, offset 0x2be
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0xbf},
+       // Block 0x53, offset 0x2c2
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x54, offset 0x2c7
+       {value: 0x0000, lo: 0x05},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x03f5, lo: 0x90, hi: 0x9f},
+       {value: 0x0ea5, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x55, offset 0x2cd
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xac},
+       {value: 0x0008, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x56, offset 0x2d5
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xae},
+       {value: 0xe075, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0x57, offset 0x2dc
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x58, offset 0x2e7
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xbf},
+       // Block 0x59, offset 0x2f1
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x5a, offset 0x2f5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0xbf},
+       // Block 0x5b, offset 0x2f8
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9e},
+       {value: 0x0edd, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0x5c, offset 0x2fe
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb2},
+       {value: 0x0efd, lo: 0xb3, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x5d, offset 0x302
+       {value: 0x0020, lo: 0x01},
+       {value: 0x0f1d, lo: 0x80, hi: 0xbf},
+       // Block 0x5e, offset 0x304
+       {value: 0x0020, lo: 0x02},
+       {value: 0x171d, lo: 0x80, hi: 0x8f},
+       {value: 0x18fd, lo: 0x90, hi: 0xbf},
+       // Block 0x5f, offset 0x307
+       {value: 0x0020, lo: 0x01},
+       {value: 0x1efd, lo: 0x80, hi: 0xbf},
+       // Block 0x60, offset 0x309
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x61, offset 0x30c
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9a},
+       {value: 0x29e2, lo: 0x9b, hi: 0x9b},
+       {value: 0x2a0a, lo: 0x9c, hi: 0x9c},
+       {value: 0x0008, lo: 0x9d, hi: 0x9e},
+       {value: 0x2a31, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xbf},
+       // Block 0x62, offset 0x316
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xbe},
+       {value: 0x2a69, lo: 0xbf, hi: 0xbf},
+       // Block 0x63, offset 0x319
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0040, lo: 0x80, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xb0},
+       {value: 0x2a1d, lo: 0xb1, hi: 0xb1},
+       {value: 0x2a3d, lo: 0xb2, hi: 0xb2},
+       {value: 0x2a5d, lo: 0xb3, hi: 0xb3},
+       {value: 0x2a7d, lo: 0xb4, hi: 0xb4},
+       {value: 0x2a5d, lo: 0xb5, hi: 0xb5},
+       {value: 0x2a9d, lo: 0xb6, hi: 0xb6},
+       {value: 0x2abd, lo: 0xb7, hi: 0xb7},
+       {value: 0x2add, lo: 0xb8, hi: 0xb9},
+       {value: 0x2afd, lo: 0xba, hi: 0xbb},
+       {value: 0x2b1d, lo: 0xbc, hi: 0xbd},
+       {value: 0x2afd, lo: 0xbe, hi: 0xbf},
+       // Block 0x64, offset 0x328
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x65, offset 0x32c
+       {value: 0x0030, lo: 0x04},
+       {value: 0x2aa2, lo: 0x80, hi: 0x9d},
+       {value: 0x305a, lo: 0x9e, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x30a2, lo: 0xa0, hi: 0xbf},
+       // Block 0x66, offset 0x331
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x67, offset 0x334
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x68, offset 0x338
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x69, offset 0x33d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xbf},
+       // Block 0x6a, offset 0x342
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb1},
+       {value: 0x0018, lo: 0xb2, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x6b, offset 0x348
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0xb6},
+       {value: 0x0008, lo: 0xb7, hi: 0xb7},
+       {value: 0x2009, lo: 0xb8, hi: 0xb8},
+       {value: 0x6e89, lo: 0xb9, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xbf},
+       // Block 0x6c, offset 0x34e
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x3308, lo: 0x8b, hi: 0x8b},
+       {value: 0x0008, lo: 0x8c, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x6d, offset 0x35d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0208, lo: 0x80, hi: 0xb1},
+       {value: 0x0108, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x6e, offset 0x363
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xbf},
+       // Block 0x6f, offset 0x367
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3008, lo: 0x80, hi: 0x83},
+       {value: 0x3b08, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xba},
+       {value: 0x0008, lo: 0xbb, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x70, offset 0x376
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x71, offset 0x37b
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x91},
+       {value: 0x3008, lo: 0x92, hi: 0x92},
+       {value: 0x3808, lo: 0x93, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x72, offset 0x383
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb9},
+       {value: 0x3008, lo: 0xba, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x73, offset 0x38d
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x74, offset 0x398
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x75, offset 0x3a0
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8c},
+       {value: 0x3008, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0008, lo: 0xbe, hi: 0xbf},
+       // Block 0x76, offset 0x3b1
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x77, offset 0x3ba
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x9a},
+       {value: 0x0008, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3b08, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x78, offset 0x3ca
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x90},
+       {value: 0x0008, lo: 0x91, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x79, offset 0x3d7
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x4465, lo: 0x9c, hi: 0x9c},
+       {value: 0x447d, lo: 0x9d, hi: 0x9d},
+       {value: 0x2971, lo: 0x9e, hi: 0x9e},
+       {value: 0xe06d, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xaf},
+       {value: 0x4495, lo: 0xb0, hi: 0xbf},
+       // Block 0x7a, offset 0x3e1
+       {value: 0x0000, lo: 0x04},
+       {value: 0x44b5, lo: 0x80, hi: 0x8f},
+       {value: 0x44d5, lo: 0x90, hi: 0x9f},
+       {value: 0x44f5, lo: 0xa0, hi: 0xaf},
+       {value: 0x44d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x7b, offset 0x3e6
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3b08, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x7c, offset 0x3f3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x7d, offset 0x3f7
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x7e, offset 0x3fc
+       {value: 0x0020, lo: 0x01},
+       {value: 0x4515, lo: 0x80, hi: 0xbf},
+       // Block 0x7f, offset 0x3fe
+       {value: 0x0020, lo: 0x03},
+       {value: 0x4d15, lo: 0x80, hi: 0x94},
+       {value: 0x4ad5, lo: 0x95, hi: 0x95},
+       {value: 0x4fb5, lo: 0x96, hi: 0xbf},
+       // Block 0x80, offset 0x402
+       {value: 0x0020, lo: 0x01},
+       {value: 0x54f5, lo: 0x80, hi: 0xbf},
+       // Block 0x81, offset 0x404
+       {value: 0x0020, lo: 0x03},
+       {value: 0x5cf5, lo: 0x80, hi: 0x84},
+       {value: 0x5655, lo: 0x85, hi: 0x85},
+       {value: 0x5d95, lo: 0x86, hi: 0xbf},
+       // Block 0x82, offset 0x408
+       {value: 0x0020, lo: 0x08},
+       {value: 0x6b55, lo: 0x80, hi: 0x8f},
+       {value: 0x6d15, lo: 0x90, hi: 0x90},
+       {value: 0x6d55, lo: 0x91, hi: 0xab},
+       {value: 0x6ea1, lo: 0xac, hi: 0xac},
+       {value: 0x70b5, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x70d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x83, offset 0x411
+       {value: 0x0020, lo: 0x05},
+       {value: 0x72d5, lo: 0x80, hi: 0xad},
+       {value: 0x6535, lo: 0xae, hi: 0xae},
+       {value: 0x7895, lo: 0xaf, hi: 0xb5},
+       {value: 0x6f55, lo: 0xb6, hi: 0xb6},
+       {value: 0x7975, lo: 0xb7, hi: 0xbf},
+       // Block 0x84, offset 0x417
+       {value: 0x0028, lo: 0x03},
+       {value: 0x7c21, lo: 0x80, hi: 0x82},
+       {value: 0x7be1, lo: 0x83, hi: 0x83},
+       {value: 0x7c99, lo: 0x84, hi: 0xbf},
+       // Block 0x85, offset 0x41b
+       {value: 0x0038, lo: 0x0f},
+       {value: 0x9db1, lo: 0x80, hi: 0x83},
+       {value: 0x9e59, lo: 0x84, hi: 0x85},
+       {value: 0x9e91, lo: 0x86, hi: 0x87},
+       {value: 0x9ec9, lo: 0x88, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0xa089, lo: 0x92, hi: 0x97},
+       {value: 0xa1a1, lo: 0x98, hi: 0x9c},
+       {value: 0xa281, lo: 0x9d, hi: 0xb3},
+       {value: 0x9d41, lo: 0xb4, hi: 0xb4},
+       {value: 0x9db1, lo: 0xb5, hi: 0xb5},
+       {value: 0xa789, lo: 0xb6, hi: 0xbb},
+       {value: 0xa869, lo: 0xbc, hi: 0xbc},
+       {value: 0xa7f9, lo: 0xbd, hi: 0xbd},
+       {value: 0xa8d9, lo: 0xbe, hi: 0xbf},
+       // Block 0x86, offset 0x42b
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x0008, lo: 0xbc, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x87, offset 0x435
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0x88, offset 0x43a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x89, offset 0x43d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x8a, offset 0x443
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0x8b, offset 0x44a
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x8c, offset 0x44f
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x8d, offset 0x453
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x8e, offset 0x459
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xac},
+       {value: 0x0008, lo: 0xad, hi: 0xbf},
+       // Block 0x8f, offset 0x45e
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x90, offset 0x467
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x91, offset 0x46c
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0xbf},
+       // Block 0x92, offset 0x472
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x97},
+       {value: 0x8ad5, lo: 0x98, hi: 0x9f},
+       {value: 0x8aed, lo: 0xa0, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xbf},
+       // Block 0x93, offset 0x479
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x8aed, lo: 0xb0, hi: 0xb7},
+       {value: 0x8ad5, lo: 0xb8, hi: 0xbf},
+       // Block 0x94, offset 0x480
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x95, offset 0x487
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x96, offset 0x48b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xae},
+       {value: 0x0018, lo: 0xaf, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x97, offset 0x490
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x98, offset 0x493
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xbf},
+       // Block 0x99, offset 0x498
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0808, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0808, lo: 0x8a, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb6},
+       {value: 0x0808, lo: 0xb7, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbb},
+       {value: 0x0808, lo: 0xbc, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x0808, lo: 0xbf, hi: 0xbf},
+       // Block 0x9a, offset 0x4a4
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x96},
+       {value: 0x0818, lo: 0x97, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb6},
+       {value: 0x0818, lo: 0xb7, hi: 0xbf},
+       // Block 0x9b, offset 0x4aa
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa6},
+       {value: 0x0818, lo: 0xa7, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x9c, offset 0x4af
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xba},
+       {value: 0x0818, lo: 0xbb, hi: 0xbf},
+       // Block 0x9d, offset 0x4b6
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0818, lo: 0x96, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbe},
+       {value: 0x0818, lo: 0xbf, hi: 0xbf},
+       // Block 0x9e, offset 0x4be
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbb},
+       {value: 0x0818, lo: 0xbc, hi: 0xbd},
+       {value: 0x0808, lo: 0xbe, hi: 0xbf},
+       // Block 0x9f, offset 0x4c3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0818, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x0818, lo: 0x92, hi: 0xbf},
+       // Block 0xa0, offset 0x4c7
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0808, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x94},
+       {value: 0x0808, lo: 0x95, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0x98},
+       {value: 0x0808, lo: 0x99, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xa1, offset 0x4d7
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0818, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0x0818, lo: 0x90, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xbc},
+       {value: 0x0818, lo: 0xbd, hi: 0xbf},
+       // Block 0xa2, offset 0x4de
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0x9c},
+       {value: 0x0818, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xa3, offset 0x4e2
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb8},
+       {value: 0x0018, lo: 0xb9, hi: 0xbf},
+       // Block 0xa4, offset 0x4e6
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0818, lo: 0x98, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb7},
+       {value: 0x0818, lo: 0xb8, hi: 0xbf},
+       // Block 0xa5, offset 0x4ed
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0808, lo: 0x80, hi: 0xbf},
+       // Block 0xa6, offset 0x4ef
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0808, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0xa7, offset 0x4f2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x03dd, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xa8, offset 0x4f5
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xbf},
+       // Block 0xa9, offset 0x4f9
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0908, lo: 0x80, hi: 0x80},
+       {value: 0x0a08, lo: 0x81, hi: 0xa1},
+       {value: 0x0c08, lo: 0xa2, hi: 0xa2},
+       {value: 0x0a08, lo: 0xa3, hi: 0xa3},
+       {value: 0x3308, lo: 0xa4, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0808, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xaa, offset 0x502
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0818, lo: 0xa0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xab, offset 0x506
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x9c},
+       {value: 0x0818, lo: 0x9d, hi: 0xa6},
+       {value: 0x0808, lo: 0xa7, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0a08, lo: 0xb0, hi: 0xb2},
+       {value: 0x0c08, lo: 0xb3, hi: 0xb3},
+       {value: 0x0a08, lo: 0xb4, hi: 0xbf},
+       // Block 0xac, offset 0x50e
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0a08, lo: 0x80, hi: 0x84},
+       {value: 0x0808, lo: 0x85, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x90},
+       {value: 0x0a18, lo: 0x91, hi: 0x93},
+       {value: 0x0c18, lo: 0x94, hi: 0x94},
+       {value: 0x0818, lo: 0x95, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xad, offset 0x516
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xae, offset 0x51c
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x91},
+       {value: 0x0018, lo: 0x92, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xaf, offset 0x525
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb6},
+       {value: 0x3008, lo: 0xb7, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0xb0, offset 0x531
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xb1, offset 0x538
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb2},
+       {value: 0x3b08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xbf},
+       // Block 0xb2, offset 0x541
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x3008, lo: 0x85, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xb3, offset 0x54b
+       {value: 0x0000, lo: 0x06},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xbe},
+       {value: 0x3008, lo: 0xbf, hi: 0xbf},
+       // Block 0xb4, offset 0x552
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x88},
+       {value: 0x3308, lo: 0x89, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xb5, offset 0x560
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3808, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xb6, offset 0x56d
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0008, lo: 0x9f, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0xb7, offset 0x57a
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x3308, lo: 0x9f, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa9},
+       {value: 0x3b08, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xb8, offset 0x583
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xb9, offset 0x587
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x84},
+       {value: 0x3008, lo: 0x85, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9d},
+       {value: 0x3308, lo: 0x9e, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xbf},
+       // Block 0xba, offset 0x596
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb8},
+       {value: 0x3008, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0xbb, offset 0x59e
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x85},
+       {value: 0x0018, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xbc, offset 0x5a9
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xbd, offset 0x5b2
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9b},
+       {value: 0x3308, lo: 0x9c, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0xbe, offset 0x5b8
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xbf, offset 0x5c0
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xc0, offset 0x5c9
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb5},
+       {value: 0x3808, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0xc1, offset 0x5d3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0xbf},
+       // Block 0xc2, offset 0x5d6
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbf},
+       // Block 0xc3, offset 0x5e2
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0xc4, offset 0x5eb
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xbf},
+       // Block 0xc5, offset 0x5ee
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0xc6, offset 0x5f3
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb8},
+       {value: 0x3008, lo: 0xb9, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbe},
+       {value: 0x0018, lo: 0xbf, hi: 0xbf},
+       // Block 0xc7, offset 0x5fe
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x3b08, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x3308, lo: 0x91, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0xbf},
+       // Block 0xc8, offset 0x607
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x89},
+       {value: 0x3308, lo: 0x8a, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x98},
+       {value: 0x3b08, lo: 0x99, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9c},
+       {value: 0x0008, lo: 0x9d, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0xa2},
+       {value: 0x0040, lo: 0xa3, hi: 0xbf},
+       // Block 0xc9, offset 0x613
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xca, offset 0x616
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xcb, offset 0x620
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xbf},
+       // Block 0xcc, offset 0x629
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xa9},
+       {value: 0x3308, lo: 0xaa, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xcd, offset 0x635
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0xce, offset 0x642
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x3308, lo: 0x80, hi: 0x83},
+       {value: 0x3b08, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xa9},
+       {value: 0x0008, lo: 0xaa, hi: 0xbf},
+       // Block 0xcf, offset 0x64f
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x3008, lo: 0x8a, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x92},
+       {value: 0x3008, lo: 0x93, hi: 0x94},
+       {value: 0x3308, lo: 0x95, hi: 0x95},
+       {value: 0x3008, lo: 0x96, hi: 0x96},
+       {value: 0x3b08, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xbf},
+       // Block 0xd0, offset 0x65d
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xd1, offset 0x664
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xd2, offset 0x667
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xd3, offset 0x66c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0xbf},
+       // Block 0xd4, offset 0x66f
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xbf},
+       // Block 0xd5, offset 0x672
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0xbf},
+       // Block 0xd6, offset 0x675
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xd7, offset 0x67c
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xd8, offset 0x683
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0xd9, offset 0x687
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x0008, lo: 0xa3, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0xda, offset 0x692
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0xbf},
+       // Block 0xdb, offset 0x695
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0xdc, offset 0x698
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0xbf},
+       // Block 0xdd, offset 0x69b
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x3008, lo: 0x91, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xde, offset 0x6a1
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8e},
+       {value: 0x3308, lo: 0x8f, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xdf, offset 0x6a6
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xbf},
+       // Block 0xe0, offset 0x6aa
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xe1, offset 0x6ad
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xe2, offset 0x6b0
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xbf},
+       // Block 0xe3, offset 0x6b3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0xe4, offset 0x6b6
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0xe5, offset 0x6b9
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0xe6, offset 0x6be
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x03c0, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xbf},
+       // Block 0xe7, offset 0x6c8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xe8, offset 0x6cb
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xbf},
+       // Block 0xe9, offset 0x6cf
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0018, lo: 0x80, hi: 0x9d},
+       {value: 0xb5b9, lo: 0x9e, hi: 0x9e},
+       {value: 0xb601, lo: 0x9f, hi: 0x9f},
+       {value: 0xb649, lo: 0xa0, hi: 0xa0},
+       {value: 0xb6b1, lo: 0xa1, hi: 0xa1},
+       {value: 0xb719, lo: 0xa2, hi: 0xa2},
+       {value: 0xb781, lo: 0xa3, hi: 0xa3},
+       {value: 0xb7e9, lo: 0xa4, hi: 0xa4},
+       {value: 0x3018, lo: 0xa5, hi: 0xa6},
+       {value: 0x3318, lo: 0xa7, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xac},
+       {value: 0x3018, lo: 0xad, hi: 0xb2},
+       {value: 0x0340, lo: 0xb3, hi: 0xba},
+       {value: 0x3318, lo: 0xbb, hi: 0xbf},
+       // Block 0xea, offset 0x6de
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3318, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0x84},
+       {value: 0x3318, lo: 0x85, hi: 0x8b},
+       {value: 0x0018, lo: 0x8c, hi: 0xa9},
+       {value: 0x3318, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xba},
+       {value: 0xb851, lo: 0xbb, hi: 0xbb},
+       {value: 0xb899, lo: 0xbc, hi: 0xbc},
+       {value: 0xb8e1, lo: 0xbd, hi: 0xbd},
+       {value: 0xb949, lo: 0xbe, hi: 0xbe},
+       {value: 0xb9b1, lo: 0xbf, hi: 0xbf},
+       // Block 0xeb, offset 0x6ea
+       {value: 0x0000, lo: 0x03},
+       {value: 0xba19, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xbf},
+       // Block 0xec, offset 0x6ee
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x3318, lo: 0x82, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0xbf},
+       // Block 0xed, offset 0x6f3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0xee, offset 0x6f7
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xef, offset 0x6fc
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0xf0, offset 0x700
+       {value: 0x0000, lo: 0x04},
+       {value: 0x3308, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0xf1, offset 0x705
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x3308, lo: 0xa1, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xf2, offset 0x70e
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa4},
+       {value: 0x0040, lo: 0xa5, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xbf},
+       // Block 0xf3, offset 0x719
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x86},
+       {value: 0x0818, lo: 0x87, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0xf4, offset 0x71f
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0a08, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0818, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xf5, offset 0x727
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xb0},
+       {value: 0x0818, lo: 0xb1, hi: 0xbf},
+       // Block 0xf6, offset 0x72a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0818, lo: 0x80, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xf7, offset 0x72d
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xf8, offset 0x731
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0xf9, offset 0x735
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0xfa, offset 0x73b
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xfb, offset 0x741
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8f},
+       {value: 0xc1c1, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xfc, offset 0x746
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xbf},
+       // Block 0xfd, offset 0x749
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xc7e9, lo: 0x80, hi: 0x80},
+       {value: 0xc839, lo: 0x81, hi: 0x81},
+       {value: 0xc889, lo: 0x82, hi: 0x82},
+       {value: 0xc8d9, lo: 0x83, hi: 0x83},
+       {value: 0xc929, lo: 0x84, hi: 0x84},
+       {value: 0xc979, lo: 0x85, hi: 0x85},
+       {value: 0xc9c9, lo: 0x86, hi: 0x86},
+       {value: 0xca19, lo: 0x87, hi: 0x87},
+       {value: 0xca69, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0xcab9, lo: 0x90, hi: 0x90},
+       {value: 0xcad9, lo: 0x91, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xbf},
+       // Block 0xfe, offset 0x759
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xff, offset 0x760
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x100, offset 0x763
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0xbf},
+       // Block 0x101, offset 0x766
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x102, offset 0x76a
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0x103, offset 0x770
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xbf},
+       // Block 0x104, offset 0x775
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x105, offset 0x77a
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb2},
+       {value: 0x0018, lo: 0xb3, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbf},
+       // Block 0x106, offset 0x782
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xa2},
+       {value: 0x0040, lo: 0xa3, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x107, offset 0x787
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x108, offset 0x78b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xbf},
+       // Block 0x109, offset 0x78f
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0x10a, offset 0x792
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x10b, offset 0x795
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x10c, offset 0x799
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x10d, offset 0x79d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0x10e, offset 0x7a0
+       {value: 0x0020, lo: 0x0f},
+       {value: 0xdeb9, lo: 0x80, hi: 0x89},
+       {value: 0x8dfd, lo: 0x8a, hi: 0x8a},
+       {value: 0xdff9, lo: 0x8b, hi: 0x9c},
+       {value: 0x8e1d, lo: 0x9d, hi: 0x9d},
+       {value: 0xe239, lo: 0x9e, hi: 0xa2},
+       {value: 0x8e3d, lo: 0xa3, hi: 0xa3},
+       {value: 0xe2d9, lo: 0xa4, hi: 0xab},
+       {value: 0x7ed5, lo: 0xac, hi: 0xac},
+       {value: 0xe3d9, lo: 0xad, hi: 0xaf},
+       {value: 0x8e5d, lo: 0xb0, hi: 0xb0},
+       {value: 0xe439, lo: 0xb1, hi: 0xb6},
+       {value: 0x8e7d, lo: 0xb7, hi: 0xb9},
+       {value: 0xe4f9, lo: 0xba, hi: 0xba},
+       {value: 0x8edd, lo: 0xbb, hi: 0xbb},
+       {value: 0xe519, lo: 0xbc, hi: 0xbf},
+       // Block 0x10f, offset 0x7b0
+       {value: 0x0020, lo: 0x10},
+       {value: 0x937d, lo: 0x80, hi: 0x80},
+       {value: 0xf099, lo: 0x81, hi: 0x86},
+       {value: 0x939d, lo: 0x87, hi: 0x8a},
+       {value: 0xd9f9, lo: 0x8b, hi: 0x8b},
+       {value: 0xf159, lo: 0x8c, hi: 0x96},
+       {value: 0x941d, lo: 0x97, hi: 0x97},
+       {value: 0xf2b9, lo: 0x98, hi: 0xa3},
+       {value: 0x943d, lo: 0xa4, hi: 0xa6},
+       {value: 0xf439, lo: 0xa7, hi: 0xaa},
+       {value: 0x949d, lo: 0xab, hi: 0xab},
+       {value: 0xf4b9, lo: 0xac, hi: 0xac},
+       {value: 0x94bd, lo: 0xad, hi: 0xad},
+       {value: 0xf4d9, lo: 0xae, hi: 0xaf},
+       {value: 0x94dd, lo: 0xb0, hi: 0xb1},
+       {value: 0xf519, lo: 0xb2, hi: 0xbe},
+       {value: 0x2040, lo: 0xbf, hi: 0xbf},
+       // Block 0x110, offset 0x7c1
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0340, lo: 0x81, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x9f},
+       {value: 0x0340, lo: 0xa0, hi: 0xbf},
+       // Block 0x111, offset 0x7c6
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0340, lo: 0x80, hi: 0xbf},
+       // Block 0x112, offset 0x7c8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x33c0, lo: 0x80, hi: 0xbf},
+       // Block 0x113, offset 0x7ca
+       {value: 0x0000, lo: 0x02},
+       {value: 0x33c0, lo: 0x80, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+}
+
+// Total table size 42466 bytes (41KiB); checksum: 355A58A4
diff --git a/libgo/go/golang.org/x/net/idna/tables9.0.0.go b/libgo/go/golang.org/x/net/idna/tables9.0.0.go
new file mode 100644 (file)
index 0000000..8b65fa1
--- /dev/null
@@ -0,0 +1,4486 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package idna
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "9.0.0"
+
+var mappings string = "" + // Size: 8175 bytes
+       "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
+       "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
+       "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
+       "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" +
+       "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" +
+       "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" +
+       "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" +
+       "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" +
+       "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" +
+       "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" +
+       "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" +
+       "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" +
+       "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" +
+       "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" +
+       "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" +
+       "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" +
+       "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" +
+       "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" +
+       "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" +
+       "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" +
+       "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" +
+       "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" +
+       "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" +
+       "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" +
+       "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" +
+       "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" +
+       ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" +
+       "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" +
+       "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" +
+       "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" +
+       "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" +
+       "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" +
+       "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" +
+       "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" +
+       "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" +
+       "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" +
+       "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" +
+       "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" +
+       "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" +
+       "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" +
+       "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" +
+       "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" +
+       "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" +
+       "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" +
+       "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" +
+       "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" +
+       "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" +
+       "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" +
+       "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" +
+       "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" +
+       "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" +
+       "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" +
+       "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" +
+       "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" +
+       "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" +
+       "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" +
+       "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" +
+       "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" +
+       "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" +
+       "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" +
+       "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" +
+       "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" +
+       "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" +
+       "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" +
+       "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" +
+       "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" +
+       "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" +
+       "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" +
+       "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" +
+       "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" +
+       "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" +
+       "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" +
+       "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" +
+       " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" +
+       "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" +
+       "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" +
+       "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" +
+       "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" +
+       "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" +
+       "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" +
+       "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" +
+       "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" +
+       "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" +
+       "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" +
+       "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" +
+       "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" +
+       "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" +
+       "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" +
+       "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" +
+       "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" +
+       "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" +
+       "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" +
+       "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" +
+       "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" +
+       "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" +
+       "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" +
+       "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" +
+       "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" +
+       "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" +
+       "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" +
+       "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" +
+       "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" +
+       "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" +
+       "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" +
+       "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" +
+       "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" +
+       "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" +
+       "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" +
+       "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" +
+       "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" +
+       "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" +
+       "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" +
+       "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" +
+       "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" +
+       "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" +
+       "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" +
+       "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" +
+       "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" +
+       "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" +
+       "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" +
+       "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" +
+       "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" +
+       "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" +
+       "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" +
+       "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" +
+       "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" +
+       "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" +
+       "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" +
+       "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" +
+       "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" +
+       "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" +
+       "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" +
+       "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" +
+       "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" +
+       "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" +
+       "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" +
+       "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻"
+
+var xorData string = "" + // Size: 4855 bytes
+       "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
+       "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" +
+       "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" +
+       "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" +
+       "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" +
+       "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" +
+       "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" +
+       "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" +
+       "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" +
+       "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" +
+       "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" +
+       "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" +
+       "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" +
+       "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" +
+       "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" +
+       "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" +
+       "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" +
+       "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" +
+       "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" +
+       "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" +
+       "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" +
+       "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" +
+       "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" +
+       "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" +
+       "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" +
+       "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" +
+       "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" +
+       "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" +
+       "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" +
+       "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" +
+       "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" +
+       "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" +
+       "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" +
+       "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" +
+       "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" +
+       "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" +
+       "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " +
+       "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" +
+       "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" +
+       "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" +
+       "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" +
+       "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" +
+       ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" +
+       "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" +
+       "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" +
+       "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" +
+       "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" +
+       "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" +
+       "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" +
+       "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" +
+       "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" +
+       "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" +
+       "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" +
+       "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" +
+       "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" +
+       "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" +
+       "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" +
+       "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" +
+       "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" +
+       "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" +
+       "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" +
+       "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" +
+       "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" +
+       "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" +
+       "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" +
+       "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" +
+       "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" +
+       "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" +
+       "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" +
+       "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" +
+       "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" +
+       "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" +
+       "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" +
+       "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" +
+       "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" +
+       "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" +
+       "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" +
+       "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" +
+       "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" +
+       "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" +
+       "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" +
+       "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" +
+       "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" +
+       "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" +
+       "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" +
+       "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" +
+       "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" +
+       "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" +
+       "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," +
+       "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" +
+       "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" +
+       "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" +
+       "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" +
+       ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" +
+       "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" +
+       "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" +
+       "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" +
+       "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" +
+       "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" +
+       "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" +
+       "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" +
+       "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" +
+       "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" +
+       "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" +
+       "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" +
+       "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" +
+       "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" +
+       "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" +
+       "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" +
+       "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" +
+       "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" +
+       "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" +
+       "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" +
+       "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" +
+       "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" +
+       "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" +
+       "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" +
+       "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" +
+       "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" +
+       "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" +
+       "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" +
+       "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" +
+       "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" +
+       "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" +
+       "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" +
+       "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" +
+       "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" +
+       "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" +
+       "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" +
+       "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." +
+       "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" +
+       "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" +
+       "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " +
+       "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" +
+       "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" +
+       "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" +
+       "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" +
+       "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" +
+       "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" +
+       "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," +
+       "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" +
+       "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" +
+       "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" +
+       "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" +
+       "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" +
+       "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" +
+       "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" +
+       "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" +
+       "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" +
+       "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" +
+       "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" +
+       "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" +
+       "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" +
+       "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" +
+       "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" +
+       "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" +
+       "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" +
+       "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" +
+       "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" +
+       "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" +
+       "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" +
+       "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" +
+       "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" +
+       "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" +
+       "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" +
+       "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" +
+       "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" +
+       "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" +
+       "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" +
+       "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" +
+       "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" +
+       "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" +
+       "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" +
+       "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" +
+       "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" +
+       "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" +
+       "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" +
+       "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" +
+       "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," +
+       "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" +
+       "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" +
+       "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" +
+       "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" +
+       "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" +
+       "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" +
+       "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" +
+       "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" +
+       "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" +
+       "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" +
+       "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" +
+       "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" +
+       "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" +
+       "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" +
+       "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" +
+       "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" +
+       "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" +
+       "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" +
+       "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" +
+       "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" +
+       "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" +
+       "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" +
+       "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" +
+       "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" +
+       "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" +
+       "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" +
+       "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" +
+       "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" +
+       "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" +
+       "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" +
+       "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" +
+       "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" +
+       "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" +
+       "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" +
+       "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" +
+       "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" +
+       "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" +
+       "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" +
+       "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" +
+       "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" +
+       "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" +
+       "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" +
+       "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" +
+       "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" +
+       "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" +
+       "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" +
+       "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" +
+       "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" +
+       "\x05\x22\x05\x03\x050\x1d"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return idnaValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := idnaIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = idnaIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = idnaIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return idnaValues[c0]
+       }
+       i := idnaIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// idnaTrie. Total size: 28600 bytes (27.93 KiB). Checksum: 95575047b5d8fff.
+type idnaTrie struct{}
+
+func newIdnaTrie(i int) *idnaTrie {
+       return &idnaTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 124:
+               return uint16(idnaValues[n<<6+uint32(b)])
+       default:
+               n -= 124
+               return uint16(idnaSparse.lookup(n, b))
+       }
+}
+
+// idnaValues: 126 blocks, 8064 entries, 16128 bytes
+// The third block is the zero block.
+var idnaValues = [8064]uint16{
+       // Block 0x0, offset 0x0
+       0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
+       0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
+       0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,
+       0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,
+       0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,
+       0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,
+       0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,
+       0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,
+       0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,
+       0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,
+       0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,
+       // Block 0x1, offset 0x40
+       0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,
+       0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,
+       0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,
+       0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,
+       0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,
+       0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,
+       0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,
+       0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,
+       0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,
+       0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,
+       0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,
+       0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,
+       0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,
+       0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
+       0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
+       0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
+       0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,
+       0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,
+       0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,
+       0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,
+       0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,
+       // Block 0x4, offset 0x100
+       0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
+       0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
+       0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,
+       0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,
+       0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,
+       0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
+       0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
+       0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
+       0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
+       0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
+       0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,
+       // Block 0x5, offset 0x140
+       0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
+       0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,
+       0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
+       0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
+       0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
+       0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,
+       0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,
+       0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
+       0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
+       0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
+       0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,
+       // Block 0x6, offset 0x180
+       0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
+       0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
+       0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,
+       0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,
+       0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,
+       0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,
+       0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,
+       0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,
+       0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,
+       0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
+       0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,
+       0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
+       0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
+       0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
+       0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
+       0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,
+       0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,
+       0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,
+       0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,
+       0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,
+       0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,
+       // Block 0x8, offset 0x200
+       0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,
+       0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,
+       0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,
+       0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,
+       0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,
+       0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,
+       0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
+       0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
+       0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
+       0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,
+       0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,
+       // Block 0x9, offset 0x240
+       0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
+       0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
+       0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
+       0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
+       0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,
+       0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,
+       0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
+       0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
+       0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
+       0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
+       0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
+       // Block 0xa, offset 0x280
+       0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
+       0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
+       0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
+       0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
+       0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
+       0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
+       0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
+       0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
+       0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
+       0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
+       0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,
+       0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
+       0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
+       0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
+       0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,
+       0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,
+       0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,
+       0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,
+       0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,
+       0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,
+       0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,
+       // Block 0xc, offset 0x300
+       0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,
+       0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,
+       0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,
+       0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,
+       0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,
+       0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,
+       0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,
+       0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,
+       0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,
+       0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,
+       0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,
+       // Block 0xd, offset 0x340
+       0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,
+       0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,
+       0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,
+       0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,
+       0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,
+       0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,
+       0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,
+       0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,
+       0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,
+       0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
+       0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
+       // Block 0xe, offset 0x380
+       0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
+       0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
+       0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
+       0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
+       0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
+       0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,
+       0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,
+       0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,
+       0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,
+       0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,
+       0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,
+       0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,
+       0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,
+       0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,
+       0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,
+       0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,
+       0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,
+       0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,
+       0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,
+       0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,
+       0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,
+       // Block 0x10, offset 0x400
+       0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,
+       0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,
+       0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,
+       0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,
+       0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,
+       0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,
+       0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,
+       0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,
+       0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,
+       0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
+       0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
+       // Block 0x11, offset 0x440
+       0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
+       0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
+       0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
+       0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
+       0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,
+       0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
+       0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
+       0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
+       0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
+       0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
+       0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
+       // Block 0x12, offset 0x480
+       0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
+       0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
+       0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
+       0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
+       0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
+       0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
+       0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
+       0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
+       0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
+       0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+       0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
+       0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
+       0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
+       0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
+       0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
+       0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
+       0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
+       0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
+       0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
+       0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
+       0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
+       // Block 0x14, offset 0x500
+       0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
+       0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
+       0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
+       0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
+       0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
+       0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
+       0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
+       0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
+       0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
+       0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
+       0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
+       // Block 0x15, offset 0x540
+       0x540: 0x3008, 0x541: 0x3308, 0x542: 0x3308, 0x543: 0x3308, 0x544: 0x3308, 0x545: 0x3308,
+       0x546: 0x3308, 0x547: 0x3308, 0x548: 0x3308, 0x549: 0x3008, 0x54a: 0x3008, 0x54b: 0x3008,
+       0x54c: 0x3008, 0x54d: 0x3b08, 0x54e: 0x3008, 0x54f: 0x3008, 0x550: 0x0008, 0x551: 0x3308,
+       0x552: 0x3308, 0x553: 0x3308, 0x554: 0x3308, 0x555: 0x3308, 0x556: 0x3308, 0x557: 0x3308,
+       0x558: 0x04c9, 0x559: 0x0501, 0x55a: 0x0539, 0x55b: 0x0571, 0x55c: 0x05a9, 0x55d: 0x05e1,
+       0x55e: 0x0619, 0x55f: 0x0651, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x3308, 0x563: 0x3308,
+       0x564: 0x0018, 0x565: 0x0018, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0008,
+       0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008,
+       0x570: 0x0018, 0x571: 0x0008, 0x572: 0x0008, 0x573: 0x0008, 0x574: 0x0008, 0x575: 0x0008,
+       0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0008, 0x57b: 0x0008,
+       0x57c: 0x0008, 0x57d: 0x0008, 0x57e: 0x0008, 0x57f: 0x0008,
+       // Block 0x16, offset 0x580
+       0x580: 0x0008, 0x581: 0x3308, 0x582: 0x3008, 0x583: 0x3008, 0x584: 0x0040, 0x585: 0x0008,
+       0x586: 0x0008, 0x587: 0x0008, 0x588: 0x0008, 0x589: 0x0008, 0x58a: 0x0008, 0x58b: 0x0008,
+       0x58c: 0x0008, 0x58d: 0x0040, 0x58e: 0x0040, 0x58f: 0x0008, 0x590: 0x0008, 0x591: 0x0040,
+       0x592: 0x0040, 0x593: 0x0008, 0x594: 0x0008, 0x595: 0x0008, 0x596: 0x0008, 0x597: 0x0008,
+       0x598: 0x0008, 0x599: 0x0008, 0x59a: 0x0008, 0x59b: 0x0008, 0x59c: 0x0008, 0x59d: 0x0008,
+       0x59e: 0x0008, 0x59f: 0x0008, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x0008, 0x5a3: 0x0008,
+       0x5a4: 0x0008, 0x5a5: 0x0008, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0040,
+       0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
+       0x5b0: 0x0008, 0x5b1: 0x0040, 0x5b2: 0x0008, 0x5b3: 0x0040, 0x5b4: 0x0040, 0x5b5: 0x0040,
+       0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0040, 0x5bb: 0x0040,
+       0x5bc: 0x3308, 0x5bd: 0x0008, 0x5be: 0x3008, 0x5bf: 0x3008,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x3008, 0x5c1: 0x3308, 0x5c2: 0x3308, 0x5c3: 0x3308, 0x5c4: 0x3308, 0x5c5: 0x0040,
+       0x5c6: 0x0040, 0x5c7: 0x3008, 0x5c8: 0x3008, 0x5c9: 0x0040, 0x5ca: 0x0040, 0x5cb: 0x3008,
+       0x5cc: 0x3008, 0x5cd: 0x3b08, 0x5ce: 0x0008, 0x5cf: 0x0040, 0x5d0: 0x0040, 0x5d1: 0x0040,
+       0x5d2: 0x0040, 0x5d3: 0x0040, 0x5d4: 0x0040, 0x5d5: 0x0040, 0x5d6: 0x0040, 0x5d7: 0x3008,
+       0x5d8: 0x0040, 0x5d9: 0x0040, 0x5da: 0x0040, 0x5db: 0x0040, 0x5dc: 0x0689, 0x5dd: 0x06c1,
+       0x5de: 0x0040, 0x5df: 0x06f9, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x3308, 0x5e3: 0x3308,
+       0x5e4: 0x0040, 0x5e5: 0x0040, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0008,
+       0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
+       0x5f0: 0x0008, 0x5f1: 0x0008, 0x5f2: 0x0018, 0x5f3: 0x0018, 0x5f4: 0x0018, 0x5f5: 0x0018,
+       0x5f6: 0x0018, 0x5f7: 0x0018, 0x5f8: 0x0018, 0x5f9: 0x0018, 0x5fa: 0x0018, 0x5fb: 0x0018,
+       0x5fc: 0x0040, 0x5fd: 0x0040, 0x5fe: 0x0040, 0x5ff: 0x0040,
+       // Block 0x18, offset 0x600
+       0x600: 0x0040, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3008, 0x604: 0x0040, 0x605: 0x0008,
+       0x606: 0x0008, 0x607: 0x0008, 0x608: 0x0008, 0x609: 0x0008, 0x60a: 0x0008, 0x60b: 0x0040,
+       0x60c: 0x0040, 0x60d: 0x0040, 0x60e: 0x0040, 0x60f: 0x0008, 0x610: 0x0008, 0x611: 0x0040,
+       0x612: 0x0040, 0x613: 0x0008, 0x614: 0x0008, 0x615: 0x0008, 0x616: 0x0008, 0x617: 0x0008,
+       0x618: 0x0008, 0x619: 0x0008, 0x61a: 0x0008, 0x61b: 0x0008, 0x61c: 0x0008, 0x61d: 0x0008,
+       0x61e: 0x0008, 0x61f: 0x0008, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x0008, 0x623: 0x0008,
+       0x624: 0x0008, 0x625: 0x0008, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0040,
+       0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
+       0x630: 0x0008, 0x631: 0x0040, 0x632: 0x0008, 0x633: 0x0731, 0x634: 0x0040, 0x635: 0x0008,
+       0x636: 0x0769, 0x637: 0x0040, 0x638: 0x0008, 0x639: 0x0008, 0x63a: 0x0040, 0x63b: 0x0040,
+       0x63c: 0x3308, 0x63d: 0x0040, 0x63e: 0x3008, 0x63f: 0x3008,
+       // Block 0x19, offset 0x640
+       0x640: 0x3008, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x0040, 0x644: 0x0040, 0x645: 0x0040,
+       0x646: 0x0040, 0x647: 0x3308, 0x648: 0x3308, 0x649: 0x0040, 0x64a: 0x0040, 0x64b: 0x3308,
+       0x64c: 0x3308, 0x64d: 0x3b08, 0x64e: 0x0040, 0x64f: 0x0040, 0x650: 0x0040, 0x651: 0x3308,
+       0x652: 0x0040, 0x653: 0x0040, 0x654: 0x0040, 0x655: 0x0040, 0x656: 0x0040, 0x657: 0x0040,
+       0x658: 0x0040, 0x659: 0x07a1, 0x65a: 0x07d9, 0x65b: 0x0811, 0x65c: 0x0008, 0x65d: 0x0040,
+       0x65e: 0x0849, 0x65f: 0x0040, 0x660: 0x0040, 0x661: 0x0040, 0x662: 0x0040, 0x663: 0x0040,
+       0x664: 0x0040, 0x665: 0x0040, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0008,
+       0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
+       0x670: 0x3308, 0x671: 0x3308, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0008, 0x675: 0x3308,
+       0x676: 0x0040, 0x677: 0x0040, 0x678: 0x0040, 0x679: 0x0040, 0x67a: 0x0040, 0x67b: 0x0040,
+       0x67c: 0x0040, 0x67d: 0x0040, 0x67e: 0x0040, 0x67f: 0x0040,
+       // Block 0x1a, offset 0x680
+       0x680: 0x0040, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x3008, 0x684: 0x0040, 0x685: 0x0008,
+       0x686: 0x0008, 0x687: 0x0008, 0x688: 0x0008, 0x689: 0x0008, 0x68a: 0x0008, 0x68b: 0x0008,
+       0x68c: 0x0008, 0x68d: 0x0008, 0x68e: 0x0040, 0x68f: 0x0008, 0x690: 0x0008, 0x691: 0x0008,
+       0x692: 0x0040, 0x693: 0x0008, 0x694: 0x0008, 0x695: 0x0008, 0x696: 0x0008, 0x697: 0x0008,
+       0x698: 0x0008, 0x699: 0x0008, 0x69a: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008,
+       0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008,
+       0x6a4: 0x0008, 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0040,
+       0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
+       0x6b0: 0x0008, 0x6b1: 0x0040, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0040, 0x6b5: 0x0008,
+       0x6b6: 0x0008, 0x6b7: 0x0008, 0x6b8: 0x0008, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040,
+       0x6bc: 0x3308, 0x6bd: 0x0008, 0x6be: 0x3008, 0x6bf: 0x3008,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x3008, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3308, 0x6c4: 0x3308, 0x6c5: 0x3308,
+       0x6c6: 0x0040, 0x6c7: 0x3308, 0x6c8: 0x3308, 0x6c9: 0x3008, 0x6ca: 0x0040, 0x6cb: 0x3008,
+       0x6cc: 0x3008, 0x6cd: 0x3b08, 0x6ce: 0x0040, 0x6cf: 0x0040, 0x6d0: 0x0008, 0x6d1: 0x0040,
+       0x6d2: 0x0040, 0x6d3: 0x0040, 0x6d4: 0x0040, 0x6d5: 0x0040, 0x6d6: 0x0040, 0x6d7: 0x0040,
+       0x6d8: 0x0040, 0x6d9: 0x0040, 0x6da: 0x0040, 0x6db: 0x0040, 0x6dc: 0x0040, 0x6dd: 0x0040,
+       0x6de: 0x0040, 0x6df: 0x0040, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x3308, 0x6e3: 0x3308,
+       0x6e4: 0x0040, 0x6e5: 0x0040, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0008,
+       0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
+       0x6f0: 0x0018, 0x6f1: 0x0018, 0x6f2: 0x0040, 0x6f3: 0x0040, 0x6f4: 0x0040, 0x6f5: 0x0040,
+       0x6f6: 0x0040, 0x6f7: 0x0040, 0x6f8: 0x0040, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,
+       0x6fc: 0x0040, 0x6fd: 0x0040, 0x6fe: 0x0040, 0x6ff: 0x0040,
+       // Block 0x1c, offset 0x700
+       0x700: 0x0040, 0x701: 0x3308, 0x702: 0x3008, 0x703: 0x3008, 0x704: 0x0040, 0x705: 0x0008,
+       0x706: 0x0008, 0x707: 0x0008, 0x708: 0x0008, 0x709: 0x0008, 0x70a: 0x0008, 0x70b: 0x0008,
+       0x70c: 0x0008, 0x70d: 0x0040, 0x70e: 0x0040, 0x70f: 0x0008, 0x710: 0x0008, 0x711: 0x0040,
+       0x712: 0x0040, 0x713: 0x0008, 0x714: 0x0008, 0x715: 0x0008, 0x716: 0x0008, 0x717: 0x0008,
+       0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008,
+       0x71e: 0x0008, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x0008, 0x723: 0x0008,
+       0x724: 0x0008, 0x725: 0x0008, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0040,
+       0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
+       0x730: 0x0008, 0x731: 0x0040, 0x732: 0x0008, 0x733: 0x0008, 0x734: 0x0040, 0x735: 0x0008,
+       0x736: 0x0008, 0x737: 0x0008, 0x738: 0x0008, 0x739: 0x0008, 0x73a: 0x0040, 0x73b: 0x0040,
+       0x73c: 0x3308, 0x73d: 0x0008, 0x73e: 0x3008, 0x73f: 0x3308,
+       // Block 0x1d, offset 0x740
+       0x740: 0x3008, 0x741: 0x3308, 0x742: 0x3308, 0x743: 0x3308, 0x744: 0x3308, 0x745: 0x0040,
+       0x746: 0x0040, 0x747: 0x3008, 0x748: 0x3008, 0x749: 0x0040, 0x74a: 0x0040, 0x74b: 0x3008,
+       0x74c: 0x3008, 0x74d: 0x3b08, 0x74e: 0x0040, 0x74f: 0x0040, 0x750: 0x0040, 0x751: 0x0040,
+       0x752: 0x0040, 0x753: 0x0040, 0x754: 0x0040, 0x755: 0x0040, 0x756: 0x3308, 0x757: 0x3008,
+       0x758: 0x0040, 0x759: 0x0040, 0x75a: 0x0040, 0x75b: 0x0040, 0x75c: 0x0881, 0x75d: 0x08b9,
+       0x75e: 0x0040, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x3308, 0x763: 0x3308,
+       0x764: 0x0040, 0x765: 0x0040, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008,
+       0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
+       0x770: 0x0018, 0x771: 0x0008, 0x772: 0x0018, 0x773: 0x0018, 0x774: 0x0018, 0x775: 0x0018,
+       0x776: 0x0018, 0x777: 0x0018, 0x778: 0x0040, 0x779: 0x0040, 0x77a: 0x0040, 0x77b: 0x0040,
+       0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x0040, 0x77f: 0x0040,
+       // Block 0x1e, offset 0x780
+       0x780: 0x0040, 0x781: 0x0040, 0x782: 0x3308, 0x783: 0x0008, 0x784: 0x0040, 0x785: 0x0008,
+       0x786: 0x0008, 0x787: 0x0008, 0x788: 0x0008, 0x789: 0x0008, 0x78a: 0x0008, 0x78b: 0x0040,
+       0x78c: 0x0040, 0x78d: 0x0040, 0x78e: 0x0008, 0x78f: 0x0008, 0x790: 0x0008, 0x791: 0x0040,
+       0x792: 0x0008, 0x793: 0x0008, 0x794: 0x0008, 0x795: 0x0008, 0x796: 0x0040, 0x797: 0x0040,
+       0x798: 0x0040, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0008, 0x79d: 0x0040,
+       0x79e: 0x0008, 0x79f: 0x0008, 0x7a0: 0x0040, 0x7a1: 0x0040, 0x7a2: 0x0040, 0x7a3: 0x0008,
+       0x7a4: 0x0008, 0x7a5: 0x0040, 0x7a6: 0x0040, 0x7a7: 0x0040, 0x7a8: 0x0008, 0x7a9: 0x0008,
+       0x7aa: 0x0008, 0x7ab: 0x0040, 0x7ac: 0x0040, 0x7ad: 0x0040, 0x7ae: 0x0008, 0x7af: 0x0008,
+       0x7b0: 0x0008, 0x7b1: 0x0008, 0x7b2: 0x0008, 0x7b3: 0x0008, 0x7b4: 0x0008, 0x7b5: 0x0008,
+       0x7b6: 0x0008, 0x7b7: 0x0008, 0x7b8: 0x0008, 0x7b9: 0x0008, 0x7ba: 0x0040, 0x7bb: 0x0040,
+       0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x3008, 0x7bf: 0x3008,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x3308, 0x7c1: 0x3008, 0x7c2: 0x3008, 0x7c3: 0x3008, 0x7c4: 0x3008, 0x7c5: 0x0040,
+       0x7c6: 0x3308, 0x7c7: 0x3308, 0x7c8: 0x3308, 0x7c9: 0x0040, 0x7ca: 0x3308, 0x7cb: 0x3308,
+       0x7cc: 0x3308, 0x7cd: 0x3b08, 0x7ce: 0x0040, 0x7cf: 0x0040, 0x7d0: 0x0040, 0x7d1: 0x0040,
+       0x7d2: 0x0040, 0x7d3: 0x0040, 0x7d4: 0x0040, 0x7d5: 0x3308, 0x7d6: 0x3308, 0x7d7: 0x0040,
+       0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0040, 0x7dd: 0x0040,
+       0x7de: 0x0040, 0x7df: 0x0040, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x3308, 0x7e3: 0x3308,
+       0x7e4: 0x0040, 0x7e5: 0x0040, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0008,
+       0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008,
+       0x7f0: 0x0040, 0x7f1: 0x0040, 0x7f2: 0x0040, 0x7f3: 0x0040, 0x7f4: 0x0040, 0x7f5: 0x0040,
+       0x7f6: 0x0040, 0x7f7: 0x0040, 0x7f8: 0x0018, 0x7f9: 0x0018, 0x7fa: 0x0018, 0x7fb: 0x0018,
+       0x7fc: 0x0018, 0x7fd: 0x0018, 0x7fe: 0x0018, 0x7ff: 0x0018,
+       // Block 0x20, offset 0x800
+       0x800: 0x0008, 0x801: 0x3308, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x0040, 0x805: 0x0008,
+       0x806: 0x0008, 0x807: 0x0008, 0x808: 0x0008, 0x809: 0x0008, 0x80a: 0x0008, 0x80b: 0x0008,
+       0x80c: 0x0008, 0x80d: 0x0040, 0x80e: 0x0008, 0x80f: 0x0008, 0x810: 0x0008, 0x811: 0x0040,
+       0x812: 0x0008, 0x813: 0x0008, 0x814: 0x0008, 0x815: 0x0008, 0x816: 0x0008, 0x817: 0x0008,
+       0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0008, 0x81c: 0x0008, 0x81d: 0x0008,
+       0x81e: 0x0008, 0x81f: 0x0008, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x0008, 0x823: 0x0008,
+       0x824: 0x0008, 0x825: 0x0008, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0040,
+       0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,
+       0x830: 0x0008, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0008, 0x834: 0x0040, 0x835: 0x0008,
+       0x836: 0x0008, 0x837: 0x0008, 0x838: 0x0008, 0x839: 0x0008, 0x83a: 0x0040, 0x83b: 0x0040,
+       0x83c: 0x3308, 0x83d: 0x0008, 0x83e: 0x3008, 0x83f: 0x3308,
+       // Block 0x21, offset 0x840
+       0x840: 0x3008, 0x841: 0x3008, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x3008, 0x845: 0x0040,
+       0x846: 0x3308, 0x847: 0x3008, 0x848: 0x3008, 0x849: 0x0040, 0x84a: 0x3008, 0x84b: 0x3008,
+       0x84c: 0x3308, 0x84d: 0x3b08, 0x84e: 0x0040, 0x84f: 0x0040, 0x850: 0x0040, 0x851: 0x0040,
+       0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0040, 0x855: 0x3008, 0x856: 0x3008, 0x857: 0x0040,
+       0x858: 0x0040, 0x859: 0x0040, 0x85a: 0x0040, 0x85b: 0x0040, 0x85c: 0x0040, 0x85d: 0x0040,
+       0x85e: 0x0008, 0x85f: 0x0040, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x3308, 0x863: 0x3308,
+       0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008,
+       0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
+       0x870: 0x0040, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0040, 0x874: 0x0040, 0x875: 0x0040,
+       0x876: 0x0040, 0x877: 0x0040, 0x878: 0x0040, 0x879: 0x0040, 0x87a: 0x0040, 0x87b: 0x0040,
+       0x87c: 0x0040, 0x87d: 0x0040, 0x87e: 0x0040, 0x87f: 0x0040,
+       // Block 0x22, offset 0x880
+       0x880: 0x3008, 0x881: 0x3308, 0x882: 0x3308, 0x883: 0x3308, 0x884: 0x3308, 0x885: 0x0040,
+       0x886: 0x3008, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,
+       0x88c: 0x3008, 0x88d: 0x3b08, 0x88e: 0x0008, 0x88f: 0x0018, 0x890: 0x0040, 0x891: 0x0040,
+       0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x3008,
+       0x898: 0x0018, 0x899: 0x0018, 0x89a: 0x0018, 0x89b: 0x0018, 0x89c: 0x0018, 0x89d: 0x0018,
+       0x89e: 0x0018, 0x89f: 0x0008, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,
+       0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,
+       0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
+       0x8b0: 0x0018, 0x8b1: 0x0018, 0x8b2: 0x0018, 0x8b3: 0x0018, 0x8b4: 0x0018, 0x8b5: 0x0018,
+       0x8b6: 0x0018, 0x8b7: 0x0018, 0x8b8: 0x0018, 0x8b9: 0x0018, 0x8ba: 0x0008, 0x8bb: 0x0008,
+       0x8bc: 0x0008, 0x8bd: 0x0008, 0x8be: 0x0008, 0x8bf: 0x0008,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0040, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x0040, 0x8c4: 0x0008, 0x8c5: 0x0040,
+       0x8c6: 0x0040, 0x8c7: 0x0008, 0x8c8: 0x0008, 0x8c9: 0x0040, 0x8ca: 0x0008, 0x8cb: 0x0040,
+       0x8cc: 0x0040, 0x8cd: 0x0008, 0x8ce: 0x0040, 0x8cf: 0x0040, 0x8d0: 0x0040, 0x8d1: 0x0040,
+       0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0008,
+       0x8d8: 0x0040, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0008, 0x8dd: 0x0008,
+       0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0040, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008,
+       0x8e4: 0x0040, 0x8e5: 0x0008, 0x8e6: 0x0040, 0x8e7: 0x0008, 0x8e8: 0x0040, 0x8e9: 0x0040,
+       0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0040, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
+       0x8f0: 0x0008, 0x8f1: 0x3308, 0x8f2: 0x0008, 0x8f3: 0x0929, 0x8f4: 0x3308, 0x8f5: 0x3308,
+       0x8f6: 0x3308, 0x8f7: 0x3308, 0x8f8: 0x3308, 0x8f9: 0x3308, 0x8fa: 0x0040, 0x8fb: 0x3308,
+       0x8fc: 0x3308, 0x8fd: 0x0008, 0x8fe: 0x0040, 0x8ff: 0x0040,
+       // Block 0x24, offset 0x900
+       0x900: 0x0008, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x09d1, 0x904: 0x0008, 0x905: 0x0008,
+       0x906: 0x0008, 0x907: 0x0008, 0x908: 0x0040, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008,
+       0x90c: 0x0008, 0x90d: 0x0a09, 0x90e: 0x0008, 0x90f: 0x0008, 0x910: 0x0008, 0x911: 0x0008,
+       0x912: 0x0a41, 0x913: 0x0008, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0a79,
+       0x918: 0x0008, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0ab1, 0x91d: 0x0008,
+       0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
+       0x924: 0x0008, 0x925: 0x0008, 0x926: 0x0008, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0ae9,
+       0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0040, 0x92e: 0x0040, 0x92f: 0x0040,
+       0x930: 0x0040, 0x931: 0x3308, 0x932: 0x3308, 0x933: 0x0b21, 0x934: 0x3308, 0x935: 0x0b59,
+       0x936: 0x0b91, 0x937: 0x0bc9, 0x938: 0x0c19, 0x939: 0x0c51, 0x93a: 0x3308, 0x93b: 0x3308,
+       0x93c: 0x3308, 0x93d: 0x3308, 0x93e: 0x3308, 0x93f: 0x3008,
+       // Block 0x25, offset 0x940
+       0x940: 0x3308, 0x941: 0x0ca1, 0x942: 0x3308, 0x943: 0x3308, 0x944: 0x3b08, 0x945: 0x0018,
+       0x946: 0x3308, 0x947: 0x3308, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
+       0x94c: 0x0008, 0x94d: 0x3308, 0x94e: 0x3308, 0x94f: 0x3308, 0x950: 0x3308, 0x951: 0x3308,
+       0x952: 0x3308, 0x953: 0x0cd9, 0x954: 0x3308, 0x955: 0x3308, 0x956: 0x3308, 0x957: 0x3308,
+       0x958: 0x0040, 0x959: 0x3308, 0x95a: 0x3308, 0x95b: 0x3308, 0x95c: 0x3308, 0x95d: 0x0d11,
+       0x95e: 0x3308, 0x95f: 0x3308, 0x960: 0x3308, 0x961: 0x3308, 0x962: 0x0d49, 0x963: 0x3308,
+       0x964: 0x3308, 0x965: 0x3308, 0x966: 0x3308, 0x967: 0x0d81, 0x968: 0x3308, 0x969: 0x3308,
+       0x96a: 0x3308, 0x96b: 0x3308, 0x96c: 0x0db9, 0x96d: 0x3308, 0x96e: 0x3308, 0x96f: 0x3308,
+       0x970: 0x3308, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x3308, 0x974: 0x3308, 0x975: 0x3308,
+       0x976: 0x3308, 0x977: 0x3308, 0x978: 0x3308, 0x979: 0x0df1, 0x97a: 0x3308, 0x97b: 0x3308,
+       0x97c: 0x3308, 0x97d: 0x0040, 0x97e: 0x0018, 0x97f: 0x0018,
+       // Block 0x26, offset 0x980
+       0x980: 0x0008, 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0008, 0x984: 0x0008, 0x985: 0x0008,
+       0x986: 0x0008, 0x987: 0x0008, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
+       0x98c: 0x0008, 0x98d: 0x0008, 0x98e: 0x0008, 0x98f: 0x0008, 0x990: 0x0008, 0x991: 0x0008,
+       0x992: 0x0008, 0x993: 0x0008, 0x994: 0x0008, 0x995: 0x0008, 0x996: 0x0008, 0x997: 0x0008,
+       0x998: 0x0008, 0x999: 0x0008, 0x99a: 0x0008, 0x99b: 0x0008, 0x99c: 0x0008, 0x99d: 0x0008,
+       0x99e: 0x0008, 0x99f: 0x0008, 0x9a0: 0x0008, 0x9a1: 0x0008, 0x9a2: 0x0008, 0x9a3: 0x0008,
+       0x9a4: 0x0008, 0x9a5: 0x0008, 0x9a6: 0x0008, 0x9a7: 0x0008, 0x9a8: 0x0008, 0x9a9: 0x0008,
+       0x9aa: 0x0008, 0x9ab: 0x0008, 0x9ac: 0x0039, 0x9ad: 0x0ed1, 0x9ae: 0x0ee9, 0x9af: 0x0008,
+       0x9b0: 0x0ef9, 0x9b1: 0x0f09, 0x9b2: 0x0f19, 0x9b3: 0x0f31, 0x9b4: 0x0249, 0x9b5: 0x0f41,
+       0x9b6: 0x0259, 0x9b7: 0x0f51, 0x9b8: 0x0359, 0x9b9: 0x0f61, 0x9ba: 0x0f71, 0x9bb: 0x0008,
+       0x9bc: 0x00d9, 0x9bd: 0x0f81, 0x9be: 0x0f99, 0x9bf: 0x0269,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x0fa9, 0x9c1: 0x0fb9, 0x9c2: 0x0279, 0x9c3: 0x0039, 0x9c4: 0x0fc9, 0x9c5: 0x0fe1,
+       0x9c6: 0x059d, 0x9c7: 0x0ee9, 0x9c8: 0x0ef9, 0x9c9: 0x0f09, 0x9ca: 0x0ff9, 0x9cb: 0x1011,
+       0x9cc: 0x1029, 0x9cd: 0x0f31, 0x9ce: 0x0008, 0x9cf: 0x0f51, 0x9d0: 0x0f61, 0x9d1: 0x1041,
+       0x9d2: 0x00d9, 0x9d3: 0x1059, 0x9d4: 0x05b5, 0x9d5: 0x05b5, 0x9d6: 0x0f99, 0x9d7: 0x0fa9,
+       0x9d8: 0x0fb9, 0x9d9: 0x059d, 0x9da: 0x1071, 0x9db: 0x1089, 0x9dc: 0x05cd, 0x9dd: 0x1099,
+       0x9de: 0x10b1, 0x9df: 0x10c9, 0x9e0: 0x10e1, 0x9e1: 0x10f9, 0x9e2: 0x0f41, 0x9e3: 0x0269,
+       0x9e4: 0x0fb9, 0x9e5: 0x1089, 0x9e6: 0x1099, 0x9e7: 0x10b1, 0x9e8: 0x1111, 0x9e9: 0x10e1,
+       0x9ea: 0x10f9, 0x9eb: 0x0008, 0x9ec: 0x0008, 0x9ed: 0x0008, 0x9ee: 0x0008, 0x9ef: 0x0008,
+       0x9f0: 0x0008, 0x9f1: 0x0008, 0x9f2: 0x0008, 0x9f3: 0x0008, 0x9f4: 0x0008, 0x9f5: 0x0008,
+       0x9f6: 0x0008, 0x9f7: 0x0008, 0x9f8: 0x1129, 0x9f9: 0x0008, 0x9fa: 0x0008, 0x9fb: 0x0008,
+       0x9fc: 0x0008, 0x9fd: 0x0008, 0x9fe: 0x0008, 0x9ff: 0x0008,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0008, 0xa01: 0x0008, 0xa02: 0x0008, 0xa03: 0x0008, 0xa04: 0x0008, 0xa05: 0x0008,
+       0xa06: 0x0008, 0xa07: 0x0008, 0xa08: 0x0008, 0xa09: 0x0008, 0xa0a: 0x0008, 0xa0b: 0x0008,
+       0xa0c: 0x0008, 0xa0d: 0x0008, 0xa0e: 0x0008, 0xa0f: 0x0008, 0xa10: 0x0008, 0xa11: 0x0008,
+       0xa12: 0x0008, 0xa13: 0x0008, 0xa14: 0x0008, 0xa15: 0x0008, 0xa16: 0x0008, 0xa17: 0x0008,
+       0xa18: 0x0008, 0xa19: 0x0008, 0xa1a: 0x0008, 0xa1b: 0x1141, 0xa1c: 0x1159, 0xa1d: 0x1169,
+       0xa1e: 0x1181, 0xa1f: 0x1029, 0xa20: 0x1199, 0xa21: 0x11a9, 0xa22: 0x11c1, 0xa23: 0x11d9,
+       0xa24: 0x11f1, 0xa25: 0x1209, 0xa26: 0x1221, 0xa27: 0x05e5, 0xa28: 0x1239, 0xa29: 0x1251,
+       0xa2a: 0xe17d, 0xa2b: 0x1269, 0xa2c: 0x1281, 0xa2d: 0x1299, 0xa2e: 0x12b1, 0xa2f: 0x12c9,
+       0xa30: 0x12e1, 0xa31: 0x12f9, 0xa32: 0x1311, 0xa33: 0x1329, 0xa34: 0x1341, 0xa35: 0x1359,
+       0xa36: 0x1371, 0xa37: 0x1389, 0xa38: 0x05fd, 0xa39: 0x13a1, 0xa3a: 0x13b9, 0xa3b: 0x13d1,
+       0xa3c: 0x13e1, 0xa3d: 0x13f9, 0xa3e: 0x1411, 0xa3f: 0x1429,
+       // Block 0x29, offset 0xa40
+       0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008,
+       0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008,
+       0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008,
+       0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0xe00d, 0xa57: 0x0008,
+       0xa58: 0xe00d, 0xa59: 0x0008, 0xa5a: 0xe00d, 0xa5b: 0x0008, 0xa5c: 0xe00d, 0xa5d: 0x0008,
+       0xa5e: 0xe00d, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008,
+       0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008,
+       0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008,
+       0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008,
+       0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008,
+       0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
+       0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
+       0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,
+       0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008,
+       0xa98: 0x0008, 0xa99: 0x0008, 0xa9a: 0x0615, 0xa9b: 0x0635, 0xa9c: 0x0008, 0xa9d: 0x0008,
+       0xa9e: 0x1441, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,
+       0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,
+       0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,
+       0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,
+       0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,
+       0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x0008, 0xac1: 0x0008, 0xac2: 0x0008, 0xac3: 0x0008, 0xac4: 0x0008, 0xac5: 0x0008,
+       0xac6: 0x0040, 0xac7: 0x0040, 0xac8: 0xe045, 0xac9: 0xe045, 0xaca: 0xe045, 0xacb: 0xe045,
+       0xacc: 0xe045, 0xacd: 0xe045, 0xace: 0x0040, 0xacf: 0x0040, 0xad0: 0x0008, 0xad1: 0x0008,
+       0xad2: 0x0008, 0xad3: 0x0008, 0xad4: 0x0008, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
+       0xad8: 0x0040, 0xad9: 0xe045, 0xada: 0x0040, 0xadb: 0xe045, 0xadc: 0x0040, 0xadd: 0xe045,
+       0xade: 0x0040, 0xadf: 0xe045, 0xae0: 0x0008, 0xae1: 0x0008, 0xae2: 0x0008, 0xae3: 0x0008,
+       0xae4: 0x0008, 0xae5: 0x0008, 0xae6: 0x0008, 0xae7: 0x0008, 0xae8: 0xe045, 0xae9: 0xe045,
+       0xaea: 0xe045, 0xaeb: 0xe045, 0xaec: 0xe045, 0xaed: 0xe045, 0xaee: 0xe045, 0xaef: 0xe045,
+       0xaf0: 0x0008, 0xaf1: 0x1459, 0xaf2: 0x0008, 0xaf3: 0x1471, 0xaf4: 0x0008, 0xaf5: 0x1489,
+       0xaf6: 0x0008, 0xaf7: 0x14a1, 0xaf8: 0x0008, 0xaf9: 0x14b9, 0xafa: 0x0008, 0xafb: 0x14d1,
+       0xafc: 0x0008, 0xafd: 0x14e9, 0xafe: 0x0040, 0xaff: 0x0040,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x1501, 0xb01: 0x1531, 0xb02: 0x1561, 0xb03: 0x1591, 0xb04: 0x15c1, 0xb05: 0x15f1,
+       0xb06: 0x1621, 0xb07: 0x1651, 0xb08: 0x1501, 0xb09: 0x1531, 0xb0a: 0x1561, 0xb0b: 0x1591,
+       0xb0c: 0x15c1, 0xb0d: 0x15f1, 0xb0e: 0x1621, 0xb0f: 0x1651, 0xb10: 0x1681, 0xb11: 0x16b1,
+       0xb12: 0x16e1, 0xb13: 0x1711, 0xb14: 0x1741, 0xb15: 0x1771, 0xb16: 0x17a1, 0xb17: 0x17d1,
+       0xb18: 0x1681, 0xb19: 0x16b1, 0xb1a: 0x16e1, 0xb1b: 0x1711, 0xb1c: 0x1741, 0xb1d: 0x1771,
+       0xb1e: 0x17a1, 0xb1f: 0x17d1, 0xb20: 0x1801, 0xb21: 0x1831, 0xb22: 0x1861, 0xb23: 0x1891,
+       0xb24: 0x18c1, 0xb25: 0x18f1, 0xb26: 0x1921, 0xb27: 0x1951, 0xb28: 0x1801, 0xb29: 0x1831,
+       0xb2a: 0x1861, 0xb2b: 0x1891, 0xb2c: 0x18c1, 0xb2d: 0x18f1, 0xb2e: 0x1921, 0xb2f: 0x1951,
+       0xb30: 0x0008, 0xb31: 0x0008, 0xb32: 0x1981, 0xb33: 0x19b1, 0xb34: 0x19d9, 0xb35: 0x0040,
+       0xb36: 0x0008, 0xb37: 0x1a01, 0xb38: 0xe045, 0xb39: 0xe045, 0xb3a: 0x064d, 0xb3b: 0x1459,
+       0xb3c: 0x19b1, 0xb3d: 0x0666, 0xb3e: 0x1a31, 0xb3f: 0x0686,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x06a6, 0xb41: 0x1a4a, 0xb42: 0x1a79, 0xb43: 0x1aa9, 0xb44: 0x1ad1, 0xb45: 0x0040,
+       0xb46: 0x0008, 0xb47: 0x1af9, 0xb48: 0x06c5, 0xb49: 0x1471, 0xb4a: 0x06dd, 0xb4b: 0x1489,
+       0xb4c: 0x1aa9, 0xb4d: 0x1b2a, 0xb4e: 0x1b5a, 0xb4f: 0x1b8a, 0xb50: 0x0008, 0xb51: 0x0008,
+       0xb52: 0x0008, 0xb53: 0x1bb9, 0xb54: 0x0040, 0xb55: 0x0040, 0xb56: 0x0008, 0xb57: 0x0008,
+       0xb58: 0xe045, 0xb59: 0xe045, 0xb5a: 0x06f5, 0xb5b: 0x14a1, 0xb5c: 0x0040, 0xb5d: 0x1bd2,
+       0xb5e: 0x1c02, 0xb5f: 0x1c32, 0xb60: 0x0008, 0xb61: 0x0008, 0xb62: 0x0008, 0xb63: 0x1c61,
+       0xb64: 0x0008, 0xb65: 0x0008, 0xb66: 0x0008, 0xb67: 0x0008, 0xb68: 0xe045, 0xb69: 0xe045,
+       0xb6a: 0x070d, 0xb6b: 0x14d1, 0xb6c: 0xe04d, 0xb6d: 0x1c7a, 0xb6e: 0x03d2, 0xb6f: 0x1caa,
+       0xb70: 0x0040, 0xb71: 0x0040, 0xb72: 0x1cb9, 0xb73: 0x1ce9, 0xb74: 0x1d11, 0xb75: 0x0040,
+       0xb76: 0x0008, 0xb77: 0x1d39, 0xb78: 0x0725, 0xb79: 0x14b9, 0xb7a: 0x0515, 0xb7b: 0x14e9,
+       0xb7c: 0x1ce9, 0xb7d: 0x073e, 0xb7e: 0x075e, 0xb7f: 0x0040,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x000a, 0xb81: 0x000a, 0xb82: 0x000a, 0xb83: 0x000a, 0xb84: 0x000a, 0xb85: 0x000a,
+       0xb86: 0x000a, 0xb87: 0x000a, 0xb88: 0x000a, 0xb89: 0x000a, 0xb8a: 0x000a, 0xb8b: 0x03c0,
+       0xb8c: 0x0003, 0xb8d: 0x0003, 0xb8e: 0x0340, 0xb8f: 0x0b40, 0xb90: 0x0018, 0xb91: 0xe00d,
+       0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x077e,
+       0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018,
+       0xb9e: 0x0018, 0xb9f: 0x0018, 0xba0: 0x0018, 0xba1: 0x0018, 0xba2: 0x0018, 0xba3: 0x0018,
+       0xba4: 0x0040, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0018, 0xba8: 0x0040, 0xba9: 0x0040,
+       0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x000a,
+       0xbb0: 0x0018, 0xbb1: 0x0018, 0xbb2: 0x0018, 0xbb3: 0x1d69, 0xbb4: 0x1da1, 0xbb5: 0x0018,
+       0xbb6: 0x1df1, 0xbb7: 0x1e29, 0xbb8: 0x0018, 0xbb9: 0x0018, 0xbba: 0x0018, 0xbbb: 0x0018,
+       0xbbc: 0x1e7a, 0xbbd: 0x0018, 0xbbe: 0x079e, 0xbbf: 0x0018,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x0018, 0xbc1: 0x0018, 0xbc2: 0x0018, 0xbc3: 0x0018, 0xbc4: 0x0018, 0xbc5: 0x0018,
+       0xbc6: 0x0018, 0xbc7: 0x1e92, 0xbc8: 0x1eaa, 0xbc9: 0x1ec2, 0xbca: 0x0018, 0xbcb: 0x0018,
+       0xbcc: 0x0018, 0xbcd: 0x0018, 0xbce: 0x0018, 0xbcf: 0x0018, 0xbd0: 0x0018, 0xbd1: 0x0018,
+       0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x1ed9,
+       0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,
+       0xbde: 0x0018, 0xbdf: 0x000a, 0xbe0: 0x03c0, 0xbe1: 0x0340, 0xbe2: 0x0340, 0xbe3: 0x0340,
+       0xbe4: 0x03c0, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0040, 0xbe8: 0x0040, 0xbe9: 0x0040,
+       0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x0340,
+       0xbf0: 0x1f41, 0xbf1: 0x0f41, 0xbf2: 0x0040, 0xbf3: 0x0040, 0xbf4: 0x1f51, 0xbf5: 0x1f61,
+       0xbf6: 0x1f71, 0xbf7: 0x1f81, 0xbf8: 0x1f91, 0xbf9: 0x1fa1, 0xbfa: 0x1fb2, 0xbfb: 0x07bd,
+       0xbfc: 0x1fc2, 0xbfd: 0x1fd2, 0xbfe: 0x1fe2, 0xbff: 0x0f71,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x1f41, 0xc01: 0x00c9, 0xc02: 0x0069, 0xc03: 0x0079, 0xc04: 0x1f51, 0xc05: 0x1f61,
+       0xc06: 0x1f71, 0xc07: 0x1f81, 0xc08: 0x1f91, 0xc09: 0x1fa1, 0xc0a: 0x1fb2, 0xc0b: 0x07d5,
+       0xc0c: 0x1fc2, 0xc0d: 0x1fd2, 0xc0e: 0x1fe2, 0xc0f: 0x0040, 0xc10: 0x0039, 0xc11: 0x0f09,
+       0xc12: 0x00d9, 0xc13: 0x0369, 0xc14: 0x0ff9, 0xc15: 0x0249, 0xc16: 0x0f51, 0xc17: 0x0359,
+       0xc18: 0x0f61, 0xc19: 0x0f71, 0xc1a: 0x0f99, 0xc1b: 0x01d9, 0xc1c: 0x0fa9, 0xc1d: 0x0040,
+       0xc1e: 0x0040, 0xc1f: 0x0040, 0xc20: 0x0018, 0xc21: 0x0018, 0xc22: 0x0018, 0xc23: 0x0018,
+       0xc24: 0x0018, 0xc25: 0x0018, 0xc26: 0x0018, 0xc27: 0x0018, 0xc28: 0x1ff1, 0xc29: 0x0018,
+       0xc2a: 0x0018, 0xc2b: 0x0018, 0xc2c: 0x0018, 0xc2d: 0x0018, 0xc2e: 0x0018, 0xc2f: 0x0018,
+       0xc30: 0x0018, 0xc31: 0x0018, 0xc32: 0x0018, 0xc33: 0x0018, 0xc34: 0x0018, 0xc35: 0x0018,
+       0xc36: 0x0018, 0xc37: 0x0018, 0xc38: 0x0018, 0xc39: 0x0018, 0xc3a: 0x0018, 0xc3b: 0x0018,
+       0xc3c: 0x0018, 0xc3d: 0x0018, 0xc3e: 0x0018, 0xc3f: 0x0040,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x07ee, 0xc41: 0x080e, 0xc42: 0x1159, 0xc43: 0x082d, 0xc44: 0x0018, 0xc45: 0x084e,
+       0xc46: 0x086e, 0xc47: 0x1011, 0xc48: 0x0018, 0xc49: 0x088d, 0xc4a: 0x0f31, 0xc4b: 0x0249,
+       0xc4c: 0x0249, 0xc4d: 0x0249, 0xc4e: 0x0249, 0xc4f: 0x2009, 0xc50: 0x0f41, 0xc51: 0x0f41,
+       0xc52: 0x0359, 0xc53: 0x0359, 0xc54: 0x0018, 0xc55: 0x0f71, 0xc56: 0x2021, 0xc57: 0x0018,
+       0xc58: 0x0018, 0xc59: 0x0f99, 0xc5a: 0x2039, 0xc5b: 0x0269, 0xc5c: 0x0269, 0xc5d: 0x0269,
+       0xc5e: 0x0018, 0xc5f: 0x0018, 0xc60: 0x2049, 0xc61: 0x08ad, 0xc62: 0x2061, 0xc63: 0x0018,
+       0xc64: 0x13d1, 0xc65: 0x0018, 0xc66: 0x2079, 0xc67: 0x0018, 0xc68: 0x13d1, 0xc69: 0x0018,
+       0xc6a: 0x0f51, 0xc6b: 0x2091, 0xc6c: 0x0ee9, 0xc6d: 0x1159, 0xc6e: 0x0018, 0xc6f: 0x0f09,
+       0xc70: 0x0f09, 0xc71: 0x1199, 0xc72: 0x0040, 0xc73: 0x0f61, 0xc74: 0x00d9, 0xc75: 0x20a9,
+       0xc76: 0x20c1, 0xc77: 0x20d9, 0xc78: 0x20f1, 0xc79: 0x0f41, 0xc7a: 0x0018, 0xc7b: 0x08cd,
+       0xc7c: 0x2109, 0xc7d: 0x10b1, 0xc7e: 0x10b1, 0xc7f: 0x2109,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x08ed, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0ef9,
+       0xc86: 0x0ef9, 0xc87: 0x0f09, 0xc88: 0x0f41, 0xc89: 0x0259, 0xc8a: 0x0018, 0xc8b: 0x0018,
+       0xc8c: 0x0018, 0xc8d: 0x0018, 0xc8e: 0x0008, 0xc8f: 0x0018, 0xc90: 0x2121, 0xc91: 0x2151,
+       0xc92: 0x2181, 0xc93: 0x21b9, 0xc94: 0x21e9, 0xc95: 0x2219, 0xc96: 0x2249, 0xc97: 0x2279,
+       0xc98: 0x22a9, 0xc99: 0x22d9, 0xc9a: 0x2309, 0xc9b: 0x2339, 0xc9c: 0x2369, 0xc9d: 0x2399,
+       0xc9e: 0x23c9, 0xc9f: 0x23f9, 0xca0: 0x0f41, 0xca1: 0x2421, 0xca2: 0x0905, 0xca3: 0x2439,
+       0xca4: 0x1089, 0xca5: 0x2451, 0xca6: 0x0925, 0xca7: 0x2469, 0xca8: 0x2491, 0xca9: 0x0369,
+       0xcaa: 0x24a9, 0xcab: 0x0945, 0xcac: 0x0359, 0xcad: 0x1159, 0xcae: 0x0ef9, 0xcaf: 0x0f61,
+       0xcb0: 0x0f41, 0xcb1: 0x2421, 0xcb2: 0x0965, 0xcb3: 0x2439, 0xcb4: 0x1089, 0xcb5: 0x2451,
+       0xcb6: 0x0985, 0xcb7: 0x2469, 0xcb8: 0x2491, 0xcb9: 0x0369, 0xcba: 0x24a9, 0xcbb: 0x09a5,
+       0xcbc: 0x0359, 0xcbd: 0x1159, 0xcbe: 0x0ef9, 0xcbf: 0x0f61,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x0018, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0018,
+       0xcc6: 0x0018, 0xcc7: 0x0018, 0xcc8: 0x0018, 0xcc9: 0x0018, 0xcca: 0x0018, 0xccb: 0x0040,
+       0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040,
+       0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040,
+       0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0040, 0xcdd: 0x0040,
+       0xcde: 0x0040, 0xcdf: 0x0040, 0xce0: 0x00c9, 0xce1: 0x0069, 0xce2: 0x0079, 0xce3: 0x1f51,
+       0xce4: 0x1f61, 0xce5: 0x1f71, 0xce6: 0x1f81, 0xce7: 0x1f91, 0xce8: 0x1fa1, 0xce9: 0x2601,
+       0xcea: 0x2619, 0xceb: 0x2631, 0xcec: 0x2649, 0xced: 0x2661, 0xcee: 0x2679, 0xcef: 0x2691,
+       0xcf0: 0x26a9, 0xcf1: 0x26c1, 0xcf2: 0x26d9, 0xcf3: 0x26f1, 0xcf4: 0x0a06, 0xcf5: 0x0a26,
+       0xcf6: 0x0a46, 0xcf7: 0x0a66, 0xcf8: 0x0a86, 0xcf9: 0x0aa6, 0xcfa: 0x0ac6, 0xcfb: 0x0ae6,
+       0xcfc: 0x0b06, 0xcfd: 0x270a, 0xcfe: 0x2732, 0xcff: 0x275a,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x2782, 0xd01: 0x27aa, 0xd02: 0x27d2, 0xd03: 0x27fa, 0xd04: 0x2822, 0xd05: 0x284a,
+       0xd06: 0x2872, 0xd07: 0x289a, 0xd08: 0x0040, 0xd09: 0x0040, 0xd0a: 0x0040, 0xd0b: 0x0040,
+       0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
+       0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
+       0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0b26, 0xd1d: 0x0b46,
+       0xd1e: 0x0b66, 0xd1f: 0x0b86, 0xd20: 0x0ba6, 0xd21: 0x0bc6, 0xd22: 0x0be6, 0xd23: 0x0c06,
+       0xd24: 0x0c26, 0xd25: 0x0c46, 0xd26: 0x0c66, 0xd27: 0x0c86, 0xd28: 0x0ca6, 0xd29: 0x0cc6,
+       0xd2a: 0x0ce6, 0xd2b: 0x0d06, 0xd2c: 0x0d26, 0xd2d: 0x0d46, 0xd2e: 0x0d66, 0xd2f: 0x0d86,
+       0xd30: 0x0da6, 0xd31: 0x0dc6, 0xd32: 0x0de6, 0xd33: 0x0e06, 0xd34: 0x0e26, 0xd35: 0x0e46,
+       0xd36: 0x0039, 0xd37: 0x0ee9, 0xd38: 0x1159, 0xd39: 0x0ef9, 0xd3a: 0x0f09, 0xd3b: 0x1199,
+       0xd3c: 0x0f31, 0xd3d: 0x0249, 0xd3e: 0x0f41, 0xd3f: 0x0259,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x0f51, 0xd41: 0x0359, 0xd42: 0x0f61, 0xd43: 0x0f71, 0xd44: 0x00d9, 0xd45: 0x0f99,
+       0xd46: 0x2039, 0xd47: 0x0269, 0xd48: 0x01d9, 0xd49: 0x0fa9, 0xd4a: 0x0fb9, 0xd4b: 0x1089,
+       0xd4c: 0x0279, 0xd4d: 0x0369, 0xd4e: 0x0289, 0xd4f: 0x13d1, 0xd50: 0x0039, 0xd51: 0x0ee9,
+       0xd52: 0x1159, 0xd53: 0x0ef9, 0xd54: 0x0f09, 0xd55: 0x1199, 0xd56: 0x0f31, 0xd57: 0x0249,
+       0xd58: 0x0f41, 0xd59: 0x0259, 0xd5a: 0x0f51, 0xd5b: 0x0359, 0xd5c: 0x0f61, 0xd5d: 0x0f71,
+       0xd5e: 0x00d9, 0xd5f: 0x0f99, 0xd60: 0x2039, 0xd61: 0x0269, 0xd62: 0x01d9, 0xd63: 0x0fa9,
+       0xd64: 0x0fb9, 0xd65: 0x1089, 0xd66: 0x0279, 0xd67: 0x0369, 0xd68: 0x0289, 0xd69: 0x13d1,
+       0xd6a: 0x1f41, 0xd6b: 0x0018, 0xd6c: 0x0018, 0xd6d: 0x0018, 0xd6e: 0x0018, 0xd6f: 0x0018,
+       0xd70: 0x0018, 0xd71: 0x0018, 0xd72: 0x0018, 0xd73: 0x0018, 0xd74: 0x0018, 0xd75: 0x0018,
+       0xd76: 0x0018, 0xd77: 0x0018, 0xd78: 0x0018, 0xd79: 0x0018, 0xd7a: 0x0018, 0xd7b: 0x0018,
+       0xd7c: 0x0018, 0xd7d: 0x0018, 0xd7e: 0x0018, 0xd7f: 0x0018,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x0008, 0xd81: 0x0008, 0xd82: 0x0008, 0xd83: 0x0008, 0xd84: 0x0008, 0xd85: 0x0008,
+       0xd86: 0x0008, 0xd87: 0x0008, 0xd88: 0x0008, 0xd89: 0x0008, 0xd8a: 0x0008, 0xd8b: 0x0008,
+       0xd8c: 0x0008, 0xd8d: 0x0008, 0xd8e: 0x0008, 0xd8f: 0x0008, 0xd90: 0x0008, 0xd91: 0x0008,
+       0xd92: 0x0008, 0xd93: 0x0008, 0xd94: 0x0008, 0xd95: 0x0008, 0xd96: 0x0008, 0xd97: 0x0008,
+       0xd98: 0x0008, 0xd99: 0x0008, 0xd9a: 0x0008, 0xd9b: 0x0008, 0xd9c: 0x0008, 0xd9d: 0x0008,
+       0xd9e: 0x0008, 0xd9f: 0x0040, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0x2971, 0xda3: 0x0ebd,
+       0xda4: 0x2989, 0xda5: 0x0008, 0xda6: 0x0008, 0xda7: 0xe07d, 0xda8: 0x0008, 0xda9: 0xe01d,
+       0xdaa: 0x0008, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0x0fe1, 0xdae: 0x1281, 0xdaf: 0x0fc9,
+       0xdb0: 0x1141, 0xdb1: 0x0008, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0008, 0xdb5: 0xe01d,
+       0xdb6: 0x0008, 0xdb7: 0x0008, 0xdb8: 0x0008, 0xdb9: 0x0008, 0xdba: 0x0008, 0xdbb: 0x0008,
+       0xdbc: 0x0259, 0xdbd: 0x1089, 0xdbe: 0x29a1, 0xdbf: 0x29b9,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0xe00d, 0xdc1: 0x0008, 0xdc2: 0xe00d, 0xdc3: 0x0008, 0xdc4: 0xe00d, 0xdc5: 0x0008,
+       0xdc6: 0xe00d, 0xdc7: 0x0008, 0xdc8: 0xe00d, 0xdc9: 0x0008, 0xdca: 0xe00d, 0xdcb: 0x0008,
+       0xdcc: 0xe00d, 0xdcd: 0x0008, 0xdce: 0xe00d, 0xdcf: 0x0008, 0xdd0: 0xe00d, 0xdd1: 0x0008,
+       0xdd2: 0xe00d, 0xdd3: 0x0008, 0xdd4: 0xe00d, 0xdd5: 0x0008, 0xdd6: 0xe00d, 0xdd7: 0x0008,
+       0xdd8: 0xe00d, 0xdd9: 0x0008, 0xdda: 0xe00d, 0xddb: 0x0008, 0xddc: 0xe00d, 0xddd: 0x0008,
+       0xdde: 0xe00d, 0xddf: 0x0008, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0xe00d, 0xde3: 0x0008,
+       0xde4: 0x0008, 0xde5: 0x0018, 0xde6: 0x0018, 0xde7: 0x0018, 0xde8: 0x0018, 0xde9: 0x0018,
+       0xdea: 0x0018, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0xe01d, 0xdee: 0x0008, 0xdef: 0x3308,
+       0xdf0: 0x3308, 0xdf1: 0x3308, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0040, 0xdf5: 0x0040,
+       0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0018, 0xdfa: 0x0018, 0xdfb: 0x0018,
+       0xdfc: 0x0018, 0xdfd: 0x0018, 0xdfe: 0x0018, 0xdff: 0x0018,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x26fd, 0xe01: 0x271d, 0xe02: 0x273d, 0xe03: 0x275d, 0xe04: 0x277d, 0xe05: 0x279d,
+       0xe06: 0x27bd, 0xe07: 0x27dd, 0xe08: 0x27fd, 0xe09: 0x281d, 0xe0a: 0x283d, 0xe0b: 0x285d,
+       0xe0c: 0x287d, 0xe0d: 0x289d, 0xe0e: 0x28bd, 0xe0f: 0x28dd, 0xe10: 0x28fd, 0xe11: 0x291d,
+       0xe12: 0x293d, 0xe13: 0x295d, 0xe14: 0x297d, 0xe15: 0x299d, 0xe16: 0x0040, 0xe17: 0x0040,
+       0xe18: 0x0040, 0xe19: 0x0040, 0xe1a: 0x0040, 0xe1b: 0x0040, 0xe1c: 0x0040, 0xe1d: 0x0040,
+       0xe1e: 0x0040, 0xe1f: 0x0040, 0xe20: 0x0040, 0xe21: 0x0040, 0xe22: 0x0040, 0xe23: 0x0040,
+       0xe24: 0x0040, 0xe25: 0x0040, 0xe26: 0x0040, 0xe27: 0x0040, 0xe28: 0x0040, 0xe29: 0x0040,
+       0xe2a: 0x0040, 0xe2b: 0x0040, 0xe2c: 0x0040, 0xe2d: 0x0040, 0xe2e: 0x0040, 0xe2f: 0x0040,
+       0xe30: 0x0040, 0xe31: 0x0040, 0xe32: 0x0040, 0xe33: 0x0040, 0xe34: 0x0040, 0xe35: 0x0040,
+       0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0040, 0xe3a: 0x0040, 0xe3b: 0x0040,
+       0xe3c: 0x0040, 0xe3d: 0x0040, 0xe3e: 0x0040, 0xe3f: 0x0040,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x000a, 0xe41: 0x0018, 0xe42: 0x29d1, 0xe43: 0x0018, 0xe44: 0x0018, 0xe45: 0x0008,
+       0xe46: 0x0008, 0xe47: 0x0008, 0xe48: 0x0018, 0xe49: 0x0018, 0xe4a: 0x0018, 0xe4b: 0x0018,
+       0xe4c: 0x0018, 0xe4d: 0x0018, 0xe4e: 0x0018, 0xe4f: 0x0018, 0xe50: 0x0018, 0xe51: 0x0018,
+       0xe52: 0x0018, 0xe53: 0x0018, 0xe54: 0x0018, 0xe55: 0x0018, 0xe56: 0x0018, 0xe57: 0x0018,
+       0xe58: 0x0018, 0xe59: 0x0018, 0xe5a: 0x0018, 0xe5b: 0x0018, 0xe5c: 0x0018, 0xe5d: 0x0018,
+       0xe5e: 0x0018, 0xe5f: 0x0018, 0xe60: 0x0018, 0xe61: 0x0018, 0xe62: 0x0018, 0xe63: 0x0018,
+       0xe64: 0x0018, 0xe65: 0x0018, 0xe66: 0x0018, 0xe67: 0x0018, 0xe68: 0x0018, 0xe69: 0x0018,
+       0xe6a: 0x3308, 0xe6b: 0x3308, 0xe6c: 0x3308, 0xe6d: 0x3308, 0xe6e: 0x3018, 0xe6f: 0x3018,
+       0xe70: 0x0018, 0xe71: 0x0018, 0xe72: 0x0018, 0xe73: 0x0018, 0xe74: 0x0018, 0xe75: 0x0018,
+       0xe76: 0xe125, 0xe77: 0x0018, 0xe78: 0x29bd, 0xe79: 0x29dd, 0xe7a: 0x29fd, 0xe7b: 0x0018,
+       0xe7c: 0x0008, 0xe7d: 0x0018, 0xe7e: 0x0018, 0xe7f: 0x0018,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x2b3d, 0xe81: 0x2b5d, 0xe82: 0x2b7d, 0xe83: 0x2b9d, 0xe84: 0x2bbd, 0xe85: 0x2bdd,
+       0xe86: 0x2bdd, 0xe87: 0x2bdd, 0xe88: 0x2bfd, 0xe89: 0x2bfd, 0xe8a: 0x2bfd, 0xe8b: 0x2bfd,
+       0xe8c: 0x2c1d, 0xe8d: 0x2c1d, 0xe8e: 0x2c1d, 0xe8f: 0x2c3d, 0xe90: 0x2c5d, 0xe91: 0x2c5d,
+       0xe92: 0x2a7d, 0xe93: 0x2a7d, 0xe94: 0x2c5d, 0xe95: 0x2c5d, 0xe96: 0x2c7d, 0xe97: 0x2c7d,
+       0xe98: 0x2c5d, 0xe99: 0x2c5d, 0xe9a: 0x2a7d, 0xe9b: 0x2a7d, 0xe9c: 0x2c5d, 0xe9d: 0x2c5d,
+       0xe9e: 0x2c3d, 0xe9f: 0x2c3d, 0xea0: 0x2c9d, 0xea1: 0x2c9d, 0xea2: 0x2cbd, 0xea3: 0x2cbd,
+       0xea4: 0x0040, 0xea5: 0x2cdd, 0xea6: 0x2cfd, 0xea7: 0x2d1d, 0xea8: 0x2d1d, 0xea9: 0x2d3d,
+       0xeaa: 0x2d5d, 0xeab: 0x2d7d, 0xeac: 0x2d9d, 0xead: 0x2dbd, 0xeae: 0x2ddd, 0xeaf: 0x2dfd,
+       0xeb0: 0x2e1d, 0xeb1: 0x2e3d, 0xeb2: 0x2e3d, 0xeb3: 0x2e5d, 0xeb4: 0x2e7d, 0xeb5: 0x2e7d,
+       0xeb6: 0x2e9d, 0xeb7: 0x2ebd, 0xeb8: 0x2e5d, 0xeb9: 0x2edd, 0xeba: 0x2efd, 0xebb: 0x2edd,
+       0xebc: 0x2e5d, 0xebd: 0x2f1d, 0xebe: 0x2f3d, 0xebf: 0x2f5d,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x2f7d, 0xec1: 0x2f9d, 0xec2: 0x2cfd, 0xec3: 0x2cdd, 0xec4: 0x2fbd, 0xec5: 0x2fdd,
+       0xec6: 0x2ffd, 0xec7: 0x301d, 0xec8: 0x303d, 0xec9: 0x305d, 0xeca: 0x307d, 0xecb: 0x309d,
+       0xecc: 0x30bd, 0xecd: 0x30dd, 0xece: 0x30fd, 0xecf: 0x0040, 0xed0: 0x0018, 0xed1: 0x0018,
+       0xed2: 0x311d, 0xed3: 0x313d, 0xed4: 0x315d, 0xed5: 0x317d, 0xed6: 0x319d, 0xed7: 0x31bd,
+       0xed8: 0x31dd, 0xed9: 0x31fd, 0xeda: 0x321d, 0xedb: 0x323d, 0xedc: 0x315d, 0xedd: 0x325d,
+       0xede: 0x327d, 0xedf: 0x329d, 0xee0: 0x0008, 0xee1: 0x0008, 0xee2: 0x0008, 0xee3: 0x0008,
+       0xee4: 0x0008, 0xee5: 0x0008, 0xee6: 0x0008, 0xee7: 0x0008, 0xee8: 0x0008, 0xee9: 0x0008,
+       0xeea: 0x0008, 0xeeb: 0x0008, 0xeec: 0x0008, 0xeed: 0x0008, 0xeee: 0x0008, 0xeef: 0x0008,
+       0xef0: 0x0008, 0xef1: 0x0008, 0xef2: 0x0008, 0xef3: 0x0008, 0xef4: 0x0008, 0xef5: 0x0008,
+       0xef6: 0x0008, 0xef7: 0x0008, 0xef8: 0x0008, 0xef9: 0x0008, 0xefa: 0x0008, 0xefb: 0x0040,
+       0xefc: 0x0040, 0xefd: 0x0040, 0xefe: 0x0040, 0xeff: 0x0040,
+       // Block 0x3c, offset 0xf00
+       0xf00: 0x36a2, 0xf01: 0x36d2, 0xf02: 0x3702, 0xf03: 0x3732, 0xf04: 0x32bd, 0xf05: 0x32dd,
+       0xf06: 0x32fd, 0xf07: 0x331d, 0xf08: 0x0018, 0xf09: 0x0018, 0xf0a: 0x0018, 0xf0b: 0x0018,
+       0xf0c: 0x0018, 0xf0d: 0x0018, 0xf0e: 0x0018, 0xf0f: 0x0018, 0xf10: 0x333d, 0xf11: 0x3761,
+       0xf12: 0x3779, 0xf13: 0x3791, 0xf14: 0x37a9, 0xf15: 0x37c1, 0xf16: 0x37d9, 0xf17: 0x37f1,
+       0xf18: 0x3809, 0xf19: 0x3821, 0xf1a: 0x3839, 0xf1b: 0x3851, 0xf1c: 0x3869, 0xf1d: 0x3881,
+       0xf1e: 0x3899, 0xf1f: 0x38b1, 0xf20: 0x335d, 0xf21: 0x337d, 0xf22: 0x339d, 0xf23: 0x33bd,
+       0xf24: 0x33dd, 0xf25: 0x33dd, 0xf26: 0x33fd, 0xf27: 0x341d, 0xf28: 0x343d, 0xf29: 0x345d,
+       0xf2a: 0x347d, 0xf2b: 0x349d, 0xf2c: 0x34bd, 0xf2d: 0x34dd, 0xf2e: 0x34fd, 0xf2f: 0x351d,
+       0xf30: 0x353d, 0xf31: 0x355d, 0xf32: 0x357d, 0xf33: 0x359d, 0xf34: 0x35bd, 0xf35: 0x35dd,
+       0xf36: 0x35fd, 0xf37: 0x361d, 0xf38: 0x363d, 0xf39: 0x365d, 0xf3a: 0x367d, 0xf3b: 0x369d,
+       0xf3c: 0x38c9, 0xf3d: 0x3901, 0xf3e: 0x36bd, 0xf3f: 0x0018,
+       // Block 0x3d, offset 0xf40
+       0xf40: 0x36dd, 0xf41: 0x36fd, 0xf42: 0x371d, 0xf43: 0x373d, 0xf44: 0x375d, 0xf45: 0x377d,
+       0xf46: 0x379d, 0xf47: 0x37bd, 0xf48: 0x37dd, 0xf49: 0x37fd, 0xf4a: 0x381d, 0xf4b: 0x383d,
+       0xf4c: 0x385d, 0xf4d: 0x387d, 0xf4e: 0x389d, 0xf4f: 0x38bd, 0xf50: 0x38dd, 0xf51: 0x38fd,
+       0xf52: 0x391d, 0xf53: 0x393d, 0xf54: 0x395d, 0xf55: 0x397d, 0xf56: 0x399d, 0xf57: 0x39bd,
+       0xf58: 0x39dd, 0xf59: 0x39fd, 0xf5a: 0x3a1d, 0xf5b: 0x3a3d, 0xf5c: 0x3a5d, 0xf5d: 0x3a7d,
+       0xf5e: 0x3a9d, 0xf5f: 0x3abd, 0xf60: 0x3add, 0xf61: 0x3afd, 0xf62: 0x3b1d, 0xf63: 0x3b3d,
+       0xf64: 0x3b5d, 0xf65: 0x3b7d, 0xf66: 0x127d, 0xf67: 0x3b9d, 0xf68: 0x3bbd, 0xf69: 0x3bdd,
+       0xf6a: 0x3bfd, 0xf6b: 0x3c1d, 0xf6c: 0x3c3d, 0xf6d: 0x3c5d, 0xf6e: 0x239d, 0xf6f: 0x3c7d,
+       0xf70: 0x3c9d, 0xf71: 0x3939, 0xf72: 0x3951, 0xf73: 0x3969, 0xf74: 0x3981, 0xf75: 0x3999,
+       0xf76: 0x39b1, 0xf77: 0x39c9, 0xf78: 0x39e1, 0xf79: 0x39f9, 0xf7a: 0x3a11, 0xf7b: 0x3a29,
+       0xf7c: 0x3a41, 0xf7d: 0x3a59, 0xf7e: 0x3a71, 0xf7f: 0x3a89,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x3aa1, 0xf81: 0x3ac9, 0xf82: 0x3af1, 0xf83: 0x3b19, 0xf84: 0x3b41, 0xf85: 0x3b69,
+       0xf86: 0x3b91, 0xf87: 0x3bb9, 0xf88: 0x3be1, 0xf89: 0x3c09, 0xf8a: 0x3c39, 0xf8b: 0x3c69,
+       0xf8c: 0x3c99, 0xf8d: 0x3cbd, 0xf8e: 0x3cb1, 0xf8f: 0x3cdd, 0xf90: 0x3cfd, 0xf91: 0x3d15,
+       0xf92: 0x3d2d, 0xf93: 0x3d45, 0xf94: 0x3d5d, 0xf95: 0x3d5d, 0xf96: 0x3d45, 0xf97: 0x3d75,
+       0xf98: 0x07bd, 0xf99: 0x3d8d, 0xf9a: 0x3da5, 0xf9b: 0x3dbd, 0xf9c: 0x3dd5, 0xf9d: 0x3ded,
+       0xf9e: 0x3e05, 0xf9f: 0x3e1d, 0xfa0: 0x3e35, 0xfa1: 0x3e4d, 0xfa2: 0x3e65, 0xfa3: 0x3e7d,
+       0xfa4: 0x3e95, 0xfa5: 0x3e95, 0xfa6: 0x3ead, 0xfa7: 0x3ead, 0xfa8: 0x3ec5, 0xfa9: 0x3ec5,
+       0xfaa: 0x3edd, 0xfab: 0x3ef5, 0xfac: 0x3f0d, 0xfad: 0x3f25, 0xfae: 0x3f3d, 0xfaf: 0x3f3d,
+       0xfb0: 0x3f55, 0xfb1: 0x3f55, 0xfb2: 0x3f55, 0xfb3: 0x3f6d, 0xfb4: 0x3f85, 0xfb5: 0x3f9d,
+       0xfb6: 0x3fb5, 0xfb7: 0x3f9d, 0xfb8: 0x3fcd, 0xfb9: 0x3fe5, 0xfba: 0x3f6d, 0xfbb: 0x3ffd,
+       0xfbc: 0x4015, 0xfbd: 0x4015, 0xfbe: 0x4015, 0xfbf: 0x0040,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x3cc9, 0xfc1: 0x3d31, 0xfc2: 0x3d99, 0xfc3: 0x3e01, 0xfc4: 0x3e51, 0xfc5: 0x3eb9,
+       0xfc6: 0x3f09, 0xfc7: 0x3f59, 0xfc8: 0x3fd9, 0xfc9: 0x4041, 0xfca: 0x4091, 0xfcb: 0x40e1,
+       0xfcc: 0x4131, 0xfcd: 0x4199, 0xfce: 0x4201, 0xfcf: 0x4251, 0xfd0: 0x42a1, 0xfd1: 0x42d9,
+       0xfd2: 0x4329, 0xfd3: 0x4391, 0xfd4: 0x43f9, 0xfd5: 0x4431, 0xfd6: 0x44b1, 0xfd7: 0x4549,
+       0xfd8: 0x45c9, 0xfd9: 0x4619, 0xfda: 0x4699, 0xfdb: 0x4719, 0xfdc: 0x4781, 0xfdd: 0x47d1,
+       0xfde: 0x4821, 0xfdf: 0x4871, 0xfe0: 0x48d9, 0xfe1: 0x4959, 0xfe2: 0x49c1, 0xfe3: 0x4a11,
+       0xfe4: 0x4a61, 0xfe5: 0x4ab1, 0xfe6: 0x4ae9, 0xfe7: 0x4b21, 0xfe8: 0x4b59, 0xfe9: 0x4b91,
+       0xfea: 0x4be1, 0xfeb: 0x4c31, 0xfec: 0x4cb1, 0xfed: 0x4d01, 0xfee: 0x4d69, 0xfef: 0x4de9,
+       0xff0: 0x4e39, 0xff1: 0x4e71, 0xff2: 0x4ea9, 0xff3: 0x4f29, 0xff4: 0x4f91, 0xff5: 0x5011,
+       0xff6: 0x5061, 0xff7: 0x50e1, 0xff8: 0x5119, 0xff9: 0x5169, 0xffa: 0x51b9, 0xffb: 0x5209,
+       0xffc: 0x5259, 0xffd: 0x52a9, 0xffe: 0x5311, 0xfff: 0x5361,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x5399, 0x1001: 0x53e9, 0x1002: 0x5439, 0x1003: 0x5489, 0x1004: 0x54f1, 0x1005: 0x5541,
+       0x1006: 0x5591, 0x1007: 0x55e1, 0x1008: 0x5661, 0x1009: 0x56c9, 0x100a: 0x5701, 0x100b: 0x5781,
+       0x100c: 0x57b9, 0x100d: 0x5821, 0x100e: 0x5889, 0x100f: 0x58d9, 0x1010: 0x5929, 0x1011: 0x5979,
+       0x1012: 0x59e1, 0x1013: 0x5a19, 0x1014: 0x5a69, 0x1015: 0x5ad1, 0x1016: 0x5b09, 0x1017: 0x5b89,
+       0x1018: 0x5bd9, 0x1019: 0x5c01, 0x101a: 0x5c29, 0x101b: 0x5c51, 0x101c: 0x5c79, 0x101d: 0x5ca1,
+       0x101e: 0x5cc9, 0x101f: 0x5cf1, 0x1020: 0x5d19, 0x1021: 0x5d41, 0x1022: 0x5d69, 0x1023: 0x5d99,
+       0x1024: 0x5dc9, 0x1025: 0x5df9, 0x1026: 0x5e29, 0x1027: 0x5e59, 0x1028: 0x5e89, 0x1029: 0x5eb9,
+       0x102a: 0x5ee9, 0x102b: 0x5f19, 0x102c: 0x5f49, 0x102d: 0x5f79, 0x102e: 0x5fa9, 0x102f: 0x5fd9,
+       0x1030: 0x6009, 0x1031: 0x402d, 0x1032: 0x6039, 0x1033: 0x6051, 0x1034: 0x404d, 0x1035: 0x6069,
+       0x1036: 0x6081, 0x1037: 0x6099, 0x1038: 0x406d, 0x1039: 0x406d, 0x103a: 0x60b1, 0x103b: 0x60c9,
+       0x103c: 0x6101, 0x103d: 0x6139, 0x103e: 0x6171, 0x103f: 0x61a9,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x6211, 0x1041: 0x6229, 0x1042: 0x408d, 0x1043: 0x6241, 0x1044: 0x6259, 0x1045: 0x6271,
+       0x1046: 0x6289, 0x1047: 0x62a1, 0x1048: 0x40ad, 0x1049: 0x62b9, 0x104a: 0x62e1, 0x104b: 0x62f9,
+       0x104c: 0x40cd, 0x104d: 0x40cd, 0x104e: 0x6311, 0x104f: 0x6329, 0x1050: 0x6341, 0x1051: 0x40ed,
+       0x1052: 0x410d, 0x1053: 0x412d, 0x1054: 0x414d, 0x1055: 0x416d, 0x1056: 0x6359, 0x1057: 0x6371,
+       0x1058: 0x6389, 0x1059: 0x63a1, 0x105a: 0x63b9, 0x105b: 0x418d, 0x105c: 0x63d1, 0x105d: 0x63e9,
+       0x105e: 0x6401, 0x105f: 0x41ad, 0x1060: 0x41cd, 0x1061: 0x6419, 0x1062: 0x41ed, 0x1063: 0x420d,
+       0x1064: 0x422d, 0x1065: 0x6431, 0x1066: 0x424d, 0x1067: 0x6449, 0x1068: 0x6479, 0x1069: 0x6211,
+       0x106a: 0x426d, 0x106b: 0x428d, 0x106c: 0x42ad, 0x106d: 0x42cd, 0x106e: 0x64b1, 0x106f: 0x64f1,
+       0x1070: 0x6539, 0x1071: 0x6551, 0x1072: 0x42ed, 0x1073: 0x6569, 0x1074: 0x6581, 0x1075: 0x6599,
+       0x1076: 0x430d, 0x1077: 0x65b1, 0x1078: 0x65c9, 0x1079: 0x65b1, 0x107a: 0x65e1, 0x107b: 0x65f9,
+       0x107c: 0x432d, 0x107d: 0x6611, 0x107e: 0x6629, 0x107f: 0x6611,
+       // Block 0x42, offset 0x1080
+       0x1080: 0x434d, 0x1081: 0x436d, 0x1082: 0x0040, 0x1083: 0x6641, 0x1084: 0x6659, 0x1085: 0x6671,
+       0x1086: 0x6689, 0x1087: 0x0040, 0x1088: 0x66c1, 0x1089: 0x66d9, 0x108a: 0x66f1, 0x108b: 0x6709,
+       0x108c: 0x6721, 0x108d: 0x6739, 0x108e: 0x6401, 0x108f: 0x6751, 0x1090: 0x6769, 0x1091: 0x6781,
+       0x1092: 0x438d, 0x1093: 0x6799, 0x1094: 0x6289, 0x1095: 0x43ad, 0x1096: 0x43cd, 0x1097: 0x67b1,
+       0x1098: 0x0040, 0x1099: 0x43ed, 0x109a: 0x67c9, 0x109b: 0x67e1, 0x109c: 0x67f9, 0x109d: 0x6811,
+       0x109e: 0x6829, 0x109f: 0x6859, 0x10a0: 0x6889, 0x10a1: 0x68b1, 0x10a2: 0x68d9, 0x10a3: 0x6901,
+       0x10a4: 0x6929, 0x10a5: 0x6951, 0x10a6: 0x6979, 0x10a7: 0x69a1, 0x10a8: 0x69c9, 0x10a9: 0x69f1,
+       0x10aa: 0x6a21, 0x10ab: 0x6a51, 0x10ac: 0x6a81, 0x10ad: 0x6ab1, 0x10ae: 0x6ae1, 0x10af: 0x6b11,
+       0x10b0: 0x6b41, 0x10b1: 0x6b71, 0x10b2: 0x6ba1, 0x10b3: 0x6bd1, 0x10b4: 0x6c01, 0x10b5: 0x6c31,
+       0x10b6: 0x6c61, 0x10b7: 0x6c91, 0x10b8: 0x6cc1, 0x10b9: 0x6cf1, 0x10ba: 0x6d21, 0x10bb: 0x6d51,
+       0x10bc: 0x6d81, 0x10bd: 0x6db1, 0x10be: 0x6de1, 0x10bf: 0x440d,
+       // Block 0x43, offset 0x10c0
+       0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008,
+       0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008,
+       0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008,
+       0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008,
+       0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0xe00d, 0x10dd: 0x0008,
+       0x10de: 0xe00d, 0x10df: 0x0008, 0x10e0: 0xe00d, 0x10e1: 0x0008, 0x10e2: 0xe00d, 0x10e3: 0x0008,
+       0x10e4: 0xe00d, 0x10e5: 0x0008, 0x10e6: 0xe00d, 0x10e7: 0x0008, 0x10e8: 0xe00d, 0x10e9: 0x0008,
+       0x10ea: 0xe00d, 0x10eb: 0x0008, 0x10ec: 0xe00d, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x3308,
+       0x10f0: 0x3318, 0x10f1: 0x3318, 0x10f2: 0x3318, 0x10f3: 0x0018, 0x10f4: 0x3308, 0x10f5: 0x3308,
+       0x10f6: 0x3308, 0x10f7: 0x3308, 0x10f8: 0x3308, 0x10f9: 0x3308, 0x10fa: 0x3308, 0x10fb: 0x3308,
+       0x10fc: 0x3308, 0x10fd: 0x3308, 0x10fe: 0x0018, 0x10ff: 0x0008,
+       // Block 0x44, offset 0x1100
+       0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
+       0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
+       0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
+       0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
+       0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0x0ea1, 0x111d: 0x6e11,
+       0x111e: 0x3308, 0x111f: 0x3308, 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, 0x1123: 0x0008,
+       0x1124: 0x0008, 0x1125: 0x0008, 0x1126: 0x0008, 0x1127: 0x0008, 0x1128: 0x0008, 0x1129: 0x0008,
+       0x112a: 0x0008, 0x112b: 0x0008, 0x112c: 0x0008, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x0008,
+       0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0x0008, 0x1133: 0x0008, 0x1134: 0x0008, 0x1135: 0x0008,
+       0x1136: 0x0008, 0x1137: 0x0008, 0x1138: 0x0008, 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008,
+       0x113c: 0x0008, 0x113d: 0x0008, 0x113e: 0x0008, 0x113f: 0x0008,
+       // Block 0x45, offset 0x1140
+       0x1140: 0x0018, 0x1141: 0x0018, 0x1142: 0x0018, 0x1143: 0x0018, 0x1144: 0x0018, 0x1145: 0x0018,
+       0x1146: 0x0018, 0x1147: 0x0018, 0x1148: 0x0018, 0x1149: 0x0018, 0x114a: 0x0018, 0x114b: 0x0018,
+       0x114c: 0x0018, 0x114d: 0x0018, 0x114e: 0x0018, 0x114f: 0x0018, 0x1150: 0x0018, 0x1151: 0x0018,
+       0x1152: 0x0018, 0x1153: 0x0018, 0x1154: 0x0018, 0x1155: 0x0018, 0x1156: 0x0018, 0x1157: 0x0008,
+       0x1158: 0x0008, 0x1159: 0x0008, 0x115a: 0x0008, 0x115b: 0x0008, 0x115c: 0x0008, 0x115d: 0x0008,
+       0x115e: 0x0008, 0x115f: 0x0008, 0x1160: 0x0018, 0x1161: 0x0018, 0x1162: 0xe00d, 0x1163: 0x0008,
+       0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008,
+       0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008,
+       0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0xe00d, 0x1173: 0x0008, 0x1174: 0xe00d, 0x1175: 0x0008,
+       0x1176: 0xe00d, 0x1177: 0x0008, 0x1178: 0xe00d, 0x1179: 0x0008, 0x117a: 0xe00d, 0x117b: 0x0008,
+       0x117c: 0xe00d, 0x117d: 0x0008, 0x117e: 0xe00d, 0x117f: 0x0008,
+       // Block 0x46, offset 0x1180
+       0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008,
+       0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0xe00d, 0x1189: 0x0008, 0x118a: 0xe00d, 0x118b: 0x0008,
+       0x118c: 0xe00d, 0x118d: 0x0008, 0x118e: 0xe00d, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008,
+       0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0xe00d, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008,
+       0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008,
+       0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+       0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
+       0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
+       0x11b0: 0xe0fd, 0x11b1: 0x0008, 0x11b2: 0x0008, 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008,
+       0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0xe01d, 0x11ba: 0x0008, 0x11bb: 0xe03d,
+       0x11bc: 0x0008, 0x11bd: 0x442d, 0x11be: 0xe00d, 0x11bf: 0x0008,
+       // Block 0x47, offset 0x11c0
+       0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
+       0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0x0008, 0x11c9: 0x0018, 0x11ca: 0x0018, 0x11cb: 0xe03d,
+       0x11cc: 0x0008, 0x11cd: 0x11d9, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
+       0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
+       0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
+       0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
+       0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
+       0x11ea: 0x6e29, 0x11eb: 0x1029, 0x11ec: 0x11c1, 0x11ed: 0x6e41, 0x11ee: 0x1221, 0x11ef: 0x0040,
+       0x11f0: 0x6e59, 0x11f1: 0x6e71, 0x11f2: 0x1239, 0x11f3: 0x444d, 0x11f4: 0xe00d, 0x11f5: 0x0008,
+       0x11f6: 0xe00d, 0x11f7: 0x0008, 0x11f8: 0x0040, 0x11f9: 0x0040, 0x11fa: 0x0040, 0x11fb: 0x0040,
+       0x11fc: 0x0040, 0x11fd: 0x0040, 0x11fe: 0x0040, 0x11ff: 0x0040,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x64d5, 0x1201: 0x64f5, 0x1202: 0x6515, 0x1203: 0x6535, 0x1204: 0x6555, 0x1205: 0x6575,
+       0x1206: 0x6595, 0x1207: 0x65b5, 0x1208: 0x65d5, 0x1209: 0x65f5, 0x120a: 0x6615, 0x120b: 0x6635,
+       0x120c: 0x6655, 0x120d: 0x6675, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0x6695, 0x1211: 0x0008,
+       0x1212: 0x66b5, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x66d5, 0x1216: 0x66f5, 0x1217: 0x6715,
+       0x1218: 0x6735, 0x1219: 0x6755, 0x121a: 0x6775, 0x121b: 0x6795, 0x121c: 0x67b5, 0x121d: 0x67d5,
+       0x121e: 0x67f5, 0x121f: 0x0008, 0x1220: 0x6815, 0x1221: 0x0008, 0x1222: 0x6835, 0x1223: 0x0008,
+       0x1224: 0x0008, 0x1225: 0x6855, 0x1226: 0x6875, 0x1227: 0x0008, 0x1228: 0x0008, 0x1229: 0x0008,
+       0x122a: 0x6895, 0x122b: 0x68b5, 0x122c: 0x68d5, 0x122d: 0x68f5, 0x122e: 0x6915, 0x122f: 0x6935,
+       0x1230: 0x6955, 0x1231: 0x6975, 0x1232: 0x6995, 0x1233: 0x69b5, 0x1234: 0x69d5, 0x1235: 0x69f5,
+       0x1236: 0x6a15, 0x1237: 0x6a35, 0x1238: 0x6a55, 0x1239: 0x6a75, 0x123a: 0x6a95, 0x123b: 0x6ab5,
+       0x123c: 0x6ad5, 0x123d: 0x6af5, 0x123e: 0x6b15, 0x123f: 0x6b35,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x7a95, 0x1241: 0x7ab5, 0x1242: 0x7ad5, 0x1243: 0x7af5, 0x1244: 0x7b15, 0x1245: 0x7b35,
+       0x1246: 0x7b55, 0x1247: 0x7b75, 0x1248: 0x7b95, 0x1249: 0x7bb5, 0x124a: 0x7bd5, 0x124b: 0x7bf5,
+       0x124c: 0x7c15, 0x124d: 0x7c35, 0x124e: 0x7c55, 0x124f: 0x6ec9, 0x1250: 0x6ef1, 0x1251: 0x6f19,
+       0x1252: 0x7c75, 0x1253: 0x7c95, 0x1254: 0x7cb5, 0x1255: 0x6f41, 0x1256: 0x6f69, 0x1257: 0x6f91,
+       0x1258: 0x7cd5, 0x1259: 0x7cf5, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x0040,
+       0x125e: 0x0040, 0x125f: 0x0040, 0x1260: 0x0040, 0x1261: 0x0040, 0x1262: 0x0040, 0x1263: 0x0040,
+       0x1264: 0x0040, 0x1265: 0x0040, 0x1266: 0x0040, 0x1267: 0x0040, 0x1268: 0x0040, 0x1269: 0x0040,
+       0x126a: 0x0040, 0x126b: 0x0040, 0x126c: 0x0040, 0x126d: 0x0040, 0x126e: 0x0040, 0x126f: 0x0040,
+       0x1270: 0x0040, 0x1271: 0x0040, 0x1272: 0x0040, 0x1273: 0x0040, 0x1274: 0x0040, 0x1275: 0x0040,
+       0x1276: 0x0040, 0x1277: 0x0040, 0x1278: 0x0040, 0x1279: 0x0040, 0x127a: 0x0040, 0x127b: 0x0040,
+       0x127c: 0x0040, 0x127d: 0x0040, 0x127e: 0x0040, 0x127f: 0x0040,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x6fb9, 0x1281: 0x6fd1, 0x1282: 0x6fe9, 0x1283: 0x7d15, 0x1284: 0x7d35, 0x1285: 0x7001,
+       0x1286: 0x7001, 0x1287: 0x0040, 0x1288: 0x0040, 0x1289: 0x0040, 0x128a: 0x0040, 0x128b: 0x0040,
+       0x128c: 0x0040, 0x128d: 0x0040, 0x128e: 0x0040, 0x128f: 0x0040, 0x1290: 0x0040, 0x1291: 0x0040,
+       0x1292: 0x0040, 0x1293: 0x7019, 0x1294: 0x7041, 0x1295: 0x7069, 0x1296: 0x7091, 0x1297: 0x70b9,
+       0x1298: 0x0040, 0x1299: 0x0040, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x70e1,
+       0x129e: 0x3308, 0x129f: 0x7109, 0x12a0: 0x7131, 0x12a1: 0x20a9, 0x12a2: 0x20f1, 0x12a3: 0x7149,
+       0x12a4: 0x7161, 0x12a5: 0x7179, 0x12a6: 0x7191, 0x12a7: 0x71a9, 0x12a8: 0x71c1, 0x12a9: 0x1fb2,
+       0x12aa: 0x71d9, 0x12ab: 0x7201, 0x12ac: 0x7229, 0x12ad: 0x7261, 0x12ae: 0x7299, 0x12af: 0x72c1,
+       0x12b0: 0x72e9, 0x12b1: 0x7311, 0x12b2: 0x7339, 0x12b3: 0x7361, 0x12b4: 0x7389, 0x12b5: 0x73b1,
+       0x12b6: 0x73d9, 0x12b7: 0x0040, 0x12b8: 0x7401, 0x12b9: 0x7429, 0x12ba: 0x7451, 0x12bb: 0x7479,
+       0x12bc: 0x74a1, 0x12bd: 0x0040, 0x12be: 0x74c9, 0x12bf: 0x0040,
+       // Block 0x4b, offset 0x12c0
+       0x12c0: 0x74f1, 0x12c1: 0x7519, 0x12c2: 0x0040, 0x12c3: 0x7541, 0x12c4: 0x7569, 0x12c5: 0x0040,
+       0x12c6: 0x7591, 0x12c7: 0x75b9, 0x12c8: 0x75e1, 0x12c9: 0x7609, 0x12ca: 0x7631, 0x12cb: 0x7659,
+       0x12cc: 0x7681, 0x12cd: 0x76a9, 0x12ce: 0x76d1, 0x12cf: 0x76f9, 0x12d0: 0x7721, 0x12d1: 0x7721,
+       0x12d2: 0x7739, 0x12d3: 0x7739, 0x12d4: 0x7739, 0x12d5: 0x7739, 0x12d6: 0x7751, 0x12d7: 0x7751,
+       0x12d8: 0x7751, 0x12d9: 0x7751, 0x12da: 0x7769, 0x12db: 0x7769, 0x12dc: 0x7769, 0x12dd: 0x7769,
+       0x12de: 0x7781, 0x12df: 0x7781, 0x12e0: 0x7781, 0x12e1: 0x7781, 0x12e2: 0x7799, 0x12e3: 0x7799,
+       0x12e4: 0x7799, 0x12e5: 0x7799, 0x12e6: 0x77b1, 0x12e7: 0x77b1, 0x12e8: 0x77b1, 0x12e9: 0x77b1,
+       0x12ea: 0x77c9, 0x12eb: 0x77c9, 0x12ec: 0x77c9, 0x12ed: 0x77c9, 0x12ee: 0x77e1, 0x12ef: 0x77e1,
+       0x12f0: 0x77e1, 0x12f1: 0x77e1, 0x12f2: 0x77f9, 0x12f3: 0x77f9, 0x12f4: 0x77f9, 0x12f5: 0x77f9,
+       0x12f6: 0x7811, 0x12f7: 0x7811, 0x12f8: 0x7811, 0x12f9: 0x7811, 0x12fa: 0x7829, 0x12fb: 0x7829,
+       0x12fc: 0x7829, 0x12fd: 0x7829, 0x12fe: 0x7841, 0x12ff: 0x7841,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x7841, 0x1301: 0x7841, 0x1302: 0x7859, 0x1303: 0x7859, 0x1304: 0x7871, 0x1305: 0x7871,
+       0x1306: 0x7889, 0x1307: 0x7889, 0x1308: 0x78a1, 0x1309: 0x78a1, 0x130a: 0x78b9, 0x130b: 0x78b9,
+       0x130c: 0x78d1, 0x130d: 0x78d1, 0x130e: 0x78e9, 0x130f: 0x78e9, 0x1310: 0x78e9, 0x1311: 0x78e9,
+       0x1312: 0x7901, 0x1313: 0x7901, 0x1314: 0x7901, 0x1315: 0x7901, 0x1316: 0x7919, 0x1317: 0x7919,
+       0x1318: 0x7919, 0x1319: 0x7919, 0x131a: 0x7931, 0x131b: 0x7931, 0x131c: 0x7931, 0x131d: 0x7931,
+       0x131e: 0x7949, 0x131f: 0x7949, 0x1320: 0x7961, 0x1321: 0x7961, 0x1322: 0x7961, 0x1323: 0x7961,
+       0x1324: 0x7979, 0x1325: 0x7979, 0x1326: 0x7991, 0x1327: 0x7991, 0x1328: 0x7991, 0x1329: 0x7991,
+       0x132a: 0x79a9, 0x132b: 0x79a9, 0x132c: 0x79a9, 0x132d: 0x79a9, 0x132e: 0x79c1, 0x132f: 0x79c1,
+       0x1330: 0x79d9, 0x1331: 0x79d9, 0x1332: 0x0818, 0x1333: 0x0818, 0x1334: 0x0818, 0x1335: 0x0818,
+       0x1336: 0x0818, 0x1337: 0x0818, 0x1338: 0x0818, 0x1339: 0x0818, 0x133a: 0x0818, 0x133b: 0x0818,
+       0x133c: 0x0818, 0x133d: 0x0818, 0x133e: 0x0818, 0x133f: 0x0818,
+       // Block 0x4d, offset 0x1340
+       0x1340: 0x0818, 0x1341: 0x0818, 0x1342: 0x0040, 0x1343: 0x0040, 0x1344: 0x0040, 0x1345: 0x0040,
+       0x1346: 0x0040, 0x1347: 0x0040, 0x1348: 0x0040, 0x1349: 0x0040, 0x134a: 0x0040, 0x134b: 0x0040,
+       0x134c: 0x0040, 0x134d: 0x0040, 0x134e: 0x0040, 0x134f: 0x0040, 0x1350: 0x0040, 0x1351: 0x0040,
+       0x1352: 0x0040, 0x1353: 0x79f1, 0x1354: 0x79f1, 0x1355: 0x79f1, 0x1356: 0x79f1, 0x1357: 0x7a09,
+       0x1358: 0x7a09, 0x1359: 0x7a21, 0x135a: 0x7a21, 0x135b: 0x7a39, 0x135c: 0x7a39, 0x135d: 0x0479,
+       0x135e: 0x7a51, 0x135f: 0x7a51, 0x1360: 0x7a69, 0x1361: 0x7a69, 0x1362: 0x7a81, 0x1363: 0x7a81,
+       0x1364: 0x7a99, 0x1365: 0x7a99, 0x1366: 0x7a99, 0x1367: 0x7a99, 0x1368: 0x7ab1, 0x1369: 0x7ab1,
+       0x136a: 0x7ac9, 0x136b: 0x7ac9, 0x136c: 0x7af1, 0x136d: 0x7af1, 0x136e: 0x7b19, 0x136f: 0x7b19,
+       0x1370: 0x7b41, 0x1371: 0x7b41, 0x1372: 0x7b69, 0x1373: 0x7b69, 0x1374: 0x7b91, 0x1375: 0x7b91,
+       0x1376: 0x7bb9, 0x1377: 0x7bb9, 0x1378: 0x7bb9, 0x1379: 0x7be1, 0x137a: 0x7be1, 0x137b: 0x7be1,
+       0x137c: 0x7c09, 0x137d: 0x7c09, 0x137e: 0x7c09, 0x137f: 0x7c09,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x85f9, 0x1381: 0x8621, 0x1382: 0x8649, 0x1383: 0x8671, 0x1384: 0x8699, 0x1385: 0x86c1,
+       0x1386: 0x86e9, 0x1387: 0x8711, 0x1388: 0x8739, 0x1389: 0x8761, 0x138a: 0x8789, 0x138b: 0x87b1,
+       0x138c: 0x87d9, 0x138d: 0x8801, 0x138e: 0x8829, 0x138f: 0x8851, 0x1390: 0x8879, 0x1391: 0x88a1,
+       0x1392: 0x88c9, 0x1393: 0x88f1, 0x1394: 0x8919, 0x1395: 0x8941, 0x1396: 0x8969, 0x1397: 0x8991,
+       0x1398: 0x89b9, 0x1399: 0x89e1, 0x139a: 0x8a09, 0x139b: 0x8a31, 0x139c: 0x8a59, 0x139d: 0x8a81,
+       0x139e: 0x8aaa, 0x139f: 0x8ada, 0x13a0: 0x8b0a, 0x13a1: 0x8b3a, 0x13a2: 0x8b6a, 0x13a3: 0x8b9a,
+       0x13a4: 0x8bc9, 0x13a5: 0x8bf1, 0x13a6: 0x7c71, 0x13a7: 0x8c19, 0x13a8: 0x7be1, 0x13a9: 0x7c99,
+       0x13aa: 0x8c41, 0x13ab: 0x8c69, 0x13ac: 0x7d39, 0x13ad: 0x8c91, 0x13ae: 0x7d61, 0x13af: 0x7d89,
+       0x13b0: 0x8cb9, 0x13b1: 0x8ce1, 0x13b2: 0x7e29, 0x13b3: 0x8d09, 0x13b4: 0x7e51, 0x13b5: 0x7e79,
+       0x13b6: 0x8d31, 0x13b7: 0x8d59, 0x13b8: 0x7ec9, 0x13b9: 0x8d81, 0x13ba: 0x7ef1, 0x13bb: 0x7f19,
+       0x13bc: 0x83a1, 0x13bd: 0x83c9, 0x13be: 0x8441, 0x13bf: 0x8469,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x8491, 0x13c1: 0x8531, 0x13c2: 0x8559, 0x13c3: 0x8581, 0x13c4: 0x85a9, 0x13c5: 0x8649,
+       0x13c6: 0x8671, 0x13c7: 0x8699, 0x13c8: 0x8da9, 0x13c9: 0x8739, 0x13ca: 0x8dd1, 0x13cb: 0x8df9,
+       0x13cc: 0x8829, 0x13cd: 0x8e21, 0x13ce: 0x8851, 0x13cf: 0x8879, 0x13d0: 0x8a81, 0x13d1: 0x8e49,
+       0x13d2: 0x8e71, 0x13d3: 0x89b9, 0x13d4: 0x8e99, 0x13d5: 0x89e1, 0x13d6: 0x8a09, 0x13d7: 0x7c21,
+       0x13d8: 0x7c49, 0x13d9: 0x8ec1, 0x13da: 0x7c71, 0x13db: 0x8ee9, 0x13dc: 0x7cc1, 0x13dd: 0x7ce9,
+       0x13de: 0x7d11, 0x13df: 0x7d39, 0x13e0: 0x8f11, 0x13e1: 0x7db1, 0x13e2: 0x7dd9, 0x13e3: 0x7e01,
+       0x13e4: 0x7e29, 0x13e5: 0x8f39, 0x13e6: 0x7ec9, 0x13e7: 0x7f41, 0x13e8: 0x7f69, 0x13e9: 0x7f91,
+       0x13ea: 0x7fb9, 0x13eb: 0x7fe1, 0x13ec: 0x8031, 0x13ed: 0x8059, 0x13ee: 0x8081, 0x13ef: 0x80a9,
+       0x13f0: 0x80d1, 0x13f1: 0x80f9, 0x13f2: 0x8f61, 0x13f3: 0x8121, 0x13f4: 0x8149, 0x13f5: 0x8171,
+       0x13f6: 0x8199, 0x13f7: 0x81c1, 0x13f8: 0x81e9, 0x13f9: 0x8239, 0x13fa: 0x8261, 0x13fb: 0x8289,
+       0x13fc: 0x82b1, 0x13fd: 0x82d9, 0x13fe: 0x8301, 0x13ff: 0x8329,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x8351, 0x1401: 0x8379, 0x1402: 0x83f1, 0x1403: 0x8419, 0x1404: 0x84b9, 0x1405: 0x84e1,
+       0x1406: 0x8509, 0x1407: 0x8531, 0x1408: 0x8559, 0x1409: 0x85d1, 0x140a: 0x85f9, 0x140b: 0x8621,
+       0x140c: 0x8649, 0x140d: 0x8f89, 0x140e: 0x86c1, 0x140f: 0x86e9, 0x1410: 0x8711, 0x1411: 0x8739,
+       0x1412: 0x87b1, 0x1413: 0x87d9, 0x1414: 0x8801, 0x1415: 0x8829, 0x1416: 0x8fb1, 0x1417: 0x88a1,
+       0x1418: 0x88c9, 0x1419: 0x8fd9, 0x141a: 0x8941, 0x141b: 0x8969, 0x141c: 0x8991, 0x141d: 0x89b9,
+       0x141e: 0x9001, 0x141f: 0x7c71, 0x1420: 0x8ee9, 0x1421: 0x7d39, 0x1422: 0x8f11, 0x1423: 0x7e29,
+       0x1424: 0x8f39, 0x1425: 0x7ec9, 0x1426: 0x9029, 0x1427: 0x80d1, 0x1428: 0x9051, 0x1429: 0x9079,
+       0x142a: 0x90a1, 0x142b: 0x8531, 0x142c: 0x8559, 0x142d: 0x8649, 0x142e: 0x8829, 0x142f: 0x8fb1,
+       0x1430: 0x89b9, 0x1431: 0x9001, 0x1432: 0x90c9, 0x1433: 0x9101, 0x1434: 0x9139, 0x1435: 0x9171,
+       0x1436: 0x9199, 0x1437: 0x91c1, 0x1438: 0x91e9, 0x1439: 0x9211, 0x143a: 0x9239, 0x143b: 0x9261,
+       0x143c: 0x9289, 0x143d: 0x92b1, 0x143e: 0x92d9, 0x143f: 0x9301,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x9329, 0x1441: 0x9351, 0x1442: 0x9379, 0x1443: 0x93a1, 0x1444: 0x93c9, 0x1445: 0x93f1,
+       0x1446: 0x9419, 0x1447: 0x9441, 0x1448: 0x9469, 0x1449: 0x9491, 0x144a: 0x94b9, 0x144b: 0x94e1,
+       0x144c: 0x9079, 0x144d: 0x9509, 0x144e: 0x9531, 0x144f: 0x9559, 0x1450: 0x9581, 0x1451: 0x9171,
+       0x1452: 0x9199, 0x1453: 0x91c1, 0x1454: 0x91e9, 0x1455: 0x9211, 0x1456: 0x9239, 0x1457: 0x9261,
+       0x1458: 0x9289, 0x1459: 0x92b1, 0x145a: 0x92d9, 0x145b: 0x9301, 0x145c: 0x9329, 0x145d: 0x9351,
+       0x145e: 0x9379, 0x145f: 0x93a1, 0x1460: 0x93c9, 0x1461: 0x93f1, 0x1462: 0x9419, 0x1463: 0x9441,
+       0x1464: 0x9469, 0x1465: 0x9491, 0x1466: 0x94b9, 0x1467: 0x94e1, 0x1468: 0x9079, 0x1469: 0x9509,
+       0x146a: 0x9531, 0x146b: 0x9559, 0x146c: 0x9581, 0x146d: 0x9491, 0x146e: 0x94b9, 0x146f: 0x94e1,
+       0x1470: 0x9079, 0x1471: 0x9051, 0x1472: 0x90a1, 0x1473: 0x8211, 0x1474: 0x8059, 0x1475: 0x8081,
+       0x1476: 0x80a9, 0x1477: 0x9491, 0x1478: 0x94b9, 0x1479: 0x94e1, 0x147a: 0x8211, 0x147b: 0x8239,
+       0x147c: 0x95a9, 0x147d: 0x95a9, 0x147e: 0x0018, 0x147f: 0x0018,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x0040, 0x1481: 0x0040, 0x1482: 0x0040, 0x1483: 0x0040, 0x1484: 0x0040, 0x1485: 0x0040,
+       0x1486: 0x0040, 0x1487: 0x0040, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040,
+       0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x95d1, 0x1491: 0x9609,
+       0x1492: 0x9609, 0x1493: 0x9641, 0x1494: 0x9679, 0x1495: 0x96b1, 0x1496: 0x96e9, 0x1497: 0x9721,
+       0x1498: 0x9759, 0x1499: 0x9759, 0x149a: 0x9791, 0x149b: 0x97c9, 0x149c: 0x9801, 0x149d: 0x9839,
+       0x149e: 0x9871, 0x149f: 0x98a9, 0x14a0: 0x98a9, 0x14a1: 0x98e1, 0x14a2: 0x9919, 0x14a3: 0x9919,
+       0x14a4: 0x9951, 0x14a5: 0x9951, 0x14a6: 0x9989, 0x14a7: 0x99c1, 0x14a8: 0x99c1, 0x14a9: 0x99f9,
+       0x14aa: 0x9a31, 0x14ab: 0x9a31, 0x14ac: 0x9a69, 0x14ad: 0x9a69, 0x14ae: 0x9aa1, 0x14af: 0x9ad9,
+       0x14b0: 0x9ad9, 0x14b1: 0x9b11, 0x14b2: 0x9b11, 0x14b3: 0x9b49, 0x14b4: 0x9b81, 0x14b5: 0x9bb9,
+       0x14b6: 0x9bf1, 0x14b7: 0x9bf1, 0x14b8: 0x9c29, 0x14b9: 0x9c61, 0x14ba: 0x9c99, 0x14bb: 0x9cd1,
+       0x14bc: 0x9d09, 0x14bd: 0x9d09, 0x14be: 0x9d41, 0x14bf: 0x9d79,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0xa949, 0x14c1: 0xa981, 0x14c2: 0xa9b9, 0x14c3: 0xa8a1, 0x14c4: 0x9bb9, 0x14c5: 0x9989,
+       0x14c6: 0xa9f1, 0x14c7: 0xaa29, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
+       0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x0040, 0x14d1: 0x0040,
+       0x14d2: 0x0040, 0x14d3: 0x0040, 0x14d4: 0x0040, 0x14d5: 0x0040, 0x14d6: 0x0040, 0x14d7: 0x0040,
+       0x14d8: 0x0040, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040,
+       0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x0040, 0x14e1: 0x0040, 0x14e2: 0x0040, 0x14e3: 0x0040,
+       0x14e4: 0x0040, 0x14e5: 0x0040, 0x14e6: 0x0040, 0x14e7: 0x0040, 0x14e8: 0x0040, 0x14e9: 0x0040,
+       0x14ea: 0x0040, 0x14eb: 0x0040, 0x14ec: 0x0040, 0x14ed: 0x0040, 0x14ee: 0x0040, 0x14ef: 0x0040,
+       0x14f0: 0xaa61, 0x14f1: 0xaa99, 0x14f2: 0xaad1, 0x14f3: 0xab19, 0x14f4: 0xab61, 0x14f5: 0xaba9,
+       0x14f6: 0xabf1, 0x14f7: 0xac39, 0x14f8: 0xac81, 0x14f9: 0xacc9, 0x14fa: 0xad02, 0x14fb: 0xae12,
+       0x14fc: 0xae91, 0x14fd: 0x0018, 0x14fe: 0x0040, 0x14ff: 0x0040,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x33c0, 0x1501: 0x33c0, 0x1502: 0x33c0, 0x1503: 0x33c0, 0x1504: 0x33c0, 0x1505: 0x33c0,
+       0x1506: 0x33c0, 0x1507: 0x33c0, 0x1508: 0x33c0, 0x1509: 0x33c0, 0x150a: 0x33c0, 0x150b: 0x33c0,
+       0x150c: 0x33c0, 0x150d: 0x33c0, 0x150e: 0x33c0, 0x150f: 0x33c0, 0x1510: 0xaeda, 0x1511: 0x7d55,
+       0x1512: 0x0040, 0x1513: 0xaeea, 0x1514: 0x03c2, 0x1515: 0xaefa, 0x1516: 0xaf0a, 0x1517: 0x7d75,
+       0x1518: 0x7d95, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
+       0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x3308, 0x1521: 0x3308, 0x1522: 0x3308, 0x1523: 0x3308,
+       0x1524: 0x3308, 0x1525: 0x3308, 0x1526: 0x3308, 0x1527: 0x3308, 0x1528: 0x3308, 0x1529: 0x3308,
+       0x152a: 0x3308, 0x152b: 0x3308, 0x152c: 0x3308, 0x152d: 0x3308, 0x152e: 0x3308, 0x152f: 0x3308,
+       0x1530: 0x0040, 0x1531: 0x7db5, 0x1532: 0x7dd5, 0x1533: 0xaf1a, 0x1534: 0xaf1a, 0x1535: 0x1fd2,
+       0x1536: 0x1fe2, 0x1537: 0xaf2a, 0x1538: 0xaf3a, 0x1539: 0x7df5, 0x153a: 0x7e15, 0x153b: 0x7e35,
+       0x153c: 0x7df5, 0x153d: 0x7e55, 0x153e: 0x7e75, 0x153f: 0x7e55,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x7e95, 0x1541: 0x7eb5, 0x1542: 0x7ed5, 0x1543: 0x7eb5, 0x1544: 0x7ef5, 0x1545: 0x0018,
+       0x1546: 0x0018, 0x1547: 0xaf4a, 0x1548: 0xaf5a, 0x1549: 0x7f16, 0x154a: 0x7f36, 0x154b: 0x7f56,
+       0x154c: 0x7f76, 0x154d: 0xaf1a, 0x154e: 0xaf1a, 0x154f: 0xaf1a, 0x1550: 0xaeda, 0x1551: 0x7f95,
+       0x1552: 0x0040, 0x1553: 0x0040, 0x1554: 0x03c2, 0x1555: 0xaeea, 0x1556: 0xaf0a, 0x1557: 0xaefa,
+       0x1558: 0x7fb5, 0x1559: 0x1fd2, 0x155a: 0x1fe2, 0x155b: 0xaf2a, 0x155c: 0xaf3a, 0x155d: 0x7e95,
+       0x155e: 0x7ef5, 0x155f: 0xaf6a, 0x1560: 0xaf7a, 0x1561: 0xaf8a, 0x1562: 0x1fb2, 0x1563: 0xaf99,
+       0x1564: 0xafaa, 0x1565: 0xafba, 0x1566: 0x1fc2, 0x1567: 0x0040, 0x1568: 0xafca, 0x1569: 0xafda,
+       0x156a: 0xafea, 0x156b: 0xaffa, 0x156c: 0x0040, 0x156d: 0x0040, 0x156e: 0x0040, 0x156f: 0x0040,
+       0x1570: 0x7fd6, 0x1571: 0xb009, 0x1572: 0x7ff6, 0x1573: 0x0808, 0x1574: 0x8016, 0x1575: 0x0040,
+       0x1576: 0x8036, 0x1577: 0xb031, 0x1578: 0x8056, 0x1579: 0xb059, 0x157a: 0x8076, 0x157b: 0xb081,
+       0x157c: 0x8096, 0x157d: 0xb0a9, 0x157e: 0x80b6, 0x157f: 0xb0d1,
+       // Block 0x56, offset 0x1580
+       0x1580: 0xb0f9, 0x1581: 0xb111, 0x1582: 0xb111, 0x1583: 0xb129, 0x1584: 0xb129, 0x1585: 0xb141,
+       0x1586: 0xb141, 0x1587: 0xb159, 0x1588: 0xb159, 0x1589: 0xb171, 0x158a: 0xb171, 0x158b: 0xb171,
+       0x158c: 0xb171, 0x158d: 0xb189, 0x158e: 0xb189, 0x158f: 0xb1a1, 0x1590: 0xb1a1, 0x1591: 0xb1a1,
+       0x1592: 0xb1a1, 0x1593: 0xb1b9, 0x1594: 0xb1b9, 0x1595: 0xb1d1, 0x1596: 0xb1d1, 0x1597: 0xb1d1,
+       0x1598: 0xb1d1, 0x1599: 0xb1e9, 0x159a: 0xb1e9, 0x159b: 0xb1e9, 0x159c: 0xb1e9, 0x159d: 0xb201,
+       0x159e: 0xb201, 0x159f: 0xb201, 0x15a0: 0xb201, 0x15a1: 0xb219, 0x15a2: 0xb219, 0x15a3: 0xb219,
+       0x15a4: 0xb219, 0x15a5: 0xb231, 0x15a6: 0xb231, 0x15a7: 0xb231, 0x15a8: 0xb231, 0x15a9: 0xb249,
+       0x15aa: 0xb249, 0x15ab: 0xb261, 0x15ac: 0xb261, 0x15ad: 0xb279, 0x15ae: 0xb279, 0x15af: 0xb291,
+       0x15b0: 0xb291, 0x15b1: 0xb2a9, 0x15b2: 0xb2a9, 0x15b3: 0xb2a9, 0x15b4: 0xb2a9, 0x15b5: 0xb2c1,
+       0x15b6: 0xb2c1, 0x15b7: 0xb2c1, 0x15b8: 0xb2c1, 0x15b9: 0xb2d9, 0x15ba: 0xb2d9, 0x15bb: 0xb2d9,
+       0x15bc: 0xb2d9, 0x15bd: 0xb2f1, 0x15be: 0xb2f1, 0x15bf: 0xb2f1,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0xb2f1, 0x15c1: 0xb309, 0x15c2: 0xb309, 0x15c3: 0xb309, 0x15c4: 0xb309, 0x15c5: 0xb321,
+       0x15c6: 0xb321, 0x15c7: 0xb321, 0x15c8: 0xb321, 0x15c9: 0xb339, 0x15ca: 0xb339, 0x15cb: 0xb339,
+       0x15cc: 0xb339, 0x15cd: 0xb351, 0x15ce: 0xb351, 0x15cf: 0xb351, 0x15d0: 0xb351, 0x15d1: 0xb369,
+       0x15d2: 0xb369, 0x15d3: 0xb369, 0x15d4: 0xb369, 0x15d5: 0xb381, 0x15d6: 0xb381, 0x15d7: 0xb381,
+       0x15d8: 0xb381, 0x15d9: 0xb399, 0x15da: 0xb399, 0x15db: 0xb399, 0x15dc: 0xb399, 0x15dd: 0xb3b1,
+       0x15de: 0xb3b1, 0x15df: 0xb3b1, 0x15e0: 0xb3b1, 0x15e1: 0xb3c9, 0x15e2: 0xb3c9, 0x15e3: 0xb3c9,
+       0x15e4: 0xb3c9, 0x15e5: 0xb3e1, 0x15e6: 0xb3e1, 0x15e7: 0xb3e1, 0x15e8: 0xb3e1, 0x15e9: 0xb3f9,
+       0x15ea: 0xb3f9, 0x15eb: 0xb3f9, 0x15ec: 0xb3f9, 0x15ed: 0xb411, 0x15ee: 0xb411, 0x15ef: 0x7ab1,
+       0x15f0: 0x7ab1, 0x15f1: 0xb429, 0x15f2: 0xb429, 0x15f3: 0xb429, 0x15f4: 0xb429, 0x15f5: 0xb441,
+       0x15f6: 0xb441, 0x15f7: 0xb469, 0x15f8: 0xb469, 0x15f9: 0xb491, 0x15fa: 0xb491, 0x15fb: 0xb4b9,
+       0x15fc: 0xb4b9, 0x15fd: 0x0040, 0x15fe: 0x0040, 0x15ff: 0x03c0,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x0040, 0x1601: 0xaefa, 0x1602: 0xb4e2, 0x1603: 0xaf6a, 0x1604: 0xafda, 0x1605: 0xafea,
+       0x1606: 0xaf7a, 0x1607: 0xb4f2, 0x1608: 0x1fd2, 0x1609: 0x1fe2, 0x160a: 0xaf8a, 0x160b: 0x1fb2,
+       0x160c: 0xaeda, 0x160d: 0xaf99, 0x160e: 0x29d1, 0x160f: 0xb502, 0x1610: 0x1f41, 0x1611: 0x00c9,
+       0x1612: 0x0069, 0x1613: 0x0079, 0x1614: 0x1f51, 0x1615: 0x1f61, 0x1616: 0x1f71, 0x1617: 0x1f81,
+       0x1618: 0x1f91, 0x1619: 0x1fa1, 0x161a: 0xaeea, 0x161b: 0x03c2, 0x161c: 0xafaa, 0x161d: 0x1fc2,
+       0x161e: 0xafba, 0x161f: 0xaf0a, 0x1620: 0xaffa, 0x1621: 0x0039, 0x1622: 0x0ee9, 0x1623: 0x1159,
+       0x1624: 0x0ef9, 0x1625: 0x0f09, 0x1626: 0x1199, 0x1627: 0x0f31, 0x1628: 0x0249, 0x1629: 0x0f41,
+       0x162a: 0x0259, 0x162b: 0x0f51, 0x162c: 0x0359, 0x162d: 0x0f61, 0x162e: 0x0f71, 0x162f: 0x00d9,
+       0x1630: 0x0f99, 0x1631: 0x2039, 0x1632: 0x0269, 0x1633: 0x01d9, 0x1634: 0x0fa9, 0x1635: 0x0fb9,
+       0x1636: 0x1089, 0x1637: 0x0279, 0x1638: 0x0369, 0x1639: 0x0289, 0x163a: 0x13d1, 0x163b: 0xaf4a,
+       0x163c: 0xafca, 0x163d: 0xaf5a, 0x163e: 0xb512, 0x163f: 0xaf1a,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x1caa, 0x1641: 0x0039, 0x1642: 0x0ee9, 0x1643: 0x1159, 0x1644: 0x0ef9, 0x1645: 0x0f09,
+       0x1646: 0x1199, 0x1647: 0x0f31, 0x1648: 0x0249, 0x1649: 0x0f41, 0x164a: 0x0259, 0x164b: 0x0f51,
+       0x164c: 0x0359, 0x164d: 0x0f61, 0x164e: 0x0f71, 0x164f: 0x00d9, 0x1650: 0x0f99, 0x1651: 0x2039,
+       0x1652: 0x0269, 0x1653: 0x01d9, 0x1654: 0x0fa9, 0x1655: 0x0fb9, 0x1656: 0x1089, 0x1657: 0x0279,
+       0x1658: 0x0369, 0x1659: 0x0289, 0x165a: 0x13d1, 0x165b: 0xaf2a, 0x165c: 0xb522, 0x165d: 0xaf3a,
+       0x165e: 0xb532, 0x165f: 0x80d5, 0x1660: 0x80f5, 0x1661: 0x29d1, 0x1662: 0x8115, 0x1663: 0x8115,
+       0x1664: 0x8135, 0x1665: 0x8155, 0x1666: 0x8175, 0x1667: 0x8195, 0x1668: 0x81b5, 0x1669: 0x81d5,
+       0x166a: 0x81f5, 0x166b: 0x8215, 0x166c: 0x8235, 0x166d: 0x8255, 0x166e: 0x8275, 0x166f: 0x8295,
+       0x1670: 0x82b5, 0x1671: 0x82d5, 0x1672: 0x82f5, 0x1673: 0x8315, 0x1674: 0x8335, 0x1675: 0x8355,
+       0x1676: 0x8375, 0x1677: 0x8395, 0x1678: 0x83b5, 0x1679: 0x83d5, 0x167a: 0x83f5, 0x167b: 0x8415,
+       0x167c: 0x81b5, 0x167d: 0x8435, 0x167e: 0x8455, 0x167f: 0x8215,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x8475, 0x1681: 0x8495, 0x1682: 0x84b5, 0x1683: 0x84d5, 0x1684: 0x84f5, 0x1685: 0x8515,
+       0x1686: 0x8535, 0x1687: 0x8555, 0x1688: 0x84d5, 0x1689: 0x8575, 0x168a: 0x84d5, 0x168b: 0x8595,
+       0x168c: 0x8595, 0x168d: 0x85b5, 0x168e: 0x85b5, 0x168f: 0x85d5, 0x1690: 0x8515, 0x1691: 0x85f5,
+       0x1692: 0x8615, 0x1693: 0x85f5, 0x1694: 0x8635, 0x1695: 0x8615, 0x1696: 0x8655, 0x1697: 0x8655,
+       0x1698: 0x8675, 0x1699: 0x8675, 0x169a: 0x8695, 0x169b: 0x8695, 0x169c: 0x8615, 0x169d: 0x8115,
+       0x169e: 0x86b5, 0x169f: 0x86d5, 0x16a0: 0x0040, 0x16a1: 0x86f5, 0x16a2: 0x8715, 0x16a3: 0x8735,
+       0x16a4: 0x8755, 0x16a5: 0x8735, 0x16a6: 0x8775, 0x16a7: 0x8795, 0x16a8: 0x87b5, 0x16a9: 0x87b5,
+       0x16aa: 0x87d5, 0x16ab: 0x87d5, 0x16ac: 0x87f5, 0x16ad: 0x87f5, 0x16ae: 0x87d5, 0x16af: 0x87d5,
+       0x16b0: 0x8815, 0x16b1: 0x8835, 0x16b2: 0x8855, 0x16b3: 0x8875, 0x16b4: 0x8895, 0x16b5: 0x88b5,
+       0x16b6: 0x88b5, 0x16b7: 0x88b5, 0x16b8: 0x88d5, 0x16b9: 0x88d5, 0x16ba: 0x88d5, 0x16bb: 0x88d5,
+       0x16bc: 0x87b5, 0x16bd: 0x87b5, 0x16be: 0x87b5, 0x16bf: 0x0040,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x0040, 0x16c1: 0x0040, 0x16c2: 0x8715, 0x16c3: 0x86f5, 0x16c4: 0x88f5, 0x16c5: 0x86f5,
+       0x16c6: 0x8715, 0x16c7: 0x86f5, 0x16c8: 0x0040, 0x16c9: 0x0040, 0x16ca: 0x8915, 0x16cb: 0x8715,
+       0x16cc: 0x8935, 0x16cd: 0x88f5, 0x16ce: 0x8935, 0x16cf: 0x8715, 0x16d0: 0x0040, 0x16d1: 0x0040,
+       0x16d2: 0x8955, 0x16d3: 0x8975, 0x16d4: 0x8875, 0x16d5: 0x8935, 0x16d6: 0x88f5, 0x16d7: 0x8935,
+       0x16d8: 0x0040, 0x16d9: 0x0040, 0x16da: 0x8995, 0x16db: 0x89b5, 0x16dc: 0x8995, 0x16dd: 0x0040,
+       0x16de: 0x0040, 0x16df: 0x0040, 0x16e0: 0xb541, 0x16e1: 0xb559, 0x16e2: 0xb571, 0x16e3: 0x89d6,
+       0x16e4: 0xb589, 0x16e5: 0xb5a1, 0x16e6: 0x89f5, 0x16e7: 0x0040, 0x16e8: 0x8a15, 0x16e9: 0x8a35,
+       0x16ea: 0x8a55, 0x16eb: 0x8a35, 0x16ec: 0x8a75, 0x16ed: 0x8a95, 0x16ee: 0x8ab5, 0x16ef: 0x0040,
+       0x16f0: 0x0040, 0x16f1: 0x0040, 0x16f2: 0x0040, 0x16f3: 0x0040, 0x16f4: 0x0040, 0x16f5: 0x0040,
+       0x16f6: 0x0040, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0340, 0x16fa: 0x0340, 0x16fb: 0x0340,
+       0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x0a08, 0x1701: 0x0a08, 0x1702: 0x0a08, 0x1703: 0x0a08, 0x1704: 0x0a08, 0x1705: 0x0c08,
+       0x1706: 0x0808, 0x1707: 0x0c08, 0x1708: 0x0818, 0x1709: 0x0c08, 0x170a: 0x0c08, 0x170b: 0x0808,
+       0x170c: 0x0808, 0x170d: 0x0908, 0x170e: 0x0c08, 0x170f: 0x0c08, 0x1710: 0x0c08, 0x1711: 0x0c08,
+       0x1712: 0x0c08, 0x1713: 0x0a08, 0x1714: 0x0a08, 0x1715: 0x0a08, 0x1716: 0x0a08, 0x1717: 0x0908,
+       0x1718: 0x0a08, 0x1719: 0x0a08, 0x171a: 0x0a08, 0x171b: 0x0a08, 0x171c: 0x0a08, 0x171d: 0x0c08,
+       0x171e: 0x0a08, 0x171f: 0x0a08, 0x1720: 0x0a08, 0x1721: 0x0c08, 0x1722: 0x0808, 0x1723: 0x0808,
+       0x1724: 0x0c08, 0x1725: 0x3308, 0x1726: 0x3308, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0040,
+       0x172a: 0x0040, 0x172b: 0x0a18, 0x172c: 0x0a18, 0x172d: 0x0a18, 0x172e: 0x0a18, 0x172f: 0x0c18,
+       0x1730: 0x0818, 0x1731: 0x0818, 0x1732: 0x0818, 0x1733: 0x0818, 0x1734: 0x0818, 0x1735: 0x0818,
+       0x1736: 0x0818, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040,
+       0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x0a08, 0x1741: 0x0c08, 0x1742: 0x0a08, 0x1743: 0x0c08, 0x1744: 0x0c08, 0x1745: 0x0c08,
+       0x1746: 0x0a08, 0x1747: 0x0a08, 0x1748: 0x0a08, 0x1749: 0x0c08, 0x174a: 0x0a08, 0x174b: 0x0a08,
+       0x174c: 0x0c08, 0x174d: 0x0a08, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0a08, 0x1751: 0x0c08,
+       0x1752: 0x0040, 0x1753: 0x0040, 0x1754: 0x0040, 0x1755: 0x0040, 0x1756: 0x0040, 0x1757: 0x0040,
+       0x1758: 0x0040, 0x1759: 0x0818, 0x175a: 0x0818, 0x175b: 0x0818, 0x175c: 0x0818, 0x175d: 0x0040,
+       0x175e: 0x0040, 0x175f: 0x0040, 0x1760: 0x0040, 0x1761: 0x0040, 0x1762: 0x0040, 0x1763: 0x0040,
+       0x1764: 0x0040, 0x1765: 0x0040, 0x1766: 0x0040, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0c18,
+       0x176a: 0x0c18, 0x176b: 0x0c18, 0x176c: 0x0c18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0818,
+       0x1770: 0x0040, 0x1771: 0x0040, 0x1772: 0x0040, 0x1773: 0x0040, 0x1774: 0x0040, 0x1775: 0x0040,
+       0x1776: 0x0040, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
+       0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
+       // Block 0x5e, offset 0x1780
+       0x1780: 0x3308, 0x1781: 0x3308, 0x1782: 0x3008, 0x1783: 0x3008, 0x1784: 0x0040, 0x1785: 0x0008,
+       0x1786: 0x0008, 0x1787: 0x0008, 0x1788: 0x0008, 0x1789: 0x0008, 0x178a: 0x0008, 0x178b: 0x0008,
+       0x178c: 0x0008, 0x178d: 0x0040, 0x178e: 0x0040, 0x178f: 0x0008, 0x1790: 0x0008, 0x1791: 0x0040,
+       0x1792: 0x0040, 0x1793: 0x0008, 0x1794: 0x0008, 0x1795: 0x0008, 0x1796: 0x0008, 0x1797: 0x0008,
+       0x1798: 0x0008, 0x1799: 0x0008, 0x179a: 0x0008, 0x179b: 0x0008, 0x179c: 0x0008, 0x179d: 0x0008,
+       0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x0008, 0x17a3: 0x0008,
+       0x17a4: 0x0008, 0x17a5: 0x0008, 0x17a6: 0x0008, 0x17a7: 0x0008, 0x17a8: 0x0008, 0x17a9: 0x0040,
+       0x17aa: 0x0008, 0x17ab: 0x0008, 0x17ac: 0x0008, 0x17ad: 0x0008, 0x17ae: 0x0008, 0x17af: 0x0008,
+       0x17b0: 0x0008, 0x17b1: 0x0040, 0x17b2: 0x0008, 0x17b3: 0x0008, 0x17b4: 0x0040, 0x17b5: 0x0008,
+       0x17b6: 0x0008, 0x17b7: 0x0008, 0x17b8: 0x0008, 0x17b9: 0x0008, 0x17ba: 0x0040, 0x17bb: 0x0040,
+       0x17bc: 0x3308, 0x17bd: 0x0008, 0x17be: 0x3008, 0x17bf: 0x3008,
+       // Block 0x5f, offset 0x17c0
+       0x17c0: 0x3308, 0x17c1: 0x3008, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x3008, 0x17c5: 0x0040,
+       0x17c6: 0x0040, 0x17c7: 0x3008, 0x17c8: 0x3008, 0x17c9: 0x0040, 0x17ca: 0x0040, 0x17cb: 0x3008,
+       0x17cc: 0x3008, 0x17cd: 0x3808, 0x17ce: 0x0040, 0x17cf: 0x0040, 0x17d0: 0x0008, 0x17d1: 0x0040,
+       0x17d2: 0x0040, 0x17d3: 0x0040, 0x17d4: 0x0040, 0x17d5: 0x0040, 0x17d6: 0x0040, 0x17d7: 0x3008,
+       0x17d8: 0x0040, 0x17d9: 0x0040, 0x17da: 0x0040, 0x17db: 0x0040, 0x17dc: 0x0040, 0x17dd: 0x0008,
+       0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x3008, 0x17e3: 0x3008,
+       0x17e4: 0x0040, 0x17e5: 0x0040, 0x17e6: 0x3308, 0x17e7: 0x3308, 0x17e8: 0x3308, 0x17e9: 0x3308,
+       0x17ea: 0x3308, 0x17eb: 0x3308, 0x17ec: 0x3308, 0x17ed: 0x0040, 0x17ee: 0x0040, 0x17ef: 0x0040,
+       0x17f0: 0x3308, 0x17f1: 0x3308, 0x17f2: 0x3308, 0x17f3: 0x3308, 0x17f4: 0x3308, 0x17f5: 0x0040,
+       0x17f6: 0x0040, 0x17f7: 0x0040, 0x17f8: 0x0040, 0x17f9: 0x0040, 0x17fa: 0x0040, 0x17fb: 0x0040,
+       0x17fc: 0x0040, 0x17fd: 0x0040, 0x17fe: 0x0040, 0x17ff: 0x0040,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x0039, 0x1801: 0x0ee9, 0x1802: 0x1159, 0x1803: 0x0ef9, 0x1804: 0x0f09, 0x1805: 0x1199,
+       0x1806: 0x0f31, 0x1807: 0x0249, 0x1808: 0x0f41, 0x1809: 0x0259, 0x180a: 0x0f51, 0x180b: 0x0359,
+       0x180c: 0x0f61, 0x180d: 0x0f71, 0x180e: 0x00d9, 0x180f: 0x0f99, 0x1810: 0x2039, 0x1811: 0x0269,
+       0x1812: 0x01d9, 0x1813: 0x0fa9, 0x1814: 0x0fb9, 0x1815: 0x1089, 0x1816: 0x0279, 0x1817: 0x0369,
+       0x1818: 0x0289, 0x1819: 0x13d1, 0x181a: 0x0039, 0x181b: 0x0ee9, 0x181c: 0x1159, 0x181d: 0x0ef9,
+       0x181e: 0x0f09, 0x181f: 0x1199, 0x1820: 0x0f31, 0x1821: 0x0249, 0x1822: 0x0f41, 0x1823: 0x0259,
+       0x1824: 0x0f51, 0x1825: 0x0359, 0x1826: 0x0f61, 0x1827: 0x0f71, 0x1828: 0x00d9, 0x1829: 0x0f99,
+       0x182a: 0x2039, 0x182b: 0x0269, 0x182c: 0x01d9, 0x182d: 0x0fa9, 0x182e: 0x0fb9, 0x182f: 0x1089,
+       0x1830: 0x0279, 0x1831: 0x0369, 0x1832: 0x0289, 0x1833: 0x13d1, 0x1834: 0x0039, 0x1835: 0x0ee9,
+       0x1836: 0x1159, 0x1837: 0x0ef9, 0x1838: 0x0f09, 0x1839: 0x1199, 0x183a: 0x0f31, 0x183b: 0x0249,
+       0x183c: 0x0f41, 0x183d: 0x0259, 0x183e: 0x0f51, 0x183f: 0x0359,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x0f61, 0x1841: 0x0f71, 0x1842: 0x00d9, 0x1843: 0x0f99, 0x1844: 0x2039, 0x1845: 0x0269,
+       0x1846: 0x01d9, 0x1847: 0x0fa9, 0x1848: 0x0fb9, 0x1849: 0x1089, 0x184a: 0x0279, 0x184b: 0x0369,
+       0x184c: 0x0289, 0x184d: 0x13d1, 0x184e: 0x0039, 0x184f: 0x0ee9, 0x1850: 0x1159, 0x1851: 0x0ef9,
+       0x1852: 0x0f09, 0x1853: 0x1199, 0x1854: 0x0f31, 0x1855: 0x0040, 0x1856: 0x0f41, 0x1857: 0x0259,
+       0x1858: 0x0f51, 0x1859: 0x0359, 0x185a: 0x0f61, 0x185b: 0x0f71, 0x185c: 0x00d9, 0x185d: 0x0f99,
+       0x185e: 0x2039, 0x185f: 0x0269, 0x1860: 0x01d9, 0x1861: 0x0fa9, 0x1862: 0x0fb9, 0x1863: 0x1089,
+       0x1864: 0x0279, 0x1865: 0x0369, 0x1866: 0x0289, 0x1867: 0x13d1, 0x1868: 0x0039, 0x1869: 0x0ee9,
+       0x186a: 0x1159, 0x186b: 0x0ef9, 0x186c: 0x0f09, 0x186d: 0x1199, 0x186e: 0x0f31, 0x186f: 0x0249,
+       0x1870: 0x0f41, 0x1871: 0x0259, 0x1872: 0x0f51, 0x1873: 0x0359, 0x1874: 0x0f61, 0x1875: 0x0f71,
+       0x1876: 0x00d9, 0x1877: 0x0f99, 0x1878: 0x2039, 0x1879: 0x0269, 0x187a: 0x01d9, 0x187b: 0x0fa9,
+       0x187c: 0x0fb9, 0x187d: 0x1089, 0x187e: 0x0279, 0x187f: 0x0369,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x0289, 0x1881: 0x13d1, 0x1882: 0x0039, 0x1883: 0x0ee9, 0x1884: 0x1159, 0x1885: 0x0ef9,
+       0x1886: 0x0f09, 0x1887: 0x1199, 0x1888: 0x0f31, 0x1889: 0x0249, 0x188a: 0x0f41, 0x188b: 0x0259,
+       0x188c: 0x0f51, 0x188d: 0x0359, 0x188e: 0x0f61, 0x188f: 0x0f71, 0x1890: 0x00d9, 0x1891: 0x0f99,
+       0x1892: 0x2039, 0x1893: 0x0269, 0x1894: 0x01d9, 0x1895: 0x0fa9, 0x1896: 0x0fb9, 0x1897: 0x1089,
+       0x1898: 0x0279, 0x1899: 0x0369, 0x189a: 0x0289, 0x189b: 0x13d1, 0x189c: 0x0039, 0x189d: 0x0040,
+       0x189e: 0x1159, 0x189f: 0x0ef9, 0x18a0: 0x0040, 0x18a1: 0x0040, 0x18a2: 0x0f31, 0x18a3: 0x0040,
+       0x18a4: 0x0040, 0x18a5: 0x0259, 0x18a6: 0x0f51, 0x18a7: 0x0040, 0x18a8: 0x0040, 0x18a9: 0x0f71,
+       0x18aa: 0x00d9, 0x18ab: 0x0f99, 0x18ac: 0x2039, 0x18ad: 0x0040, 0x18ae: 0x01d9, 0x18af: 0x0fa9,
+       0x18b0: 0x0fb9, 0x18b1: 0x1089, 0x18b2: 0x0279, 0x18b3: 0x0369, 0x18b4: 0x0289, 0x18b5: 0x13d1,
+       0x18b6: 0x0039, 0x18b7: 0x0ee9, 0x18b8: 0x1159, 0x18b9: 0x0ef9, 0x18ba: 0x0040, 0x18bb: 0x1199,
+       0x18bc: 0x0040, 0x18bd: 0x0249, 0x18be: 0x0f41, 0x18bf: 0x0259,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x0f51, 0x18c1: 0x0359, 0x18c2: 0x0f61, 0x18c3: 0x0f71, 0x18c4: 0x0040, 0x18c5: 0x0f99,
+       0x18c6: 0x2039, 0x18c7: 0x0269, 0x18c8: 0x01d9, 0x18c9: 0x0fa9, 0x18ca: 0x0fb9, 0x18cb: 0x1089,
+       0x18cc: 0x0279, 0x18cd: 0x0369, 0x18ce: 0x0289, 0x18cf: 0x13d1, 0x18d0: 0x0039, 0x18d1: 0x0ee9,
+       0x18d2: 0x1159, 0x18d3: 0x0ef9, 0x18d4: 0x0f09, 0x18d5: 0x1199, 0x18d6: 0x0f31, 0x18d7: 0x0249,
+       0x18d8: 0x0f41, 0x18d9: 0x0259, 0x18da: 0x0f51, 0x18db: 0x0359, 0x18dc: 0x0f61, 0x18dd: 0x0f71,
+       0x18de: 0x00d9, 0x18df: 0x0f99, 0x18e0: 0x2039, 0x18e1: 0x0269, 0x18e2: 0x01d9, 0x18e3: 0x0fa9,
+       0x18e4: 0x0fb9, 0x18e5: 0x1089, 0x18e6: 0x0279, 0x18e7: 0x0369, 0x18e8: 0x0289, 0x18e9: 0x13d1,
+       0x18ea: 0x0039, 0x18eb: 0x0ee9, 0x18ec: 0x1159, 0x18ed: 0x0ef9, 0x18ee: 0x0f09, 0x18ef: 0x1199,
+       0x18f0: 0x0f31, 0x18f1: 0x0249, 0x18f2: 0x0f41, 0x18f3: 0x0259, 0x18f4: 0x0f51, 0x18f5: 0x0359,
+       0x18f6: 0x0f61, 0x18f7: 0x0f71, 0x18f8: 0x00d9, 0x18f9: 0x0f99, 0x18fa: 0x2039, 0x18fb: 0x0269,
+       0x18fc: 0x01d9, 0x18fd: 0x0fa9, 0x18fe: 0x0fb9, 0x18ff: 0x1089,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x0279, 0x1901: 0x0369, 0x1902: 0x0289, 0x1903: 0x13d1, 0x1904: 0x0039, 0x1905: 0x0ee9,
+       0x1906: 0x0040, 0x1907: 0x0ef9, 0x1908: 0x0f09, 0x1909: 0x1199, 0x190a: 0x0f31, 0x190b: 0x0040,
+       0x190c: 0x0040, 0x190d: 0x0259, 0x190e: 0x0f51, 0x190f: 0x0359, 0x1910: 0x0f61, 0x1911: 0x0f71,
+       0x1912: 0x00d9, 0x1913: 0x0f99, 0x1914: 0x2039, 0x1915: 0x0040, 0x1916: 0x01d9, 0x1917: 0x0fa9,
+       0x1918: 0x0fb9, 0x1919: 0x1089, 0x191a: 0x0279, 0x191b: 0x0369, 0x191c: 0x0289, 0x191d: 0x0040,
+       0x191e: 0x0039, 0x191f: 0x0ee9, 0x1920: 0x1159, 0x1921: 0x0ef9, 0x1922: 0x0f09, 0x1923: 0x1199,
+       0x1924: 0x0f31, 0x1925: 0x0249, 0x1926: 0x0f41, 0x1927: 0x0259, 0x1928: 0x0f51, 0x1929: 0x0359,
+       0x192a: 0x0f61, 0x192b: 0x0f71, 0x192c: 0x00d9, 0x192d: 0x0f99, 0x192e: 0x2039, 0x192f: 0x0269,
+       0x1930: 0x01d9, 0x1931: 0x0fa9, 0x1932: 0x0fb9, 0x1933: 0x1089, 0x1934: 0x0279, 0x1935: 0x0369,
+       0x1936: 0x0289, 0x1937: 0x13d1, 0x1938: 0x0039, 0x1939: 0x0ee9, 0x193a: 0x0040, 0x193b: 0x0ef9,
+       0x193c: 0x0f09, 0x193d: 0x1199, 0x193e: 0x0f31, 0x193f: 0x0040,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x0f41, 0x1941: 0x0259, 0x1942: 0x0f51, 0x1943: 0x0359, 0x1944: 0x0f61, 0x1945: 0x0040,
+       0x1946: 0x00d9, 0x1947: 0x0040, 0x1948: 0x0040, 0x1949: 0x0040, 0x194a: 0x01d9, 0x194b: 0x0fa9,
+       0x194c: 0x0fb9, 0x194d: 0x1089, 0x194e: 0x0279, 0x194f: 0x0369, 0x1950: 0x0289, 0x1951: 0x0040,
+       0x1952: 0x0039, 0x1953: 0x0ee9, 0x1954: 0x1159, 0x1955: 0x0ef9, 0x1956: 0x0f09, 0x1957: 0x1199,
+       0x1958: 0x0f31, 0x1959: 0x0249, 0x195a: 0x0f41, 0x195b: 0x0259, 0x195c: 0x0f51, 0x195d: 0x0359,
+       0x195e: 0x0f61, 0x195f: 0x0f71, 0x1960: 0x00d9, 0x1961: 0x0f99, 0x1962: 0x2039, 0x1963: 0x0269,
+       0x1964: 0x01d9, 0x1965: 0x0fa9, 0x1966: 0x0fb9, 0x1967: 0x1089, 0x1968: 0x0279, 0x1969: 0x0369,
+       0x196a: 0x0289, 0x196b: 0x13d1, 0x196c: 0x0039, 0x196d: 0x0ee9, 0x196e: 0x1159, 0x196f: 0x0ef9,
+       0x1970: 0x0f09, 0x1971: 0x1199, 0x1972: 0x0f31, 0x1973: 0x0249, 0x1974: 0x0f41, 0x1975: 0x0259,
+       0x1976: 0x0f51, 0x1977: 0x0359, 0x1978: 0x0f61, 0x1979: 0x0f71, 0x197a: 0x00d9, 0x197b: 0x0f99,
+       0x197c: 0x2039, 0x197d: 0x0269, 0x197e: 0x01d9, 0x197f: 0x0fa9,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x0fb9, 0x1981: 0x1089, 0x1982: 0x0279, 0x1983: 0x0369, 0x1984: 0x0289, 0x1985: 0x13d1,
+       0x1986: 0x0039, 0x1987: 0x0ee9, 0x1988: 0x1159, 0x1989: 0x0ef9, 0x198a: 0x0f09, 0x198b: 0x1199,
+       0x198c: 0x0f31, 0x198d: 0x0249, 0x198e: 0x0f41, 0x198f: 0x0259, 0x1990: 0x0f51, 0x1991: 0x0359,
+       0x1992: 0x0f61, 0x1993: 0x0f71, 0x1994: 0x00d9, 0x1995: 0x0f99, 0x1996: 0x2039, 0x1997: 0x0269,
+       0x1998: 0x01d9, 0x1999: 0x0fa9, 0x199a: 0x0fb9, 0x199b: 0x1089, 0x199c: 0x0279, 0x199d: 0x0369,
+       0x199e: 0x0289, 0x199f: 0x13d1, 0x19a0: 0x0039, 0x19a1: 0x0ee9, 0x19a2: 0x1159, 0x19a3: 0x0ef9,
+       0x19a4: 0x0f09, 0x19a5: 0x1199, 0x19a6: 0x0f31, 0x19a7: 0x0249, 0x19a8: 0x0f41, 0x19a9: 0x0259,
+       0x19aa: 0x0f51, 0x19ab: 0x0359, 0x19ac: 0x0f61, 0x19ad: 0x0f71, 0x19ae: 0x00d9, 0x19af: 0x0f99,
+       0x19b0: 0x2039, 0x19b1: 0x0269, 0x19b2: 0x01d9, 0x19b3: 0x0fa9, 0x19b4: 0x0fb9, 0x19b5: 0x1089,
+       0x19b6: 0x0279, 0x19b7: 0x0369, 0x19b8: 0x0289, 0x19b9: 0x13d1, 0x19ba: 0x0039, 0x19bb: 0x0ee9,
+       0x19bc: 0x1159, 0x19bd: 0x0ef9, 0x19be: 0x0f09, 0x19bf: 0x1199,
+       // Block 0x67, offset 0x19c0
+       0x19c0: 0x0f31, 0x19c1: 0x0249, 0x19c2: 0x0f41, 0x19c3: 0x0259, 0x19c4: 0x0f51, 0x19c5: 0x0359,
+       0x19c6: 0x0f61, 0x19c7: 0x0f71, 0x19c8: 0x00d9, 0x19c9: 0x0f99, 0x19ca: 0x2039, 0x19cb: 0x0269,
+       0x19cc: 0x01d9, 0x19cd: 0x0fa9, 0x19ce: 0x0fb9, 0x19cf: 0x1089, 0x19d0: 0x0279, 0x19d1: 0x0369,
+       0x19d2: 0x0289, 0x19d3: 0x13d1, 0x19d4: 0x0039, 0x19d5: 0x0ee9, 0x19d6: 0x1159, 0x19d7: 0x0ef9,
+       0x19d8: 0x0f09, 0x19d9: 0x1199, 0x19da: 0x0f31, 0x19db: 0x0249, 0x19dc: 0x0f41, 0x19dd: 0x0259,
+       0x19de: 0x0f51, 0x19df: 0x0359, 0x19e0: 0x0f61, 0x19e1: 0x0f71, 0x19e2: 0x00d9, 0x19e3: 0x0f99,
+       0x19e4: 0x2039, 0x19e5: 0x0269, 0x19e6: 0x01d9, 0x19e7: 0x0fa9, 0x19e8: 0x0fb9, 0x19e9: 0x1089,
+       0x19ea: 0x0279, 0x19eb: 0x0369, 0x19ec: 0x0289, 0x19ed: 0x13d1, 0x19ee: 0x0039, 0x19ef: 0x0ee9,
+       0x19f0: 0x1159, 0x19f1: 0x0ef9, 0x19f2: 0x0f09, 0x19f3: 0x1199, 0x19f4: 0x0f31, 0x19f5: 0x0249,
+       0x19f6: 0x0f41, 0x19f7: 0x0259, 0x19f8: 0x0f51, 0x19f9: 0x0359, 0x19fa: 0x0f61, 0x19fb: 0x0f71,
+       0x19fc: 0x00d9, 0x19fd: 0x0f99, 0x19fe: 0x2039, 0x19ff: 0x0269,
+       // Block 0x68, offset 0x1a00
+       0x1a00: 0x01d9, 0x1a01: 0x0fa9, 0x1a02: 0x0fb9, 0x1a03: 0x1089, 0x1a04: 0x0279, 0x1a05: 0x0369,
+       0x1a06: 0x0289, 0x1a07: 0x13d1, 0x1a08: 0x0039, 0x1a09: 0x0ee9, 0x1a0a: 0x1159, 0x1a0b: 0x0ef9,
+       0x1a0c: 0x0f09, 0x1a0d: 0x1199, 0x1a0e: 0x0f31, 0x1a0f: 0x0249, 0x1a10: 0x0f41, 0x1a11: 0x0259,
+       0x1a12: 0x0f51, 0x1a13: 0x0359, 0x1a14: 0x0f61, 0x1a15: 0x0f71, 0x1a16: 0x00d9, 0x1a17: 0x0f99,
+       0x1a18: 0x2039, 0x1a19: 0x0269, 0x1a1a: 0x01d9, 0x1a1b: 0x0fa9, 0x1a1c: 0x0fb9, 0x1a1d: 0x1089,
+       0x1a1e: 0x0279, 0x1a1f: 0x0369, 0x1a20: 0x0289, 0x1a21: 0x13d1, 0x1a22: 0x0039, 0x1a23: 0x0ee9,
+       0x1a24: 0x1159, 0x1a25: 0x0ef9, 0x1a26: 0x0f09, 0x1a27: 0x1199, 0x1a28: 0x0f31, 0x1a29: 0x0249,
+       0x1a2a: 0x0f41, 0x1a2b: 0x0259, 0x1a2c: 0x0f51, 0x1a2d: 0x0359, 0x1a2e: 0x0f61, 0x1a2f: 0x0f71,
+       0x1a30: 0x00d9, 0x1a31: 0x0f99, 0x1a32: 0x2039, 0x1a33: 0x0269, 0x1a34: 0x01d9, 0x1a35: 0x0fa9,
+       0x1a36: 0x0fb9, 0x1a37: 0x1089, 0x1a38: 0x0279, 0x1a39: 0x0369, 0x1a3a: 0x0289, 0x1a3b: 0x13d1,
+       0x1a3c: 0x0039, 0x1a3d: 0x0ee9, 0x1a3e: 0x1159, 0x1a3f: 0x0ef9,
+       // Block 0x69, offset 0x1a40
+       0x1a40: 0x0f09, 0x1a41: 0x1199, 0x1a42: 0x0f31, 0x1a43: 0x0249, 0x1a44: 0x0f41, 0x1a45: 0x0259,
+       0x1a46: 0x0f51, 0x1a47: 0x0359, 0x1a48: 0x0f61, 0x1a49: 0x0f71, 0x1a4a: 0x00d9, 0x1a4b: 0x0f99,
+       0x1a4c: 0x2039, 0x1a4d: 0x0269, 0x1a4e: 0x01d9, 0x1a4f: 0x0fa9, 0x1a50: 0x0fb9, 0x1a51: 0x1089,
+       0x1a52: 0x0279, 0x1a53: 0x0369, 0x1a54: 0x0289, 0x1a55: 0x13d1, 0x1a56: 0x0039, 0x1a57: 0x0ee9,
+       0x1a58: 0x1159, 0x1a59: 0x0ef9, 0x1a5a: 0x0f09, 0x1a5b: 0x1199, 0x1a5c: 0x0f31, 0x1a5d: 0x0249,
+       0x1a5e: 0x0f41, 0x1a5f: 0x0259, 0x1a60: 0x0f51, 0x1a61: 0x0359, 0x1a62: 0x0f61, 0x1a63: 0x0f71,
+       0x1a64: 0x00d9, 0x1a65: 0x0f99, 0x1a66: 0x2039, 0x1a67: 0x0269, 0x1a68: 0x01d9, 0x1a69: 0x0fa9,
+       0x1a6a: 0x0fb9, 0x1a6b: 0x1089, 0x1a6c: 0x0279, 0x1a6d: 0x0369, 0x1a6e: 0x0289, 0x1a6f: 0x13d1,
+       0x1a70: 0x0039, 0x1a71: 0x0ee9, 0x1a72: 0x1159, 0x1a73: 0x0ef9, 0x1a74: 0x0f09, 0x1a75: 0x1199,
+       0x1a76: 0x0f31, 0x1a77: 0x0249, 0x1a78: 0x0f41, 0x1a79: 0x0259, 0x1a7a: 0x0f51, 0x1a7b: 0x0359,
+       0x1a7c: 0x0f61, 0x1a7d: 0x0f71, 0x1a7e: 0x00d9, 0x1a7f: 0x0f99,
+       // Block 0x6a, offset 0x1a80
+       0x1a80: 0x2039, 0x1a81: 0x0269, 0x1a82: 0x01d9, 0x1a83: 0x0fa9, 0x1a84: 0x0fb9, 0x1a85: 0x1089,
+       0x1a86: 0x0279, 0x1a87: 0x0369, 0x1a88: 0x0289, 0x1a89: 0x13d1, 0x1a8a: 0x0039, 0x1a8b: 0x0ee9,
+       0x1a8c: 0x1159, 0x1a8d: 0x0ef9, 0x1a8e: 0x0f09, 0x1a8f: 0x1199, 0x1a90: 0x0f31, 0x1a91: 0x0249,
+       0x1a92: 0x0f41, 0x1a93: 0x0259, 0x1a94: 0x0f51, 0x1a95: 0x0359, 0x1a96: 0x0f61, 0x1a97: 0x0f71,
+       0x1a98: 0x00d9, 0x1a99: 0x0f99, 0x1a9a: 0x2039, 0x1a9b: 0x0269, 0x1a9c: 0x01d9, 0x1a9d: 0x0fa9,
+       0x1a9e: 0x0fb9, 0x1a9f: 0x1089, 0x1aa0: 0x0279, 0x1aa1: 0x0369, 0x1aa2: 0x0289, 0x1aa3: 0x13d1,
+       0x1aa4: 0xba81, 0x1aa5: 0xba99, 0x1aa6: 0x0040, 0x1aa7: 0x0040, 0x1aa8: 0xbab1, 0x1aa9: 0x1099,
+       0x1aaa: 0x10b1, 0x1aab: 0x10c9, 0x1aac: 0xbac9, 0x1aad: 0xbae1, 0x1aae: 0xbaf9, 0x1aaf: 0x1429,
+       0x1ab0: 0x1a31, 0x1ab1: 0xbb11, 0x1ab2: 0xbb29, 0x1ab3: 0xbb41, 0x1ab4: 0xbb59, 0x1ab5: 0xbb71,
+       0x1ab6: 0xbb89, 0x1ab7: 0x2109, 0x1ab8: 0x1111, 0x1ab9: 0x1429, 0x1aba: 0xbba1, 0x1abb: 0xbbb9,
+       0x1abc: 0xbbd1, 0x1abd: 0x10e1, 0x1abe: 0x10f9, 0x1abf: 0xbbe9,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x2079, 0x1ac1: 0xbc01, 0x1ac2: 0xbab1, 0x1ac3: 0x1099, 0x1ac4: 0x10b1, 0x1ac5: 0x10c9,
+       0x1ac6: 0xbac9, 0x1ac7: 0xbae1, 0x1ac8: 0xbaf9, 0x1ac9: 0x1429, 0x1aca: 0x1a31, 0x1acb: 0xbb11,
+       0x1acc: 0xbb29, 0x1acd: 0xbb41, 0x1ace: 0xbb59, 0x1acf: 0xbb71, 0x1ad0: 0xbb89, 0x1ad1: 0x2109,
+       0x1ad2: 0x1111, 0x1ad3: 0xbba1, 0x1ad4: 0xbba1, 0x1ad5: 0xbbb9, 0x1ad6: 0xbbd1, 0x1ad7: 0x10e1,
+       0x1ad8: 0x10f9, 0x1ad9: 0xbbe9, 0x1ada: 0x2079, 0x1adb: 0xbc21, 0x1adc: 0xbac9, 0x1add: 0x1429,
+       0x1ade: 0xbb11, 0x1adf: 0x10e1, 0x1ae0: 0x1111, 0x1ae1: 0x2109, 0x1ae2: 0xbab1, 0x1ae3: 0x1099,
+       0x1ae4: 0x10b1, 0x1ae5: 0x10c9, 0x1ae6: 0xbac9, 0x1ae7: 0xbae1, 0x1ae8: 0xbaf9, 0x1ae9: 0x1429,
+       0x1aea: 0x1a31, 0x1aeb: 0xbb11, 0x1aec: 0xbb29, 0x1aed: 0xbb41, 0x1aee: 0xbb59, 0x1aef: 0xbb71,
+       0x1af0: 0xbb89, 0x1af1: 0x2109, 0x1af2: 0x1111, 0x1af3: 0x1429, 0x1af4: 0xbba1, 0x1af5: 0xbbb9,
+       0x1af6: 0xbbd1, 0x1af7: 0x10e1, 0x1af8: 0x10f9, 0x1af9: 0xbbe9, 0x1afa: 0x2079, 0x1afb: 0xbc01,
+       0x1afc: 0xbab1, 0x1afd: 0x1099, 0x1afe: 0x10b1, 0x1aff: 0x10c9,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0xbac9, 0x1b01: 0xbae1, 0x1b02: 0xbaf9, 0x1b03: 0x1429, 0x1b04: 0x1a31, 0x1b05: 0xbb11,
+       0x1b06: 0xbb29, 0x1b07: 0xbb41, 0x1b08: 0xbb59, 0x1b09: 0xbb71, 0x1b0a: 0xbb89, 0x1b0b: 0x2109,
+       0x1b0c: 0x1111, 0x1b0d: 0xbba1, 0x1b0e: 0xbba1, 0x1b0f: 0xbbb9, 0x1b10: 0xbbd1, 0x1b11: 0x10e1,
+       0x1b12: 0x10f9, 0x1b13: 0xbbe9, 0x1b14: 0x2079, 0x1b15: 0xbc21, 0x1b16: 0xbac9, 0x1b17: 0x1429,
+       0x1b18: 0xbb11, 0x1b19: 0x10e1, 0x1b1a: 0x1111, 0x1b1b: 0x2109, 0x1b1c: 0xbab1, 0x1b1d: 0x1099,
+       0x1b1e: 0x10b1, 0x1b1f: 0x10c9, 0x1b20: 0xbac9, 0x1b21: 0xbae1, 0x1b22: 0xbaf9, 0x1b23: 0x1429,
+       0x1b24: 0x1a31, 0x1b25: 0xbb11, 0x1b26: 0xbb29, 0x1b27: 0xbb41, 0x1b28: 0xbb59, 0x1b29: 0xbb71,
+       0x1b2a: 0xbb89, 0x1b2b: 0x2109, 0x1b2c: 0x1111, 0x1b2d: 0x1429, 0x1b2e: 0xbba1, 0x1b2f: 0xbbb9,
+       0x1b30: 0xbbd1, 0x1b31: 0x10e1, 0x1b32: 0x10f9, 0x1b33: 0xbbe9, 0x1b34: 0x2079, 0x1b35: 0xbc01,
+       0x1b36: 0xbab1, 0x1b37: 0x1099, 0x1b38: 0x10b1, 0x1b39: 0x10c9, 0x1b3a: 0xbac9, 0x1b3b: 0xbae1,
+       0x1b3c: 0xbaf9, 0x1b3d: 0x1429, 0x1b3e: 0x1a31, 0x1b3f: 0xbb11,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0xbb29, 0x1b41: 0xbb41, 0x1b42: 0xbb59, 0x1b43: 0xbb71, 0x1b44: 0xbb89, 0x1b45: 0x2109,
+       0x1b46: 0x1111, 0x1b47: 0xbba1, 0x1b48: 0xbba1, 0x1b49: 0xbbb9, 0x1b4a: 0xbbd1, 0x1b4b: 0x10e1,
+       0x1b4c: 0x10f9, 0x1b4d: 0xbbe9, 0x1b4e: 0x2079, 0x1b4f: 0xbc21, 0x1b50: 0xbac9, 0x1b51: 0x1429,
+       0x1b52: 0xbb11, 0x1b53: 0x10e1, 0x1b54: 0x1111, 0x1b55: 0x2109, 0x1b56: 0xbab1, 0x1b57: 0x1099,
+       0x1b58: 0x10b1, 0x1b59: 0x10c9, 0x1b5a: 0xbac9, 0x1b5b: 0xbae1, 0x1b5c: 0xbaf9, 0x1b5d: 0x1429,
+       0x1b5e: 0x1a31, 0x1b5f: 0xbb11, 0x1b60: 0xbb29, 0x1b61: 0xbb41, 0x1b62: 0xbb59, 0x1b63: 0xbb71,
+       0x1b64: 0xbb89, 0x1b65: 0x2109, 0x1b66: 0x1111, 0x1b67: 0x1429, 0x1b68: 0xbba1, 0x1b69: 0xbbb9,
+       0x1b6a: 0xbbd1, 0x1b6b: 0x10e1, 0x1b6c: 0x10f9, 0x1b6d: 0xbbe9, 0x1b6e: 0x2079, 0x1b6f: 0xbc01,
+       0x1b70: 0xbab1, 0x1b71: 0x1099, 0x1b72: 0x10b1, 0x1b73: 0x10c9, 0x1b74: 0xbac9, 0x1b75: 0xbae1,
+       0x1b76: 0xbaf9, 0x1b77: 0x1429, 0x1b78: 0x1a31, 0x1b79: 0xbb11, 0x1b7a: 0xbb29, 0x1b7b: 0xbb41,
+       0x1b7c: 0xbb59, 0x1b7d: 0xbb71, 0x1b7e: 0xbb89, 0x1b7f: 0x2109,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0x1111, 0x1b81: 0xbba1, 0x1b82: 0xbba1, 0x1b83: 0xbbb9, 0x1b84: 0xbbd1, 0x1b85: 0x10e1,
+       0x1b86: 0x10f9, 0x1b87: 0xbbe9, 0x1b88: 0x2079, 0x1b89: 0xbc21, 0x1b8a: 0xbac9, 0x1b8b: 0x1429,
+       0x1b8c: 0xbb11, 0x1b8d: 0x10e1, 0x1b8e: 0x1111, 0x1b8f: 0x2109, 0x1b90: 0xbab1, 0x1b91: 0x1099,
+       0x1b92: 0x10b1, 0x1b93: 0x10c9, 0x1b94: 0xbac9, 0x1b95: 0xbae1, 0x1b96: 0xbaf9, 0x1b97: 0x1429,
+       0x1b98: 0x1a31, 0x1b99: 0xbb11, 0x1b9a: 0xbb29, 0x1b9b: 0xbb41, 0x1b9c: 0xbb59, 0x1b9d: 0xbb71,
+       0x1b9e: 0xbb89, 0x1b9f: 0x2109, 0x1ba0: 0x1111, 0x1ba1: 0x1429, 0x1ba2: 0xbba1, 0x1ba3: 0xbbb9,
+       0x1ba4: 0xbbd1, 0x1ba5: 0x10e1, 0x1ba6: 0x10f9, 0x1ba7: 0xbbe9, 0x1ba8: 0x2079, 0x1ba9: 0xbc01,
+       0x1baa: 0xbab1, 0x1bab: 0x1099, 0x1bac: 0x10b1, 0x1bad: 0x10c9, 0x1bae: 0xbac9, 0x1baf: 0xbae1,
+       0x1bb0: 0xbaf9, 0x1bb1: 0x1429, 0x1bb2: 0x1a31, 0x1bb3: 0xbb11, 0x1bb4: 0xbb29, 0x1bb5: 0xbb41,
+       0x1bb6: 0xbb59, 0x1bb7: 0xbb71, 0x1bb8: 0xbb89, 0x1bb9: 0x2109, 0x1bba: 0x1111, 0x1bbb: 0xbba1,
+       0x1bbc: 0xbba1, 0x1bbd: 0xbbb9, 0x1bbe: 0xbbd1, 0x1bbf: 0x10e1,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x10f9, 0x1bc1: 0xbbe9, 0x1bc2: 0x2079, 0x1bc3: 0xbc21, 0x1bc4: 0xbac9, 0x1bc5: 0x1429,
+       0x1bc6: 0xbb11, 0x1bc7: 0x10e1, 0x1bc8: 0x1111, 0x1bc9: 0x2109, 0x1bca: 0xbc41, 0x1bcb: 0xbc41,
+       0x1bcc: 0x0040, 0x1bcd: 0x0040, 0x1bce: 0x1f41, 0x1bcf: 0x00c9, 0x1bd0: 0x0069, 0x1bd1: 0x0079,
+       0x1bd2: 0x1f51, 0x1bd3: 0x1f61, 0x1bd4: 0x1f71, 0x1bd5: 0x1f81, 0x1bd6: 0x1f91, 0x1bd7: 0x1fa1,
+       0x1bd8: 0x1f41, 0x1bd9: 0x00c9, 0x1bda: 0x0069, 0x1bdb: 0x0079, 0x1bdc: 0x1f51, 0x1bdd: 0x1f61,
+       0x1bde: 0x1f71, 0x1bdf: 0x1f81, 0x1be0: 0x1f91, 0x1be1: 0x1fa1, 0x1be2: 0x1f41, 0x1be3: 0x00c9,
+       0x1be4: 0x0069, 0x1be5: 0x0079, 0x1be6: 0x1f51, 0x1be7: 0x1f61, 0x1be8: 0x1f71, 0x1be9: 0x1f81,
+       0x1bea: 0x1f91, 0x1beb: 0x1fa1, 0x1bec: 0x1f41, 0x1bed: 0x00c9, 0x1bee: 0x0069, 0x1bef: 0x0079,
+       0x1bf0: 0x1f51, 0x1bf1: 0x1f61, 0x1bf2: 0x1f71, 0x1bf3: 0x1f81, 0x1bf4: 0x1f91, 0x1bf5: 0x1fa1,
+       0x1bf6: 0x1f41, 0x1bf7: 0x00c9, 0x1bf8: 0x0069, 0x1bf9: 0x0079, 0x1bfa: 0x1f51, 0x1bfb: 0x1f61,
+       0x1bfc: 0x1f71, 0x1bfd: 0x1f81, 0x1bfe: 0x1f91, 0x1bff: 0x1fa1,
+       // Block 0x70, offset 0x1c00
+       0x1c00: 0xe115, 0x1c01: 0xe115, 0x1c02: 0xe135, 0x1c03: 0xe135, 0x1c04: 0xe115, 0x1c05: 0xe115,
+       0x1c06: 0xe175, 0x1c07: 0xe175, 0x1c08: 0xe115, 0x1c09: 0xe115, 0x1c0a: 0xe135, 0x1c0b: 0xe135,
+       0x1c0c: 0xe115, 0x1c0d: 0xe115, 0x1c0e: 0xe1f5, 0x1c0f: 0xe1f5, 0x1c10: 0xe115, 0x1c11: 0xe115,
+       0x1c12: 0xe135, 0x1c13: 0xe135, 0x1c14: 0xe115, 0x1c15: 0xe115, 0x1c16: 0xe175, 0x1c17: 0xe175,
+       0x1c18: 0xe115, 0x1c19: 0xe115, 0x1c1a: 0xe135, 0x1c1b: 0xe135, 0x1c1c: 0xe115, 0x1c1d: 0xe115,
+       0x1c1e: 0x8b05, 0x1c1f: 0x8b05, 0x1c20: 0x04b5, 0x1c21: 0x04b5, 0x1c22: 0x0a08, 0x1c23: 0x0a08,
+       0x1c24: 0x0a08, 0x1c25: 0x0a08, 0x1c26: 0x0a08, 0x1c27: 0x0a08, 0x1c28: 0x0a08, 0x1c29: 0x0a08,
+       0x1c2a: 0x0a08, 0x1c2b: 0x0a08, 0x1c2c: 0x0a08, 0x1c2d: 0x0a08, 0x1c2e: 0x0a08, 0x1c2f: 0x0a08,
+       0x1c30: 0x0a08, 0x1c31: 0x0a08, 0x1c32: 0x0a08, 0x1c33: 0x0a08, 0x1c34: 0x0a08, 0x1c35: 0x0a08,
+       0x1c36: 0x0a08, 0x1c37: 0x0a08, 0x1c38: 0x0a08, 0x1c39: 0x0a08, 0x1c3a: 0x0a08, 0x1c3b: 0x0a08,
+       0x1c3c: 0x0a08, 0x1c3d: 0x0a08, 0x1c3e: 0x0a08, 0x1c3f: 0x0a08,
+       // Block 0x71, offset 0x1c40
+       0x1c40: 0xb189, 0x1c41: 0xb1a1, 0x1c42: 0xb201, 0x1c43: 0xb249, 0x1c44: 0x0040, 0x1c45: 0xb411,
+       0x1c46: 0xb291, 0x1c47: 0xb219, 0x1c48: 0xb309, 0x1c49: 0xb429, 0x1c4a: 0xb399, 0x1c4b: 0xb3b1,
+       0x1c4c: 0xb3c9, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0xb369, 0x1c51: 0xb2d9,
+       0x1c52: 0xb381, 0x1c53: 0xb279, 0x1c54: 0xb2c1, 0x1c55: 0xb1d1, 0x1c56: 0xb1e9, 0x1c57: 0xb231,
+       0x1c58: 0xb261, 0x1c59: 0xb2f1, 0x1c5a: 0xb321, 0x1c5b: 0xb351, 0x1c5c: 0xbc59, 0x1c5d: 0x7949,
+       0x1c5e: 0xbc71, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040,
+       0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0x0040, 0x1c69: 0xb429,
+       0x1c6a: 0xb399, 0x1c6b: 0xb3b1, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339,
+       0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1,
+       0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0x0040, 0x1c7b: 0xb351,
+       0x1c7c: 0x0040, 0x1c7d: 0x0040, 0x1c7e: 0x0040, 0x1c7f: 0x0040,
+       // Block 0x72, offset 0x1c80
+       0x1c80: 0x0040, 0x1c81: 0x0040, 0x1c82: 0xb201, 0x1c83: 0x0040, 0x1c84: 0x0040, 0x1c85: 0x0040,
+       0x1c86: 0x0040, 0x1c87: 0xb219, 0x1c88: 0x0040, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1,
+       0x1c8c: 0x0040, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0x0040, 0x1c91: 0xb2d9,
+       0x1c92: 0xb381, 0x1c93: 0x0040, 0x1c94: 0xb2c1, 0x1c95: 0x0040, 0x1c96: 0x0040, 0x1c97: 0xb231,
+       0x1c98: 0x0040, 0x1c99: 0xb2f1, 0x1c9a: 0x0040, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x7949,
+       0x1c9e: 0x0040, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,
+       0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429,
+       0x1caa: 0xb399, 0x1cab: 0x0040, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
+       0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
+       0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351,
+       0x1cbc: 0xbc59, 0x1cbd: 0x0040, 0x1cbe: 0xbc71, 0x1cbf: 0x0040,
+       // Block 0x73, offset 0x1cc0
+       0x1cc0: 0xb189, 0x1cc1: 0xb1a1, 0x1cc2: 0xb201, 0x1cc3: 0xb249, 0x1cc4: 0xb3f9, 0x1cc5: 0xb411,
+       0x1cc6: 0xb291, 0x1cc7: 0xb219, 0x1cc8: 0xb309, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,
+       0x1ccc: 0xb3c9, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0xb369, 0x1cd1: 0xb2d9,
+       0x1cd2: 0xb381, 0x1cd3: 0xb279, 0x1cd4: 0xb2c1, 0x1cd5: 0xb1d1, 0x1cd6: 0xb1e9, 0x1cd7: 0xb231,
+       0x1cd8: 0xb261, 0x1cd9: 0xb2f1, 0x1cda: 0xb321, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x0040,
+       0x1cde: 0x0040, 0x1cdf: 0x0040, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0xb249,
+       0x1ce4: 0x0040, 0x1ce5: 0xb411, 0x1ce6: 0xb291, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,
+       0x1cea: 0x0040, 0x1ceb: 0xb3b1, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,
+       0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0xb279, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,
+       0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0xb261, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,
+       0x1cfc: 0x0040, 0x1cfd: 0x0040, 0x1cfe: 0x0040, 0x1cff: 0x0040,
+       // Block 0x74, offset 0x1d00
+       0x1d00: 0x0040, 0x1d01: 0xbca2, 0x1d02: 0xbcba, 0x1d03: 0xbcd2, 0x1d04: 0xbcea, 0x1d05: 0xbd02,
+       0x1d06: 0xbd1a, 0x1d07: 0xbd32, 0x1d08: 0xbd4a, 0x1d09: 0xbd62, 0x1d0a: 0xbd7a, 0x1d0b: 0x0018,
+       0x1d0c: 0x0018, 0x1d0d: 0x0040, 0x1d0e: 0x0040, 0x1d0f: 0x0040, 0x1d10: 0xbd92, 0x1d11: 0xbdb2,
+       0x1d12: 0xbdd2, 0x1d13: 0xbdf2, 0x1d14: 0xbe12, 0x1d15: 0xbe32, 0x1d16: 0xbe52, 0x1d17: 0xbe72,
+       0x1d18: 0xbe92, 0x1d19: 0xbeb2, 0x1d1a: 0xbed2, 0x1d1b: 0xbef2, 0x1d1c: 0xbf12, 0x1d1d: 0xbf32,
+       0x1d1e: 0xbf52, 0x1d1f: 0xbf72, 0x1d20: 0xbf92, 0x1d21: 0xbfb2, 0x1d22: 0xbfd2, 0x1d23: 0xbff2,
+       0x1d24: 0xc012, 0x1d25: 0xc032, 0x1d26: 0xc052, 0x1d27: 0xc072, 0x1d28: 0xc092, 0x1d29: 0xc0b2,
+       0x1d2a: 0xc0d1, 0x1d2b: 0x1159, 0x1d2c: 0x0269, 0x1d2d: 0x6671, 0x1d2e: 0xc111, 0x1d2f: 0x0040,
+       0x1d30: 0x0039, 0x1d31: 0x0ee9, 0x1d32: 0x1159, 0x1d33: 0x0ef9, 0x1d34: 0x0f09, 0x1d35: 0x1199,
+       0x1d36: 0x0f31, 0x1d37: 0x0249, 0x1d38: 0x0f41, 0x1d39: 0x0259, 0x1d3a: 0x0f51, 0x1d3b: 0x0359,
+       0x1d3c: 0x0f61, 0x1d3d: 0x0f71, 0x1d3e: 0x00d9, 0x1d3f: 0x0f99,
+       // Block 0x75, offset 0x1d40
+       0x1d40: 0x2039, 0x1d41: 0x0269, 0x1d42: 0x01d9, 0x1d43: 0x0fa9, 0x1d44: 0x0fb9, 0x1d45: 0x1089,
+       0x1d46: 0x0279, 0x1d47: 0x0369, 0x1d48: 0x0289, 0x1d49: 0x13d1, 0x1d4a: 0xc129, 0x1d4b: 0x65b1,
+       0x1d4c: 0xc141, 0x1d4d: 0x1441, 0x1d4e: 0xc159, 0x1d4f: 0xc179, 0x1d50: 0x0018, 0x1d51: 0x0018,
+       0x1d52: 0x0018, 0x1d53: 0x0018, 0x1d54: 0x0018, 0x1d55: 0x0018, 0x1d56: 0x0018, 0x1d57: 0x0018,
+       0x1d58: 0x0018, 0x1d59: 0x0018, 0x1d5a: 0x0018, 0x1d5b: 0x0018, 0x1d5c: 0x0018, 0x1d5d: 0x0018,
+       0x1d5e: 0x0018, 0x1d5f: 0x0018, 0x1d60: 0x0018, 0x1d61: 0x0018, 0x1d62: 0x0018, 0x1d63: 0x0018,
+       0x1d64: 0x0018, 0x1d65: 0x0018, 0x1d66: 0x0018, 0x1d67: 0x0018, 0x1d68: 0x0018, 0x1d69: 0x0018,
+       0x1d6a: 0xc191, 0x1d6b: 0xc1a9, 0x1d6c: 0x0040, 0x1d6d: 0x0040, 0x1d6e: 0x0040, 0x1d6f: 0x0040,
+       0x1d70: 0x0018, 0x1d71: 0x0018, 0x1d72: 0x0018, 0x1d73: 0x0018, 0x1d74: 0x0018, 0x1d75: 0x0018,
+       0x1d76: 0x0018, 0x1d77: 0x0018, 0x1d78: 0x0018, 0x1d79: 0x0018, 0x1d7a: 0x0018, 0x1d7b: 0x0018,
+       0x1d7c: 0x0018, 0x1d7d: 0x0018, 0x1d7e: 0x0018, 0x1d7f: 0x0018,
+       // Block 0x76, offset 0x1d80
+       0x1d80: 0xc1d9, 0x1d81: 0xc211, 0x1d82: 0xc249, 0x1d83: 0x0040, 0x1d84: 0x0040, 0x1d85: 0x0040,
+       0x1d86: 0x0040, 0x1d87: 0x0040, 0x1d88: 0x0040, 0x1d89: 0x0040, 0x1d8a: 0x0040, 0x1d8b: 0x0040,
+       0x1d8c: 0x0040, 0x1d8d: 0x0040, 0x1d8e: 0x0040, 0x1d8f: 0x0040, 0x1d90: 0xc269, 0x1d91: 0xc289,
+       0x1d92: 0xc2a9, 0x1d93: 0xc2c9, 0x1d94: 0xc2e9, 0x1d95: 0xc309, 0x1d96: 0xc329, 0x1d97: 0xc349,
+       0x1d98: 0xc369, 0x1d99: 0xc389, 0x1d9a: 0xc3a9, 0x1d9b: 0xc3c9, 0x1d9c: 0xc3e9, 0x1d9d: 0xc409,
+       0x1d9e: 0xc429, 0x1d9f: 0xc449, 0x1da0: 0xc469, 0x1da1: 0xc489, 0x1da2: 0xc4a9, 0x1da3: 0xc4c9,
+       0x1da4: 0xc4e9, 0x1da5: 0xc509, 0x1da6: 0xc529, 0x1da7: 0xc549, 0x1da8: 0xc569, 0x1da9: 0xc589,
+       0x1daa: 0xc5a9, 0x1dab: 0xc5c9, 0x1dac: 0xc5e9, 0x1dad: 0xc609, 0x1dae: 0xc629, 0x1daf: 0xc649,
+       0x1db0: 0xc669, 0x1db1: 0xc689, 0x1db2: 0xc6a9, 0x1db3: 0xc6c9, 0x1db4: 0xc6e9, 0x1db5: 0xc709,
+       0x1db6: 0xc729, 0x1db7: 0xc749, 0x1db8: 0xc769, 0x1db9: 0xc789, 0x1dba: 0xc7a9, 0x1dbb: 0xc7c9,
+       0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040,
+       // Block 0x77, offset 0x1dc0
+       0x1dc0: 0xcaf9, 0x1dc1: 0xcb19, 0x1dc2: 0xcb39, 0x1dc3: 0x8b1d, 0x1dc4: 0xcb59, 0x1dc5: 0xcb79,
+       0x1dc6: 0xcb99, 0x1dc7: 0xcbb9, 0x1dc8: 0xcbd9, 0x1dc9: 0xcbf9, 0x1dca: 0xcc19, 0x1dcb: 0xcc39,
+       0x1dcc: 0xcc59, 0x1dcd: 0x8b3d, 0x1dce: 0xcc79, 0x1dcf: 0xcc99, 0x1dd0: 0xccb9, 0x1dd1: 0xccd9,
+       0x1dd2: 0x8b5d, 0x1dd3: 0xccf9, 0x1dd4: 0xcd19, 0x1dd5: 0xc429, 0x1dd6: 0x8b7d, 0x1dd7: 0xcd39,
+       0x1dd8: 0xcd59, 0x1dd9: 0xcd79, 0x1dda: 0xcd99, 0x1ddb: 0xcdb9, 0x1ddc: 0x8b9d, 0x1ddd: 0xcdd9,
+       0x1dde: 0xcdf9, 0x1ddf: 0xce19, 0x1de0: 0xce39, 0x1de1: 0xce59, 0x1de2: 0xc789, 0x1de3: 0xce79,
+       0x1de4: 0xce99, 0x1de5: 0xceb9, 0x1de6: 0xced9, 0x1de7: 0xcef9, 0x1de8: 0xcf19, 0x1de9: 0xcf39,
+       0x1dea: 0xcf59, 0x1deb: 0xcf79, 0x1dec: 0xcf99, 0x1ded: 0xcfb9, 0x1dee: 0xcfd9, 0x1def: 0xcff9,
+       0x1df0: 0xd019, 0x1df1: 0xd039, 0x1df2: 0xd039, 0x1df3: 0xd039, 0x1df4: 0x8bbd, 0x1df5: 0xd059,
+       0x1df6: 0xd079, 0x1df7: 0xd099, 0x1df8: 0x8bdd, 0x1df9: 0xd0b9, 0x1dfa: 0xd0d9, 0x1dfb: 0xd0f9,
+       0x1dfc: 0xd119, 0x1dfd: 0xd139, 0x1dfe: 0xd159, 0x1dff: 0xd179,
+       // Block 0x78, offset 0x1e00
+       0x1e00: 0xd199, 0x1e01: 0xd1b9, 0x1e02: 0xd1d9, 0x1e03: 0xd1f9, 0x1e04: 0xd219, 0x1e05: 0xd239,
+       0x1e06: 0xd239, 0x1e07: 0xd259, 0x1e08: 0xd279, 0x1e09: 0xd299, 0x1e0a: 0xd2b9, 0x1e0b: 0xd2d9,
+       0x1e0c: 0xd2f9, 0x1e0d: 0xd319, 0x1e0e: 0xd339, 0x1e0f: 0xd359, 0x1e10: 0xd379, 0x1e11: 0xd399,
+       0x1e12: 0xd3b9, 0x1e13: 0xd3d9, 0x1e14: 0xd3f9, 0x1e15: 0xd419, 0x1e16: 0xd439, 0x1e17: 0xd459,
+       0x1e18: 0xd479, 0x1e19: 0x8bfd, 0x1e1a: 0xd499, 0x1e1b: 0xd4b9, 0x1e1c: 0xd4d9, 0x1e1d: 0xc309,
+       0x1e1e: 0xd4f9, 0x1e1f: 0xd519, 0x1e20: 0x8c1d, 0x1e21: 0x8c3d, 0x1e22: 0xd539, 0x1e23: 0xd559,
+       0x1e24: 0xd579, 0x1e25: 0xd599, 0x1e26: 0xd5b9, 0x1e27: 0xd5d9, 0x1e28: 0x2040, 0x1e29: 0xd5f9,
+       0x1e2a: 0xd619, 0x1e2b: 0xd619, 0x1e2c: 0x8c5d, 0x1e2d: 0xd639, 0x1e2e: 0xd659, 0x1e2f: 0xd679,
+       0x1e30: 0xd699, 0x1e31: 0x8c7d, 0x1e32: 0xd6b9, 0x1e33: 0xd6d9, 0x1e34: 0x2040, 0x1e35: 0xd6f9,
+       0x1e36: 0xd719, 0x1e37: 0xd739, 0x1e38: 0xd759, 0x1e39: 0xd779, 0x1e3a: 0xd799, 0x1e3b: 0x8c9d,
+       0x1e3c: 0xd7b9, 0x1e3d: 0x8cbd, 0x1e3e: 0xd7d9, 0x1e3f: 0xd7f9,
+       // Block 0x79, offset 0x1e40
+       0x1e40: 0xd819, 0x1e41: 0xd839, 0x1e42: 0xd859, 0x1e43: 0xd879, 0x1e44: 0xd899, 0x1e45: 0xd8b9,
+       0x1e46: 0xd8d9, 0x1e47: 0xd8f9, 0x1e48: 0xd919, 0x1e49: 0x8cdd, 0x1e4a: 0xd939, 0x1e4b: 0xd959,
+       0x1e4c: 0xd979, 0x1e4d: 0xd999, 0x1e4e: 0xd9b9, 0x1e4f: 0x8cfd, 0x1e50: 0xd9d9, 0x1e51: 0x8d1d,
+       0x1e52: 0x8d3d, 0x1e53: 0xd9f9, 0x1e54: 0xda19, 0x1e55: 0xda19, 0x1e56: 0xda39, 0x1e57: 0x8d5d,
+       0x1e58: 0x8d7d, 0x1e59: 0xda59, 0x1e5a: 0xda79, 0x1e5b: 0xda99, 0x1e5c: 0xdab9, 0x1e5d: 0xdad9,
+       0x1e5e: 0xdaf9, 0x1e5f: 0xdb19, 0x1e60: 0xdb39, 0x1e61: 0xdb59, 0x1e62: 0xdb79, 0x1e63: 0xdb99,
+       0x1e64: 0x8d9d, 0x1e65: 0xdbb9, 0x1e66: 0xdbd9, 0x1e67: 0xdbf9, 0x1e68: 0xdc19, 0x1e69: 0xdbf9,
+       0x1e6a: 0xdc39, 0x1e6b: 0xdc59, 0x1e6c: 0xdc79, 0x1e6d: 0xdc99, 0x1e6e: 0xdcb9, 0x1e6f: 0xdcd9,
+       0x1e70: 0xdcf9, 0x1e71: 0xdd19, 0x1e72: 0xdd39, 0x1e73: 0xdd59, 0x1e74: 0xdd79, 0x1e75: 0xdd99,
+       0x1e76: 0xddb9, 0x1e77: 0xddd9, 0x1e78: 0x8dbd, 0x1e79: 0xddf9, 0x1e7a: 0xde19, 0x1e7b: 0xde39,
+       0x1e7c: 0xde59, 0x1e7d: 0xde79, 0x1e7e: 0x8ddd, 0x1e7f: 0xde99,
+       // Block 0x7a, offset 0x1e80
+       0x1e80: 0xe599, 0x1e81: 0xe5b9, 0x1e82: 0xe5d9, 0x1e83: 0xe5f9, 0x1e84: 0xe619, 0x1e85: 0xe639,
+       0x1e86: 0x8efd, 0x1e87: 0xe659, 0x1e88: 0xe679, 0x1e89: 0xe699, 0x1e8a: 0xe6b9, 0x1e8b: 0xe6d9,
+       0x1e8c: 0xe6f9, 0x1e8d: 0x8f1d, 0x1e8e: 0xe719, 0x1e8f: 0xe739, 0x1e90: 0x8f3d, 0x1e91: 0x8f5d,
+       0x1e92: 0xe759, 0x1e93: 0xe779, 0x1e94: 0xe799, 0x1e95: 0xe7b9, 0x1e96: 0xe7d9, 0x1e97: 0xe7f9,
+       0x1e98: 0xe819, 0x1e99: 0xe839, 0x1e9a: 0xe859, 0x1e9b: 0x8f7d, 0x1e9c: 0xe879, 0x1e9d: 0x8f9d,
+       0x1e9e: 0xe899, 0x1e9f: 0x2040, 0x1ea0: 0xe8b9, 0x1ea1: 0xe8d9, 0x1ea2: 0xe8f9, 0x1ea3: 0x8fbd,
+       0x1ea4: 0xe919, 0x1ea5: 0xe939, 0x1ea6: 0x8fdd, 0x1ea7: 0x8ffd, 0x1ea8: 0xe959, 0x1ea9: 0xe979,
+       0x1eaa: 0xe999, 0x1eab: 0xe9b9, 0x1eac: 0xe9d9, 0x1ead: 0xe9d9, 0x1eae: 0xe9f9, 0x1eaf: 0xea19,
+       0x1eb0: 0xea39, 0x1eb1: 0xea59, 0x1eb2: 0xea79, 0x1eb3: 0xea99, 0x1eb4: 0xeab9, 0x1eb5: 0x901d,
+       0x1eb6: 0xead9, 0x1eb7: 0x903d, 0x1eb8: 0xeaf9, 0x1eb9: 0x905d, 0x1eba: 0xeb19, 0x1ebb: 0x907d,
+       0x1ebc: 0x909d, 0x1ebd: 0x90bd, 0x1ebe: 0xeb39, 0x1ebf: 0xeb59,
+       // Block 0x7b, offset 0x1ec0
+       0x1ec0: 0xeb79, 0x1ec1: 0x90dd, 0x1ec2: 0x90fd, 0x1ec3: 0x911d, 0x1ec4: 0x913d, 0x1ec5: 0xeb99,
+       0x1ec6: 0xebb9, 0x1ec7: 0xebb9, 0x1ec8: 0xebd9, 0x1ec9: 0xebf9, 0x1eca: 0xec19, 0x1ecb: 0xec39,
+       0x1ecc: 0xec59, 0x1ecd: 0x915d, 0x1ece: 0xec79, 0x1ecf: 0xec99, 0x1ed0: 0xecb9, 0x1ed1: 0xecd9,
+       0x1ed2: 0x917d, 0x1ed3: 0xecf9, 0x1ed4: 0x919d, 0x1ed5: 0x91bd, 0x1ed6: 0xed19, 0x1ed7: 0xed39,
+       0x1ed8: 0xed59, 0x1ed9: 0xed79, 0x1eda: 0xed99, 0x1edb: 0xedb9, 0x1edc: 0x91dd, 0x1edd: 0x91fd,
+       0x1ede: 0x921d, 0x1edf: 0x2040, 0x1ee0: 0xedd9, 0x1ee1: 0x923d, 0x1ee2: 0xedf9, 0x1ee3: 0xee19,
+       0x1ee4: 0xee39, 0x1ee5: 0x925d, 0x1ee6: 0xee59, 0x1ee7: 0xee79, 0x1ee8: 0xee99, 0x1ee9: 0xeeb9,
+       0x1eea: 0xeed9, 0x1eeb: 0x927d, 0x1eec: 0xeef9, 0x1eed: 0xef19, 0x1eee: 0xef39, 0x1eef: 0xef59,
+       0x1ef0: 0xef79, 0x1ef1: 0xef99, 0x1ef2: 0x929d, 0x1ef3: 0x92bd, 0x1ef4: 0xefb9, 0x1ef5: 0x92dd,
+       0x1ef6: 0xefd9, 0x1ef7: 0x92fd, 0x1ef8: 0xeff9, 0x1ef9: 0xf019, 0x1efa: 0xf039, 0x1efb: 0x931d,
+       0x1efc: 0x933d, 0x1efd: 0xf059, 0x1efe: 0x935d, 0x1eff: 0xf079,
+       // Block 0x7c, offset 0x1f00
+       0x1f00: 0xf6b9, 0x1f01: 0xf6d9, 0x1f02: 0xf6f9, 0x1f03: 0xf719, 0x1f04: 0xf739, 0x1f05: 0x951d,
+       0x1f06: 0xf759, 0x1f07: 0xf779, 0x1f08: 0xf799, 0x1f09: 0xf7b9, 0x1f0a: 0xf7d9, 0x1f0b: 0x953d,
+       0x1f0c: 0x955d, 0x1f0d: 0xf7f9, 0x1f0e: 0xf819, 0x1f0f: 0xf839, 0x1f10: 0xf859, 0x1f11: 0xf879,
+       0x1f12: 0xf899, 0x1f13: 0x957d, 0x1f14: 0xf8b9, 0x1f15: 0xf8d9, 0x1f16: 0xf8f9, 0x1f17: 0xf919,
+       0x1f18: 0x959d, 0x1f19: 0x95bd, 0x1f1a: 0xf939, 0x1f1b: 0xf959, 0x1f1c: 0xf979, 0x1f1d: 0x95dd,
+       0x1f1e: 0xf999, 0x1f1f: 0xf9b9, 0x1f20: 0x6815, 0x1f21: 0x95fd, 0x1f22: 0xf9d9, 0x1f23: 0xf9f9,
+       0x1f24: 0xfa19, 0x1f25: 0x961d, 0x1f26: 0xfa39, 0x1f27: 0xfa59, 0x1f28: 0xfa79, 0x1f29: 0xfa99,
+       0x1f2a: 0xfab9, 0x1f2b: 0xfad9, 0x1f2c: 0xfaf9, 0x1f2d: 0x963d, 0x1f2e: 0xfb19, 0x1f2f: 0xfb39,
+       0x1f30: 0xfb59, 0x1f31: 0x965d, 0x1f32: 0xfb79, 0x1f33: 0xfb99, 0x1f34: 0xfbb9, 0x1f35: 0xfbd9,
+       0x1f36: 0x7b35, 0x1f37: 0x967d, 0x1f38: 0xfbf9, 0x1f39: 0xfc19, 0x1f3a: 0xfc39, 0x1f3b: 0x969d,
+       0x1f3c: 0xfc59, 0x1f3d: 0x96bd, 0x1f3e: 0xfc79, 0x1f3f: 0xfc79,
+       // Block 0x7d, offset 0x1f40
+       0x1f40: 0xfc99, 0x1f41: 0x96dd, 0x1f42: 0xfcb9, 0x1f43: 0xfcd9, 0x1f44: 0xfcf9, 0x1f45: 0xfd19,
+       0x1f46: 0xfd39, 0x1f47: 0xfd59, 0x1f48: 0xfd79, 0x1f49: 0x96fd, 0x1f4a: 0xfd99, 0x1f4b: 0xfdb9,
+       0x1f4c: 0xfdd9, 0x1f4d: 0xfdf9, 0x1f4e: 0xfe19, 0x1f4f: 0xfe39, 0x1f50: 0x971d, 0x1f51: 0xfe59,
+       0x1f52: 0x973d, 0x1f53: 0x975d, 0x1f54: 0x977d, 0x1f55: 0xfe79, 0x1f56: 0xfe99, 0x1f57: 0xfeb9,
+       0x1f58: 0xfed9, 0x1f59: 0xfef9, 0x1f5a: 0xff19, 0x1f5b: 0xff39, 0x1f5c: 0xff59, 0x1f5d: 0x979d,
+       0x1f5e: 0x0040, 0x1f5f: 0x0040, 0x1f60: 0x0040, 0x1f61: 0x0040, 0x1f62: 0x0040, 0x1f63: 0x0040,
+       0x1f64: 0x0040, 0x1f65: 0x0040, 0x1f66: 0x0040, 0x1f67: 0x0040, 0x1f68: 0x0040, 0x1f69: 0x0040,
+       0x1f6a: 0x0040, 0x1f6b: 0x0040, 0x1f6c: 0x0040, 0x1f6d: 0x0040, 0x1f6e: 0x0040, 0x1f6f: 0x0040,
+       0x1f70: 0x0040, 0x1f71: 0x0040, 0x1f72: 0x0040, 0x1f73: 0x0040, 0x1f74: 0x0040, 0x1f75: 0x0040,
+       0x1f76: 0x0040, 0x1f77: 0x0040, 0x1f78: 0x0040, 0x1f79: 0x0040, 0x1f7a: 0x0040, 0x1f7b: 0x0040,
+       0x1f7c: 0x0040, 0x1f7d: 0x0040, 0x1f7e: 0x0040, 0x1f7f: 0x0040,
+}
+
+// idnaIndex: 35 blocks, 2240 entries, 4480 bytes
+// Block 0 is the zero block.
+var idnaIndex = [2240]uint16{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x7c, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
+       0xc8: 0x06, 0xc9: 0x7d, 0xca: 0x7e, 0xcb: 0x07, 0xcc: 0x7f, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
+       0xd0: 0x80, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x81, 0xd6: 0x82, 0xd7: 0x83,
+       0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x84, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
+       0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,
+       0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20,
+       // Block 0x4, offset 0x100
+       0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x13, 0x126: 0x14, 0x127: 0x15,
+       0x128: 0x16, 0x129: 0x17, 0x12a: 0x18, 0x12b: 0x19, 0x12c: 0x1a, 0x12d: 0x1b, 0x12e: 0x1c, 0x12f: 0x8d,
+       0x130: 0x8e, 0x131: 0x1d, 0x132: 0x1e, 0x133: 0x1f, 0x134: 0x8f, 0x135: 0x20, 0x136: 0x90, 0x137: 0x91,
+       0x138: 0x92, 0x139: 0x93, 0x13a: 0x21, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x22, 0x13e: 0x23, 0x13f: 0x96,
+       // Block 0x5, offset 0x140
+       0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,
+       0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,
+       0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,
+       0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,
+       0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,
+       0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,
+       0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x24, 0x175: 0x25, 0x176: 0x26, 0x177: 0xc3,
+       0x178: 0x27, 0x179: 0x27, 0x17a: 0x28, 0x17b: 0x27, 0x17c: 0xc4, 0x17d: 0x29, 0x17e: 0x2a, 0x17f: 0x2b,
+       // Block 0x6, offset 0x180
+       0x180: 0x2c, 0x181: 0x2d, 0x182: 0x2e, 0x183: 0xc5, 0x184: 0x2f, 0x185: 0x30, 0x186: 0xc6, 0x187: 0x9b,
+       0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xca,
+       0x190: 0xcb, 0x191: 0x31, 0x192: 0x32, 0x193: 0x33, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
+       0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,
+       0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,
+       0x1a8: 0xcc, 0x1a9: 0xcd, 0x1aa: 0x9b, 0x1ab: 0xce, 0x1ac: 0x9b, 0x1ad: 0xcf, 0x1ae: 0xd0, 0x1af: 0xd1,
+       0x1b0: 0xd2, 0x1b1: 0x34, 0x1b2: 0x27, 0x1b3: 0x35, 0x1b4: 0xd3, 0x1b5: 0xd4, 0x1b6: 0xd5, 0x1b7: 0xd6,
+       0x1b8: 0xd7, 0x1b9: 0xd8, 0x1ba: 0xd9, 0x1bb: 0xda, 0x1bc: 0xdb, 0x1bd: 0xdc, 0x1be: 0xdd, 0x1bf: 0x36,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x37, 0x1c1: 0xde, 0x1c2: 0xdf, 0x1c3: 0xe0, 0x1c4: 0xe1, 0x1c5: 0x38, 0x1c6: 0x39, 0x1c7: 0xe2,
+       0x1c8: 0xe3, 0x1c9: 0x3a, 0x1ca: 0x3b, 0x1cb: 0x3c, 0x1cc: 0x3d, 0x1cd: 0x3e, 0x1ce: 0x3f, 0x1cf: 0x40,
+       0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,
+       0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,
+       0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,
+       0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,
+       0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,
+       0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,
+       0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,
+       0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,
+       0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,
+       0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,
+       0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,
+       0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,
+       0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,
+       // Block 0x9, offset 0x240
+       0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,
+       0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,
+       0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,
+       0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,
+       0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,
+       0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,
+       0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,
+       0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,
+       // Block 0xa, offset 0x280
+       0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,
+       0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,
+       0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,
+       0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,
+       0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,
+       0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,
+       0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,
+       0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe4,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,
+       0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,
+       0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe5, 0x2d3: 0xe6, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,
+       0x2d8: 0xe7, 0x2d9: 0x41, 0x2da: 0x42, 0x2db: 0xe8, 0x2dc: 0x43, 0x2dd: 0x44, 0x2de: 0x45, 0x2df: 0xe9,
+       0x2e0: 0xea, 0x2e1: 0xeb, 0x2e2: 0xec, 0x2e3: 0xed, 0x2e4: 0xee, 0x2e5: 0xef, 0x2e6: 0xf0, 0x2e7: 0xf1,
+       0x2e8: 0xf2, 0x2e9: 0xf3, 0x2ea: 0xf4, 0x2eb: 0xf5, 0x2ec: 0xf6, 0x2ed: 0xf7, 0x2ee: 0xf8, 0x2ef: 0xf9,
+       0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,
+       0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,
+       // Block 0xc, offset 0x300
+       0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,
+       0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,
+       0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,
+       0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xfa, 0x31f: 0xfb,
+       // Block 0xd, offset 0x340
+       0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,
+       0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,
+       0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,
+       0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,
+       0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,
+       0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,
+       0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,
+       0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,
+       // Block 0xe, offset 0x380
+       0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,
+       0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,
+       0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,
+       0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,
+       0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfc, 0x3a5: 0xfd, 0x3a6: 0xfe, 0x3a7: 0xff,
+       0x3a8: 0x46, 0x3a9: 0x100, 0x3aa: 0x101, 0x3ab: 0x47, 0x3ac: 0x48, 0x3ad: 0x49, 0x3ae: 0x4a, 0x3af: 0x4b,
+       0x3b0: 0x102, 0x3b1: 0x4c, 0x3b2: 0x4d, 0x3b3: 0x4e, 0x3b4: 0x4f, 0x3b5: 0x50, 0x3b6: 0x103, 0x3b7: 0x51,
+       0x3b8: 0x52, 0x3b9: 0x53, 0x3ba: 0x54, 0x3bb: 0x55, 0x3bc: 0x56, 0x3bd: 0x57, 0x3be: 0x58, 0x3bf: 0x59,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x104, 0x3c1: 0x105, 0x3c2: 0x9f, 0x3c3: 0x106, 0x3c4: 0x107, 0x3c5: 0x9b, 0x3c6: 0x108, 0x3c7: 0x109,
+       0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x10a, 0x3cb: 0x10b, 0x3cc: 0x10c, 0x3cd: 0x10d, 0x3ce: 0x10e, 0x3cf: 0x10f,
+       0x3d0: 0x110, 0x3d1: 0x9f, 0x3d2: 0x111, 0x3d3: 0x112, 0x3d4: 0x113, 0x3d5: 0x114, 0x3d6: 0xba, 0x3d7: 0xba,
+       0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x115, 0x3dd: 0x116, 0x3de: 0xba, 0x3df: 0xba,
+       0x3e0: 0x117, 0x3e1: 0x118, 0x3e2: 0x119, 0x3e3: 0x11a, 0x3e4: 0x11b, 0x3e5: 0xba, 0x3e6: 0x11c, 0x3e7: 0x11d,
+       0x3e8: 0x11e, 0x3e9: 0x11f, 0x3ea: 0x120, 0x3eb: 0x5a, 0x3ec: 0x121, 0x3ed: 0x122, 0x3ee: 0x5b, 0x3ef: 0xba,
+       0x3f0: 0x123, 0x3f1: 0x124, 0x3f2: 0x125, 0x3f3: 0x126, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,
+       0x3f8: 0xba, 0x3f9: 0x127, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba,
+       // Block 0x10, offset 0x400
+       0x400: 0x128, 0x401: 0x129, 0x402: 0x12a, 0x403: 0x12b, 0x404: 0x12c, 0x405: 0x12d, 0x406: 0x12e, 0x407: 0x12f,
+       0x408: 0x130, 0x409: 0xba, 0x40a: 0x131, 0x40b: 0x132, 0x40c: 0x5c, 0x40d: 0x5d, 0x40e: 0xba, 0x40f: 0xba,
+       0x410: 0x133, 0x411: 0x134, 0x412: 0x135, 0x413: 0x136, 0x414: 0xba, 0x415: 0xba, 0x416: 0x137, 0x417: 0x138,
+       0x418: 0x139, 0x419: 0x13a, 0x41a: 0x13b, 0x41b: 0x13c, 0x41c: 0x13d, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,
+       0x420: 0xba, 0x421: 0xba, 0x422: 0x13e, 0x423: 0x13f, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,
+       0x428: 0xba, 0x429: 0xba, 0x42a: 0xba, 0x42b: 0x140, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,
+       0x430: 0x141, 0x431: 0x142, 0x432: 0x143, 0x433: 0xba, 0x434: 0xba, 0x435: 0xba, 0x436: 0xba, 0x437: 0xba,
+       0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,
+       // Block 0x11, offset 0x440
+       0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,
+       0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x144, 0x44f: 0xba,
+       0x450: 0x9b, 0x451: 0x145, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x146, 0x456: 0xba, 0x457: 0xba,
+       0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,
+       0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,
+       0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,
+       0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,
+       0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,
+       // Block 0x12, offset 0x480
+       0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,
+       0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,
+       0x490: 0x147, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,
+       0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,
+       0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,
+       0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,
+       0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,
+       0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,
+       0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,
+       0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,
+       0x4d8: 0x9f, 0x4d9: 0x148, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,
+       0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,
+       0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,
+       0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,
+       0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,
+       // Block 0x14, offset 0x500
+       0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,
+       0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,
+       0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,
+       0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,
+       0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,
+       0x528: 0x140, 0x529: 0x149, 0x52a: 0xba, 0x52b: 0x14a, 0x52c: 0x14b, 0x52d: 0x14c, 0x52e: 0x14d, 0x52f: 0xba,
+       0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,
+       0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x14e, 0x53e: 0x14f, 0x53f: 0x150,
+       // Block 0x15, offset 0x540
+       0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,
+       0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,
+       0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,
+       0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x151,
+       0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,
+       0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x152, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,
+       0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,
+       0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,
+       // Block 0x16, offset 0x580
+       0x580: 0x153, 0x581: 0xba, 0x582: 0xba, 0x583: 0xba, 0x584: 0xba, 0x585: 0xba, 0x586: 0xba, 0x587: 0xba,
+       0x588: 0xba, 0x589: 0xba, 0x58a: 0xba, 0x58b: 0xba, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,
+       0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,
+       0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,
+       0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,
+       0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,
+       0x5b0: 0x9f, 0x5b1: 0x154, 0x5b2: 0x155, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,
+       0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x156, 0x5c4: 0x157, 0x5c5: 0x158, 0x5c6: 0x159, 0x5c7: 0x15a,
+       0x5c8: 0x9b, 0x5c9: 0x15b, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x15c, 0x5ce: 0xba, 0x5cf: 0xba,
+       0x5d0: 0x5e, 0x5d1: 0x5f, 0x5d2: 0x60, 0x5d3: 0x61, 0x5d4: 0x62, 0x5d5: 0x63, 0x5d6: 0x64, 0x5d7: 0x65,
+       0x5d8: 0x66, 0x5d9: 0x67, 0x5da: 0x68, 0x5db: 0x69, 0x5dc: 0x6a, 0x5dd: 0x6b, 0x5de: 0x6c, 0x5df: 0x6d,
+       0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,
+       0x5e8: 0x15d, 0x5e9: 0x15e, 0x5ea: 0x15f, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,
+       0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,
+       0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,
+       // Block 0x18, offset 0x600
+       0x600: 0x160, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,
+       0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,
+       0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,
+       0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,
+       0x620: 0x123, 0x621: 0x123, 0x622: 0x123, 0x623: 0x161, 0x624: 0x6e, 0x625: 0x162, 0x626: 0xba, 0x627: 0xba,
+       0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,
+       0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,
+       0x638: 0x6f, 0x639: 0x70, 0x63a: 0x71, 0x63b: 0x163, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,
+       // Block 0x19, offset 0x640
+       0x640: 0x164, 0x641: 0x9b, 0x642: 0x165, 0x643: 0x166, 0x644: 0x72, 0x645: 0x73, 0x646: 0x167, 0x647: 0x168,
+       0x648: 0x74, 0x649: 0x169, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
+       0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,
+       0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x16a, 0x65c: 0x9b, 0x65d: 0x16b, 0x65e: 0x9b, 0x65f: 0x16c,
+       0x660: 0x16d, 0x661: 0x16e, 0x662: 0x16f, 0x663: 0xba, 0x664: 0x170, 0x665: 0x171, 0x666: 0x172, 0x667: 0x173,
+       0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,
+       0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,
+       0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,
+       // Block 0x1a, offset 0x680
+       0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,
+       0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,
+       0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,
+       0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x174, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,
+       0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,
+       0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,
+       0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,
+       0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,
+       0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,
+       0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,
+       0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x175, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,
+       0x6e0: 0x176, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,
+       0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,
+       0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,
+       0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,
+       // Block 0x1c, offset 0x700
+       0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,
+       0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,
+       0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,
+       0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,
+       0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,
+       0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,
+       0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,
+       0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x177, 0x73b: 0xba, 0x73c: 0xba, 0x73d: 0xba, 0x73e: 0xba, 0x73f: 0xba,
+       // Block 0x1d, offset 0x740
+       0x740: 0xba, 0x741: 0xba, 0x742: 0xba, 0x743: 0xba, 0x744: 0xba, 0x745: 0xba, 0x746: 0xba, 0x747: 0xba,
+       0x748: 0xba, 0x749: 0xba, 0x74a: 0xba, 0x74b: 0xba, 0x74c: 0xba, 0x74d: 0xba, 0x74e: 0xba, 0x74f: 0xba,
+       0x750: 0xba, 0x751: 0xba, 0x752: 0xba, 0x753: 0xba, 0x754: 0xba, 0x755: 0xba, 0x756: 0xba, 0x757: 0xba,
+       0x758: 0xba, 0x759: 0xba, 0x75a: 0xba, 0x75b: 0xba, 0x75c: 0xba, 0x75d: 0xba, 0x75e: 0xba, 0x75f: 0xba,
+       0x760: 0x75, 0x761: 0x76, 0x762: 0x77, 0x763: 0x178, 0x764: 0x78, 0x765: 0x79, 0x766: 0x179, 0x767: 0x7a,
+       0x768: 0x7b, 0x769: 0xba, 0x76a: 0xba, 0x76b: 0xba, 0x76c: 0xba, 0x76d: 0xba, 0x76e: 0xba, 0x76f: 0xba,
+       0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,
+       0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,
+       // Block 0x1e, offset 0x780
+       0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07,
+       0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17,
+       0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07,
+       0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b,
+       0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b,
+       0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b,
+       0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b,
+       0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b,
+       0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b,
+       0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b,
+       0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b,
+       0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,
+       0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,
+       // Block 0x20, offset 0x800
+       0x800: 0x17a, 0x801: 0x17b, 0x802: 0xba, 0x803: 0xba, 0x804: 0x17c, 0x805: 0x17c, 0x806: 0x17c, 0x807: 0x17d,
+       0x808: 0xba, 0x809: 0xba, 0x80a: 0xba, 0x80b: 0xba, 0x80c: 0xba, 0x80d: 0xba, 0x80e: 0xba, 0x80f: 0xba,
+       0x810: 0xba, 0x811: 0xba, 0x812: 0xba, 0x813: 0xba, 0x814: 0xba, 0x815: 0xba, 0x816: 0xba, 0x817: 0xba,
+       0x818: 0xba, 0x819: 0xba, 0x81a: 0xba, 0x81b: 0xba, 0x81c: 0xba, 0x81d: 0xba, 0x81e: 0xba, 0x81f: 0xba,
+       0x820: 0xba, 0x821: 0xba, 0x822: 0xba, 0x823: 0xba, 0x824: 0xba, 0x825: 0xba, 0x826: 0xba, 0x827: 0xba,
+       0x828: 0xba, 0x829: 0xba, 0x82a: 0xba, 0x82b: 0xba, 0x82c: 0xba, 0x82d: 0xba, 0x82e: 0xba, 0x82f: 0xba,
+       0x830: 0xba, 0x831: 0xba, 0x832: 0xba, 0x833: 0xba, 0x834: 0xba, 0x835: 0xba, 0x836: 0xba, 0x837: 0xba,
+       0x838: 0xba, 0x839: 0xba, 0x83a: 0xba, 0x83b: 0xba, 0x83c: 0xba, 0x83d: 0xba, 0x83e: 0xba, 0x83f: 0xba,
+       // Block 0x21, offset 0x840
+       0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b,
+       0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b,
+       0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b,
+       0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b,
+       0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b,
+       0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b,
+       0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b,
+       0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b,
+       // Block 0x22, offset 0x880
+       0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,
+       0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,
+}
+
+// idnaSparseOffset: 258 entries, 516 bytes
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x93, 0x98, 0xa1, 0xb1, 0xbf, 0xcc, 0xd8, 0xe9, 0xf3, 0xfa, 0x107, 0x118, 0x11f, 0x12a, 0x139, 0x147, 0x151, 0x153, 0x158, 0x15b, 0x15e, 0x160, 0x16c, 0x177, 0x17f, 0x185, 0x18b, 0x190, 0x195, 0x198, 0x19c, 0x1a2, 0x1a7, 0x1b3, 0x1bd, 0x1c3, 0x1d4, 0x1de, 0x1e1, 0x1e9, 0x1ec, 0x1f9, 0x201, 0x205, 0x20c, 0x214, 0x224, 0x230, 0x232, 0x23c, 0x248, 0x254, 0x260, 0x268, 0x26d, 0x277, 0x288, 0x28c, 0x297, 0x29b, 0x2a4, 0x2ac, 0x2b2, 0x2b7, 0x2ba, 0x2bd, 0x2c1, 0x2c7, 0x2cb, 0x2cf, 0x2d5, 0x2dc, 0x2e2, 0x2ea, 0x2f1, 0x2fc, 0x306, 0x30a, 0x30d, 0x313, 0x317, 0x319, 0x31c, 0x31e, 0x321, 0x32b, 0x32e, 0x33d, 0x341, 0x346, 0x349, 0x34d, 0x352, 0x357, 0x35d, 0x363, 0x372, 0x378, 0x37c, 0x38b, 0x390, 0x398, 0x3a2, 0x3ad, 0x3b5, 0x3c6, 0x3cf, 0x3df, 0x3ec, 0x3f6, 0x3fb, 0x408, 0x40c, 0x411, 0x413, 0x417, 0x419, 0x41d, 0x426, 0x42c, 0x430, 0x440, 0x44a, 0x44f, 0x452, 0x458, 0x45f, 0x464, 0x468, 0x46e, 0x473, 0x47c, 0x481, 0x487, 0x48e, 0x495, 0x49c, 0x4a0, 0x4a5, 0x4a8, 0x4ad, 0x4b9, 0x4bf, 0x4c4, 0x4cb, 0x4d3, 0x4d8, 0x4dc, 0x4ec, 0x4f3, 0x4f7, 0x4fb, 0x502, 0x504, 0x507, 0x50a, 0x50e, 0x512, 0x518, 0x521, 0x52d, 0x534, 0x53d, 0x545, 0x54c, 0x55a, 0x567, 0x574, 0x57d, 0x581, 0x58f, 0x597, 0x5a2, 0x5ab, 0x5b1, 0x5b9, 0x5c2, 0x5cc, 0x5cf, 0x5db, 0x5de, 0x5e3, 0x5e6, 0x5f0, 0x5f9, 0x605, 0x608, 0x60d, 0x610, 0x613, 0x616, 0x61d, 0x624, 0x628, 0x633, 0x636, 0x63c, 0x641, 0x645, 0x648, 0x64b, 0x64e, 0x653, 0x65d, 0x660, 0x664, 0x673, 0x67f, 0x683, 0x688, 0x68d, 0x691, 0x696, 0x69f, 0x6aa, 0x6b0, 0x6b8, 0x6bc, 0x6c0, 0x6c6, 0x6cc, 0x6d1, 0x6d4, 0x6e2, 0x6e9, 0x6ec, 0x6ef, 0x6f3, 0x6f9, 0x6fe, 0x708, 0x70d, 0x710, 0x713, 0x716, 0x719, 0x71d, 0x720, 0x730, 0x741, 0x746, 0x748, 0x74a}
+
+// idnaSparseValues: 1869 entries, 7476 bytes
+var idnaSparseValues = [1869]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x07},
+       {value: 0xe105, lo: 0x80, hi: 0x96},
+       {value: 0x0018, lo: 0x97, hi: 0x97},
+       {value: 0xe105, lo: 0x98, hi: 0x9e},
+       {value: 0x001f, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbf},
+       // Block 0x1, offset 0x8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0xe01d, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0335, lo: 0x83, hi: 0x83},
+       {value: 0x034d, lo: 0x84, hi: 0x84},
+       {value: 0x0365, lo: 0x85, hi: 0x85},
+       {value: 0xe00d, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0xe00d, lo: 0x88, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x89},
+       {value: 0xe00d, lo: 0x8a, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe00d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0x8d},
+       {value: 0xe00d, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0xbf},
+       // Block 0x2, offset 0x19
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x0249, lo: 0xb0, hi: 0xb0},
+       {value: 0x037d, lo: 0xb1, hi: 0xb1},
+       {value: 0x0259, lo: 0xb2, hi: 0xb2},
+       {value: 0x0269, lo: 0xb3, hi: 0xb3},
+       {value: 0x034d, lo: 0xb4, hi: 0xb4},
+       {value: 0x0395, lo: 0xb5, hi: 0xb5},
+       {value: 0xe1bd, lo: 0xb6, hi: 0xb6},
+       {value: 0x0279, lo: 0xb7, hi: 0xb7},
+       {value: 0x0289, lo: 0xb8, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbf},
+       // Block 0x3, offset 0x25
+       {value: 0x0000, lo: 0x01},
+       {value: 0x3308, lo: 0x80, hi: 0xbf},
+       // Block 0x4, offset 0x27
+       {value: 0x0000, lo: 0x04},
+       {value: 0x03f5, lo: 0x80, hi: 0x8f},
+       {value: 0xe105, lo: 0x90, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x5, offset 0x2c
+       {value: 0x0000, lo: 0x07},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x0545, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x0008, lo: 0x99, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xbf},
+       // Block 0x6, offset 0x34
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0401, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x88},
+       {value: 0x0018, lo: 0x89, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x3308, lo: 0x91, hi: 0xbd},
+       {value: 0x0818, lo: 0xbe, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x7, offset 0x3f
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0818, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x82},
+       {value: 0x0818, lo: 0x83, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x85},
+       {value: 0x0818, lo: 0x86, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0808, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x8, offset 0x4b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0a08, lo: 0x80, hi: 0x87},
+       {value: 0x0c08, lo: 0x88, hi: 0x99},
+       {value: 0x0a08, lo: 0x9a, hi: 0xbf},
+       // Block 0x9, offset 0x4f
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3308, lo: 0x80, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8c},
+       {value: 0x0c08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0a08, lo: 0x8e, hi: 0x98},
+       {value: 0x0c08, lo: 0x99, hi: 0x9b},
+       {value: 0x0a08, lo: 0x9c, hi: 0xaa},
+       {value: 0x0c08, lo: 0xab, hi: 0xac},
+       {value: 0x0a08, lo: 0xad, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb1},
+       {value: 0x0a08, lo: 0xb2, hi: 0xb2},
+       {value: 0x0c08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0a08, lo: 0xb5, hi: 0xb7},
+       {value: 0x0c08, lo: 0xb8, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbf},
+       // Block 0xa, offset 0x5e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xb0},
+       {value: 0x0808, lo: 0xb1, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xb, offset 0x63
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x89},
+       {value: 0x0a08, lo: 0x8a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0xc, offset 0x6b
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x99},
+       {value: 0x0808, lo: 0x9a, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa3},
+       {value: 0x0808, lo: 0xa4, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa7},
+       {value: 0x0808, lo: 0xa8, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0818, lo: 0xb0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xd, offset 0x77
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0c08, lo: 0x80, hi: 0x80},
+       {value: 0x0a08, lo: 0x81, hi: 0x85},
+       {value: 0x0c08, lo: 0x86, hi: 0x87},
+       {value: 0x0a08, lo: 0x88, hi: 0x88},
+       {value: 0x0c08, lo: 0x89, hi: 0x89},
+       {value: 0x0a08, lo: 0x8a, hi: 0x93},
+       {value: 0x0c08, lo: 0x94, hi: 0x94},
+       {value: 0x0a08, lo: 0x95, hi: 0x95},
+       {value: 0x0808, lo: 0x96, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9d},
+       {value: 0x0818, lo: 0x9e, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xbf},
+       // Block 0xe, offset 0x85
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0a08, lo: 0xa0, hi: 0xa9},
+       {value: 0x0c08, lo: 0xaa, hi: 0xac},
+       {value: 0x0808, lo: 0xad, hi: 0xad},
+       {value: 0x0c08, lo: 0xae, hi: 0xae},
+       {value: 0x0a08, lo: 0xaf, hi: 0xb0},
+       {value: 0x0c08, lo: 0xb1, hi: 0xb2},
+       {value: 0x0a08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0a08, lo: 0xb6, hi: 0xb8},
+       {value: 0x0c08, lo: 0xb9, hi: 0xb9},
+       {value: 0x0a08, lo: 0xba, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0xf, offset 0x93
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x93},
+       {value: 0x3308, lo: 0x94, hi: 0xa1},
+       {value: 0x0840, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xbf},
+       // Block 0x10, offset 0x98
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x11, offset 0xa1
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x85},
+       {value: 0x3008, lo: 0x86, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x3008, lo: 0x8a, hi: 0x8c},
+       {value: 0x3b08, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x12, offset 0xb1
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xa9},
+       {value: 0x0008, lo: 0xaa, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x13, offset 0xbf
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x14, offset 0xcc
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0040, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x15, offset 0xd8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x89},
+       {value: 0x3b08, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x3008, lo: 0x98, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x16, offset 0xe9
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb2},
+       {value: 0x08f1, lo: 0xb3, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb9},
+       {value: 0x3b08, lo: 0xba, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x0018, lo: 0xbf, hi: 0xbf},
+       // Block 0x17, offset 0xf3
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x8e},
+       {value: 0x0018, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0xbf},
+       // Block 0x18, offset 0xfa
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0961, lo: 0x9c, hi: 0x9c},
+       {value: 0x0999, lo: 0x9d, hi: 0x9d},
+       {value: 0x0008, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x19, offset 0x107
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8a},
+       {value: 0x0008, lo: 0x8b, hi: 0x8b},
+       {value: 0xe03d, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x1a, offset 0x118
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0xbf},
+       // Block 0x1b, offset 0x11f
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x1c, offset 0x12a
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x3008, lo: 0x96, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x3308, lo: 0x9e, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3008, lo: 0xa2, hi: 0xa4},
+       {value: 0x0008, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xbf},
+       // Block 0x1d, offset 0x139
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x8c},
+       {value: 0x3308, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x8e},
+       {value: 0x3008, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x3008, lo: 0x9a, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0x1e, offset 0x147
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x86},
+       {value: 0x055d, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8c},
+       {value: 0x055d, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbb},
+       {value: 0xe105, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0x1f, offset 0x151
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0018, lo: 0x80, hi: 0xbf},
+       // Block 0x20, offset 0x153
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa0},
+       {value: 0x2018, lo: 0xa1, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x21, offset 0x158
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa7},
+       {value: 0x2018, lo: 0xa8, hi: 0xbf},
+       // Block 0x22, offset 0x15b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2018, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0xbf},
+       // Block 0x23, offset 0x15e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0008, lo: 0x80, hi: 0xbf},
+       // Block 0x24, offset 0x160
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x99},
+       {value: 0x0008, lo: 0x9a, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x25, offset 0x16c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x26, offset 0x177
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x27, offset 0x17f
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0x0008, lo: 0x92, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbf},
+       // Block 0x28, offset 0x185
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x29, offset 0x18b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x2a, offset 0x190
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x2b, offset 0x195
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x2c, offset 0x198
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xbf},
+       // Block 0x2d, offset 0x19c
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x2e, offset 0x1a2
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0x2f, offset 0x1a7
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8d},
+       {value: 0x0008, lo: 0x8e, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x3b08, lo: 0x94, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x30, offset 0x1b3
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x31, offset 0x1bd
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xb3},
+       {value: 0x3340, lo: 0xb4, hi: 0xb5},
+       {value: 0x3008, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbf},
+       // Block 0x32, offset 0x1c3
+       {value: 0x0000, lo: 0x10},
+       {value: 0x3008, lo: 0x80, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x3008, lo: 0x87, hi: 0x88},
+       {value: 0x3308, lo: 0x89, hi: 0x91},
+       {value: 0x3b08, lo: 0x92, hi: 0x92},
+       {value: 0x3308, lo: 0x93, hi: 0x93},
+       {value: 0x0018, lo: 0x94, hi: 0x96},
+       {value: 0x0008, lo: 0x97, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x33, offset 0x1d4
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0018, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x86},
+       {value: 0x0218, lo: 0x87, hi: 0x87},
+       {value: 0x0018, lo: 0x88, hi: 0x8a},
+       {value: 0x33c0, lo: 0x8b, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0208, lo: 0xa0, hi: 0xbf},
+       // Block 0x34, offset 0x1de
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0208, lo: 0x80, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x35, offset 0x1e1
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0208, lo: 0x87, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xa9},
+       {value: 0x0208, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x36, offset 0x1e9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0x37, offset 0x1ec
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb8},
+       {value: 0x3308, lo: 0xb9, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x38, offset 0x1f9
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0008, lo: 0x86, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0x39, offset 0x201
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x3a, offset 0x205
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0028, lo: 0x9a, hi: 0x9a},
+       {value: 0x0040, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0xbf},
+       // Block 0x3b, offset 0x20c
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x3308, lo: 0x97, hi: 0x98},
+       {value: 0x3008, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x3c, offset 0x214
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x94},
+       {value: 0x3008, lo: 0x95, hi: 0x95},
+       {value: 0x3308, lo: 0x96, hi: 0x96},
+       {value: 0x3008, lo: 0x97, hi: 0x97},
+       {value: 0x3308, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3b08, lo: 0xa0, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xac},
+       {value: 0x3008, lo: 0xad, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x224
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xbd},
+       {value: 0x3318, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x3e, offset 0x230
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0040, lo: 0x80, hi: 0xbf},
+       // Block 0x3f, offset 0x232
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x83},
+       {value: 0x3008, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x40, offset 0x23c
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x3808, lo: 0x84, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x41, offset 0x248
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3808, lo: 0xaa, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xbf},
+       // Block 0x42, offset 0x254
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa9},
+       {value: 0x3008, lo: 0xaa, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3808, lo: 0xb2, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbf},
+       // Block 0x43, offset 0x260
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x3008, lo: 0xa4, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbf},
+       // Block 0x44, offset 0x268
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x45, offset 0x26d
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0e29, lo: 0x80, hi: 0x80},
+       {value: 0x0e41, lo: 0x81, hi: 0x81},
+       {value: 0x0e59, lo: 0x82, hi: 0x82},
+       {value: 0x0e71, lo: 0x83, hi: 0x83},
+       {value: 0x0e89, lo: 0x84, hi: 0x85},
+       {value: 0x0ea1, lo: 0x86, hi: 0x86},
+       {value: 0x0eb9, lo: 0x87, hi: 0x87},
+       {value: 0x057d, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0x46, offset 0x277
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x92},
+       {value: 0x0018, lo: 0x93, hi: 0x93},
+       {value: 0x3308, lo: 0x94, hi: 0xa0},
+       {value: 0x3008, lo: 0xa1, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa8},
+       {value: 0x0008, lo: 0xa9, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x0008, lo: 0xae, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x47, offset 0x288
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0x48, offset 0x28c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x87},
+       {value: 0xe045, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0xe045, lo: 0x98, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0xe045, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb7},
+       {value: 0xe045, lo: 0xb8, hi: 0xbf},
+       // Block 0x49, offset 0x297
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x3318, lo: 0x90, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbf},
+       // Block 0x4a, offset 0x29b
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x88},
+       {value: 0x24c1, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x4b, offset 0x2a4
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x24f1, lo: 0xac, hi: 0xac},
+       {value: 0x2529, lo: 0xad, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xae},
+       {value: 0x2579, lo: 0xaf, hi: 0xaf},
+       {value: 0x25b1, lo: 0xb0, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0x4c, offset 0x2ac
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x9f},
+       {value: 0x0080, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xad},
+       {value: 0x0080, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x4d, offset 0x2b2
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xa8},
+       {value: 0x09c5, lo: 0xa9, hi: 0xa9},
+       {value: 0x09e5, lo: 0xaa, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xbf},
+       // Block 0x4e, offset 0x2b7
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x4f, offset 0x2ba
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xbf},
+       // Block 0x50, offset 0x2bd
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x28c1, lo: 0x8c, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0xbf},
+       // Block 0x51, offset 0x2c1
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0e66, lo: 0xb4, hi: 0xb4},
+       {value: 0x292a, lo: 0xb5, hi: 0xb5},
+       {value: 0x0e86, lo: 0xb6, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x52, offset 0x2c7
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x9b},
+       {value: 0x2941, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0xbf},
+       // Block 0x53, offset 0x2cb
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0x54, offset 0x2cf
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0018, lo: 0x98, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbc},
+       {value: 0x0018, lo: 0xbd, hi: 0xbf},
+       // Block 0x55, offset 0x2d5
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0xab},
+       {value: 0x0018, lo: 0xac, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x56, offset 0x2dc
+       {value: 0x0000, lo: 0x05},
+       {value: 0xe185, lo: 0x80, hi: 0x8f},
+       {value: 0x03f5, lo: 0x90, hi: 0x9f},
+       {value: 0x0ea5, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x57, offset 0x2e2
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xa6},
+       {value: 0x0008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xac},
+       {value: 0x0008, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x58, offset 0x2ea
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xae},
+       {value: 0xe075, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0x59, offset 0x2f1
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x0008, lo: 0xb8, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x5a, offset 0x2fc
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xbf},
+       // Block 0x5b, offset 0x306
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0008, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x5c, offset 0x30a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0xbf},
+       // Block 0x5d, offset 0x30d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9e},
+       {value: 0x0edd, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0x5e, offset 0x313
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xb2},
+       {value: 0x0efd, lo: 0xb3, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0x5f, offset 0x317
+       {value: 0x0020, lo: 0x01},
+       {value: 0x0f1d, lo: 0x80, hi: 0xbf},
+       // Block 0x60, offset 0x319
+       {value: 0x0020, lo: 0x02},
+       {value: 0x171d, lo: 0x80, hi: 0x8f},
+       {value: 0x18fd, lo: 0x90, hi: 0xbf},
+       // Block 0x61, offset 0x31c
+       {value: 0x0020, lo: 0x01},
+       {value: 0x1efd, lo: 0x80, hi: 0xbf},
+       // Block 0x62, offset 0x31e
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0xbf},
+       // Block 0x63, offset 0x321
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x98},
+       {value: 0x3308, lo: 0x99, hi: 0x9a},
+       {value: 0x29e2, lo: 0x9b, hi: 0x9b},
+       {value: 0x2a0a, lo: 0x9c, hi: 0x9c},
+       {value: 0x0008, lo: 0x9d, hi: 0x9e},
+       {value: 0x2a31, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0008, lo: 0xa1, hi: 0xbf},
+       // Block 0x64, offset 0x32b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xbe},
+       {value: 0x2a69, lo: 0xbf, hi: 0xbf},
+       // Block 0x65, offset 0x32e
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0040, lo: 0x80, hi: 0x84},
+       {value: 0x0008, lo: 0x85, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xb0},
+       {value: 0x2a1d, lo: 0xb1, hi: 0xb1},
+       {value: 0x2a3d, lo: 0xb2, hi: 0xb2},
+       {value: 0x2a5d, lo: 0xb3, hi: 0xb3},
+       {value: 0x2a7d, lo: 0xb4, hi: 0xb4},
+       {value: 0x2a5d, lo: 0xb5, hi: 0xb5},
+       {value: 0x2a9d, lo: 0xb6, hi: 0xb6},
+       {value: 0x2abd, lo: 0xb7, hi: 0xb7},
+       {value: 0x2add, lo: 0xb8, hi: 0xb9},
+       {value: 0x2afd, lo: 0xba, hi: 0xbb},
+       {value: 0x2b1d, lo: 0xbc, hi: 0xbd},
+       {value: 0x2afd, lo: 0xbe, hi: 0xbf},
+       // Block 0x66, offset 0x33d
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x67, offset 0x341
+       {value: 0x0030, lo: 0x04},
+       {value: 0x2aa2, lo: 0x80, hi: 0x9d},
+       {value: 0x305a, lo: 0x9e, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x30a2, lo: 0xa0, hi: 0xbf},
+       // Block 0x68, offset 0x346
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0xbf},
+       // Block 0x69, offset 0x349
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0040, lo: 0x8d, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0x6a, offset 0x34d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0x6b, offset 0x352
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xbf},
+       // Block 0x6c, offset 0x357
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb1},
+       {value: 0x0018, lo: 0xb2, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x6d, offset 0x35d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0xb6},
+       {value: 0x0008, lo: 0xb7, hi: 0xb7},
+       {value: 0x2009, lo: 0xb8, hi: 0xb8},
+       {value: 0x6e89, lo: 0xb9, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xbf},
+       // Block 0x6e, offset 0x363
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x3308, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x3308, lo: 0x8b, hi: 0x8b},
+       {value: 0x0008, lo: 0x8c, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa6},
+       {value: 0x3008, lo: 0xa7, hi: 0xa7},
+       {value: 0x0018, lo: 0xa8, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x6f, offset 0x372
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0208, lo: 0x80, hi: 0xb1},
+       {value: 0x0108, lo: 0xb2, hi: 0xb2},
+       {value: 0x0008, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0x70, offset 0x378
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xbf},
+       // Block 0x71, offset 0x37c
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x3008, lo: 0x80, hi: 0x83},
+       {value: 0x3b08, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8d},
+       {value: 0x0018, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xba},
+       {value: 0x0008, lo: 0xbb, hi: 0xbb},
+       {value: 0x0018, lo: 0xbc, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x72, offset 0x38b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x73, offset 0x390
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x3308, lo: 0x87, hi: 0x91},
+       {value: 0x3008, lo: 0x92, hi: 0x92},
+       {value: 0x3808, lo: 0x93, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0x74, offset 0x398
+       {value: 0x0000, lo: 0x09},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x3008, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb9},
+       {value: 0x3008, lo: 0xba, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbf},
+       // Block 0x75, offset 0x3a2
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0x76, offset 0x3ad
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xa8},
+       {value: 0x3308, lo: 0xa9, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb0},
+       {value: 0x3308, lo: 0xb1, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x77, offset 0x3b5
+       {value: 0x0000, lo: 0x10},
+       {value: 0x0008, lo: 0x80, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8c},
+       {value: 0x3008, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xb9},
+       {value: 0x0008, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbc},
+       {value: 0x3008, lo: 0xbd, hi: 0xbd},
+       {value: 0x0008, lo: 0xbe, hi: 0xbf},
+       // Block 0x78, offset 0x3c6
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb0},
+       {value: 0x0008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb4},
+       {value: 0x0008, lo: 0xb5, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb8},
+       {value: 0x0008, lo: 0xb9, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbf},
+       // Block 0x79, offset 0x3cf
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x9a},
+       {value: 0x0008, lo: 0x9b, hi: 0x9d},
+       {value: 0x0018, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xaa},
+       {value: 0x3008, lo: 0xab, hi: 0xab},
+       {value: 0x3308, lo: 0xac, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb5},
+       {value: 0x3b08, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x7a, offset 0x3df
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x88},
+       {value: 0x0008, lo: 0x89, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x90},
+       {value: 0x0008, lo: 0x91, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x7b, offset 0x3ec
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x4465, lo: 0x9c, hi: 0x9c},
+       {value: 0x447d, lo: 0x9d, hi: 0x9d},
+       {value: 0x2971, lo: 0x9e, hi: 0x9e},
+       {value: 0xe06d, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa5},
+       {value: 0x0040, lo: 0xa6, hi: 0xaf},
+       {value: 0x4495, lo: 0xb0, hi: 0xbf},
+       // Block 0x7c, offset 0x3f6
+       {value: 0x0000, lo: 0x04},
+       {value: 0x44b5, lo: 0x80, hi: 0x8f},
+       {value: 0x44d5, lo: 0x90, hi: 0x9f},
+       {value: 0x44f5, lo: 0xa0, hi: 0xaf},
+       {value: 0x44d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x7d, offset 0x3fb
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0xa2},
+       {value: 0x3008, lo: 0xa3, hi: 0xa4},
+       {value: 0x3308, lo: 0xa5, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa7},
+       {value: 0x3308, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xaa},
+       {value: 0x0018, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3b08, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0x7e, offset 0x408
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0x7f, offset 0x40c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x80, offset 0x411
+       {value: 0x0020, lo: 0x01},
+       {value: 0x4515, lo: 0x80, hi: 0xbf},
+       // Block 0x81, offset 0x413
+       {value: 0x0020, lo: 0x03},
+       {value: 0x4d15, lo: 0x80, hi: 0x94},
+       {value: 0x4ad5, lo: 0x95, hi: 0x95},
+       {value: 0x4fb5, lo: 0x96, hi: 0xbf},
+       // Block 0x82, offset 0x417
+       {value: 0x0020, lo: 0x01},
+       {value: 0x54f5, lo: 0x80, hi: 0xbf},
+       // Block 0x83, offset 0x419
+       {value: 0x0020, lo: 0x03},
+       {value: 0x5cf5, lo: 0x80, hi: 0x84},
+       {value: 0x5655, lo: 0x85, hi: 0x85},
+       {value: 0x5d95, lo: 0x86, hi: 0xbf},
+       // Block 0x84, offset 0x41d
+       {value: 0x0020, lo: 0x08},
+       {value: 0x6b55, lo: 0x80, hi: 0x8f},
+       {value: 0x6d15, lo: 0x90, hi: 0x90},
+       {value: 0x6d55, lo: 0x91, hi: 0xab},
+       {value: 0x6ea1, lo: 0xac, hi: 0xac},
+       {value: 0x70b5, lo: 0xad, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x70d5, lo: 0xb0, hi: 0xbf},
+       // Block 0x85, offset 0x426
+       {value: 0x0020, lo: 0x05},
+       {value: 0x72d5, lo: 0x80, hi: 0xad},
+       {value: 0x6535, lo: 0xae, hi: 0xae},
+       {value: 0x7895, lo: 0xaf, hi: 0xb5},
+       {value: 0x6f55, lo: 0xb6, hi: 0xb6},
+       {value: 0x7975, lo: 0xb7, hi: 0xbf},
+       // Block 0x86, offset 0x42c
+       {value: 0x0028, lo: 0x03},
+       {value: 0x7c21, lo: 0x80, hi: 0x82},
+       {value: 0x7be1, lo: 0x83, hi: 0x83},
+       {value: 0x7c99, lo: 0x84, hi: 0xbf},
+       // Block 0x87, offset 0x430
+       {value: 0x0038, lo: 0x0f},
+       {value: 0x9db1, lo: 0x80, hi: 0x83},
+       {value: 0x9e59, lo: 0x84, hi: 0x85},
+       {value: 0x9e91, lo: 0x86, hi: 0x87},
+       {value: 0x9ec9, lo: 0x88, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x91},
+       {value: 0xa089, lo: 0x92, hi: 0x97},
+       {value: 0xa1a1, lo: 0x98, hi: 0x9c},
+       {value: 0xa281, lo: 0x9d, hi: 0xb3},
+       {value: 0x9d41, lo: 0xb4, hi: 0xb4},
+       {value: 0x9db1, lo: 0xb5, hi: 0xb5},
+       {value: 0xa789, lo: 0xb6, hi: 0xbb},
+       {value: 0xa869, lo: 0xbc, hi: 0xbc},
+       {value: 0xa7f9, lo: 0xbd, hi: 0xbd},
+       {value: 0xa8d9, lo: 0xbe, hi: 0xbf},
+       // Block 0x88, offset 0x440
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8c},
+       {value: 0x0008, lo: 0x8d, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbb},
+       {value: 0x0008, lo: 0xbc, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0x89, offset 0x44a
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0x8a, offset 0x44f
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x8b, offset 0x452
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x82},
+       {value: 0x0040, lo: 0x83, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0x8c, offset 0x458
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x8e},
+       {value: 0x0040, lo: 0x8f, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0x8d, offset 0x45f
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x0040, lo: 0xbe, hi: 0xbf},
+       // Block 0x8e, offset 0x464
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9c},
+       {value: 0x0040, lo: 0x9d, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x8f, offset 0x468
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x90},
+       {value: 0x0040, lo: 0x91, hi: 0x9f},
+       {value: 0x3308, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x90, offset 0x46e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x91, offset 0x473
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x81},
+       {value: 0x0008, lo: 0x82, hi: 0x89},
+       {value: 0x0018, lo: 0x8a, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbf},
+       // Block 0x92, offset 0x47c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0x93, offset 0x481
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0xbf},
+       // Block 0x94, offset 0x487
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x97},
+       {value: 0x8ad5, lo: 0x98, hi: 0x9f},
+       {value: 0x8aed, lo: 0xa0, hi: 0xa7},
+       {value: 0x0008, lo: 0xa8, hi: 0xbf},
+       // Block 0x95, offset 0x48e
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x8aed, lo: 0xb0, hi: 0xb7},
+       {value: 0x8ad5, lo: 0xb8, hi: 0xbf},
+       // Block 0x96, offset 0x495
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe145, lo: 0x80, hi: 0x87},
+       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
+       {value: 0xe145, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0xbb},
+       {value: 0x0040, lo: 0xbc, hi: 0xbf},
+       // Block 0x97, offset 0x49c
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0x98, offset 0x4a0
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xae},
+       {value: 0x0018, lo: 0xaf, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x99, offset 0x4a5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0x9a, offset 0x4a8
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xbf},
+       // Block 0x9b, offset 0x4ad
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0808, lo: 0x80, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x87},
+       {value: 0x0808, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0808, lo: 0x8a, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb6},
+       {value: 0x0808, lo: 0xb7, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbb},
+       {value: 0x0808, lo: 0xbc, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbe},
+       {value: 0x0808, lo: 0xbf, hi: 0xbf},
+       // Block 0x9c, offset 0x4b9
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x96},
+       {value: 0x0818, lo: 0x97, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb6},
+       {value: 0x0818, lo: 0xb7, hi: 0xbf},
+       // Block 0x9d, offset 0x4bf
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xa6},
+       {value: 0x0818, lo: 0xa7, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0x9e, offset 0x4c4
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb3},
+       {value: 0x0808, lo: 0xb4, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xba},
+       {value: 0x0818, lo: 0xbb, hi: 0xbf},
+       // Block 0x9f, offset 0x4cb
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0818, lo: 0x96, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbe},
+       {value: 0x0818, lo: 0xbf, hi: 0xbf},
+       // Block 0xa0, offset 0x4d3
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0808, lo: 0x80, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbb},
+       {value: 0x0818, lo: 0xbc, hi: 0xbd},
+       {value: 0x0808, lo: 0xbe, hi: 0xbf},
+       // Block 0xa1, offset 0x4d8
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0818, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x0818, lo: 0x92, hi: 0xbf},
+       // Block 0xa2, offset 0x4dc
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x0808, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x84},
+       {value: 0x3308, lo: 0x85, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x8b},
+       {value: 0x3308, lo: 0x8c, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x94},
+       {value: 0x0808, lo: 0x95, hi: 0x97},
+       {value: 0x0040, lo: 0x98, hi: 0x98},
+       {value: 0x0808, lo: 0x99, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xba},
+       {value: 0x0040, lo: 0xbb, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xa3, offset 0x4ec
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0818, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0818, lo: 0x90, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xbc},
+       {value: 0x0818, lo: 0xbd, hi: 0xbf},
+       // Block 0xa4, offset 0x4f3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0x9c},
+       {value: 0x0818, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xa5, offset 0x4f7
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb8},
+       {value: 0x0018, lo: 0xb9, hi: 0xbf},
+       // Block 0xa6, offset 0x4fb
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0808, lo: 0x80, hi: 0x95},
+       {value: 0x0040, lo: 0x96, hi: 0x97},
+       {value: 0x0818, lo: 0x98, hi: 0x9f},
+       {value: 0x0808, lo: 0xa0, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb7},
+       {value: 0x0818, lo: 0xb8, hi: 0xbf},
+       // Block 0xa7, offset 0x502
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0808, lo: 0x80, hi: 0xbf},
+       // Block 0xa8, offset 0x504
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0808, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0xbf},
+       // Block 0xa9, offset 0x507
+       {value: 0x0000, lo: 0x02},
+       {value: 0x03dd, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xaa, offset 0x50a
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0808, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xb9},
+       {value: 0x0818, lo: 0xba, hi: 0xbf},
+       // Block 0xab, offset 0x50e
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0818, lo: 0xa0, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xac, offset 0x512
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3008, lo: 0x80, hi: 0x80},
+       {value: 0x3308, lo: 0x81, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xad, offset 0x518
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x85},
+       {value: 0x3b08, lo: 0x86, hi: 0x86},
+       {value: 0x0018, lo: 0x87, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x91},
+       {value: 0x0018, lo: 0x92, hi: 0xa5},
+       {value: 0x0008, lo: 0xa6, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xae, offset 0x521
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb6},
+       {value: 0x3008, lo: 0xb7, hi: 0xb8},
+       {value: 0x3b08, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x0018, lo: 0xbb, hi: 0xbc},
+       {value: 0x0340, lo: 0xbd, hi: 0xbd},
+       {value: 0x0018, lo: 0xbe, hi: 0xbf},
+       // Block 0xaf, offset 0x52d
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xb0, offset 0x534
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xb2},
+       {value: 0x3b08, lo: 0xb3, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xbf},
+       // Block 0xb1, offset 0x53d
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb3},
+       {value: 0x0018, lo: 0xb4, hi: 0xb5},
+       {value: 0x0008, lo: 0xb6, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xb2, offset 0x545
+       {value: 0x0000, lo: 0x06},
+       {value: 0x3308, lo: 0x80, hi: 0x81},
+       {value: 0x3008, lo: 0x82, hi: 0x82},
+       {value: 0x0008, lo: 0x83, hi: 0xb2},
+       {value: 0x3008, lo: 0xb3, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xbe},
+       {value: 0x3008, lo: 0xbf, hi: 0xbf},
+       // Block 0xb3, offset 0x54c
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3808, lo: 0x80, hi: 0x80},
+       {value: 0x0008, lo: 0x81, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x89},
+       {value: 0x3308, lo: 0x8a, hi: 0x8c},
+       {value: 0x0018, lo: 0x8d, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0008, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x0018, lo: 0xa1, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xb4, offset 0x55a
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xae},
+       {value: 0x3308, lo: 0xaf, hi: 0xb1},
+       {value: 0x3008, lo: 0xb2, hi: 0xb3},
+       {value: 0x3308, lo: 0xb4, hi: 0xb4},
+       {value: 0x3808, lo: 0xb5, hi: 0xb5},
+       {value: 0x3308, lo: 0xb6, hi: 0xb7},
+       {value: 0x0018, lo: 0xb8, hi: 0xbd},
+       {value: 0x3308, lo: 0xbe, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xb5, offset 0x567
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x0008, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0x8d},
+       {value: 0x0040, lo: 0x8e, hi: 0x8e},
+       {value: 0x0008, lo: 0x8f, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9e},
+       {value: 0x0008, lo: 0x9f, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbf},
+       // Block 0xb6, offset 0x574
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x3308, lo: 0x9f, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa9},
+       {value: 0x3b08, lo: 0xaa, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0040, lo: 0xba, hi: 0xbf},
+       // Block 0xb7, offset 0x57d
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x3008, lo: 0xb5, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbf},
+       // Block 0xb8, offset 0x581
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x3008, lo: 0x80, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x84},
+       {value: 0x3008, lo: 0x85, hi: 0x85},
+       {value: 0x3308, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x8a},
+       {value: 0x0018, lo: 0x8b, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0x9b},
+       {value: 0x0040, lo: 0x9c, hi: 0x9c},
+       {value: 0x0018, lo: 0x9d, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0xb9, offset 0x58f
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xb8},
+       {value: 0x3008, lo: 0xb9, hi: 0xb9},
+       {value: 0x3308, lo: 0xba, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbe},
+       {value: 0x3308, lo: 0xbf, hi: 0xbf},
+       // Block 0xba, offset 0x597
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x3008, lo: 0x81, hi: 0x81},
+       {value: 0x3b08, lo: 0x82, hi: 0x82},
+       {value: 0x3308, lo: 0x83, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x85},
+       {value: 0x0018, lo: 0x86, hi: 0x86},
+       {value: 0x0008, lo: 0x87, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xbb, offset 0x5a2
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xb7},
+       {value: 0x3008, lo: 0xb8, hi: 0xbb},
+       {value: 0x3308, lo: 0xbc, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xbc, offset 0x5ab
+       {value: 0x0000, lo: 0x05},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x97},
+       {value: 0x0008, lo: 0x98, hi: 0x9b},
+       {value: 0x3308, lo: 0x9c, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0xbf},
+       // Block 0xbd, offset 0x5b1
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3008, lo: 0xb0, hi: 0xb2},
+       {value: 0x3308, lo: 0xb3, hi: 0xba},
+       {value: 0x3008, lo: 0xbb, hi: 0xbc},
+       {value: 0x3308, lo: 0xbd, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xbe, offset 0x5b9
+       {value: 0x0000, lo: 0x08},
+       {value: 0x3308, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x83},
+       {value: 0x0008, lo: 0x84, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xbf, offset 0x5c2
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x3308, lo: 0xab, hi: 0xab},
+       {value: 0x3008, lo: 0xac, hi: 0xac},
+       {value: 0x3308, lo: 0xad, hi: 0xad},
+       {value: 0x3008, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb5},
+       {value: 0x3808, lo: 0xb6, hi: 0xb6},
+       {value: 0x3308, lo: 0xb7, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbf},
+       // Block 0xc0, offset 0x5cc
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x89},
+       {value: 0x0040, lo: 0x8a, hi: 0xbf},
+       // Block 0xc1, offset 0x5cf
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9f},
+       {value: 0x3008, lo: 0xa0, hi: 0xa1},
+       {value: 0x3308, lo: 0xa2, hi: 0xa5},
+       {value: 0x3008, lo: 0xa6, hi: 0xa6},
+       {value: 0x3308, lo: 0xa7, hi: 0xaa},
+       {value: 0x3b08, lo: 0xab, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xb9},
+       {value: 0x0018, lo: 0xba, hi: 0xbf},
+       // Block 0xc2, offset 0x5db
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x049d, lo: 0xa0, hi: 0xbf},
+       // Block 0xc3, offset 0x5de
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbe},
+       {value: 0x0008, lo: 0xbf, hi: 0xbf},
+       // Block 0xc4, offset 0x5e3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb8},
+       {value: 0x0040, lo: 0xb9, hi: 0xbf},
+       // Block 0xc5, offset 0x5e6
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x89},
+       {value: 0x0008, lo: 0x8a, hi: 0xae},
+       {value: 0x3008, lo: 0xaf, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xb7},
+       {value: 0x3308, lo: 0xb8, hi: 0xbd},
+       {value: 0x3008, lo: 0xbe, hi: 0xbe},
+       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+       // Block 0xc6, offset 0x5f0
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0008, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0018, lo: 0x9a, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0008, lo: 0xb2, hi: 0xbf},
+       // Block 0xc7, offset 0x5f9
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x91},
+       {value: 0x3308, lo: 0x92, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xa8},
+       {value: 0x3008, lo: 0xa9, hi: 0xa9},
+       {value: 0x3308, lo: 0xaa, hi: 0xb0},
+       {value: 0x3008, lo: 0xb1, hi: 0xb1},
+       {value: 0x3308, lo: 0xb2, hi: 0xb3},
+       {value: 0x3008, lo: 0xb4, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xc8, offset 0x605
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0xbf},
+       // Block 0xc9, offset 0x608
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xca, offset 0x60d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0040, lo: 0x84, hi: 0xbf},
+       // Block 0xcb, offset 0x610
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xbf},
+       // Block 0xcc, offset 0x613
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0xbf},
+       // Block 0xcd, offset 0x616
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0008, lo: 0x80, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa9},
+       {value: 0x0040, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xce, offset 0x61d
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb4},
+       {value: 0x0018, lo: 0xb5, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xcf, offset 0x624
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0xaf},
+       {value: 0x3308, lo: 0xb0, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xbf},
+       // Block 0xd0, offset 0x628
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x0008, lo: 0x80, hi: 0x83},
+       {value: 0x0018, lo: 0x84, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9a},
+       {value: 0x0018, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x0008, lo: 0xa3, hi: 0xb7},
+       {value: 0x0040, lo: 0xb8, hi: 0xbc},
+       {value: 0x0008, lo: 0xbd, hi: 0xbf},
+       // Block 0xd1, offset 0x633
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0xbf},
+       // Block 0xd2, offset 0x636
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0008, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x90},
+       {value: 0x3008, lo: 0x91, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xd3, offset 0x63c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x8e},
+       {value: 0x3308, lo: 0x8f, hi: 0x92},
+       {value: 0x0008, lo: 0x93, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xd4, offset 0x641
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xa0},
+       {value: 0x0040, lo: 0xa1, hi: 0xbf},
+       // Block 0xd5, offset 0x645
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xd6, offset 0x648
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb2},
+       {value: 0x0040, lo: 0xb3, hi: 0xbf},
+       // Block 0xd7, offset 0x64b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0xbf},
+       // Block 0xd8, offset 0x64e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0008, lo: 0x80, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xaf},
+       {value: 0x0008, lo: 0xb0, hi: 0xbc},
+       {value: 0x0040, lo: 0xbd, hi: 0xbf},
+       // Block 0xd9, offset 0x653
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0008, lo: 0x80, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0x0008, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9b},
+       {value: 0x0018, lo: 0x9c, hi: 0x9c},
+       {value: 0x3308, lo: 0x9d, hi: 0x9e},
+       {value: 0x0018, lo: 0x9f, hi: 0x9f},
+       {value: 0x03c0, lo: 0xa0, hi: 0xa3},
+       {value: 0x0040, lo: 0xa4, hi: 0xbf},
+       // Block 0xda, offset 0x65d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xdb, offset 0x660
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xa6},
+       {value: 0x0040, lo: 0xa7, hi: 0xa8},
+       {value: 0x0018, lo: 0xa9, hi: 0xbf},
+       // Block 0xdc, offset 0x664
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x0018, lo: 0x80, hi: 0x9d},
+       {value: 0xb5b9, lo: 0x9e, hi: 0x9e},
+       {value: 0xb601, lo: 0x9f, hi: 0x9f},
+       {value: 0xb649, lo: 0xa0, hi: 0xa0},
+       {value: 0xb6b1, lo: 0xa1, hi: 0xa1},
+       {value: 0xb719, lo: 0xa2, hi: 0xa2},
+       {value: 0xb781, lo: 0xa3, hi: 0xa3},
+       {value: 0xb7e9, lo: 0xa4, hi: 0xa4},
+       {value: 0x3018, lo: 0xa5, hi: 0xa6},
+       {value: 0x3318, lo: 0xa7, hi: 0xa9},
+       {value: 0x0018, lo: 0xaa, hi: 0xac},
+       {value: 0x3018, lo: 0xad, hi: 0xb2},
+       {value: 0x0340, lo: 0xb3, hi: 0xba},
+       {value: 0x3318, lo: 0xbb, hi: 0xbf},
+       // Block 0xdd, offset 0x673
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x3318, lo: 0x80, hi: 0x82},
+       {value: 0x0018, lo: 0x83, hi: 0x84},
+       {value: 0x3318, lo: 0x85, hi: 0x8b},
+       {value: 0x0018, lo: 0x8c, hi: 0xa9},
+       {value: 0x3318, lo: 0xaa, hi: 0xad},
+       {value: 0x0018, lo: 0xae, hi: 0xba},
+       {value: 0xb851, lo: 0xbb, hi: 0xbb},
+       {value: 0xb899, lo: 0xbc, hi: 0xbc},
+       {value: 0xb8e1, lo: 0xbd, hi: 0xbd},
+       {value: 0xb949, lo: 0xbe, hi: 0xbe},
+       {value: 0xb9b1, lo: 0xbf, hi: 0xbf},
+       // Block 0xde, offset 0x67f
+       {value: 0x0000, lo: 0x03},
+       {value: 0xba19, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0xa8},
+       {value: 0x0040, lo: 0xa9, hi: 0xbf},
+       // Block 0xdf, offset 0x683
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x81},
+       {value: 0x3318, lo: 0x82, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x85},
+       {value: 0x0040, lo: 0x86, hi: 0xbf},
+       // Block 0xe0, offset 0x688
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xe1, offset 0x68d
+       {value: 0x0000, lo: 0x03},
+       {value: 0x3308, lo: 0x80, hi: 0xb6},
+       {value: 0x0018, lo: 0xb7, hi: 0xba},
+       {value: 0x3308, lo: 0xbb, hi: 0xbf},
+       // Block 0xe2, offset 0x691
+       {value: 0x0000, lo: 0x04},
+       {value: 0x3308, lo: 0x80, hi: 0xac},
+       {value: 0x0018, lo: 0xad, hi: 0xb4},
+       {value: 0x3308, lo: 0xb5, hi: 0xb5},
+       {value: 0x0018, lo: 0xb6, hi: 0xbf},
+       // Block 0xe3, offset 0x696
+       {value: 0x0000, lo: 0x08},
+       {value: 0x0018, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x84},
+       {value: 0x0018, lo: 0x85, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xa0},
+       {value: 0x3308, lo: 0xa1, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+       // Block 0xe4, offset 0x69f
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x3308, lo: 0x80, hi: 0x86},
+       {value: 0x0040, lo: 0x87, hi: 0x87},
+       {value: 0x3308, lo: 0x88, hi: 0x98},
+       {value: 0x0040, lo: 0x99, hi: 0x9a},
+       {value: 0x3308, lo: 0x9b, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xa2},
+       {value: 0x3308, lo: 0xa3, hi: 0xa4},
+       {value: 0x0040, lo: 0xa5, hi: 0xa5},
+       {value: 0x3308, lo: 0xa6, hi: 0xaa},
+       {value: 0x0040, lo: 0xab, hi: 0xbf},
+       // Block 0xe5, offset 0x6aa
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0808, lo: 0x80, hi: 0x84},
+       {value: 0x0040, lo: 0x85, hi: 0x86},
+       {value: 0x0818, lo: 0x87, hi: 0x8f},
+       {value: 0x3308, lo: 0x90, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0xe6, offset 0x6b0
+       {value: 0x0000, lo: 0x07},
+       {value: 0x0a08, lo: 0x80, hi: 0x83},
+       {value: 0x3308, lo: 0x84, hi: 0x8a},
+       {value: 0x0040, lo: 0x8b, hi: 0x8f},
+       {value: 0x0808, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9d},
+       {value: 0x0818, lo: 0x9e, hi: 0x9f},
+       {value: 0x0040, lo: 0xa0, hi: 0xbf},
+       // Block 0xe7, offset 0x6b8
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0040, lo: 0x80, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb1},
+       {value: 0x0040, lo: 0xb2, hi: 0xbf},
+       // Block 0xe8, offset 0x6bc
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0xab},
+       {value: 0x0040, lo: 0xac, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xbf},
+       // Block 0xe9, offset 0x6c0
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x93},
+       {value: 0x0040, lo: 0x94, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xae},
+       {value: 0x0040, lo: 0xaf, hi: 0xb0},
+       {value: 0x0018, lo: 0xb1, hi: 0xbf},
+       // Block 0xea, offset 0x6c6
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0018, lo: 0x81, hi: 0x8f},
+       {value: 0x0040, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xb5},
+       {value: 0x0040, lo: 0xb6, hi: 0xbf},
+       // Block 0xeb, offset 0x6cc
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8f},
+       {value: 0xc1c1, lo: 0x90, hi: 0x90},
+       {value: 0x0018, lo: 0x91, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xbf},
+       // Block 0xec, offset 0x6d1
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0040, lo: 0x80, hi: 0xa5},
+       {value: 0x0018, lo: 0xa6, hi: 0xbf},
+       // Block 0xed, offset 0x6d4
+       {value: 0x0000, lo: 0x0d},
+       {value: 0xc7e9, lo: 0x80, hi: 0x80},
+       {value: 0xc839, lo: 0x81, hi: 0x81},
+       {value: 0xc889, lo: 0x82, hi: 0x82},
+       {value: 0xc8d9, lo: 0x83, hi: 0x83},
+       {value: 0xc929, lo: 0x84, hi: 0x84},
+       {value: 0xc979, lo: 0x85, hi: 0x85},
+       {value: 0xc9c9, lo: 0x86, hi: 0x86},
+       {value: 0xca19, lo: 0x87, hi: 0x87},
+       {value: 0xca69, lo: 0x88, hi: 0x88},
+       {value: 0x0040, lo: 0x89, hi: 0x8f},
+       {value: 0xcab9, lo: 0x90, hi: 0x90},
+       {value: 0xcad9, lo: 0x91, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0xbf},
+       // Block 0xee, offset 0x6e2
+       {value: 0x0000, lo: 0x06},
+       {value: 0x0018, lo: 0x80, hi: 0x92},
+       {value: 0x0040, lo: 0x93, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xac},
+       {value: 0x0040, lo: 0xad, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb6},
+       {value: 0x0040, lo: 0xb7, hi: 0xbf},
+       // Block 0xef, offset 0x6e9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0xb3},
+       {value: 0x0040, lo: 0xb4, hi: 0xbf},
+       // Block 0xf0, offset 0x6ec
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x94},
+       {value: 0x0040, lo: 0x95, hi: 0xbf},
+       // Block 0xf1, offset 0x6ef
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xbf},
+       // Block 0xf2, offset 0x6f3
+       {value: 0x0000, lo: 0x05},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x99},
+       {value: 0x0040, lo: 0x9a, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xbf},
+       // Block 0xf3, offset 0x6f9
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x87},
+       {value: 0x0040, lo: 0x88, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0xad},
+       {value: 0x0040, lo: 0xae, hi: 0xbf},
+       // Block 0xf4, offset 0x6fe
+       {value: 0x0000, lo: 0x09},
+       {value: 0x0040, lo: 0x80, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0x9f},
+       {value: 0x0018, lo: 0xa0, hi: 0xa7},
+       {value: 0x0040, lo: 0xa8, hi: 0xaf},
+       {value: 0x0018, lo: 0xb0, hi: 0xb0},
+       {value: 0x0040, lo: 0xb1, hi: 0xb2},
+       {value: 0x0018, lo: 0xb3, hi: 0xbe},
+       {value: 0x0040, lo: 0xbf, hi: 0xbf},
+       // Block 0xf5, offset 0x708
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0018, lo: 0x80, hi: 0x8b},
+       {value: 0x0040, lo: 0x8c, hi: 0x8f},
+       {value: 0x0018, lo: 0x90, hi: 0x9e},
+       {value: 0x0040, lo: 0x9f, hi: 0xbf},
+       // Block 0xf6, offset 0x70d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x91},
+       {value: 0x0040, lo: 0x92, hi: 0xbf},
+       // Block 0xf7, offset 0x710
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0018, lo: 0x80, hi: 0x80},
+       {value: 0x0040, lo: 0x81, hi: 0xbf},
+       // Block 0xf8, offset 0x713
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0x96},
+       {value: 0x0040, lo: 0x97, hi: 0xbf},
+       // Block 0xf9, offset 0x716
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xb4},
+       {value: 0x0040, lo: 0xb5, hi: 0xbf},
+       // Block 0xfa, offset 0x719
+       {value: 0x0000, lo: 0x03},
+       {value: 0x0008, lo: 0x80, hi: 0x9d},
+       {value: 0x0040, lo: 0x9e, hi: 0x9f},
+       {value: 0x0008, lo: 0xa0, hi: 0xbf},
+       // Block 0xfb, offset 0x71d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0008, lo: 0x80, hi: 0xa1},
+       {value: 0x0040, lo: 0xa2, hi: 0xbf},
+       // Block 0xfc, offset 0x720
+       {value: 0x0020, lo: 0x0f},
+       {value: 0xdeb9, lo: 0x80, hi: 0x89},
+       {value: 0x8dfd, lo: 0x8a, hi: 0x8a},
+       {value: 0xdff9, lo: 0x8b, hi: 0x9c},
+       {value: 0x8e1d, lo: 0x9d, hi: 0x9d},
+       {value: 0xe239, lo: 0x9e, hi: 0xa2},
+       {value: 0x8e3d, lo: 0xa3, hi: 0xa3},
+       {value: 0xe2d9, lo: 0xa4, hi: 0xab},
+       {value: 0x7ed5, lo: 0xac, hi: 0xac},
+       {value: 0xe3d9, lo: 0xad, hi: 0xaf},
+       {value: 0x8e5d, lo: 0xb0, hi: 0xb0},
+       {value: 0xe439, lo: 0xb1, hi: 0xb6},
+       {value: 0x8e7d, lo: 0xb7, hi: 0xb9},
+       {value: 0xe4f9, lo: 0xba, hi: 0xba},
+       {value: 0x8edd, lo: 0xbb, hi: 0xbb},
+       {value: 0xe519, lo: 0xbc, hi: 0xbf},
+       // Block 0xfd, offset 0x730
+       {value: 0x0020, lo: 0x10},
+       {value: 0x937d, lo: 0x80, hi: 0x80},
+       {value: 0xf099, lo: 0x81, hi: 0x86},
+       {value: 0x939d, lo: 0x87, hi: 0x8a},
+       {value: 0xd9f9, lo: 0x8b, hi: 0x8b},
+       {value: 0xf159, lo: 0x8c, hi: 0x96},
+       {value: 0x941d, lo: 0x97, hi: 0x97},
+       {value: 0xf2b9, lo: 0x98, hi: 0xa3},
+       {value: 0x943d, lo: 0xa4, hi: 0xa6},
+       {value: 0xf439, lo: 0xa7, hi: 0xaa},
+       {value: 0x949d, lo: 0xab, hi: 0xab},
+       {value: 0xf4b9, lo: 0xac, hi: 0xac},
+       {value: 0x94bd, lo: 0xad, hi: 0xad},
+       {value: 0xf4d9, lo: 0xae, hi: 0xaf},
+       {value: 0x94dd, lo: 0xb0, hi: 0xb1},
+       {value: 0xf519, lo: 0xb2, hi: 0xbe},
+       {value: 0x2040, lo: 0xbf, hi: 0xbf},
+       // Block 0xfe, offset 0x741
+       {value: 0x0000, lo: 0x04},
+       {value: 0x0040, lo: 0x80, hi: 0x80},
+       {value: 0x0340, lo: 0x81, hi: 0x81},
+       {value: 0x0040, lo: 0x82, hi: 0x9f},
+       {value: 0x0340, lo: 0xa0, hi: 0xbf},
+       // Block 0xff, offset 0x746
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0340, lo: 0x80, hi: 0xbf},
+       // Block 0x100, offset 0x748
+       {value: 0x0000, lo: 0x01},
+       {value: 0x33c0, lo: 0x80, hi: 0xbf},
+       // Block 0x101, offset 0x74a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x33c0, lo: 0x80, hi: 0xaf},
+       {value: 0x0040, lo: 0xb0, hi: 0xbf},
+}
+
+// Total table size 41662 bytes (40KiB); checksum: 355A58A4
diff --git a/libgo/go/golang.org/x/net/idna/trie.go b/libgo/go/golang.org/x/net/idna/trie.go
new file mode 100644 (file)
index 0000000..c4ef847
--- /dev/null
@@ -0,0 +1,72 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package idna
+
+// appendMapping appends the mapping for the respective rune. isMapped must be
+// true. A mapping is a categorization of a rune as defined in UTS #46.
+func (c info) appendMapping(b []byte, s string) []byte {
+       index := int(c >> indexShift)
+       if c&xorBit == 0 {
+               s := mappings[index:]
+               return append(b, s[1:s[0]+1]...)
+       }
+       b = append(b, s...)
+       if c&inlineXOR == inlineXOR {
+               // TODO: support and handle two-byte inline masks
+               b[len(b)-1] ^= byte(index)
+       } else {
+               for p := len(b) - int(xorData[index]); p < len(b); p++ {
+                       index++
+                       b[p] ^= xorData[index]
+               }
+       }
+       return b
+}
+
+// Sparse block handling code.
+
+type valueRange struct {
+       value  uint16 // header: value:stride
+       lo, hi byte   // header: lo:n
+}
+
+type sparseBlocks struct {
+       values []valueRange
+       offset []uint16
+}
+
+var idnaSparse = sparseBlocks{
+       values: idnaSparseValues[:],
+       offset: idnaSparseOffset[:],
+}
+
+// Don't use newIdnaTrie to avoid unconditional linking in of the table.
+var trie = &idnaTrie{}
+
+// lookup determines the type of block n and looks up the value for b.
+// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
+// is a list of ranges with an accompanying value. Given a matching range r,
+// the value for b is by r.value + (b - r.lo) * stride.
+func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
+       offset := t.offset[n]
+       header := t.values[offset]
+       lo := offset + 1
+       hi := lo + uint16(header.lo)
+       for lo < hi {
+               m := lo + (hi-lo)/2
+               r := t.values[m]
+               if r.lo <= b && b <= r.hi {
+                       return r.value + uint16(b-r.lo)*header.value
+               }
+               if b < r.lo {
+                       hi = m
+               } else {
+                       lo = m + 1
+               }
+       }
+       return 0
+}
diff --git a/libgo/go/golang.org/x/net/idna/trieval.go b/libgo/go/golang.org/x/net/idna/trieval.go
new file mode 100644 (file)
index 0000000..7a8cf88
--- /dev/null
@@ -0,0 +1,119 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package idna
+
+// This file contains definitions for interpreting the trie value of the idna
+// trie generated by "go run gen*.go". It is shared by both the generator
+// program and the resultant package. Sharing is achieved by the generator
+// copying gen_trieval.go to trieval.go and changing what's above this comment.
+
+// info holds information from the IDNA mapping table for a single rune. It is
+// the value returned by a trie lookup. In most cases, all information fits in
+// a 16-bit value. For mappings, this value may contain an index into a slice
+// with the mapped string. Such mappings can consist of the actual mapped value
+// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
+// input rune. This technique is used by the cases packages and reduces the
+// table size significantly.
+//
+// The per-rune values have the following format:
+//
+//   if mapped {
+//     if inlinedXOR {
+//       15..13 inline XOR marker
+//       12..11 unused
+//       10..3  inline XOR mask
+//     } else {
+//       15..3  index into xor or mapping table
+//     }
+//   } else {
+//       15..14 unused
+//       13     mayNeedNorm
+//       12..11 attributes
+//       10..8  joining type
+//        7..3  category type
+//   }
+//      2  use xor pattern
+//   1..0  mapped category
+//
+// See the definitions below for a more detailed description of the various
+// bits.
+type info uint16
+
+const (
+       catSmallMask = 0x3
+       catBigMask   = 0xF8
+       indexShift   = 3
+       xorBit       = 0x4    // interpret the index as an xor pattern
+       inlineXOR    = 0xE000 // These bits are set if the XOR pattern is inlined.
+
+       joinShift = 8
+       joinMask  = 0x07
+
+       // Attributes
+       attributesMask = 0x1800
+       viramaModifier = 0x1800
+       modifier       = 0x1000
+       rtl            = 0x0800
+
+       mayNeedNorm = 0x2000
+)
+
+// A category corresponds to a category defined in the IDNA mapping table.
+type category uint16
+
+const (
+       unknown              category = 0 // not currently defined in unicode.
+       mapped               category = 1
+       disallowedSTD3Mapped category = 2
+       deviation            category = 3
+)
+
+const (
+       valid               category = 0x08
+       validNV8            category = 0x18
+       validXV8            category = 0x28
+       disallowed          category = 0x40
+       disallowedSTD3Valid category = 0x80
+       ignored             category = 0xC0
+)
+
+// join types and additional rune information
+const (
+       joiningL = (iota + 1)
+       joiningD
+       joiningT
+       joiningR
+
+       //the following types are derived during processing
+       joinZWJ
+       joinZWNJ
+       joinVirama
+       numJoinTypes
+)
+
+func (c info) isMapped() bool {
+       return c&0x3 != 0
+}
+
+func (c info) category() category {
+       small := c & catSmallMask
+       if small != 0 {
+               return category(small)
+       }
+       return category(c & catBigMask)
+}
+
+func (c info) joinType() info {
+       if c.isMapped() {
+               return 0
+       }
+       return (c >> joinShift) & joinMask
+}
+
+func (c info) isModifier() bool {
+       return c&(modifier|catSmallMask) == modifier
+}
+
+func (c info) isViramaModifier() bool {
+       return c&(attributesMask|catSmallMask) == viramaModifier
+}
diff --git a/libgo/go/golang.org/x/net/lif/address.go b/libgo/go/golang.org/x/net/lif/address.go
new file mode 100644 (file)
index 0000000..afb957f
--- /dev/null
@@ -0,0 +1,105 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package lif
+
+import (
+       "errors"
+       "unsafe"
+)
+
+// An Addr represents an address associated with packet routing.
+type Addr interface {
+       // Family returns an address family.
+       Family() int
+}
+
+// An Inet4Addr represents an internet address for IPv4.
+type Inet4Addr struct {
+       IP        [4]byte // IP address
+       PrefixLen int     // address prefix length
+}
+
+// Family implements the Family method of Addr interface.
+func (a *Inet4Addr) Family() int { return sysAF_INET }
+
+// An Inet6Addr represents an internet address for IPv6.
+type Inet6Addr struct {
+       IP        [16]byte // IP address
+       PrefixLen int      // address prefix length
+       ZoneID    int      // zone identifier
+}
+
+// Family implements the Family method of Addr interface.
+func (a *Inet6Addr) Family() int { return sysAF_INET6 }
+
+// Addrs returns a list of interface addresses.
+//
+// The provided af must be an address family and name must be a data
+// link name. The zero value of af or name means a wildcard.
+func Addrs(af int, name string) ([]Addr, error) {
+       eps, err := newEndpoints(af)
+       if len(eps) == 0 {
+               return nil, err
+       }
+       defer func() {
+               for _, ep := range eps {
+                       ep.close()
+               }
+       }()
+       lls, err := links(eps, name)
+       if len(lls) == 0 {
+               return nil, err
+       }
+       var as []Addr
+       for _, ll := range lls {
+               var lifr lifreq
+               for i := 0; i < len(ll.Name); i++ {
+                       lifr.Name[i] = int8(ll.Name[i])
+               }
+               for _, ep := range eps {
+                       ioc := int64(sysSIOCGLIFADDR)
+                       err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifr))
+                       if err != nil {
+                               continue
+                       }
+                       sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0]))
+                       l := int(nativeEndian.Uint32(lifr.Lifru1[:4]))
+                       if l == 0 {
+                               continue
+                       }
+                       switch sa.Family {
+                       case sysAF_INET:
+                               a := &Inet4Addr{PrefixLen: l}
+                               copy(a.IP[:], lifr.Lifru[4:8])
+                               as = append(as, a)
+                       case sysAF_INET6:
+                               a := &Inet6Addr{PrefixLen: l, ZoneID: int(nativeEndian.Uint32(lifr.Lifru[24:28]))}
+                               copy(a.IP[:], lifr.Lifru[8:24])
+                               as = append(as, a)
+                       }
+               }
+       }
+       return as, nil
+}
+
+func parseLinkAddr(b []byte) ([]byte, error) {
+       nlen, alen, slen := int(b[1]), int(b[2]), int(b[3])
+       l := 4 + nlen + alen + slen
+       if len(b) < l {
+               return nil, errors.New("invalid address")
+       }
+       b = b[4:]
+       var addr []byte
+       if nlen > 0 {
+               b = b[nlen:]
+       }
+       if alen > 0 {
+               addr = make([]byte, alen)
+               copy(addr, b[:alen])
+       }
+       return addr, nil
+}
diff --git a/libgo/go/golang.org/x/net/lif/binary.go b/libgo/go/golang.org/x/net/lif/binary.go
new file mode 100644 (file)
index 0000000..738a94f
--- /dev/null
@@ -0,0 +1,115 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package lif
+
+// This file contains duplicates of encoding/binary package.
+//
+// This package is supposed to be used by the net package of standard
+// library. Therefore the package set used in the package must be the
+// same as net package.
+
+var (
+       littleEndian binaryLittleEndian
+       bigEndian    binaryBigEndian
+)
+
+type binaryByteOrder interface {
+       Uint16([]byte) uint16
+       Uint32([]byte) uint32
+       Uint64([]byte) uint64
+       PutUint16([]byte, uint16)
+       PutUint32([]byte, uint32)
+       PutUint64([]byte, uint64)
+}
+
+type binaryLittleEndian struct{}
+
+func (binaryLittleEndian) Uint16(b []byte) uint16 {
+       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint16(b[0]) | uint16(b[1])<<8
+}
+
+func (binaryLittleEndian) PutUint16(b []byte, v uint16) {
+       _ = b[1] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v)
+       b[1] = byte(v >> 8)
+}
+
+func (binaryLittleEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
+}
+
+func (binaryLittleEndian) PutUint32(b []byte, v uint32) {
+       _ = b[3] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v)
+       b[1] = byte(v >> 8)
+       b[2] = byte(v >> 16)
+       b[3] = byte(v >> 24)
+}
+
+func (binaryLittleEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
+               uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
+}
+
+func (binaryLittleEndian) PutUint64(b []byte, v uint64) {
+       _ = b[7] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v)
+       b[1] = byte(v >> 8)
+       b[2] = byte(v >> 16)
+       b[3] = byte(v >> 24)
+       b[4] = byte(v >> 32)
+       b[5] = byte(v >> 40)
+       b[6] = byte(v >> 48)
+       b[7] = byte(v >> 56)
+}
+
+type binaryBigEndian struct{}
+
+func (binaryBigEndian) Uint16(b []byte) uint16 {
+       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint16(b[1]) | uint16(b[0])<<8
+}
+
+func (binaryBigEndian) PutUint16(b []byte, v uint16) {
+       _ = b[1] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v >> 8)
+       b[1] = byte(v)
+}
+
+func (binaryBigEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
+}
+
+func (binaryBigEndian) PutUint32(b []byte, v uint32) {
+       _ = b[3] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v >> 24)
+       b[1] = byte(v >> 16)
+       b[2] = byte(v >> 8)
+       b[3] = byte(v)
+}
+
+func (binaryBigEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+               uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+}
+
+func (binaryBigEndian) PutUint64(b []byte, v uint64) {
+       _ = b[7] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v >> 56)
+       b[1] = byte(v >> 48)
+       b[2] = byte(v >> 40)
+       b[3] = byte(v >> 32)
+       b[4] = byte(v >> 24)
+       b[5] = byte(v >> 16)
+       b[6] = byte(v >> 8)
+       b[7] = byte(v)
+}
diff --git a/libgo/go/golang.org/x/net/lif/lif.go b/libgo/go/golang.org/x/net/lif/lif.go
new file mode 100644 (file)
index 0000000..6e81f81
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+// Package lif provides basic functions for the manipulation of
+// logical network interfaces and interface addresses on Solaris.
+//
+// The package supports Solaris 11 or above.
+package lif
+
+import "syscall"
+
+type endpoint struct {
+       af int
+       s  uintptr
+}
+
+func (ep *endpoint) close() error {
+       return syscall.Close(int(ep.s))
+}
+
+func newEndpoints(af int) ([]endpoint, error) {
+       var lastErr error
+       var eps []endpoint
+       afs := []int{sysAF_INET, sysAF_INET6}
+       if af != sysAF_UNSPEC {
+               afs = []int{af}
+       }
+       for _, af := range afs {
+               s, err := syscall.Socket(af, sysSOCK_DGRAM, 0)
+               if err != nil {
+                       lastErr = err
+                       continue
+               }
+               eps = append(eps, endpoint{af: af, s: uintptr(s)})
+       }
+       if len(eps) == 0 {
+               return nil, lastErr
+       }
+       return eps, nil
+}
diff --git a/libgo/go/golang.org/x/net/lif/link.go b/libgo/go/golang.org/x/net/lif/link.go
new file mode 100644 (file)
index 0000000..913a53e
--- /dev/null
@@ -0,0 +1,126 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package lif
+
+import "unsafe"
+
+// A Link represents logical data link information.
+//
+// It also represents base information for logical network interface.
+// On Solaris, each logical network interface represents network layer
+// adjacency information and the interface has a only single network
+// address or address pair for tunneling. It's usual that multiple
+// logical network interfaces share the same logical data link.
+type Link struct {
+       Name  string // name, equivalent to IP interface name
+       Index int    // index, equivalent to IP interface index
+       Type  int    // type
+       Flags int    // flags
+       MTU   int    // maximum transmission unit, basically link MTU but may differ between IP address families
+       Addr  []byte // address
+}
+
+func (ll *Link) fetch(s uintptr) {
+       var lifr lifreq
+       for i := 0; i < len(ll.Name); i++ {
+               lifr.Name[i] = int8(ll.Name[i])
+       }
+       ioc := int64(sysSIOCGLIFINDEX)
+       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
+               ll.Index = int(nativeEndian.Uint32(lifr.Lifru[:4]))
+       }
+       ioc = int64(sysSIOCGLIFFLAGS)
+       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
+               ll.Flags = int(nativeEndian.Uint64(lifr.Lifru[:8]))
+       }
+       ioc = int64(sysSIOCGLIFMTU)
+       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
+               ll.MTU = int(nativeEndian.Uint32(lifr.Lifru[:4]))
+       }
+       switch ll.Type {
+       case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4:
+       default:
+               ioc = int64(sysSIOCGLIFHWADDR)
+               if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
+                       ll.Addr, _ = parseLinkAddr(lifr.Lifru[4:])
+               }
+       }
+}
+
+// Links returns a list of logical data links.
+//
+// The provided af must be an address family and name must be a data
+// link name. The zero value of af or name means a wildcard.
+func Links(af int, name string) ([]Link, error) {
+       eps, err := newEndpoints(af)
+       if len(eps) == 0 {
+               return nil, err
+       }
+       defer func() {
+               for _, ep := range eps {
+                       ep.close()
+               }
+       }()
+       return links(eps, name)
+}
+
+func links(eps []endpoint, name string) ([]Link, error) {
+       var lls []Link
+       lifn := lifnum{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP}
+       lifc := lifconf{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP}
+       for _, ep := range eps {
+               lifn.Family = uint16(ep.af)
+               ioc := int64(sysSIOCGLIFNUM)
+               if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifn)); err != nil {
+                       continue
+               }
+               if lifn.Count == 0 {
+                       continue
+               }
+               b := make([]byte, lifn.Count*sizeofLifreq)
+               lifc.Family = uint16(ep.af)
+               lifc.Len = lifn.Count * sizeofLifreq
+               if len(lifc.Lifcu) == 8 {
+                       nativeEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0]))))
+               } else {
+                       nativeEndian.PutUint32(lifc.Lifcu[:], uint32(uintptr(unsafe.Pointer(&b[0]))))
+               }
+               ioc = int64(sysSIOCGLIFCONF)
+               if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil {
+                       continue
+               }
+               nb := make([]byte, 32) // see LIFNAMSIZ in net/if.h
+               for i := 0; i < int(lifn.Count); i++ {
+                       lifr := (*lifreq)(unsafe.Pointer(&b[i*sizeofLifreq]))
+                       for i := 0; i < 32; i++ {
+                               if lifr.Name[i] == 0 {
+                                       nb = nb[:i]
+                                       break
+                               }
+                               nb[i] = byte(lifr.Name[i])
+                       }
+                       llname := string(nb)
+                       nb = nb[:32]
+                       if isDupLink(lls, llname) || name != "" && name != llname {
+                               continue
+                       }
+                       ll := Link{Name: llname, Type: int(lifr.Type)}
+                       ll.fetch(ep.s)
+                       lls = append(lls, ll)
+               }
+       }
+       return lls, nil
+}
+
+func isDupLink(lls []Link, name string) bool {
+       for _, ll := range lls {
+               if ll.Name == name {
+                       return true
+               }
+       }
+       return false
+}
diff --git a/libgo/go/golang.org/x/net/lif/sys.go b/libgo/go/golang.org/x/net/lif/sys.go
new file mode 100644 (file)
index 0000000..c896041
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package lif
+
+import "unsafe"
+
+var nativeEndian binaryByteOrder
+
+func init() {
+       i := uint32(1)
+       b := (*[4]byte)(unsafe.Pointer(&i))
+       if b[0] == 1 {
+               nativeEndian = littleEndian
+       } else {
+               nativeEndian = bigEndian
+       }
+}
diff --git a/libgo/go/golang.org/x/net/lif/syscall.go b/libgo/go/golang.org/x/net/lif/syscall.go
new file mode 100644 (file)
index 0000000..aadab2e
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package lif
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
+
+//go:linkname procIoctl libc_ioctl
+
+var procIoctl uintptr
+
+func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
+
+func ioctl(s, ioc uintptr, arg unsafe.Pointer) error {
+       _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0)
+       if errno != 0 {
+               return error(errno)
+       }
+       return nil
+}
diff --git a/libgo/go/golang.org/x/net/lif/zsys_solaris_amd64.go b/libgo/go/golang.org/x/net/lif/zsys_solaris_amd64.go
new file mode 100644 (file)
index 0000000..b5e999b
--- /dev/null
@@ -0,0 +1,103 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_solaris.go
+
+package lif
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1a
+
+       sysSOCK_DGRAM = 0x1
+)
+
+type sockaddrStorage struct {
+       Family     uint16
+       X_ss_pad1  [6]int8
+       X_ss_align float64
+       X_ss_pad2  [240]int8
+}
+
+const (
+       sysLIFC_NOXMIT          = 0x1
+       sysLIFC_EXTERNAL_SOURCE = 0x2
+       sysLIFC_TEMPORARY       = 0x4
+       sysLIFC_ALLZONES        = 0x8
+       sysLIFC_UNDER_IPMP      = 0x10
+       sysLIFC_ENABLED         = 0x20
+
+       sysSIOCGLIFADDR    = -0x3f87968f
+       sysSIOCGLIFDSTADDR = -0x3f87968d
+       sysSIOCGLIFFLAGS   = -0x3f87968b
+       sysSIOCGLIFMTU     = -0x3f879686
+       sysSIOCGLIFNETMASK = -0x3f879683
+       sysSIOCGLIFMETRIC  = -0x3f879681
+       sysSIOCGLIFNUM     = -0x3ff3967e
+       sysSIOCGLIFINDEX   = -0x3f87967b
+       sysSIOCGLIFSUBNET  = -0x3f879676
+       sysSIOCGLIFLNKINFO = -0x3f879674
+       sysSIOCGLIFCONF    = -0x3fef965b
+       sysSIOCGLIFHWADDR  = -0x3f879640
+)
+
+const (
+       sysIFF_UP          = 0x1
+       sysIFF_BROADCAST   = 0x2
+       sysIFF_DEBUG       = 0x4
+       sysIFF_LOOPBACK    = 0x8
+       sysIFF_POINTOPOINT = 0x10
+       sysIFF_NOTRAILERS  = 0x20
+       sysIFF_RUNNING     = 0x40
+       sysIFF_NOARP       = 0x80
+       sysIFF_PROMISC     = 0x100
+       sysIFF_ALLMULTI    = 0x200
+       sysIFF_INTELLIGENT = 0x400
+       sysIFF_MULTICAST   = 0x800
+       sysIFF_MULTI_BCAST = 0x1000
+       sysIFF_UNNUMBERED  = 0x2000
+       sysIFF_PRIVATE     = 0x8000
+)
+
+const (
+       sizeofLifnum       = 0xc
+       sizeofLifreq       = 0x178
+       sizeofLifconf      = 0x18
+       sizeofLifIfinfoReq = 0x10
+)
+
+type lifnum struct {
+       Family    uint16
+       Pad_cgo_0 [2]byte
+       Flags     int32
+       Count     int32
+}
+
+type lifreq struct {
+       Name   [32]int8
+       Lifru1 [4]byte
+       Type   uint32
+       Lifru  [336]byte
+}
+
+type lifconf struct {
+       Family    uint16
+       Pad_cgo_0 [2]byte
+       Flags     int32
+       Len       int32
+       Pad_cgo_1 [4]byte
+       Lifcu     [8]byte
+}
+
+type lifIfinfoReq struct {
+       Maxhops      uint8
+       Pad_cgo_0    [3]byte
+       Reachtime    uint32
+       Reachretrans uint32
+       Maxmtu       uint32
+}
+
+const (
+       sysIFT_IPV4 = 0xc8
+       sysIFT_IPV6 = 0xc9
+       sysIFT_6TO4 = 0xca
+)
diff --git a/libgo/go/golang.org/x/net/nettest/conntest.go b/libgo/go/golang.org/x/net/nettest/conntest.go
new file mode 100644 (file)
index 0000000..39cc6a6
--- /dev/null
@@ -0,0 +1,464 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package nettest
+
+import (
+       "bytes"
+       "encoding/binary"
+       "io"
+       "io/ioutil"
+       "math/rand"
+       "net"
+       "runtime"
+       "sync"
+       "testing"
+       "time"
+)
+
+// MakePipe creates a connection between two endpoints and returns the pair
+// as c1 and c2, such that anything written to c1 is read by c2 and vice-versa.
+// The stop function closes all resources, including c1, c2, and the underlying
+// net.Listener (if there is one), and should not be nil.
+type MakePipe func() (c1, c2 net.Conn, stop func(), err error)
+
+// TestConn tests that a net.Conn implementation properly satisfies the interface.
+// The tests should not produce any false positives, but may experience
+// false negatives. Thus, some issues may only be detected when the test is
+// run multiple times. For maximal effectiveness, run the tests under the
+// race detector.
+func TestConn(t *testing.T, mp MakePipe) {
+       t.Run("BasicIO", func(t *testing.T) { timeoutWrapper(t, mp, testBasicIO) })
+       t.Run("PingPong", func(t *testing.T) { timeoutWrapper(t, mp, testPingPong) })
+       t.Run("RacyRead", func(t *testing.T) { timeoutWrapper(t, mp, testRacyRead) })
+       t.Run("RacyWrite", func(t *testing.T) { timeoutWrapper(t, mp, testRacyWrite) })
+       t.Run("ReadTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testReadTimeout) })
+       t.Run("WriteTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testWriteTimeout) })
+       t.Run("PastTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPastTimeout) })
+       t.Run("PresentTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPresentTimeout) })
+       t.Run("FutureTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testFutureTimeout) })
+       t.Run("CloseTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testCloseTimeout) })
+       t.Run("ConcurrentMethods", func(t *testing.T) { timeoutWrapper(t, mp, testConcurrentMethods) })
+}
+
+type connTester func(t *testing.T, c1, c2 net.Conn)
+
+func timeoutWrapper(t *testing.T, mp MakePipe, f connTester) {
+       t.Helper()
+       c1, c2, stop, err := mp()
+       if err != nil {
+               t.Fatalf("unable to make pipe: %v", err)
+       }
+       var once sync.Once
+       defer once.Do(func() { stop() })
+       timer := time.AfterFunc(time.Minute, func() {
+               once.Do(func() {
+                       t.Error("test timed out; terminating pipe")
+                       stop()
+               })
+       })
+       defer timer.Stop()
+       f(t, c1, c2)
+}
+
+// testBasicIO tests that the data sent on c1 is properly received on c2.
+func testBasicIO(t *testing.T, c1, c2 net.Conn) {
+       want := make([]byte, 1<<20)
+       rand.New(rand.NewSource(0)).Read(want)
+
+       dataCh := make(chan []byte)
+       go func() {
+               rd := bytes.NewReader(want)
+               if err := chunkedCopy(c1, rd); err != nil {
+                       t.Errorf("unexpected c1.Write error: %v", err)
+               }
+               if err := c1.Close(); err != nil {
+                       t.Errorf("unexpected c1.Close error: %v", err)
+               }
+       }()
+
+       go func() {
+               wr := new(bytes.Buffer)
+               if err := chunkedCopy(wr, c2); err != nil {
+                       t.Errorf("unexpected c2.Read error: %v", err)
+               }
+               if err := c2.Close(); err != nil {
+                       t.Errorf("unexpected c2.Close error: %v", err)
+               }
+               dataCh <- wr.Bytes()
+       }()
+
+       if got := <-dataCh; !bytes.Equal(got, want) {
+               t.Error("transmitted data differs")
+       }
+}
+
+// testPingPong tests that the two endpoints can synchronously send data to
+// each other in a typical request-response pattern.
+func testPingPong(t *testing.T, c1, c2 net.Conn) {
+       var wg sync.WaitGroup
+       defer wg.Wait()
+
+       pingPonger := func(c net.Conn) {
+               defer wg.Done()
+               buf := make([]byte, 8)
+               var prev uint64
+               for {
+                       if _, err := io.ReadFull(c, buf); err != nil {
+                               if err == io.EOF {
+                                       break
+                               }
+                               t.Errorf("unexpected Read error: %v", err)
+                       }
+
+                       v := binary.LittleEndian.Uint64(buf)
+                       binary.LittleEndian.PutUint64(buf, v+1)
+                       if prev != 0 && prev+2 != v {
+                               t.Errorf("mismatching value: got %d, want %d", v, prev+2)
+                       }
+                       prev = v
+                       if v == 1000 {
+                               break
+                       }
+
+                       if _, err := c.Write(buf); err != nil {
+                               t.Errorf("unexpected Write error: %v", err)
+                               break
+                       }
+               }
+               if err := c.Close(); err != nil {
+                       t.Errorf("unexpected Close error: %v", err)
+               }
+       }
+
+       wg.Add(2)
+       go pingPonger(c1)
+       go pingPonger(c2)
+
+       // Start off the chain reaction.
+       if _, err := c1.Write(make([]byte, 8)); err != nil {
+               t.Errorf("unexpected c1.Write error: %v", err)
+       }
+}
+
+// testRacyRead tests that it is safe to mutate the input Read buffer
+// immediately after cancelation has occurred.
+func testRacyRead(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(c2, rand.New(rand.NewSource(0)))
+
+       var wg sync.WaitGroup
+       defer wg.Wait()
+
+       c1.SetReadDeadline(time.Now().Add(time.Millisecond))
+       for i := 0; i < 10; i++ {
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+
+                       b1 := make([]byte, 1024)
+                       b2 := make([]byte, 1024)
+                       for j := 0; j < 100; j++ {
+                               _, err := c1.Read(b1)
+                               copy(b1, b2) // Mutate b1 to trigger potential race
+                               if err != nil {
+                                       checkForTimeoutError(t, err)
+                                       c1.SetReadDeadline(time.Now().Add(time.Millisecond))
+                               }
+                       }
+               }()
+       }
+}
+
+// testRacyWrite tests that it is safe to mutate the input Write buffer
+// immediately after cancelation has occurred.
+func testRacyWrite(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(ioutil.Discard, c2)
+
+       var wg sync.WaitGroup
+       defer wg.Wait()
+
+       c1.SetWriteDeadline(time.Now().Add(time.Millisecond))
+       for i := 0; i < 10; i++ {
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+
+                       b1 := make([]byte, 1024)
+                       b2 := make([]byte, 1024)
+                       for j := 0; j < 100; j++ {
+                               _, err := c1.Write(b1)
+                               copy(b1, b2) // Mutate b1 to trigger potential race
+                               if err != nil {
+                                       checkForTimeoutError(t, err)
+                                       c1.SetWriteDeadline(time.Now().Add(time.Millisecond))
+                               }
+                       }
+               }()
+       }
+}
+
+// testReadTimeout tests that Read timeouts do not affect Write.
+func testReadTimeout(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(ioutil.Discard, c2)
+
+       c1.SetReadDeadline(aLongTimeAgo)
+       _, err := c1.Read(make([]byte, 1024))
+       checkForTimeoutError(t, err)
+       if _, err := c1.Write(make([]byte, 1024)); err != nil {
+               t.Errorf("unexpected Write error: %v", err)
+       }
+}
+
+// testWriteTimeout tests that Write timeouts do not affect Read.
+func testWriteTimeout(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(c2, rand.New(rand.NewSource(0)))
+
+       c1.SetWriteDeadline(aLongTimeAgo)
+       _, err := c1.Write(make([]byte, 1024))
+       checkForTimeoutError(t, err)
+       if _, err := c1.Read(make([]byte, 1024)); err != nil {
+               t.Errorf("unexpected Read error: %v", err)
+       }
+}
+
+// testPastTimeout tests that a deadline set in the past immediately times out
+// Read and Write requests.
+func testPastTimeout(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(c2, c2)
+
+       testRoundtrip(t, c1)
+
+       c1.SetDeadline(aLongTimeAgo)
+       n, err := c1.Write(make([]byte, 1024))
+       if n != 0 {
+               t.Errorf("unexpected Write count: got %d, want 0", n)
+       }
+       checkForTimeoutError(t, err)
+       n, err = c1.Read(make([]byte, 1024))
+       if n != 0 {
+               t.Errorf("unexpected Read count: got %d, want 0", n)
+       }
+       checkForTimeoutError(t, err)
+
+       testRoundtrip(t, c1)
+}
+
+// testPresentTimeout tests that a past deadline set while there are pending
+// Read and Write operations immediately times out those operations.
+func testPresentTimeout(t *testing.T, c1, c2 net.Conn) {
+       var wg sync.WaitGroup
+       defer wg.Wait()
+       wg.Add(3)
+
+       deadlineSet := make(chan bool, 1)
+       go func() {
+               defer wg.Done()
+               time.Sleep(100 * time.Millisecond)
+               deadlineSet <- true
+               c1.SetReadDeadline(aLongTimeAgo)
+               c1.SetWriteDeadline(aLongTimeAgo)
+       }()
+       go func() {
+               defer wg.Done()
+               n, err := c1.Read(make([]byte, 1024))
+               if n != 0 {
+                       t.Errorf("unexpected Read count: got %d, want 0", n)
+               }
+               checkForTimeoutError(t, err)
+               if len(deadlineSet) == 0 {
+                       t.Error("Read timed out before deadline is set")
+               }
+       }()
+       go func() {
+               defer wg.Done()
+               var err error
+               for err == nil {
+                       _, err = c1.Write(make([]byte, 1024))
+               }
+               checkForTimeoutError(t, err)
+               if len(deadlineSet) == 0 {
+                       t.Error("Write timed out before deadline is set")
+               }
+       }()
+}
+
+// testFutureTimeout tests that a future deadline will eventually time out
+// Read and Write operations.
+func testFutureTimeout(t *testing.T, c1, c2 net.Conn) {
+       var wg sync.WaitGroup
+       wg.Add(2)
+
+       c1.SetDeadline(time.Now().Add(100 * time.Millisecond))
+       go func() {
+               defer wg.Done()
+               _, err := c1.Read(make([]byte, 1024))
+               checkForTimeoutError(t, err)
+       }()
+       go func() {
+               defer wg.Done()
+               var err error
+               for err == nil {
+                       _, err = c1.Write(make([]byte, 1024))
+               }
+               checkForTimeoutError(t, err)
+       }()
+       wg.Wait()
+
+       go chunkedCopy(c2, c2)
+       resyncConn(t, c1)
+       testRoundtrip(t, c1)
+}
+
+// testCloseTimeout tests that calling Close immediately times out pending
+// Read and Write operations.
+func testCloseTimeout(t *testing.T, c1, c2 net.Conn) {
+       go chunkedCopy(c2, c2)
+
+       var wg sync.WaitGroup
+       defer wg.Wait()
+       wg.Add(3)
+
+       // Test for cancelation upon connection closure.
+       c1.SetDeadline(neverTimeout)
+       go func() {
+               defer wg.Done()
+               time.Sleep(100 * time.Millisecond)
+               c1.Close()
+       }()
+       go func() {
+               defer wg.Done()
+               var err error
+               buf := make([]byte, 1024)
+               for err == nil {
+                       _, err = c1.Read(buf)
+               }
+       }()
+       go func() {
+               defer wg.Done()
+               var err error
+               buf := make([]byte, 1024)
+               for err == nil {
+                       _, err = c1.Write(buf)
+               }
+       }()
+}
+
+// testConcurrentMethods tests that the methods of net.Conn can safely
+// be called concurrently.
+func testConcurrentMethods(t *testing.T, c1, c2 net.Conn) {
+       if runtime.GOOS == "plan9" {
+               t.Skip("skipping on plan9; see https://golang.org/issue/20489")
+       }
+       go chunkedCopy(c2, c2)
+
+       // The results of the calls may be nonsensical, but this should
+       // not trigger a race detector warning.
+       var wg sync.WaitGroup
+       for i := 0; i < 100; i++ {
+               wg.Add(7)
+               go func() {
+                       defer wg.Done()
+                       c1.Read(make([]byte, 1024))
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.Write(make([]byte, 1024))
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.SetDeadline(time.Now().Add(10 * time.Millisecond))
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.SetReadDeadline(aLongTimeAgo)
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.SetWriteDeadline(aLongTimeAgo)
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.LocalAddr()
+               }()
+               go func() {
+                       defer wg.Done()
+                       c1.RemoteAddr()
+               }()
+       }
+       wg.Wait() // At worst, the deadline is set 10ms into the future
+
+       resyncConn(t, c1)
+       testRoundtrip(t, c1)
+}
+
+// checkForTimeoutError checks that the error satisfies the Error interface
+// and that Timeout returns true.
+func checkForTimeoutError(t *testing.T, err error) {
+       t.Helper()
+       if nerr, ok := err.(net.Error); ok {
+               if !nerr.Timeout() {
+                       t.Errorf("err.Timeout() = false, want true")
+               }
+       } else {
+               t.Errorf("got %T, want net.Error", err)
+       }
+}
+
+// testRoundtrip writes something into c and reads it back.
+// It assumes that everything written into c is echoed back to itself.
+func testRoundtrip(t *testing.T, c net.Conn) {
+       t.Helper()
+       if err := c.SetDeadline(neverTimeout); err != nil {
+               t.Errorf("roundtrip SetDeadline error: %v", err)
+       }
+
+       const s = "Hello, world!"
+       buf := []byte(s)
+       if _, err := c.Write(buf); err != nil {
+               t.Errorf("roundtrip Write error: %v", err)
+       }
+       if _, err := io.ReadFull(c, buf); err != nil {
+               t.Errorf("roundtrip Read error: %v", err)
+       }
+       if string(buf) != s {
+               t.Errorf("roundtrip data mismatch: got %q, want %q", buf, s)
+       }
+}
+
+// resyncConn resynchronizes the connection into a sane state.
+// It assumes that everything written into c is echoed back to itself.
+// It assumes that 0xff is not currently on the wire or in the read buffer.
+func resyncConn(t *testing.T, c net.Conn) {
+       t.Helper()
+       c.SetDeadline(neverTimeout)
+       errCh := make(chan error)
+       go func() {
+               _, err := c.Write([]byte{0xff})
+               errCh <- err
+       }()
+       buf := make([]byte, 1024)
+       for {
+               n, err := c.Read(buf)
+               if n > 0 && bytes.IndexByte(buf[:n], 0xff) == n-1 {
+                       break
+               }
+               if err != nil {
+                       t.Errorf("unexpected Read error: %v", err)
+                       break
+               }
+       }
+       if err := <-errCh; err != nil {
+               t.Errorf("unexpected Write error: %v", err)
+       }
+}
+
+// chunkedCopy copies from r to w in fixed-width chunks to avoid
+// causing a Write that exceeds the maximum packet size for packet-based
+// connections like "unixpacket".
+// We assume that the maximum packet size is at least 1024.
+func chunkedCopy(w io.Writer, r io.Reader) error {
+       b := make([]byte, 1024)
+       _, err := io.CopyBuffer(struct{ io.Writer }{w}, struct{ io.Reader }{r}, b)
+       return err
+}
diff --git a/libgo/go/golang.org/x/net/nettest/nettest.go b/libgo/go/golang.org/x/net/nettest/nettest.go
new file mode 100644 (file)
index 0000000..717bbb0
--- /dev/null
@@ -0,0 +1,345 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package nettest provides utilities for network testing.
+package nettest
+
+import (
+       "errors"
+       "fmt"
+       "io/ioutil"
+       "net"
+       "os"
+       "os/exec"
+       "runtime"
+       "strconv"
+       "strings"
+       "sync"
+       "time"
+)
+
+var (
+       stackOnce     sync.Once
+       ipv4Enabled   bool
+       ipv6Enabled   bool
+       rawSocketSess bool
+       aixTechLvl    int
+
+       aLongTimeAgo = time.Unix(233431200, 0)
+       neverTimeout = time.Time{}
+
+       errNoAvailableInterface = errors.New("no available interface")
+       errNoAvailableAddress   = errors.New("no available address")
+)
+
+func probeStack() {
+       if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
+               ln.Close()
+               ipv4Enabled = true
+       }
+       if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil {
+               ln.Close()
+               ipv6Enabled = true
+       }
+       rawSocketSess = supportsRawSocket()
+       if runtime.GOOS == "aix" {
+               out, err := exec.Command("oslevel", "-s").Output()
+               if err == nil {
+                       aixTechLvl, _ = strconv.Atoi(string(out[5:7]))
+               }
+       }
+}
+
+func aixTechLevel() int {
+       stackOnce.Do(probeStack)
+       return aixTechLvl
+}
+
+// SupportsIPv4 reports whether the platform supports IPv4 networking
+// functionality.
+func SupportsIPv4() bool {
+       stackOnce.Do(probeStack)
+       return ipv4Enabled
+}
+
+// SupportsIPv6 reports whether the platform supports IPv6 networking
+// functionality.
+func SupportsIPv6() bool {
+       stackOnce.Do(probeStack)
+       return ipv6Enabled
+}
+
+// SupportsRawSocket reports whether the current session is available
+// to use raw sockets.
+func SupportsRawSocket() bool {
+       stackOnce.Do(probeStack)
+       return rawSocketSess
+}
+
+// TestableNetwork reports whether network is testable on the current
+// platform configuration.
+//
+// See func Dial of the standard library for the supported networks.
+func TestableNetwork(network string) bool {
+       ss := strings.Split(network, ":")
+       switch ss[0] {
+       case "ip+nopriv":
+               // This is an internal network name for testing on the
+               // package net of the standard library.
+               switch runtime.GOOS {
+               case "android", "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
+                       return false
+               case "darwin":
+                       // iOS doesn't support it.
+                       if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
+                               return false
+                       }
+               }
+       case "ip", "ip4", "ip6":
+               switch runtime.GOOS {
+               case "fuchsia", "hurd", "js", "nacl", "plan9":
+                       return false
+               default:
+                       if os.Getuid() != 0 {
+                               return false
+                       }
+               }
+       case "unix", "unixgram":
+               switch runtime.GOOS {
+               case "android", "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
+                       return false
+               case "aix":
+                       // Unix network isn't properly working on AIX
+                       // 7.2 with Technical Level < 2.
+                       if aixTechLevel() < 2 {
+                               return false
+                       }
+                       return true
+               case "darwin":
+                       // iOS does not support unix, unixgram.
+                       if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
+                               return false
+                       }
+               }
+       case "unixpacket":
+               switch runtime.GOOS {
+               case "aix", "android", "fuchsia", "hurd", "darwin", "js", "nacl", "plan9", "windows":
+                       return false
+               case "netbsd":
+                       // It passes on amd64 at least. 386 fails
+                       // (Issue 22927). arm is unknown.
+                       if runtime.GOARCH == "386" {
+                               return false
+                       }
+               }
+       }
+       switch ss[0] {
+       case "tcp4", "udp4", "ip4":
+               return SupportsIPv4()
+       case "tcp6", "udp6", "ip6":
+               return SupportsIPv6()
+       }
+       return true
+}
+
+// TestableAddress reports whether address of network is testable on
+// the current platform configuration.
+func TestableAddress(network, address string) bool {
+       switch ss := strings.Split(network, ":"); ss[0] {
+       case "unix", "unixgram", "unixpacket":
+               // Abstract unix domain sockets, a Linux-ism.
+               if address[0] == '@' && runtime.GOOS != "linux" {
+                       return false
+               }
+       }
+       return true
+}
+
+// NewLocalListener returns a listener which listens to a loopback IP
+// address or local file system path.
+//
+// The provided network must be "tcp", "tcp4", "tcp6", "unix" or
+// "unixpacket".
+func NewLocalListener(network string) (net.Listener, error) {
+       switch network {
+       case "tcp":
+               if SupportsIPv4() {
+                       if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
+                               return ln, nil
+                       }
+               }
+               if SupportsIPv6() {
+                       return net.Listen("tcp6", "[::1]:0")
+               }
+       case "tcp4":
+               if SupportsIPv4() {
+                       return net.Listen("tcp4", "127.0.0.1:0")
+               }
+       case "tcp6":
+               if SupportsIPv6() {
+                       return net.Listen("tcp6", "[::1]:0")
+               }
+       case "unix", "unixpacket":
+               path, err := LocalPath()
+               if err != nil {
+                       return nil, err
+               }
+               return net.Listen(network, path)
+       }
+       return nil, fmt.Errorf("%s is not supported on %s/%s", network, runtime.GOOS, runtime.GOARCH)
+}
+
+// NewLocalPacketListener returns a packet listener which listens to a
+// loopback IP address or local file system path.
+//
+// The provided network must be "udp", "udp4", "udp6" or "unixgram".
+func NewLocalPacketListener(network string) (net.PacketConn, error) {
+       switch network {
+       case "udp":
+               if SupportsIPv4() {
+                       if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil {
+                               return c, nil
+                       }
+               }
+               if SupportsIPv6() {
+                       return net.ListenPacket("udp6", "[::1]:0")
+               }
+       case "udp4":
+               if SupportsIPv4() {
+                       return net.ListenPacket("udp4", "127.0.0.1:0")
+               }
+       case "udp6":
+               if SupportsIPv6() {
+                       return net.ListenPacket("udp6", "[::1]:0")
+               }
+       case "unixgram":
+               path, err := LocalPath()
+               if err != nil {
+                       return nil, err
+               }
+               return net.ListenPacket(network, path)
+       }
+       return nil, fmt.Errorf("%s is not supported on %s/%s", network, runtime.GOOS, runtime.GOARCH)
+}
+
+// LocalPath returns a local path that can be used for Unix-domain
+// protocol testing.
+func LocalPath() (string, error) {
+       f, err := ioutil.TempFile("", "go-nettest")
+       if err != nil {
+               return "", err
+       }
+       path := f.Name()
+       f.Close()
+       os.Remove(path)
+       return path, nil
+}
+
+// MulticastSource returns a unicast IP address on ifi when ifi is an
+// IP multicast-capable network interface.
+//
+// The provided network must be "ip", "ip4" or "ip6".
+func MulticastSource(network string, ifi *net.Interface) (net.IP, error) {
+       switch network {
+       case "ip", "ip4", "ip6":
+       default:
+               return nil, errNoAvailableAddress
+       }
+       if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 {
+               return nil, errNoAvailableAddress
+       }
+       ip, ok := hasRoutableIP(network, ifi)
+       if !ok {
+               return nil, errNoAvailableAddress
+       }
+       return ip, nil
+}
+
+// LoopbackInterface returns an available logical network interface
+// for loopback test.
+func LoopbackInterface() (*net.Interface, error) {
+       ift, err := net.Interfaces()
+       if err != nil {
+               return nil, errNoAvailableInterface
+       }
+       for _, ifi := range ift {
+               if ifi.Flags&net.FlagLoopback != 0 && ifi.Flags&net.FlagUp != 0 {
+                       return &ifi, nil
+               }
+       }
+       return nil, errNoAvailableInterface
+}
+
+// RoutedInterface returns a network interface that can route IP
+// traffic and satisfies flags.
+//
+// The provided network must be "ip", "ip4" or "ip6".
+func RoutedInterface(network string, flags net.Flags) (*net.Interface, error) {
+       switch network {
+       case "ip", "ip4", "ip6":
+       default:
+               return nil, errNoAvailableInterface
+       }
+       ift, err := net.Interfaces()
+       if err != nil {
+               return nil, errNoAvailableInterface
+       }
+       for _, ifi := range ift {
+               if ifi.Flags&flags != flags {
+                       continue
+               }
+               if _, ok := hasRoutableIP(network, &ifi); !ok {
+                       continue
+               }
+               return &ifi, nil
+       }
+       return nil, errNoAvailableInterface
+}
+
+func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) {
+       ifat, err := ifi.Addrs()
+       if err != nil {
+               return nil, false
+       }
+       for _, ifa := range ifat {
+               switch ifa := ifa.(type) {
+               case *net.IPAddr:
+                       if ip, ok := routableIP(network, ifa.IP); ok {
+                               return ip, true
+                       }
+               case *net.IPNet:
+                       if ip, ok := routableIP(network, ifa.IP); ok {
+                               return ip, true
+                       }
+               }
+       }
+       return nil, false
+}
+
+func routableIP(network string, ip net.IP) (net.IP, bool) {
+       if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() {
+               return nil, false
+       }
+       switch network {
+       case "ip4":
+               if ip := ip.To4(); ip != nil {
+                       return ip, true
+               }
+       case "ip6":
+               if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation
+                       return nil, false
+               }
+               if ip := ip.To16(); ip != nil && ip.To4() == nil {
+                       return ip, true
+               }
+       default:
+               if ip := ip.To4(); ip != nil {
+                       return ip, true
+               }
+               if ip := ip.To16(); ip != nil {
+                       return ip, true
+               }
+       }
+       return nil, false
+}
diff --git a/libgo/go/golang.org/x/net/nettest/nettest_stub.go b/libgo/go/golang.org/x/net/nettest/nettest_stub.go
new file mode 100644 (file)
index 0000000..2bb8c05
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
+
+package nettest
+
+func supportsRawSocket() bool {
+       return false
+}
diff --git a/libgo/go/golang.org/x/net/nettest/nettest_unix.go b/libgo/go/golang.org/x/net/nettest/nettest_unix.go
new file mode 100644 (file)
index 0000000..afff744
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package nettest
+
+import "syscall"
+
+func supportsRawSocket() bool {
+       for _, af := range []int{syscall.AF_INET, syscall.AF_INET6} {
+               s, err := syscall.Socket(af, syscall.SOCK_RAW, 0)
+               if err != nil {
+                       continue
+               }
+               syscall.Close(s)
+               return true
+       }
+       return false
+}
diff --git a/libgo/go/golang.org/x/net/nettest/nettest_windows.go b/libgo/go/golang.org/x/net/nettest/nettest_windows.go
new file mode 100644 (file)
index 0000000..4939964
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package nettest
+
+import "syscall"
+
+func supportsRawSocket() bool {
+       // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx:
+       // Note: To use a socket of type SOCK_RAW requires administrative privileges.
+       // Users running Winsock applications that use raw sockets must be a member of
+       // the Administrators group on the local computer, otherwise raw socket calls
+       // will fail with an error code of WSAEACCES. On Windows Vista and later, access
+       // for raw sockets is enforced at socket creation. In earlier versions of Windows,
+       // access for raw sockets is enforced during other socket operations.
+       for _, af := range []int{syscall.AF_INET, syscall.AF_INET6} {
+               s, err := syscall.Socket(af, syscall.SOCK_RAW, 0)
+               if err != nil {
+                       continue
+               }
+               syscall.Closesocket(s)
+               return true
+       }
+       return false
+}
diff --git a/libgo/go/golang.org/x/net/route/address.go b/libgo/go/golang.org/x/net/route/address.go
new file mode 100644 (file)
index 0000000..e6bfa39
--- /dev/null
@@ -0,0 +1,425 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package route
+
+import "runtime"
+
+// An Addr represents an address associated with packet routing.
+type Addr interface {
+       // Family returns an address family.
+       Family() int
+}
+
+// A LinkAddr represents a link-layer address.
+type LinkAddr struct {
+       Index int    // interface index when attached
+       Name  string // interface name when attached
+       Addr  []byte // link-layer address when attached
+}
+
+// Family implements the Family method of Addr interface.
+func (a *LinkAddr) Family() int { return sysAF_LINK }
+
+func (a *LinkAddr) lenAndSpace() (int, int) {
+       l := 8 + len(a.Name) + len(a.Addr)
+       return l, roundup(l)
+}
+
+func (a *LinkAddr) marshal(b []byte) (int, error) {
+       l, ll := a.lenAndSpace()
+       if len(b) < ll {
+               return 0, errShortBuffer
+       }
+       nlen, alen := len(a.Name), len(a.Addr)
+       if nlen > 255 || alen > 255 {
+               return 0, errInvalidAddr
+       }
+       b[0] = byte(l)
+       b[1] = sysAF_LINK
+       if a.Index > 0 {
+               nativeEndian.PutUint16(b[2:4], uint16(a.Index))
+       }
+       data := b[8:]
+       if nlen > 0 {
+               b[5] = byte(nlen)
+               copy(data[:nlen], a.Addr)
+               data = data[nlen:]
+       }
+       if alen > 0 {
+               b[6] = byte(alen)
+               copy(data[:alen], a.Name)
+               data = data[alen:]
+       }
+       return ll, nil
+}
+
+func parseLinkAddr(b []byte) (Addr, error) {
+       if len(b) < 8 {
+               return nil, errInvalidAddr
+       }
+       _, a, err := parseKernelLinkAddr(sysAF_LINK, b[4:])
+       if err != nil {
+               return nil, err
+       }
+       a.(*LinkAddr).Index = int(nativeEndian.Uint16(b[2:4]))
+       return a, nil
+}
+
+// parseKernelLinkAddr parses b as a link-layer address in
+// conventional BSD kernel form.
+func parseKernelLinkAddr(_ int, b []byte) (int, Addr, error) {
+       // The encoding looks like the following:
+       // +----------------------------+
+       // | Type             (1 octet) |
+       // +----------------------------+
+       // | Name length      (1 octet) |
+       // +----------------------------+
+       // | Address length   (1 octet) |
+       // +----------------------------+
+       // | Selector length  (1 octet) |
+       // +----------------------------+
+       // | Data            (variable) |
+       // +----------------------------+
+       //
+       // On some platforms, all-bit-one of length field means "don't
+       // care".
+       nlen, alen, slen := int(b[1]), int(b[2]), int(b[3])
+       if nlen == 0xff {
+               nlen = 0
+       }
+       if alen == 0xff {
+               alen = 0
+       }
+       if slen == 0xff {
+               slen = 0
+       }
+       l := 4 + nlen + alen + slen
+       if len(b) < l {
+               return 0, nil, errInvalidAddr
+       }
+       data := b[4:]
+       var name string
+       var addr []byte
+       if nlen > 0 {
+               name = string(data[:nlen])
+               data = data[nlen:]
+       }
+       if alen > 0 {
+               addr = data[:alen]
+               data = data[alen:]
+       }
+       return l, &LinkAddr{Name: name, Addr: addr}, nil
+}
+
+// An Inet4Addr represents an internet address for IPv4.
+type Inet4Addr struct {
+       IP [4]byte // IP address
+}
+
+// Family implements the Family method of Addr interface.
+func (a *Inet4Addr) Family() int { return sysAF_INET }
+
+func (a *Inet4Addr) lenAndSpace() (int, int) {
+       return sizeofSockaddrInet, roundup(sizeofSockaddrInet)
+}
+
+func (a *Inet4Addr) marshal(b []byte) (int, error) {
+       l, ll := a.lenAndSpace()
+       if len(b) < ll {
+               return 0, errShortBuffer
+       }
+       b[0] = byte(l)
+       b[1] = sysAF_INET
+       copy(b[4:8], a.IP[:])
+       return ll, nil
+}
+
+// An Inet6Addr represents an internet address for IPv6.
+type Inet6Addr struct {
+       IP     [16]byte // IP address
+       ZoneID int      // zone identifier
+}
+
+// Family implements the Family method of Addr interface.
+func (a *Inet6Addr) Family() int { return sysAF_INET6 }
+
+func (a *Inet6Addr) lenAndSpace() (int, int) {
+       return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6)
+}
+
+func (a *Inet6Addr) marshal(b []byte) (int, error) {
+       l, ll := a.lenAndSpace()
+       if len(b) < ll {
+               return 0, errShortBuffer
+       }
+       b[0] = byte(l)
+       b[1] = sysAF_INET6
+       copy(b[8:24], a.IP[:])
+       if a.ZoneID > 0 {
+               nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID))
+       }
+       return ll, nil
+}
+
+// parseInetAddr parses b as an internet address for IPv4 or IPv6.
+func parseInetAddr(af int, b []byte) (Addr, error) {
+       switch af {
+       case sysAF_INET:
+               if len(b) < sizeofSockaddrInet {
+                       return nil, errInvalidAddr
+               }
+               a := &Inet4Addr{}
+               copy(a.IP[:], b[4:8])
+               return a, nil
+       case sysAF_INET6:
+               if len(b) < sizeofSockaddrInet6 {
+                       return nil, errInvalidAddr
+               }
+               a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))}
+               copy(a.IP[:], b[8:24])
+               if a.IP[0] == 0xfe && a.IP[1]&0xc0 == 0x80 || a.IP[0] == 0xff && (a.IP[1]&0x0f == 0x01 || a.IP[1]&0x0f == 0x02) {
+                       // KAME based IPv6 protocol stack usually
+                       // embeds the interface index in the
+                       // interface-local or link-local address as
+                       // the kernel-internal form.
+                       id := int(bigEndian.Uint16(a.IP[2:4]))
+                       if id != 0 {
+                               a.ZoneID = id
+                               a.IP[2], a.IP[3] = 0, 0
+                       }
+               }
+               return a, nil
+       default:
+               return nil, errInvalidAddr
+       }
+}
+
+// parseKernelInetAddr parses b as an internet address in conventional
+// BSD kernel form.
+func parseKernelInetAddr(af int, b []byte) (int, Addr, error) {
+       // The encoding looks similar to the NLRI encoding.
+       // +----------------------------+
+       // | Length           (1 octet) |
+       // +----------------------------+
+       // | Address prefix  (variable) |
+       // +----------------------------+
+       //
+       // The differences between the kernel form and the NLRI
+       // encoding are:
+       //
+       // - The length field of the kernel form indicates the prefix
+       //   length in bytes, not in bits
+       //
+       // - In the kernel form, zero value of the length field
+       //   doesn't mean 0.0.0.0/0 or ::/0
+       //
+       // - The kernel form appends leading bytes to the prefix field
+       //   to make the <length, prefix> tuple to be conformed with
+       //   the routing message boundary
+       l := int(b[0])
+       if runtime.GOOS == "darwin" {
+               // On Darwn, an address in the kernel form is also
+               // used as a message filler.
+               if l == 0 || len(b) > roundup(l) {
+                       l = roundup(l)
+               }
+       } else {
+               l = roundup(l)
+       }
+       if len(b) < l {
+               return 0, nil, errInvalidAddr
+       }
+       // Don't reorder case expressions.
+       // The case expressions for IPv6 must come first.
+       const (
+               off4 = 4 // offset of in_addr
+               off6 = 8 // offset of in6_addr
+       )
+       switch {
+       case b[0] == sizeofSockaddrInet6:
+               a := &Inet6Addr{}
+               copy(a.IP[:], b[off6:off6+16])
+               return int(b[0]), a, nil
+       case af == sysAF_INET6:
+               a := &Inet6Addr{}
+               if l-1 < off6 {
+                       copy(a.IP[:], b[1:l])
+               } else {
+                       copy(a.IP[:], b[l-off6:l])
+               }
+               return int(b[0]), a, nil
+       case b[0] == sizeofSockaddrInet:
+               a := &Inet4Addr{}
+               copy(a.IP[:], b[off4:off4+4])
+               return int(b[0]), a, nil
+       default: // an old fashion, AF_UNSPEC or unknown means AF_INET
+               a := &Inet4Addr{}
+               if l-1 < off4 {
+                       copy(a.IP[:], b[1:l])
+               } else {
+                       copy(a.IP[:], b[l-off4:l])
+               }
+               return int(b[0]), a, nil
+       }
+}
+
+// A DefaultAddr represents an address of various operating
+// system-specific features.
+type DefaultAddr struct {
+       af  int
+       Raw []byte // raw format of address
+}
+
+// Family implements the Family method of Addr interface.
+func (a *DefaultAddr) Family() int { return a.af }
+
+func (a *DefaultAddr) lenAndSpace() (int, int) {
+       l := len(a.Raw)
+       return l, roundup(l)
+}
+
+func (a *DefaultAddr) marshal(b []byte) (int, error) {
+       l, ll := a.lenAndSpace()
+       if len(b) < ll {
+               return 0, errShortBuffer
+       }
+       if l > 255 {
+               return 0, errInvalidAddr
+       }
+       b[1] = byte(l)
+       copy(b[:l], a.Raw)
+       return ll, nil
+}
+
+func parseDefaultAddr(b []byte) (Addr, error) {
+       if len(b) < 2 || len(b) < int(b[0]) {
+               return nil, errInvalidAddr
+       }
+       a := &DefaultAddr{af: int(b[1]), Raw: b[:b[0]]}
+       return a, nil
+}
+
+func addrsSpace(as []Addr) int {
+       var l int
+       for _, a := range as {
+               switch a := a.(type) {
+               case *LinkAddr:
+                       _, ll := a.lenAndSpace()
+                       l += ll
+               case *Inet4Addr:
+                       _, ll := a.lenAndSpace()
+                       l += ll
+               case *Inet6Addr:
+                       _, ll := a.lenAndSpace()
+                       l += ll
+               case *DefaultAddr:
+                       _, ll := a.lenAndSpace()
+                       l += ll
+               }
+       }
+       return l
+}
+
+// marshalAddrs marshals as and returns a bitmap indicating which
+// address is stored in b.
+func marshalAddrs(b []byte, as []Addr) (uint, error) {
+       var attrs uint
+       for i, a := range as {
+               switch a := a.(type) {
+               case *LinkAddr:
+                       l, err := a.marshal(b)
+                       if err != nil {
+                               return 0, err
+                       }
+                       b = b[l:]
+                       attrs |= 1 << uint(i)
+               case *Inet4Addr:
+                       l, err := a.marshal(b)
+                       if err != nil {
+                               return 0, err
+                       }
+                       b = b[l:]
+                       attrs |= 1 << uint(i)
+               case *Inet6Addr:
+                       l, err := a.marshal(b)
+                       if err != nil {
+                               return 0, err
+                       }
+                       b = b[l:]
+                       attrs |= 1 << uint(i)
+               case *DefaultAddr:
+                       l, err := a.marshal(b)
+                       if err != nil {
+                               return 0, err
+                       }
+                       b = b[l:]
+                       attrs |= 1 << uint(i)
+               }
+       }
+       return attrs, nil
+}
+
+func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) {
+       var as [sysRTAX_MAX]Addr
+       af := int(sysAF_UNSPEC)
+       for i := uint(0); i < sysRTAX_MAX && len(b) >= roundup(0); i++ {
+               if attrs&(1<<i) == 0 {
+                       continue
+               }
+               if i <= sysRTAX_BRD {
+                       switch b[1] {
+                       case sysAF_LINK:
+                               a, err := parseLinkAddr(b)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               as[i] = a
+                               l := roundup(int(b[0]))
+                               if len(b) < l {
+                                       return nil, errMessageTooShort
+                               }
+                               b = b[l:]
+                       case sysAF_INET, sysAF_INET6:
+                               af = int(b[1])
+                               a, err := parseInetAddr(af, b)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               as[i] = a
+                               l := roundup(int(b[0]))
+                               if len(b) < l {
+                                       return nil, errMessageTooShort
+                               }
+                               b = b[l:]
+                       default:
+                               l, a, err := fn(af, b)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               as[i] = a
+                               ll := roundup(l)
+                               if len(b) < ll {
+                                       b = b[l:]
+                               } else {
+                                       b = b[ll:]
+                               }
+                       }
+               } else {
+                       a, err := parseDefaultAddr(b)
+                       if err != nil {
+                               return nil, err
+                       }
+                       as[i] = a
+                       l := roundup(int(b[0]))
+                       if len(b) < l {
+                               return nil, errMessageTooShort
+                       }
+                       b = b[l:]
+               }
+       }
+       return as[:], nil
+}
diff --git a/libgo/go/golang.org/x/net/route/binary.go b/libgo/go/golang.org/x/net/route/binary.go
new file mode 100644 (file)
index 0000000..6910520
--- /dev/null
@@ -0,0 +1,90 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package route
+
+// This file contains duplicates of encoding/binary package.
+//
+// This package is supposed to be used by the net package of standard
+// library. Therefore the package set used in the package must be the
+// same as net package.
+
+var (
+       littleEndian binaryLittleEndian
+       bigEndian    binaryBigEndian
+)
+
+type binaryByteOrder interface {
+       Uint16([]byte) uint16
+       Uint32([]byte) uint32
+       PutUint16([]byte, uint16)
+       PutUint32([]byte, uint32)
+       Uint64([]byte) uint64
+}
+
+type binaryLittleEndian struct{}
+
+func (binaryLittleEndian) Uint16(b []byte) uint16 {
+       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint16(b[0]) | uint16(b[1])<<8
+}
+
+func (binaryLittleEndian) PutUint16(b []byte, v uint16) {
+       _ = b[1] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v)
+       b[1] = byte(v >> 8)
+}
+
+func (binaryLittleEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
+}
+
+func (binaryLittleEndian) PutUint32(b []byte, v uint32) {
+       _ = b[3] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v)
+       b[1] = byte(v >> 8)
+       b[2] = byte(v >> 16)
+       b[3] = byte(v >> 24)
+}
+
+func (binaryLittleEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
+               uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
+}
+
+type binaryBigEndian struct{}
+
+func (binaryBigEndian) Uint16(b []byte) uint16 {
+       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint16(b[1]) | uint16(b[0])<<8
+}
+
+func (binaryBigEndian) PutUint16(b []byte, v uint16) {
+       _ = b[1] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v >> 8)
+       b[1] = byte(v)
+}
+
+func (binaryBigEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
+}
+
+func (binaryBigEndian) PutUint32(b []byte, v uint32) {
+       _ = b[3] // early bounds check to guarantee safety of writes below
+       b[0] = byte(v >> 24)
+       b[1] = byte(v >> 16)
+       b[2] = byte(v >> 8)
+       b[3] = byte(v)
+}
+
+func (binaryBigEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+               uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+}
diff --git a/libgo/go/golang.org/x/net/route/interface.go b/libgo/go/golang.org/x/net/route/interface.go
new file mode 100644 (file)
index 0000000..05ef2a9
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package route
+
+// An InterfaceMessage represents an interface message.
+type InterfaceMessage struct {
+       Version int    // message version
+       Type    int    // message type
+       Flags   int    // interface flags
+       Index   int    // interface index
+       Name    string // interface name
+       Addrs   []Addr // addresses
+
+       extOff int    // offset of header extension
+       raw    []byte // raw message
+}
+
+// An InterfaceAddrMessage represents an interface address message.
+type InterfaceAddrMessage struct {
+       Version int    // message version
+       Type    int    // message type
+       Flags   int    // interface flags
+       Index   int    // interface index
+       Addrs   []Addr // addresses
+
+       raw []byte // raw message
+}
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceAddrMessage) Sys() []Sys { return nil }
+
+// An InterfaceMulticastAddrMessage represents an interface multicast
+// address message.
+type InterfaceMulticastAddrMessage struct {
+       Version int    // message version
+       Type    int    // message type
+       Flags   int    // interface flags
+       Index   int    // interface index
+       Addrs   []Addr // addresses
+
+       raw []byte // raw message
+}
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMulticastAddrMessage) Sys() []Sys { return nil }
+
+// An InterfaceAnnounceMessage represents an interface announcement
+// message.
+type InterfaceAnnounceMessage struct {
+       Version int    // message version
+       Type    int    // message type
+       Index   int    // interface index
+       Name    string // interface name
+       What    int    // what type of announcement
+
+       raw []byte // raw message
+}
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceAnnounceMessage) Sys() []Sys { return nil }
diff --git a/libgo/go/golang.org/x/net/route/interface_announce.go b/libgo/go/golang.org/x/net/route/interface_announce.go
new file mode 100644 (file)
index 0000000..520d657
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build dragonfly freebsd netbsd
+
+package route
+
+func (w *wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < w.bodyOff {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceAnnounceMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Index:   int(nativeEndian.Uint16(b[4:6])),
+               What:    int(nativeEndian.Uint16(b[22:24])),
+               raw:     b[:l],
+       }
+       for i := 0; i < 16; i++ {
+               if b[6+i] != 0 {
+                       continue
+               }
+               m.Name = string(b[6 : 6+i])
+               break
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/interface_classic.go b/libgo/go/golang.org/x/net/route/interface_classic.go
new file mode 100644 (file)
index 0000000..ac4e7a6
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly netbsd
+
+package route
+
+import "runtime"
+
+func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < w.bodyOff {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       attrs := uint(nativeEndian.Uint32(b[4:8]))
+       if attrs&sysRTA_IFP == 0 {
+               return nil, nil
+       }
+       m := &InterfaceMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Addrs:   make([]Addr, sysRTAX_MAX),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               Index:   int(nativeEndian.Uint16(b[12:14])),
+               extOff:  w.extOff,
+               raw:     b[:l],
+       }
+       a, err := parseLinkAddr(b[w.bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       m.Addrs[sysRTAX_IFP] = a
+       m.Name = a.(*LinkAddr).Name
+       return m, nil
+}
+
+func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < w.bodyOff {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceAddrMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               raw:     b[:l],
+       }
+       if runtime.GOOS == "netbsd" {
+               m.Index = int(nativeEndian.Uint16(b[16:18]))
+       } else {
+               m.Index = int(nativeEndian.Uint16(b[12:14]))
+       }
+       var err error
+       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/interface_freebsd.go b/libgo/go/golang.org/x/net/route/interface_freebsd.go
new file mode 100644 (file)
index 0000000..9f6f50c
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) {
+       var extOff, bodyOff int
+       if typ == sysNET_RT_IFLISTL {
+               if len(b) < 20 {
+                       return nil, errMessageTooShort
+               }
+               extOff = int(nativeEndian.Uint16(b[18:20]))
+               bodyOff = int(nativeEndian.Uint16(b[16:18]))
+       } else {
+               extOff = w.extOff
+               bodyOff = w.bodyOff
+       }
+       if len(b) < extOff || len(b) < bodyOff {
+               return nil, errInvalidMessage
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       attrs := uint(nativeEndian.Uint32(b[4:8]))
+       if attrs&sysRTA_IFP == 0 {
+               return nil, nil
+       }
+       m := &InterfaceMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               Index:   int(nativeEndian.Uint16(b[12:14])),
+               Addrs:   make([]Addr, sysRTAX_MAX),
+               extOff:  extOff,
+               raw:     b[:l],
+       }
+       a, err := parseLinkAddr(b[bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       m.Addrs[sysRTAX_IFP] = a
+       m.Name = a.(*LinkAddr).Name
+       return m, nil
+}
+
+func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) {
+       var bodyOff int
+       if typ == sysNET_RT_IFLISTL {
+               if len(b) < 24 {
+                       return nil, errMessageTooShort
+               }
+               bodyOff = int(nativeEndian.Uint16(b[16:18]))
+       } else {
+               bodyOff = w.bodyOff
+       }
+       if len(b) < bodyOff {
+               return nil, errInvalidMessage
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceAddrMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               Index:   int(nativeEndian.Uint16(b[12:14])),
+               raw:     b[:l],
+       }
+       var err error
+       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/interface_multicast.go b/libgo/go/golang.org/x/net/route/interface_multicast.go
new file mode 100644 (file)
index 0000000..1e99a9c
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd
+
+package route
+
+func (w *wireFormat) parseInterfaceMulticastAddrMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < w.bodyOff {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceMulticastAddrMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               Index:   int(nativeEndian.Uint16(b[12:14])),
+               raw:     b[:l],
+       }
+       var err error
+       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/interface_openbsd.go b/libgo/go/golang.org/x/net/route/interface_openbsd.go
new file mode 100644 (file)
index 0000000..e4a143c
--- /dev/null
@@ -0,0 +1,90 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < 32 {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       attrs := uint(nativeEndian.Uint32(b[12:16]))
+       if attrs&sysRTA_IFP == 0 {
+               return nil, nil
+       }
+       m := &InterfaceMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[16:20])),
+               Index:   int(nativeEndian.Uint16(b[6:8])),
+               Addrs:   make([]Addr, sysRTAX_MAX),
+               raw:     b[:l],
+       }
+       ll := int(nativeEndian.Uint16(b[4:6]))
+       if len(b) < ll {
+               return nil, errInvalidMessage
+       }
+       a, err := parseLinkAddr(b[ll:])
+       if err != nil {
+               return nil, err
+       }
+       m.Addrs[sysRTAX_IFP] = a
+       m.Name = a.(*LinkAddr).Name
+       return m, nil
+}
+
+func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < 24 {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       bodyOff := int(nativeEndian.Uint16(b[4:6]))
+       if len(b) < bodyOff {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceAddrMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[12:16])),
+               Index:   int(nativeEndian.Uint16(b[6:8])),
+               raw:     b[:l],
+       }
+       var err error
+       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       return m, nil
+}
+
+func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < 26 {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &InterfaceAnnounceMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Index:   int(nativeEndian.Uint16(b[6:8])),
+               What:    int(nativeEndian.Uint16(b[8:10])),
+               raw:     b[:l],
+       }
+       for i := 0; i < 16; i++ {
+               if b[10+i] != 0 {
+                       continue
+               }
+               m.Name = string(b[10 : 10+i])
+               break
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/message.go b/libgo/go/golang.org/x/net/route/message.go
new file mode 100644 (file)
index 0000000..0fa7e09
--- /dev/null
@@ -0,0 +1,72 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package route
+
+// A Message represents a routing message.
+type Message interface {
+       // Sys returns operating system-specific information.
+       Sys() []Sys
+}
+
+// A Sys reprensents operating system-specific information.
+type Sys interface {
+       // SysType returns a type of operating system-specific
+       // information.
+       SysType() SysType
+}
+
+// A SysType represents a type of operating system-specific
+// information.
+type SysType int
+
+const (
+       SysMetrics SysType = iota
+       SysStats
+)
+
+// ParseRIB parses b as a routing information base and returns a list
+// of routing messages.
+func ParseRIB(typ RIBType, b []byte) ([]Message, error) {
+       if !typ.parseable() {
+               return nil, errUnsupportedMessage
+       }
+       var msgs []Message
+       nmsgs, nskips := 0, 0
+       for len(b) > 4 {
+               nmsgs++
+               l := int(nativeEndian.Uint16(b[:2]))
+               if l == 0 {
+                       return nil, errInvalidMessage
+               }
+               if len(b) < l {
+                       return nil, errMessageTooShort
+               }
+               if b[2] != sysRTM_VERSION {
+                       b = b[l:]
+                       continue
+               }
+               if w, ok := wireFormats[int(b[3])]; !ok {
+                       nskips++
+               } else {
+                       m, err := w.parse(typ, b)
+                       if err != nil {
+                               return nil, err
+                       }
+                       if m == nil {
+                               nskips++
+                       } else {
+                               msgs = append(msgs, m)
+                       }
+               }
+               b = b[l:]
+       }
+       // We failed to parse any of the messages - version mismatch?
+       if nmsgs != len(msgs)+nskips {
+               return nil, errMessageMismatch
+       }
+       return msgs, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/route.go b/libgo/go/golang.org/x/net/route/route.go
new file mode 100644 (file)
index 0000000..8cb64f7
--- /dev/null
@@ -0,0 +1,123 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+// Package route provides basic functions for the manipulation of
+// packet routing facilities on BSD variants.
+//
+// The package supports any version of Darwin, any version of
+// DragonFly BSD, FreeBSD 7 and above, NetBSD 6 and above, and OpenBSD
+// 5.6 and above.
+package route
+
+import (
+       "errors"
+       "os"
+       "syscall"
+)
+
+var (
+       errUnsupportedMessage = errors.New("unsupported message")
+       errMessageMismatch    = errors.New("message mismatch")
+       errMessageTooShort    = errors.New("message too short")
+       errInvalidMessage     = errors.New("invalid message")
+       errInvalidAddr        = errors.New("invalid address")
+       errShortBuffer        = errors.New("short buffer")
+)
+
+// A RouteMessage represents a message conveying an address prefix, a
+// nexthop address and an output interface.
+//
+// Unlike other messages, this message can be used to query adjacency
+// information for the given address prefix, to add a new route, and
+// to delete or modify the existing route from the routing information
+// base inside the kernel by writing and reading route messages on a
+// routing socket.
+//
+// For the manipulation of routing information, the route message must
+// contain appropriate fields that include:
+//
+//     Version       = <must be specified>
+//     Type          = <must be specified>
+//     Flags         = <must be specified>
+//     Index         = <must be specified if necessary>
+//     ID            = <must be specified>
+//     Seq           = <must be specified>
+//     Addrs         = <must be specified>
+//
+// The Type field specifies a type of manipulation, the Flags field
+// specifies a class of target information and the Addrs field
+// specifies target information like the following:
+//
+//     route.RouteMessage{
+//             Version: RTM_VERSION,
+//             Type: RTM_GET,
+//             Flags: RTF_UP | RTF_HOST,
+//             ID: uintptr(os.Getpid()),
+//             Seq: 1,
+//             Addrs: []route.Addrs{
+//                     RTAX_DST: &route.Inet4Addr{ ... },
+//                     RTAX_IFP: &route.LinkAddr{ ... },
+//                     RTAX_BRD: &route.Inet4Addr{ ... },
+//             },
+//     }
+//
+// The values for the above fields depend on the implementation of
+// each operating system.
+//
+// The Err field on a response message contains an error value on the
+// requested operation. If non-nil, the requested operation is failed.
+type RouteMessage struct {
+       Version int     // message version
+       Type    int     // message type
+       Flags   int     // route flags
+       Index   int     // interface index when atatched
+       ID      uintptr // sender's identifier; usually process ID
+       Seq     int     // sequence number
+       Err     error   // error on requested operation
+       Addrs   []Addr  // addresses
+
+       extOff int    // offset of header extension
+       raw    []byte // raw message
+}
+
+// Marshal returns the binary encoding of m.
+func (m *RouteMessage) Marshal() ([]byte, error) {
+       return m.marshal()
+}
+
+// A RIBType reprensents a type of routing information base.
+type RIBType int
+
+const (
+       RIBTypeRoute     RIBType = syscall.NET_RT_DUMP
+       RIBTypeInterface RIBType = syscall.NET_RT_IFLIST
+)
+
+// FetchRIB fetches a routing information base from the operating
+// system.
+//
+// The provided af must be an address family.
+//
+// The provided arg must be a RIBType-specific argument.
+// When RIBType is related to routes, arg might be a set of route
+// flags. When RIBType is related to network interfaces, arg might be
+// an interface index or a set of interface flags. In most cases, zero
+// means a wildcard.
+func FetchRIB(af int, typ RIBType, arg int) ([]byte, error) {
+       mib := [6]int32{sysCTL_NET, sysAF_ROUTE, 0, int32(af), int32(typ), int32(arg)}
+       n := uintptr(0)
+       if err := sysctl(mib[:], nil, &n, nil, 0); err != nil {
+               return nil, os.NewSyscallError("sysctl", err)
+       }
+       if n == 0 {
+               return nil, nil
+       }
+       b := make([]byte, n)
+       if err := sysctl(mib[:], &b[0], &n, nil, 0); err != nil {
+               return nil, os.NewSyscallError("sysctl", err)
+       }
+       return b[:n], nil
+}
diff --git a/libgo/go/golang.org/x/net/route/route_classic.go b/libgo/go/golang.org/x/net/route/route_classic.go
new file mode 100644 (file)
index 0000000..02fa688
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd
+
+package route
+
+import (
+       "runtime"
+       "syscall"
+)
+
+func (m *RouteMessage) marshal() ([]byte, error) {
+       w, ok := wireFormats[m.Type]
+       if !ok {
+               return nil, errUnsupportedMessage
+       }
+       l := w.bodyOff + addrsSpace(m.Addrs)
+       if runtime.GOOS == "darwin" {
+               // Fix stray pointer writes on macOS.
+               // See golang.org/issue/22456.
+               l += 1024
+       }
+       b := make([]byte, l)
+       nativeEndian.PutUint16(b[:2], uint16(l))
+       if m.Version == 0 {
+               b[2] = sysRTM_VERSION
+       } else {
+               b[2] = byte(m.Version)
+       }
+       b[3] = byte(m.Type)
+       nativeEndian.PutUint32(b[8:12], uint32(m.Flags))
+       nativeEndian.PutUint16(b[4:6], uint16(m.Index))
+       nativeEndian.PutUint32(b[16:20], uint32(m.ID))
+       nativeEndian.PutUint32(b[20:24], uint32(m.Seq))
+       attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs)
+       if err != nil {
+               return nil, err
+       }
+       if attrs > 0 {
+               nativeEndian.PutUint32(b[12:16], uint32(attrs))
+       }
+       return b, nil
+}
+
+func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) {
+       if len(b) < w.bodyOff {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &RouteMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[8:12])),
+               Index:   int(nativeEndian.Uint16(b[4:6])),
+               ID:      uintptr(nativeEndian.Uint32(b[16:20])),
+               Seq:     int(nativeEndian.Uint32(b[20:24])),
+               extOff:  w.extOff,
+               raw:     b[:l],
+       }
+       errno := syscall.Errno(nativeEndian.Uint32(b[28:32]))
+       if errno != 0 {
+               m.Err = errno
+       }
+       var err error
+       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:])
+       if err != nil {
+               return nil, err
+       }
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/route_openbsd.go b/libgo/go/golang.org/x/net/route/route_openbsd.go
new file mode 100644 (file)
index 0000000..daf2e90
--- /dev/null
@@ -0,0 +1,65 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+import "syscall"
+
+func (m *RouteMessage) marshal() ([]byte, error) {
+       l := sizeofRtMsghdr + addrsSpace(m.Addrs)
+       b := make([]byte, l)
+       nativeEndian.PutUint16(b[:2], uint16(l))
+       if m.Version == 0 {
+               b[2] = sysRTM_VERSION
+       } else {
+               b[2] = byte(m.Version)
+       }
+       b[3] = byte(m.Type)
+       nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr))
+       nativeEndian.PutUint32(b[16:20], uint32(m.Flags))
+       nativeEndian.PutUint16(b[6:8], uint16(m.Index))
+       nativeEndian.PutUint32(b[24:28], uint32(m.ID))
+       nativeEndian.PutUint32(b[28:32], uint32(m.Seq))
+       attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs)
+       if err != nil {
+               return nil, err
+       }
+       if attrs > 0 {
+               nativeEndian.PutUint32(b[12:16], uint32(attrs))
+       }
+       return b, nil
+}
+
+func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) {
+       if len(b) < sizeofRtMsghdr {
+               return nil, errMessageTooShort
+       }
+       l := int(nativeEndian.Uint16(b[:2]))
+       if len(b) < l {
+               return nil, errInvalidMessage
+       }
+       m := &RouteMessage{
+               Version: int(b[2]),
+               Type:    int(b[3]),
+               Flags:   int(nativeEndian.Uint32(b[16:20])),
+               Index:   int(nativeEndian.Uint16(b[6:8])),
+               ID:      uintptr(nativeEndian.Uint32(b[24:28])),
+               Seq:     int(nativeEndian.Uint32(b[28:32])),
+               raw:     b[:l],
+       }
+       ll := int(nativeEndian.Uint16(b[4:6]))
+       if len(b) < ll {
+               return nil, errInvalidMessage
+       }
+       errno := syscall.Errno(nativeEndian.Uint32(b[32:36]))
+       if errno != 0 {
+               m.Err = errno
+       }
+       as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:])
+       if err != nil {
+               return nil, err
+       }
+       m.Addrs = as
+       return m, nil
+}
diff --git a/libgo/go/golang.org/x/net/route/sys.go b/libgo/go/golang.org/x/net/route/sys.go
new file mode 100644 (file)
index 0000000..13933f9
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package route
+
+import "unsafe"
+
+var (
+       nativeEndian binaryByteOrder
+       kernelAlign  int
+       wireFormats  map[int]*wireFormat
+)
+
+func init() {
+       i := uint32(1)
+       b := (*[4]byte)(unsafe.Pointer(&i))
+       if b[0] == 1 {
+               nativeEndian = littleEndian
+       } else {
+               nativeEndian = bigEndian
+       }
+       kernelAlign, wireFormats = probeRoutingStack()
+}
+
+func roundup(l int) int {
+       if l == 0 {
+               return kernelAlign
+       }
+       return (l + kernelAlign - 1) &^ (kernelAlign - 1)
+}
+
+type wireFormat struct {
+       extOff  int // offset of header extension
+       bodyOff int // offset of message body
+       parse   func(RIBType, []byte) (Message, error)
+}
diff --git a/libgo/go/golang.org/x/net/route/sys_darwin.go b/libgo/go/golang.org/x/net/route/sys_darwin.go
new file mode 100644 (file)
index 0000000..d2daf5c
--- /dev/null
@@ -0,0 +1,87 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+func (typ RIBType) parseable() bool {
+       switch typ {
+       case sysNET_RT_STAT, sysNET_RT_TRASH:
+               return false
+       default:
+               return true
+       }
+}
+
+// RouteMetrics represents route metrics.
+type RouteMetrics struct {
+       PathMTU int // path maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *RouteMessage) Sys() []Sys {
+       return []Sys{
+               &RouteMetrics{
+                       PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])),
+               },
+       }
+}
+
+// InterfaceMetrics represents interface metrics.
+type InterfaceMetrics struct {
+       Type int // interface type
+       MTU  int // maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMessage) Sys() []Sys {
+       return []Sys{
+               &InterfaceMetrics{
+                       Type: int(m.raw[m.extOff]),
+                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
+               },
+       }
+}
+
+func probeRoutingStack() (int, map[int]*wireFormat) {
+       rtm := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdrDarwin15}
+       rtm.parse = rtm.parseRouteMessage
+       rtm2 := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdr2Darwin15}
+       rtm2.parse = rtm2.parseRouteMessage
+       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDarwin15}
+       ifm.parse = ifm.parseInterfaceMessage
+       ifm2 := &wireFormat{extOff: 32, bodyOff: sizeofIfMsghdr2Darwin15}
+       ifm2.parse = ifm2.parseInterfaceMessage
+       ifam := &wireFormat{extOff: sizeofIfaMsghdrDarwin15, bodyOff: sizeofIfaMsghdrDarwin15}
+       ifam.parse = ifam.parseInterfaceAddrMessage
+       ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDarwin15, bodyOff: sizeofIfmaMsghdrDarwin15}
+       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
+       ifmam2 := &wireFormat{extOff: sizeofIfmaMsghdr2Darwin15, bodyOff: sizeofIfmaMsghdr2Darwin15}
+       ifmam2.parse = ifmam2.parseInterfaceMulticastAddrMessage
+       // Darwin kernels require 32-bit aligned access to routing facilities.
+       return 4, map[int]*wireFormat{
+               sysRTM_ADD:       rtm,
+               sysRTM_DELETE:    rtm,
+               sysRTM_CHANGE:    rtm,
+               sysRTM_GET:       rtm,
+               sysRTM_LOSING:    rtm,
+               sysRTM_REDIRECT:  rtm,
+               sysRTM_MISS:      rtm,
+               sysRTM_LOCK:      rtm,
+               sysRTM_RESOLVE:   rtm,
+               sysRTM_NEWADDR:   ifam,
+               sysRTM_DELADDR:   ifam,
+               sysRTM_IFINFO:    ifm,
+               sysRTM_NEWMADDR:  ifmam,
+               sysRTM_DELMADDR:  ifmam,
+               sysRTM_IFINFO2:   ifm2,
+               sysRTM_NEWMADDR2: ifmam2,
+               sysRTM_GET2:      rtm2,
+       }
+}
diff --git a/libgo/go/golang.org/x/net/route/sys_dragonfly.go b/libgo/go/golang.org/x/net/route/sys_dragonfly.go
new file mode 100644 (file)
index 0000000..0c14bc2
--- /dev/null
@@ -0,0 +1,76 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+import "unsafe"
+
+func (typ RIBType) parseable() bool { return true }
+
+// RouteMetrics represents route metrics.
+type RouteMetrics struct {
+       PathMTU int // path maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *RouteMessage) Sys() []Sys {
+       return []Sys{
+               &RouteMetrics{
+                       PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
+               },
+       }
+}
+
+// InterfaceMetrics represents interface metrics.
+type InterfaceMetrics struct {
+       Type int // interface type
+       MTU  int // maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMessage) Sys() []Sys {
+       return []Sys{
+               &InterfaceMetrics{
+                       Type: int(m.raw[m.extOff]),
+                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
+               },
+       }
+}
+
+func probeRoutingStack() (int, map[int]*wireFormat) {
+       var p uintptr
+       rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4}
+       rtm.parse = rtm.parseRouteMessage
+       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4}
+       ifm.parse = ifm.parseInterfaceMessage
+       ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4}
+       ifam.parse = ifam.parseInterfaceAddrMessage
+       ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4}
+       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
+       ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4}
+       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
+       return int(unsafe.Sizeof(p)), map[int]*wireFormat{
+               sysRTM_ADD:        rtm,
+               sysRTM_DELETE:     rtm,
+               sysRTM_CHANGE:     rtm,
+               sysRTM_GET:        rtm,
+               sysRTM_LOSING:     rtm,
+               sysRTM_REDIRECT:   rtm,
+               sysRTM_MISS:       rtm,
+               sysRTM_LOCK:       rtm,
+               sysRTM_RESOLVE:    rtm,
+               sysRTM_NEWADDR:    ifam,
+               sysRTM_DELADDR:    ifam,
+               sysRTM_IFINFO:     ifm,
+               sysRTM_NEWMADDR:   ifmam,
+               sysRTM_DELMADDR:   ifmam,
+               sysRTM_IFANNOUNCE: ifanm,
+       }
+}
diff --git a/libgo/go/golang.org/x/net/route/sys_freebsd.go b/libgo/go/golang.org/x/net/route/sys_freebsd.go
new file mode 100644 (file)
index 0000000..fe91be1
--- /dev/null
@@ -0,0 +1,163 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+func (typ RIBType) parseable() bool { return true }
+
+// RouteMetrics represents route metrics.
+type RouteMetrics struct {
+       PathMTU int // path maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *RouteMessage) Sys() []Sys {
+       if kernelAlign == 8 {
+               return []Sys{
+                       &RouteMetrics{
+                               PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
+                       },
+               }
+       }
+       return []Sys{
+               &RouteMetrics{
+                       PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])),
+               },
+       }
+}
+
+// InterfaceMetrics represents interface metrics.
+type InterfaceMetrics struct {
+       Type int // interface type
+       MTU  int // maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMessage) Sys() []Sys {
+       return []Sys{
+               &InterfaceMetrics{
+                       Type: int(m.raw[m.extOff]),
+                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
+               },
+       }
+}
+
+var compatFreeBSD32 bool // 386 emulation on amd64
+
+func probeRoutingStack() (int, map[int]*wireFormat) {
+       var p uintptr
+       wordSize := int(unsafe.Sizeof(p))
+       align := wordSize
+       // In the case of kern.supported_archs="amd64 i386", we need
+       // to know the underlying kernel's architecture because the
+       // alignment for routing facilities are set at the build time
+       // of the kernel.
+       conf, _ := syscall.Sysctl("kern.conftxt")
+       for i, j := 0, 0; j < len(conf); j++ {
+               if conf[j] != '\n' {
+                       continue
+               }
+               s := conf[i:j]
+               i = j + 1
+               if len(s) > len("machine") && s[:len("machine")] == "machine" {
+                       s = s[len("machine"):]
+                       for k := 0; k < len(s); k++ {
+                               if s[k] == ' ' || s[k] == '\t' {
+                                       s = s[1:]
+                               }
+                               break
+                       }
+                       if s == "amd64" {
+                               align = 8
+                       }
+                       break
+               }
+       }
+       if align != wordSize {
+               compatFreeBSD32 = true // 386 emulation on amd64
+       }
+       var rtm, ifm, ifam, ifmam, ifanm *wireFormat
+       if compatFreeBSD32 {
+               rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10Emu - sizeofRtMetricsFreeBSD10Emu, bodyOff: sizeofRtMsghdrFreeBSD10Emu}
+               ifm = &wireFormat{extOff: 16}
+               ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10Emu, bodyOff: sizeofIfaMsghdrFreeBSD10Emu}
+               ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10Emu, bodyOff: sizeofIfmaMsghdrFreeBSD10Emu}
+               ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10Emu, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10Emu}
+       } else {
+               rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10 - sizeofRtMetricsFreeBSD10, bodyOff: sizeofRtMsghdrFreeBSD10}
+               ifm = &wireFormat{extOff: 16}
+               ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10, bodyOff: sizeofIfaMsghdrFreeBSD10}
+               ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10, bodyOff: sizeofIfmaMsghdrFreeBSD10}
+               ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10}
+       }
+       rel, _ := syscall.SysctlUint32("kern.osreldate")
+       switch {
+       case rel < 800000:
+               if compatFreeBSD32 {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD7Emu
+               } else {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD7
+               }
+       case 800000 <= rel && rel < 900000:
+               if compatFreeBSD32 {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD8Emu
+               } else {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD8
+               }
+       case 900000 <= rel && rel < 1000000:
+               if compatFreeBSD32 {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD9Emu
+               } else {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD9
+               }
+       case 1000000 <= rel && rel < 1100000:
+               if compatFreeBSD32 {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD10Emu
+               } else {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD10
+               }
+       default:
+               if compatFreeBSD32 {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD11Emu
+               } else {
+                       ifm.bodyOff = sizeofIfMsghdrFreeBSD11
+               }
+               if rel >= 1102000 { // see https://github.com/freebsd/freebsd/commit/027c7f4d66ff8d8c4a46c3665a5ee7d6d8462034#diff-ad4e5b7f1449ea3fc87bc97280de145b
+                       align = wordSize
+               }
+       }
+       rtm.parse = rtm.parseRouteMessage
+       ifm.parse = ifm.parseInterfaceMessage
+       ifam.parse = ifam.parseInterfaceAddrMessage
+       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
+       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
+       return align, map[int]*wireFormat{
+               sysRTM_ADD:        rtm,
+               sysRTM_DELETE:     rtm,
+               sysRTM_CHANGE:     rtm,
+               sysRTM_GET:        rtm,
+               sysRTM_LOSING:     rtm,
+               sysRTM_REDIRECT:   rtm,
+               sysRTM_MISS:       rtm,
+               sysRTM_LOCK:       rtm,
+               sysRTM_RESOLVE:    rtm,
+               sysRTM_NEWADDR:    ifam,
+               sysRTM_DELADDR:    ifam,
+               sysRTM_IFINFO:     ifm,
+               sysRTM_NEWMADDR:   ifmam,
+               sysRTM_DELMADDR:   ifmam,
+               sysRTM_IFANNOUNCE: ifanm,
+       }
+}
diff --git a/libgo/go/golang.org/x/net/route/sys_netbsd.go b/libgo/go/golang.org/x/net/route/sys_netbsd.go
new file mode 100644 (file)
index 0000000..02f71d5
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+func (typ RIBType) parseable() bool { return true }
+
+// RouteMetrics represents route metrics.
+type RouteMetrics struct {
+       PathMTU int // path maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *RouteMessage) Sys() []Sys {
+       return []Sys{
+               &RouteMetrics{
+                       PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
+               },
+       }
+}
+
+// RouteMetrics represents route metrics.
+type InterfaceMetrics struct {
+       Type int // interface type
+       MTU  int // maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMessage) Sys() []Sys {
+       return []Sys{
+               &InterfaceMetrics{
+                       Type: int(m.raw[m.extOff]),
+                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
+               },
+       }
+}
+
+func probeRoutingStack() (int, map[int]*wireFormat) {
+       rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrNetBSD7}
+       rtm.parse = rtm.parseRouteMessage
+       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrNetBSD7}
+       ifm.parse = ifm.parseInterfaceMessage
+       ifam := &wireFormat{extOff: sizeofIfaMsghdrNetBSD7, bodyOff: sizeofIfaMsghdrNetBSD7}
+       ifam.parse = ifam.parseInterfaceAddrMessage
+       ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrNetBSD7, bodyOff: sizeofIfAnnouncemsghdrNetBSD7}
+       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
+       // NetBSD 6 and above kernels require 64-bit aligned access to
+       // routing facilities.
+       return 8, map[int]*wireFormat{
+               sysRTM_ADD:        rtm,
+               sysRTM_DELETE:     rtm,
+               sysRTM_CHANGE:     rtm,
+               sysRTM_GET:        rtm,
+               sysRTM_LOSING:     rtm,
+               sysRTM_REDIRECT:   rtm,
+               sysRTM_MISS:       rtm,
+               sysRTM_LOCK:       rtm,
+               sysRTM_RESOLVE:    rtm,
+               sysRTM_NEWADDR:    ifam,
+               sysRTM_DELADDR:    ifam,
+               sysRTM_IFANNOUNCE: ifanm,
+               sysRTM_IFINFO:     ifm,
+       }
+}
diff --git a/libgo/go/golang.org/x/net/route/sys_openbsd.go b/libgo/go/golang.org/x/net/route/sys_openbsd.go
new file mode 100644 (file)
index 0000000..c5674e8
--- /dev/null
@@ -0,0 +1,80 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package route
+
+import "unsafe"
+
+func (typ RIBType) parseable() bool {
+       switch typ {
+       case sysNET_RT_STATS, sysNET_RT_TABLE:
+               return false
+       default:
+               return true
+       }
+}
+
+// RouteMetrics represents route metrics.
+type RouteMetrics struct {
+       PathMTU int // path maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *RouteMessage) Sys() []Sys {
+       return []Sys{
+               &RouteMetrics{
+                       PathMTU: int(nativeEndian.Uint32(m.raw[60:64])),
+               },
+       }
+}
+
+// InterfaceMetrics represents interface metrics.
+type InterfaceMetrics struct {
+       Type int // interface type
+       MTU  int // maximum transmission unit
+}
+
+// SysType implements the SysType method of Sys interface.
+func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
+
+// Sys implements the Sys method of Message interface.
+func (m *InterfaceMessage) Sys() []Sys {
+       return []Sys{
+               &InterfaceMetrics{
+                       Type: int(m.raw[24]),
+                       MTU:  int(nativeEndian.Uint32(m.raw[28:32])),
+               },
+       }
+}
+
+func probeRoutingStack() (int, map[int]*wireFormat) {
+       var p uintptr
+       rtm := &wireFormat{extOff: -1, bodyOff: -1}
+       rtm.parse = rtm.parseRouteMessage
+       ifm := &wireFormat{extOff: -1, bodyOff: -1}
+       ifm.parse = ifm.parseInterfaceMessage
+       ifam := &wireFormat{extOff: -1, bodyOff: -1}
+       ifam.parse = ifam.parseInterfaceAddrMessage
+       ifanm := &wireFormat{extOff: -1, bodyOff: -1}
+       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
+       return int(unsafe.Sizeof(p)), map[int]*wireFormat{
+               sysRTM_ADD:        rtm,
+               sysRTM_DELETE:     rtm,
+               sysRTM_CHANGE:     rtm,
+               sysRTM_GET:        rtm,
+               sysRTM_LOSING:     rtm,
+               sysRTM_REDIRECT:   rtm,
+               sysRTM_MISS:       rtm,
+               sysRTM_LOCK:       rtm,
+               sysRTM_RESOLVE:    rtm,
+               sysRTM_NEWADDR:    ifam,
+               sysRTM_DELADDR:    ifam,
+               sysRTM_IFINFO:     ifm,
+               sysRTM_IFANNOUNCE: ifanm,
+               sysRTM_DESYNC:     rtm,
+       }
+}
diff --git a/libgo/go/golang.org/x/net/route/syscall.go b/libgo/go/golang.org/x/net/route/syscall.go
new file mode 100644 (file)
index 0000000..72431b0
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build dragonfly freebsd netbsd openbsd
+
+package route
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var zero uintptr
+
+func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error {
+       var p unsafe.Pointer
+       if len(mib) > 0 {
+               p = unsafe.Pointer(&mib[0])
+       } else {
+               p = unsafe.Pointer(&zero)
+       }
+       _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), newlen)
+       if errno != 0 {
+               return error(errno)
+       }
+       return nil
+}
diff --git a/libgo/go/golang.org/x/net/route/syscall_go1_11_darwin.go b/libgo/go/golang.org/x/net/route/syscall_go1_11_darwin.go
new file mode 100644 (file)
index 0000000..7228e44
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.12
+
+package route
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var zero uintptr
+
+func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error {
+       var p unsafe.Pointer
+       if len(mib) > 0 {
+               p = unsafe.Pointer(&mib[0])
+       } else {
+               p = unsafe.Pointer(&zero)
+       }
+       _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), newlen)
+       if errno != 0 {
+               return error(errno)
+       }
+       return nil
+}
diff --git a/libgo/go/golang.org/x/net/route/syscall_go1_12_darwin.go b/libgo/go/golang.org/x/net/route/syscall_go1_12_darwin.go
new file mode 100644 (file)
index 0000000..7922a68
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.12
+
+package route
+
+import _ "unsafe" // for linkname
+
+//go:linkname sysctl syscall.sysctl
+func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error
diff --git a/libgo/go/golang.org/x/net/route/zsys_darwin.go b/libgo/go/golang.org/x/net/route/zsys_darwin.go
new file mode 100644 (file)
index 0000000..4e2e1ab
--- /dev/null
@@ -0,0 +1,99 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_darwin.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1e
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP    = 0x1
+       sysNET_RT_FLAGS   = 0x2
+       sysNET_RT_IFLIST  = 0x3
+       sysNET_RT_STAT    = 0x4
+       sysNET_RT_TRASH   = 0x5
+       sysNET_RT_IFLIST2 = 0x6
+       sysNET_RT_DUMP2   = 0x7
+       sysNET_RT_MAXID   = 0xa
+)
+
+const (
+       sysCTL_MAXNAME = 0xc
+
+       sysCTL_UNSPEC  = 0x0
+       sysCTL_KERN    = 0x1
+       sysCTL_VM      = 0x2
+       sysCTL_VFS     = 0x3
+       sysCTL_NET     = 0x4
+       sysCTL_DEBUG   = 0x5
+       sysCTL_HW      = 0x6
+       sysCTL_MACHDEP = 0x7
+       sysCTL_USER    = 0x8
+       sysCTL_MAXID   = 0x9
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD       = 0x1
+       sysRTM_DELETE    = 0x2
+       sysRTM_CHANGE    = 0x3
+       sysRTM_GET       = 0x4
+       sysRTM_LOSING    = 0x5
+       sysRTM_REDIRECT  = 0x6
+       sysRTM_MISS      = 0x7
+       sysRTM_LOCK      = 0x8
+       sysRTM_OLDADD    = 0x9
+       sysRTM_OLDDEL    = 0xa
+       sysRTM_RESOLVE   = 0xb
+       sysRTM_NEWADDR   = 0xc
+       sysRTM_DELADDR   = 0xd
+       sysRTM_IFINFO    = 0xe
+       sysRTM_NEWMADDR  = 0xf
+       sysRTM_DELMADDR  = 0x10
+       sysRTM_IFINFO2   = 0x12
+       sysRTM_NEWMADDR2 = 0x13
+       sysRTM_GET2      = 0x14
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MAX     = 0x8
+)
+
+const (
+       sizeofIfMsghdrDarwin15    = 0x70
+       sizeofIfaMsghdrDarwin15   = 0x14
+       sizeofIfmaMsghdrDarwin15  = 0x10
+       sizeofIfMsghdr2Darwin15   = 0xa0
+       sizeofIfmaMsghdr2Darwin15 = 0x14
+       sizeofIfDataDarwin15      = 0x60
+       sizeofIfData64Darwin15    = 0x80
+
+       sizeofRtMsghdrDarwin15  = 0x5c
+       sizeofRtMsghdr2Darwin15 = 0x5c
+       sizeofRtMetricsDarwin15 = 0x38
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_dragonfly.go b/libgo/go/golang.org/x/net/route/zsys_dragonfly.go
new file mode 100644 (file)
index 0000000..719c88d
--- /dev/null
@@ -0,0 +1,98 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_dragonfly.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP   = 0x1
+       sysNET_RT_FLAGS  = 0x2
+       sysNET_RT_IFLIST = 0x3
+       sysNET_RT_MAXID  = 0x4
+)
+
+const (
+       sysCTL_MAXNAME = 0xc
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_P1003_1B = 0x9
+       sysCTL_LWKT     = 0xa
+       sysCTL_MAXID    = 0xb
+)
+
+const (
+       sysRTM_VERSION = 0x6
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_OLDADD     = 0x9
+       sysRTM_OLDDEL     = 0xa
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_NEWMADDR   = 0xf
+       sysRTM_DELMADDR   = 0x10
+       sysRTM_IFANNOUNCE = 0x11
+       sysRTM_IEEE80211  = 0x12
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+       sysRTA_MPLS1   = 0x100
+       sysRTA_MPLS2   = 0x200
+       sysRTA_MPLS3   = 0x400
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MPLS1   = 0x8
+       sysRTAX_MPLS2   = 0x9
+       sysRTAX_MPLS3   = 0xa
+       sysRTAX_MAX     = 0xb
+)
+
+const (
+       sizeofIfMsghdrDragonFlyBSD4         = 0xb0
+       sizeofIfaMsghdrDragonFlyBSD4        = 0x14
+       sizeofIfmaMsghdrDragonFlyBSD4       = 0x10
+       sizeofIfAnnouncemsghdrDragonFlyBSD4 = 0x18
+
+       sizeofRtMsghdrDragonFlyBSD4  = 0x98
+       sizeofRtMetricsDragonFlyBSD4 = 0x70
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_freebsd_386.go b/libgo/go/golang.org/x/net/route/zsys_freebsd_386.go
new file mode 100644 (file)
index 0000000..b03bc01
--- /dev/null
@@ -0,0 +1,126 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP     = 0x1
+       sysNET_RT_FLAGS    = 0x2
+       sysNET_RT_IFLIST   = 0x3
+       sysNET_RT_IFMALIST = 0x4
+       sysNET_RT_IFLISTL  = 0x5
+)
+
+const (
+       sysCTL_MAXNAME = 0x18
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_P1003_1B = 0x9
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_NEWMADDR   = 0xf
+       sysRTM_DELMADDR   = 0x10
+       sysRTM_IFANNOUNCE = 0x11
+       sysRTM_IEEE80211  = 0x12
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MAX     = 0x8
+)
+
+const (
+       sizeofIfMsghdrlFreeBSD10        = 0x68
+       sizeofIfaMsghdrFreeBSD10        = 0x14
+       sizeofIfaMsghdrlFreeBSD10       = 0x6c
+       sizeofIfmaMsghdrFreeBSD10       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
+
+       sizeofRtMsghdrFreeBSD10  = 0x5c
+       sizeofRtMetricsFreeBSD10 = 0x38
+
+       sizeofIfMsghdrFreeBSD7  = 0x60
+       sizeofIfMsghdrFreeBSD8  = 0x60
+       sizeofIfMsghdrFreeBSD9  = 0x60
+       sizeofIfMsghdrFreeBSD10 = 0x64
+       sizeofIfMsghdrFreeBSD11 = 0xa8
+
+       sizeofIfDataFreeBSD7  = 0x50
+       sizeofIfDataFreeBSD8  = 0x50
+       sizeofIfDataFreeBSD9  = 0x50
+       sizeofIfDataFreeBSD10 = 0x54
+       sizeofIfDataFreeBSD11 = 0x98
+
+       // MODIFIED BY HAND FOR 386 EMULATION ON AMD64
+       // 386 EMULATION USES THE UNDERLYING RAW DATA LAYOUT
+
+       sizeofIfMsghdrlFreeBSD10Emu        = 0xb0
+       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
+       sizeofIfaMsghdrlFreeBSD10Emu       = 0xb0
+       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
+
+       sizeofRtMsghdrFreeBSD10Emu  = 0x98
+       sizeofRtMetricsFreeBSD10Emu = 0x70
+
+       sizeofIfMsghdrFreeBSD7Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD8Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD9Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD10Emu = 0xa8
+       sizeofIfMsghdrFreeBSD11Emu = 0xa8
+
+       sizeofIfDataFreeBSD7Emu  = 0x98
+       sizeofIfDataFreeBSD8Emu  = 0x98
+       sizeofIfDataFreeBSD9Emu  = 0x98
+       sizeofIfDataFreeBSD10Emu = 0x98
+       sizeofIfDataFreeBSD11Emu = 0x98
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_freebsd_amd64.go b/libgo/go/golang.org/x/net/route/zsys_freebsd_amd64.go
new file mode 100644 (file)
index 0000000..0b675b3
--- /dev/null
@@ -0,0 +1,123 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP     = 0x1
+       sysNET_RT_FLAGS    = 0x2
+       sysNET_RT_IFLIST   = 0x3
+       sysNET_RT_IFMALIST = 0x4
+       sysNET_RT_IFLISTL  = 0x5
+)
+
+const (
+       sysCTL_MAXNAME = 0x18
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_P1003_1B = 0x9
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_NEWMADDR   = 0xf
+       sysRTM_DELMADDR   = 0x10
+       sysRTM_IFANNOUNCE = 0x11
+       sysRTM_IEEE80211  = 0x12
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MAX     = 0x8
+)
+
+const (
+       sizeofIfMsghdrlFreeBSD10        = 0xb0
+       sizeofIfaMsghdrFreeBSD10        = 0x14
+       sizeofIfaMsghdrlFreeBSD10       = 0xb0
+       sizeofIfmaMsghdrFreeBSD10       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
+
+       sizeofRtMsghdrFreeBSD10  = 0x98
+       sizeofRtMetricsFreeBSD10 = 0x70
+
+       sizeofIfMsghdrFreeBSD7  = 0xa8
+       sizeofIfMsghdrFreeBSD8  = 0xa8
+       sizeofIfMsghdrFreeBSD9  = 0xa8
+       sizeofIfMsghdrFreeBSD10 = 0xa8
+       sizeofIfMsghdrFreeBSD11 = 0xa8
+
+       sizeofIfDataFreeBSD7  = 0x98
+       sizeofIfDataFreeBSD8  = 0x98
+       sizeofIfDataFreeBSD9  = 0x98
+       sizeofIfDataFreeBSD10 = 0x98
+       sizeofIfDataFreeBSD11 = 0x98
+
+       sizeofIfMsghdrlFreeBSD10Emu        = 0xb0
+       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
+       sizeofIfaMsghdrlFreeBSD10Emu       = 0xb0
+       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
+
+       sizeofRtMsghdrFreeBSD10Emu  = 0x98
+       sizeofRtMetricsFreeBSD10Emu = 0x70
+
+       sizeofIfMsghdrFreeBSD7Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD8Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD9Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD10Emu = 0xa8
+       sizeofIfMsghdrFreeBSD11Emu = 0xa8
+
+       sizeofIfDataFreeBSD7Emu  = 0x98
+       sizeofIfDataFreeBSD8Emu  = 0x98
+       sizeofIfDataFreeBSD9Emu  = 0x98
+       sizeofIfDataFreeBSD10Emu = 0x98
+       sizeofIfDataFreeBSD11Emu = 0x98
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_freebsd_arm.go b/libgo/go/golang.org/x/net/route/zsys_freebsd_arm.go
new file mode 100644 (file)
index 0000000..58f8ea1
--- /dev/null
@@ -0,0 +1,123 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP     = 0x1
+       sysNET_RT_FLAGS    = 0x2
+       sysNET_RT_IFLIST   = 0x3
+       sysNET_RT_IFMALIST = 0x4
+       sysNET_RT_IFLISTL  = 0x5
+)
+
+const (
+       sysCTL_MAXNAME = 0x18
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_P1003_1B = 0x9
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_NEWMADDR   = 0xf
+       sysRTM_DELMADDR   = 0x10
+       sysRTM_IFANNOUNCE = 0x11
+       sysRTM_IEEE80211  = 0x12
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MAX     = 0x8
+)
+
+const (
+       sizeofIfMsghdrlFreeBSD10        = 0x68
+       sizeofIfaMsghdrFreeBSD10        = 0x14
+       sizeofIfaMsghdrlFreeBSD10       = 0x6c
+       sizeofIfmaMsghdrFreeBSD10       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
+
+       sizeofRtMsghdrFreeBSD10  = 0x5c
+       sizeofRtMetricsFreeBSD10 = 0x38
+
+       sizeofIfMsghdrFreeBSD7  = 0x70
+       sizeofIfMsghdrFreeBSD8  = 0x70
+       sizeofIfMsghdrFreeBSD9  = 0x70
+       sizeofIfMsghdrFreeBSD10 = 0x70
+       sizeofIfMsghdrFreeBSD11 = 0xa8
+
+       sizeofIfDataFreeBSD7  = 0x60
+       sizeofIfDataFreeBSD8  = 0x60
+       sizeofIfDataFreeBSD9  = 0x60
+       sizeofIfDataFreeBSD10 = 0x60
+       sizeofIfDataFreeBSD11 = 0x98
+
+       sizeofIfMsghdrlFreeBSD10Emu        = 0x68
+       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
+       sizeofIfaMsghdrlFreeBSD10Emu       = 0x6c
+       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
+
+       sizeofRtMsghdrFreeBSD10Emu  = 0x5c
+       sizeofRtMetricsFreeBSD10Emu = 0x38
+
+       sizeofIfMsghdrFreeBSD7Emu  = 0x70
+       sizeofIfMsghdrFreeBSD8Emu  = 0x70
+       sizeofIfMsghdrFreeBSD9Emu  = 0x70
+       sizeofIfMsghdrFreeBSD10Emu = 0x70
+       sizeofIfMsghdrFreeBSD11Emu = 0xa8
+
+       sizeofIfDataFreeBSD7Emu  = 0x60
+       sizeofIfDataFreeBSD8Emu  = 0x60
+       sizeofIfDataFreeBSD9Emu  = 0x60
+       sizeofIfDataFreeBSD10Emu = 0x60
+       sizeofIfDataFreeBSD11Emu = 0x98
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_freebsd_arm64.go b/libgo/go/golang.org/x/net/route/zsys_freebsd_arm64.go
new file mode 100644 (file)
index 0000000..4c639b8
--- /dev/null
@@ -0,0 +1,123 @@
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
+// cgo -godefs defs_freebsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP     = 0x1
+       sysNET_RT_FLAGS    = 0x2
+       sysNET_RT_IFLIST   = 0x3
+       sysNET_RT_IFMALIST = 0x4
+       sysNET_RT_IFLISTL  = 0x5
+)
+
+const (
+       sysCTL_MAXNAME = 0x18
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_P1003_1B = 0x9
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_NEWMADDR   = 0xf
+       sysRTM_DELMADDR   = 0x10
+       sysRTM_IFANNOUNCE = 0x11
+       sysRTM_IEEE80211  = 0x12
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_MAX     = 0x8
+)
+
+const (
+       sizeofIfMsghdrlFreeBSD10        = 0xb0
+       sizeofIfaMsghdrFreeBSD10        = 0x14
+       sizeofIfaMsghdrlFreeBSD10       = 0xb0
+       sizeofIfmaMsghdrFreeBSD10       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
+
+       sizeofRtMsghdrFreeBSD10  = 0x98
+       sizeofRtMetricsFreeBSD10 = 0x70
+
+       sizeofIfMsghdrFreeBSD7  = 0xa8
+       sizeofIfMsghdrFreeBSD8  = 0xa8
+       sizeofIfMsghdrFreeBSD9  = 0xa8
+       sizeofIfMsghdrFreeBSD10 = 0xa8
+       sizeofIfMsghdrFreeBSD11 = 0xa8
+
+       sizeofIfDataFreeBSD7  = 0x98
+       sizeofIfDataFreeBSD8  = 0x98
+       sizeofIfDataFreeBSD9  = 0x98
+       sizeofIfDataFreeBSD10 = 0x98
+       sizeofIfDataFreeBSD11 = 0x98
+
+       sizeofIfMsghdrlFreeBSD10Emu        = 0xb0
+       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
+       sizeofIfaMsghdrlFreeBSD10Emu       = 0xb0
+       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
+       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
+
+       sizeofRtMsghdrFreeBSD10Emu  = 0x98
+       sizeofRtMetricsFreeBSD10Emu = 0x70
+
+       sizeofIfMsghdrFreeBSD7Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD8Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD9Emu  = 0xa8
+       sizeofIfMsghdrFreeBSD10Emu = 0xa8
+       sizeofIfMsghdrFreeBSD11Emu = 0xa8
+
+       sizeofIfDataFreeBSD7Emu  = 0x98
+       sizeofIfDataFreeBSD8Emu  = 0x98
+       sizeofIfDataFreeBSD9Emu  = 0x98
+       sizeofIfDataFreeBSD10Emu = 0x98
+       sizeofIfDataFreeBSD11Emu = 0x98
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_netbsd.go b/libgo/go/golang.org/x/net/route/zsys_netbsd.go
new file mode 100644 (file)
index 0000000..e0df45e
--- /dev/null
@@ -0,0 +1,97 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_netbsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x22
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP   = 0x1
+       sysNET_RT_FLAGS  = 0x2
+       sysNET_RT_IFLIST = 0x5
+       sysNET_RT_MAXID  = 0x6
+)
+
+const (
+       sysCTL_MAXNAME = 0xc
+
+       sysCTL_UNSPEC   = 0x0
+       sysCTL_KERN     = 0x1
+       sysCTL_VM       = 0x2
+       sysCTL_VFS      = 0x3
+       sysCTL_NET      = 0x4
+       sysCTL_DEBUG    = 0x5
+       sysCTL_HW       = 0x6
+       sysCTL_MACHDEP  = 0x7
+       sysCTL_USER     = 0x8
+       sysCTL_DDB      = 0x9
+       sysCTL_PROC     = 0xa
+       sysCTL_VENDOR   = 0xb
+       sysCTL_EMUL     = 0xc
+       sysCTL_SECURITY = 0xd
+       sysCTL_MAXID    = 0xe
+)
+
+const (
+       sysRTM_VERSION = 0x4
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_OLDADD     = 0x9
+       sysRTM_OLDDEL     = 0xa
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFANNOUNCE = 0x10
+       sysRTM_IEEE80211  = 0x11
+       sysRTM_SETGATE    = 0x12
+       sysRTM_LLINFO_UPD = 0x13
+       sysRTM_IFINFO     = 0x14
+       sysRTM_CHGADDR    = 0x15
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+       sysRTA_TAG     = 0x100
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_TAG     = 0x8
+       sysRTAX_MAX     = 0x9
+)
+
+const (
+       sizeofIfMsghdrNetBSD7         = 0x98
+       sizeofIfaMsghdrNetBSD7        = 0x18
+       sizeofIfAnnouncemsghdrNetBSD7 = 0x18
+
+       sizeofRtMsghdrNetBSD7  = 0x78
+       sizeofRtMetricsNetBSD7 = 0x50
+
+       sizeofSockaddrStorage = 0x80
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/net/route/zsys_openbsd.go b/libgo/go/golang.org/x/net/route/zsys_openbsd.go
new file mode 100644 (file)
index 0000000..db8c8ef
--- /dev/null
@@ -0,0 +1,101 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_openbsd.go
+
+package route
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_ROUTE  = 0x11
+       sysAF_LINK   = 0x12
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+
+       sysNET_RT_DUMP    = 0x1
+       sysNET_RT_FLAGS   = 0x2
+       sysNET_RT_IFLIST  = 0x3
+       sysNET_RT_STATS   = 0x4
+       sysNET_RT_TABLE   = 0x5
+       sysNET_RT_IFNAMES = 0x6
+       sysNET_RT_MAXID   = 0x7
+)
+
+const (
+       sysCTL_MAXNAME = 0xc
+
+       sysCTL_UNSPEC  = 0x0
+       sysCTL_KERN    = 0x1
+       sysCTL_VM      = 0x2
+       sysCTL_FS      = 0x3
+       sysCTL_NET     = 0x4
+       sysCTL_DEBUG   = 0x5
+       sysCTL_HW      = 0x6
+       sysCTL_MACHDEP = 0x7
+       sysCTL_DDB     = 0x9
+       sysCTL_VFS     = 0xa
+       sysCTL_MAXID   = 0xb
+)
+
+const (
+       sysRTM_VERSION = 0x5
+
+       sysRTM_ADD        = 0x1
+       sysRTM_DELETE     = 0x2
+       sysRTM_CHANGE     = 0x3
+       sysRTM_GET        = 0x4
+       sysRTM_LOSING     = 0x5
+       sysRTM_REDIRECT   = 0x6
+       sysRTM_MISS       = 0x7
+       sysRTM_LOCK       = 0x8
+       sysRTM_RESOLVE    = 0xb
+       sysRTM_NEWADDR    = 0xc
+       sysRTM_DELADDR    = 0xd
+       sysRTM_IFINFO     = 0xe
+       sysRTM_IFANNOUNCE = 0xf
+       sysRTM_DESYNC     = 0x10
+       sysRTM_INVALIDATE = 0x11
+       sysRTM_BFD        = 0x12
+       sysRTM_PROPOSAL   = 0x13
+
+       sysRTA_DST     = 0x1
+       sysRTA_GATEWAY = 0x2
+       sysRTA_NETMASK = 0x4
+       sysRTA_GENMASK = 0x8
+       sysRTA_IFP     = 0x10
+       sysRTA_IFA     = 0x20
+       sysRTA_AUTHOR  = 0x40
+       sysRTA_BRD     = 0x80
+       sysRTA_SRC     = 0x100
+       sysRTA_SRCMASK = 0x200
+       sysRTA_LABEL   = 0x400
+       sysRTA_BFD     = 0x800
+       sysRTA_DNS     = 0x1000
+       sysRTA_STATIC  = 0x2000
+       sysRTA_SEARCH  = 0x4000
+
+       sysRTAX_DST     = 0x0
+       sysRTAX_GATEWAY = 0x1
+       sysRTAX_NETMASK = 0x2
+       sysRTAX_GENMASK = 0x3
+       sysRTAX_IFP     = 0x4
+       sysRTAX_IFA     = 0x5
+       sysRTAX_AUTHOR  = 0x6
+       sysRTAX_BRD     = 0x7
+       sysRTAX_SRC     = 0x8
+       sysRTAX_SRCMASK = 0x9
+       sysRTAX_LABEL   = 0xa
+       sysRTAX_BFD     = 0xb
+       sysRTAX_DNS     = 0xc
+       sysRTAX_STATIC  = 0xd
+       sysRTAX_SEARCH  = 0xe
+       sysRTAX_MAX     = 0xf
+)
+
+const (
+       sizeofRtMsghdr = 0x60
+
+       sizeofSockaddrStorage = 0x100
+       sizeofSockaddrInet    = 0x10
+       sizeofSockaddrInet6   = 0x1c
+)
diff --git a/libgo/go/golang.org/x/sys/cpu/byteorder.go b/libgo/go/golang.org/x/sys/cpu/byteorder.go
new file mode 100644 (file)
index 0000000..da6b9e4
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+import (
+       "encoding/binary"
+       "runtime"
+)
+
+// hostByteOrder returns binary.LittleEndian on little-endian machines and
+// binary.BigEndian on big-endian machines.
+func hostByteOrder() binary.ByteOrder {
+       switch runtime.GOARCH {
+       case "386", "amd64", "amd64p32",
+               "arm", "arm64",
+               "mipsle", "mips64le", "mips64p32le",
+               "ppc64le",
+               "riscv", "riscv64":
+               return binary.LittleEndian
+       case "armbe", "arm64be",
+               "mips", "mips64", "mips64p32",
+               "ppc", "ppc64",
+               "s390", "s390x",
+               "sparc", "sparc64":
+               return binary.BigEndian
+       }
+       panic("unknown architecture")
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu.go b/libgo/go/golang.org/x/sys/cpu/cpu.go
new file mode 100644 (file)
index 0000000..679e78c
--- /dev/null
@@ -0,0 +1,126 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cpu implements processor feature detection for
+// various CPU architectures.
+package cpu
+
+// Initialized reports whether the CPU features were initialized.
+//
+// For some GOOS/GOARCH combinations initialization of the CPU features depends
+// on reading an operating specific file, e.g. /proc/self/auxv on linux/arm
+// Initialized will report false if reading the file fails.
+var Initialized bool
+
+// CacheLinePad is used to pad structs to avoid false sharing.
+type CacheLinePad struct{ _ [cacheLineSize]byte }
+
+// X86 contains the supported CPU features of the
+// current X86/AMD64 platform. If the current platform
+// is not X86/AMD64 then all feature flags are false.
+//
+// X86 is padded to avoid false sharing. Further the HasAVX
+// and HasAVX2 are only set if the OS supports XMM and YMM
+// registers in addition to the CPUID feature bit being set.
+var X86 struct {
+       _            CacheLinePad
+       HasAES       bool // AES hardware implementation (AES NI)
+       HasADX       bool // Multi-precision add-carry instruction extensions
+       HasAVX       bool // Advanced vector extension
+       HasAVX2      bool // Advanced vector extension 2
+       HasBMI1      bool // Bit manipulation instruction set 1
+       HasBMI2      bool // Bit manipulation instruction set 2
+       HasERMS      bool // Enhanced REP for MOVSB and STOSB
+       HasFMA       bool // Fused-multiply-add instructions
+       HasOSXSAVE   bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers.
+       HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM
+       HasPOPCNT    bool // Hamming weight instruction POPCNT.
+       HasRDRAND    bool // RDRAND instruction (on-chip random number generator)
+       HasRDSEED    bool // RDSEED instruction (on-chip random number generator)
+       HasSSE2      bool // Streaming SIMD extension 2 (always available on amd64)
+       HasSSE3      bool // Streaming SIMD extension 3
+       HasSSSE3     bool // Supplemental streaming SIMD extension 3
+       HasSSE41     bool // Streaming SIMD extension 4 and 4.1
+       HasSSE42     bool // Streaming SIMD extension 4 and 4.2
+       _            CacheLinePad
+}
+
+// ARM64 contains the supported CPU features of the
+// current ARMv8(aarch64) platform. If the current platform
+// is not arm64 then all feature flags are false.
+var ARM64 struct {
+       _           CacheLinePad
+       HasFP       bool // Floating-point instruction set (always available)
+       HasASIMD    bool // Advanced SIMD (always available)
+       HasEVTSTRM  bool // Event stream support
+       HasAES      bool // AES hardware implementation
+       HasPMULL    bool // Polynomial multiplication instruction set
+       HasSHA1     bool // SHA1 hardware implementation
+       HasSHA2     bool // SHA2 hardware implementation
+       HasCRC32    bool // CRC32 hardware implementation
+       HasATOMICS  bool // Atomic memory operation instruction set
+       HasFPHP     bool // Half precision floating-point instruction set
+       HasASIMDHP  bool // Advanced SIMD half precision instruction set
+       HasCPUID    bool // CPUID identification scheme registers
+       HasASIMDRDM bool // Rounding double multiply add/subtract instruction set
+       HasJSCVT    bool // Javascript conversion from floating-point to integer
+       HasFCMA     bool // Floating-point multiplication and addition of complex numbers
+       HasLRCPC    bool // Release Consistent processor consistent support
+       HasDCPOP    bool // Persistent memory support
+       HasSHA3     bool // SHA3 hardware implementation
+       HasSM3      bool // SM3 hardware implementation
+       HasSM4      bool // SM4 hardware implementation
+       HasASIMDDP  bool // Advanced SIMD double precision instruction set
+       HasSHA512   bool // SHA512 hardware implementation
+       HasSVE      bool // Scalable Vector Extensions
+       HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32
+       _           CacheLinePad
+}
+
+// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms.
+// If the current platform is not ppc64/ppc64le then all feature flags are false.
+//
+// For ppc64/ppc64le, it is safe to check only for ISA level starting on ISA v3.00,
+// since there are no optional categories. There are some exceptions that also
+// require kernel support to work (DARN, SCV), so there are feature bits for
+// those as well. The minimum processor requirement is POWER8 (ISA 2.07).
+// The struct is padded to avoid false sharing.
+var PPC64 struct {
+       _        CacheLinePad
+       HasDARN  bool // Hardware random number generator (requires kernel enablement)
+       HasSCV   bool // Syscall vectored (requires kernel enablement)
+       IsPOWER8 bool // ISA v2.07 (POWER8)
+       IsPOWER9 bool // ISA v3.00 (POWER9)
+       _        CacheLinePad
+}
+
+// S390X contains the supported CPU features of the current IBM Z
+// (s390x) platform. If the current platform is not IBM Z then all
+// feature flags are false.
+//
+// S390X is padded to avoid false sharing. Further HasVX is only set
+// if the OS supports vector registers in addition to the STFLE
+// feature bit being set.
+var S390X struct {
+       _         CacheLinePad
+       HasZARCH  bool // z/Architecture mode is active [mandatory]
+       HasSTFLE  bool // store facility list extended
+       HasLDISP  bool // long (20-bit) displacements
+       HasEIMM   bool // 32-bit immediates
+       HasDFP    bool // decimal floating point
+       HasETF3EH bool // ETF-3 enhanced
+       HasMSA    bool // message security assist (CPACF)
+       HasAES    bool // KM-AES{128,192,256} functions
+       HasAESCBC bool // KMC-AES{128,192,256} functions
+       HasAESCTR bool // KMCTR-AES{128,192,256} functions
+       HasAESGCM bool // KMA-GCM-AES{128,192,256} functions
+       HasGHASH  bool // KIMD-GHASH function
+       HasSHA1   bool // K{I,L}MD-SHA-1 functions
+       HasSHA256 bool // K{I,L}MD-SHA-256 functions
+       HasSHA512 bool // K{I,L}MD-SHA-512 functions
+       HasSHA3   bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions
+       HasVX     bool // vector facility
+       HasVXE    bool // vector-enhancements facility 1
+       _         CacheLinePad
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_aix_ppc64.go b/libgo/go/golang.org/x/sys/cpu/cpu_aix_ppc64.go
new file mode 100644 (file)
index 0000000..be60272
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix,ppc64
+
+package cpu
+
+const cacheLineSize = 128
+
+const (
+       // getsystemcfg constants
+       _SC_IMPL     = 2
+       _IMPL_POWER8 = 0x10000
+       _IMPL_POWER9 = 0x20000
+)
+
+func init() {
+       impl := getsystemcfg(_SC_IMPL)
+       if impl&_IMPL_POWER8 != 0 {
+               PPC64.IsPOWER8 = true
+       }
+       if impl&_IMPL_POWER9 != 0 {
+               PPC64.IsPOWER9 = true
+       }
+
+       Initialized = true
+}
+
+func getsystemcfg(label int) (n uint64) {
+       r0, _ := callgetsystemcfg(label)
+       n = uint64(r0)
+       return
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_arm.go b/libgo/go/golang.org/x/sys/cpu/cpu_arm.go
new file mode 100644 (file)
index 0000000..7f2348b
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 32
+
+func doinit() {}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_gc_s390x.go b/libgo/go/golang.org/x/sys/cpu/cpu_gc_s390x.go
new file mode 100644 (file)
index 0000000..568bcd0
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+package cpu
+
+// haveAsmFunctions reports whether the other functions in this file can
+// be safely called.
+func haveAsmFunctions() bool { return true }
+
+// The following feature detection functions are defined in cpu_s390x.s.
+// They are likely to be expensive to call so the results should be cached.
+func stfle() facilityList
+func kmQuery() queryResult
+func kmcQuery() queryResult
+func kmctrQuery() queryResult
+func kmaQuery() queryResult
+func kimdQuery() queryResult
+func klmdQuery() queryResult
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_gc_x86.go b/libgo/go/golang.org/x/sys/cpu/cpu_gc_x86.go
new file mode 100644 (file)
index 0000000..f7cb469
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+// +build !gccgo
+
+package cpu
+
+// cpuid is implemented in cpu_x86.s for gc compiler
+// and in cpu_gccgo.c for gccgo.
+func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
+
+// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler
+// and in cpu_gccgo.c for gccgo.
+func xgetbv() (eax, edx uint32)
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_gccgo.c b/libgo/go/golang.org/x/sys/cpu/cpu_gccgo.c
new file mode 100644 (file)
index 0000000..e363c7d
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+// +build gccgo
+
+#include <cpuid.h>
+#include <stdint.h>
+
+// Need to wrap __get_cpuid_count because it's declared as static.
+int
+gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf,
+                   uint32_t *eax, uint32_t *ebx,
+                   uint32_t *ecx, uint32_t *edx)
+{
+       return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx);
+}
+
+// xgetbv reads the contents of an XCR (Extended Control Register)
+// specified in the ECX register into registers EDX:EAX.
+// Currently, the only supported value for XCR is 0.
+//
+// TODO: Replace with a better alternative:
+//
+//     #include <xsaveintrin.h>
+//
+//     #pragma GCC target("xsave")
+//
+//     void gccgoXgetbv(uint32_t *eax, uint32_t *edx) {
+//       unsigned long long x = _xgetbv(0);
+//       *eax = x & 0xffffffff;
+//       *edx = (x >> 32) & 0xffffffff;
+//     }
+//
+// Note that _xgetbv is defined starting with GCC 8.
+void
+gccgoXgetbv(uint32_t *eax, uint32_t *edx)
+{
+       __asm("  xorl %%ecx, %%ecx\n"
+             "  xgetbv"
+           : "=a"(*eax), "=d"(*edx));
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_gccgo.go b/libgo/go/golang.org/x/sys/cpu/cpu_gccgo.go
new file mode 100644 (file)
index 0000000..ba49b91
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+// +build gccgo
+
+package cpu
+
+//extern gccgoGetCpuidCount
+func gccgoGetCpuidCount(eaxArg, ecxArg uint32, eax, ebx, ecx, edx *uint32)
+
+func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) {
+       var a, b, c, d uint32
+       gccgoGetCpuidCount(eaxArg, ecxArg, &a, &b, &c, &d)
+       return a, b, c, d
+}
+
+//extern gccgoXgetbv
+func gccgoXgetbv(eax, edx *uint32)
+
+func xgetbv() (eax, edx uint32) {
+       var a, d uint32
+       gccgoXgetbv(&a, &d)
+       return a, d
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/libgo/go/golang.org/x/sys/cpu/cpu_gccgo_s390x.go
new file mode 100644 (file)
index 0000000..aa986f7
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gccgo
+
+package cpu
+
+// haveAsmFunctions reports whether the other functions in this file can
+// be safely called.
+func haveAsmFunctions() bool { return false }
+
+// TODO(mundaym): the following feature detection functions are currently
+// stubs. See https://golang.org/cl/162887 for how to fix this.
+// They are likely to be expensive to call so the results should be cached.
+func stfle() facilityList     { panic("not implemented for gccgo") }
+func kmQuery() queryResult    { panic("not implemented for gccgo") }
+func kmcQuery() queryResult   { panic("not implemented for gccgo") }
+func kmctrQuery() queryResult { panic("not implemented for gccgo") }
+func kmaQuery() queryResult   { panic("not implemented for gccgo") }
+func kimdQuery() queryResult  { panic("not implemented for gccgo") }
+func klmdQuery() queryResult  { panic("not implemented for gccgo") }
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_linux.go b/libgo/go/golang.org/x/sys/cpu/cpu_linux.go
new file mode 100644 (file)
index 0000000..76b5f50
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !amd64,!amd64p32,!386
+
+package cpu
+
+import (
+       "io/ioutil"
+)
+
+const (
+       _AT_HWCAP  = 16
+       _AT_HWCAP2 = 26
+
+       procAuxv = "/proc/self/auxv"
+
+       uintSize = int(32 << (^uint(0) >> 63))
+)
+
+// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2
+// These are initialized in cpu_$GOARCH.go
+// and should not be changed after they are initialized.
+var hwCap uint
+var hwCap2 uint
+
+func init() {
+       buf, err := ioutil.ReadFile(procAuxv)
+       if err != nil {
+               // e.g. on android /proc/self/auxv is not accessible, so silently
+               // ignore the error and leave Initialized = false
+               return
+       }
+
+       bo := hostByteOrder()
+       for len(buf) >= 2*(uintSize/8) {
+               var tag, val uint
+               switch uintSize {
+               case 32:
+                       tag = uint(bo.Uint32(buf[0:]))
+                       val = uint(bo.Uint32(buf[4:]))
+                       buf = buf[8:]
+               case 64:
+                       tag = uint(bo.Uint64(buf[0:]))
+                       val = uint(bo.Uint64(buf[8:]))
+                       buf = buf[16:]
+               }
+               switch tag {
+               case _AT_HWCAP:
+                       hwCap = val
+               case _AT_HWCAP2:
+                       hwCap2 = val
+               }
+       }
+       doinit()
+
+       Initialized = true
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_linux_arm64.go b/libgo/go/golang.org/x/sys/cpu/cpu_linux_arm64.go
new file mode 100644 (file)
index 0000000..fa7fb1b
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 64
+
+// HWCAP/HWCAP2 bits. These are exposed by Linux.
+const (
+       hwcap_FP       = 1 << 0
+       hwcap_ASIMD    = 1 << 1
+       hwcap_EVTSTRM  = 1 << 2
+       hwcap_AES      = 1 << 3
+       hwcap_PMULL    = 1 << 4
+       hwcap_SHA1     = 1 << 5
+       hwcap_SHA2     = 1 << 6
+       hwcap_CRC32    = 1 << 7
+       hwcap_ATOMICS  = 1 << 8
+       hwcap_FPHP     = 1 << 9
+       hwcap_ASIMDHP  = 1 << 10
+       hwcap_CPUID    = 1 << 11
+       hwcap_ASIMDRDM = 1 << 12
+       hwcap_JSCVT    = 1 << 13
+       hwcap_FCMA     = 1 << 14
+       hwcap_LRCPC    = 1 << 15
+       hwcap_DCPOP    = 1 << 16
+       hwcap_SHA3     = 1 << 17
+       hwcap_SM3      = 1 << 18
+       hwcap_SM4      = 1 << 19
+       hwcap_ASIMDDP  = 1 << 20
+       hwcap_SHA512   = 1 << 21
+       hwcap_SVE      = 1 << 22
+       hwcap_ASIMDFHM = 1 << 23
+)
+
+func doinit() {
+       // HWCAP feature bits
+       ARM64.HasFP = isSet(hwCap, hwcap_FP)
+       ARM64.HasASIMD = isSet(hwCap, hwcap_ASIMD)
+       ARM64.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM)
+       ARM64.HasAES = isSet(hwCap, hwcap_AES)
+       ARM64.HasPMULL = isSet(hwCap, hwcap_PMULL)
+       ARM64.HasSHA1 = isSet(hwCap, hwcap_SHA1)
+       ARM64.HasSHA2 = isSet(hwCap, hwcap_SHA2)
+       ARM64.HasCRC32 = isSet(hwCap, hwcap_CRC32)
+       ARM64.HasATOMICS = isSet(hwCap, hwcap_ATOMICS)
+       ARM64.HasFPHP = isSet(hwCap, hwcap_FPHP)
+       ARM64.HasASIMDHP = isSet(hwCap, hwcap_ASIMDHP)
+       ARM64.HasCPUID = isSet(hwCap, hwcap_CPUID)
+       ARM64.HasASIMDRDM = isSet(hwCap, hwcap_ASIMDRDM)
+       ARM64.HasJSCVT = isSet(hwCap, hwcap_JSCVT)
+       ARM64.HasFCMA = isSet(hwCap, hwcap_FCMA)
+       ARM64.HasLRCPC = isSet(hwCap, hwcap_LRCPC)
+       ARM64.HasDCPOP = isSet(hwCap, hwcap_DCPOP)
+       ARM64.HasSHA3 = isSet(hwCap, hwcap_SHA3)
+       ARM64.HasSM3 = isSet(hwCap, hwcap_SM3)
+       ARM64.HasSM4 = isSet(hwCap, hwcap_SM4)
+       ARM64.HasASIMDDP = isSet(hwCap, hwcap_ASIMDDP)
+       ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512)
+       ARM64.HasSVE = isSet(hwCap, hwcap_SVE)
+       ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM)
+}
+
+func isSet(hwc uint, value uint) bool {
+       return hwc&value != 0
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/libgo/go/golang.org/x/sys/cpu/cpu_linux_ppc64x.go
new file mode 100644 (file)
index 0000000..6c8d975
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux
+// +build ppc64 ppc64le
+
+package cpu
+
+const cacheLineSize = 128
+
+// HWCAP/HWCAP2 bits. These are exposed by the kernel.
+const (
+       // ISA Level
+       _PPC_FEATURE2_ARCH_2_07 = 0x80000000
+       _PPC_FEATURE2_ARCH_3_00 = 0x00800000
+
+       // CPU features
+       _PPC_FEATURE2_DARN = 0x00200000
+       _PPC_FEATURE2_SCV  = 0x00100000
+)
+
+func doinit() {
+       // HWCAP2 feature bits
+       PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07)
+       PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00)
+       PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN)
+       PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV)
+}
+
+func isSet(hwc uint, value uint) bool {
+       return hwc&value != 0
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_linux_s390x.go b/libgo/go/golang.org/x/sys/cpu/cpu_linux_s390x.go
new file mode 100644 (file)
index 0000000..d579eae
--- /dev/null
@@ -0,0 +1,161 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 256
+
+const (
+       // bit mask values from /usr/include/bits/hwcap.h
+       hwcap_ZARCH  = 2
+       hwcap_STFLE  = 4
+       hwcap_MSA    = 8
+       hwcap_LDISP  = 16
+       hwcap_EIMM   = 32
+       hwcap_DFP    = 64
+       hwcap_ETF3EH = 256
+       hwcap_VX     = 2048
+       hwcap_VXE    = 8192
+)
+
+// bitIsSet reports whether the bit at index is set. The bit index
+// is in big endian order, so bit index 0 is the leftmost bit.
+func bitIsSet(bits []uint64, index uint) bool {
+       return bits[index/64]&((1<<63)>>(index%64)) != 0
+}
+
+// function is the code for the named cryptographic function.
+type function uint8
+
+const (
+       // KM{,A,C,CTR} function codes
+       aes128 function = 18 // AES-128
+       aes192 function = 19 // AES-192
+       aes256 function = 20 // AES-256
+
+       // K{I,L}MD function codes
+       sha1     function = 1  // SHA-1
+       sha256   function = 2  // SHA-256
+       sha512   function = 3  // SHA-512
+       sha3_224 function = 32 // SHA3-224
+       sha3_256 function = 33 // SHA3-256
+       sha3_384 function = 34 // SHA3-384
+       sha3_512 function = 35 // SHA3-512
+       shake128 function = 36 // SHAKE-128
+       shake256 function = 37 // SHAKE-256
+
+       // KLMD function codes
+       ghash function = 65 // GHASH
+)
+
+// queryResult contains the result of a Query function
+// call. Bits are numbered in big endian order so the
+// leftmost bit (the MSB) is at index 0.
+type queryResult struct {
+       bits [2]uint64
+}
+
+// Has reports whether the given functions are present.
+func (q *queryResult) Has(fns ...function) bool {
+       if len(fns) == 0 {
+               panic("no function codes provided")
+       }
+       for _, f := range fns {
+               if !bitIsSet(q.bits[:], uint(f)) {
+                       return false
+               }
+       }
+       return true
+}
+
+// facility is a bit index for the named facility.
+type facility uint8
+
+const (
+       // cryptography facilities
+       msa4 facility = 77  // message-security-assist extension 4
+       msa8 facility = 146 // message-security-assist extension 8
+)
+
+// facilityList contains the result of an STFLE call.
+// Bits are numbered in big endian order so the
+// leftmost bit (the MSB) is at index 0.
+type facilityList struct {
+       bits [4]uint64
+}
+
+// Has reports whether the given facilities are present.
+func (s *facilityList) Has(fs ...facility) bool {
+       if len(fs) == 0 {
+               panic("no facility bits provided")
+       }
+       for _, f := range fs {
+               if !bitIsSet(s.bits[:], uint(f)) {
+                       return false
+               }
+       }
+       return true
+}
+
+func doinit() {
+       // test HWCAP bit vector
+       has := func(featureMask uint) bool {
+               return hwCap&featureMask == featureMask
+       }
+
+       // mandatory
+       S390X.HasZARCH = has(hwcap_ZARCH)
+
+       // optional
+       S390X.HasSTFLE = has(hwcap_STFLE)
+       S390X.HasLDISP = has(hwcap_LDISP)
+       S390X.HasEIMM = has(hwcap_EIMM)
+       S390X.HasETF3EH = has(hwcap_ETF3EH)
+       S390X.HasDFP = has(hwcap_DFP)
+       S390X.HasMSA = has(hwcap_MSA)
+       S390X.HasVX = has(hwcap_VX)
+       if S390X.HasVX {
+               S390X.HasVXE = has(hwcap_VXE)
+       }
+
+       // We need implementations of stfle, km and so on
+       // to detect cryptographic features.
+       if !haveAsmFunctions() {
+               return
+       }
+
+       // optional cryptographic functions
+       if S390X.HasMSA {
+               aes := []function{aes128, aes192, aes256}
+
+               // cipher message
+               km, kmc := kmQuery(), kmcQuery()
+               S390X.HasAES = km.Has(aes...)
+               S390X.HasAESCBC = kmc.Has(aes...)
+               if S390X.HasSTFLE {
+                       facilities := stfle()
+                       if facilities.Has(msa4) {
+                               kmctr := kmctrQuery()
+                               S390X.HasAESCTR = kmctr.Has(aes...)
+                       }
+                       if facilities.Has(msa8) {
+                               kma := kmaQuery()
+                               S390X.HasAESGCM = kma.Has(aes...)
+                       }
+               }
+
+               // compute message digest
+               kimd := kimdQuery() // intermediate (no padding)
+               klmd := klmdQuery() // last (padding)
+               S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1)
+               S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256)
+               S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512)
+               S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist
+               sha3 := []function{
+                       sha3_224, sha3_256, sha3_384, sha3_512,
+                       shake128, shake256,
+               }
+               S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...)
+       }
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_mips64x.go b/libgo/go/golang.org/x/sys/cpu/cpu_mips64x.go
new file mode 100644 (file)
index 0000000..f55e0c8
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips64 mips64le
+
+package cpu
+
+const cacheLineSize = 32
+
+func doinit() {}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_mipsx.go b/libgo/go/golang.org/x/sys/cpu/cpu_mipsx.go
new file mode 100644 (file)
index 0000000..cda87b1
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips mipsle
+
+package cpu
+
+const cacheLineSize = 32
+
+func doinit() {}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_other_arm64.go b/libgo/go/golang.org/x/sys/cpu/cpu_other_arm64.go
new file mode 100644 (file)
index 0000000..dd1e76d
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !linux,arm64
+
+package cpu
+
+const cacheLineSize = 64
+
+func doinit() {}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_wasm.go b/libgo/go/golang.org/x/sys/cpu/cpu_wasm.go
new file mode 100644 (file)
index 0000000..bd9bbda
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build wasm
+
+package cpu
+
+// We're compiling the cpu package for an unknown (software-abstracted) CPU.
+// Make CacheLinePad an empty struct and hope that the usual struct alignment
+// rules are good enough.
+
+const cacheLineSize = 0
+
+func doinit() {}
diff --git a/libgo/go/golang.org/x/sys/cpu/cpu_x86.go b/libgo/go/golang.org/x/sys/cpu/cpu_x86.go
new file mode 100644 (file)
index 0000000..d70d317
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+
+package cpu
+
+const cacheLineSize = 64
+
+func init() {
+       Initialized = true
+
+       maxID, _, _, _ := cpuid(0, 0)
+
+       if maxID < 1 {
+               return
+       }
+
+       _, _, ecx1, edx1 := cpuid(1, 0)
+       X86.HasSSE2 = isSet(26, edx1)
+
+       X86.HasSSE3 = isSet(0, ecx1)
+       X86.HasPCLMULQDQ = isSet(1, ecx1)
+       X86.HasSSSE3 = isSet(9, ecx1)
+       X86.HasFMA = isSet(12, ecx1)
+       X86.HasSSE41 = isSet(19, ecx1)
+       X86.HasSSE42 = isSet(20, ecx1)
+       X86.HasPOPCNT = isSet(23, ecx1)
+       X86.HasAES = isSet(25, ecx1)
+       X86.HasOSXSAVE = isSet(27, ecx1)
+       X86.HasRDRAND = isSet(30, ecx1)
+
+       osSupportsAVX := false
+       // For XGETBV, OSXSAVE bit is required and sufficient.
+       if X86.HasOSXSAVE {
+               eax, _ := xgetbv()
+               // Check if XMM and YMM registers have OS support.
+               osSupportsAVX = isSet(1, eax) && isSet(2, eax)
+       }
+
+       X86.HasAVX = isSet(28, ecx1) && osSupportsAVX
+
+       if maxID < 7 {
+               return
+       }
+
+       _, ebx7, _, _ := cpuid(7, 0)
+       X86.HasBMI1 = isSet(3, ebx7)
+       X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX
+       X86.HasBMI2 = isSet(8, ebx7)
+       X86.HasERMS = isSet(9, ebx7)
+       X86.HasRDSEED = isSet(18, ebx7)
+       X86.HasADX = isSet(19, ebx7)
+}
+
+func isSet(bitpos uint, value uint32) bool {
+       return value&(1<<bitpos) != 0
+}
diff --git a/libgo/go/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/libgo/go/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go
new file mode 100644 (file)
index 0000000..78fe25e
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Minimal copy of x/sys/unix so the cpu package can make a
+// system call on AIX without depending on x/sys/unix.
+// (See golang.org/issue/32102)
+
+// +build aix,ppc64
+// +build !gccgo
+
+package cpu
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o"
+
+//go:linkname libc_getsystemcfg libc_getsystemcfg
+
+type syscallFunc uintptr
+
+var libc_getsystemcfg syscallFunc
+
+type errno = syscall.Errno
+
+// Implemented in runtime/syscall_aix.go.
+func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno)
+func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno)
+
+func callgetsystemcfg(label int) (r1 uintptr, e1 errno) {
+       r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0)
+       return
+}
diff --git a/libgo/go/golang.org/x/text/secure/bidirule/bidirule.go b/libgo/go/golang.org/x/text/secure/bidirule/bidirule.go
new file mode 100644 (file)
index 0000000..e2b70f7
--- /dev/null
@@ -0,0 +1,336 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bidirule implements the Bidi Rule defined by RFC 5893.
+//
+// This package is under development. The API may change without notice and
+// without preserving backward compatibility.
+package bidirule
+
+import (
+       "errors"
+       "unicode/utf8"
+
+       "golang.org/x/text/transform"
+       "golang.org/x/text/unicode/bidi"
+)
+
+// This file contains an implementation of RFC 5893: Right-to-Left Scripts for
+// Internationalized Domain Names for Applications (IDNA)
+//
+// A label is an individual component of a domain name.  Labels are usually
+// shown separated by dots; for example, the domain name "www.example.com" is
+// composed of three labels: "www", "example", and "com".
+//
+// An RTL label is a label that contains at least one character of class R, AL,
+// or AN. An LTR label is any label that is not an RTL label.
+//
+// A "Bidi domain name" is a domain name that contains at least one RTL label.
+//
+//  The following guarantees can be made based on the above:
+//
+//  o  In a domain name consisting of only labels that satisfy the rule,
+//     the requirements of Section 3 are satisfied.  Note that even LTR
+//     labels and pure ASCII labels have to be tested.
+//
+//  o  In a domain name consisting of only LDH labels (as defined in the
+//     Definitions document [RFC5890]) and labels that satisfy the rule,
+//     the requirements of Section 3 are satisfied as long as a label
+//     that starts with an ASCII digit does not come after a
+//     right-to-left label.
+//
+//  No guarantee is given for other combinations.
+
+// ErrInvalid indicates a label is invalid according to the Bidi Rule.
+var ErrInvalid = errors.New("bidirule: failed Bidi Rule")
+
+type ruleState uint8
+
+const (
+       ruleInitial ruleState = iota
+       ruleLTR
+       ruleLTRFinal
+       ruleRTL
+       ruleRTLFinal
+       ruleInvalid
+)
+
+type ruleTransition struct {
+       next ruleState
+       mask uint16
+}
+
+var transitions = [...][2]ruleTransition{
+       // [2.1] The first character must be a character with Bidi property L, R, or
+       // AL. If it has the R or AL property, it is an RTL label; if it has the L
+       // property, it is an LTR label.
+       ruleInitial: {
+               {ruleLTRFinal, 1 << bidi.L},
+               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL},
+       },
+       ruleRTL: {
+               // [2.3] In an RTL label, the end of the label must be a character with
+               // Bidi property R, AL, EN, or AN, followed by zero or more characters
+               // with Bidi property NSM.
+               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN},
+
+               // [2.2] In an RTL label, only characters with the Bidi properties R,
+               // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
+               // We exclude the entries from [2.3]
+               {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
+       },
+       ruleRTLFinal: {
+               // [2.3] In an RTL label, the end of the label must be a character with
+               // Bidi property R, AL, EN, or AN, followed by zero or more characters
+               // with Bidi property NSM.
+               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM},
+
+               // [2.2] In an RTL label, only characters with the Bidi properties R,
+               // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
+               // We exclude the entries from [2.3] and NSM.
+               {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
+       },
+       ruleLTR: {
+               // [2.6] In an LTR label, the end of the label must be a character with
+               // Bidi property L or EN, followed by zero or more characters with Bidi
+               // property NSM.
+               {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN},
+
+               // [2.5] In an LTR label, only characters with the Bidi properties L,
+               // EN, ES, CS, ET, ON, BN, or NSM are allowed.
+               // We exclude the entries from [2.6].
+               {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
+       },
+       ruleLTRFinal: {
+               // [2.6] In an LTR label, the end of the label must be a character with
+               // Bidi property L or EN, followed by zero or more characters with Bidi
+               // property NSM.
+               {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM},
+
+               // [2.5] In an LTR label, only characters with the Bidi properties L,
+               // EN, ES, CS, ET, ON, BN, or NSM are allowed.
+               // We exclude the entries from [2.6].
+               {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
+       },
+       ruleInvalid: {
+               {ruleInvalid, 0},
+               {ruleInvalid, 0},
+       },
+}
+
+// [2.4] In an RTL label, if an EN is present, no AN may be present, and
+// vice versa.
+const exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN)
+
+// From RFC 5893
+// An RTL label is a label that contains at least one character of type
+// R, AL, or AN.
+//
+// An LTR label is any label that is not an RTL label.
+
+// Direction reports the direction of the given label as defined by RFC 5893.
+// The Bidi Rule does not have to be applied to labels of the category
+// LeftToRight.
+func Direction(b []byte) bidi.Direction {
+       for i := 0; i < len(b); {
+               e, sz := bidi.Lookup(b[i:])
+               if sz == 0 {
+                       i++
+               }
+               c := e.Class()
+               if c == bidi.R || c == bidi.AL || c == bidi.AN {
+                       return bidi.RightToLeft
+               }
+               i += sz
+       }
+       return bidi.LeftToRight
+}
+
+// DirectionString reports the direction of the given label as defined by RFC
+// 5893. The Bidi Rule does not have to be applied to labels of the category
+// LeftToRight.
+func DirectionString(s string) bidi.Direction {
+       for i := 0; i < len(s); {
+               e, sz := bidi.LookupString(s[i:])
+               if sz == 0 {
+                       i++
+                       continue
+               }
+               c := e.Class()
+               if c == bidi.R || c == bidi.AL || c == bidi.AN {
+                       return bidi.RightToLeft
+               }
+               i += sz
+       }
+       return bidi.LeftToRight
+}
+
+// Valid reports whether b conforms to the BiDi rule.
+func Valid(b []byte) bool {
+       var t Transformer
+       if n, ok := t.advance(b); !ok || n < len(b) {
+               return false
+       }
+       return t.isFinal()
+}
+
+// ValidString reports whether s conforms to the BiDi rule.
+func ValidString(s string) bool {
+       var t Transformer
+       if n, ok := t.advanceString(s); !ok || n < len(s) {
+               return false
+       }
+       return t.isFinal()
+}
+
+// New returns a Transformer that verifies that input adheres to the Bidi Rule.
+func New() *Transformer {
+       return &Transformer{}
+}
+
+// Transformer implements transform.Transform.
+type Transformer struct {
+       state  ruleState
+       hasRTL bool
+       seen   uint16
+}
+
+// A rule can only be violated for "Bidi Domain names", meaning if one of the
+// following categories has been observed.
+func (t *Transformer) isRTL() bool {
+       const isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN
+       return t.seen&isRTL != 0
+}
+
+// Reset implements transform.Transformer.
+func (t *Transformer) Reset() { *t = Transformer{} }
+
+// Transform implements transform.Transformer. This Transformer has state and
+// needs to be reset between uses.
+func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       if len(dst) < len(src) {
+               src = src[:len(dst)]
+               atEOF = false
+               err = transform.ErrShortDst
+       }
+       n, err1 := t.Span(src, atEOF)
+       copy(dst, src[:n])
+       if err == nil || err1 != nil && err1 != transform.ErrShortSrc {
+               err = err1
+       }
+       return n, n, err
+}
+
+// Span returns the first n bytes of src that conform to the Bidi rule.
+func (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) {
+       if t.state == ruleInvalid && t.isRTL() {
+               return 0, ErrInvalid
+       }
+       n, ok := t.advance(src)
+       switch {
+       case !ok:
+               err = ErrInvalid
+       case n < len(src):
+               if !atEOF {
+                       err = transform.ErrShortSrc
+                       break
+               }
+               err = ErrInvalid
+       case !t.isFinal():
+               err = ErrInvalid
+       }
+       return n, err
+}
+
+// Precomputing the ASCII values decreases running time for the ASCII fast path
+// by about 30%.
+var asciiTable [128]bidi.Properties
+
+func init() {
+       for i := range asciiTable {
+               p, _ := bidi.LookupRune(rune(i))
+               asciiTable[i] = p
+       }
+}
+
+func (t *Transformer) advance(s []byte) (n int, ok bool) {
+       var e bidi.Properties
+       var sz int
+       for n < len(s) {
+               if s[n] < utf8.RuneSelf {
+                       e, sz = asciiTable[s[n]], 1
+               } else {
+                       e, sz = bidi.Lookup(s[n:])
+                       if sz <= 1 {
+                               if sz == 1 {
+                                       // We always consider invalid UTF-8 to be invalid, even if
+                                       // the string has not yet been determined to be RTL.
+                                       // TODO: is this correct?
+                                       return n, false
+                               }
+                               return n, true // incomplete UTF-8 encoding
+                       }
+               }
+               // TODO: using CompactClass would result in noticeable speedup.
+               // See unicode/bidi/prop.go:Properties.CompactClass.
+               c := uint16(1 << e.Class())
+               t.seen |= c
+               if t.seen&exclusiveRTL == exclusiveRTL {
+                       t.state = ruleInvalid
+                       return n, false
+               }
+               switch tr := transitions[t.state]; {
+               case tr[0].mask&c != 0:
+                       t.state = tr[0].next
+               case tr[1].mask&c != 0:
+                       t.state = tr[1].next
+               default:
+                       t.state = ruleInvalid
+                       if t.isRTL() {
+                               return n, false
+                       }
+               }
+               n += sz
+       }
+       return n, true
+}
+
+func (t *Transformer) advanceString(s string) (n int, ok bool) {
+       var e bidi.Properties
+       var sz int
+       for n < len(s) {
+               if s[n] < utf8.RuneSelf {
+                       e, sz = asciiTable[s[n]], 1
+               } else {
+                       e, sz = bidi.LookupString(s[n:])
+                       if sz <= 1 {
+                               if sz == 1 {
+                                       return n, false // invalid UTF-8
+                               }
+                               return n, true // incomplete UTF-8 encoding
+                       }
+               }
+               // TODO: using CompactClass results in noticeable speedup.
+               // See unicode/bidi/prop.go:Properties.CompactClass.
+               c := uint16(1 << e.Class())
+               t.seen |= c
+               if t.seen&exclusiveRTL == exclusiveRTL {
+                       t.state = ruleInvalid
+                       return n, false
+               }
+               switch tr := transitions[t.state]; {
+               case tr[0].mask&c != 0:
+                       t.state = tr[0].next
+               case tr[1].mask&c != 0:
+                       t.state = tr[1].next
+               default:
+                       t.state = ruleInvalid
+                       if t.isRTL() {
+                               return n, false
+                       }
+               }
+               n += sz
+       }
+       return n, true
+}
diff --git a/libgo/go/golang.org/x/text/secure/bidirule/bidirule10.0.0.go b/libgo/go/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
new file mode 100644 (file)
index 0000000..e4c6228
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.10
+
+package bidirule
+
+func (t *Transformer) isFinal() bool {
+       return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
+}
diff --git a/libgo/go/golang.org/x/text/secure/bidirule/bidirule9.0.0.go b/libgo/go/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
new file mode 100644 (file)
index 0000000..02b9e1e
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.10
+
+package bidirule
+
+func (t *Transformer) isFinal() bool {
+       if !t.isRTL() {
+               return true
+       }
+       return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
+}
diff --git a/libgo/go/golang.org/x/text/transform/transform.go b/libgo/go/golang.org/x/text/transform/transform.go
new file mode 100644 (file)
index 0000000..520b9ad
--- /dev/null
@@ -0,0 +1,705 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package transform provides reader and writer wrappers that transform the
+// bytes passing through as well as various transformations. Example
+// transformations provided by other packages include normalization and
+// conversion between character sets.
+package transform // import "golang.org/x/text/transform"
+
+import (
+       "bytes"
+       "errors"
+       "io"
+       "unicode/utf8"
+)
+
+var (
+       // ErrShortDst means that the destination buffer was too short to
+       // receive all of the transformed bytes.
+       ErrShortDst = errors.New("transform: short destination buffer")
+
+       // ErrShortSrc means that the source buffer has insufficient data to
+       // complete the transformation.
+       ErrShortSrc = errors.New("transform: short source buffer")
+
+       // ErrEndOfSpan means that the input and output (the transformed input)
+       // are not identical.
+       ErrEndOfSpan = errors.New("transform: input and output are not identical")
+
+       // errInconsistentByteCount means that Transform returned success (nil
+       // error) but also returned nSrc inconsistent with the src argument.
+       errInconsistentByteCount = errors.New("transform: inconsistent byte count returned")
+
+       // errShortInternal means that an internal buffer is not large enough
+       // to make progress and the Transform operation must be aborted.
+       errShortInternal = errors.New("transform: short internal buffer")
+)
+
+// Transformer transforms bytes.
+type Transformer interface {
+       // Transform writes to dst the transformed bytes read from src, and
+       // returns the number of dst bytes written and src bytes read. The
+       // atEOF argument tells whether src represents the last bytes of the
+       // input.
+       //
+       // Callers should always process the nDst bytes produced and account
+       // for the nSrc bytes consumed before considering the error err.
+       //
+       // A nil error means that all of the transformed bytes (whether freshly
+       // transformed from src or left over from previous Transform calls)
+       // were written to dst. A nil error can be returned regardless of
+       // whether atEOF is true. If err is nil then nSrc must equal len(src);
+       // the converse is not necessarily true.
+       //
+       // ErrShortDst means that dst was too short to receive all of the
+       // transformed bytes. ErrShortSrc means that src had insufficient data
+       // to complete the transformation. If both conditions apply, then
+       // either error may be returned. Other than the error conditions listed
+       // here, implementations are free to report other errors that arise.
+       Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
+
+       // Reset resets the state and allows a Transformer to be reused.
+       Reset()
+}
+
+// SpanningTransformer extends the Transformer interface with a Span method
+// that determines how much of the input already conforms to the Transformer.
+type SpanningTransformer interface {
+       Transformer
+
+       // Span returns a position in src such that transforming src[:n] results in
+       // identical output src[:n] for these bytes. It does not necessarily return
+       // the largest such n. The atEOF argument tells whether src represents the
+       // last bytes of the input.
+       //
+       // Callers should always account for the n bytes consumed before
+       // considering the error err.
+       //
+       // A nil error means that all input bytes are known to be identical to the
+       // output produced by the Transformer. A nil error can be returned
+       // regardless of whether atEOF is true. If err is nil, then n must
+       // equal len(src); the converse is not necessarily true.
+       //
+       // ErrEndOfSpan means that the Transformer output may differ from the
+       // input after n bytes. Note that n may be len(src), meaning that the output
+       // would contain additional bytes after otherwise identical output.
+       // ErrShortSrc means that src had insufficient data to determine whether the
+       // remaining bytes would change. Other than the error conditions listed
+       // here, implementations are free to report other errors that arise.
+       //
+       // Calling Span can modify the Transformer state as a side effect. In
+       // effect, it does the transformation just as calling Transform would, only
+       // without copying to a destination buffer and only up to a point it can
+       // determine the input and output bytes are the same. This is obviously more
+       // limited than calling Transform, but can be more efficient in terms of
+       // copying and allocating buffers. Calls to Span and Transform may be
+       // interleaved.
+       Span(src []byte, atEOF bool) (n int, err error)
+}
+
+// NopResetter can be embedded by implementations of Transformer to add a nop
+// Reset method.
+type NopResetter struct{}
+
+// Reset implements the Reset method of the Transformer interface.
+func (NopResetter) Reset() {}
+
+// Reader wraps another io.Reader by transforming the bytes read.
+type Reader struct {
+       r   io.Reader
+       t   Transformer
+       err error
+
+       // dst[dst0:dst1] contains bytes that have been transformed by t but
+       // not yet copied out via Read.
+       dst        []byte
+       dst0, dst1 int
+
+       // src[src0:src1] contains bytes that have been read from r but not
+       // yet transformed through t.
+       src        []byte
+       src0, src1 int
+
+       // transformComplete is whether the transformation is complete,
+       // regardless of whether or not it was successful.
+       transformComplete bool
+}
+
+const defaultBufSize = 4096
+
+// NewReader returns a new Reader that wraps r by transforming the bytes read
+// via t. It calls Reset on t.
+func NewReader(r io.Reader, t Transformer) *Reader {
+       t.Reset()
+       return &Reader{
+               r:   r,
+               t:   t,
+               dst: make([]byte, defaultBufSize),
+               src: make([]byte, defaultBufSize),
+       }
+}
+
+// Read implements the io.Reader interface.
+func (r *Reader) Read(p []byte) (int, error) {
+       n, err := 0, error(nil)
+       for {
+               // Copy out any transformed bytes and return the final error if we are done.
+               if r.dst0 != r.dst1 {
+                       n = copy(p, r.dst[r.dst0:r.dst1])
+                       r.dst0 += n
+                       if r.dst0 == r.dst1 && r.transformComplete {
+                               return n, r.err
+                       }
+                       return n, nil
+               } else if r.transformComplete {
+                       return 0, r.err
+               }
+
+               // Try to transform some source bytes, or to flush the transformer if we
+               // are out of source bytes. We do this even if r.r.Read returned an error.
+               // As the io.Reader documentation says, "process the n > 0 bytes returned
+               // before considering the error".
+               if r.src0 != r.src1 || r.err != nil {
+                       r.dst0 = 0
+                       r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF)
+                       r.src0 += n
+
+                       switch {
+                       case err == nil:
+                               if r.src0 != r.src1 {
+                                       r.err = errInconsistentByteCount
+                               }
+                               // The Transform call was successful; we are complete if we
+                               // cannot read more bytes into src.
+                               r.transformComplete = r.err != nil
+                               continue
+                       case err == ErrShortDst && (r.dst1 != 0 || n != 0):
+                               // Make room in dst by copying out, and try again.
+                               continue
+                       case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil:
+                               // Read more bytes into src via the code below, and try again.
+                       default:
+                               r.transformComplete = true
+                               // The reader error (r.err) takes precedence over the
+                               // transformer error (err) unless r.err is nil or io.EOF.
+                               if r.err == nil || r.err == io.EOF {
+                                       r.err = err
+                               }
+                               continue
+                       }
+               }
+
+               // Move any untransformed source bytes to the start of the buffer
+               // and read more bytes.
+               if r.src0 != 0 {
+                       r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1])
+               }
+               n, r.err = r.r.Read(r.src[r.src1:])
+               r.src1 += n
+       }
+}
+
+// TODO: implement ReadByte (and ReadRune??).
+
+// Writer wraps another io.Writer by transforming the bytes read.
+// The user needs to call Close to flush unwritten bytes that may
+// be buffered.
+type Writer struct {
+       w   io.Writer
+       t   Transformer
+       dst []byte
+
+       // src[:n] contains bytes that have not yet passed through t.
+       src []byte
+       n   int
+}
+
+// NewWriter returns a new Writer that wraps w by transforming the bytes written
+// via t. It calls Reset on t.
+func NewWriter(w io.Writer, t Transformer) *Writer {
+       t.Reset()
+       return &Writer{
+               w:   w,
+               t:   t,
+               dst: make([]byte, defaultBufSize),
+               src: make([]byte, defaultBufSize),
+       }
+}
+
+// Write implements the io.Writer interface. If there are not enough
+// bytes available to complete a Transform, the bytes will be buffered
+// for the next write. Call Close to convert the remaining bytes.
+func (w *Writer) Write(data []byte) (n int, err error) {
+       src := data
+       if w.n > 0 {
+               // Append bytes from data to the last remainder.
+               // TODO: limit the amount copied on first try.
+               n = copy(w.src[w.n:], data)
+               w.n += n
+               src = w.src[:w.n]
+       }
+       for {
+               nDst, nSrc, err := w.t.Transform(w.dst, src, false)
+               if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
+                       return n, werr
+               }
+               src = src[nSrc:]
+               if w.n == 0 {
+                       n += nSrc
+               } else if len(src) <= n {
+                       // Enough bytes from w.src have been consumed. We make src point
+                       // to data instead to reduce the copying.
+                       w.n = 0
+                       n -= len(src)
+                       src = data[n:]
+                       if n < len(data) && (err == nil || err == ErrShortSrc) {
+                               continue
+                       }
+               }
+               switch err {
+               case ErrShortDst:
+                       // This error is okay as long as we are making progress.
+                       if nDst > 0 || nSrc > 0 {
+                               continue
+                       }
+               case ErrShortSrc:
+                       if len(src) < len(w.src) {
+                               m := copy(w.src, src)
+                               // If w.n > 0, bytes from data were already copied to w.src and n
+                               // was already set to the number of bytes consumed.
+                               if w.n == 0 {
+                                       n += m
+                               }
+                               w.n = m
+                               err = nil
+                       } else if nDst > 0 || nSrc > 0 {
+                               // Not enough buffer to store the remainder. Keep processing as
+                               // long as there is progress. Without this case, transforms that
+                               // require a lookahead larger than the buffer may result in an
+                               // error. This is not something one may expect to be common in
+                               // practice, but it may occur when buffers are set to small
+                               // sizes during testing.
+                               continue
+                       }
+               case nil:
+                       if w.n > 0 {
+                               err = errInconsistentByteCount
+                       }
+               }
+               return n, err
+       }
+}
+
+// Close implements the io.Closer interface.
+func (w *Writer) Close() error {
+       src := w.src[:w.n]
+       for {
+               nDst, nSrc, err := w.t.Transform(w.dst, src, true)
+               if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
+                       return werr
+               }
+               if err != ErrShortDst {
+                       return err
+               }
+               src = src[nSrc:]
+       }
+}
+
+type nop struct{ NopResetter }
+
+func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       n := copy(dst, src)
+       if n < len(src) {
+               err = ErrShortDst
+       }
+       return n, n, err
+}
+
+func (nop) Span(src []byte, atEOF bool) (n int, err error) {
+       return len(src), nil
+}
+
+type discard struct{ NopResetter }
+
+func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       return 0, len(src), nil
+}
+
+var (
+       // Discard is a Transformer for which all Transform calls succeed
+       // by consuming all bytes and writing nothing.
+       Discard Transformer = discard{}
+
+       // Nop is a SpanningTransformer that copies src to dst.
+       Nop SpanningTransformer = nop{}
+)
+
+// chain is a sequence of links. A chain with N Transformers has N+1 links and
+// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst
+// buffers given to chain.Transform and the middle N-1 buffers are intermediate
+// buffers owned by the chain. The i'th link transforms bytes from the i'th
+// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer
+// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N).
+type chain struct {
+       link []link
+       err  error
+       // errStart is the index at which the error occurred plus 1. Processing
+       // errStart at this level at the next call to Transform. As long as
+       // errStart > 0, chain will not consume any more source bytes.
+       errStart int
+}
+
+func (c *chain) fatalError(errIndex int, err error) {
+       if i := errIndex + 1; i > c.errStart {
+               c.errStart = i
+               c.err = err
+       }
+}
+
+type link struct {
+       t Transformer
+       // b[p:n] holds the bytes to be transformed by t.
+       b []byte
+       p int
+       n int
+}
+
+func (l *link) src() []byte {
+       return l.b[l.p:l.n]
+}
+
+func (l *link) dst() []byte {
+       return l.b[l.n:]
+}
+
+// Chain returns a Transformer that applies t in sequence.
+func Chain(t ...Transformer) Transformer {
+       if len(t) == 0 {
+               return nop{}
+       }
+       c := &chain{link: make([]link, len(t)+1)}
+       for i, tt := range t {
+               c.link[i].t = tt
+       }
+       // Allocate intermediate buffers.
+       b := make([][defaultBufSize]byte, len(t)-1)
+       for i := range b {
+               c.link[i+1].b = b[i][:]
+       }
+       return c
+}
+
+// Reset resets the state of Chain. It calls Reset on all the Transformers.
+func (c *chain) Reset() {
+       for i, l := range c.link {
+               if l.t != nil {
+                       l.t.Reset()
+               }
+               c.link[i].p, c.link[i].n = 0, 0
+       }
+}
+
+// TODO: make chain use Span (is going to be fun to implement!)
+
+// Transform applies the transformers of c in sequence.
+func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       // Set up src and dst in the chain.
+       srcL := &c.link[0]
+       dstL := &c.link[len(c.link)-1]
+       srcL.b, srcL.p, srcL.n = src, 0, len(src)
+       dstL.b, dstL.n = dst, 0
+       var lastFull, needProgress bool // for detecting progress
+
+       // i is the index of the next Transformer to apply, for i in [low, high].
+       // low is the lowest index for which c.link[low] may still produce bytes.
+       // high is the highest index for which c.link[high] has a Transformer.
+       // The error returned by Transform determines whether to increase or
+       // decrease i. We try to completely fill a buffer before converting it.
+       for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; {
+               in, out := &c.link[i], &c.link[i+1]
+               nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i)
+               out.n += nDst
+               in.p += nSrc
+               if i > 0 && in.p == in.n {
+                       in.p, in.n = 0, 0
+               }
+               needProgress, lastFull = lastFull, false
+               switch err0 {
+               case ErrShortDst:
+                       // Process the destination buffer next. Return if we are already
+                       // at the high index.
+                       if i == high {
+                               return dstL.n, srcL.p, ErrShortDst
+                       }
+                       if out.n != 0 {
+                               i++
+                               // If the Transformer at the next index is not able to process any
+                               // source bytes there is nothing that can be done to make progress
+                               // and the bytes will remain unprocessed. lastFull is used to
+                               // detect this and break out of the loop with a fatal error.
+                               lastFull = true
+                               continue
+                       }
+                       // The destination buffer was too small, but is completely empty.
+                       // Return a fatal error as this transformation can never complete.
+                       c.fatalError(i, errShortInternal)
+               case ErrShortSrc:
+                       if i == 0 {
+                               // Save ErrShortSrc in err. All other errors take precedence.
+                               err = ErrShortSrc
+                               break
+                       }
+                       // Source bytes were depleted before filling up the destination buffer.
+                       // Verify we made some progress, move the remaining bytes to the errStart
+                       // and try to get more source bytes.
+                       if needProgress && nSrc == 0 || in.n-in.p == len(in.b) {
+                               // There were not enough source bytes to proceed while the source
+                               // buffer cannot hold any more bytes. Return a fatal error as this
+                               // transformation can never complete.
+                               c.fatalError(i, errShortInternal)
+                               break
+                       }
+                       // in.b is an internal buffer and we can make progress.
+                       in.p, in.n = 0, copy(in.b, in.src())
+                       fallthrough
+               case nil:
+                       // if i == low, we have depleted the bytes at index i or any lower levels.
+                       // In that case we increase low and i. In all other cases we decrease i to
+                       // fetch more bytes before proceeding to the next index.
+                       if i > low {
+                               i--
+                               continue
+                       }
+               default:
+                       c.fatalError(i, err0)
+               }
+               // Exhausted level low or fatal error: increase low and continue
+               // to process the bytes accepted so far.
+               i++
+               low = i
+       }
+
+       // If c.errStart > 0, this means we found a fatal error.  We will clear
+       // all upstream buffers. At this point, no more progress can be made
+       // downstream, as Transform would have bailed while handling ErrShortDst.
+       if c.errStart > 0 {
+               for i := 1; i < c.errStart; i++ {
+                       c.link[i].p, c.link[i].n = 0, 0
+               }
+               err, c.errStart, c.err = c.err, 0, nil
+       }
+       return dstL.n, srcL.p, err
+}
+
+// Deprecated: Use runes.Remove instead.
+func RemoveFunc(f func(r rune) bool) Transformer {
+       return removeF(f)
+}
+
+type removeF func(r rune) bool
+
+func (removeF) Reset() {}
+
+// Transform implements the Transformer interface.
+func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] {
+
+               if r = rune(src[0]); r < utf8.RuneSelf {
+                       sz = 1
+               } else {
+                       r, sz = utf8.DecodeRune(src)
+
+                       if sz == 1 {
+                               // Invalid rune.
+                               if !atEOF && !utf8.FullRune(src) {
+                                       err = ErrShortSrc
+                                       break
+                               }
+                               // We replace illegal bytes with RuneError. Not doing so might
+                               // otherwise turn a sequence of invalid UTF-8 into valid UTF-8.
+                               // The resulting byte sequence may subsequently contain runes
+                               // for which t(r) is true that were passed unnoticed.
+                               if !t(r) {
+                                       if nDst+3 > len(dst) {
+                                               err = ErrShortDst
+                                               break
+                                       }
+                                       nDst += copy(dst[nDst:], "\uFFFD")
+                               }
+                               nSrc++
+                               continue
+                       }
+               }
+
+               if !t(r) {
+                       if nDst+sz > len(dst) {
+                               err = ErrShortDst
+                               break
+                       }
+                       nDst += copy(dst[nDst:], src[:sz])
+               }
+               nSrc += sz
+       }
+       return
+}
+
+// grow returns a new []byte that is longer than b, and copies the first n bytes
+// of b to the start of the new slice.
+func grow(b []byte, n int) []byte {
+       m := len(b)
+       if m <= 32 {
+               m = 64
+       } else if m <= 256 {
+               m *= 2
+       } else {
+               m += m >> 1
+       }
+       buf := make([]byte, m)
+       copy(buf, b[:n])
+       return buf
+}
+
+const initialBufSize = 128
+
+// String returns a string with the result of converting s[:n] using t, where
+// n <= len(s). If err == nil, n will be len(s). It calls Reset on t.
+func String(t Transformer, s string) (result string, n int, err error) {
+       t.Reset()
+       if s == "" {
+               // Fast path for the common case for empty input. Results in about a
+               // 86% reduction of running time for BenchmarkStringLowerEmpty.
+               if _, _, err := t.Transform(nil, nil, true); err == nil {
+                       return "", 0, nil
+               }
+       }
+
+       // Allocate only once. Note that both dst and src escape when passed to
+       // Transform.
+       buf := [2 * initialBufSize]byte{}
+       dst := buf[:initialBufSize:initialBufSize]
+       src := buf[initialBufSize : 2*initialBufSize]
+
+       // The input string s is transformed in multiple chunks (starting with a
+       // chunk size of initialBufSize). nDst and nSrc are per-chunk (or
+       // per-Transform-call) indexes, pDst and pSrc are overall indexes.
+       nDst, nSrc := 0, 0
+       pDst, pSrc := 0, 0
+
+       // pPrefix is the length of a common prefix: the first pPrefix bytes of the
+       // result will equal the first pPrefix bytes of s. It is not guaranteed to
+       // be the largest such value, but if pPrefix, len(result) and len(s) are
+       // all equal after the final transform (i.e. calling Transform with atEOF
+       // being true returned nil error) then we don't need to allocate a new
+       // result string.
+       pPrefix := 0
+       for {
+               // Invariant: pDst == pPrefix && pSrc == pPrefix.
+
+               n := copy(src, s[pSrc:])
+               nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s))
+               pDst += nDst
+               pSrc += nSrc
+
+               // TODO:  let transformers implement an optional Spanner interface, akin
+               // to norm's QuickSpan. This would even allow us to avoid any allocation.
+               if !bytes.Equal(dst[:nDst], src[:nSrc]) {
+                       break
+               }
+               pPrefix = pSrc
+               if err == ErrShortDst {
+                       // A buffer can only be short if a transformer modifies its input.
+                       break
+               } else if err == ErrShortSrc {
+                       if nSrc == 0 {
+                               // No progress was made.
+                               break
+                       }
+                       // Equal so far and !atEOF, so continue checking.
+               } else if err != nil || pPrefix == len(s) {
+                       return string(s[:pPrefix]), pPrefix, err
+               }
+       }
+       // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc.
+
+       // We have transformed the first pSrc bytes of the input s to become pDst
+       // transformed bytes. Those transformed bytes are discontiguous: the first
+       // pPrefix of them equal s[:pPrefix] and the last nDst of them equal
+       // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so
+       // that they become one contiguous slice: dst[:pDst].
+       if pPrefix != 0 {
+               newDst := dst
+               if pDst > len(newDst) {
+                       newDst = make([]byte, len(s)+nDst-nSrc)
+               }
+               copy(newDst[pPrefix:pDst], dst[:nDst])
+               copy(newDst[:pPrefix], s[:pPrefix])
+               dst = newDst
+       }
+
+       // Prevent duplicate Transform calls with atEOF being true at the end of
+       // the input. Also return if we have an unrecoverable error.
+       if (err == nil && pSrc == len(s)) ||
+               (err != nil && err != ErrShortDst && err != ErrShortSrc) {
+               return string(dst[:pDst]), pSrc, err
+       }
+
+       // Transform the remaining input, growing dst and src buffers as necessary.
+       for {
+               n := copy(src, s[pSrc:])
+               nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s))
+               pDst += nDst
+               pSrc += nSrc
+
+               // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can
+               // make progress. This may avoid excessive allocations.
+               if err == ErrShortDst {
+                       if nDst == 0 {
+                               dst = grow(dst, pDst)
+                       }
+               } else if err == ErrShortSrc {
+                       if nSrc == 0 {
+                               src = grow(src, 0)
+                       }
+               } else if err != nil || pSrc == len(s) {
+                       return string(dst[:pDst]), pSrc, err
+               }
+       }
+}
+
+// Bytes returns a new byte slice with the result of converting b[:n] using t,
+// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t.
+func Bytes(t Transformer, b []byte) (result []byte, n int, err error) {
+       return doAppend(t, 0, make([]byte, len(b)), b)
+}
+
+// Append appends the result of converting src[:n] using t to dst, where
+// n <= len(src), If err == nil, n will be len(src). It calls Reset on t.
+func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) {
+       if len(dst) == cap(dst) {
+               n := len(src) + len(dst) // It is okay for this to be 0.
+               b := make([]byte, n)
+               dst = b[:copy(b, dst)]
+       }
+       return doAppend(t, len(dst), dst[:cap(dst)], src)
+}
+
+func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) {
+       t.Reset()
+       pSrc := 0
+       for {
+               nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true)
+               pDst += nDst
+               pSrc += nSrc
+               if err != ErrShortDst {
+                       return dst[:pDst], pSrc, err
+               }
+
+               // Grow the destination buffer, but do not grow as long as we can make
+               // progress. This may avoid excessive allocations.
+               if nDst == 0 {
+                       dst = grow(dst, pDst)
+               }
+       }
+}
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/bidi.go b/libgo/go/golang.org/x/text/unicode/bidi/bidi.go
new file mode 100644 (file)
index 0000000..e8edc54
--- /dev/null
@@ -0,0 +1,198 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:generate go run gen.go gen_trieval.go gen_ranges.go
+
+// Package bidi contains functionality for bidirectional text support.
+//
+// See https://www.unicode.org/reports/tr9.
+//
+// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways
+// and without notice.
+package bidi // import "golang.org/x/text/unicode/bidi"
+
+// TODO:
+// The following functionality would not be hard to implement, but hinges on
+// the definition of a Segmenter interface. For now this is up to the user.
+// - Iterate over paragraphs
+// - Segmenter to iterate over runs directly from a given text.
+// Also:
+// - Transformer for reordering?
+// - Transformer (validator, really) for Bidi Rule.
+
+// This API tries to avoid dealing with embedding levels for now. Under the hood
+// these will be computed, but the question is to which extent the user should
+// know they exist. We should at some point allow the user to specify an
+// embedding hierarchy, though.
+
+// A Direction indicates the overall flow of text.
+type Direction int
+
+const (
+       // LeftToRight indicates the text contains no right-to-left characters and
+       // that either there are some left-to-right characters or the option
+       // DefaultDirection(LeftToRight) was passed.
+       LeftToRight Direction = iota
+
+       // RightToLeft indicates the text contains no left-to-right characters and
+       // that either there are some right-to-left characters or the option
+       // DefaultDirection(RightToLeft) was passed.
+       RightToLeft
+
+       // Mixed indicates text contains both left-to-right and right-to-left
+       // characters.
+       Mixed
+
+       // Neutral means that text contains no left-to-right and right-to-left
+       // characters and that no default direction has been set.
+       Neutral
+)
+
+type options struct{}
+
+// An Option is an option for Bidi processing.
+type Option func(*options)
+
+// ICU allows the user to define embedding levels. This may be used, for example,
+// to use hierarchical structure of markup languages to define embeddings.
+// The following option may be a way to expose this functionality in this API.
+// // LevelFunc sets a function that associates nesting levels with the given text.
+// // The levels function will be called with monotonically increasing values for p.
+// func LevelFunc(levels func(p int) int) Option {
+//     panic("unimplemented")
+// }
+
+// DefaultDirection sets the default direction for a Paragraph. The direction is
+// overridden if the text contains directional characters.
+func DefaultDirection(d Direction) Option {
+       panic("unimplemented")
+}
+
+// A Paragraph holds a single Paragraph for Bidi processing.
+type Paragraph struct {
+       // buffers
+}
+
+// SetBytes configures p for the given paragraph text. It replaces text
+// previously set by SetBytes or SetString. If b contains a paragraph separator
+// it will only process the first paragraph and report the number of bytes
+// consumed from b including this separator. Error may be non-nil if options are
+// given.
+func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) {
+       panic("unimplemented")
+}
+
+// SetString configures p for the given paragraph text. It replaces text
+// previously set by SetBytes or SetString. If b contains a paragraph separator
+// it will only process the first paragraph and report the number of bytes
+// consumed from b including this separator. Error may be non-nil if options are
+// given.
+func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) {
+       panic("unimplemented")
+}
+
+// IsLeftToRight reports whether the principle direction of rendering for this
+// paragraphs is left-to-right. If this returns false, the principle direction
+// of rendering is right-to-left.
+func (p *Paragraph) IsLeftToRight() bool {
+       panic("unimplemented")
+}
+
+// Direction returns the direction of the text of this paragraph.
+//
+// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
+func (p *Paragraph) Direction() Direction {
+       panic("unimplemented")
+}
+
+// RunAt reports the Run at the given position of the input text.
+//
+// This method can be used for computing line breaks on paragraphs.
+func (p *Paragraph) RunAt(pos int) Run {
+       panic("unimplemented")
+}
+
+// Order computes the visual ordering of all the runs in a Paragraph.
+func (p *Paragraph) Order() (Ordering, error) {
+       panic("unimplemented")
+}
+
+// Line computes the visual ordering of runs for a single line starting and
+// ending at the given positions in the original text.
+func (p *Paragraph) Line(start, end int) (Ordering, error) {
+       panic("unimplemented")
+}
+
+// An Ordering holds the computed visual order of runs of a Paragraph. Calling
+// SetBytes or SetString on the originating Paragraph invalidates an Ordering.
+// The methods of an Ordering should only be called by one goroutine at a time.
+type Ordering struct{}
+
+// Direction reports the directionality of the runs.
+//
+// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
+func (o *Ordering) Direction() Direction {
+       panic("unimplemented")
+}
+
+// NumRuns returns the number of runs.
+func (o *Ordering) NumRuns() int {
+       panic("unimplemented")
+}
+
+// Run returns the ith run within the ordering.
+func (o *Ordering) Run(i int) Run {
+       panic("unimplemented")
+}
+
+// TODO: perhaps with options.
+// // Reorder creates a reader that reads the runes in visual order per character.
+// // Modifiers remain after the runes they modify.
+// func (l *Runs) Reorder() io.Reader {
+//     panic("unimplemented")
+// }
+
+// A Run is a continuous sequence of characters of a single direction.
+type Run struct {
+}
+
+// String returns the text of the run in its original order.
+func (r *Run) String() string {
+       panic("unimplemented")
+}
+
+// Bytes returns the text of the run in its original order.
+func (r *Run) Bytes() []byte {
+       panic("unimplemented")
+}
+
+// TODO: methods for
+// - Display order
+// - headers and footers
+// - bracket replacement.
+
+// Direction reports the direction of the run.
+func (r *Run) Direction() Direction {
+       panic("unimplemented")
+}
+
+// Position of the Run within the text passed to SetBytes or SetString of the
+// originating Paragraph value.
+func (r *Run) Pos() (start, end int) {
+       panic("unimplemented")
+}
+
+// AppendReverse reverses the order of characters of in, appends them to out,
+// and returns the result. Modifiers will still follow the runes they modify.
+// Brackets are replaced with their counterparts.
+func AppendReverse(out, in []byte) []byte {
+       panic("unimplemented")
+}
+
+// ReverseString reverses the order of characters in s and returns a new string.
+// Modifiers will still follow the runes they modify. Brackets are replaced with
+// their counterparts.
+func ReverseString(s string) string {
+       panic("unimplemented")
+}
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/bracket.go b/libgo/go/golang.org/x/text/unicode/bidi/bracket.go
new file mode 100644 (file)
index 0000000..1853939
--- /dev/null
@@ -0,0 +1,335 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bidi
+
+import (
+       "container/list"
+       "fmt"
+       "sort"
+)
+
+// This file contains a port of the reference implementation of the
+// Bidi Parentheses Algorithm:
+// https://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java
+//
+// The implementation in this file covers definitions BD14-BD16 and rule N0
+// of UAX#9.
+//
+// Some preprocessing is done for each rune before data is passed to this
+// algorithm:
+//  - opening and closing brackets are identified
+//  - a bracket pair type, like '(' and ')' is assigned a unique identifier that
+//    is identical for the opening and closing bracket. It is left to do these
+//    mappings.
+//  - The BPA algorithm requires that bracket characters that are canonical
+//    equivalents of each other be able to be substituted for each other.
+//    It is the responsibility of the caller to do this canonicalization.
+//
+// In implementing BD16, this implementation departs slightly from the "logical"
+// algorithm defined in UAX#9. In particular, the stack referenced there
+// supports operations that go beyond a "basic" stack. An equivalent
+// implementation based on a linked list is used here.
+
+// Bidi_Paired_Bracket_Type
+// BD14. An opening paired bracket is a character whose
+// Bidi_Paired_Bracket_Type property value is Open.
+//
+// BD15. A closing paired bracket is a character whose
+// Bidi_Paired_Bracket_Type property value is Close.
+type bracketType byte
+
+const (
+       bpNone bracketType = iota
+       bpOpen
+       bpClose
+)
+
+// bracketPair holds a pair of index values for opening and closing bracket
+// location of a bracket pair.
+type bracketPair struct {
+       opener int
+       closer int
+}
+
+func (b *bracketPair) String() string {
+       return fmt.Sprintf("(%v, %v)", b.opener, b.closer)
+}
+
+// bracketPairs is a slice of bracketPairs with a sort.Interface implementation.
+type bracketPairs []bracketPair
+
+func (b bracketPairs) Len() int           { return len(b) }
+func (b bracketPairs) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }
+func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener }
+
+// resolvePairedBrackets runs the paired bracket part of the UBA algorithm.
+//
+// For each rune, it takes the indexes into the original string, the class the
+// bracket type (in pairTypes) and the bracket identifier (pairValues). It also
+// takes the direction type for the start-of-sentence and the embedding level.
+//
+// The identifiers for bracket types are the rune of the canonicalized opening
+// bracket for brackets (open or close) or 0 for runes that are not brackets.
+func resolvePairedBrackets(s *isolatingRunSequence) {
+       p := bracketPairer{
+               sos:              s.sos,
+               openers:          list.New(),
+               codesIsolatedRun: s.types,
+               indexes:          s.indexes,
+       }
+       dirEmbed := L
+       if s.level&1 != 0 {
+               dirEmbed = R
+       }
+       p.locateBrackets(s.p.pairTypes, s.p.pairValues)
+       p.resolveBrackets(dirEmbed, s.p.initialTypes)
+}
+
+type bracketPairer struct {
+       sos Class // direction corresponding to start of sequence
+
+       // The following is a restatement of BD 16 using non-algorithmic language.
+       //
+       // A bracket pair is a pair of characters consisting of an opening
+       // paired bracket and a closing paired bracket such that the
+       // Bidi_Paired_Bracket property value of the former equals the latter,
+       // subject to the following constraints.
+       // - both characters of a pair occur in the same isolating run sequence
+       // - the closing character of a pair follows the opening character
+       // - any bracket character can belong at most to one pair, the earliest possible one
+       // - any bracket character not part of a pair is treated like an ordinary character
+       // - pairs may nest properly, but their spans may not overlap otherwise
+
+       // Bracket characters with canonical decompositions are supposed to be
+       // treated as if they had been normalized, to allow normalized and non-
+       // normalized text to give the same result. In this implementation that step
+       // is pushed out to the caller. The caller has to ensure that the pairValue
+       // slices contain the rune of the opening bracket after normalization for
+       // any opening or closing bracket.
+
+       openers *list.List // list of positions for opening brackets
+
+       // bracket pair positions sorted by location of opening bracket
+       pairPositions bracketPairs
+
+       codesIsolatedRun []Class // directional bidi codes for an isolated run
+       indexes          []int   // array of index values into the original string
+
+}
+
+// matchOpener reports whether characters at given positions form a matching
+// bracket pair.
+func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool {
+       return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]]
+}
+
+const maxPairingDepth = 63
+
+// locateBrackets locates matching bracket pairs according to BD16.
+//
+// This implementation uses a linked list instead of a stack, because, while
+// elements are added at the front (like a push) they are not generally removed
+// in atomic 'pop' operations, reducing the benefit of the stack archetype.
+func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) {
+       // traverse the run
+       // do that explicitly (not in a for-each) so we can record position
+       for i, index := range p.indexes {
+
+               // look at the bracket type for each character
+               if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON {
+                       // continue scanning
+                       continue
+               }
+               switch pairTypes[index] {
+               case bpOpen:
+                       // check if maximum pairing depth reached
+                       if p.openers.Len() == maxPairingDepth {
+                               p.openers.Init()
+                               return
+                       }
+                       // remember opener location, most recent first
+                       p.openers.PushFront(i)
+
+               case bpClose:
+                       // see if there is a match
+                       count := 0
+                       for elem := p.openers.Front(); elem != nil; elem = elem.Next() {
+                               count++
+                               opener := elem.Value.(int)
+                               if p.matchOpener(pairValues, opener, i) {
+                                       // if the opener matches, add nested pair to the ordered list
+                                       p.pairPositions = append(p.pairPositions, bracketPair{opener, i})
+                                       // remove up to and including matched opener
+                                       for ; count > 0; count-- {
+                                               p.openers.Remove(p.openers.Front())
+                                       }
+                                       break
+                               }
+                       }
+                       sort.Sort(p.pairPositions)
+                       // if we get here, the closing bracket matched no openers
+                       // and gets ignored
+               }
+       }
+}
+
+// Bracket pairs within an isolating run sequence are processed as units so
+// that both the opening and the closing paired bracket in a pair resolve to
+// the same direction.
+//
+// N0. Process bracket pairs in an isolating run sequence sequentially in
+// the logical order of the text positions of the opening paired brackets
+// using the logic given below. Within this scope, bidirectional types EN
+// and AN are treated as R.
+//
+// Identify the bracket pairs in the current isolating run sequence
+// according to BD16. For each bracket-pair element in the list of pairs of
+// text positions:
+//
+// a Inspect the bidirectional types of the characters enclosed within the
+// bracket pair.
+//
+// b If any strong type (either L or R) matching the embedding direction is
+// found, set the type for both brackets in the pair to match the embedding
+// direction.
+//
+// o [ e ] o -> o e e e o
+//
+// o [ o e ] -> o e o e e
+//
+// o [ NI e ] -> o e NI e e
+//
+// c Otherwise, if a strong type (opposite the embedding direction) is
+// found, test for adjacent strong types as follows: 1 First, check
+// backwards before the opening paired bracket until the first strong type
+// (L, R, or sos) is found. If that first preceding strong type is opposite
+// the embedding direction, then set the type for both brackets in the pair
+// to that type. 2 Otherwise, set the type for both brackets in the pair to
+// the embedding direction.
+//
+// o [ o ] e -> o o o o e
+//
+// o [ o NI ] o -> o o o NI o o
+//
+// e [ o ] o -> e e o e o
+//
+// e [ o ] e -> e e o e e
+//
+// e ( o [ o ] NI ) e -> e e o o o o NI e e
+//
+// d Otherwise, do not set the type for the current bracket pair. Note that
+// if the enclosed text contains no strong types the paired brackets will
+// both resolve to the same level when resolved individually using rules N1
+// and N2.
+//
+// e ( NI ) o -> e ( NI ) o
+
+// getStrongTypeN0 maps character's directional code to strong type as required
+// by rule N0.
+//
+// TODO: have separate type for "strong" directionality.
+func (p *bracketPairer) getStrongTypeN0(index int) Class {
+       switch p.codesIsolatedRun[index] {
+       // in the scope of N0, number types are treated as R
+       case EN, AN, AL, R:
+               return R
+       case L:
+               return L
+       default:
+               return ON
+       }
+}
+
+// classifyPairContent reports the strong types contained inside a Bracket Pair,
+// assuming the given embedding direction.
+//
+// It returns ON if no strong type is found. If a single strong type is found,
+// it returns this type. Otherwise it returns the embedding direction.
+//
+// TODO: use separate type for "strong" directionality.
+func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class {
+       dirOpposite := ON
+       for i := loc.opener + 1; i < loc.closer; i++ {
+               dir := p.getStrongTypeN0(i)
+               if dir == ON {
+                       continue
+               }
+               if dir == dirEmbed {
+                       return dir // type matching embedding direction found
+               }
+               dirOpposite = dir
+       }
+       // return ON if no strong type found, or class opposite to dirEmbed
+       return dirOpposite
+}
+
+// classBeforePair determines which strong types are present before a Bracket
+// Pair. Return R or L if strong type found, otherwise ON.
+func (p *bracketPairer) classBeforePair(loc bracketPair) Class {
+       for i := loc.opener - 1; i >= 0; i-- {
+               if dir := p.getStrongTypeN0(i); dir != ON {
+                       return dir
+               }
+       }
+       // no strong types found, return sos
+       return p.sos
+}
+
+// assignBracketType implements rule N0 for a single bracket pair.
+func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) {
+       // rule "N0, a", inspect contents of pair
+       dirPair := p.classifyPairContent(loc, dirEmbed)
+
+       // dirPair is now L, R, or N (no strong type found)
+
+       // the following logical tests are performed out of order compared to
+       // the statement of the rules but yield the same results
+       if dirPair == ON {
+               return // case "d" - nothing to do
+       }
+
+       if dirPair != dirEmbed {
+               // case "c": strong type found, opposite - check before (c.1)
+               dirPair = p.classBeforePair(loc)
+               if dirPair == dirEmbed || dirPair == ON {
+                       // no strong opposite type found before - use embedding (c.2)
+                       dirPair = dirEmbed
+               }
+       }
+       // else: case "b", strong type found matching embedding,
+       // no explicit action needed, as dirPair is already set to embedding
+       // direction
+
+       // set the bracket types to the type found
+       p.setBracketsToType(loc, dirPair, initialTypes)
+}
+
+func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) {
+       p.codesIsolatedRun[loc.opener] = dirPair
+       p.codesIsolatedRun[loc.closer] = dirPair
+
+       for i := loc.opener + 1; i < loc.closer; i++ {
+               index := p.indexes[i]
+               if initialTypes[index] != NSM {
+                       break
+               }
+               p.codesIsolatedRun[i] = dirPair
+       }
+
+       for i := loc.closer + 1; i < len(p.indexes); i++ {
+               index := p.indexes[i]
+               if initialTypes[index] != NSM {
+                       break
+               }
+               p.codesIsolatedRun[i] = dirPair
+       }
+}
+
+// resolveBrackets implements rule N0 for a list of pairs.
+func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) {
+       for _, loc := range p.pairPositions {
+               p.assignBracketType(loc, dirEmbed, initialTypes)
+       }
+}
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/core.go b/libgo/go/golang.org/x/text/unicode/bidi/core.go
new file mode 100644 (file)
index 0000000..48d1440
--- /dev/null
@@ -0,0 +1,1058 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bidi
+
+import "log"
+
+// This implementation is a port based on the reference implementation found at:
+// https://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/
+//
+// described in Unicode Bidirectional Algorithm (UAX #9).
+//
+// Input:
+// There are two levels of input to the algorithm, since clients may prefer to
+// supply some information from out-of-band sources rather than relying on the
+// default behavior.
+//
+// - Bidi class array
+// - Bidi class array, with externally supplied base line direction
+//
+// Output:
+// Output is separated into several stages:
+//
+//  - levels array over entire paragraph
+//  - reordering array over entire paragraph
+//  - levels array over line
+//  - reordering array over line
+//
+// Note that for conformance to the Unicode Bidirectional Algorithm,
+// implementations are only required to generate correct reordering and
+// character directionality (odd or even levels) over a line. Generating
+// identical level arrays over a line is not required. Bidi explicit format
+// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and
+// positions as long as the rest of the input is properly reordered.
+//
+// As the algorithm is defined to operate on a single paragraph at a time, this
+// implementation is written to handle single paragraphs. Thus rule P1 is
+// presumed by this implementation-- the data provided to the implementation is
+// assumed to be a single paragraph, and either contains no 'B' codes, or a
+// single 'B' code at the end of the input. 'B' is allowed as input to
+// illustrate how the algorithm assigns it a level.
+//
+// Also note that rules L3 and L4 depend on the rendering engine that uses the
+// result of the bidi algorithm. This implementation assumes that the rendering
+// engine expects combining marks in visual order (e.g. to the left of their
+// base character in RTL runs) and that it adjusts the glyphs used to render
+// mirrored characters that are in RTL runs so that they render appropriately.
+
+// level is the embedding level of a character. Even embedding levels indicate
+// left-to-right order and odd levels indicate right-to-left order. The special
+// level of -1 is reserved for undefined order.
+type level int8
+
+const implicitLevel level = -1
+
+// in returns if x is equal to any of the values in set.
+func (c Class) in(set ...Class) bool {
+       for _, s := range set {
+               if c == s {
+                       return true
+               }
+       }
+       return false
+}
+
+// A paragraph contains the state of a paragraph.
+type paragraph struct {
+       initialTypes []Class
+
+       // Arrays of properties needed for paired bracket evaluation in N0
+       pairTypes  []bracketType // paired Bracket types for paragraph
+       pairValues []rune        // rune for opening bracket or pbOpen and pbClose; 0 for pbNone
+
+       embeddingLevel level // default: = implicitLevel;
+
+       // at the paragraph levels
+       resultTypes  []Class
+       resultLevels []level
+
+       // Index of matching PDI for isolate initiator characters. For other
+       // characters, the value of matchingPDI will be set to -1. For isolate
+       // initiators with no matching PDI, matchingPDI will be set to the length of
+       // the input string.
+       matchingPDI []int
+
+       // Index of matching isolate initiator for PDI characters. For other
+       // characters, and for PDIs with no matching isolate initiator, the value of
+       // matchingIsolateInitiator will be set to -1.
+       matchingIsolateInitiator []int
+}
+
+// newParagraph initializes a paragraph. The user needs to supply a few arrays
+// corresponding to the preprocessed text input. The types correspond to the
+// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for
+// each rune. pairValues provides a unique bracket class identifier for each
+// rune (suggested is the rune of the open bracket for opening and matching
+// close brackets, after normalization). The embedding levels are optional, but
+// may be supplied to encode embedding levels of styled text.
+//
+// TODO: return an error.
+func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph {
+       validateTypes(types)
+       validatePbTypes(pairTypes)
+       validatePbValues(pairValues, pairTypes)
+       validateParagraphEmbeddingLevel(levels)
+
+       p := &paragraph{
+               initialTypes:   append([]Class(nil), types...),
+               embeddingLevel: levels,
+
+               pairTypes:  pairTypes,
+               pairValues: pairValues,
+
+               resultTypes: append([]Class(nil), types...),
+       }
+       p.run()
+       return p
+}
+
+func (p *paragraph) Len() int { return len(p.initialTypes) }
+
+// The algorithm. Does not include line-based processing (Rules L1, L2).
+// These are applied later in the line-based phase of the algorithm.
+func (p *paragraph) run() {
+       p.determineMatchingIsolates()
+
+       // 1) determining the paragraph level
+       // Rule P1 is the requirement for entering this algorithm.
+       // Rules P2, P3.
+       // If no externally supplied paragraph embedding level, use default.
+       if p.embeddingLevel == implicitLevel {
+               p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len())
+       }
+
+       // Initialize result levels to paragraph embedding level.
+       p.resultLevels = make([]level, p.Len())
+       setLevels(p.resultLevels, p.embeddingLevel)
+
+       // 2) Explicit levels and directions
+       // Rules X1-X8.
+       p.determineExplicitEmbeddingLevels()
+
+       // Rule X9.
+       // We do not remove the embeddings, the overrides, the PDFs, and the BNs
+       // from the string explicitly. But they are not copied into isolating run
+       // sequences when they are created, so they are removed for all
+       // practical purposes.
+
+       // Rule X10.
+       // Run remainder of algorithm one isolating run sequence at a time
+       for _, seq := range p.determineIsolatingRunSequences() {
+               // 3) resolving weak types
+               // Rules W1-W7.
+               seq.resolveWeakTypes()
+
+               // 4a) resolving paired brackets
+               // Rule N0
+               resolvePairedBrackets(seq)
+
+               // 4b) resolving neutral types
+               // Rules N1-N3.
+               seq.resolveNeutralTypes()
+
+               // 5) resolving implicit embedding levels
+               // Rules I1, I2.
+               seq.resolveImplicitLevels()
+
+               // Apply the computed levels and types
+               seq.applyLevelsAndTypes()
+       }
+
+       // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and
+       // BNs. This is for convenience, so the resulting level array will have
+       // a value for every character.
+       p.assignLevelsToCharactersRemovedByX9()
+}
+
+// determineMatchingIsolates determines the matching PDI for each isolate
+// initiator and vice versa.
+//
+// Definition BD9.
+//
+// At the end of this function:
+//
+//  - The member variable matchingPDI is set to point to the index of the
+//    matching PDI character for each isolate initiator character. If there is
+//    no matching PDI, it is set to the length of the input text. For other
+//    characters, it is set to -1.
+//  - The member variable matchingIsolateInitiator is set to point to the
+//    index of the matching isolate initiator character for each PDI character.
+//    If there is no matching isolate initiator, or the character is not a PDI,
+//    it is set to -1.
+func (p *paragraph) determineMatchingIsolates() {
+       p.matchingPDI = make([]int, p.Len())
+       p.matchingIsolateInitiator = make([]int, p.Len())
+
+       for i := range p.matchingIsolateInitiator {
+               p.matchingIsolateInitiator[i] = -1
+       }
+
+       for i := range p.matchingPDI {
+               p.matchingPDI[i] = -1
+
+               if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) {
+                       depthCounter := 1
+                       for j := i + 1; j < p.Len(); j++ {
+                               if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) {
+                                       depthCounter++
+                               } else if u == PDI {
+                                       if depthCounter--; depthCounter == 0 {
+                                               p.matchingPDI[i] = j
+                                               p.matchingIsolateInitiator[j] = i
+                                               break
+                                       }
+                               }
+                       }
+                       if p.matchingPDI[i] == -1 {
+                               p.matchingPDI[i] = p.Len()
+                       }
+               }
+       }
+}
+
+// determineParagraphEmbeddingLevel reports the resolved paragraph direction of
+// the substring limited by the given range [start, end).
+//
+// Determines the paragraph level based on rules P2, P3. This is also used
+// in rule X5c to find if an FSI should resolve to LRI or RLI.
+func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level {
+       var strongType Class = unknownClass
+
+       // Rule P2.
+       for i := start; i < end; i++ {
+               if t := p.resultTypes[i]; t.in(L, AL, R) {
+                       strongType = t
+                       break
+               } else if t.in(FSI, LRI, RLI) {
+                       i = p.matchingPDI[i] // skip over to the matching PDI
+                       if i > end {
+                               log.Panic("assert (i <= end)")
+                       }
+               }
+       }
+       // Rule P3.
+       switch strongType {
+       case unknownClass: // none found
+               // default embedding level when no strong types found is 0.
+               return 0
+       case L:
+               return 0
+       default: // AL, R
+               return 1
+       }
+}
+
+const maxDepth = 125
+
+// This stack will store the embedding levels and override and isolated
+// statuses
+type directionalStatusStack struct {
+       stackCounter        int
+       embeddingLevelStack [maxDepth + 1]level
+       overrideStatusStack [maxDepth + 1]Class
+       isolateStatusStack  [maxDepth + 1]bool
+}
+
+func (s *directionalStatusStack) empty()     { s.stackCounter = 0 }
+func (s *directionalStatusStack) pop()       { s.stackCounter-- }
+func (s *directionalStatusStack) depth() int { return s.stackCounter }
+
+func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) {
+       s.embeddingLevelStack[s.stackCounter] = level
+       s.overrideStatusStack[s.stackCounter] = overrideStatus
+       s.isolateStatusStack[s.stackCounter] = isolateStatus
+       s.stackCounter++
+}
+
+func (s *directionalStatusStack) lastEmbeddingLevel() level {
+       return s.embeddingLevelStack[s.stackCounter-1]
+}
+
+func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class {
+       return s.overrideStatusStack[s.stackCounter-1]
+}
+
+func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool {
+       return s.isolateStatusStack[s.stackCounter-1]
+}
+
+// Determine explicit levels using rules X1 - X8
+func (p *paragraph) determineExplicitEmbeddingLevels() {
+       var stack directionalStatusStack
+       var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int
+
+       // Rule X1.
+       stack.push(p.embeddingLevel, ON, false)
+
+       for i, t := range p.resultTypes {
+               // Rules X2, X3, X4, X5, X5a, X5b, X5c
+               switch t {
+               case RLE, LRE, RLO, LRO, RLI, LRI, FSI:
+                       isIsolate := t.in(RLI, LRI, FSI)
+                       isRTL := t.in(RLE, RLO, RLI)
+
+                       // override if this is an FSI that resolves to RLI
+                       if t == FSI {
+                               isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1)
+                       }
+                       if isIsolate {
+                               p.resultLevels[i] = stack.lastEmbeddingLevel()
+                               if stack.lastDirectionalOverrideStatus() != ON {
+                                       p.resultTypes[i] = stack.lastDirectionalOverrideStatus()
+                               }
+                       }
+
+                       var newLevel level
+                       if isRTL {
+                               // least greater odd
+                               newLevel = (stack.lastEmbeddingLevel() + 1) | 1
+                       } else {
+                               // least greater even
+                               newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1
+                       }
+
+                       if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 {
+                               if isIsolate {
+                                       validIsolateCount++
+                               }
+                               // Push new embedding level, override status, and isolated
+                               // status.
+                               // No check for valid stack counter, since the level check
+                               // suffices.
+                               switch t {
+                               case LRO:
+                                       stack.push(newLevel, L, isIsolate)
+                               case RLO:
+                                       stack.push(newLevel, R, isIsolate)
+                               default:
+                                       stack.push(newLevel, ON, isIsolate)
+                               }
+                               // Not really part of the spec
+                               if !isIsolate {
+                                       p.resultLevels[i] = newLevel
+                               }
+                       } else {
+                               // This is an invalid explicit formatting character,
+                               // so apply the "Otherwise" part of rules X2-X5b.
+                               if isIsolate {
+                                       overflowIsolateCount++
+                               } else { // !isIsolate
+                                       if overflowIsolateCount == 0 {
+                                               overflowEmbeddingCount++
+                                       }
+                               }
+                       }
+
+               // Rule X6a
+               case PDI:
+                       if overflowIsolateCount > 0 {
+                               overflowIsolateCount--
+                       } else if validIsolateCount == 0 {
+                               // do nothing
+                       } else {
+                               overflowEmbeddingCount = 0
+                               for !stack.lastDirectionalIsolateStatus() {
+                                       stack.pop()
+                               }
+                               stack.pop()
+                               validIsolateCount--
+                       }
+                       p.resultLevels[i] = stack.lastEmbeddingLevel()
+
+               // Rule X7
+               case PDF:
+                       // Not really part of the spec
+                       p.resultLevels[i] = stack.lastEmbeddingLevel()
+
+                       if overflowIsolateCount > 0 {
+                               // do nothing
+                       } else if overflowEmbeddingCount > 0 {
+                               overflowEmbeddingCount--
+                       } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 {
+                               stack.pop()
+                       }
+
+               case B: // paragraph separator.
+                       // Rule X8.
+
+                       // These values are reset for clarity, in this implementation B
+                       // can only occur as the last code in the array.
+                       stack.empty()
+                       overflowIsolateCount = 0
+                       overflowEmbeddingCount = 0
+                       validIsolateCount = 0
+                       p.resultLevels[i] = p.embeddingLevel
+
+               default:
+                       p.resultLevels[i] = stack.lastEmbeddingLevel()
+                       if stack.lastDirectionalOverrideStatus() != ON {
+                               p.resultTypes[i] = stack.lastDirectionalOverrideStatus()
+                       }
+               }
+       }
+}
+
+type isolatingRunSequence struct {
+       p *paragraph
+
+       indexes []int // indexes to the original string
+
+       types          []Class // type of each character using the index
+       resolvedLevels []level // resolved levels after application of rules
+       level          level
+       sos, eos       Class
+}
+
+func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
+
+func maxLevel(a, b level) level {
+       if a > b {
+               return a
+       }
+       return b
+}
+
+// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
+//                      either L or R, for each isolating run sequence.
+func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
+       length := len(indexes)
+       types := make([]Class, length)
+       for i, x := range indexes {
+               types[i] = p.resultTypes[x]
+       }
+
+       // assign level, sos and eos
+       prevChar := indexes[0] - 1
+       for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) {
+               prevChar--
+       }
+       prevLevel := p.embeddingLevel
+       if prevChar >= 0 {
+               prevLevel = p.resultLevels[prevChar]
+       }
+
+       var succLevel level
+       lastType := types[length-1]
+       if lastType.in(LRI, RLI, FSI) {
+               succLevel = p.embeddingLevel
+       } else {
+               // the first character after the end of run sequence
+               limit := indexes[length-1] + 1
+               for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ {
+
+               }
+               succLevel = p.embeddingLevel
+               if limit < p.Len() {
+                       succLevel = p.resultLevels[limit]
+               }
+       }
+       level := p.resultLevels[indexes[0]]
+       return &isolatingRunSequence{
+               p:       p,
+               indexes: indexes,
+               types:   types,
+               level:   level,
+               sos:     typeForLevel(maxLevel(prevLevel, level)),
+               eos:     typeForLevel(maxLevel(succLevel, level)),
+       }
+}
+
+// Resolving weak types Rules W1-W7.
+//
+// Note that some weak types (EN, AN) remain after this processing is
+// complete.
+func (s *isolatingRunSequence) resolveWeakTypes() {
+
+       // on entry, only these types remain
+       s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI)
+
+       // Rule W1.
+       // Changes all NSMs.
+       preceedingCharacterType := s.sos
+       for i, t := range s.types {
+               if t == NSM {
+                       s.types[i] = preceedingCharacterType
+               } else {
+                       if t.in(LRI, RLI, FSI, PDI) {
+                               preceedingCharacterType = ON
+                       }
+                       preceedingCharacterType = t
+               }
+       }
+
+       // Rule W2.
+       // EN does not change at the start of the run, because sos != AL.
+       for i, t := range s.types {
+               if t == EN {
+                       for j := i - 1; j >= 0; j-- {
+                               if t := s.types[j]; t.in(L, R, AL) {
+                                       if t == AL {
+                                               s.types[i] = AN
+                                       }
+                                       break
+                               }
+                       }
+               }
+       }
+
+       // Rule W3.
+       for i, t := range s.types {
+               if t == AL {
+                       s.types[i] = R
+               }
+       }
+
+       // Rule W4.
+       // Since there must be values on both sides for this rule to have an
+       // effect, the scan skips the first and last value.
+       //
+       // Although the scan proceeds left to right, and changes the type
+       // values in a way that would appear to affect the computations
+       // later in the scan, there is actually no problem. A change in the
+       // current value can only affect the value to its immediate right,
+       // and only affect it if it is ES or CS. But the current value can
+       // only change if the value to its right is not ES or CS. Thus
+       // either the current value will not change, or its change will have
+       // no effect on the remainder of the analysis.
+
+       for i := 1; i < s.Len()-1; i++ {
+               t := s.types[i]
+               if t == ES || t == CS {
+                       prevSepType := s.types[i-1]
+                       succSepType := s.types[i+1]
+                       if prevSepType == EN && succSepType == EN {
+                               s.types[i] = EN
+                       } else if s.types[i] == CS && prevSepType == AN && succSepType == AN {
+                               s.types[i] = AN
+                       }
+               }
+       }
+
+       // Rule W5.
+       for i, t := range s.types {
+               if t == ET {
+                       // locate end of sequence
+                       runStart := i
+                       runEnd := s.findRunLimit(runStart, ET)
+
+                       // check values at ends of sequence
+                       t := s.sos
+                       if runStart > 0 {
+                               t = s.types[runStart-1]
+                       }
+                       if t != EN {
+                               t = s.eos
+                               if runEnd < len(s.types) {
+                                       t = s.types[runEnd]
+                               }
+                       }
+                       if t == EN {
+                               setTypes(s.types[runStart:runEnd], EN)
+                       }
+                       // continue at end of sequence
+                       i = runEnd
+               }
+       }
+
+       // Rule W6.
+       for i, t := range s.types {
+               if t.in(ES, ET, CS) {
+                       s.types[i] = ON
+               }
+       }
+
+       // Rule W7.
+       for i, t := range s.types {
+               if t == EN {
+                       // set default if we reach start of run
+                       prevStrongType := s.sos
+                       for j := i - 1; j >= 0; j-- {
+                               t = s.types[j]
+                               if t == L || t == R { // AL's have been changed to R
+                                       prevStrongType = t
+                                       break
+                               }
+                       }
+                       if prevStrongType == L {
+                               s.types[i] = L
+                       }
+               }
+       }
+}
+
+// 6) resolving neutral types Rules N1-N2.
+func (s *isolatingRunSequence) resolveNeutralTypes() {
+
+       // on entry, only these types can be in resultTypes
+       s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI)
+
+       for i, t := range s.types {
+               switch t {
+               case WS, ON, B, S, RLI, LRI, FSI, PDI:
+                       // find bounds of run of neutrals
+                       runStart := i
+                       runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI)
+
+                       // determine effective types at ends of run
+                       var leadType, trailType Class
+
+                       // Note that the character found can only be L, R, AN, or
+                       // EN.
+                       if runStart == 0 {
+                               leadType = s.sos
+                       } else {
+                               leadType = s.types[runStart-1]
+                               if leadType.in(AN, EN) {
+                                       leadType = R
+                               }
+                       }
+                       if runEnd == len(s.types) {
+                               trailType = s.eos
+                       } else {
+                               trailType = s.types[runEnd]
+                               if trailType.in(AN, EN) {
+                                       trailType = R
+                               }
+                       }
+
+                       var resolvedType Class
+                       if leadType == trailType {
+                               // Rule N1.
+                               resolvedType = leadType
+                       } else {
+                               // Rule N2.
+                               // Notice the embedding level of the run is used, not
+                               // the paragraph embedding level.
+                               resolvedType = typeForLevel(s.level)
+                       }
+
+                       setTypes(s.types[runStart:runEnd], resolvedType)
+
+                       // skip over run of (former) neutrals
+                       i = runEnd
+               }
+       }
+}
+
+func setLevels(levels []level, newLevel level) {
+       for i := range levels {
+               levels[i] = newLevel
+       }
+}
+
+func setTypes(types []Class, newType Class) {
+       for i := range types {
+               types[i] = newType
+       }
+}
+
+// 7) resolving implicit embedding levels Rules I1, I2.
+func (s *isolatingRunSequence) resolveImplicitLevels() {
+
+       // on entry, only these types can be in resultTypes
+       s.assertOnly(L, R, EN, AN)
+
+       s.resolvedLevels = make([]level, len(s.types))
+       setLevels(s.resolvedLevels, s.level)
+
+       if (s.level & 1) == 0 { // even level
+               for i, t := range s.types {
+                       // Rule I1.
+                       if t == L {
+                               // no change
+                       } else if t == R {
+                               s.resolvedLevels[i] += 1
+                       } else { // t == AN || t == EN
+                               s.resolvedLevels[i] += 2
+                       }
+               }
+       } else { // odd level
+               for i, t := range s.types {
+                       // Rule I2.
+                       if t == R {
+                               // no change
+                       } else { // t == L || t == AN || t == EN
+                               s.resolvedLevels[i] += 1
+                       }
+               }
+       }
+}
+
+// Applies the levels and types resolved in rules W1-I2 to the
+// resultLevels array.
+func (s *isolatingRunSequence) applyLevelsAndTypes() {
+       for i, x := range s.indexes {
+               s.p.resultTypes[x] = s.types[i]
+               s.p.resultLevels[x] = s.resolvedLevels[i]
+       }
+}
+
+// Return the limit of the run consisting only of the types in validSet
+// starting at index. This checks the value at index, and will return
+// index if that value is not in validSet.
+func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int {
+loop:
+       for ; index < len(s.types); index++ {
+               t := s.types[index]
+               for _, valid := range validSet {
+                       if t == valid {
+                               continue loop
+                       }
+               }
+               return index // didn't find a match in validSet
+       }
+       return len(s.types)
+}
+
+// Algorithm validation. Assert that all values in types are in the
+// provided set.
+func (s *isolatingRunSequence) assertOnly(codes ...Class) {
+loop:
+       for i, t := range s.types {
+               for _, c := range codes {
+                       if t == c {
+                               continue loop
+                       }
+               }
+               log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i])
+       }
+}
+
+// determineLevelRuns returns an array of level runs. Each level run is
+// described as an array of indexes into the input string.
+//
+// Determines the level runs. Rule X9 will be applied in determining the
+// runs, in the way that makes sure the characters that are supposed to be
+// removed are not included in the runs.
+func (p *paragraph) determineLevelRuns() [][]int {
+       run := []int{}
+       allRuns := [][]int{}
+       currentLevel := implicitLevel
+
+       for i := range p.initialTypes {
+               if !isRemovedByX9(p.initialTypes[i]) {
+                       if p.resultLevels[i] != currentLevel {
+                               // we just encountered a new run; wrap up last run
+                               if currentLevel >= 0 { // only wrap it up if there was a run
+                                       allRuns = append(allRuns, run)
+                                       run = nil
+                               }
+                               // Start new run
+                               currentLevel = p.resultLevels[i]
+                       }
+                       run = append(run, i)
+               }
+       }
+       // Wrap up the final run, if any
+       if len(run) > 0 {
+               allRuns = append(allRuns, run)
+       }
+       return allRuns
+}
+
+// Definition BD13. Determine isolating run sequences.
+func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence {
+       levelRuns := p.determineLevelRuns()
+
+       // Compute the run that each character belongs to
+       runForCharacter := make([]int, p.Len())
+       for i, run := range levelRuns {
+               for _, index := range run {
+                       runForCharacter[index] = i
+               }
+       }
+
+       sequences := []*isolatingRunSequence{}
+
+       var currentRunSequence []int
+
+       for _, run := range levelRuns {
+               first := run[0]
+               if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 {
+                       currentRunSequence = nil
+                       // int run = i;
+                       for {
+                               // Copy this level run into currentRunSequence
+                               currentRunSequence = append(currentRunSequence, run...)
+
+                               last := currentRunSequence[len(currentRunSequence)-1]
+                               lastT := p.initialTypes[last]
+                               if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() {
+                                       run = levelRuns[runForCharacter[p.matchingPDI[last]]]
+                               } else {
+                                       break
+                               }
+                       }
+                       sequences = append(sequences, p.isolatingRunSequence(currentRunSequence))
+               }
+       }
+       return sequences
+}
+
+// Assign level information to characters removed by rule X9. This is for
+// ease of relating the level information to the original input data. Note
+// that the levels assigned to these codes are arbitrary, they're chosen so
+// as to avoid breaking level runs.
+func (p *paragraph) assignLevelsToCharactersRemovedByX9() {
+       for i, t := range p.initialTypes {
+               if t.in(LRE, RLE, LRO, RLO, PDF, BN) {
+                       p.resultTypes[i] = t
+                       p.resultLevels[i] = -1
+               }
+       }
+       // now propagate forward the levels information (could have
+       // propagated backward, the main thing is not to introduce a level
+       // break where one doesn't already exist).
+
+       if p.resultLevels[0] == -1 {
+               p.resultLevels[0] = p.embeddingLevel
+       }
+       for i := 1; i < len(p.initialTypes); i++ {
+               if p.resultLevels[i] == -1 {
+                       p.resultLevels[i] = p.resultLevels[i-1]
+               }
+       }
+       // Embedding information is for informational purposes only so need not be
+       // adjusted.
+}
+
+//
+// Output
+//
+
+// getLevels computes levels array breaking lines at offsets in linebreaks.
+// Rule L1.
+//
+// The linebreaks array must include at least one value. The values must be
+// in strictly increasing order (no duplicates) between 1 and the length of
+// the text, inclusive. The last value must be the length of the text.
+func (p *paragraph) getLevels(linebreaks []int) []level {
+       // Note that since the previous processing has removed all
+       // P, S, and WS values from resultTypes, the values referred to
+       // in these rules are the initial types, before any processing
+       // has been applied (including processing of overrides).
+       //
+       // This example implementation has reinserted explicit format codes
+       // and BN, in order that the levels array correspond to the
+       // initial text. Their final placement is not normative.
+       // These codes are treated like WS in this implementation,
+       // so they don't interrupt sequences of WS.
+
+       validateLineBreaks(linebreaks, p.Len())
+
+       result := append([]level(nil), p.resultLevels...)
+
+       // don't worry about linebreaks since if there is a break within
+       // a series of WS values preceding S, the linebreak itself
+       // causes the reset.
+       for i, t := range p.initialTypes {
+               if t.in(B, S) {
+                       // Rule L1, clauses one and two.
+                       result[i] = p.embeddingLevel
+
+                       // Rule L1, clause three.
+                       for j := i - 1; j >= 0; j-- {
+                               if isWhitespace(p.initialTypes[j]) { // including format codes
+                                       result[j] = p.embeddingLevel
+                               } else {
+                                       break
+                               }
+                       }
+               }
+       }
+
+       // Rule L1, clause four.
+       start := 0
+       for _, limit := range linebreaks {
+               for j := limit - 1; j >= start; j-- {
+                       if isWhitespace(p.initialTypes[j]) { // including format codes
+                               result[j] = p.embeddingLevel
+                       } else {
+                               break
+                       }
+               }
+               start = limit
+       }
+
+       return result
+}
+
+// getReordering returns the reordering of lines from a visual index to a
+// logical index for line breaks at the given offsets.
+//
+// Lines are concatenated from left to right. So for example, the fifth
+// character from the left on the third line is
+//
+//             getReordering(linebreaks)[linebreaks[1] + 4]
+//
+// (linebreaks[1] is the position after the last character of the second
+// line, which is also the index of the first character on the third line,
+// and adding four gets the fifth character from the left).
+//
+// The linebreaks array must include at least one value. The values must be
+// in strictly increasing order (no duplicates) between 1 and the length of
+// the text, inclusive. The last value must be the length of the text.
+func (p *paragraph) getReordering(linebreaks []int) []int {
+       validateLineBreaks(linebreaks, p.Len())
+
+       return computeMultilineReordering(p.getLevels(linebreaks), linebreaks)
+}
+
+// Return multiline reordering array for a given level array. Reordering
+// does not occur across a line break.
+func computeMultilineReordering(levels []level, linebreaks []int) []int {
+       result := make([]int, len(levels))
+
+       start := 0
+       for _, limit := range linebreaks {
+               tempLevels := make([]level, limit-start)
+               copy(tempLevels, levels[start:])
+
+               for j, order := range computeReordering(tempLevels) {
+                       result[start+j] = order + start
+               }
+               start = limit
+       }
+       return result
+}
+
+// Return reordering array for a given level array. This reorders a single
+// line. The reordering is a visual to logical map. For example, the
+// leftmost char is string.charAt(order[0]). Rule L2.
+func computeReordering(levels []level) []int {
+       result := make([]int, len(levels))
+       // initialize order
+       for i := range result {
+               result[i] = i
+       }
+
+       // locate highest level found on line.
+       // Note the rules say text, but no reordering across line bounds is
+       // performed, so this is sufficient.
+       highestLevel := level(0)
+       lowestOddLevel := level(maxDepth + 2)
+       for _, level := range levels {
+               if level > highestLevel {
+                       highestLevel = level
+               }
+               if level&1 != 0 && level < lowestOddLevel {
+                       lowestOddLevel = level
+               }
+       }
+
+       for level := highestLevel; level >= lowestOddLevel; level-- {
+               for i := 0; i < len(levels); i++ {
+                       if levels[i] >= level {
+                               // find range of text at or above this level
+                               start := i
+                               limit := i + 1
+                               for limit < len(levels) && levels[limit] >= level {
+                                       limit++
+                               }
+
+                               for j, k := start, limit-1; j < k; j, k = j+1, k-1 {
+                                       result[j], result[k] = result[k], result[j]
+                               }
+                               // skip to end of level run
+                               i = limit
+                       }
+               }
+       }
+
+       return result
+}
+
+// isWhitespace reports whether the type is considered a whitespace type for the
+// line break rules.
+func isWhitespace(c Class) bool {
+       switch c {
+       case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS:
+               return true
+       }
+       return false
+}
+
+// isRemovedByX9 reports whether the type is one of the types removed in X9.
+func isRemovedByX9(c Class) bool {
+       switch c {
+       case LRE, RLE, LRO, RLO, PDF, BN:
+               return true
+       }
+       return false
+}
+
+// typeForLevel reports the strong type (L or R) corresponding to the level.
+func typeForLevel(level level) Class {
+       if (level & 0x1) == 0 {
+               return L
+       }
+       return R
+}
+
+// TODO: change validation to not panic
+
+func validateTypes(types []Class) {
+       if len(types) == 0 {
+               log.Panic("types is null")
+       }
+       for i, t := range types[:len(types)-1] {
+               if t == B {
+                       log.Panicf("B type before end of paragraph at index: %d", i)
+               }
+       }
+}
+
+func validateParagraphEmbeddingLevel(embeddingLevel level) {
+       if embeddingLevel != implicitLevel &&
+               embeddingLevel != 0 &&
+               embeddingLevel != 1 {
+               log.Panicf("illegal paragraph embedding level: %d", embeddingLevel)
+       }
+}
+
+func validateLineBreaks(linebreaks []int, textLength int) {
+       prev := 0
+       for i, next := range linebreaks {
+               if next <= prev {
+                       log.Panicf("bad linebreak: %d at index: %d", next, i)
+               }
+               prev = next
+       }
+       if prev != textLength {
+               log.Panicf("last linebreak was %d, want %d", prev, textLength)
+       }
+}
+
+func validatePbTypes(pairTypes []bracketType) {
+       if len(pairTypes) == 0 {
+               log.Panic("pairTypes is null")
+       }
+       for i, pt := range pairTypes {
+               switch pt {
+               case bpNone, bpOpen, bpClose:
+               default:
+                       log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i])
+               }
+       }
+}
+
+func validatePbValues(pairValues []rune, pairTypes []bracketType) {
+       if pairValues == nil {
+               log.Panic("pairValues is null")
+       }
+       if len(pairTypes) != len(pairValues) {
+               log.Panic("pairTypes is different length from pairValues")
+       }
+}
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/prop.go b/libgo/go/golang.org/x/text/unicode/bidi/prop.go
new file mode 100644 (file)
index 0000000..7c9484e
--- /dev/null
@@ -0,0 +1,206 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bidi
+
+import "unicode/utf8"
+
+// Properties provides access to BiDi properties of runes.
+type Properties struct {
+       entry uint8
+       last  uint8
+}
+
+var trie = newBidiTrie(0)
+
+// TODO: using this for bidirule reduces the running time by about 5%. Consider
+// if this is worth exposing or if we can find a way to speed up the Class
+// method.
+//
+// // CompactClass is like Class, but maps all of the BiDi control classes
+// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control.
+// func (p Properties) CompactClass() Class {
+//     return Class(p.entry & 0x0F)
+// }
+
+// Class returns the Bidi class for p.
+func (p Properties) Class() Class {
+       c := Class(p.entry & 0x0F)
+       if c == Control {
+               c = controlByteToClass[p.last&0xF]
+       }
+       return c
+}
+
+// IsBracket reports whether the rune is a bracket.
+func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 }
+
+// IsOpeningBracket reports whether the rune is an opening bracket.
+// IsBracket must return true.
+func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 }
+
+// TODO: find a better API and expose.
+func (p Properties) reverseBracket(r rune) rune {
+       return xorMasks[p.entry>>xorMaskShift] ^ r
+}
+
+var controlByteToClass = [16]Class{
+       0xD: LRO, // U+202D LeftToRightOverride,
+       0xE: RLO, // U+202E RightToLeftOverride,
+       0xA: LRE, // U+202A LeftToRightEmbedding,
+       0xB: RLE, // U+202B RightToLeftEmbedding,
+       0xC: PDF, // U+202C PopDirectionalFormat,
+       0x6: LRI, // U+2066 LeftToRightIsolate,
+       0x7: RLI, // U+2067 RightToLeftIsolate,
+       0x8: FSI, // U+2068 FirstStrongIsolate,
+       0x9: PDI, // U+2069 PopDirectionalIsolate,
+}
+
+// LookupRune returns properties for r.
+func LookupRune(r rune) (p Properties, size int) {
+       var buf [4]byte
+       n := utf8.EncodeRune(buf[:], r)
+       return Lookup(buf[:n])
+}
+
+// TODO: these lookup methods are based on the generated trie code. The returned
+// sizes have slightly different semantics from the generated code, in that it
+// always returns size==1 for an illegal UTF-8 byte (instead of the length
+// of the maximum invalid subsequence). Most Transformers, like unicode/norm,
+// leave invalid UTF-8 untouched, in which case it has performance benefits to
+// do so (without changing the semantics). Bidi requires the semantics used here
+// for the bidirule implementation to be compatible with the Go semantics.
+//  They ultimately should perhaps be adopted by all trie implementations, for
+// convenience sake.
+// This unrolled code also boosts performance of the secure/bidirule package by
+// about 30%.
+// So, to remove this code:
+//   - add option to trie generator to define return type.
+//   - always return 1 byte size for ill-formed UTF-8 runes.
+
+// Lookup returns properties for the first rune in s and the width in bytes of
+// its encoding. The size will be 0 if s does not hold enough bytes to complete
+// the encoding.
+func Lookup(s []byte) (p Properties, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return Properties{entry: bidiValues[c0]}, 1
+       case c0 < 0xC2:
+               return Properties{}, 1
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return Properties{}, 1
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4
+       }
+       // Illegal rune
+       return Properties{}, 1
+}
+
+// LookupString returns properties for the first rune in s and the width in
+// bytes of its encoding. The size will be 0 if s does not hold enough bytes to
+// complete the encoding.
+func LookupString(s string) (p Properties, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return Properties{entry: bidiValues[c0]}, 1
+       case c0 < 0xC2:
+               return Properties{}, 1
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return Properties{}, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return Properties{}, 1
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return Properties{}, 1
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return Properties{}, 1
+               }
+               return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4
+       }
+       // Illegal rune
+       return Properties{}, 1
+}
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/tables10.0.0.go b/libgo/go/golang.org/x/text/unicode/bidi/tables10.0.0.go
new file mode 100644 (file)
index 0000000..d8c94e1
--- /dev/null
@@ -0,0 +1,1815 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.10,!go1.13
+
+package bidi
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "10.0.0"
+
+// xorMasks contains masks to be xor-ed with brackets to get the reverse
+// version.
+var xorMasks = []int32{ // 8 elements
+       0, 1, 6, 7, 3, 15, 29, 63,
+} // Size: 56 bytes
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// bidiTrie. Total size: 16128 bytes (15.75 KiB). Checksum: 8122d83e461996f.
+type bidiTrie struct{}
+
+func newBidiTrie(i int) *bidiTrie {
+       return &bidiTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
+       switch {
+       default:
+               return uint8(bidiValues[n<<6+uint32(b)])
+       }
+}
+
+// bidiValues: 228 blocks, 14592 entries, 14592 bytes
+// The third block is the zero block.
+var bidiValues = [14592]uint8{
+       // Block 0x0, offset 0x0
+       0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
+       0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
+       0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
+       0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
+       0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
+       0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
+       0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
+       0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
+       0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
+       0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
+       0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
+       // Block 0x1, offset 0x40
+       0x40: 0x000a,
+       0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
+       0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
+       0x7b: 0x005a,
+       0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
+       0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
+       0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
+       0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
+       0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
+       0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
+       0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
+       0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
+       0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
+       0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
+       0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
+       // Block 0x4, offset 0x100
+       0x117: 0x000a,
+       0x137: 0x000a,
+       // Block 0x5, offset 0x140
+       0x179: 0x000a, 0x17a: 0x000a,
+       // Block 0x6, offset 0x180
+       0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
+       0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
+       0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
+       0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
+       0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
+       0x19e: 0x000a, 0x19f: 0x000a,
+       0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
+       0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
+       0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
+       0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
+       0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
+       0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
+       0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
+       0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
+       0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
+       0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
+       0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
+       0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
+       0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
+       0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
+       0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
+       // Block 0x8, offset 0x200
+       0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
+       0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
+       0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
+       0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
+       0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
+       0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
+       0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
+       0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
+       0x234: 0x000a, 0x235: 0x000a,
+       0x23e: 0x000a,
+       // Block 0x9, offset 0x240
+       0x244: 0x000a, 0x245: 0x000a,
+       0x247: 0x000a,
+       // Block 0xa, offset 0x280
+       0x2b6: 0x000a,
+       // Block 0xb, offset 0x2c0
+       0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
+       0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
+       // Block 0xc, offset 0x300
+       0x30a: 0x000a,
+       0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
+       0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
+       0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
+       0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
+       0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
+       0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
+       0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
+       0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
+       0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
+       // Block 0xd, offset 0x340
+       0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
+       0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
+       0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
+       0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
+       0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
+       0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
+       0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
+       0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
+       0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
+       0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
+       0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
+       // Block 0xe, offset 0x380
+       0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
+       0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
+       0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
+       0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
+       0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
+       0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
+       0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
+       0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
+       0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
+       0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
+       0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
+       0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
+       0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
+       0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
+       0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
+       0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
+       0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
+       0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
+       0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
+       0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
+       0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
+       // Block 0x10, offset 0x400
+       0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
+       0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
+       0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
+       0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
+       0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
+       0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
+       0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
+       0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
+       0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
+       0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
+       0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
+       // Block 0x11, offset 0x440
+       0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
+       0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
+       0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
+       0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
+       0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
+       0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
+       0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
+       0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
+       0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
+       0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
+       0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
+       // Block 0x12, offset 0x480
+       0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
+       0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
+       0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
+       0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
+       0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
+       0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
+       0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
+       0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
+       0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
+       0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
+       0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
+       0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
+       0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
+       0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
+       0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
+       0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
+       0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
+       0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
+       0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
+       0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
+       0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
+       // Block 0x14, offset 0x500
+       0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
+       0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
+       0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
+       0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
+       0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
+       0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
+       0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
+       0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
+       0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
+       0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
+       0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
+       // Block 0x15, offset 0x540
+       0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
+       0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
+       0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
+       0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
+       0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
+       0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
+       0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
+       0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
+       0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
+       0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
+       0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,
+       // Block 0x16, offset 0x580
+       0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
+       0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
+       0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
+       0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
+       0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
+       0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
+       0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
+       0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
+       0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
+       0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
+       0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
+       0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
+       0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
+       0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
+       0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
+       0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d,
+       0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d,
+       0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d,
+       0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,
+       0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,
+       0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,
+       // Block 0x18, offset 0x600
+       0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,
+       0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,
+       0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,
+       0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
+       0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,
+       0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
+       0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
+       0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
+       0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
+       0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
+       0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
+       // Block 0x19, offset 0x640
+       0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
+       0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,
+       0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,
+       0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
+       0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
+       0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
+       0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
+       0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
+       0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
+       0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
+       0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
+       // Block 0x1a, offset 0x680
+       0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
+       0x6ba: 0x000c,
+       0x6bc: 0x000c,
+       // Block 0x1b, offset 0x6c0
+       0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
+       0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
+       0x6cd: 0x000c, 0x6d1: 0x000c,
+       0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
+       0x6e2: 0x000c, 0x6e3: 0x000c,
+       // Block 0x1c, offset 0x700
+       0x701: 0x000c,
+       0x73c: 0x000c,
+       // Block 0x1d, offset 0x740
+       0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
+       0x74d: 0x000c,
+       0x762: 0x000c, 0x763: 0x000c,
+       0x772: 0x0004, 0x773: 0x0004,
+       0x77b: 0x0004,
+       // Block 0x1e, offset 0x780
+       0x781: 0x000c, 0x782: 0x000c,
+       0x7bc: 0x000c,
+       // Block 0x1f, offset 0x7c0
+       0x7c1: 0x000c, 0x7c2: 0x000c,
+       0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
+       0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
+       0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
+       // Block 0x20, offset 0x800
+       0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
+       0x807: 0x000c, 0x808: 0x000c,
+       0x80d: 0x000c,
+       0x822: 0x000c, 0x823: 0x000c,
+       0x831: 0x0004,
+       0x83a: 0x000c, 0x83b: 0x000c,
+       0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c,
+       // Block 0x21, offset 0x840
+       0x841: 0x000c,
+       0x87c: 0x000c, 0x87f: 0x000c,
+       // Block 0x22, offset 0x880
+       0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
+       0x88d: 0x000c,
+       0x896: 0x000c,
+       0x8a2: 0x000c, 0x8a3: 0x000c,
+       // Block 0x23, offset 0x8c0
+       0x8c2: 0x000c,
+       // Block 0x24, offset 0x900
+       0x900: 0x000c,
+       0x90d: 0x000c,
+       0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
+       0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
+       // Block 0x25, offset 0x940
+       0x940: 0x000c,
+       0x97e: 0x000c, 0x97f: 0x000c,
+       // Block 0x26, offset 0x980
+       0x980: 0x000c,
+       0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
+       0x98c: 0x000c, 0x98d: 0x000c,
+       0x995: 0x000c, 0x996: 0x000c,
+       0x9a2: 0x000c, 0x9a3: 0x000c,
+       0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
+       0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
+       // Block 0x27, offset 0x9c0
+       0x9cc: 0x000c, 0x9cd: 0x000c,
+       0x9e2: 0x000c, 0x9e3: 0x000c,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x000c, 0xa01: 0x000c,
+       0xa3b: 0x000c,
+       0xa3c: 0x000c,
+       // Block 0x29, offset 0xa40
+       0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
+       0xa4d: 0x000c,
+       0xa62: 0x000c, 0xa63: 0x000c,
+       // Block 0x2a, offset 0xa80
+       0xa8a: 0x000c,
+       0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,
+       // Block 0x2b, offset 0xac0
+       0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,
+       0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,
+       0xaff: 0x0004,
+       // Block 0x2c, offset 0xb00
+       0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,
+       0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,
+       // Block 0x2d, offset 0xb40
+       0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,
+       0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,
+       0xb7c: 0x000c,
+       // Block 0x2e, offset 0xb80
+       0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,
+       0xb8c: 0x000c, 0xb8d: 0x000c,
+       // Block 0x2f, offset 0xbc0
+       0xbd8: 0x000c, 0xbd9: 0x000c,
+       0xbf5: 0x000c,
+       0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,
+       0xbfc: 0x003a, 0xbfd: 0x002a,
+       // Block 0x30, offset 0xc00
+       0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,
+       0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,
+       0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,
+       0xc46: 0x000c, 0xc47: 0x000c,
+       0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,
+       0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,
+       0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,
+       0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,
+       0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,
+       0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,
+       0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
+       0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
+       0xc7c: 0x000c,
+       // Block 0x32, offset 0xc80
+       0xc86: 0x000c,
+       // Block 0x33, offset 0xcc0
+       0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,
+       0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,
+       0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,
+       0xcfd: 0x000c, 0xcfe: 0x000c,
+       // Block 0x34, offset 0xd00
+       0xd18: 0x000c, 0xd19: 0x000c,
+       0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,
+       0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,
+       // Block 0x35, offset 0xd40
+       0xd42: 0x000c, 0xd45: 0x000c,
+       0xd46: 0x000c,
+       0xd4d: 0x000c,
+       0xd5d: 0x000c,
+       // Block 0x36, offset 0xd80
+       0xd9d: 0x000c,
+       0xd9e: 0x000c, 0xd9f: 0x000c,
+       // Block 0x37, offset 0xdc0
+       0xdd0: 0x000a, 0xdd1: 0x000a,
+       0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,
+       0xdd8: 0x000a, 0xdd9: 0x000a,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x000a,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x0009,
+       0xe5b: 0x007a, 0xe5c: 0x006a,
+       // Block 0x3a, offset 0xe80
+       0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,
+       0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,
+       // Block 0x3b, offset 0xec0
+       0xed2: 0x000c, 0xed3: 0x000c,
+       0xef2: 0x000c, 0xef3: 0x000c,
+       // Block 0x3c, offset 0xf00
+       0xf34: 0x000c, 0xf35: 0x000c,
+       0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,
+       0xf3c: 0x000c, 0xf3d: 0x000c,
+       // Block 0x3d, offset 0xf40
+       0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,
+       0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,
+       0xf52: 0x000c, 0xf53: 0x000c,
+       0xf5b: 0x0004, 0xf5d: 0x000c,
+       0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,
+       0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,
+       0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,
+       0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,
+       // Block 0x3f, offset 0xfc0
+       0xfc5: 0x000c,
+       0xfc6: 0x000c,
+       0xfe9: 0x000c,
+       // Block 0x40, offset 0x1000
+       0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,
+       0x1027: 0x000c, 0x1028: 0x000c,
+       0x1032: 0x000c,
+       0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,
+       // Block 0x42, offset 0x1080
+       0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,
+       0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,
+       0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,
+       0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,
+       0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,
+       0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,
+       // Block 0x43, offset 0x10c0
+       0x10d7: 0x000c,
+       0x10d8: 0x000c, 0x10db: 0x000c,
+       // Block 0x44, offset 0x1100
+       0x1116: 0x000c,
+       0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,
+       0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,
+       0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,
+       0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,
+       0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,
+       0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,
+       0x113c: 0x000c, 0x113f: 0x000c,
+       // Block 0x45, offset 0x1140
+       0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
+       0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
+       0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,
+       0x11b4: 0x000c,
+       0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,
+       0x11bc: 0x000c,
+       // Block 0x47, offset 0x11c0
+       0x11c2: 0x000c,
+       0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,
+       0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x000c, 0x1201: 0x000c,
+       0x1222: 0x000c, 0x1223: 0x000c,
+       0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,
+       0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,
+       // Block 0x49, offset 0x1240
+       0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,
+       0x126d: 0x000c, 0x126f: 0x000c,
+       0x1270: 0x000c, 0x1271: 0x000c,
+       // Block 0x4a, offset 0x1280
+       0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,
+       0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,
+       0x12b6: 0x000c, 0x12b7: 0x000c,
+       // Block 0x4b, offset 0x12c0
+       0x12d0: 0x000c, 0x12d1: 0x000c,
+       0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,
+       0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,
+       0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,
+       0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,
+       0x12ed: 0x000c,
+       0x12f4: 0x000c,
+       0x12f8: 0x000c, 0x12f9: 0x000c,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,
+       0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,
+       0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,
+       0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,
+       0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,
+       0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,
+       0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,
+       0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
+       0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,
+       0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c,
+       0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,
+       // Block 0x4d, offset 0x1340
+       0x137d: 0x000a, 0x137f: 0x000a,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x000a, 0x1381: 0x000a,
+       0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,
+       0x139d: 0x000a,
+       0x139e: 0x000a, 0x139f: 0x000a,
+       0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,
+       0x13bd: 0x000a, 0x13be: 0x000a,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,
+       0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,
+       0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,
+       0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,
+       0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,
+       0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,
+       0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,
+       0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,
+       0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,
+       0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,
+       0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,
+       0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,
+       0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,
+       0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
+       0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
+       0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,
+       0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,
+       0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,
+       0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,
+       0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,
+       0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,
+       0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,
+       0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,
+       0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,
+       0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,
+       0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,
+       0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,
+       0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,
+       0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,
+       0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,
+       0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,
+       0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,
+       0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,
+       0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,
+       0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,
+       0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,
+       0x14b0: 0x000c,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,
+       0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,
+       0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,
+       0x14d8: 0x000a,
+       0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,
+       0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,
+       0x14ee: 0x0004,
+       0x14fa: 0x000a, 0x14fb: 0x000a,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,
+       0x150a: 0x000a, 0x150b: 0x000a,
+       0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,
+       0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
+       0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,
+       0x151e: 0x000a, 0x151f: 0x000a,
+       // Block 0x55, offset 0x1540
+       0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,
+       0x1550: 0x000a, 0x1551: 0x000a,
+       0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
+       0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
+       0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,
+       0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,
+       0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,
+       0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,
+       0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,
+       0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,
+       0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
+       0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,
+       0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
+       0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
+       0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
+       0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
+       0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
+       0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
+       0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
+       0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
+       0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
+       0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
+       0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
+       0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
+       0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
+       0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
+       0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
+       0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
+       0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
+       0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
+       0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,
+       0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
+       0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
+       0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
+       0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
+       0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,
+       0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
+       0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
+       // Block 0x59, offset 0x1640
+       0x167b: 0x000a,
+       0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,
+       0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,
+       0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,
+       0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,
+       0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,
+       0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,
+       0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,
+       0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,
+       0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,
+       0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,
+       0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
+       0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
+       0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
+       0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
+       0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
+       0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
+       0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
+       0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a,
+       0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
+       0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a,
+       0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a,
+       0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a,
+       0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a,
+       0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
+       0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002,
+       0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002,
+       0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002,
+       0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002,
+       // Block 0x5e, offset 0x1780
+       0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a,
+       0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a,
+       0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a,
+       0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a,
+       // Block 0x5f, offset 0x17c0
+       0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a,
+       0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a,
+       0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a,
+       0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a,
+       0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a,
+       0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a,
+       0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a,
+       0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
+       0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
+       0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
+       0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
+       0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
+       0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
+       0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
+       0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
+       0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
+       0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a,
+       0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a,
+       0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a,
+       0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
+       0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a,
+       0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
+       0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
+       0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
+       0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
+       0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
+       0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a,
+       0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
+       0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a,
+       0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
+       0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a,
+       0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a,
+       0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a,
+       0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba,
+       0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
+       0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
+       0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a,
+       0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a,
+       0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
+       0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
+       0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a,
+       0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a,
+       0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a,
+       0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a,
+       0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a,
+       0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
+       0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
+       0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
+       0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
+       0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
+       0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
+       0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
+       0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
+       0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
+       0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a,
+       0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
+       0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
+       0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
+       0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a,
+       0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
+       0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
+       0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
+       0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
+       0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a,
+       0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
+       0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
+       0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
+       0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
+       0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a,
+       0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a,
+       0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
+       0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
+       0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
+       0x1992: 0x000a,
+       0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
+       // Block 0x67, offset 0x19c0
+       0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a,
+       0x19ea: 0x000a, 0x19ef: 0x000c,
+       0x19f0: 0x000c, 0x19f1: 0x000c,
+       0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a,
+       0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a,
+       // Block 0x68, offset 0x1a00
+       0x1a3f: 0x000c,
+       // Block 0x69, offset 0x1a40
+       0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c,
+       0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c,
+       0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c,
+       0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c,
+       0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c,
+       0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c,
+       // Block 0x6a, offset 0x1a80
+       0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a,
+       0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a,
+       0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a,
+       0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a,
+       0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a,
+       0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a,
+       0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a,
+       0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a,
+       0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a,
+       0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a,
+       0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
+       0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a,
+       0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a,
+       0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a,
+       0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a,
+       0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a,
+       0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a,
+       0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a,
+       0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a,
+       0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a,
+       0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a,
+       0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
+       0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
+       0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
+       0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
+       0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
+       0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
+       0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
+       0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
+       0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
+       0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
+       0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
+       0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a,
+       0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a,
+       0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a,
+       0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a,
+       0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a,
+       0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a,
+       0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a,
+       0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a,
+       0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c,
+       0x1bf0: 0x000a,
+       0x1bf6: 0x000a, 0x1bf7: 0x000a,
+       0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a,
+       // Block 0x70, offset 0x1c00
+       0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a,
+       0x1c20: 0x000a,
+       // Block 0x71, offset 0x1c40
+       0x1c7b: 0x000a,
+       // Block 0x72, offset 0x1c80
+       0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a,
+       0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a,
+       0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a,
+       0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a,
+       0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a,
+       0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a,
+       // Block 0x73, offset 0x1cc0
+       0x1cdd: 0x000a,
+       0x1cde: 0x000a,
+       // Block 0x74, offset 0x1d00
+       0x1d10: 0x000a, 0x1d11: 0x000a,
+       0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a,
+       0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a,
+       0x1d1e: 0x000a, 0x1d1f: 0x000a,
+       0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a,
+       // Block 0x75, offset 0x1d40
+       0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a,
+       0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a,
+       0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a,
+       // Block 0x76, offset 0x1d80
+       0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a,
+       // Block 0x77, offset 0x1dc0
+       0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a,
+       // Block 0x78, offset 0x1e00
+       0x1e1e: 0x000a, 0x1e1f: 0x000a,
+       0x1e3f: 0x000a,
+       // Block 0x79, offset 0x1e40
+       0x1e50: 0x000a, 0x1e51: 0x000a,
+       0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a,
+       0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a,
+       0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a,
+       0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a,
+       0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a,
+       0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a,
+       0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a,
+       0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a,
+       // Block 0x7a, offset 0x1e80
+       0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a,
+       0x1e86: 0x000a,
+       // Block 0x7b, offset 0x1ec0
+       0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a,
+       // Block 0x7c, offset 0x1f00
+       0x1f2f: 0x000c,
+       0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c,
+       0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c,
+       0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a,
+       // Block 0x7d, offset 0x1f40
+       0x1f5e: 0x000c, 0x1f5f: 0x000c,
+       // Block 0x7e, offset 0x1f80
+       0x1fb0: 0x000c, 0x1fb1: 0x000c,
+       // Block 0x7f, offset 0x1fc0
+       0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a,
+       0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a,
+       0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a,
+       0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a,
+       0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a,
+       0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a,
+       // Block 0x80, offset 0x2000
+       0x2008: 0x000a,
+       // Block 0x81, offset 0x2040
+       0x2042: 0x000c,
+       0x2046: 0x000c, 0x204b: 0x000c,
+       0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a,
+       0x206a: 0x000a, 0x206b: 0x000a,
+       0x2078: 0x0004, 0x2079: 0x0004,
+       // Block 0x82, offset 0x2080
+       0x20b4: 0x000a, 0x20b5: 0x000a,
+       0x20b6: 0x000a, 0x20b7: 0x000a,
+       // Block 0x83, offset 0x20c0
+       0x20c4: 0x000c, 0x20c5: 0x000c,
+       0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c,
+       0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c,
+       0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c,
+       0x20f0: 0x000c, 0x20f1: 0x000c,
+       // Block 0x84, offset 0x2100
+       0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
+       0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c,
+       // Block 0x85, offset 0x2140
+       0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c,
+       0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c,
+       // Block 0x86, offset 0x2180
+       0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c,
+       0x21b3: 0x000c,
+       0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c,
+       0x21bc: 0x000c,
+       // Block 0x87, offset 0x21c0
+       0x21e5: 0x000c,
+       // Block 0x88, offset 0x2200
+       0x2229: 0x000c,
+       0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c,
+       0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c,
+       0x2236: 0x000c,
+       // Block 0x89, offset 0x2240
+       0x2243: 0x000c,
+       0x224c: 0x000c,
+       0x227c: 0x000c,
+       // Block 0x8a, offset 0x2280
+       0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c,
+       0x22b7: 0x000c, 0x22b8: 0x000c,
+       0x22be: 0x000c, 0x22bf: 0x000c,
+       // Block 0x8b, offset 0x22c0
+       0x22c1: 0x000c,
+       0x22ec: 0x000c, 0x22ed: 0x000c,
+       0x22f6: 0x000c,
+       // Block 0x8c, offset 0x2300
+       0x2325: 0x000c, 0x2328: 0x000c,
+       0x232d: 0x000c,
+       // Block 0x8d, offset 0x2340
+       0x235d: 0x0001,
+       0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001,
+       0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003,
+       0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001,
+       0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001,
+       0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001,
+       0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001,
+       // Block 0x8e, offset 0x2380
+       0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001,
+       0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001,
+       0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d,
+       0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d,
+       0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d,
+       0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d,
+       0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d,
+       0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d,
+       0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d,
+       0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d,
+       0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d,
+       // Block 0x8f, offset 0x23c0
+       0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d,
+       0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d,
+       0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d,
+       0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
+       0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
+       0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
+       0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
+       0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
+       0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
+       0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
+       0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a,
+       // Block 0x90, offset 0x2400
+       0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
+       0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
+       0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b,
+       0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b,
+       0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b,
+       0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b,
+       0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b,
+       0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b,
+       0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
+       0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
+       0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d,
+       // Block 0x91, offset 0x2440
+       0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c,
+       0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c,
+       0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a,
+       0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a,
+       0x2458: 0x000a, 0x2459: 0x000a,
+       0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c,
+       0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c,
+       0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c,
+       0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a,
+       0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a,
+       0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a,
+       // Block 0x92, offset 0x2480
+       0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a,
+       0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a,
+       0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a,
+       0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a,
+       0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a,
+       0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003,
+       0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004,
+       0x24aa: 0x0004, 0x24ab: 0x000a,
+       0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d,
+       0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d,
+       0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d,
+       // Block 0x93, offset 0x24c0
+       0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d,
+       0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d,
+       0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d,
+       0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d,
+       0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d,
+       0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d,
+       0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d,
+       0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d,
+       0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,
+       0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,
+       0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b,
+       // Block 0x94, offset 0x2500
+       0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004,
+       0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003,
+       0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002,
+       0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002,
+       0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a,
+       0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a,
+       0x253b: 0x005a,
+       0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a,
+       // Block 0x95, offset 0x2540
+       0x2540: 0x000a,
+       0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a,
+       0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a,
+       0x2564: 0x000a, 0x2565: 0x000a,
+       // Block 0x96, offset 0x2580
+       0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a,
+       0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a,
+       0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a,
+       0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b,
+       0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a,
+       0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b,
+       // Block 0x97, offset 0x25c0
+       0x25c1: 0x000a,
+       // Block 0x98, offset 0x2600
+       0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a,
+       0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a,
+       0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a,
+       0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a,
+       0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a,
+       0x2620: 0x000a,
+       // Block 0x99, offset 0x2640
+       0x267d: 0x000c,
+       // Block 0x9a, offset 0x2680
+       0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002,
+       0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002,
+       0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002,
+       0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002,
+       0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002,
+       // Block 0x9b, offset 0x26c0
+       0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c,
+       // Block 0x9c, offset 0x2700
+       0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001,
+       0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001,
+       0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001,
+       0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001,
+       0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001,
+       0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001,
+       0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001,
+       0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001,
+       0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001,
+       0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001,
+       0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001,
+       // Block 0x9d, offset 0x2740
+       0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,
+       0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,
+       0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,
+       0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,
+       0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,
+       0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,
+       0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,
+       0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,
+       0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,
+       0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,
+       0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,
+       // Block 0x9e, offset 0x2780
+       0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c,
+       0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
+       0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001,
+       0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
+       0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
+       0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
+       0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
+       0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
+       0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
+       0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001,
+       0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c,
+       // Block 0x9f, offset 0x27c0
+       0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001,
+       0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
+       0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001,
+       0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
+       0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
+       0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
+       0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
+       0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
+       0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
+       0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001,
+       0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001,
+       // Block 0xa0, offset 0x2800
+       0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,
+       0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
+       0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,
+       0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
+       0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
+       0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
+       0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
+       0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
+       0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
+       0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a,
+       0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a,
+       // Block 0xa1, offset 0x2840
+       0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,
+       0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,
+       0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,
+       0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,
+       0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,
+       0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005,
+       0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005,
+       0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005,
+       0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005,
+       0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005,
+       0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001,
+       // Block 0xa2, offset 0x2880
+       0x2881: 0x000c,
+       0x28b8: 0x000c, 0x28b9: 0x000c, 0x28ba: 0x000c, 0x28bb: 0x000c,
+       0x28bc: 0x000c, 0x28bd: 0x000c, 0x28be: 0x000c, 0x28bf: 0x000c,
+       // Block 0xa3, offset 0x28c0
+       0x28c0: 0x000c, 0x28c1: 0x000c, 0x28c2: 0x000c, 0x28c3: 0x000c, 0x28c4: 0x000c, 0x28c5: 0x000c,
+       0x28c6: 0x000c,
+       0x28d2: 0x000a, 0x28d3: 0x000a, 0x28d4: 0x000a, 0x28d5: 0x000a, 0x28d6: 0x000a, 0x28d7: 0x000a,
+       0x28d8: 0x000a, 0x28d9: 0x000a, 0x28da: 0x000a, 0x28db: 0x000a, 0x28dc: 0x000a, 0x28dd: 0x000a,
+       0x28de: 0x000a, 0x28df: 0x000a, 0x28e0: 0x000a, 0x28e1: 0x000a, 0x28e2: 0x000a, 0x28e3: 0x000a,
+       0x28e4: 0x000a, 0x28e5: 0x000a,
+       0x28ff: 0x000c,
+       // Block 0xa4, offset 0x2900
+       0x2900: 0x000c, 0x2901: 0x000c,
+       0x2933: 0x000c, 0x2934: 0x000c, 0x2935: 0x000c,
+       0x2936: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c,
+       // Block 0xa5, offset 0x2940
+       0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c,
+       0x2967: 0x000c, 0x2968: 0x000c, 0x2969: 0x000c,
+       0x296a: 0x000c, 0x296b: 0x000c, 0x296d: 0x000c, 0x296e: 0x000c, 0x296f: 0x000c,
+       0x2970: 0x000c, 0x2971: 0x000c, 0x2972: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c,
+       // Block 0xa6, offset 0x2980
+       0x29b3: 0x000c,
+       // Block 0xa7, offset 0x29c0
+       0x29c0: 0x000c, 0x29c1: 0x000c,
+       0x29f6: 0x000c, 0x29f7: 0x000c, 0x29f8: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, 0x29fb: 0x000c,
+       0x29fc: 0x000c, 0x29fd: 0x000c, 0x29fe: 0x000c,
+       // Block 0xa8, offset 0x2a00
+       0x2a0a: 0x000c, 0x2a0b: 0x000c,
+       0x2a0c: 0x000c,
+       // Block 0xa9, offset 0x2a40
+       0x2a6f: 0x000c,
+       0x2a70: 0x000c, 0x2a71: 0x000c, 0x2a74: 0x000c,
+       0x2a76: 0x000c, 0x2a77: 0x000c,
+       0x2a7e: 0x000c,
+       // Block 0xaa, offset 0x2a80
+       0x2a9f: 0x000c, 0x2aa3: 0x000c,
+       0x2aa4: 0x000c, 0x2aa5: 0x000c, 0x2aa6: 0x000c, 0x2aa7: 0x000c, 0x2aa8: 0x000c, 0x2aa9: 0x000c,
+       0x2aaa: 0x000c,
+       // Block 0xab, offset 0x2ac0
+       0x2ac0: 0x000c, 0x2ac1: 0x000c,
+       0x2afc: 0x000c,
+       // Block 0xac, offset 0x2b00
+       0x2b00: 0x000c,
+       0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c,
+       0x2b2a: 0x000c, 0x2b2b: 0x000c, 0x2b2c: 0x000c,
+       0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b32: 0x000c, 0x2b33: 0x000c, 0x2b34: 0x000c,
+       // Block 0xad, offset 0x2b40
+       0x2b78: 0x000c, 0x2b79: 0x000c, 0x2b7a: 0x000c, 0x2b7b: 0x000c,
+       0x2b7c: 0x000c, 0x2b7d: 0x000c, 0x2b7e: 0x000c, 0x2b7f: 0x000c,
+       // Block 0xae, offset 0x2b80
+       0x2b82: 0x000c, 0x2b83: 0x000c, 0x2b84: 0x000c,
+       0x2b86: 0x000c,
+       // Block 0xaf, offset 0x2bc0
+       0x2bf3: 0x000c, 0x2bf4: 0x000c, 0x2bf5: 0x000c,
+       0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bfa: 0x000c,
+       0x2bff: 0x000c,
+       // Block 0xb0, offset 0x2c00
+       0x2c00: 0x000c, 0x2c02: 0x000c, 0x2c03: 0x000c,
+       // Block 0xb1, offset 0x2c40
+       0x2c72: 0x000c, 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c,
+       0x2c7c: 0x000c, 0x2c7d: 0x000c, 0x2c7f: 0x000c,
+       // Block 0xb2, offset 0x2c80
+       0x2c80: 0x000c,
+       0x2c9c: 0x000c, 0x2c9d: 0x000c,
+       // Block 0xb3, offset 0x2cc0
+       0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c,
+       0x2cf6: 0x000c, 0x2cf7: 0x000c, 0x2cf8: 0x000c, 0x2cf9: 0x000c, 0x2cfa: 0x000c,
+       0x2cfd: 0x000c, 0x2cff: 0x000c,
+       // Block 0xb4, offset 0x2d00
+       0x2d00: 0x000c,
+       0x2d20: 0x000a, 0x2d21: 0x000a, 0x2d22: 0x000a, 0x2d23: 0x000a,
+       0x2d24: 0x000a, 0x2d25: 0x000a, 0x2d26: 0x000a, 0x2d27: 0x000a, 0x2d28: 0x000a, 0x2d29: 0x000a,
+       0x2d2a: 0x000a, 0x2d2b: 0x000a, 0x2d2c: 0x000a,
+       // Block 0xb5, offset 0x2d40
+       0x2d6b: 0x000c, 0x2d6d: 0x000c,
+       0x2d70: 0x000c, 0x2d71: 0x000c, 0x2d72: 0x000c, 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c,
+       0x2d77: 0x000c,
+       // Block 0xb6, offset 0x2d80
+       0x2d9d: 0x000c,
+       0x2d9e: 0x000c, 0x2d9f: 0x000c, 0x2da2: 0x000c, 0x2da3: 0x000c,
+       0x2da4: 0x000c, 0x2da5: 0x000c, 0x2da7: 0x000c, 0x2da8: 0x000c, 0x2da9: 0x000c,
+       0x2daa: 0x000c, 0x2dab: 0x000c,
+       // Block 0xb7, offset 0x2dc0
+       0x2dc1: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, 0x2dc4: 0x000c, 0x2dc5: 0x000c,
+       0x2dc6: 0x000c, 0x2dc9: 0x000c, 0x2dca: 0x000c,
+       0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c,
+       0x2df6: 0x000c, 0x2df7: 0x000c, 0x2df8: 0x000c, 0x2dfb: 0x000c,
+       0x2dfc: 0x000c, 0x2dfd: 0x000c, 0x2dfe: 0x000c,
+       // Block 0xb8, offset 0x2e00
+       0x2e07: 0x000c,
+       0x2e11: 0x000c,
+       0x2e12: 0x000c, 0x2e13: 0x000c, 0x2e14: 0x000c, 0x2e15: 0x000c, 0x2e16: 0x000c,
+       0x2e19: 0x000c, 0x2e1a: 0x000c, 0x2e1b: 0x000c,
+       // Block 0xb9, offset 0x2e40
+       0x2e4a: 0x000c, 0x2e4b: 0x000c,
+       0x2e4c: 0x000c, 0x2e4d: 0x000c, 0x2e4e: 0x000c, 0x2e4f: 0x000c, 0x2e50: 0x000c, 0x2e51: 0x000c,
+       0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c,
+       0x2e58: 0x000c, 0x2e59: 0x000c,
+       // Block 0xba, offset 0x2e80
+       0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c,
+       0x2eb6: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, 0x2ebb: 0x000c,
+       0x2ebc: 0x000c, 0x2ebd: 0x000c,
+       // Block 0xbb, offset 0x2ec0
+       0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, 0x2ed7: 0x000c,
+       0x2ed8: 0x000c, 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, 0x2edc: 0x000c, 0x2edd: 0x000c,
+       0x2ede: 0x000c, 0x2edf: 0x000c, 0x2ee0: 0x000c, 0x2ee1: 0x000c, 0x2ee2: 0x000c, 0x2ee3: 0x000c,
+       0x2ee4: 0x000c, 0x2ee5: 0x000c, 0x2ee6: 0x000c, 0x2ee7: 0x000c,
+       0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, 0x2eee: 0x000c, 0x2eef: 0x000c,
+       0x2ef0: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef5: 0x000c,
+       0x2ef6: 0x000c,
+       // Block 0xbc, offset 0x2f00
+       0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c,
+       0x2f36: 0x000c, 0x2f3a: 0x000c,
+       0x2f3c: 0x000c, 0x2f3d: 0x000c, 0x2f3f: 0x000c,
+       // Block 0xbd, offset 0x2f40
+       0x2f40: 0x000c, 0x2f41: 0x000c, 0x2f42: 0x000c, 0x2f43: 0x000c, 0x2f44: 0x000c, 0x2f45: 0x000c,
+       0x2f47: 0x000c,
+       // Block 0xbe, offset 0x2f80
+       0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c,
+       // Block 0xbf, offset 0x2fc0
+       0x2ff0: 0x000c, 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c,
+       0x2ff6: 0x000c,
+       // Block 0xc0, offset 0x3000
+       0x300f: 0x000c, 0x3010: 0x000c, 0x3011: 0x000c,
+       0x3012: 0x000c,
+       // Block 0xc1, offset 0x3040
+       0x305d: 0x000c,
+       0x305e: 0x000c, 0x3060: 0x000b, 0x3061: 0x000b, 0x3062: 0x000b, 0x3063: 0x000b,
+       // Block 0xc2, offset 0x3080
+       0x30a7: 0x000c, 0x30a8: 0x000c, 0x30a9: 0x000c,
+       0x30b3: 0x000b, 0x30b4: 0x000b, 0x30b5: 0x000b,
+       0x30b6: 0x000b, 0x30b7: 0x000b, 0x30b8: 0x000b, 0x30b9: 0x000b, 0x30ba: 0x000b, 0x30bb: 0x000c,
+       0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, 0x30bf: 0x000c,
+       // Block 0xc3, offset 0x30c0
+       0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c5: 0x000c,
+       0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c,
+       0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c,
+       // Block 0xc4, offset 0x3100
+       0x3100: 0x000a, 0x3101: 0x000a, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000a,
+       // Block 0xc5, offset 0x3140
+       0x3140: 0x000a, 0x3141: 0x000a, 0x3142: 0x000a, 0x3143: 0x000a, 0x3144: 0x000a, 0x3145: 0x000a,
+       0x3146: 0x000a, 0x3147: 0x000a, 0x3148: 0x000a, 0x3149: 0x000a, 0x314a: 0x000a, 0x314b: 0x000a,
+       0x314c: 0x000a, 0x314d: 0x000a, 0x314e: 0x000a, 0x314f: 0x000a, 0x3150: 0x000a, 0x3151: 0x000a,
+       0x3152: 0x000a, 0x3153: 0x000a, 0x3154: 0x000a, 0x3155: 0x000a, 0x3156: 0x000a,
+       // Block 0xc6, offset 0x3180
+       0x319b: 0x000a,
+       // Block 0xc7, offset 0x31c0
+       0x31d5: 0x000a,
+       // Block 0xc8, offset 0x3200
+       0x320f: 0x000a,
+       // Block 0xc9, offset 0x3240
+       0x3249: 0x000a,
+       // Block 0xca, offset 0x3280
+       0x3283: 0x000a,
+       0x328e: 0x0002, 0x328f: 0x0002, 0x3290: 0x0002, 0x3291: 0x0002,
+       0x3292: 0x0002, 0x3293: 0x0002, 0x3294: 0x0002, 0x3295: 0x0002, 0x3296: 0x0002, 0x3297: 0x0002,
+       0x3298: 0x0002, 0x3299: 0x0002, 0x329a: 0x0002, 0x329b: 0x0002, 0x329c: 0x0002, 0x329d: 0x0002,
+       0x329e: 0x0002, 0x329f: 0x0002, 0x32a0: 0x0002, 0x32a1: 0x0002, 0x32a2: 0x0002, 0x32a3: 0x0002,
+       0x32a4: 0x0002, 0x32a5: 0x0002, 0x32a6: 0x0002, 0x32a7: 0x0002, 0x32a8: 0x0002, 0x32a9: 0x0002,
+       0x32aa: 0x0002, 0x32ab: 0x0002, 0x32ac: 0x0002, 0x32ad: 0x0002, 0x32ae: 0x0002, 0x32af: 0x0002,
+       0x32b0: 0x0002, 0x32b1: 0x0002, 0x32b2: 0x0002, 0x32b3: 0x0002, 0x32b4: 0x0002, 0x32b5: 0x0002,
+       0x32b6: 0x0002, 0x32b7: 0x0002, 0x32b8: 0x0002, 0x32b9: 0x0002, 0x32ba: 0x0002, 0x32bb: 0x0002,
+       0x32bc: 0x0002, 0x32bd: 0x0002, 0x32be: 0x0002, 0x32bf: 0x0002,
+       // Block 0xcb, offset 0x32c0
+       0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c3: 0x000c, 0x32c4: 0x000c, 0x32c5: 0x000c,
+       0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c,
+       0x32cc: 0x000c, 0x32cd: 0x000c, 0x32ce: 0x000c, 0x32cf: 0x000c, 0x32d0: 0x000c, 0x32d1: 0x000c,
+       0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x000c,
+       0x32d8: 0x000c, 0x32d9: 0x000c, 0x32da: 0x000c, 0x32db: 0x000c, 0x32dc: 0x000c, 0x32dd: 0x000c,
+       0x32de: 0x000c, 0x32df: 0x000c, 0x32e0: 0x000c, 0x32e1: 0x000c, 0x32e2: 0x000c, 0x32e3: 0x000c,
+       0x32e4: 0x000c, 0x32e5: 0x000c, 0x32e6: 0x000c, 0x32e7: 0x000c, 0x32e8: 0x000c, 0x32e9: 0x000c,
+       0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, 0x32ee: 0x000c, 0x32ef: 0x000c,
+       0x32f0: 0x000c, 0x32f1: 0x000c, 0x32f2: 0x000c, 0x32f3: 0x000c, 0x32f4: 0x000c, 0x32f5: 0x000c,
+       0x32f6: 0x000c, 0x32fb: 0x000c,
+       0x32fc: 0x000c, 0x32fd: 0x000c, 0x32fe: 0x000c, 0x32ff: 0x000c,
+       // Block 0xcc, offset 0x3300
+       0x3300: 0x000c, 0x3301: 0x000c, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000c,
+       0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x000c,
+       0x330c: 0x000c, 0x330d: 0x000c, 0x330e: 0x000c, 0x330f: 0x000c, 0x3310: 0x000c, 0x3311: 0x000c,
+       0x3312: 0x000c, 0x3313: 0x000c, 0x3314: 0x000c, 0x3315: 0x000c, 0x3316: 0x000c, 0x3317: 0x000c,
+       0x3318: 0x000c, 0x3319: 0x000c, 0x331a: 0x000c, 0x331b: 0x000c, 0x331c: 0x000c, 0x331d: 0x000c,
+       0x331e: 0x000c, 0x331f: 0x000c, 0x3320: 0x000c, 0x3321: 0x000c, 0x3322: 0x000c, 0x3323: 0x000c,
+       0x3324: 0x000c, 0x3325: 0x000c, 0x3326: 0x000c, 0x3327: 0x000c, 0x3328: 0x000c, 0x3329: 0x000c,
+       0x332a: 0x000c, 0x332b: 0x000c, 0x332c: 0x000c,
+       0x3335: 0x000c,
+       // Block 0xcd, offset 0x3340
+       0x3344: 0x000c,
+       0x335b: 0x000c, 0x335c: 0x000c, 0x335d: 0x000c,
+       0x335e: 0x000c, 0x335f: 0x000c, 0x3361: 0x000c, 0x3362: 0x000c, 0x3363: 0x000c,
+       0x3364: 0x000c, 0x3365: 0x000c, 0x3366: 0x000c, 0x3367: 0x000c, 0x3368: 0x000c, 0x3369: 0x000c,
+       0x336a: 0x000c, 0x336b: 0x000c, 0x336c: 0x000c, 0x336d: 0x000c, 0x336e: 0x000c, 0x336f: 0x000c,
+       // Block 0xce, offset 0x3380
+       0x3380: 0x000c, 0x3381: 0x000c, 0x3382: 0x000c, 0x3383: 0x000c, 0x3384: 0x000c, 0x3385: 0x000c,
+       0x3386: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c,
+       0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c,
+       0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, 0x3396: 0x000c, 0x3397: 0x000c,
+       0x3398: 0x000c, 0x339b: 0x000c, 0x339c: 0x000c, 0x339d: 0x000c,
+       0x339e: 0x000c, 0x339f: 0x000c, 0x33a0: 0x000c, 0x33a1: 0x000c, 0x33a3: 0x000c,
+       0x33a4: 0x000c, 0x33a6: 0x000c, 0x33a7: 0x000c, 0x33a8: 0x000c, 0x33a9: 0x000c,
+       0x33aa: 0x000c,
+       // Block 0xcf, offset 0x33c0
+       0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001,
+       0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001,
+       0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x000c, 0x33d1: 0x000c,
+       0x33d2: 0x000c, 0x33d3: 0x000c, 0x33d4: 0x000c, 0x33d5: 0x000c, 0x33d6: 0x000c, 0x33d7: 0x0001,
+       0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001,
+       0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001,
+       0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001,
+       0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001,
+       0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001,
+       0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0001, 0x33f9: 0x0001, 0x33fa: 0x0001, 0x33fb: 0x0001,
+       0x33fc: 0x0001, 0x33fd: 0x0001, 0x33fe: 0x0001, 0x33ff: 0x0001,
+       // Block 0xd0, offset 0x3400
+       0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x000c, 0x3405: 0x000c,
+       0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x0001,
+       0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001,
+       0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0001, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001,
+       0x3418: 0x0001, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001,
+       0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001,
+       0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001,
+       0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001,
+       0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0001, 0x3435: 0x0001,
+       0x3436: 0x0001, 0x3437: 0x0001, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0001,
+       0x343c: 0x0001, 0x343d: 0x0001, 0x343e: 0x0001, 0x343f: 0x0001,
+       // Block 0xd1, offset 0x3440
+       0x3440: 0x000d, 0x3441: 0x000d, 0x3442: 0x000d, 0x3443: 0x000d, 0x3444: 0x000d, 0x3445: 0x000d,
+       0x3446: 0x000d, 0x3447: 0x000d, 0x3448: 0x000d, 0x3449: 0x000d, 0x344a: 0x000d, 0x344b: 0x000d,
+       0x344c: 0x000d, 0x344d: 0x000d, 0x344e: 0x000d, 0x344f: 0x000d, 0x3450: 0x000d, 0x3451: 0x000d,
+       0x3452: 0x000d, 0x3453: 0x000d, 0x3454: 0x000d, 0x3455: 0x000d, 0x3456: 0x000d, 0x3457: 0x000d,
+       0x3458: 0x000d, 0x3459: 0x000d, 0x345a: 0x000d, 0x345b: 0x000d, 0x345c: 0x000d, 0x345d: 0x000d,
+       0x345e: 0x000d, 0x345f: 0x000d, 0x3460: 0x000d, 0x3461: 0x000d, 0x3462: 0x000d, 0x3463: 0x000d,
+       0x3464: 0x000d, 0x3465: 0x000d, 0x3466: 0x000d, 0x3467: 0x000d, 0x3468: 0x000d, 0x3469: 0x000d,
+       0x346a: 0x000d, 0x346b: 0x000d, 0x346c: 0x000d, 0x346d: 0x000d, 0x346e: 0x000d, 0x346f: 0x000d,
+       0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000d, 0x3473: 0x000d, 0x3474: 0x000d, 0x3475: 0x000d,
+       0x3476: 0x000d, 0x3477: 0x000d, 0x3478: 0x000d, 0x3479: 0x000d, 0x347a: 0x000d, 0x347b: 0x000d,
+       0x347c: 0x000d, 0x347d: 0x000d, 0x347e: 0x000d, 0x347f: 0x000d,
+       // Block 0xd2, offset 0x3480
+       0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a,
+       0x3486: 0x000a, 0x3487: 0x000a, 0x3488: 0x000a, 0x3489: 0x000a, 0x348a: 0x000a, 0x348b: 0x000a,
+       0x348c: 0x000a, 0x348d: 0x000a, 0x348e: 0x000a, 0x348f: 0x000a, 0x3490: 0x000a, 0x3491: 0x000a,
+       0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a,
+       0x3498: 0x000a, 0x3499: 0x000a, 0x349a: 0x000a, 0x349b: 0x000a, 0x349c: 0x000a, 0x349d: 0x000a,
+       0x349e: 0x000a, 0x349f: 0x000a, 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a,
+       0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a,
+       0x34aa: 0x000a, 0x34ab: 0x000a,
+       0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a,
+       0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a,
+       0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a,
+       // Block 0xd3, offset 0x34c0
+       0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,
+       0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,
+       0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,
+       0x34d2: 0x000a, 0x34d3: 0x000a,
+       0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,
+       0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,
+       0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, 0x34ee: 0x000a,
+       0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,
+       0x34f6: 0x000a, 0x34f7: 0x000a, 0x34f8: 0x000a, 0x34f9: 0x000a, 0x34fa: 0x000a, 0x34fb: 0x000a,
+       0x34fc: 0x000a, 0x34fd: 0x000a, 0x34fe: 0x000a, 0x34ff: 0x000a,
+       // Block 0xd4, offset 0x3500
+       0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,
+       0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,
+       0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3511: 0x000a,
+       0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a,
+       0x3518: 0x000a, 0x3519: 0x000a, 0x351a: 0x000a, 0x351b: 0x000a, 0x351c: 0x000a, 0x351d: 0x000a,
+       0x351e: 0x000a, 0x351f: 0x000a, 0x3520: 0x000a, 0x3521: 0x000a, 0x3522: 0x000a, 0x3523: 0x000a,
+       0x3524: 0x000a, 0x3525: 0x000a, 0x3526: 0x000a, 0x3527: 0x000a, 0x3528: 0x000a, 0x3529: 0x000a,
+       0x352a: 0x000a, 0x352b: 0x000a, 0x352c: 0x000a, 0x352d: 0x000a, 0x352e: 0x000a, 0x352f: 0x000a,
+       0x3530: 0x000a, 0x3531: 0x000a, 0x3532: 0x000a, 0x3533: 0x000a, 0x3534: 0x000a, 0x3535: 0x000a,
+       // Block 0xd5, offset 0x3540
+       0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002,
+       0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x000a,
+       0x354c: 0x000a,
+       // Block 0xd6, offset 0x3580
+       0x35aa: 0x000a, 0x35ab: 0x000a,
+       // Block 0xd7, offset 0x35c0
+       0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,
+       0x35e4: 0x000a, 0x35e5: 0x000a,
+       // Block 0xd8, offset 0x3600
+       0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a,
+       0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a,
+       0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a,
+       0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a,
+       0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,
+       0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a,
+       0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a,
+       0x3630: 0x000a, 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,
+       0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a,
+       // Block 0xd9, offset 0x3640
+       0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,
+       0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,
+       0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a,
+       0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a,
+       // Block 0xda, offset 0x3680
+       0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,
+       0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,
+       0x3690: 0x000a, 0x3691: 0x000a,
+       0x3692: 0x000a, 0x3693: 0x000a, 0x3694: 0x000a, 0x3695: 0x000a, 0x3696: 0x000a, 0x3697: 0x000a,
+       0x3698: 0x000a, 0x3699: 0x000a, 0x369a: 0x000a, 0x369b: 0x000a, 0x369c: 0x000a, 0x369d: 0x000a,
+       0x369e: 0x000a, 0x369f: 0x000a, 0x36a0: 0x000a, 0x36a1: 0x000a, 0x36a2: 0x000a, 0x36a3: 0x000a,
+       0x36a4: 0x000a, 0x36a5: 0x000a, 0x36a6: 0x000a, 0x36a7: 0x000a, 0x36a8: 0x000a, 0x36a9: 0x000a,
+       0x36aa: 0x000a, 0x36ab: 0x000a, 0x36ac: 0x000a, 0x36ad: 0x000a, 0x36ae: 0x000a, 0x36af: 0x000a,
+       0x36b0: 0x000a, 0x36b1: 0x000a, 0x36b2: 0x000a, 0x36b3: 0x000a, 0x36b4: 0x000a, 0x36b5: 0x000a,
+       0x36b6: 0x000a, 0x36b7: 0x000a, 0x36b8: 0x000a, 0x36b9: 0x000a, 0x36ba: 0x000a, 0x36bb: 0x000a,
+       0x36bc: 0x000a, 0x36bd: 0x000a, 0x36be: 0x000a, 0x36bf: 0x000a,
+       // Block 0xdb, offset 0x36c0
+       0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a,
+       0x36c6: 0x000a, 0x36c7: 0x000a,
+       0x36d0: 0x000a, 0x36d1: 0x000a,
+       0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, 0x36d7: 0x000a,
+       0x36d8: 0x000a, 0x36d9: 0x000a,
+       0x36e0: 0x000a, 0x36e1: 0x000a, 0x36e2: 0x000a, 0x36e3: 0x000a,
+       0x36e4: 0x000a, 0x36e5: 0x000a, 0x36e6: 0x000a, 0x36e7: 0x000a, 0x36e8: 0x000a, 0x36e9: 0x000a,
+       0x36ea: 0x000a, 0x36eb: 0x000a, 0x36ec: 0x000a, 0x36ed: 0x000a, 0x36ee: 0x000a, 0x36ef: 0x000a,
+       0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000a, 0x36f3: 0x000a, 0x36f4: 0x000a, 0x36f5: 0x000a,
+       0x36f6: 0x000a, 0x36f7: 0x000a, 0x36f8: 0x000a, 0x36f9: 0x000a, 0x36fa: 0x000a, 0x36fb: 0x000a,
+       0x36fc: 0x000a, 0x36fd: 0x000a, 0x36fe: 0x000a, 0x36ff: 0x000a,
+       // Block 0xdc, offset 0x3700
+       0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a,
+       0x3706: 0x000a, 0x3707: 0x000a,
+       0x3710: 0x000a, 0x3711: 0x000a,
+       0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a,
+       0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a,
+       0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a,
+       0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a,
+       0x372a: 0x000a, 0x372b: 0x000a, 0x372c: 0x000a, 0x372d: 0x000a,
+       // Block 0xdd, offset 0x3740
+       0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a,
+       0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a,
+       0x3750: 0x000a, 0x3751: 0x000a,
+       0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, 0x3755: 0x000a, 0x3756: 0x000a, 0x3757: 0x000a,
+       0x3758: 0x000a, 0x3759: 0x000a, 0x375a: 0x000a, 0x375b: 0x000a, 0x375c: 0x000a, 0x375d: 0x000a,
+       0x375e: 0x000a, 0x375f: 0x000a, 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a,
+       0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a,
+       0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, 0x376f: 0x000a,
+       0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a,
+       0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a,
+       0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a,
+       // Block 0xde, offset 0x3780
+       0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a,
+       0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a,
+       0x378c: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a,
+       0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a,
+       0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a,
+       0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a,
+       0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a,
+       0x37aa: 0x000a, 0x37ab: 0x000a,
+       // Block 0xdf, offset 0x37c0
+       0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a,
+       0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a,
+       0x37cc: 0x000a, 0x37cd: 0x000a, 0x37ce: 0x000a, 0x37cf: 0x000a, 0x37d0: 0x000a, 0x37d1: 0x000a,
+       0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a,
+       // Block 0xe0, offset 0x3800
+       0x3800: 0x000a,
+       0x3810: 0x000a, 0x3811: 0x000a,
+       0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a,
+       0x3818: 0x000a, 0x3819: 0x000a, 0x381a: 0x000a, 0x381b: 0x000a, 0x381c: 0x000a, 0x381d: 0x000a,
+       0x381e: 0x000a, 0x381f: 0x000a, 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a,
+       0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a,
+       // Block 0xe1, offset 0x3840
+       0x387e: 0x000b, 0x387f: 0x000b,
+       // Block 0xe2, offset 0x3880
+       0x3880: 0x000b, 0x3881: 0x000b, 0x3882: 0x000b, 0x3883: 0x000b, 0x3884: 0x000b, 0x3885: 0x000b,
+       0x3886: 0x000b, 0x3887: 0x000b, 0x3888: 0x000b, 0x3889: 0x000b, 0x388a: 0x000b, 0x388b: 0x000b,
+       0x388c: 0x000b, 0x388d: 0x000b, 0x388e: 0x000b, 0x388f: 0x000b, 0x3890: 0x000b, 0x3891: 0x000b,
+       0x3892: 0x000b, 0x3893: 0x000b, 0x3894: 0x000b, 0x3895: 0x000b, 0x3896: 0x000b, 0x3897: 0x000b,
+       0x3898: 0x000b, 0x3899: 0x000b, 0x389a: 0x000b, 0x389b: 0x000b, 0x389c: 0x000b, 0x389d: 0x000b,
+       0x389e: 0x000b, 0x389f: 0x000b, 0x38a0: 0x000b, 0x38a1: 0x000b, 0x38a2: 0x000b, 0x38a3: 0x000b,
+       0x38a4: 0x000b, 0x38a5: 0x000b, 0x38a6: 0x000b, 0x38a7: 0x000b, 0x38a8: 0x000b, 0x38a9: 0x000b,
+       0x38aa: 0x000b, 0x38ab: 0x000b, 0x38ac: 0x000b, 0x38ad: 0x000b, 0x38ae: 0x000b, 0x38af: 0x000b,
+       0x38b0: 0x000b, 0x38b1: 0x000b, 0x38b2: 0x000b, 0x38b3: 0x000b, 0x38b4: 0x000b, 0x38b5: 0x000b,
+       0x38b6: 0x000b, 0x38b7: 0x000b, 0x38b8: 0x000b, 0x38b9: 0x000b, 0x38ba: 0x000b, 0x38bb: 0x000b,
+       0x38bc: 0x000b, 0x38bd: 0x000b, 0x38be: 0x000b, 0x38bf: 0x000b,
+       // Block 0xe3, offset 0x38c0
+       0x38c0: 0x000c, 0x38c1: 0x000c, 0x38c2: 0x000c, 0x38c3: 0x000c, 0x38c4: 0x000c, 0x38c5: 0x000c,
+       0x38c6: 0x000c, 0x38c7: 0x000c, 0x38c8: 0x000c, 0x38c9: 0x000c, 0x38ca: 0x000c, 0x38cb: 0x000c,
+       0x38cc: 0x000c, 0x38cd: 0x000c, 0x38ce: 0x000c, 0x38cf: 0x000c, 0x38d0: 0x000c, 0x38d1: 0x000c,
+       0x38d2: 0x000c, 0x38d3: 0x000c, 0x38d4: 0x000c, 0x38d5: 0x000c, 0x38d6: 0x000c, 0x38d7: 0x000c,
+       0x38d8: 0x000c, 0x38d9: 0x000c, 0x38da: 0x000c, 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c,
+       0x38de: 0x000c, 0x38df: 0x000c, 0x38e0: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c,
+       0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c,
+       0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c,
+       0x38f0: 0x000b, 0x38f1: 0x000b, 0x38f2: 0x000b, 0x38f3: 0x000b, 0x38f4: 0x000b, 0x38f5: 0x000b,
+       0x38f6: 0x000b, 0x38f7: 0x000b, 0x38f8: 0x000b, 0x38f9: 0x000b, 0x38fa: 0x000b, 0x38fb: 0x000b,
+       0x38fc: 0x000b, 0x38fd: 0x000b, 0x38fe: 0x000b, 0x38ff: 0x000b,
+}
+
+// bidiIndex: 24 blocks, 1536 entries, 1536 bytes
+// Block 0 is the zero block.
+var bidiIndex = [1536]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x02,
+       0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
+       0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
+       0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
+       0xea: 0x07, 0xef: 0x08,
+       0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,
+       // Block 0x4, offset 0x100
+       0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
+       0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
+       0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,
+       0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,
+       // Block 0x5, offset 0x140
+       0x140: 0x31, 0x141: 0x32, 0x142: 0x33,
+       0x14d: 0x34, 0x14e: 0x35,
+       0x150: 0x36,
+       0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,
+       0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,
+       0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,
+       0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,
+       0x17e: 0x4b, 0x17f: 0x4c,
+       // Block 0x6, offset 0x180
+       0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,
+       0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54,
+       0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,
+       0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f,
+       0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61,
+       0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64,
+       0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67,
+       0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70,
+       0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76,
+       // Block 0x8, offset 0x200
+       0x237: 0x54,
+       // Block 0x9, offset 0x240
+       0x252: 0x77, 0x253: 0x78,
+       0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e,
+       0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85,
+       0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a,
+       // Block 0xa, offset 0x280
+       0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e,
+       0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e,
+       0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94,
+       // Block 0xb, offset 0x2c0
+       0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97,
+       0x2cb: 0x98, 0x2cd: 0x99,
+       0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a,
+       0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a,
+       0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9a, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a,
+       0x2f8: 0x9a, 0x2f9: 0x9f, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0x9a, 0x2fd: 0x9a, 0x2fe: 0x9a, 0x2ff: 0x9a,
+       // Block 0xc, offset 0x300
+       0x300: 0xa0, 0x301: 0xa1, 0x302: 0xa2, 0x304: 0xa3, 0x305: 0xa4, 0x306: 0xa5, 0x307: 0xa6,
+       0x308: 0xa7, 0x30b: 0xa8, 0x30c: 0xa9, 0x30d: 0xaa,
+       0x310: 0xab, 0x311: 0xac, 0x312: 0xad, 0x313: 0xae, 0x316: 0xaf, 0x317: 0xb0,
+       0x318: 0xb1, 0x319: 0xb2, 0x31a: 0xb3, 0x31c: 0xb4,
+       0x328: 0xb5, 0x329: 0xb6, 0x32a: 0xb7,
+       0x330: 0xb8, 0x332: 0xb9, 0x334: 0xba, 0x335: 0xbb,
+       // Block 0xd, offset 0x340
+       0x36b: 0xbc, 0x36c: 0xbd,
+       0x37e: 0xbe,
+       // Block 0xe, offset 0x380
+       0x3b2: 0xbf,
+       // Block 0xf, offset 0x3c0
+       0x3c5: 0xc0, 0x3c6: 0xc1,
+       0x3c8: 0x54, 0x3c9: 0xc2, 0x3cc: 0x54, 0x3cd: 0xc3,
+       0x3db: 0xc4, 0x3dc: 0xc5, 0x3dd: 0xc6, 0x3de: 0xc7, 0x3df: 0xc8,
+       0x3e8: 0xc9, 0x3e9: 0xca, 0x3ea: 0xcb,
+       // Block 0x10, offset 0x400
+       0x400: 0xcc,
+       0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xcd, 0x424: 0x9a, 0x425: 0xce, 0x426: 0x9a, 0x427: 0x9a,
+       0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a,
+       0x430: 0x9a, 0x431: 0x9a, 0x432: 0x9a, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a,
+       0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcf, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a,
+       // Block 0x11, offset 0x440
+       0x440: 0xd0, 0x441: 0x54, 0x442: 0xd1, 0x443: 0xd2, 0x444: 0xd3, 0x445: 0xd4,
+       0x449: 0xd5, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,
+       0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,
+       0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd6, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xd7,
+       0x460: 0xd8, 0x461: 0xd9, 0x462: 0xda, 0x464: 0xdb, 0x465: 0xdc, 0x466: 0xdd, 0x467: 0xde,
+       0x47f: 0xdf,
+       // Block 0x12, offset 0x480
+       0x4bf: 0xdf,
+       // Block 0x13, offset 0x4c0
+       0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,
+       0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,
+       0x4ef: 0x10,
+       0x4ff: 0x10,
+       // Block 0x14, offset 0x500
+       0x50f: 0x10,
+       0x51f: 0x10,
+       0x52f: 0x10,
+       0x53f: 0x10,
+       // Block 0x15, offset 0x540
+       0x540: 0xe0, 0x541: 0xe0, 0x542: 0xe0, 0x543: 0xe0, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe1,
+       0x548: 0xe0, 0x549: 0xe0, 0x54a: 0xe0, 0x54b: 0xe0, 0x54c: 0xe0, 0x54d: 0xe0, 0x54e: 0xe0, 0x54f: 0xe0,
+       0x550: 0xe0, 0x551: 0xe0, 0x552: 0xe0, 0x553: 0xe0, 0x554: 0xe0, 0x555: 0xe0, 0x556: 0xe0, 0x557: 0xe0,
+       0x558: 0xe0, 0x559: 0xe0, 0x55a: 0xe0, 0x55b: 0xe0, 0x55c: 0xe0, 0x55d: 0xe0, 0x55e: 0xe0, 0x55f: 0xe0,
+       0x560: 0xe0, 0x561: 0xe0, 0x562: 0xe0, 0x563: 0xe0, 0x564: 0xe0, 0x565: 0xe0, 0x566: 0xe0, 0x567: 0xe0,
+       0x568: 0xe0, 0x569: 0xe0, 0x56a: 0xe0, 0x56b: 0xe0, 0x56c: 0xe0, 0x56d: 0xe0, 0x56e: 0xe0, 0x56f: 0xe0,
+       0x570: 0xe0, 0x571: 0xe0, 0x572: 0xe0, 0x573: 0xe0, 0x574: 0xe0, 0x575: 0xe0, 0x576: 0xe0, 0x577: 0xe0,
+       0x578: 0xe0, 0x579: 0xe0, 0x57a: 0xe0, 0x57b: 0xe0, 0x57c: 0xe0, 0x57d: 0xe0, 0x57e: 0xe0, 0x57f: 0xe0,
+       // Block 0x16, offset 0x580
+       0x58f: 0x10,
+       0x59f: 0x10,
+       0x5a0: 0x13,
+       0x5af: 0x10,
+       0x5bf: 0x10,
+       // Block 0x17, offset 0x5c0
+       0x5cf: 0x10,
+}
+
+// Total table size 16184 bytes (15KiB); checksum: F50EF68C
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/tables11.0.0.go b/libgo/go/golang.org/x/text/unicode/bidi/tables11.0.0.go
new file mode 100644 (file)
index 0000000..022e3c6
--- /dev/null
@@ -0,0 +1,1887 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.13
+
+package bidi
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "11.0.0"
+
+// xorMasks contains masks to be xor-ed with brackets to get the reverse
+// version.
+var xorMasks = []int32{ // 8 elements
+       0, 1, 6, 7, 3, 15, 29, 63,
+} // Size: 56 bytes
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// bidiTrie. Total size: 16512 bytes (16.12 KiB). Checksum: 2a9cf1317f2ffaa.
+type bidiTrie struct{}
+
+func newBidiTrie(i int) *bidiTrie {
+       return &bidiTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
+       switch {
+       default:
+               return uint8(bidiValues[n<<6+uint32(b)])
+       }
+}
+
+// bidiValues: 234 blocks, 14976 entries, 14976 bytes
+// The third block is the zero block.
+var bidiValues = [14976]uint8{
+       // Block 0x0, offset 0x0
+       0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
+       0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
+       0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
+       0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
+       0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
+       0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
+       0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
+       0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
+       0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
+       0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
+       0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
+       // Block 0x1, offset 0x40
+       0x40: 0x000a,
+       0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
+       0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
+       0x7b: 0x005a,
+       0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
+       0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
+       0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
+       0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
+       0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
+       0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
+       0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
+       0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
+       0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
+       0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
+       0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
+       // Block 0x4, offset 0x100
+       0x117: 0x000a,
+       0x137: 0x000a,
+       // Block 0x5, offset 0x140
+       0x179: 0x000a, 0x17a: 0x000a,
+       // Block 0x6, offset 0x180
+       0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
+       0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
+       0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
+       0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
+       0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
+       0x19e: 0x000a, 0x19f: 0x000a,
+       0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
+       0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
+       0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
+       0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
+       0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
+       0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
+       0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
+       0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
+       0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
+       0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
+       0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
+       0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
+       0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
+       0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
+       0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
+       // Block 0x8, offset 0x200
+       0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
+       0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
+       0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
+       0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
+       0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
+       0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
+       0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
+       0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
+       0x234: 0x000a, 0x235: 0x000a,
+       0x23e: 0x000a,
+       // Block 0x9, offset 0x240
+       0x244: 0x000a, 0x245: 0x000a,
+       0x247: 0x000a,
+       // Block 0xa, offset 0x280
+       0x2b6: 0x000a,
+       // Block 0xb, offset 0x2c0
+       0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
+       0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
+       // Block 0xc, offset 0x300
+       0x30a: 0x000a,
+       0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
+       0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
+       0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
+       0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
+       0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
+       0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
+       0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
+       0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
+       0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
+       // Block 0xd, offset 0x340
+       0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
+       0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
+       0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
+       0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
+       0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
+       0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
+       0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
+       0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
+       0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
+       0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
+       0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
+       // Block 0xe, offset 0x380
+       0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
+       0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
+       0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
+       0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
+       0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
+       0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
+       0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
+       0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
+       0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
+       0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
+       0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
+       0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
+       0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
+       0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
+       0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
+       0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
+       0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
+       0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
+       0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
+       0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
+       0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
+       // Block 0x10, offset 0x400
+       0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
+       0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
+       0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
+       0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
+       0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
+       0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
+       0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
+       0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
+       0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
+       0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
+       0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
+       // Block 0x11, offset 0x440
+       0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
+       0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
+       0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
+       0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
+       0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
+       0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
+       0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
+       0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
+       0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
+       0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
+       0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
+       // Block 0x12, offset 0x480
+       0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
+       0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
+       0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
+       0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
+       0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
+       0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
+       0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
+       0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
+       0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
+       0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
+       0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
+       0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
+       0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
+       0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
+       0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
+       0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
+       0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
+       0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
+       0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
+       0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
+       0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
+       // Block 0x14, offset 0x500
+       0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
+       0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
+       0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
+       0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
+       0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
+       0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
+       0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
+       0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
+       0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
+       0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
+       0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
+       // Block 0x15, offset 0x540
+       0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
+       0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
+       0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
+       0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
+       0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
+       0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
+       0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
+       0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
+       0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
+       0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
+       0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001,
+       // Block 0x16, offset 0x580
+       0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
+       0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
+       0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
+       0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
+       0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
+       0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
+       0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
+       0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
+       0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
+       0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
+       0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
+       0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
+       0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
+       0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
+       0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
+       0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d,
+       0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d,
+       0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d,
+       0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,
+       0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,
+       0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,
+       // Block 0x18, offset 0x600
+       0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,
+       0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,
+       0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,
+       0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
+       0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,
+       0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
+       0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
+       0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
+       0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
+       0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
+       0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
+       // Block 0x19, offset 0x640
+       0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
+       0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,
+       0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,
+       0x652: 0x000d, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
+       0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
+       0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
+       0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
+       0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
+       0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
+       0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
+       0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
+       // Block 0x1a, offset 0x680
+       0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
+       0x6ba: 0x000c,
+       0x6bc: 0x000c,
+       // Block 0x1b, offset 0x6c0
+       0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
+       0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
+       0x6cd: 0x000c, 0x6d1: 0x000c,
+       0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
+       0x6e2: 0x000c, 0x6e3: 0x000c,
+       // Block 0x1c, offset 0x700
+       0x701: 0x000c,
+       0x73c: 0x000c,
+       // Block 0x1d, offset 0x740
+       0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
+       0x74d: 0x000c,
+       0x762: 0x000c, 0x763: 0x000c,
+       0x772: 0x0004, 0x773: 0x0004,
+       0x77b: 0x0004,
+       0x77e: 0x000c,
+       // Block 0x1e, offset 0x780
+       0x781: 0x000c, 0x782: 0x000c,
+       0x7bc: 0x000c,
+       // Block 0x1f, offset 0x7c0
+       0x7c1: 0x000c, 0x7c2: 0x000c,
+       0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
+       0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
+       0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
+       // Block 0x20, offset 0x800
+       0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
+       0x807: 0x000c, 0x808: 0x000c,
+       0x80d: 0x000c,
+       0x822: 0x000c, 0x823: 0x000c,
+       0x831: 0x0004,
+       0x83a: 0x000c, 0x83b: 0x000c,
+       0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c,
+       // Block 0x21, offset 0x840
+       0x841: 0x000c,
+       0x87c: 0x000c, 0x87f: 0x000c,
+       // Block 0x22, offset 0x880
+       0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
+       0x88d: 0x000c,
+       0x896: 0x000c,
+       0x8a2: 0x000c, 0x8a3: 0x000c,
+       // Block 0x23, offset 0x8c0
+       0x8c2: 0x000c,
+       // Block 0x24, offset 0x900
+       0x900: 0x000c,
+       0x90d: 0x000c,
+       0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
+       0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
+       // Block 0x25, offset 0x940
+       0x940: 0x000c, 0x944: 0x000c,
+       0x97e: 0x000c, 0x97f: 0x000c,
+       // Block 0x26, offset 0x980
+       0x980: 0x000c,
+       0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
+       0x98c: 0x000c, 0x98d: 0x000c,
+       0x995: 0x000c, 0x996: 0x000c,
+       0x9a2: 0x000c, 0x9a3: 0x000c,
+       0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
+       0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
+       // Block 0x27, offset 0x9c0
+       0x9cc: 0x000c, 0x9cd: 0x000c,
+       0x9e2: 0x000c, 0x9e3: 0x000c,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x000c, 0xa01: 0x000c,
+       0xa3b: 0x000c,
+       0xa3c: 0x000c,
+       // Block 0x29, offset 0xa40
+       0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
+       0xa4d: 0x000c,
+       0xa62: 0x000c, 0xa63: 0x000c,
+       // Block 0x2a, offset 0xa80
+       0xa8a: 0x000c,
+       0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,
+       // Block 0x2b, offset 0xac0
+       0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,
+       0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,
+       0xaff: 0x0004,
+       // Block 0x2c, offset 0xb00
+       0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,
+       0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,
+       // Block 0x2d, offset 0xb40
+       0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,
+       0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,
+       0xb7c: 0x000c,
+       // Block 0x2e, offset 0xb80
+       0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,
+       0xb8c: 0x000c, 0xb8d: 0x000c,
+       // Block 0x2f, offset 0xbc0
+       0xbd8: 0x000c, 0xbd9: 0x000c,
+       0xbf5: 0x000c,
+       0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,
+       0xbfc: 0x003a, 0xbfd: 0x002a,
+       // Block 0x30, offset 0xc00
+       0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,
+       0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,
+       0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,
+       0xc46: 0x000c, 0xc47: 0x000c,
+       0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,
+       0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,
+       0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,
+       0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,
+       0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,
+       0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,
+       0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
+       0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
+       0xc7c: 0x000c,
+       // Block 0x32, offset 0xc80
+       0xc86: 0x000c,
+       // Block 0x33, offset 0xcc0
+       0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,
+       0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,
+       0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,
+       0xcfd: 0x000c, 0xcfe: 0x000c,
+       // Block 0x34, offset 0xd00
+       0xd18: 0x000c, 0xd19: 0x000c,
+       0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,
+       0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,
+       // Block 0x35, offset 0xd40
+       0xd42: 0x000c, 0xd45: 0x000c,
+       0xd46: 0x000c,
+       0xd4d: 0x000c,
+       0xd5d: 0x000c,
+       // Block 0x36, offset 0xd80
+       0xd9d: 0x000c,
+       0xd9e: 0x000c, 0xd9f: 0x000c,
+       // Block 0x37, offset 0xdc0
+       0xdd0: 0x000a, 0xdd1: 0x000a,
+       0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,
+       0xdd8: 0x000a, 0xdd9: 0x000a,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x000a,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x0009,
+       0xe5b: 0x007a, 0xe5c: 0x006a,
+       // Block 0x3a, offset 0xe80
+       0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,
+       0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,
+       // Block 0x3b, offset 0xec0
+       0xed2: 0x000c, 0xed3: 0x000c,
+       0xef2: 0x000c, 0xef3: 0x000c,
+       // Block 0x3c, offset 0xf00
+       0xf34: 0x000c, 0xf35: 0x000c,
+       0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,
+       0xf3c: 0x000c, 0xf3d: 0x000c,
+       // Block 0x3d, offset 0xf40
+       0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,
+       0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,
+       0xf52: 0x000c, 0xf53: 0x000c,
+       0xf5b: 0x0004, 0xf5d: 0x000c,
+       0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,
+       0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,
+       0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,
+       0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,
+       // Block 0x3f, offset 0xfc0
+       0xfc5: 0x000c,
+       0xfc6: 0x000c,
+       0xfe9: 0x000c,
+       // Block 0x40, offset 0x1000
+       0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,
+       0x1027: 0x000c, 0x1028: 0x000c,
+       0x1032: 0x000c,
+       0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,
+       // Block 0x42, offset 0x1080
+       0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,
+       0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,
+       0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,
+       0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,
+       0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,
+       0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,
+       // Block 0x43, offset 0x10c0
+       0x10d7: 0x000c,
+       0x10d8: 0x000c, 0x10db: 0x000c,
+       // Block 0x44, offset 0x1100
+       0x1116: 0x000c,
+       0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,
+       0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,
+       0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,
+       0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,
+       0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,
+       0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,
+       0x113c: 0x000c, 0x113f: 0x000c,
+       // Block 0x45, offset 0x1140
+       0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
+       0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
+       0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,
+       0x11b4: 0x000c,
+       0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,
+       0x11bc: 0x000c,
+       // Block 0x47, offset 0x11c0
+       0x11c2: 0x000c,
+       0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,
+       0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x000c, 0x1201: 0x000c,
+       0x1222: 0x000c, 0x1223: 0x000c,
+       0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,
+       0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,
+       // Block 0x49, offset 0x1240
+       0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,
+       0x126d: 0x000c, 0x126f: 0x000c,
+       0x1270: 0x000c, 0x1271: 0x000c,
+       // Block 0x4a, offset 0x1280
+       0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,
+       0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,
+       0x12b6: 0x000c, 0x12b7: 0x000c,
+       // Block 0x4b, offset 0x12c0
+       0x12d0: 0x000c, 0x12d1: 0x000c,
+       0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,
+       0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,
+       0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,
+       0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,
+       0x12ed: 0x000c,
+       0x12f4: 0x000c,
+       0x12f8: 0x000c, 0x12f9: 0x000c,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,
+       0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,
+       0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,
+       0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,
+       0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,
+       0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,
+       0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,
+       0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
+       0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,
+       0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c,
+       0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,
+       // Block 0x4d, offset 0x1340
+       0x137d: 0x000a, 0x137f: 0x000a,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x000a, 0x1381: 0x000a,
+       0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,
+       0x139d: 0x000a,
+       0x139e: 0x000a, 0x139f: 0x000a,
+       0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,
+       0x13bd: 0x000a, 0x13be: 0x000a,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,
+       0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,
+       0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,
+       0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,
+       0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,
+       0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,
+       0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,
+       0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,
+       0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,
+       0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,
+       0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,
+       0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,
+       0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,
+       0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
+       0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
+       0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,
+       0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,
+       0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,
+       0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,
+       0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,
+       0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,
+       0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,
+       0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,
+       0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,
+       0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,
+       0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,
+       0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,
+       0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,
+       0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,
+       0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,
+       0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,
+       0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,
+       0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,
+       0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,
+       0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,
+       0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,
+       0x14b0: 0x000c,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,
+       0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,
+       0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,
+       0x14d8: 0x000a,
+       0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,
+       0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,
+       0x14ee: 0x0004,
+       0x14fa: 0x000a, 0x14fb: 0x000a,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,
+       0x150a: 0x000a, 0x150b: 0x000a,
+       0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,
+       0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
+       0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,
+       0x151e: 0x000a, 0x151f: 0x000a,
+       // Block 0x55, offset 0x1540
+       0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,
+       0x1550: 0x000a, 0x1551: 0x000a,
+       0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
+       0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
+       0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,
+       0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,
+       0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,
+       0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,
+       0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,
+       0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,
+       0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
+       0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,
+       0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
+       0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
+       0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
+       0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
+       0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
+       0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
+       0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
+       0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
+       0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
+       0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
+       0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
+       0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
+       0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
+       0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
+       0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
+       0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
+       0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
+       0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
+       0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,
+       0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
+       0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
+       0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
+       0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
+       0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,
+       0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
+       0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
+       // Block 0x59, offset 0x1640
+       0x167b: 0x000a,
+       0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,
+       0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,
+       0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,
+       0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,
+       0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,
+       0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,
+       0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,
+       0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,
+       0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,
+       0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,
+       0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
+       0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
+       0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
+       0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
+       0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
+       0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
+       0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
+       0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a,
+       0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
+       0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a,
+       0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a,
+       0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a,
+       0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a,
+       0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
+       0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002,
+       0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002,
+       0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002,
+       0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002,
+       // Block 0x5e, offset 0x1780
+       0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a,
+       0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a,
+       0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a,
+       0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a,
+       // Block 0x5f, offset 0x17c0
+       0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a,
+       0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a,
+       0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a,
+       0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a,
+       0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a,
+       0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a,
+       0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a,
+       0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
+       0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
+       0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
+       0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
+       0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
+       0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
+       0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
+       0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
+       0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
+       0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a,
+       0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a,
+       0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a,
+       0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
+       0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a,
+       0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
+       0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
+       0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
+       0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
+       0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
+       0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a,
+       0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
+       0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a,
+       0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
+       0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a,
+       0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a,
+       0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a,
+       0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba,
+       0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
+       0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
+       0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a,
+       0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a,
+       0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
+       0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
+       0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a,
+       0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a,
+       0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a,
+       0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a,
+       0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a,
+       0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
+       0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
+       0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
+       0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
+       0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
+       0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
+       0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
+       0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
+       0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
+       0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a,
+       0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
+       0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
+       0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
+       0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a,
+       0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
+       0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
+       0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
+       0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
+       0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a,
+       0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
+       0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
+       0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
+       0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
+       0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a,
+       0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a,
+       0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
+       0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
+       0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
+       0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1996: 0x000a, 0x1997: 0x000a,
+       0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a,
+       0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a,
+       0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a,
+       0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
+       0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a,
+       0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a,
+       0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a,
+       // Block 0x67, offset 0x19c0
+       0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a,
+       0x19ea: 0x000a, 0x19ef: 0x000c,
+       0x19f0: 0x000c, 0x19f1: 0x000c,
+       0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a,
+       0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a,
+       // Block 0x68, offset 0x1a00
+       0x1a3f: 0x000c,
+       // Block 0x69, offset 0x1a40
+       0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c,
+       0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c,
+       0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c,
+       0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c,
+       0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c,
+       0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c,
+       // Block 0x6a, offset 0x1a80
+       0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a,
+       0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a,
+       0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a,
+       0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a,
+       0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a,
+       0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a,
+       0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a,
+       0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a,
+       0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a,
+       0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a,
+       0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
+       0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a,
+       0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a,
+       0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a,
+       0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a,
+       0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a,
+       0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a,
+       0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a,
+       0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a,
+       0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a,
+       0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a,
+       0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a,
+       0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
+       0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
+       0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
+       0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
+       0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
+       0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
+       0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
+       0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
+       0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
+       0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
+       0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
+       0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a,
+       0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a,
+       0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a,
+       0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a,
+       0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a,
+       0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a,
+       0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a,
+       0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a,
+       0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c,
+       0x1bf0: 0x000a,
+       0x1bf6: 0x000a, 0x1bf7: 0x000a,
+       0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a,
+       // Block 0x70, offset 0x1c00
+       0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a,
+       0x1c20: 0x000a,
+       // Block 0x71, offset 0x1c40
+       0x1c7b: 0x000a,
+       // Block 0x72, offset 0x1c80
+       0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a,
+       0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a,
+       0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a,
+       0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a,
+       0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a,
+       0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a,
+       // Block 0x73, offset 0x1cc0
+       0x1cdd: 0x000a,
+       0x1cde: 0x000a,
+       // Block 0x74, offset 0x1d00
+       0x1d10: 0x000a, 0x1d11: 0x000a,
+       0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a,
+       0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a,
+       0x1d1e: 0x000a, 0x1d1f: 0x000a,
+       0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a,
+       // Block 0x75, offset 0x1d40
+       0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a,
+       0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a,
+       0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a,
+       // Block 0x76, offset 0x1d80
+       0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a,
+       // Block 0x77, offset 0x1dc0
+       0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a,
+       // Block 0x78, offset 0x1e00
+       0x1e1e: 0x000a, 0x1e1f: 0x000a,
+       0x1e3f: 0x000a,
+       // Block 0x79, offset 0x1e40
+       0x1e50: 0x000a, 0x1e51: 0x000a,
+       0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a,
+       0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a,
+       0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a,
+       0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a,
+       0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a,
+       0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a,
+       0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a,
+       0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a,
+       // Block 0x7a, offset 0x1e80
+       0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a,
+       0x1e86: 0x000a,
+       // Block 0x7b, offset 0x1ec0
+       0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a,
+       // Block 0x7c, offset 0x1f00
+       0x1f2f: 0x000c,
+       0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c,
+       0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c,
+       0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a,
+       // Block 0x7d, offset 0x1f40
+       0x1f5e: 0x000c, 0x1f5f: 0x000c,
+       // Block 0x7e, offset 0x1f80
+       0x1fb0: 0x000c, 0x1fb1: 0x000c,
+       // Block 0x7f, offset 0x1fc0
+       0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a,
+       0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a,
+       0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a,
+       0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a,
+       0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a,
+       0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a,
+       // Block 0x80, offset 0x2000
+       0x2008: 0x000a,
+       // Block 0x81, offset 0x2040
+       0x2042: 0x000c,
+       0x2046: 0x000c, 0x204b: 0x000c,
+       0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a,
+       0x206a: 0x000a, 0x206b: 0x000a,
+       0x2078: 0x0004, 0x2079: 0x0004,
+       // Block 0x82, offset 0x2080
+       0x20b4: 0x000a, 0x20b5: 0x000a,
+       0x20b6: 0x000a, 0x20b7: 0x000a,
+       // Block 0x83, offset 0x20c0
+       0x20c4: 0x000c, 0x20c5: 0x000c,
+       0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c,
+       0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c,
+       0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c,
+       0x20f0: 0x000c, 0x20f1: 0x000c,
+       0x20ff: 0x000c,
+       // Block 0x84, offset 0x2100
+       0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
+       0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c,
+       // Block 0x85, offset 0x2140
+       0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c,
+       0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c,
+       // Block 0x86, offset 0x2180
+       0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c,
+       0x21b3: 0x000c,
+       0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c,
+       0x21bc: 0x000c,
+       // Block 0x87, offset 0x21c0
+       0x21e5: 0x000c,
+       // Block 0x88, offset 0x2200
+       0x2229: 0x000c,
+       0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c,
+       0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c,
+       0x2236: 0x000c,
+       // Block 0x89, offset 0x2240
+       0x2243: 0x000c,
+       0x224c: 0x000c,
+       0x227c: 0x000c,
+       // Block 0x8a, offset 0x2280
+       0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c,
+       0x22b7: 0x000c, 0x22b8: 0x000c,
+       0x22be: 0x000c, 0x22bf: 0x000c,
+       // Block 0x8b, offset 0x22c0
+       0x22c1: 0x000c,
+       0x22ec: 0x000c, 0x22ed: 0x000c,
+       0x22f6: 0x000c,
+       // Block 0x8c, offset 0x2300
+       0x2325: 0x000c, 0x2328: 0x000c,
+       0x232d: 0x000c,
+       // Block 0x8d, offset 0x2340
+       0x235d: 0x0001,
+       0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001,
+       0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003,
+       0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001,
+       0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001,
+       0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001,
+       0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001,
+       // Block 0x8e, offset 0x2380
+       0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001,
+       0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001,
+       0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d,
+       0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d,
+       0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d,
+       0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d,
+       0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d,
+       0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d,
+       0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d,
+       0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d,
+       0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d,
+       // Block 0x8f, offset 0x23c0
+       0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d,
+       0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d,
+       0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d,
+       0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
+       0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
+       0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
+       0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
+       0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
+       0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
+       0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
+       0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a,
+       // Block 0x90, offset 0x2400
+       0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
+       0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
+       0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b,
+       0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b,
+       0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b,
+       0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b,
+       0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b,
+       0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b,
+       0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
+       0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
+       0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d,
+       // Block 0x91, offset 0x2440
+       0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c,
+       0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c,
+       0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a,
+       0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a,
+       0x2458: 0x000a, 0x2459: 0x000a,
+       0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c,
+       0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c,
+       0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c,
+       0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a,
+       0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a,
+       0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a,
+       // Block 0x92, offset 0x2480
+       0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a,
+       0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a,
+       0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a,
+       0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a,
+       0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a,
+       0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003,
+       0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004,
+       0x24aa: 0x0004, 0x24ab: 0x000a,
+       0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d,
+       0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d,
+       0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d,
+       // Block 0x93, offset 0x24c0
+       0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d,
+       0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d,
+       0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d,
+       0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d,
+       0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d,
+       0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d,
+       0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d,
+       0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d,
+       0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,
+       0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,
+       0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b,
+       // Block 0x94, offset 0x2500
+       0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004,
+       0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003,
+       0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002,
+       0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002,
+       0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a,
+       0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a,
+       0x253b: 0x005a,
+       0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a,
+       // Block 0x95, offset 0x2540
+       0x2540: 0x000a,
+       0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a,
+       0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a,
+       0x2564: 0x000a, 0x2565: 0x000a,
+       // Block 0x96, offset 0x2580
+       0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a,
+       0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a,
+       0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a,
+       0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b,
+       0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a,
+       0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b,
+       // Block 0x97, offset 0x25c0
+       0x25c1: 0x000a,
+       // Block 0x98, offset 0x2600
+       0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a,
+       0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a,
+       0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a,
+       0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a,
+       0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a,
+       0x2620: 0x000a,
+       // Block 0x99, offset 0x2640
+       0x267d: 0x000c,
+       // Block 0x9a, offset 0x2680
+       0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002,
+       0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002,
+       0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002,
+       0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002,
+       0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002,
+       // Block 0x9b, offset 0x26c0
+       0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c,
+       // Block 0x9c, offset 0x2700
+       0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001,
+       0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001,
+       0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001,
+       0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001,
+       0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001,
+       0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001,
+       0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001,
+       0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001,
+       0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001,
+       0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001,
+       0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001,
+       // Block 0x9d, offset 0x2740
+       0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,
+       0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,
+       0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,
+       0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,
+       0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,
+       0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,
+       0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,
+       0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,
+       0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,
+       0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,
+       0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,
+       // Block 0x9e, offset 0x2780
+       0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c,
+       0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
+       0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001,
+       0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
+       0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
+       0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
+       0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
+       0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
+       0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
+       0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001,
+       0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c,
+       // Block 0x9f, offset 0x27c0
+       0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001,
+       0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
+       0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001,
+       0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
+       0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
+       0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
+       0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
+       0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
+       0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
+       0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001,
+       0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001,
+       // Block 0xa0, offset 0x2800
+       0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,
+       0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
+       0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,
+       0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
+       0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
+       0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
+       0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
+       0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
+       0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
+       0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a,
+       0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a,
+       // Block 0xa1, offset 0x2840
+       0x2840: 0x000d, 0x2841: 0x000d, 0x2842: 0x000d, 0x2843: 0x000d, 0x2844: 0x000d, 0x2845: 0x000d,
+       0x2846: 0x000d, 0x2847: 0x000d, 0x2848: 0x000d, 0x2849: 0x000d, 0x284a: 0x000d, 0x284b: 0x000d,
+       0x284c: 0x000d, 0x284d: 0x000d, 0x284e: 0x000d, 0x284f: 0x000d, 0x2850: 0x000d, 0x2851: 0x000d,
+       0x2852: 0x000d, 0x2853: 0x000d, 0x2854: 0x000d, 0x2855: 0x000d, 0x2856: 0x000d, 0x2857: 0x000d,
+       0x2858: 0x000d, 0x2859: 0x000d, 0x285a: 0x000d, 0x285b: 0x000d, 0x285c: 0x000d, 0x285d: 0x000d,
+       0x285e: 0x000d, 0x285f: 0x000d, 0x2860: 0x000d, 0x2861: 0x000d, 0x2862: 0x000d, 0x2863: 0x000d,
+       0x2864: 0x000c, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x000c, 0x2868: 0x000d, 0x2869: 0x000d,
+       0x286a: 0x000d, 0x286b: 0x000d, 0x286c: 0x000d, 0x286d: 0x000d, 0x286e: 0x000d, 0x286f: 0x000d,
+       0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005,
+       0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x000d, 0x287b: 0x000d,
+       0x287c: 0x000d, 0x287d: 0x000d, 0x287e: 0x000d, 0x287f: 0x000d,
+       // Block 0xa2, offset 0x2880
+       0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001,
+       0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001,
+       0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001,
+       0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001,
+       0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001,
+       0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005,
+       0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005,
+       0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005,
+       0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005,
+       0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005,
+       0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001,
+       // Block 0xa3, offset 0x28c0
+       0x28c0: 0x0001, 0x28c1: 0x0001, 0x28c2: 0x0001, 0x28c3: 0x0001, 0x28c4: 0x0001, 0x28c5: 0x0001,
+       0x28c6: 0x0001, 0x28c7: 0x0001, 0x28c8: 0x0001, 0x28c9: 0x0001, 0x28ca: 0x0001, 0x28cb: 0x0001,
+       0x28cc: 0x0001, 0x28cd: 0x0001, 0x28ce: 0x0001, 0x28cf: 0x0001, 0x28d0: 0x0001, 0x28d1: 0x0001,
+       0x28d2: 0x0001, 0x28d3: 0x0001, 0x28d4: 0x0001, 0x28d5: 0x0001, 0x28d6: 0x0001, 0x28d7: 0x0001,
+       0x28d8: 0x0001, 0x28d9: 0x0001, 0x28da: 0x0001, 0x28db: 0x0001, 0x28dc: 0x0001, 0x28dd: 0x0001,
+       0x28de: 0x0001, 0x28df: 0x0001, 0x28e0: 0x0001, 0x28e1: 0x0001, 0x28e2: 0x0001, 0x28e3: 0x0001,
+       0x28e4: 0x0001, 0x28e5: 0x0001, 0x28e6: 0x0001, 0x28e7: 0x0001, 0x28e8: 0x0001, 0x28e9: 0x0001,
+       0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001,
+       0x28f0: 0x000d, 0x28f1: 0x000d, 0x28f2: 0x000d, 0x28f3: 0x000d, 0x28f4: 0x000d, 0x28f5: 0x000d,
+       0x28f6: 0x000d, 0x28f7: 0x000d, 0x28f8: 0x000d, 0x28f9: 0x000d, 0x28fa: 0x000d, 0x28fb: 0x000d,
+       0x28fc: 0x000d, 0x28fd: 0x000d, 0x28fe: 0x000d, 0x28ff: 0x000d,
+       // Block 0xa4, offset 0x2900
+       0x2900: 0x000d, 0x2901: 0x000d, 0x2902: 0x000d, 0x2903: 0x000d, 0x2904: 0x000d, 0x2905: 0x000d,
+       0x2906: 0x000c, 0x2907: 0x000c, 0x2908: 0x000c, 0x2909: 0x000c, 0x290a: 0x000c, 0x290b: 0x000c,
+       0x290c: 0x000c, 0x290d: 0x000c, 0x290e: 0x000c, 0x290f: 0x000c, 0x2910: 0x000c, 0x2911: 0x000d,
+       0x2912: 0x000d, 0x2913: 0x000d, 0x2914: 0x000d, 0x2915: 0x000d, 0x2916: 0x000d, 0x2917: 0x000d,
+       0x2918: 0x000d, 0x2919: 0x000d, 0x291a: 0x000d, 0x291b: 0x000d, 0x291c: 0x000d, 0x291d: 0x000d,
+       0x291e: 0x000d, 0x291f: 0x000d, 0x2920: 0x000d, 0x2921: 0x000d, 0x2922: 0x000d, 0x2923: 0x000d,
+       0x2924: 0x000d, 0x2925: 0x000d, 0x2926: 0x000d, 0x2927: 0x000d, 0x2928: 0x000d, 0x2929: 0x000d,
+       0x292a: 0x000d, 0x292b: 0x000d, 0x292c: 0x000d, 0x292d: 0x000d, 0x292e: 0x000d, 0x292f: 0x000d,
+       0x2930: 0x0001, 0x2931: 0x0001, 0x2932: 0x0001, 0x2933: 0x0001, 0x2934: 0x0001, 0x2935: 0x0001,
+       0x2936: 0x0001, 0x2937: 0x0001, 0x2938: 0x0001, 0x2939: 0x0001, 0x293a: 0x0001, 0x293b: 0x0001,
+       0x293c: 0x0001, 0x293d: 0x0001, 0x293e: 0x0001, 0x293f: 0x0001,
+       // Block 0xa5, offset 0x2940
+       0x2941: 0x000c,
+       0x2978: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, 0x297b: 0x000c,
+       0x297c: 0x000c, 0x297d: 0x000c, 0x297e: 0x000c, 0x297f: 0x000c,
+       // Block 0xa6, offset 0x2980
+       0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, 0x2983: 0x000c, 0x2984: 0x000c, 0x2985: 0x000c,
+       0x2986: 0x000c,
+       0x2992: 0x000a, 0x2993: 0x000a, 0x2994: 0x000a, 0x2995: 0x000a, 0x2996: 0x000a, 0x2997: 0x000a,
+       0x2998: 0x000a, 0x2999: 0x000a, 0x299a: 0x000a, 0x299b: 0x000a, 0x299c: 0x000a, 0x299d: 0x000a,
+       0x299e: 0x000a, 0x299f: 0x000a, 0x29a0: 0x000a, 0x29a1: 0x000a, 0x29a2: 0x000a, 0x29a3: 0x000a,
+       0x29a4: 0x000a, 0x29a5: 0x000a,
+       0x29bf: 0x000c,
+       // Block 0xa7, offset 0x29c0
+       0x29c0: 0x000c, 0x29c1: 0x000c,
+       0x29f3: 0x000c, 0x29f4: 0x000c, 0x29f5: 0x000c,
+       0x29f6: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c,
+       // Block 0xa8, offset 0x2a00
+       0x2a00: 0x000c, 0x2a01: 0x000c, 0x2a02: 0x000c,
+       0x2a27: 0x000c, 0x2a28: 0x000c, 0x2a29: 0x000c,
+       0x2a2a: 0x000c, 0x2a2b: 0x000c, 0x2a2d: 0x000c, 0x2a2e: 0x000c, 0x2a2f: 0x000c,
+       0x2a30: 0x000c, 0x2a31: 0x000c, 0x2a32: 0x000c, 0x2a33: 0x000c, 0x2a34: 0x000c,
+       // Block 0xa9, offset 0x2a40
+       0x2a73: 0x000c,
+       // Block 0xaa, offset 0x2a80
+       0x2a80: 0x000c, 0x2a81: 0x000c,
+       0x2ab6: 0x000c, 0x2ab7: 0x000c, 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c,
+       0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c,
+       // Block 0xab, offset 0x2ac0
+       0x2ac9: 0x000c, 0x2aca: 0x000c, 0x2acb: 0x000c,
+       0x2acc: 0x000c,
+       // Block 0xac, offset 0x2b00
+       0x2b2f: 0x000c,
+       0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b34: 0x000c,
+       0x2b36: 0x000c, 0x2b37: 0x000c,
+       0x2b3e: 0x000c,
+       // Block 0xad, offset 0x2b40
+       0x2b5f: 0x000c, 0x2b63: 0x000c,
+       0x2b64: 0x000c, 0x2b65: 0x000c, 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c,
+       0x2b6a: 0x000c,
+       // Block 0xae, offset 0x2b80
+       0x2b80: 0x000c,
+       0x2ba6: 0x000c, 0x2ba7: 0x000c, 0x2ba8: 0x000c, 0x2ba9: 0x000c,
+       0x2baa: 0x000c, 0x2bab: 0x000c, 0x2bac: 0x000c,
+       0x2bb0: 0x000c, 0x2bb1: 0x000c, 0x2bb2: 0x000c, 0x2bb3: 0x000c, 0x2bb4: 0x000c,
+       // Block 0xaf, offset 0x2bc0
+       0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c,
+       0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, 0x2bff: 0x000c,
+       // Block 0xb0, offset 0x2c00
+       0x2c02: 0x000c, 0x2c03: 0x000c, 0x2c04: 0x000c,
+       0x2c06: 0x000c,
+       0x2c1e: 0x000c,
+       // Block 0xb1, offset 0x2c40
+       0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c,
+       0x2c76: 0x000c, 0x2c77: 0x000c, 0x2c78: 0x000c, 0x2c7a: 0x000c,
+       0x2c7f: 0x000c,
+       // Block 0xb2, offset 0x2c80
+       0x2c80: 0x000c, 0x2c82: 0x000c, 0x2c83: 0x000c,
+       // Block 0xb3, offset 0x2cc0
+       0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c,
+       0x2cfc: 0x000c, 0x2cfd: 0x000c, 0x2cff: 0x000c,
+       // Block 0xb4, offset 0x2d00
+       0x2d00: 0x000c,
+       0x2d1c: 0x000c, 0x2d1d: 0x000c,
+       // Block 0xb5, offset 0x2d40
+       0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c,
+       0x2d76: 0x000c, 0x2d77: 0x000c, 0x2d78: 0x000c, 0x2d79: 0x000c, 0x2d7a: 0x000c,
+       0x2d7d: 0x000c, 0x2d7f: 0x000c,
+       // Block 0xb6, offset 0x2d80
+       0x2d80: 0x000c,
+       0x2da0: 0x000a, 0x2da1: 0x000a, 0x2da2: 0x000a, 0x2da3: 0x000a,
+       0x2da4: 0x000a, 0x2da5: 0x000a, 0x2da6: 0x000a, 0x2da7: 0x000a, 0x2da8: 0x000a, 0x2da9: 0x000a,
+       0x2daa: 0x000a, 0x2dab: 0x000a, 0x2dac: 0x000a,
+       // Block 0xb7, offset 0x2dc0
+       0x2deb: 0x000c, 0x2ded: 0x000c,
+       0x2df0: 0x000c, 0x2df1: 0x000c, 0x2df2: 0x000c, 0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c,
+       0x2df7: 0x000c,
+       // Block 0xb8, offset 0x2e00
+       0x2e1d: 0x000c,
+       0x2e1e: 0x000c, 0x2e1f: 0x000c, 0x2e22: 0x000c, 0x2e23: 0x000c,
+       0x2e24: 0x000c, 0x2e25: 0x000c, 0x2e27: 0x000c, 0x2e28: 0x000c, 0x2e29: 0x000c,
+       0x2e2a: 0x000c, 0x2e2b: 0x000c,
+       // Block 0xb9, offset 0x2e40
+       0x2e6f: 0x000c,
+       0x2e70: 0x000c, 0x2e71: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e74: 0x000c, 0x2e75: 0x000c,
+       0x2e76: 0x000c, 0x2e77: 0x000c, 0x2e79: 0x000c, 0x2e7a: 0x000c,
+       // Block 0xba, offset 0x2e80
+       0x2e81: 0x000c, 0x2e82: 0x000c, 0x2e83: 0x000c, 0x2e84: 0x000c, 0x2e85: 0x000c,
+       0x2e86: 0x000c, 0x2e89: 0x000c, 0x2e8a: 0x000c,
+       0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c,
+       0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2ebb: 0x000c,
+       0x2ebc: 0x000c, 0x2ebd: 0x000c, 0x2ebe: 0x000c,
+       // Block 0xbb, offset 0x2ec0
+       0x2ec7: 0x000c,
+       0x2ed1: 0x000c,
+       0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c,
+       0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c,
+       // Block 0xbc, offset 0x2f00
+       0x2f0a: 0x000c, 0x2f0b: 0x000c,
+       0x2f0c: 0x000c, 0x2f0d: 0x000c, 0x2f0e: 0x000c, 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c,
+       0x2f12: 0x000c, 0x2f13: 0x000c, 0x2f14: 0x000c, 0x2f15: 0x000c, 0x2f16: 0x000c,
+       0x2f18: 0x000c, 0x2f19: 0x000c,
+       // Block 0xbd, offset 0x2f40
+       0x2f70: 0x000c, 0x2f71: 0x000c, 0x2f72: 0x000c, 0x2f73: 0x000c, 0x2f74: 0x000c, 0x2f75: 0x000c,
+       0x2f76: 0x000c, 0x2f78: 0x000c, 0x2f79: 0x000c, 0x2f7a: 0x000c, 0x2f7b: 0x000c,
+       0x2f7c: 0x000c, 0x2f7d: 0x000c,
+       // Block 0xbe, offset 0x2f80
+       0x2f92: 0x000c, 0x2f93: 0x000c, 0x2f94: 0x000c, 0x2f95: 0x000c, 0x2f96: 0x000c, 0x2f97: 0x000c,
+       0x2f98: 0x000c, 0x2f99: 0x000c, 0x2f9a: 0x000c, 0x2f9b: 0x000c, 0x2f9c: 0x000c, 0x2f9d: 0x000c,
+       0x2f9e: 0x000c, 0x2f9f: 0x000c, 0x2fa0: 0x000c, 0x2fa1: 0x000c, 0x2fa2: 0x000c, 0x2fa3: 0x000c,
+       0x2fa4: 0x000c, 0x2fa5: 0x000c, 0x2fa6: 0x000c, 0x2fa7: 0x000c,
+       0x2faa: 0x000c, 0x2fab: 0x000c, 0x2fac: 0x000c, 0x2fad: 0x000c, 0x2fae: 0x000c, 0x2faf: 0x000c,
+       0x2fb0: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb5: 0x000c,
+       0x2fb6: 0x000c,
+       // Block 0xbf, offset 0x2fc0
+       0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c,
+       0x2ff6: 0x000c, 0x2ffa: 0x000c,
+       0x2ffc: 0x000c, 0x2ffd: 0x000c, 0x2fff: 0x000c,
+       // Block 0xc0, offset 0x3000
+       0x3000: 0x000c, 0x3001: 0x000c, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000c,
+       0x3007: 0x000c,
+       // Block 0xc1, offset 0x3040
+       0x3050: 0x000c, 0x3051: 0x000c,
+       0x3055: 0x000c, 0x3057: 0x000c,
+       // Block 0xc2, offset 0x3080
+       0x30b3: 0x000c, 0x30b4: 0x000c,
+       // Block 0xc3, offset 0x30c0
+       0x30f0: 0x000c, 0x30f1: 0x000c, 0x30f2: 0x000c, 0x30f3: 0x000c, 0x30f4: 0x000c,
+       // Block 0xc4, offset 0x3100
+       0x3130: 0x000c, 0x3131: 0x000c, 0x3132: 0x000c, 0x3133: 0x000c, 0x3134: 0x000c, 0x3135: 0x000c,
+       0x3136: 0x000c,
+       // Block 0xc5, offset 0x3140
+       0x314f: 0x000c, 0x3150: 0x000c, 0x3151: 0x000c,
+       0x3152: 0x000c,
+       // Block 0xc6, offset 0x3180
+       0x319d: 0x000c,
+       0x319e: 0x000c, 0x31a0: 0x000b, 0x31a1: 0x000b, 0x31a2: 0x000b, 0x31a3: 0x000b,
+       // Block 0xc7, offset 0x31c0
+       0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c,
+       0x31f3: 0x000b, 0x31f4: 0x000b, 0x31f5: 0x000b,
+       0x31f6: 0x000b, 0x31f7: 0x000b, 0x31f8: 0x000b, 0x31f9: 0x000b, 0x31fa: 0x000b, 0x31fb: 0x000c,
+       0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c,
+       // Block 0xc8, offset 0x3200
+       0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3205: 0x000c,
+       0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c,
+       0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, 0x322d: 0x000c,
+       // Block 0xc9, offset 0x3240
+       0x3240: 0x000a, 0x3241: 0x000a, 0x3242: 0x000c, 0x3243: 0x000c, 0x3244: 0x000c, 0x3245: 0x000a,
+       // Block 0xca, offset 0x3280
+       0x3280: 0x000a, 0x3281: 0x000a, 0x3282: 0x000a, 0x3283: 0x000a, 0x3284: 0x000a, 0x3285: 0x000a,
+       0x3286: 0x000a, 0x3287: 0x000a, 0x3288: 0x000a, 0x3289: 0x000a, 0x328a: 0x000a, 0x328b: 0x000a,
+       0x328c: 0x000a, 0x328d: 0x000a, 0x328e: 0x000a, 0x328f: 0x000a, 0x3290: 0x000a, 0x3291: 0x000a,
+       0x3292: 0x000a, 0x3293: 0x000a, 0x3294: 0x000a, 0x3295: 0x000a, 0x3296: 0x000a,
+       // Block 0xcb, offset 0x32c0
+       0x32db: 0x000a,
+       // Block 0xcc, offset 0x3300
+       0x3315: 0x000a,
+       // Block 0xcd, offset 0x3340
+       0x334f: 0x000a,
+       // Block 0xce, offset 0x3380
+       0x3389: 0x000a,
+       // Block 0xcf, offset 0x33c0
+       0x33c3: 0x000a,
+       0x33ce: 0x0002, 0x33cf: 0x0002, 0x33d0: 0x0002, 0x33d1: 0x0002,
+       0x33d2: 0x0002, 0x33d3: 0x0002, 0x33d4: 0x0002, 0x33d5: 0x0002, 0x33d6: 0x0002, 0x33d7: 0x0002,
+       0x33d8: 0x0002, 0x33d9: 0x0002, 0x33da: 0x0002, 0x33db: 0x0002, 0x33dc: 0x0002, 0x33dd: 0x0002,
+       0x33de: 0x0002, 0x33df: 0x0002, 0x33e0: 0x0002, 0x33e1: 0x0002, 0x33e2: 0x0002, 0x33e3: 0x0002,
+       0x33e4: 0x0002, 0x33e5: 0x0002, 0x33e6: 0x0002, 0x33e7: 0x0002, 0x33e8: 0x0002, 0x33e9: 0x0002,
+       0x33ea: 0x0002, 0x33eb: 0x0002, 0x33ec: 0x0002, 0x33ed: 0x0002, 0x33ee: 0x0002, 0x33ef: 0x0002,
+       0x33f0: 0x0002, 0x33f1: 0x0002, 0x33f2: 0x0002, 0x33f3: 0x0002, 0x33f4: 0x0002, 0x33f5: 0x0002,
+       0x33f6: 0x0002, 0x33f7: 0x0002, 0x33f8: 0x0002, 0x33f9: 0x0002, 0x33fa: 0x0002, 0x33fb: 0x0002,
+       0x33fc: 0x0002, 0x33fd: 0x0002, 0x33fe: 0x0002, 0x33ff: 0x0002,
+       // Block 0xd0, offset 0x3400
+       0x3400: 0x000c, 0x3401: 0x000c, 0x3402: 0x000c, 0x3403: 0x000c, 0x3404: 0x000c, 0x3405: 0x000c,
+       0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x000c,
+       0x340c: 0x000c, 0x340d: 0x000c, 0x340e: 0x000c, 0x340f: 0x000c, 0x3410: 0x000c, 0x3411: 0x000c,
+       0x3412: 0x000c, 0x3413: 0x000c, 0x3414: 0x000c, 0x3415: 0x000c, 0x3416: 0x000c, 0x3417: 0x000c,
+       0x3418: 0x000c, 0x3419: 0x000c, 0x341a: 0x000c, 0x341b: 0x000c, 0x341c: 0x000c, 0x341d: 0x000c,
+       0x341e: 0x000c, 0x341f: 0x000c, 0x3420: 0x000c, 0x3421: 0x000c, 0x3422: 0x000c, 0x3423: 0x000c,
+       0x3424: 0x000c, 0x3425: 0x000c, 0x3426: 0x000c, 0x3427: 0x000c, 0x3428: 0x000c, 0x3429: 0x000c,
+       0x342a: 0x000c, 0x342b: 0x000c, 0x342c: 0x000c, 0x342d: 0x000c, 0x342e: 0x000c, 0x342f: 0x000c,
+       0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c,
+       0x3436: 0x000c, 0x343b: 0x000c,
+       0x343c: 0x000c, 0x343d: 0x000c, 0x343e: 0x000c, 0x343f: 0x000c,
+       // Block 0xd1, offset 0x3440
+       0x3440: 0x000c, 0x3441: 0x000c, 0x3442: 0x000c, 0x3443: 0x000c, 0x3444: 0x000c, 0x3445: 0x000c,
+       0x3446: 0x000c, 0x3447: 0x000c, 0x3448: 0x000c, 0x3449: 0x000c, 0x344a: 0x000c, 0x344b: 0x000c,
+       0x344c: 0x000c, 0x344d: 0x000c, 0x344e: 0x000c, 0x344f: 0x000c, 0x3450: 0x000c, 0x3451: 0x000c,
+       0x3452: 0x000c, 0x3453: 0x000c, 0x3454: 0x000c, 0x3455: 0x000c, 0x3456: 0x000c, 0x3457: 0x000c,
+       0x3458: 0x000c, 0x3459: 0x000c, 0x345a: 0x000c, 0x345b: 0x000c, 0x345c: 0x000c, 0x345d: 0x000c,
+       0x345e: 0x000c, 0x345f: 0x000c, 0x3460: 0x000c, 0x3461: 0x000c, 0x3462: 0x000c, 0x3463: 0x000c,
+       0x3464: 0x000c, 0x3465: 0x000c, 0x3466: 0x000c, 0x3467: 0x000c, 0x3468: 0x000c, 0x3469: 0x000c,
+       0x346a: 0x000c, 0x346b: 0x000c, 0x346c: 0x000c,
+       0x3475: 0x000c,
+       // Block 0xd2, offset 0x3480
+       0x3484: 0x000c,
+       0x349b: 0x000c, 0x349c: 0x000c, 0x349d: 0x000c,
+       0x349e: 0x000c, 0x349f: 0x000c, 0x34a1: 0x000c, 0x34a2: 0x000c, 0x34a3: 0x000c,
+       0x34a4: 0x000c, 0x34a5: 0x000c, 0x34a6: 0x000c, 0x34a7: 0x000c, 0x34a8: 0x000c, 0x34a9: 0x000c,
+       0x34aa: 0x000c, 0x34ab: 0x000c, 0x34ac: 0x000c, 0x34ad: 0x000c, 0x34ae: 0x000c, 0x34af: 0x000c,
+       // Block 0xd3, offset 0x34c0
+       0x34c0: 0x000c, 0x34c1: 0x000c, 0x34c2: 0x000c, 0x34c3: 0x000c, 0x34c4: 0x000c, 0x34c5: 0x000c,
+       0x34c6: 0x000c, 0x34c8: 0x000c, 0x34c9: 0x000c, 0x34ca: 0x000c, 0x34cb: 0x000c,
+       0x34cc: 0x000c, 0x34cd: 0x000c, 0x34ce: 0x000c, 0x34cf: 0x000c, 0x34d0: 0x000c, 0x34d1: 0x000c,
+       0x34d2: 0x000c, 0x34d3: 0x000c, 0x34d4: 0x000c, 0x34d5: 0x000c, 0x34d6: 0x000c, 0x34d7: 0x000c,
+       0x34d8: 0x000c, 0x34db: 0x000c, 0x34dc: 0x000c, 0x34dd: 0x000c,
+       0x34de: 0x000c, 0x34df: 0x000c, 0x34e0: 0x000c, 0x34e1: 0x000c, 0x34e3: 0x000c,
+       0x34e4: 0x000c, 0x34e6: 0x000c, 0x34e7: 0x000c, 0x34e8: 0x000c, 0x34e9: 0x000c,
+       0x34ea: 0x000c,
+       // Block 0xd4, offset 0x3500
+       0x3500: 0x0001, 0x3501: 0x0001, 0x3502: 0x0001, 0x3503: 0x0001, 0x3504: 0x0001, 0x3505: 0x0001,
+       0x3506: 0x0001, 0x3507: 0x0001, 0x3508: 0x0001, 0x3509: 0x0001, 0x350a: 0x0001, 0x350b: 0x0001,
+       0x350c: 0x0001, 0x350d: 0x0001, 0x350e: 0x0001, 0x350f: 0x0001, 0x3510: 0x000c, 0x3511: 0x000c,
+       0x3512: 0x000c, 0x3513: 0x000c, 0x3514: 0x000c, 0x3515: 0x000c, 0x3516: 0x000c, 0x3517: 0x0001,
+       0x3518: 0x0001, 0x3519: 0x0001, 0x351a: 0x0001, 0x351b: 0x0001, 0x351c: 0x0001, 0x351d: 0x0001,
+       0x351e: 0x0001, 0x351f: 0x0001, 0x3520: 0x0001, 0x3521: 0x0001, 0x3522: 0x0001, 0x3523: 0x0001,
+       0x3524: 0x0001, 0x3525: 0x0001, 0x3526: 0x0001, 0x3527: 0x0001, 0x3528: 0x0001, 0x3529: 0x0001,
+       0x352a: 0x0001, 0x352b: 0x0001, 0x352c: 0x0001, 0x352d: 0x0001, 0x352e: 0x0001, 0x352f: 0x0001,
+       0x3530: 0x0001, 0x3531: 0x0001, 0x3532: 0x0001, 0x3533: 0x0001, 0x3534: 0x0001, 0x3535: 0x0001,
+       0x3536: 0x0001, 0x3537: 0x0001, 0x3538: 0x0001, 0x3539: 0x0001, 0x353a: 0x0001, 0x353b: 0x0001,
+       0x353c: 0x0001, 0x353d: 0x0001, 0x353e: 0x0001, 0x353f: 0x0001,
+       // Block 0xd5, offset 0x3540
+       0x3540: 0x0001, 0x3541: 0x0001, 0x3542: 0x0001, 0x3543: 0x0001, 0x3544: 0x000c, 0x3545: 0x000c,
+       0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x0001,
+       0x354c: 0x0001, 0x354d: 0x0001, 0x354e: 0x0001, 0x354f: 0x0001, 0x3550: 0x0001, 0x3551: 0x0001,
+       0x3552: 0x0001, 0x3553: 0x0001, 0x3554: 0x0001, 0x3555: 0x0001, 0x3556: 0x0001, 0x3557: 0x0001,
+       0x3558: 0x0001, 0x3559: 0x0001, 0x355a: 0x0001, 0x355b: 0x0001, 0x355c: 0x0001, 0x355d: 0x0001,
+       0x355e: 0x0001, 0x355f: 0x0001, 0x3560: 0x0001, 0x3561: 0x0001, 0x3562: 0x0001, 0x3563: 0x0001,
+       0x3564: 0x0001, 0x3565: 0x0001, 0x3566: 0x0001, 0x3567: 0x0001, 0x3568: 0x0001, 0x3569: 0x0001,
+       0x356a: 0x0001, 0x356b: 0x0001, 0x356c: 0x0001, 0x356d: 0x0001, 0x356e: 0x0001, 0x356f: 0x0001,
+       0x3570: 0x0001, 0x3571: 0x0001, 0x3572: 0x0001, 0x3573: 0x0001, 0x3574: 0x0001, 0x3575: 0x0001,
+       0x3576: 0x0001, 0x3577: 0x0001, 0x3578: 0x0001, 0x3579: 0x0001, 0x357a: 0x0001, 0x357b: 0x0001,
+       0x357c: 0x0001, 0x357d: 0x0001, 0x357e: 0x0001, 0x357f: 0x0001,
+       // Block 0xd6, offset 0x3580
+       0x3580: 0x000d, 0x3581: 0x000d, 0x3582: 0x000d, 0x3583: 0x000d, 0x3584: 0x000d, 0x3585: 0x000d,
+       0x3586: 0x000d, 0x3587: 0x000d, 0x3588: 0x000d, 0x3589: 0x000d, 0x358a: 0x000d, 0x358b: 0x000d,
+       0x358c: 0x000d, 0x358d: 0x000d, 0x358e: 0x000d, 0x358f: 0x000d, 0x3590: 0x000d, 0x3591: 0x000d,
+       0x3592: 0x000d, 0x3593: 0x000d, 0x3594: 0x000d, 0x3595: 0x000d, 0x3596: 0x000d, 0x3597: 0x000d,
+       0x3598: 0x000d, 0x3599: 0x000d, 0x359a: 0x000d, 0x359b: 0x000d, 0x359c: 0x000d, 0x359d: 0x000d,
+       0x359e: 0x000d, 0x359f: 0x000d, 0x35a0: 0x000d, 0x35a1: 0x000d, 0x35a2: 0x000d, 0x35a3: 0x000d,
+       0x35a4: 0x000d, 0x35a5: 0x000d, 0x35a6: 0x000d, 0x35a7: 0x000d, 0x35a8: 0x000d, 0x35a9: 0x000d,
+       0x35aa: 0x000d, 0x35ab: 0x000d, 0x35ac: 0x000d, 0x35ad: 0x000d, 0x35ae: 0x000d, 0x35af: 0x000d,
+       0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000d, 0x35b3: 0x000d, 0x35b4: 0x000d, 0x35b5: 0x000d,
+       0x35b6: 0x000d, 0x35b7: 0x000d, 0x35b8: 0x000d, 0x35b9: 0x000d, 0x35ba: 0x000d, 0x35bb: 0x000d,
+       0x35bc: 0x000d, 0x35bd: 0x000d, 0x35be: 0x000d, 0x35bf: 0x000d,
+       // Block 0xd7, offset 0x35c0
+       0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a,
+       0x35c6: 0x000a, 0x35c7: 0x000a, 0x35c8: 0x000a, 0x35c9: 0x000a, 0x35ca: 0x000a, 0x35cb: 0x000a,
+       0x35cc: 0x000a, 0x35cd: 0x000a, 0x35ce: 0x000a, 0x35cf: 0x000a, 0x35d0: 0x000a, 0x35d1: 0x000a,
+       0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a,
+       0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a,
+       0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,
+       0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a,
+       0x35ea: 0x000a, 0x35eb: 0x000a,
+       0x35f0: 0x000a, 0x35f1: 0x000a, 0x35f2: 0x000a, 0x35f3: 0x000a, 0x35f4: 0x000a, 0x35f5: 0x000a,
+       0x35f6: 0x000a, 0x35f7: 0x000a, 0x35f8: 0x000a, 0x35f9: 0x000a, 0x35fa: 0x000a, 0x35fb: 0x000a,
+       0x35fc: 0x000a, 0x35fd: 0x000a, 0x35fe: 0x000a, 0x35ff: 0x000a,
+       // Block 0xd8, offset 0x3600
+       0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a,
+       0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a,
+       0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a,
+       0x3612: 0x000a, 0x3613: 0x000a,
+       0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,
+       0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a,
+       0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a, 0x362d: 0x000a, 0x362e: 0x000a,
+       0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,
+       0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a,
+       0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, 0x363f: 0x000a,
+       // Block 0xd9, offset 0x3640
+       0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,
+       0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,
+       0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3651: 0x000a,
+       0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a,
+       0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a,
+       0x365e: 0x000a, 0x365f: 0x000a, 0x3660: 0x000a, 0x3661: 0x000a, 0x3662: 0x000a, 0x3663: 0x000a,
+       0x3664: 0x000a, 0x3665: 0x000a, 0x3666: 0x000a, 0x3667: 0x000a, 0x3668: 0x000a, 0x3669: 0x000a,
+       0x366a: 0x000a, 0x366b: 0x000a, 0x366c: 0x000a, 0x366d: 0x000a, 0x366e: 0x000a, 0x366f: 0x000a,
+       0x3670: 0x000a, 0x3671: 0x000a, 0x3672: 0x000a, 0x3673: 0x000a, 0x3674: 0x000a, 0x3675: 0x000a,
+       // Block 0xda, offset 0x3680
+       0x3680: 0x0002, 0x3681: 0x0002, 0x3682: 0x0002, 0x3683: 0x0002, 0x3684: 0x0002, 0x3685: 0x0002,
+       0x3686: 0x0002, 0x3687: 0x0002, 0x3688: 0x0002, 0x3689: 0x0002, 0x368a: 0x0002, 0x368b: 0x000a,
+       0x368c: 0x000a,
+       0x36af: 0x000a,
+       // Block 0xdb, offset 0x36c0
+       0x36ea: 0x000a, 0x36eb: 0x000a,
+       // Block 0xdc, offset 0x3700
+       0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a,
+       0x3724: 0x000a, 0x3725: 0x000a,
+       // Block 0xdd, offset 0x3740
+       0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a,
+       0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a,
+       0x374c: 0x000a, 0x374d: 0x000a, 0x374e: 0x000a, 0x374f: 0x000a, 0x3750: 0x000a, 0x3751: 0x000a,
+       0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a,
+       0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a,
+       0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a,
+       0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a,
+       0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a,
+       0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a,
+       // Block 0xde, offset 0x3780
+       0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a,
+       0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a,
+       0x378c: 0x000a, 0x378d: 0x000a, 0x378e: 0x000a, 0x378f: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a,
+       0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a,
+       0x3798: 0x000a,
+       // Block 0xdf, offset 0x37c0
+       0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a,
+       0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a,
+       0x37d0: 0x000a, 0x37d1: 0x000a,
+       0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a,
+       0x37d8: 0x000a, 0x37d9: 0x000a, 0x37da: 0x000a, 0x37db: 0x000a, 0x37dc: 0x000a, 0x37dd: 0x000a,
+       0x37de: 0x000a, 0x37df: 0x000a, 0x37e0: 0x000a, 0x37e1: 0x000a, 0x37e2: 0x000a, 0x37e3: 0x000a,
+       0x37e4: 0x000a, 0x37e5: 0x000a, 0x37e6: 0x000a, 0x37e7: 0x000a, 0x37e8: 0x000a, 0x37e9: 0x000a,
+       0x37ea: 0x000a, 0x37eb: 0x000a, 0x37ec: 0x000a, 0x37ed: 0x000a, 0x37ee: 0x000a, 0x37ef: 0x000a,
+       0x37f0: 0x000a, 0x37f1: 0x000a, 0x37f2: 0x000a, 0x37f3: 0x000a, 0x37f4: 0x000a, 0x37f5: 0x000a,
+       0x37f6: 0x000a, 0x37f7: 0x000a, 0x37f8: 0x000a, 0x37f9: 0x000a, 0x37fa: 0x000a, 0x37fb: 0x000a,
+       0x37fc: 0x000a, 0x37fd: 0x000a, 0x37fe: 0x000a, 0x37ff: 0x000a,
+       // Block 0xe0, offset 0x3800
+       0x3800: 0x000a, 0x3801: 0x000a, 0x3802: 0x000a, 0x3803: 0x000a, 0x3804: 0x000a, 0x3805: 0x000a,
+       0x3806: 0x000a, 0x3807: 0x000a,
+       0x3810: 0x000a, 0x3811: 0x000a,
+       0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a,
+       0x3818: 0x000a, 0x3819: 0x000a,
+       0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a,
+       0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a, 0x3827: 0x000a, 0x3828: 0x000a, 0x3829: 0x000a,
+       0x382a: 0x000a, 0x382b: 0x000a, 0x382c: 0x000a, 0x382d: 0x000a, 0x382e: 0x000a, 0x382f: 0x000a,
+       0x3830: 0x000a, 0x3831: 0x000a, 0x3832: 0x000a, 0x3833: 0x000a, 0x3834: 0x000a, 0x3835: 0x000a,
+       0x3836: 0x000a, 0x3837: 0x000a, 0x3838: 0x000a, 0x3839: 0x000a, 0x383a: 0x000a, 0x383b: 0x000a,
+       0x383c: 0x000a, 0x383d: 0x000a, 0x383e: 0x000a, 0x383f: 0x000a,
+       // Block 0xe1, offset 0x3840
+       0x3840: 0x000a, 0x3841: 0x000a, 0x3842: 0x000a, 0x3843: 0x000a, 0x3844: 0x000a, 0x3845: 0x000a,
+       0x3846: 0x000a, 0x3847: 0x000a,
+       0x3850: 0x000a, 0x3851: 0x000a,
+       0x3852: 0x000a, 0x3853: 0x000a, 0x3854: 0x000a, 0x3855: 0x000a, 0x3856: 0x000a, 0x3857: 0x000a,
+       0x3858: 0x000a, 0x3859: 0x000a, 0x385a: 0x000a, 0x385b: 0x000a, 0x385c: 0x000a, 0x385d: 0x000a,
+       0x385e: 0x000a, 0x385f: 0x000a, 0x3860: 0x000a, 0x3861: 0x000a, 0x3862: 0x000a, 0x3863: 0x000a,
+       0x3864: 0x000a, 0x3865: 0x000a, 0x3866: 0x000a, 0x3867: 0x000a, 0x3868: 0x000a, 0x3869: 0x000a,
+       0x386a: 0x000a, 0x386b: 0x000a, 0x386c: 0x000a, 0x386d: 0x000a,
+       // Block 0xe2, offset 0x3880
+       0x3880: 0x000a, 0x3881: 0x000a, 0x3882: 0x000a, 0x3883: 0x000a, 0x3884: 0x000a, 0x3885: 0x000a,
+       0x3886: 0x000a, 0x3887: 0x000a, 0x3888: 0x000a, 0x3889: 0x000a, 0x388a: 0x000a, 0x388b: 0x000a,
+       0x3890: 0x000a, 0x3891: 0x000a,
+       0x3892: 0x000a, 0x3893: 0x000a, 0x3894: 0x000a, 0x3895: 0x000a, 0x3896: 0x000a, 0x3897: 0x000a,
+       0x3898: 0x000a, 0x3899: 0x000a, 0x389a: 0x000a, 0x389b: 0x000a, 0x389c: 0x000a, 0x389d: 0x000a,
+       0x389e: 0x000a, 0x389f: 0x000a, 0x38a0: 0x000a, 0x38a1: 0x000a, 0x38a2: 0x000a, 0x38a3: 0x000a,
+       0x38a4: 0x000a, 0x38a5: 0x000a, 0x38a6: 0x000a, 0x38a7: 0x000a, 0x38a8: 0x000a, 0x38a9: 0x000a,
+       0x38aa: 0x000a, 0x38ab: 0x000a, 0x38ac: 0x000a, 0x38ad: 0x000a, 0x38ae: 0x000a, 0x38af: 0x000a,
+       0x38b0: 0x000a, 0x38b1: 0x000a, 0x38b2: 0x000a, 0x38b3: 0x000a, 0x38b4: 0x000a, 0x38b5: 0x000a,
+       0x38b6: 0x000a, 0x38b7: 0x000a, 0x38b8: 0x000a, 0x38b9: 0x000a, 0x38ba: 0x000a, 0x38bb: 0x000a,
+       0x38bc: 0x000a, 0x38bd: 0x000a, 0x38be: 0x000a,
+       // Block 0xe3, offset 0x38c0
+       0x38c0: 0x000a, 0x38c1: 0x000a, 0x38c2: 0x000a, 0x38c3: 0x000a, 0x38c4: 0x000a, 0x38c5: 0x000a,
+       0x38c6: 0x000a, 0x38c7: 0x000a, 0x38c8: 0x000a, 0x38c9: 0x000a, 0x38ca: 0x000a, 0x38cb: 0x000a,
+       0x38cc: 0x000a, 0x38cd: 0x000a, 0x38ce: 0x000a, 0x38cf: 0x000a, 0x38d0: 0x000a, 0x38d1: 0x000a,
+       0x38d2: 0x000a, 0x38d3: 0x000a, 0x38d4: 0x000a, 0x38d5: 0x000a, 0x38d6: 0x000a, 0x38d7: 0x000a,
+       0x38d8: 0x000a, 0x38d9: 0x000a, 0x38da: 0x000a, 0x38db: 0x000a, 0x38dc: 0x000a, 0x38dd: 0x000a,
+       0x38de: 0x000a, 0x38df: 0x000a, 0x38e0: 0x000a, 0x38e1: 0x000a, 0x38e2: 0x000a, 0x38e3: 0x000a,
+       0x38e4: 0x000a, 0x38e5: 0x000a, 0x38e6: 0x000a, 0x38e7: 0x000a, 0x38e8: 0x000a, 0x38e9: 0x000a,
+       0x38ea: 0x000a, 0x38eb: 0x000a, 0x38ec: 0x000a, 0x38ed: 0x000a, 0x38ee: 0x000a, 0x38ef: 0x000a,
+       0x38f0: 0x000a, 0x38f3: 0x000a, 0x38f4: 0x000a, 0x38f5: 0x000a,
+       0x38f6: 0x000a, 0x38fa: 0x000a,
+       0x38fc: 0x000a, 0x38fd: 0x000a, 0x38fe: 0x000a, 0x38ff: 0x000a,
+       // Block 0xe4, offset 0x3900
+       0x3900: 0x000a, 0x3901: 0x000a, 0x3902: 0x000a, 0x3903: 0x000a, 0x3904: 0x000a, 0x3905: 0x000a,
+       0x3906: 0x000a, 0x3907: 0x000a, 0x3908: 0x000a, 0x3909: 0x000a, 0x390a: 0x000a, 0x390b: 0x000a,
+       0x390c: 0x000a, 0x390d: 0x000a, 0x390e: 0x000a, 0x390f: 0x000a, 0x3910: 0x000a, 0x3911: 0x000a,
+       0x3912: 0x000a, 0x3913: 0x000a, 0x3914: 0x000a, 0x3915: 0x000a, 0x3916: 0x000a, 0x3917: 0x000a,
+       0x3918: 0x000a, 0x3919: 0x000a, 0x391a: 0x000a, 0x391b: 0x000a, 0x391c: 0x000a, 0x391d: 0x000a,
+       0x391e: 0x000a, 0x391f: 0x000a, 0x3920: 0x000a, 0x3921: 0x000a, 0x3922: 0x000a,
+       0x3930: 0x000a, 0x3931: 0x000a, 0x3932: 0x000a, 0x3933: 0x000a, 0x3934: 0x000a, 0x3935: 0x000a,
+       0x3936: 0x000a, 0x3937: 0x000a, 0x3938: 0x000a, 0x3939: 0x000a,
+       // Block 0xe5, offset 0x3940
+       0x3940: 0x000a, 0x3941: 0x000a, 0x3942: 0x000a,
+       0x3950: 0x000a, 0x3951: 0x000a,
+       0x3952: 0x000a, 0x3953: 0x000a, 0x3954: 0x000a, 0x3955: 0x000a, 0x3956: 0x000a, 0x3957: 0x000a,
+       0x3958: 0x000a, 0x3959: 0x000a, 0x395a: 0x000a, 0x395b: 0x000a, 0x395c: 0x000a, 0x395d: 0x000a,
+       0x395e: 0x000a, 0x395f: 0x000a, 0x3960: 0x000a, 0x3961: 0x000a, 0x3962: 0x000a, 0x3963: 0x000a,
+       0x3964: 0x000a, 0x3965: 0x000a, 0x3966: 0x000a, 0x3967: 0x000a, 0x3968: 0x000a, 0x3969: 0x000a,
+       0x396a: 0x000a, 0x396b: 0x000a, 0x396c: 0x000a, 0x396d: 0x000a, 0x396e: 0x000a, 0x396f: 0x000a,
+       0x3970: 0x000a, 0x3971: 0x000a, 0x3972: 0x000a, 0x3973: 0x000a, 0x3974: 0x000a, 0x3975: 0x000a,
+       0x3976: 0x000a, 0x3977: 0x000a, 0x3978: 0x000a, 0x3979: 0x000a, 0x397a: 0x000a, 0x397b: 0x000a,
+       0x397c: 0x000a, 0x397d: 0x000a, 0x397e: 0x000a, 0x397f: 0x000a,
+       // Block 0xe6, offset 0x3980
+       0x39a0: 0x000a, 0x39a1: 0x000a, 0x39a2: 0x000a, 0x39a3: 0x000a,
+       0x39a4: 0x000a, 0x39a5: 0x000a, 0x39a6: 0x000a, 0x39a7: 0x000a, 0x39a8: 0x000a, 0x39a9: 0x000a,
+       0x39aa: 0x000a, 0x39ab: 0x000a, 0x39ac: 0x000a, 0x39ad: 0x000a,
+       // Block 0xe7, offset 0x39c0
+       0x39fe: 0x000b, 0x39ff: 0x000b,
+       // Block 0xe8, offset 0x3a00
+       0x3a00: 0x000b, 0x3a01: 0x000b, 0x3a02: 0x000b, 0x3a03: 0x000b, 0x3a04: 0x000b, 0x3a05: 0x000b,
+       0x3a06: 0x000b, 0x3a07: 0x000b, 0x3a08: 0x000b, 0x3a09: 0x000b, 0x3a0a: 0x000b, 0x3a0b: 0x000b,
+       0x3a0c: 0x000b, 0x3a0d: 0x000b, 0x3a0e: 0x000b, 0x3a0f: 0x000b, 0x3a10: 0x000b, 0x3a11: 0x000b,
+       0x3a12: 0x000b, 0x3a13: 0x000b, 0x3a14: 0x000b, 0x3a15: 0x000b, 0x3a16: 0x000b, 0x3a17: 0x000b,
+       0x3a18: 0x000b, 0x3a19: 0x000b, 0x3a1a: 0x000b, 0x3a1b: 0x000b, 0x3a1c: 0x000b, 0x3a1d: 0x000b,
+       0x3a1e: 0x000b, 0x3a1f: 0x000b, 0x3a20: 0x000b, 0x3a21: 0x000b, 0x3a22: 0x000b, 0x3a23: 0x000b,
+       0x3a24: 0x000b, 0x3a25: 0x000b, 0x3a26: 0x000b, 0x3a27: 0x000b, 0x3a28: 0x000b, 0x3a29: 0x000b,
+       0x3a2a: 0x000b, 0x3a2b: 0x000b, 0x3a2c: 0x000b, 0x3a2d: 0x000b, 0x3a2e: 0x000b, 0x3a2f: 0x000b,
+       0x3a30: 0x000b, 0x3a31: 0x000b, 0x3a32: 0x000b, 0x3a33: 0x000b, 0x3a34: 0x000b, 0x3a35: 0x000b,
+       0x3a36: 0x000b, 0x3a37: 0x000b, 0x3a38: 0x000b, 0x3a39: 0x000b, 0x3a3a: 0x000b, 0x3a3b: 0x000b,
+       0x3a3c: 0x000b, 0x3a3d: 0x000b, 0x3a3e: 0x000b, 0x3a3f: 0x000b,
+       // Block 0xe9, offset 0x3a40
+       0x3a40: 0x000c, 0x3a41: 0x000c, 0x3a42: 0x000c, 0x3a43: 0x000c, 0x3a44: 0x000c, 0x3a45: 0x000c,
+       0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x000c,
+       0x3a4c: 0x000c, 0x3a4d: 0x000c, 0x3a4e: 0x000c, 0x3a4f: 0x000c, 0x3a50: 0x000c, 0x3a51: 0x000c,
+       0x3a52: 0x000c, 0x3a53: 0x000c, 0x3a54: 0x000c, 0x3a55: 0x000c, 0x3a56: 0x000c, 0x3a57: 0x000c,
+       0x3a58: 0x000c, 0x3a59: 0x000c, 0x3a5a: 0x000c, 0x3a5b: 0x000c, 0x3a5c: 0x000c, 0x3a5d: 0x000c,
+       0x3a5e: 0x000c, 0x3a5f: 0x000c, 0x3a60: 0x000c, 0x3a61: 0x000c, 0x3a62: 0x000c, 0x3a63: 0x000c,
+       0x3a64: 0x000c, 0x3a65: 0x000c, 0x3a66: 0x000c, 0x3a67: 0x000c, 0x3a68: 0x000c, 0x3a69: 0x000c,
+       0x3a6a: 0x000c, 0x3a6b: 0x000c, 0x3a6c: 0x000c, 0x3a6d: 0x000c, 0x3a6e: 0x000c, 0x3a6f: 0x000c,
+       0x3a70: 0x000b, 0x3a71: 0x000b, 0x3a72: 0x000b, 0x3a73: 0x000b, 0x3a74: 0x000b, 0x3a75: 0x000b,
+       0x3a76: 0x000b, 0x3a77: 0x000b, 0x3a78: 0x000b, 0x3a79: 0x000b, 0x3a7a: 0x000b, 0x3a7b: 0x000b,
+       0x3a7c: 0x000b, 0x3a7d: 0x000b, 0x3a7e: 0x000b, 0x3a7f: 0x000b,
+}
+
+// bidiIndex: 24 blocks, 1536 entries, 1536 bytes
+// Block 0 is the zero block.
+var bidiIndex = [1536]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x02,
+       0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
+       0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
+       0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
+       0xea: 0x07, 0xef: 0x08,
+       0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,
+       // Block 0x4, offset 0x100
+       0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
+       0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
+       0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,
+       0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,
+       // Block 0x5, offset 0x140
+       0x140: 0x31, 0x141: 0x32, 0x142: 0x33,
+       0x14d: 0x34, 0x14e: 0x35,
+       0x150: 0x36,
+       0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,
+       0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,
+       0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,
+       0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,
+       0x17e: 0x4b, 0x17f: 0x4c,
+       // Block 0x6, offset 0x180
+       0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,
+       0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54,
+       0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,
+       0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f,
+       0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61,
+       0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64,
+       0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67,
+       0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70,
+       0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76,
+       // Block 0x8, offset 0x200
+       0x237: 0x54,
+       // Block 0x9, offset 0x240
+       0x252: 0x77, 0x253: 0x78,
+       0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e,
+       0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85,
+       0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a,
+       // Block 0xa, offset 0x280
+       0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e,
+       0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e,
+       0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94,
+       // Block 0xb, offset 0x2c0
+       0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97,
+       0x2cb: 0x98, 0x2cd: 0x99,
+       0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a,
+       0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a,
+       0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9f, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a,
+       0x2f8: 0x9a, 0x2f9: 0xa0, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0xa1, 0x2fd: 0xa2, 0x2fe: 0x9a, 0x2ff: 0x9a,
+       // Block 0xc, offset 0x300
+       0x300: 0xa3, 0x301: 0xa4, 0x302: 0xa5, 0x304: 0xa6, 0x305: 0xa7, 0x306: 0xa8, 0x307: 0xa9,
+       0x308: 0xaa, 0x30b: 0xab, 0x30c: 0x26, 0x30d: 0xac,
+       0x310: 0xad, 0x311: 0xae, 0x312: 0xaf, 0x313: 0xb0, 0x316: 0xb1, 0x317: 0xb2,
+       0x318: 0xb3, 0x319: 0xb4, 0x31a: 0xb5, 0x31c: 0xb6,
+       0x320: 0xb7,
+       0x328: 0xb8, 0x329: 0xb9, 0x32a: 0xba,
+       0x330: 0xbb, 0x332: 0xbc, 0x334: 0xbd, 0x335: 0xbe, 0x336: 0xbf,
+       0x33b: 0xc0,
+       // Block 0xd, offset 0x340
+       0x36b: 0xc1, 0x36c: 0xc2,
+       0x37e: 0xc3,
+       // Block 0xe, offset 0x380
+       0x3b2: 0xc4,
+       // Block 0xf, offset 0x3c0
+       0x3c5: 0xc5, 0x3c6: 0xc6,
+       0x3c8: 0x54, 0x3c9: 0xc7, 0x3cc: 0x54, 0x3cd: 0xc8,
+       0x3db: 0xc9, 0x3dc: 0xca, 0x3dd: 0xcb, 0x3de: 0xcc, 0x3df: 0xcd,
+       0x3e8: 0xce, 0x3e9: 0xcf, 0x3ea: 0xd0,
+       // Block 0x10, offset 0x400
+       0x400: 0xd1,
+       0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xd2, 0x424: 0x9a, 0x425: 0xd3, 0x426: 0x9a, 0x427: 0x9a,
+       0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a,
+       0x430: 0x9a, 0x431: 0xa1, 0x432: 0x0e, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a,
+       0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xd4, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a,
+       // Block 0x11, offset 0x440
+       0x440: 0xd5, 0x441: 0x54, 0x442: 0xd6, 0x443: 0xd7, 0x444: 0xd8, 0x445: 0xd9,
+       0x449: 0xda, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,
+       0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,
+       0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xdb, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xdc,
+       0x460: 0xdd, 0x461: 0xde, 0x462: 0xdf, 0x464: 0xe0, 0x465: 0xe1, 0x466: 0xe2, 0x467: 0xe3,
+       0x469: 0xe4,
+       0x47f: 0xe5,
+       // Block 0x12, offset 0x480
+       0x4bf: 0xe5,
+       // Block 0x13, offset 0x4c0
+       0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,
+       0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,
+       0x4ef: 0x10,
+       0x4ff: 0x10,
+       // Block 0x14, offset 0x500
+       0x50f: 0x10,
+       0x51f: 0x10,
+       0x52f: 0x10,
+       0x53f: 0x10,
+       // Block 0x15, offset 0x540
+       0x540: 0xe6, 0x541: 0xe6, 0x542: 0xe6, 0x543: 0xe6, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe7,
+       0x548: 0xe6, 0x549: 0xe6, 0x54a: 0xe6, 0x54b: 0xe6, 0x54c: 0xe6, 0x54d: 0xe6, 0x54e: 0xe6, 0x54f: 0xe6,
+       0x550: 0xe6, 0x551: 0xe6, 0x552: 0xe6, 0x553: 0xe6, 0x554: 0xe6, 0x555: 0xe6, 0x556: 0xe6, 0x557: 0xe6,
+       0x558: 0xe6, 0x559: 0xe6, 0x55a: 0xe6, 0x55b: 0xe6, 0x55c: 0xe6, 0x55d: 0xe6, 0x55e: 0xe6, 0x55f: 0xe6,
+       0x560: 0xe6, 0x561: 0xe6, 0x562: 0xe6, 0x563: 0xe6, 0x564: 0xe6, 0x565: 0xe6, 0x566: 0xe6, 0x567: 0xe6,
+       0x568: 0xe6, 0x569: 0xe6, 0x56a: 0xe6, 0x56b: 0xe6, 0x56c: 0xe6, 0x56d: 0xe6, 0x56e: 0xe6, 0x56f: 0xe6,
+       0x570: 0xe6, 0x571: 0xe6, 0x572: 0xe6, 0x573: 0xe6, 0x574: 0xe6, 0x575: 0xe6, 0x576: 0xe6, 0x577: 0xe6,
+       0x578: 0xe6, 0x579: 0xe6, 0x57a: 0xe6, 0x57b: 0xe6, 0x57c: 0xe6, 0x57d: 0xe6, 0x57e: 0xe6, 0x57f: 0xe6,
+       // Block 0x16, offset 0x580
+       0x58f: 0x10,
+       0x59f: 0x10,
+       0x5a0: 0x13,
+       0x5af: 0x10,
+       0x5bf: 0x10,
+       // Block 0x17, offset 0x5c0
+       0x5cf: 0x10,
+}
+
+// Total table size 16568 bytes (16KiB); checksum: F50EF68C
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/tables9.0.0.go b/libgo/go/golang.org/x/text/unicode/bidi/tables9.0.0.go
new file mode 100644 (file)
index 0000000..0ca0193
--- /dev/null
@@ -0,0 +1,1781 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package bidi
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "9.0.0"
+
+// xorMasks contains masks to be xor-ed with brackets to get the reverse
+// version.
+var xorMasks = []int32{ // 8 elements
+       0, 1, 6, 7, 3, 15, 29, 63,
+} // Size: 56 bytes
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return bidiValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := bidiIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = bidiIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = bidiIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return bidiValues[c0]
+       }
+       i := bidiIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86.
+type bidiTrie struct{}
+
+func newBidiTrie(i int) *bidiTrie {
+       return &bidiTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
+       switch {
+       default:
+               return uint8(bidiValues[n<<6+uint32(b)])
+       }
+}
+
+// bidiValues: 222 blocks, 14208 entries, 14208 bytes
+// The third block is the zero block.
+var bidiValues = [14208]uint8{
+       // Block 0x0, offset 0x0
+       0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
+       0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
+       0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
+       0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
+       0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
+       0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
+       0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
+       0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
+       0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
+       0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
+       0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
+       // Block 0x1, offset 0x40
+       0x40: 0x000a,
+       0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
+       0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
+       0x7b: 0x005a,
+       0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
+       0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
+       0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
+       0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
+       0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
+       0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
+       0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
+       0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
+       0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
+       0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
+       0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
+       // Block 0x4, offset 0x100
+       0x117: 0x000a,
+       0x137: 0x000a,
+       // Block 0x5, offset 0x140
+       0x179: 0x000a, 0x17a: 0x000a,
+       // Block 0x6, offset 0x180
+       0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
+       0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
+       0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
+       0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
+       0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
+       0x19e: 0x000a, 0x19f: 0x000a,
+       0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
+       0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
+       0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
+       0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
+       0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
+       0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
+       0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
+       0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
+       0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
+       0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
+       0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
+       0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
+       0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
+       0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
+       0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
+       // Block 0x8, offset 0x200
+       0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
+       0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
+       0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
+       0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
+       0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
+       0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
+       0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
+       0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
+       0x234: 0x000a, 0x235: 0x000a,
+       0x23e: 0x000a,
+       // Block 0x9, offset 0x240
+       0x244: 0x000a, 0x245: 0x000a,
+       0x247: 0x000a,
+       // Block 0xa, offset 0x280
+       0x2b6: 0x000a,
+       // Block 0xb, offset 0x2c0
+       0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
+       0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
+       // Block 0xc, offset 0x300
+       0x30a: 0x000a,
+       0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
+       0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
+       0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
+       0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
+       0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
+       0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
+       0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
+       0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
+       0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
+       // Block 0xd, offset 0x340
+       0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
+       0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
+       0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
+       0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
+       0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
+       0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
+       0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
+       0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
+       0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
+       0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
+       0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
+       // Block 0xe, offset 0x380
+       0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
+       0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
+       0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
+       0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
+       0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
+       0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
+       0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
+       0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
+       0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
+       0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
+       0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
+       // Block 0xf, offset 0x3c0
+       0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
+       0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
+       0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
+       0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
+       0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
+       0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
+       0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
+       0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
+       0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
+       0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
+       0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
+       // Block 0x10, offset 0x400
+       0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
+       0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
+       0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
+       0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
+       0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
+       0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
+       0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
+       0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
+       0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
+       0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
+       0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
+       // Block 0x11, offset 0x440
+       0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
+       0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
+       0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
+       0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
+       0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
+       0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
+       0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
+       0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
+       0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
+       0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
+       0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
+       // Block 0x12, offset 0x480
+       0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
+       0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
+       0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
+       0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
+       0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
+       0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
+       0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
+       0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
+       0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
+       0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
+       0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
+       0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
+       0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
+       0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
+       0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
+       0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
+       0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
+       0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
+       0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
+       0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
+       0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
+       // Block 0x14, offset 0x500
+       0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
+       0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
+       0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
+       0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
+       0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
+       0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
+       0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
+       0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
+       0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
+       0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
+       0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
+       // Block 0x15, offset 0x540
+       0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
+       0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
+       0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
+       0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
+       0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
+       0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
+       0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
+       0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
+       0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
+       0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
+       0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,
+       // Block 0x16, offset 0x580
+       0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
+       0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
+       0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
+       0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
+       0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
+       0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
+       0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
+       0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
+       0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
+       0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
+       0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
+       0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
+       0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
+       0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
+       0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
+       0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001,
+       0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001,
+       0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001,
+       0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,
+       0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,
+       0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,
+       // Block 0x18, offset 0x600
+       0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,
+       0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,
+       0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,
+       0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
+       0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,
+       0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
+       0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
+       0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
+       0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
+       0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
+       0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
+       // Block 0x19, offset 0x640
+       0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
+       0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,
+       0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,
+       0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
+       0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
+       0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
+       0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
+       0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
+       0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
+       0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
+       0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
+       // Block 0x1a, offset 0x680
+       0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
+       0x6ba: 0x000c,
+       0x6bc: 0x000c,
+       // Block 0x1b, offset 0x6c0
+       0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
+       0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
+       0x6cd: 0x000c, 0x6d1: 0x000c,
+       0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
+       0x6e2: 0x000c, 0x6e3: 0x000c,
+       // Block 0x1c, offset 0x700
+       0x701: 0x000c,
+       0x73c: 0x000c,
+       // Block 0x1d, offset 0x740
+       0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
+       0x74d: 0x000c,
+       0x762: 0x000c, 0x763: 0x000c,
+       0x772: 0x0004, 0x773: 0x0004,
+       0x77b: 0x0004,
+       // Block 0x1e, offset 0x780
+       0x781: 0x000c, 0x782: 0x000c,
+       0x7bc: 0x000c,
+       // Block 0x1f, offset 0x7c0
+       0x7c1: 0x000c, 0x7c2: 0x000c,
+       0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
+       0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
+       0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
+       // Block 0x20, offset 0x800
+       0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
+       0x807: 0x000c, 0x808: 0x000c,
+       0x80d: 0x000c,
+       0x822: 0x000c, 0x823: 0x000c,
+       0x831: 0x0004,
+       // Block 0x21, offset 0x840
+       0x841: 0x000c,
+       0x87c: 0x000c, 0x87f: 0x000c,
+       // Block 0x22, offset 0x880
+       0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
+       0x88d: 0x000c,
+       0x896: 0x000c,
+       0x8a2: 0x000c, 0x8a3: 0x000c,
+       // Block 0x23, offset 0x8c0
+       0x8c2: 0x000c,
+       // Block 0x24, offset 0x900
+       0x900: 0x000c,
+       0x90d: 0x000c,
+       0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
+       0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
+       // Block 0x25, offset 0x940
+       0x940: 0x000c,
+       0x97e: 0x000c, 0x97f: 0x000c,
+       // Block 0x26, offset 0x980
+       0x980: 0x000c,
+       0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
+       0x98c: 0x000c, 0x98d: 0x000c,
+       0x995: 0x000c, 0x996: 0x000c,
+       0x9a2: 0x000c, 0x9a3: 0x000c,
+       0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
+       0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
+       // Block 0x27, offset 0x9c0
+       0x9cc: 0x000c, 0x9cd: 0x000c,
+       0x9e2: 0x000c, 0x9e3: 0x000c,
+       // Block 0x28, offset 0xa00
+       0xa01: 0x000c,
+       // Block 0x29, offset 0xa40
+       0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
+       0xa4d: 0x000c,
+       0xa62: 0x000c, 0xa63: 0x000c,
+       // Block 0x2a, offset 0xa80
+       0xa8a: 0x000c,
+       0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,
+       // Block 0x2b, offset 0xac0
+       0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,
+       0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,
+       0xaff: 0x0004,
+       // Block 0x2c, offset 0xb00
+       0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,
+       0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,
+       // Block 0x2d, offset 0xb40
+       0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,
+       0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,
+       0xb7c: 0x000c,
+       // Block 0x2e, offset 0xb80
+       0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,
+       0xb8c: 0x000c, 0xb8d: 0x000c,
+       // Block 0x2f, offset 0xbc0
+       0xbd8: 0x000c, 0xbd9: 0x000c,
+       0xbf5: 0x000c,
+       0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,
+       0xbfc: 0x003a, 0xbfd: 0x002a,
+       // Block 0x30, offset 0xc00
+       0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,
+       0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,
+       0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,
+       0xc46: 0x000c, 0xc47: 0x000c,
+       0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,
+       0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,
+       0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,
+       0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,
+       0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,
+       0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,
+       0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
+       0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
+       0xc7c: 0x000c,
+       // Block 0x32, offset 0xc80
+       0xc86: 0x000c,
+       // Block 0x33, offset 0xcc0
+       0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,
+       0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,
+       0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,
+       0xcfd: 0x000c, 0xcfe: 0x000c,
+       // Block 0x34, offset 0xd00
+       0xd18: 0x000c, 0xd19: 0x000c,
+       0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,
+       0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,
+       // Block 0x35, offset 0xd40
+       0xd42: 0x000c, 0xd45: 0x000c,
+       0xd46: 0x000c,
+       0xd4d: 0x000c,
+       0xd5d: 0x000c,
+       // Block 0x36, offset 0xd80
+       0xd9d: 0x000c,
+       0xd9e: 0x000c, 0xd9f: 0x000c,
+       // Block 0x37, offset 0xdc0
+       0xdd0: 0x000a, 0xdd1: 0x000a,
+       0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,
+       0xdd8: 0x000a, 0xdd9: 0x000a,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x000a,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x0009,
+       0xe5b: 0x007a, 0xe5c: 0x006a,
+       // Block 0x3a, offset 0xe80
+       0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,
+       0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,
+       // Block 0x3b, offset 0xec0
+       0xed2: 0x000c, 0xed3: 0x000c,
+       0xef2: 0x000c, 0xef3: 0x000c,
+       // Block 0x3c, offset 0xf00
+       0xf34: 0x000c, 0xf35: 0x000c,
+       0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,
+       0xf3c: 0x000c, 0xf3d: 0x000c,
+       // Block 0x3d, offset 0xf40
+       0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,
+       0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,
+       0xf52: 0x000c, 0xf53: 0x000c,
+       0xf5b: 0x0004, 0xf5d: 0x000c,
+       0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,
+       0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,
+       0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,
+       0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,
+       // Block 0x3f, offset 0xfc0
+       0xfc5: 0x000c,
+       0xfc6: 0x000c,
+       0xfe9: 0x000c,
+       // Block 0x40, offset 0x1000
+       0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,
+       0x1027: 0x000c, 0x1028: 0x000c,
+       0x1032: 0x000c,
+       0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,
+       // Block 0x42, offset 0x1080
+       0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,
+       0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,
+       0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,
+       0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,
+       0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,
+       0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,
+       // Block 0x43, offset 0x10c0
+       0x10d7: 0x000c,
+       0x10d8: 0x000c, 0x10db: 0x000c,
+       // Block 0x44, offset 0x1100
+       0x1116: 0x000c,
+       0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,
+       0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,
+       0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,
+       0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,
+       0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,
+       0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,
+       0x113c: 0x000c, 0x113f: 0x000c,
+       // Block 0x45, offset 0x1140
+       0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
+       0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
+       0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,
+       0x11b4: 0x000c,
+       0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,
+       0x11bc: 0x000c,
+       // Block 0x47, offset 0x11c0
+       0x11c2: 0x000c,
+       0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,
+       0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x000c, 0x1201: 0x000c,
+       0x1222: 0x000c, 0x1223: 0x000c,
+       0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,
+       0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,
+       // Block 0x49, offset 0x1240
+       0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,
+       0x126d: 0x000c, 0x126f: 0x000c,
+       0x1270: 0x000c, 0x1271: 0x000c,
+       // Block 0x4a, offset 0x1280
+       0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,
+       0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,
+       0x12b6: 0x000c, 0x12b7: 0x000c,
+       // Block 0x4b, offset 0x12c0
+       0x12d0: 0x000c, 0x12d1: 0x000c,
+       0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,
+       0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,
+       0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,
+       0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,
+       0x12ed: 0x000c,
+       0x12f4: 0x000c,
+       0x12f8: 0x000c, 0x12f9: 0x000c,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,
+       0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,
+       0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,
+       0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,
+       0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,
+       0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,
+       0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,
+       0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
+       0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,
+       0x133b: 0x000c,
+       0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,
+       // Block 0x4d, offset 0x1340
+       0x137d: 0x000a, 0x137f: 0x000a,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x000a, 0x1381: 0x000a,
+       0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,
+       0x139d: 0x000a,
+       0x139e: 0x000a, 0x139f: 0x000a,
+       0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,
+       0x13bd: 0x000a, 0x13be: 0x000a,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,
+       0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,
+       0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,
+       0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,
+       0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,
+       0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,
+       0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,
+       0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,
+       0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,
+       0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,
+       0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,
+       0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,
+       0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,
+       0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
+       0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
+       0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,
+       0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,
+       0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,
+       0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,
+       0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,
+       0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,
+       0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,
+       0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,
+       0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,
+       0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,
+       0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,
+       0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,
+       0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,
+       0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,
+       0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,
+       0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,
+       0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,
+       0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,
+       0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,
+       0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,
+       0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,
+       0x14b0: 0x000c,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,
+       0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,
+       0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,
+       0x14d8: 0x000a,
+       0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,
+       0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,
+       0x14ee: 0x0004,
+       0x14fa: 0x000a, 0x14fb: 0x000a,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,
+       0x150a: 0x000a, 0x150b: 0x000a,
+       0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,
+       0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
+       0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,
+       0x151e: 0x000a, 0x151f: 0x000a,
+       // Block 0x55, offset 0x1540
+       0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,
+       0x1550: 0x000a, 0x1551: 0x000a,
+       0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
+       0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
+       0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,
+       0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,
+       0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,
+       0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,
+       0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,
+       0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,
+       0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
+       0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,
+       0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
+       0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
+       0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
+       0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
+       0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
+       0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
+       0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
+       0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
+       0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
+       0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
+       0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
+       0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
+       0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
+       0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
+       0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
+       0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
+       0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
+       0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
+       0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,
+       0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
+       0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
+       0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
+       0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
+       0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,
+       0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
+       0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
+       // Block 0x59, offset 0x1640
+       0x167b: 0x000a,
+       0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,
+       0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,
+       0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,
+       0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,
+       0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,
+       0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,
+       0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,
+       0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,
+       0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,
+       0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,
+       0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
+       0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
+       0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
+       0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
+       0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
+       0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
+       0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a,
+       0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a,
+       0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a,
+       0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a,
+       0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
+       0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a,
+       0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a,
+       0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a,
+       0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a,
+       0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
+       0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
+       0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a,
+       0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a,
+       0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a,
+       0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a,
+       0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a,
+       0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a,
+       0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a,
+       // Block 0x5e, offset 0x1780
+       0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a,
+       0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002,
+       0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002,
+       0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002,
+       0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002,
+       // Block 0x5f, offset 0x17c0
+       0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
+       0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
+       0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
+       0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
+       // Block 0x60, offset 0x1800
+       0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
+       0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
+       0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
+       0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
+       0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
+       0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
+       0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a,
+       0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a,
+       0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a,
+       0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
+       0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
+       // Block 0x61, offset 0x1840
+       0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a,
+       0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
+       0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
+       0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
+       0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
+       0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
+       0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a,
+       0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
+       0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a,
+       0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
+       0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
+       // Block 0x62, offset 0x1880
+       0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a,
+       0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a,
+       0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a,
+       0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a,
+       0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
+       0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
+       0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a,
+       0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a,
+       0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
+       0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
+       0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
+       // Block 0x63, offset 0x18c0
+       0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a,
+       0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a,
+       0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a,
+       0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba,
+       0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a,
+       0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
+       0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
+       0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
+       0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
+       0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
+       0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a,
+       // Block 0x64, offset 0x1900
+       0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
+       0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
+       0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
+       0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
+       0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a,
+       0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
+       0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
+       0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
+       0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a,
+       0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
+       0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a,
+       // Block 0x65, offset 0x1940
+       0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
+       0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
+       0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
+       0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a,
+       0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
+       0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
+       0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
+       0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
+       0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a,
+       0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a,
+       0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
+       // Block 0x66, offset 0x1980
+       0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
+       0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
+       0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
+       0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a,
+       0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a,
+       0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a,
+       0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a,
+       0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
+       0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a,
+       0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a,
+       0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a,
+       // Block 0x67, offset 0x19c0
+       0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a,
+       0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a,
+       0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a,
+       0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a,
+       // Block 0x68, offset 0x1a00
+       0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a,
+       0x1a2a: 0x000a, 0x1a2f: 0x000c,
+       0x1a30: 0x000c, 0x1a31: 0x000c,
+       0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a,
+       0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a,
+       // Block 0x69, offset 0x1a40
+       0x1a7f: 0x000c,
+       // Block 0x6a, offset 0x1a80
+       0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c,
+       0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c,
+       0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c,
+       0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c,
+       0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c,
+       0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c,
+       // Block 0x6b, offset 0x1ac0
+       0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
+       0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a,
+       0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a,
+       0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a,
+       0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a,
+       0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a,
+       0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a,
+       0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a,
+       0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a,
+       0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a,
+       0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a,
+       // Block 0x6c, offset 0x1b00
+       0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a,
+       // Block 0x6d, offset 0x1b40
+       0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
+       0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
+       0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
+       0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
+       0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
+       0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
+       0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
+       0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
+       0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a,
+       0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a,
+       0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a,
+       // Block 0x6e, offset 0x1b80
+       0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
+       0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
+       0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
+       0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a,
+       0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a,
+       0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a,
+       0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a,
+       0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a,
+       0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a,
+       // Block 0x6f, offset 0x1bc0
+       0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a,
+       0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a,
+       0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a,
+       0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a,
+       0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a,
+       0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a,
+       // Block 0x70, offset 0x1c00
+       0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a,
+       0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a,
+       0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a,
+       0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a,
+       0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a,
+       0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a,
+       0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c,
+       0x1c30: 0x000a,
+       0x1c36: 0x000a, 0x1c37: 0x000a,
+       0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a,
+       // Block 0x71, offset 0x1c40
+       0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a,
+       0x1c60: 0x000a,
+       // Block 0x72, offset 0x1c80
+       0x1cbb: 0x000a,
+       // Block 0x73, offset 0x1cc0
+       0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a,
+       0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a,
+       0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a,
+       0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a,
+       0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a,
+       0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a,
+       // Block 0x74, offset 0x1d00
+       0x1d1d: 0x000a,
+       0x1d1e: 0x000a,
+       // Block 0x75, offset 0x1d40
+       0x1d50: 0x000a, 0x1d51: 0x000a,
+       0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a,
+       0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a,
+       0x1d5e: 0x000a, 0x1d5f: 0x000a,
+       0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a,
+       // Block 0x76, offset 0x1d80
+       0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a,
+       0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a,
+       0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a,
+       // Block 0x77, offset 0x1dc0
+       0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a,
+       // Block 0x78, offset 0x1e00
+       0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a,
+       // Block 0x79, offset 0x1e40
+       0x1e5e: 0x000a, 0x1e5f: 0x000a,
+       0x1e7f: 0x000a,
+       // Block 0x7a, offset 0x1e80
+       0x1e90: 0x000a, 0x1e91: 0x000a,
+       0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a,
+       0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a,
+       0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a,
+       0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a,
+       0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a,
+       0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a,
+       0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a,
+       0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a,
+       // Block 0x7b, offset 0x1ec0
+       0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a,
+       0x1ec6: 0x000a,
+       // Block 0x7c, offset 0x1f00
+       0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a,
+       // Block 0x7d, offset 0x1f40
+       0x1f6f: 0x000c,
+       0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c,
+       0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c,
+       0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a,
+       // Block 0x7e, offset 0x1f80
+       0x1f9e: 0x000c, 0x1f9f: 0x000c,
+       // Block 0x7f, offset 0x1fc0
+       0x1ff0: 0x000c, 0x1ff1: 0x000c,
+       // Block 0x80, offset 0x2000
+       0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a,
+       0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a,
+       0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a,
+       0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a,
+       0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a,
+       0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a,
+       // Block 0x81, offset 0x2040
+       0x2048: 0x000a,
+       // Block 0x82, offset 0x2080
+       0x2082: 0x000c,
+       0x2086: 0x000c, 0x208b: 0x000c,
+       0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a,
+       0x20aa: 0x000a, 0x20ab: 0x000a,
+       0x20b8: 0x0004, 0x20b9: 0x0004,
+       // Block 0x83, offset 0x20c0
+       0x20f4: 0x000a, 0x20f5: 0x000a,
+       0x20f6: 0x000a, 0x20f7: 0x000a,
+       // Block 0x84, offset 0x2100
+       0x2104: 0x000c, 0x2105: 0x000c,
+       0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c,
+       0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
+       0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c,
+       0x2130: 0x000c, 0x2131: 0x000c,
+       // Block 0x85, offset 0x2140
+       0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c,
+       0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c,
+       // Block 0x86, offset 0x2180
+       0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c,
+       0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c,
+       // Block 0x87, offset 0x21c0
+       0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c,
+       0x21f3: 0x000c,
+       0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c,
+       0x21fc: 0x000c,
+       // Block 0x88, offset 0x2200
+       0x2225: 0x000c,
+       // Block 0x89, offset 0x2240
+       0x2269: 0x000c,
+       0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c,
+       0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c,
+       0x2276: 0x000c,
+       // Block 0x8a, offset 0x2280
+       0x2283: 0x000c,
+       0x228c: 0x000c,
+       0x22bc: 0x000c,
+       // Block 0x8b, offset 0x22c0
+       0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c,
+       0x22f7: 0x000c, 0x22f8: 0x000c,
+       0x22fe: 0x000c, 0x22ff: 0x000c,
+       // Block 0x8c, offset 0x2300
+       0x2301: 0x000c,
+       0x232c: 0x000c, 0x232d: 0x000c,
+       0x2336: 0x000c,
+       // Block 0x8d, offset 0x2340
+       0x2365: 0x000c, 0x2368: 0x000c,
+       0x236d: 0x000c,
+       // Block 0x8e, offset 0x2380
+       0x239d: 0x0001,
+       0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001,
+       0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003,
+       0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001,
+       0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001,
+       0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001,
+       0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001,
+       // Block 0x8f, offset 0x23c0
+       0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001,
+       0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001,
+       0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d,
+       0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
+       0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
+       0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
+       0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
+       0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
+       0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
+       0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
+       0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d,
+       // Block 0x90, offset 0x2400
+       0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
+       0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
+       0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d,
+       0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d,
+       0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d,
+       0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d,
+       0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d,
+       0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d,
+       0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
+       0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
+       0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a,
+       // Block 0x91, offset 0x2440
+       0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d,
+       0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d,
+       0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b,
+       0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b,
+       0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b,
+       0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b,
+       0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b,
+       0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b,
+       0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d,
+       0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d,
+       0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d,
+       // Block 0x92, offset 0x2480
+       0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c,
+       0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c,
+       0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a,
+       0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a,
+       0x2498: 0x000a, 0x2499: 0x000a,
+       0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c,
+       0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c,
+       0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c,
+       0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a,
+       0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a,
+       0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a,
+       // Block 0x93, offset 0x24c0
+       0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a,
+       0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a,
+       0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a,
+       0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a,
+       0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a,
+       0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003,
+       0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004,
+       0x24ea: 0x0004, 0x24eb: 0x000a,
+       0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,
+       0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,
+       0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d,
+       // Block 0x94, offset 0x2500
+       0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d,
+       0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d,
+       0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d,
+       0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d,
+       0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d,
+       0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d,
+       0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d,
+       0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d,
+       0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d,
+       0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d,
+       0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b,
+       // Block 0x95, offset 0x2540
+       0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004,
+       0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003,
+       0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002,
+       0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002,
+       0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a,
+       0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a,
+       0x257b: 0x005a,
+       0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a,
+       // Block 0x96, offset 0x2580
+       0x2580: 0x000a,
+       0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a,
+       0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a,
+       0x25a4: 0x000a, 0x25a5: 0x000a,
+       // Block 0x97, offset 0x25c0
+       0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a,
+       0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a,
+       0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a,
+       0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b,
+       0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a,
+       0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b,
+       // Block 0x98, offset 0x2600
+       0x2601: 0x000a,
+       // Block 0x99, offset 0x2640
+       0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a,
+       0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a,
+       0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a,
+       0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a,
+       0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a,
+       0x2660: 0x000a,
+       // Block 0x9a, offset 0x2680
+       0x26bd: 0x000c,
+       // Block 0x9b, offset 0x26c0
+       0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002,
+       0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002,
+       0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002,
+       0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002,
+       0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002,
+       // Block 0x9c, offset 0x2700
+       0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c,
+       // Block 0x9d, offset 0x2740
+       0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,
+       0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,
+       0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,
+       0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,
+       0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,
+       0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,
+       0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,
+       0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,
+       0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,
+       0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,
+       0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,
+       // Block 0x9e, offset 0x2780
+       0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001,
+       0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
+       0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001,
+       0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
+       0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
+       0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
+       0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
+       0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
+       0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
+       0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001,
+       0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001,
+       // Block 0x9f, offset 0x27c0
+       0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c,
+       0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
+       0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001,
+       0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
+       0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
+       0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
+       0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
+       0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
+       0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
+       0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001,
+       0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c,
+       // Block 0xa0, offset 0x2800
+       0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,
+       0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
+       0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,
+       0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
+       0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
+       0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
+       0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
+       0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
+       0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
+       0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001,
+       0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001,
+       // Block 0xa1, offset 0x2840
+       0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,
+       0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,
+       0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,
+       0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,
+       0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,
+       0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001,
+       0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001,
+       0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001,
+       0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001,
+       0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a,
+       0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a,
+       // Block 0xa2, offset 0x2880
+       0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001,
+       0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001,
+       0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001,
+       0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001,
+       0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001,
+       0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005,
+       0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005,
+       0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005,
+       0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005,
+       0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005,
+       0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001,
+       // Block 0xa3, offset 0x28c0
+       0x28c1: 0x000c,
+       0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c,
+       0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c,
+       // Block 0xa4, offset 0x2900
+       0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c,
+       0x2906: 0x000c,
+       0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a,
+       0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a,
+       0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a,
+       0x2924: 0x000a, 0x2925: 0x000a,
+       0x293f: 0x000c,
+       // Block 0xa5, offset 0x2940
+       0x2940: 0x000c, 0x2941: 0x000c,
+       0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c,
+       0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c,
+       // Block 0xa6, offset 0x2980
+       0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c,
+       0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c,
+       0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c,
+       0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c,
+       // Block 0xa7, offset 0x29c0
+       0x29f3: 0x000c,
+       // Block 0xa8, offset 0x2a00
+       0x2a00: 0x000c, 0x2a01: 0x000c,
+       0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c,
+       0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c,
+       // Block 0xa9, offset 0x2a40
+       0x2a4a: 0x000c, 0x2a4b: 0x000c,
+       0x2a4c: 0x000c,
+       // Block 0xaa, offset 0x2a80
+       0x2aaf: 0x000c,
+       0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c,
+       0x2ab6: 0x000c, 0x2ab7: 0x000c,
+       0x2abe: 0x000c,
+       // Block 0xab, offset 0x2ac0
+       0x2adf: 0x000c, 0x2ae3: 0x000c,
+       0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c,
+       0x2aea: 0x000c,
+       // Block 0xac, offset 0x2b00
+       0x2b00: 0x000c, 0x2b01: 0x000c,
+       0x2b3c: 0x000c,
+       // Block 0xad, offset 0x2b40
+       0x2b40: 0x000c,
+       0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c,
+       0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c,
+       0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c,
+       // Block 0xae, offset 0x2b80
+       0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c,
+       0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c,
+       // Block 0xaf, offset 0x2bc0
+       0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c,
+       0x2bc6: 0x000c,
+       // Block 0xb0, offset 0x2c00
+       0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c,
+       0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c,
+       0x2c3f: 0x000c,
+       // Block 0xb1, offset 0x2c40
+       0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c,
+       // Block 0xb2, offset 0x2c80
+       0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c,
+       0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c,
+       // Block 0xb3, offset 0x2cc0
+       0x2cc0: 0x000c,
+       0x2cdc: 0x000c, 0x2cdd: 0x000c,
+       // Block 0xb4, offset 0x2d00
+       0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c,
+       0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c,
+       0x2d3d: 0x000c, 0x2d3f: 0x000c,
+       // Block 0xb5, offset 0x2d40
+       0x2d40: 0x000c,
+       0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a,
+       0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a,
+       0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a,
+       // Block 0xb6, offset 0x2d80
+       0x2dab: 0x000c, 0x2dad: 0x000c,
+       0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c,
+       0x2db7: 0x000c,
+       // Block 0xb7, offset 0x2dc0
+       0x2ddd: 0x000c,
+       0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c,
+       0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c,
+       0x2dea: 0x000c, 0x2deb: 0x000c,
+       // Block 0xb8, offset 0x2e00
+       0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c,
+       0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c,
+       0x2e3c: 0x000c, 0x2e3d: 0x000c,
+       // Block 0xb9, offset 0x2e40
+       0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c,
+       0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c,
+       0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c,
+       0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c,
+       0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c,
+       0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c,
+       0x2e76: 0x000c,
+       // Block 0xba, offset 0x2e80
+       0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c,
+       // Block 0xbb, offset 0x2ec0
+       0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c,
+       0x2ef6: 0x000c,
+       // Block 0xbc, offset 0x2f00
+       0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c,
+       0x2f12: 0x000c,
+       // Block 0xbd, offset 0x2f40
+       0x2f5d: 0x000c,
+       0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b,
+       // Block 0xbe, offset 0x2f80
+       0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c,
+       0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b,
+       0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c,
+       0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c,
+       // Block 0xbf, offset 0x2fc0
+       0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c,
+       0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c,
+       0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c,
+       // Block 0xc0, offset 0x3000
+       0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a,
+       // Block 0xc1, offset 0x3040
+       0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a,
+       0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a,
+       0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a,
+       0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a,
+       // Block 0xc2, offset 0x3080
+       0x309b: 0x000a,
+       // Block 0xc3, offset 0x30c0
+       0x30d5: 0x000a,
+       // Block 0xc4, offset 0x3100
+       0x310f: 0x000a,
+       // Block 0xc5, offset 0x3140
+       0x3149: 0x000a,
+       // Block 0xc6, offset 0x3180
+       0x3183: 0x000a,
+       0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002,
+       0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002,
+       0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002,
+       0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002,
+       0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002,
+       0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002,
+       0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002,
+       0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002,
+       0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002,
+       // Block 0xc7, offset 0x31c0
+       0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c,
+       0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c,
+       0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c,
+       0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c,
+       0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c,
+       0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c,
+       0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c,
+       0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c,
+       0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c,
+       0x31f6: 0x000c, 0x31fb: 0x000c,
+       0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c,
+       // Block 0xc8, offset 0x3200
+       0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c,
+       0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c,
+       0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c,
+       0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c,
+       0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c,
+       0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c,
+       0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c,
+       0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c,
+       0x3235: 0x000c,
+       // Block 0xc9, offset 0x3240
+       0x3244: 0x000c,
+       0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c,
+       0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c,
+       0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c,
+       0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c,
+       // Block 0xca, offset 0x3280
+       0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c,
+       0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c,
+       0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c,
+       0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c,
+       0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c,
+       0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c,
+       0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c,
+       0x32aa: 0x000c,
+       // Block 0xcb, offset 0x32c0
+       0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001,
+       0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001,
+       0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c,
+       0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001,
+       0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001,
+       0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001,
+       0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001,
+       0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001,
+       0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001,
+       0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001,
+       0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001,
+       // Block 0xcc, offset 0x3300
+       0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c,
+       0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001,
+       0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001,
+       0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001,
+       0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001,
+       0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001,
+       0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001,
+       0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001,
+       0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001,
+       0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001,
+       0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001,
+       // Block 0xcd, offset 0x3340
+       0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d,
+       0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d,
+       0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d,
+       0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d,
+       0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d,
+       0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d,
+       0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d,
+       0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d,
+       0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d,
+       0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d,
+       0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d,
+       // Block 0xce, offset 0x3380
+       0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a,
+       0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a,
+       0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a,
+       0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a,
+       0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a,
+       0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a,
+       0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a,
+       0x33aa: 0x000a, 0x33ab: 0x000a,
+       0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a,
+       0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a,
+       0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a,
+       // Block 0xcf, offset 0x33c0
+       0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a,
+       0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a,
+       0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a,
+       0x33d2: 0x000a, 0x33d3: 0x000a,
+       0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a,
+       0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a,
+       0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a,
+       0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a,
+       0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a,
+       0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a,
+       // Block 0xd0, offset 0x3400
+       0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a,
+       0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a,
+       0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a,
+       0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a,
+       0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a,
+       0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a,
+       0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a,
+       0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a,
+       0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a,
+       // Block 0xd1, offset 0x3440
+       0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002,
+       0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a,
+       0x344c: 0x000a,
+       // Block 0xd2, offset 0x3480
+       0x34aa: 0x000a, 0x34ab: 0x000a,
+       // Block 0xd3, offset 0x34c0
+       0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,
+       0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,
+       0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,
+       0x34d2: 0x000a,
+       0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,
+       0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,
+       0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a,
+       0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,
+       0x34f6: 0x000a,
+       // Block 0xd4, offset 0x3500
+       0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,
+       0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,
+       0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a,
+       0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a,
+       // Block 0xd5, offset 0x3540
+       0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a,
+       0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a,
+       0x3550: 0x000a, 0x3551: 0x000a,
+       0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a,
+       0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a,
+       0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a,
+       0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a,
+       0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a,
+       0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a,
+       0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a,
+       0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a,
+       // Block 0xd6, offset 0x3580
+       0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a,
+       0x3586: 0x000a, 0x3587: 0x000a,
+       0x3590: 0x000a, 0x3591: 0x000a,
+       0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a,
+       0x3598: 0x000a, 0x3599: 0x000a,
+       0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a,
+       0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a,
+       0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a,
+       0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a,
+       0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a,
+       0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a,
+       // Block 0xd7, offset 0x35c0
+       0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a,
+       0x35c6: 0x000a, 0x35c7: 0x000a,
+       0x35d0: 0x000a, 0x35d1: 0x000a,
+       0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a,
+       0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a,
+       0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,
+       0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a,
+       0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a,
+       // Block 0xd8, offset 0x3600
+       0x3610: 0x000a, 0x3611: 0x000a,
+       0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a,
+       0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a,
+       0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,
+       0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a,
+       0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,
+       0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a,
+       0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a,
+       // Block 0xd9, offset 0x3640
+       0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,
+       0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,
+       0x3650: 0x000a, 0x3651: 0x000a,
+       0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a,
+       0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a,
+       0x365e: 0x000a,
+       // Block 0xda, offset 0x3680
+       0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,
+       0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,
+       0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a,
+       // Block 0xdb, offset 0x36c0
+       0x36fe: 0x000b, 0x36ff: 0x000b,
+       // Block 0xdc, offset 0x3700
+       0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b,
+       0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b,
+       0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b,
+       0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b,
+       0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b,
+       0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b,
+       0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b,
+       0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b,
+       0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b,
+       0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b,
+       0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b,
+       // Block 0xdd, offset 0x3740
+       0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c,
+       0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c,
+       0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c,
+       0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c,
+       0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c,
+       0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c,
+       0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c,
+       0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c,
+       0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b,
+       0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b,
+       0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b,
+}
+
+// bidiIndex: 24 blocks, 1536 entries, 1536 bytes
+// Block 0 is the zero block.
+var bidiIndex = [1536]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x01, 0xc3: 0x02,
+       0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
+       0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
+       0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
+       0xea: 0x07, 0xef: 0x08,
+       0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,
+       // Block 0x4, offset 0x100
+       0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
+       0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
+       0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,
+       0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,
+       // Block 0x5, offset 0x140
+       0x140: 0x31, 0x141: 0x32, 0x142: 0x33,
+       0x14d: 0x34, 0x14e: 0x35,
+       0x150: 0x36,
+       0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,
+       0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,
+       0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,
+       0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,
+       0x17e: 0x4b, 0x17f: 0x4c,
+       // Block 0x6, offset 0x180
+       0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,
+       0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59,
+       0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,
+       0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60,
+       0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62,
+       0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65,
+       0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68,
+       0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71,
+       0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77,
+       // Block 0x8, offset 0x200
+       0x237: 0x54,
+       // Block 0x9, offset 0x240
+       0x252: 0x78, 0x253: 0x79,
+       0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f,
+       0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86,
+       0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b,
+       // Block 0xa, offset 0x280
+       0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e,
+       0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f,
+       0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95,
+       // Block 0xb, offset 0x2c0
+       0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98,
+       0x2cb: 0x99, 0x2cd: 0x9a,
+       0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b,
+       0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b,
+       0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b,
+       0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b,
+       // Block 0xc, offset 0x300
+       0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7,
+       0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab,
+       0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1,
+       0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5,
+       0x330: 0xb6, 0x332: 0xb7,
+       // Block 0xd, offset 0x340
+       0x36b: 0xb8, 0x36c: 0xb9,
+       0x37e: 0xba,
+       // Block 0xe, offset 0x380
+       0x3b2: 0xbb,
+       // Block 0xf, offset 0x3c0
+       0x3c5: 0xbc, 0x3c6: 0xbd,
+       0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf,
+       0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4,
+       0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7,
+       // Block 0x10, offset 0x400
+       0x400: 0xc8,
+       0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b,
+       0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b,
+       0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b,
+       0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b,
+       // Block 0x11, offset 0x440
+       0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0,
+       0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,
+       0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,
+       0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2,
+       0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36,
+       0x47f: 0xd9,
+       // Block 0x12, offset 0x480
+       0x4bf: 0xd9,
+       // Block 0x13, offset 0x4c0
+       0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,
+       0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,
+       0x4ef: 0x10,
+       0x4ff: 0x10,
+       // Block 0x14, offset 0x500
+       0x50f: 0x10,
+       0x51f: 0x10,
+       0x52f: 0x10,
+       0x53f: 0x10,
+       // Block 0x15, offset 0x540
+       0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb,
+       0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda,
+       0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda,
+       0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda,
+       0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda,
+       0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda,
+       0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda,
+       0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda,
+       // Block 0x16, offset 0x580
+       0x58f: 0x10,
+       0x59f: 0x10,
+       0x5a0: 0x13,
+       0x5af: 0x10,
+       0x5bf: 0x10,
+       // Block 0x17, offset 0x5c0
+       0x5cf: 0x10,
+}
+
+// Total table size 15800 bytes (15KiB); checksum: F50EF68C
diff --git a/libgo/go/golang.org/x/text/unicode/bidi/trieval.go b/libgo/go/golang.org/x/text/unicode/bidi/trieval.go
new file mode 100644 (file)
index 0000000..4c459c4
--- /dev/null
@@ -0,0 +1,60 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package bidi
+
+// Class is the Unicode BiDi class. Each rune has a single class.
+type Class uint
+
+const (
+       L       Class = iota // LeftToRight
+       R                    // RightToLeft
+       EN                   // EuropeanNumber
+       ES                   // EuropeanSeparator
+       ET                   // EuropeanTerminator
+       AN                   // ArabicNumber
+       CS                   // CommonSeparator
+       B                    // ParagraphSeparator
+       S                    // SegmentSeparator
+       WS                   // WhiteSpace
+       ON                   // OtherNeutral
+       BN                   // BoundaryNeutral
+       NSM                  // NonspacingMark
+       AL                   // ArabicLetter
+       Control              // Control LRO - PDI
+
+       numClass
+
+       LRO // LeftToRightOverride
+       RLO // RightToLeftOverride
+       LRE // LeftToRightEmbedding
+       RLE // RightToLeftEmbedding
+       PDF // PopDirectionalFormat
+       LRI // LeftToRightIsolate
+       RLI // RightToLeftIsolate
+       FSI // FirstStrongIsolate
+       PDI // PopDirectionalIsolate
+
+       unknownClass = ^Class(0)
+)
+
+var controlToClass = map[rune]Class{
+       0x202D: LRO, // LeftToRightOverride,
+       0x202E: RLO, // RightToLeftOverride,
+       0x202A: LRE, // LeftToRightEmbedding,
+       0x202B: RLE, // RightToLeftEmbedding,
+       0x202C: PDF, // PopDirectionalFormat,
+       0x2066: LRI, // LeftToRightIsolate,
+       0x2067: RLI, // RightToLeftIsolate,
+       0x2068: FSI, // FirstStrongIsolate,
+       0x2069: PDI, // PopDirectionalIsolate,
+}
+
+// A trie entry has the following bits:
+// 7..5  XOR mask for brackets
+// 4     1: Bracket open, 0: Bracket close
+// 3..0  Class type
+
+const (
+       openMask     = 0x10
+       xorMaskShift = 5
+)
diff --git a/libgo/go/golang.org/x/text/unicode/norm/composition.go b/libgo/go/golang.org/x/text/unicode/norm/composition.go
new file mode 100644 (file)
index 0000000..e2087bc
--- /dev/null
@@ -0,0 +1,512 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import "unicode/utf8"
+
+const (
+       maxNonStarters = 30
+       // The maximum number of characters needed for a buffer is
+       // maxNonStarters + 1 for the starter + 1 for the GCJ
+       maxBufferSize    = maxNonStarters + 2
+       maxNFCExpansion  = 3  // NFC(0x1D160)
+       maxNFKCExpansion = 18 // NFKC(0xFDFA)
+
+       maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128
+)
+
+// ssState is used for reporting the segment state after inserting a rune.
+// It is returned by streamSafe.next.
+type ssState int
+
+const (
+       // Indicates a rune was successfully added to the segment.
+       ssSuccess ssState = iota
+       // Indicates a rune starts a new segment and should not be added.
+       ssStarter
+       // Indicates a rune caused a segment overflow and a CGJ should be inserted.
+       ssOverflow
+)
+
+// streamSafe implements the policy of when a CGJ should be inserted.
+type streamSafe uint8
+
+// first inserts the first rune of a segment. It is a faster version of next if
+// it is known p represents the first rune in a segment.
+func (ss *streamSafe) first(p Properties) {
+       *ss = streamSafe(p.nTrailingNonStarters())
+}
+
+// insert returns a ssState value to indicate whether a rune represented by p
+// can be inserted.
+func (ss *streamSafe) next(p Properties) ssState {
+       if *ss > maxNonStarters {
+               panic("streamSafe was not reset")
+       }
+       n := p.nLeadingNonStarters()
+       if *ss += streamSafe(n); *ss > maxNonStarters {
+               *ss = 0
+               return ssOverflow
+       }
+       // The Stream-Safe Text Processing prescribes that the counting can stop
+       // as soon as a starter is encountered. However, there are some starters,
+       // like Jamo V and T, that can combine with other runes, leaving their
+       // successive non-starters appended to the previous, possibly causing an
+       // overflow. We will therefore consider any rune with a non-zero nLead to
+       // be a non-starter. Note that it always hold that if nLead > 0 then
+       // nLead == nTrail.
+       if n == 0 {
+               *ss = streamSafe(p.nTrailingNonStarters())
+               return ssStarter
+       }
+       return ssSuccess
+}
+
+// backwards is used for checking for overflow and segment starts
+// when traversing a string backwards. Users do not need to call first
+// for the first rune. The state of the streamSafe retains the count of
+// the non-starters loaded.
+func (ss *streamSafe) backwards(p Properties) ssState {
+       if *ss > maxNonStarters {
+               panic("streamSafe was not reset")
+       }
+       c := *ss + streamSafe(p.nTrailingNonStarters())
+       if c > maxNonStarters {
+               return ssOverflow
+       }
+       *ss = c
+       if p.nLeadingNonStarters() == 0 {
+               return ssStarter
+       }
+       return ssSuccess
+}
+
+func (ss streamSafe) isMax() bool {
+       return ss == maxNonStarters
+}
+
+// GraphemeJoiner is inserted after maxNonStarters non-starter runes.
+const GraphemeJoiner = "\u034F"
+
+// reorderBuffer is used to normalize a single segment.  Characters inserted with
+// insert are decomposed and reordered based on CCC. The compose method can
+// be used to recombine characters.  Note that the byte buffer does not hold
+// the UTF-8 characters in order.  Only the rune array is maintained in sorted
+// order. flush writes the resulting segment to a byte array.
+type reorderBuffer struct {
+       rune  [maxBufferSize]Properties // Per character info.
+       byte  [maxByteBufferSize]byte   // UTF-8 buffer. Referenced by runeInfo.pos.
+       nbyte uint8                     // Number or bytes.
+       ss    streamSafe                // For limiting length of non-starter sequence.
+       nrune int                       // Number of runeInfos.
+       f     formInfo
+
+       src      input
+       nsrc     int
+       tmpBytes input
+
+       out    []byte
+       flushF func(*reorderBuffer) bool
+}
+
+func (rb *reorderBuffer) init(f Form, src []byte) {
+       rb.f = *formTable[f]
+       rb.src.setBytes(src)
+       rb.nsrc = len(src)
+       rb.ss = 0
+}
+
+func (rb *reorderBuffer) initString(f Form, src string) {
+       rb.f = *formTable[f]
+       rb.src.setString(src)
+       rb.nsrc = len(src)
+       rb.ss = 0
+}
+
+func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) {
+       rb.out = out
+       rb.flushF = f
+}
+
+// reset discards all characters from the buffer.
+func (rb *reorderBuffer) reset() {
+       rb.nrune = 0
+       rb.nbyte = 0
+}
+
+func (rb *reorderBuffer) doFlush() bool {
+       if rb.f.composing {
+               rb.compose()
+       }
+       res := rb.flushF(rb)
+       rb.reset()
+       return res
+}
+
+// appendFlush appends the normalized segment to rb.out.
+func appendFlush(rb *reorderBuffer) bool {
+       for i := 0; i < rb.nrune; i++ {
+               start := rb.rune[i].pos
+               end := start + rb.rune[i].size
+               rb.out = append(rb.out, rb.byte[start:end]...)
+       }
+       return true
+}
+
+// flush appends the normalized segment to out and resets rb.
+func (rb *reorderBuffer) flush(out []byte) []byte {
+       for i := 0; i < rb.nrune; i++ {
+               start := rb.rune[i].pos
+               end := start + rb.rune[i].size
+               out = append(out, rb.byte[start:end]...)
+       }
+       rb.reset()
+       return out
+}
+
+// flushCopy copies the normalized segment to buf and resets rb.
+// It returns the number of bytes written to buf.
+func (rb *reorderBuffer) flushCopy(buf []byte) int {
+       p := 0
+       for i := 0; i < rb.nrune; i++ {
+               runep := rb.rune[i]
+               p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size])
+       }
+       rb.reset()
+       return p
+}
+
+// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class.
+// It returns false if the buffer is not large enough to hold the rune.
+// It is used internally by insert and insertString only.
+func (rb *reorderBuffer) insertOrdered(info Properties) {
+       n := rb.nrune
+       b := rb.rune[:]
+       cc := info.ccc
+       if cc > 0 {
+               // Find insertion position + move elements to make room.
+               for ; n > 0; n-- {
+                       if b[n-1].ccc <= cc {
+                               break
+                       }
+                       b[n] = b[n-1]
+               }
+       }
+       rb.nrune += 1
+       pos := uint8(rb.nbyte)
+       rb.nbyte += utf8.UTFMax
+       info.pos = pos
+       b[n] = info
+}
+
+// insertErr is an error code returned by insert. Using this type instead
+// of error improves performance up to 20% for many of the benchmarks.
+type insertErr int
+
+const (
+       iSuccess insertErr = -iota
+       iShortDst
+       iShortSrc
+)
+
+// insertFlush inserts the given rune in the buffer ordered by CCC.
+// If a decomposition with multiple segments are encountered, they leading
+// ones are flushed.
+// It returns a non-zero error code if the rune was not inserted.
+func (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr {
+       if rune := src.hangul(i); rune != 0 {
+               rb.decomposeHangul(rune)
+               return iSuccess
+       }
+       if info.hasDecomposition() {
+               return rb.insertDecomposed(info.Decomposition())
+       }
+       rb.insertSingle(src, i, info)
+       return iSuccess
+}
+
+// insertUnsafe inserts the given rune in the buffer ordered by CCC.
+// It is assumed there is sufficient space to hold the runes. It is the
+// responsibility of the caller to ensure this. This can be done by checking
+// the state returned by the streamSafe type.
+func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) {
+       if rune := src.hangul(i); rune != 0 {
+               rb.decomposeHangul(rune)
+       }
+       if info.hasDecomposition() {
+               // TODO: inline.
+               rb.insertDecomposed(info.Decomposition())
+       } else {
+               rb.insertSingle(src, i, info)
+       }
+}
+
+// insertDecomposed inserts an entry in to the reorderBuffer for each rune
+// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes.
+// It flushes the buffer on each new segment start.
+func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr {
+       rb.tmpBytes.setBytes(dcomp)
+       // As the streamSafe accounting already handles the counting for modifiers,
+       // we don't have to call next. However, we do need to keep the accounting
+       // intact when flushing the buffer.
+       for i := 0; i < len(dcomp); {
+               info := rb.f.info(rb.tmpBytes, i)
+               if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() {
+                       return iShortDst
+               }
+               i += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)])
+               rb.insertOrdered(info)
+       }
+       return iSuccess
+}
+
+// insertSingle inserts an entry in the reorderBuffer for the rune at
+// position i. info is the runeInfo for the rune at position i.
+func (rb *reorderBuffer) insertSingle(src input, i int, info Properties) {
+       src.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size))
+       rb.insertOrdered(info)
+}
+
+// insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb.
+func (rb *reorderBuffer) insertCGJ() {
+       rb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))})
+}
+
+// appendRune inserts a rune at the end of the buffer. It is used for Hangul.
+func (rb *reorderBuffer) appendRune(r rune) {
+       bn := rb.nbyte
+       sz := utf8.EncodeRune(rb.byte[bn:], rune(r))
+       rb.nbyte += utf8.UTFMax
+       rb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)}
+       rb.nrune++
+}
+
+// assignRune sets a rune at position pos. It is used for Hangul and recomposition.
+func (rb *reorderBuffer) assignRune(pos int, r rune) {
+       bn := rb.rune[pos].pos
+       sz := utf8.EncodeRune(rb.byte[bn:], rune(r))
+       rb.rune[pos] = Properties{pos: bn, size: uint8(sz)}
+}
+
+// runeAt returns the rune at position n. It is used for Hangul and recomposition.
+func (rb *reorderBuffer) runeAt(n int) rune {
+       inf := rb.rune[n]
+       r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size])
+       return r
+}
+
+// bytesAt returns the UTF-8 encoding of the rune at position n.
+// It is used for Hangul and recomposition.
+func (rb *reorderBuffer) bytesAt(n int) []byte {
+       inf := rb.rune[n]
+       return rb.byte[inf.pos : int(inf.pos)+int(inf.size)]
+}
+
+// For Hangul we combine algorithmically, instead of using tables.
+const (
+       hangulBase  = 0xAC00 // UTF-8(hangulBase) -> EA B0 80
+       hangulBase0 = 0xEA
+       hangulBase1 = 0xB0
+       hangulBase2 = 0x80
+
+       hangulEnd  = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4
+       hangulEnd0 = 0xED
+       hangulEnd1 = 0x9E
+       hangulEnd2 = 0xA4
+
+       jamoLBase  = 0x1100 // UTF-8(jamoLBase) -> E1 84 00
+       jamoLBase0 = 0xE1
+       jamoLBase1 = 0x84
+       jamoLEnd   = 0x1113
+       jamoVBase  = 0x1161
+       jamoVEnd   = 0x1176
+       jamoTBase  = 0x11A7
+       jamoTEnd   = 0x11C3
+
+       jamoTCount   = 28
+       jamoVCount   = 21
+       jamoVTCount  = 21 * 28
+       jamoLVTCount = 19 * 21 * 28
+)
+
+const hangulUTF8Size = 3
+
+func isHangul(b []byte) bool {
+       if len(b) < hangulUTF8Size {
+               return false
+       }
+       b0 := b[0]
+       if b0 < hangulBase0 {
+               return false
+       }
+       b1 := b[1]
+       switch {
+       case b0 == hangulBase0:
+               return b1 >= hangulBase1
+       case b0 < hangulEnd0:
+               return true
+       case b0 > hangulEnd0:
+               return false
+       case b1 < hangulEnd1:
+               return true
+       }
+       return b1 == hangulEnd1 && b[2] < hangulEnd2
+}
+
+func isHangulString(b string) bool {
+       if len(b) < hangulUTF8Size {
+               return false
+       }
+       b0 := b[0]
+       if b0 < hangulBase0 {
+               return false
+       }
+       b1 := b[1]
+       switch {
+       case b0 == hangulBase0:
+               return b1 >= hangulBase1
+       case b0 < hangulEnd0:
+               return true
+       case b0 > hangulEnd0:
+               return false
+       case b1 < hangulEnd1:
+               return true
+       }
+       return b1 == hangulEnd1 && b[2] < hangulEnd2
+}
+
+// Caller must ensure len(b) >= 2.
+func isJamoVT(b []byte) bool {
+       // True if (rune & 0xff00) == jamoLBase
+       return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1
+}
+
+func isHangulWithoutJamoT(b []byte) bool {
+       c, _ := utf8.DecodeRune(b)
+       c -= hangulBase
+       return c < jamoLVTCount && c%jamoTCount == 0
+}
+
+// decomposeHangul writes the decomposed Hangul to buf and returns the number
+// of bytes written.  len(buf) should be at least 9.
+func decomposeHangul(buf []byte, r rune) int {
+       const JamoUTF8Len = 3
+       r -= hangulBase
+       x := r % jamoTCount
+       r /= jamoTCount
+       utf8.EncodeRune(buf, jamoLBase+r/jamoVCount)
+       utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount)
+       if x != 0 {
+               utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x)
+               return 3 * JamoUTF8Len
+       }
+       return 2 * JamoUTF8Len
+}
+
+// decomposeHangul algorithmically decomposes a Hangul rune into
+// its Jamo components.
+// See https://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul.
+func (rb *reorderBuffer) decomposeHangul(r rune) {
+       r -= hangulBase
+       x := r % jamoTCount
+       r /= jamoTCount
+       rb.appendRune(jamoLBase + r/jamoVCount)
+       rb.appendRune(jamoVBase + r%jamoVCount)
+       if x != 0 {
+               rb.appendRune(jamoTBase + x)
+       }
+}
+
+// combineHangul algorithmically combines Jamo character components into Hangul.
+// See https://unicode.org/reports/tr15/#Hangul for details on combining Hangul.
+func (rb *reorderBuffer) combineHangul(s, i, k int) {
+       b := rb.rune[:]
+       bn := rb.nrune
+       for ; i < bn; i++ {
+               cccB := b[k-1].ccc
+               cccC := b[i].ccc
+               if cccB == 0 {
+                       s = k - 1
+               }
+               if s != k-1 && cccB >= cccC {
+                       // b[i] is blocked by greater-equal cccX below it
+                       b[k] = b[i]
+                       k++
+               } else {
+                       l := rb.runeAt(s) // also used to compare to hangulBase
+                       v := rb.runeAt(i) // also used to compare to jamoT
+                       switch {
+                       case jamoLBase <= l && l < jamoLEnd &&
+                               jamoVBase <= v && v < jamoVEnd:
+                               // 11xx plus 116x to LV
+                               rb.assignRune(s, hangulBase+
+                                       (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount)
+                       case hangulBase <= l && l < hangulEnd &&
+                               jamoTBase < v && v < jamoTEnd &&
+                               ((l-hangulBase)%jamoTCount) == 0:
+                               // ACxx plus 11Ax to LVT
+                               rb.assignRune(s, l+v-jamoTBase)
+                       default:
+                               b[k] = b[i]
+                               k++
+                       }
+               }
+       }
+       rb.nrune = k
+}
+
+// compose recombines the runes in the buffer.
+// It should only be used to recompose a single segment, as it will not
+// handle alternations between Hangul and non-Hangul characters correctly.
+func (rb *reorderBuffer) compose() {
+       // Lazily load the map used by the combine func below, but do
+       // it outside of the loop.
+       recompMapOnce.Do(buildRecompMap)
+
+       // UAX #15, section X5 , including Corrigendum #5
+       // "In any character sequence beginning with starter S, a character C is
+       //  blocked from S if and only if there is some character B between S
+       //  and C, and either B is a starter or it has the same or higher
+       //  combining class as C."
+       bn := rb.nrune
+       if bn == 0 {
+               return
+       }
+       k := 1
+       b := rb.rune[:]
+       for s, i := 0, 1; i < bn; i++ {
+               if isJamoVT(rb.bytesAt(i)) {
+                       // Redo from start in Hangul mode. Necessary to support
+                       // U+320E..U+321E in NFKC mode.
+                       rb.combineHangul(s, i, k)
+                       return
+               }
+               ii := b[i]
+               // We can only use combineForward as a filter if we later
+               // get the info for the combined character. This is more
+               // expensive than using the filter. Using combinesBackward()
+               // is safe.
+               if ii.combinesBackward() {
+                       cccB := b[k-1].ccc
+                       cccC := ii.ccc
+                       blocked := false // b[i] blocked by starter or greater or equal CCC?
+                       if cccB == 0 {
+                               s = k - 1
+                       } else {
+                               blocked = s != k-1 && cccB >= cccC
+                       }
+                       if !blocked {
+                               combined := combine(rb.runeAt(s), rb.runeAt(i))
+                               if combined != 0 {
+                                       rb.assignRune(s, combined)
+                                       continue
+                               }
+                       }
+               }
+               b[k] = b[i]
+               k++
+       }
+       rb.nrune = k
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/forminfo.go b/libgo/go/golang.org/x/text/unicode/norm/forminfo.go
new file mode 100644 (file)
index 0000000..526c703
--- /dev/null
@@ -0,0 +1,278 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import "encoding/binary"
+
+// This file contains Form-specific logic and wrappers for data in tables.go.
+
+// Rune info is stored in a separate trie per composing form. A composing form
+// and its corresponding decomposing form share the same trie.  Each trie maps
+// a rune to a uint16. The values take two forms.  For v >= 0x8000:
+//   bits
+//   15:    1 (inverse of NFD_QC bit of qcInfo)
+//   13..7: qcInfo (see below). isYesD is always true (no decompostion).
+//    6..0: ccc (compressed CCC value).
+// For v < 0x8000, the respective rune has a decomposition and v is an index
+// into a byte array of UTF-8 decomposition sequences and additional info and
+// has the form:
+//    <header> <decomp_byte>* [<tccc> [<lccc>]]
+// The header contains the number of bytes in the decomposition (excluding this
+// length byte). The two most significant bits of this length byte correspond
+// to bit 5 and 4 of qcInfo (see below).  The byte sequence itself starts at v+1.
+// The byte sequence is followed by a trailing and leading CCC if the values
+// for these are not zero.  The value of v determines which ccc are appended
+// to the sequences.  For v < firstCCC, there are none, for v >= firstCCC,
+// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC
+// there is an additional leading ccc. The value of tccc itself is the
+// trailing CCC shifted left 2 bits. The two least-significant bits of tccc
+// are the number of trailing non-starters.
+
+const (
+       qcInfoMask      = 0x3F // to clear all but the relevant bits in a qcInfo
+       headerLenMask   = 0x3F // extract the length value from the header byte
+       headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte
+)
+
+// Properties provides access to normalization properties of a rune.
+type Properties struct {
+       pos   uint8  // start position in reorderBuffer; used in composition.go
+       size  uint8  // length of UTF-8 encoding of this rune
+       ccc   uint8  // leading canonical combining class (ccc if not decomposition)
+       tccc  uint8  // trailing canonical combining class (ccc if not decomposition)
+       nLead uint8  // number of leading non-starters.
+       flags qcInfo // quick check flags
+       index uint16
+}
+
+// functions dispatchable per form
+type lookupFunc func(b input, i int) Properties
+
+// formInfo holds Form-specific functions and tables.
+type formInfo struct {
+       form                     Form
+       composing, compatibility bool // form type
+       info                     lookupFunc
+       nextMain                 iterFunc
+}
+
+var formTable = []*formInfo{{
+       form:          NFC,
+       composing:     true,
+       compatibility: false,
+       info:          lookupInfoNFC,
+       nextMain:      nextComposed,
+}, {
+       form:          NFD,
+       composing:     false,
+       compatibility: false,
+       info:          lookupInfoNFC,
+       nextMain:      nextDecomposed,
+}, {
+       form:          NFKC,
+       composing:     true,
+       compatibility: true,
+       info:          lookupInfoNFKC,
+       nextMain:      nextComposed,
+}, {
+       form:          NFKD,
+       composing:     false,
+       compatibility: true,
+       info:          lookupInfoNFKC,
+       nextMain:      nextDecomposed,
+}}
+
+// We do not distinguish between boundaries for NFC, NFD, etc. to avoid
+// unexpected behavior for the user.  For example, in NFD, there is a boundary
+// after 'a'.  However, 'a' might combine with modifiers, so from the application's
+// perspective it is not a good boundary. We will therefore always use the
+// boundaries for the combining variants.
+
+// BoundaryBefore returns true if this rune starts a new segment and
+// cannot combine with any rune on the left.
+func (p Properties) BoundaryBefore() bool {
+       if p.ccc == 0 && !p.combinesBackward() {
+               return true
+       }
+       // We assume that the CCC of the first character in a decomposition
+       // is always non-zero if different from info.ccc and that we can return
+       // false at this point. This is verified by maketables.
+       return false
+}
+
+// BoundaryAfter returns true if runes cannot combine with or otherwise
+// interact with this or previous runes.
+func (p Properties) BoundaryAfter() bool {
+       // TODO: loosen these conditions.
+       return p.isInert()
+}
+
+// We pack quick check data in 4 bits:
+//   5:    Combines forward  (0 == false, 1 == true)
+//   4..3: NFC_QC Yes(00), No (10), or Maybe (11)
+//   2:    NFD_QC Yes (0) or No (1). No also means there is a decomposition.
+//   1..0: Number of trailing non-starters.
+//
+// When all 4 bits are zero, the character is inert, meaning it is never
+// influenced by normalization.
+type qcInfo uint8
+
+func (p Properties) isYesC() bool { return p.flags&0x10 == 0 }
+func (p Properties) isYesD() bool { return p.flags&0x4 == 0 }
+
+func (p Properties) combinesForward() bool  { return p.flags&0x20 != 0 }
+func (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe
+func (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD
+
+func (p Properties) isInert() bool {
+       return p.flags&qcInfoMask == 0 && p.ccc == 0
+}
+
+func (p Properties) multiSegment() bool {
+       return p.index >= firstMulti && p.index < endMulti
+}
+
+func (p Properties) nLeadingNonStarters() uint8 {
+       return p.nLead
+}
+
+func (p Properties) nTrailingNonStarters() uint8 {
+       return uint8(p.flags & 0x03)
+}
+
+// Decomposition returns the decomposition for the underlying rune
+// or nil if there is none.
+func (p Properties) Decomposition() []byte {
+       // TODO: create the decomposition for Hangul?
+       if p.index == 0 {
+               return nil
+       }
+       i := p.index
+       n := decomps[i] & headerLenMask
+       i++
+       return decomps[i : i+uint16(n)]
+}
+
+// Size returns the length of UTF-8 encoding of the rune.
+func (p Properties) Size() int {
+       return int(p.size)
+}
+
+// CCC returns the canonical combining class of the underlying rune.
+func (p Properties) CCC() uint8 {
+       if p.index >= firstCCCZeroExcept {
+               return 0
+       }
+       return ccc[p.ccc]
+}
+
+// LeadCCC returns the CCC of the first rune in the decomposition.
+// If there is no decomposition, LeadCCC equals CCC.
+func (p Properties) LeadCCC() uint8 {
+       return ccc[p.ccc]
+}
+
+// TrailCCC returns the CCC of the last rune in the decomposition.
+// If there is no decomposition, TrailCCC equals CCC.
+func (p Properties) TrailCCC() uint8 {
+       return ccc[p.tccc]
+}
+
+func buildRecompMap() {
+       recompMap = make(map[uint32]rune, len(recompMapPacked)/8)
+       var buf [8]byte
+       for i := 0; i < len(recompMapPacked); i += 8 {
+               copy(buf[:], recompMapPacked[i:i+8])
+               key := binary.BigEndian.Uint32(buf[:4])
+               val := binary.BigEndian.Uint32(buf[4:])
+               recompMap[key] = rune(val)
+       }
+}
+
+// Recomposition
+// We use 32-bit keys instead of 64-bit for the two codepoint keys.
+// This clips off the bits of three entries, but we know this will not
+// result in a collision. In the unlikely event that changes to
+// UnicodeData.txt introduce collisions, the compiler will catch it.
+// Note that the recomposition map for NFC and NFKC are identical.
+
+// combine returns the combined rune or 0 if it doesn't exist.
+//
+// The caller is responsible for calling
+// recompMapOnce.Do(buildRecompMap) sometime before this is called.
+func combine(a, b rune) rune {
+       key := uint32(uint16(a))<<16 + uint32(uint16(b))
+       if recompMap == nil {
+               panic("caller error") // see func comment
+       }
+       return recompMap[key]
+}
+
+func lookupInfoNFC(b input, i int) Properties {
+       v, sz := b.charinfoNFC(i)
+       return compInfo(v, sz)
+}
+
+func lookupInfoNFKC(b input, i int) Properties {
+       v, sz := b.charinfoNFKC(i)
+       return compInfo(v, sz)
+}
+
+// Properties returns properties for the first rune in s.
+func (f Form) Properties(s []byte) Properties {
+       if f == NFC || f == NFD {
+               return compInfo(nfcData.lookup(s))
+       }
+       return compInfo(nfkcData.lookup(s))
+}
+
+// PropertiesString returns properties for the first rune in s.
+func (f Form) PropertiesString(s string) Properties {
+       if f == NFC || f == NFD {
+               return compInfo(nfcData.lookupString(s))
+       }
+       return compInfo(nfkcData.lookupString(s))
+}
+
+// compInfo converts the information contained in v and sz
+// to a Properties.  See the comment at the top of the file
+// for more information on the format.
+func compInfo(v uint16, sz int) Properties {
+       if v == 0 {
+               return Properties{size: uint8(sz)}
+       } else if v >= 0x8000 {
+               p := Properties{
+                       size:  uint8(sz),
+                       ccc:   uint8(v),
+                       tccc:  uint8(v),
+                       flags: qcInfo(v >> 8),
+               }
+               if p.ccc > 0 || p.combinesBackward() {
+                       p.nLead = uint8(p.flags & 0x3)
+               }
+               return p
+       }
+       // has decomposition
+       h := decomps[v]
+       f := (qcInfo(h&headerFlagsMask) >> 2) | 0x4
+       p := Properties{size: uint8(sz), flags: f, index: v}
+       if v >= firstCCC {
+               v += uint16(h&headerLenMask) + 1
+               c := decomps[v]
+               p.tccc = c >> 2
+               p.flags |= qcInfo(c & 0x3)
+               if v >= firstLeadingCCC {
+                       p.nLead = c & 0x3
+                       if v >= firstStarterWithNLead {
+                               // We were tricked. Remove the decomposition.
+                               p.flags &= 0x03
+                               p.index = 0
+                               return p
+                       }
+                       p.ccc = decomps[v+1]
+               }
+       }
+       return p
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/input.go b/libgo/go/golang.org/x/text/unicode/norm/input.go
new file mode 100644 (file)
index 0000000..479e35b
--- /dev/null
@@ -0,0 +1,109 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import "unicode/utf8"
+
+type input struct {
+       str   string
+       bytes []byte
+}
+
+func inputBytes(str []byte) input {
+       return input{bytes: str}
+}
+
+func inputString(str string) input {
+       return input{str: str}
+}
+
+func (in *input) setBytes(str []byte) {
+       in.str = ""
+       in.bytes = str
+}
+
+func (in *input) setString(str string) {
+       in.str = str
+       in.bytes = nil
+}
+
+func (in *input) _byte(p int) byte {
+       if in.bytes == nil {
+               return in.str[p]
+       }
+       return in.bytes[p]
+}
+
+func (in *input) skipASCII(p, max int) int {
+       if in.bytes == nil {
+               for ; p < max && in.str[p] < utf8.RuneSelf; p++ {
+               }
+       } else {
+               for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ {
+               }
+       }
+       return p
+}
+
+func (in *input) skipContinuationBytes(p int) int {
+       if in.bytes == nil {
+               for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ {
+               }
+       } else {
+               for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ {
+               }
+       }
+       return p
+}
+
+func (in *input) appendSlice(buf []byte, b, e int) []byte {
+       if in.bytes != nil {
+               return append(buf, in.bytes[b:e]...)
+       }
+       for i := b; i < e; i++ {
+               buf = append(buf, in.str[i])
+       }
+       return buf
+}
+
+func (in *input) copySlice(buf []byte, b, e int) int {
+       if in.bytes == nil {
+               return copy(buf, in.str[b:e])
+       }
+       return copy(buf, in.bytes[b:e])
+}
+
+func (in *input) charinfoNFC(p int) (uint16, int) {
+       if in.bytes == nil {
+               return nfcData.lookupString(in.str[p:])
+       }
+       return nfcData.lookup(in.bytes[p:])
+}
+
+func (in *input) charinfoNFKC(p int) (uint16, int) {
+       if in.bytes == nil {
+               return nfkcData.lookupString(in.str[p:])
+       }
+       return nfkcData.lookup(in.bytes[p:])
+}
+
+func (in *input) hangul(p int) (r rune) {
+       var size int
+       if in.bytes == nil {
+               if !isHangulString(in.str[p:]) {
+                       return 0
+               }
+               r, size = utf8.DecodeRuneInString(in.str[p:])
+       } else {
+               if !isHangul(in.bytes[p:]) {
+                       return 0
+               }
+               r, size = utf8.DecodeRune(in.bytes[p:])
+       }
+       if size != hangulUTF8Size {
+               return 0
+       }
+       return r
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/iter.go b/libgo/go/golang.org/x/text/unicode/norm/iter.go
new file mode 100644 (file)
index 0000000..417c6b2
--- /dev/null
@@ -0,0 +1,458 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import (
+       "fmt"
+       "unicode/utf8"
+)
+
+// MaxSegmentSize is the maximum size of a byte buffer needed to consider any
+// sequence of starter and non-starter runes for the purpose of normalization.
+const MaxSegmentSize = maxByteBufferSize
+
+// An Iter iterates over a string or byte slice, while normalizing it
+// to a given Form.
+type Iter struct {
+       rb     reorderBuffer
+       buf    [maxByteBufferSize]byte
+       info   Properties // first character saved from previous iteration
+       next   iterFunc   // implementation of next depends on form
+       asciiF iterFunc
+
+       p        int    // current position in input source
+       multiSeg []byte // remainder of multi-segment decomposition
+}
+
+type iterFunc func(*Iter) []byte
+
+// Init initializes i to iterate over src after normalizing it to Form f.
+func (i *Iter) Init(f Form, src []byte) {
+       i.p = 0
+       if len(src) == 0 {
+               i.setDone()
+               i.rb.nsrc = 0
+               return
+       }
+       i.multiSeg = nil
+       i.rb.init(f, src)
+       i.next = i.rb.f.nextMain
+       i.asciiF = nextASCIIBytes
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.rb.ss.first(i.info)
+}
+
+// InitString initializes i to iterate over src after normalizing it to Form f.
+func (i *Iter) InitString(f Form, src string) {
+       i.p = 0
+       if len(src) == 0 {
+               i.setDone()
+               i.rb.nsrc = 0
+               return
+       }
+       i.multiSeg = nil
+       i.rb.initString(f, src)
+       i.next = i.rb.f.nextMain
+       i.asciiF = nextASCIIString
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.rb.ss.first(i.info)
+}
+
+// Seek sets the segment to be returned by the next call to Next to start
+// at position p.  It is the responsibility of the caller to set p to the
+// start of a segment.
+func (i *Iter) Seek(offset int64, whence int) (int64, error) {
+       var abs int64
+       switch whence {
+       case 0:
+               abs = offset
+       case 1:
+               abs = int64(i.p) + offset
+       case 2:
+               abs = int64(i.rb.nsrc) + offset
+       default:
+               return 0, fmt.Errorf("norm: invalid whence")
+       }
+       if abs < 0 {
+               return 0, fmt.Errorf("norm: negative position")
+       }
+       if int(abs) >= i.rb.nsrc {
+               i.setDone()
+               return int64(i.p), nil
+       }
+       i.p = int(abs)
+       i.multiSeg = nil
+       i.next = i.rb.f.nextMain
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.rb.ss.first(i.info)
+       return abs, nil
+}
+
+// returnSlice returns a slice of the underlying input type as a byte slice.
+// If the underlying is of type []byte, it will simply return a slice.
+// If the underlying is of type string, it will copy the slice to the buffer
+// and return that.
+func (i *Iter) returnSlice(a, b int) []byte {
+       if i.rb.src.bytes == nil {
+               return i.buf[:copy(i.buf[:], i.rb.src.str[a:b])]
+       }
+       return i.rb.src.bytes[a:b]
+}
+
+// Pos returns the byte position at which the next call to Next will commence processing.
+func (i *Iter) Pos() int {
+       return i.p
+}
+
+func (i *Iter) setDone() {
+       i.next = nextDone
+       i.p = i.rb.nsrc
+}
+
+// Done returns true if there is no more input to process.
+func (i *Iter) Done() bool {
+       return i.p >= i.rb.nsrc
+}
+
+// Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input.
+// For any input a and b for which f(a) == f(b), subsequent calls
+// to Next will return the same segments.
+// Modifying runes are grouped together with the preceding starter, if such a starter exists.
+// Although not guaranteed, n will typically be the smallest possible n.
+func (i *Iter) Next() []byte {
+       return i.next(i)
+}
+
+func nextASCIIBytes(i *Iter) []byte {
+       p := i.p + 1
+       if p >= i.rb.nsrc {
+               p0 := i.p
+               i.setDone()
+               return i.rb.src.bytes[p0:p]
+       }
+       if i.rb.src.bytes[p] < utf8.RuneSelf {
+               p0 := i.p
+               i.p = p
+               return i.rb.src.bytes[p0:p]
+       }
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.next = i.rb.f.nextMain
+       return i.next(i)
+}
+
+func nextASCIIString(i *Iter) []byte {
+       p := i.p + 1
+       if p >= i.rb.nsrc {
+               i.buf[0] = i.rb.src.str[i.p]
+               i.setDone()
+               return i.buf[:1]
+       }
+       if i.rb.src.str[p] < utf8.RuneSelf {
+               i.buf[0] = i.rb.src.str[i.p]
+               i.p = p
+               return i.buf[:1]
+       }
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.next = i.rb.f.nextMain
+       return i.next(i)
+}
+
+func nextHangul(i *Iter) []byte {
+       p := i.p
+       next := p + hangulUTF8Size
+       if next >= i.rb.nsrc {
+               i.setDone()
+       } else if i.rb.src.hangul(next) == 0 {
+               i.rb.ss.next(i.info)
+               i.info = i.rb.f.info(i.rb.src, i.p)
+               i.next = i.rb.f.nextMain
+               return i.next(i)
+       }
+       i.p = next
+       return i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))]
+}
+
+func nextDone(i *Iter) []byte {
+       return nil
+}
+
+// nextMulti is used for iterating over multi-segment decompositions
+// for decomposing normal forms.
+func nextMulti(i *Iter) []byte {
+       j := 0
+       d := i.multiSeg
+       // skip first rune
+       for j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ {
+       }
+       for j < len(d) {
+               info := i.rb.f.info(input{bytes: d}, j)
+               if info.BoundaryBefore() {
+                       i.multiSeg = d[j:]
+                       return d[:j]
+               }
+               j += int(info.size)
+       }
+       // treat last segment as normal decomposition
+       i.next = i.rb.f.nextMain
+       return i.next(i)
+}
+
+// nextMultiNorm is used for iterating over multi-segment decompositions
+// for composing normal forms.
+func nextMultiNorm(i *Iter) []byte {
+       j := 0
+       d := i.multiSeg
+       for j < len(d) {
+               info := i.rb.f.info(input{bytes: d}, j)
+               if info.BoundaryBefore() {
+                       i.rb.compose()
+                       seg := i.buf[:i.rb.flushCopy(i.buf[:])]
+                       i.rb.insertUnsafe(input{bytes: d}, j, info)
+                       i.multiSeg = d[j+int(info.size):]
+                       return seg
+               }
+               i.rb.insertUnsafe(input{bytes: d}, j, info)
+               j += int(info.size)
+       }
+       i.multiSeg = nil
+       i.next = nextComposed
+       return doNormComposed(i)
+}
+
+// nextDecomposed is the implementation of Next for forms NFD and NFKD.
+func nextDecomposed(i *Iter) (next []byte) {
+       outp := 0
+       inCopyStart, outCopyStart := i.p, 0
+       for {
+               if sz := int(i.info.size); sz <= 1 {
+                       i.rb.ss = 0
+                       p := i.p
+                       i.p++ // ASCII or illegal byte.  Either way, advance by 1.
+                       if i.p >= i.rb.nsrc {
+                               i.setDone()
+                               return i.returnSlice(p, i.p)
+                       } else if i.rb.src._byte(i.p) < utf8.RuneSelf {
+                               i.next = i.asciiF
+                               return i.returnSlice(p, i.p)
+                       }
+                       outp++
+               } else if d := i.info.Decomposition(); d != nil {
+                       // Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero.
+                       // Case 1: there is a leftover to copy.  In this case the decomposition
+                       // must begin with a modifier and should always be appended.
+                       // Case 2: no leftover. Simply return d if followed by a ccc == 0 value.
+                       p := outp + len(d)
+                       if outp > 0 {
+                               i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
+                               // TODO: this condition should not be possible, but we leave it
+                               // in for defensive purposes.
+                               if p > len(i.buf) {
+                                       return i.buf[:outp]
+                               }
+                       } else if i.info.multiSegment() {
+                               // outp must be 0 as multi-segment decompositions always
+                               // start a new segment.
+                               if i.multiSeg == nil {
+                                       i.multiSeg = d
+                                       i.next = nextMulti
+                                       return nextMulti(i)
+                               }
+                               // We are in the last segment.  Treat as normal decomposition.
+                               d = i.multiSeg
+                               i.multiSeg = nil
+                               p = len(d)
+                       }
+                       prevCC := i.info.tccc
+                       if i.p += sz; i.p >= i.rb.nsrc {
+                               i.setDone()
+                               i.info = Properties{} // Force BoundaryBefore to succeed.
+                       } else {
+                               i.info = i.rb.f.info(i.rb.src, i.p)
+                       }
+                       switch i.rb.ss.next(i.info) {
+                       case ssOverflow:
+                               i.next = nextCGJDecompose
+                               fallthrough
+                       case ssStarter:
+                               if outp > 0 {
+                                       copy(i.buf[outp:], d)
+                                       return i.buf[:p]
+                               }
+                               return d
+                       }
+                       copy(i.buf[outp:], d)
+                       outp = p
+                       inCopyStart, outCopyStart = i.p, outp
+                       if i.info.ccc < prevCC {
+                               goto doNorm
+                       }
+                       continue
+               } else if r := i.rb.src.hangul(i.p); r != 0 {
+                       outp = decomposeHangul(i.buf[:], r)
+                       i.p += hangulUTF8Size
+                       inCopyStart, outCopyStart = i.p, outp
+                       if i.p >= i.rb.nsrc {
+                               i.setDone()
+                               break
+                       } else if i.rb.src.hangul(i.p) != 0 {
+                               i.next = nextHangul
+                               return i.buf[:outp]
+                       }
+               } else {
+                       p := outp + sz
+                       if p > len(i.buf) {
+                               break
+                       }
+                       outp = p
+                       i.p += sz
+               }
+               if i.p >= i.rb.nsrc {
+                       i.setDone()
+                       break
+               }
+               prevCC := i.info.tccc
+               i.info = i.rb.f.info(i.rb.src, i.p)
+               if v := i.rb.ss.next(i.info); v == ssStarter {
+                       break
+               } else if v == ssOverflow {
+                       i.next = nextCGJDecompose
+                       break
+               }
+               if i.info.ccc < prevCC {
+                       goto doNorm
+               }
+       }
+       if outCopyStart == 0 {
+               return i.returnSlice(inCopyStart, i.p)
+       } else if inCopyStart < i.p {
+               i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
+       }
+       return i.buf[:outp]
+doNorm:
+       // Insert what we have decomposed so far in the reorderBuffer.
+       // As we will only reorder, there will always be enough room.
+       i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
+       i.rb.insertDecomposed(i.buf[0:outp])
+       return doNormDecomposed(i)
+}
+
+func doNormDecomposed(i *Iter) []byte {
+       for {
+               i.rb.insertUnsafe(i.rb.src, i.p, i.info)
+               if i.p += int(i.info.size); i.p >= i.rb.nsrc {
+                       i.setDone()
+                       break
+               }
+               i.info = i.rb.f.info(i.rb.src, i.p)
+               if i.info.ccc == 0 {
+                       break
+               }
+               if s := i.rb.ss.next(i.info); s == ssOverflow {
+                       i.next = nextCGJDecompose
+                       break
+               }
+       }
+       // new segment or too many combining characters: exit normalization
+       return i.buf[:i.rb.flushCopy(i.buf[:])]
+}
+
+func nextCGJDecompose(i *Iter) []byte {
+       i.rb.ss = 0
+       i.rb.insertCGJ()
+       i.next = nextDecomposed
+       i.rb.ss.first(i.info)
+       buf := doNormDecomposed(i)
+       return buf
+}
+
+// nextComposed is the implementation of Next for forms NFC and NFKC.
+func nextComposed(i *Iter) []byte {
+       outp, startp := 0, i.p
+       var prevCC uint8
+       for {
+               if !i.info.isYesC() {
+                       goto doNorm
+               }
+               prevCC = i.info.tccc
+               sz := int(i.info.size)
+               if sz == 0 {
+                       sz = 1 // illegal rune: copy byte-by-byte
+               }
+               p := outp + sz
+               if p > len(i.buf) {
+                       break
+               }
+               outp = p
+               i.p += sz
+               if i.p >= i.rb.nsrc {
+                       i.setDone()
+                       break
+               } else if i.rb.src._byte(i.p) < utf8.RuneSelf {
+                       i.rb.ss = 0
+                       i.next = i.asciiF
+                       break
+               }
+               i.info = i.rb.f.info(i.rb.src, i.p)
+               if v := i.rb.ss.next(i.info); v == ssStarter {
+                       break
+               } else if v == ssOverflow {
+                       i.next = nextCGJCompose
+                       break
+               }
+               if i.info.ccc < prevCC {
+                       goto doNorm
+               }
+       }
+       return i.returnSlice(startp, i.p)
+doNorm:
+       // reset to start position
+       i.p = startp
+       i.info = i.rb.f.info(i.rb.src, i.p)
+       i.rb.ss.first(i.info)
+       if i.info.multiSegment() {
+               d := i.info.Decomposition()
+               info := i.rb.f.info(input{bytes: d}, 0)
+               i.rb.insertUnsafe(input{bytes: d}, 0, info)
+               i.multiSeg = d[int(info.size):]
+               i.next = nextMultiNorm
+               return nextMultiNorm(i)
+       }
+       i.rb.ss.first(i.info)
+       i.rb.insertUnsafe(i.rb.src, i.p, i.info)
+       return doNormComposed(i)
+}
+
+func doNormComposed(i *Iter) []byte {
+       // First rune should already be inserted.
+       for {
+               if i.p += int(i.info.size); i.p >= i.rb.nsrc {
+                       i.setDone()
+                       break
+               }
+               i.info = i.rb.f.info(i.rb.src, i.p)
+               if s := i.rb.ss.next(i.info); s == ssStarter {
+                       break
+               } else if s == ssOverflow {
+                       i.next = nextCGJCompose
+                       break
+               }
+               i.rb.insertUnsafe(i.rb.src, i.p, i.info)
+       }
+       i.rb.compose()
+       seg := i.buf[:i.rb.flushCopy(i.buf[:])]
+       return seg
+}
+
+func nextCGJCompose(i *Iter) []byte {
+       i.rb.ss = 0 // instead of first
+       i.rb.insertCGJ()
+       i.next = nextComposed
+       // Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter,
+       // even if they are not. This is particularly dubious for U+FF9E and UFF9A.
+       // If we ever change that, insert a check here.
+       i.rb.ss.first(i.info)
+       i.rb.insertUnsafe(i.rb.src, i.p, i.info)
+       return doNormComposed(i)
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/normalize.go b/libgo/go/golang.org/x/text/unicode/norm/normalize.go
new file mode 100644 (file)
index 0000000..95efcf2
--- /dev/null
@@ -0,0 +1,609 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Note: the file data_test.go that is generated should not be checked in.
+//go:generate go run maketables.go triegen.go
+//go:generate go test -tags test
+
+// Package norm contains types and functions for normalizing Unicode strings.
+package norm // import "golang.org/x/text/unicode/norm"
+
+import (
+       "unicode/utf8"
+
+       "golang.org/x/text/transform"
+)
+
+// A Form denotes a canonical representation of Unicode code points.
+// The Unicode-defined normalization and equivalence forms are:
+//
+//   NFC   Unicode Normalization Form C
+//   NFD   Unicode Normalization Form D
+//   NFKC  Unicode Normalization Form KC
+//   NFKD  Unicode Normalization Form KD
+//
+// For a Form f, this documentation uses the notation f(x) to mean
+// the bytes or string x converted to the given form.
+// A position n in x is called a boundary if conversion to the form can
+// proceed independently on both sides:
+//   f(x) == append(f(x[0:n]), f(x[n:])...)
+//
+// References: https://unicode.org/reports/tr15/ and
+// https://unicode.org/notes/tn5/.
+type Form int
+
+const (
+       NFC Form = iota
+       NFD
+       NFKC
+       NFKD
+)
+
+// Bytes returns f(b). May return b if f(b) = b.
+func (f Form) Bytes(b []byte) []byte {
+       src := inputBytes(b)
+       ft := formTable[f]
+       n, ok := ft.quickSpan(src, 0, len(b), true)
+       if ok {
+               return b
+       }
+       out := make([]byte, n, len(b))
+       copy(out, b[0:n])
+       rb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush}
+       return doAppendInner(&rb, n)
+}
+
+// String returns f(s).
+func (f Form) String(s string) string {
+       src := inputString(s)
+       ft := formTable[f]
+       n, ok := ft.quickSpan(src, 0, len(s), true)
+       if ok {
+               return s
+       }
+       out := make([]byte, n, len(s))
+       copy(out, s[0:n])
+       rb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush}
+       return string(doAppendInner(&rb, n))
+}
+
+// IsNormal returns true if b == f(b).
+func (f Form) IsNormal(b []byte) bool {
+       src := inputBytes(b)
+       ft := formTable[f]
+       bp, ok := ft.quickSpan(src, 0, len(b), true)
+       if ok {
+               return true
+       }
+       rb := reorderBuffer{f: *ft, src: src, nsrc: len(b)}
+       rb.setFlusher(nil, cmpNormalBytes)
+       for bp < len(b) {
+               rb.out = b[bp:]
+               if bp = decomposeSegment(&rb, bp, true); bp < 0 {
+                       return false
+               }
+               bp, _ = rb.f.quickSpan(rb.src, bp, len(b), true)
+       }
+       return true
+}
+
+func cmpNormalBytes(rb *reorderBuffer) bool {
+       b := rb.out
+       for i := 0; i < rb.nrune; i++ {
+               info := rb.rune[i]
+               if int(info.size) > len(b) {
+                       return false
+               }
+               p := info.pos
+               pe := p + info.size
+               for ; p < pe; p++ {
+                       if b[0] != rb.byte[p] {
+                               return false
+                       }
+                       b = b[1:]
+               }
+       }
+       return true
+}
+
+// IsNormalString returns true if s == f(s).
+func (f Form) IsNormalString(s string) bool {
+       src := inputString(s)
+       ft := formTable[f]
+       bp, ok := ft.quickSpan(src, 0, len(s), true)
+       if ok {
+               return true
+       }
+       rb := reorderBuffer{f: *ft, src: src, nsrc: len(s)}
+       rb.setFlusher(nil, func(rb *reorderBuffer) bool {
+               for i := 0; i < rb.nrune; i++ {
+                       info := rb.rune[i]
+                       if bp+int(info.size) > len(s) {
+                               return false
+                       }
+                       p := info.pos
+                       pe := p + info.size
+                       for ; p < pe; p++ {
+                               if s[bp] != rb.byte[p] {
+                                       return false
+                               }
+                               bp++
+                       }
+               }
+               return true
+       })
+       for bp < len(s) {
+               if bp = decomposeSegment(&rb, bp, true); bp < 0 {
+                       return false
+               }
+               bp, _ = rb.f.quickSpan(rb.src, bp, len(s), true)
+       }
+       return true
+}
+
+// patchTail fixes a case where a rune may be incorrectly normalized
+// if it is followed by illegal continuation bytes. It returns the
+// patched buffer and whether the decomposition is still in progress.
+func patchTail(rb *reorderBuffer) bool {
+       info, p := lastRuneStart(&rb.f, rb.out)
+       if p == -1 || info.size == 0 {
+               return true
+       }
+       end := p + int(info.size)
+       extra := len(rb.out) - end
+       if extra > 0 {
+               // Potentially allocating memory. However, this only
+               // happens with ill-formed UTF-8.
+               x := make([]byte, 0)
+               x = append(x, rb.out[len(rb.out)-extra:]...)
+               rb.out = rb.out[:end]
+               decomposeToLastBoundary(rb)
+               rb.doFlush()
+               rb.out = append(rb.out, x...)
+               return false
+       }
+       buf := rb.out[p:]
+       rb.out = rb.out[:p]
+       decomposeToLastBoundary(rb)
+       if s := rb.ss.next(info); s == ssStarter {
+               rb.doFlush()
+               rb.ss.first(info)
+       } else if s == ssOverflow {
+               rb.doFlush()
+               rb.insertCGJ()
+               rb.ss = 0
+       }
+       rb.insertUnsafe(inputBytes(buf), 0, info)
+       return true
+}
+
+func appendQuick(rb *reorderBuffer, i int) int {
+       if rb.nsrc == i {
+               return i
+       }
+       end, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true)
+       rb.out = rb.src.appendSlice(rb.out, i, end)
+       return end
+}
+
+// Append returns f(append(out, b...)).
+// The buffer out must be nil, empty, or equal to f(out).
+func (f Form) Append(out []byte, src ...byte) []byte {
+       return f.doAppend(out, inputBytes(src), len(src))
+}
+
+func (f Form) doAppend(out []byte, src input, n int) []byte {
+       if n == 0 {
+               return out
+       }
+       ft := formTable[f]
+       // Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer.
+       if len(out) == 0 {
+               p, _ := ft.quickSpan(src, 0, n, true)
+               out = src.appendSlice(out, 0, p)
+               if p == n {
+                       return out
+               }
+               rb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush}
+               return doAppendInner(&rb, p)
+       }
+       rb := reorderBuffer{f: *ft, src: src, nsrc: n}
+       return doAppend(&rb, out, 0)
+}
+
+func doAppend(rb *reorderBuffer, out []byte, p int) []byte {
+       rb.setFlusher(out, appendFlush)
+       src, n := rb.src, rb.nsrc
+       doMerge := len(out) > 0
+       if q := src.skipContinuationBytes(p); q > p {
+               // Move leading non-starters to destination.
+               rb.out = src.appendSlice(rb.out, p, q)
+               p = q
+               doMerge = patchTail(rb)
+       }
+       fd := &rb.f
+       if doMerge {
+               var info Properties
+               if p < n {
+                       info = fd.info(src, p)
+                       if !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 {
+                               if p == 0 {
+                                       decomposeToLastBoundary(rb)
+                               }
+                               p = decomposeSegment(rb, p, true)
+                       }
+               }
+               if info.size == 0 {
+                       rb.doFlush()
+                       // Append incomplete UTF-8 encoding.
+                       return src.appendSlice(rb.out, p, n)
+               }
+               if rb.nrune > 0 {
+                       return doAppendInner(rb, p)
+               }
+       }
+       p = appendQuick(rb, p)
+       return doAppendInner(rb, p)
+}
+
+func doAppendInner(rb *reorderBuffer, p int) []byte {
+       for n := rb.nsrc; p < n; {
+               p = decomposeSegment(rb, p, true)
+               p = appendQuick(rb, p)
+       }
+       return rb.out
+}
+
+// AppendString returns f(append(out, []byte(s))).
+// The buffer out must be nil, empty, or equal to f(out).
+func (f Form) AppendString(out []byte, src string) []byte {
+       return f.doAppend(out, inputString(src), len(src))
+}
+
+// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]).
+// It is not guaranteed to return the largest such n.
+func (f Form) QuickSpan(b []byte) int {
+       n, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true)
+       return n
+}
+
+// Span implements transform.SpanningTransformer. It returns a boundary n such
+// that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n.
+func (f Form) Span(b []byte, atEOF bool) (n int, err error) {
+       n, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF)
+       if n < len(b) {
+               if !ok {
+                       err = transform.ErrEndOfSpan
+               } else {
+                       err = transform.ErrShortSrc
+               }
+       }
+       return n, err
+}
+
+// SpanString returns a boundary n such that s[0:n] == f(s[0:n]).
+// It is not guaranteed to return the largest such n.
+func (f Form) SpanString(s string, atEOF bool) (n int, err error) {
+       n, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF)
+       if n < len(s) {
+               if !ok {
+                       err = transform.ErrEndOfSpan
+               } else {
+                       err = transform.ErrShortSrc
+               }
+       }
+       return n, err
+}
+
+// quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and
+// whether any non-normalized parts were found. If atEOF is false, n will
+// not point past the last segment if this segment might be become
+// non-normalized by appending other runes.
+func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) {
+       var lastCC uint8
+       ss := streamSafe(0)
+       lastSegStart := i
+       for n = end; i < n; {
+               if j := src.skipASCII(i, n); i != j {
+                       i = j
+                       lastSegStart = i - 1
+                       lastCC = 0
+                       ss = 0
+                       continue
+               }
+               info := f.info(src, i)
+               if info.size == 0 {
+                       if atEOF {
+                               // include incomplete runes
+                               return n, true
+                       }
+                       return lastSegStart, true
+               }
+               // This block needs to be before the next, because it is possible to
+               // have an overflow for runes that are starters (e.g. with U+FF9E).
+               switch ss.next(info) {
+               case ssStarter:
+                       lastSegStart = i
+               case ssOverflow:
+                       return lastSegStart, false
+               case ssSuccess:
+                       if lastCC > info.ccc {
+                               return lastSegStart, false
+                       }
+               }
+               if f.composing {
+                       if !info.isYesC() {
+                               break
+                       }
+               } else {
+                       if !info.isYesD() {
+                               break
+                       }
+               }
+               lastCC = info.ccc
+               i += int(info.size)
+       }
+       if i == n {
+               if !atEOF {
+                       n = lastSegStart
+               }
+               return n, true
+       }
+       return lastSegStart, false
+}
+
+// QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]).
+// It is not guaranteed to return the largest such n.
+func (f Form) QuickSpanString(s string) int {
+       n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true)
+       return n
+}
+
+// FirstBoundary returns the position i of the first boundary in b
+// or -1 if b contains no boundary.
+func (f Form) FirstBoundary(b []byte) int {
+       return f.firstBoundary(inputBytes(b), len(b))
+}
+
+func (f Form) firstBoundary(src input, nsrc int) int {
+       i := src.skipContinuationBytes(0)
+       if i >= nsrc {
+               return -1
+       }
+       fd := formTable[f]
+       ss := streamSafe(0)
+       // We should call ss.first here, but we can't as the first rune is
+       // skipped already. This means FirstBoundary can't really determine
+       // CGJ insertion points correctly. Luckily it doesn't have to.
+       for {
+               info := fd.info(src, i)
+               if info.size == 0 {
+                       return -1
+               }
+               if s := ss.next(info); s != ssSuccess {
+                       return i
+               }
+               i += int(info.size)
+               if i >= nsrc {
+                       if !info.BoundaryAfter() && !ss.isMax() {
+                               return -1
+                       }
+                       return nsrc
+               }
+       }
+}
+
+// FirstBoundaryInString returns the position i of the first boundary in s
+// or -1 if s contains no boundary.
+func (f Form) FirstBoundaryInString(s string) int {
+       return f.firstBoundary(inputString(s), len(s))
+}
+
+// NextBoundary reports the index of the boundary between the first and next
+// segment in b or -1 if atEOF is false and there are not enough bytes to
+// determine this boundary.
+func (f Form) NextBoundary(b []byte, atEOF bool) int {
+       return f.nextBoundary(inputBytes(b), len(b), atEOF)
+}
+
+// NextBoundaryInString reports the index of the boundary between the first and
+// next segment in b or -1 if atEOF is false and there are not enough bytes to
+// determine this boundary.
+func (f Form) NextBoundaryInString(s string, atEOF bool) int {
+       return f.nextBoundary(inputString(s), len(s), atEOF)
+}
+
+func (f Form) nextBoundary(src input, nsrc int, atEOF bool) int {
+       if nsrc == 0 {
+               if atEOF {
+                       return 0
+               }
+               return -1
+       }
+       fd := formTable[f]
+       info := fd.info(src, 0)
+       if info.size == 0 {
+               if atEOF {
+                       return 1
+               }
+               return -1
+       }
+       ss := streamSafe(0)
+       ss.first(info)
+
+       for i := int(info.size); i < nsrc; i += int(info.size) {
+               info = fd.info(src, i)
+               if info.size == 0 {
+                       if atEOF {
+                               return i
+                       }
+                       return -1
+               }
+               // TODO: Using streamSafe to determine the boundary isn't the same as
+               // using BoundaryBefore. Determine which should be used.
+               if s := ss.next(info); s != ssSuccess {
+                       return i
+               }
+       }
+       if !atEOF && !info.BoundaryAfter() && !ss.isMax() {
+               return -1
+       }
+       return nsrc
+}
+
+// LastBoundary returns the position i of the last boundary in b
+// or -1 if b contains no boundary.
+func (f Form) LastBoundary(b []byte) int {
+       return lastBoundary(formTable[f], b)
+}
+
+func lastBoundary(fd *formInfo, b []byte) int {
+       i := len(b)
+       info, p := lastRuneStart(fd, b)
+       if p == -1 {
+               return -1
+       }
+       if info.size == 0 { // ends with incomplete rune
+               if p == 0 { // starts with incomplete rune
+                       return -1
+               }
+               i = p
+               info, p = lastRuneStart(fd, b[:i])
+               if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter
+                       return i
+               }
+       }
+       if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8
+               return i
+       }
+       if info.BoundaryAfter() {
+               return i
+       }
+       ss := streamSafe(0)
+       v := ss.backwards(info)
+       for i = p; i >= 0 && v != ssStarter; i = p {
+               info, p = lastRuneStart(fd, b[:i])
+               if v = ss.backwards(info); v == ssOverflow {
+                       break
+               }
+               if p+int(info.size) != i {
+                       if p == -1 { // no boundary found
+                               return -1
+                       }
+                       return i // boundary after an illegal UTF-8 encoding
+               }
+       }
+       return i
+}
+
+// decomposeSegment scans the first segment in src into rb. It inserts 0x034f
+// (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters
+// and returns the number of bytes consumed from src or iShortDst or iShortSrc.
+func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int {
+       // Force one character to be consumed.
+       info := rb.f.info(rb.src, sp)
+       if info.size == 0 {
+               return 0
+       }
+       if s := rb.ss.next(info); s == ssStarter {
+               // TODO: this could be removed if we don't support merging.
+               if rb.nrune > 0 {
+                       goto end
+               }
+       } else if s == ssOverflow {
+               rb.insertCGJ()
+               goto end
+       }
+       if err := rb.insertFlush(rb.src, sp, info); err != iSuccess {
+               return int(err)
+       }
+       for {
+               sp += int(info.size)
+               if sp >= rb.nsrc {
+                       if !atEOF && !info.BoundaryAfter() {
+                               return int(iShortSrc)
+                       }
+                       break
+               }
+               info = rb.f.info(rb.src, sp)
+               if info.size == 0 {
+                       if !atEOF {
+                               return int(iShortSrc)
+                       }
+                       break
+               }
+               if s := rb.ss.next(info); s == ssStarter {
+                       break
+               } else if s == ssOverflow {
+                       rb.insertCGJ()
+                       break
+               }
+               if err := rb.insertFlush(rb.src, sp, info); err != iSuccess {
+                       return int(err)
+               }
+       }
+end:
+       if !rb.doFlush() {
+               return int(iShortDst)
+       }
+       return sp
+}
+
+// lastRuneStart returns the runeInfo and position of the last
+// rune in buf or the zero runeInfo and -1 if no rune was found.
+func lastRuneStart(fd *formInfo, buf []byte) (Properties, int) {
+       p := len(buf) - 1
+       for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- {
+       }
+       if p < 0 {
+               return Properties{}, -1
+       }
+       return fd.info(inputBytes(buf), p), p
+}
+
+// decomposeToLastBoundary finds an open segment at the end of the buffer
+// and scans it into rb. Returns the buffer minus the last segment.
+func decomposeToLastBoundary(rb *reorderBuffer) {
+       fd := &rb.f
+       info, i := lastRuneStart(fd, rb.out)
+       if int(info.size) != len(rb.out)-i {
+               // illegal trailing continuation bytes
+               return
+       }
+       if info.BoundaryAfter() {
+               return
+       }
+       var add [maxNonStarters + 1]Properties // stores runeInfo in reverse order
+       padd := 0
+       ss := streamSafe(0)
+       p := len(rb.out)
+       for {
+               add[padd] = info
+               v := ss.backwards(info)
+               if v == ssOverflow {
+                       // Note that if we have an overflow, it the string we are appending to
+                       // is not correctly normalized. In this case the behavior is undefined.
+                       break
+               }
+               padd++
+               p -= int(info.size)
+               if v == ssStarter || p < 0 {
+                       break
+               }
+               info, i = lastRuneStart(fd, rb.out[:p])
+               if int(info.size) != p-i {
+                       break
+               }
+       }
+       rb.ss = ss
+       // Copy bytes for insertion as we may need to overwrite rb.out.
+       var buf [maxBufferSize * utf8.UTFMax]byte
+       cp := buf[:copy(buf[:], rb.out[p:])]
+       rb.out = rb.out[:p]
+       for padd--; padd >= 0; padd-- {
+               info = add[padd]
+               rb.insertUnsafe(inputBytes(cp), 0, info)
+               cp = cp[info.size:]
+       }
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/readwriter.go b/libgo/go/golang.org/x/text/unicode/norm/readwriter.go
new file mode 100644 (file)
index 0000000..b38096f
--- /dev/null
@@ -0,0 +1,125 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import "io"
+
+type normWriter struct {
+       rb  reorderBuffer
+       w   io.Writer
+       buf []byte
+}
+
+// Write implements the standard write interface.  If the last characters are
+// not at a normalization boundary, the bytes will be buffered for the next
+// write. The remaining bytes will be written on close.
+func (w *normWriter) Write(data []byte) (n int, err error) {
+       // Process data in pieces to keep w.buf size bounded.
+       const chunk = 4000
+
+       for len(data) > 0 {
+               // Normalize into w.buf.
+               m := len(data)
+               if m > chunk {
+                       m = chunk
+               }
+               w.rb.src = inputBytes(data[:m])
+               w.rb.nsrc = m
+               w.buf = doAppend(&w.rb, w.buf, 0)
+               data = data[m:]
+               n += m
+
+               // Write out complete prefix, save remainder.
+               // Note that lastBoundary looks back at most 31 runes.
+               i := lastBoundary(&w.rb.f, w.buf)
+               if i == -1 {
+                       i = 0
+               }
+               if i > 0 {
+                       if _, err = w.w.Write(w.buf[:i]); err != nil {
+                               break
+                       }
+                       bn := copy(w.buf, w.buf[i:])
+                       w.buf = w.buf[:bn]
+               }
+       }
+       return n, err
+}
+
+// Close forces data that remains in the buffer to be written.
+func (w *normWriter) Close() error {
+       if len(w.buf) > 0 {
+               _, err := w.w.Write(w.buf)
+               if err != nil {
+                       return err
+               }
+       }
+       return nil
+}
+
+// Writer returns a new writer that implements Write(b)
+// by writing f(b) to w. The returned writer may use an
+// internal buffer to maintain state across Write calls.
+// Calling its Close method writes any buffered data to w.
+func (f Form) Writer(w io.Writer) io.WriteCloser {
+       wr := &normWriter{rb: reorderBuffer{}, w: w}
+       wr.rb.init(f, nil)
+       return wr
+}
+
+type normReader struct {
+       rb           reorderBuffer
+       r            io.Reader
+       inbuf        []byte
+       outbuf       []byte
+       bufStart     int
+       lastBoundary int
+       err          error
+}
+
+// Read implements the standard read interface.
+func (r *normReader) Read(p []byte) (int, error) {
+       for {
+               if r.lastBoundary-r.bufStart > 0 {
+                       n := copy(p, r.outbuf[r.bufStart:r.lastBoundary])
+                       r.bufStart += n
+                       if r.lastBoundary-r.bufStart > 0 {
+                               return n, nil
+                       }
+                       return n, r.err
+               }
+               if r.err != nil {
+                       return 0, r.err
+               }
+               outn := copy(r.outbuf, r.outbuf[r.lastBoundary:])
+               r.outbuf = r.outbuf[0:outn]
+               r.bufStart = 0
+
+               n, err := r.r.Read(r.inbuf)
+               r.rb.src = inputBytes(r.inbuf[0:n])
+               r.rb.nsrc, r.err = n, err
+               if n > 0 {
+                       r.outbuf = doAppend(&r.rb, r.outbuf, 0)
+               }
+               if err == io.EOF {
+                       r.lastBoundary = len(r.outbuf)
+               } else {
+                       r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf)
+                       if r.lastBoundary == -1 {
+                               r.lastBoundary = 0
+                       }
+               }
+       }
+}
+
+// Reader returns a new reader that implements Read
+// by reading data from r and returning f(data).
+func (f Form) Reader(r io.Reader) io.Reader {
+       const chunk = 4000
+       buf := make([]byte, chunk)
+       rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf}
+       rr.rb.init(f, buf)
+       return rr
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/tables10.0.0.go b/libgo/go/golang.org/x/text/unicode/norm/tables10.0.0.go
new file mode 100644 (file)
index 0000000..26fbd55
--- /dev/null
@@ -0,0 +1,7657 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.10,!go1.13
+
+package norm
+
+import "sync"
+
+const (
+       // Version is the Unicode edition from which the tables are derived.
+       Version = "10.0.0"
+
+       // MaxTransformChunkSize indicates the maximum number of bytes that Transform
+       // may need to write atomically for any Form. Making a destination buffer at
+       // least this size ensures that Transform can always make progress and that
+       // the user does not need to grow the buffer on an ErrShortDst.
+       MaxTransformChunkSize = 35 + maxNonStarters*4
+)
+
+var ccc = [55]uint8{
+       0, 1, 7, 8, 9, 10, 11, 12,
+       13, 14, 15, 16, 17, 18, 19, 20,
+       21, 22, 23, 24, 25, 26, 27, 28,
+       29, 30, 31, 32, 33, 34, 35, 36,
+       84, 91, 103, 107, 118, 122, 129, 130,
+       132, 202, 214, 216, 218, 220, 222, 224,
+       226, 228, 230, 232, 233, 234, 240,
+}
+
+const (
+       firstMulti            = 0x186D
+       firstCCC              = 0x2C9E
+       endMulti              = 0x2F60
+       firstLeadingCCC       = 0x49AE
+       firstCCCZeroExcept    = 0x4A78
+       firstStarterWithNLead = 0x4A9F
+       lastDecomp            = 0x4AA1
+       maxDecomp             = 0x8000
+)
+
+// decomps: 19105 bytes
+var decomps = [...]byte{
+       // Bytes 0 - 3f
+       0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
+       0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
+       0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
+       0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
+       0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
+       0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
+       0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
+       0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
+       // Bytes 40 - 7f
+       0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
+       0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
+       0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
+       0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
+       0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
+       0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
+       0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
+       0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
+       // Bytes 80 - bf
+       0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
+       0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
+       0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
+       0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
+       0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
+       0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
+       0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
+       0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
+       // Bytes c0 - ff
+       0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
+       0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
+       0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,
+       0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,
+       0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,
+       0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,
+       0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,
+       0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,
+       // Bytes 100 - 13f
+       0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,
+       0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,
+       0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,
+       0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,
+       0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,
+       0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
+       0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
+       0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
+       // Bytes 140 - 17f
+       0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,
+       0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,
+       0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
+       0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
+       0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,
+       0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,
+       0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,
+       0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,
+       // Bytes 180 - 1bf
+       0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,
+       0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,
+       0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,
+       0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,
+       0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,
+       0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,
+       0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,
+       0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,
+       // Bytes 1c0 - 1ff
+       0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,
+       0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,
+       0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,
+       0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,
+       0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,
+       0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,
+       0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,
+       0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,
+       // Bytes 200 - 23f
+       0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,
+       0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,
+       0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,
+       0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,
+       0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,
+       0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,
+       0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,
+       0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,
+       // Bytes 240 - 27f
+       0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,
+       0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,
+       0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,
+       0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,
+       0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,
+       0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,
+       0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,
+       0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,
+       // Bytes 280 - 2bf
+       0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,
+       0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,
+       0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,
+       0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,
+       0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,
+       0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,
+       0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,
+       0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,
+       // Bytes 2c0 - 2ff
+       0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,
+       0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,
+       0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,
+       0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,
+       0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,
+       0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,
+       0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,
+       0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,
+       // Bytes 300 - 33f
+       0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,
+       0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,
+       0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,
+       0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,
+       0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,
+       0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,
+       0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,
+       0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,
+       // Bytes 340 - 37f
+       0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,
+       0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,
+       0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,
+       0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,
+       0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,
+       0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,
+       0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,
+       0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,
+       // Bytes 380 - 3bf
+       0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,
+       0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,
+       0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,
+       0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,
+       0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,
+       0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,
+       0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,
+       0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,
+       // Bytes 3c0 - 3ff
+       0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,
+       0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,
+       0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,
+       0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,
+       0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,
+       0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,
+       0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,
+       0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,
+       // Bytes 400 - 43f
+       0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,
+       0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,
+       0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,
+       0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,
+       0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,
+       0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,
+       0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,
+       0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,
+       // Bytes 440 - 47f
+       0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,
+       0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,
+       0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,
+       0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,
+       0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,
+       0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,
+       0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,
+       0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,
+       // Bytes 480 - 4bf
+       0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,
+       0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,
+       0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,
+       0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,
+       0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,
+       0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,
+       0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,
+       0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,
+       // Bytes 4c0 - 4ff
+       0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,
+       0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,
+       0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,
+       0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,
+       0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,
+       0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,
+       0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,
+       0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,
+       // Bytes 500 - 53f
+       0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,
+       0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,
+       0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,
+       0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,
+       0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,
+       0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,
+       0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,
+       0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,
+       // Bytes 540 - 57f
+       0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,
+       0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,
+       0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,
+       0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,
+       0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,
+       0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,
+       0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,
+       0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,
+       // Bytes 580 - 5bf
+       0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,
+       0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,
+       0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,
+       0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,
+       0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,
+       0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,
+       0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,
+       0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,
+       // Bytes 5c0 - 5ff
+       0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,
+       0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,
+       0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,
+       0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,
+       0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,
+       0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,
+       0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,
+       0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,
+       // Bytes 600 - 63f
+       0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,
+       0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,
+       0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,
+       0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,
+       0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,
+       0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,
+       0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,
+       0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,
+       // Bytes 640 - 67f
+       0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,
+       0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,
+       0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,
+       0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,
+       0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,
+       0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,
+       0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,
+       0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,
+       // Bytes 680 - 6bf
+       0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,
+       0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,
+       0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,
+       0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,
+       0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,
+       0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,
+       0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,
+       0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,
+       // Bytes 6c0 - 6ff
+       0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,
+       0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,
+       0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,
+       0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,
+       0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,
+       0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,
+       0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,
+       0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,
+       // Bytes 700 - 73f
+       0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,
+       0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,
+       0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,
+       0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,
+       0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,
+       0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,
+       0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,
+       0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,
+       // Bytes 740 - 77f
+       0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,
+       0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,
+       0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,
+       0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,
+       0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,
+       0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,
+       0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,
+       0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,
+       // Bytes 780 - 7bf
+       0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,
+       0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,
+       0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,
+       0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,
+       0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,
+       0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,
+       0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,
+       0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,
+       // Bytes 7c0 - 7ff
+       0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,
+       0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,
+       0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,
+       0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,
+       0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,
+       0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,
+       0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,
+       0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,
+       // Bytes 800 - 83f
+       0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,
+       0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,
+       0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,
+       0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,
+       0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,
+       0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,
+       0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,
+       0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,
+       // Bytes 840 - 87f
+       0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,
+       0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,
+       0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,
+       0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,
+       0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,
+       0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,
+       0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,
+       0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,
+       // Bytes 880 - 8bf
+       0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,
+       0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,
+       0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,
+       0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,
+       0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,
+       0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,
+       0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,
+       0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,
+       // Bytes 8c0 - 8ff
+       0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,
+       0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,
+       0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,
+       0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,
+       0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,
+       0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,
+       0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,
+       0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,
+       // Bytes 900 - 93f
+       0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,
+       0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,
+       0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,
+       0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,
+       0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,
+       0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,
+       0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,
+       0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,
+       // Bytes 940 - 97f
+       0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,
+       0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,
+       0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,
+       0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,
+       0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,
+       0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,
+       0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,
+       0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,
+       // Bytes 980 - 9bf
+       0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,
+       0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,
+       0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,
+       0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,
+       0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,
+       0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,
+       0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,
+       0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,
+       // Bytes 9c0 - 9ff
+       0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,
+       0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,
+       0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,
+       0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,
+       0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,
+       0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,
+       0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,
+       0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,
+       // Bytes a00 - a3f
+       0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,
+       0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,
+       0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,
+       0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,
+       0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,
+       0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,
+       0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,
+       0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,
+       // Bytes a40 - a7f
+       0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,
+       0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,
+       0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,
+       0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,
+       0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,
+       0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,
+       0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,
+       0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,
+       // Bytes a80 - abf
+       0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,
+       0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,
+       0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,
+       0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,
+       0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,
+       0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,
+       0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,
+       0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,
+       // Bytes ac0 - aff
+       0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,
+       0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,
+       0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,
+       0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,
+       0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,
+       0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,
+       0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,
+       0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,
+       // Bytes b00 - b3f
+       0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,
+       0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,
+       0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,
+       0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,
+       0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,
+       0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,
+       0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,
+       0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,
+       // Bytes b40 - b7f
+       0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,
+       0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,
+       0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,
+       0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,
+       0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,
+       0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,
+       0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,
+       0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,
+       // Bytes b80 - bbf
+       0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,
+       0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,
+       0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,
+       0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,
+       0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,
+       0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,
+       0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,
+       0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,
+       // Bytes bc0 - bff
+       0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,
+       0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,
+       0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,
+       0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,
+       0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,
+       0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,
+       0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,
+       0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,
+       // Bytes c00 - c3f
+       0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,
+       0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,
+       0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,
+       0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,
+       0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,
+       0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,
+       0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,
+       0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,
+       // Bytes c40 - c7f
+       0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,
+       0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,
+       0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,
+       0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,
+       0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,
+       0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,
+       0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,
+       0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,
+       // Bytes c80 - cbf
+       0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,
+       0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,
+       0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,
+       0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,
+       0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,
+       0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,
+       0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,
+       0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,
+       // Bytes cc0 - cff
+       0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,
+       0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,
+       0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,
+       0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,
+       0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,
+       0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,
+       0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,
+       0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,
+       // Bytes d00 - d3f
+       0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,
+       0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,
+       0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,
+       0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,
+       0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,
+       0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,
+       0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,
+       0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,
+       // Bytes d40 - d7f
+       0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,
+       0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,
+       0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,
+       0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,
+       0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,
+       0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,
+       0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,
+       0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,
+       // Bytes d80 - dbf
+       0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,
+       0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,
+       0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,
+       0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,
+       0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,
+       0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,
+       0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,
+       0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,
+       // Bytes dc0 - dff
+       0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,
+       0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,
+       0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,
+       0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,
+       0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,
+       0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,
+       0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,
+       0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,
+       // Bytes e00 - e3f
+       0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,
+       0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,
+       0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,
+       0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,
+       0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,
+       0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,
+       0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,
+       0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,
+       // Bytes e40 - e7f
+       0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,
+       0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,
+       0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,
+       0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,
+       0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,
+       0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,
+       0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,
+       0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,
+       // Bytes e80 - ebf
+       0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,
+       0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,
+       0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,
+       0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,
+       0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,
+       0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,
+       0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,
+       0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,
+       // Bytes ec0 - eff
+       0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,
+       0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,
+       0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,
+       0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,
+       0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,
+       0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,
+       0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,
+       0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,
+       // Bytes f00 - f3f
+       0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,
+       0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,
+       0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,
+       0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,
+       0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,
+       0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,
+       0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,
+       0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,
+       // Bytes f40 - f7f
+       0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,
+       0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,
+       0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,
+       0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,
+       0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,
+       0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,
+       0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,
+       0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,
+       // Bytes f80 - fbf
+       0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,
+       0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,
+       0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,
+       0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,
+       0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,
+       0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,
+       0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,
+       0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,
+       // Bytes fc0 - fff
+       0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,
+       0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,
+       0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,
+       0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,
+       0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,
+       0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,
+       0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,
+       0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,
+       // Bytes 1000 - 103f
+       0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,
+       0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,
+       0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,
+       0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,
+       0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,
+       0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,
+       0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,
+       0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,
+       // Bytes 1040 - 107f
+       0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,
+       0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,
+       0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,
+       0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,
+       0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,
+       0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,
+       0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,
+       0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,
+       // Bytes 1080 - 10bf
+       0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,
+       0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,
+       0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,
+       0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,
+       0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,
+       0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,
+       0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,
+       0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,
+       // Bytes 10c0 - 10ff
+       0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,
+       0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,
+       0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,
+       0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,
+       0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,
+       0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,
+       0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,
+       0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,
+       // Bytes 1100 - 113f
+       0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,
+       0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,
+       0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,
+       0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,
+       0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,
+       0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,
+       0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,
+       0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,
+       // Bytes 1140 - 117f
+       0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,
+       0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,
+       0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,
+       0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,
+       0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,
+       0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,
+       0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,
+       0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,
+       // Bytes 1180 - 11bf
+       0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,
+       0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,
+       0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,
+       0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,
+       0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,
+       0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,
+       0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,
+       0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,
+       // Bytes 11c0 - 11ff
+       0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,
+       0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,
+       0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,
+       0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,
+       0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,
+       0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,
+       0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,
+       0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,
+       // Bytes 1200 - 123f
+       0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,
+       0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,
+       0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,
+       0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,
+       0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,
+       0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,
+       0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,
+       0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,
+       // Bytes 1240 - 127f
+       0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,
+       0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,
+       0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,
+       0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,
+       0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,
+       0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,
+       0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,
+       0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,
+       // Bytes 1280 - 12bf
+       0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,
+       0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,
+       0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,
+       0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,
+       0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,
+       0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,
+       0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,
+       0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,
+       // Bytes 12c0 - 12ff
+       0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,
+       0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,
+       0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,
+       0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,
+       0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,
+       0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,
+       0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,
+       0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,
+       // Bytes 1300 - 133f
+       0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,
+       0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,
+       0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,
+       0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,
+       0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,
+       0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,
+       0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,
+       0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,
+       // Bytes 1340 - 137f
+       0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,
+       0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,
+       0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,
+       0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,
+       0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,
+       0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,
+       0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,
+       0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,
+       // Bytes 1380 - 13bf
+       0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,
+       0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,
+       0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,
+       0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,
+       0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,
+       0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,
+       0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,
+       0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,
+       // Bytes 13c0 - 13ff
+       0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,
+       0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,
+       0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,
+       0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,
+       0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,
+       0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,
+       0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,
+       0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,
+       // Bytes 1400 - 143f
+       0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,
+       0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,
+       0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,
+       0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,
+       0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,
+       0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,
+       0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,
+       0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,
+       // Bytes 1440 - 147f
+       0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,
+       0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,
+       0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,
+       0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,
+       0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,
+       0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,
+       0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,
+       0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,
+       // Bytes 1480 - 14bf
+       0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,
+       0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,
+       0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,
+       0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,
+       0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,
+       0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,
+       0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,
+       0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,
+       // Bytes 14c0 - 14ff
+       0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,
+       0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,
+       0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,
+       0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,
+       0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,
+       0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,
+       0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,
+       0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,
+       // Bytes 1500 - 153f
+       0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,
+       0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,
+       0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,
+       0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,
+       0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,
+       0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,
+       0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,
+       0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,
+       // Bytes 1540 - 157f
+       0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,
+       0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,
+       0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,
+       0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,
+       0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,
+       0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,
+       0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,
+       0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,
+       // Bytes 1580 - 15bf
+       0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,
+       0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,
+       0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,
+       0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,
+       0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,
+       0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,
+       0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,
+       0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,
+       // Bytes 15c0 - 15ff
+       0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,
+       0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,
+       0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,
+       0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,
+       0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,
+       0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,
+       0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,
+       0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,
+       // Bytes 1600 - 163f
+       0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,
+       0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,
+       0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,
+       0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,
+       0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,
+       0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,
+       0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,
+       0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,
+       // Bytes 1640 - 167f
+       0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,
+       0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,
+       0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,
+       0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,
+       0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,
+       0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,
+       0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,
+       0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,
+       // Bytes 1680 - 16bf
+       0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,
+       0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,
+       0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,
+       0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,
+       0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,
+       0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,
+       0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,
+       0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,
+       // Bytes 16c0 - 16ff
+       0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,
+       0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,
+       0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,
+       0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,
+       0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,
+       0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,
+       0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,
+       0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,
+       // Bytes 1700 - 173f
+       0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,
+       0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,
+       0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,
+       0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,
+       0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,
+       0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,
+       0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,
+       0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,
+       // Bytes 1740 - 177f
+       0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,
+       0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,
+       0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,
+       0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,
+       0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,
+       0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,
+       0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,
+       0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,
+       // Bytes 1780 - 17bf
+       0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,
+       0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,
+       0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,
+       0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,
+       0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,
+       0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,
+       0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,
+       0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,
+       // Bytes 17c0 - 17ff
+       0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,
+       0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,
+       0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,
+       0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,
+       0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,
+       0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,
+       0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,
+       0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,
+       // Bytes 1800 - 183f
+       0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,
+       0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,
+       0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,
+       0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,
+       0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,
+       0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,
+       0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,
+       0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,
+       // Bytes 1840 - 187f
+       0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,
+       0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,
+       0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,
+       0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,
+       0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,
+       0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,
+       0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,
+       0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,
+       // Bytes 1880 - 18bf
+       0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,
+       0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,
+       0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,
+       0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,
+       0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,
+       0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,
+       0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,
+       0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,
+       // Bytes 18c0 - 18ff
+       0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,
+       0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,
+       0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,
+       0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,
+       0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,
+       0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,
+       0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,
+       0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,
+       // Bytes 1900 - 193f
+       0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,
+       0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,
+       0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,
+       0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,
+       0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,
+       0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,
+       0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,
+       0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,
+       // Bytes 1940 - 197f
+       0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,
+       0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,
+       0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,
+       0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,
+       0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,
+       0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,
+       0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,
+       0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,
+       // Bytes 1980 - 19bf
+       0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
+       0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
+       0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
+       0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
+       0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
+       0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
+       0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
+       0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
+       // Bytes 19c0 - 19ff
+       0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
+       0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
+       0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
+       0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
+       0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
+       0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
+       0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
+       0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
+       // Bytes 1a00 - 1a3f
+       0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
+       0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
+       0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
+       0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
+       0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
+       0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
+       0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
+       0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
+       // Bytes 1a40 - 1a7f
+       0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
+       0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
+       0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
+       0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
+       0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
+       0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
+       0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
+       0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
+       // Bytes 1a80 - 1abf
+       0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
+       0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
+       0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
+       0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
+       0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
+       0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
+       0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
+       0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
+       // Bytes 1ac0 - 1aff
+       0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
+       0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
+       0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
+       0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
+       0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
+       0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
+       0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
+       0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
+       // Bytes 1b00 - 1b3f
+       0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
+       0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
+       0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
+       0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
+       0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
+       0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
+       0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
+       0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
+       // Bytes 1b40 - 1b7f
+       0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
+       0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
+       0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
+       0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
+       0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
+       0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
+       0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
+       0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
+       // Bytes 1b80 - 1bbf
+       0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
+       0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
+       0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
+       0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
+       0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
+       0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
+       0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
+       0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
+       // Bytes 1bc0 - 1bff
+       0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
+       0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
+       0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
+       0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
+       0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
+       0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
+       0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
+       0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
+       // Bytes 1c00 - 1c3f
+       0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
+       0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
+       0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
+       0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
+       0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
+       0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
+       0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
+       0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
+       // Bytes 1c40 - 1c7f
+       0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
+       0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
+       0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
+       0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
+       0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
+       0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
+       0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
+       0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
+       // Bytes 1c80 - 1cbf
+       0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
+       0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
+       0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
+       0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
+       0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
+       0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
+       0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
+       0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
+       // Bytes 1cc0 - 1cff
+       0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
+       0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
+       0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
+       0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
+       0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
+       0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
+       0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
+       0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
+       // Bytes 1d00 - 1d3f
+       0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
+       0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
+       0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
+       0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
+       0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
+       0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
+       0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
+       0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
+       // Bytes 1d40 - 1d7f
+       0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
+       0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
+       0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
+       0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
+       0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
+       0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
+       0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
+       0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
+       // Bytes 1d80 - 1dbf
+       0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
+       0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
+       0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
+       0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
+       0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
+       0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
+       0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
+       0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
+       // Bytes 1dc0 - 1dff
+       0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
+       0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
+       0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
+       0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
+       0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
+       0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
+       // Bytes 1e00 - 1e3f
+       0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
+       0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
+       0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
+       0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
+       0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
+       0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
+       0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
+       0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
+       // Bytes 1e40 - 1e7f
+       0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
+       0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
+       0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
+       0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
+       0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
+       // Bytes 1e80 - 1ebf
+       0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
+       0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
+       0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
+       0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
+       0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
+       // Bytes 1ec0 - 1eff
+       0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
+       0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
+       0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
+       0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
+       0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
+       0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
+       0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
+       0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
+       // Bytes 1f00 - 1f3f
+       0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
+       0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
+       0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
+       0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
+       0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
+       0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
+       0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
+       0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
+       // Bytes 1f40 - 1f7f
+       0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
+       0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
+       0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
+       0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
+       0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
+       0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
+       0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
+       0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
+       // Bytes 1f80 - 1fbf
+       0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
+       0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
+       0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
+       0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
+       0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
+       0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
+       0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
+       0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
+       // Bytes 1fc0 - 1fff
+       0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
+       0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
+       0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
+       0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
+       0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
+       0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
+       0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
+       0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
+       // Bytes 2000 - 203f
+       0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
+       0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
+       0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
+       0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
+       0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
+       0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
+       0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
+       0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
+       // Bytes 2040 - 207f
+       0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
+       0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
+       0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
+       0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
+       // Bytes 2080 - 20bf
+       0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
+       0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
+       0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
+       0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
+       // Bytes 20c0 - 20ff
+       0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
+       0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
+       0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
+       0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
+       0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
+       0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
+       0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
+       0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
+       // Bytes 2100 - 213f
+       0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
+       0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
+       0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
+       0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
+       0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
+       0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
+       0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
+       0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
+       // Bytes 2140 - 217f
+       0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
+       0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
+       0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
+       0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
+       0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
+       0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
+       0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
+       0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
+       // Bytes 2180 - 21bf
+       0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
+       0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
+       0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
+       0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
+       // Bytes 21c0 - 21ff
+       0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       // Bytes 2200 - 223f
+       0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
+       // Bytes 2240 - 227f
+       0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
+       // Bytes 2280 - 22bf
+       0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
+       0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
+       0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
+       0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       // Bytes 22c0 - 22ff
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
+       0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
+       0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
+       0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
+       0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
+       0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
+       0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
+       // Bytes 2300 - 233f
+       0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
+       0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
+       0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
+       // Bytes 2340 - 237f
+       0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
+       0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
+       0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
+       0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
+       // Bytes 2380 - 23bf
+       0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
+       0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
+       0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
+       0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
+       // Bytes 23c0 - 23ff
+       0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
+       0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
+       0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
+       0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
+       0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
+       0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
+       0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
+       0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       // Bytes 2400 - 243f
+       0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
+       0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
+       0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
+       0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
+       0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
+       0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
+       0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
+       // Bytes 2440 - 247f
+       0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
+       0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
+       0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
+       0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
+       // Bytes 2480 - 24bf
+       0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
+       0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
+       0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
+       0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
+       0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
+       0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
+       // Bytes 24c0 - 24ff
+       0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
+       0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
+       0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
+       0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
+       0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
+       0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
+       // Bytes 2500 - 253f
+       0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
+       0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
+       0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
+       0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
+       0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
+       0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
+       0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
+       // Bytes 2540 - 257f
+       0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
+       0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
+       0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
+       0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
+       // Bytes 2580 - 25bf
+       0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
+       0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
+       0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
+       0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
+       0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
+       0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
+       // Bytes 25c0 - 25ff
+       0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
+       0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
+       0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
+       0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
+       // Bytes 2600 - 263f
+       0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
+       0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
+       0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
+       0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
+       0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
+       // Bytes 2640 - 267f
+       0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
+       0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
+       0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
+       0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
+       0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
+       // Bytes 2680 - 26bf
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
+       0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
+       0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
+       0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
+       0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
+       // Bytes 26c0 - 26ff
+       0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
+       0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
+       0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
+       0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
+       0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
+       0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
+       0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
+       0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,
+       // Bytes 2700 - 273f
+       0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,
+       0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,
+       0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,
+       0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,
+       0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,
+       0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,
+       0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
+       // Bytes 2740 - 277f
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+       0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,
+       // Bytes 2780 - 27bf
+       0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,
+       0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,
+       0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,
+       // Bytes 27c0 - 27ff
+       0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,
+       0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,
+       0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,
+       0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,
+       0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,
+       0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,
+       // Bytes 2800 - 283f
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,
+       0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
+       0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,
+       0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,
+       0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,
+       // Bytes 2840 - 287f
+       0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,
+       0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,
+       // Bytes 2880 - 28bf
+       0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,
+       0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,
+       0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,
+       0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,
+       // Bytes 28c0 - 28ff
+       0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,
+       0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,
+       0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,
+       0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,
+       0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,
+       // Bytes 2900 - 293f
+       0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,
+       0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,
+       0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,
+       // Bytes 2940 - 297f
+       0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,
+       0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,
+       0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,
+       // Bytes 2980 - 29bf
+       0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,
+       0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
+       0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,
+       0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,
+       // Bytes 29c0 - 29ff
+       0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,
+       0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,
+       0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,
+       0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,
+       // Bytes 2a00 - 2a3f
+       0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,
+       0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,
+       0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,
+       0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2a40 - 2a7f
+       0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,
+       0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,
+       0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,
+       // Bytes 2a80 - 2abf
+       0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,
+       0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,
+       0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,
+       0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,
+       0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
+       // Bytes 2ac0 - 2aff
+       0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
+       0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,
+       0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,
+       0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,
+       // Bytes 2b00 - 2b3f
+       0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,
+       0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,
+       // Bytes 2b40 - 2b7f
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,
+       0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,
+       // Bytes 2b80 - 2bbf
+       0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,
+       0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,
+       0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,
+       0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,
+       // Bytes 2bc0 - 2bff
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2c00 - 2c3f
+       0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,
+       0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,
+       0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,
+       0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,
+       0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,
+       0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,
+       0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
+       0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,
+       // Bytes 2c40 - 2c7f
+       0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,
+       0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
+       0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,
+       0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,
+       // Bytes 2c80 - 2cbf
+       0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,
+       0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,
+       0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2cc0 - 2cff
+       0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,
+       0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2d00 - 2d3f
+       0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,
+       0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,
+       0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,
+       0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       // Bytes 2d40 - 2d7f
+       0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,
+       // Bytes 2d80 - 2dbf
+       0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,
+       0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,
+       0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,
+       0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,
+       0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,
+       0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,
+       0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,
+       0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,
+       // Bytes 2dc0 - 2dff
+       0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,
+       0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,
+       0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,
+       0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,
+       0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,
+       0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,
+       0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,
+       0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,
+       // Bytes 2e00 - 2e3f
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e40 - 2e7f
+       0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,
+       0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e80 - 2ebf
+       0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,
+       0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,
+       0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,
+       0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,
+       0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       // Bytes 2ec0 - 2eff
+       0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,
+       0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,
+       0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,
+       0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,
+       0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,
+       0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
+       0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,
+       0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,
+       // Bytes 2f00 - 2f3f
+       0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,
+       0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,
+       0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,
+       0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
+       0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,
+       // Bytes 2f40 - 2f7f
+       0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,
+       0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,
+       0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,
+       0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,
+       0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,
+       0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,
+       // Bytes 2f80 - 2fbf
+       0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,
+       0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,
+       0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,
+       0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,
+       0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,
+       0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,
+       0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,
+       0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,
+       // Bytes 2fc0 - 2fff
+       0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,
+       0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,
+       0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,
+       0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,
+       0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,
+       0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,
+       0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,
+       0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,
+       // Bytes 3000 - 303f
+       0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,
+       0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,
+       0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,
+       0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,
+       0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,
+       0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,
+       0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,
+       0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,
+       // Bytes 3040 - 307f
+       0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,
+       0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,
+       0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,
+       0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,
+       0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,
+       0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,
+       0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,
+       0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,
+       // Bytes 3080 - 30bf
+       0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,
+       0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,
+       0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,
+       0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,
+       0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,
+       0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,
+       0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,
+       0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,
+       // Bytes 30c0 - 30ff
+       0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,
+       0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,
+       0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,
+       0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,
+       0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,
+       0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,
+       0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,
+       // Bytes 3100 - 313f
+       0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,
+       0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,
+       0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,
+       0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,
+       0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,
+       0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,
+       0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,
+       // Bytes 3140 - 317f
+       0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,
+       0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,
+       0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,
+       0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,
+       0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,
+       0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,
+       0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,
+       0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,
+       // Bytes 3180 - 31bf
+       0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,
+       0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,
+       0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,
+       0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,
+       0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,
+       0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,
+       0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,
+       0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,
+       // Bytes 31c0 - 31ff
+       0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,
+       0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,
+       0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,
+       0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,
+       0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,
+       0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,
+       0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,
+       0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,
+       // Bytes 3200 - 323f
+       0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,
+       0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,
+       0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,
+       0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,
+       0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,
+       0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,
+       0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,
+       0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,
+       // Bytes 3240 - 327f
+       0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,
+       0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,
+       0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,
+       0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,
+       0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,
+       0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,
+       0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,
+       // Bytes 3280 - 32bf
+       0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,
+       0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,
+       0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,
+       0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,
+       0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,
+       0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,
+       0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,
+       0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,
+       // Bytes 32c0 - 32ff
+       0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,
+       0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,
+       0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,
+       0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,
+       0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,
+       0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,
+       0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,
+       0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,
+       // Bytes 3300 - 333f
+       0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,
+       0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,
+       0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,
+       0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,
+       0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,
+       0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,
+       0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,
+       0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,
+       // Bytes 3340 - 337f
+       0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,
+       0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,
+       0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,
+       0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,
+       0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,
+       0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,
+       0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,
+       0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,
+       // Bytes 3380 - 33bf
+       0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,
+       0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,
+       0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,
+       0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,
+       0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,
+       0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,
+       0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,
+       0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,
+       // Bytes 33c0 - 33ff
+       0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,
+       0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,
+       0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,
+       0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,
+       0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,
+       0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,
+       0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,
+       // Bytes 3400 - 343f
+       0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,
+       0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,
+       0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,
+       0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,
+       0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,
+       0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,
+       0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,
+       // Bytes 3440 - 347f
+       0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,
+       0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,
+       0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,
+       0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,
+       0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,
+       0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,
+       0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,
+       0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,
+       // Bytes 3480 - 34bf
+       0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,
+       0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,
+       0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,
+       0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,
+       0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,
+       0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,
+       0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,
+       0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,
+       // Bytes 34c0 - 34ff
+       0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,
+       0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,
+       0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,
+       0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,
+       0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,
+       0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,
+       0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,
+       0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,
+       // Bytes 3500 - 353f
+       0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,
+       0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,
+       0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,
+       0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,
+       0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,
+       0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,
+       0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,
+       0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,
+       // Bytes 3540 - 357f
+       0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,
+       0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,
+       0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,
+       0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,
+       0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,
+       0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,
+       0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,
+       0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,
+       // Bytes 3580 - 35bf
+       0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,
+       0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,
+       0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,
+       0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,
+       0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,
+       0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,
+       0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,
+       // Bytes 35c0 - 35ff
+       0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,
+       0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,
+       0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,
+       0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,
+       0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,
+       // Bytes 3600 - 363f
+       0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,
+       0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,
+       // Bytes 3640 - 367f
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,
+       // Bytes 3680 - 36bf
+       0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,
+       0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,
+       0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,
+       // Bytes 36c0 - 36ff
+       0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,
+       0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,
+       0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,
+       0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,
+       0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,
+       0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,
+       0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,
+       // Bytes 3700 - 373f
+       0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,
+       0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3740 - 377f
+       0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,
+       0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,
+       0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,
+       0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,
+       0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,
+       // Bytes 3780 - 37bf
+       0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,
+       // Bytes 37c0 - 37ff
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,
+       0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,
+       0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,
+       0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,
+       0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3800 - 383f
+       0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,
+       0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,
+       0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,
+       0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,
+       0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,
+       0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,
+       0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,
+       0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,
+       // Bytes 3840 - 387f
+       0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,
+       0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,
+       0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,
+       0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,
+       0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,
+       0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,
+       0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       // Bytes 3880 - 38bf
+       0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,
+       0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,
+       0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,
+       0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,
+       0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,
+       0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,
+       0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,
+       // Bytes 38c0 - 38ff
+       0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,
+       0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,
+       0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,
+       0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,
+       0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,
+       0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,
+       0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,
+       0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,
+       // Bytes 3900 - 393f
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,
+       0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,
+       0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,
+       0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,
+       0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,
+       // Bytes 3940 - 397f
+       0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,
+       0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,
+       0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,
+       0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,
+       0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,
+       0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,
+       0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
+       // Bytes 3980 - 39bf
+       0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,
+       0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,
+       0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,
+       0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,
+       0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,
+       0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,
+       0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,
+       0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,
+       // Bytes 39c0 - 39ff
+       0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,
+       0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,
+       0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,
+       0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       // Bytes 3a00 - 3a3f
+       0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,
+       0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,
+       0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,
+       0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,
+       0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       // Bytes 3a40 - 3a7f
+       0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,
+       0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,
+       0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,
+       0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,
+       0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,
+       0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,
+       0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,
+       // Bytes 3a80 - 3abf
+       0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,
+       0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,
+       0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,
+       0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,
+       0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,
+       0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,
+       // Bytes 3ac0 - 3aff
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
+       0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,
+       0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,
+       0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,
+       0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,
+       // Bytes 3b00 - 3b3f
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,
+       0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,
+       0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,
+       0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,
+       0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,
+       // Bytes 3b40 - 3b7f
+       0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,
+       0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,
+       0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,
+       0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,
+       0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,
+       0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
+       0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,
+       // Bytes 3b80 - 3bbf
+       0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,
+       0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,
+       0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,
+       0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,
+       0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,
+       0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,
+       0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,
+       0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,
+       // Bytes 3bc0 - 3bff
+       0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
+       0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,
+       // Bytes 3c00 - 3c3f
+       0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       // Bytes 3c40 - 3c7f
+       0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       // Bytes 3c80 - 3cbf
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,
+       // Bytes 3cc0 - 3cff
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,
+       0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       // Bytes 3d00 - 3d3f
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3d40 - 3d7f
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       // Bytes 3d80 - 3dbf
+       0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       // Bytes 3dc0 - 3dff
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       // Bytes 3e00 - 3e3f
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3e40 - 3e7f
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       // Bytes 3e80 - 3ebf
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       // Bytes 3ec0 - 3eff
+       0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,
+       0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,
+       // Bytes 3f00 - 3f3f
+       0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f40 - 3f7f
+       0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f80 - 3fbf
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,
+       // Bytes 3fc0 - 3fff
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4000 - 403f
+       0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4040 - 407f
+       0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4080 - 40bf
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 40c0 - 40ff
+       0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       // Bytes 4100 - 413f
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       // Bytes 4140 - 417f
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,
+       // Bytes 4180 - 41bf
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       // Bytes 41c0 - 41ff
+       0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       // Bytes 4200 - 423f
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,
+       // Bytes 4240 - 427f
+       0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,
+       0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,
+       0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,
+       0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,
+       0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,
+       0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,
+       0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,
+       0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,
+       // Bytes 4280 - 42bf
+       0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,
+       0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,
+       0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,
+       0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,
+       0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,
+       0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,
+       0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,
+       0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,
+       // Bytes 42c0 - 42ff
+       0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,
+       0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,
+       0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,
+       0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,
+       0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,
+       0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,
+       0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,
+       // Bytes 4300 - 433f
+       0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,
+       0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,
+       0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,
+       // Bytes 4340 - 437f
+       0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,
+       0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,
+       0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,
+       // Bytes 4380 - 43bf
+       0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,
+       0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,
+       // Bytes 43c0 - 43ff
+       0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,
+       0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,
+       0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,
+       // Bytes 4400 - 443f
+       0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,
+       0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,
+       0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,
+       0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,
+       0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,
+       0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,
+       0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,
+       // Bytes 4440 - 447f
+       0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,
+       0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,
+       0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,
+       0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,
+       0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,
+       0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,
+       0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,
+       0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,
+       // Bytes 4480 - 44bf
+       0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,
+       0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,
+       0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,
+       0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,
+       0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,
+       0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,
+       0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,
+       // Bytes 44c0 - 44ff
+       0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,
+       0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,
+       0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,
+       0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,
+       0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,
+       0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,
+       // Bytes 4500 - 453f
+       0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,
+       0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,
+       // Bytes 4540 - 457f
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,
+       // Bytes 4580 - 45bf
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,
+       // Bytes 45c0 - 45ff
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,
+       0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,
+       0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,
+       // Bytes 4600 - 463f
+       0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,
+       0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,
+       0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       // Bytes 4640 - 467f
+       0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,
+       0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       // Bytes 4680 - 46bf
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,
+       0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,
+       0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,
+       0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,
+       0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,
+       0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,
+       0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,
+       0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,
+       // Bytes 46c0 - 46ff
+       0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,
+       0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,
+       0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,
+       0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,
+       0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,
+       0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,
+       0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,
+       0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,
+       // Bytes 4700 - 473f
+       0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,
+       0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,
+       0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,
+       0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,
+       0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,
+       0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,
+       0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,
+       0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,
+       // Bytes 4740 - 477f
+       0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,
+       0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,
+       0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,
+       0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,
+       0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,
+       0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,
+       0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,
+       0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,
+       // Bytes 4780 - 47bf
+       0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,
+       0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,
+       0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,
+       0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,
+       0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,
+       0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,
+       // Bytes 47c0 - 47ff
+       0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,
+       // Bytes 4800 - 483f
+       0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,
+       0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,
+       0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,
+       0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,
+       // Bytes 4840 - 487f
+       0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,
+       0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,
+       0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,
+       0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,
+       0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,
+       // Bytes 4880 - 48bf
+       0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       // Bytes 48c0 - 48ff
+       0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       // Bytes 4900 - 493f
+       0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       // Bytes 4940 - 497f
+       0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       // Bytes 4980 - 49bf
+       0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,
+       0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,
+       0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,
+       // Bytes 49c0 - 49ff
+       0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,
+       // Bytes 4a00 - 4a3f
+       0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,
+       // Bytes 4a40 - 4a7f
+       0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,
+       0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,
+       0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,
+       0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,
+       // Bytes 4a80 - 4abf
+       0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,
+       0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,
+       0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,
+       0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,
+       0x01,
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfcTrie. Total size: 10442 bytes (10.20 KiB). Checksum: 4ba400a9d8208e03.
+type nfcTrie struct{}
+
+func newNfcTrie(i int) *nfcTrie {
+       return &nfcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 45:
+               return uint16(nfcValues[n<<6+uint32(b)])
+       default:
+               n -= 45
+               return uint16(nfcSparse.lookup(n, b))
+       }
+}
+
+// nfcValues: 47 blocks, 3008 entries, 6016 bytes
+// The third block is the zero block.
+var nfcValues = [3008]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,
+       // Block 0x5, offset 0x140
+       0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,
+       // Block 0x6, offset 0x180
+       0x184: 0x8100, 0x185: 0x8100,
+       0x186: 0x8100,
+       0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x8100,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x8100, 0x285: 0x35a1,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,
+       0x2c6: 0xa000, 0x2c7: 0x3709,
+       0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,
+       0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
+       0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,
+       0x2de: 0xa000, 0x2e3: 0xa000,
+       0x2e7: 0xa000,
+       0x2eb: 0xa000, 0x2ed: 0xa000,
+       0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
+       0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,
+       0x2fe: 0xa000,
+       // Block 0xc, offset 0x300
+       0x301: 0x3733, 0x302: 0x37b7,
+       0x310: 0x370f, 0x311: 0x3793,
+       0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,
+       0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,
+       0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,
+       0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,
+       0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,
+       0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,
+       0x338: 0x3787, 0x339: 0x380b,
+       // Block 0xd, offset 0x340
+       0x351: 0x812d,
+       0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,
+       0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,
+       0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,
+       0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,
+       0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,
+       0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,
+       0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,
+       0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,
+       // Block 0xe, offset 0x380
+       0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,
+       0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,
+       0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x812d,
+       0x3b0: 0x811e,
+       // Block 0xf, offset 0x3c0
+       0x3c5: 0xa000,
+       0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,
+       0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,
+       0x3d2: 0x2d4e,
+       0x3f4: 0x8102, 0x3f5: 0x9900,
+       0x3fa: 0xa000, 0x3fb: 0x2d56,
+       0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,
+       // Block 0x10, offset 0x400
+       0x400: 0x8132, 0x401: 0x8132, 0x402: 0x812d, 0x403: 0x8132, 0x404: 0x8132, 0x405: 0x8132,
+       0x406: 0x8132, 0x407: 0x8132, 0x408: 0x8132, 0x409: 0x8132, 0x40a: 0x812d, 0x40b: 0x8132,
+       0x40c: 0x8132, 0x40d: 0x8135, 0x40e: 0x812a, 0x40f: 0x812d, 0x410: 0x8129, 0x411: 0x8132,
+       0x412: 0x8132, 0x413: 0x8132, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132,
+       0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132,
+       0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x422: 0x8132, 0x423: 0x8132,
+       0x424: 0x8132, 0x425: 0x8132, 0x426: 0x8132, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x8132,
+       0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x8132, 0x42e: 0x8132, 0x42f: 0x8132,
+       0x430: 0x8132, 0x431: 0x8132, 0x432: 0x8132, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132,
+       0x436: 0x8133, 0x437: 0x8131, 0x438: 0x8131, 0x439: 0x812d, 0x43b: 0x8132,
+       0x43c: 0x8134, 0x43d: 0x812d, 0x43e: 0x8132, 0x43f: 0x812d,
+       // Block 0x11, offset 0x440
+       0x440: 0x2f97, 0x441: 0x32a3, 0x442: 0x2fa1, 0x443: 0x32ad, 0x444: 0x2fa6, 0x445: 0x32b2,
+       0x446: 0x2fab, 0x447: 0x32b7, 0x448: 0x38cc, 0x449: 0x3a5b, 0x44a: 0x2fc4, 0x44b: 0x32d0,
+       0x44c: 0x2fce, 0x44d: 0x32da, 0x44e: 0x2fdd, 0x44f: 0x32e9, 0x450: 0x2fd3, 0x451: 0x32df,
+       0x452: 0x2fd8, 0x453: 0x32e4, 0x454: 0x38ef, 0x455: 0x3a7e, 0x456: 0x38f6, 0x457: 0x3a85,
+       0x458: 0x3019, 0x459: 0x3325, 0x45a: 0x301e, 0x45b: 0x332a, 0x45c: 0x3904, 0x45d: 0x3a93,
+       0x45e: 0x3023, 0x45f: 0x332f, 0x460: 0x3032, 0x461: 0x333e, 0x462: 0x3050, 0x463: 0x335c,
+       0x464: 0x305f, 0x465: 0x336b, 0x466: 0x3055, 0x467: 0x3361, 0x468: 0x3064, 0x469: 0x3370,
+       0x46a: 0x3069, 0x46b: 0x3375, 0x46c: 0x30af, 0x46d: 0x33bb, 0x46e: 0x390b, 0x46f: 0x3a9a,
+       0x470: 0x30b9, 0x471: 0x33ca, 0x472: 0x30c3, 0x473: 0x33d4, 0x474: 0x30cd, 0x475: 0x33de,
+       0x476: 0x46c4, 0x477: 0x4755, 0x478: 0x3912, 0x479: 0x3aa1, 0x47a: 0x30e6, 0x47b: 0x33f7,
+       0x47c: 0x30e1, 0x47d: 0x33f2, 0x47e: 0x30eb, 0x47f: 0x33fc,
+       // Block 0x12, offset 0x480
+       0x480: 0x30f0, 0x481: 0x3401, 0x482: 0x30f5, 0x483: 0x3406, 0x484: 0x3109, 0x485: 0x341a,
+       0x486: 0x3113, 0x487: 0x3424, 0x488: 0x3122, 0x489: 0x3433, 0x48a: 0x311d, 0x48b: 0x342e,
+       0x48c: 0x3935, 0x48d: 0x3ac4, 0x48e: 0x3943, 0x48f: 0x3ad2, 0x490: 0x394a, 0x491: 0x3ad9,
+       0x492: 0x3951, 0x493: 0x3ae0, 0x494: 0x314f, 0x495: 0x3460, 0x496: 0x3154, 0x497: 0x3465,
+       0x498: 0x315e, 0x499: 0x346f, 0x49a: 0x46f1, 0x49b: 0x4782, 0x49c: 0x3997, 0x49d: 0x3b26,
+       0x49e: 0x3177, 0x49f: 0x3488, 0x4a0: 0x3181, 0x4a1: 0x3492, 0x4a2: 0x4700, 0x4a3: 0x4791,
+       0x4a4: 0x399e, 0x4a5: 0x3b2d, 0x4a6: 0x39a5, 0x4a7: 0x3b34, 0x4a8: 0x39ac, 0x4a9: 0x3b3b,
+       0x4aa: 0x3190, 0x4ab: 0x34a1, 0x4ac: 0x319a, 0x4ad: 0x34b0, 0x4ae: 0x31ae, 0x4af: 0x34c4,
+       0x4b0: 0x31a9, 0x4b1: 0x34bf, 0x4b2: 0x31ea, 0x4b3: 0x3500, 0x4b4: 0x31f9, 0x4b5: 0x350f,
+       0x4b6: 0x31f4, 0x4b7: 0x350a, 0x4b8: 0x39b3, 0x4b9: 0x3b42, 0x4ba: 0x39ba, 0x4bb: 0x3b49,
+       0x4bc: 0x31fe, 0x4bd: 0x3514, 0x4be: 0x3203, 0x4bf: 0x3519,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x3208, 0x4c1: 0x351e, 0x4c2: 0x320d, 0x4c3: 0x3523, 0x4c4: 0x321c, 0x4c5: 0x3532,
+       0x4c6: 0x3217, 0x4c7: 0x352d, 0x4c8: 0x3221, 0x4c9: 0x353c, 0x4ca: 0x3226, 0x4cb: 0x3541,
+       0x4cc: 0x322b, 0x4cd: 0x3546, 0x4ce: 0x3249, 0x4cf: 0x3564, 0x4d0: 0x3262, 0x4d1: 0x3582,
+       0x4d2: 0x3271, 0x4d3: 0x3591, 0x4d4: 0x3276, 0x4d5: 0x3596, 0x4d6: 0x337a, 0x4d7: 0x34a6,
+       0x4d8: 0x3537, 0x4d9: 0x3573, 0x4db: 0x35d1,
+       0x4e0: 0x46a1, 0x4e1: 0x4732, 0x4e2: 0x2f83, 0x4e3: 0x328f,
+       0x4e4: 0x3878, 0x4e5: 0x3a07, 0x4e6: 0x3871, 0x4e7: 0x3a00, 0x4e8: 0x3886, 0x4e9: 0x3a15,
+       0x4ea: 0x387f, 0x4eb: 0x3a0e, 0x4ec: 0x38be, 0x4ed: 0x3a4d, 0x4ee: 0x3894, 0x4ef: 0x3a23,
+       0x4f0: 0x388d, 0x4f1: 0x3a1c, 0x4f2: 0x38a2, 0x4f3: 0x3a31, 0x4f4: 0x389b, 0x4f5: 0x3a2a,
+       0x4f6: 0x38c5, 0x4f7: 0x3a54, 0x4f8: 0x46b5, 0x4f9: 0x4746, 0x4fa: 0x3000, 0x4fb: 0x330c,
+       0x4fc: 0x2fec, 0x4fd: 0x32f8, 0x4fe: 0x38da, 0x4ff: 0x3a69,
+       // Block 0x14, offset 0x500
+       0x500: 0x38d3, 0x501: 0x3a62, 0x502: 0x38e8, 0x503: 0x3a77, 0x504: 0x38e1, 0x505: 0x3a70,
+       0x506: 0x38fd, 0x507: 0x3a8c, 0x508: 0x3091, 0x509: 0x339d, 0x50a: 0x30a5, 0x50b: 0x33b1,
+       0x50c: 0x46e7, 0x50d: 0x4778, 0x50e: 0x3136, 0x50f: 0x3447, 0x510: 0x3920, 0x511: 0x3aaf,
+       0x512: 0x3919, 0x513: 0x3aa8, 0x514: 0x392e, 0x515: 0x3abd, 0x516: 0x3927, 0x517: 0x3ab6,
+       0x518: 0x3989, 0x519: 0x3b18, 0x51a: 0x396d, 0x51b: 0x3afc, 0x51c: 0x3966, 0x51d: 0x3af5,
+       0x51e: 0x397b, 0x51f: 0x3b0a, 0x520: 0x3974, 0x521: 0x3b03, 0x522: 0x3982, 0x523: 0x3b11,
+       0x524: 0x31e5, 0x525: 0x34fb, 0x526: 0x31c7, 0x527: 0x34dd, 0x528: 0x39e4, 0x529: 0x3b73,
+       0x52a: 0x39dd, 0x52b: 0x3b6c, 0x52c: 0x39f2, 0x52d: 0x3b81, 0x52e: 0x39eb, 0x52f: 0x3b7a,
+       0x530: 0x39f9, 0x531: 0x3b88, 0x532: 0x3230, 0x533: 0x354b, 0x534: 0x3258, 0x535: 0x3578,
+       0x536: 0x3253, 0x537: 0x356e, 0x538: 0x323f, 0x539: 0x355a,
+       // Block 0x15, offset 0x540
+       0x540: 0x4804, 0x541: 0x480a, 0x542: 0x491e, 0x543: 0x4936, 0x544: 0x4926, 0x545: 0x493e,
+       0x546: 0x492e, 0x547: 0x4946, 0x548: 0x47aa, 0x549: 0x47b0, 0x54a: 0x488e, 0x54b: 0x48a6,
+       0x54c: 0x4896, 0x54d: 0x48ae, 0x54e: 0x489e, 0x54f: 0x48b6, 0x550: 0x4816, 0x551: 0x481c,
+       0x552: 0x3db8, 0x553: 0x3dc8, 0x554: 0x3dc0, 0x555: 0x3dd0,
+       0x558: 0x47b6, 0x559: 0x47bc, 0x55a: 0x3ce8, 0x55b: 0x3cf8, 0x55c: 0x3cf0, 0x55d: 0x3d00,
+       0x560: 0x482e, 0x561: 0x4834, 0x562: 0x494e, 0x563: 0x4966,
+       0x564: 0x4956, 0x565: 0x496e, 0x566: 0x495e, 0x567: 0x4976, 0x568: 0x47c2, 0x569: 0x47c8,
+       0x56a: 0x48be, 0x56b: 0x48d6, 0x56c: 0x48c6, 0x56d: 0x48de, 0x56e: 0x48ce, 0x56f: 0x48e6,
+       0x570: 0x4846, 0x571: 0x484c, 0x572: 0x3e18, 0x573: 0x3e30, 0x574: 0x3e20, 0x575: 0x3e38,
+       0x576: 0x3e28, 0x577: 0x3e40, 0x578: 0x47ce, 0x579: 0x47d4, 0x57a: 0x3d18, 0x57b: 0x3d30,
+       0x57c: 0x3d20, 0x57d: 0x3d38, 0x57e: 0x3d28, 0x57f: 0x3d40,
+       // Block 0x16, offset 0x580
+       0x580: 0x4852, 0x581: 0x4858, 0x582: 0x3e48, 0x583: 0x3e58, 0x584: 0x3e50, 0x585: 0x3e60,
+       0x588: 0x47da, 0x589: 0x47e0, 0x58a: 0x3d48, 0x58b: 0x3d58,
+       0x58c: 0x3d50, 0x58d: 0x3d60, 0x590: 0x4864, 0x591: 0x486a,
+       0x592: 0x3e80, 0x593: 0x3e98, 0x594: 0x3e88, 0x595: 0x3ea0, 0x596: 0x3e90, 0x597: 0x3ea8,
+       0x599: 0x47e6, 0x59b: 0x3d68, 0x59d: 0x3d70,
+       0x59f: 0x3d78, 0x5a0: 0x487c, 0x5a1: 0x4882, 0x5a2: 0x497e, 0x5a3: 0x4996,
+       0x5a4: 0x4986, 0x5a5: 0x499e, 0x5a6: 0x498e, 0x5a7: 0x49a6, 0x5a8: 0x47ec, 0x5a9: 0x47f2,
+       0x5aa: 0x48ee, 0x5ab: 0x4906, 0x5ac: 0x48f6, 0x5ad: 0x490e, 0x5ae: 0x48fe, 0x5af: 0x4916,
+       0x5b0: 0x47f8, 0x5b1: 0x431e, 0x5b2: 0x3691, 0x5b3: 0x4324, 0x5b4: 0x4822, 0x5b5: 0x432a,
+       0x5b6: 0x36a3, 0x5b7: 0x4330, 0x5b8: 0x36c1, 0x5b9: 0x4336, 0x5ba: 0x36d9, 0x5bb: 0x433c,
+       0x5bc: 0x4870, 0x5bd: 0x4342,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x3da0, 0x5c1: 0x3da8, 0x5c2: 0x4184, 0x5c3: 0x41a2, 0x5c4: 0x418e, 0x5c5: 0x41ac,
+       0x5c6: 0x4198, 0x5c7: 0x41b6, 0x5c8: 0x3cd8, 0x5c9: 0x3ce0, 0x5ca: 0x40d0, 0x5cb: 0x40ee,
+       0x5cc: 0x40da, 0x5cd: 0x40f8, 0x5ce: 0x40e4, 0x5cf: 0x4102, 0x5d0: 0x3de8, 0x5d1: 0x3df0,
+       0x5d2: 0x41c0, 0x5d3: 0x41de, 0x5d4: 0x41ca, 0x5d5: 0x41e8, 0x5d6: 0x41d4, 0x5d7: 0x41f2,
+       0x5d8: 0x3d08, 0x5d9: 0x3d10, 0x5da: 0x410c, 0x5db: 0x412a, 0x5dc: 0x4116, 0x5dd: 0x4134,
+       0x5de: 0x4120, 0x5df: 0x413e, 0x5e0: 0x3ec0, 0x5e1: 0x3ec8, 0x5e2: 0x41fc, 0x5e3: 0x421a,
+       0x5e4: 0x4206, 0x5e5: 0x4224, 0x5e6: 0x4210, 0x5e7: 0x422e, 0x5e8: 0x3d80, 0x5e9: 0x3d88,
+       0x5ea: 0x4148, 0x5eb: 0x4166, 0x5ec: 0x4152, 0x5ed: 0x4170, 0x5ee: 0x415c, 0x5ef: 0x417a,
+       0x5f0: 0x3685, 0x5f1: 0x367f, 0x5f2: 0x3d90, 0x5f3: 0x368b, 0x5f4: 0x3d98,
+       0x5f6: 0x4810, 0x5f7: 0x3db0, 0x5f8: 0x35f5, 0x5f9: 0x35ef, 0x5fa: 0x35e3, 0x5fb: 0x42ee,
+       0x5fc: 0x35fb, 0x5fd: 0x8100, 0x5fe: 0x01d3, 0x5ff: 0xa100,
+       // Block 0x18, offset 0x600
+       0x600: 0x8100, 0x601: 0x35a7, 0x602: 0x3dd8, 0x603: 0x369d, 0x604: 0x3de0,
+       0x606: 0x483a, 0x607: 0x3df8, 0x608: 0x3601, 0x609: 0x42f4, 0x60a: 0x360d, 0x60b: 0x42fa,
+       0x60c: 0x3619, 0x60d: 0x3b8f, 0x60e: 0x3b96, 0x60f: 0x3b9d, 0x610: 0x36b5, 0x611: 0x36af,
+       0x612: 0x3e00, 0x613: 0x44e4, 0x616: 0x36bb, 0x617: 0x3e10,
+       0x618: 0x3631, 0x619: 0x362b, 0x61a: 0x361f, 0x61b: 0x4300, 0x61d: 0x3ba4,
+       0x61e: 0x3bab, 0x61f: 0x3bb2, 0x620: 0x36eb, 0x621: 0x36e5, 0x622: 0x3e68, 0x623: 0x44ec,
+       0x624: 0x36cd, 0x625: 0x36d3, 0x626: 0x36f1, 0x627: 0x3e78, 0x628: 0x3661, 0x629: 0x365b,
+       0x62a: 0x364f, 0x62b: 0x430c, 0x62c: 0x3649, 0x62d: 0x359b, 0x62e: 0x42e8, 0x62f: 0x0081,
+       0x632: 0x3eb0, 0x633: 0x36f7, 0x634: 0x3eb8,
+       0x636: 0x4888, 0x637: 0x3ed0, 0x638: 0x363d, 0x639: 0x4306, 0x63a: 0x366d, 0x63b: 0x4318,
+       0x63c: 0x3679, 0x63d: 0x4256, 0x63e: 0xa100,
+       // Block 0x19, offset 0x640
+       0x641: 0x3c06, 0x643: 0xa000, 0x644: 0x3c0d, 0x645: 0xa000,
+       0x647: 0x3c14, 0x648: 0xa000, 0x649: 0x3c1b,
+       0x64d: 0xa000,
+       0x660: 0x2f65, 0x661: 0xa000, 0x662: 0x3c29,
+       0x664: 0xa000, 0x665: 0xa000,
+       0x66d: 0x3c22, 0x66e: 0x2f60, 0x66f: 0x2f6a,
+       0x670: 0x3c30, 0x671: 0x3c37, 0x672: 0xa000, 0x673: 0xa000, 0x674: 0x3c3e, 0x675: 0x3c45,
+       0x676: 0xa000, 0x677: 0xa000, 0x678: 0x3c4c, 0x679: 0x3c53, 0x67a: 0xa000, 0x67b: 0xa000,
+       0x67c: 0xa000, 0x67d: 0xa000,
+       // Block 0x1a, offset 0x680
+       0x680: 0x3c5a, 0x681: 0x3c61, 0x682: 0xa000, 0x683: 0xa000, 0x684: 0x3c76, 0x685: 0x3c7d,
+       0x686: 0xa000, 0x687: 0xa000, 0x688: 0x3c84, 0x689: 0x3c8b,
+       0x691: 0xa000,
+       0x692: 0xa000,
+       0x6a2: 0xa000,
+       0x6a8: 0xa000, 0x6a9: 0xa000,
+       0x6ab: 0xa000, 0x6ac: 0x3ca0, 0x6ad: 0x3ca7, 0x6ae: 0x3cae, 0x6af: 0x3cb5,
+       0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0xa000, 0x6b5: 0xa000,
+       // Block 0x1b, offset 0x6c0
+       0x6c6: 0xa000, 0x6cb: 0xa000,
+       0x6cc: 0x3f08, 0x6cd: 0xa000, 0x6ce: 0x3f10, 0x6cf: 0xa000, 0x6d0: 0x3f18, 0x6d1: 0xa000,
+       0x6d2: 0x3f20, 0x6d3: 0xa000, 0x6d4: 0x3f28, 0x6d5: 0xa000, 0x6d6: 0x3f30, 0x6d7: 0xa000,
+       0x6d8: 0x3f38, 0x6d9: 0xa000, 0x6da: 0x3f40, 0x6db: 0xa000, 0x6dc: 0x3f48, 0x6dd: 0xa000,
+       0x6de: 0x3f50, 0x6df: 0xa000, 0x6e0: 0x3f58, 0x6e1: 0xa000, 0x6e2: 0x3f60,
+       0x6e4: 0xa000, 0x6e5: 0x3f68, 0x6e6: 0xa000, 0x6e7: 0x3f70, 0x6e8: 0xa000, 0x6e9: 0x3f78,
+       0x6ef: 0xa000,
+       0x6f0: 0x3f80, 0x6f1: 0x3f88, 0x6f2: 0xa000, 0x6f3: 0x3f90, 0x6f4: 0x3f98, 0x6f5: 0xa000,
+       0x6f6: 0x3fa0, 0x6f7: 0x3fa8, 0x6f8: 0xa000, 0x6f9: 0x3fb0, 0x6fa: 0x3fb8, 0x6fb: 0xa000,
+       0x6fc: 0x3fc0, 0x6fd: 0x3fc8,
+       // Block 0x1c, offset 0x700
+       0x714: 0x3f00,
+       0x719: 0x9903, 0x71a: 0x9903, 0x71b: 0x8100, 0x71c: 0x8100, 0x71d: 0xa000,
+       0x71e: 0x3fd0,
+       0x726: 0xa000,
+       0x72b: 0xa000, 0x72c: 0x3fe0, 0x72d: 0xa000, 0x72e: 0x3fe8, 0x72f: 0xa000,
+       0x730: 0x3ff0, 0x731: 0xa000, 0x732: 0x3ff8, 0x733: 0xa000, 0x734: 0x4000, 0x735: 0xa000,
+       0x736: 0x4008, 0x737: 0xa000, 0x738: 0x4010, 0x739: 0xa000, 0x73a: 0x4018, 0x73b: 0xa000,
+       0x73c: 0x4020, 0x73d: 0xa000, 0x73e: 0x4028, 0x73f: 0xa000,
+       // Block 0x1d, offset 0x740
+       0x740: 0x4030, 0x741: 0xa000, 0x742: 0x4038, 0x744: 0xa000, 0x745: 0x4040,
+       0x746: 0xa000, 0x747: 0x4048, 0x748: 0xa000, 0x749: 0x4050,
+       0x74f: 0xa000, 0x750: 0x4058, 0x751: 0x4060,
+       0x752: 0xa000, 0x753: 0x4068, 0x754: 0x4070, 0x755: 0xa000, 0x756: 0x4078, 0x757: 0x4080,
+       0x758: 0xa000, 0x759: 0x4088, 0x75a: 0x4090, 0x75b: 0xa000, 0x75c: 0x4098, 0x75d: 0x40a0,
+       0x76f: 0xa000,
+       0x770: 0xa000, 0x771: 0xa000, 0x772: 0xa000, 0x774: 0x3fd8,
+       0x777: 0x40a8, 0x778: 0x40b0, 0x779: 0x40b8, 0x77a: 0x40c0,
+       0x77d: 0xa000, 0x77e: 0x40c8,
+       // Block 0x1e, offset 0x780
+       0x780: 0x1377, 0x781: 0x0cfb, 0x782: 0x13d3, 0x783: 0x139f, 0x784: 0x0e57, 0x785: 0x06eb,
+       0x786: 0x08df, 0x787: 0x162b, 0x788: 0x162b, 0x789: 0x0a0b, 0x78a: 0x145f, 0x78b: 0x0943,
+       0x78c: 0x0a07, 0x78d: 0x0bef, 0x78e: 0x0fcf, 0x78f: 0x115f, 0x790: 0x1297, 0x791: 0x12d3,
+       0x792: 0x1307, 0x793: 0x141b, 0x794: 0x0d73, 0x795: 0x0dff, 0x796: 0x0eab, 0x797: 0x0f43,
+       0x798: 0x125f, 0x799: 0x1447, 0x79a: 0x1573, 0x79b: 0x070f, 0x79c: 0x08b3, 0x79d: 0x0d87,
+       0x79e: 0x0ecf, 0x79f: 0x1293, 0x7a0: 0x15c3, 0x7a1: 0x0ab3, 0x7a2: 0x0e77, 0x7a3: 0x1283,
+       0x7a4: 0x1317, 0x7a5: 0x0c23, 0x7a6: 0x11bb, 0x7a7: 0x12df, 0x7a8: 0x0b1f, 0x7a9: 0x0d0f,
+       0x7aa: 0x0e17, 0x7ab: 0x0f1b, 0x7ac: 0x1427, 0x7ad: 0x074f, 0x7ae: 0x07e7, 0x7af: 0x0853,
+       0x7b0: 0x0c8b, 0x7b1: 0x0d7f, 0x7b2: 0x0ecb, 0x7b3: 0x0fef, 0x7b4: 0x1177, 0x7b5: 0x128b,
+       0x7b6: 0x12a3, 0x7b7: 0x13c7, 0x7b8: 0x14ef, 0x7b9: 0x15a3, 0x7ba: 0x15bf, 0x7bb: 0x102b,
+       0x7bc: 0x106b, 0x7bd: 0x1123, 0x7be: 0x1243, 0x7bf: 0x147b,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x15cb, 0x7c1: 0x134b, 0x7c2: 0x09c7, 0x7c3: 0x0b3b, 0x7c4: 0x10db, 0x7c5: 0x119b,
+       0x7c6: 0x0eff, 0x7c7: 0x1033, 0x7c8: 0x1397, 0x7c9: 0x14e7, 0x7ca: 0x09c3, 0x7cb: 0x0a8f,
+       0x7cc: 0x0d77, 0x7cd: 0x0e2b, 0x7ce: 0x0e5f, 0x7cf: 0x1113, 0x7d0: 0x113b, 0x7d1: 0x14a7,
+       0x7d2: 0x084f, 0x7d3: 0x11a7, 0x7d4: 0x07f3, 0x7d5: 0x07ef, 0x7d6: 0x1097, 0x7d7: 0x1127,
+       0x7d8: 0x125b, 0x7d9: 0x14af, 0x7da: 0x1367, 0x7db: 0x0c27, 0x7dc: 0x0d73, 0x7dd: 0x1357,
+       0x7de: 0x06f7, 0x7df: 0x0a63, 0x7e0: 0x0b93, 0x7e1: 0x0f2f, 0x7e2: 0x0faf, 0x7e3: 0x0873,
+       0x7e4: 0x103b, 0x7e5: 0x075f, 0x7e6: 0x0b77, 0x7e7: 0x06d7, 0x7e8: 0x0deb, 0x7e9: 0x0ca3,
+       0x7ea: 0x110f, 0x7eb: 0x08c7, 0x7ec: 0x09b3, 0x7ed: 0x0ffb, 0x7ee: 0x1263, 0x7ef: 0x133b,
+       0x7f0: 0x0db7, 0x7f1: 0x13f7, 0x7f2: 0x0de3, 0x7f3: 0x0c37, 0x7f4: 0x121b, 0x7f5: 0x0c57,
+       0x7f6: 0x0fab, 0x7f7: 0x072b, 0x7f8: 0x07a7, 0x7f9: 0x07eb, 0x7fa: 0x0d53, 0x7fb: 0x10fb,
+       0x7fc: 0x11f3, 0x7fd: 0x1347, 0x7fe: 0x145b, 0x7ff: 0x085b,
+       // Block 0x20, offset 0x800
+       0x800: 0x090f, 0x801: 0x0a17, 0x802: 0x0b2f, 0x803: 0x0cbf, 0x804: 0x0e7b, 0x805: 0x103f,
+       0x806: 0x1497, 0x807: 0x157b, 0x808: 0x15cf, 0x809: 0x15e7, 0x80a: 0x0837, 0x80b: 0x0cf3,
+       0x80c: 0x0da3, 0x80d: 0x13eb, 0x80e: 0x0afb, 0x80f: 0x0bd7, 0x810: 0x0bf3, 0x811: 0x0c83,
+       0x812: 0x0e6b, 0x813: 0x0eb7, 0x814: 0x0f67, 0x815: 0x108b, 0x816: 0x112f, 0x817: 0x1193,
+       0x818: 0x13db, 0x819: 0x126b, 0x81a: 0x1403, 0x81b: 0x147f, 0x81c: 0x080f, 0x81d: 0x083b,
+       0x81e: 0x0923, 0x81f: 0x0ea7, 0x820: 0x12f3, 0x821: 0x133b, 0x822: 0x0b1b, 0x823: 0x0b8b,
+       0x824: 0x0c4f, 0x825: 0x0daf, 0x826: 0x10d7, 0x827: 0x0f23, 0x828: 0x073b, 0x829: 0x097f,
+       0x82a: 0x0a63, 0x82b: 0x0ac7, 0x82c: 0x0b97, 0x82d: 0x0f3f, 0x82e: 0x0f5b, 0x82f: 0x116b,
+       0x830: 0x118b, 0x831: 0x1463, 0x832: 0x14e3, 0x833: 0x14f3, 0x834: 0x152f, 0x835: 0x0753,
+       0x836: 0x107f, 0x837: 0x144f, 0x838: 0x14cb, 0x839: 0x0baf, 0x83a: 0x0717, 0x83b: 0x0777,
+       0x83c: 0x0a67, 0x83d: 0x0a87, 0x83e: 0x0caf, 0x83f: 0x0d73,
+       // Block 0x21, offset 0x840
+       0x840: 0x0ec3, 0x841: 0x0fcb, 0x842: 0x1277, 0x843: 0x1417, 0x844: 0x1623, 0x845: 0x0ce3,
+       0x846: 0x14a3, 0x847: 0x0833, 0x848: 0x0d2f, 0x849: 0x0d3b, 0x84a: 0x0e0f, 0x84b: 0x0e47,
+       0x84c: 0x0f4b, 0x84d: 0x0fa7, 0x84e: 0x1027, 0x84f: 0x110b, 0x850: 0x153b, 0x851: 0x07af,
+       0x852: 0x0c03, 0x853: 0x14b3, 0x854: 0x0767, 0x855: 0x0aab, 0x856: 0x0e2f, 0x857: 0x13df,
+       0x858: 0x0b67, 0x859: 0x0bb7, 0x85a: 0x0d43, 0x85b: 0x0f2f, 0x85c: 0x14bb, 0x85d: 0x0817,
+       0x85e: 0x08ff, 0x85f: 0x0a97, 0x860: 0x0cd3, 0x861: 0x0d1f, 0x862: 0x0d5f, 0x863: 0x0df3,
+       0x864: 0x0f47, 0x865: 0x0fbb, 0x866: 0x1157, 0x867: 0x12f7, 0x868: 0x1303, 0x869: 0x1457,
+       0x86a: 0x14d7, 0x86b: 0x0883, 0x86c: 0x0e4b, 0x86d: 0x0903, 0x86e: 0x0ec7, 0x86f: 0x0f6b,
+       0x870: 0x1287, 0x871: 0x14bf, 0x872: 0x15ab, 0x873: 0x15d3, 0x874: 0x0d37, 0x875: 0x0e27,
+       0x876: 0x11c3, 0x877: 0x10b7, 0x878: 0x10c3, 0x879: 0x10e7, 0x87a: 0x0f17, 0x87b: 0x0e9f,
+       0x87c: 0x1363, 0x87d: 0x0733, 0x87e: 0x122b, 0x87f: 0x081b,
+       // Block 0x22, offset 0x880
+       0x880: 0x080b, 0x881: 0x0b0b, 0x882: 0x0c2b, 0x883: 0x10f3, 0x884: 0x0a53, 0x885: 0x0e03,
+       0x886: 0x0cef, 0x887: 0x13e7, 0x888: 0x12e7, 0x889: 0x14ab, 0x88a: 0x1323, 0x88b: 0x0b27,
+       0x88c: 0x0787, 0x88d: 0x095b, 0x890: 0x09af,
+       0x892: 0x0cdf, 0x895: 0x07f7, 0x896: 0x0f1f, 0x897: 0x0fe3,
+       0x898: 0x1047, 0x899: 0x1063, 0x89a: 0x1067, 0x89b: 0x107b, 0x89c: 0x14fb, 0x89d: 0x10eb,
+       0x89e: 0x116f, 0x8a0: 0x128f, 0x8a2: 0x1353,
+       0x8a5: 0x1407, 0x8a6: 0x1433,
+       0x8aa: 0x154f, 0x8ab: 0x1553, 0x8ac: 0x1557, 0x8ad: 0x15bb, 0x8ae: 0x142b, 0x8af: 0x14c7,
+       0x8b0: 0x0757, 0x8b1: 0x077b, 0x8b2: 0x078f, 0x8b3: 0x084b, 0x8b4: 0x0857, 0x8b5: 0x0897,
+       0x8b6: 0x094b, 0x8b7: 0x0967, 0x8b8: 0x096f, 0x8b9: 0x09ab, 0x8ba: 0x09b7, 0x8bb: 0x0a93,
+       0x8bc: 0x0a9b, 0x8bd: 0x0ba3, 0x8be: 0x0bcb, 0x8bf: 0x0bd3,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0beb, 0x8c1: 0x0c97, 0x8c2: 0x0cc7, 0x8c3: 0x0ce7, 0x8c4: 0x0d57, 0x8c5: 0x0e1b,
+       0x8c6: 0x0e37, 0x8c7: 0x0e67, 0x8c8: 0x0ebb, 0x8c9: 0x0edb, 0x8ca: 0x0f4f, 0x8cb: 0x102f,
+       0x8cc: 0x104b, 0x8cd: 0x1053, 0x8ce: 0x104f, 0x8cf: 0x1057, 0x8d0: 0x105b, 0x8d1: 0x105f,
+       0x8d2: 0x1073, 0x8d3: 0x1077, 0x8d4: 0x109b, 0x8d5: 0x10af, 0x8d6: 0x10cb, 0x8d7: 0x112f,
+       0x8d8: 0x1137, 0x8d9: 0x113f, 0x8da: 0x1153, 0x8db: 0x117b, 0x8dc: 0x11cb, 0x8dd: 0x11ff,
+       0x8de: 0x11ff, 0x8df: 0x1267, 0x8e0: 0x130f, 0x8e1: 0x1327, 0x8e2: 0x135b, 0x8e3: 0x135f,
+       0x8e4: 0x13a3, 0x8e5: 0x13a7, 0x8e6: 0x13ff, 0x8e7: 0x1407, 0x8e8: 0x14db, 0x8e9: 0x151f,
+       0x8ea: 0x1537, 0x8eb: 0x0b9b, 0x8ec: 0x171e, 0x8ed: 0x11e3,
+       0x8f0: 0x06df, 0x8f1: 0x07e3, 0x8f2: 0x07a3, 0x8f3: 0x074b, 0x8f4: 0x078b, 0x8f5: 0x07b7,
+       0x8f6: 0x0847, 0x8f7: 0x0863, 0x8f8: 0x094b, 0x8f9: 0x0937, 0x8fa: 0x0947, 0x8fb: 0x0963,
+       0x8fc: 0x09af, 0x8fd: 0x09bf, 0x8fe: 0x0a03, 0x8ff: 0x0a0f,
+       // Block 0x24, offset 0x900
+       0x900: 0x0a2b, 0x901: 0x0a3b, 0x902: 0x0b23, 0x903: 0x0b2b, 0x904: 0x0b5b, 0x905: 0x0b7b,
+       0x906: 0x0bab, 0x907: 0x0bc3, 0x908: 0x0bb3, 0x909: 0x0bd3, 0x90a: 0x0bc7, 0x90b: 0x0beb,
+       0x90c: 0x0c07, 0x90d: 0x0c5f, 0x90e: 0x0c6b, 0x90f: 0x0c73, 0x910: 0x0c9b, 0x911: 0x0cdf,
+       0x912: 0x0d0f, 0x913: 0x0d13, 0x914: 0x0d27, 0x915: 0x0da7, 0x916: 0x0db7, 0x917: 0x0e0f,
+       0x918: 0x0e5b, 0x919: 0x0e53, 0x91a: 0x0e67, 0x91b: 0x0e83, 0x91c: 0x0ebb, 0x91d: 0x1013,
+       0x91e: 0x0edf, 0x91f: 0x0f13, 0x920: 0x0f1f, 0x921: 0x0f5f, 0x922: 0x0f7b, 0x923: 0x0f9f,
+       0x924: 0x0fc3, 0x925: 0x0fc7, 0x926: 0x0fe3, 0x927: 0x0fe7, 0x928: 0x0ff7, 0x929: 0x100b,
+       0x92a: 0x1007, 0x92b: 0x1037, 0x92c: 0x10b3, 0x92d: 0x10cb, 0x92e: 0x10e3, 0x92f: 0x111b,
+       0x930: 0x112f, 0x931: 0x114b, 0x932: 0x117b, 0x933: 0x122f, 0x934: 0x1257, 0x935: 0x12cb,
+       0x936: 0x1313, 0x937: 0x131f, 0x938: 0x1327, 0x939: 0x133f, 0x93a: 0x1353, 0x93b: 0x1343,
+       0x93c: 0x135b, 0x93d: 0x1357, 0x93e: 0x134f, 0x93f: 0x135f,
+       // Block 0x25, offset 0x940
+       0x940: 0x136b, 0x941: 0x13a7, 0x942: 0x13e3, 0x943: 0x1413, 0x944: 0x144b, 0x945: 0x146b,
+       0x946: 0x14b7, 0x947: 0x14db, 0x948: 0x14fb, 0x949: 0x150f, 0x94a: 0x151f, 0x94b: 0x152b,
+       0x94c: 0x1537, 0x94d: 0x158b, 0x94e: 0x162b, 0x94f: 0x16b5, 0x950: 0x16b0, 0x951: 0x16e2,
+       0x952: 0x0607, 0x953: 0x062f, 0x954: 0x0633, 0x955: 0x1764, 0x956: 0x1791, 0x957: 0x1809,
+       0x958: 0x1617, 0x959: 0x1627,
+       // Block 0x26, offset 0x980
+       0x980: 0x06fb, 0x981: 0x06f3, 0x982: 0x0703, 0x983: 0x1647, 0x984: 0x0747, 0x985: 0x0757,
+       0x986: 0x075b, 0x987: 0x0763, 0x988: 0x076b, 0x989: 0x076f, 0x98a: 0x077b, 0x98b: 0x0773,
+       0x98c: 0x05b3, 0x98d: 0x165b, 0x98e: 0x078f, 0x98f: 0x0793, 0x990: 0x0797, 0x991: 0x07b3,
+       0x992: 0x164c, 0x993: 0x05b7, 0x994: 0x079f, 0x995: 0x07bf, 0x996: 0x1656, 0x997: 0x07cf,
+       0x998: 0x07d7, 0x999: 0x0737, 0x99a: 0x07df, 0x99b: 0x07e3, 0x99c: 0x1831, 0x99d: 0x07ff,
+       0x99e: 0x0807, 0x99f: 0x05bf, 0x9a0: 0x081f, 0x9a1: 0x0823, 0x9a2: 0x082b, 0x9a3: 0x082f,
+       0x9a4: 0x05c3, 0x9a5: 0x0847, 0x9a6: 0x084b, 0x9a7: 0x0857, 0x9a8: 0x0863, 0x9a9: 0x0867,
+       0x9aa: 0x086b, 0x9ab: 0x0873, 0x9ac: 0x0893, 0x9ad: 0x0897, 0x9ae: 0x089f, 0x9af: 0x08af,
+       0x9b0: 0x08b7, 0x9b1: 0x08bb, 0x9b2: 0x08bb, 0x9b3: 0x08bb, 0x9b4: 0x166a, 0x9b5: 0x0e93,
+       0x9b6: 0x08cf, 0x9b7: 0x08d7, 0x9b8: 0x166f, 0x9b9: 0x08e3, 0x9ba: 0x08eb, 0x9bb: 0x08f3,
+       0x9bc: 0x091b, 0x9bd: 0x0907, 0x9be: 0x0913, 0x9bf: 0x0917,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x091f, 0x9c1: 0x0927, 0x9c2: 0x092b, 0x9c3: 0x0933, 0x9c4: 0x093b, 0x9c5: 0x093f,
+       0x9c6: 0x093f, 0x9c7: 0x0947, 0x9c8: 0x094f, 0x9c9: 0x0953, 0x9ca: 0x095f, 0x9cb: 0x0983,
+       0x9cc: 0x0967, 0x9cd: 0x0987, 0x9ce: 0x096b, 0x9cf: 0x0973, 0x9d0: 0x080b, 0x9d1: 0x09cf,
+       0x9d2: 0x0997, 0x9d3: 0x099b, 0x9d4: 0x099f, 0x9d5: 0x0993, 0x9d6: 0x09a7, 0x9d7: 0x09a3,
+       0x9d8: 0x09bb, 0x9d9: 0x1674, 0x9da: 0x09d7, 0x9db: 0x09db, 0x9dc: 0x09e3, 0x9dd: 0x09ef,
+       0x9de: 0x09f7, 0x9df: 0x0a13, 0x9e0: 0x1679, 0x9e1: 0x167e, 0x9e2: 0x0a1f, 0x9e3: 0x0a23,
+       0x9e4: 0x0a27, 0x9e5: 0x0a1b, 0x9e6: 0x0a2f, 0x9e7: 0x05c7, 0x9e8: 0x05cb, 0x9e9: 0x0a37,
+       0x9ea: 0x0a3f, 0x9eb: 0x0a3f, 0x9ec: 0x1683, 0x9ed: 0x0a5b, 0x9ee: 0x0a5f, 0x9ef: 0x0a63,
+       0x9f0: 0x0a6b, 0x9f1: 0x1688, 0x9f2: 0x0a73, 0x9f3: 0x0a77, 0x9f4: 0x0b4f, 0x9f5: 0x0a7f,
+       0x9f6: 0x05cf, 0x9f7: 0x0a8b, 0x9f8: 0x0a9b, 0x9f9: 0x0aa7, 0x9fa: 0x0aa3, 0x9fb: 0x1692,
+       0x9fc: 0x0aaf, 0x9fd: 0x1697, 0x9fe: 0x0abb, 0x9ff: 0x0ab7,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0abf, 0xa01: 0x0acf, 0xa02: 0x0ad3, 0xa03: 0x05d3, 0xa04: 0x0ae3, 0xa05: 0x0aeb,
+       0xa06: 0x0aef, 0xa07: 0x0af3, 0xa08: 0x05d7, 0xa09: 0x169c, 0xa0a: 0x05db, 0xa0b: 0x0b0f,
+       0xa0c: 0x0b13, 0xa0d: 0x0b17, 0xa0e: 0x0b1f, 0xa0f: 0x1863, 0xa10: 0x0b37, 0xa11: 0x16a6,
+       0xa12: 0x16a6, 0xa13: 0x11d7, 0xa14: 0x0b47, 0xa15: 0x0b47, 0xa16: 0x05df, 0xa17: 0x16c9,
+       0xa18: 0x179b, 0xa19: 0x0b57, 0xa1a: 0x0b5f, 0xa1b: 0x05e3, 0xa1c: 0x0b73, 0xa1d: 0x0b83,
+       0xa1e: 0x0b87, 0xa1f: 0x0b8f, 0xa20: 0x0b9f, 0xa21: 0x05eb, 0xa22: 0x05e7, 0xa23: 0x0ba3,
+       0xa24: 0x16ab, 0xa25: 0x0ba7, 0xa26: 0x0bbb, 0xa27: 0x0bbf, 0xa28: 0x0bc3, 0xa29: 0x0bbf,
+       0xa2a: 0x0bcf, 0xa2b: 0x0bd3, 0xa2c: 0x0be3, 0xa2d: 0x0bdb, 0xa2e: 0x0bdf, 0xa2f: 0x0be7,
+       0xa30: 0x0beb, 0xa31: 0x0bef, 0xa32: 0x0bfb, 0xa33: 0x0bff, 0xa34: 0x0c17, 0xa35: 0x0c1f,
+       0xa36: 0x0c2f, 0xa37: 0x0c43, 0xa38: 0x16ba, 0xa39: 0x0c3f, 0xa3a: 0x0c33, 0xa3b: 0x0c4b,
+       0xa3c: 0x0c53, 0xa3d: 0x0c67, 0xa3e: 0x16bf, 0xa3f: 0x0c6f,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0c63, 0xa41: 0x0c5b, 0xa42: 0x05ef, 0xa43: 0x0c77, 0xa44: 0x0c7f, 0xa45: 0x0c87,
+       0xa46: 0x0c7b, 0xa47: 0x05f3, 0xa48: 0x0c97, 0xa49: 0x0c9f, 0xa4a: 0x16c4, 0xa4b: 0x0ccb,
+       0xa4c: 0x0cff, 0xa4d: 0x0cdb, 0xa4e: 0x05ff, 0xa4f: 0x0ce7, 0xa50: 0x05fb, 0xa51: 0x05f7,
+       0xa52: 0x07c3, 0xa53: 0x07c7, 0xa54: 0x0d03, 0xa55: 0x0ceb, 0xa56: 0x11ab, 0xa57: 0x0663,
+       0xa58: 0x0d0f, 0xa59: 0x0d13, 0xa5a: 0x0d17, 0xa5b: 0x0d2b, 0xa5c: 0x0d23, 0xa5d: 0x16dd,
+       0xa5e: 0x0603, 0xa5f: 0x0d3f, 0xa60: 0x0d33, 0xa61: 0x0d4f, 0xa62: 0x0d57, 0xa63: 0x16e7,
+       0xa64: 0x0d5b, 0xa65: 0x0d47, 0xa66: 0x0d63, 0xa67: 0x0607, 0xa68: 0x0d67, 0xa69: 0x0d6b,
+       0xa6a: 0x0d6f, 0xa6b: 0x0d7b, 0xa6c: 0x16ec, 0xa6d: 0x0d83, 0xa6e: 0x060b, 0xa6f: 0x0d8f,
+       0xa70: 0x16f1, 0xa71: 0x0d93, 0xa72: 0x060f, 0xa73: 0x0d9f, 0xa74: 0x0dab, 0xa75: 0x0db7,
+       0xa76: 0x0dbb, 0xa77: 0x16f6, 0xa78: 0x168d, 0xa79: 0x16fb, 0xa7a: 0x0ddb, 0xa7b: 0x1700,
+       0xa7c: 0x0de7, 0xa7d: 0x0def, 0xa7e: 0x0ddf, 0xa7f: 0x0dfb,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x0e0b, 0xa81: 0x0e1b, 0xa82: 0x0e0f, 0xa83: 0x0e13, 0xa84: 0x0e1f, 0xa85: 0x0e23,
+       0xa86: 0x1705, 0xa87: 0x0e07, 0xa88: 0x0e3b, 0xa89: 0x0e3f, 0xa8a: 0x0613, 0xa8b: 0x0e53,
+       0xa8c: 0x0e4f, 0xa8d: 0x170a, 0xa8e: 0x0e33, 0xa8f: 0x0e6f, 0xa90: 0x170f, 0xa91: 0x1714,
+       0xa92: 0x0e73, 0xa93: 0x0e87, 0xa94: 0x0e83, 0xa95: 0x0e7f, 0xa96: 0x0617, 0xa97: 0x0e8b,
+       0xa98: 0x0e9b, 0xa99: 0x0e97, 0xa9a: 0x0ea3, 0xa9b: 0x1651, 0xa9c: 0x0eb3, 0xa9d: 0x1719,
+       0xa9e: 0x0ebf, 0xa9f: 0x1723, 0xaa0: 0x0ed3, 0xaa1: 0x0edf, 0xaa2: 0x0ef3, 0xaa3: 0x1728,
+       0xaa4: 0x0f07, 0xaa5: 0x0f0b, 0xaa6: 0x172d, 0xaa7: 0x1732, 0xaa8: 0x0f27, 0xaa9: 0x0f37,
+       0xaaa: 0x061b, 0xaab: 0x0f3b, 0xaac: 0x061f, 0xaad: 0x061f, 0xaae: 0x0f53, 0xaaf: 0x0f57,
+       0xab0: 0x0f5f, 0xab1: 0x0f63, 0xab2: 0x0f6f, 0xab3: 0x0623, 0xab4: 0x0f87, 0xab5: 0x1737,
+       0xab6: 0x0fa3, 0xab7: 0x173c, 0xab8: 0x0faf, 0xab9: 0x16a1, 0xaba: 0x0fbf, 0xabb: 0x1741,
+       0xabc: 0x1746, 0xabd: 0x174b, 0xabe: 0x0627, 0xabf: 0x062b,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x0ff7, 0xac1: 0x1755, 0xac2: 0x1750, 0xac3: 0x175a, 0xac4: 0x175f, 0xac5: 0x0fff,
+       0xac6: 0x1003, 0xac7: 0x1003, 0xac8: 0x100b, 0xac9: 0x0633, 0xaca: 0x100f, 0xacb: 0x0637,
+       0xacc: 0x063b, 0xacd: 0x1769, 0xace: 0x1023, 0xacf: 0x102b, 0xad0: 0x1037, 0xad1: 0x063f,
+       0xad2: 0x176e, 0xad3: 0x105b, 0xad4: 0x1773, 0xad5: 0x1778, 0xad6: 0x107b, 0xad7: 0x1093,
+       0xad8: 0x0643, 0xad9: 0x109b, 0xada: 0x109f, 0xadb: 0x10a3, 0xadc: 0x177d, 0xadd: 0x1782,
+       0xade: 0x1782, 0xadf: 0x10bb, 0xae0: 0x0647, 0xae1: 0x1787, 0xae2: 0x10cf, 0xae3: 0x10d3,
+       0xae4: 0x064b, 0xae5: 0x178c, 0xae6: 0x10ef, 0xae7: 0x064f, 0xae8: 0x10ff, 0xae9: 0x10f7,
+       0xaea: 0x1107, 0xaeb: 0x1796, 0xaec: 0x111f, 0xaed: 0x0653, 0xaee: 0x112b, 0xaef: 0x1133,
+       0xaf0: 0x1143, 0xaf1: 0x0657, 0xaf2: 0x17a0, 0xaf3: 0x17a5, 0xaf4: 0x065b, 0xaf5: 0x17aa,
+       0xaf6: 0x115b, 0xaf7: 0x17af, 0xaf8: 0x1167, 0xaf9: 0x1173, 0xafa: 0x117b, 0xafb: 0x17b4,
+       0xafc: 0x17b9, 0xafd: 0x118f, 0xafe: 0x17be, 0xaff: 0x1197,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x16ce, 0xb01: 0x065f, 0xb02: 0x11af, 0xb03: 0x11b3, 0xb04: 0x0667, 0xb05: 0x11b7,
+       0xb06: 0x0a33, 0xb07: 0x17c3, 0xb08: 0x17c8, 0xb09: 0x16d3, 0xb0a: 0x16d8, 0xb0b: 0x11d7,
+       0xb0c: 0x11db, 0xb0d: 0x13f3, 0xb0e: 0x066b, 0xb0f: 0x1207, 0xb10: 0x1203, 0xb11: 0x120b,
+       0xb12: 0x083f, 0xb13: 0x120f, 0xb14: 0x1213, 0xb15: 0x1217, 0xb16: 0x121f, 0xb17: 0x17cd,
+       0xb18: 0x121b, 0xb19: 0x1223, 0xb1a: 0x1237, 0xb1b: 0x123b, 0xb1c: 0x1227, 0xb1d: 0x123f,
+       0xb1e: 0x1253, 0xb1f: 0x1267, 0xb20: 0x1233, 0xb21: 0x1247, 0xb22: 0x124b, 0xb23: 0x124f,
+       0xb24: 0x17d2, 0xb25: 0x17dc, 0xb26: 0x17d7, 0xb27: 0x066f, 0xb28: 0x126f, 0xb29: 0x1273,
+       0xb2a: 0x127b, 0xb2b: 0x17f0, 0xb2c: 0x127f, 0xb2d: 0x17e1, 0xb2e: 0x0673, 0xb2f: 0x0677,
+       0xb30: 0x17e6, 0xb31: 0x17eb, 0xb32: 0x067b, 0xb33: 0x129f, 0xb34: 0x12a3, 0xb35: 0x12a7,
+       0xb36: 0x12ab, 0xb37: 0x12b7, 0xb38: 0x12b3, 0xb39: 0x12bf, 0xb3a: 0x12bb, 0xb3b: 0x12cb,
+       0xb3c: 0x12c3, 0xb3d: 0x12c7, 0xb3e: 0x12cf, 0xb3f: 0x067f,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x12d7, 0xb41: 0x12db, 0xb42: 0x0683, 0xb43: 0x12eb, 0xb44: 0x12ef, 0xb45: 0x17f5,
+       0xb46: 0x12fb, 0xb47: 0x12ff, 0xb48: 0x0687, 0xb49: 0x130b, 0xb4a: 0x05bb, 0xb4b: 0x17fa,
+       0xb4c: 0x17ff, 0xb4d: 0x068b, 0xb4e: 0x068f, 0xb4f: 0x1337, 0xb50: 0x134f, 0xb51: 0x136b,
+       0xb52: 0x137b, 0xb53: 0x1804, 0xb54: 0x138f, 0xb55: 0x1393, 0xb56: 0x13ab, 0xb57: 0x13b7,
+       0xb58: 0x180e, 0xb59: 0x1660, 0xb5a: 0x13c3, 0xb5b: 0x13bf, 0xb5c: 0x13cb, 0xb5d: 0x1665,
+       0xb5e: 0x13d7, 0xb5f: 0x13e3, 0xb60: 0x1813, 0xb61: 0x1818, 0xb62: 0x1423, 0xb63: 0x142f,
+       0xb64: 0x1437, 0xb65: 0x181d, 0xb66: 0x143b, 0xb67: 0x1467, 0xb68: 0x1473, 0xb69: 0x1477,
+       0xb6a: 0x146f, 0xb6b: 0x1483, 0xb6c: 0x1487, 0xb6d: 0x1822, 0xb6e: 0x1493, 0xb6f: 0x0693,
+       0xb70: 0x149b, 0xb71: 0x1827, 0xb72: 0x0697, 0xb73: 0x14d3, 0xb74: 0x0ac3, 0xb75: 0x14eb,
+       0xb76: 0x182c, 0xb77: 0x1836, 0xb78: 0x069b, 0xb79: 0x069f, 0xb7a: 0x1513, 0xb7b: 0x183b,
+       0xb7c: 0x06a3, 0xb7d: 0x1840, 0xb7e: 0x152b, 0xb7f: 0x152b,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x1533, 0xb81: 0x1845, 0xb82: 0x154b, 0xb83: 0x06a7, 0xb84: 0x155b, 0xb85: 0x1567,
+       0xb86: 0x156f, 0xb87: 0x1577, 0xb88: 0x06ab, 0xb89: 0x184a, 0xb8a: 0x158b, 0xb8b: 0x15a7,
+       0xb8c: 0x15b3, 0xb8d: 0x06af, 0xb8e: 0x06b3, 0xb8f: 0x15b7, 0xb90: 0x184f, 0xb91: 0x06b7,
+       0xb92: 0x1854, 0xb93: 0x1859, 0xb94: 0x185e, 0xb95: 0x15db, 0xb96: 0x06bb, 0xb97: 0x15ef,
+       0xb98: 0x15f7, 0xb99: 0x15fb, 0xb9a: 0x1603, 0xb9b: 0x160b, 0xb9c: 0x1613, 0xb9d: 0x1868,
+}
+
+// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x2d, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2e, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x2f, 0xcb: 0x30, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x31,
+       0xd0: 0x09, 0xd1: 0x32, 0xd2: 0x33, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x34,
+       0xd8: 0x35, 0xd9: 0x0c, 0xdb: 0x36, 0xdc: 0x37, 0xdd: 0x38, 0xdf: 0x39,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x3a, 0x121: 0x3b, 0x123: 0x3c, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40,
+       0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47,
+       0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d,
+       0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55,
+       // Block 0x5, offset 0x140
+       0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b,
+       0x14d: 0x5c,
+       0x15c: 0x5d, 0x15f: 0x5e,
+       0x162: 0x5f, 0x164: 0x60,
+       0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0d, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66,
+       0x170: 0x67, 0x173: 0x68, 0x177: 0x0e,
+       0x178: 0x0f, 0x179: 0x10, 0x17a: 0x11, 0x17b: 0x12, 0x17c: 0x13, 0x17d: 0x14, 0x17e: 0x15, 0x17f: 0x16,
+       // Block 0x6, offset 0x180
+       0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,
+       0x188: 0x6e, 0x189: 0x17, 0x18a: 0x18, 0x18b: 0x6f, 0x18c: 0x70,
+       0x1ab: 0x71,
+       0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x75, 0x1c1: 0x19, 0x1c2: 0x1a, 0x1c3: 0x1b, 0x1c4: 0x76, 0x1c5: 0x77,
+       0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,
+       // Block 0x8, offset 0x200
+       0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,
+       0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,
+       0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,
+       0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,
+       0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,
+       // Block 0x9, offset 0x240
+       0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,
+       0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,
+       0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,
+       0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,
+       0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,
+       0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,
+       0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,
+       0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,
+       // Block 0xa, offset 0x280
+       0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,
+       0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,
+       0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,
+       0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,
+       0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,
+       0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,
+       0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,
+       0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,
+       0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,
+       0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,
+       0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,
+       // Block 0xc, offset 0x300
+       0x324: 0x1c, 0x325: 0x1d, 0x326: 0x1e, 0x327: 0x1f,
+       0x328: 0x20, 0x329: 0x21, 0x32a: 0x22, 0x32b: 0x23, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,
+       0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,
+       0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,
+       // Block 0xd, offset 0x340
+       0x347: 0x9c,
+       0x34b: 0x9d, 0x34d: 0x9e,
+       0x368: 0x9f, 0x36b: 0xa0,
+       // Block 0xe, offset 0x380
+       0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,
+       0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3f, 0x38d: 0xa7,
+       0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,
+       0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,
+       0x3a8: 0xaf, 0x3a9: 0xb0, 0x3aa: 0xb1,
+       0x3b0: 0x73, 0x3b5: 0xb2,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xb3, 0x3ec: 0xb4,
+       // Block 0x10, offset 0x400
+       0x432: 0xb5,
+       // Block 0x11, offset 0x440
+       0x445: 0xb6, 0x446: 0xb7, 0x447: 0xb8,
+       0x449: 0xb9,
+       // Block 0x12, offset 0x480
+       0x480: 0xba,
+       0x4a3: 0xbb, 0x4a5: 0xbc,
+       // Block 0x13, offset 0x4c0
+       0x4c8: 0xbd,
+       // Block 0x14, offset 0x500
+       0x520: 0x24, 0x521: 0x25, 0x522: 0x26, 0x523: 0x27, 0x524: 0x28, 0x525: 0x29, 0x526: 0x2a, 0x527: 0x2b,
+       0x528: 0x2c,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfcSparseOffset: 145 entries, 290 bytes
+var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc8, 0xcf, 0xd7, 0xda, 0xdc, 0xde, 0xe0, 0xe5, 0xf6, 0x102, 0x104, 0x10a, 0x10c, 0x10e, 0x110, 0x112, 0x114, 0x116, 0x119, 0x11c, 0x11e, 0x121, 0x124, 0x128, 0x12d, 0x136, 0x138, 0x13b, 0x13d, 0x148, 0x14c, 0x15a, 0x15d, 0x163, 0x169, 0x174, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x182, 0x188, 0x18c, 0x18e, 0x190, 0x198, 0x19c, 0x19f, 0x1a1, 0x1a3, 0x1a5, 0x1a8, 0x1aa, 0x1ac, 0x1ae, 0x1b0, 0x1b6, 0x1b9, 0x1bb, 0x1c2, 0x1c8, 0x1ce, 0x1d6, 0x1dc, 0x1e2, 0x1e8, 0x1ec, 0x1fa, 0x203, 0x206, 0x209, 0x20b, 0x20e, 0x210, 0x214, 0x219, 0x21b, 0x21d, 0x222, 0x228, 0x22a, 0x22c, 0x22e, 0x234, 0x237, 0x23a, 0x242, 0x249, 0x24c, 0x24f, 0x251, 0x259, 0x25c, 0x263, 0x266, 0x26c, 0x26e, 0x271, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x28f, 0x299, 0x29b, 0x29d, 0x2a3, 0x2a5, 0x2a8}
+
+// nfcSparseValues: 682 entries, 2728 bytes
+var nfcSparseValues = [682]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x04},
+       {value: 0xa100, lo: 0xa8, hi: 0xa8},
+       {value: 0x8100, lo: 0xaf, hi: 0xaf},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb8, hi: 0xb8},
+       // Block 0x1, offset 0x5
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x9
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       // Block 0x3, offset 0xb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x98, hi: 0x9d},
+       // Block 0x4, offset 0xd
+       {value: 0x0006, lo: 0x0a},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x85, hi: 0x85},
+       {value: 0xa000, lo: 0x89, hi: 0x89},
+       {value: 0x4840, lo: 0x8a, hi: 0x8a},
+       {value: 0x485e, lo: 0x8b, hi: 0x8b},
+       {value: 0x36c7, lo: 0x8c, hi: 0x8c},
+       {value: 0x36df, lo: 0x8d, hi: 0x8d},
+       {value: 0x4876, lo: 0x8e, hi: 0x8e},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x36fd, lo: 0x93, hi: 0x94},
+       // Block 0x5, offset 0x18
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x6, offset 0x28
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x7, offset 0x2a
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x8, offset 0x2f
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x9, offset 0x3a
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0xa, offset 0x49
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xb, offset 0x56
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xc, offset 0x5e
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       // Block 0xd, offset 0x62
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xe, offset 0x67
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xf, offset 0x69
+       {value: 0x0000, lo: 0x10},
+       {value: 0x8132, lo: 0x94, hi: 0xa1},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8132, lo: 0xaa, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xaf},
+       {value: 0x8116, lo: 0xb0, hi: 0xb0},
+       {value: 0x8117, lo: 0xb1, hi: 0xb1},
+       {value: 0x8118, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb5},
+       {value: 0x812d, lo: 0xb6, hi: 0xb6},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x812d, lo: 0xb9, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbf},
+       // Block 0x10, offset 0x7a
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0x11, offset 0x82
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x12, offset 0x89
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x13, offset 0x8c
+       {value: 0x0008, lo: 0x06},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       // Block 0x14, offset 0x93
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x15, offset 0x97
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x16, offset 0x9b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x17, offset 0x9d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x18, offset 0x9f
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x19, offset 0xa8
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1a, offset 0xac
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1b, offset 0xb3
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1c, offset 0xb8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1d, offset 0xbb
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1e, offset 0xc5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1f, offset 0xc8
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x20, offset 0xcf
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x21, offset 0xd7
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x22, offset 0xda
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x23, offset 0xdc
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x24, offset 0xde
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       // Block 0x25, offset 0xe0
+       {value: 0x0000, lo: 0x04},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x26, offset 0xe5
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x8200, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x8200, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x27, offset 0xf6
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x28, offset 0x102
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x29, offset 0x104
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x2a, offset 0x10a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x2b, offset 0x10c
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2c, offset 0x10e
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2d, offset 0x110
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2e, offset 0x112
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2f, offset 0x114
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x30, offset 0x116
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x31, offset 0x119
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x32, offset 0x11c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x33, offset 0x11e
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x34, offset 0x121
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x35, offset 0x124
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x36, offset 0x128
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x37, offset 0x12d
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x38, offset 0x136
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x39, offset 0x138
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x3a, offset 0x13b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3b, offset 0x13d
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3c, offset 0x148
+       {value: 0x0004, lo: 0x03},
+       {value: 0x0433, lo: 0x80, hi: 0x81},
+       {value: 0x8100, lo: 0x97, hi: 0x97},
+       {value: 0x8100, lo: 0xbe, hi: 0xbe},
+       // Block 0x3d, offset 0x14c
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x3e, offset 0x15a
+       {value: 0x427b, lo: 0x02},
+       {value: 0x01b8, lo: 0xa6, hi: 0xa6},
+       {value: 0x0057, lo: 0xaa, hi: 0xab},
+       // Block 0x3f, offset 0x15d
+       {value: 0x0007, lo: 0x05},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x40, offset 0x163
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x41, offset 0x169
+       {value: 0x6408, lo: 0x0a},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x42, offset 0x174
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x43, offset 0x178
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x44, offset 0x17a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x45, offset 0x17c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x46, offset 0x17e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x47, offset 0x180
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x48, offset 0x182
+       {value: 0x0000, lo: 0x05},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xaf},
+       // Block 0x49, offset 0x188
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4a9f, lo: 0xb3, hi: 0xb3},
+       {value: 0x4a9f, lo: 0xb5, hi: 0xb6},
+       {value: 0x4a9f, lo: 0xba, hi: 0xbf},
+       // Block 0x4a, offset 0x18c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x4a9f, lo: 0x8f, hi: 0xa3},
+       // Block 0x4b, offset 0x18e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xae, hi: 0xbe},
+       // Block 0x4c, offset 0x190
+       {value: 0x0000, lo: 0x07},
+       {value: 0x8100, lo: 0x84, hi: 0x84},
+       {value: 0x8100, lo: 0x87, hi: 0x87},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       {value: 0x8100, lo: 0x9e, hi: 0x9e},
+       {value: 0x8100, lo: 0xa1, hi: 0xa1},
+       {value: 0x8100, lo: 0xb2, hi: 0xb2},
+       {value: 0x8100, lo: 0xbb, hi: 0xbb},
+       // Block 0x4d, offset 0x198
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8100, lo: 0x80, hi: 0x80},
+       {value: 0x8100, lo: 0x8b, hi: 0x8b},
+       {value: 0x8100, lo: 0x8e, hi: 0x8e},
+       // Block 0x4e, offset 0x19c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x4f, offset 0x19f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x50, offset 0x1a1
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x51, offset 0x1a3
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x52, offset 0x1a5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x53, offset 0x1a8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x54, offset 0x1aa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x55, offset 0x1ac
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x56, offset 0x1ae
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x57, offset 0x1b0
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x58, offset 0x1b6
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x59, offset 0x1b9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x5a, offset 0x1bb
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x5b, offset 0x1c2
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x5c, offset 0x1c8
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x5d, offset 0x1ce
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x5e, offset 0x1d6
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x5f, offset 0x1dc
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x60, offset 0x1e2
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x61, offset 0x1e8
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x62, offset 0x1ec
+       {value: 0x0006, lo: 0x0d},
+       {value: 0x4390, lo: 0x9d, hi: 0x9d},
+       {value: 0x8115, lo: 0x9e, hi: 0x9e},
+       {value: 0x4402, lo: 0x9f, hi: 0x9f},
+       {value: 0x43f0, lo: 0xaa, hi: 0xab},
+       {value: 0x44f4, lo: 0xac, hi: 0xac},
+       {value: 0x44fc, lo: 0xad, hi: 0xad},
+       {value: 0x4348, lo: 0xae, hi: 0xb1},
+       {value: 0x4366, lo: 0xb2, hi: 0xb4},
+       {value: 0x437e, lo: 0xb5, hi: 0xb6},
+       {value: 0x438a, lo: 0xb8, hi: 0xb8},
+       {value: 0x4396, lo: 0xb9, hi: 0xbb},
+       {value: 0x43ae, lo: 0xbc, hi: 0xbc},
+       {value: 0x43b4, lo: 0xbe, hi: 0xbe},
+       // Block 0x63, offset 0x1fa
+       {value: 0x0006, lo: 0x08},
+       {value: 0x43ba, lo: 0x80, hi: 0x81},
+       {value: 0x43c6, lo: 0x83, hi: 0x84},
+       {value: 0x43d8, lo: 0x86, hi: 0x89},
+       {value: 0x43fc, lo: 0x8a, hi: 0x8a},
+       {value: 0x4378, lo: 0x8b, hi: 0x8b},
+       {value: 0x4360, lo: 0x8c, hi: 0x8c},
+       {value: 0x43a8, lo: 0x8d, hi: 0x8d},
+       {value: 0x43d2, lo: 0x8e, hi: 0x8e},
+       // Block 0x64, offset 0x203
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0xa4, hi: 0xa5},
+       {value: 0x8100, lo: 0xb0, hi: 0xb1},
+       // Block 0x65, offset 0x206
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x9b, hi: 0x9d},
+       {value: 0x8200, lo: 0x9e, hi: 0xa3},
+       // Block 0x66, offset 0x209
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       // Block 0x67, offset 0x20b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x99, hi: 0x99},
+       {value: 0x8200, lo: 0xb2, hi: 0xb4},
+       // Block 0x68, offset 0x20e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xbc, hi: 0xbd},
+       // Block 0x69, offset 0x210
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xa0, hi: 0xa6},
+       {value: 0x812d, lo: 0xa7, hi: 0xad},
+       {value: 0x8132, lo: 0xae, hi: 0xaf},
+       // Block 0x6a, offset 0x214
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8100, lo: 0x89, hi: 0x8c},
+       {value: 0x8100, lo: 0xb0, hi: 0xb2},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb6, hi: 0xbf},
+       // Block 0x6b, offset 0x219
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x81, hi: 0x8c},
+       // Block 0x6c, offset 0x21b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xb5, hi: 0xba},
+       // Block 0x6d, offset 0x21d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x4a9f, lo: 0x9e, hi: 0x9f},
+       {value: 0x4a9f, lo: 0xa3, hi: 0xa3},
+       {value: 0x4a9f, lo: 0xa5, hi: 0xa6},
+       {value: 0x4a9f, lo: 0xaa, hi: 0xaf},
+       // Block 0x6e, offset 0x222
+       {value: 0x0000, lo: 0x05},
+       {value: 0x4a9f, lo: 0x82, hi: 0x87},
+       {value: 0x4a9f, lo: 0x8a, hi: 0x8f},
+       {value: 0x4a9f, lo: 0x92, hi: 0x97},
+       {value: 0x4a9f, lo: 0x9a, hi: 0x9c},
+       {value: 0x8100, lo: 0xa3, hi: 0xa3},
+       // Block 0x6f, offset 0x228
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x70, offset 0x22a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x71, offset 0x22c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x72, offset 0x22e
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x73, offset 0x234
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x74, offset 0x237
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x75, offset 0x23a
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x76, offset 0x242
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x77, offset 0x249
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x78, offset 0x24c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x79, offset 0x24f
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x7a, offset 0x251
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x7b, offset 0x259
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       // Block 0x7c, offset 0x25c
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x7d, offset 0x263
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x7e, offset 0x266
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7f, offset 0x26c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x80, offset 0x26e
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x81, offset 0x271
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x82, offset 0x273
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x83, offset 0x275
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x87, hi: 0x87},
+       // Block 0x84, offset 0x277
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x99, hi: 0x99},
+       // Block 0x85, offset 0x279
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0x82, hi: 0x82},
+       {value: 0x8104, lo: 0x84, hi: 0x85},
+       // Block 0x86, offset 0x27c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x87, offset 0x27e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x88, offset 0x280
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x89, offset 0x282
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x8a, offset 0x28f
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x8b, offset 0x299
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x8c, offset 0x29b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x8d, offset 0x29d
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x8e, offset 0x2a3
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x8f, offset 0x2a5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x90, offset 0x2a8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x93, hi: 0x93},
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfkcTrie. Total size: 17104 bytes (16.70 KiB). Checksum: d985061cf5307b35.
+type nfkcTrie struct{}
+
+func newNfkcTrie(i int) *nfkcTrie {
+       return &nfkcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 91:
+               return uint16(nfkcValues[n<<6+uint32(b)])
+       default:
+               n -= 91
+               return uint16(nfkcSparse.lookup(n, b))
+       }
+}
+
+// nfkcValues: 93 blocks, 5952 entries, 11904 bytes
+// The third block is the zero block.
+var nfkcValues = [5952]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,
+       // Block 0x5, offset 0x140
+       0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,
+       // Block 0x6, offset 0x180
+       0x184: 0x2dee, 0x185: 0x2df4,
+       0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,
+       0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x42a5,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x425a, 0x285: 0x447b,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c1: 0xa000, 0x2c5: 0xa000,
+       0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,
+       0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,
+       0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,
+       0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,
+       0x2f9: 0x01a6,
+       // Block 0xc, offset 0x300
+       0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,
+       0x306: 0xa000, 0x307: 0x3709,
+       0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,
+       0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
+       0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,
+       0x31e: 0xa000, 0x323: 0xa000,
+       0x327: 0xa000,
+       0x32b: 0xa000, 0x32d: 0xa000,
+       0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
+       0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,
+       0x33e: 0xa000,
+       // Block 0xd, offset 0x340
+       0x341: 0x3733, 0x342: 0x37b7,
+       0x350: 0x370f, 0x351: 0x3793,
+       0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,
+       0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,
+       0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,
+       0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,
+       0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,
+       0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,
+       0x378: 0x3787, 0x379: 0x380b,
+       // Block 0xe, offset 0x380
+       0x387: 0x1d61,
+       0x391: 0x812d,
+       0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,
+       0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,
+       0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,
+       0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,
+       0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,
+       0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,
+       // Block 0xf, offset 0x3c0
+       0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,
+       0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,
+       0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,
+       0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,
+       0x3de: 0x8132, 0x3df: 0x812d,
+       0x3f0: 0x811e, 0x3f5: 0x1d84,
+       0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,
+       // Block 0x10, offset 0x400
+       0x405: 0xa000,
+       0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,
+       0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,
+       0x412: 0x2d4e,
+       0x434: 0x8102, 0x435: 0x9900,
+       0x43a: 0xa000, 0x43b: 0x2d56,
+       0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,
+       // Block 0x11, offset 0x440
+       0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,
+       0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,
+       0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,
+       0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,
+       0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,
+       0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,
+       0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,
+       0x46a: 0x01fd,
+       0x478: 0x020c,
+       // Block 0x12, offset 0x480
+       0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,
+       0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,
+       0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,
+       0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,
+       0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,
+       0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,
+       0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x8132, 0x4c1: 0x8132, 0x4c2: 0x812d, 0x4c3: 0x8132, 0x4c4: 0x8132, 0x4c5: 0x8132,
+       0x4c6: 0x8132, 0x4c7: 0x8132, 0x4c8: 0x8132, 0x4c9: 0x8132, 0x4ca: 0x812d, 0x4cb: 0x8132,
+       0x4cc: 0x8132, 0x4cd: 0x8135, 0x4ce: 0x812a, 0x4cf: 0x812d, 0x4d0: 0x8129, 0x4d1: 0x8132,
+       0x4d2: 0x8132, 0x4d3: 0x8132, 0x4d4: 0x8132, 0x4d5: 0x8132, 0x4d6: 0x8132, 0x4d7: 0x8132,
+       0x4d8: 0x8132, 0x4d9: 0x8132, 0x4da: 0x8132, 0x4db: 0x8132, 0x4dc: 0x8132, 0x4dd: 0x8132,
+       0x4de: 0x8132, 0x4df: 0x8132, 0x4e0: 0x8132, 0x4e1: 0x8132, 0x4e2: 0x8132, 0x4e3: 0x8132,
+       0x4e4: 0x8132, 0x4e5: 0x8132, 0x4e6: 0x8132, 0x4e7: 0x8132, 0x4e8: 0x8132, 0x4e9: 0x8132,
+       0x4ea: 0x8132, 0x4eb: 0x8132, 0x4ec: 0x8132, 0x4ed: 0x8132, 0x4ee: 0x8132, 0x4ef: 0x8132,
+       0x4f0: 0x8132, 0x4f1: 0x8132, 0x4f2: 0x8132, 0x4f3: 0x8132, 0x4f4: 0x8132, 0x4f5: 0x8132,
+       0x4f6: 0x8133, 0x4f7: 0x8131, 0x4f8: 0x8131, 0x4f9: 0x812d, 0x4fb: 0x8132,
+       0x4fc: 0x8134, 0x4fd: 0x812d, 0x4fe: 0x8132, 0x4ff: 0x812d,
+       // Block 0x14, offset 0x500
+       0x500: 0x2f97, 0x501: 0x32a3, 0x502: 0x2fa1, 0x503: 0x32ad, 0x504: 0x2fa6, 0x505: 0x32b2,
+       0x506: 0x2fab, 0x507: 0x32b7, 0x508: 0x38cc, 0x509: 0x3a5b, 0x50a: 0x2fc4, 0x50b: 0x32d0,
+       0x50c: 0x2fce, 0x50d: 0x32da, 0x50e: 0x2fdd, 0x50f: 0x32e9, 0x510: 0x2fd3, 0x511: 0x32df,
+       0x512: 0x2fd8, 0x513: 0x32e4, 0x514: 0x38ef, 0x515: 0x3a7e, 0x516: 0x38f6, 0x517: 0x3a85,
+       0x518: 0x3019, 0x519: 0x3325, 0x51a: 0x301e, 0x51b: 0x332a, 0x51c: 0x3904, 0x51d: 0x3a93,
+       0x51e: 0x3023, 0x51f: 0x332f, 0x520: 0x3032, 0x521: 0x333e, 0x522: 0x3050, 0x523: 0x335c,
+       0x524: 0x305f, 0x525: 0x336b, 0x526: 0x3055, 0x527: 0x3361, 0x528: 0x3064, 0x529: 0x3370,
+       0x52a: 0x3069, 0x52b: 0x3375, 0x52c: 0x30af, 0x52d: 0x33bb, 0x52e: 0x390b, 0x52f: 0x3a9a,
+       0x530: 0x30b9, 0x531: 0x33ca, 0x532: 0x30c3, 0x533: 0x33d4, 0x534: 0x30cd, 0x535: 0x33de,
+       0x536: 0x46c4, 0x537: 0x4755, 0x538: 0x3912, 0x539: 0x3aa1, 0x53a: 0x30e6, 0x53b: 0x33f7,
+       0x53c: 0x30e1, 0x53d: 0x33f2, 0x53e: 0x30eb, 0x53f: 0x33fc,
+       // Block 0x15, offset 0x540
+       0x540: 0x30f0, 0x541: 0x3401, 0x542: 0x30f5, 0x543: 0x3406, 0x544: 0x3109, 0x545: 0x341a,
+       0x546: 0x3113, 0x547: 0x3424, 0x548: 0x3122, 0x549: 0x3433, 0x54a: 0x311d, 0x54b: 0x342e,
+       0x54c: 0x3935, 0x54d: 0x3ac4, 0x54e: 0x3943, 0x54f: 0x3ad2, 0x550: 0x394a, 0x551: 0x3ad9,
+       0x552: 0x3951, 0x553: 0x3ae0, 0x554: 0x314f, 0x555: 0x3460, 0x556: 0x3154, 0x557: 0x3465,
+       0x558: 0x315e, 0x559: 0x346f, 0x55a: 0x46f1, 0x55b: 0x4782, 0x55c: 0x3997, 0x55d: 0x3b26,
+       0x55e: 0x3177, 0x55f: 0x3488, 0x560: 0x3181, 0x561: 0x3492, 0x562: 0x4700, 0x563: 0x4791,
+       0x564: 0x399e, 0x565: 0x3b2d, 0x566: 0x39a5, 0x567: 0x3b34, 0x568: 0x39ac, 0x569: 0x3b3b,
+       0x56a: 0x3190, 0x56b: 0x34a1, 0x56c: 0x319a, 0x56d: 0x34b0, 0x56e: 0x31ae, 0x56f: 0x34c4,
+       0x570: 0x31a9, 0x571: 0x34bf, 0x572: 0x31ea, 0x573: 0x3500, 0x574: 0x31f9, 0x575: 0x350f,
+       0x576: 0x31f4, 0x577: 0x350a, 0x578: 0x39b3, 0x579: 0x3b42, 0x57a: 0x39ba, 0x57b: 0x3b49,
+       0x57c: 0x31fe, 0x57d: 0x3514, 0x57e: 0x3203, 0x57f: 0x3519,
+       // Block 0x16, offset 0x580
+       0x580: 0x3208, 0x581: 0x351e, 0x582: 0x320d, 0x583: 0x3523, 0x584: 0x321c, 0x585: 0x3532,
+       0x586: 0x3217, 0x587: 0x352d, 0x588: 0x3221, 0x589: 0x353c, 0x58a: 0x3226, 0x58b: 0x3541,
+       0x58c: 0x322b, 0x58d: 0x3546, 0x58e: 0x3249, 0x58f: 0x3564, 0x590: 0x3262, 0x591: 0x3582,
+       0x592: 0x3271, 0x593: 0x3591, 0x594: 0x3276, 0x595: 0x3596, 0x596: 0x337a, 0x597: 0x34a6,
+       0x598: 0x3537, 0x599: 0x3573, 0x59a: 0x1be0, 0x59b: 0x42d7,
+       0x5a0: 0x46a1, 0x5a1: 0x4732, 0x5a2: 0x2f83, 0x5a3: 0x328f,
+       0x5a4: 0x3878, 0x5a5: 0x3a07, 0x5a6: 0x3871, 0x5a7: 0x3a00, 0x5a8: 0x3886, 0x5a9: 0x3a15,
+       0x5aa: 0x387f, 0x5ab: 0x3a0e, 0x5ac: 0x38be, 0x5ad: 0x3a4d, 0x5ae: 0x3894, 0x5af: 0x3a23,
+       0x5b0: 0x388d, 0x5b1: 0x3a1c, 0x5b2: 0x38a2, 0x5b3: 0x3a31, 0x5b4: 0x389b, 0x5b5: 0x3a2a,
+       0x5b6: 0x38c5, 0x5b7: 0x3a54, 0x5b8: 0x46b5, 0x5b9: 0x4746, 0x5ba: 0x3000, 0x5bb: 0x330c,
+       0x5bc: 0x2fec, 0x5bd: 0x32f8, 0x5be: 0x38da, 0x5bf: 0x3a69,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x38d3, 0x5c1: 0x3a62, 0x5c2: 0x38e8, 0x5c3: 0x3a77, 0x5c4: 0x38e1, 0x5c5: 0x3a70,
+       0x5c6: 0x38fd, 0x5c7: 0x3a8c, 0x5c8: 0x3091, 0x5c9: 0x339d, 0x5ca: 0x30a5, 0x5cb: 0x33b1,
+       0x5cc: 0x46e7, 0x5cd: 0x4778, 0x5ce: 0x3136, 0x5cf: 0x3447, 0x5d0: 0x3920, 0x5d1: 0x3aaf,
+       0x5d2: 0x3919, 0x5d3: 0x3aa8, 0x5d4: 0x392e, 0x5d5: 0x3abd, 0x5d6: 0x3927, 0x5d7: 0x3ab6,
+       0x5d8: 0x3989, 0x5d9: 0x3b18, 0x5da: 0x396d, 0x5db: 0x3afc, 0x5dc: 0x3966, 0x5dd: 0x3af5,
+       0x5de: 0x397b, 0x5df: 0x3b0a, 0x5e0: 0x3974, 0x5e1: 0x3b03, 0x5e2: 0x3982, 0x5e3: 0x3b11,
+       0x5e4: 0x31e5, 0x5e5: 0x34fb, 0x5e6: 0x31c7, 0x5e7: 0x34dd, 0x5e8: 0x39e4, 0x5e9: 0x3b73,
+       0x5ea: 0x39dd, 0x5eb: 0x3b6c, 0x5ec: 0x39f2, 0x5ed: 0x3b81, 0x5ee: 0x39eb, 0x5ef: 0x3b7a,
+       0x5f0: 0x39f9, 0x5f1: 0x3b88, 0x5f2: 0x3230, 0x5f3: 0x354b, 0x5f4: 0x3258, 0x5f5: 0x3578,
+       0x5f6: 0x3253, 0x5f7: 0x356e, 0x5f8: 0x323f, 0x5f9: 0x355a,
+       // Block 0x18, offset 0x600
+       0x600: 0x4804, 0x601: 0x480a, 0x602: 0x491e, 0x603: 0x4936, 0x604: 0x4926, 0x605: 0x493e,
+       0x606: 0x492e, 0x607: 0x4946, 0x608: 0x47aa, 0x609: 0x47b0, 0x60a: 0x488e, 0x60b: 0x48a6,
+       0x60c: 0x4896, 0x60d: 0x48ae, 0x60e: 0x489e, 0x60f: 0x48b6, 0x610: 0x4816, 0x611: 0x481c,
+       0x612: 0x3db8, 0x613: 0x3dc8, 0x614: 0x3dc0, 0x615: 0x3dd0,
+       0x618: 0x47b6, 0x619: 0x47bc, 0x61a: 0x3ce8, 0x61b: 0x3cf8, 0x61c: 0x3cf0, 0x61d: 0x3d00,
+       0x620: 0x482e, 0x621: 0x4834, 0x622: 0x494e, 0x623: 0x4966,
+       0x624: 0x4956, 0x625: 0x496e, 0x626: 0x495e, 0x627: 0x4976, 0x628: 0x47c2, 0x629: 0x47c8,
+       0x62a: 0x48be, 0x62b: 0x48d6, 0x62c: 0x48c6, 0x62d: 0x48de, 0x62e: 0x48ce, 0x62f: 0x48e6,
+       0x630: 0x4846, 0x631: 0x484c, 0x632: 0x3e18, 0x633: 0x3e30, 0x634: 0x3e20, 0x635: 0x3e38,
+       0x636: 0x3e28, 0x637: 0x3e40, 0x638: 0x47ce, 0x639: 0x47d4, 0x63a: 0x3d18, 0x63b: 0x3d30,
+       0x63c: 0x3d20, 0x63d: 0x3d38, 0x63e: 0x3d28, 0x63f: 0x3d40,
+       // Block 0x19, offset 0x640
+       0x640: 0x4852, 0x641: 0x4858, 0x642: 0x3e48, 0x643: 0x3e58, 0x644: 0x3e50, 0x645: 0x3e60,
+       0x648: 0x47da, 0x649: 0x47e0, 0x64a: 0x3d48, 0x64b: 0x3d58,
+       0x64c: 0x3d50, 0x64d: 0x3d60, 0x650: 0x4864, 0x651: 0x486a,
+       0x652: 0x3e80, 0x653: 0x3e98, 0x654: 0x3e88, 0x655: 0x3ea0, 0x656: 0x3e90, 0x657: 0x3ea8,
+       0x659: 0x47e6, 0x65b: 0x3d68, 0x65d: 0x3d70,
+       0x65f: 0x3d78, 0x660: 0x487c, 0x661: 0x4882, 0x662: 0x497e, 0x663: 0x4996,
+       0x664: 0x4986, 0x665: 0x499e, 0x666: 0x498e, 0x667: 0x49a6, 0x668: 0x47ec, 0x669: 0x47f2,
+       0x66a: 0x48ee, 0x66b: 0x4906, 0x66c: 0x48f6, 0x66d: 0x490e, 0x66e: 0x48fe, 0x66f: 0x4916,
+       0x670: 0x47f8, 0x671: 0x431e, 0x672: 0x3691, 0x673: 0x4324, 0x674: 0x4822, 0x675: 0x432a,
+       0x676: 0x36a3, 0x677: 0x4330, 0x678: 0x36c1, 0x679: 0x4336, 0x67a: 0x36d9, 0x67b: 0x433c,
+       0x67c: 0x4870, 0x67d: 0x4342,
+       // Block 0x1a, offset 0x680
+       0x680: 0x3da0, 0x681: 0x3da8, 0x682: 0x4184, 0x683: 0x41a2, 0x684: 0x418e, 0x685: 0x41ac,
+       0x686: 0x4198, 0x687: 0x41b6, 0x688: 0x3cd8, 0x689: 0x3ce0, 0x68a: 0x40d0, 0x68b: 0x40ee,
+       0x68c: 0x40da, 0x68d: 0x40f8, 0x68e: 0x40e4, 0x68f: 0x4102, 0x690: 0x3de8, 0x691: 0x3df0,
+       0x692: 0x41c0, 0x693: 0x41de, 0x694: 0x41ca, 0x695: 0x41e8, 0x696: 0x41d4, 0x697: 0x41f2,
+       0x698: 0x3d08, 0x699: 0x3d10, 0x69a: 0x410c, 0x69b: 0x412a, 0x69c: 0x4116, 0x69d: 0x4134,
+       0x69e: 0x4120, 0x69f: 0x413e, 0x6a0: 0x3ec0, 0x6a1: 0x3ec8, 0x6a2: 0x41fc, 0x6a3: 0x421a,
+       0x6a4: 0x4206, 0x6a5: 0x4224, 0x6a6: 0x4210, 0x6a7: 0x422e, 0x6a8: 0x3d80, 0x6a9: 0x3d88,
+       0x6aa: 0x4148, 0x6ab: 0x4166, 0x6ac: 0x4152, 0x6ad: 0x4170, 0x6ae: 0x415c, 0x6af: 0x417a,
+       0x6b0: 0x3685, 0x6b1: 0x367f, 0x6b2: 0x3d90, 0x6b3: 0x368b, 0x6b4: 0x3d98,
+       0x6b6: 0x4810, 0x6b7: 0x3db0, 0x6b8: 0x35f5, 0x6b9: 0x35ef, 0x6ba: 0x35e3, 0x6bb: 0x42ee,
+       0x6bc: 0x35fb, 0x6bd: 0x4287, 0x6be: 0x01d3, 0x6bf: 0x4287,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x42a0, 0x6c1: 0x4482, 0x6c2: 0x3dd8, 0x6c3: 0x369d, 0x6c4: 0x3de0,
+       0x6c6: 0x483a, 0x6c7: 0x3df8, 0x6c8: 0x3601, 0x6c9: 0x42f4, 0x6ca: 0x360d, 0x6cb: 0x42fa,
+       0x6cc: 0x3619, 0x6cd: 0x4489, 0x6ce: 0x4490, 0x6cf: 0x4497, 0x6d0: 0x36b5, 0x6d1: 0x36af,
+       0x6d2: 0x3e00, 0x6d3: 0x44e4, 0x6d6: 0x36bb, 0x6d7: 0x3e10,
+       0x6d8: 0x3631, 0x6d9: 0x362b, 0x6da: 0x361f, 0x6db: 0x4300, 0x6dd: 0x449e,
+       0x6de: 0x44a5, 0x6df: 0x44ac, 0x6e0: 0x36eb, 0x6e1: 0x36e5, 0x6e2: 0x3e68, 0x6e3: 0x44ec,
+       0x6e4: 0x36cd, 0x6e5: 0x36d3, 0x6e6: 0x36f1, 0x6e7: 0x3e78, 0x6e8: 0x3661, 0x6e9: 0x365b,
+       0x6ea: 0x364f, 0x6eb: 0x430c, 0x6ec: 0x3649, 0x6ed: 0x4474, 0x6ee: 0x447b, 0x6ef: 0x0081,
+       0x6f2: 0x3eb0, 0x6f3: 0x36f7, 0x6f4: 0x3eb8,
+       0x6f6: 0x4888, 0x6f7: 0x3ed0, 0x6f8: 0x363d, 0x6f9: 0x4306, 0x6fa: 0x366d, 0x6fb: 0x4318,
+       0x6fc: 0x3679, 0x6fd: 0x425a, 0x6fe: 0x428c,
+       // Block 0x1c, offset 0x700
+       0x700: 0x1bd8, 0x701: 0x1bdc, 0x702: 0x0047, 0x703: 0x1c54, 0x705: 0x1be8,
+       0x706: 0x1bec, 0x707: 0x00e9, 0x709: 0x1c58, 0x70a: 0x008f, 0x70b: 0x0051,
+       0x70c: 0x0051, 0x70d: 0x0051, 0x70e: 0x0091, 0x70f: 0x00da, 0x710: 0x0053, 0x711: 0x0053,
+       0x712: 0x0059, 0x713: 0x0099, 0x715: 0x005d, 0x716: 0x198d,
+       0x719: 0x0061, 0x71a: 0x0063, 0x71b: 0x0065, 0x71c: 0x0065, 0x71d: 0x0065,
+       0x720: 0x199f, 0x721: 0x1bc8, 0x722: 0x19a8,
+       0x724: 0x0075, 0x726: 0x01b8, 0x728: 0x0075,
+       0x72a: 0x0057, 0x72b: 0x42d2, 0x72c: 0x0045, 0x72d: 0x0047, 0x72f: 0x008b,
+       0x730: 0x004b, 0x731: 0x004d, 0x733: 0x005b, 0x734: 0x009f, 0x735: 0x0215,
+       0x736: 0x0218, 0x737: 0x021b, 0x738: 0x021e, 0x739: 0x0093, 0x73b: 0x1b98,
+       0x73c: 0x01e8, 0x73d: 0x01c1, 0x73e: 0x0179, 0x73f: 0x01a0,
+       // Block 0x1d, offset 0x740
+       0x740: 0x0463, 0x745: 0x0049,
+       0x746: 0x0089, 0x747: 0x008b, 0x748: 0x0093, 0x749: 0x0095,
+       0x750: 0x222e, 0x751: 0x223a,
+       0x752: 0x22ee, 0x753: 0x2216, 0x754: 0x229a, 0x755: 0x2222, 0x756: 0x22a0, 0x757: 0x22b8,
+       0x758: 0x22c4, 0x759: 0x2228, 0x75a: 0x22ca, 0x75b: 0x2234, 0x75c: 0x22be, 0x75d: 0x22d0,
+       0x75e: 0x22d6, 0x75f: 0x1cbc, 0x760: 0x0053, 0x761: 0x195a, 0x762: 0x1ba4, 0x763: 0x1963,
+       0x764: 0x006d, 0x765: 0x19ab, 0x766: 0x1bd0, 0x767: 0x1d48, 0x768: 0x1966, 0x769: 0x0071,
+       0x76a: 0x19b7, 0x76b: 0x1bd4, 0x76c: 0x0059, 0x76d: 0x0047, 0x76e: 0x0049, 0x76f: 0x005b,
+       0x770: 0x0093, 0x771: 0x19e4, 0x772: 0x1c18, 0x773: 0x19ed, 0x774: 0x00ad, 0x775: 0x1a62,
+       0x776: 0x1c4c, 0x777: 0x1d5c, 0x778: 0x19f0, 0x779: 0x00b1, 0x77a: 0x1a65, 0x77b: 0x1c50,
+       0x77c: 0x0099, 0x77d: 0x0087, 0x77e: 0x0089, 0x77f: 0x009b,
+       // Block 0x1e, offset 0x780
+       0x781: 0x3c06, 0x783: 0xa000, 0x784: 0x3c0d, 0x785: 0xa000,
+       0x787: 0x3c14, 0x788: 0xa000, 0x789: 0x3c1b,
+       0x78d: 0xa000,
+       0x7a0: 0x2f65, 0x7a1: 0xa000, 0x7a2: 0x3c29,
+       0x7a4: 0xa000, 0x7a5: 0xa000,
+       0x7ad: 0x3c22, 0x7ae: 0x2f60, 0x7af: 0x2f6a,
+       0x7b0: 0x3c30, 0x7b1: 0x3c37, 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0x3c3e, 0x7b5: 0x3c45,
+       0x7b6: 0xa000, 0x7b7: 0xa000, 0x7b8: 0x3c4c, 0x7b9: 0x3c53, 0x7ba: 0xa000, 0x7bb: 0xa000,
+       0x7bc: 0xa000, 0x7bd: 0xa000,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x3c5a, 0x7c1: 0x3c61, 0x7c2: 0xa000, 0x7c3: 0xa000, 0x7c4: 0x3c76, 0x7c5: 0x3c7d,
+       0x7c6: 0xa000, 0x7c7: 0xa000, 0x7c8: 0x3c84, 0x7c9: 0x3c8b,
+       0x7d1: 0xa000,
+       0x7d2: 0xa000,
+       0x7e2: 0xa000,
+       0x7e8: 0xa000, 0x7e9: 0xa000,
+       0x7eb: 0xa000, 0x7ec: 0x3ca0, 0x7ed: 0x3ca7, 0x7ee: 0x3cae, 0x7ef: 0x3cb5,
+       0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0xa000, 0x7f5: 0xa000,
+       // Block 0x20, offset 0x800
+       0x820: 0x0023, 0x821: 0x0025, 0x822: 0x0027, 0x823: 0x0029,
+       0x824: 0x002b, 0x825: 0x002d, 0x826: 0x002f, 0x827: 0x0031, 0x828: 0x0033, 0x829: 0x1882,
+       0x82a: 0x1885, 0x82b: 0x1888, 0x82c: 0x188b, 0x82d: 0x188e, 0x82e: 0x1891, 0x82f: 0x1894,
+       0x830: 0x1897, 0x831: 0x189a, 0x832: 0x189d, 0x833: 0x18a6, 0x834: 0x1a68, 0x835: 0x1a6c,
+       0x836: 0x1a70, 0x837: 0x1a74, 0x838: 0x1a78, 0x839: 0x1a7c, 0x83a: 0x1a80, 0x83b: 0x1a84,
+       0x83c: 0x1a88, 0x83d: 0x1c80, 0x83e: 0x1c85, 0x83f: 0x1c8a,
+       // Block 0x21, offset 0x840
+       0x840: 0x1c8f, 0x841: 0x1c94, 0x842: 0x1c99, 0x843: 0x1c9e, 0x844: 0x1ca3, 0x845: 0x1ca8,
+       0x846: 0x1cad, 0x847: 0x1cb2, 0x848: 0x187f, 0x849: 0x18a3, 0x84a: 0x18c7, 0x84b: 0x18eb,
+       0x84c: 0x190f, 0x84d: 0x1918, 0x84e: 0x191e, 0x84f: 0x1924, 0x850: 0x192a, 0x851: 0x1b60,
+       0x852: 0x1b64, 0x853: 0x1b68, 0x854: 0x1b6c, 0x855: 0x1b70, 0x856: 0x1b74, 0x857: 0x1b78,
+       0x858: 0x1b7c, 0x859: 0x1b80, 0x85a: 0x1b84, 0x85b: 0x1b88, 0x85c: 0x1af4, 0x85d: 0x1af8,
+       0x85e: 0x1afc, 0x85f: 0x1b00, 0x860: 0x1b04, 0x861: 0x1b08, 0x862: 0x1b0c, 0x863: 0x1b10,
+       0x864: 0x1b14, 0x865: 0x1b18, 0x866: 0x1b1c, 0x867: 0x1b20, 0x868: 0x1b24, 0x869: 0x1b28,
+       0x86a: 0x1b2c, 0x86b: 0x1b30, 0x86c: 0x1b34, 0x86d: 0x1b38, 0x86e: 0x1b3c, 0x86f: 0x1b40,
+       0x870: 0x1b44, 0x871: 0x1b48, 0x872: 0x1b4c, 0x873: 0x1b50, 0x874: 0x1b54, 0x875: 0x1b58,
+       0x876: 0x0043, 0x877: 0x0045, 0x878: 0x0047, 0x879: 0x0049, 0x87a: 0x004b, 0x87b: 0x004d,
+       0x87c: 0x004f, 0x87d: 0x0051, 0x87e: 0x0053, 0x87f: 0x0055,
+       // Block 0x22, offset 0x880
+       0x880: 0x06bf, 0x881: 0x06e3, 0x882: 0x06ef, 0x883: 0x06ff, 0x884: 0x0707, 0x885: 0x0713,
+       0x886: 0x071b, 0x887: 0x0723, 0x888: 0x072f, 0x889: 0x0783, 0x88a: 0x079b, 0x88b: 0x07ab,
+       0x88c: 0x07bb, 0x88d: 0x07cb, 0x88e: 0x07db, 0x88f: 0x07fb, 0x890: 0x07ff, 0x891: 0x0803,
+       0x892: 0x0837, 0x893: 0x085f, 0x894: 0x086f, 0x895: 0x0877, 0x896: 0x087b, 0x897: 0x0887,
+       0x898: 0x08a3, 0x899: 0x08a7, 0x89a: 0x08bf, 0x89b: 0x08c3, 0x89c: 0x08cb, 0x89d: 0x08db,
+       0x89e: 0x0977, 0x89f: 0x098b, 0x8a0: 0x09cb, 0x8a1: 0x09df, 0x8a2: 0x09e7, 0x8a3: 0x09eb,
+       0x8a4: 0x09fb, 0x8a5: 0x0a17, 0x8a6: 0x0a43, 0x8a7: 0x0a4f, 0x8a8: 0x0a6f, 0x8a9: 0x0a7b,
+       0x8aa: 0x0a7f, 0x8ab: 0x0a83, 0x8ac: 0x0a9b, 0x8ad: 0x0a9f, 0x8ae: 0x0acb, 0x8af: 0x0ad7,
+       0x8b0: 0x0adf, 0x8b1: 0x0ae7, 0x8b2: 0x0af7, 0x8b3: 0x0aff, 0x8b4: 0x0b07, 0x8b5: 0x0b33,
+       0x8b6: 0x0b37, 0x8b7: 0x0b3f, 0x8b8: 0x0b43, 0x8b9: 0x0b4b, 0x8ba: 0x0b53, 0x8bb: 0x0b63,
+       0x8bc: 0x0b7f, 0x8bd: 0x0bf7, 0x8be: 0x0c0b, 0x8bf: 0x0c0f,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0c8f, 0x8c1: 0x0c93, 0x8c2: 0x0ca7, 0x8c3: 0x0cab, 0x8c4: 0x0cb3, 0x8c5: 0x0cbb,
+       0x8c6: 0x0cc3, 0x8c7: 0x0ccf, 0x8c8: 0x0cf7, 0x8c9: 0x0d07, 0x8ca: 0x0d1b, 0x8cb: 0x0d8b,
+       0x8cc: 0x0d97, 0x8cd: 0x0da7, 0x8ce: 0x0db3, 0x8cf: 0x0dbf, 0x8d0: 0x0dc7, 0x8d1: 0x0dcb,
+       0x8d2: 0x0dcf, 0x8d3: 0x0dd3, 0x8d4: 0x0dd7, 0x8d5: 0x0e8f, 0x8d6: 0x0ed7, 0x8d7: 0x0ee3,
+       0x8d8: 0x0ee7, 0x8d9: 0x0eeb, 0x8da: 0x0eef, 0x8db: 0x0ef7, 0x8dc: 0x0efb, 0x8dd: 0x0f0f,
+       0x8de: 0x0f2b, 0x8df: 0x0f33, 0x8e0: 0x0f73, 0x8e1: 0x0f77, 0x8e2: 0x0f7f, 0x8e3: 0x0f83,
+       0x8e4: 0x0f8b, 0x8e5: 0x0f8f, 0x8e6: 0x0fb3, 0x8e7: 0x0fb7, 0x8e8: 0x0fd3, 0x8e9: 0x0fd7,
+       0x8ea: 0x0fdb, 0x8eb: 0x0fdf, 0x8ec: 0x0ff3, 0x8ed: 0x1017, 0x8ee: 0x101b, 0x8ef: 0x101f,
+       0x8f0: 0x1043, 0x8f1: 0x1083, 0x8f2: 0x1087, 0x8f3: 0x10a7, 0x8f4: 0x10b7, 0x8f5: 0x10bf,
+       0x8f6: 0x10df, 0x8f7: 0x1103, 0x8f8: 0x1147, 0x8f9: 0x114f, 0x8fa: 0x1163, 0x8fb: 0x116f,
+       0x8fc: 0x1177, 0x8fd: 0x117f, 0x8fe: 0x1183, 0x8ff: 0x1187,
+       // Block 0x24, offset 0x900
+       0x900: 0x119f, 0x901: 0x11a3, 0x902: 0x11bf, 0x903: 0x11c7, 0x904: 0x11cf, 0x905: 0x11d3,
+       0x906: 0x11df, 0x907: 0x11e7, 0x908: 0x11eb, 0x909: 0x11ef, 0x90a: 0x11f7, 0x90b: 0x11fb,
+       0x90c: 0x129b, 0x90d: 0x12af, 0x90e: 0x12e3, 0x90f: 0x12e7, 0x910: 0x12ef, 0x911: 0x131b,
+       0x912: 0x1323, 0x913: 0x132b, 0x914: 0x1333, 0x915: 0x136f, 0x916: 0x1373, 0x917: 0x137b,
+       0x918: 0x137f, 0x919: 0x1383, 0x91a: 0x13af, 0x91b: 0x13b3, 0x91c: 0x13bb, 0x91d: 0x13cf,
+       0x91e: 0x13d3, 0x91f: 0x13ef, 0x920: 0x13f7, 0x921: 0x13fb, 0x922: 0x141f, 0x923: 0x143f,
+       0x924: 0x1453, 0x925: 0x1457, 0x926: 0x145f, 0x927: 0x148b, 0x928: 0x148f, 0x929: 0x149f,
+       0x92a: 0x14c3, 0x92b: 0x14cf, 0x92c: 0x14df, 0x92d: 0x14f7, 0x92e: 0x14ff, 0x92f: 0x1503,
+       0x930: 0x1507, 0x931: 0x150b, 0x932: 0x1517, 0x933: 0x151b, 0x934: 0x1523, 0x935: 0x153f,
+       0x936: 0x1543, 0x937: 0x1547, 0x938: 0x155f, 0x939: 0x1563, 0x93a: 0x156b, 0x93b: 0x157f,
+       0x93c: 0x1583, 0x93d: 0x1587, 0x93e: 0x158f, 0x93f: 0x1593,
+       // Block 0x25, offset 0x940
+       0x946: 0xa000, 0x94b: 0xa000,
+       0x94c: 0x3f08, 0x94d: 0xa000, 0x94e: 0x3f10, 0x94f: 0xa000, 0x950: 0x3f18, 0x951: 0xa000,
+       0x952: 0x3f20, 0x953: 0xa000, 0x954: 0x3f28, 0x955: 0xa000, 0x956: 0x3f30, 0x957: 0xa000,
+       0x958: 0x3f38, 0x959: 0xa000, 0x95a: 0x3f40, 0x95b: 0xa000, 0x95c: 0x3f48, 0x95d: 0xa000,
+       0x95e: 0x3f50, 0x95f: 0xa000, 0x960: 0x3f58, 0x961: 0xa000, 0x962: 0x3f60,
+       0x964: 0xa000, 0x965: 0x3f68, 0x966: 0xa000, 0x967: 0x3f70, 0x968: 0xa000, 0x969: 0x3f78,
+       0x96f: 0xa000,
+       0x970: 0x3f80, 0x971: 0x3f88, 0x972: 0xa000, 0x973: 0x3f90, 0x974: 0x3f98, 0x975: 0xa000,
+       0x976: 0x3fa0, 0x977: 0x3fa8, 0x978: 0xa000, 0x979: 0x3fb0, 0x97a: 0x3fb8, 0x97b: 0xa000,
+       0x97c: 0x3fc0, 0x97d: 0x3fc8,
+       // Block 0x26, offset 0x980
+       0x994: 0x3f00,
+       0x999: 0x9903, 0x99a: 0x9903, 0x99b: 0x42dc, 0x99c: 0x42e2, 0x99d: 0xa000,
+       0x99e: 0x3fd0, 0x99f: 0x26b4,
+       0x9a6: 0xa000,
+       0x9ab: 0xa000, 0x9ac: 0x3fe0, 0x9ad: 0xa000, 0x9ae: 0x3fe8, 0x9af: 0xa000,
+       0x9b0: 0x3ff0, 0x9b1: 0xa000, 0x9b2: 0x3ff8, 0x9b3: 0xa000, 0x9b4: 0x4000, 0x9b5: 0xa000,
+       0x9b6: 0x4008, 0x9b7: 0xa000, 0x9b8: 0x4010, 0x9b9: 0xa000, 0x9ba: 0x4018, 0x9bb: 0xa000,
+       0x9bc: 0x4020, 0x9bd: 0xa000, 0x9be: 0x4028, 0x9bf: 0xa000,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x4030, 0x9c1: 0xa000, 0x9c2: 0x4038, 0x9c4: 0xa000, 0x9c5: 0x4040,
+       0x9c6: 0xa000, 0x9c7: 0x4048, 0x9c8: 0xa000, 0x9c9: 0x4050,
+       0x9cf: 0xa000, 0x9d0: 0x4058, 0x9d1: 0x4060,
+       0x9d2: 0xa000, 0x9d3: 0x4068, 0x9d4: 0x4070, 0x9d5: 0xa000, 0x9d6: 0x4078, 0x9d7: 0x4080,
+       0x9d8: 0xa000, 0x9d9: 0x4088, 0x9da: 0x4090, 0x9db: 0xa000, 0x9dc: 0x4098, 0x9dd: 0x40a0,
+       0x9ef: 0xa000,
+       0x9f0: 0xa000, 0x9f1: 0xa000, 0x9f2: 0xa000, 0x9f4: 0x3fd8,
+       0x9f7: 0x40a8, 0x9f8: 0x40b0, 0x9f9: 0x40b8, 0x9fa: 0x40c0,
+       0x9fd: 0xa000, 0x9fe: 0x40c8, 0x9ff: 0x26c9,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0367, 0xa01: 0x032b, 0xa02: 0x032f, 0xa03: 0x0333, 0xa04: 0x037b, 0xa05: 0x0337,
+       0xa06: 0x033b, 0xa07: 0x033f, 0xa08: 0x0343, 0xa09: 0x0347, 0xa0a: 0x034b, 0xa0b: 0x034f,
+       0xa0c: 0x0353, 0xa0d: 0x0357, 0xa0e: 0x035b, 0xa0f: 0x49bd, 0xa10: 0x49c3, 0xa11: 0x49c9,
+       0xa12: 0x49cf, 0xa13: 0x49d5, 0xa14: 0x49db, 0xa15: 0x49e1, 0xa16: 0x49e7, 0xa17: 0x49ed,
+       0xa18: 0x49f3, 0xa19: 0x49f9, 0xa1a: 0x49ff, 0xa1b: 0x4a05, 0xa1c: 0x4a0b, 0xa1d: 0x4a11,
+       0xa1e: 0x4a17, 0xa1f: 0x4a1d, 0xa20: 0x4a23, 0xa21: 0x4a29, 0xa22: 0x4a2f, 0xa23: 0x4a35,
+       0xa24: 0x03c3, 0xa25: 0x035f, 0xa26: 0x0363, 0xa27: 0x03e7, 0xa28: 0x03eb, 0xa29: 0x03ef,
+       0xa2a: 0x03f3, 0xa2b: 0x03f7, 0xa2c: 0x03fb, 0xa2d: 0x03ff, 0xa2e: 0x036b, 0xa2f: 0x0403,
+       0xa30: 0x0407, 0xa31: 0x036f, 0xa32: 0x0373, 0xa33: 0x0377, 0xa34: 0x037f, 0xa35: 0x0383,
+       0xa36: 0x0387, 0xa37: 0x038b, 0xa38: 0x038f, 0xa39: 0x0393, 0xa3a: 0x0397, 0xa3b: 0x039b,
+       0xa3c: 0x039f, 0xa3d: 0x03a3, 0xa3e: 0x03a7, 0xa3f: 0x03ab,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x03af, 0xa41: 0x03b3, 0xa42: 0x040b, 0xa43: 0x040f, 0xa44: 0x03b7, 0xa45: 0x03bb,
+       0xa46: 0x03bf, 0xa47: 0x03c7, 0xa48: 0x03cb, 0xa49: 0x03cf, 0xa4a: 0x03d3, 0xa4b: 0x03d7,
+       0xa4c: 0x03db, 0xa4d: 0x03df, 0xa4e: 0x03e3,
+       0xa52: 0x06bf, 0xa53: 0x071b, 0xa54: 0x06cb, 0xa55: 0x097b, 0xa56: 0x06cf, 0xa57: 0x06e7,
+       0xa58: 0x06d3, 0xa59: 0x0f93, 0xa5a: 0x0707, 0xa5b: 0x06db, 0xa5c: 0x06c3, 0xa5d: 0x09ff,
+       0xa5e: 0x098f, 0xa5f: 0x072f,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x2054, 0xa81: 0x205a, 0xa82: 0x2060, 0xa83: 0x2066, 0xa84: 0x206c, 0xa85: 0x2072,
+       0xa86: 0x2078, 0xa87: 0x207e, 0xa88: 0x2084, 0xa89: 0x208a, 0xa8a: 0x2090, 0xa8b: 0x2096,
+       0xa8c: 0x209c, 0xa8d: 0x20a2, 0xa8e: 0x2726, 0xa8f: 0x272f, 0xa90: 0x2738, 0xa91: 0x2741,
+       0xa92: 0x274a, 0xa93: 0x2753, 0xa94: 0x275c, 0xa95: 0x2765, 0xa96: 0x276e, 0xa97: 0x2780,
+       0xa98: 0x2789, 0xa99: 0x2792, 0xa9a: 0x279b, 0xa9b: 0x27a4, 0xa9c: 0x2777, 0xa9d: 0x2bac,
+       0xa9e: 0x2aed, 0xaa0: 0x20a8, 0xaa1: 0x20c0, 0xaa2: 0x20b4, 0xaa3: 0x2108,
+       0xaa4: 0x20c6, 0xaa5: 0x20e4, 0xaa6: 0x20ae, 0xaa7: 0x20de, 0xaa8: 0x20ba, 0xaa9: 0x20f0,
+       0xaaa: 0x2120, 0xaab: 0x213e, 0xaac: 0x2138, 0xaad: 0x212c, 0xaae: 0x217a, 0xaaf: 0x210e,
+       0xab0: 0x211a, 0xab1: 0x2132, 0xab2: 0x2126, 0xab3: 0x2150, 0xab4: 0x20fc, 0xab5: 0x2144,
+       0xab6: 0x216e, 0xab7: 0x2156, 0xab8: 0x20ea, 0xab9: 0x20cc, 0xaba: 0x2102, 0xabb: 0x2114,
+       0xabc: 0x214a, 0xabd: 0x20d2, 0xabe: 0x2174, 0xabf: 0x20f6,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x215c, 0xac1: 0x20d8, 0xac2: 0x2162, 0xac3: 0x2168, 0xac4: 0x092f, 0xac5: 0x0b03,
+       0xac6: 0x0ca7, 0xac7: 0x10c7,
+       0xad0: 0x1bc4, 0xad1: 0x18a9,
+       0xad2: 0x18ac, 0xad3: 0x18af, 0xad4: 0x18b2, 0xad5: 0x18b5, 0xad6: 0x18b8, 0xad7: 0x18bb,
+       0xad8: 0x18be, 0xad9: 0x18c1, 0xada: 0x18ca, 0xadb: 0x18cd, 0xadc: 0x18d0, 0xadd: 0x18d3,
+       0xade: 0x18d6, 0xadf: 0x18d9, 0xae0: 0x0313, 0xae1: 0x031b, 0xae2: 0x031f, 0xae3: 0x0327,
+       0xae4: 0x032b, 0xae5: 0x032f, 0xae6: 0x0337, 0xae7: 0x033f, 0xae8: 0x0343, 0xae9: 0x034b,
+       0xaea: 0x034f, 0xaeb: 0x0353, 0xaec: 0x0357, 0xaed: 0x035b, 0xaee: 0x2e18, 0xaef: 0x2e20,
+       0xaf0: 0x2e28, 0xaf1: 0x2e30, 0xaf2: 0x2e38, 0xaf3: 0x2e40, 0xaf4: 0x2e48, 0xaf5: 0x2e50,
+       0xaf6: 0x2e60, 0xaf7: 0x2e68, 0xaf8: 0x2e70, 0xaf9: 0x2e78, 0xafa: 0x2e80, 0xafb: 0x2e88,
+       0xafc: 0x2ed3, 0xafd: 0x2e9b, 0xafe: 0x2e58,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x06bf, 0xb01: 0x071b, 0xb02: 0x06cb, 0xb03: 0x097b, 0xb04: 0x071f, 0xb05: 0x07af,
+       0xb06: 0x06c7, 0xb07: 0x07ab, 0xb08: 0x070b, 0xb09: 0x0887, 0xb0a: 0x0d07, 0xb0b: 0x0e8f,
+       0xb0c: 0x0dd7, 0xb0d: 0x0d1b, 0xb0e: 0x145f, 0xb0f: 0x098b, 0xb10: 0x0ccf, 0xb11: 0x0d4b,
+       0xb12: 0x0d0b, 0xb13: 0x104b, 0xb14: 0x08fb, 0xb15: 0x0f03, 0xb16: 0x1387, 0xb17: 0x105f,
+       0xb18: 0x0843, 0xb19: 0x108f, 0xb1a: 0x0f9b, 0xb1b: 0x0a17, 0xb1c: 0x140f, 0xb1d: 0x077f,
+       0xb1e: 0x08ab, 0xb1f: 0x0df7, 0xb20: 0x1527, 0xb21: 0x0743, 0xb22: 0x07d3, 0xb23: 0x0d9b,
+       0xb24: 0x06cf, 0xb25: 0x06e7, 0xb26: 0x06d3, 0xb27: 0x0adb, 0xb28: 0x08ef, 0xb29: 0x087f,
+       0xb2a: 0x0a57, 0xb2b: 0x0a4b, 0xb2c: 0x0feb, 0xb2d: 0x073f, 0xb2e: 0x139b, 0xb2f: 0x089b,
+       0xb30: 0x09f3, 0xb31: 0x18dc, 0xb32: 0x18df, 0xb33: 0x18e2, 0xb34: 0x18e5, 0xb35: 0x18ee,
+       0xb36: 0x18f1, 0xb37: 0x18f4, 0xb38: 0x18f7, 0xb39: 0x18fa, 0xb3a: 0x18fd, 0xb3b: 0x1900,
+       0xb3c: 0x1903, 0xb3d: 0x1906, 0xb3e: 0x1909, 0xb3f: 0x1912,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x1cc6, 0xb41: 0x1cd5, 0xb42: 0x1ce4, 0xb43: 0x1cf3, 0xb44: 0x1d02, 0xb45: 0x1d11,
+       0xb46: 0x1d20, 0xb47: 0x1d2f, 0xb48: 0x1d3e, 0xb49: 0x218c, 0xb4a: 0x219e, 0xb4b: 0x21b0,
+       0xb4c: 0x1954, 0xb4d: 0x1c04, 0xb4e: 0x19d2, 0xb4f: 0x1ba8, 0xb50: 0x04cb, 0xb51: 0x04d3,
+       0xb52: 0x04db, 0xb53: 0x04e3, 0xb54: 0x04eb, 0xb55: 0x04ef, 0xb56: 0x04f3, 0xb57: 0x04f7,
+       0xb58: 0x04fb, 0xb59: 0x04ff, 0xb5a: 0x0503, 0xb5b: 0x0507, 0xb5c: 0x050b, 0xb5d: 0x050f,
+       0xb5e: 0x0513, 0xb5f: 0x0517, 0xb60: 0x051b, 0xb61: 0x0523, 0xb62: 0x0527, 0xb63: 0x052b,
+       0xb64: 0x052f, 0xb65: 0x0533, 0xb66: 0x0537, 0xb67: 0x053b, 0xb68: 0x053f, 0xb69: 0x0543,
+       0xb6a: 0x0547, 0xb6b: 0x054b, 0xb6c: 0x054f, 0xb6d: 0x0553, 0xb6e: 0x0557, 0xb6f: 0x055b,
+       0xb70: 0x055f, 0xb71: 0x0563, 0xb72: 0x0567, 0xb73: 0x056f, 0xb74: 0x0577, 0xb75: 0x057f,
+       0xb76: 0x0583, 0xb77: 0x0587, 0xb78: 0x058b, 0xb79: 0x058f, 0xb7a: 0x0593, 0xb7b: 0x0597,
+       0xb7c: 0x059b, 0xb7d: 0x059f, 0xb7e: 0x05a3,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x2b0c, 0xb81: 0x29a8, 0xb82: 0x2b1c, 0xb83: 0x2880, 0xb84: 0x2ee4, 0xb85: 0x288a,
+       0xb86: 0x2894, 0xb87: 0x2f28, 0xb88: 0x29b5, 0xb89: 0x289e, 0xb8a: 0x28a8, 0xb8b: 0x28b2,
+       0xb8c: 0x29dc, 0xb8d: 0x29e9, 0xb8e: 0x29c2, 0xb8f: 0x29cf, 0xb90: 0x2ea9, 0xb91: 0x29f6,
+       0xb92: 0x2a03, 0xb93: 0x2bbe, 0xb94: 0x26bb, 0xb95: 0x2bd1, 0xb96: 0x2be4, 0xb97: 0x2b2c,
+       0xb98: 0x2a10, 0xb99: 0x2bf7, 0xb9a: 0x2c0a, 0xb9b: 0x2a1d, 0xb9c: 0x28bc, 0xb9d: 0x28c6,
+       0xb9e: 0x2eb7, 0xb9f: 0x2a2a, 0xba0: 0x2b3c, 0xba1: 0x2ef5, 0xba2: 0x28d0, 0xba3: 0x28da,
+       0xba4: 0x2a37, 0xba5: 0x28e4, 0xba6: 0x28ee, 0xba7: 0x26d0, 0xba8: 0x26d7, 0xba9: 0x28f8,
+       0xbaa: 0x2902, 0xbab: 0x2c1d, 0xbac: 0x2a44, 0xbad: 0x2b4c, 0xbae: 0x2c30, 0xbaf: 0x2a51,
+       0xbb0: 0x2916, 0xbb1: 0x290c, 0xbb2: 0x2f3c, 0xbb3: 0x2a5e, 0xbb4: 0x2c43, 0xbb5: 0x2920,
+       0xbb6: 0x2b5c, 0xbb7: 0x292a, 0xbb8: 0x2a78, 0xbb9: 0x2934, 0xbba: 0x2a85, 0xbbb: 0x2f06,
+       0xbbc: 0x2a6b, 0xbbd: 0x2b6c, 0xbbe: 0x2a92, 0xbbf: 0x26de,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x2f17, 0xbc1: 0x293e, 0xbc2: 0x2948, 0xbc3: 0x2a9f, 0xbc4: 0x2952, 0xbc5: 0x295c,
+       0xbc6: 0x2966, 0xbc7: 0x2b7c, 0xbc8: 0x2aac, 0xbc9: 0x26e5, 0xbca: 0x2c56, 0xbcb: 0x2e90,
+       0xbcc: 0x2b8c, 0xbcd: 0x2ab9, 0xbce: 0x2ec5, 0xbcf: 0x2970, 0xbd0: 0x297a, 0xbd1: 0x2ac6,
+       0xbd2: 0x26ec, 0xbd3: 0x2ad3, 0xbd4: 0x2b9c, 0xbd5: 0x26f3, 0xbd6: 0x2c69, 0xbd7: 0x2984,
+       0xbd8: 0x1cb7, 0xbd9: 0x1ccb, 0xbda: 0x1cda, 0xbdb: 0x1ce9, 0xbdc: 0x1cf8, 0xbdd: 0x1d07,
+       0xbde: 0x1d16, 0xbdf: 0x1d25, 0xbe0: 0x1d34, 0xbe1: 0x1d43, 0xbe2: 0x2192, 0xbe3: 0x21a4,
+       0xbe4: 0x21b6, 0xbe5: 0x21c2, 0xbe6: 0x21ce, 0xbe7: 0x21da, 0xbe8: 0x21e6, 0xbe9: 0x21f2,
+       0xbea: 0x21fe, 0xbeb: 0x220a, 0xbec: 0x2246, 0xbed: 0x2252, 0xbee: 0x225e, 0xbef: 0x226a,
+       0xbf0: 0x2276, 0xbf1: 0x1c14, 0xbf2: 0x19c6, 0xbf3: 0x1936, 0xbf4: 0x1be4, 0xbf5: 0x1a47,
+       0xbf6: 0x1a56, 0xbf7: 0x19cc, 0xbf8: 0x1bfc, 0xbf9: 0x1c00, 0xbfa: 0x1960, 0xbfb: 0x2701,
+       0xbfc: 0x270f, 0xbfd: 0x26fa, 0xbfe: 0x2708, 0xbff: 0x2ae0,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x1a4a, 0xc01: 0x1a32, 0xc02: 0x1c60, 0xc03: 0x1a1a, 0xc04: 0x19f3, 0xc05: 0x1969,
+       0xc06: 0x1978, 0xc07: 0x1948, 0xc08: 0x1bf0, 0xc09: 0x1d52, 0xc0a: 0x1a4d, 0xc0b: 0x1a35,
+       0xc0c: 0x1c64, 0xc0d: 0x1c70, 0xc0e: 0x1a26, 0xc0f: 0x19fc, 0xc10: 0x1957, 0xc11: 0x1c1c,
+       0xc12: 0x1bb0, 0xc13: 0x1b9c, 0xc14: 0x1bcc, 0xc15: 0x1c74, 0xc16: 0x1a29, 0xc17: 0x19c9,
+       0xc18: 0x19ff, 0xc19: 0x19de, 0xc1a: 0x1a41, 0xc1b: 0x1c78, 0xc1c: 0x1a2c, 0xc1d: 0x19c0,
+       0xc1e: 0x1a02, 0xc1f: 0x1c3c, 0xc20: 0x1bf4, 0xc21: 0x1a14, 0xc22: 0x1c24, 0xc23: 0x1c40,
+       0xc24: 0x1bf8, 0xc25: 0x1a17, 0xc26: 0x1c28, 0xc27: 0x22e8, 0xc28: 0x22fc, 0xc29: 0x1996,
+       0xc2a: 0x1c20, 0xc2b: 0x1bb4, 0xc2c: 0x1ba0, 0xc2d: 0x1c48, 0xc2e: 0x2716, 0xc2f: 0x27ad,
+       0xc30: 0x1a59, 0xc31: 0x1a44, 0xc32: 0x1c7c, 0xc33: 0x1a2f, 0xc34: 0x1a50, 0xc35: 0x1a38,
+       0xc36: 0x1c68, 0xc37: 0x1a1d, 0xc38: 0x19f6, 0xc39: 0x1981, 0xc3a: 0x1a53, 0xc3b: 0x1a3b,
+       0xc3c: 0x1c6c, 0xc3d: 0x1a20, 0xc3e: 0x19f9, 0xc3f: 0x1984,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x1c2c, 0xc41: 0x1bb8, 0xc42: 0x1d4d, 0xc43: 0x1939, 0xc44: 0x19ba, 0xc45: 0x19bd,
+       0xc46: 0x22f5, 0xc47: 0x1b94, 0xc48: 0x19c3, 0xc49: 0x194b, 0xc4a: 0x19e1, 0xc4b: 0x194e,
+       0xc4c: 0x19ea, 0xc4d: 0x196c, 0xc4e: 0x196f, 0xc4f: 0x1a05, 0xc50: 0x1a0b, 0xc51: 0x1a0e,
+       0xc52: 0x1c30, 0xc53: 0x1a11, 0xc54: 0x1a23, 0xc55: 0x1c38, 0xc56: 0x1c44, 0xc57: 0x1990,
+       0xc58: 0x1d57, 0xc59: 0x1bbc, 0xc5a: 0x1993, 0xc5b: 0x1a5c, 0xc5c: 0x19a5, 0xc5d: 0x19b4,
+       0xc5e: 0x22e2, 0xc5f: 0x22dc, 0xc60: 0x1cc1, 0xc61: 0x1cd0, 0xc62: 0x1cdf, 0xc63: 0x1cee,
+       0xc64: 0x1cfd, 0xc65: 0x1d0c, 0xc66: 0x1d1b, 0xc67: 0x1d2a, 0xc68: 0x1d39, 0xc69: 0x2186,
+       0xc6a: 0x2198, 0xc6b: 0x21aa, 0xc6c: 0x21bc, 0xc6d: 0x21c8, 0xc6e: 0x21d4, 0xc6f: 0x21e0,
+       0xc70: 0x21ec, 0xc71: 0x21f8, 0xc72: 0x2204, 0xc73: 0x2240, 0xc74: 0x224c, 0xc75: 0x2258,
+       0xc76: 0x2264, 0xc77: 0x2270, 0xc78: 0x227c, 0xc79: 0x2282, 0xc7a: 0x2288, 0xc7b: 0x228e,
+       0xc7c: 0x2294, 0xc7d: 0x22a6, 0xc7e: 0x22ac, 0xc7f: 0x1c10,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x1377, 0xc81: 0x0cfb, 0xc82: 0x13d3, 0xc83: 0x139f, 0xc84: 0x0e57, 0xc85: 0x06eb,
+       0xc86: 0x08df, 0xc87: 0x162b, 0xc88: 0x162b, 0xc89: 0x0a0b, 0xc8a: 0x145f, 0xc8b: 0x0943,
+       0xc8c: 0x0a07, 0xc8d: 0x0bef, 0xc8e: 0x0fcf, 0xc8f: 0x115f, 0xc90: 0x1297, 0xc91: 0x12d3,
+       0xc92: 0x1307, 0xc93: 0x141b, 0xc94: 0x0d73, 0xc95: 0x0dff, 0xc96: 0x0eab, 0xc97: 0x0f43,
+       0xc98: 0x125f, 0xc99: 0x1447, 0xc9a: 0x1573, 0xc9b: 0x070f, 0xc9c: 0x08b3, 0xc9d: 0x0d87,
+       0xc9e: 0x0ecf, 0xc9f: 0x1293, 0xca0: 0x15c3, 0xca1: 0x0ab3, 0xca2: 0x0e77, 0xca3: 0x1283,
+       0xca4: 0x1317, 0xca5: 0x0c23, 0xca6: 0x11bb, 0xca7: 0x12df, 0xca8: 0x0b1f, 0xca9: 0x0d0f,
+       0xcaa: 0x0e17, 0xcab: 0x0f1b, 0xcac: 0x1427, 0xcad: 0x074f, 0xcae: 0x07e7, 0xcaf: 0x0853,
+       0xcb0: 0x0c8b, 0xcb1: 0x0d7f, 0xcb2: 0x0ecb, 0xcb3: 0x0fef, 0xcb4: 0x1177, 0xcb5: 0x128b,
+       0xcb6: 0x12a3, 0xcb7: 0x13c7, 0xcb8: 0x14ef, 0xcb9: 0x15a3, 0xcba: 0x15bf, 0xcbb: 0x102b,
+       0xcbc: 0x106b, 0xcbd: 0x1123, 0xcbe: 0x1243, 0xcbf: 0x147b,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x15cb, 0xcc1: 0x134b, 0xcc2: 0x09c7, 0xcc3: 0x0b3b, 0xcc4: 0x10db, 0xcc5: 0x119b,
+       0xcc6: 0x0eff, 0xcc7: 0x1033, 0xcc8: 0x1397, 0xcc9: 0x14e7, 0xcca: 0x09c3, 0xccb: 0x0a8f,
+       0xccc: 0x0d77, 0xccd: 0x0e2b, 0xcce: 0x0e5f, 0xccf: 0x1113, 0xcd0: 0x113b, 0xcd1: 0x14a7,
+       0xcd2: 0x084f, 0xcd3: 0x11a7, 0xcd4: 0x07f3, 0xcd5: 0x07ef, 0xcd6: 0x1097, 0xcd7: 0x1127,
+       0xcd8: 0x125b, 0xcd9: 0x14af, 0xcda: 0x1367, 0xcdb: 0x0c27, 0xcdc: 0x0d73, 0xcdd: 0x1357,
+       0xcde: 0x06f7, 0xcdf: 0x0a63, 0xce0: 0x0b93, 0xce1: 0x0f2f, 0xce2: 0x0faf, 0xce3: 0x0873,
+       0xce4: 0x103b, 0xce5: 0x075f, 0xce6: 0x0b77, 0xce7: 0x06d7, 0xce8: 0x0deb, 0xce9: 0x0ca3,
+       0xcea: 0x110f, 0xceb: 0x08c7, 0xcec: 0x09b3, 0xced: 0x0ffb, 0xcee: 0x1263, 0xcef: 0x133b,
+       0xcf0: 0x0db7, 0xcf1: 0x13f7, 0xcf2: 0x0de3, 0xcf3: 0x0c37, 0xcf4: 0x121b, 0xcf5: 0x0c57,
+       0xcf6: 0x0fab, 0xcf7: 0x072b, 0xcf8: 0x07a7, 0xcf9: 0x07eb, 0xcfa: 0x0d53, 0xcfb: 0x10fb,
+       0xcfc: 0x11f3, 0xcfd: 0x1347, 0xcfe: 0x145b, 0xcff: 0x085b,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x090f, 0xd01: 0x0a17, 0xd02: 0x0b2f, 0xd03: 0x0cbf, 0xd04: 0x0e7b, 0xd05: 0x103f,
+       0xd06: 0x1497, 0xd07: 0x157b, 0xd08: 0x15cf, 0xd09: 0x15e7, 0xd0a: 0x0837, 0xd0b: 0x0cf3,
+       0xd0c: 0x0da3, 0xd0d: 0x13eb, 0xd0e: 0x0afb, 0xd0f: 0x0bd7, 0xd10: 0x0bf3, 0xd11: 0x0c83,
+       0xd12: 0x0e6b, 0xd13: 0x0eb7, 0xd14: 0x0f67, 0xd15: 0x108b, 0xd16: 0x112f, 0xd17: 0x1193,
+       0xd18: 0x13db, 0xd19: 0x126b, 0xd1a: 0x1403, 0xd1b: 0x147f, 0xd1c: 0x080f, 0xd1d: 0x083b,
+       0xd1e: 0x0923, 0xd1f: 0x0ea7, 0xd20: 0x12f3, 0xd21: 0x133b, 0xd22: 0x0b1b, 0xd23: 0x0b8b,
+       0xd24: 0x0c4f, 0xd25: 0x0daf, 0xd26: 0x10d7, 0xd27: 0x0f23, 0xd28: 0x073b, 0xd29: 0x097f,
+       0xd2a: 0x0a63, 0xd2b: 0x0ac7, 0xd2c: 0x0b97, 0xd2d: 0x0f3f, 0xd2e: 0x0f5b, 0xd2f: 0x116b,
+       0xd30: 0x118b, 0xd31: 0x1463, 0xd32: 0x14e3, 0xd33: 0x14f3, 0xd34: 0x152f, 0xd35: 0x0753,
+       0xd36: 0x107f, 0xd37: 0x144f, 0xd38: 0x14cb, 0xd39: 0x0baf, 0xd3a: 0x0717, 0xd3b: 0x0777,
+       0xd3c: 0x0a67, 0xd3d: 0x0a87, 0xd3e: 0x0caf, 0xd3f: 0x0d73,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x0ec3, 0xd41: 0x0fcb, 0xd42: 0x1277, 0xd43: 0x1417, 0xd44: 0x1623, 0xd45: 0x0ce3,
+       0xd46: 0x14a3, 0xd47: 0x0833, 0xd48: 0x0d2f, 0xd49: 0x0d3b, 0xd4a: 0x0e0f, 0xd4b: 0x0e47,
+       0xd4c: 0x0f4b, 0xd4d: 0x0fa7, 0xd4e: 0x1027, 0xd4f: 0x110b, 0xd50: 0x153b, 0xd51: 0x07af,
+       0xd52: 0x0c03, 0xd53: 0x14b3, 0xd54: 0x0767, 0xd55: 0x0aab, 0xd56: 0x0e2f, 0xd57: 0x13df,
+       0xd58: 0x0b67, 0xd59: 0x0bb7, 0xd5a: 0x0d43, 0xd5b: 0x0f2f, 0xd5c: 0x14bb, 0xd5d: 0x0817,
+       0xd5e: 0x08ff, 0xd5f: 0x0a97, 0xd60: 0x0cd3, 0xd61: 0x0d1f, 0xd62: 0x0d5f, 0xd63: 0x0df3,
+       0xd64: 0x0f47, 0xd65: 0x0fbb, 0xd66: 0x1157, 0xd67: 0x12f7, 0xd68: 0x1303, 0xd69: 0x1457,
+       0xd6a: 0x14d7, 0xd6b: 0x0883, 0xd6c: 0x0e4b, 0xd6d: 0x0903, 0xd6e: 0x0ec7, 0xd6f: 0x0f6b,
+       0xd70: 0x1287, 0xd71: 0x14bf, 0xd72: 0x15ab, 0xd73: 0x15d3, 0xd74: 0x0d37, 0xd75: 0x0e27,
+       0xd76: 0x11c3, 0xd77: 0x10b7, 0xd78: 0x10c3, 0xd79: 0x10e7, 0xd7a: 0x0f17, 0xd7b: 0x0e9f,
+       0xd7c: 0x1363, 0xd7d: 0x0733, 0xd7e: 0x122b, 0xd7f: 0x081b,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x080b, 0xd81: 0x0b0b, 0xd82: 0x0c2b, 0xd83: 0x10f3, 0xd84: 0x0a53, 0xd85: 0x0e03,
+       0xd86: 0x0cef, 0xd87: 0x13e7, 0xd88: 0x12e7, 0xd89: 0x14ab, 0xd8a: 0x1323, 0xd8b: 0x0b27,
+       0xd8c: 0x0787, 0xd8d: 0x095b, 0xd90: 0x09af,
+       0xd92: 0x0cdf, 0xd95: 0x07f7, 0xd96: 0x0f1f, 0xd97: 0x0fe3,
+       0xd98: 0x1047, 0xd99: 0x1063, 0xd9a: 0x1067, 0xd9b: 0x107b, 0xd9c: 0x14fb, 0xd9d: 0x10eb,
+       0xd9e: 0x116f, 0xda0: 0x128f, 0xda2: 0x1353,
+       0xda5: 0x1407, 0xda6: 0x1433,
+       0xdaa: 0x154f, 0xdab: 0x1553, 0xdac: 0x1557, 0xdad: 0x15bb, 0xdae: 0x142b, 0xdaf: 0x14c7,
+       0xdb0: 0x0757, 0xdb1: 0x077b, 0xdb2: 0x078f, 0xdb3: 0x084b, 0xdb4: 0x0857, 0xdb5: 0x0897,
+       0xdb6: 0x094b, 0xdb7: 0x0967, 0xdb8: 0x096f, 0xdb9: 0x09ab, 0xdba: 0x09b7, 0xdbb: 0x0a93,
+       0xdbc: 0x0a9b, 0xdbd: 0x0ba3, 0xdbe: 0x0bcb, 0xdbf: 0x0bd3,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0x0beb, 0xdc1: 0x0c97, 0xdc2: 0x0cc7, 0xdc3: 0x0ce7, 0xdc4: 0x0d57, 0xdc5: 0x0e1b,
+       0xdc6: 0x0e37, 0xdc7: 0x0e67, 0xdc8: 0x0ebb, 0xdc9: 0x0edb, 0xdca: 0x0f4f, 0xdcb: 0x102f,
+       0xdcc: 0x104b, 0xdcd: 0x1053, 0xdce: 0x104f, 0xdcf: 0x1057, 0xdd0: 0x105b, 0xdd1: 0x105f,
+       0xdd2: 0x1073, 0xdd3: 0x1077, 0xdd4: 0x109b, 0xdd5: 0x10af, 0xdd6: 0x10cb, 0xdd7: 0x112f,
+       0xdd8: 0x1137, 0xdd9: 0x113f, 0xdda: 0x1153, 0xddb: 0x117b, 0xddc: 0x11cb, 0xddd: 0x11ff,
+       0xdde: 0x11ff, 0xddf: 0x1267, 0xde0: 0x130f, 0xde1: 0x1327, 0xde2: 0x135b, 0xde3: 0x135f,
+       0xde4: 0x13a3, 0xde5: 0x13a7, 0xde6: 0x13ff, 0xde7: 0x1407, 0xde8: 0x14db, 0xde9: 0x151f,
+       0xdea: 0x1537, 0xdeb: 0x0b9b, 0xdec: 0x171e, 0xded: 0x11e3,
+       0xdf0: 0x06df, 0xdf1: 0x07e3, 0xdf2: 0x07a3, 0xdf3: 0x074b, 0xdf4: 0x078b, 0xdf5: 0x07b7,
+       0xdf6: 0x0847, 0xdf7: 0x0863, 0xdf8: 0x094b, 0xdf9: 0x0937, 0xdfa: 0x0947, 0xdfb: 0x0963,
+       0xdfc: 0x09af, 0xdfd: 0x09bf, 0xdfe: 0x0a03, 0xdff: 0x0a0f,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x0a2b, 0xe01: 0x0a3b, 0xe02: 0x0b23, 0xe03: 0x0b2b, 0xe04: 0x0b5b, 0xe05: 0x0b7b,
+       0xe06: 0x0bab, 0xe07: 0x0bc3, 0xe08: 0x0bb3, 0xe09: 0x0bd3, 0xe0a: 0x0bc7, 0xe0b: 0x0beb,
+       0xe0c: 0x0c07, 0xe0d: 0x0c5f, 0xe0e: 0x0c6b, 0xe0f: 0x0c73, 0xe10: 0x0c9b, 0xe11: 0x0cdf,
+       0xe12: 0x0d0f, 0xe13: 0x0d13, 0xe14: 0x0d27, 0xe15: 0x0da7, 0xe16: 0x0db7, 0xe17: 0x0e0f,
+       0xe18: 0x0e5b, 0xe19: 0x0e53, 0xe1a: 0x0e67, 0xe1b: 0x0e83, 0xe1c: 0x0ebb, 0xe1d: 0x1013,
+       0xe1e: 0x0edf, 0xe1f: 0x0f13, 0xe20: 0x0f1f, 0xe21: 0x0f5f, 0xe22: 0x0f7b, 0xe23: 0x0f9f,
+       0xe24: 0x0fc3, 0xe25: 0x0fc7, 0xe26: 0x0fe3, 0xe27: 0x0fe7, 0xe28: 0x0ff7, 0xe29: 0x100b,
+       0xe2a: 0x1007, 0xe2b: 0x1037, 0xe2c: 0x10b3, 0xe2d: 0x10cb, 0xe2e: 0x10e3, 0xe2f: 0x111b,
+       0xe30: 0x112f, 0xe31: 0x114b, 0xe32: 0x117b, 0xe33: 0x122f, 0xe34: 0x1257, 0xe35: 0x12cb,
+       0xe36: 0x1313, 0xe37: 0x131f, 0xe38: 0x1327, 0xe39: 0x133f, 0xe3a: 0x1353, 0xe3b: 0x1343,
+       0xe3c: 0x135b, 0xe3d: 0x1357, 0xe3e: 0x134f, 0xe3f: 0x135f,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x136b, 0xe41: 0x13a7, 0xe42: 0x13e3, 0xe43: 0x1413, 0xe44: 0x144b, 0xe45: 0x146b,
+       0xe46: 0x14b7, 0xe47: 0x14db, 0xe48: 0x14fb, 0xe49: 0x150f, 0xe4a: 0x151f, 0xe4b: 0x152b,
+       0xe4c: 0x1537, 0xe4d: 0x158b, 0xe4e: 0x162b, 0xe4f: 0x16b5, 0xe50: 0x16b0, 0xe51: 0x16e2,
+       0xe52: 0x0607, 0xe53: 0x062f, 0xe54: 0x0633, 0xe55: 0x1764, 0xe56: 0x1791, 0xe57: 0x1809,
+       0xe58: 0x1617, 0xe59: 0x1627,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x19d5, 0xe81: 0x19d8, 0xe82: 0x19db, 0xe83: 0x1c08, 0xe84: 0x1c0c, 0xe85: 0x1a5f,
+       0xe86: 0x1a5f,
+       0xe93: 0x1d75, 0xe94: 0x1d66, 0xe95: 0x1d6b, 0xe96: 0x1d7a, 0xe97: 0x1d70,
+       0xe9d: 0x4390,
+       0xe9e: 0x8115, 0xe9f: 0x4402, 0xea0: 0x022d, 0xea1: 0x0215, 0xea2: 0x021e, 0xea3: 0x0221,
+       0xea4: 0x0224, 0xea5: 0x0227, 0xea6: 0x022a, 0xea7: 0x0230, 0xea8: 0x0233, 0xea9: 0x0017,
+       0xeaa: 0x43f0, 0xeab: 0x43f6, 0xeac: 0x44f4, 0xead: 0x44fc, 0xeae: 0x4348, 0xeaf: 0x434e,
+       0xeb0: 0x4354, 0xeb1: 0x435a, 0xeb2: 0x4366, 0xeb3: 0x436c, 0xeb4: 0x4372, 0xeb5: 0x437e,
+       0xeb6: 0x4384, 0xeb8: 0x438a, 0xeb9: 0x4396, 0xeba: 0x439c, 0xebb: 0x43a2,
+       0xebc: 0x43ae, 0xebe: 0x43b4,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x43ba, 0xec1: 0x43c0, 0xec3: 0x43c6, 0xec4: 0x43cc,
+       0xec6: 0x43d8, 0xec7: 0x43de, 0xec8: 0x43e4, 0xec9: 0x43ea, 0xeca: 0x43fc, 0xecb: 0x4378,
+       0xecc: 0x4360, 0xecd: 0x43a8, 0xece: 0x43d2, 0xecf: 0x1d7f, 0xed0: 0x0299, 0xed1: 0x0299,
+       0xed2: 0x02a2, 0xed3: 0x02a2, 0xed4: 0x02a2, 0xed5: 0x02a2, 0xed6: 0x02a5, 0xed7: 0x02a5,
+       0xed8: 0x02a5, 0xed9: 0x02a5, 0xeda: 0x02ab, 0xedb: 0x02ab, 0xedc: 0x02ab, 0xedd: 0x02ab,
+       0xede: 0x029f, 0xedf: 0x029f, 0xee0: 0x029f, 0xee1: 0x029f, 0xee2: 0x02a8, 0xee3: 0x02a8,
+       0xee4: 0x02a8, 0xee5: 0x02a8, 0xee6: 0x029c, 0xee7: 0x029c, 0xee8: 0x029c, 0xee9: 0x029c,
+       0xeea: 0x02cf, 0xeeb: 0x02cf, 0xeec: 0x02cf, 0xeed: 0x02cf, 0xeee: 0x02d2, 0xeef: 0x02d2,
+       0xef0: 0x02d2, 0xef1: 0x02d2, 0xef2: 0x02b1, 0xef3: 0x02b1, 0xef4: 0x02b1, 0xef5: 0x02b1,
+       0xef6: 0x02ae, 0xef7: 0x02ae, 0xef8: 0x02ae, 0xef9: 0x02ae, 0xefa: 0x02b4, 0xefb: 0x02b4,
+       0xefc: 0x02b4, 0xefd: 0x02b4, 0xefe: 0x02b7, 0xeff: 0x02b7,
+       // Block 0x3c, offset 0xf00
+       0xf00: 0x02b7, 0xf01: 0x02b7, 0xf02: 0x02c0, 0xf03: 0x02c0, 0xf04: 0x02bd, 0xf05: 0x02bd,
+       0xf06: 0x02c3, 0xf07: 0x02c3, 0xf08: 0x02ba, 0xf09: 0x02ba, 0xf0a: 0x02c9, 0xf0b: 0x02c9,
+       0xf0c: 0x02c6, 0xf0d: 0x02c6, 0xf0e: 0x02d5, 0xf0f: 0x02d5, 0xf10: 0x02d5, 0xf11: 0x02d5,
+       0xf12: 0x02db, 0xf13: 0x02db, 0xf14: 0x02db, 0xf15: 0x02db, 0xf16: 0x02e1, 0xf17: 0x02e1,
+       0xf18: 0x02e1, 0xf19: 0x02e1, 0xf1a: 0x02de, 0xf1b: 0x02de, 0xf1c: 0x02de, 0xf1d: 0x02de,
+       0xf1e: 0x02e4, 0xf1f: 0x02e4, 0xf20: 0x02e7, 0xf21: 0x02e7, 0xf22: 0x02e7, 0xf23: 0x02e7,
+       0xf24: 0x446e, 0xf25: 0x446e, 0xf26: 0x02ed, 0xf27: 0x02ed, 0xf28: 0x02ed, 0xf29: 0x02ed,
+       0xf2a: 0x02ea, 0xf2b: 0x02ea, 0xf2c: 0x02ea, 0xf2d: 0x02ea, 0xf2e: 0x0308, 0xf2f: 0x0308,
+       0xf30: 0x4468, 0xf31: 0x4468,
+       // Block 0x3d, offset 0xf40
+       0xf53: 0x02d8, 0xf54: 0x02d8, 0xf55: 0x02d8, 0xf56: 0x02d8, 0xf57: 0x02f6,
+       0xf58: 0x02f6, 0xf59: 0x02f3, 0xf5a: 0x02f3, 0xf5b: 0x02f9, 0xf5c: 0x02f9, 0xf5d: 0x204f,
+       0xf5e: 0x02ff, 0xf5f: 0x02ff, 0xf60: 0x02f0, 0xf61: 0x02f0, 0xf62: 0x02fc, 0xf63: 0x02fc,
+       0xf64: 0x0305, 0xf65: 0x0305, 0xf66: 0x0305, 0xf67: 0x0305, 0xf68: 0x028d, 0xf69: 0x028d,
+       0xf6a: 0x25aa, 0xf6b: 0x25aa, 0xf6c: 0x261a, 0xf6d: 0x261a, 0xf6e: 0x25e9, 0xf6f: 0x25e9,
+       0xf70: 0x2605, 0xf71: 0x2605, 0xf72: 0x25fe, 0xf73: 0x25fe, 0xf74: 0x260c, 0xf75: 0x260c,
+       0xf76: 0x2613, 0xf77: 0x2613, 0xf78: 0x2613, 0xf79: 0x25f0, 0xf7a: 0x25f0, 0xf7b: 0x25f0,
+       0xf7c: 0x0302, 0xf7d: 0x0302, 0xf7e: 0x0302, 0xf7f: 0x0302,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x25b1, 0xf81: 0x25b8, 0xf82: 0x25d4, 0xf83: 0x25f0, 0xf84: 0x25f7, 0xf85: 0x1d89,
+       0xf86: 0x1d8e, 0xf87: 0x1d93, 0xf88: 0x1da2, 0xf89: 0x1db1, 0xf8a: 0x1db6, 0xf8b: 0x1dbb,
+       0xf8c: 0x1dc0, 0xf8d: 0x1dc5, 0xf8e: 0x1dd4, 0xf8f: 0x1de3, 0xf90: 0x1de8, 0xf91: 0x1ded,
+       0xf92: 0x1dfc, 0xf93: 0x1e0b, 0xf94: 0x1e10, 0xf95: 0x1e15, 0xf96: 0x1e1a, 0xf97: 0x1e29,
+       0xf98: 0x1e2e, 0xf99: 0x1e3d, 0xf9a: 0x1e42, 0xf9b: 0x1e47, 0xf9c: 0x1e56, 0xf9d: 0x1e5b,
+       0xf9e: 0x1e60, 0xf9f: 0x1e6a, 0xfa0: 0x1ea6, 0xfa1: 0x1eb5, 0xfa2: 0x1ec4, 0xfa3: 0x1ec9,
+       0xfa4: 0x1ece, 0xfa5: 0x1ed8, 0xfa6: 0x1ee7, 0xfa7: 0x1eec, 0xfa8: 0x1efb, 0xfa9: 0x1f00,
+       0xfaa: 0x1f05, 0xfab: 0x1f14, 0xfac: 0x1f19, 0xfad: 0x1f28, 0xfae: 0x1f2d, 0xfaf: 0x1f32,
+       0xfb0: 0x1f37, 0xfb1: 0x1f3c, 0xfb2: 0x1f41, 0xfb3: 0x1f46, 0xfb4: 0x1f4b, 0xfb5: 0x1f50,
+       0xfb6: 0x1f55, 0xfb7: 0x1f5a, 0xfb8: 0x1f5f, 0xfb9: 0x1f64, 0xfba: 0x1f69, 0xfbb: 0x1f6e,
+       0xfbc: 0x1f73, 0xfbd: 0x1f78, 0xfbe: 0x1f7d, 0xfbf: 0x1f87,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x1f8c, 0xfc1: 0x1f91, 0xfc2: 0x1f96, 0xfc3: 0x1fa0, 0xfc4: 0x1fa5, 0xfc5: 0x1faf,
+       0xfc6: 0x1fb4, 0xfc7: 0x1fb9, 0xfc8: 0x1fbe, 0xfc9: 0x1fc3, 0xfca: 0x1fc8, 0xfcb: 0x1fcd,
+       0xfcc: 0x1fd2, 0xfcd: 0x1fd7, 0xfce: 0x1fe6, 0xfcf: 0x1ff5, 0xfd0: 0x1ffa, 0xfd1: 0x1fff,
+       0xfd2: 0x2004, 0xfd3: 0x2009, 0xfd4: 0x200e, 0xfd5: 0x2018, 0xfd6: 0x201d, 0xfd7: 0x2022,
+       0xfd8: 0x2031, 0xfd9: 0x2040, 0xfda: 0x2045, 0xfdb: 0x4420, 0xfdc: 0x4426, 0xfdd: 0x445c,
+       0xfde: 0x44b3, 0xfdf: 0x44ba, 0xfe0: 0x44c1, 0xfe1: 0x44c8, 0xfe2: 0x44cf, 0xfe3: 0x44d6,
+       0xfe4: 0x25c6, 0xfe5: 0x25cd, 0xfe6: 0x25d4, 0xfe7: 0x25db, 0xfe8: 0x25f0, 0xfe9: 0x25f7,
+       0xfea: 0x1d98, 0xfeb: 0x1d9d, 0xfec: 0x1da2, 0xfed: 0x1da7, 0xfee: 0x1db1, 0xfef: 0x1db6,
+       0xff0: 0x1dca, 0xff1: 0x1dcf, 0xff2: 0x1dd4, 0xff3: 0x1dd9, 0xff4: 0x1de3, 0xff5: 0x1de8,
+       0xff6: 0x1df2, 0xff7: 0x1df7, 0xff8: 0x1dfc, 0xff9: 0x1e01, 0xffa: 0x1e0b, 0xffb: 0x1e10,
+       0xffc: 0x1f3c, 0xffd: 0x1f41, 0xffe: 0x1f50, 0xfff: 0x1f55,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x1f5a, 0x1001: 0x1f6e, 0x1002: 0x1f73, 0x1003: 0x1f78, 0x1004: 0x1f7d, 0x1005: 0x1f96,
+       0x1006: 0x1fa0, 0x1007: 0x1fa5, 0x1008: 0x1faa, 0x1009: 0x1fbe, 0x100a: 0x1fdc, 0x100b: 0x1fe1,
+       0x100c: 0x1fe6, 0x100d: 0x1feb, 0x100e: 0x1ff5, 0x100f: 0x1ffa, 0x1010: 0x445c, 0x1011: 0x2027,
+       0x1012: 0x202c, 0x1013: 0x2031, 0x1014: 0x2036, 0x1015: 0x2040, 0x1016: 0x2045, 0x1017: 0x25b1,
+       0x1018: 0x25b8, 0x1019: 0x25bf, 0x101a: 0x25d4, 0x101b: 0x25e2, 0x101c: 0x1d89, 0x101d: 0x1d8e,
+       0x101e: 0x1d93, 0x101f: 0x1da2, 0x1020: 0x1dac, 0x1021: 0x1dbb, 0x1022: 0x1dc0, 0x1023: 0x1dc5,
+       0x1024: 0x1dd4, 0x1025: 0x1dde, 0x1026: 0x1dfc, 0x1027: 0x1e15, 0x1028: 0x1e1a, 0x1029: 0x1e29,
+       0x102a: 0x1e2e, 0x102b: 0x1e3d, 0x102c: 0x1e47, 0x102d: 0x1e56, 0x102e: 0x1e5b, 0x102f: 0x1e60,
+       0x1030: 0x1e6a, 0x1031: 0x1ea6, 0x1032: 0x1eab, 0x1033: 0x1eb5, 0x1034: 0x1ec4, 0x1035: 0x1ec9,
+       0x1036: 0x1ece, 0x1037: 0x1ed8, 0x1038: 0x1ee7, 0x1039: 0x1efb, 0x103a: 0x1f00, 0x103b: 0x1f05,
+       0x103c: 0x1f14, 0x103d: 0x1f19, 0x103e: 0x1f28, 0x103f: 0x1f2d,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x1f32, 0x1041: 0x1f37, 0x1042: 0x1f46, 0x1043: 0x1f4b, 0x1044: 0x1f5f, 0x1045: 0x1f64,
+       0x1046: 0x1f69, 0x1047: 0x1f6e, 0x1048: 0x1f73, 0x1049: 0x1f87, 0x104a: 0x1f8c, 0x104b: 0x1f91,
+       0x104c: 0x1f96, 0x104d: 0x1f9b, 0x104e: 0x1faf, 0x104f: 0x1fb4, 0x1050: 0x1fb9, 0x1051: 0x1fbe,
+       0x1052: 0x1fcd, 0x1053: 0x1fd2, 0x1054: 0x1fd7, 0x1055: 0x1fe6, 0x1056: 0x1ff0, 0x1057: 0x1fff,
+       0x1058: 0x2004, 0x1059: 0x4450, 0x105a: 0x2018, 0x105b: 0x201d, 0x105c: 0x2022, 0x105d: 0x2031,
+       0x105e: 0x203b, 0x105f: 0x25d4, 0x1060: 0x25e2, 0x1061: 0x1da2, 0x1062: 0x1dac, 0x1063: 0x1dd4,
+       0x1064: 0x1dde, 0x1065: 0x1dfc, 0x1066: 0x1e06, 0x1067: 0x1e6a, 0x1068: 0x1e6f, 0x1069: 0x1e92,
+       0x106a: 0x1e97, 0x106b: 0x1f6e, 0x106c: 0x1f73, 0x106d: 0x1f96, 0x106e: 0x1fe6, 0x106f: 0x1ff0,
+       0x1070: 0x2031, 0x1071: 0x203b, 0x1072: 0x4504, 0x1073: 0x450c, 0x1074: 0x4514, 0x1075: 0x1ef1,
+       0x1076: 0x1ef6, 0x1077: 0x1f0a, 0x1078: 0x1f0f, 0x1079: 0x1f1e, 0x107a: 0x1f23, 0x107b: 0x1e74,
+       0x107c: 0x1e79, 0x107d: 0x1e9c, 0x107e: 0x1ea1, 0x107f: 0x1e33,
+       // Block 0x42, offset 0x1080
+       0x1080: 0x1e38, 0x1081: 0x1e1f, 0x1082: 0x1e24, 0x1083: 0x1e4c, 0x1084: 0x1e51, 0x1085: 0x1eba,
+       0x1086: 0x1ebf, 0x1087: 0x1edd, 0x1088: 0x1ee2, 0x1089: 0x1e7e, 0x108a: 0x1e83, 0x108b: 0x1e88,
+       0x108c: 0x1e92, 0x108d: 0x1e8d, 0x108e: 0x1e65, 0x108f: 0x1eb0, 0x1090: 0x1ed3, 0x1091: 0x1ef1,
+       0x1092: 0x1ef6, 0x1093: 0x1f0a, 0x1094: 0x1f0f, 0x1095: 0x1f1e, 0x1096: 0x1f23, 0x1097: 0x1e74,
+       0x1098: 0x1e79, 0x1099: 0x1e9c, 0x109a: 0x1ea1, 0x109b: 0x1e33, 0x109c: 0x1e38, 0x109d: 0x1e1f,
+       0x109e: 0x1e24, 0x109f: 0x1e4c, 0x10a0: 0x1e51, 0x10a1: 0x1eba, 0x10a2: 0x1ebf, 0x10a3: 0x1edd,
+       0x10a4: 0x1ee2, 0x10a5: 0x1e7e, 0x10a6: 0x1e83, 0x10a7: 0x1e88, 0x10a8: 0x1e92, 0x10a9: 0x1e8d,
+       0x10aa: 0x1e65, 0x10ab: 0x1eb0, 0x10ac: 0x1ed3, 0x10ad: 0x1e7e, 0x10ae: 0x1e83, 0x10af: 0x1e88,
+       0x10b0: 0x1e92, 0x10b1: 0x1e6f, 0x10b2: 0x1e97, 0x10b3: 0x1eec, 0x10b4: 0x1e56, 0x10b5: 0x1e5b,
+       0x10b6: 0x1e60, 0x10b7: 0x1e7e, 0x10b8: 0x1e83, 0x10b9: 0x1e88, 0x10ba: 0x1eec, 0x10bb: 0x1efb,
+       0x10bc: 0x4408, 0x10bd: 0x4408,
+       // Block 0x43, offset 0x10c0
+       0x10d0: 0x2311, 0x10d1: 0x2326,
+       0x10d2: 0x2326, 0x10d3: 0x232d, 0x10d4: 0x2334, 0x10d5: 0x2349, 0x10d6: 0x2350, 0x10d7: 0x2357,
+       0x10d8: 0x237a, 0x10d9: 0x237a, 0x10da: 0x239d, 0x10db: 0x2396, 0x10dc: 0x23b2, 0x10dd: 0x23a4,
+       0x10de: 0x23ab, 0x10df: 0x23ce, 0x10e0: 0x23ce, 0x10e1: 0x23c7, 0x10e2: 0x23d5, 0x10e3: 0x23d5,
+       0x10e4: 0x23ff, 0x10e5: 0x23ff, 0x10e6: 0x241b, 0x10e7: 0x23e3, 0x10e8: 0x23e3, 0x10e9: 0x23dc,
+       0x10ea: 0x23f1, 0x10eb: 0x23f1, 0x10ec: 0x23f8, 0x10ed: 0x23f8, 0x10ee: 0x2422, 0x10ef: 0x2430,
+       0x10f0: 0x2430, 0x10f1: 0x2437, 0x10f2: 0x2437, 0x10f3: 0x243e, 0x10f4: 0x2445, 0x10f5: 0x244c,
+       0x10f6: 0x2453, 0x10f7: 0x2453, 0x10f8: 0x245a, 0x10f9: 0x2468, 0x10fa: 0x2476, 0x10fb: 0x246f,
+       0x10fc: 0x247d, 0x10fd: 0x247d, 0x10fe: 0x2492, 0x10ff: 0x2499,
+       // Block 0x44, offset 0x1100
+       0x1100: 0x24ca, 0x1101: 0x24d8, 0x1102: 0x24d1, 0x1103: 0x24b5, 0x1104: 0x24b5, 0x1105: 0x24df,
+       0x1106: 0x24df, 0x1107: 0x24e6, 0x1108: 0x24e6, 0x1109: 0x2510, 0x110a: 0x2517, 0x110b: 0x251e,
+       0x110c: 0x24f4, 0x110d: 0x2502, 0x110e: 0x2525, 0x110f: 0x252c,
+       0x1112: 0x24fb, 0x1113: 0x2580, 0x1114: 0x2587, 0x1115: 0x255d, 0x1116: 0x2564, 0x1117: 0x2548,
+       0x1118: 0x2548, 0x1119: 0x254f, 0x111a: 0x2579, 0x111b: 0x2572, 0x111c: 0x259c, 0x111d: 0x259c,
+       0x111e: 0x230a, 0x111f: 0x231f, 0x1120: 0x2318, 0x1121: 0x2342, 0x1122: 0x233b, 0x1123: 0x2365,
+       0x1124: 0x235e, 0x1125: 0x2388, 0x1126: 0x236c, 0x1127: 0x2381, 0x1128: 0x23b9, 0x1129: 0x2406,
+       0x112a: 0x23ea, 0x112b: 0x2429, 0x112c: 0x24c3, 0x112d: 0x24ed, 0x112e: 0x2595, 0x112f: 0x258e,
+       0x1130: 0x25a3, 0x1131: 0x253a, 0x1132: 0x24a0, 0x1133: 0x256b, 0x1134: 0x2492, 0x1135: 0x24ca,
+       0x1136: 0x2461, 0x1137: 0x24ae, 0x1138: 0x2541, 0x1139: 0x2533, 0x113a: 0x24bc, 0x113b: 0x24a7,
+       0x113c: 0x24bc, 0x113d: 0x2541, 0x113e: 0x2373, 0x113f: 0x238f,
+       // Block 0x45, offset 0x1140
+       0x1140: 0x2509, 0x1141: 0x2484, 0x1142: 0x2303, 0x1143: 0x24a7, 0x1144: 0x244c, 0x1145: 0x241b,
+       0x1146: 0x23c0, 0x1147: 0x2556,
+       0x1170: 0x2414, 0x1171: 0x248b, 0x1172: 0x27bf, 0x1173: 0x27b6, 0x1174: 0x27ec, 0x1175: 0x27da,
+       0x1176: 0x27c8, 0x1177: 0x27e3, 0x1178: 0x27f5, 0x1179: 0x240d, 0x117a: 0x2c7c, 0x117b: 0x2afc,
+       0x117c: 0x27d1,
+       // Block 0x46, offset 0x1180
+       0x1190: 0x0019, 0x1191: 0x0483,
+       0x1192: 0x0487, 0x1193: 0x0035, 0x1194: 0x0037, 0x1195: 0x0003, 0x1196: 0x003f, 0x1197: 0x04bf,
+       0x1198: 0x04c3, 0x1199: 0x1b5c,
+       0x11a0: 0x8132, 0x11a1: 0x8132, 0x11a2: 0x8132, 0x11a3: 0x8132,
+       0x11a4: 0x8132, 0x11a5: 0x8132, 0x11a6: 0x8132, 0x11a7: 0x812d, 0x11a8: 0x812d, 0x11a9: 0x812d,
+       0x11aa: 0x812d, 0x11ab: 0x812d, 0x11ac: 0x812d, 0x11ad: 0x812d, 0x11ae: 0x8132, 0x11af: 0x8132,
+       0x11b0: 0x1873, 0x11b1: 0x0443, 0x11b2: 0x043f, 0x11b3: 0x007f, 0x11b4: 0x007f, 0x11b5: 0x0011,
+       0x11b6: 0x0013, 0x11b7: 0x00b7, 0x11b8: 0x00bb, 0x11b9: 0x04b7, 0x11ba: 0x04bb, 0x11bb: 0x04ab,
+       0x11bc: 0x04af, 0x11bd: 0x0493, 0x11be: 0x0497, 0x11bf: 0x048b,
+       // Block 0x47, offset 0x11c0
+       0x11c0: 0x048f, 0x11c1: 0x049b, 0x11c2: 0x049f, 0x11c3: 0x04a3, 0x11c4: 0x04a7,
+       0x11c7: 0x0077, 0x11c8: 0x007b, 0x11c9: 0x4269, 0x11ca: 0x4269, 0x11cb: 0x4269,
+       0x11cc: 0x4269, 0x11cd: 0x007f, 0x11ce: 0x007f, 0x11cf: 0x007f, 0x11d0: 0x0019, 0x11d1: 0x0483,
+       0x11d2: 0x001d, 0x11d4: 0x0037, 0x11d5: 0x0035, 0x11d6: 0x003f, 0x11d7: 0x0003,
+       0x11d8: 0x0443, 0x11d9: 0x0011, 0x11da: 0x0013, 0x11db: 0x00b7, 0x11dc: 0x00bb, 0x11dd: 0x04b7,
+       0x11de: 0x04bb, 0x11df: 0x0007, 0x11e0: 0x000d, 0x11e1: 0x0015, 0x11e2: 0x0017, 0x11e3: 0x001b,
+       0x11e4: 0x0039, 0x11e5: 0x003d, 0x11e6: 0x003b, 0x11e8: 0x0079, 0x11e9: 0x0009,
+       0x11ea: 0x000b, 0x11eb: 0x0041,
+       0x11f0: 0x42aa, 0x11f1: 0x442c, 0x11f2: 0x42af, 0x11f4: 0x42b4,
+       0x11f6: 0x42b9, 0x11f7: 0x4432, 0x11f8: 0x42be, 0x11f9: 0x4438, 0x11fa: 0x42c3, 0x11fb: 0x443e,
+       0x11fc: 0x42c8, 0x11fd: 0x4444, 0x11fe: 0x42cd, 0x11ff: 0x444a,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x0236, 0x1201: 0x440e, 0x1202: 0x440e, 0x1203: 0x4414, 0x1204: 0x4414, 0x1205: 0x4456,
+       0x1206: 0x4456, 0x1207: 0x441a, 0x1208: 0x441a, 0x1209: 0x4462, 0x120a: 0x4462, 0x120b: 0x4462,
+       0x120c: 0x4462, 0x120d: 0x0239, 0x120e: 0x0239, 0x120f: 0x023c, 0x1210: 0x023c, 0x1211: 0x023c,
+       0x1212: 0x023c, 0x1213: 0x023f, 0x1214: 0x023f, 0x1215: 0x0242, 0x1216: 0x0242, 0x1217: 0x0242,
+       0x1218: 0x0242, 0x1219: 0x0245, 0x121a: 0x0245, 0x121b: 0x0245, 0x121c: 0x0245, 0x121d: 0x0248,
+       0x121e: 0x0248, 0x121f: 0x0248, 0x1220: 0x0248, 0x1221: 0x024b, 0x1222: 0x024b, 0x1223: 0x024b,
+       0x1224: 0x024b, 0x1225: 0x024e, 0x1226: 0x024e, 0x1227: 0x024e, 0x1228: 0x024e, 0x1229: 0x0251,
+       0x122a: 0x0251, 0x122b: 0x0254, 0x122c: 0x0254, 0x122d: 0x0257, 0x122e: 0x0257, 0x122f: 0x025a,
+       0x1230: 0x025a, 0x1231: 0x025d, 0x1232: 0x025d, 0x1233: 0x025d, 0x1234: 0x025d, 0x1235: 0x0260,
+       0x1236: 0x0260, 0x1237: 0x0260, 0x1238: 0x0260, 0x1239: 0x0263, 0x123a: 0x0263, 0x123b: 0x0263,
+       0x123c: 0x0263, 0x123d: 0x0266, 0x123e: 0x0266, 0x123f: 0x0266,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x0266, 0x1241: 0x0269, 0x1242: 0x0269, 0x1243: 0x0269, 0x1244: 0x0269, 0x1245: 0x026c,
+       0x1246: 0x026c, 0x1247: 0x026c, 0x1248: 0x026c, 0x1249: 0x026f, 0x124a: 0x026f, 0x124b: 0x026f,
+       0x124c: 0x026f, 0x124d: 0x0272, 0x124e: 0x0272, 0x124f: 0x0272, 0x1250: 0x0272, 0x1251: 0x0275,
+       0x1252: 0x0275, 0x1253: 0x0275, 0x1254: 0x0275, 0x1255: 0x0278, 0x1256: 0x0278, 0x1257: 0x0278,
+       0x1258: 0x0278, 0x1259: 0x027b, 0x125a: 0x027b, 0x125b: 0x027b, 0x125c: 0x027b, 0x125d: 0x027e,
+       0x125e: 0x027e, 0x125f: 0x027e, 0x1260: 0x027e, 0x1261: 0x0281, 0x1262: 0x0281, 0x1263: 0x0281,
+       0x1264: 0x0281, 0x1265: 0x0284, 0x1266: 0x0284, 0x1267: 0x0284, 0x1268: 0x0284, 0x1269: 0x0287,
+       0x126a: 0x0287, 0x126b: 0x0287, 0x126c: 0x0287, 0x126d: 0x028a, 0x126e: 0x028a, 0x126f: 0x028d,
+       0x1270: 0x028d, 0x1271: 0x0290, 0x1272: 0x0290, 0x1273: 0x0290, 0x1274: 0x0290, 0x1275: 0x2e00,
+       0x1276: 0x2e00, 0x1277: 0x2e08, 0x1278: 0x2e08, 0x1279: 0x2e10, 0x127a: 0x2e10, 0x127b: 0x1f82,
+       0x127c: 0x1f82,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x0081, 0x1281: 0x0083, 0x1282: 0x0085, 0x1283: 0x0087, 0x1284: 0x0089, 0x1285: 0x008b,
+       0x1286: 0x008d, 0x1287: 0x008f, 0x1288: 0x0091, 0x1289: 0x0093, 0x128a: 0x0095, 0x128b: 0x0097,
+       0x128c: 0x0099, 0x128d: 0x009b, 0x128e: 0x009d, 0x128f: 0x009f, 0x1290: 0x00a1, 0x1291: 0x00a3,
+       0x1292: 0x00a5, 0x1293: 0x00a7, 0x1294: 0x00a9, 0x1295: 0x00ab, 0x1296: 0x00ad, 0x1297: 0x00af,
+       0x1298: 0x00b1, 0x1299: 0x00b3, 0x129a: 0x00b5, 0x129b: 0x00b7, 0x129c: 0x00b9, 0x129d: 0x00bb,
+       0x129e: 0x00bd, 0x129f: 0x0477, 0x12a0: 0x047b, 0x12a1: 0x0487, 0x12a2: 0x049b, 0x12a3: 0x049f,
+       0x12a4: 0x0483, 0x12a5: 0x05ab, 0x12a6: 0x05a3, 0x12a7: 0x04c7, 0x12a8: 0x04cf, 0x12a9: 0x04d7,
+       0x12aa: 0x04df, 0x12ab: 0x04e7, 0x12ac: 0x056b, 0x12ad: 0x0573, 0x12ae: 0x057b, 0x12af: 0x051f,
+       0x12b0: 0x05af, 0x12b1: 0x04cb, 0x12b2: 0x04d3, 0x12b3: 0x04db, 0x12b4: 0x04e3, 0x12b5: 0x04eb,
+       0x12b6: 0x04ef, 0x12b7: 0x04f3, 0x12b8: 0x04f7, 0x12b9: 0x04fb, 0x12ba: 0x04ff, 0x12bb: 0x0503,
+       0x12bc: 0x0507, 0x12bd: 0x050b, 0x12be: 0x050f, 0x12bf: 0x0513,
+       // Block 0x4b, offset 0x12c0
+       0x12c0: 0x0517, 0x12c1: 0x051b, 0x12c2: 0x0523, 0x12c3: 0x0527, 0x12c4: 0x052b, 0x12c5: 0x052f,
+       0x12c6: 0x0533, 0x12c7: 0x0537, 0x12c8: 0x053b, 0x12c9: 0x053f, 0x12ca: 0x0543, 0x12cb: 0x0547,
+       0x12cc: 0x054b, 0x12cd: 0x054f, 0x12ce: 0x0553, 0x12cf: 0x0557, 0x12d0: 0x055b, 0x12d1: 0x055f,
+       0x12d2: 0x0563, 0x12d3: 0x0567, 0x12d4: 0x056f, 0x12d5: 0x0577, 0x12d6: 0x057f, 0x12d7: 0x0583,
+       0x12d8: 0x0587, 0x12d9: 0x058b, 0x12da: 0x058f, 0x12db: 0x0593, 0x12dc: 0x0597, 0x12dd: 0x05a7,
+       0x12de: 0x4a78, 0x12df: 0x4a7e, 0x12e0: 0x03c3, 0x12e1: 0x0313, 0x12e2: 0x0317, 0x12e3: 0x4a3b,
+       0x12e4: 0x031b, 0x12e5: 0x4a41, 0x12e6: 0x4a47, 0x12e7: 0x031f, 0x12e8: 0x0323, 0x12e9: 0x0327,
+       0x12ea: 0x4a4d, 0x12eb: 0x4a53, 0x12ec: 0x4a59, 0x12ed: 0x4a5f, 0x12ee: 0x4a65, 0x12ef: 0x4a6b,
+       0x12f0: 0x0367, 0x12f1: 0x032b, 0x12f2: 0x032f, 0x12f3: 0x0333, 0x12f4: 0x037b, 0x12f5: 0x0337,
+       0x12f6: 0x033b, 0x12f7: 0x033f, 0x12f8: 0x0343, 0x12f9: 0x0347, 0x12fa: 0x034b, 0x12fb: 0x034f,
+       0x12fc: 0x0353, 0x12fd: 0x0357, 0x12fe: 0x035b,
+       // Block 0x4c, offset 0x1300
+       0x1302: 0x49bd, 0x1303: 0x49c3, 0x1304: 0x49c9, 0x1305: 0x49cf,
+       0x1306: 0x49d5, 0x1307: 0x49db, 0x130a: 0x49e1, 0x130b: 0x49e7,
+       0x130c: 0x49ed, 0x130d: 0x49f3, 0x130e: 0x49f9, 0x130f: 0x49ff,
+       0x1312: 0x4a05, 0x1313: 0x4a0b, 0x1314: 0x4a11, 0x1315: 0x4a17, 0x1316: 0x4a1d, 0x1317: 0x4a23,
+       0x131a: 0x4a29, 0x131b: 0x4a2f, 0x131c: 0x4a35,
+       0x1320: 0x00bf, 0x1321: 0x00c2, 0x1322: 0x00cb, 0x1323: 0x4264,
+       0x1324: 0x00c8, 0x1325: 0x00c5, 0x1326: 0x0447, 0x1328: 0x046b, 0x1329: 0x044b,
+       0x132a: 0x044f, 0x132b: 0x0453, 0x132c: 0x0457, 0x132d: 0x046f, 0x132e: 0x0473,
+       // Block 0x4d, offset 0x1340
+       0x1340: 0x0063, 0x1341: 0x0065, 0x1342: 0x0067, 0x1343: 0x0069, 0x1344: 0x006b, 0x1345: 0x006d,
+       0x1346: 0x006f, 0x1347: 0x0071, 0x1348: 0x0073, 0x1349: 0x0075, 0x134a: 0x0083, 0x134b: 0x0085,
+       0x134c: 0x0087, 0x134d: 0x0089, 0x134e: 0x008b, 0x134f: 0x008d, 0x1350: 0x008f, 0x1351: 0x0091,
+       0x1352: 0x0093, 0x1353: 0x0095, 0x1354: 0x0097, 0x1355: 0x0099, 0x1356: 0x009b, 0x1357: 0x009d,
+       0x1358: 0x009f, 0x1359: 0x00a1, 0x135a: 0x00a3, 0x135b: 0x00a5, 0x135c: 0x00a7, 0x135d: 0x00a9,
+       0x135e: 0x00ab, 0x135f: 0x00ad, 0x1360: 0x00af, 0x1361: 0x00b1, 0x1362: 0x00b3, 0x1363: 0x00b5,
+       0x1364: 0x00dd, 0x1365: 0x00f2, 0x1368: 0x0173, 0x1369: 0x0176,
+       0x136a: 0x0179, 0x136b: 0x017c, 0x136c: 0x017f, 0x136d: 0x0182, 0x136e: 0x0185, 0x136f: 0x0188,
+       0x1370: 0x018b, 0x1371: 0x018e, 0x1372: 0x0191, 0x1373: 0x0194, 0x1374: 0x0197, 0x1375: 0x019a,
+       0x1376: 0x019d, 0x1377: 0x01a0, 0x1378: 0x01a3, 0x1379: 0x0188, 0x137a: 0x01a6, 0x137b: 0x01a9,
+       0x137c: 0x01ac, 0x137d: 0x01af, 0x137e: 0x01b2, 0x137f: 0x01b5,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x01fd, 0x1381: 0x0200, 0x1382: 0x0203, 0x1383: 0x045b, 0x1384: 0x01c7, 0x1385: 0x01d0,
+       0x1386: 0x01d6, 0x1387: 0x01fa, 0x1388: 0x01eb, 0x1389: 0x01e8, 0x138a: 0x0206, 0x138b: 0x0209,
+       0x138e: 0x0021, 0x138f: 0x0023, 0x1390: 0x0025, 0x1391: 0x0027,
+       0x1392: 0x0029, 0x1393: 0x002b, 0x1394: 0x002d, 0x1395: 0x002f, 0x1396: 0x0031, 0x1397: 0x0033,
+       0x1398: 0x0021, 0x1399: 0x0023, 0x139a: 0x0025, 0x139b: 0x0027, 0x139c: 0x0029, 0x139d: 0x002b,
+       0x139e: 0x002d, 0x139f: 0x002f, 0x13a0: 0x0031, 0x13a1: 0x0033, 0x13a2: 0x0021, 0x13a3: 0x0023,
+       0x13a4: 0x0025, 0x13a5: 0x0027, 0x13a6: 0x0029, 0x13a7: 0x002b, 0x13a8: 0x002d, 0x13a9: 0x002f,
+       0x13aa: 0x0031, 0x13ab: 0x0033, 0x13ac: 0x0021, 0x13ad: 0x0023, 0x13ae: 0x0025, 0x13af: 0x0027,
+       0x13b0: 0x0029, 0x13b1: 0x002b, 0x13b2: 0x002d, 0x13b3: 0x002f, 0x13b4: 0x0031, 0x13b5: 0x0033,
+       0x13b6: 0x0021, 0x13b7: 0x0023, 0x13b8: 0x0025, 0x13b9: 0x0027, 0x13ba: 0x0029, 0x13bb: 0x002b,
+       0x13bc: 0x002d, 0x13bd: 0x002f, 0x13be: 0x0031, 0x13bf: 0x0033,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x0239, 0x13c1: 0x023c, 0x13c2: 0x0248, 0x13c3: 0x0251, 0x13c5: 0x028a,
+       0x13c6: 0x025a, 0x13c7: 0x024b, 0x13c8: 0x0269, 0x13c9: 0x0290, 0x13ca: 0x027b, 0x13cb: 0x027e,
+       0x13cc: 0x0281, 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d0: 0x0275, 0x13d1: 0x0263,
+       0x13d2: 0x0278, 0x13d3: 0x0257, 0x13d4: 0x0260, 0x13d5: 0x0242, 0x13d6: 0x0245, 0x13d7: 0x024e,
+       0x13d8: 0x0254, 0x13d9: 0x0266, 0x13da: 0x026c, 0x13db: 0x0272, 0x13dc: 0x0293, 0x13dd: 0x02e4,
+       0x13de: 0x02cc, 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,
+       0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e9: 0x0290,
+       0x13ea: 0x027b, 0x13eb: 0x027e, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,
+       0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,
+       0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fb: 0x0272,
+       // Block 0x50, offset 0x1400
+       0x1402: 0x0248,
+       0x1407: 0x024b, 0x1409: 0x0290, 0x140b: 0x027e,
+       0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1411: 0x0263,
+       0x1412: 0x0278, 0x1414: 0x0260, 0x1417: 0x024e,
+       0x1419: 0x0266, 0x141b: 0x0272, 0x141d: 0x02e4,
+       0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248,
+       0x1424: 0x0287, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,
+       0x142a: 0x027b, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,
+       0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242,
+       0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,
+       0x143c: 0x0293, 0x143e: 0x02cc,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x0239, 0x1441: 0x023c, 0x1442: 0x0248, 0x1443: 0x0251, 0x1444: 0x0287, 0x1445: 0x028a,
+       0x1446: 0x025a, 0x1447: 0x024b, 0x1448: 0x0269, 0x1449: 0x0290, 0x144b: 0x027e,
+       0x144c: 0x0281, 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1450: 0x0275, 0x1451: 0x0263,
+       0x1452: 0x0278, 0x1453: 0x0257, 0x1454: 0x0260, 0x1455: 0x0242, 0x1456: 0x0245, 0x1457: 0x024e,
+       0x1458: 0x0254, 0x1459: 0x0266, 0x145a: 0x026c, 0x145b: 0x0272,
+       0x1461: 0x023c, 0x1462: 0x0248, 0x1463: 0x0251,
+       0x1465: 0x028a, 0x1466: 0x025a, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290,
+       0x146b: 0x027e, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f,
+       0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1473: 0x0257, 0x1474: 0x0260, 0x1475: 0x0242,
+       0x1476: 0x0245, 0x1477: 0x024e, 0x1478: 0x0254, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x1879, 0x1481: 0x1876, 0x1482: 0x187c, 0x1483: 0x18a0, 0x1484: 0x18c4, 0x1485: 0x18e8,
+       0x1486: 0x190c, 0x1487: 0x1915, 0x1488: 0x191b, 0x1489: 0x1921, 0x148a: 0x1927,
+       0x1490: 0x1a8c, 0x1491: 0x1a90,
+       0x1492: 0x1a94, 0x1493: 0x1a98, 0x1494: 0x1a9c, 0x1495: 0x1aa0, 0x1496: 0x1aa4, 0x1497: 0x1aa8,
+       0x1498: 0x1aac, 0x1499: 0x1ab0, 0x149a: 0x1ab4, 0x149b: 0x1ab8, 0x149c: 0x1abc, 0x149d: 0x1ac0,
+       0x149e: 0x1ac4, 0x149f: 0x1ac8, 0x14a0: 0x1acc, 0x14a1: 0x1ad0, 0x14a2: 0x1ad4, 0x14a3: 0x1ad8,
+       0x14a4: 0x1adc, 0x14a5: 0x1ae0, 0x14a6: 0x1ae4, 0x14a7: 0x1ae8, 0x14a8: 0x1aec, 0x14a9: 0x1af0,
+       0x14aa: 0x271e, 0x14ab: 0x0047, 0x14ac: 0x0065, 0x14ad: 0x193c, 0x14ae: 0x19b1,
+       0x14b0: 0x0043, 0x14b1: 0x0045, 0x14b2: 0x0047, 0x14b3: 0x0049, 0x14b4: 0x004b, 0x14b5: 0x004d,
+       0x14b6: 0x004f, 0x14b7: 0x0051, 0x14b8: 0x0053, 0x14b9: 0x0055, 0x14ba: 0x0057, 0x14bb: 0x0059,
+       0x14bc: 0x005b, 0x14bd: 0x005d, 0x14be: 0x005f, 0x14bf: 0x0061,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x26ad, 0x14c1: 0x26c2, 0x14c2: 0x0503,
+       0x14d0: 0x0c0f, 0x14d1: 0x0a47,
+       0x14d2: 0x08d3, 0x14d3: 0x45c4, 0x14d4: 0x071b, 0x14d5: 0x09ef, 0x14d6: 0x132f, 0x14d7: 0x09ff,
+       0x14d8: 0x0727, 0x14d9: 0x0cd7, 0x14da: 0x0eaf, 0x14db: 0x0caf, 0x14dc: 0x0827, 0x14dd: 0x0b6b,
+       0x14de: 0x07bf, 0x14df: 0x0cb7, 0x14e0: 0x0813, 0x14e1: 0x1117, 0x14e2: 0x0f83, 0x14e3: 0x138b,
+       0x14e4: 0x09d3, 0x14e5: 0x090b, 0x14e6: 0x0e63, 0x14e7: 0x0c1b, 0x14e8: 0x0c47, 0x14e9: 0x06bf,
+       0x14ea: 0x06cb, 0x14eb: 0x140b, 0x14ec: 0x0adb, 0x14ed: 0x06e7, 0x14ee: 0x08ef, 0x14ef: 0x0c3b,
+       0x14f0: 0x13b3, 0x14f1: 0x0c13, 0x14f2: 0x106f, 0x14f3: 0x10ab, 0x14f4: 0x08f7, 0x14f5: 0x0e43,
+       0x14f6: 0x0d0b, 0x14f7: 0x0d07, 0x14f8: 0x0f97, 0x14f9: 0x082b, 0x14fa: 0x0957, 0x14fb: 0x1443,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x06fb, 0x1501: 0x06f3, 0x1502: 0x0703, 0x1503: 0x1647, 0x1504: 0x0747, 0x1505: 0x0757,
+       0x1506: 0x075b, 0x1507: 0x0763, 0x1508: 0x076b, 0x1509: 0x076f, 0x150a: 0x077b, 0x150b: 0x0773,
+       0x150c: 0x05b3, 0x150d: 0x165b, 0x150e: 0x078f, 0x150f: 0x0793, 0x1510: 0x0797, 0x1511: 0x07b3,
+       0x1512: 0x164c, 0x1513: 0x05b7, 0x1514: 0x079f, 0x1515: 0x07bf, 0x1516: 0x1656, 0x1517: 0x07cf,
+       0x1518: 0x07d7, 0x1519: 0x0737, 0x151a: 0x07df, 0x151b: 0x07e3, 0x151c: 0x1831, 0x151d: 0x07ff,
+       0x151e: 0x0807, 0x151f: 0x05bf, 0x1520: 0x081f, 0x1521: 0x0823, 0x1522: 0x082b, 0x1523: 0x082f,
+       0x1524: 0x05c3, 0x1525: 0x0847, 0x1526: 0x084b, 0x1527: 0x0857, 0x1528: 0x0863, 0x1529: 0x0867,
+       0x152a: 0x086b, 0x152b: 0x0873, 0x152c: 0x0893, 0x152d: 0x0897, 0x152e: 0x089f, 0x152f: 0x08af,
+       0x1530: 0x08b7, 0x1531: 0x08bb, 0x1532: 0x08bb, 0x1533: 0x08bb, 0x1534: 0x166a, 0x1535: 0x0e93,
+       0x1536: 0x08cf, 0x1537: 0x08d7, 0x1538: 0x166f, 0x1539: 0x08e3, 0x153a: 0x08eb, 0x153b: 0x08f3,
+       0x153c: 0x091b, 0x153d: 0x0907, 0x153e: 0x0913, 0x153f: 0x0917,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x091f, 0x1541: 0x0927, 0x1542: 0x092b, 0x1543: 0x0933, 0x1544: 0x093b, 0x1545: 0x093f,
+       0x1546: 0x093f, 0x1547: 0x0947, 0x1548: 0x094f, 0x1549: 0x0953, 0x154a: 0x095f, 0x154b: 0x0983,
+       0x154c: 0x0967, 0x154d: 0x0987, 0x154e: 0x096b, 0x154f: 0x0973, 0x1550: 0x080b, 0x1551: 0x09cf,
+       0x1552: 0x0997, 0x1553: 0x099b, 0x1554: 0x099f, 0x1555: 0x0993, 0x1556: 0x09a7, 0x1557: 0x09a3,
+       0x1558: 0x09bb, 0x1559: 0x1674, 0x155a: 0x09d7, 0x155b: 0x09db, 0x155c: 0x09e3, 0x155d: 0x09ef,
+       0x155e: 0x09f7, 0x155f: 0x0a13, 0x1560: 0x1679, 0x1561: 0x167e, 0x1562: 0x0a1f, 0x1563: 0x0a23,
+       0x1564: 0x0a27, 0x1565: 0x0a1b, 0x1566: 0x0a2f, 0x1567: 0x05c7, 0x1568: 0x05cb, 0x1569: 0x0a37,
+       0x156a: 0x0a3f, 0x156b: 0x0a3f, 0x156c: 0x1683, 0x156d: 0x0a5b, 0x156e: 0x0a5f, 0x156f: 0x0a63,
+       0x1570: 0x0a6b, 0x1571: 0x1688, 0x1572: 0x0a73, 0x1573: 0x0a77, 0x1574: 0x0b4f, 0x1575: 0x0a7f,
+       0x1576: 0x05cf, 0x1577: 0x0a8b, 0x1578: 0x0a9b, 0x1579: 0x0aa7, 0x157a: 0x0aa3, 0x157b: 0x1692,
+       0x157c: 0x0aaf, 0x157d: 0x1697, 0x157e: 0x0abb, 0x157f: 0x0ab7,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x0abf, 0x1581: 0x0acf, 0x1582: 0x0ad3, 0x1583: 0x05d3, 0x1584: 0x0ae3, 0x1585: 0x0aeb,
+       0x1586: 0x0aef, 0x1587: 0x0af3, 0x1588: 0x05d7, 0x1589: 0x169c, 0x158a: 0x05db, 0x158b: 0x0b0f,
+       0x158c: 0x0b13, 0x158d: 0x0b17, 0x158e: 0x0b1f, 0x158f: 0x1863, 0x1590: 0x0b37, 0x1591: 0x16a6,
+       0x1592: 0x16a6, 0x1593: 0x11d7, 0x1594: 0x0b47, 0x1595: 0x0b47, 0x1596: 0x05df, 0x1597: 0x16c9,
+       0x1598: 0x179b, 0x1599: 0x0b57, 0x159a: 0x0b5f, 0x159b: 0x05e3, 0x159c: 0x0b73, 0x159d: 0x0b83,
+       0x159e: 0x0b87, 0x159f: 0x0b8f, 0x15a0: 0x0b9f, 0x15a1: 0x05eb, 0x15a2: 0x05e7, 0x15a3: 0x0ba3,
+       0x15a4: 0x16ab, 0x15a5: 0x0ba7, 0x15a6: 0x0bbb, 0x15a7: 0x0bbf, 0x15a8: 0x0bc3, 0x15a9: 0x0bbf,
+       0x15aa: 0x0bcf, 0x15ab: 0x0bd3, 0x15ac: 0x0be3, 0x15ad: 0x0bdb, 0x15ae: 0x0bdf, 0x15af: 0x0be7,
+       0x15b0: 0x0beb, 0x15b1: 0x0bef, 0x15b2: 0x0bfb, 0x15b3: 0x0bff, 0x15b4: 0x0c17, 0x15b5: 0x0c1f,
+       0x15b6: 0x0c2f, 0x15b7: 0x0c43, 0x15b8: 0x16ba, 0x15b9: 0x0c3f, 0x15ba: 0x0c33, 0x15bb: 0x0c4b,
+       0x15bc: 0x0c53, 0x15bd: 0x0c67, 0x15be: 0x16bf, 0x15bf: 0x0c6f,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x0c63, 0x15c1: 0x0c5b, 0x15c2: 0x05ef, 0x15c3: 0x0c77, 0x15c4: 0x0c7f, 0x15c5: 0x0c87,
+       0x15c6: 0x0c7b, 0x15c7: 0x05f3, 0x15c8: 0x0c97, 0x15c9: 0x0c9f, 0x15ca: 0x16c4, 0x15cb: 0x0ccb,
+       0x15cc: 0x0cff, 0x15cd: 0x0cdb, 0x15ce: 0x05ff, 0x15cf: 0x0ce7, 0x15d0: 0x05fb, 0x15d1: 0x05f7,
+       0x15d2: 0x07c3, 0x15d3: 0x07c7, 0x15d4: 0x0d03, 0x15d5: 0x0ceb, 0x15d6: 0x11ab, 0x15d7: 0x0663,
+       0x15d8: 0x0d0f, 0x15d9: 0x0d13, 0x15da: 0x0d17, 0x15db: 0x0d2b, 0x15dc: 0x0d23, 0x15dd: 0x16dd,
+       0x15de: 0x0603, 0x15df: 0x0d3f, 0x15e0: 0x0d33, 0x15e1: 0x0d4f, 0x15e2: 0x0d57, 0x15e3: 0x16e7,
+       0x15e4: 0x0d5b, 0x15e5: 0x0d47, 0x15e6: 0x0d63, 0x15e7: 0x0607, 0x15e8: 0x0d67, 0x15e9: 0x0d6b,
+       0x15ea: 0x0d6f, 0x15eb: 0x0d7b, 0x15ec: 0x16ec, 0x15ed: 0x0d83, 0x15ee: 0x060b, 0x15ef: 0x0d8f,
+       0x15f0: 0x16f1, 0x15f1: 0x0d93, 0x15f2: 0x060f, 0x15f3: 0x0d9f, 0x15f4: 0x0dab, 0x15f5: 0x0db7,
+       0x15f6: 0x0dbb, 0x15f7: 0x16f6, 0x15f8: 0x168d, 0x15f9: 0x16fb, 0x15fa: 0x0ddb, 0x15fb: 0x1700,
+       0x15fc: 0x0de7, 0x15fd: 0x0def, 0x15fe: 0x0ddf, 0x15ff: 0x0dfb,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x0e0b, 0x1601: 0x0e1b, 0x1602: 0x0e0f, 0x1603: 0x0e13, 0x1604: 0x0e1f, 0x1605: 0x0e23,
+       0x1606: 0x1705, 0x1607: 0x0e07, 0x1608: 0x0e3b, 0x1609: 0x0e3f, 0x160a: 0x0613, 0x160b: 0x0e53,
+       0x160c: 0x0e4f, 0x160d: 0x170a, 0x160e: 0x0e33, 0x160f: 0x0e6f, 0x1610: 0x170f, 0x1611: 0x1714,
+       0x1612: 0x0e73, 0x1613: 0x0e87, 0x1614: 0x0e83, 0x1615: 0x0e7f, 0x1616: 0x0617, 0x1617: 0x0e8b,
+       0x1618: 0x0e9b, 0x1619: 0x0e97, 0x161a: 0x0ea3, 0x161b: 0x1651, 0x161c: 0x0eb3, 0x161d: 0x1719,
+       0x161e: 0x0ebf, 0x161f: 0x1723, 0x1620: 0x0ed3, 0x1621: 0x0edf, 0x1622: 0x0ef3, 0x1623: 0x1728,
+       0x1624: 0x0f07, 0x1625: 0x0f0b, 0x1626: 0x172d, 0x1627: 0x1732, 0x1628: 0x0f27, 0x1629: 0x0f37,
+       0x162a: 0x061b, 0x162b: 0x0f3b, 0x162c: 0x061f, 0x162d: 0x061f, 0x162e: 0x0f53, 0x162f: 0x0f57,
+       0x1630: 0x0f5f, 0x1631: 0x0f63, 0x1632: 0x0f6f, 0x1633: 0x0623, 0x1634: 0x0f87, 0x1635: 0x1737,
+       0x1636: 0x0fa3, 0x1637: 0x173c, 0x1638: 0x0faf, 0x1639: 0x16a1, 0x163a: 0x0fbf, 0x163b: 0x1741,
+       0x163c: 0x1746, 0x163d: 0x174b, 0x163e: 0x0627, 0x163f: 0x062b,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x0ff7, 0x1641: 0x1755, 0x1642: 0x1750, 0x1643: 0x175a, 0x1644: 0x175f, 0x1645: 0x0fff,
+       0x1646: 0x1003, 0x1647: 0x1003, 0x1648: 0x100b, 0x1649: 0x0633, 0x164a: 0x100f, 0x164b: 0x0637,
+       0x164c: 0x063b, 0x164d: 0x1769, 0x164e: 0x1023, 0x164f: 0x102b, 0x1650: 0x1037, 0x1651: 0x063f,
+       0x1652: 0x176e, 0x1653: 0x105b, 0x1654: 0x1773, 0x1655: 0x1778, 0x1656: 0x107b, 0x1657: 0x1093,
+       0x1658: 0x0643, 0x1659: 0x109b, 0x165a: 0x109f, 0x165b: 0x10a3, 0x165c: 0x177d, 0x165d: 0x1782,
+       0x165e: 0x1782, 0x165f: 0x10bb, 0x1660: 0x0647, 0x1661: 0x1787, 0x1662: 0x10cf, 0x1663: 0x10d3,
+       0x1664: 0x064b, 0x1665: 0x178c, 0x1666: 0x10ef, 0x1667: 0x064f, 0x1668: 0x10ff, 0x1669: 0x10f7,
+       0x166a: 0x1107, 0x166b: 0x1796, 0x166c: 0x111f, 0x166d: 0x0653, 0x166e: 0x112b, 0x166f: 0x1133,
+       0x1670: 0x1143, 0x1671: 0x0657, 0x1672: 0x17a0, 0x1673: 0x17a5, 0x1674: 0x065b, 0x1675: 0x17aa,
+       0x1676: 0x115b, 0x1677: 0x17af, 0x1678: 0x1167, 0x1679: 0x1173, 0x167a: 0x117b, 0x167b: 0x17b4,
+       0x167c: 0x17b9, 0x167d: 0x118f, 0x167e: 0x17be, 0x167f: 0x1197,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x16ce, 0x1681: 0x065f, 0x1682: 0x11af, 0x1683: 0x11b3, 0x1684: 0x0667, 0x1685: 0x11b7,
+       0x1686: 0x0a33, 0x1687: 0x17c3, 0x1688: 0x17c8, 0x1689: 0x16d3, 0x168a: 0x16d8, 0x168b: 0x11d7,
+       0x168c: 0x11db, 0x168d: 0x13f3, 0x168e: 0x066b, 0x168f: 0x1207, 0x1690: 0x1203, 0x1691: 0x120b,
+       0x1692: 0x083f, 0x1693: 0x120f, 0x1694: 0x1213, 0x1695: 0x1217, 0x1696: 0x121f, 0x1697: 0x17cd,
+       0x1698: 0x121b, 0x1699: 0x1223, 0x169a: 0x1237, 0x169b: 0x123b, 0x169c: 0x1227, 0x169d: 0x123f,
+       0x169e: 0x1253, 0x169f: 0x1267, 0x16a0: 0x1233, 0x16a1: 0x1247, 0x16a2: 0x124b, 0x16a3: 0x124f,
+       0x16a4: 0x17d2, 0x16a5: 0x17dc, 0x16a6: 0x17d7, 0x16a7: 0x066f, 0x16a8: 0x126f, 0x16a9: 0x1273,
+       0x16aa: 0x127b, 0x16ab: 0x17f0, 0x16ac: 0x127f, 0x16ad: 0x17e1, 0x16ae: 0x0673, 0x16af: 0x0677,
+       0x16b0: 0x17e6, 0x16b1: 0x17eb, 0x16b2: 0x067b, 0x16b3: 0x129f, 0x16b4: 0x12a3, 0x16b5: 0x12a7,
+       0x16b6: 0x12ab, 0x16b7: 0x12b7, 0x16b8: 0x12b3, 0x16b9: 0x12bf, 0x16ba: 0x12bb, 0x16bb: 0x12cb,
+       0x16bc: 0x12c3, 0x16bd: 0x12c7, 0x16be: 0x12cf, 0x16bf: 0x067f,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x12d7, 0x16c1: 0x12db, 0x16c2: 0x0683, 0x16c3: 0x12eb, 0x16c4: 0x12ef, 0x16c5: 0x17f5,
+       0x16c6: 0x12fb, 0x16c7: 0x12ff, 0x16c8: 0x0687, 0x16c9: 0x130b, 0x16ca: 0x05bb, 0x16cb: 0x17fa,
+       0x16cc: 0x17ff, 0x16cd: 0x068b, 0x16ce: 0x068f, 0x16cf: 0x1337, 0x16d0: 0x134f, 0x16d1: 0x136b,
+       0x16d2: 0x137b, 0x16d3: 0x1804, 0x16d4: 0x138f, 0x16d5: 0x1393, 0x16d6: 0x13ab, 0x16d7: 0x13b7,
+       0x16d8: 0x180e, 0x16d9: 0x1660, 0x16da: 0x13c3, 0x16db: 0x13bf, 0x16dc: 0x13cb, 0x16dd: 0x1665,
+       0x16de: 0x13d7, 0x16df: 0x13e3, 0x16e0: 0x1813, 0x16e1: 0x1818, 0x16e2: 0x1423, 0x16e3: 0x142f,
+       0x16e4: 0x1437, 0x16e5: 0x181d, 0x16e6: 0x143b, 0x16e7: 0x1467, 0x16e8: 0x1473, 0x16e9: 0x1477,
+       0x16ea: 0x146f, 0x16eb: 0x1483, 0x16ec: 0x1487, 0x16ed: 0x1822, 0x16ee: 0x1493, 0x16ef: 0x0693,
+       0x16f0: 0x149b, 0x16f1: 0x1827, 0x16f2: 0x0697, 0x16f3: 0x14d3, 0x16f4: 0x0ac3, 0x16f5: 0x14eb,
+       0x16f6: 0x182c, 0x16f7: 0x1836, 0x16f8: 0x069b, 0x16f9: 0x069f, 0x16fa: 0x1513, 0x16fb: 0x183b,
+       0x16fc: 0x06a3, 0x16fd: 0x1840, 0x16fe: 0x152b, 0x16ff: 0x152b,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x1533, 0x1701: 0x1845, 0x1702: 0x154b, 0x1703: 0x06a7, 0x1704: 0x155b, 0x1705: 0x1567,
+       0x1706: 0x156f, 0x1707: 0x1577, 0x1708: 0x06ab, 0x1709: 0x184a, 0x170a: 0x158b, 0x170b: 0x15a7,
+       0x170c: 0x15b3, 0x170d: 0x06af, 0x170e: 0x06b3, 0x170f: 0x15b7, 0x1710: 0x184f, 0x1711: 0x06b7,
+       0x1712: 0x1854, 0x1713: 0x1859, 0x1714: 0x185e, 0x1715: 0x15db, 0x1716: 0x06bb, 0x1717: 0x15ef,
+       0x1718: 0x15f7, 0x1719: 0x15fb, 0x171a: 0x1603, 0x171b: 0x160b, 0x171c: 0x1613, 0x171d: 0x1868,
+}
+
+// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfkcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x5b, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5c, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x5d, 0xcb: 0x5e, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
+       0xd0: 0x0a, 0xd1: 0x5f, 0xd2: 0x60, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x61,
+       0xd8: 0x62, 0xd9: 0x0d, 0xdb: 0x63, 0xdc: 0x64, 0xdd: 0x65, 0xdf: 0x66,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x67, 0x121: 0x68, 0x123: 0x69, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d,
+       0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74,
+       0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a,
+       0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82,
+       // Block 0x5, offset 0x140
+       0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89,
+       0x14d: 0x8a,
+       0x15c: 0x8b, 0x15f: 0x8c,
+       0x162: 0x8d, 0x164: 0x8e,
+       0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0e, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94,
+       0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x11,
+       0x178: 0x12, 0x179: 0x13, 0x17a: 0x14, 0x17b: 0x15, 0x17c: 0x16, 0x17d: 0x17, 0x17e: 0x18, 0x17f: 0x19,
+       // Block 0x6, offset 0x180
+       0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1a, 0x185: 0x1b, 0x186: 0x9c, 0x187: 0x9d,
+       0x188: 0x9e, 0x189: 0x1c, 0x18a: 0x1d, 0x18b: 0x9f, 0x18c: 0xa0,
+       0x191: 0x1e, 0x192: 0x1f, 0x193: 0xa1,
+       0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,
+       0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,
+       0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x20, 0x1bd: 0x21, 0x1be: 0x22, 0x1bf: 0xab,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0xac, 0x1c1: 0x23, 0x1c2: 0x24, 0x1c3: 0x25, 0x1c4: 0xad, 0x1c5: 0x26, 0x1c6: 0x27,
+       0x1c8: 0x28, 0x1c9: 0x29, 0x1ca: 0x2a, 0x1cb: 0x2b, 0x1cc: 0x2c, 0x1cd: 0x2d, 0x1ce: 0x2e, 0x1cf: 0x2f,
+       // Block 0x8, offset 0x200
+       0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,
+       0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,
+       0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,
+       0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,
+       0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,
+       // Block 0x9, offset 0x240
+       0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,
+       0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,
+       0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,
+       0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,
+       0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,
+       0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,
+       0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,
+       0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,
+       // Block 0xa, offset 0x280
+       0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,
+       0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,
+       0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,
+       0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,
+       0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,
+       0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,
+       0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,
+       0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,
+       0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,
+       0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,
+       0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,
+       // Block 0xc, offset 0x300
+       0x324: 0x30, 0x325: 0x31, 0x326: 0x32, 0x327: 0x33,
+       0x328: 0x34, 0x329: 0x35, 0x32a: 0x36, 0x32b: 0x37, 0x32c: 0x38, 0x32d: 0x39, 0x32e: 0x3a, 0x32f: 0x3b,
+       0x330: 0x3c, 0x331: 0x3d, 0x332: 0x3e, 0x333: 0x3f, 0x334: 0x40, 0x335: 0x41, 0x336: 0x42, 0x337: 0x43,
+       0x338: 0x44, 0x339: 0x45, 0x33a: 0x46, 0x33b: 0x47, 0x33c: 0xc5, 0x33d: 0x48, 0x33e: 0x49, 0x33f: 0x4a,
+       // Block 0xd, offset 0x340
+       0x347: 0xc6,
+       0x34b: 0xc7, 0x34d: 0xc8,
+       0x368: 0xc9, 0x36b: 0xca,
+       // Block 0xe, offset 0x380
+       0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,
+       0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6c, 0x38d: 0xd1,
+       0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,
+       0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,
+       0x3a8: 0xda, 0x3a9: 0xdb, 0x3aa: 0xdc,
+       0x3b0: 0xd7, 0x3b5: 0xdd,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xde, 0x3ec: 0xdf,
+       // Block 0x10, offset 0x400
+       0x432: 0xe0,
+       // Block 0x11, offset 0x440
+       0x445: 0xe1, 0x446: 0xe2, 0x447: 0xe3,
+       0x449: 0xe4,
+       0x450: 0xe5, 0x451: 0xe6, 0x452: 0xe7, 0x453: 0xe8, 0x454: 0xe9, 0x455: 0xea, 0x456: 0xeb, 0x457: 0xec,
+       0x458: 0xed, 0x459: 0xee, 0x45a: 0x4b, 0x45b: 0xef, 0x45c: 0xf0, 0x45d: 0xf1, 0x45e: 0xf2, 0x45f: 0x4c,
+       // Block 0x12, offset 0x480
+       0x480: 0xf3,
+       0x4a3: 0xf4, 0x4a5: 0xf5,
+       0x4b8: 0x4d, 0x4b9: 0x4e, 0x4ba: 0x4f,
+       // Block 0x13, offset 0x4c0
+       0x4c4: 0x50, 0x4c5: 0xf6, 0x4c6: 0xf7,
+       0x4c8: 0x51, 0x4c9: 0xf8,
+       // Block 0x14, offset 0x500
+       0x520: 0x52, 0x521: 0x53, 0x522: 0x54, 0x523: 0x55, 0x524: 0x56, 0x525: 0x57, 0x526: 0x58, 0x527: 0x59,
+       0x528: 0x5a,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfkcSparseOffset: 158 entries, 316 bytes
+var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd5, 0xdc, 0xe4, 0xe8, 0xea, 0xed, 0xf1, 0xf7, 0x108, 0x114, 0x116, 0x11c, 0x11e, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12a, 0x12d, 0x130, 0x132, 0x135, 0x138, 0x13c, 0x141, 0x14a, 0x14c, 0x14f, 0x151, 0x15c, 0x167, 0x175, 0x183, 0x193, 0x1a1, 0x1a8, 0x1ae, 0x1bd, 0x1c1, 0x1c3, 0x1c7, 0x1c9, 0x1cc, 0x1ce, 0x1d1, 0x1d3, 0x1d6, 0x1d8, 0x1da, 0x1dc, 0x1e8, 0x1f2, 0x1fc, 0x1ff, 0x203, 0x205, 0x207, 0x209, 0x20b, 0x20e, 0x210, 0x212, 0x214, 0x216, 0x21c, 0x21f, 0x223, 0x225, 0x22c, 0x232, 0x238, 0x240, 0x246, 0x24c, 0x252, 0x256, 0x258, 0x25a, 0x25c, 0x25e, 0x264, 0x267, 0x26a, 0x272, 0x279, 0x27c, 0x27f, 0x281, 0x289, 0x28c, 0x293, 0x296, 0x29c, 0x29e, 0x2a0, 0x2a3, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2c1, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d8, 0x2e4, 0x2e9, 0x2f2, 0x2f8, 0x2fd, 0x301, 0x306, 0x30a, 0x31a, 0x328, 0x336, 0x344, 0x34a, 0x34c, 0x34f, 0x359, 0x35b}
+
+// nfkcSparseValues: 869 entries, 3476 bytes
+var nfkcSparseValues = [869]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x0001, lo: 0xa0, hi: 0xa0},
+       {value: 0x4278, lo: 0xa8, hi: 0xa8},
+       {value: 0x0083, lo: 0xaa, hi: 0xaa},
+       {value: 0x4264, lo: 0xaf, hi: 0xaf},
+       {value: 0x0025, lo: 0xb2, hi: 0xb3},
+       {value: 0x425a, lo: 0xb4, hi: 0xb4},
+       {value: 0x01dc, lo: 0xb5, hi: 0xb5},
+       {value: 0x4291, lo: 0xb8, hi: 0xb8},
+       {value: 0x0023, lo: 0xb9, hi: 0xb9},
+       {value: 0x009f, lo: 0xba, hi: 0xba},
+       {value: 0x221c, lo: 0xbc, hi: 0xbc},
+       {value: 0x2210, lo: 0xbd, hi: 0xbd},
+       {value: 0x22b2, lo: 0xbe, hi: 0xbe},
+       // Block 0x1, offset 0xe
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x12
+       {value: 0x0003, lo: 0x08},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x0091, lo: 0xb0, hi: 0xb0},
+       {value: 0x0119, lo: 0xb1, hi: 0xb1},
+       {value: 0x0095, lo: 0xb2, hi: 0xb2},
+       {value: 0x00a5, lo: 0xb3, hi: 0xb3},
+       {value: 0x0143, lo: 0xb4, hi: 0xb6},
+       {value: 0x00af, lo: 0xb7, hi: 0xb7},
+       {value: 0x00b3, lo: 0xb8, hi: 0xb8},
+       // Block 0x3, offset 0x1b
+       {value: 0x000a, lo: 0x09},
+       {value: 0x426e, lo: 0x98, hi: 0x98},
+       {value: 0x4273, lo: 0x99, hi: 0x9a},
+       {value: 0x4296, lo: 0x9b, hi: 0x9b},
+       {value: 0x425f, lo: 0x9c, hi: 0x9c},
+       {value: 0x4282, lo: 0x9d, hi: 0x9d},
+       {value: 0x0113, lo: 0xa0, hi: 0xa0},
+       {value: 0x0099, lo: 0xa1, hi: 0xa1},
+       {value: 0x00a7, lo: 0xa2, hi: 0xa3},
+       {value: 0x0167, lo: 0xa4, hi: 0xa4},
+       // Block 0x4, offset 0x25
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x5, offset 0x35
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x6, offset 0x37
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x7, offset 0x3c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x8, offset 0x47
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0x9, offset 0x56
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xa, offset 0x63
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xb, offset 0x6b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       // Block 0xc, offset 0x6f
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xd, offset 0x74
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xe, offset 0x76
+       {value: 0x0000, lo: 0x10},
+       {value: 0x8132, lo: 0x94, hi: 0xa1},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8132, lo: 0xaa, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xaf},
+       {value: 0x8116, lo: 0xb0, hi: 0xb0},
+       {value: 0x8117, lo: 0xb1, hi: 0xb1},
+       {value: 0x8118, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb5},
+       {value: 0x812d, lo: 0xb6, hi: 0xb6},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x812d, lo: 0xb9, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbf},
+       // Block 0xf, offset 0x87
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0x10, offset 0x8f
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x11, offset 0x96
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x12, offset 0x99
+       {value: 0x0008, lo: 0x06},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       // Block 0x13, offset 0xa0
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x14, offset 0xa4
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x15, offset 0xa8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x16, offset 0xaa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x17, offset 0xac
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x18, offset 0xb5
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x19, offset 0xb9
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1a, offset 0xc0
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1b, offset 0xc5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1c, offset 0xc8
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1d, offset 0xd2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1e, offset 0xd5
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1f, offset 0xdc
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x20, offset 0xe4
+       {value: 0x0000, lo: 0x03},
+       {value: 0x2621, lo: 0xb3, hi: 0xb3},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x21, offset 0xe8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x22, offset 0xea
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2636, lo: 0xb3, hi: 0xb3},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x23, offset 0xed
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       {value: 0x2628, lo: 0x9c, hi: 0x9c},
+       {value: 0x262f, lo: 0x9d, hi: 0x9d},
+       // Block 0x24, offset 0xf1
+       {value: 0x0000, lo: 0x05},
+       {value: 0x030b, lo: 0x8c, hi: 0x8c},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x25, offset 0xf7
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x45f4, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x45ff, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x26, offset 0x108
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x27, offset 0x114
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x28, offset 0x116
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x29, offset 0x11c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x2a, offset 0x11e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x030f, lo: 0xbc, hi: 0xbc},
+       // Block 0x2b, offset 0x120
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2c, offset 0x122
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2d, offset 0x124
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2e, offset 0x126
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2f, offset 0x128
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x30, offset 0x12a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x31, offset 0x12d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x32, offset 0x130
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x33, offset 0x132
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x34, offset 0x135
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x35, offset 0x138
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x36, offset 0x13c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x37, offset 0x141
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x38, offset 0x14a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x39, offset 0x14c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x3a, offset 0x14f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3b, offset 0x151
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3c, offset 0x15c
+       {value: 0x0002, lo: 0x0a},
+       {value: 0x0043, lo: 0xac, hi: 0xac},
+       {value: 0x00d1, lo: 0xad, hi: 0xad},
+       {value: 0x0045, lo: 0xae, hi: 0xae},
+       {value: 0x0049, lo: 0xb0, hi: 0xb1},
+       {value: 0x00e6, lo: 0xb2, hi: 0xb2},
+       {value: 0x004f, lo: 0xb3, hi: 0xba},
+       {value: 0x005f, lo: 0xbc, hi: 0xbc},
+       {value: 0x00ef, lo: 0xbd, hi: 0xbd},
+       {value: 0x0061, lo: 0xbe, hi: 0xbe},
+       {value: 0x0065, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x167
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0001, lo: 0x80, hi: 0x8a},
+       {value: 0x043b, lo: 0x91, hi: 0x91},
+       {value: 0x429b, lo: 0x97, hi: 0x97},
+       {value: 0x001d, lo: 0xa4, hi: 0xa4},
+       {value: 0x1873, lo: 0xa5, hi: 0xa5},
+       {value: 0x1b5c, lo: 0xa6, hi: 0xa6},
+       {value: 0x0001, lo: 0xaf, hi: 0xaf},
+       {value: 0x2691, lo: 0xb3, hi: 0xb3},
+       {value: 0x27fe, lo: 0xb4, hi: 0xb4},
+       {value: 0x2698, lo: 0xb6, hi: 0xb6},
+       {value: 0x2808, lo: 0xb7, hi: 0xb7},
+       {value: 0x186d, lo: 0xbc, hi: 0xbc},
+       {value: 0x4269, lo: 0xbe, hi: 0xbe},
+       // Block 0x3e, offset 0x175
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x1933, lo: 0x87, hi: 0x87},
+       {value: 0x1930, lo: 0x88, hi: 0x88},
+       {value: 0x1870, lo: 0x89, hi: 0x89},
+       {value: 0x298e, lo: 0x97, hi: 0x97},
+       {value: 0x0001, lo: 0x9f, hi: 0x9f},
+       {value: 0x0021, lo: 0xb0, hi: 0xb0},
+       {value: 0x0093, lo: 0xb1, hi: 0xb1},
+       {value: 0x0029, lo: 0xb4, hi: 0xb9},
+       {value: 0x0017, lo: 0xba, hi: 0xba},
+       {value: 0x0467, lo: 0xbb, hi: 0xbb},
+       {value: 0x003b, lo: 0xbc, hi: 0xbc},
+       {value: 0x0011, lo: 0xbd, hi: 0xbe},
+       {value: 0x009d, lo: 0xbf, hi: 0xbf},
+       // Block 0x3f, offset 0x183
+       {value: 0x0002, lo: 0x0f},
+       {value: 0x0021, lo: 0x80, hi: 0x89},
+       {value: 0x0017, lo: 0x8a, hi: 0x8a},
+       {value: 0x0467, lo: 0x8b, hi: 0x8b},
+       {value: 0x003b, lo: 0x8c, hi: 0x8c},
+       {value: 0x0011, lo: 0x8d, hi: 0x8e},
+       {value: 0x0083, lo: 0x90, hi: 0x90},
+       {value: 0x008b, lo: 0x91, hi: 0x91},
+       {value: 0x009f, lo: 0x92, hi: 0x92},
+       {value: 0x00b1, lo: 0x93, hi: 0x93},
+       {value: 0x0104, lo: 0x94, hi: 0x94},
+       {value: 0x0091, lo: 0x95, hi: 0x95},
+       {value: 0x0097, lo: 0x96, hi: 0x99},
+       {value: 0x00a1, lo: 0x9a, hi: 0x9a},
+       {value: 0x00a7, lo: 0x9b, hi: 0x9c},
+       {value: 0x1999, lo: 0xa8, hi: 0xa8},
+       // Block 0x40, offset 0x193
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x41, offset 0x1a1
+       {value: 0x0007, lo: 0x06},
+       {value: 0x2180, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x42, offset 0x1a8
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x43, offset 0x1ae
+       {value: 0x0173, lo: 0x0e},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa4},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0x269f, lo: 0xac, hi: 0xad},
+       {value: 0x26a6, lo: 0xaf, hi: 0xaf},
+       {value: 0x281c, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x44, offset 0x1bd
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x45, offset 0x1c1
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x46, offset 0x1c3
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0057, lo: 0x80, hi: 0x8f},
+       {value: 0x0083, lo: 0x90, hi: 0xa9},
+       {value: 0x0021, lo: 0xaa, hi: 0xaa},
+       // Block 0x47, offset 0x1c7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x299b, lo: 0x8c, hi: 0x8c},
+       // Block 0x48, offset 0x1c9
+       {value: 0x0263, lo: 0x02},
+       {value: 0x1b8c, lo: 0xb4, hi: 0xb4},
+       {value: 0x192d, lo: 0xb5, hi: 0xb6},
+       // Block 0x49, offset 0x1cc
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x4a, offset 0x1ce
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0095, lo: 0xbc, hi: 0xbc},
+       {value: 0x006d, lo: 0xbd, hi: 0xbd},
+       // Block 0x4b, offset 0x1d1
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x4c, offset 0x1d3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x047f, lo: 0xaf, hi: 0xaf},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x4d, offset 0x1d6
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x4e, offset 0x1d8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0dc3, lo: 0x9f, hi: 0x9f},
+       // Block 0x4f, offset 0x1da
+       {value: 0x0000, lo: 0x01},
+       {value: 0x162f, lo: 0xb3, hi: 0xb3},
+       // Block 0x50, offset 0x1dc
+       {value: 0x0004, lo: 0x0b},
+       {value: 0x1597, lo: 0x80, hi: 0x82},
+       {value: 0x15af, lo: 0x83, hi: 0x83},
+       {value: 0x15c7, lo: 0x84, hi: 0x85},
+       {value: 0x15d7, lo: 0x86, hi: 0x89},
+       {value: 0x15eb, lo: 0x8a, hi: 0x8c},
+       {value: 0x15ff, lo: 0x8d, hi: 0x8d},
+       {value: 0x1607, lo: 0x8e, hi: 0x8e},
+       {value: 0x160f, lo: 0x8f, hi: 0x90},
+       {value: 0x161b, lo: 0x91, hi: 0x93},
+       {value: 0x162b, lo: 0x94, hi: 0x94},
+       {value: 0x1633, lo: 0x95, hi: 0x95},
+       // Block 0x51, offset 0x1e8
+       {value: 0x0004, lo: 0x09},
+       {value: 0x0001, lo: 0x80, hi: 0x80},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xae},
+       {value: 0x812f, lo: 0xaf, hi: 0xaf},
+       {value: 0x04b3, lo: 0xb6, hi: 0xb6},
+       {value: 0x0887, lo: 0xb8, hi: 0xba},
+       // Block 0x52, offset 0x1f2
+       {value: 0x0006, lo: 0x09},
+       {value: 0x0313, lo: 0xb1, hi: 0xb1},
+       {value: 0x0317, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a3b, lo: 0xb3, hi: 0xb3},
+       {value: 0x031b, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a41, lo: 0xb5, hi: 0xb6},
+       {value: 0x031f, lo: 0xb7, hi: 0xb7},
+       {value: 0x0323, lo: 0xb8, hi: 0xb8},
+       {value: 0x0327, lo: 0xb9, hi: 0xb9},
+       {value: 0x4a4d, lo: 0xba, hi: 0xbf},
+       // Block 0x53, offset 0x1fc
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x54, offset 0x1ff
+       {value: 0x0000, lo: 0x03},
+       {value: 0x020f, lo: 0x9c, hi: 0x9c},
+       {value: 0x0212, lo: 0x9d, hi: 0x9d},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x55, offset 0x203
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x56, offset 0x205
+       {value: 0x0000, lo: 0x01},
+       {value: 0x163b, lo: 0xb0, hi: 0xb0},
+       // Block 0x57, offset 0x207
+       {value: 0x000c, lo: 0x01},
+       {value: 0x00d7, lo: 0xb8, hi: 0xb9},
+       // Block 0x58, offset 0x209
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x59, offset 0x20b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x5a, offset 0x20e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x5b, offset 0x210
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x5c, offset 0x212
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x5d, offset 0x214
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x5e, offset 0x216
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x5f, offset 0x21c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x60, offset 0x21f
+       {value: 0x0008, lo: 0x03},
+       {value: 0x1637, lo: 0x9c, hi: 0x9d},
+       {value: 0x0125, lo: 0x9e, hi: 0x9e},
+       {value: 0x1643, lo: 0x9f, hi: 0x9f},
+       // Block 0x61, offset 0x223
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x62, offset 0x225
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x63, offset 0x22c
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x64, offset 0x232
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x65, offset 0x238
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x66, offset 0x240
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x67, offset 0x246
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x68, offset 0x24c
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x69, offset 0x252
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x6a, offset 0x256
+       {value: 0x0002, lo: 0x01},
+       {value: 0x0003, lo: 0x81, hi: 0xbf},
+       // Block 0x6b, offset 0x258
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x6c, offset 0x25a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x6d, offset 0x25c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x6e, offset 0x25e
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x6f, offset 0x264
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x70, offset 0x267
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x71, offset 0x26a
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x72, offset 0x272
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x73, offset 0x279
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x74, offset 0x27c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x75, offset 0x27f
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x76, offset 0x281
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x77, offset 0x289
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       // Block 0x78, offset 0x28c
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x79, offset 0x293
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x7a, offset 0x296
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7b, offset 0x29c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x7c, offset 0x29e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7d, offset 0x2a0
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x7e, offset 0x2a3
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x7f, offset 0x2a5
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x80, offset 0x2a7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x87, hi: 0x87},
+       // Block 0x81, offset 0x2a9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x99, hi: 0x99},
+       // Block 0x82, offset 0x2ab
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0x82, hi: 0x82},
+       {value: 0x8104, lo: 0x84, hi: 0x85},
+       // Block 0x83, offset 0x2ae
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x84, offset 0x2b0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x85, offset 0x2b2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x86, offset 0x2b4
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x87, offset 0x2c1
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x88, offset 0x2cb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x89, offset 0x2cd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x8a, offset 0x2cf
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0043, lo: 0x80, hi: 0x99},
+       {value: 0x0083, lo: 0x9a, hi: 0xb3},
+       {value: 0x0043, lo: 0xb4, hi: 0xbf},
+       // Block 0x8b, offset 0x2d3
+       {value: 0x0002, lo: 0x04},
+       {value: 0x005b, lo: 0x80, hi: 0x8d},
+       {value: 0x0083, lo: 0x8e, hi: 0x94},
+       {value: 0x0093, lo: 0x96, hi: 0xa7},
+       {value: 0x0043, lo: 0xa8, hi: 0xbf},
+       // Block 0x8c, offset 0x2d8
+       {value: 0x0002, lo: 0x0b},
+       {value: 0x0073, lo: 0x80, hi: 0x81},
+       {value: 0x0083, lo: 0x82, hi: 0x9b},
+       {value: 0x0043, lo: 0x9c, hi: 0x9c},
+       {value: 0x0047, lo: 0x9e, hi: 0x9f},
+       {value: 0x004f, lo: 0xa2, hi: 0xa2},
+       {value: 0x0055, lo: 0xa5, hi: 0xa6},
+       {value: 0x005d, lo: 0xa9, hi: 0xac},
+       {value: 0x0067, lo: 0xae, hi: 0xb5},
+       {value: 0x0083, lo: 0xb6, hi: 0xb9},
+       {value: 0x008d, lo: 0xbb, hi: 0xbb},
+       {value: 0x0091, lo: 0xbd, hi: 0xbf},
+       // Block 0x8d, offset 0x2e4
+       {value: 0x0002, lo: 0x04},
+       {value: 0x0097, lo: 0x80, hi: 0x83},
+       {value: 0x00a1, lo: 0x85, hi: 0x8f},
+       {value: 0x0043, lo: 0x90, hi: 0xa9},
+       {value: 0x0083, lo: 0xaa, hi: 0xbf},
+       // Block 0x8e, offset 0x2e9
+       {value: 0x0002, lo: 0x08},
+       {value: 0x00af, lo: 0x80, hi: 0x83},
+       {value: 0x0043, lo: 0x84, hi: 0x85},
+       {value: 0x0049, lo: 0x87, hi: 0x8a},
+       {value: 0x0055, lo: 0x8d, hi: 0x94},
+       {value: 0x0067, lo: 0x96, hi: 0x9c},
+       {value: 0x0083, lo: 0x9e, hi: 0xb7},
+       {value: 0x0043, lo: 0xb8, hi: 0xb9},
+       {value: 0x0049, lo: 0xbb, hi: 0xbe},
+       // Block 0x8f, offset 0x2f2
+       {value: 0x0002, lo: 0x05},
+       {value: 0x0053, lo: 0x80, hi: 0x84},
+       {value: 0x005f, lo: 0x86, hi: 0x86},
+       {value: 0x0067, lo: 0x8a, hi: 0x90},
+       {value: 0x0083, lo: 0x92, hi: 0xab},
+       {value: 0x0043, lo: 0xac, hi: 0xbf},
+       // Block 0x90, offset 0x2f8
+       {value: 0x0002, lo: 0x04},
+       {value: 0x006b, lo: 0x80, hi: 0x85},
+       {value: 0x0083, lo: 0x86, hi: 0x9f},
+       {value: 0x0043, lo: 0xa0, hi: 0xb9},
+       {value: 0x0083, lo: 0xba, hi: 0xbf},
+       // Block 0x91, offset 0x2fd
+       {value: 0x0002, lo: 0x03},
+       {value: 0x008f, lo: 0x80, hi: 0x93},
+       {value: 0x0043, lo: 0x94, hi: 0xad},
+       {value: 0x0083, lo: 0xae, hi: 0xbf},
+       // Block 0x92, offset 0x301
+       {value: 0x0002, lo: 0x04},
+       {value: 0x00a7, lo: 0x80, hi: 0x87},
+       {value: 0x0043, lo: 0x88, hi: 0xa1},
+       {value: 0x0083, lo: 0xa2, hi: 0xbb},
+       {value: 0x0043, lo: 0xbc, hi: 0xbf},
+       // Block 0x93, offset 0x306
+       {value: 0x0002, lo: 0x03},
+       {value: 0x004b, lo: 0x80, hi: 0x95},
+       {value: 0x0083, lo: 0x96, hi: 0xaf},
+       {value: 0x0043, lo: 0xb0, hi: 0xbf},
+       // Block 0x94, offset 0x30a
+       {value: 0x0003, lo: 0x0f},
+       {value: 0x01b8, lo: 0x80, hi: 0x80},
+       {value: 0x045f, lo: 0x81, hi: 0x81},
+       {value: 0x01bb, lo: 0x82, hi: 0x9a},
+       {value: 0x045b, lo: 0x9b, hi: 0x9b},
+       {value: 0x01c7, lo: 0x9c, hi: 0x9c},
+       {value: 0x01d0, lo: 0x9d, hi: 0x9d},
+       {value: 0x01d6, lo: 0x9e, hi: 0x9e},
+       {value: 0x01fa, lo: 0x9f, hi: 0x9f},
+       {value: 0x01eb, lo: 0xa0, hi: 0xa0},
+       {value: 0x01e8, lo: 0xa1, hi: 0xa1},
+       {value: 0x0173, lo: 0xa2, hi: 0xb2},
+       {value: 0x0188, lo: 0xb3, hi: 0xb3},
+       {value: 0x01a6, lo: 0xb4, hi: 0xba},
+       {value: 0x045f, lo: 0xbb, hi: 0xbb},
+       {value: 0x01bb, lo: 0xbc, hi: 0xbf},
+       // Block 0x95, offset 0x31a
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01c7, lo: 0x80, hi: 0x94},
+       {value: 0x045b, lo: 0x95, hi: 0x95},
+       {value: 0x01c7, lo: 0x96, hi: 0x96},
+       {value: 0x01d0, lo: 0x97, hi: 0x97},
+       {value: 0x01d6, lo: 0x98, hi: 0x98},
+       {value: 0x01fa, lo: 0x99, hi: 0x99},
+       {value: 0x01eb, lo: 0x9a, hi: 0x9a},
+       {value: 0x01e8, lo: 0x9b, hi: 0x9b},
+       {value: 0x0173, lo: 0x9c, hi: 0xac},
+       {value: 0x0188, lo: 0xad, hi: 0xad},
+       {value: 0x01a6, lo: 0xae, hi: 0xb4},
+       {value: 0x045f, lo: 0xb5, hi: 0xb5},
+       {value: 0x01bb, lo: 0xb6, hi: 0xbf},
+       // Block 0x96, offset 0x328
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01d9, lo: 0x80, hi: 0x8e},
+       {value: 0x045b, lo: 0x8f, hi: 0x8f},
+       {value: 0x01c7, lo: 0x90, hi: 0x90},
+       {value: 0x01d0, lo: 0x91, hi: 0x91},
+       {value: 0x01d6, lo: 0x92, hi: 0x92},
+       {value: 0x01fa, lo: 0x93, hi: 0x93},
+       {value: 0x01eb, lo: 0x94, hi: 0x94},
+       {value: 0x01e8, lo: 0x95, hi: 0x95},
+       {value: 0x0173, lo: 0x96, hi: 0xa6},
+       {value: 0x0188, lo: 0xa7, hi: 0xa7},
+       {value: 0x01a6, lo: 0xa8, hi: 0xae},
+       {value: 0x045f, lo: 0xaf, hi: 0xaf},
+       {value: 0x01bb, lo: 0xb0, hi: 0xbf},
+       // Block 0x97, offset 0x336
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01eb, lo: 0x80, hi: 0x88},
+       {value: 0x045b, lo: 0x89, hi: 0x89},
+       {value: 0x01c7, lo: 0x8a, hi: 0x8a},
+       {value: 0x01d0, lo: 0x8b, hi: 0x8b},
+       {value: 0x01d6, lo: 0x8c, hi: 0x8c},
+       {value: 0x01fa, lo: 0x8d, hi: 0x8d},
+       {value: 0x01eb, lo: 0x8e, hi: 0x8e},
+       {value: 0x01e8, lo: 0x8f, hi: 0x8f},
+       {value: 0x0173, lo: 0x90, hi: 0xa0},
+       {value: 0x0188, lo: 0xa1, hi: 0xa1},
+       {value: 0x01a6, lo: 0xa2, hi: 0xa8},
+       {value: 0x045f, lo: 0xa9, hi: 0xa9},
+       {value: 0x01bb, lo: 0xaa, hi: 0xbf},
+       // Block 0x98, offset 0x344
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x99, offset 0x34a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x9a, offset 0x34c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x9b, offset 0x34f
+       {value: 0x0002, lo: 0x09},
+       {value: 0x0063, lo: 0x80, hi: 0x89},
+       {value: 0x1951, lo: 0x8a, hi: 0x8a},
+       {value: 0x1981, lo: 0x8b, hi: 0x8b},
+       {value: 0x199c, lo: 0x8c, hi: 0x8c},
+       {value: 0x19a2, lo: 0x8d, hi: 0x8d},
+       {value: 0x1bc0, lo: 0x8e, hi: 0x8e},
+       {value: 0x19ae, lo: 0x8f, hi: 0x8f},
+       {value: 0x197b, lo: 0xaa, hi: 0xaa},
+       {value: 0x197e, lo: 0xab, hi: 0xab},
+       // Block 0x9c, offset 0x359
+       {value: 0x0000, lo: 0x01},
+       {value: 0x193f, lo: 0x90, hi: 0x90},
+       // Block 0x9d, offset 0x35b
+       {value: 0x0028, lo: 0x09},
+       {value: 0x2862, lo: 0x80, hi: 0x80},
+       {value: 0x2826, lo: 0x81, hi: 0x81},
+       {value: 0x2830, lo: 0x82, hi: 0x82},
+       {value: 0x2844, lo: 0x83, hi: 0x84},
+       {value: 0x284e, lo: 0x85, hi: 0x86},
+       {value: 0x283a, lo: 0x87, hi: 0x87},
+       {value: 0x2858, lo: 0x88, hi: 0x88},
+       {value: 0x0b6f, lo: 0x90, hi: 0x90},
+       {value: 0x08e7, lo: 0x91, hi: 0x91},
+}
+
+// recompMap: 7520 bytes (entries only)
+var recompMap map[uint32]rune
+var recompMapOnce sync.Once
+
+const recompMapPacked = "" +
+       "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0
+       "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1
+       "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2
+       "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3
+       "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4
+       "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5
+       "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7
+       "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8
+       "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9
+       "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA
+       "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB
+       "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC
+       "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD
+       "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE
+       "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF
+       "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1
+       "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2
+       "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3
+       "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4
+       "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5
+       "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6
+       "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9
+       "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA
+       "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB
+       "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC
+       "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD
+       "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0
+       "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1
+       "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2
+       "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3
+       "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4
+       "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5
+       "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7
+       "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8
+       "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9
+       "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA
+       "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB
+       "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC
+       "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED
+       "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE
+       "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF
+       "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1
+       "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2
+       "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3
+       "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4
+       "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5
+       "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6
+       "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9
+       "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA
+       "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB
+       "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC
+       "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD
+       "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF
+       "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100
+       "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101
+       "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102
+       "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103
+       "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104
+       "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105
+       "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106
+       "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107
+       "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108
+       "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109
+       "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A
+       "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B
+       "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C
+       "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D
+       "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E
+       "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F
+       "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112
+       "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113
+       "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114
+       "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115
+       "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116
+       "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117
+       "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118
+       "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119
+       "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A
+       "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B
+       "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C
+       "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D
+       "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E
+       "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F
+       "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120
+       "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121
+       "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122
+       "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123
+       "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124
+       "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125
+       "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128
+       "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129
+       "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A
+       "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B
+       "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C
+       "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D
+       "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E
+       "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F
+       "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130
+       "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134
+       "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135
+       "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136
+       "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137
+       "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139
+       "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A
+       "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B
+       "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C
+       "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D
+       "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E
+       "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143
+       "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144
+       "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145
+       "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146
+       "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147
+       "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148
+       "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C
+       "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D
+       "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E
+       "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F
+       "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150
+       "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151
+       "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154
+       "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155
+       "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156
+       "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157
+       "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158
+       "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159
+       "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A
+       "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B
+       "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C
+       "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D
+       "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E
+       "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F
+       "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160
+       "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161
+       "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162
+       "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163
+       "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164
+       "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165
+       "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168
+       "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169
+       "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A
+       "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B
+       "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C
+       "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D
+       "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E
+       "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F
+       "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170
+       "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171
+       "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172
+       "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173
+       "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174
+       "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175
+       "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176
+       "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177
+       "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178
+       "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179
+       "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A
+       "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B
+       "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C
+       "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D
+       "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E
+       "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0
+       "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1
+       "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF
+       "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0
+       "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD
+       "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE
+       "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF
+       "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0
+       "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1
+       "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2
+       "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3
+       "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4
+       "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5
+       "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6
+       "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7
+       "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8
+       "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9
+       "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA
+       "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB
+       "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC
+       "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE
+       "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF
+       "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0
+       "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1
+       "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2
+       "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3
+       "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6
+       "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7
+       "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8
+       "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9
+       "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA
+       "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB
+       "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC
+       "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED
+       "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE
+       "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF
+       "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0
+       "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4
+       "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5
+       "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8
+       "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9
+       "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA
+       "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB
+       "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC
+       "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD
+       "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE
+       "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF
+       "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200
+       "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201
+       "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202
+       "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203
+       "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204
+       "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205
+       "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206
+       "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207
+       "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208
+       "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209
+       "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A
+       "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B
+       "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C
+       "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D
+       "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E
+       "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F
+       "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210
+       "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211
+       "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212
+       "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213
+       "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214
+       "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215
+       "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216
+       "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217
+       "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218
+       "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219
+       "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A
+       "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B
+       "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E
+       "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F
+       "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226
+       "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227
+       "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228
+       "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229
+       "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A
+       "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B
+       "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C
+       "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D
+       "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E
+       "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F
+       "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230
+       "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231
+       "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232
+       "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233
+       "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385
+       "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386
+       "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388
+       "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389
+       "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A
+       "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C
+       "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E
+       "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F
+       "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390
+       "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA
+       "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB
+       "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC
+       "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD
+       "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE
+       "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF
+       "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0
+       "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA
+       "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB
+       "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC
+       "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD
+       "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE
+       "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3
+       "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4
+       "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400
+       "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401
+       "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403
+       "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407
+       "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C
+       "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D
+       "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E
+       "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419
+       "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439
+       "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450
+       "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451
+       "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453
+       "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457
+       "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C
+       "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D
+       "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E
+       "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476
+       "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477
+       "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1
+       "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2
+       "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0
+       "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1
+       "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2
+       "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3
+       "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6
+       "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7
+       "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA
+       "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB
+       "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC
+       "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD
+       "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE
+       "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF
+       "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2
+       "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3
+       "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4
+       "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5
+       "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6
+       "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7
+       "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA
+       "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB
+       "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC
+       "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED
+       "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE
+       "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF
+       "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0
+       "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1
+       "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2
+       "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3
+       "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4
+       "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5
+       "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8
+       "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9
+       "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622
+       "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623
+       "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624
+       "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625
+       "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626
+       "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0
+       "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2
+       "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3
+       "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929
+       "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931
+       "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934
+       "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB
+       "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC
+       "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48
+       "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B
+       "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C
+       "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94
+       "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA
+       "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB
+       "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC
+       "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48
+       "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0
+       "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7
+       "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8
+       "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA
+       "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB
+       "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A
+       "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B
+       "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C
+       "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA
+       "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC
+       "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD
+       "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE
+       "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026
+       "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06
+       "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08
+       "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A
+       "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C
+       "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E
+       "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12
+       "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B
+       "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D
+       "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40
+       "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41
+       "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43
+       "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00
+       "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01
+       "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02
+       "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03
+       "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04
+       "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05
+       "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06
+       "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07
+       "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08
+       "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09
+       "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A
+       "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B
+       "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C
+       "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D
+       "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E
+       "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F
+       "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10
+       "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11
+       "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12
+       "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13
+       "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14
+       "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15
+       "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16
+       "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17
+       "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18
+       "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19
+       "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A
+       "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B
+       "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C
+       "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D
+       "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E
+       "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F
+       "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20
+       "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21
+       "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22
+       "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23
+       "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24
+       "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25
+       "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26
+       "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27
+       "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28
+       "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29
+       "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A
+       "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B
+       "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C
+       "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D
+       "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E
+       "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F
+       "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30
+       "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31
+       "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32
+       "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33
+       "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34
+       "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35
+       "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36
+       "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37
+       "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38
+       "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39
+       "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A
+       "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B
+       "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C
+       "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D
+       "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E
+       "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F
+       "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40
+       "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41
+       "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42
+       "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43
+       "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44
+       "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45
+       "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46
+       "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47
+       "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48
+       "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49
+       "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A
+       "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B
+       "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C
+       "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D
+       "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E
+       "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F
+       "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50
+       "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51
+       "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52
+       "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53
+       "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54
+       "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55
+       "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56
+       "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57
+       "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58
+       "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59
+       "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A
+       "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B
+       "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C
+       "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D
+       "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E
+       "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F
+       "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60
+       "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61
+       "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62
+       "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63
+       "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64
+       "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65
+       "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66
+       "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67
+       "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68
+       "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69
+       "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A
+       "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B
+       "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C
+       "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D
+       "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E
+       "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F
+       "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70
+       "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71
+       "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72
+       "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73
+       "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74
+       "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75
+       "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76
+       "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77
+       "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78
+       "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79
+       "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A
+       "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B
+       "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C
+       "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D
+       "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E
+       "\x00v\x03#\x00\x00\x1e\u007f" + // 0x00760323: 0x00001E7F
+       "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80
+       "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81
+       "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82
+       "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83
+       "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84
+       "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85
+       "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86
+       "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87
+       "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88
+       "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89
+       "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A
+       "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B
+       "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C
+       "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D
+       "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E
+       "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F
+       "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90
+       "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91
+       "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92
+       "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93
+       "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94
+       "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95
+       "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96
+       "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97
+       "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98
+       "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99
+       "\x01\u007f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B
+       "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0
+       "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1
+       "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2
+       "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3
+       "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4
+       "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5
+       "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6
+       "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7
+       "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8
+       "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9
+       "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA
+       "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB
+       "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC
+       "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD
+       "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE
+       "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF
+       "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0
+       "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1
+       "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2
+       "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3
+       "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4
+       "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5
+       "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6
+       "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7
+       "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8
+       "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9
+       "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA
+       "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB
+       "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC
+       "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD
+       "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE
+       "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF
+       "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0
+       "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1
+       "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2
+       "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3
+       "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4
+       "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5
+       "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6
+       "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7
+       "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8
+       "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9
+       "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA
+       "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB
+       "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC
+       "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD
+       "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE
+       "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF
+       "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0
+       "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1
+       "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2
+       "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3
+       "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4
+       "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5
+       "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6
+       "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7
+       "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8
+       "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9
+       "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA
+       "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB
+       "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC
+       "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD
+       "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE
+       "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF
+       "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0
+       "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1
+       "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2
+       "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3
+       "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4
+       "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5
+       "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6
+       "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7
+       "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8
+       "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9
+       "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA
+       "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB
+       "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC
+       "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED
+       "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE
+       "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF
+       "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0
+       "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1
+       "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2
+       "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3
+       "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4
+       "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5
+       "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6
+       "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7
+       "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8
+       "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9
+       "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00
+       "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01
+       "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02
+       "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03
+       "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04
+       "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05
+       "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06
+       "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07
+       "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08
+       "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09
+       "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A
+       "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B
+       "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C
+       "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D
+       "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E
+       "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F
+       "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10
+       "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11
+       "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12
+       "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13
+       "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14
+       "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15
+       "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18
+       "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19
+       "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A
+       "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B
+       "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C
+       "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D
+       "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20
+       "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21
+       "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22
+       "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23
+       "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24
+       "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25
+       "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26
+       "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27
+       "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28
+       "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29
+       "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A
+       "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B
+       "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C
+       "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D
+       "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E
+       "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F
+       "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30
+       "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31
+       "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32
+       "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33
+       "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34
+       "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35
+       "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36
+       "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37
+       "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38
+       "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39
+       "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A
+       "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B
+       "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C
+       "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D
+       "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E
+       "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F
+       "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40
+       "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41
+       "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42
+       "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43
+       "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44
+       "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45
+       "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48
+       "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49
+       "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A
+       "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B
+       "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C
+       "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D
+       "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50
+       "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51
+       "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52
+       "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53
+       "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54
+       "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55
+       "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56
+       "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57
+       "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59
+       "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B
+       "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D
+       "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F
+       "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60
+       "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61
+       "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62
+       "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63
+       "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64
+       "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65
+       "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66
+       "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67
+       "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68
+       "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69
+       "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A
+       "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B
+       "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C
+       "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D
+       "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E
+       "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F
+       "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70
+       "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72
+       "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74
+       "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76
+       "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78
+       "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A
+       "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C
+       "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80
+       "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81
+       "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82
+       "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83
+       "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84
+       "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85
+       "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86
+       "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87
+       "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88
+       "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89
+       "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A
+       "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B
+       "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C
+       "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D
+       "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E
+       "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F
+       "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90
+       "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91
+       "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92
+       "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93
+       "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94
+       "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95
+       "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96
+       "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97
+       "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98
+       "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99
+       "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A
+       "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B
+       "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C
+       "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D
+       "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E
+       "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F
+       "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0
+       "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1
+       "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2
+       "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3
+       "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4
+       "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5
+       "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6
+       "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7
+       "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8
+       "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9
+       "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA
+       "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB
+       "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC
+       "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD
+       "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE
+       "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF
+       "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0
+       "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1
+       "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2
+       "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3
+       "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4
+       "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6
+       "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7
+       "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8
+       "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9
+       "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA
+       "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC
+       "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1
+       "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2
+       "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3
+       "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4
+       "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6
+       "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7
+       "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8
+       "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA
+       "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC
+       "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD
+       "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE
+       "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF
+       "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0
+       "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1
+       "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2
+       "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6
+       "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7
+       "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8
+       "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9
+       "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA
+       "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD
+       "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE
+       "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF
+       "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0
+       "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1
+       "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2
+       "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4
+       "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5
+       "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6
+       "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7
+       "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8
+       "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9
+       "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA
+       "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC
+       "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED
+       "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2
+       "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3
+       "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4
+       "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6
+       "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7
+       "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8
+       "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA
+       "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC
+       "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A
+       "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B
+       "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE
+       "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD
+       "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE
+       "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF
+       "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204
+       "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209
+       "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C
+       "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224
+       "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226
+       "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241
+       "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244
+       "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247
+       "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249
+       "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260
+       "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262
+       "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D
+       "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E
+       "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F
+       "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270
+       "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271
+       "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274
+       "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275
+       "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278
+       "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279
+       "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280
+       "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281
+       "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284
+       "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285
+       "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288
+       "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289
+       "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC
+       "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD
+       "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE
+       "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF
+       "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0
+       "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1
+       "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2
+       "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3
+       "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA
+       "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB
+       "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC
+       "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED
+       "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C
+       "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E
+       "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050
+       "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052
+       "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054
+       "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056
+       "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058
+       "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A
+       "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C
+       "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E
+       "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060
+       "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062
+       "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065
+       "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067
+       "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069
+       "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070
+       "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071
+       "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073
+       "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074
+       "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076
+       "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077
+       "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079
+       "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A
+       "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C
+       "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D
+       "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094
+       "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E
+       "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC
+       "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE
+       "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0
+       "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2
+       "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4
+       "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6
+       "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8
+       "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA
+       "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC
+       "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE
+       "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0
+       "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2
+       "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5
+       "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7
+       "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9
+       "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0
+       "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1
+       "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3
+       "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4
+       "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6
+       "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7
+       "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9
+       "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA
+       "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC
+       "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD
+       "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4
+       "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7
+       "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8
+       "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9
+       "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA
+       "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE
+       "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A
+       "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C
+       "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB
+       "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E
+       "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F
+       "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B
+       "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C
+       "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB
+       "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC
+       "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE
+       "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA
+       "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB
+       ""
+       // Total size of tables: 53KB (54226 bytes)
diff --git a/libgo/go/golang.org/x/text/unicode/norm/tables11.0.0.go b/libgo/go/golang.org/x/text/unicode/norm/tables11.0.0.go
new file mode 100644 (file)
index 0000000..7297cce
--- /dev/null
@@ -0,0 +1,7693 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.13
+
+package norm
+
+import "sync"
+
+const (
+       // Version is the Unicode edition from which the tables are derived.
+       Version = "11.0.0"
+
+       // MaxTransformChunkSize indicates the maximum number of bytes that Transform
+       // may need to write atomically for any Form. Making a destination buffer at
+       // least this size ensures that Transform can always make progress and that
+       // the user does not need to grow the buffer on an ErrShortDst.
+       MaxTransformChunkSize = 35 + maxNonStarters*4
+)
+
+var ccc = [55]uint8{
+       0, 1, 7, 8, 9, 10, 11, 12,
+       13, 14, 15, 16, 17, 18, 19, 20,
+       21, 22, 23, 24, 25, 26, 27, 28,
+       29, 30, 31, 32, 33, 34, 35, 36,
+       84, 91, 103, 107, 118, 122, 129, 130,
+       132, 202, 214, 216, 218, 220, 222, 224,
+       226, 228, 230, 232, 233, 234, 240,
+}
+
+const (
+       firstMulti            = 0x186D
+       firstCCC              = 0x2C9E
+       endMulti              = 0x2F60
+       firstLeadingCCC       = 0x49AE
+       firstCCCZeroExcept    = 0x4A78
+       firstStarterWithNLead = 0x4A9F
+       lastDecomp            = 0x4AA1
+       maxDecomp             = 0x8000
+)
+
+// decomps: 19105 bytes
+var decomps = [...]byte{
+       // Bytes 0 - 3f
+       0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
+       0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
+       0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
+       0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
+       0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
+       0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
+       0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
+       0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
+       // Bytes 40 - 7f
+       0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
+       0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
+       0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
+       0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
+       0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
+       0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
+       0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
+       0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
+       // Bytes 80 - bf
+       0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
+       0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
+       0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
+       0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
+       0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
+       0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
+       0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
+       0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
+       // Bytes c0 - ff
+       0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
+       0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
+       0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,
+       0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,
+       0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,
+       0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,
+       0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,
+       0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,
+       // Bytes 100 - 13f
+       0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,
+       0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,
+       0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,
+       0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,
+       0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,
+       0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
+       0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
+       0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
+       // Bytes 140 - 17f
+       0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,
+       0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,
+       0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
+       0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
+       0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,
+       0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,
+       0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,
+       0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,
+       // Bytes 180 - 1bf
+       0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,
+       0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,
+       0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,
+       0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,
+       0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,
+       0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,
+       0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,
+       0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,
+       // Bytes 1c0 - 1ff
+       0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,
+       0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,
+       0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,
+       0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,
+       0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,
+       0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,
+       0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,
+       0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,
+       // Bytes 200 - 23f
+       0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,
+       0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,
+       0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,
+       0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,
+       0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,
+       0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,
+       0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,
+       0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,
+       // Bytes 240 - 27f
+       0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,
+       0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,
+       0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,
+       0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,
+       0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,
+       0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,
+       0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,
+       0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,
+       // Bytes 280 - 2bf
+       0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,
+       0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,
+       0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,
+       0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,
+       0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,
+       0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,
+       0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,
+       0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,
+       // Bytes 2c0 - 2ff
+       0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,
+       0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,
+       0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,
+       0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,
+       0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,
+       0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,
+       0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,
+       0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,
+       // Bytes 300 - 33f
+       0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,
+       0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,
+       0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,
+       0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,
+       0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,
+       0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,
+       0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,
+       0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,
+       // Bytes 340 - 37f
+       0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,
+       0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,
+       0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,
+       0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,
+       0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,
+       0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,
+       0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,
+       0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,
+       // Bytes 380 - 3bf
+       0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,
+       0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,
+       0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,
+       0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,
+       0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,
+       0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,
+       0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,
+       0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,
+       // Bytes 3c0 - 3ff
+       0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,
+       0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,
+       0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,
+       0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,
+       0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,
+       0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,
+       0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,
+       0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,
+       // Bytes 400 - 43f
+       0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,
+       0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,
+       0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,
+       0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,
+       0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,
+       0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,
+       0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,
+       0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,
+       // Bytes 440 - 47f
+       0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,
+       0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,
+       0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,
+       0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,
+       0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,
+       0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,
+       0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,
+       0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,
+       // Bytes 480 - 4bf
+       0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,
+       0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,
+       0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,
+       0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,
+       0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,
+       0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,
+       0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,
+       0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,
+       // Bytes 4c0 - 4ff
+       0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,
+       0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,
+       0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,
+       0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,
+       0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,
+       0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,
+       0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,
+       0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,
+       // Bytes 500 - 53f
+       0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,
+       0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,
+       0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,
+       0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,
+       0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,
+       0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,
+       0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,
+       0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,
+       // Bytes 540 - 57f
+       0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,
+       0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,
+       0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,
+       0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,
+       0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,
+       0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,
+       0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,
+       0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,
+       // Bytes 580 - 5bf
+       0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,
+       0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,
+       0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,
+       0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,
+       0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,
+       0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,
+       0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,
+       0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,
+       // Bytes 5c0 - 5ff
+       0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,
+       0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,
+       0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,
+       0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,
+       0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,
+       0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,
+       0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,
+       0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,
+       // Bytes 600 - 63f
+       0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,
+       0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,
+       0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,
+       0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,
+       0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,
+       0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,
+       0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,
+       0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,
+       // Bytes 640 - 67f
+       0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,
+       0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,
+       0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,
+       0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,
+       0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,
+       0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,
+       0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,
+       0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,
+       // Bytes 680 - 6bf
+       0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,
+       0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,
+       0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,
+       0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,
+       0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,
+       0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,
+       0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,
+       0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,
+       // Bytes 6c0 - 6ff
+       0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,
+       0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,
+       0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,
+       0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,
+       0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,
+       0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,
+       0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,
+       0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,
+       // Bytes 700 - 73f
+       0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,
+       0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,
+       0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,
+       0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,
+       0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,
+       0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,
+       0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,
+       0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,
+       // Bytes 740 - 77f
+       0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,
+       0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,
+       0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,
+       0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,
+       0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,
+       0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,
+       0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,
+       0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,
+       // Bytes 780 - 7bf
+       0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,
+       0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,
+       0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,
+       0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,
+       0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,
+       0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,
+       0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,
+       0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,
+       // Bytes 7c0 - 7ff
+       0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,
+       0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,
+       0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,
+       0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,
+       0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,
+       0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,
+       0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,
+       0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,
+       // Bytes 800 - 83f
+       0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,
+       0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,
+       0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,
+       0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,
+       0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,
+       0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,
+       0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,
+       0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,
+       // Bytes 840 - 87f
+       0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,
+       0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,
+       0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,
+       0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,
+       0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,
+       0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,
+       0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,
+       0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,
+       // Bytes 880 - 8bf
+       0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,
+       0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,
+       0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,
+       0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,
+       0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,
+       0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,
+       0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,
+       0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,
+       // Bytes 8c0 - 8ff
+       0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,
+       0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,
+       0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,
+       0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,
+       0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,
+       0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,
+       0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,
+       0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,
+       // Bytes 900 - 93f
+       0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,
+       0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,
+       0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,
+       0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,
+       0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,
+       0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,
+       0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,
+       0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,
+       // Bytes 940 - 97f
+       0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,
+       0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,
+       0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,
+       0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,
+       0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,
+       0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,
+       0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,
+       0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,
+       // Bytes 980 - 9bf
+       0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,
+       0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,
+       0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,
+       0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,
+       0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,
+       0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,
+       0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,
+       0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,
+       // Bytes 9c0 - 9ff
+       0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,
+       0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,
+       0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,
+       0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,
+       0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,
+       0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,
+       0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,
+       0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,
+       // Bytes a00 - a3f
+       0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,
+       0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,
+       0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,
+       0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,
+       0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,
+       0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,
+       0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,
+       0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,
+       // Bytes a40 - a7f
+       0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,
+       0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,
+       0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,
+       0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,
+       0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,
+       0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,
+       0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,
+       0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,
+       // Bytes a80 - abf
+       0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,
+       0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,
+       0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,
+       0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,
+       0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,
+       0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,
+       0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,
+       0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,
+       // Bytes ac0 - aff
+       0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,
+       0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,
+       0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,
+       0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,
+       0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,
+       0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,
+       0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,
+       0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,
+       // Bytes b00 - b3f
+       0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,
+       0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,
+       0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,
+       0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,
+       0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,
+       0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,
+       0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,
+       0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,
+       // Bytes b40 - b7f
+       0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,
+       0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,
+       0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,
+       0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,
+       0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,
+       0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,
+       0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,
+       0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,
+       // Bytes b80 - bbf
+       0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,
+       0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,
+       0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,
+       0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,
+       0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,
+       0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,
+       0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,
+       0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,
+       // Bytes bc0 - bff
+       0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,
+       0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,
+       0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,
+       0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,
+       0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,
+       0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,
+       0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,
+       0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,
+       // Bytes c00 - c3f
+       0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,
+       0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,
+       0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,
+       0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,
+       0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,
+       0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,
+       0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,
+       0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,
+       // Bytes c40 - c7f
+       0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,
+       0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,
+       0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,
+       0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,
+       0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,
+       0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,
+       0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,
+       0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,
+       // Bytes c80 - cbf
+       0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,
+       0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,
+       0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,
+       0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,
+       0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,
+       0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,
+       0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,
+       0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,
+       // Bytes cc0 - cff
+       0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,
+       0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,
+       0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,
+       0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,
+       0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,
+       0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,
+       0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,
+       0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,
+       // Bytes d00 - d3f
+       0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,
+       0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,
+       0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,
+       0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,
+       0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,
+       0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,
+       0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,
+       0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,
+       // Bytes d40 - d7f
+       0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,
+       0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,
+       0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,
+       0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,
+       0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,
+       0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,
+       0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,
+       0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,
+       // Bytes d80 - dbf
+       0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,
+       0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,
+       0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,
+       0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,
+       0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,
+       0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,
+       0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,
+       0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,
+       // Bytes dc0 - dff
+       0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,
+       0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,
+       0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,
+       0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,
+       0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,
+       0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,
+       0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,
+       0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,
+       // Bytes e00 - e3f
+       0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,
+       0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,
+       0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,
+       0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,
+       0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,
+       0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,
+       0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,
+       0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,
+       // Bytes e40 - e7f
+       0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,
+       0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,
+       0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,
+       0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,
+       0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,
+       0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,
+       0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,
+       0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,
+       // Bytes e80 - ebf
+       0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,
+       0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,
+       0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,
+       0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,
+       0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,
+       0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,
+       0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,
+       0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,
+       // Bytes ec0 - eff
+       0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,
+       0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,
+       0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,
+       0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,
+       0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,
+       0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,
+       0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,
+       0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,
+       // Bytes f00 - f3f
+       0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,
+       0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,
+       0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,
+       0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,
+       0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,
+       0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,
+       0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,
+       0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,
+       // Bytes f40 - f7f
+       0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,
+       0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,
+       0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,
+       0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,
+       0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,
+       0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,
+       0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,
+       0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,
+       // Bytes f80 - fbf
+       0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,
+       0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,
+       0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,
+       0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,
+       0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,
+       0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,
+       0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,
+       0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,
+       // Bytes fc0 - fff
+       0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,
+       0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,
+       0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,
+       0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,
+       0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,
+       0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,
+       0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,
+       0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,
+       // Bytes 1000 - 103f
+       0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,
+       0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,
+       0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,
+       0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,
+       0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,
+       0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,
+       0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,
+       0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,
+       // Bytes 1040 - 107f
+       0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,
+       0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,
+       0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,
+       0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,
+       0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,
+       0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,
+       0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,
+       0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,
+       // Bytes 1080 - 10bf
+       0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,
+       0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,
+       0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,
+       0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,
+       0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,
+       0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,
+       0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,
+       0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,
+       // Bytes 10c0 - 10ff
+       0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,
+       0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,
+       0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,
+       0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,
+       0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,
+       0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,
+       0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,
+       0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,
+       // Bytes 1100 - 113f
+       0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,
+       0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,
+       0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,
+       0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,
+       0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,
+       0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,
+       0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,
+       0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,
+       // Bytes 1140 - 117f
+       0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,
+       0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,
+       0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,
+       0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,
+       0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,
+       0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,
+       0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,
+       0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,
+       // Bytes 1180 - 11bf
+       0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,
+       0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,
+       0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,
+       0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,
+       0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,
+       0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,
+       0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,
+       0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,
+       // Bytes 11c0 - 11ff
+       0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,
+       0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,
+       0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,
+       0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,
+       0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,
+       0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,
+       0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,
+       0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,
+       // Bytes 1200 - 123f
+       0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,
+       0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,
+       0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,
+       0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,
+       0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,
+       0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,
+       0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,
+       0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,
+       // Bytes 1240 - 127f
+       0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,
+       0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,
+       0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,
+       0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,
+       0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,
+       0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,
+       0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,
+       0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,
+       // Bytes 1280 - 12bf
+       0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,
+       0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,
+       0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,
+       0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,
+       0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,
+       0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,
+       0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,
+       0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,
+       // Bytes 12c0 - 12ff
+       0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,
+       0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,
+       0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,
+       0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,
+       0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,
+       0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,
+       0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,
+       0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,
+       // Bytes 1300 - 133f
+       0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,
+       0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,
+       0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,
+       0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,
+       0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,
+       0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,
+       0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,
+       0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,
+       // Bytes 1340 - 137f
+       0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,
+       0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,
+       0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,
+       0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,
+       0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,
+       0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,
+       0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,
+       0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,
+       // Bytes 1380 - 13bf
+       0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,
+       0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,
+       0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,
+       0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,
+       0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,
+       0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,
+       0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,
+       0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,
+       // Bytes 13c0 - 13ff
+       0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,
+       0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,
+       0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,
+       0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,
+       0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,
+       0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,
+       0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,
+       0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,
+       // Bytes 1400 - 143f
+       0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,
+       0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,
+       0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,
+       0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,
+       0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,
+       0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,
+       0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,
+       0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,
+       // Bytes 1440 - 147f
+       0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,
+       0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,
+       0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,
+       0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,
+       0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,
+       0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,
+       0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,
+       0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,
+       // Bytes 1480 - 14bf
+       0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,
+       0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,
+       0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,
+       0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,
+       0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,
+       0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,
+       0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,
+       0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,
+       // Bytes 14c0 - 14ff
+       0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,
+       0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,
+       0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,
+       0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,
+       0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,
+       0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,
+       0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,
+       0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,
+       // Bytes 1500 - 153f
+       0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,
+       0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,
+       0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,
+       0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,
+       0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,
+       0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,
+       0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,
+       0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,
+       // Bytes 1540 - 157f
+       0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,
+       0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,
+       0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,
+       0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,
+       0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,
+       0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,
+       0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,
+       0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,
+       // Bytes 1580 - 15bf
+       0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,
+       0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,
+       0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,
+       0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,
+       0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,
+       0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,
+       0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,
+       0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,
+       // Bytes 15c0 - 15ff
+       0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,
+       0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,
+       0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,
+       0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,
+       0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,
+       0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,
+       0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,
+       0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,
+       // Bytes 1600 - 163f
+       0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,
+       0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,
+       0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,
+       0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,
+       0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,
+       0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,
+       0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,
+       0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,
+       // Bytes 1640 - 167f
+       0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,
+       0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,
+       0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,
+       0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,
+       0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,
+       0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,
+       0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,
+       0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,
+       // Bytes 1680 - 16bf
+       0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,
+       0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,
+       0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,
+       0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,
+       0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,
+       0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,
+       0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,
+       0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,
+       // Bytes 16c0 - 16ff
+       0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,
+       0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,
+       0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,
+       0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,
+       0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,
+       0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,
+       0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,
+       0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,
+       // Bytes 1700 - 173f
+       0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,
+       0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,
+       0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,
+       0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,
+       0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,
+       0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,
+       0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,
+       0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,
+       // Bytes 1740 - 177f
+       0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,
+       0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,
+       0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,
+       0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,
+       0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,
+       0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,
+       0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,
+       0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,
+       // Bytes 1780 - 17bf
+       0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,
+       0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,
+       0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,
+       0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,
+       0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,
+       0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,
+       0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,
+       0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,
+       // Bytes 17c0 - 17ff
+       0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,
+       0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,
+       0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,
+       0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,
+       0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,
+       0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,
+       0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,
+       0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,
+       // Bytes 1800 - 183f
+       0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,
+       0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,
+       0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,
+       0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,
+       0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,
+       0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,
+       0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,
+       0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,
+       // Bytes 1840 - 187f
+       0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,
+       0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,
+       0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,
+       0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,
+       0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,
+       0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,
+       0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,
+       0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,
+       // Bytes 1880 - 18bf
+       0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,
+       0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,
+       0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,
+       0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,
+       0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,
+       0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,
+       0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,
+       0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,
+       // Bytes 18c0 - 18ff
+       0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,
+       0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,
+       0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,
+       0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,
+       0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,
+       0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,
+       0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,
+       0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,
+       // Bytes 1900 - 193f
+       0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,
+       0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,
+       0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,
+       0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,
+       0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,
+       0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,
+       0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,
+       0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,
+       // Bytes 1940 - 197f
+       0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,
+       0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,
+       0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,
+       0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,
+       0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,
+       0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,
+       0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,
+       0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,
+       // Bytes 1980 - 19bf
+       0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
+       0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
+       0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
+       0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
+       0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
+       0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
+       0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
+       0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
+       // Bytes 19c0 - 19ff
+       0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
+       0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
+       0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
+       0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
+       0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
+       0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
+       0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
+       0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
+       // Bytes 1a00 - 1a3f
+       0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
+       0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
+       0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
+       0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
+       0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
+       0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
+       0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
+       0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
+       // Bytes 1a40 - 1a7f
+       0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
+       0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
+       0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
+       0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
+       0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
+       0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
+       0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
+       0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
+       // Bytes 1a80 - 1abf
+       0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
+       0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
+       0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
+       0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
+       0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
+       0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
+       0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
+       0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
+       // Bytes 1ac0 - 1aff
+       0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
+       0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
+       0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
+       0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
+       0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
+       0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
+       0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
+       0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
+       // Bytes 1b00 - 1b3f
+       0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
+       0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
+       0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
+       0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
+       0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
+       0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
+       0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
+       0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
+       // Bytes 1b40 - 1b7f
+       0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
+       0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
+       0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
+       0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
+       0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
+       0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
+       0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
+       0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
+       // Bytes 1b80 - 1bbf
+       0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
+       0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
+       0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
+       0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
+       0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
+       0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
+       0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
+       0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
+       // Bytes 1bc0 - 1bff
+       0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
+       0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
+       0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
+       0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
+       0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
+       0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
+       0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
+       0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
+       // Bytes 1c00 - 1c3f
+       0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
+       0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
+       0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
+       0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
+       0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
+       0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
+       0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
+       0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
+       // Bytes 1c40 - 1c7f
+       0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
+       0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
+       0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
+       0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
+       0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
+       0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
+       0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
+       0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
+       // Bytes 1c80 - 1cbf
+       0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
+       0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
+       0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
+       0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
+       0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
+       0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
+       0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
+       0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
+       // Bytes 1cc0 - 1cff
+       0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
+       0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
+       0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
+       0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
+       0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
+       0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
+       0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
+       0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
+       // Bytes 1d00 - 1d3f
+       0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
+       0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
+       0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
+       0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
+       0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
+       0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
+       0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
+       0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
+       // Bytes 1d40 - 1d7f
+       0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
+       0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
+       0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
+       0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
+       0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
+       0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
+       0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
+       0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
+       // Bytes 1d80 - 1dbf
+       0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
+       0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
+       0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
+       0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
+       0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
+       0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
+       0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
+       0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
+       // Bytes 1dc0 - 1dff
+       0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
+       0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
+       0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
+       0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
+       0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
+       0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
+       // Bytes 1e00 - 1e3f
+       0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
+       0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
+       0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
+       0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
+       0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
+       0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
+       0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
+       0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
+       // Bytes 1e40 - 1e7f
+       0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
+       0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
+       0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
+       0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
+       0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
+       // Bytes 1e80 - 1ebf
+       0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
+       0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
+       0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
+       0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
+       0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
+       // Bytes 1ec0 - 1eff
+       0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
+       0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
+       0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
+       0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
+       0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
+       0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
+       0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
+       0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
+       // Bytes 1f00 - 1f3f
+       0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
+       0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
+       0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
+       0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
+       0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
+       0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
+       0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
+       0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
+       // Bytes 1f40 - 1f7f
+       0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
+       0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
+       0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
+       0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
+       0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
+       0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
+       0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
+       0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
+       // Bytes 1f80 - 1fbf
+       0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
+       0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
+       0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
+       0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
+       0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
+       0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
+       0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
+       0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
+       // Bytes 1fc0 - 1fff
+       0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
+       0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
+       0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
+       0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
+       0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
+       0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
+       0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
+       0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
+       // Bytes 2000 - 203f
+       0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
+       0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
+       0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
+       0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
+       0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
+       0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
+       0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
+       0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
+       // Bytes 2040 - 207f
+       0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
+       0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
+       0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
+       0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
+       // Bytes 2080 - 20bf
+       0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
+       0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
+       0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
+       0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
+       // Bytes 20c0 - 20ff
+       0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
+       0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
+       0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
+       0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
+       0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
+       0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
+       0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
+       0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
+       // Bytes 2100 - 213f
+       0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
+       0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
+       0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
+       0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
+       0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
+       0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
+       0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
+       0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
+       // Bytes 2140 - 217f
+       0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
+       0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
+       0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
+       0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
+       0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
+       0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
+       0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
+       0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
+       // Bytes 2180 - 21bf
+       0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
+       0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
+       0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
+       0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
+       // Bytes 21c0 - 21ff
+       0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       // Bytes 2200 - 223f
+       0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
+       // Bytes 2240 - 227f
+       0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
+       // Bytes 2280 - 22bf
+       0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
+       0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
+       0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
+       0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       // Bytes 22c0 - 22ff
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
+       0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
+       0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
+       0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
+       0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
+       0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
+       0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
+       // Bytes 2300 - 233f
+       0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
+       0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
+       0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
+       // Bytes 2340 - 237f
+       0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
+       0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
+       0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
+       0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
+       // Bytes 2380 - 23bf
+       0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
+       0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
+       0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
+       0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
+       // Bytes 23c0 - 23ff
+       0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
+       0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
+       0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
+       0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
+       0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
+       0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
+       0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
+       0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       // Bytes 2400 - 243f
+       0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
+       0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
+       0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
+       0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
+       0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
+       0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
+       0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
+       // Bytes 2440 - 247f
+       0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
+       0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
+       0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
+       0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
+       // Bytes 2480 - 24bf
+       0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
+       0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
+       0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
+       0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
+       0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
+       0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
+       // Bytes 24c0 - 24ff
+       0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
+       0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
+       0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
+       0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
+       0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
+       0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
+       // Bytes 2500 - 253f
+       0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
+       0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
+       0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
+       0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
+       0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
+       0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
+       0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
+       // Bytes 2540 - 257f
+       0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
+       0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
+       0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
+       0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
+       // Bytes 2580 - 25bf
+       0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
+       0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
+       0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
+       0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
+       0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
+       0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
+       // Bytes 25c0 - 25ff
+       0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
+       0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
+       0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
+       0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
+       // Bytes 2600 - 263f
+       0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
+       0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
+       0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
+       0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
+       0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
+       // Bytes 2640 - 267f
+       0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
+       0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
+       0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
+       0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
+       0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
+       // Bytes 2680 - 26bf
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
+       0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
+       0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
+       0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
+       0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
+       // Bytes 26c0 - 26ff
+       0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
+       0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
+       0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
+       0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
+       0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
+       0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
+       0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
+       0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,
+       // Bytes 2700 - 273f
+       0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,
+       0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,
+       0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,
+       0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,
+       0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,
+       0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,
+       0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
+       // Bytes 2740 - 277f
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+       0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,
+       // Bytes 2780 - 27bf
+       0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,
+       0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,
+       0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,
+       // Bytes 27c0 - 27ff
+       0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,
+       0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,
+       0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,
+       0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,
+       0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,
+       0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,
+       // Bytes 2800 - 283f
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,
+       0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
+       0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,
+       0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,
+       0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,
+       // Bytes 2840 - 287f
+       0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,
+       0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,
+       // Bytes 2880 - 28bf
+       0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,
+       0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,
+       0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,
+       0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,
+       // Bytes 28c0 - 28ff
+       0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,
+       0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,
+       0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,
+       0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,
+       0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,
+       // Bytes 2900 - 293f
+       0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,
+       0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,
+       0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,
+       // Bytes 2940 - 297f
+       0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,
+       0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,
+       0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,
+       // Bytes 2980 - 29bf
+       0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,
+       0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
+       0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,
+       0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,
+       // Bytes 29c0 - 29ff
+       0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,
+       0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,
+       0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,
+       0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,
+       // Bytes 2a00 - 2a3f
+       0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,
+       0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,
+       0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,
+       0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2a40 - 2a7f
+       0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,
+       0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,
+       0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,
+       // Bytes 2a80 - 2abf
+       0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,
+       0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,
+       0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,
+       0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,
+       0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
+       // Bytes 2ac0 - 2aff
+       0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
+       0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,
+       0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,
+       0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,
+       // Bytes 2b00 - 2b3f
+       0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,
+       0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,
+       // Bytes 2b40 - 2b7f
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,
+       0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,
+       // Bytes 2b80 - 2bbf
+       0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,
+       0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,
+       0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,
+       0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,
+       // Bytes 2bc0 - 2bff
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2c00 - 2c3f
+       0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,
+       0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,
+       0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,
+       0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,
+       0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,
+       0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,
+       0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
+       0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,
+       // Bytes 2c40 - 2c7f
+       0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,
+       0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
+       0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,
+       0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,
+       // Bytes 2c80 - 2cbf
+       0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,
+       0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,
+       0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2cc0 - 2cff
+       0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,
+       0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2d00 - 2d3f
+       0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,
+       0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,
+       0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,
+       0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       // Bytes 2d40 - 2d7f
+       0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,
+       // Bytes 2d80 - 2dbf
+       0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,
+       0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,
+       0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,
+       0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,
+       0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,
+       0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,
+       0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,
+       0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,
+       // Bytes 2dc0 - 2dff
+       0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,
+       0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,
+       0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,
+       0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,
+       0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,
+       0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,
+       0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,
+       0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,
+       // Bytes 2e00 - 2e3f
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e40 - 2e7f
+       0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,
+       0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e80 - 2ebf
+       0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,
+       0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,
+       0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,
+       0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,
+       0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       // Bytes 2ec0 - 2eff
+       0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,
+       0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,
+       0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,
+       0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,
+       0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,
+       0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
+       0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,
+       0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,
+       // Bytes 2f00 - 2f3f
+       0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,
+       0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,
+       0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,
+       0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
+       0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,
+       // Bytes 2f40 - 2f7f
+       0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,
+       0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,
+       0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,
+       0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,
+       0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,
+       0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,
+       // Bytes 2f80 - 2fbf
+       0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,
+       0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,
+       0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,
+       0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,
+       0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,
+       0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,
+       0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,
+       0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,
+       // Bytes 2fc0 - 2fff
+       0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,
+       0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,
+       0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,
+       0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,
+       0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,
+       0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,
+       0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,
+       0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,
+       // Bytes 3000 - 303f
+       0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,
+       0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,
+       0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,
+       0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,
+       0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,
+       0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,
+       0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,
+       0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,
+       // Bytes 3040 - 307f
+       0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,
+       0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,
+       0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,
+       0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,
+       0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,
+       0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,
+       0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,
+       0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,
+       // Bytes 3080 - 30bf
+       0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,
+       0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,
+       0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,
+       0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,
+       0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,
+       0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,
+       0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,
+       0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,
+       // Bytes 30c0 - 30ff
+       0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,
+       0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,
+       0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,
+       0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,
+       0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,
+       0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,
+       0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,
+       // Bytes 3100 - 313f
+       0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,
+       0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,
+       0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,
+       0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,
+       0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,
+       0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,
+       0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,
+       // Bytes 3140 - 317f
+       0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,
+       0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,
+       0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,
+       0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,
+       0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,
+       0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,
+       0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,
+       0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,
+       // Bytes 3180 - 31bf
+       0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,
+       0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,
+       0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,
+       0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,
+       0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,
+       0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,
+       0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,
+       0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,
+       // Bytes 31c0 - 31ff
+       0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,
+       0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,
+       0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,
+       0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,
+       0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,
+       0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,
+       0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,
+       0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,
+       // Bytes 3200 - 323f
+       0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,
+       0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,
+       0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,
+       0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,
+       0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,
+       0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,
+       0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,
+       0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,
+       // Bytes 3240 - 327f
+       0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,
+       0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,
+       0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,
+       0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,
+       0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,
+       0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,
+       0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,
+       // Bytes 3280 - 32bf
+       0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,
+       0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,
+       0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,
+       0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,
+       0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,
+       0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,
+       0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,
+       0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,
+       // Bytes 32c0 - 32ff
+       0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,
+       0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,
+       0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,
+       0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,
+       0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,
+       0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,
+       0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,
+       0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,
+       // Bytes 3300 - 333f
+       0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,
+       0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,
+       0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,
+       0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,
+       0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,
+       0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,
+       0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,
+       0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,
+       // Bytes 3340 - 337f
+       0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,
+       0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,
+       0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,
+       0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,
+       0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,
+       0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,
+       0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,
+       0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,
+       // Bytes 3380 - 33bf
+       0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,
+       0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,
+       0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,
+       0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,
+       0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,
+       0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,
+       0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,
+       0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,
+       // Bytes 33c0 - 33ff
+       0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,
+       0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,
+       0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,
+       0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,
+       0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,
+       0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,
+       0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,
+       // Bytes 3400 - 343f
+       0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,
+       0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,
+       0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,
+       0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,
+       0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,
+       0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,
+       0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,
+       // Bytes 3440 - 347f
+       0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,
+       0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,
+       0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,
+       0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,
+       0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,
+       0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,
+       0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,
+       0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,
+       // Bytes 3480 - 34bf
+       0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,
+       0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,
+       0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,
+       0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,
+       0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,
+       0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,
+       0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,
+       0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,
+       // Bytes 34c0 - 34ff
+       0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,
+       0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,
+       0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,
+       0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,
+       0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,
+       0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,
+       0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,
+       0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,
+       // Bytes 3500 - 353f
+       0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,
+       0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,
+       0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,
+       0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,
+       0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,
+       0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,
+       0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,
+       0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,
+       // Bytes 3540 - 357f
+       0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,
+       0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,
+       0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,
+       0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,
+       0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,
+       0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,
+       0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,
+       0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,
+       // Bytes 3580 - 35bf
+       0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,
+       0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,
+       0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,
+       0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,
+       0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,
+       0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,
+       0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,
+       // Bytes 35c0 - 35ff
+       0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,
+       0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,
+       0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,
+       0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,
+       0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,
+       // Bytes 3600 - 363f
+       0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,
+       0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,
+       // Bytes 3640 - 367f
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,
+       // Bytes 3680 - 36bf
+       0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,
+       0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,
+       0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,
+       // Bytes 36c0 - 36ff
+       0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,
+       0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,
+       0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,
+       0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,
+       0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,
+       0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,
+       0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,
+       // Bytes 3700 - 373f
+       0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,
+       0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3740 - 377f
+       0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,
+       0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,
+       0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,
+       0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,
+       0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,
+       // Bytes 3780 - 37bf
+       0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,
+       // Bytes 37c0 - 37ff
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,
+       0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,
+       0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,
+       0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,
+       0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3800 - 383f
+       0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,
+       0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,
+       0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,
+       0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,
+       0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,
+       0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,
+       0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,
+       0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,
+       // Bytes 3840 - 387f
+       0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,
+       0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,
+       0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,
+       0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,
+       0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,
+       0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,
+       0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       // Bytes 3880 - 38bf
+       0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,
+       0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,
+       0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,
+       0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,
+       0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,
+       0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,
+       0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,
+       // Bytes 38c0 - 38ff
+       0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,
+       0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,
+       0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,
+       0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,
+       0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,
+       0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,
+       0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,
+       0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,
+       // Bytes 3900 - 393f
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,
+       0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,
+       0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,
+       0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,
+       0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,
+       // Bytes 3940 - 397f
+       0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,
+       0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,
+       0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,
+       0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,
+       0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,
+       0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,
+       0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
+       // Bytes 3980 - 39bf
+       0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,
+       0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,
+       0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,
+       0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,
+       0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,
+       0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,
+       0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,
+       0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,
+       // Bytes 39c0 - 39ff
+       0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,
+       0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,
+       0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,
+       0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       // Bytes 3a00 - 3a3f
+       0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,
+       0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,
+       0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,
+       0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,
+       0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       // Bytes 3a40 - 3a7f
+       0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,
+       0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,
+       0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,
+       0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,
+       0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,
+       0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,
+       0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,
+       // Bytes 3a80 - 3abf
+       0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,
+       0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,
+       0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,
+       0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,
+       0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,
+       0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,
+       // Bytes 3ac0 - 3aff
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
+       0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,
+       0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,
+       0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,
+       0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,
+       // Bytes 3b00 - 3b3f
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,
+       0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,
+       0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,
+       0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,
+       0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,
+       // Bytes 3b40 - 3b7f
+       0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,
+       0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,
+       0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,
+       0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,
+       0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,
+       0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
+       0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,
+       // Bytes 3b80 - 3bbf
+       0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,
+       0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,
+       0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,
+       0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,
+       0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,
+       0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,
+       0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,
+       0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,
+       // Bytes 3bc0 - 3bff
+       0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
+       0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,
+       // Bytes 3c00 - 3c3f
+       0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       // Bytes 3c40 - 3c7f
+       0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       // Bytes 3c80 - 3cbf
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,
+       // Bytes 3cc0 - 3cff
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,
+       0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       // Bytes 3d00 - 3d3f
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3d40 - 3d7f
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       // Bytes 3d80 - 3dbf
+       0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       // Bytes 3dc0 - 3dff
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       // Bytes 3e00 - 3e3f
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3e40 - 3e7f
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       // Bytes 3e80 - 3ebf
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       // Bytes 3ec0 - 3eff
+       0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,
+       0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,
+       // Bytes 3f00 - 3f3f
+       0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f40 - 3f7f
+       0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f80 - 3fbf
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,
+       // Bytes 3fc0 - 3fff
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4000 - 403f
+       0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4040 - 407f
+       0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4080 - 40bf
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 40c0 - 40ff
+       0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       // Bytes 4100 - 413f
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       // Bytes 4140 - 417f
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,
+       // Bytes 4180 - 41bf
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       // Bytes 41c0 - 41ff
+       0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       // Bytes 4200 - 423f
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,
+       // Bytes 4240 - 427f
+       0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,
+       0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,
+       0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,
+       0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,
+       0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,
+       0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,
+       0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,
+       0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,
+       // Bytes 4280 - 42bf
+       0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,
+       0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,
+       0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,
+       0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,
+       0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,
+       0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,
+       0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,
+       0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,
+       // Bytes 42c0 - 42ff
+       0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,
+       0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,
+       0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,
+       0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,
+       0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,
+       0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,
+       0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,
+       // Bytes 4300 - 433f
+       0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,
+       0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,
+       0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,
+       // Bytes 4340 - 437f
+       0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,
+       0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,
+       0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,
+       // Bytes 4380 - 43bf
+       0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,
+       0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,
+       // Bytes 43c0 - 43ff
+       0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,
+       0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,
+       0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,
+       // Bytes 4400 - 443f
+       0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,
+       0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,
+       0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,
+       0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,
+       0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,
+       0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,
+       0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,
+       // Bytes 4440 - 447f
+       0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,
+       0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,
+       0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,
+       0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,
+       0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,
+       0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,
+       0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,
+       0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,
+       // Bytes 4480 - 44bf
+       0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,
+       0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,
+       0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,
+       0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,
+       0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,
+       0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,
+       0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,
+       // Bytes 44c0 - 44ff
+       0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,
+       0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,
+       0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,
+       0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,
+       0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,
+       0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,
+       // Bytes 4500 - 453f
+       0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,
+       0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,
+       // Bytes 4540 - 457f
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,
+       // Bytes 4580 - 45bf
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,
+       // Bytes 45c0 - 45ff
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,
+       0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,
+       0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,
+       // Bytes 4600 - 463f
+       0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,
+       0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,
+       0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       // Bytes 4640 - 467f
+       0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,
+       0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       // Bytes 4680 - 46bf
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,
+       0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,
+       0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,
+       0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,
+       0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,
+       0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,
+       0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,
+       0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,
+       // Bytes 46c0 - 46ff
+       0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,
+       0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,
+       0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,
+       0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,
+       0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,
+       0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,
+       0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,
+       0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,
+       // Bytes 4700 - 473f
+       0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,
+       0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,
+       0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,
+       0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,
+       0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,
+       0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,
+       0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,
+       0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,
+       // Bytes 4740 - 477f
+       0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,
+       0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,
+       0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,
+       0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,
+       0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,
+       0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,
+       0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,
+       0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,
+       // Bytes 4780 - 47bf
+       0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,
+       0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,
+       0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,
+       0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,
+       0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,
+       0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,
+       // Bytes 47c0 - 47ff
+       0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,
+       // Bytes 4800 - 483f
+       0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,
+       0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,
+       0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,
+       0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,
+       // Bytes 4840 - 487f
+       0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,
+       0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,
+       0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,
+       0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,
+       0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,
+       // Bytes 4880 - 48bf
+       0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       // Bytes 48c0 - 48ff
+       0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       // Bytes 4900 - 493f
+       0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       // Bytes 4940 - 497f
+       0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       // Bytes 4980 - 49bf
+       0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,
+       0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,
+       0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,
+       // Bytes 49c0 - 49ff
+       0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,
+       // Bytes 4a00 - 4a3f
+       0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,
+       // Bytes 4a40 - 4a7f
+       0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,
+       0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,
+       0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,
+       0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,
+       // Bytes 4a80 - 4abf
+       0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,
+       0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,
+       0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,
+       0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,
+       0x01,
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfcTrie. Total size: 10586 bytes (10.34 KiB). Checksum: dd926e82067bee11.
+type nfcTrie struct{}
+
+func newNfcTrie(i int) *nfcTrie {
+       return &nfcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 46:
+               return uint16(nfcValues[n<<6+uint32(b)])
+       default:
+               n -= 46
+               return uint16(nfcSparse.lookup(n, b))
+       }
+}
+
+// nfcValues: 48 blocks, 3072 entries, 6144 bytes
+// The third block is the zero block.
+var nfcValues = [3072]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,
+       // Block 0x5, offset 0x140
+       0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,
+       // Block 0x6, offset 0x180
+       0x184: 0x8100, 0x185: 0x8100,
+       0x186: 0x8100,
+       0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x8100,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x8100, 0x285: 0x35a1,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,
+       0x2c6: 0xa000, 0x2c7: 0x3709,
+       0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,
+       0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
+       0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,
+       0x2de: 0xa000, 0x2e3: 0xa000,
+       0x2e7: 0xa000,
+       0x2eb: 0xa000, 0x2ed: 0xa000,
+       0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
+       0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,
+       0x2fe: 0xa000,
+       // Block 0xc, offset 0x300
+       0x301: 0x3733, 0x302: 0x37b7,
+       0x310: 0x370f, 0x311: 0x3793,
+       0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,
+       0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,
+       0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,
+       0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,
+       0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,
+       0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,
+       0x338: 0x3787, 0x339: 0x380b,
+       // Block 0xd, offset 0x340
+       0x351: 0x812d,
+       0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,
+       0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,
+       0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,
+       0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,
+       0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,
+       0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,
+       0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,
+       0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,
+       // Block 0xe, offset 0x380
+       0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,
+       0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,
+       0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x812d,
+       0x3b0: 0x811e,
+       // Block 0xf, offset 0x3c0
+       0x3d3: 0x812d, 0x3d4: 0x8132, 0x3d5: 0x8132, 0x3d6: 0x8132, 0x3d7: 0x8132,
+       0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x8132, 0x3dd: 0x8132,
+       0x3de: 0x8132, 0x3df: 0x8132, 0x3e0: 0x8132, 0x3e1: 0x8132, 0x3e3: 0x812d,
+       0x3e4: 0x8132, 0x3e5: 0x8132, 0x3e6: 0x812d, 0x3e7: 0x8132, 0x3e8: 0x8132, 0x3e9: 0x812d,
+       0x3ea: 0x8132, 0x3eb: 0x8132, 0x3ec: 0x8132, 0x3ed: 0x812d, 0x3ee: 0x812d, 0x3ef: 0x812d,
+       0x3f0: 0x8116, 0x3f1: 0x8117, 0x3f2: 0x8118, 0x3f3: 0x8132, 0x3f4: 0x8132, 0x3f5: 0x8132,
+       0x3f6: 0x812d, 0x3f7: 0x8132, 0x3f8: 0x8132, 0x3f9: 0x812d, 0x3fa: 0x812d, 0x3fb: 0x8132,
+       0x3fc: 0x8132, 0x3fd: 0x8132, 0x3fe: 0x8132, 0x3ff: 0x8132,
+       // Block 0x10, offset 0x400
+       0x405: 0xa000,
+       0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,
+       0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,
+       0x412: 0x2d4e,
+       0x434: 0x8102, 0x435: 0x9900,
+       0x43a: 0xa000, 0x43b: 0x2d56,
+       0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,
+       // Block 0x11, offset 0x440
+       0x440: 0x8132, 0x441: 0x8132, 0x442: 0x812d, 0x443: 0x8132, 0x444: 0x8132, 0x445: 0x8132,
+       0x446: 0x8132, 0x447: 0x8132, 0x448: 0x8132, 0x449: 0x8132, 0x44a: 0x812d, 0x44b: 0x8132,
+       0x44c: 0x8132, 0x44d: 0x8135, 0x44e: 0x812a, 0x44f: 0x812d, 0x450: 0x8129, 0x451: 0x8132,
+       0x452: 0x8132, 0x453: 0x8132, 0x454: 0x8132, 0x455: 0x8132, 0x456: 0x8132, 0x457: 0x8132,
+       0x458: 0x8132, 0x459: 0x8132, 0x45a: 0x8132, 0x45b: 0x8132, 0x45c: 0x8132, 0x45d: 0x8132,
+       0x45e: 0x8132, 0x45f: 0x8132, 0x460: 0x8132, 0x461: 0x8132, 0x462: 0x8132, 0x463: 0x8132,
+       0x464: 0x8132, 0x465: 0x8132, 0x466: 0x8132, 0x467: 0x8132, 0x468: 0x8132, 0x469: 0x8132,
+       0x46a: 0x8132, 0x46b: 0x8132, 0x46c: 0x8132, 0x46d: 0x8132, 0x46e: 0x8132, 0x46f: 0x8132,
+       0x470: 0x8132, 0x471: 0x8132, 0x472: 0x8132, 0x473: 0x8132, 0x474: 0x8132, 0x475: 0x8132,
+       0x476: 0x8133, 0x477: 0x8131, 0x478: 0x8131, 0x479: 0x812d, 0x47b: 0x8132,
+       0x47c: 0x8134, 0x47d: 0x812d, 0x47e: 0x8132, 0x47f: 0x812d,
+       // Block 0x12, offset 0x480
+       0x480: 0x2f97, 0x481: 0x32a3, 0x482: 0x2fa1, 0x483: 0x32ad, 0x484: 0x2fa6, 0x485: 0x32b2,
+       0x486: 0x2fab, 0x487: 0x32b7, 0x488: 0x38cc, 0x489: 0x3a5b, 0x48a: 0x2fc4, 0x48b: 0x32d0,
+       0x48c: 0x2fce, 0x48d: 0x32da, 0x48e: 0x2fdd, 0x48f: 0x32e9, 0x490: 0x2fd3, 0x491: 0x32df,
+       0x492: 0x2fd8, 0x493: 0x32e4, 0x494: 0x38ef, 0x495: 0x3a7e, 0x496: 0x38f6, 0x497: 0x3a85,
+       0x498: 0x3019, 0x499: 0x3325, 0x49a: 0x301e, 0x49b: 0x332a, 0x49c: 0x3904, 0x49d: 0x3a93,
+       0x49e: 0x3023, 0x49f: 0x332f, 0x4a0: 0x3032, 0x4a1: 0x333e, 0x4a2: 0x3050, 0x4a3: 0x335c,
+       0x4a4: 0x305f, 0x4a5: 0x336b, 0x4a6: 0x3055, 0x4a7: 0x3361, 0x4a8: 0x3064, 0x4a9: 0x3370,
+       0x4aa: 0x3069, 0x4ab: 0x3375, 0x4ac: 0x30af, 0x4ad: 0x33bb, 0x4ae: 0x390b, 0x4af: 0x3a9a,
+       0x4b0: 0x30b9, 0x4b1: 0x33ca, 0x4b2: 0x30c3, 0x4b3: 0x33d4, 0x4b4: 0x30cd, 0x4b5: 0x33de,
+       0x4b6: 0x46c4, 0x4b7: 0x4755, 0x4b8: 0x3912, 0x4b9: 0x3aa1, 0x4ba: 0x30e6, 0x4bb: 0x33f7,
+       0x4bc: 0x30e1, 0x4bd: 0x33f2, 0x4be: 0x30eb, 0x4bf: 0x33fc,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x30f0, 0x4c1: 0x3401, 0x4c2: 0x30f5, 0x4c3: 0x3406, 0x4c4: 0x3109, 0x4c5: 0x341a,
+       0x4c6: 0x3113, 0x4c7: 0x3424, 0x4c8: 0x3122, 0x4c9: 0x3433, 0x4ca: 0x311d, 0x4cb: 0x342e,
+       0x4cc: 0x3935, 0x4cd: 0x3ac4, 0x4ce: 0x3943, 0x4cf: 0x3ad2, 0x4d0: 0x394a, 0x4d1: 0x3ad9,
+       0x4d2: 0x3951, 0x4d3: 0x3ae0, 0x4d4: 0x314f, 0x4d5: 0x3460, 0x4d6: 0x3154, 0x4d7: 0x3465,
+       0x4d8: 0x315e, 0x4d9: 0x346f, 0x4da: 0x46f1, 0x4db: 0x4782, 0x4dc: 0x3997, 0x4dd: 0x3b26,
+       0x4de: 0x3177, 0x4df: 0x3488, 0x4e0: 0x3181, 0x4e1: 0x3492, 0x4e2: 0x4700, 0x4e3: 0x4791,
+       0x4e4: 0x399e, 0x4e5: 0x3b2d, 0x4e6: 0x39a5, 0x4e7: 0x3b34, 0x4e8: 0x39ac, 0x4e9: 0x3b3b,
+       0x4ea: 0x3190, 0x4eb: 0x34a1, 0x4ec: 0x319a, 0x4ed: 0x34b0, 0x4ee: 0x31ae, 0x4ef: 0x34c4,
+       0x4f0: 0x31a9, 0x4f1: 0x34bf, 0x4f2: 0x31ea, 0x4f3: 0x3500, 0x4f4: 0x31f9, 0x4f5: 0x350f,
+       0x4f6: 0x31f4, 0x4f7: 0x350a, 0x4f8: 0x39b3, 0x4f9: 0x3b42, 0x4fa: 0x39ba, 0x4fb: 0x3b49,
+       0x4fc: 0x31fe, 0x4fd: 0x3514, 0x4fe: 0x3203, 0x4ff: 0x3519,
+       // Block 0x14, offset 0x500
+       0x500: 0x3208, 0x501: 0x351e, 0x502: 0x320d, 0x503: 0x3523, 0x504: 0x321c, 0x505: 0x3532,
+       0x506: 0x3217, 0x507: 0x352d, 0x508: 0x3221, 0x509: 0x353c, 0x50a: 0x3226, 0x50b: 0x3541,
+       0x50c: 0x322b, 0x50d: 0x3546, 0x50e: 0x3249, 0x50f: 0x3564, 0x510: 0x3262, 0x511: 0x3582,
+       0x512: 0x3271, 0x513: 0x3591, 0x514: 0x3276, 0x515: 0x3596, 0x516: 0x337a, 0x517: 0x34a6,
+       0x518: 0x3537, 0x519: 0x3573, 0x51b: 0x35d1,
+       0x520: 0x46a1, 0x521: 0x4732, 0x522: 0x2f83, 0x523: 0x328f,
+       0x524: 0x3878, 0x525: 0x3a07, 0x526: 0x3871, 0x527: 0x3a00, 0x528: 0x3886, 0x529: 0x3a15,
+       0x52a: 0x387f, 0x52b: 0x3a0e, 0x52c: 0x38be, 0x52d: 0x3a4d, 0x52e: 0x3894, 0x52f: 0x3a23,
+       0x530: 0x388d, 0x531: 0x3a1c, 0x532: 0x38a2, 0x533: 0x3a31, 0x534: 0x389b, 0x535: 0x3a2a,
+       0x536: 0x38c5, 0x537: 0x3a54, 0x538: 0x46b5, 0x539: 0x4746, 0x53a: 0x3000, 0x53b: 0x330c,
+       0x53c: 0x2fec, 0x53d: 0x32f8, 0x53e: 0x38da, 0x53f: 0x3a69,
+       // Block 0x15, offset 0x540
+       0x540: 0x38d3, 0x541: 0x3a62, 0x542: 0x38e8, 0x543: 0x3a77, 0x544: 0x38e1, 0x545: 0x3a70,
+       0x546: 0x38fd, 0x547: 0x3a8c, 0x548: 0x3091, 0x549: 0x339d, 0x54a: 0x30a5, 0x54b: 0x33b1,
+       0x54c: 0x46e7, 0x54d: 0x4778, 0x54e: 0x3136, 0x54f: 0x3447, 0x550: 0x3920, 0x551: 0x3aaf,
+       0x552: 0x3919, 0x553: 0x3aa8, 0x554: 0x392e, 0x555: 0x3abd, 0x556: 0x3927, 0x557: 0x3ab6,
+       0x558: 0x3989, 0x559: 0x3b18, 0x55a: 0x396d, 0x55b: 0x3afc, 0x55c: 0x3966, 0x55d: 0x3af5,
+       0x55e: 0x397b, 0x55f: 0x3b0a, 0x560: 0x3974, 0x561: 0x3b03, 0x562: 0x3982, 0x563: 0x3b11,
+       0x564: 0x31e5, 0x565: 0x34fb, 0x566: 0x31c7, 0x567: 0x34dd, 0x568: 0x39e4, 0x569: 0x3b73,
+       0x56a: 0x39dd, 0x56b: 0x3b6c, 0x56c: 0x39f2, 0x56d: 0x3b81, 0x56e: 0x39eb, 0x56f: 0x3b7a,
+       0x570: 0x39f9, 0x571: 0x3b88, 0x572: 0x3230, 0x573: 0x354b, 0x574: 0x3258, 0x575: 0x3578,
+       0x576: 0x3253, 0x577: 0x356e, 0x578: 0x323f, 0x579: 0x355a,
+       // Block 0x16, offset 0x580
+       0x580: 0x4804, 0x581: 0x480a, 0x582: 0x491e, 0x583: 0x4936, 0x584: 0x4926, 0x585: 0x493e,
+       0x586: 0x492e, 0x587: 0x4946, 0x588: 0x47aa, 0x589: 0x47b0, 0x58a: 0x488e, 0x58b: 0x48a6,
+       0x58c: 0x4896, 0x58d: 0x48ae, 0x58e: 0x489e, 0x58f: 0x48b6, 0x590: 0x4816, 0x591: 0x481c,
+       0x592: 0x3db8, 0x593: 0x3dc8, 0x594: 0x3dc0, 0x595: 0x3dd0,
+       0x598: 0x47b6, 0x599: 0x47bc, 0x59a: 0x3ce8, 0x59b: 0x3cf8, 0x59c: 0x3cf0, 0x59d: 0x3d00,
+       0x5a0: 0x482e, 0x5a1: 0x4834, 0x5a2: 0x494e, 0x5a3: 0x4966,
+       0x5a4: 0x4956, 0x5a5: 0x496e, 0x5a6: 0x495e, 0x5a7: 0x4976, 0x5a8: 0x47c2, 0x5a9: 0x47c8,
+       0x5aa: 0x48be, 0x5ab: 0x48d6, 0x5ac: 0x48c6, 0x5ad: 0x48de, 0x5ae: 0x48ce, 0x5af: 0x48e6,
+       0x5b0: 0x4846, 0x5b1: 0x484c, 0x5b2: 0x3e18, 0x5b3: 0x3e30, 0x5b4: 0x3e20, 0x5b5: 0x3e38,
+       0x5b6: 0x3e28, 0x5b7: 0x3e40, 0x5b8: 0x47ce, 0x5b9: 0x47d4, 0x5ba: 0x3d18, 0x5bb: 0x3d30,
+       0x5bc: 0x3d20, 0x5bd: 0x3d38, 0x5be: 0x3d28, 0x5bf: 0x3d40,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x4852, 0x5c1: 0x4858, 0x5c2: 0x3e48, 0x5c3: 0x3e58, 0x5c4: 0x3e50, 0x5c5: 0x3e60,
+       0x5c8: 0x47da, 0x5c9: 0x47e0, 0x5ca: 0x3d48, 0x5cb: 0x3d58,
+       0x5cc: 0x3d50, 0x5cd: 0x3d60, 0x5d0: 0x4864, 0x5d1: 0x486a,
+       0x5d2: 0x3e80, 0x5d3: 0x3e98, 0x5d4: 0x3e88, 0x5d5: 0x3ea0, 0x5d6: 0x3e90, 0x5d7: 0x3ea8,
+       0x5d9: 0x47e6, 0x5db: 0x3d68, 0x5dd: 0x3d70,
+       0x5df: 0x3d78, 0x5e0: 0x487c, 0x5e1: 0x4882, 0x5e2: 0x497e, 0x5e3: 0x4996,
+       0x5e4: 0x4986, 0x5e5: 0x499e, 0x5e6: 0x498e, 0x5e7: 0x49a6, 0x5e8: 0x47ec, 0x5e9: 0x47f2,
+       0x5ea: 0x48ee, 0x5eb: 0x4906, 0x5ec: 0x48f6, 0x5ed: 0x490e, 0x5ee: 0x48fe, 0x5ef: 0x4916,
+       0x5f0: 0x47f8, 0x5f1: 0x431e, 0x5f2: 0x3691, 0x5f3: 0x4324, 0x5f4: 0x4822, 0x5f5: 0x432a,
+       0x5f6: 0x36a3, 0x5f7: 0x4330, 0x5f8: 0x36c1, 0x5f9: 0x4336, 0x5fa: 0x36d9, 0x5fb: 0x433c,
+       0x5fc: 0x4870, 0x5fd: 0x4342,
+       // Block 0x18, offset 0x600
+       0x600: 0x3da0, 0x601: 0x3da8, 0x602: 0x4184, 0x603: 0x41a2, 0x604: 0x418e, 0x605: 0x41ac,
+       0x606: 0x4198, 0x607: 0x41b6, 0x608: 0x3cd8, 0x609: 0x3ce0, 0x60a: 0x40d0, 0x60b: 0x40ee,
+       0x60c: 0x40da, 0x60d: 0x40f8, 0x60e: 0x40e4, 0x60f: 0x4102, 0x610: 0x3de8, 0x611: 0x3df0,
+       0x612: 0x41c0, 0x613: 0x41de, 0x614: 0x41ca, 0x615: 0x41e8, 0x616: 0x41d4, 0x617: 0x41f2,
+       0x618: 0x3d08, 0x619: 0x3d10, 0x61a: 0x410c, 0x61b: 0x412a, 0x61c: 0x4116, 0x61d: 0x4134,
+       0x61e: 0x4120, 0x61f: 0x413e, 0x620: 0x3ec0, 0x621: 0x3ec8, 0x622: 0x41fc, 0x623: 0x421a,
+       0x624: 0x4206, 0x625: 0x4224, 0x626: 0x4210, 0x627: 0x422e, 0x628: 0x3d80, 0x629: 0x3d88,
+       0x62a: 0x4148, 0x62b: 0x4166, 0x62c: 0x4152, 0x62d: 0x4170, 0x62e: 0x415c, 0x62f: 0x417a,
+       0x630: 0x3685, 0x631: 0x367f, 0x632: 0x3d90, 0x633: 0x368b, 0x634: 0x3d98,
+       0x636: 0x4810, 0x637: 0x3db0, 0x638: 0x35f5, 0x639: 0x35ef, 0x63a: 0x35e3, 0x63b: 0x42ee,
+       0x63c: 0x35fb, 0x63d: 0x8100, 0x63e: 0x01d3, 0x63f: 0xa100,
+       // Block 0x19, offset 0x640
+       0x640: 0x8100, 0x641: 0x35a7, 0x642: 0x3dd8, 0x643: 0x369d, 0x644: 0x3de0,
+       0x646: 0x483a, 0x647: 0x3df8, 0x648: 0x3601, 0x649: 0x42f4, 0x64a: 0x360d, 0x64b: 0x42fa,
+       0x64c: 0x3619, 0x64d: 0x3b8f, 0x64e: 0x3b96, 0x64f: 0x3b9d, 0x650: 0x36b5, 0x651: 0x36af,
+       0x652: 0x3e00, 0x653: 0x44e4, 0x656: 0x36bb, 0x657: 0x3e10,
+       0x658: 0x3631, 0x659: 0x362b, 0x65a: 0x361f, 0x65b: 0x4300, 0x65d: 0x3ba4,
+       0x65e: 0x3bab, 0x65f: 0x3bb2, 0x660: 0x36eb, 0x661: 0x36e5, 0x662: 0x3e68, 0x663: 0x44ec,
+       0x664: 0x36cd, 0x665: 0x36d3, 0x666: 0x36f1, 0x667: 0x3e78, 0x668: 0x3661, 0x669: 0x365b,
+       0x66a: 0x364f, 0x66b: 0x430c, 0x66c: 0x3649, 0x66d: 0x359b, 0x66e: 0x42e8, 0x66f: 0x0081,
+       0x672: 0x3eb0, 0x673: 0x36f7, 0x674: 0x3eb8,
+       0x676: 0x4888, 0x677: 0x3ed0, 0x678: 0x363d, 0x679: 0x4306, 0x67a: 0x366d, 0x67b: 0x4318,
+       0x67c: 0x3679, 0x67d: 0x4256, 0x67e: 0xa100,
+       // Block 0x1a, offset 0x680
+       0x681: 0x3c06, 0x683: 0xa000, 0x684: 0x3c0d, 0x685: 0xa000,
+       0x687: 0x3c14, 0x688: 0xa000, 0x689: 0x3c1b,
+       0x68d: 0xa000,
+       0x6a0: 0x2f65, 0x6a1: 0xa000, 0x6a2: 0x3c29,
+       0x6a4: 0xa000, 0x6a5: 0xa000,
+       0x6ad: 0x3c22, 0x6ae: 0x2f60, 0x6af: 0x2f6a,
+       0x6b0: 0x3c30, 0x6b1: 0x3c37, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3c3e, 0x6b5: 0x3c45,
+       0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3c4c, 0x6b9: 0x3c53, 0x6ba: 0xa000, 0x6bb: 0xa000,
+       0x6bc: 0xa000, 0x6bd: 0xa000,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x3c5a, 0x6c1: 0x3c61, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3c76, 0x6c5: 0x3c7d,
+       0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3c84, 0x6c9: 0x3c8b,
+       0x6d1: 0xa000,
+       0x6d2: 0xa000,
+       0x6e2: 0xa000,
+       0x6e8: 0xa000, 0x6e9: 0xa000,
+       0x6eb: 0xa000, 0x6ec: 0x3ca0, 0x6ed: 0x3ca7, 0x6ee: 0x3cae, 0x6ef: 0x3cb5,
+       0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000,
+       // Block 0x1c, offset 0x700
+       0x706: 0xa000, 0x70b: 0xa000,
+       0x70c: 0x3f08, 0x70d: 0xa000, 0x70e: 0x3f10, 0x70f: 0xa000, 0x710: 0x3f18, 0x711: 0xa000,
+       0x712: 0x3f20, 0x713: 0xa000, 0x714: 0x3f28, 0x715: 0xa000, 0x716: 0x3f30, 0x717: 0xa000,
+       0x718: 0x3f38, 0x719: 0xa000, 0x71a: 0x3f40, 0x71b: 0xa000, 0x71c: 0x3f48, 0x71d: 0xa000,
+       0x71e: 0x3f50, 0x71f: 0xa000, 0x720: 0x3f58, 0x721: 0xa000, 0x722: 0x3f60,
+       0x724: 0xa000, 0x725: 0x3f68, 0x726: 0xa000, 0x727: 0x3f70, 0x728: 0xa000, 0x729: 0x3f78,
+       0x72f: 0xa000,
+       0x730: 0x3f80, 0x731: 0x3f88, 0x732: 0xa000, 0x733: 0x3f90, 0x734: 0x3f98, 0x735: 0xa000,
+       0x736: 0x3fa0, 0x737: 0x3fa8, 0x738: 0xa000, 0x739: 0x3fb0, 0x73a: 0x3fb8, 0x73b: 0xa000,
+       0x73c: 0x3fc0, 0x73d: 0x3fc8,
+       // Block 0x1d, offset 0x740
+       0x754: 0x3f00,
+       0x759: 0x9903, 0x75a: 0x9903, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000,
+       0x75e: 0x3fd0,
+       0x766: 0xa000,
+       0x76b: 0xa000, 0x76c: 0x3fe0, 0x76d: 0xa000, 0x76e: 0x3fe8, 0x76f: 0xa000,
+       0x770: 0x3ff0, 0x771: 0xa000, 0x772: 0x3ff8, 0x773: 0xa000, 0x774: 0x4000, 0x775: 0xa000,
+       0x776: 0x4008, 0x777: 0xa000, 0x778: 0x4010, 0x779: 0xa000, 0x77a: 0x4018, 0x77b: 0xa000,
+       0x77c: 0x4020, 0x77d: 0xa000, 0x77e: 0x4028, 0x77f: 0xa000,
+       // Block 0x1e, offset 0x780
+       0x780: 0x4030, 0x781: 0xa000, 0x782: 0x4038, 0x784: 0xa000, 0x785: 0x4040,
+       0x786: 0xa000, 0x787: 0x4048, 0x788: 0xa000, 0x789: 0x4050,
+       0x78f: 0xa000, 0x790: 0x4058, 0x791: 0x4060,
+       0x792: 0xa000, 0x793: 0x4068, 0x794: 0x4070, 0x795: 0xa000, 0x796: 0x4078, 0x797: 0x4080,
+       0x798: 0xa000, 0x799: 0x4088, 0x79a: 0x4090, 0x79b: 0xa000, 0x79c: 0x4098, 0x79d: 0x40a0,
+       0x7af: 0xa000,
+       0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x3fd8,
+       0x7b7: 0x40a8, 0x7b8: 0x40b0, 0x7b9: 0x40b8, 0x7ba: 0x40c0,
+       0x7bd: 0xa000, 0x7be: 0x40c8,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x1377, 0x7c1: 0x0cfb, 0x7c2: 0x13d3, 0x7c3: 0x139f, 0x7c4: 0x0e57, 0x7c5: 0x06eb,
+       0x7c6: 0x08df, 0x7c7: 0x162b, 0x7c8: 0x162b, 0x7c9: 0x0a0b, 0x7ca: 0x145f, 0x7cb: 0x0943,
+       0x7cc: 0x0a07, 0x7cd: 0x0bef, 0x7ce: 0x0fcf, 0x7cf: 0x115f, 0x7d0: 0x1297, 0x7d1: 0x12d3,
+       0x7d2: 0x1307, 0x7d3: 0x141b, 0x7d4: 0x0d73, 0x7d5: 0x0dff, 0x7d6: 0x0eab, 0x7d7: 0x0f43,
+       0x7d8: 0x125f, 0x7d9: 0x1447, 0x7da: 0x1573, 0x7db: 0x070f, 0x7dc: 0x08b3, 0x7dd: 0x0d87,
+       0x7de: 0x0ecf, 0x7df: 0x1293, 0x7e0: 0x15c3, 0x7e1: 0x0ab3, 0x7e2: 0x0e77, 0x7e3: 0x1283,
+       0x7e4: 0x1317, 0x7e5: 0x0c23, 0x7e6: 0x11bb, 0x7e7: 0x12df, 0x7e8: 0x0b1f, 0x7e9: 0x0d0f,
+       0x7ea: 0x0e17, 0x7eb: 0x0f1b, 0x7ec: 0x1427, 0x7ed: 0x074f, 0x7ee: 0x07e7, 0x7ef: 0x0853,
+       0x7f0: 0x0c8b, 0x7f1: 0x0d7f, 0x7f2: 0x0ecb, 0x7f3: 0x0fef, 0x7f4: 0x1177, 0x7f5: 0x128b,
+       0x7f6: 0x12a3, 0x7f7: 0x13c7, 0x7f8: 0x14ef, 0x7f9: 0x15a3, 0x7fa: 0x15bf, 0x7fb: 0x102b,
+       0x7fc: 0x106b, 0x7fd: 0x1123, 0x7fe: 0x1243, 0x7ff: 0x147b,
+       // Block 0x20, offset 0x800
+       0x800: 0x15cb, 0x801: 0x134b, 0x802: 0x09c7, 0x803: 0x0b3b, 0x804: 0x10db, 0x805: 0x119b,
+       0x806: 0x0eff, 0x807: 0x1033, 0x808: 0x1397, 0x809: 0x14e7, 0x80a: 0x09c3, 0x80b: 0x0a8f,
+       0x80c: 0x0d77, 0x80d: 0x0e2b, 0x80e: 0x0e5f, 0x80f: 0x1113, 0x810: 0x113b, 0x811: 0x14a7,
+       0x812: 0x084f, 0x813: 0x11a7, 0x814: 0x07f3, 0x815: 0x07ef, 0x816: 0x1097, 0x817: 0x1127,
+       0x818: 0x125b, 0x819: 0x14af, 0x81a: 0x1367, 0x81b: 0x0c27, 0x81c: 0x0d73, 0x81d: 0x1357,
+       0x81e: 0x06f7, 0x81f: 0x0a63, 0x820: 0x0b93, 0x821: 0x0f2f, 0x822: 0x0faf, 0x823: 0x0873,
+       0x824: 0x103b, 0x825: 0x075f, 0x826: 0x0b77, 0x827: 0x06d7, 0x828: 0x0deb, 0x829: 0x0ca3,
+       0x82a: 0x110f, 0x82b: 0x08c7, 0x82c: 0x09b3, 0x82d: 0x0ffb, 0x82e: 0x1263, 0x82f: 0x133b,
+       0x830: 0x0db7, 0x831: 0x13f7, 0x832: 0x0de3, 0x833: 0x0c37, 0x834: 0x121b, 0x835: 0x0c57,
+       0x836: 0x0fab, 0x837: 0x072b, 0x838: 0x07a7, 0x839: 0x07eb, 0x83a: 0x0d53, 0x83b: 0x10fb,
+       0x83c: 0x11f3, 0x83d: 0x1347, 0x83e: 0x145b, 0x83f: 0x085b,
+       // Block 0x21, offset 0x840
+       0x840: 0x090f, 0x841: 0x0a17, 0x842: 0x0b2f, 0x843: 0x0cbf, 0x844: 0x0e7b, 0x845: 0x103f,
+       0x846: 0x1497, 0x847: 0x157b, 0x848: 0x15cf, 0x849: 0x15e7, 0x84a: 0x0837, 0x84b: 0x0cf3,
+       0x84c: 0x0da3, 0x84d: 0x13eb, 0x84e: 0x0afb, 0x84f: 0x0bd7, 0x850: 0x0bf3, 0x851: 0x0c83,
+       0x852: 0x0e6b, 0x853: 0x0eb7, 0x854: 0x0f67, 0x855: 0x108b, 0x856: 0x112f, 0x857: 0x1193,
+       0x858: 0x13db, 0x859: 0x126b, 0x85a: 0x1403, 0x85b: 0x147f, 0x85c: 0x080f, 0x85d: 0x083b,
+       0x85e: 0x0923, 0x85f: 0x0ea7, 0x860: 0x12f3, 0x861: 0x133b, 0x862: 0x0b1b, 0x863: 0x0b8b,
+       0x864: 0x0c4f, 0x865: 0x0daf, 0x866: 0x10d7, 0x867: 0x0f23, 0x868: 0x073b, 0x869: 0x097f,
+       0x86a: 0x0a63, 0x86b: 0x0ac7, 0x86c: 0x0b97, 0x86d: 0x0f3f, 0x86e: 0x0f5b, 0x86f: 0x116b,
+       0x870: 0x118b, 0x871: 0x1463, 0x872: 0x14e3, 0x873: 0x14f3, 0x874: 0x152f, 0x875: 0x0753,
+       0x876: 0x107f, 0x877: 0x144f, 0x878: 0x14cb, 0x879: 0x0baf, 0x87a: 0x0717, 0x87b: 0x0777,
+       0x87c: 0x0a67, 0x87d: 0x0a87, 0x87e: 0x0caf, 0x87f: 0x0d73,
+       // Block 0x22, offset 0x880
+       0x880: 0x0ec3, 0x881: 0x0fcb, 0x882: 0x1277, 0x883: 0x1417, 0x884: 0x1623, 0x885: 0x0ce3,
+       0x886: 0x14a3, 0x887: 0x0833, 0x888: 0x0d2f, 0x889: 0x0d3b, 0x88a: 0x0e0f, 0x88b: 0x0e47,
+       0x88c: 0x0f4b, 0x88d: 0x0fa7, 0x88e: 0x1027, 0x88f: 0x110b, 0x890: 0x153b, 0x891: 0x07af,
+       0x892: 0x0c03, 0x893: 0x14b3, 0x894: 0x0767, 0x895: 0x0aab, 0x896: 0x0e2f, 0x897: 0x13df,
+       0x898: 0x0b67, 0x899: 0x0bb7, 0x89a: 0x0d43, 0x89b: 0x0f2f, 0x89c: 0x14bb, 0x89d: 0x0817,
+       0x89e: 0x08ff, 0x89f: 0x0a97, 0x8a0: 0x0cd3, 0x8a1: 0x0d1f, 0x8a2: 0x0d5f, 0x8a3: 0x0df3,
+       0x8a4: 0x0f47, 0x8a5: 0x0fbb, 0x8a6: 0x1157, 0x8a7: 0x12f7, 0x8a8: 0x1303, 0x8a9: 0x1457,
+       0x8aa: 0x14d7, 0x8ab: 0x0883, 0x8ac: 0x0e4b, 0x8ad: 0x0903, 0x8ae: 0x0ec7, 0x8af: 0x0f6b,
+       0x8b0: 0x1287, 0x8b1: 0x14bf, 0x8b2: 0x15ab, 0x8b3: 0x15d3, 0x8b4: 0x0d37, 0x8b5: 0x0e27,
+       0x8b6: 0x11c3, 0x8b7: 0x10b7, 0x8b8: 0x10c3, 0x8b9: 0x10e7, 0x8ba: 0x0f17, 0x8bb: 0x0e9f,
+       0x8bc: 0x1363, 0x8bd: 0x0733, 0x8be: 0x122b, 0x8bf: 0x081b,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x080b, 0x8c1: 0x0b0b, 0x8c2: 0x0c2b, 0x8c3: 0x10f3, 0x8c4: 0x0a53, 0x8c5: 0x0e03,
+       0x8c6: 0x0cef, 0x8c7: 0x13e7, 0x8c8: 0x12e7, 0x8c9: 0x14ab, 0x8ca: 0x1323, 0x8cb: 0x0b27,
+       0x8cc: 0x0787, 0x8cd: 0x095b, 0x8d0: 0x09af,
+       0x8d2: 0x0cdf, 0x8d5: 0x07f7, 0x8d6: 0x0f1f, 0x8d7: 0x0fe3,
+       0x8d8: 0x1047, 0x8d9: 0x1063, 0x8da: 0x1067, 0x8db: 0x107b, 0x8dc: 0x14fb, 0x8dd: 0x10eb,
+       0x8de: 0x116f, 0x8e0: 0x128f, 0x8e2: 0x1353,
+       0x8e5: 0x1407, 0x8e6: 0x1433,
+       0x8ea: 0x154f, 0x8eb: 0x1553, 0x8ec: 0x1557, 0x8ed: 0x15bb, 0x8ee: 0x142b, 0x8ef: 0x14c7,
+       0x8f0: 0x0757, 0x8f1: 0x077b, 0x8f2: 0x078f, 0x8f3: 0x084b, 0x8f4: 0x0857, 0x8f5: 0x0897,
+       0x8f6: 0x094b, 0x8f7: 0x0967, 0x8f8: 0x096f, 0x8f9: 0x09ab, 0x8fa: 0x09b7, 0x8fb: 0x0a93,
+       0x8fc: 0x0a9b, 0x8fd: 0x0ba3, 0x8fe: 0x0bcb, 0x8ff: 0x0bd3,
+       // Block 0x24, offset 0x900
+       0x900: 0x0beb, 0x901: 0x0c97, 0x902: 0x0cc7, 0x903: 0x0ce7, 0x904: 0x0d57, 0x905: 0x0e1b,
+       0x906: 0x0e37, 0x907: 0x0e67, 0x908: 0x0ebb, 0x909: 0x0edb, 0x90a: 0x0f4f, 0x90b: 0x102f,
+       0x90c: 0x104b, 0x90d: 0x1053, 0x90e: 0x104f, 0x90f: 0x1057, 0x910: 0x105b, 0x911: 0x105f,
+       0x912: 0x1073, 0x913: 0x1077, 0x914: 0x109b, 0x915: 0x10af, 0x916: 0x10cb, 0x917: 0x112f,
+       0x918: 0x1137, 0x919: 0x113f, 0x91a: 0x1153, 0x91b: 0x117b, 0x91c: 0x11cb, 0x91d: 0x11ff,
+       0x91e: 0x11ff, 0x91f: 0x1267, 0x920: 0x130f, 0x921: 0x1327, 0x922: 0x135b, 0x923: 0x135f,
+       0x924: 0x13a3, 0x925: 0x13a7, 0x926: 0x13ff, 0x927: 0x1407, 0x928: 0x14db, 0x929: 0x151f,
+       0x92a: 0x1537, 0x92b: 0x0b9b, 0x92c: 0x171e, 0x92d: 0x11e3,
+       0x930: 0x06df, 0x931: 0x07e3, 0x932: 0x07a3, 0x933: 0x074b, 0x934: 0x078b, 0x935: 0x07b7,
+       0x936: 0x0847, 0x937: 0x0863, 0x938: 0x094b, 0x939: 0x0937, 0x93a: 0x0947, 0x93b: 0x0963,
+       0x93c: 0x09af, 0x93d: 0x09bf, 0x93e: 0x0a03, 0x93f: 0x0a0f,
+       // Block 0x25, offset 0x940
+       0x940: 0x0a2b, 0x941: 0x0a3b, 0x942: 0x0b23, 0x943: 0x0b2b, 0x944: 0x0b5b, 0x945: 0x0b7b,
+       0x946: 0x0bab, 0x947: 0x0bc3, 0x948: 0x0bb3, 0x949: 0x0bd3, 0x94a: 0x0bc7, 0x94b: 0x0beb,
+       0x94c: 0x0c07, 0x94d: 0x0c5f, 0x94e: 0x0c6b, 0x94f: 0x0c73, 0x950: 0x0c9b, 0x951: 0x0cdf,
+       0x952: 0x0d0f, 0x953: 0x0d13, 0x954: 0x0d27, 0x955: 0x0da7, 0x956: 0x0db7, 0x957: 0x0e0f,
+       0x958: 0x0e5b, 0x959: 0x0e53, 0x95a: 0x0e67, 0x95b: 0x0e83, 0x95c: 0x0ebb, 0x95d: 0x1013,
+       0x95e: 0x0edf, 0x95f: 0x0f13, 0x960: 0x0f1f, 0x961: 0x0f5f, 0x962: 0x0f7b, 0x963: 0x0f9f,
+       0x964: 0x0fc3, 0x965: 0x0fc7, 0x966: 0x0fe3, 0x967: 0x0fe7, 0x968: 0x0ff7, 0x969: 0x100b,
+       0x96a: 0x1007, 0x96b: 0x1037, 0x96c: 0x10b3, 0x96d: 0x10cb, 0x96e: 0x10e3, 0x96f: 0x111b,
+       0x970: 0x112f, 0x971: 0x114b, 0x972: 0x117b, 0x973: 0x122f, 0x974: 0x1257, 0x975: 0x12cb,
+       0x976: 0x1313, 0x977: 0x131f, 0x978: 0x1327, 0x979: 0x133f, 0x97a: 0x1353, 0x97b: 0x1343,
+       0x97c: 0x135b, 0x97d: 0x1357, 0x97e: 0x134f, 0x97f: 0x135f,
+       // Block 0x26, offset 0x980
+       0x980: 0x136b, 0x981: 0x13a7, 0x982: 0x13e3, 0x983: 0x1413, 0x984: 0x144b, 0x985: 0x146b,
+       0x986: 0x14b7, 0x987: 0x14db, 0x988: 0x14fb, 0x989: 0x150f, 0x98a: 0x151f, 0x98b: 0x152b,
+       0x98c: 0x1537, 0x98d: 0x158b, 0x98e: 0x162b, 0x98f: 0x16b5, 0x990: 0x16b0, 0x991: 0x16e2,
+       0x992: 0x0607, 0x993: 0x062f, 0x994: 0x0633, 0x995: 0x1764, 0x996: 0x1791, 0x997: 0x1809,
+       0x998: 0x1617, 0x999: 0x1627,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x06fb, 0x9c1: 0x06f3, 0x9c2: 0x0703, 0x9c3: 0x1647, 0x9c4: 0x0747, 0x9c5: 0x0757,
+       0x9c6: 0x075b, 0x9c7: 0x0763, 0x9c8: 0x076b, 0x9c9: 0x076f, 0x9ca: 0x077b, 0x9cb: 0x0773,
+       0x9cc: 0x05b3, 0x9cd: 0x165b, 0x9ce: 0x078f, 0x9cf: 0x0793, 0x9d0: 0x0797, 0x9d1: 0x07b3,
+       0x9d2: 0x164c, 0x9d3: 0x05b7, 0x9d4: 0x079f, 0x9d5: 0x07bf, 0x9d6: 0x1656, 0x9d7: 0x07cf,
+       0x9d8: 0x07d7, 0x9d9: 0x0737, 0x9da: 0x07df, 0x9db: 0x07e3, 0x9dc: 0x1831, 0x9dd: 0x07ff,
+       0x9de: 0x0807, 0x9df: 0x05bf, 0x9e0: 0x081f, 0x9e1: 0x0823, 0x9e2: 0x082b, 0x9e3: 0x082f,
+       0x9e4: 0x05c3, 0x9e5: 0x0847, 0x9e6: 0x084b, 0x9e7: 0x0857, 0x9e8: 0x0863, 0x9e9: 0x0867,
+       0x9ea: 0x086b, 0x9eb: 0x0873, 0x9ec: 0x0893, 0x9ed: 0x0897, 0x9ee: 0x089f, 0x9ef: 0x08af,
+       0x9f0: 0x08b7, 0x9f1: 0x08bb, 0x9f2: 0x08bb, 0x9f3: 0x08bb, 0x9f4: 0x166a, 0x9f5: 0x0e93,
+       0x9f6: 0x08cf, 0x9f7: 0x08d7, 0x9f8: 0x166f, 0x9f9: 0x08e3, 0x9fa: 0x08eb, 0x9fb: 0x08f3,
+       0x9fc: 0x091b, 0x9fd: 0x0907, 0x9fe: 0x0913, 0x9ff: 0x0917,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x091f, 0xa01: 0x0927, 0xa02: 0x092b, 0xa03: 0x0933, 0xa04: 0x093b, 0xa05: 0x093f,
+       0xa06: 0x093f, 0xa07: 0x0947, 0xa08: 0x094f, 0xa09: 0x0953, 0xa0a: 0x095f, 0xa0b: 0x0983,
+       0xa0c: 0x0967, 0xa0d: 0x0987, 0xa0e: 0x096b, 0xa0f: 0x0973, 0xa10: 0x080b, 0xa11: 0x09cf,
+       0xa12: 0x0997, 0xa13: 0x099b, 0xa14: 0x099f, 0xa15: 0x0993, 0xa16: 0x09a7, 0xa17: 0x09a3,
+       0xa18: 0x09bb, 0xa19: 0x1674, 0xa1a: 0x09d7, 0xa1b: 0x09db, 0xa1c: 0x09e3, 0xa1d: 0x09ef,
+       0xa1e: 0x09f7, 0xa1f: 0x0a13, 0xa20: 0x1679, 0xa21: 0x167e, 0xa22: 0x0a1f, 0xa23: 0x0a23,
+       0xa24: 0x0a27, 0xa25: 0x0a1b, 0xa26: 0x0a2f, 0xa27: 0x05c7, 0xa28: 0x05cb, 0xa29: 0x0a37,
+       0xa2a: 0x0a3f, 0xa2b: 0x0a3f, 0xa2c: 0x1683, 0xa2d: 0x0a5b, 0xa2e: 0x0a5f, 0xa2f: 0x0a63,
+       0xa30: 0x0a6b, 0xa31: 0x1688, 0xa32: 0x0a73, 0xa33: 0x0a77, 0xa34: 0x0b4f, 0xa35: 0x0a7f,
+       0xa36: 0x05cf, 0xa37: 0x0a8b, 0xa38: 0x0a9b, 0xa39: 0x0aa7, 0xa3a: 0x0aa3, 0xa3b: 0x1692,
+       0xa3c: 0x0aaf, 0xa3d: 0x1697, 0xa3e: 0x0abb, 0xa3f: 0x0ab7,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0abf, 0xa41: 0x0acf, 0xa42: 0x0ad3, 0xa43: 0x05d3, 0xa44: 0x0ae3, 0xa45: 0x0aeb,
+       0xa46: 0x0aef, 0xa47: 0x0af3, 0xa48: 0x05d7, 0xa49: 0x169c, 0xa4a: 0x05db, 0xa4b: 0x0b0f,
+       0xa4c: 0x0b13, 0xa4d: 0x0b17, 0xa4e: 0x0b1f, 0xa4f: 0x1863, 0xa50: 0x0b37, 0xa51: 0x16a6,
+       0xa52: 0x16a6, 0xa53: 0x11d7, 0xa54: 0x0b47, 0xa55: 0x0b47, 0xa56: 0x05df, 0xa57: 0x16c9,
+       0xa58: 0x179b, 0xa59: 0x0b57, 0xa5a: 0x0b5f, 0xa5b: 0x05e3, 0xa5c: 0x0b73, 0xa5d: 0x0b83,
+       0xa5e: 0x0b87, 0xa5f: 0x0b8f, 0xa60: 0x0b9f, 0xa61: 0x05eb, 0xa62: 0x05e7, 0xa63: 0x0ba3,
+       0xa64: 0x16ab, 0xa65: 0x0ba7, 0xa66: 0x0bbb, 0xa67: 0x0bbf, 0xa68: 0x0bc3, 0xa69: 0x0bbf,
+       0xa6a: 0x0bcf, 0xa6b: 0x0bd3, 0xa6c: 0x0be3, 0xa6d: 0x0bdb, 0xa6e: 0x0bdf, 0xa6f: 0x0be7,
+       0xa70: 0x0beb, 0xa71: 0x0bef, 0xa72: 0x0bfb, 0xa73: 0x0bff, 0xa74: 0x0c17, 0xa75: 0x0c1f,
+       0xa76: 0x0c2f, 0xa77: 0x0c43, 0xa78: 0x16ba, 0xa79: 0x0c3f, 0xa7a: 0x0c33, 0xa7b: 0x0c4b,
+       0xa7c: 0x0c53, 0xa7d: 0x0c67, 0xa7e: 0x16bf, 0xa7f: 0x0c6f,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x0c63, 0xa81: 0x0c5b, 0xa82: 0x05ef, 0xa83: 0x0c77, 0xa84: 0x0c7f, 0xa85: 0x0c87,
+       0xa86: 0x0c7b, 0xa87: 0x05f3, 0xa88: 0x0c97, 0xa89: 0x0c9f, 0xa8a: 0x16c4, 0xa8b: 0x0ccb,
+       0xa8c: 0x0cff, 0xa8d: 0x0cdb, 0xa8e: 0x05ff, 0xa8f: 0x0ce7, 0xa90: 0x05fb, 0xa91: 0x05f7,
+       0xa92: 0x07c3, 0xa93: 0x07c7, 0xa94: 0x0d03, 0xa95: 0x0ceb, 0xa96: 0x11ab, 0xa97: 0x0663,
+       0xa98: 0x0d0f, 0xa99: 0x0d13, 0xa9a: 0x0d17, 0xa9b: 0x0d2b, 0xa9c: 0x0d23, 0xa9d: 0x16dd,
+       0xa9e: 0x0603, 0xa9f: 0x0d3f, 0xaa0: 0x0d33, 0xaa1: 0x0d4f, 0xaa2: 0x0d57, 0xaa3: 0x16e7,
+       0xaa4: 0x0d5b, 0xaa5: 0x0d47, 0xaa6: 0x0d63, 0xaa7: 0x0607, 0xaa8: 0x0d67, 0xaa9: 0x0d6b,
+       0xaaa: 0x0d6f, 0xaab: 0x0d7b, 0xaac: 0x16ec, 0xaad: 0x0d83, 0xaae: 0x060b, 0xaaf: 0x0d8f,
+       0xab0: 0x16f1, 0xab1: 0x0d93, 0xab2: 0x060f, 0xab3: 0x0d9f, 0xab4: 0x0dab, 0xab5: 0x0db7,
+       0xab6: 0x0dbb, 0xab7: 0x16f6, 0xab8: 0x168d, 0xab9: 0x16fb, 0xaba: 0x0ddb, 0xabb: 0x1700,
+       0xabc: 0x0de7, 0xabd: 0x0def, 0xabe: 0x0ddf, 0xabf: 0x0dfb,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x0e0b, 0xac1: 0x0e1b, 0xac2: 0x0e0f, 0xac3: 0x0e13, 0xac4: 0x0e1f, 0xac5: 0x0e23,
+       0xac6: 0x1705, 0xac7: 0x0e07, 0xac8: 0x0e3b, 0xac9: 0x0e3f, 0xaca: 0x0613, 0xacb: 0x0e53,
+       0xacc: 0x0e4f, 0xacd: 0x170a, 0xace: 0x0e33, 0xacf: 0x0e6f, 0xad0: 0x170f, 0xad1: 0x1714,
+       0xad2: 0x0e73, 0xad3: 0x0e87, 0xad4: 0x0e83, 0xad5: 0x0e7f, 0xad6: 0x0617, 0xad7: 0x0e8b,
+       0xad8: 0x0e9b, 0xad9: 0x0e97, 0xada: 0x0ea3, 0xadb: 0x1651, 0xadc: 0x0eb3, 0xadd: 0x1719,
+       0xade: 0x0ebf, 0xadf: 0x1723, 0xae0: 0x0ed3, 0xae1: 0x0edf, 0xae2: 0x0ef3, 0xae3: 0x1728,
+       0xae4: 0x0f07, 0xae5: 0x0f0b, 0xae6: 0x172d, 0xae7: 0x1732, 0xae8: 0x0f27, 0xae9: 0x0f37,
+       0xaea: 0x061b, 0xaeb: 0x0f3b, 0xaec: 0x061f, 0xaed: 0x061f, 0xaee: 0x0f53, 0xaef: 0x0f57,
+       0xaf0: 0x0f5f, 0xaf1: 0x0f63, 0xaf2: 0x0f6f, 0xaf3: 0x0623, 0xaf4: 0x0f87, 0xaf5: 0x1737,
+       0xaf6: 0x0fa3, 0xaf7: 0x173c, 0xaf8: 0x0faf, 0xaf9: 0x16a1, 0xafa: 0x0fbf, 0xafb: 0x1741,
+       0xafc: 0x1746, 0xafd: 0x174b, 0xafe: 0x0627, 0xaff: 0x062b,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x0ff7, 0xb01: 0x1755, 0xb02: 0x1750, 0xb03: 0x175a, 0xb04: 0x175f, 0xb05: 0x0fff,
+       0xb06: 0x1003, 0xb07: 0x1003, 0xb08: 0x100b, 0xb09: 0x0633, 0xb0a: 0x100f, 0xb0b: 0x0637,
+       0xb0c: 0x063b, 0xb0d: 0x1769, 0xb0e: 0x1023, 0xb0f: 0x102b, 0xb10: 0x1037, 0xb11: 0x063f,
+       0xb12: 0x176e, 0xb13: 0x105b, 0xb14: 0x1773, 0xb15: 0x1778, 0xb16: 0x107b, 0xb17: 0x1093,
+       0xb18: 0x0643, 0xb19: 0x109b, 0xb1a: 0x109f, 0xb1b: 0x10a3, 0xb1c: 0x177d, 0xb1d: 0x1782,
+       0xb1e: 0x1782, 0xb1f: 0x10bb, 0xb20: 0x0647, 0xb21: 0x1787, 0xb22: 0x10cf, 0xb23: 0x10d3,
+       0xb24: 0x064b, 0xb25: 0x178c, 0xb26: 0x10ef, 0xb27: 0x064f, 0xb28: 0x10ff, 0xb29: 0x10f7,
+       0xb2a: 0x1107, 0xb2b: 0x1796, 0xb2c: 0x111f, 0xb2d: 0x0653, 0xb2e: 0x112b, 0xb2f: 0x1133,
+       0xb30: 0x1143, 0xb31: 0x0657, 0xb32: 0x17a0, 0xb33: 0x17a5, 0xb34: 0x065b, 0xb35: 0x17aa,
+       0xb36: 0x115b, 0xb37: 0x17af, 0xb38: 0x1167, 0xb39: 0x1173, 0xb3a: 0x117b, 0xb3b: 0x17b4,
+       0xb3c: 0x17b9, 0xb3d: 0x118f, 0xb3e: 0x17be, 0xb3f: 0x1197,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x16ce, 0xb41: 0x065f, 0xb42: 0x11af, 0xb43: 0x11b3, 0xb44: 0x0667, 0xb45: 0x11b7,
+       0xb46: 0x0a33, 0xb47: 0x17c3, 0xb48: 0x17c8, 0xb49: 0x16d3, 0xb4a: 0x16d8, 0xb4b: 0x11d7,
+       0xb4c: 0x11db, 0xb4d: 0x13f3, 0xb4e: 0x066b, 0xb4f: 0x1207, 0xb50: 0x1203, 0xb51: 0x120b,
+       0xb52: 0x083f, 0xb53: 0x120f, 0xb54: 0x1213, 0xb55: 0x1217, 0xb56: 0x121f, 0xb57: 0x17cd,
+       0xb58: 0x121b, 0xb59: 0x1223, 0xb5a: 0x1237, 0xb5b: 0x123b, 0xb5c: 0x1227, 0xb5d: 0x123f,
+       0xb5e: 0x1253, 0xb5f: 0x1267, 0xb60: 0x1233, 0xb61: 0x1247, 0xb62: 0x124b, 0xb63: 0x124f,
+       0xb64: 0x17d2, 0xb65: 0x17dc, 0xb66: 0x17d7, 0xb67: 0x066f, 0xb68: 0x126f, 0xb69: 0x1273,
+       0xb6a: 0x127b, 0xb6b: 0x17f0, 0xb6c: 0x127f, 0xb6d: 0x17e1, 0xb6e: 0x0673, 0xb6f: 0x0677,
+       0xb70: 0x17e6, 0xb71: 0x17eb, 0xb72: 0x067b, 0xb73: 0x129f, 0xb74: 0x12a3, 0xb75: 0x12a7,
+       0xb76: 0x12ab, 0xb77: 0x12b7, 0xb78: 0x12b3, 0xb79: 0x12bf, 0xb7a: 0x12bb, 0xb7b: 0x12cb,
+       0xb7c: 0x12c3, 0xb7d: 0x12c7, 0xb7e: 0x12cf, 0xb7f: 0x067f,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x12d7, 0xb81: 0x12db, 0xb82: 0x0683, 0xb83: 0x12eb, 0xb84: 0x12ef, 0xb85: 0x17f5,
+       0xb86: 0x12fb, 0xb87: 0x12ff, 0xb88: 0x0687, 0xb89: 0x130b, 0xb8a: 0x05bb, 0xb8b: 0x17fa,
+       0xb8c: 0x17ff, 0xb8d: 0x068b, 0xb8e: 0x068f, 0xb8f: 0x1337, 0xb90: 0x134f, 0xb91: 0x136b,
+       0xb92: 0x137b, 0xb93: 0x1804, 0xb94: 0x138f, 0xb95: 0x1393, 0xb96: 0x13ab, 0xb97: 0x13b7,
+       0xb98: 0x180e, 0xb99: 0x1660, 0xb9a: 0x13c3, 0xb9b: 0x13bf, 0xb9c: 0x13cb, 0xb9d: 0x1665,
+       0xb9e: 0x13d7, 0xb9f: 0x13e3, 0xba0: 0x1813, 0xba1: 0x1818, 0xba2: 0x1423, 0xba3: 0x142f,
+       0xba4: 0x1437, 0xba5: 0x181d, 0xba6: 0x143b, 0xba7: 0x1467, 0xba8: 0x1473, 0xba9: 0x1477,
+       0xbaa: 0x146f, 0xbab: 0x1483, 0xbac: 0x1487, 0xbad: 0x1822, 0xbae: 0x1493, 0xbaf: 0x0693,
+       0xbb0: 0x149b, 0xbb1: 0x1827, 0xbb2: 0x0697, 0xbb3: 0x14d3, 0xbb4: 0x0ac3, 0xbb5: 0x14eb,
+       0xbb6: 0x182c, 0xbb7: 0x1836, 0xbb8: 0x069b, 0xbb9: 0x069f, 0xbba: 0x1513, 0xbbb: 0x183b,
+       0xbbc: 0x06a3, 0xbbd: 0x1840, 0xbbe: 0x152b, 0xbbf: 0x152b,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x1533, 0xbc1: 0x1845, 0xbc2: 0x154b, 0xbc3: 0x06a7, 0xbc4: 0x155b, 0xbc5: 0x1567,
+       0xbc6: 0x156f, 0xbc7: 0x1577, 0xbc8: 0x06ab, 0xbc9: 0x184a, 0xbca: 0x158b, 0xbcb: 0x15a7,
+       0xbcc: 0x15b3, 0xbcd: 0x06af, 0xbce: 0x06b3, 0xbcf: 0x15b7, 0xbd0: 0x184f, 0xbd1: 0x06b7,
+       0xbd2: 0x1854, 0xbd3: 0x1859, 0xbd4: 0x185e, 0xbd5: 0x15db, 0xbd6: 0x06bb, 0xbd7: 0x15ef,
+       0xbd8: 0x15f7, 0xbd9: 0x15fb, 0xbda: 0x1603, 0xbdb: 0x160b, 0xbdc: 0x1613, 0xbdd: 0x1868,
+}
+
+// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32,
+       0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35,
+       0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x3b, 0x121: 0x3c, 0x123: 0x0d, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40,
+       0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47,
+       0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d,
+       0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55,
+       // Block 0x5, offset 0x140
+       0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b,
+       0x14d: 0x5c,
+       0x15c: 0x5d, 0x15f: 0x5e,
+       0x162: 0x5f, 0x164: 0x60,
+       0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0e, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66,
+       0x170: 0x67, 0x173: 0x68, 0x177: 0x0f,
+       0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17,
+       // Block 0x6, offset 0x180
+       0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,
+       0x188: 0x6e, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x6f, 0x18c: 0x70,
+       0x1ab: 0x71,
+       0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x75, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x76, 0x1c5: 0x77,
+       0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,
+       // Block 0x8, offset 0x200
+       0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,
+       0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,
+       0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,
+       0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,
+       0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,
+       // Block 0x9, offset 0x240
+       0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,
+       0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,
+       0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,
+       0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,
+       0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,
+       0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,
+       0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,
+       0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,
+       // Block 0xa, offset 0x280
+       0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,
+       0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,
+       0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,
+       0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,
+       0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,
+       0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,
+       0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,
+       0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,
+       0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,
+       0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,
+       0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,
+       // Block 0xc, offset 0x300
+       0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20,
+       0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,
+       0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,
+       0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,
+       // Block 0xd, offset 0x340
+       0x347: 0x9c,
+       0x34b: 0x9d, 0x34d: 0x9e,
+       0x368: 0x9f, 0x36b: 0xa0,
+       0x374: 0xa1,
+       0x37d: 0xa2,
+       // Block 0xe, offset 0x380
+       0x381: 0xa3, 0x382: 0xa4, 0x384: 0xa5, 0x385: 0x82, 0x387: 0xa6,
+       0x388: 0xa7, 0x38b: 0xa8, 0x38c: 0xa9, 0x38d: 0xaa,
+       0x391: 0xab, 0x392: 0xac, 0x393: 0xad, 0x396: 0xae, 0x397: 0xaf,
+       0x398: 0x73, 0x39a: 0xb0, 0x39c: 0xb1,
+       0x3a0: 0xb2,
+       0x3a8: 0xb3, 0x3a9: 0xb4, 0x3aa: 0xb5,
+       0x3b0: 0x73, 0x3b5: 0xb6, 0x3b6: 0xb7,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xb8, 0x3ec: 0xb9,
+       // Block 0x10, offset 0x400
+       0x432: 0xba,
+       // Block 0x11, offset 0x440
+       0x445: 0xbb, 0x446: 0xbc, 0x447: 0xbd,
+       0x449: 0xbe,
+       // Block 0x12, offset 0x480
+       0x480: 0xbf,
+       0x4a3: 0xc0, 0x4a5: 0xc1,
+       // Block 0x13, offset 0x4c0
+       0x4c8: 0xc2,
+       // Block 0x14, offset 0x500
+       0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c,
+       0x528: 0x2d,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfcSparseOffset: 149 entries, 298 bytes
+var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x72, 0x79, 0x7c, 0x84, 0x88, 0x8c, 0x8e, 0x90, 0x99, 0x9d, 0xa4, 0xa9, 0xac, 0xb6, 0xb9, 0xc0, 0xc8, 0xcb, 0xcd, 0xcf, 0xd1, 0xd6, 0xe7, 0xf3, 0xf5, 0xfb, 0xfd, 0xff, 0x101, 0x103, 0x105, 0x107, 0x10a, 0x10d, 0x10f, 0x112, 0x115, 0x119, 0x11e, 0x127, 0x129, 0x12c, 0x12e, 0x139, 0x13d, 0x14b, 0x14e, 0x154, 0x15a, 0x165, 0x169, 0x16b, 0x16d, 0x16f, 0x171, 0x173, 0x179, 0x17d, 0x17f, 0x181, 0x189, 0x18d, 0x190, 0x192, 0x194, 0x196, 0x199, 0x19b, 0x19d, 0x19f, 0x1a1, 0x1a7, 0x1aa, 0x1ac, 0x1b3, 0x1b9, 0x1bf, 0x1c7, 0x1cd, 0x1d3, 0x1d9, 0x1dd, 0x1eb, 0x1f4, 0x1f7, 0x1fa, 0x1fc, 0x1ff, 0x201, 0x205, 0x20a, 0x20c, 0x20e, 0x213, 0x219, 0x21b, 0x21d, 0x21f, 0x225, 0x228, 0x22a, 0x230, 0x233, 0x23b, 0x242, 0x245, 0x248, 0x24a, 0x24d, 0x255, 0x259, 0x260, 0x263, 0x269, 0x26b, 0x26e, 0x270, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x284, 0x291, 0x29b, 0x29d, 0x29f, 0x2a5, 0x2a7, 0x2aa}
+
+// nfcSparseValues: 684 entries, 2736 bytes
+var nfcSparseValues = [684]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x04},
+       {value: 0xa100, lo: 0xa8, hi: 0xa8},
+       {value: 0x8100, lo: 0xaf, hi: 0xaf},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb8, hi: 0xb8},
+       // Block 0x1, offset 0x5
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x9
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       // Block 0x3, offset 0xb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x98, hi: 0x9d},
+       // Block 0x4, offset 0xd
+       {value: 0x0006, lo: 0x0a},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x85, hi: 0x85},
+       {value: 0xa000, lo: 0x89, hi: 0x89},
+       {value: 0x4840, lo: 0x8a, hi: 0x8a},
+       {value: 0x485e, lo: 0x8b, hi: 0x8b},
+       {value: 0x36c7, lo: 0x8c, hi: 0x8c},
+       {value: 0x36df, lo: 0x8d, hi: 0x8d},
+       {value: 0x4876, lo: 0x8e, hi: 0x8e},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x36fd, lo: 0x93, hi: 0x94},
+       // Block 0x5, offset 0x18
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x6, offset 0x28
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x7, offset 0x2a
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x8, offset 0x2f
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x9, offset 0x3a
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0xa, offset 0x49
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xb, offset 0x56
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xc, offset 0x5e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0xd, offset 0x63
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xe, offset 0x68
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xf, offset 0x6a
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0x10, offset 0x72
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x11, offset 0x79
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x12, offset 0x7c
+       {value: 0x0008, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       {value: 0x8132, lo: 0xbe, hi: 0xbe},
+       // Block 0x13, offset 0x84
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x14, offset 0x88
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x15, offset 0x8c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x16, offset 0x8e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x17, offset 0x90
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x18, offset 0x99
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x19, offset 0x9d
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1a, offset 0xa4
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1b, offset 0xa9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1c, offset 0xac
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1d, offset 0xb6
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1e, offset 0xb9
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1f, offset 0xc0
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x20, offset 0xc8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x21, offset 0xcb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x22, offset 0xcd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x23, offset 0xcf
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       // Block 0x24, offset 0xd1
+       {value: 0x0000, lo: 0x04},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x25, offset 0xd6
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x8200, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x8200, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x26, offset 0xe7
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x27, offset 0xf3
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x28, offset 0xf5
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x29, offset 0xfb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x2a, offset 0xfd
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2b, offset 0xff
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2c, offset 0x101
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2d, offset 0x103
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2e, offset 0x105
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x2f, offset 0x107
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x30, offset 0x10a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x31, offset 0x10d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x32, offset 0x10f
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x33, offset 0x112
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x34, offset 0x115
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x35, offset 0x119
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x36, offset 0x11e
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x37, offset 0x127
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x38, offset 0x129
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x39, offset 0x12c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3a, offset 0x12e
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3b, offset 0x139
+       {value: 0x0004, lo: 0x03},
+       {value: 0x0433, lo: 0x80, hi: 0x81},
+       {value: 0x8100, lo: 0x97, hi: 0x97},
+       {value: 0x8100, lo: 0xbe, hi: 0xbe},
+       // Block 0x3c, offset 0x13d
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x3d, offset 0x14b
+       {value: 0x427b, lo: 0x02},
+       {value: 0x01b8, lo: 0xa6, hi: 0xa6},
+       {value: 0x0057, lo: 0xaa, hi: 0xab},
+       // Block 0x3e, offset 0x14e
+       {value: 0x0007, lo: 0x05},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x3f, offset 0x154
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x40, offset 0x15a
+       {value: 0x6408, lo: 0x0a},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x41, offset 0x165
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x42, offset 0x169
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x43, offset 0x16b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x44, offset 0x16d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x45, offset 0x16f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x46, offset 0x171
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x47, offset 0x173
+       {value: 0x0000, lo: 0x05},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xaf},
+       // Block 0x48, offset 0x179
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4a9f, lo: 0xb3, hi: 0xb3},
+       {value: 0x4a9f, lo: 0xb5, hi: 0xb6},
+       {value: 0x4a9f, lo: 0xba, hi: 0xbf},
+       // Block 0x49, offset 0x17d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x4a9f, lo: 0x8f, hi: 0xa3},
+       // Block 0x4a, offset 0x17f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xae, hi: 0xbe},
+       // Block 0x4b, offset 0x181
+       {value: 0x0000, lo: 0x07},
+       {value: 0x8100, lo: 0x84, hi: 0x84},
+       {value: 0x8100, lo: 0x87, hi: 0x87},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       {value: 0x8100, lo: 0x9e, hi: 0x9e},
+       {value: 0x8100, lo: 0xa1, hi: 0xa1},
+       {value: 0x8100, lo: 0xb2, hi: 0xb2},
+       {value: 0x8100, lo: 0xbb, hi: 0xbb},
+       // Block 0x4c, offset 0x189
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8100, lo: 0x80, hi: 0x80},
+       {value: 0x8100, lo: 0x8b, hi: 0x8b},
+       {value: 0x8100, lo: 0x8e, hi: 0x8e},
+       // Block 0x4d, offset 0x18d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x4e, offset 0x190
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x4f, offset 0x192
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x50, offset 0x194
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x51, offset 0x196
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x52, offset 0x199
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x53, offset 0x19b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x54, offset 0x19d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x55, offset 0x19f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x56, offset 0x1a1
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x57, offset 0x1a7
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x58, offset 0x1aa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x59, offset 0x1ac
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x5a, offset 0x1b3
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x5b, offset 0x1b9
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x5c, offset 0x1bf
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x5d, offset 0x1c7
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x5e, offset 0x1cd
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x5f, offset 0x1d3
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x60, offset 0x1d9
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x61, offset 0x1dd
+       {value: 0x0006, lo: 0x0d},
+       {value: 0x4390, lo: 0x9d, hi: 0x9d},
+       {value: 0x8115, lo: 0x9e, hi: 0x9e},
+       {value: 0x4402, lo: 0x9f, hi: 0x9f},
+       {value: 0x43f0, lo: 0xaa, hi: 0xab},
+       {value: 0x44f4, lo: 0xac, hi: 0xac},
+       {value: 0x44fc, lo: 0xad, hi: 0xad},
+       {value: 0x4348, lo: 0xae, hi: 0xb1},
+       {value: 0x4366, lo: 0xb2, hi: 0xb4},
+       {value: 0x437e, lo: 0xb5, hi: 0xb6},
+       {value: 0x438a, lo: 0xb8, hi: 0xb8},
+       {value: 0x4396, lo: 0xb9, hi: 0xbb},
+       {value: 0x43ae, lo: 0xbc, hi: 0xbc},
+       {value: 0x43b4, lo: 0xbe, hi: 0xbe},
+       // Block 0x62, offset 0x1eb
+       {value: 0x0006, lo: 0x08},
+       {value: 0x43ba, lo: 0x80, hi: 0x81},
+       {value: 0x43c6, lo: 0x83, hi: 0x84},
+       {value: 0x43d8, lo: 0x86, hi: 0x89},
+       {value: 0x43fc, lo: 0x8a, hi: 0x8a},
+       {value: 0x4378, lo: 0x8b, hi: 0x8b},
+       {value: 0x4360, lo: 0x8c, hi: 0x8c},
+       {value: 0x43a8, lo: 0x8d, hi: 0x8d},
+       {value: 0x43d2, lo: 0x8e, hi: 0x8e},
+       // Block 0x63, offset 0x1f4
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0xa4, hi: 0xa5},
+       {value: 0x8100, lo: 0xb0, hi: 0xb1},
+       // Block 0x64, offset 0x1f7
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x9b, hi: 0x9d},
+       {value: 0x8200, lo: 0x9e, hi: 0xa3},
+       // Block 0x65, offset 0x1fa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       // Block 0x66, offset 0x1fc
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x99, hi: 0x99},
+       {value: 0x8200, lo: 0xb2, hi: 0xb4},
+       // Block 0x67, offset 0x1ff
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xbc, hi: 0xbd},
+       // Block 0x68, offset 0x201
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xa0, hi: 0xa6},
+       {value: 0x812d, lo: 0xa7, hi: 0xad},
+       {value: 0x8132, lo: 0xae, hi: 0xaf},
+       // Block 0x69, offset 0x205
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8100, lo: 0x89, hi: 0x8c},
+       {value: 0x8100, lo: 0xb0, hi: 0xb2},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb6, hi: 0xbf},
+       // Block 0x6a, offset 0x20a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x81, hi: 0x8c},
+       // Block 0x6b, offset 0x20c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xb5, hi: 0xba},
+       // Block 0x6c, offset 0x20e
+       {value: 0x0000, lo: 0x04},
+       {value: 0x4a9f, lo: 0x9e, hi: 0x9f},
+       {value: 0x4a9f, lo: 0xa3, hi: 0xa3},
+       {value: 0x4a9f, lo: 0xa5, hi: 0xa6},
+       {value: 0x4a9f, lo: 0xaa, hi: 0xaf},
+       // Block 0x6d, offset 0x213
+       {value: 0x0000, lo: 0x05},
+       {value: 0x4a9f, lo: 0x82, hi: 0x87},
+       {value: 0x4a9f, lo: 0x8a, hi: 0x8f},
+       {value: 0x4a9f, lo: 0x92, hi: 0x97},
+       {value: 0x4a9f, lo: 0x9a, hi: 0x9c},
+       {value: 0x8100, lo: 0xa3, hi: 0xa3},
+       // Block 0x6e, offset 0x219
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x6f, offset 0x21b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x70, offset 0x21d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x71, offset 0x21f
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x72, offset 0x225
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x73, offset 0x228
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa4, hi: 0xa7},
+       // Block 0x74, offset 0x22a
+       {value: 0x0000, lo: 0x05},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x8132, lo: 0x88, hi: 0x8a},
+       {value: 0x812d, lo: 0x8b, hi: 0x8b},
+       {value: 0x8132, lo: 0x8c, hi: 0x8c},
+       {value: 0x812d, lo: 0x8d, hi: 0x90},
+       // Block 0x75, offset 0x230
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x76, offset 0x233
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x77, offset 0x23b
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x78, offset 0x242
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x79, offset 0x245
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x7a, offset 0x248
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x7b, offset 0x24a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x7c, offset 0x24d
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x7d, offset 0x255
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       {value: 0x8132, lo: 0x9e, hi: 0x9e},
+       // Block 0x7e, offset 0x259
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x7f, offset 0x260
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x80, offset 0x263
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x81, offset 0x269
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x82, offset 0x26b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x83, offset 0x26e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x84, offset 0x270
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb9, hi: 0xb9},
+       {value: 0x8102, lo: 0xba, hi: 0xba},
+       // Block 0x85, offset 0x273
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x86, offset 0x275
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x87, hi: 0x87},
+       // Block 0x87, offset 0x277
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x99, hi: 0x99},
+       // Block 0x88, offset 0x279
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0x82, hi: 0x82},
+       {value: 0x8104, lo: 0x84, hi: 0x85},
+       // Block 0x89, offset 0x27c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x97, hi: 0x97},
+       // Block 0x8a, offset 0x27e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x8b, offset 0x280
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x8c, offset 0x282
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x8d, offset 0x284
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x8e, offset 0x291
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x8f, offset 0x29b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x90, offset 0x29d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x91, offset 0x29f
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x92, offset 0x2a5
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x93, offset 0x2a7
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x94, offset 0x2aa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x93, hi: 0x93},
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfkcTrie. Total size: 17248 bytes (16.84 KiB). Checksum: 4fb368372b6b1b27.
+type nfkcTrie struct{}
+
+func newNfkcTrie(i int) *nfkcTrie {
+       return &nfkcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 92:
+               return uint16(nfkcValues[n<<6+uint32(b)])
+       default:
+               n -= 92
+               return uint16(nfkcSparse.lookup(n, b))
+       }
+}
+
+// nfkcValues: 94 blocks, 6016 entries, 12032 bytes
+// The third block is the zero block.
+var nfkcValues = [6016]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,
+       // Block 0x5, offset 0x140
+       0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,
+       // Block 0x6, offset 0x180
+       0x184: 0x2dee, 0x185: 0x2df4,
+       0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,
+       0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x42a5,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x425a, 0x285: 0x447b,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c1: 0xa000, 0x2c5: 0xa000,
+       0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,
+       0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,
+       0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,
+       0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,
+       0x2f9: 0x01a6,
+       // Block 0xc, offset 0x300
+       0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,
+       0x306: 0xa000, 0x307: 0x3709,
+       0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,
+       0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
+       0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,
+       0x31e: 0xa000, 0x323: 0xa000,
+       0x327: 0xa000,
+       0x32b: 0xa000, 0x32d: 0xa000,
+       0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
+       0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,
+       0x33e: 0xa000,
+       // Block 0xd, offset 0x340
+       0x341: 0x3733, 0x342: 0x37b7,
+       0x350: 0x370f, 0x351: 0x3793,
+       0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,
+       0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,
+       0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,
+       0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,
+       0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,
+       0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,
+       0x378: 0x3787, 0x379: 0x380b,
+       // Block 0xe, offset 0x380
+       0x387: 0x1d61,
+       0x391: 0x812d,
+       0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,
+       0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,
+       0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,
+       0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,
+       0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,
+       0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,
+       // Block 0xf, offset 0x3c0
+       0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,
+       0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,
+       0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,
+       0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,
+       0x3de: 0x8132, 0x3df: 0x812d,
+       0x3f0: 0x811e, 0x3f5: 0x1d84,
+       0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,
+       // Block 0x10, offset 0x400
+       0x413: 0x812d, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132,
+       0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132,
+       0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x423: 0x812d,
+       0x424: 0x8132, 0x425: 0x8132, 0x426: 0x812d, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x812d,
+       0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x812d, 0x42e: 0x812d, 0x42f: 0x812d,
+       0x430: 0x8116, 0x431: 0x8117, 0x432: 0x8118, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132,
+       0x436: 0x812d, 0x437: 0x8132, 0x438: 0x8132, 0x439: 0x812d, 0x43a: 0x812d, 0x43b: 0x8132,
+       0x43c: 0x8132, 0x43d: 0x8132, 0x43e: 0x8132, 0x43f: 0x8132,
+       // Block 0x11, offset 0x440
+       0x445: 0xa000,
+       0x446: 0x2d26, 0x447: 0xa000, 0x448: 0x2d2e, 0x449: 0xa000, 0x44a: 0x2d36, 0x44b: 0xa000,
+       0x44c: 0x2d3e, 0x44d: 0xa000, 0x44e: 0x2d46, 0x451: 0xa000,
+       0x452: 0x2d4e,
+       0x474: 0x8102, 0x475: 0x9900,
+       0x47a: 0xa000, 0x47b: 0x2d56,
+       0x47c: 0xa000, 0x47d: 0x2d5e, 0x47e: 0xa000, 0x47f: 0xa000,
+       // Block 0x12, offset 0x480
+       0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x00f5, 0x485: 0x00f8,
+       0x486: 0x0413, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x0104, 0x48b: 0x0107,
+       0x48c: 0x010a, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e0,
+       0x492: 0x009f, 0x493: 0x00fe, 0x494: 0x0417, 0x495: 0x041b, 0x496: 0x00a1, 0x497: 0x00a9,
+       0x498: 0x00ab, 0x499: 0x0423, 0x49a: 0x012b, 0x49b: 0x00ad, 0x49c: 0x0427, 0x49d: 0x01be,
+       0x49e: 0x01c1, 0x49f: 0x01c4, 0x4a0: 0x01fa, 0x4a1: 0x01fd, 0x4a2: 0x0093, 0x4a3: 0x00a5,
+       0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x01be, 0x4a7: 0x01c1, 0x4a8: 0x01eb, 0x4a9: 0x01fa,
+       0x4aa: 0x01fd,
+       0x4b8: 0x020c,
+       // Block 0x13, offset 0x4c0
+       0x4db: 0x00fb, 0x4dc: 0x0087, 0x4dd: 0x0101,
+       0x4de: 0x00d4, 0x4df: 0x010a, 0x4e0: 0x008d, 0x4e1: 0x010d, 0x4e2: 0x0110, 0x4e3: 0x0116,
+       0x4e4: 0x011c, 0x4e5: 0x011f, 0x4e6: 0x0122, 0x4e7: 0x042b, 0x4e8: 0x016a, 0x4e9: 0x0128,
+       0x4ea: 0x042f, 0x4eb: 0x016d, 0x4ec: 0x0131, 0x4ed: 0x012e, 0x4ee: 0x0134, 0x4ef: 0x0137,
+       0x4f0: 0x013a, 0x4f1: 0x013d, 0x4f2: 0x0140, 0x4f3: 0x014c, 0x4f4: 0x014f, 0x4f5: 0x00ec,
+       0x4f6: 0x0152, 0x4f7: 0x0155, 0x4f8: 0x041f, 0x4f9: 0x0158, 0x4fa: 0x015b, 0x4fb: 0x00b5,
+       0x4fc: 0x015e, 0x4fd: 0x0161, 0x4fe: 0x0164, 0x4ff: 0x01d0,
+       // Block 0x14, offset 0x500
+       0x500: 0x8132, 0x501: 0x8132, 0x502: 0x812d, 0x503: 0x8132, 0x504: 0x8132, 0x505: 0x8132,
+       0x506: 0x8132, 0x507: 0x8132, 0x508: 0x8132, 0x509: 0x8132, 0x50a: 0x812d, 0x50b: 0x8132,
+       0x50c: 0x8132, 0x50d: 0x8135, 0x50e: 0x812a, 0x50f: 0x812d, 0x510: 0x8129, 0x511: 0x8132,
+       0x512: 0x8132, 0x513: 0x8132, 0x514: 0x8132, 0x515: 0x8132, 0x516: 0x8132, 0x517: 0x8132,
+       0x518: 0x8132, 0x519: 0x8132, 0x51a: 0x8132, 0x51b: 0x8132, 0x51c: 0x8132, 0x51d: 0x8132,
+       0x51e: 0x8132, 0x51f: 0x8132, 0x520: 0x8132, 0x521: 0x8132, 0x522: 0x8132, 0x523: 0x8132,
+       0x524: 0x8132, 0x525: 0x8132, 0x526: 0x8132, 0x527: 0x8132, 0x528: 0x8132, 0x529: 0x8132,
+       0x52a: 0x8132, 0x52b: 0x8132, 0x52c: 0x8132, 0x52d: 0x8132, 0x52e: 0x8132, 0x52f: 0x8132,
+       0x530: 0x8132, 0x531: 0x8132, 0x532: 0x8132, 0x533: 0x8132, 0x534: 0x8132, 0x535: 0x8132,
+       0x536: 0x8133, 0x537: 0x8131, 0x538: 0x8131, 0x539: 0x812d, 0x53b: 0x8132,
+       0x53c: 0x8134, 0x53d: 0x812d, 0x53e: 0x8132, 0x53f: 0x812d,
+       // Block 0x15, offset 0x540
+       0x540: 0x2f97, 0x541: 0x32a3, 0x542: 0x2fa1, 0x543: 0x32ad, 0x544: 0x2fa6, 0x545: 0x32b2,
+       0x546: 0x2fab, 0x547: 0x32b7, 0x548: 0x38cc, 0x549: 0x3a5b, 0x54a: 0x2fc4, 0x54b: 0x32d0,
+       0x54c: 0x2fce, 0x54d: 0x32da, 0x54e: 0x2fdd, 0x54f: 0x32e9, 0x550: 0x2fd3, 0x551: 0x32df,
+       0x552: 0x2fd8, 0x553: 0x32e4, 0x554: 0x38ef, 0x555: 0x3a7e, 0x556: 0x38f6, 0x557: 0x3a85,
+       0x558: 0x3019, 0x559: 0x3325, 0x55a: 0x301e, 0x55b: 0x332a, 0x55c: 0x3904, 0x55d: 0x3a93,
+       0x55e: 0x3023, 0x55f: 0x332f, 0x560: 0x3032, 0x561: 0x333e, 0x562: 0x3050, 0x563: 0x335c,
+       0x564: 0x305f, 0x565: 0x336b, 0x566: 0x3055, 0x567: 0x3361, 0x568: 0x3064, 0x569: 0x3370,
+       0x56a: 0x3069, 0x56b: 0x3375, 0x56c: 0x30af, 0x56d: 0x33bb, 0x56e: 0x390b, 0x56f: 0x3a9a,
+       0x570: 0x30b9, 0x571: 0x33ca, 0x572: 0x30c3, 0x573: 0x33d4, 0x574: 0x30cd, 0x575: 0x33de,
+       0x576: 0x46c4, 0x577: 0x4755, 0x578: 0x3912, 0x579: 0x3aa1, 0x57a: 0x30e6, 0x57b: 0x33f7,
+       0x57c: 0x30e1, 0x57d: 0x33f2, 0x57e: 0x30eb, 0x57f: 0x33fc,
+       // Block 0x16, offset 0x580
+       0x580: 0x30f0, 0x581: 0x3401, 0x582: 0x30f5, 0x583: 0x3406, 0x584: 0x3109, 0x585: 0x341a,
+       0x586: 0x3113, 0x587: 0x3424, 0x588: 0x3122, 0x589: 0x3433, 0x58a: 0x311d, 0x58b: 0x342e,
+       0x58c: 0x3935, 0x58d: 0x3ac4, 0x58e: 0x3943, 0x58f: 0x3ad2, 0x590: 0x394a, 0x591: 0x3ad9,
+       0x592: 0x3951, 0x593: 0x3ae0, 0x594: 0x314f, 0x595: 0x3460, 0x596: 0x3154, 0x597: 0x3465,
+       0x598: 0x315e, 0x599: 0x346f, 0x59a: 0x46f1, 0x59b: 0x4782, 0x59c: 0x3997, 0x59d: 0x3b26,
+       0x59e: 0x3177, 0x59f: 0x3488, 0x5a0: 0x3181, 0x5a1: 0x3492, 0x5a2: 0x4700, 0x5a3: 0x4791,
+       0x5a4: 0x399e, 0x5a5: 0x3b2d, 0x5a6: 0x39a5, 0x5a7: 0x3b34, 0x5a8: 0x39ac, 0x5a9: 0x3b3b,
+       0x5aa: 0x3190, 0x5ab: 0x34a1, 0x5ac: 0x319a, 0x5ad: 0x34b0, 0x5ae: 0x31ae, 0x5af: 0x34c4,
+       0x5b0: 0x31a9, 0x5b1: 0x34bf, 0x5b2: 0x31ea, 0x5b3: 0x3500, 0x5b4: 0x31f9, 0x5b5: 0x350f,
+       0x5b6: 0x31f4, 0x5b7: 0x350a, 0x5b8: 0x39b3, 0x5b9: 0x3b42, 0x5ba: 0x39ba, 0x5bb: 0x3b49,
+       0x5bc: 0x31fe, 0x5bd: 0x3514, 0x5be: 0x3203, 0x5bf: 0x3519,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x3208, 0x5c1: 0x351e, 0x5c2: 0x320d, 0x5c3: 0x3523, 0x5c4: 0x321c, 0x5c5: 0x3532,
+       0x5c6: 0x3217, 0x5c7: 0x352d, 0x5c8: 0x3221, 0x5c9: 0x353c, 0x5ca: 0x3226, 0x5cb: 0x3541,
+       0x5cc: 0x322b, 0x5cd: 0x3546, 0x5ce: 0x3249, 0x5cf: 0x3564, 0x5d0: 0x3262, 0x5d1: 0x3582,
+       0x5d2: 0x3271, 0x5d3: 0x3591, 0x5d4: 0x3276, 0x5d5: 0x3596, 0x5d6: 0x337a, 0x5d7: 0x34a6,
+       0x5d8: 0x3537, 0x5d9: 0x3573, 0x5da: 0x1be0, 0x5db: 0x42d7,
+       0x5e0: 0x46a1, 0x5e1: 0x4732, 0x5e2: 0x2f83, 0x5e3: 0x328f,
+       0x5e4: 0x3878, 0x5e5: 0x3a07, 0x5e6: 0x3871, 0x5e7: 0x3a00, 0x5e8: 0x3886, 0x5e9: 0x3a15,
+       0x5ea: 0x387f, 0x5eb: 0x3a0e, 0x5ec: 0x38be, 0x5ed: 0x3a4d, 0x5ee: 0x3894, 0x5ef: 0x3a23,
+       0x5f0: 0x388d, 0x5f1: 0x3a1c, 0x5f2: 0x38a2, 0x5f3: 0x3a31, 0x5f4: 0x389b, 0x5f5: 0x3a2a,
+       0x5f6: 0x38c5, 0x5f7: 0x3a54, 0x5f8: 0x46b5, 0x5f9: 0x4746, 0x5fa: 0x3000, 0x5fb: 0x330c,
+       0x5fc: 0x2fec, 0x5fd: 0x32f8, 0x5fe: 0x38da, 0x5ff: 0x3a69,
+       // Block 0x18, offset 0x600
+       0x600: 0x38d3, 0x601: 0x3a62, 0x602: 0x38e8, 0x603: 0x3a77, 0x604: 0x38e1, 0x605: 0x3a70,
+       0x606: 0x38fd, 0x607: 0x3a8c, 0x608: 0x3091, 0x609: 0x339d, 0x60a: 0x30a5, 0x60b: 0x33b1,
+       0x60c: 0x46e7, 0x60d: 0x4778, 0x60e: 0x3136, 0x60f: 0x3447, 0x610: 0x3920, 0x611: 0x3aaf,
+       0x612: 0x3919, 0x613: 0x3aa8, 0x614: 0x392e, 0x615: 0x3abd, 0x616: 0x3927, 0x617: 0x3ab6,
+       0x618: 0x3989, 0x619: 0x3b18, 0x61a: 0x396d, 0x61b: 0x3afc, 0x61c: 0x3966, 0x61d: 0x3af5,
+       0x61e: 0x397b, 0x61f: 0x3b0a, 0x620: 0x3974, 0x621: 0x3b03, 0x622: 0x3982, 0x623: 0x3b11,
+       0x624: 0x31e5, 0x625: 0x34fb, 0x626: 0x31c7, 0x627: 0x34dd, 0x628: 0x39e4, 0x629: 0x3b73,
+       0x62a: 0x39dd, 0x62b: 0x3b6c, 0x62c: 0x39f2, 0x62d: 0x3b81, 0x62e: 0x39eb, 0x62f: 0x3b7a,
+       0x630: 0x39f9, 0x631: 0x3b88, 0x632: 0x3230, 0x633: 0x354b, 0x634: 0x3258, 0x635: 0x3578,
+       0x636: 0x3253, 0x637: 0x356e, 0x638: 0x323f, 0x639: 0x355a,
+       // Block 0x19, offset 0x640
+       0x640: 0x4804, 0x641: 0x480a, 0x642: 0x491e, 0x643: 0x4936, 0x644: 0x4926, 0x645: 0x493e,
+       0x646: 0x492e, 0x647: 0x4946, 0x648: 0x47aa, 0x649: 0x47b0, 0x64a: 0x488e, 0x64b: 0x48a6,
+       0x64c: 0x4896, 0x64d: 0x48ae, 0x64e: 0x489e, 0x64f: 0x48b6, 0x650: 0x4816, 0x651: 0x481c,
+       0x652: 0x3db8, 0x653: 0x3dc8, 0x654: 0x3dc0, 0x655: 0x3dd0,
+       0x658: 0x47b6, 0x659: 0x47bc, 0x65a: 0x3ce8, 0x65b: 0x3cf8, 0x65c: 0x3cf0, 0x65d: 0x3d00,
+       0x660: 0x482e, 0x661: 0x4834, 0x662: 0x494e, 0x663: 0x4966,
+       0x664: 0x4956, 0x665: 0x496e, 0x666: 0x495e, 0x667: 0x4976, 0x668: 0x47c2, 0x669: 0x47c8,
+       0x66a: 0x48be, 0x66b: 0x48d6, 0x66c: 0x48c6, 0x66d: 0x48de, 0x66e: 0x48ce, 0x66f: 0x48e6,
+       0x670: 0x4846, 0x671: 0x484c, 0x672: 0x3e18, 0x673: 0x3e30, 0x674: 0x3e20, 0x675: 0x3e38,
+       0x676: 0x3e28, 0x677: 0x3e40, 0x678: 0x47ce, 0x679: 0x47d4, 0x67a: 0x3d18, 0x67b: 0x3d30,
+       0x67c: 0x3d20, 0x67d: 0x3d38, 0x67e: 0x3d28, 0x67f: 0x3d40,
+       // Block 0x1a, offset 0x680
+       0x680: 0x4852, 0x681: 0x4858, 0x682: 0x3e48, 0x683: 0x3e58, 0x684: 0x3e50, 0x685: 0x3e60,
+       0x688: 0x47da, 0x689: 0x47e0, 0x68a: 0x3d48, 0x68b: 0x3d58,
+       0x68c: 0x3d50, 0x68d: 0x3d60, 0x690: 0x4864, 0x691: 0x486a,
+       0x692: 0x3e80, 0x693: 0x3e98, 0x694: 0x3e88, 0x695: 0x3ea0, 0x696: 0x3e90, 0x697: 0x3ea8,
+       0x699: 0x47e6, 0x69b: 0x3d68, 0x69d: 0x3d70,
+       0x69f: 0x3d78, 0x6a0: 0x487c, 0x6a1: 0x4882, 0x6a2: 0x497e, 0x6a3: 0x4996,
+       0x6a4: 0x4986, 0x6a5: 0x499e, 0x6a6: 0x498e, 0x6a7: 0x49a6, 0x6a8: 0x47ec, 0x6a9: 0x47f2,
+       0x6aa: 0x48ee, 0x6ab: 0x4906, 0x6ac: 0x48f6, 0x6ad: 0x490e, 0x6ae: 0x48fe, 0x6af: 0x4916,
+       0x6b0: 0x47f8, 0x6b1: 0x431e, 0x6b2: 0x3691, 0x6b3: 0x4324, 0x6b4: 0x4822, 0x6b5: 0x432a,
+       0x6b6: 0x36a3, 0x6b7: 0x4330, 0x6b8: 0x36c1, 0x6b9: 0x4336, 0x6ba: 0x36d9, 0x6bb: 0x433c,
+       0x6bc: 0x4870, 0x6bd: 0x4342,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x3da0, 0x6c1: 0x3da8, 0x6c2: 0x4184, 0x6c3: 0x41a2, 0x6c4: 0x418e, 0x6c5: 0x41ac,
+       0x6c6: 0x4198, 0x6c7: 0x41b6, 0x6c8: 0x3cd8, 0x6c9: 0x3ce0, 0x6ca: 0x40d0, 0x6cb: 0x40ee,
+       0x6cc: 0x40da, 0x6cd: 0x40f8, 0x6ce: 0x40e4, 0x6cf: 0x4102, 0x6d0: 0x3de8, 0x6d1: 0x3df0,
+       0x6d2: 0x41c0, 0x6d3: 0x41de, 0x6d4: 0x41ca, 0x6d5: 0x41e8, 0x6d6: 0x41d4, 0x6d7: 0x41f2,
+       0x6d8: 0x3d08, 0x6d9: 0x3d10, 0x6da: 0x410c, 0x6db: 0x412a, 0x6dc: 0x4116, 0x6dd: 0x4134,
+       0x6de: 0x4120, 0x6df: 0x413e, 0x6e0: 0x3ec0, 0x6e1: 0x3ec8, 0x6e2: 0x41fc, 0x6e3: 0x421a,
+       0x6e4: 0x4206, 0x6e5: 0x4224, 0x6e6: 0x4210, 0x6e7: 0x422e, 0x6e8: 0x3d80, 0x6e9: 0x3d88,
+       0x6ea: 0x4148, 0x6eb: 0x4166, 0x6ec: 0x4152, 0x6ed: 0x4170, 0x6ee: 0x415c, 0x6ef: 0x417a,
+       0x6f0: 0x3685, 0x6f1: 0x367f, 0x6f2: 0x3d90, 0x6f3: 0x368b, 0x6f4: 0x3d98,
+       0x6f6: 0x4810, 0x6f7: 0x3db0, 0x6f8: 0x35f5, 0x6f9: 0x35ef, 0x6fa: 0x35e3, 0x6fb: 0x42ee,
+       0x6fc: 0x35fb, 0x6fd: 0x4287, 0x6fe: 0x01d3, 0x6ff: 0x4287,
+       // Block 0x1c, offset 0x700
+       0x700: 0x42a0, 0x701: 0x4482, 0x702: 0x3dd8, 0x703: 0x369d, 0x704: 0x3de0,
+       0x706: 0x483a, 0x707: 0x3df8, 0x708: 0x3601, 0x709: 0x42f4, 0x70a: 0x360d, 0x70b: 0x42fa,
+       0x70c: 0x3619, 0x70d: 0x4489, 0x70e: 0x4490, 0x70f: 0x4497, 0x710: 0x36b5, 0x711: 0x36af,
+       0x712: 0x3e00, 0x713: 0x44e4, 0x716: 0x36bb, 0x717: 0x3e10,
+       0x718: 0x3631, 0x719: 0x362b, 0x71a: 0x361f, 0x71b: 0x4300, 0x71d: 0x449e,
+       0x71e: 0x44a5, 0x71f: 0x44ac, 0x720: 0x36eb, 0x721: 0x36e5, 0x722: 0x3e68, 0x723: 0x44ec,
+       0x724: 0x36cd, 0x725: 0x36d3, 0x726: 0x36f1, 0x727: 0x3e78, 0x728: 0x3661, 0x729: 0x365b,
+       0x72a: 0x364f, 0x72b: 0x430c, 0x72c: 0x3649, 0x72d: 0x4474, 0x72e: 0x447b, 0x72f: 0x0081,
+       0x732: 0x3eb0, 0x733: 0x36f7, 0x734: 0x3eb8,
+       0x736: 0x4888, 0x737: 0x3ed0, 0x738: 0x363d, 0x739: 0x4306, 0x73a: 0x366d, 0x73b: 0x4318,
+       0x73c: 0x3679, 0x73d: 0x425a, 0x73e: 0x428c,
+       // Block 0x1d, offset 0x740
+       0x740: 0x1bd8, 0x741: 0x1bdc, 0x742: 0x0047, 0x743: 0x1c54, 0x745: 0x1be8,
+       0x746: 0x1bec, 0x747: 0x00e9, 0x749: 0x1c58, 0x74a: 0x008f, 0x74b: 0x0051,
+       0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00da, 0x750: 0x0053, 0x751: 0x0053,
+       0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x198d,
+       0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065,
+       0x760: 0x199f, 0x761: 0x1bc8, 0x762: 0x19a8,
+       0x764: 0x0075, 0x766: 0x01b8, 0x768: 0x0075,
+       0x76a: 0x0057, 0x76b: 0x42d2, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b,
+       0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0215,
+       0x776: 0x0218, 0x777: 0x021b, 0x778: 0x021e, 0x779: 0x0093, 0x77b: 0x1b98,
+       0x77c: 0x01e8, 0x77d: 0x01c1, 0x77e: 0x0179, 0x77f: 0x01a0,
+       // Block 0x1e, offset 0x780
+       0x780: 0x0463, 0x785: 0x0049,
+       0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095,
+       0x790: 0x222e, 0x791: 0x223a,
+       0x792: 0x22ee, 0x793: 0x2216, 0x794: 0x229a, 0x795: 0x2222, 0x796: 0x22a0, 0x797: 0x22b8,
+       0x798: 0x22c4, 0x799: 0x2228, 0x79a: 0x22ca, 0x79b: 0x2234, 0x79c: 0x22be, 0x79d: 0x22d0,
+       0x79e: 0x22d6, 0x79f: 0x1cbc, 0x7a0: 0x0053, 0x7a1: 0x195a, 0x7a2: 0x1ba4, 0x7a3: 0x1963,
+       0x7a4: 0x006d, 0x7a5: 0x19ab, 0x7a6: 0x1bd0, 0x7a7: 0x1d48, 0x7a8: 0x1966, 0x7a9: 0x0071,
+       0x7aa: 0x19b7, 0x7ab: 0x1bd4, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b,
+       0x7b0: 0x0093, 0x7b1: 0x19e4, 0x7b2: 0x1c18, 0x7b3: 0x19ed, 0x7b4: 0x00ad, 0x7b5: 0x1a62,
+       0x7b6: 0x1c4c, 0x7b7: 0x1d5c, 0x7b8: 0x19f0, 0x7b9: 0x00b1, 0x7ba: 0x1a65, 0x7bb: 0x1c50,
+       0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b,
+       // Block 0x1f, offset 0x7c0
+       0x7c1: 0x3c06, 0x7c3: 0xa000, 0x7c4: 0x3c0d, 0x7c5: 0xa000,
+       0x7c7: 0x3c14, 0x7c8: 0xa000, 0x7c9: 0x3c1b,
+       0x7cd: 0xa000,
+       0x7e0: 0x2f65, 0x7e1: 0xa000, 0x7e2: 0x3c29,
+       0x7e4: 0xa000, 0x7e5: 0xa000,
+       0x7ed: 0x3c22, 0x7ee: 0x2f60, 0x7ef: 0x2f6a,
+       0x7f0: 0x3c30, 0x7f1: 0x3c37, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3c3e, 0x7f5: 0x3c45,
+       0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3c4c, 0x7f9: 0x3c53, 0x7fa: 0xa000, 0x7fb: 0xa000,
+       0x7fc: 0xa000, 0x7fd: 0xa000,
+       // Block 0x20, offset 0x800
+       0x800: 0x3c5a, 0x801: 0x3c61, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3c76, 0x805: 0x3c7d,
+       0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3c84, 0x809: 0x3c8b,
+       0x811: 0xa000,
+       0x812: 0xa000,
+       0x822: 0xa000,
+       0x828: 0xa000, 0x829: 0xa000,
+       0x82b: 0xa000, 0x82c: 0x3ca0, 0x82d: 0x3ca7, 0x82e: 0x3cae, 0x82f: 0x3cb5,
+       0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000,
+       // Block 0x21, offset 0x840
+       0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029,
+       0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x1882,
+       0x86a: 0x1885, 0x86b: 0x1888, 0x86c: 0x188b, 0x86d: 0x188e, 0x86e: 0x1891, 0x86f: 0x1894,
+       0x870: 0x1897, 0x871: 0x189a, 0x872: 0x189d, 0x873: 0x18a6, 0x874: 0x1a68, 0x875: 0x1a6c,
+       0x876: 0x1a70, 0x877: 0x1a74, 0x878: 0x1a78, 0x879: 0x1a7c, 0x87a: 0x1a80, 0x87b: 0x1a84,
+       0x87c: 0x1a88, 0x87d: 0x1c80, 0x87e: 0x1c85, 0x87f: 0x1c8a,
+       // Block 0x22, offset 0x880
+       0x880: 0x1c8f, 0x881: 0x1c94, 0x882: 0x1c99, 0x883: 0x1c9e, 0x884: 0x1ca3, 0x885: 0x1ca8,
+       0x886: 0x1cad, 0x887: 0x1cb2, 0x888: 0x187f, 0x889: 0x18a3, 0x88a: 0x18c7, 0x88b: 0x18eb,
+       0x88c: 0x190f, 0x88d: 0x1918, 0x88e: 0x191e, 0x88f: 0x1924, 0x890: 0x192a, 0x891: 0x1b60,
+       0x892: 0x1b64, 0x893: 0x1b68, 0x894: 0x1b6c, 0x895: 0x1b70, 0x896: 0x1b74, 0x897: 0x1b78,
+       0x898: 0x1b7c, 0x899: 0x1b80, 0x89a: 0x1b84, 0x89b: 0x1b88, 0x89c: 0x1af4, 0x89d: 0x1af8,
+       0x89e: 0x1afc, 0x89f: 0x1b00, 0x8a0: 0x1b04, 0x8a1: 0x1b08, 0x8a2: 0x1b0c, 0x8a3: 0x1b10,
+       0x8a4: 0x1b14, 0x8a5: 0x1b18, 0x8a6: 0x1b1c, 0x8a7: 0x1b20, 0x8a8: 0x1b24, 0x8a9: 0x1b28,
+       0x8aa: 0x1b2c, 0x8ab: 0x1b30, 0x8ac: 0x1b34, 0x8ad: 0x1b38, 0x8ae: 0x1b3c, 0x8af: 0x1b40,
+       0x8b0: 0x1b44, 0x8b1: 0x1b48, 0x8b2: 0x1b4c, 0x8b3: 0x1b50, 0x8b4: 0x1b54, 0x8b5: 0x1b58,
+       0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d,
+       0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x06bf, 0x8c1: 0x06e3, 0x8c2: 0x06ef, 0x8c3: 0x06ff, 0x8c4: 0x0707, 0x8c5: 0x0713,
+       0x8c6: 0x071b, 0x8c7: 0x0723, 0x8c8: 0x072f, 0x8c9: 0x0783, 0x8ca: 0x079b, 0x8cb: 0x07ab,
+       0x8cc: 0x07bb, 0x8cd: 0x07cb, 0x8ce: 0x07db, 0x8cf: 0x07fb, 0x8d0: 0x07ff, 0x8d1: 0x0803,
+       0x8d2: 0x0837, 0x8d3: 0x085f, 0x8d4: 0x086f, 0x8d5: 0x0877, 0x8d6: 0x087b, 0x8d7: 0x0887,
+       0x8d8: 0x08a3, 0x8d9: 0x08a7, 0x8da: 0x08bf, 0x8db: 0x08c3, 0x8dc: 0x08cb, 0x8dd: 0x08db,
+       0x8de: 0x0977, 0x8df: 0x098b, 0x8e0: 0x09cb, 0x8e1: 0x09df, 0x8e2: 0x09e7, 0x8e3: 0x09eb,
+       0x8e4: 0x09fb, 0x8e5: 0x0a17, 0x8e6: 0x0a43, 0x8e7: 0x0a4f, 0x8e8: 0x0a6f, 0x8e9: 0x0a7b,
+       0x8ea: 0x0a7f, 0x8eb: 0x0a83, 0x8ec: 0x0a9b, 0x8ed: 0x0a9f, 0x8ee: 0x0acb, 0x8ef: 0x0ad7,
+       0x8f0: 0x0adf, 0x8f1: 0x0ae7, 0x8f2: 0x0af7, 0x8f3: 0x0aff, 0x8f4: 0x0b07, 0x8f5: 0x0b33,
+       0x8f6: 0x0b37, 0x8f7: 0x0b3f, 0x8f8: 0x0b43, 0x8f9: 0x0b4b, 0x8fa: 0x0b53, 0x8fb: 0x0b63,
+       0x8fc: 0x0b7f, 0x8fd: 0x0bf7, 0x8fe: 0x0c0b, 0x8ff: 0x0c0f,
+       // Block 0x24, offset 0x900
+       0x900: 0x0c8f, 0x901: 0x0c93, 0x902: 0x0ca7, 0x903: 0x0cab, 0x904: 0x0cb3, 0x905: 0x0cbb,
+       0x906: 0x0cc3, 0x907: 0x0ccf, 0x908: 0x0cf7, 0x909: 0x0d07, 0x90a: 0x0d1b, 0x90b: 0x0d8b,
+       0x90c: 0x0d97, 0x90d: 0x0da7, 0x90e: 0x0db3, 0x90f: 0x0dbf, 0x910: 0x0dc7, 0x911: 0x0dcb,
+       0x912: 0x0dcf, 0x913: 0x0dd3, 0x914: 0x0dd7, 0x915: 0x0e8f, 0x916: 0x0ed7, 0x917: 0x0ee3,
+       0x918: 0x0ee7, 0x919: 0x0eeb, 0x91a: 0x0eef, 0x91b: 0x0ef7, 0x91c: 0x0efb, 0x91d: 0x0f0f,
+       0x91e: 0x0f2b, 0x91f: 0x0f33, 0x920: 0x0f73, 0x921: 0x0f77, 0x922: 0x0f7f, 0x923: 0x0f83,
+       0x924: 0x0f8b, 0x925: 0x0f8f, 0x926: 0x0fb3, 0x927: 0x0fb7, 0x928: 0x0fd3, 0x929: 0x0fd7,
+       0x92a: 0x0fdb, 0x92b: 0x0fdf, 0x92c: 0x0ff3, 0x92d: 0x1017, 0x92e: 0x101b, 0x92f: 0x101f,
+       0x930: 0x1043, 0x931: 0x1083, 0x932: 0x1087, 0x933: 0x10a7, 0x934: 0x10b7, 0x935: 0x10bf,
+       0x936: 0x10df, 0x937: 0x1103, 0x938: 0x1147, 0x939: 0x114f, 0x93a: 0x1163, 0x93b: 0x116f,
+       0x93c: 0x1177, 0x93d: 0x117f, 0x93e: 0x1183, 0x93f: 0x1187,
+       // Block 0x25, offset 0x940
+       0x940: 0x119f, 0x941: 0x11a3, 0x942: 0x11bf, 0x943: 0x11c7, 0x944: 0x11cf, 0x945: 0x11d3,
+       0x946: 0x11df, 0x947: 0x11e7, 0x948: 0x11eb, 0x949: 0x11ef, 0x94a: 0x11f7, 0x94b: 0x11fb,
+       0x94c: 0x129b, 0x94d: 0x12af, 0x94e: 0x12e3, 0x94f: 0x12e7, 0x950: 0x12ef, 0x951: 0x131b,
+       0x952: 0x1323, 0x953: 0x132b, 0x954: 0x1333, 0x955: 0x136f, 0x956: 0x1373, 0x957: 0x137b,
+       0x958: 0x137f, 0x959: 0x1383, 0x95a: 0x13af, 0x95b: 0x13b3, 0x95c: 0x13bb, 0x95d: 0x13cf,
+       0x95e: 0x13d3, 0x95f: 0x13ef, 0x960: 0x13f7, 0x961: 0x13fb, 0x962: 0x141f, 0x963: 0x143f,
+       0x964: 0x1453, 0x965: 0x1457, 0x966: 0x145f, 0x967: 0x148b, 0x968: 0x148f, 0x969: 0x149f,
+       0x96a: 0x14c3, 0x96b: 0x14cf, 0x96c: 0x14df, 0x96d: 0x14f7, 0x96e: 0x14ff, 0x96f: 0x1503,
+       0x970: 0x1507, 0x971: 0x150b, 0x972: 0x1517, 0x973: 0x151b, 0x974: 0x1523, 0x975: 0x153f,
+       0x976: 0x1543, 0x977: 0x1547, 0x978: 0x155f, 0x979: 0x1563, 0x97a: 0x156b, 0x97b: 0x157f,
+       0x97c: 0x1583, 0x97d: 0x1587, 0x97e: 0x158f, 0x97f: 0x1593,
+       // Block 0x26, offset 0x980
+       0x986: 0xa000, 0x98b: 0xa000,
+       0x98c: 0x3f08, 0x98d: 0xa000, 0x98e: 0x3f10, 0x98f: 0xa000, 0x990: 0x3f18, 0x991: 0xa000,
+       0x992: 0x3f20, 0x993: 0xa000, 0x994: 0x3f28, 0x995: 0xa000, 0x996: 0x3f30, 0x997: 0xa000,
+       0x998: 0x3f38, 0x999: 0xa000, 0x99a: 0x3f40, 0x99b: 0xa000, 0x99c: 0x3f48, 0x99d: 0xa000,
+       0x99e: 0x3f50, 0x99f: 0xa000, 0x9a0: 0x3f58, 0x9a1: 0xa000, 0x9a2: 0x3f60,
+       0x9a4: 0xa000, 0x9a5: 0x3f68, 0x9a6: 0xa000, 0x9a7: 0x3f70, 0x9a8: 0xa000, 0x9a9: 0x3f78,
+       0x9af: 0xa000,
+       0x9b0: 0x3f80, 0x9b1: 0x3f88, 0x9b2: 0xa000, 0x9b3: 0x3f90, 0x9b4: 0x3f98, 0x9b5: 0xa000,
+       0x9b6: 0x3fa0, 0x9b7: 0x3fa8, 0x9b8: 0xa000, 0x9b9: 0x3fb0, 0x9ba: 0x3fb8, 0x9bb: 0xa000,
+       0x9bc: 0x3fc0, 0x9bd: 0x3fc8,
+       // Block 0x27, offset 0x9c0
+       0x9d4: 0x3f00,
+       0x9d9: 0x9903, 0x9da: 0x9903, 0x9db: 0x42dc, 0x9dc: 0x42e2, 0x9dd: 0xa000,
+       0x9de: 0x3fd0, 0x9df: 0x26b4,
+       0x9e6: 0xa000,
+       0x9eb: 0xa000, 0x9ec: 0x3fe0, 0x9ed: 0xa000, 0x9ee: 0x3fe8, 0x9ef: 0xa000,
+       0x9f0: 0x3ff0, 0x9f1: 0xa000, 0x9f2: 0x3ff8, 0x9f3: 0xa000, 0x9f4: 0x4000, 0x9f5: 0xa000,
+       0x9f6: 0x4008, 0x9f7: 0xa000, 0x9f8: 0x4010, 0x9f9: 0xa000, 0x9fa: 0x4018, 0x9fb: 0xa000,
+       0x9fc: 0x4020, 0x9fd: 0xa000, 0x9fe: 0x4028, 0x9ff: 0xa000,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x4030, 0xa01: 0xa000, 0xa02: 0x4038, 0xa04: 0xa000, 0xa05: 0x4040,
+       0xa06: 0xa000, 0xa07: 0x4048, 0xa08: 0xa000, 0xa09: 0x4050,
+       0xa0f: 0xa000, 0xa10: 0x4058, 0xa11: 0x4060,
+       0xa12: 0xa000, 0xa13: 0x4068, 0xa14: 0x4070, 0xa15: 0xa000, 0xa16: 0x4078, 0xa17: 0x4080,
+       0xa18: 0xa000, 0xa19: 0x4088, 0xa1a: 0x4090, 0xa1b: 0xa000, 0xa1c: 0x4098, 0xa1d: 0x40a0,
+       0xa2f: 0xa000,
+       0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x3fd8,
+       0xa37: 0x40a8, 0xa38: 0x40b0, 0xa39: 0x40b8, 0xa3a: 0x40c0,
+       0xa3d: 0xa000, 0xa3e: 0x40c8, 0xa3f: 0x26c9,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0367, 0xa41: 0x032b, 0xa42: 0x032f, 0xa43: 0x0333, 0xa44: 0x037b, 0xa45: 0x0337,
+       0xa46: 0x033b, 0xa47: 0x033f, 0xa48: 0x0343, 0xa49: 0x0347, 0xa4a: 0x034b, 0xa4b: 0x034f,
+       0xa4c: 0x0353, 0xa4d: 0x0357, 0xa4e: 0x035b, 0xa4f: 0x49bd, 0xa50: 0x49c3, 0xa51: 0x49c9,
+       0xa52: 0x49cf, 0xa53: 0x49d5, 0xa54: 0x49db, 0xa55: 0x49e1, 0xa56: 0x49e7, 0xa57: 0x49ed,
+       0xa58: 0x49f3, 0xa59: 0x49f9, 0xa5a: 0x49ff, 0xa5b: 0x4a05, 0xa5c: 0x4a0b, 0xa5d: 0x4a11,
+       0xa5e: 0x4a17, 0xa5f: 0x4a1d, 0xa60: 0x4a23, 0xa61: 0x4a29, 0xa62: 0x4a2f, 0xa63: 0x4a35,
+       0xa64: 0x03c3, 0xa65: 0x035f, 0xa66: 0x0363, 0xa67: 0x03e7, 0xa68: 0x03eb, 0xa69: 0x03ef,
+       0xa6a: 0x03f3, 0xa6b: 0x03f7, 0xa6c: 0x03fb, 0xa6d: 0x03ff, 0xa6e: 0x036b, 0xa6f: 0x0403,
+       0xa70: 0x0407, 0xa71: 0x036f, 0xa72: 0x0373, 0xa73: 0x0377, 0xa74: 0x037f, 0xa75: 0x0383,
+       0xa76: 0x0387, 0xa77: 0x038b, 0xa78: 0x038f, 0xa79: 0x0393, 0xa7a: 0x0397, 0xa7b: 0x039b,
+       0xa7c: 0x039f, 0xa7d: 0x03a3, 0xa7e: 0x03a7, 0xa7f: 0x03ab,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x03af, 0xa81: 0x03b3, 0xa82: 0x040b, 0xa83: 0x040f, 0xa84: 0x03b7, 0xa85: 0x03bb,
+       0xa86: 0x03bf, 0xa87: 0x03c7, 0xa88: 0x03cb, 0xa89: 0x03cf, 0xa8a: 0x03d3, 0xa8b: 0x03d7,
+       0xa8c: 0x03db, 0xa8d: 0x03df, 0xa8e: 0x03e3,
+       0xa92: 0x06bf, 0xa93: 0x071b, 0xa94: 0x06cb, 0xa95: 0x097b, 0xa96: 0x06cf, 0xa97: 0x06e7,
+       0xa98: 0x06d3, 0xa99: 0x0f93, 0xa9a: 0x0707, 0xa9b: 0x06db, 0xa9c: 0x06c3, 0xa9d: 0x09ff,
+       0xa9e: 0x098f, 0xa9f: 0x072f,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x2054, 0xac1: 0x205a, 0xac2: 0x2060, 0xac3: 0x2066, 0xac4: 0x206c, 0xac5: 0x2072,
+       0xac6: 0x2078, 0xac7: 0x207e, 0xac8: 0x2084, 0xac9: 0x208a, 0xaca: 0x2090, 0xacb: 0x2096,
+       0xacc: 0x209c, 0xacd: 0x20a2, 0xace: 0x2726, 0xacf: 0x272f, 0xad0: 0x2738, 0xad1: 0x2741,
+       0xad2: 0x274a, 0xad3: 0x2753, 0xad4: 0x275c, 0xad5: 0x2765, 0xad6: 0x276e, 0xad7: 0x2780,
+       0xad8: 0x2789, 0xad9: 0x2792, 0xada: 0x279b, 0xadb: 0x27a4, 0xadc: 0x2777, 0xadd: 0x2bac,
+       0xade: 0x2aed, 0xae0: 0x20a8, 0xae1: 0x20c0, 0xae2: 0x20b4, 0xae3: 0x2108,
+       0xae4: 0x20c6, 0xae5: 0x20e4, 0xae6: 0x20ae, 0xae7: 0x20de, 0xae8: 0x20ba, 0xae9: 0x20f0,
+       0xaea: 0x2120, 0xaeb: 0x213e, 0xaec: 0x2138, 0xaed: 0x212c, 0xaee: 0x217a, 0xaef: 0x210e,
+       0xaf0: 0x211a, 0xaf1: 0x2132, 0xaf2: 0x2126, 0xaf3: 0x2150, 0xaf4: 0x20fc, 0xaf5: 0x2144,
+       0xaf6: 0x216e, 0xaf7: 0x2156, 0xaf8: 0x20ea, 0xaf9: 0x20cc, 0xafa: 0x2102, 0xafb: 0x2114,
+       0xafc: 0x214a, 0xafd: 0x20d2, 0xafe: 0x2174, 0xaff: 0x20f6,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x215c, 0xb01: 0x20d8, 0xb02: 0x2162, 0xb03: 0x2168, 0xb04: 0x092f, 0xb05: 0x0b03,
+       0xb06: 0x0ca7, 0xb07: 0x10c7,
+       0xb10: 0x1bc4, 0xb11: 0x18a9,
+       0xb12: 0x18ac, 0xb13: 0x18af, 0xb14: 0x18b2, 0xb15: 0x18b5, 0xb16: 0x18b8, 0xb17: 0x18bb,
+       0xb18: 0x18be, 0xb19: 0x18c1, 0xb1a: 0x18ca, 0xb1b: 0x18cd, 0xb1c: 0x18d0, 0xb1d: 0x18d3,
+       0xb1e: 0x18d6, 0xb1f: 0x18d9, 0xb20: 0x0313, 0xb21: 0x031b, 0xb22: 0x031f, 0xb23: 0x0327,
+       0xb24: 0x032b, 0xb25: 0x032f, 0xb26: 0x0337, 0xb27: 0x033f, 0xb28: 0x0343, 0xb29: 0x034b,
+       0xb2a: 0x034f, 0xb2b: 0x0353, 0xb2c: 0x0357, 0xb2d: 0x035b, 0xb2e: 0x2e18, 0xb2f: 0x2e20,
+       0xb30: 0x2e28, 0xb31: 0x2e30, 0xb32: 0x2e38, 0xb33: 0x2e40, 0xb34: 0x2e48, 0xb35: 0x2e50,
+       0xb36: 0x2e60, 0xb37: 0x2e68, 0xb38: 0x2e70, 0xb39: 0x2e78, 0xb3a: 0x2e80, 0xb3b: 0x2e88,
+       0xb3c: 0x2ed3, 0xb3d: 0x2e9b, 0xb3e: 0x2e58,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x06bf, 0xb41: 0x071b, 0xb42: 0x06cb, 0xb43: 0x097b, 0xb44: 0x071f, 0xb45: 0x07af,
+       0xb46: 0x06c7, 0xb47: 0x07ab, 0xb48: 0x070b, 0xb49: 0x0887, 0xb4a: 0x0d07, 0xb4b: 0x0e8f,
+       0xb4c: 0x0dd7, 0xb4d: 0x0d1b, 0xb4e: 0x145f, 0xb4f: 0x098b, 0xb50: 0x0ccf, 0xb51: 0x0d4b,
+       0xb52: 0x0d0b, 0xb53: 0x104b, 0xb54: 0x08fb, 0xb55: 0x0f03, 0xb56: 0x1387, 0xb57: 0x105f,
+       0xb58: 0x0843, 0xb59: 0x108f, 0xb5a: 0x0f9b, 0xb5b: 0x0a17, 0xb5c: 0x140f, 0xb5d: 0x077f,
+       0xb5e: 0x08ab, 0xb5f: 0x0df7, 0xb60: 0x1527, 0xb61: 0x0743, 0xb62: 0x07d3, 0xb63: 0x0d9b,
+       0xb64: 0x06cf, 0xb65: 0x06e7, 0xb66: 0x06d3, 0xb67: 0x0adb, 0xb68: 0x08ef, 0xb69: 0x087f,
+       0xb6a: 0x0a57, 0xb6b: 0x0a4b, 0xb6c: 0x0feb, 0xb6d: 0x073f, 0xb6e: 0x139b, 0xb6f: 0x089b,
+       0xb70: 0x09f3, 0xb71: 0x18dc, 0xb72: 0x18df, 0xb73: 0x18e2, 0xb74: 0x18e5, 0xb75: 0x18ee,
+       0xb76: 0x18f1, 0xb77: 0x18f4, 0xb78: 0x18f7, 0xb79: 0x18fa, 0xb7a: 0x18fd, 0xb7b: 0x1900,
+       0xb7c: 0x1903, 0xb7d: 0x1906, 0xb7e: 0x1909, 0xb7f: 0x1912,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x1cc6, 0xb81: 0x1cd5, 0xb82: 0x1ce4, 0xb83: 0x1cf3, 0xb84: 0x1d02, 0xb85: 0x1d11,
+       0xb86: 0x1d20, 0xb87: 0x1d2f, 0xb88: 0x1d3e, 0xb89: 0x218c, 0xb8a: 0x219e, 0xb8b: 0x21b0,
+       0xb8c: 0x1954, 0xb8d: 0x1c04, 0xb8e: 0x19d2, 0xb8f: 0x1ba8, 0xb90: 0x04cb, 0xb91: 0x04d3,
+       0xb92: 0x04db, 0xb93: 0x04e3, 0xb94: 0x04eb, 0xb95: 0x04ef, 0xb96: 0x04f3, 0xb97: 0x04f7,
+       0xb98: 0x04fb, 0xb99: 0x04ff, 0xb9a: 0x0503, 0xb9b: 0x0507, 0xb9c: 0x050b, 0xb9d: 0x050f,
+       0xb9e: 0x0513, 0xb9f: 0x0517, 0xba0: 0x051b, 0xba1: 0x0523, 0xba2: 0x0527, 0xba3: 0x052b,
+       0xba4: 0x052f, 0xba5: 0x0533, 0xba6: 0x0537, 0xba7: 0x053b, 0xba8: 0x053f, 0xba9: 0x0543,
+       0xbaa: 0x0547, 0xbab: 0x054b, 0xbac: 0x054f, 0xbad: 0x0553, 0xbae: 0x0557, 0xbaf: 0x055b,
+       0xbb0: 0x055f, 0xbb1: 0x0563, 0xbb2: 0x0567, 0xbb3: 0x056f, 0xbb4: 0x0577, 0xbb5: 0x057f,
+       0xbb6: 0x0583, 0xbb7: 0x0587, 0xbb8: 0x058b, 0xbb9: 0x058f, 0xbba: 0x0593, 0xbbb: 0x0597,
+       0xbbc: 0x059b, 0xbbd: 0x059f, 0xbbe: 0x05a3,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x2b0c, 0xbc1: 0x29a8, 0xbc2: 0x2b1c, 0xbc3: 0x2880, 0xbc4: 0x2ee4, 0xbc5: 0x288a,
+       0xbc6: 0x2894, 0xbc7: 0x2f28, 0xbc8: 0x29b5, 0xbc9: 0x289e, 0xbca: 0x28a8, 0xbcb: 0x28b2,
+       0xbcc: 0x29dc, 0xbcd: 0x29e9, 0xbce: 0x29c2, 0xbcf: 0x29cf, 0xbd0: 0x2ea9, 0xbd1: 0x29f6,
+       0xbd2: 0x2a03, 0xbd3: 0x2bbe, 0xbd4: 0x26bb, 0xbd5: 0x2bd1, 0xbd6: 0x2be4, 0xbd7: 0x2b2c,
+       0xbd8: 0x2a10, 0xbd9: 0x2bf7, 0xbda: 0x2c0a, 0xbdb: 0x2a1d, 0xbdc: 0x28bc, 0xbdd: 0x28c6,
+       0xbde: 0x2eb7, 0xbdf: 0x2a2a, 0xbe0: 0x2b3c, 0xbe1: 0x2ef5, 0xbe2: 0x28d0, 0xbe3: 0x28da,
+       0xbe4: 0x2a37, 0xbe5: 0x28e4, 0xbe6: 0x28ee, 0xbe7: 0x26d0, 0xbe8: 0x26d7, 0xbe9: 0x28f8,
+       0xbea: 0x2902, 0xbeb: 0x2c1d, 0xbec: 0x2a44, 0xbed: 0x2b4c, 0xbee: 0x2c30, 0xbef: 0x2a51,
+       0xbf0: 0x2916, 0xbf1: 0x290c, 0xbf2: 0x2f3c, 0xbf3: 0x2a5e, 0xbf4: 0x2c43, 0xbf5: 0x2920,
+       0xbf6: 0x2b5c, 0xbf7: 0x292a, 0xbf8: 0x2a78, 0xbf9: 0x2934, 0xbfa: 0x2a85, 0xbfb: 0x2f06,
+       0xbfc: 0x2a6b, 0xbfd: 0x2b6c, 0xbfe: 0x2a92, 0xbff: 0x26de,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x2f17, 0xc01: 0x293e, 0xc02: 0x2948, 0xc03: 0x2a9f, 0xc04: 0x2952, 0xc05: 0x295c,
+       0xc06: 0x2966, 0xc07: 0x2b7c, 0xc08: 0x2aac, 0xc09: 0x26e5, 0xc0a: 0x2c56, 0xc0b: 0x2e90,
+       0xc0c: 0x2b8c, 0xc0d: 0x2ab9, 0xc0e: 0x2ec5, 0xc0f: 0x2970, 0xc10: 0x297a, 0xc11: 0x2ac6,
+       0xc12: 0x26ec, 0xc13: 0x2ad3, 0xc14: 0x2b9c, 0xc15: 0x26f3, 0xc16: 0x2c69, 0xc17: 0x2984,
+       0xc18: 0x1cb7, 0xc19: 0x1ccb, 0xc1a: 0x1cda, 0xc1b: 0x1ce9, 0xc1c: 0x1cf8, 0xc1d: 0x1d07,
+       0xc1e: 0x1d16, 0xc1f: 0x1d25, 0xc20: 0x1d34, 0xc21: 0x1d43, 0xc22: 0x2192, 0xc23: 0x21a4,
+       0xc24: 0x21b6, 0xc25: 0x21c2, 0xc26: 0x21ce, 0xc27: 0x21da, 0xc28: 0x21e6, 0xc29: 0x21f2,
+       0xc2a: 0x21fe, 0xc2b: 0x220a, 0xc2c: 0x2246, 0xc2d: 0x2252, 0xc2e: 0x225e, 0xc2f: 0x226a,
+       0xc30: 0x2276, 0xc31: 0x1c14, 0xc32: 0x19c6, 0xc33: 0x1936, 0xc34: 0x1be4, 0xc35: 0x1a47,
+       0xc36: 0x1a56, 0xc37: 0x19cc, 0xc38: 0x1bfc, 0xc39: 0x1c00, 0xc3a: 0x1960, 0xc3b: 0x2701,
+       0xc3c: 0x270f, 0xc3d: 0x26fa, 0xc3e: 0x2708, 0xc3f: 0x2ae0,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x1a4a, 0xc41: 0x1a32, 0xc42: 0x1c60, 0xc43: 0x1a1a, 0xc44: 0x19f3, 0xc45: 0x1969,
+       0xc46: 0x1978, 0xc47: 0x1948, 0xc48: 0x1bf0, 0xc49: 0x1d52, 0xc4a: 0x1a4d, 0xc4b: 0x1a35,
+       0xc4c: 0x1c64, 0xc4d: 0x1c70, 0xc4e: 0x1a26, 0xc4f: 0x19fc, 0xc50: 0x1957, 0xc51: 0x1c1c,
+       0xc52: 0x1bb0, 0xc53: 0x1b9c, 0xc54: 0x1bcc, 0xc55: 0x1c74, 0xc56: 0x1a29, 0xc57: 0x19c9,
+       0xc58: 0x19ff, 0xc59: 0x19de, 0xc5a: 0x1a41, 0xc5b: 0x1c78, 0xc5c: 0x1a2c, 0xc5d: 0x19c0,
+       0xc5e: 0x1a02, 0xc5f: 0x1c3c, 0xc60: 0x1bf4, 0xc61: 0x1a14, 0xc62: 0x1c24, 0xc63: 0x1c40,
+       0xc64: 0x1bf8, 0xc65: 0x1a17, 0xc66: 0x1c28, 0xc67: 0x22e8, 0xc68: 0x22fc, 0xc69: 0x1996,
+       0xc6a: 0x1c20, 0xc6b: 0x1bb4, 0xc6c: 0x1ba0, 0xc6d: 0x1c48, 0xc6e: 0x2716, 0xc6f: 0x27ad,
+       0xc70: 0x1a59, 0xc71: 0x1a44, 0xc72: 0x1c7c, 0xc73: 0x1a2f, 0xc74: 0x1a50, 0xc75: 0x1a38,
+       0xc76: 0x1c68, 0xc77: 0x1a1d, 0xc78: 0x19f6, 0xc79: 0x1981, 0xc7a: 0x1a53, 0xc7b: 0x1a3b,
+       0xc7c: 0x1c6c, 0xc7d: 0x1a20, 0xc7e: 0x19f9, 0xc7f: 0x1984,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x1c2c, 0xc81: 0x1bb8, 0xc82: 0x1d4d, 0xc83: 0x1939, 0xc84: 0x19ba, 0xc85: 0x19bd,
+       0xc86: 0x22f5, 0xc87: 0x1b94, 0xc88: 0x19c3, 0xc89: 0x194b, 0xc8a: 0x19e1, 0xc8b: 0x194e,
+       0xc8c: 0x19ea, 0xc8d: 0x196c, 0xc8e: 0x196f, 0xc8f: 0x1a05, 0xc90: 0x1a0b, 0xc91: 0x1a0e,
+       0xc92: 0x1c30, 0xc93: 0x1a11, 0xc94: 0x1a23, 0xc95: 0x1c38, 0xc96: 0x1c44, 0xc97: 0x1990,
+       0xc98: 0x1d57, 0xc99: 0x1bbc, 0xc9a: 0x1993, 0xc9b: 0x1a5c, 0xc9c: 0x19a5, 0xc9d: 0x19b4,
+       0xc9e: 0x22e2, 0xc9f: 0x22dc, 0xca0: 0x1cc1, 0xca1: 0x1cd0, 0xca2: 0x1cdf, 0xca3: 0x1cee,
+       0xca4: 0x1cfd, 0xca5: 0x1d0c, 0xca6: 0x1d1b, 0xca7: 0x1d2a, 0xca8: 0x1d39, 0xca9: 0x2186,
+       0xcaa: 0x2198, 0xcab: 0x21aa, 0xcac: 0x21bc, 0xcad: 0x21c8, 0xcae: 0x21d4, 0xcaf: 0x21e0,
+       0xcb0: 0x21ec, 0xcb1: 0x21f8, 0xcb2: 0x2204, 0xcb3: 0x2240, 0xcb4: 0x224c, 0xcb5: 0x2258,
+       0xcb6: 0x2264, 0xcb7: 0x2270, 0xcb8: 0x227c, 0xcb9: 0x2282, 0xcba: 0x2288, 0xcbb: 0x228e,
+       0xcbc: 0x2294, 0xcbd: 0x22a6, 0xcbe: 0x22ac, 0xcbf: 0x1c10,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x1377, 0xcc1: 0x0cfb, 0xcc2: 0x13d3, 0xcc3: 0x139f, 0xcc4: 0x0e57, 0xcc5: 0x06eb,
+       0xcc6: 0x08df, 0xcc7: 0x162b, 0xcc8: 0x162b, 0xcc9: 0x0a0b, 0xcca: 0x145f, 0xccb: 0x0943,
+       0xccc: 0x0a07, 0xccd: 0x0bef, 0xcce: 0x0fcf, 0xccf: 0x115f, 0xcd0: 0x1297, 0xcd1: 0x12d3,
+       0xcd2: 0x1307, 0xcd3: 0x141b, 0xcd4: 0x0d73, 0xcd5: 0x0dff, 0xcd6: 0x0eab, 0xcd7: 0x0f43,
+       0xcd8: 0x125f, 0xcd9: 0x1447, 0xcda: 0x1573, 0xcdb: 0x070f, 0xcdc: 0x08b3, 0xcdd: 0x0d87,
+       0xcde: 0x0ecf, 0xcdf: 0x1293, 0xce0: 0x15c3, 0xce1: 0x0ab3, 0xce2: 0x0e77, 0xce3: 0x1283,
+       0xce4: 0x1317, 0xce5: 0x0c23, 0xce6: 0x11bb, 0xce7: 0x12df, 0xce8: 0x0b1f, 0xce9: 0x0d0f,
+       0xcea: 0x0e17, 0xceb: 0x0f1b, 0xcec: 0x1427, 0xced: 0x074f, 0xcee: 0x07e7, 0xcef: 0x0853,
+       0xcf0: 0x0c8b, 0xcf1: 0x0d7f, 0xcf2: 0x0ecb, 0xcf3: 0x0fef, 0xcf4: 0x1177, 0xcf5: 0x128b,
+       0xcf6: 0x12a3, 0xcf7: 0x13c7, 0xcf8: 0x14ef, 0xcf9: 0x15a3, 0xcfa: 0x15bf, 0xcfb: 0x102b,
+       0xcfc: 0x106b, 0xcfd: 0x1123, 0xcfe: 0x1243, 0xcff: 0x147b,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x15cb, 0xd01: 0x134b, 0xd02: 0x09c7, 0xd03: 0x0b3b, 0xd04: 0x10db, 0xd05: 0x119b,
+       0xd06: 0x0eff, 0xd07: 0x1033, 0xd08: 0x1397, 0xd09: 0x14e7, 0xd0a: 0x09c3, 0xd0b: 0x0a8f,
+       0xd0c: 0x0d77, 0xd0d: 0x0e2b, 0xd0e: 0x0e5f, 0xd0f: 0x1113, 0xd10: 0x113b, 0xd11: 0x14a7,
+       0xd12: 0x084f, 0xd13: 0x11a7, 0xd14: 0x07f3, 0xd15: 0x07ef, 0xd16: 0x1097, 0xd17: 0x1127,
+       0xd18: 0x125b, 0xd19: 0x14af, 0xd1a: 0x1367, 0xd1b: 0x0c27, 0xd1c: 0x0d73, 0xd1d: 0x1357,
+       0xd1e: 0x06f7, 0xd1f: 0x0a63, 0xd20: 0x0b93, 0xd21: 0x0f2f, 0xd22: 0x0faf, 0xd23: 0x0873,
+       0xd24: 0x103b, 0xd25: 0x075f, 0xd26: 0x0b77, 0xd27: 0x06d7, 0xd28: 0x0deb, 0xd29: 0x0ca3,
+       0xd2a: 0x110f, 0xd2b: 0x08c7, 0xd2c: 0x09b3, 0xd2d: 0x0ffb, 0xd2e: 0x1263, 0xd2f: 0x133b,
+       0xd30: 0x0db7, 0xd31: 0x13f7, 0xd32: 0x0de3, 0xd33: 0x0c37, 0xd34: 0x121b, 0xd35: 0x0c57,
+       0xd36: 0x0fab, 0xd37: 0x072b, 0xd38: 0x07a7, 0xd39: 0x07eb, 0xd3a: 0x0d53, 0xd3b: 0x10fb,
+       0xd3c: 0x11f3, 0xd3d: 0x1347, 0xd3e: 0x145b, 0xd3f: 0x085b,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x090f, 0xd41: 0x0a17, 0xd42: 0x0b2f, 0xd43: 0x0cbf, 0xd44: 0x0e7b, 0xd45: 0x103f,
+       0xd46: 0x1497, 0xd47: 0x157b, 0xd48: 0x15cf, 0xd49: 0x15e7, 0xd4a: 0x0837, 0xd4b: 0x0cf3,
+       0xd4c: 0x0da3, 0xd4d: 0x13eb, 0xd4e: 0x0afb, 0xd4f: 0x0bd7, 0xd50: 0x0bf3, 0xd51: 0x0c83,
+       0xd52: 0x0e6b, 0xd53: 0x0eb7, 0xd54: 0x0f67, 0xd55: 0x108b, 0xd56: 0x112f, 0xd57: 0x1193,
+       0xd58: 0x13db, 0xd59: 0x126b, 0xd5a: 0x1403, 0xd5b: 0x147f, 0xd5c: 0x080f, 0xd5d: 0x083b,
+       0xd5e: 0x0923, 0xd5f: 0x0ea7, 0xd60: 0x12f3, 0xd61: 0x133b, 0xd62: 0x0b1b, 0xd63: 0x0b8b,
+       0xd64: 0x0c4f, 0xd65: 0x0daf, 0xd66: 0x10d7, 0xd67: 0x0f23, 0xd68: 0x073b, 0xd69: 0x097f,
+       0xd6a: 0x0a63, 0xd6b: 0x0ac7, 0xd6c: 0x0b97, 0xd6d: 0x0f3f, 0xd6e: 0x0f5b, 0xd6f: 0x116b,
+       0xd70: 0x118b, 0xd71: 0x1463, 0xd72: 0x14e3, 0xd73: 0x14f3, 0xd74: 0x152f, 0xd75: 0x0753,
+       0xd76: 0x107f, 0xd77: 0x144f, 0xd78: 0x14cb, 0xd79: 0x0baf, 0xd7a: 0x0717, 0xd7b: 0x0777,
+       0xd7c: 0x0a67, 0xd7d: 0x0a87, 0xd7e: 0x0caf, 0xd7f: 0x0d73,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x0ec3, 0xd81: 0x0fcb, 0xd82: 0x1277, 0xd83: 0x1417, 0xd84: 0x1623, 0xd85: 0x0ce3,
+       0xd86: 0x14a3, 0xd87: 0x0833, 0xd88: 0x0d2f, 0xd89: 0x0d3b, 0xd8a: 0x0e0f, 0xd8b: 0x0e47,
+       0xd8c: 0x0f4b, 0xd8d: 0x0fa7, 0xd8e: 0x1027, 0xd8f: 0x110b, 0xd90: 0x153b, 0xd91: 0x07af,
+       0xd92: 0x0c03, 0xd93: 0x14b3, 0xd94: 0x0767, 0xd95: 0x0aab, 0xd96: 0x0e2f, 0xd97: 0x13df,
+       0xd98: 0x0b67, 0xd99: 0x0bb7, 0xd9a: 0x0d43, 0xd9b: 0x0f2f, 0xd9c: 0x14bb, 0xd9d: 0x0817,
+       0xd9e: 0x08ff, 0xd9f: 0x0a97, 0xda0: 0x0cd3, 0xda1: 0x0d1f, 0xda2: 0x0d5f, 0xda3: 0x0df3,
+       0xda4: 0x0f47, 0xda5: 0x0fbb, 0xda6: 0x1157, 0xda7: 0x12f7, 0xda8: 0x1303, 0xda9: 0x1457,
+       0xdaa: 0x14d7, 0xdab: 0x0883, 0xdac: 0x0e4b, 0xdad: 0x0903, 0xdae: 0x0ec7, 0xdaf: 0x0f6b,
+       0xdb0: 0x1287, 0xdb1: 0x14bf, 0xdb2: 0x15ab, 0xdb3: 0x15d3, 0xdb4: 0x0d37, 0xdb5: 0x0e27,
+       0xdb6: 0x11c3, 0xdb7: 0x10b7, 0xdb8: 0x10c3, 0xdb9: 0x10e7, 0xdba: 0x0f17, 0xdbb: 0x0e9f,
+       0xdbc: 0x1363, 0xdbd: 0x0733, 0xdbe: 0x122b, 0xdbf: 0x081b,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0x080b, 0xdc1: 0x0b0b, 0xdc2: 0x0c2b, 0xdc3: 0x10f3, 0xdc4: 0x0a53, 0xdc5: 0x0e03,
+       0xdc6: 0x0cef, 0xdc7: 0x13e7, 0xdc8: 0x12e7, 0xdc9: 0x14ab, 0xdca: 0x1323, 0xdcb: 0x0b27,
+       0xdcc: 0x0787, 0xdcd: 0x095b, 0xdd0: 0x09af,
+       0xdd2: 0x0cdf, 0xdd5: 0x07f7, 0xdd6: 0x0f1f, 0xdd7: 0x0fe3,
+       0xdd8: 0x1047, 0xdd9: 0x1063, 0xdda: 0x1067, 0xddb: 0x107b, 0xddc: 0x14fb, 0xddd: 0x10eb,
+       0xdde: 0x116f, 0xde0: 0x128f, 0xde2: 0x1353,
+       0xde5: 0x1407, 0xde6: 0x1433,
+       0xdea: 0x154f, 0xdeb: 0x1553, 0xdec: 0x1557, 0xded: 0x15bb, 0xdee: 0x142b, 0xdef: 0x14c7,
+       0xdf0: 0x0757, 0xdf1: 0x077b, 0xdf2: 0x078f, 0xdf3: 0x084b, 0xdf4: 0x0857, 0xdf5: 0x0897,
+       0xdf6: 0x094b, 0xdf7: 0x0967, 0xdf8: 0x096f, 0xdf9: 0x09ab, 0xdfa: 0x09b7, 0xdfb: 0x0a93,
+       0xdfc: 0x0a9b, 0xdfd: 0x0ba3, 0xdfe: 0x0bcb, 0xdff: 0x0bd3,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x0beb, 0xe01: 0x0c97, 0xe02: 0x0cc7, 0xe03: 0x0ce7, 0xe04: 0x0d57, 0xe05: 0x0e1b,
+       0xe06: 0x0e37, 0xe07: 0x0e67, 0xe08: 0x0ebb, 0xe09: 0x0edb, 0xe0a: 0x0f4f, 0xe0b: 0x102f,
+       0xe0c: 0x104b, 0xe0d: 0x1053, 0xe0e: 0x104f, 0xe0f: 0x1057, 0xe10: 0x105b, 0xe11: 0x105f,
+       0xe12: 0x1073, 0xe13: 0x1077, 0xe14: 0x109b, 0xe15: 0x10af, 0xe16: 0x10cb, 0xe17: 0x112f,
+       0xe18: 0x1137, 0xe19: 0x113f, 0xe1a: 0x1153, 0xe1b: 0x117b, 0xe1c: 0x11cb, 0xe1d: 0x11ff,
+       0xe1e: 0x11ff, 0xe1f: 0x1267, 0xe20: 0x130f, 0xe21: 0x1327, 0xe22: 0x135b, 0xe23: 0x135f,
+       0xe24: 0x13a3, 0xe25: 0x13a7, 0xe26: 0x13ff, 0xe27: 0x1407, 0xe28: 0x14db, 0xe29: 0x151f,
+       0xe2a: 0x1537, 0xe2b: 0x0b9b, 0xe2c: 0x171e, 0xe2d: 0x11e3,
+       0xe30: 0x06df, 0xe31: 0x07e3, 0xe32: 0x07a3, 0xe33: 0x074b, 0xe34: 0x078b, 0xe35: 0x07b7,
+       0xe36: 0x0847, 0xe37: 0x0863, 0xe38: 0x094b, 0xe39: 0x0937, 0xe3a: 0x0947, 0xe3b: 0x0963,
+       0xe3c: 0x09af, 0xe3d: 0x09bf, 0xe3e: 0x0a03, 0xe3f: 0x0a0f,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x0a2b, 0xe41: 0x0a3b, 0xe42: 0x0b23, 0xe43: 0x0b2b, 0xe44: 0x0b5b, 0xe45: 0x0b7b,
+       0xe46: 0x0bab, 0xe47: 0x0bc3, 0xe48: 0x0bb3, 0xe49: 0x0bd3, 0xe4a: 0x0bc7, 0xe4b: 0x0beb,
+       0xe4c: 0x0c07, 0xe4d: 0x0c5f, 0xe4e: 0x0c6b, 0xe4f: 0x0c73, 0xe50: 0x0c9b, 0xe51: 0x0cdf,
+       0xe52: 0x0d0f, 0xe53: 0x0d13, 0xe54: 0x0d27, 0xe55: 0x0da7, 0xe56: 0x0db7, 0xe57: 0x0e0f,
+       0xe58: 0x0e5b, 0xe59: 0x0e53, 0xe5a: 0x0e67, 0xe5b: 0x0e83, 0xe5c: 0x0ebb, 0xe5d: 0x1013,
+       0xe5e: 0x0edf, 0xe5f: 0x0f13, 0xe60: 0x0f1f, 0xe61: 0x0f5f, 0xe62: 0x0f7b, 0xe63: 0x0f9f,
+       0xe64: 0x0fc3, 0xe65: 0x0fc7, 0xe66: 0x0fe3, 0xe67: 0x0fe7, 0xe68: 0x0ff7, 0xe69: 0x100b,
+       0xe6a: 0x1007, 0xe6b: 0x1037, 0xe6c: 0x10b3, 0xe6d: 0x10cb, 0xe6e: 0x10e3, 0xe6f: 0x111b,
+       0xe70: 0x112f, 0xe71: 0x114b, 0xe72: 0x117b, 0xe73: 0x122f, 0xe74: 0x1257, 0xe75: 0x12cb,
+       0xe76: 0x1313, 0xe77: 0x131f, 0xe78: 0x1327, 0xe79: 0x133f, 0xe7a: 0x1353, 0xe7b: 0x1343,
+       0xe7c: 0x135b, 0xe7d: 0x1357, 0xe7e: 0x134f, 0xe7f: 0x135f,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x136b, 0xe81: 0x13a7, 0xe82: 0x13e3, 0xe83: 0x1413, 0xe84: 0x144b, 0xe85: 0x146b,
+       0xe86: 0x14b7, 0xe87: 0x14db, 0xe88: 0x14fb, 0xe89: 0x150f, 0xe8a: 0x151f, 0xe8b: 0x152b,
+       0xe8c: 0x1537, 0xe8d: 0x158b, 0xe8e: 0x162b, 0xe8f: 0x16b5, 0xe90: 0x16b0, 0xe91: 0x16e2,
+       0xe92: 0x0607, 0xe93: 0x062f, 0xe94: 0x0633, 0xe95: 0x1764, 0xe96: 0x1791, 0xe97: 0x1809,
+       0xe98: 0x1617, 0xe99: 0x1627,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x19d5, 0xec1: 0x19d8, 0xec2: 0x19db, 0xec3: 0x1c08, 0xec4: 0x1c0c, 0xec5: 0x1a5f,
+       0xec6: 0x1a5f,
+       0xed3: 0x1d75, 0xed4: 0x1d66, 0xed5: 0x1d6b, 0xed6: 0x1d7a, 0xed7: 0x1d70,
+       0xedd: 0x4390,
+       0xede: 0x8115, 0xedf: 0x4402, 0xee0: 0x022d, 0xee1: 0x0215, 0xee2: 0x021e, 0xee3: 0x0221,
+       0xee4: 0x0224, 0xee5: 0x0227, 0xee6: 0x022a, 0xee7: 0x0230, 0xee8: 0x0233, 0xee9: 0x0017,
+       0xeea: 0x43f0, 0xeeb: 0x43f6, 0xeec: 0x44f4, 0xeed: 0x44fc, 0xeee: 0x4348, 0xeef: 0x434e,
+       0xef0: 0x4354, 0xef1: 0x435a, 0xef2: 0x4366, 0xef3: 0x436c, 0xef4: 0x4372, 0xef5: 0x437e,
+       0xef6: 0x4384, 0xef8: 0x438a, 0xef9: 0x4396, 0xefa: 0x439c, 0xefb: 0x43a2,
+       0xefc: 0x43ae, 0xefe: 0x43b4,
+       // Block 0x3c, offset 0xf00
+       0xf00: 0x43ba, 0xf01: 0x43c0, 0xf03: 0x43c6, 0xf04: 0x43cc,
+       0xf06: 0x43d8, 0xf07: 0x43de, 0xf08: 0x43e4, 0xf09: 0x43ea, 0xf0a: 0x43fc, 0xf0b: 0x4378,
+       0xf0c: 0x4360, 0xf0d: 0x43a8, 0xf0e: 0x43d2, 0xf0f: 0x1d7f, 0xf10: 0x0299, 0xf11: 0x0299,
+       0xf12: 0x02a2, 0xf13: 0x02a2, 0xf14: 0x02a2, 0xf15: 0x02a2, 0xf16: 0x02a5, 0xf17: 0x02a5,
+       0xf18: 0x02a5, 0xf19: 0x02a5, 0xf1a: 0x02ab, 0xf1b: 0x02ab, 0xf1c: 0x02ab, 0xf1d: 0x02ab,
+       0xf1e: 0x029f, 0xf1f: 0x029f, 0xf20: 0x029f, 0xf21: 0x029f, 0xf22: 0x02a8, 0xf23: 0x02a8,
+       0xf24: 0x02a8, 0xf25: 0x02a8, 0xf26: 0x029c, 0xf27: 0x029c, 0xf28: 0x029c, 0xf29: 0x029c,
+       0xf2a: 0x02cf, 0xf2b: 0x02cf, 0xf2c: 0x02cf, 0xf2d: 0x02cf, 0xf2e: 0x02d2, 0xf2f: 0x02d2,
+       0xf30: 0x02d2, 0xf31: 0x02d2, 0xf32: 0x02b1, 0xf33: 0x02b1, 0xf34: 0x02b1, 0xf35: 0x02b1,
+       0xf36: 0x02ae, 0xf37: 0x02ae, 0xf38: 0x02ae, 0xf39: 0x02ae, 0xf3a: 0x02b4, 0xf3b: 0x02b4,
+       0xf3c: 0x02b4, 0xf3d: 0x02b4, 0xf3e: 0x02b7, 0xf3f: 0x02b7,
+       // Block 0x3d, offset 0xf40
+       0xf40: 0x02b7, 0xf41: 0x02b7, 0xf42: 0x02c0, 0xf43: 0x02c0, 0xf44: 0x02bd, 0xf45: 0x02bd,
+       0xf46: 0x02c3, 0xf47: 0x02c3, 0xf48: 0x02ba, 0xf49: 0x02ba, 0xf4a: 0x02c9, 0xf4b: 0x02c9,
+       0xf4c: 0x02c6, 0xf4d: 0x02c6, 0xf4e: 0x02d5, 0xf4f: 0x02d5, 0xf50: 0x02d5, 0xf51: 0x02d5,
+       0xf52: 0x02db, 0xf53: 0x02db, 0xf54: 0x02db, 0xf55: 0x02db, 0xf56: 0x02e1, 0xf57: 0x02e1,
+       0xf58: 0x02e1, 0xf59: 0x02e1, 0xf5a: 0x02de, 0xf5b: 0x02de, 0xf5c: 0x02de, 0xf5d: 0x02de,
+       0xf5e: 0x02e4, 0xf5f: 0x02e4, 0xf60: 0x02e7, 0xf61: 0x02e7, 0xf62: 0x02e7, 0xf63: 0x02e7,
+       0xf64: 0x446e, 0xf65: 0x446e, 0xf66: 0x02ed, 0xf67: 0x02ed, 0xf68: 0x02ed, 0xf69: 0x02ed,
+       0xf6a: 0x02ea, 0xf6b: 0x02ea, 0xf6c: 0x02ea, 0xf6d: 0x02ea, 0xf6e: 0x0308, 0xf6f: 0x0308,
+       0xf70: 0x4468, 0xf71: 0x4468,
+       // Block 0x3e, offset 0xf80
+       0xf93: 0x02d8, 0xf94: 0x02d8, 0xf95: 0x02d8, 0xf96: 0x02d8, 0xf97: 0x02f6,
+       0xf98: 0x02f6, 0xf99: 0x02f3, 0xf9a: 0x02f3, 0xf9b: 0x02f9, 0xf9c: 0x02f9, 0xf9d: 0x204f,
+       0xf9e: 0x02ff, 0xf9f: 0x02ff, 0xfa0: 0x02f0, 0xfa1: 0x02f0, 0xfa2: 0x02fc, 0xfa3: 0x02fc,
+       0xfa4: 0x0305, 0xfa5: 0x0305, 0xfa6: 0x0305, 0xfa7: 0x0305, 0xfa8: 0x028d, 0xfa9: 0x028d,
+       0xfaa: 0x25aa, 0xfab: 0x25aa, 0xfac: 0x261a, 0xfad: 0x261a, 0xfae: 0x25e9, 0xfaf: 0x25e9,
+       0xfb0: 0x2605, 0xfb1: 0x2605, 0xfb2: 0x25fe, 0xfb3: 0x25fe, 0xfb4: 0x260c, 0xfb5: 0x260c,
+       0xfb6: 0x2613, 0xfb7: 0x2613, 0xfb8: 0x2613, 0xfb9: 0x25f0, 0xfba: 0x25f0, 0xfbb: 0x25f0,
+       0xfbc: 0x0302, 0xfbd: 0x0302, 0xfbe: 0x0302, 0xfbf: 0x0302,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x25b1, 0xfc1: 0x25b8, 0xfc2: 0x25d4, 0xfc3: 0x25f0, 0xfc4: 0x25f7, 0xfc5: 0x1d89,
+       0xfc6: 0x1d8e, 0xfc7: 0x1d93, 0xfc8: 0x1da2, 0xfc9: 0x1db1, 0xfca: 0x1db6, 0xfcb: 0x1dbb,
+       0xfcc: 0x1dc0, 0xfcd: 0x1dc5, 0xfce: 0x1dd4, 0xfcf: 0x1de3, 0xfd0: 0x1de8, 0xfd1: 0x1ded,
+       0xfd2: 0x1dfc, 0xfd3: 0x1e0b, 0xfd4: 0x1e10, 0xfd5: 0x1e15, 0xfd6: 0x1e1a, 0xfd7: 0x1e29,
+       0xfd8: 0x1e2e, 0xfd9: 0x1e3d, 0xfda: 0x1e42, 0xfdb: 0x1e47, 0xfdc: 0x1e56, 0xfdd: 0x1e5b,
+       0xfde: 0x1e60, 0xfdf: 0x1e6a, 0xfe0: 0x1ea6, 0xfe1: 0x1eb5, 0xfe2: 0x1ec4, 0xfe3: 0x1ec9,
+       0xfe4: 0x1ece, 0xfe5: 0x1ed8, 0xfe6: 0x1ee7, 0xfe7: 0x1eec, 0xfe8: 0x1efb, 0xfe9: 0x1f00,
+       0xfea: 0x1f05, 0xfeb: 0x1f14, 0xfec: 0x1f19, 0xfed: 0x1f28, 0xfee: 0x1f2d, 0xfef: 0x1f32,
+       0xff0: 0x1f37, 0xff1: 0x1f3c, 0xff2: 0x1f41, 0xff3: 0x1f46, 0xff4: 0x1f4b, 0xff5: 0x1f50,
+       0xff6: 0x1f55, 0xff7: 0x1f5a, 0xff8: 0x1f5f, 0xff9: 0x1f64, 0xffa: 0x1f69, 0xffb: 0x1f6e,
+       0xffc: 0x1f73, 0xffd: 0x1f78, 0xffe: 0x1f7d, 0xfff: 0x1f87,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x1f8c, 0x1001: 0x1f91, 0x1002: 0x1f96, 0x1003: 0x1fa0, 0x1004: 0x1fa5, 0x1005: 0x1faf,
+       0x1006: 0x1fb4, 0x1007: 0x1fb9, 0x1008: 0x1fbe, 0x1009: 0x1fc3, 0x100a: 0x1fc8, 0x100b: 0x1fcd,
+       0x100c: 0x1fd2, 0x100d: 0x1fd7, 0x100e: 0x1fe6, 0x100f: 0x1ff5, 0x1010: 0x1ffa, 0x1011: 0x1fff,
+       0x1012: 0x2004, 0x1013: 0x2009, 0x1014: 0x200e, 0x1015: 0x2018, 0x1016: 0x201d, 0x1017: 0x2022,
+       0x1018: 0x2031, 0x1019: 0x2040, 0x101a: 0x2045, 0x101b: 0x4420, 0x101c: 0x4426, 0x101d: 0x445c,
+       0x101e: 0x44b3, 0x101f: 0x44ba, 0x1020: 0x44c1, 0x1021: 0x44c8, 0x1022: 0x44cf, 0x1023: 0x44d6,
+       0x1024: 0x25c6, 0x1025: 0x25cd, 0x1026: 0x25d4, 0x1027: 0x25db, 0x1028: 0x25f0, 0x1029: 0x25f7,
+       0x102a: 0x1d98, 0x102b: 0x1d9d, 0x102c: 0x1da2, 0x102d: 0x1da7, 0x102e: 0x1db1, 0x102f: 0x1db6,
+       0x1030: 0x1dca, 0x1031: 0x1dcf, 0x1032: 0x1dd4, 0x1033: 0x1dd9, 0x1034: 0x1de3, 0x1035: 0x1de8,
+       0x1036: 0x1df2, 0x1037: 0x1df7, 0x1038: 0x1dfc, 0x1039: 0x1e01, 0x103a: 0x1e0b, 0x103b: 0x1e10,
+       0x103c: 0x1f3c, 0x103d: 0x1f41, 0x103e: 0x1f50, 0x103f: 0x1f55,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x1f5a, 0x1041: 0x1f6e, 0x1042: 0x1f73, 0x1043: 0x1f78, 0x1044: 0x1f7d, 0x1045: 0x1f96,
+       0x1046: 0x1fa0, 0x1047: 0x1fa5, 0x1048: 0x1faa, 0x1049: 0x1fbe, 0x104a: 0x1fdc, 0x104b: 0x1fe1,
+       0x104c: 0x1fe6, 0x104d: 0x1feb, 0x104e: 0x1ff5, 0x104f: 0x1ffa, 0x1050: 0x445c, 0x1051: 0x2027,
+       0x1052: 0x202c, 0x1053: 0x2031, 0x1054: 0x2036, 0x1055: 0x2040, 0x1056: 0x2045, 0x1057: 0x25b1,
+       0x1058: 0x25b8, 0x1059: 0x25bf, 0x105a: 0x25d4, 0x105b: 0x25e2, 0x105c: 0x1d89, 0x105d: 0x1d8e,
+       0x105e: 0x1d93, 0x105f: 0x1da2, 0x1060: 0x1dac, 0x1061: 0x1dbb, 0x1062: 0x1dc0, 0x1063: 0x1dc5,
+       0x1064: 0x1dd4, 0x1065: 0x1dde, 0x1066: 0x1dfc, 0x1067: 0x1e15, 0x1068: 0x1e1a, 0x1069: 0x1e29,
+       0x106a: 0x1e2e, 0x106b: 0x1e3d, 0x106c: 0x1e47, 0x106d: 0x1e56, 0x106e: 0x1e5b, 0x106f: 0x1e60,
+       0x1070: 0x1e6a, 0x1071: 0x1ea6, 0x1072: 0x1eab, 0x1073: 0x1eb5, 0x1074: 0x1ec4, 0x1075: 0x1ec9,
+       0x1076: 0x1ece, 0x1077: 0x1ed8, 0x1078: 0x1ee7, 0x1079: 0x1efb, 0x107a: 0x1f00, 0x107b: 0x1f05,
+       0x107c: 0x1f14, 0x107d: 0x1f19, 0x107e: 0x1f28, 0x107f: 0x1f2d,
+       // Block 0x42, offset 0x1080
+       0x1080: 0x1f32, 0x1081: 0x1f37, 0x1082: 0x1f46, 0x1083: 0x1f4b, 0x1084: 0x1f5f, 0x1085: 0x1f64,
+       0x1086: 0x1f69, 0x1087: 0x1f6e, 0x1088: 0x1f73, 0x1089: 0x1f87, 0x108a: 0x1f8c, 0x108b: 0x1f91,
+       0x108c: 0x1f96, 0x108d: 0x1f9b, 0x108e: 0x1faf, 0x108f: 0x1fb4, 0x1090: 0x1fb9, 0x1091: 0x1fbe,
+       0x1092: 0x1fcd, 0x1093: 0x1fd2, 0x1094: 0x1fd7, 0x1095: 0x1fe6, 0x1096: 0x1ff0, 0x1097: 0x1fff,
+       0x1098: 0x2004, 0x1099: 0x4450, 0x109a: 0x2018, 0x109b: 0x201d, 0x109c: 0x2022, 0x109d: 0x2031,
+       0x109e: 0x203b, 0x109f: 0x25d4, 0x10a0: 0x25e2, 0x10a1: 0x1da2, 0x10a2: 0x1dac, 0x10a3: 0x1dd4,
+       0x10a4: 0x1dde, 0x10a5: 0x1dfc, 0x10a6: 0x1e06, 0x10a7: 0x1e6a, 0x10a8: 0x1e6f, 0x10a9: 0x1e92,
+       0x10aa: 0x1e97, 0x10ab: 0x1f6e, 0x10ac: 0x1f73, 0x10ad: 0x1f96, 0x10ae: 0x1fe6, 0x10af: 0x1ff0,
+       0x10b0: 0x2031, 0x10b1: 0x203b, 0x10b2: 0x4504, 0x10b3: 0x450c, 0x10b4: 0x4514, 0x10b5: 0x1ef1,
+       0x10b6: 0x1ef6, 0x10b7: 0x1f0a, 0x10b8: 0x1f0f, 0x10b9: 0x1f1e, 0x10ba: 0x1f23, 0x10bb: 0x1e74,
+       0x10bc: 0x1e79, 0x10bd: 0x1e9c, 0x10be: 0x1ea1, 0x10bf: 0x1e33,
+       // Block 0x43, offset 0x10c0
+       0x10c0: 0x1e38, 0x10c1: 0x1e1f, 0x10c2: 0x1e24, 0x10c3: 0x1e4c, 0x10c4: 0x1e51, 0x10c5: 0x1eba,
+       0x10c6: 0x1ebf, 0x10c7: 0x1edd, 0x10c8: 0x1ee2, 0x10c9: 0x1e7e, 0x10ca: 0x1e83, 0x10cb: 0x1e88,
+       0x10cc: 0x1e92, 0x10cd: 0x1e8d, 0x10ce: 0x1e65, 0x10cf: 0x1eb0, 0x10d0: 0x1ed3, 0x10d1: 0x1ef1,
+       0x10d2: 0x1ef6, 0x10d3: 0x1f0a, 0x10d4: 0x1f0f, 0x10d5: 0x1f1e, 0x10d6: 0x1f23, 0x10d7: 0x1e74,
+       0x10d8: 0x1e79, 0x10d9: 0x1e9c, 0x10da: 0x1ea1, 0x10db: 0x1e33, 0x10dc: 0x1e38, 0x10dd: 0x1e1f,
+       0x10de: 0x1e24, 0x10df: 0x1e4c, 0x10e0: 0x1e51, 0x10e1: 0x1eba, 0x10e2: 0x1ebf, 0x10e3: 0x1edd,
+       0x10e4: 0x1ee2, 0x10e5: 0x1e7e, 0x10e6: 0x1e83, 0x10e7: 0x1e88, 0x10e8: 0x1e92, 0x10e9: 0x1e8d,
+       0x10ea: 0x1e65, 0x10eb: 0x1eb0, 0x10ec: 0x1ed3, 0x10ed: 0x1e7e, 0x10ee: 0x1e83, 0x10ef: 0x1e88,
+       0x10f0: 0x1e92, 0x10f1: 0x1e6f, 0x10f2: 0x1e97, 0x10f3: 0x1eec, 0x10f4: 0x1e56, 0x10f5: 0x1e5b,
+       0x10f6: 0x1e60, 0x10f7: 0x1e7e, 0x10f8: 0x1e83, 0x10f9: 0x1e88, 0x10fa: 0x1eec, 0x10fb: 0x1efb,
+       0x10fc: 0x4408, 0x10fd: 0x4408,
+       // Block 0x44, offset 0x1100
+       0x1110: 0x2311, 0x1111: 0x2326,
+       0x1112: 0x2326, 0x1113: 0x232d, 0x1114: 0x2334, 0x1115: 0x2349, 0x1116: 0x2350, 0x1117: 0x2357,
+       0x1118: 0x237a, 0x1119: 0x237a, 0x111a: 0x239d, 0x111b: 0x2396, 0x111c: 0x23b2, 0x111d: 0x23a4,
+       0x111e: 0x23ab, 0x111f: 0x23ce, 0x1120: 0x23ce, 0x1121: 0x23c7, 0x1122: 0x23d5, 0x1123: 0x23d5,
+       0x1124: 0x23ff, 0x1125: 0x23ff, 0x1126: 0x241b, 0x1127: 0x23e3, 0x1128: 0x23e3, 0x1129: 0x23dc,
+       0x112a: 0x23f1, 0x112b: 0x23f1, 0x112c: 0x23f8, 0x112d: 0x23f8, 0x112e: 0x2422, 0x112f: 0x2430,
+       0x1130: 0x2430, 0x1131: 0x2437, 0x1132: 0x2437, 0x1133: 0x243e, 0x1134: 0x2445, 0x1135: 0x244c,
+       0x1136: 0x2453, 0x1137: 0x2453, 0x1138: 0x245a, 0x1139: 0x2468, 0x113a: 0x2476, 0x113b: 0x246f,
+       0x113c: 0x247d, 0x113d: 0x247d, 0x113e: 0x2492, 0x113f: 0x2499,
+       // Block 0x45, offset 0x1140
+       0x1140: 0x24ca, 0x1141: 0x24d8, 0x1142: 0x24d1, 0x1143: 0x24b5, 0x1144: 0x24b5, 0x1145: 0x24df,
+       0x1146: 0x24df, 0x1147: 0x24e6, 0x1148: 0x24e6, 0x1149: 0x2510, 0x114a: 0x2517, 0x114b: 0x251e,
+       0x114c: 0x24f4, 0x114d: 0x2502, 0x114e: 0x2525, 0x114f: 0x252c,
+       0x1152: 0x24fb, 0x1153: 0x2580, 0x1154: 0x2587, 0x1155: 0x255d, 0x1156: 0x2564, 0x1157: 0x2548,
+       0x1158: 0x2548, 0x1159: 0x254f, 0x115a: 0x2579, 0x115b: 0x2572, 0x115c: 0x259c, 0x115d: 0x259c,
+       0x115e: 0x230a, 0x115f: 0x231f, 0x1160: 0x2318, 0x1161: 0x2342, 0x1162: 0x233b, 0x1163: 0x2365,
+       0x1164: 0x235e, 0x1165: 0x2388, 0x1166: 0x236c, 0x1167: 0x2381, 0x1168: 0x23b9, 0x1169: 0x2406,
+       0x116a: 0x23ea, 0x116b: 0x2429, 0x116c: 0x24c3, 0x116d: 0x24ed, 0x116e: 0x2595, 0x116f: 0x258e,
+       0x1170: 0x25a3, 0x1171: 0x253a, 0x1172: 0x24a0, 0x1173: 0x256b, 0x1174: 0x2492, 0x1175: 0x24ca,
+       0x1176: 0x2461, 0x1177: 0x24ae, 0x1178: 0x2541, 0x1179: 0x2533, 0x117a: 0x24bc, 0x117b: 0x24a7,
+       0x117c: 0x24bc, 0x117d: 0x2541, 0x117e: 0x2373, 0x117f: 0x238f,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x2509, 0x1181: 0x2484, 0x1182: 0x2303, 0x1183: 0x24a7, 0x1184: 0x244c, 0x1185: 0x241b,
+       0x1186: 0x23c0, 0x1187: 0x2556,
+       0x11b0: 0x2414, 0x11b1: 0x248b, 0x11b2: 0x27bf, 0x11b3: 0x27b6, 0x11b4: 0x27ec, 0x11b5: 0x27da,
+       0x11b6: 0x27c8, 0x11b7: 0x27e3, 0x11b8: 0x27f5, 0x11b9: 0x240d, 0x11ba: 0x2c7c, 0x11bb: 0x2afc,
+       0x11bc: 0x27d1,
+       // Block 0x47, offset 0x11c0
+       0x11d0: 0x0019, 0x11d1: 0x0483,
+       0x11d2: 0x0487, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x04bf,
+       0x11d8: 0x04c3, 0x11d9: 0x1b5c,
+       0x11e0: 0x8132, 0x11e1: 0x8132, 0x11e2: 0x8132, 0x11e3: 0x8132,
+       0x11e4: 0x8132, 0x11e5: 0x8132, 0x11e6: 0x8132, 0x11e7: 0x812d, 0x11e8: 0x812d, 0x11e9: 0x812d,
+       0x11ea: 0x812d, 0x11eb: 0x812d, 0x11ec: 0x812d, 0x11ed: 0x812d, 0x11ee: 0x8132, 0x11ef: 0x8132,
+       0x11f0: 0x1873, 0x11f1: 0x0443, 0x11f2: 0x043f, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011,
+       0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x04b7, 0x11fa: 0x04bb, 0x11fb: 0x04ab,
+       0x11fc: 0x04af, 0x11fd: 0x0493, 0x11fe: 0x0497, 0x11ff: 0x048b,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x048f, 0x1201: 0x049b, 0x1202: 0x049f, 0x1203: 0x04a3, 0x1204: 0x04a7,
+       0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x4269, 0x120a: 0x4269, 0x120b: 0x4269,
+       0x120c: 0x4269, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x0483,
+       0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003,
+       0x1218: 0x0443, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x04b7,
+       0x121e: 0x04bb, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b,
+       0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009,
+       0x122a: 0x000b, 0x122b: 0x0041,
+       0x1230: 0x42aa, 0x1231: 0x442c, 0x1232: 0x42af, 0x1234: 0x42b4,
+       0x1236: 0x42b9, 0x1237: 0x4432, 0x1238: 0x42be, 0x1239: 0x4438, 0x123a: 0x42c3, 0x123b: 0x443e,
+       0x123c: 0x42c8, 0x123d: 0x4444, 0x123e: 0x42cd, 0x123f: 0x444a,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x0236, 0x1241: 0x440e, 0x1242: 0x440e, 0x1243: 0x4414, 0x1244: 0x4414, 0x1245: 0x4456,
+       0x1246: 0x4456, 0x1247: 0x441a, 0x1248: 0x441a, 0x1249: 0x4462, 0x124a: 0x4462, 0x124b: 0x4462,
+       0x124c: 0x4462, 0x124d: 0x0239, 0x124e: 0x0239, 0x124f: 0x023c, 0x1250: 0x023c, 0x1251: 0x023c,
+       0x1252: 0x023c, 0x1253: 0x023f, 0x1254: 0x023f, 0x1255: 0x0242, 0x1256: 0x0242, 0x1257: 0x0242,
+       0x1258: 0x0242, 0x1259: 0x0245, 0x125a: 0x0245, 0x125b: 0x0245, 0x125c: 0x0245, 0x125d: 0x0248,
+       0x125e: 0x0248, 0x125f: 0x0248, 0x1260: 0x0248, 0x1261: 0x024b, 0x1262: 0x024b, 0x1263: 0x024b,
+       0x1264: 0x024b, 0x1265: 0x024e, 0x1266: 0x024e, 0x1267: 0x024e, 0x1268: 0x024e, 0x1269: 0x0251,
+       0x126a: 0x0251, 0x126b: 0x0254, 0x126c: 0x0254, 0x126d: 0x0257, 0x126e: 0x0257, 0x126f: 0x025a,
+       0x1270: 0x025a, 0x1271: 0x025d, 0x1272: 0x025d, 0x1273: 0x025d, 0x1274: 0x025d, 0x1275: 0x0260,
+       0x1276: 0x0260, 0x1277: 0x0260, 0x1278: 0x0260, 0x1279: 0x0263, 0x127a: 0x0263, 0x127b: 0x0263,
+       0x127c: 0x0263, 0x127d: 0x0266, 0x127e: 0x0266, 0x127f: 0x0266,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x0266, 0x1281: 0x0269, 0x1282: 0x0269, 0x1283: 0x0269, 0x1284: 0x0269, 0x1285: 0x026c,
+       0x1286: 0x026c, 0x1287: 0x026c, 0x1288: 0x026c, 0x1289: 0x026f, 0x128a: 0x026f, 0x128b: 0x026f,
+       0x128c: 0x026f, 0x128d: 0x0272, 0x128e: 0x0272, 0x128f: 0x0272, 0x1290: 0x0272, 0x1291: 0x0275,
+       0x1292: 0x0275, 0x1293: 0x0275, 0x1294: 0x0275, 0x1295: 0x0278, 0x1296: 0x0278, 0x1297: 0x0278,
+       0x1298: 0x0278, 0x1299: 0x027b, 0x129a: 0x027b, 0x129b: 0x027b, 0x129c: 0x027b, 0x129d: 0x027e,
+       0x129e: 0x027e, 0x129f: 0x027e, 0x12a0: 0x027e, 0x12a1: 0x0281, 0x12a2: 0x0281, 0x12a3: 0x0281,
+       0x12a4: 0x0281, 0x12a5: 0x0284, 0x12a6: 0x0284, 0x12a7: 0x0284, 0x12a8: 0x0284, 0x12a9: 0x0287,
+       0x12aa: 0x0287, 0x12ab: 0x0287, 0x12ac: 0x0287, 0x12ad: 0x028a, 0x12ae: 0x028a, 0x12af: 0x028d,
+       0x12b0: 0x028d, 0x12b1: 0x0290, 0x12b2: 0x0290, 0x12b3: 0x0290, 0x12b4: 0x0290, 0x12b5: 0x2e00,
+       0x12b6: 0x2e00, 0x12b7: 0x2e08, 0x12b8: 0x2e08, 0x12b9: 0x2e10, 0x12ba: 0x2e10, 0x12bb: 0x1f82,
+       0x12bc: 0x1f82,
+       // Block 0x4b, offset 0x12c0
+       0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b,
+       0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097,
+       0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3,
+       0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af,
+       0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb,
+       0x12de: 0x00bd, 0x12df: 0x0477, 0x12e0: 0x047b, 0x12e1: 0x0487, 0x12e2: 0x049b, 0x12e3: 0x049f,
+       0x12e4: 0x0483, 0x12e5: 0x05ab, 0x12e6: 0x05a3, 0x12e7: 0x04c7, 0x12e8: 0x04cf, 0x12e9: 0x04d7,
+       0x12ea: 0x04df, 0x12eb: 0x04e7, 0x12ec: 0x056b, 0x12ed: 0x0573, 0x12ee: 0x057b, 0x12ef: 0x051f,
+       0x12f0: 0x05af, 0x12f1: 0x04cb, 0x12f2: 0x04d3, 0x12f3: 0x04db, 0x12f4: 0x04e3, 0x12f5: 0x04eb,
+       0x12f6: 0x04ef, 0x12f7: 0x04f3, 0x12f8: 0x04f7, 0x12f9: 0x04fb, 0x12fa: 0x04ff, 0x12fb: 0x0503,
+       0x12fc: 0x0507, 0x12fd: 0x050b, 0x12fe: 0x050f, 0x12ff: 0x0513,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x0517, 0x1301: 0x051b, 0x1302: 0x0523, 0x1303: 0x0527, 0x1304: 0x052b, 0x1305: 0x052f,
+       0x1306: 0x0533, 0x1307: 0x0537, 0x1308: 0x053b, 0x1309: 0x053f, 0x130a: 0x0543, 0x130b: 0x0547,
+       0x130c: 0x054b, 0x130d: 0x054f, 0x130e: 0x0553, 0x130f: 0x0557, 0x1310: 0x055b, 0x1311: 0x055f,
+       0x1312: 0x0563, 0x1313: 0x0567, 0x1314: 0x056f, 0x1315: 0x0577, 0x1316: 0x057f, 0x1317: 0x0583,
+       0x1318: 0x0587, 0x1319: 0x058b, 0x131a: 0x058f, 0x131b: 0x0593, 0x131c: 0x0597, 0x131d: 0x05a7,
+       0x131e: 0x4a78, 0x131f: 0x4a7e, 0x1320: 0x03c3, 0x1321: 0x0313, 0x1322: 0x0317, 0x1323: 0x4a3b,
+       0x1324: 0x031b, 0x1325: 0x4a41, 0x1326: 0x4a47, 0x1327: 0x031f, 0x1328: 0x0323, 0x1329: 0x0327,
+       0x132a: 0x4a4d, 0x132b: 0x4a53, 0x132c: 0x4a59, 0x132d: 0x4a5f, 0x132e: 0x4a65, 0x132f: 0x4a6b,
+       0x1330: 0x0367, 0x1331: 0x032b, 0x1332: 0x032f, 0x1333: 0x0333, 0x1334: 0x037b, 0x1335: 0x0337,
+       0x1336: 0x033b, 0x1337: 0x033f, 0x1338: 0x0343, 0x1339: 0x0347, 0x133a: 0x034b, 0x133b: 0x034f,
+       0x133c: 0x0353, 0x133d: 0x0357, 0x133e: 0x035b,
+       // Block 0x4d, offset 0x1340
+       0x1342: 0x49bd, 0x1343: 0x49c3, 0x1344: 0x49c9, 0x1345: 0x49cf,
+       0x1346: 0x49d5, 0x1347: 0x49db, 0x134a: 0x49e1, 0x134b: 0x49e7,
+       0x134c: 0x49ed, 0x134d: 0x49f3, 0x134e: 0x49f9, 0x134f: 0x49ff,
+       0x1352: 0x4a05, 0x1353: 0x4a0b, 0x1354: 0x4a11, 0x1355: 0x4a17, 0x1356: 0x4a1d, 0x1357: 0x4a23,
+       0x135a: 0x4a29, 0x135b: 0x4a2f, 0x135c: 0x4a35,
+       0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x4264,
+       0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x0447, 0x1368: 0x046b, 0x1369: 0x044b,
+       0x136a: 0x044f, 0x136b: 0x0453, 0x136c: 0x0457, 0x136d: 0x046f, 0x136e: 0x0473,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x0063, 0x1381: 0x0065, 0x1382: 0x0067, 0x1383: 0x0069, 0x1384: 0x006b, 0x1385: 0x006d,
+       0x1386: 0x006f, 0x1387: 0x0071, 0x1388: 0x0073, 0x1389: 0x0075, 0x138a: 0x0083, 0x138b: 0x0085,
+       0x138c: 0x0087, 0x138d: 0x0089, 0x138e: 0x008b, 0x138f: 0x008d, 0x1390: 0x008f, 0x1391: 0x0091,
+       0x1392: 0x0093, 0x1393: 0x0095, 0x1394: 0x0097, 0x1395: 0x0099, 0x1396: 0x009b, 0x1397: 0x009d,
+       0x1398: 0x009f, 0x1399: 0x00a1, 0x139a: 0x00a3, 0x139b: 0x00a5, 0x139c: 0x00a7, 0x139d: 0x00a9,
+       0x139e: 0x00ab, 0x139f: 0x00ad, 0x13a0: 0x00af, 0x13a1: 0x00b1, 0x13a2: 0x00b3, 0x13a3: 0x00b5,
+       0x13a4: 0x00dd, 0x13a5: 0x00f2, 0x13a8: 0x0173, 0x13a9: 0x0176,
+       0x13aa: 0x0179, 0x13ab: 0x017c, 0x13ac: 0x017f, 0x13ad: 0x0182, 0x13ae: 0x0185, 0x13af: 0x0188,
+       0x13b0: 0x018b, 0x13b1: 0x018e, 0x13b2: 0x0191, 0x13b3: 0x0194, 0x13b4: 0x0197, 0x13b5: 0x019a,
+       0x13b6: 0x019d, 0x13b7: 0x01a0, 0x13b8: 0x01a3, 0x13b9: 0x0188, 0x13ba: 0x01a6, 0x13bb: 0x01a9,
+       0x13bc: 0x01ac, 0x13bd: 0x01af, 0x13be: 0x01b2, 0x13bf: 0x01b5,
+       // Block 0x4f, offset 0x13c0
+       0x13c0: 0x01fd, 0x13c1: 0x0200, 0x13c2: 0x0203, 0x13c3: 0x045b, 0x13c4: 0x01c7, 0x13c5: 0x01d0,
+       0x13c6: 0x01d6, 0x13c7: 0x01fa, 0x13c8: 0x01eb, 0x13c9: 0x01e8, 0x13ca: 0x0206, 0x13cb: 0x0209,
+       0x13ce: 0x0021, 0x13cf: 0x0023, 0x13d0: 0x0025, 0x13d1: 0x0027,
+       0x13d2: 0x0029, 0x13d3: 0x002b, 0x13d4: 0x002d, 0x13d5: 0x002f, 0x13d6: 0x0031, 0x13d7: 0x0033,
+       0x13d8: 0x0021, 0x13d9: 0x0023, 0x13da: 0x0025, 0x13db: 0x0027, 0x13dc: 0x0029, 0x13dd: 0x002b,
+       0x13de: 0x002d, 0x13df: 0x002f, 0x13e0: 0x0031, 0x13e1: 0x0033, 0x13e2: 0x0021, 0x13e3: 0x0023,
+       0x13e4: 0x0025, 0x13e5: 0x0027, 0x13e6: 0x0029, 0x13e7: 0x002b, 0x13e8: 0x002d, 0x13e9: 0x002f,
+       0x13ea: 0x0031, 0x13eb: 0x0033, 0x13ec: 0x0021, 0x13ed: 0x0023, 0x13ee: 0x0025, 0x13ef: 0x0027,
+       0x13f0: 0x0029, 0x13f1: 0x002b, 0x13f2: 0x002d, 0x13f3: 0x002f, 0x13f4: 0x0031, 0x13f5: 0x0033,
+       0x13f6: 0x0021, 0x13f7: 0x0023, 0x13f8: 0x0025, 0x13f9: 0x0027, 0x13fa: 0x0029, 0x13fb: 0x002b,
+       0x13fc: 0x002d, 0x13fd: 0x002f, 0x13fe: 0x0031, 0x13ff: 0x0033,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1405: 0x028a,
+       0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140a: 0x027b, 0x140b: 0x027e,
+       0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263,
+       0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e,
+       0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, 0x141c: 0x0293, 0x141d: 0x02e4,
+       0x141e: 0x02cc, 0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248,
+       0x1424: 0x0287, 0x1427: 0x024b, 0x1429: 0x0290,
+       0x142a: 0x027b, 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,
+       0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242,
+       0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143b: 0x0272,
+       // Block 0x51, offset 0x1440
+       0x1442: 0x0248,
+       0x1447: 0x024b, 0x1449: 0x0290, 0x144b: 0x027e,
+       0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1451: 0x0263,
+       0x1452: 0x0278, 0x1454: 0x0260, 0x1457: 0x024e,
+       0x1459: 0x0266, 0x145b: 0x0272, 0x145d: 0x02e4,
+       0x145f: 0x0296, 0x1461: 0x023c, 0x1462: 0x0248,
+       0x1464: 0x0287, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290,
+       0x146a: 0x027b, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f,
+       0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1474: 0x0260, 0x1475: 0x0242,
+       0x1476: 0x0245, 0x1477: 0x024e, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272,
+       0x147c: 0x0293, 0x147e: 0x02cc,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x0239, 0x1481: 0x023c, 0x1482: 0x0248, 0x1483: 0x0251, 0x1484: 0x0287, 0x1485: 0x028a,
+       0x1486: 0x025a, 0x1487: 0x024b, 0x1488: 0x0269, 0x1489: 0x0290, 0x148b: 0x027e,
+       0x148c: 0x0281, 0x148d: 0x0284, 0x148e: 0x025d, 0x148f: 0x026f, 0x1490: 0x0275, 0x1491: 0x0263,
+       0x1492: 0x0278, 0x1493: 0x0257, 0x1494: 0x0260, 0x1495: 0x0242, 0x1496: 0x0245, 0x1497: 0x024e,
+       0x1498: 0x0254, 0x1499: 0x0266, 0x149a: 0x026c, 0x149b: 0x0272,
+       0x14a1: 0x023c, 0x14a2: 0x0248, 0x14a3: 0x0251,
+       0x14a5: 0x028a, 0x14a6: 0x025a, 0x14a7: 0x024b, 0x14a8: 0x0269, 0x14a9: 0x0290,
+       0x14ab: 0x027e, 0x14ac: 0x0281, 0x14ad: 0x0284, 0x14ae: 0x025d, 0x14af: 0x026f,
+       0x14b0: 0x0275, 0x14b1: 0x0263, 0x14b2: 0x0278, 0x14b3: 0x0257, 0x14b4: 0x0260, 0x14b5: 0x0242,
+       0x14b6: 0x0245, 0x14b7: 0x024e, 0x14b8: 0x0254, 0x14b9: 0x0266, 0x14ba: 0x026c, 0x14bb: 0x0272,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x1879, 0x14c1: 0x1876, 0x14c2: 0x187c, 0x14c3: 0x18a0, 0x14c4: 0x18c4, 0x14c5: 0x18e8,
+       0x14c6: 0x190c, 0x14c7: 0x1915, 0x14c8: 0x191b, 0x14c9: 0x1921, 0x14ca: 0x1927,
+       0x14d0: 0x1a8c, 0x14d1: 0x1a90,
+       0x14d2: 0x1a94, 0x14d3: 0x1a98, 0x14d4: 0x1a9c, 0x14d5: 0x1aa0, 0x14d6: 0x1aa4, 0x14d7: 0x1aa8,
+       0x14d8: 0x1aac, 0x14d9: 0x1ab0, 0x14da: 0x1ab4, 0x14db: 0x1ab8, 0x14dc: 0x1abc, 0x14dd: 0x1ac0,
+       0x14de: 0x1ac4, 0x14df: 0x1ac8, 0x14e0: 0x1acc, 0x14e1: 0x1ad0, 0x14e2: 0x1ad4, 0x14e3: 0x1ad8,
+       0x14e4: 0x1adc, 0x14e5: 0x1ae0, 0x14e6: 0x1ae4, 0x14e7: 0x1ae8, 0x14e8: 0x1aec, 0x14e9: 0x1af0,
+       0x14ea: 0x271e, 0x14eb: 0x0047, 0x14ec: 0x0065, 0x14ed: 0x193c, 0x14ee: 0x19b1,
+       0x14f0: 0x0043, 0x14f1: 0x0045, 0x14f2: 0x0047, 0x14f3: 0x0049, 0x14f4: 0x004b, 0x14f5: 0x004d,
+       0x14f6: 0x004f, 0x14f7: 0x0051, 0x14f8: 0x0053, 0x14f9: 0x0055, 0x14fa: 0x0057, 0x14fb: 0x0059,
+       0x14fc: 0x005b, 0x14fd: 0x005d, 0x14fe: 0x005f, 0x14ff: 0x0061,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x26ad, 0x1501: 0x26c2, 0x1502: 0x0503,
+       0x1510: 0x0c0f, 0x1511: 0x0a47,
+       0x1512: 0x08d3, 0x1513: 0x45c4, 0x1514: 0x071b, 0x1515: 0x09ef, 0x1516: 0x132f, 0x1517: 0x09ff,
+       0x1518: 0x0727, 0x1519: 0x0cd7, 0x151a: 0x0eaf, 0x151b: 0x0caf, 0x151c: 0x0827, 0x151d: 0x0b6b,
+       0x151e: 0x07bf, 0x151f: 0x0cb7, 0x1520: 0x0813, 0x1521: 0x1117, 0x1522: 0x0f83, 0x1523: 0x138b,
+       0x1524: 0x09d3, 0x1525: 0x090b, 0x1526: 0x0e63, 0x1527: 0x0c1b, 0x1528: 0x0c47, 0x1529: 0x06bf,
+       0x152a: 0x06cb, 0x152b: 0x140b, 0x152c: 0x0adb, 0x152d: 0x06e7, 0x152e: 0x08ef, 0x152f: 0x0c3b,
+       0x1530: 0x13b3, 0x1531: 0x0c13, 0x1532: 0x106f, 0x1533: 0x10ab, 0x1534: 0x08f7, 0x1535: 0x0e43,
+       0x1536: 0x0d0b, 0x1537: 0x0d07, 0x1538: 0x0f97, 0x1539: 0x082b, 0x153a: 0x0957, 0x153b: 0x1443,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x06fb, 0x1541: 0x06f3, 0x1542: 0x0703, 0x1543: 0x1647, 0x1544: 0x0747, 0x1545: 0x0757,
+       0x1546: 0x075b, 0x1547: 0x0763, 0x1548: 0x076b, 0x1549: 0x076f, 0x154a: 0x077b, 0x154b: 0x0773,
+       0x154c: 0x05b3, 0x154d: 0x165b, 0x154e: 0x078f, 0x154f: 0x0793, 0x1550: 0x0797, 0x1551: 0x07b3,
+       0x1552: 0x164c, 0x1553: 0x05b7, 0x1554: 0x079f, 0x1555: 0x07bf, 0x1556: 0x1656, 0x1557: 0x07cf,
+       0x1558: 0x07d7, 0x1559: 0x0737, 0x155a: 0x07df, 0x155b: 0x07e3, 0x155c: 0x1831, 0x155d: 0x07ff,
+       0x155e: 0x0807, 0x155f: 0x05bf, 0x1560: 0x081f, 0x1561: 0x0823, 0x1562: 0x082b, 0x1563: 0x082f,
+       0x1564: 0x05c3, 0x1565: 0x0847, 0x1566: 0x084b, 0x1567: 0x0857, 0x1568: 0x0863, 0x1569: 0x0867,
+       0x156a: 0x086b, 0x156b: 0x0873, 0x156c: 0x0893, 0x156d: 0x0897, 0x156e: 0x089f, 0x156f: 0x08af,
+       0x1570: 0x08b7, 0x1571: 0x08bb, 0x1572: 0x08bb, 0x1573: 0x08bb, 0x1574: 0x166a, 0x1575: 0x0e93,
+       0x1576: 0x08cf, 0x1577: 0x08d7, 0x1578: 0x166f, 0x1579: 0x08e3, 0x157a: 0x08eb, 0x157b: 0x08f3,
+       0x157c: 0x091b, 0x157d: 0x0907, 0x157e: 0x0913, 0x157f: 0x0917,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x091f, 0x1581: 0x0927, 0x1582: 0x092b, 0x1583: 0x0933, 0x1584: 0x093b, 0x1585: 0x093f,
+       0x1586: 0x093f, 0x1587: 0x0947, 0x1588: 0x094f, 0x1589: 0x0953, 0x158a: 0x095f, 0x158b: 0x0983,
+       0x158c: 0x0967, 0x158d: 0x0987, 0x158e: 0x096b, 0x158f: 0x0973, 0x1590: 0x080b, 0x1591: 0x09cf,
+       0x1592: 0x0997, 0x1593: 0x099b, 0x1594: 0x099f, 0x1595: 0x0993, 0x1596: 0x09a7, 0x1597: 0x09a3,
+       0x1598: 0x09bb, 0x1599: 0x1674, 0x159a: 0x09d7, 0x159b: 0x09db, 0x159c: 0x09e3, 0x159d: 0x09ef,
+       0x159e: 0x09f7, 0x159f: 0x0a13, 0x15a0: 0x1679, 0x15a1: 0x167e, 0x15a2: 0x0a1f, 0x15a3: 0x0a23,
+       0x15a4: 0x0a27, 0x15a5: 0x0a1b, 0x15a6: 0x0a2f, 0x15a7: 0x05c7, 0x15a8: 0x05cb, 0x15a9: 0x0a37,
+       0x15aa: 0x0a3f, 0x15ab: 0x0a3f, 0x15ac: 0x1683, 0x15ad: 0x0a5b, 0x15ae: 0x0a5f, 0x15af: 0x0a63,
+       0x15b0: 0x0a6b, 0x15b1: 0x1688, 0x15b2: 0x0a73, 0x15b3: 0x0a77, 0x15b4: 0x0b4f, 0x15b5: 0x0a7f,
+       0x15b6: 0x05cf, 0x15b7: 0x0a8b, 0x15b8: 0x0a9b, 0x15b9: 0x0aa7, 0x15ba: 0x0aa3, 0x15bb: 0x1692,
+       0x15bc: 0x0aaf, 0x15bd: 0x1697, 0x15be: 0x0abb, 0x15bf: 0x0ab7,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x0abf, 0x15c1: 0x0acf, 0x15c2: 0x0ad3, 0x15c3: 0x05d3, 0x15c4: 0x0ae3, 0x15c5: 0x0aeb,
+       0x15c6: 0x0aef, 0x15c7: 0x0af3, 0x15c8: 0x05d7, 0x15c9: 0x169c, 0x15ca: 0x05db, 0x15cb: 0x0b0f,
+       0x15cc: 0x0b13, 0x15cd: 0x0b17, 0x15ce: 0x0b1f, 0x15cf: 0x1863, 0x15d0: 0x0b37, 0x15d1: 0x16a6,
+       0x15d2: 0x16a6, 0x15d3: 0x11d7, 0x15d4: 0x0b47, 0x15d5: 0x0b47, 0x15d6: 0x05df, 0x15d7: 0x16c9,
+       0x15d8: 0x179b, 0x15d9: 0x0b57, 0x15da: 0x0b5f, 0x15db: 0x05e3, 0x15dc: 0x0b73, 0x15dd: 0x0b83,
+       0x15de: 0x0b87, 0x15df: 0x0b8f, 0x15e0: 0x0b9f, 0x15e1: 0x05eb, 0x15e2: 0x05e7, 0x15e3: 0x0ba3,
+       0x15e4: 0x16ab, 0x15e5: 0x0ba7, 0x15e6: 0x0bbb, 0x15e7: 0x0bbf, 0x15e8: 0x0bc3, 0x15e9: 0x0bbf,
+       0x15ea: 0x0bcf, 0x15eb: 0x0bd3, 0x15ec: 0x0be3, 0x15ed: 0x0bdb, 0x15ee: 0x0bdf, 0x15ef: 0x0be7,
+       0x15f0: 0x0beb, 0x15f1: 0x0bef, 0x15f2: 0x0bfb, 0x15f3: 0x0bff, 0x15f4: 0x0c17, 0x15f5: 0x0c1f,
+       0x15f6: 0x0c2f, 0x15f7: 0x0c43, 0x15f8: 0x16ba, 0x15f9: 0x0c3f, 0x15fa: 0x0c33, 0x15fb: 0x0c4b,
+       0x15fc: 0x0c53, 0x15fd: 0x0c67, 0x15fe: 0x16bf, 0x15ff: 0x0c6f,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x0c63, 0x1601: 0x0c5b, 0x1602: 0x05ef, 0x1603: 0x0c77, 0x1604: 0x0c7f, 0x1605: 0x0c87,
+       0x1606: 0x0c7b, 0x1607: 0x05f3, 0x1608: 0x0c97, 0x1609: 0x0c9f, 0x160a: 0x16c4, 0x160b: 0x0ccb,
+       0x160c: 0x0cff, 0x160d: 0x0cdb, 0x160e: 0x05ff, 0x160f: 0x0ce7, 0x1610: 0x05fb, 0x1611: 0x05f7,
+       0x1612: 0x07c3, 0x1613: 0x07c7, 0x1614: 0x0d03, 0x1615: 0x0ceb, 0x1616: 0x11ab, 0x1617: 0x0663,
+       0x1618: 0x0d0f, 0x1619: 0x0d13, 0x161a: 0x0d17, 0x161b: 0x0d2b, 0x161c: 0x0d23, 0x161d: 0x16dd,
+       0x161e: 0x0603, 0x161f: 0x0d3f, 0x1620: 0x0d33, 0x1621: 0x0d4f, 0x1622: 0x0d57, 0x1623: 0x16e7,
+       0x1624: 0x0d5b, 0x1625: 0x0d47, 0x1626: 0x0d63, 0x1627: 0x0607, 0x1628: 0x0d67, 0x1629: 0x0d6b,
+       0x162a: 0x0d6f, 0x162b: 0x0d7b, 0x162c: 0x16ec, 0x162d: 0x0d83, 0x162e: 0x060b, 0x162f: 0x0d8f,
+       0x1630: 0x16f1, 0x1631: 0x0d93, 0x1632: 0x060f, 0x1633: 0x0d9f, 0x1634: 0x0dab, 0x1635: 0x0db7,
+       0x1636: 0x0dbb, 0x1637: 0x16f6, 0x1638: 0x168d, 0x1639: 0x16fb, 0x163a: 0x0ddb, 0x163b: 0x1700,
+       0x163c: 0x0de7, 0x163d: 0x0def, 0x163e: 0x0ddf, 0x163f: 0x0dfb,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x0e0b, 0x1641: 0x0e1b, 0x1642: 0x0e0f, 0x1643: 0x0e13, 0x1644: 0x0e1f, 0x1645: 0x0e23,
+       0x1646: 0x1705, 0x1647: 0x0e07, 0x1648: 0x0e3b, 0x1649: 0x0e3f, 0x164a: 0x0613, 0x164b: 0x0e53,
+       0x164c: 0x0e4f, 0x164d: 0x170a, 0x164e: 0x0e33, 0x164f: 0x0e6f, 0x1650: 0x170f, 0x1651: 0x1714,
+       0x1652: 0x0e73, 0x1653: 0x0e87, 0x1654: 0x0e83, 0x1655: 0x0e7f, 0x1656: 0x0617, 0x1657: 0x0e8b,
+       0x1658: 0x0e9b, 0x1659: 0x0e97, 0x165a: 0x0ea3, 0x165b: 0x1651, 0x165c: 0x0eb3, 0x165d: 0x1719,
+       0x165e: 0x0ebf, 0x165f: 0x1723, 0x1660: 0x0ed3, 0x1661: 0x0edf, 0x1662: 0x0ef3, 0x1663: 0x1728,
+       0x1664: 0x0f07, 0x1665: 0x0f0b, 0x1666: 0x172d, 0x1667: 0x1732, 0x1668: 0x0f27, 0x1669: 0x0f37,
+       0x166a: 0x061b, 0x166b: 0x0f3b, 0x166c: 0x061f, 0x166d: 0x061f, 0x166e: 0x0f53, 0x166f: 0x0f57,
+       0x1670: 0x0f5f, 0x1671: 0x0f63, 0x1672: 0x0f6f, 0x1673: 0x0623, 0x1674: 0x0f87, 0x1675: 0x1737,
+       0x1676: 0x0fa3, 0x1677: 0x173c, 0x1678: 0x0faf, 0x1679: 0x16a1, 0x167a: 0x0fbf, 0x167b: 0x1741,
+       0x167c: 0x1746, 0x167d: 0x174b, 0x167e: 0x0627, 0x167f: 0x062b,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x0ff7, 0x1681: 0x1755, 0x1682: 0x1750, 0x1683: 0x175a, 0x1684: 0x175f, 0x1685: 0x0fff,
+       0x1686: 0x1003, 0x1687: 0x1003, 0x1688: 0x100b, 0x1689: 0x0633, 0x168a: 0x100f, 0x168b: 0x0637,
+       0x168c: 0x063b, 0x168d: 0x1769, 0x168e: 0x1023, 0x168f: 0x102b, 0x1690: 0x1037, 0x1691: 0x063f,
+       0x1692: 0x176e, 0x1693: 0x105b, 0x1694: 0x1773, 0x1695: 0x1778, 0x1696: 0x107b, 0x1697: 0x1093,
+       0x1698: 0x0643, 0x1699: 0x109b, 0x169a: 0x109f, 0x169b: 0x10a3, 0x169c: 0x177d, 0x169d: 0x1782,
+       0x169e: 0x1782, 0x169f: 0x10bb, 0x16a0: 0x0647, 0x16a1: 0x1787, 0x16a2: 0x10cf, 0x16a3: 0x10d3,
+       0x16a4: 0x064b, 0x16a5: 0x178c, 0x16a6: 0x10ef, 0x16a7: 0x064f, 0x16a8: 0x10ff, 0x16a9: 0x10f7,
+       0x16aa: 0x1107, 0x16ab: 0x1796, 0x16ac: 0x111f, 0x16ad: 0x0653, 0x16ae: 0x112b, 0x16af: 0x1133,
+       0x16b0: 0x1143, 0x16b1: 0x0657, 0x16b2: 0x17a0, 0x16b3: 0x17a5, 0x16b4: 0x065b, 0x16b5: 0x17aa,
+       0x16b6: 0x115b, 0x16b7: 0x17af, 0x16b8: 0x1167, 0x16b9: 0x1173, 0x16ba: 0x117b, 0x16bb: 0x17b4,
+       0x16bc: 0x17b9, 0x16bd: 0x118f, 0x16be: 0x17be, 0x16bf: 0x1197,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x16ce, 0x16c1: 0x065f, 0x16c2: 0x11af, 0x16c3: 0x11b3, 0x16c4: 0x0667, 0x16c5: 0x11b7,
+       0x16c6: 0x0a33, 0x16c7: 0x17c3, 0x16c8: 0x17c8, 0x16c9: 0x16d3, 0x16ca: 0x16d8, 0x16cb: 0x11d7,
+       0x16cc: 0x11db, 0x16cd: 0x13f3, 0x16ce: 0x066b, 0x16cf: 0x1207, 0x16d0: 0x1203, 0x16d1: 0x120b,
+       0x16d2: 0x083f, 0x16d3: 0x120f, 0x16d4: 0x1213, 0x16d5: 0x1217, 0x16d6: 0x121f, 0x16d7: 0x17cd,
+       0x16d8: 0x121b, 0x16d9: 0x1223, 0x16da: 0x1237, 0x16db: 0x123b, 0x16dc: 0x1227, 0x16dd: 0x123f,
+       0x16de: 0x1253, 0x16df: 0x1267, 0x16e0: 0x1233, 0x16e1: 0x1247, 0x16e2: 0x124b, 0x16e3: 0x124f,
+       0x16e4: 0x17d2, 0x16e5: 0x17dc, 0x16e6: 0x17d7, 0x16e7: 0x066f, 0x16e8: 0x126f, 0x16e9: 0x1273,
+       0x16ea: 0x127b, 0x16eb: 0x17f0, 0x16ec: 0x127f, 0x16ed: 0x17e1, 0x16ee: 0x0673, 0x16ef: 0x0677,
+       0x16f0: 0x17e6, 0x16f1: 0x17eb, 0x16f2: 0x067b, 0x16f3: 0x129f, 0x16f4: 0x12a3, 0x16f5: 0x12a7,
+       0x16f6: 0x12ab, 0x16f7: 0x12b7, 0x16f8: 0x12b3, 0x16f9: 0x12bf, 0x16fa: 0x12bb, 0x16fb: 0x12cb,
+       0x16fc: 0x12c3, 0x16fd: 0x12c7, 0x16fe: 0x12cf, 0x16ff: 0x067f,
+       // Block 0x5c, offset 0x1700
+       0x1700: 0x12d7, 0x1701: 0x12db, 0x1702: 0x0683, 0x1703: 0x12eb, 0x1704: 0x12ef, 0x1705: 0x17f5,
+       0x1706: 0x12fb, 0x1707: 0x12ff, 0x1708: 0x0687, 0x1709: 0x130b, 0x170a: 0x05bb, 0x170b: 0x17fa,
+       0x170c: 0x17ff, 0x170d: 0x068b, 0x170e: 0x068f, 0x170f: 0x1337, 0x1710: 0x134f, 0x1711: 0x136b,
+       0x1712: 0x137b, 0x1713: 0x1804, 0x1714: 0x138f, 0x1715: 0x1393, 0x1716: 0x13ab, 0x1717: 0x13b7,
+       0x1718: 0x180e, 0x1719: 0x1660, 0x171a: 0x13c3, 0x171b: 0x13bf, 0x171c: 0x13cb, 0x171d: 0x1665,
+       0x171e: 0x13d7, 0x171f: 0x13e3, 0x1720: 0x1813, 0x1721: 0x1818, 0x1722: 0x1423, 0x1723: 0x142f,
+       0x1724: 0x1437, 0x1725: 0x181d, 0x1726: 0x143b, 0x1727: 0x1467, 0x1728: 0x1473, 0x1729: 0x1477,
+       0x172a: 0x146f, 0x172b: 0x1483, 0x172c: 0x1487, 0x172d: 0x1822, 0x172e: 0x1493, 0x172f: 0x0693,
+       0x1730: 0x149b, 0x1731: 0x1827, 0x1732: 0x0697, 0x1733: 0x14d3, 0x1734: 0x0ac3, 0x1735: 0x14eb,
+       0x1736: 0x182c, 0x1737: 0x1836, 0x1738: 0x069b, 0x1739: 0x069f, 0x173a: 0x1513, 0x173b: 0x183b,
+       0x173c: 0x06a3, 0x173d: 0x1840, 0x173e: 0x152b, 0x173f: 0x152b,
+       // Block 0x5d, offset 0x1740
+       0x1740: 0x1533, 0x1741: 0x1845, 0x1742: 0x154b, 0x1743: 0x06a7, 0x1744: 0x155b, 0x1745: 0x1567,
+       0x1746: 0x156f, 0x1747: 0x1577, 0x1748: 0x06ab, 0x1749: 0x184a, 0x174a: 0x158b, 0x174b: 0x15a7,
+       0x174c: 0x15b3, 0x174d: 0x06af, 0x174e: 0x06b3, 0x174f: 0x15b7, 0x1750: 0x184f, 0x1751: 0x06b7,
+       0x1752: 0x1854, 0x1753: 0x1859, 0x1754: 0x185e, 0x1755: 0x15db, 0x1756: 0x06bb, 0x1757: 0x15ef,
+       0x1758: 0x15f7, 0x1759: 0x15fb, 0x175a: 0x1603, 0x175b: 0x160b, 0x175c: 0x1613, 0x175d: 0x1868,
+}
+
+// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfkcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x5c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5d, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x5e, 0xcb: 0x5f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
+       0xd0: 0x0a, 0xd1: 0x60, 0xd2: 0x61, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x62,
+       0xd8: 0x63, 0xd9: 0x0d, 0xdb: 0x64, 0xdc: 0x65, 0xdd: 0x66, 0xdf: 0x67,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x68, 0x121: 0x69, 0x123: 0x0e, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d,
+       0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74,
+       0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a,
+       0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82,
+       // Block 0x5, offset 0x140
+       0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89,
+       0x14d: 0x8a,
+       0x15c: 0x8b, 0x15f: 0x8c,
+       0x162: 0x8d, 0x164: 0x8e,
+       0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0f, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94,
+       0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12,
+       0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a,
+       // Block 0x6, offset 0x180
+       0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0x9c, 0x187: 0x9d,
+       0x188: 0x9e, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0x9f, 0x18c: 0xa0,
+       0x191: 0x1f, 0x192: 0x20, 0x193: 0xa1,
+       0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,
+       0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,
+       0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xab,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0xac, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xad, 0x1c5: 0x27, 0x1c6: 0x28,
+       0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30,
+       // Block 0x8, offset 0x200
+       0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,
+       0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,
+       0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,
+       0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,
+       0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,
+       // Block 0x9, offset 0x240
+       0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,
+       0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,
+       0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,
+       0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,
+       0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,
+       0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,
+       0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,
+       0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,
+       // Block 0xa, offset 0x280
+       0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,
+       0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,
+       0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,
+       0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,
+       0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,
+       0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,
+       0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,
+       0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,
+       0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,
+       0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,
+       0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,
+       // Block 0xc, offset 0x300
+       0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34,
+       0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c,
+       0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44,
+       0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xc5, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b,
+       // Block 0xd, offset 0x340
+       0x347: 0xc6,
+       0x34b: 0xc7, 0x34d: 0xc8,
+       0x368: 0xc9, 0x36b: 0xca,
+       0x374: 0xcb,
+       0x37d: 0xcc,
+       // Block 0xe, offset 0x380
+       0x381: 0xcd, 0x382: 0xce, 0x384: 0xcf, 0x385: 0xb7, 0x387: 0xd0,
+       0x388: 0xd1, 0x38b: 0xd2, 0x38c: 0xd3, 0x38d: 0xd4,
+       0x391: 0xd5, 0x392: 0xd6, 0x393: 0xd7, 0x396: 0xd8, 0x397: 0xd9,
+       0x398: 0xda, 0x39a: 0xdb, 0x39c: 0xdc,
+       0x3a0: 0xdd,
+       0x3a8: 0xde, 0x3a9: 0xdf, 0x3aa: 0xe0,
+       0x3b0: 0xda, 0x3b5: 0xe1, 0x3b6: 0xe2,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xe3, 0x3ec: 0xe4,
+       // Block 0x10, offset 0x400
+       0x432: 0xe5,
+       // Block 0x11, offset 0x440
+       0x445: 0xe6, 0x446: 0xe7, 0x447: 0xe8,
+       0x449: 0xe9,
+       0x450: 0xea, 0x451: 0xeb, 0x452: 0xec, 0x453: 0xed, 0x454: 0xee, 0x455: 0xef, 0x456: 0xf0, 0x457: 0xf1,
+       0x458: 0xf2, 0x459: 0xf3, 0x45a: 0x4c, 0x45b: 0xf4, 0x45c: 0xf5, 0x45d: 0xf6, 0x45e: 0xf7, 0x45f: 0x4d,
+       // Block 0x12, offset 0x480
+       0x480: 0xf8,
+       0x4a3: 0xf9, 0x4a5: 0xfa,
+       0x4b8: 0x4e, 0x4b9: 0x4f, 0x4ba: 0x50,
+       // Block 0x13, offset 0x4c0
+       0x4c4: 0x51, 0x4c5: 0xfb, 0x4c6: 0xfc,
+       0x4c8: 0x52, 0x4c9: 0xfd,
+       // Block 0x14, offset 0x500
+       0x520: 0x53, 0x521: 0x54, 0x522: 0x55, 0x523: 0x56, 0x524: 0x57, 0x525: 0x58, 0x526: 0x59, 0x527: 0x5a,
+       0x528: 0x5b,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfkcSparseOffset: 162 entries, 324 bytes
+var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x70, 0x75, 0x77, 0x7f, 0x86, 0x89, 0x91, 0x95, 0x99, 0x9b, 0x9d, 0xa6, 0xaa, 0xb1, 0xb6, 0xb9, 0xc3, 0xc6, 0xcd, 0xd5, 0xd9, 0xdb, 0xde, 0xe2, 0xe8, 0xf9, 0x105, 0x107, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11e, 0x121, 0x123, 0x126, 0x129, 0x12d, 0x132, 0x13b, 0x13d, 0x140, 0x142, 0x14d, 0x158, 0x166, 0x174, 0x184, 0x192, 0x199, 0x19f, 0x1ae, 0x1b2, 0x1b4, 0x1b8, 0x1ba, 0x1bd, 0x1bf, 0x1c2, 0x1c4, 0x1c7, 0x1c9, 0x1cb, 0x1cd, 0x1d9, 0x1e3, 0x1ed, 0x1f0, 0x1f4, 0x1f6, 0x1f8, 0x1fa, 0x1fc, 0x1ff, 0x201, 0x203, 0x205, 0x207, 0x20d, 0x210, 0x214, 0x216, 0x21d, 0x223, 0x229, 0x231, 0x237, 0x23d, 0x243, 0x247, 0x249, 0x24b, 0x24d, 0x24f, 0x255, 0x258, 0x25a, 0x260, 0x263, 0x26b, 0x272, 0x275, 0x278, 0x27a, 0x27d, 0x285, 0x289, 0x290, 0x293, 0x299, 0x29b, 0x29d, 0x2a0, 0x2a2, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2b6, 0x2c3, 0x2cd, 0x2cf, 0x2d1, 0x2d5, 0x2da, 0x2e6, 0x2eb, 0x2f4, 0x2fa, 0x2ff, 0x303, 0x308, 0x30c, 0x31c, 0x32a, 0x338, 0x346, 0x34c, 0x34e, 0x351, 0x35b, 0x35d}
+
+// nfkcSparseValues: 871 entries, 3484 bytes
+var nfkcSparseValues = [871]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x0001, lo: 0xa0, hi: 0xa0},
+       {value: 0x4278, lo: 0xa8, hi: 0xa8},
+       {value: 0x0083, lo: 0xaa, hi: 0xaa},
+       {value: 0x4264, lo: 0xaf, hi: 0xaf},
+       {value: 0x0025, lo: 0xb2, hi: 0xb3},
+       {value: 0x425a, lo: 0xb4, hi: 0xb4},
+       {value: 0x01dc, lo: 0xb5, hi: 0xb5},
+       {value: 0x4291, lo: 0xb8, hi: 0xb8},
+       {value: 0x0023, lo: 0xb9, hi: 0xb9},
+       {value: 0x009f, lo: 0xba, hi: 0xba},
+       {value: 0x221c, lo: 0xbc, hi: 0xbc},
+       {value: 0x2210, lo: 0xbd, hi: 0xbd},
+       {value: 0x22b2, lo: 0xbe, hi: 0xbe},
+       // Block 0x1, offset 0xe
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x12
+       {value: 0x0003, lo: 0x08},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x0091, lo: 0xb0, hi: 0xb0},
+       {value: 0x0119, lo: 0xb1, hi: 0xb1},
+       {value: 0x0095, lo: 0xb2, hi: 0xb2},
+       {value: 0x00a5, lo: 0xb3, hi: 0xb3},
+       {value: 0x0143, lo: 0xb4, hi: 0xb6},
+       {value: 0x00af, lo: 0xb7, hi: 0xb7},
+       {value: 0x00b3, lo: 0xb8, hi: 0xb8},
+       // Block 0x3, offset 0x1b
+       {value: 0x000a, lo: 0x09},
+       {value: 0x426e, lo: 0x98, hi: 0x98},
+       {value: 0x4273, lo: 0x99, hi: 0x9a},
+       {value: 0x4296, lo: 0x9b, hi: 0x9b},
+       {value: 0x425f, lo: 0x9c, hi: 0x9c},
+       {value: 0x4282, lo: 0x9d, hi: 0x9d},
+       {value: 0x0113, lo: 0xa0, hi: 0xa0},
+       {value: 0x0099, lo: 0xa1, hi: 0xa1},
+       {value: 0x00a7, lo: 0xa2, hi: 0xa3},
+       {value: 0x0167, lo: 0xa4, hi: 0xa4},
+       // Block 0x4, offset 0x25
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x5, offset 0x35
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x6, offset 0x37
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x7, offset 0x3c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x8, offset 0x47
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0x9, offset 0x56
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xa, offset 0x63
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xb, offset 0x6b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0xc, offset 0x70
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xd, offset 0x75
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xe, offset 0x77
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0xf, offset 0x7f
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x10, offset 0x86
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x11, offset 0x89
+       {value: 0x0008, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       {value: 0x8132, lo: 0xbe, hi: 0xbe},
+       // Block 0x12, offset 0x91
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x13, offset 0x95
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x14, offset 0x99
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x15, offset 0x9b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x16, offset 0x9d
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x17, offset 0xa6
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x18, offset 0xaa
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x19, offset 0xb1
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1a, offset 0xb6
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1b, offset 0xb9
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1c, offset 0xc3
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1d, offset 0xc6
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1e, offset 0xcd
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x1f, offset 0xd5
+       {value: 0x0000, lo: 0x03},
+       {value: 0x2621, lo: 0xb3, hi: 0xb3},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x20, offset 0xd9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x21, offset 0xdb
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2636, lo: 0xb3, hi: 0xb3},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x22, offset 0xde
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       {value: 0x2628, lo: 0x9c, hi: 0x9c},
+       {value: 0x262f, lo: 0x9d, hi: 0x9d},
+       // Block 0x23, offset 0xe2
+       {value: 0x0000, lo: 0x05},
+       {value: 0x030b, lo: 0x8c, hi: 0x8c},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x24, offset 0xe8
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x45f4, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x45ff, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x25, offset 0xf9
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x26, offset 0x105
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x27, offset 0x107
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x28, offset 0x10d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x29, offset 0x10f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x030f, lo: 0xbc, hi: 0xbc},
+       // Block 0x2a, offset 0x111
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2b, offset 0x113
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2c, offset 0x115
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2d, offset 0x117
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2e, offset 0x119
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x2f, offset 0x11b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x30, offset 0x11e
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x31, offset 0x121
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x32, offset 0x123
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x33, offset 0x126
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x34, offset 0x129
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x35, offset 0x12d
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x36, offset 0x132
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x37, offset 0x13b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x38, offset 0x13d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x39, offset 0x140
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3a, offset 0x142
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3b, offset 0x14d
+       {value: 0x0002, lo: 0x0a},
+       {value: 0x0043, lo: 0xac, hi: 0xac},
+       {value: 0x00d1, lo: 0xad, hi: 0xad},
+       {value: 0x0045, lo: 0xae, hi: 0xae},
+       {value: 0x0049, lo: 0xb0, hi: 0xb1},
+       {value: 0x00e6, lo: 0xb2, hi: 0xb2},
+       {value: 0x004f, lo: 0xb3, hi: 0xba},
+       {value: 0x005f, lo: 0xbc, hi: 0xbc},
+       {value: 0x00ef, lo: 0xbd, hi: 0xbd},
+       {value: 0x0061, lo: 0xbe, hi: 0xbe},
+       {value: 0x0065, lo: 0xbf, hi: 0xbf},
+       // Block 0x3c, offset 0x158
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0001, lo: 0x80, hi: 0x8a},
+       {value: 0x043b, lo: 0x91, hi: 0x91},
+       {value: 0x429b, lo: 0x97, hi: 0x97},
+       {value: 0x001d, lo: 0xa4, hi: 0xa4},
+       {value: 0x1873, lo: 0xa5, hi: 0xa5},
+       {value: 0x1b5c, lo: 0xa6, hi: 0xa6},
+       {value: 0x0001, lo: 0xaf, hi: 0xaf},
+       {value: 0x2691, lo: 0xb3, hi: 0xb3},
+       {value: 0x27fe, lo: 0xb4, hi: 0xb4},
+       {value: 0x2698, lo: 0xb6, hi: 0xb6},
+       {value: 0x2808, lo: 0xb7, hi: 0xb7},
+       {value: 0x186d, lo: 0xbc, hi: 0xbc},
+       {value: 0x4269, lo: 0xbe, hi: 0xbe},
+       // Block 0x3d, offset 0x166
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x1933, lo: 0x87, hi: 0x87},
+       {value: 0x1930, lo: 0x88, hi: 0x88},
+       {value: 0x1870, lo: 0x89, hi: 0x89},
+       {value: 0x298e, lo: 0x97, hi: 0x97},
+       {value: 0x0001, lo: 0x9f, hi: 0x9f},
+       {value: 0x0021, lo: 0xb0, hi: 0xb0},
+       {value: 0x0093, lo: 0xb1, hi: 0xb1},
+       {value: 0x0029, lo: 0xb4, hi: 0xb9},
+       {value: 0x0017, lo: 0xba, hi: 0xba},
+       {value: 0x0467, lo: 0xbb, hi: 0xbb},
+       {value: 0x003b, lo: 0xbc, hi: 0xbc},
+       {value: 0x0011, lo: 0xbd, hi: 0xbe},
+       {value: 0x009d, lo: 0xbf, hi: 0xbf},
+       // Block 0x3e, offset 0x174
+       {value: 0x0002, lo: 0x0f},
+       {value: 0x0021, lo: 0x80, hi: 0x89},
+       {value: 0x0017, lo: 0x8a, hi: 0x8a},
+       {value: 0x0467, lo: 0x8b, hi: 0x8b},
+       {value: 0x003b, lo: 0x8c, hi: 0x8c},
+       {value: 0x0011, lo: 0x8d, hi: 0x8e},
+       {value: 0x0083, lo: 0x90, hi: 0x90},
+       {value: 0x008b, lo: 0x91, hi: 0x91},
+       {value: 0x009f, lo: 0x92, hi: 0x92},
+       {value: 0x00b1, lo: 0x93, hi: 0x93},
+       {value: 0x0104, lo: 0x94, hi: 0x94},
+       {value: 0x0091, lo: 0x95, hi: 0x95},
+       {value: 0x0097, lo: 0x96, hi: 0x99},
+       {value: 0x00a1, lo: 0x9a, hi: 0x9a},
+       {value: 0x00a7, lo: 0x9b, hi: 0x9c},
+       {value: 0x1999, lo: 0xa8, hi: 0xa8},
+       // Block 0x3f, offset 0x184
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x40, offset 0x192
+       {value: 0x0007, lo: 0x06},
+       {value: 0x2180, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x41, offset 0x199
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x42, offset 0x19f
+       {value: 0x0173, lo: 0x0e},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa4},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0x269f, lo: 0xac, hi: 0xad},
+       {value: 0x26a6, lo: 0xaf, hi: 0xaf},
+       {value: 0x281c, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x43, offset 0x1ae
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x44, offset 0x1b2
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x45, offset 0x1b4
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0057, lo: 0x80, hi: 0x8f},
+       {value: 0x0083, lo: 0x90, hi: 0xa9},
+       {value: 0x0021, lo: 0xaa, hi: 0xaa},
+       // Block 0x46, offset 0x1b8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x299b, lo: 0x8c, hi: 0x8c},
+       // Block 0x47, offset 0x1ba
+       {value: 0x0263, lo: 0x02},
+       {value: 0x1b8c, lo: 0xb4, hi: 0xb4},
+       {value: 0x192d, lo: 0xb5, hi: 0xb6},
+       // Block 0x48, offset 0x1bd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x49, offset 0x1bf
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0095, lo: 0xbc, hi: 0xbc},
+       {value: 0x006d, lo: 0xbd, hi: 0xbd},
+       // Block 0x4a, offset 0x1c2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x4b, offset 0x1c4
+       {value: 0x0000, lo: 0x02},
+       {value: 0x047f, lo: 0xaf, hi: 0xaf},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x4c, offset 0x1c7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x4d, offset 0x1c9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0dc3, lo: 0x9f, hi: 0x9f},
+       // Block 0x4e, offset 0x1cb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x162f, lo: 0xb3, hi: 0xb3},
+       // Block 0x4f, offset 0x1cd
+       {value: 0x0004, lo: 0x0b},
+       {value: 0x1597, lo: 0x80, hi: 0x82},
+       {value: 0x15af, lo: 0x83, hi: 0x83},
+       {value: 0x15c7, lo: 0x84, hi: 0x85},
+       {value: 0x15d7, lo: 0x86, hi: 0x89},
+       {value: 0x15eb, lo: 0x8a, hi: 0x8c},
+       {value: 0x15ff, lo: 0x8d, hi: 0x8d},
+       {value: 0x1607, lo: 0x8e, hi: 0x8e},
+       {value: 0x160f, lo: 0x8f, hi: 0x90},
+       {value: 0x161b, lo: 0x91, hi: 0x93},
+       {value: 0x162b, lo: 0x94, hi: 0x94},
+       {value: 0x1633, lo: 0x95, hi: 0x95},
+       // Block 0x50, offset 0x1d9
+       {value: 0x0004, lo: 0x09},
+       {value: 0x0001, lo: 0x80, hi: 0x80},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xae},
+       {value: 0x812f, lo: 0xaf, hi: 0xaf},
+       {value: 0x04b3, lo: 0xb6, hi: 0xb6},
+       {value: 0x0887, lo: 0xb8, hi: 0xba},
+       // Block 0x51, offset 0x1e3
+       {value: 0x0006, lo: 0x09},
+       {value: 0x0313, lo: 0xb1, hi: 0xb1},
+       {value: 0x0317, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a3b, lo: 0xb3, hi: 0xb3},
+       {value: 0x031b, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a41, lo: 0xb5, hi: 0xb6},
+       {value: 0x031f, lo: 0xb7, hi: 0xb7},
+       {value: 0x0323, lo: 0xb8, hi: 0xb8},
+       {value: 0x0327, lo: 0xb9, hi: 0xb9},
+       {value: 0x4a4d, lo: 0xba, hi: 0xbf},
+       // Block 0x52, offset 0x1ed
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x53, offset 0x1f0
+       {value: 0x0000, lo: 0x03},
+       {value: 0x020f, lo: 0x9c, hi: 0x9c},
+       {value: 0x0212, lo: 0x9d, hi: 0x9d},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x54, offset 0x1f4
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x55, offset 0x1f6
+       {value: 0x0000, lo: 0x01},
+       {value: 0x163b, lo: 0xb0, hi: 0xb0},
+       // Block 0x56, offset 0x1f8
+       {value: 0x000c, lo: 0x01},
+       {value: 0x00d7, lo: 0xb8, hi: 0xb9},
+       // Block 0x57, offset 0x1fa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x58, offset 0x1fc
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x59, offset 0x1ff
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x5a, offset 0x201
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x5b, offset 0x203
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x5c, offset 0x205
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x5d, offset 0x207
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x5e, offset 0x20d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x5f, offset 0x210
+       {value: 0x0008, lo: 0x03},
+       {value: 0x1637, lo: 0x9c, hi: 0x9d},
+       {value: 0x0125, lo: 0x9e, hi: 0x9e},
+       {value: 0x1643, lo: 0x9f, hi: 0x9f},
+       // Block 0x60, offset 0x214
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x61, offset 0x216
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x62, offset 0x21d
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x63, offset 0x223
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x64, offset 0x229
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x65, offset 0x231
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x66, offset 0x237
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x67, offset 0x23d
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x68, offset 0x243
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x69, offset 0x247
+       {value: 0x0002, lo: 0x01},
+       {value: 0x0003, lo: 0x81, hi: 0xbf},
+       // Block 0x6a, offset 0x249
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x6b, offset 0x24b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x6c, offset 0x24d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x6d, offset 0x24f
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x6e, offset 0x255
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x6f, offset 0x258
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa4, hi: 0xa7},
+       // Block 0x70, offset 0x25a
+       {value: 0x0000, lo: 0x05},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x8132, lo: 0x88, hi: 0x8a},
+       {value: 0x812d, lo: 0x8b, hi: 0x8b},
+       {value: 0x8132, lo: 0x8c, hi: 0x8c},
+       {value: 0x812d, lo: 0x8d, hi: 0x90},
+       // Block 0x71, offset 0x260
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x72, offset 0x263
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x73, offset 0x26b
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x74, offset 0x272
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x75, offset 0x275
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x76, offset 0x278
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x77, offset 0x27a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbb, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x78, offset 0x27d
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x79, offset 0x285
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       {value: 0x8132, lo: 0x9e, hi: 0x9e},
+       // Block 0x7a, offset 0x289
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x7b, offset 0x290
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x7c, offset 0x293
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7d, offset 0x299
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x7e, offset 0x29b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7f, offset 0x29d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x80, offset 0x2a0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x81, offset 0x2a2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb9, hi: 0xb9},
+       {value: 0x8102, lo: 0xba, hi: 0xba},
+       // Block 0x82, offset 0x2a5
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x83, offset 0x2a7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x87, hi: 0x87},
+       // Block 0x84, offset 0x2a9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x99, hi: 0x99},
+       // Block 0x85, offset 0x2ab
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0x82, hi: 0x82},
+       {value: 0x8104, lo: 0x84, hi: 0x85},
+       // Block 0x86, offset 0x2ae
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x97, hi: 0x97},
+       // Block 0x87, offset 0x2b0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x88, offset 0x2b2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x89, offset 0x2b4
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x8a, offset 0x2b6
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x8b, offset 0x2c3
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x8c, offset 0x2cd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x8d, offset 0x2cf
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x8e, offset 0x2d1
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0043, lo: 0x80, hi: 0x99},
+       {value: 0x0083, lo: 0x9a, hi: 0xb3},
+       {value: 0x0043, lo: 0xb4, hi: 0xbf},
+       // Block 0x8f, offset 0x2d5
+       {value: 0x0002, lo: 0x04},
+       {value: 0x005b, lo: 0x80, hi: 0x8d},
+       {value: 0x0083, lo: 0x8e, hi: 0x94},
+       {value: 0x0093, lo: 0x96, hi: 0xa7},
+       {value: 0x0043, lo: 0xa8, hi: 0xbf},
+       // Block 0x90, offset 0x2da
+       {value: 0x0002, lo: 0x0b},
+       {value: 0x0073, lo: 0x80, hi: 0x81},
+       {value: 0x0083, lo: 0x82, hi: 0x9b},
+       {value: 0x0043, lo: 0x9c, hi: 0x9c},
+       {value: 0x0047, lo: 0x9e, hi: 0x9f},
+       {value: 0x004f, lo: 0xa2, hi: 0xa2},
+       {value: 0x0055, lo: 0xa5, hi: 0xa6},
+       {value: 0x005d, lo: 0xa9, hi: 0xac},
+       {value: 0x0067, lo: 0xae, hi: 0xb5},
+       {value: 0x0083, lo: 0xb6, hi: 0xb9},
+       {value: 0x008d, lo: 0xbb, hi: 0xbb},
+       {value: 0x0091, lo: 0xbd, hi: 0xbf},
+       // Block 0x91, offset 0x2e6
+       {value: 0x0002, lo: 0x04},
+       {value: 0x0097, lo: 0x80, hi: 0x83},
+       {value: 0x00a1, lo: 0x85, hi: 0x8f},
+       {value: 0x0043, lo: 0x90, hi: 0xa9},
+       {value: 0x0083, lo: 0xaa, hi: 0xbf},
+       // Block 0x92, offset 0x2eb
+       {value: 0x0002, lo: 0x08},
+       {value: 0x00af, lo: 0x80, hi: 0x83},
+       {value: 0x0043, lo: 0x84, hi: 0x85},
+       {value: 0x0049, lo: 0x87, hi: 0x8a},
+       {value: 0x0055, lo: 0x8d, hi: 0x94},
+       {value: 0x0067, lo: 0x96, hi: 0x9c},
+       {value: 0x0083, lo: 0x9e, hi: 0xb7},
+       {value: 0x0043, lo: 0xb8, hi: 0xb9},
+       {value: 0x0049, lo: 0xbb, hi: 0xbe},
+       // Block 0x93, offset 0x2f4
+       {value: 0x0002, lo: 0x05},
+       {value: 0x0053, lo: 0x80, hi: 0x84},
+       {value: 0x005f, lo: 0x86, hi: 0x86},
+       {value: 0x0067, lo: 0x8a, hi: 0x90},
+       {value: 0x0083, lo: 0x92, hi: 0xab},
+       {value: 0x0043, lo: 0xac, hi: 0xbf},
+       // Block 0x94, offset 0x2fa
+       {value: 0x0002, lo: 0x04},
+       {value: 0x006b, lo: 0x80, hi: 0x85},
+       {value: 0x0083, lo: 0x86, hi: 0x9f},
+       {value: 0x0043, lo: 0xa0, hi: 0xb9},
+       {value: 0x0083, lo: 0xba, hi: 0xbf},
+       // Block 0x95, offset 0x2ff
+       {value: 0x0002, lo: 0x03},
+       {value: 0x008f, lo: 0x80, hi: 0x93},
+       {value: 0x0043, lo: 0x94, hi: 0xad},
+       {value: 0x0083, lo: 0xae, hi: 0xbf},
+       // Block 0x96, offset 0x303
+       {value: 0x0002, lo: 0x04},
+       {value: 0x00a7, lo: 0x80, hi: 0x87},
+       {value: 0x0043, lo: 0x88, hi: 0xa1},
+       {value: 0x0083, lo: 0xa2, hi: 0xbb},
+       {value: 0x0043, lo: 0xbc, hi: 0xbf},
+       // Block 0x97, offset 0x308
+       {value: 0x0002, lo: 0x03},
+       {value: 0x004b, lo: 0x80, hi: 0x95},
+       {value: 0x0083, lo: 0x96, hi: 0xaf},
+       {value: 0x0043, lo: 0xb0, hi: 0xbf},
+       // Block 0x98, offset 0x30c
+       {value: 0x0003, lo: 0x0f},
+       {value: 0x01b8, lo: 0x80, hi: 0x80},
+       {value: 0x045f, lo: 0x81, hi: 0x81},
+       {value: 0x01bb, lo: 0x82, hi: 0x9a},
+       {value: 0x045b, lo: 0x9b, hi: 0x9b},
+       {value: 0x01c7, lo: 0x9c, hi: 0x9c},
+       {value: 0x01d0, lo: 0x9d, hi: 0x9d},
+       {value: 0x01d6, lo: 0x9e, hi: 0x9e},
+       {value: 0x01fa, lo: 0x9f, hi: 0x9f},
+       {value: 0x01eb, lo: 0xa0, hi: 0xa0},
+       {value: 0x01e8, lo: 0xa1, hi: 0xa1},
+       {value: 0x0173, lo: 0xa2, hi: 0xb2},
+       {value: 0x0188, lo: 0xb3, hi: 0xb3},
+       {value: 0x01a6, lo: 0xb4, hi: 0xba},
+       {value: 0x045f, lo: 0xbb, hi: 0xbb},
+       {value: 0x01bb, lo: 0xbc, hi: 0xbf},
+       // Block 0x99, offset 0x31c
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01c7, lo: 0x80, hi: 0x94},
+       {value: 0x045b, lo: 0x95, hi: 0x95},
+       {value: 0x01c7, lo: 0x96, hi: 0x96},
+       {value: 0x01d0, lo: 0x97, hi: 0x97},
+       {value: 0x01d6, lo: 0x98, hi: 0x98},
+       {value: 0x01fa, lo: 0x99, hi: 0x99},
+       {value: 0x01eb, lo: 0x9a, hi: 0x9a},
+       {value: 0x01e8, lo: 0x9b, hi: 0x9b},
+       {value: 0x0173, lo: 0x9c, hi: 0xac},
+       {value: 0x0188, lo: 0xad, hi: 0xad},
+       {value: 0x01a6, lo: 0xae, hi: 0xb4},
+       {value: 0x045f, lo: 0xb5, hi: 0xb5},
+       {value: 0x01bb, lo: 0xb6, hi: 0xbf},
+       // Block 0x9a, offset 0x32a
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01d9, lo: 0x80, hi: 0x8e},
+       {value: 0x045b, lo: 0x8f, hi: 0x8f},
+       {value: 0x01c7, lo: 0x90, hi: 0x90},
+       {value: 0x01d0, lo: 0x91, hi: 0x91},
+       {value: 0x01d6, lo: 0x92, hi: 0x92},
+       {value: 0x01fa, lo: 0x93, hi: 0x93},
+       {value: 0x01eb, lo: 0x94, hi: 0x94},
+       {value: 0x01e8, lo: 0x95, hi: 0x95},
+       {value: 0x0173, lo: 0x96, hi: 0xa6},
+       {value: 0x0188, lo: 0xa7, hi: 0xa7},
+       {value: 0x01a6, lo: 0xa8, hi: 0xae},
+       {value: 0x045f, lo: 0xaf, hi: 0xaf},
+       {value: 0x01bb, lo: 0xb0, hi: 0xbf},
+       // Block 0x9b, offset 0x338
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01eb, lo: 0x80, hi: 0x88},
+       {value: 0x045b, lo: 0x89, hi: 0x89},
+       {value: 0x01c7, lo: 0x8a, hi: 0x8a},
+       {value: 0x01d0, lo: 0x8b, hi: 0x8b},
+       {value: 0x01d6, lo: 0x8c, hi: 0x8c},
+       {value: 0x01fa, lo: 0x8d, hi: 0x8d},
+       {value: 0x01eb, lo: 0x8e, hi: 0x8e},
+       {value: 0x01e8, lo: 0x8f, hi: 0x8f},
+       {value: 0x0173, lo: 0x90, hi: 0xa0},
+       {value: 0x0188, lo: 0xa1, hi: 0xa1},
+       {value: 0x01a6, lo: 0xa2, hi: 0xa8},
+       {value: 0x045f, lo: 0xa9, hi: 0xa9},
+       {value: 0x01bb, lo: 0xaa, hi: 0xbf},
+       // Block 0x9c, offset 0x346
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x9d, offset 0x34c
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x9e, offset 0x34e
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x9f, offset 0x351
+       {value: 0x0002, lo: 0x09},
+       {value: 0x0063, lo: 0x80, hi: 0x89},
+       {value: 0x1951, lo: 0x8a, hi: 0x8a},
+       {value: 0x1981, lo: 0x8b, hi: 0x8b},
+       {value: 0x199c, lo: 0x8c, hi: 0x8c},
+       {value: 0x19a2, lo: 0x8d, hi: 0x8d},
+       {value: 0x1bc0, lo: 0x8e, hi: 0x8e},
+       {value: 0x19ae, lo: 0x8f, hi: 0x8f},
+       {value: 0x197b, lo: 0xaa, hi: 0xaa},
+       {value: 0x197e, lo: 0xab, hi: 0xab},
+       // Block 0xa0, offset 0x35b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x193f, lo: 0x90, hi: 0x90},
+       // Block 0xa1, offset 0x35d
+       {value: 0x0028, lo: 0x09},
+       {value: 0x2862, lo: 0x80, hi: 0x80},
+       {value: 0x2826, lo: 0x81, hi: 0x81},
+       {value: 0x2830, lo: 0x82, hi: 0x82},
+       {value: 0x2844, lo: 0x83, hi: 0x84},
+       {value: 0x284e, lo: 0x85, hi: 0x86},
+       {value: 0x283a, lo: 0x87, hi: 0x87},
+       {value: 0x2858, lo: 0x88, hi: 0x88},
+       {value: 0x0b6f, lo: 0x90, hi: 0x90},
+       {value: 0x08e7, lo: 0x91, hi: 0x91},
+}
+
+// recompMap: 7520 bytes (entries only)
+var recompMap map[uint32]rune
+var recompMapOnce sync.Once
+
+const recompMapPacked = "" +
+       "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0
+       "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1
+       "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2
+       "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3
+       "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4
+       "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5
+       "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7
+       "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8
+       "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9
+       "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA
+       "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB
+       "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC
+       "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD
+       "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE
+       "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF
+       "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1
+       "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2
+       "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3
+       "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4
+       "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5
+       "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6
+       "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9
+       "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA
+       "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB
+       "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC
+       "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD
+       "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0
+       "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1
+       "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2
+       "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3
+       "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4
+       "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5
+       "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7
+       "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8
+       "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9
+       "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA
+       "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB
+       "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC
+       "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED
+       "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE
+       "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF
+       "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1
+       "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2
+       "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3
+       "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4
+       "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5
+       "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6
+       "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9
+       "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA
+       "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB
+       "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC
+       "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD
+       "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF
+       "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100
+       "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101
+       "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102
+       "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103
+       "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104
+       "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105
+       "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106
+       "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107
+       "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108
+       "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109
+       "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A
+       "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B
+       "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C
+       "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D
+       "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E
+       "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F
+       "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112
+       "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113
+       "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114
+       "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115
+       "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116
+       "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117
+       "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118
+       "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119
+       "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A
+       "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B
+       "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C
+       "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D
+       "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E
+       "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F
+       "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120
+       "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121
+       "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122
+       "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123
+       "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124
+       "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125
+       "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128
+       "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129
+       "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A
+       "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B
+       "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C
+       "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D
+       "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E
+       "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F
+       "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130
+       "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134
+       "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135
+       "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136
+       "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137
+       "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139
+       "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A
+       "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B
+       "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C
+       "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D
+       "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E
+       "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143
+       "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144
+       "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145
+       "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146
+       "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147
+       "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148
+       "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C
+       "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D
+       "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E
+       "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F
+       "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150
+       "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151
+       "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154
+       "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155
+       "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156
+       "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157
+       "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158
+       "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159
+       "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A
+       "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B
+       "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C
+       "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D
+       "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E
+       "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F
+       "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160
+       "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161
+       "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162
+       "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163
+       "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164
+       "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165
+       "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168
+       "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169
+       "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A
+       "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B
+       "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C
+       "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D
+       "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E
+       "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F
+       "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170
+       "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171
+       "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172
+       "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173
+       "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174
+       "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175
+       "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176
+       "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177
+       "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178
+       "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179
+       "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A
+       "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B
+       "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C
+       "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D
+       "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E
+       "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0
+       "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1
+       "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF
+       "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0
+       "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD
+       "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE
+       "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF
+       "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0
+       "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1
+       "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2
+       "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3
+       "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4
+       "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5
+       "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6
+       "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7
+       "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8
+       "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9
+       "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA
+       "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB
+       "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC
+       "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE
+       "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF
+       "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0
+       "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1
+       "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2
+       "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3
+       "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6
+       "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7
+       "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8
+       "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9
+       "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA
+       "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB
+       "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC
+       "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED
+       "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE
+       "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF
+       "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0
+       "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4
+       "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5
+       "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8
+       "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9
+       "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA
+       "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB
+       "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC
+       "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD
+       "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE
+       "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF
+       "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200
+       "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201
+       "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202
+       "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203
+       "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204
+       "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205
+       "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206
+       "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207
+       "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208
+       "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209
+       "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A
+       "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B
+       "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C
+       "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D
+       "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E
+       "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F
+       "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210
+       "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211
+       "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212
+       "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213
+       "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214
+       "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215
+       "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216
+       "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217
+       "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218
+       "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219
+       "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A
+       "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B
+       "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E
+       "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F
+       "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226
+       "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227
+       "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228
+       "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229
+       "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A
+       "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B
+       "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C
+       "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D
+       "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E
+       "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F
+       "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230
+       "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231
+       "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232
+       "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233
+       "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385
+       "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386
+       "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388
+       "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389
+       "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A
+       "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C
+       "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E
+       "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F
+       "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390
+       "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA
+       "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB
+       "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC
+       "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD
+       "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE
+       "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF
+       "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0
+       "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA
+       "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB
+       "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC
+       "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD
+       "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE
+       "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3
+       "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4
+       "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400
+       "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401
+       "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403
+       "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407
+       "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C
+       "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D
+       "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E
+       "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419
+       "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439
+       "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450
+       "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451
+       "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453
+       "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457
+       "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C
+       "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D
+       "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E
+       "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476
+       "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477
+       "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1
+       "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2
+       "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0
+       "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1
+       "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2
+       "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3
+       "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6
+       "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7
+       "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA
+       "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB
+       "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC
+       "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD
+       "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE
+       "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF
+       "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2
+       "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3
+       "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4
+       "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5
+       "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6
+       "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7
+       "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA
+       "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB
+       "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC
+       "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED
+       "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE
+       "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF
+       "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0
+       "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1
+       "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2
+       "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3
+       "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4
+       "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5
+       "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8
+       "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9
+       "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622
+       "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623
+       "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624
+       "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625
+       "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626
+       "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0
+       "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2
+       "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3
+       "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929
+       "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931
+       "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934
+       "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB
+       "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC
+       "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48
+       "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B
+       "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C
+       "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94
+       "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA
+       "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB
+       "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC
+       "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48
+       "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0
+       "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7
+       "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8
+       "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA
+       "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB
+       "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A
+       "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B
+       "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C
+       "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA
+       "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC
+       "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD
+       "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE
+       "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026
+       "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06
+       "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08
+       "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A
+       "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C
+       "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E
+       "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12
+       "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B
+       "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D
+       "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40
+       "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41
+       "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43
+       "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00
+       "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01
+       "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02
+       "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03
+       "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04
+       "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05
+       "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06
+       "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07
+       "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08
+       "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09
+       "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A
+       "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B
+       "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C
+       "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D
+       "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E
+       "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F
+       "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10
+       "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11
+       "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12
+       "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13
+       "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14
+       "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15
+       "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16
+       "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17
+       "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18
+       "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19
+       "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A
+       "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B
+       "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C
+       "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D
+       "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E
+       "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F
+       "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20
+       "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21
+       "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22
+       "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23
+       "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24
+       "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25
+       "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26
+       "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27
+       "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28
+       "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29
+       "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A
+       "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B
+       "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C
+       "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D
+       "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E
+       "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F
+       "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30
+       "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31
+       "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32
+       "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33
+       "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34
+       "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35
+       "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36
+       "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37
+       "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38
+       "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39
+       "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A
+       "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B
+       "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C
+       "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D
+       "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E
+       "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F
+       "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40
+       "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41
+       "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42
+       "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43
+       "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44
+       "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45
+       "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46
+       "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47
+       "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48
+       "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49
+       "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A
+       "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B
+       "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C
+       "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D
+       "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E
+       "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F
+       "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50
+       "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51
+       "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52
+       "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53
+       "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54
+       "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55
+       "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56
+       "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57
+       "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58
+       "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59
+       "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A
+       "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B
+       "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C
+       "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D
+       "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E
+       "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F
+       "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60
+       "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61
+       "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62
+       "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63
+       "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64
+       "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65
+       "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66
+       "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67
+       "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68
+       "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69
+       "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A
+       "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B
+       "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C
+       "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D
+       "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E
+       "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F
+       "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70
+       "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71
+       "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72
+       "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73
+       "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74
+       "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75
+       "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76
+       "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77
+       "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78
+       "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79
+       "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A
+       "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B
+       "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C
+       "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D
+       "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E
+       "\x00v\x03#\x00\x00\x1e\u007f" + // 0x00760323: 0x00001E7F
+       "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80
+       "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81
+       "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82
+       "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83
+       "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84
+       "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85
+       "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86
+       "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87
+       "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88
+       "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89
+       "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A
+       "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B
+       "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C
+       "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D
+       "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E
+       "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F
+       "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90
+       "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91
+       "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92
+       "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93
+       "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94
+       "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95
+       "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96
+       "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97
+       "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98
+       "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99
+       "\x01\u007f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B
+       "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0
+       "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1
+       "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2
+       "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3
+       "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4
+       "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5
+       "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6
+       "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7
+       "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8
+       "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9
+       "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA
+       "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB
+       "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC
+       "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD
+       "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE
+       "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF
+       "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0
+       "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1
+       "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2
+       "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3
+       "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4
+       "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5
+       "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6
+       "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7
+       "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8
+       "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9
+       "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA
+       "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB
+       "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC
+       "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD
+       "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE
+       "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF
+       "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0
+       "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1
+       "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2
+       "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3
+       "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4
+       "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5
+       "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6
+       "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7
+       "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8
+       "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9
+       "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA
+       "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB
+       "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC
+       "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD
+       "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE
+       "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF
+       "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0
+       "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1
+       "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2
+       "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3
+       "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4
+       "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5
+       "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6
+       "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7
+       "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8
+       "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9
+       "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA
+       "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB
+       "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC
+       "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD
+       "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE
+       "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF
+       "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0
+       "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1
+       "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2
+       "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3
+       "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4
+       "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5
+       "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6
+       "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7
+       "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8
+       "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9
+       "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA
+       "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB
+       "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC
+       "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED
+       "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE
+       "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF
+       "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0
+       "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1
+       "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2
+       "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3
+       "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4
+       "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5
+       "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6
+       "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7
+       "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8
+       "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9
+       "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00
+       "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01
+       "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02
+       "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03
+       "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04
+       "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05
+       "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06
+       "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07
+       "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08
+       "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09
+       "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A
+       "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B
+       "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C
+       "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D
+       "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E
+       "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F
+       "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10
+       "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11
+       "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12
+       "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13
+       "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14
+       "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15
+       "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18
+       "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19
+       "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A
+       "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B
+       "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C
+       "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D
+       "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20
+       "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21
+       "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22
+       "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23
+       "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24
+       "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25
+       "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26
+       "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27
+       "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28
+       "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29
+       "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A
+       "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B
+       "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C
+       "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D
+       "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E
+       "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F
+       "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30
+       "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31
+       "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32
+       "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33
+       "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34
+       "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35
+       "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36
+       "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37
+       "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38
+       "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39
+       "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A
+       "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B
+       "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C
+       "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D
+       "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E
+       "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F
+       "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40
+       "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41
+       "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42
+       "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43
+       "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44
+       "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45
+       "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48
+       "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49
+       "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A
+       "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B
+       "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C
+       "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D
+       "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50
+       "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51
+       "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52
+       "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53
+       "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54
+       "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55
+       "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56
+       "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57
+       "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59
+       "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B
+       "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D
+       "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F
+       "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60
+       "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61
+       "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62
+       "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63
+       "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64
+       "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65
+       "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66
+       "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67
+       "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68
+       "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69
+       "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A
+       "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B
+       "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C
+       "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D
+       "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E
+       "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F
+       "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70
+       "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72
+       "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74
+       "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76
+       "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78
+       "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A
+       "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C
+       "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80
+       "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81
+       "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82
+       "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83
+       "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84
+       "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85
+       "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86
+       "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87
+       "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88
+       "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89
+       "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A
+       "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B
+       "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C
+       "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D
+       "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E
+       "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F
+       "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90
+       "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91
+       "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92
+       "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93
+       "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94
+       "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95
+       "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96
+       "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97
+       "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98
+       "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99
+       "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A
+       "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B
+       "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C
+       "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D
+       "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E
+       "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F
+       "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0
+       "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1
+       "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2
+       "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3
+       "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4
+       "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5
+       "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6
+       "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7
+       "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8
+       "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9
+       "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA
+       "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB
+       "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC
+       "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD
+       "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE
+       "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF
+       "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0
+       "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1
+       "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2
+       "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3
+       "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4
+       "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6
+       "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7
+       "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8
+       "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9
+       "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA
+       "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC
+       "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1
+       "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2
+       "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3
+       "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4
+       "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6
+       "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7
+       "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8
+       "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA
+       "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC
+       "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD
+       "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE
+       "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF
+       "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0
+       "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1
+       "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2
+       "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6
+       "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7
+       "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8
+       "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9
+       "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA
+       "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD
+       "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE
+       "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF
+       "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0
+       "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1
+       "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2
+       "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4
+       "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5
+       "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6
+       "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7
+       "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8
+       "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9
+       "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA
+       "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC
+       "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED
+       "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2
+       "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3
+       "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4
+       "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6
+       "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7
+       "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8
+       "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA
+       "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC
+       "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A
+       "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B
+       "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE
+       "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD
+       "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE
+       "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF
+       "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204
+       "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209
+       "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C
+       "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224
+       "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226
+       "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241
+       "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244
+       "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247
+       "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249
+       "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260
+       "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262
+       "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D
+       "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E
+       "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F
+       "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270
+       "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271
+       "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274
+       "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275
+       "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278
+       "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279
+       "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280
+       "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281
+       "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284
+       "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285
+       "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288
+       "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289
+       "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC
+       "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD
+       "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE
+       "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF
+       "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0
+       "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1
+       "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2
+       "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3
+       "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA
+       "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB
+       "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC
+       "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED
+       "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C
+       "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E
+       "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050
+       "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052
+       "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054
+       "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056
+       "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058
+       "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A
+       "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C
+       "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E
+       "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060
+       "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062
+       "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065
+       "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067
+       "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069
+       "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070
+       "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071
+       "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073
+       "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074
+       "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076
+       "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077
+       "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079
+       "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A
+       "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C
+       "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D
+       "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094
+       "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E
+       "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC
+       "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE
+       "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0
+       "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2
+       "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4
+       "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6
+       "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8
+       "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA
+       "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC
+       "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE
+       "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0
+       "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2
+       "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5
+       "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7
+       "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9
+       "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0
+       "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1
+       "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3
+       "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4
+       "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6
+       "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7
+       "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9
+       "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA
+       "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC
+       "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD
+       "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4
+       "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7
+       "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8
+       "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9
+       "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA
+       "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE
+       "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A
+       "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C
+       "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB
+       "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E
+       "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F
+       "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B
+       "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C
+       "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB
+       "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC
+       "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE
+       "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA
+       "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB
+       ""
+       // Total size of tables: 53KB (54514 bytes)
diff --git a/libgo/go/golang.org/x/text/unicode/norm/tables9.0.0.go b/libgo/go/golang.org/x/text/unicode/norm/tables9.0.0.go
new file mode 100644 (file)
index 0000000..9429069
--- /dev/null
@@ -0,0 +1,7637 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package norm
+
+import "sync"
+
+const (
+       // Version is the Unicode edition from which the tables are derived.
+       Version = "9.0.0"
+
+       // MaxTransformChunkSize indicates the maximum number of bytes that Transform
+       // may need to write atomically for any Form. Making a destination buffer at
+       // least this size ensures that Transform can always make progress and that
+       // the user does not need to grow the buffer on an ErrShortDst.
+       MaxTransformChunkSize = 35 + maxNonStarters*4
+)
+
+var ccc = [55]uint8{
+       0, 1, 7, 8, 9, 10, 11, 12,
+       13, 14, 15, 16, 17, 18, 19, 20,
+       21, 22, 23, 24, 25, 26, 27, 28,
+       29, 30, 31, 32, 33, 34, 35, 36,
+       84, 91, 103, 107, 118, 122, 129, 130,
+       132, 202, 214, 216, 218, 220, 222, 224,
+       226, 228, 230, 232, 233, 234, 240,
+}
+
+const (
+       firstMulti            = 0x186D
+       firstCCC              = 0x2C9E
+       endMulti              = 0x2F60
+       firstLeadingCCC       = 0x49AE
+       firstCCCZeroExcept    = 0x4A78
+       firstStarterWithNLead = 0x4A9F
+       lastDecomp            = 0x4AA1
+       maxDecomp             = 0x8000
+)
+
+// decomps: 19105 bytes
+var decomps = [...]byte{
+       // Bytes 0 - 3f
+       0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
+       0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
+       0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
+       0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
+       0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
+       0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
+       0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
+       0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
+       // Bytes 40 - 7f
+       0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
+       0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
+       0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
+       0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
+       0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
+       0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
+       0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
+       0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
+       // Bytes 80 - bf
+       0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
+       0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
+       0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
+       0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
+       0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
+       0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
+       0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
+       0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
+       // Bytes c0 - ff
+       0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
+       0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
+       0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,
+       0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,
+       0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,
+       0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,
+       0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,
+       0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,
+       // Bytes 100 - 13f
+       0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,
+       0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,
+       0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,
+       0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,
+       0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,
+       0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
+       0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
+       0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
+       // Bytes 140 - 17f
+       0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,
+       0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,
+       0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
+       0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
+       0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,
+       0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,
+       0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,
+       0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,
+       // Bytes 180 - 1bf
+       0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,
+       0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,
+       0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,
+       0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,
+       0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,
+       0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,
+       0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,
+       0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,
+       // Bytes 1c0 - 1ff
+       0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,
+       0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,
+       0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,
+       0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,
+       0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,
+       0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,
+       0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,
+       0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,
+       // Bytes 200 - 23f
+       0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,
+       0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,
+       0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,
+       0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,
+       0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,
+       0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,
+       0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,
+       0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,
+       // Bytes 240 - 27f
+       0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,
+       0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,
+       0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,
+       0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,
+       0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,
+       0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,
+       0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,
+       0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,
+       // Bytes 280 - 2bf
+       0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,
+       0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,
+       0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,
+       0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,
+       0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,
+       0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,
+       0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,
+       0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,
+       // Bytes 2c0 - 2ff
+       0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,
+       0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,
+       0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,
+       0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,
+       0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,
+       0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,
+       0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,
+       0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,
+       // Bytes 300 - 33f
+       0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,
+       0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,
+       0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,
+       0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,
+       0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,
+       0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,
+       0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,
+       0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,
+       // Bytes 340 - 37f
+       0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,
+       0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,
+       0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,
+       0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,
+       0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,
+       0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,
+       0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,
+       0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,
+       // Bytes 380 - 3bf
+       0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,
+       0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,
+       0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,
+       0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,
+       0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,
+       0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,
+       0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,
+       0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,
+       // Bytes 3c0 - 3ff
+       0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,
+       0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,
+       0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,
+       0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,
+       0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,
+       0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,
+       0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,
+       0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,
+       // Bytes 400 - 43f
+       0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,
+       0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,
+       0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,
+       0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,
+       0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,
+       0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,
+       0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,
+       0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,
+       // Bytes 440 - 47f
+       0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,
+       0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,
+       0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,
+       0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,
+       0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,
+       0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,
+       0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,
+       0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,
+       // Bytes 480 - 4bf
+       0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,
+       0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,
+       0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,
+       0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,
+       0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,
+       0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,
+       0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,
+       0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,
+       // Bytes 4c0 - 4ff
+       0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,
+       0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,
+       0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,
+       0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,
+       0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,
+       0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,
+       0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,
+       0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,
+       // Bytes 500 - 53f
+       0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,
+       0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,
+       0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,
+       0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,
+       0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,
+       0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,
+       0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,
+       0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,
+       // Bytes 540 - 57f
+       0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,
+       0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,
+       0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,
+       0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,
+       0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,
+       0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,
+       0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,
+       0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,
+       // Bytes 580 - 5bf
+       0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,
+       0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,
+       0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,
+       0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,
+       0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,
+       0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,
+       0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,
+       0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,
+       // Bytes 5c0 - 5ff
+       0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,
+       0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,
+       0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,
+       0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,
+       0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,
+       0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,
+       0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,
+       0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,
+       // Bytes 600 - 63f
+       0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,
+       0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,
+       0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,
+       0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,
+       0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,
+       0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,
+       0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,
+       0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,
+       // Bytes 640 - 67f
+       0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,
+       0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,
+       0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,
+       0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,
+       0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,
+       0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,
+       0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,
+       0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,
+       // Bytes 680 - 6bf
+       0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,
+       0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,
+       0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,
+       0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,
+       0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,
+       0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,
+       0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,
+       0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,
+       // Bytes 6c0 - 6ff
+       0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,
+       0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,
+       0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,
+       0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,
+       0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,
+       0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,
+       0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,
+       0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,
+       // Bytes 700 - 73f
+       0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,
+       0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,
+       0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,
+       0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,
+       0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,
+       0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,
+       0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,
+       0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,
+       // Bytes 740 - 77f
+       0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,
+       0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,
+       0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,
+       0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,
+       0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,
+       0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,
+       0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,
+       0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,
+       // Bytes 780 - 7bf
+       0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,
+       0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,
+       0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,
+       0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,
+       0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,
+       0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,
+       0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,
+       0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,
+       // Bytes 7c0 - 7ff
+       0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,
+       0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,
+       0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,
+       0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,
+       0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,
+       0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,
+       0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,
+       0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,
+       // Bytes 800 - 83f
+       0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,
+       0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,
+       0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,
+       0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,
+       0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,
+       0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,
+       0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,
+       0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,
+       // Bytes 840 - 87f
+       0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,
+       0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,
+       0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,
+       0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,
+       0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,
+       0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,
+       0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,
+       0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,
+       // Bytes 880 - 8bf
+       0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,
+       0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,
+       0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,
+       0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,
+       0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,
+       0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,
+       0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,
+       0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,
+       // Bytes 8c0 - 8ff
+       0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,
+       0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,
+       0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,
+       0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,
+       0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,
+       0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,
+       0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,
+       0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,
+       // Bytes 900 - 93f
+       0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,
+       0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,
+       0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,
+       0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,
+       0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,
+       0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,
+       0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,
+       0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,
+       // Bytes 940 - 97f
+       0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,
+       0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,
+       0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,
+       0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,
+       0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,
+       0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,
+       0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,
+       0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,
+       // Bytes 980 - 9bf
+       0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,
+       0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,
+       0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,
+       0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,
+       0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,
+       0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,
+       0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,
+       0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,
+       // Bytes 9c0 - 9ff
+       0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,
+       0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,
+       0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,
+       0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,
+       0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,
+       0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,
+       0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,
+       0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,
+       // Bytes a00 - a3f
+       0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,
+       0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,
+       0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,
+       0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,
+       0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,
+       0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,
+       0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,
+       0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,
+       // Bytes a40 - a7f
+       0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,
+       0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,
+       0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,
+       0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,
+       0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,
+       0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,
+       0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,
+       0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,
+       // Bytes a80 - abf
+       0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,
+       0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,
+       0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,
+       0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,
+       0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,
+       0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,
+       0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,
+       0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,
+       // Bytes ac0 - aff
+       0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,
+       0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,
+       0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,
+       0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,
+       0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,
+       0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,
+       0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,
+       0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,
+       // Bytes b00 - b3f
+       0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,
+       0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,
+       0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,
+       0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,
+       0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,
+       0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,
+       0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,
+       0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,
+       // Bytes b40 - b7f
+       0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,
+       0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,
+       0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,
+       0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,
+       0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,
+       0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,
+       0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,
+       0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,
+       // Bytes b80 - bbf
+       0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,
+       0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,
+       0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,
+       0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,
+       0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,
+       0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,
+       0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,
+       0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,
+       // Bytes bc0 - bff
+       0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,
+       0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,
+       0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,
+       0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,
+       0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,
+       0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,
+       0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,
+       0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,
+       // Bytes c00 - c3f
+       0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,
+       0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,
+       0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,
+       0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,
+       0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,
+       0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,
+       0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,
+       0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,
+       // Bytes c40 - c7f
+       0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,
+       0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,
+       0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,
+       0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,
+       0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,
+       0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,
+       0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,
+       0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,
+       // Bytes c80 - cbf
+       0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,
+       0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,
+       0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,
+       0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,
+       0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,
+       0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,
+       0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,
+       0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,
+       // Bytes cc0 - cff
+       0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,
+       0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,
+       0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,
+       0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,
+       0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,
+       0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,
+       0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,
+       0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,
+       // Bytes d00 - d3f
+       0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,
+       0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,
+       0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,
+       0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,
+       0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,
+       0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,
+       0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,
+       0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,
+       // Bytes d40 - d7f
+       0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,
+       0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,
+       0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,
+       0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,
+       0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,
+       0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,
+       0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,
+       0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,
+       // Bytes d80 - dbf
+       0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,
+       0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,
+       0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,
+       0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,
+       0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,
+       0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,
+       0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,
+       0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,
+       // Bytes dc0 - dff
+       0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,
+       0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,
+       0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,
+       0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,
+       0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,
+       0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,
+       0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,
+       0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,
+       // Bytes e00 - e3f
+       0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,
+       0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,
+       0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,
+       0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,
+       0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,
+       0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,
+       0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,
+       0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,
+       // Bytes e40 - e7f
+       0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,
+       0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,
+       0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,
+       0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,
+       0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,
+       0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,
+       0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,
+       0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,
+       // Bytes e80 - ebf
+       0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,
+       0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,
+       0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,
+       0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,
+       0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,
+       0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,
+       0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,
+       0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,
+       // Bytes ec0 - eff
+       0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,
+       0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,
+       0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,
+       0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,
+       0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,
+       0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,
+       0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,
+       0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,
+       // Bytes f00 - f3f
+       0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,
+       0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,
+       0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,
+       0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,
+       0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,
+       0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,
+       0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,
+       0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,
+       // Bytes f40 - f7f
+       0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,
+       0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,
+       0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,
+       0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,
+       0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,
+       0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,
+       0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,
+       0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,
+       // Bytes f80 - fbf
+       0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,
+       0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,
+       0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,
+       0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,
+       0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,
+       0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,
+       0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,
+       0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,
+       // Bytes fc0 - fff
+       0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,
+       0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,
+       0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,
+       0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,
+       0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,
+       0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,
+       0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,
+       0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,
+       // Bytes 1000 - 103f
+       0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,
+       0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,
+       0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,
+       0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,
+       0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,
+       0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,
+       0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,
+       0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,
+       // Bytes 1040 - 107f
+       0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,
+       0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,
+       0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,
+       0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,
+       0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,
+       0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,
+       0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,
+       0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,
+       // Bytes 1080 - 10bf
+       0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,
+       0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,
+       0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,
+       0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,
+       0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,
+       0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,
+       0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,
+       0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,
+       // Bytes 10c0 - 10ff
+       0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,
+       0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,
+       0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,
+       0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,
+       0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,
+       0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,
+       0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,
+       0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,
+       // Bytes 1100 - 113f
+       0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,
+       0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,
+       0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,
+       0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,
+       0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,
+       0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,
+       0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,
+       0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,
+       // Bytes 1140 - 117f
+       0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,
+       0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,
+       0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,
+       0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,
+       0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,
+       0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,
+       0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,
+       0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,
+       // Bytes 1180 - 11bf
+       0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,
+       0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,
+       0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,
+       0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,
+       0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,
+       0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,
+       0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,
+       0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,
+       // Bytes 11c0 - 11ff
+       0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,
+       0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,
+       0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,
+       0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,
+       0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,
+       0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,
+       0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,
+       0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,
+       // Bytes 1200 - 123f
+       0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,
+       0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,
+       0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,
+       0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,
+       0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,
+       0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,
+       0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,
+       0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,
+       // Bytes 1240 - 127f
+       0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,
+       0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,
+       0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,
+       0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,
+       0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,
+       0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,
+       0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,
+       0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,
+       // Bytes 1280 - 12bf
+       0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,
+       0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,
+       0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,
+       0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,
+       0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,
+       0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,
+       0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,
+       0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,
+       // Bytes 12c0 - 12ff
+       0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,
+       0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,
+       0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,
+       0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,
+       0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,
+       0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,
+       0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,
+       0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,
+       // Bytes 1300 - 133f
+       0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,
+       0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,
+       0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,
+       0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,
+       0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,
+       0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,
+       0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,
+       0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,
+       // Bytes 1340 - 137f
+       0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,
+       0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,
+       0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,
+       0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,
+       0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,
+       0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,
+       0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,
+       0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,
+       // Bytes 1380 - 13bf
+       0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,
+       0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,
+       0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,
+       0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,
+       0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,
+       0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,
+       0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,
+       0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,
+       // Bytes 13c0 - 13ff
+       0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,
+       0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,
+       0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,
+       0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,
+       0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,
+       0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,
+       0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,
+       0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,
+       // Bytes 1400 - 143f
+       0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,
+       0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,
+       0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,
+       0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,
+       0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,
+       0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,
+       0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,
+       0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,
+       // Bytes 1440 - 147f
+       0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,
+       0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,
+       0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,
+       0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,
+       0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,
+       0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,
+       0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,
+       0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,
+       // Bytes 1480 - 14bf
+       0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,
+       0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,
+       0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,
+       0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,
+       0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,
+       0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,
+       0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,
+       0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,
+       // Bytes 14c0 - 14ff
+       0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,
+       0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,
+       0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,
+       0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,
+       0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,
+       0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,
+       0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,
+       0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,
+       // Bytes 1500 - 153f
+       0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,
+       0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,
+       0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,
+       0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,
+       0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,
+       0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,
+       0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,
+       0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,
+       // Bytes 1540 - 157f
+       0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,
+       0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,
+       0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,
+       0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,
+       0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,
+       0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,
+       0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,
+       0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,
+       // Bytes 1580 - 15bf
+       0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,
+       0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,
+       0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,
+       0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,
+       0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,
+       0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,
+       0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,
+       0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,
+       // Bytes 15c0 - 15ff
+       0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,
+       0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,
+       0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,
+       0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,
+       0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,
+       0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,
+       0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,
+       0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,
+       // Bytes 1600 - 163f
+       0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,
+       0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,
+       0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,
+       0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,
+       0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,
+       0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,
+       0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,
+       0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,
+       // Bytes 1640 - 167f
+       0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,
+       0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,
+       0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,
+       0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,
+       0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,
+       0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,
+       0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,
+       0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,
+       // Bytes 1680 - 16bf
+       0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,
+       0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,
+       0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,
+       0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,
+       0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,
+       0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,
+       0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,
+       0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,
+       // Bytes 16c0 - 16ff
+       0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,
+       0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,
+       0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,
+       0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,
+       0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,
+       0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,
+       0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,
+       0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,
+       // Bytes 1700 - 173f
+       0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,
+       0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,
+       0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,
+       0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,
+       0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,
+       0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,
+       0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,
+       0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,
+       // Bytes 1740 - 177f
+       0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,
+       0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,
+       0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,
+       0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,
+       0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,
+       0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,
+       0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,
+       0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,
+       // Bytes 1780 - 17bf
+       0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,
+       0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,
+       0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,
+       0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,
+       0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,
+       0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,
+       0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,
+       0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,
+       // Bytes 17c0 - 17ff
+       0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,
+       0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,
+       0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,
+       0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,
+       0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,
+       0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,
+       0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,
+       0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,
+       // Bytes 1800 - 183f
+       0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,
+       0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,
+       0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,
+       0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,
+       0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,
+       0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,
+       0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,
+       0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,
+       // Bytes 1840 - 187f
+       0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,
+       0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,
+       0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,
+       0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,
+       0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,
+       0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,
+       0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,
+       0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,
+       // Bytes 1880 - 18bf
+       0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,
+       0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,
+       0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,
+       0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,
+       0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,
+       0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,
+       0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,
+       0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,
+       // Bytes 18c0 - 18ff
+       0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,
+       0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,
+       0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,
+       0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,
+       0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,
+       0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,
+       0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,
+       0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,
+       // Bytes 1900 - 193f
+       0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,
+       0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,
+       0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,
+       0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,
+       0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,
+       0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,
+       0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,
+       0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,
+       // Bytes 1940 - 197f
+       0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,
+       0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,
+       0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,
+       0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,
+       0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,
+       0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,
+       0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,
+       0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,
+       // Bytes 1980 - 19bf
+       0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
+       0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
+       0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
+       0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
+       0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
+       0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
+       0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
+       0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
+       // Bytes 19c0 - 19ff
+       0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
+       0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
+       0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
+       0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
+       0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
+       0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
+       0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
+       0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
+       // Bytes 1a00 - 1a3f
+       0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
+       0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
+       0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
+       0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
+       0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
+       0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
+       0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
+       0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
+       // Bytes 1a40 - 1a7f
+       0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
+       0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
+       0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
+       0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
+       0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
+       0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
+       0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
+       0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
+       // Bytes 1a80 - 1abf
+       0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
+       0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
+       0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
+       0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
+       0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
+       0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
+       0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
+       0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
+       // Bytes 1ac0 - 1aff
+       0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
+       0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
+       0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
+       0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
+       0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
+       0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
+       0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
+       0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
+       // Bytes 1b00 - 1b3f
+       0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
+       0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
+       0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
+       0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
+       0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
+       0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
+       0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
+       0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
+       // Bytes 1b40 - 1b7f
+       0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
+       0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
+       0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
+       0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
+       0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
+       0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
+       0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
+       0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
+       // Bytes 1b80 - 1bbf
+       0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
+       0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
+       0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
+       0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
+       0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
+       0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
+       0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
+       0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
+       // Bytes 1bc0 - 1bff
+       0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
+       0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
+       0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
+       0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
+       0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
+       0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
+       0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
+       0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
+       // Bytes 1c00 - 1c3f
+       0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
+       0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
+       0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
+       0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
+       0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
+       0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
+       0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
+       0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
+       // Bytes 1c40 - 1c7f
+       0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
+       0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
+       0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
+       0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
+       0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
+       0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
+       0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
+       0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
+       // Bytes 1c80 - 1cbf
+       0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
+       0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
+       0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
+       0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
+       0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
+       0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
+       0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
+       0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
+       // Bytes 1cc0 - 1cff
+       0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
+       0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
+       0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
+       0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
+       0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
+       0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
+       0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
+       0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
+       // Bytes 1d00 - 1d3f
+       0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
+       0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
+       0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
+       0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
+       0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
+       0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
+       0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
+       0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
+       // Bytes 1d40 - 1d7f
+       0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
+       0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
+       0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
+       0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
+       0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
+       0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
+       0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
+       0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
+       // Bytes 1d80 - 1dbf
+       0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
+       0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
+       0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
+       0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
+       0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
+       0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
+       0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
+       0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
+       // Bytes 1dc0 - 1dff
+       0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
+       0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
+       0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
+       0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
+       0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
+       0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
+       0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
+       // Bytes 1e00 - 1e3f
+       0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
+       0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
+       0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
+       0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
+       0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
+       0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
+       0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
+       0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
+       // Bytes 1e40 - 1e7f
+       0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
+       0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
+       0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
+       0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
+       0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
+       // Bytes 1e80 - 1ebf
+       0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
+       0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
+       0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
+       0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
+       0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
+       0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
+       0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
+       0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
+       // Bytes 1ec0 - 1eff
+       0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
+       0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
+       0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
+       0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
+       0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
+       0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
+       0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
+       0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
+       // Bytes 1f00 - 1f3f
+       0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
+       0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
+       0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
+       0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
+       0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
+       0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
+       0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
+       0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
+       // Bytes 1f40 - 1f7f
+       0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
+       0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
+       0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
+       0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
+       0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
+       0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
+       0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
+       0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
+       // Bytes 1f80 - 1fbf
+       0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
+       0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
+       0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
+       0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
+       0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
+       0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
+       0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
+       0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
+       // Bytes 1fc0 - 1fff
+       0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
+       0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
+       0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
+       0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
+       0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
+       0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
+       0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
+       0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
+       // Bytes 2000 - 203f
+       0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
+       0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
+       0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
+       0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
+       0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
+       0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
+       0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
+       0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
+       // Bytes 2040 - 207f
+       0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
+       0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
+       0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
+       0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
+       // Bytes 2080 - 20bf
+       0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
+       0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
+       0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
+       0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
+       0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
+       0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
+       0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
+       // Bytes 20c0 - 20ff
+       0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
+       0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
+       0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
+       0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
+       0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
+       0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
+       0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
+       0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
+       // Bytes 2100 - 213f
+       0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
+       0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
+       0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
+       0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
+       0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
+       0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
+       0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
+       0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
+       // Bytes 2140 - 217f
+       0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
+       0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
+       0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
+       0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
+       0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
+       0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
+       0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
+       0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
+       // Bytes 2180 - 21bf
+       0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
+       0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
+       0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
+       0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
+       // Bytes 21c0 - 21ff
+       0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+       // Bytes 2200 - 223f
+       0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
+       0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
+       0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
+       0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
+       // Bytes 2240 - 227f
+       0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
+       0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
+       // Bytes 2280 - 22bf
+       0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
+       0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+       0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
+       0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
+       0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
+       0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
+       0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+       // Bytes 22c0 - 22ff
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
+       0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
+       0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
+       0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
+       0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
+       0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
+       0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
+       0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
+       // Bytes 2300 - 233f
+       0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
+       0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
+       0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
+       // Bytes 2340 - 237f
+       0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
+       0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
+       0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
+       0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
+       0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
+       // Bytes 2380 - 23bf
+       0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
+       0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
+       0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
+       0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
+       // Bytes 23c0 - 23ff
+       0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
+       0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
+       0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
+       0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
+       0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
+       0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
+       0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
+       0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       // Bytes 2400 - 243f
+       0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
+       0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
+       0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
+       0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
+       0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
+       0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
+       0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
+       // Bytes 2440 - 247f
+       0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
+       0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
+       0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
+       0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+       0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
+       0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
+       // Bytes 2480 - 24bf
+       0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
+       0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
+       0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
+       0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
+       0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+       0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
+       0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
+       // Bytes 24c0 - 24ff
+       0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
+       0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
+       0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
+       0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
+       0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
+       0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
+       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
+       0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
+       // Bytes 2500 - 253f
+       0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
+       0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
+       0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
+       0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
+       0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
+       0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
+       0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
+       0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
+       // Bytes 2540 - 257f
+       0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
+       0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
+       0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
+       0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
+       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
+       0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
+       0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
+       0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
+       // Bytes 2580 - 25bf
+       0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
+       0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+       0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
+       0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
+       0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
+       0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
+       0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
+       // Bytes 25c0 - 25ff
+       0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
+       0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
+       0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
+       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
+       0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
+       // Bytes 2600 - 263f
+       0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
+       0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
+       0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+       0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
+       0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
+       0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
+       0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
+       0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
+       // Bytes 2640 - 267f
+       0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
+       0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
+       0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
+       0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
+       0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
+       // Bytes 2680 - 26bf
+       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
+       0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
+       0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
+       0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
+       0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
+       0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
+       0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
+       // Bytes 26c0 - 26ff
+       0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
+       0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
+       0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
+       0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
+       0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
+       0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
+       0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
+       0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,
+       // Bytes 2700 - 273f
+       0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,
+       0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,
+       0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,
+       0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,
+       0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,
+       0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,
+       0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
+       // Bytes 2740 - 277f
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+       0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+       0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,
+       // Bytes 2780 - 27bf
+       0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
+       0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,
+       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,
+       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,
+       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+       0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,
+       0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,
+       0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,
+       // Bytes 27c0 - 27ff
+       0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,
+       0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,
+       0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,
+       0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,
+       0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,
+       0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,
+       0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,
+       // Bytes 2800 - 283f
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,
+       0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
+       0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,
+       0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,
+       0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,
+       // Bytes 2840 - 287f
+       0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,
+       0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,
+       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,
+       0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+       0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+       0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,
+       // Bytes 2880 - 28bf
+       0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,
+       0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,
+       0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,
+       0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,
+       // Bytes 28c0 - 28ff
+       0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,
+       0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,
+       0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,
+       0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,
+       0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,
+       // Bytes 2900 - 293f
+       0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,
+       0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,
+       0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,
+       // Bytes 2940 - 297f
+       0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
+       0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,
+       0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,
+       0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,
+       0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,
+       // Bytes 2980 - 29bf
+       0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,
+       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,
+       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+       0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,
+       0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
+       0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,
+       0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,
+       // Bytes 29c0 - 29ff
+       0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,
+       0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,
+       0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,
+       0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,
+       // Bytes 2a00 - 2a3f
+       0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,
+       0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,
+       0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,
+       0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,
+       0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2a40 - 2a7f
+       0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,
+       0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,
+       0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,
+       // Bytes 2a80 - 2abf
+       0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,
+       0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,
+       0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,
+       0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,
+       0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,
+       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,
+       0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
+       // Bytes 2ac0 - 2aff
+       0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+       0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
+       0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,
+       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,
+       0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,
+       0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,
+       0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,
+       // Bytes 2b00 - 2b3f
+       0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,
+       0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+       0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,
+       // Bytes 2b40 - 2b7f
+       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,
+       0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,
+       // Bytes 2b80 - 2bbf
+       0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,
+       0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,
+       0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,
+       0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,
+       // Bytes 2bc0 - 2bff
+       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,
+       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,
+       0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,
+       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+       // Bytes 2c00 - 2c3f
+       0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,
+       0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,
+       0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,
+       0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,
+       0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,
+       0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,
+       0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
+       0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,
+       // Bytes 2c40 - 2c7f
+       0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,
+       0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,
+       0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
+       0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,
+       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,
+       0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,
+       0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,
+       // Bytes 2c80 - 2cbf
+       0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,
+       0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,
+       0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,
+       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,
+       0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,
+       0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2cc0 - 2cff
+       0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,
+       0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+       0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+       0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+       0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,
+       // Bytes 2d00 - 2d3f
+       0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,
+       0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+       0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,
+       0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,
+       0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       // Bytes 2d40 - 2d7f
+       0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+       0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,
+       // Bytes 2d80 - 2dbf
+       0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,
+       0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,
+       0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,
+       0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,
+       0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,
+       0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,
+       0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,
+       0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,
+       // Bytes 2dc0 - 2dff
+       0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,
+       0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,
+       0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,
+       0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,
+       0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,
+       0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,
+       0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,
+       0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,
+       // Bytes 2e00 - 2e3f
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,
+       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e40 - 2e7f
+       0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,
+       0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,
+       // Bytes 2e80 - 2ebf
+       0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,
+       0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,
+       0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,
+       0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,
+       0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,
+       0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
+       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,
+       0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+       // Bytes 2ec0 - 2eff
+       0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,
+       0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,
+       0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,
+       0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,
+       0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,
+       0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
+       0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,
+       0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,
+       // Bytes 2f00 - 2f3f
+       0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,
+       0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+       0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,
+       0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+       0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,
+       0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
+       0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,
+       // Bytes 2f40 - 2f7f
+       0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
+       0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,
+       0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,
+       0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,
+       0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,
+       0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,
+       0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,
+       // Bytes 2f80 - 2fbf
+       0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,
+       0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,
+       0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,
+       0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,
+       0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,
+       0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,
+       0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,
+       0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,
+       // Bytes 2fc0 - 2fff
+       0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,
+       0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,
+       0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,
+       0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,
+       0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,
+       0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,
+       0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,
+       0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,
+       // Bytes 3000 - 303f
+       0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,
+       0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,
+       0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,
+       0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,
+       0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,
+       0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,
+       0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,
+       0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,
+       // Bytes 3040 - 307f
+       0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,
+       0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,
+       0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,
+       0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,
+       0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,
+       0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,
+       0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,
+       0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,
+       // Bytes 3080 - 30bf
+       0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,
+       0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,
+       0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,
+       0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,
+       0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,
+       0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,
+       0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,
+       0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,
+       // Bytes 30c0 - 30ff
+       0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,
+       0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,
+       0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,
+       0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,
+       0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,
+       0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,
+       0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,
+       // Bytes 3100 - 313f
+       0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,
+       0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,
+       0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,
+       0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,
+       0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,
+       0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,
+       0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,
+       0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,
+       // Bytes 3140 - 317f
+       0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,
+       0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,
+       0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,
+       0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,
+       0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,
+       0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,
+       0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,
+       0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,
+       // Bytes 3180 - 31bf
+       0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,
+       0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,
+       0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,
+       0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,
+       0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,
+       0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,
+       0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,
+       0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,
+       // Bytes 31c0 - 31ff
+       0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,
+       0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,
+       0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,
+       0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,
+       0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,
+       0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,
+       0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,
+       0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,
+       // Bytes 3200 - 323f
+       0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,
+       0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,
+       0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,
+       0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,
+       0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,
+       0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,
+       0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,
+       0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,
+       // Bytes 3240 - 327f
+       0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,
+       0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,
+       0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,
+       0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,
+       0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,
+       0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,
+       0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,
+       // Bytes 3280 - 32bf
+       0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,
+       0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,
+       0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,
+       0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,
+       0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,
+       0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,
+       0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,
+       0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,
+       // Bytes 32c0 - 32ff
+       0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,
+       0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,
+       0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,
+       0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,
+       0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,
+       0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,
+       0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,
+       0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,
+       // Bytes 3300 - 333f
+       0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,
+       0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,
+       0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,
+       0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,
+       0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,
+       0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,
+       0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,
+       0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,
+       // Bytes 3340 - 337f
+       0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,
+       0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,
+       0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,
+       0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,
+       0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,
+       0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,
+       0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,
+       0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,
+       // Bytes 3380 - 33bf
+       0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,
+       0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,
+       0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,
+       0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,
+       0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,
+       0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,
+       0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,
+       0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,
+       // Bytes 33c0 - 33ff
+       0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,
+       0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,
+       0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,
+       0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,
+       0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,
+       0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,
+       0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,
+       // Bytes 3400 - 343f
+       0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,
+       0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,
+       0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,
+       0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,
+       0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,
+       0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,
+       0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,
+       0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,
+       // Bytes 3440 - 347f
+       0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,
+       0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,
+       0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,
+       0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,
+       0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,
+       0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,
+       0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,
+       0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,
+       // Bytes 3480 - 34bf
+       0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,
+       0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,
+       0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,
+       0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,
+       0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,
+       0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,
+       0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,
+       0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,
+       // Bytes 34c0 - 34ff
+       0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,
+       0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,
+       0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,
+       0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,
+       0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,
+       0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,
+       0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,
+       0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,
+       // Bytes 3500 - 353f
+       0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,
+       0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,
+       0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,
+       0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,
+       0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,
+       0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,
+       0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,
+       0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,
+       // Bytes 3540 - 357f
+       0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,
+       0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,
+       0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,
+       0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,
+       0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,
+       0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,
+       0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,
+       0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,
+       // Bytes 3580 - 35bf
+       0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,
+       0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,
+       0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,
+       0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,
+       0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,
+       0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,
+       0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,
+       0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,
+       // Bytes 35c0 - 35ff
+       0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,
+       0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,
+       0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,
+       0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,
+       0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,
+       // Bytes 3600 - 363f
+       0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,
+       0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,
+       // Bytes 3640 - 367f
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,
+       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,
+       0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,
+       0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,
+       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,
+       0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,
+       // Bytes 3680 - 36bf
+       0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,
+       0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,
+       0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,
+       0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,
+       0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,
+       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,
+       // Bytes 36c0 - 36ff
+       0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,
+       0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,
+       0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,
+       0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,
+       0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,
+       0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,
+       0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,
+       0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,
+       // Bytes 3700 - 373f
+       0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,
+       0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3740 - 377f
+       0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,
+       0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,
+       0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,
+       0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,
+       0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,
+       // Bytes 3780 - 37bf
+       0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,
+       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,
+       0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,
+       0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,
+       // Bytes 37c0 - 37ff
+       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,
+       0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,
+       0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,
+       0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,
+       0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,
+       0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,
+       0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,
+       // Bytes 3800 - 383f
+       0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,
+       0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,
+       0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,
+       0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,
+       0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,
+       0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,
+       0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,
+       0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,
+       // Bytes 3840 - 387f
+       0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,
+       0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,
+       0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,
+       0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,
+       0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,
+       0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,
+       0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       // Bytes 3880 - 38bf
+       0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,
+       0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,
+       0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,
+       0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,
+       0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,
+       0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,
+       0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,
+       // Bytes 38c0 - 38ff
+       0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,
+       0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,
+       0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,
+       0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,
+       0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,
+       0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,
+       0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,
+       0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,
+       // Bytes 3900 - 393f
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,
+       0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,
+       0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,
+       0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+       0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+       0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,
+       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,
+       0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,
+       // Bytes 3940 - 397f
+       0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,
+       0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,
+       0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,
+       0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,
+       0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,
+       0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,
+       0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
+       // Bytes 3980 - 39bf
+       0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,
+       0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,
+       0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,
+       0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,
+       0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,
+       0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,
+       0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,
+       0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,
+       // Bytes 39c0 - 39ff
+       0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,
+       0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,
+       0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,
+       0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       // Bytes 3a00 - 3a3f
+       0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,
+       0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,
+       0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,
+       0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,
+       0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+       // Bytes 3a40 - 3a7f
+       0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,
+       0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,
+       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,
+       0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,
+       0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,
+       0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,
+       0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,
+       0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,
+       // Bytes 3a80 - 3abf
+       0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,
+       0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,
+       0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,
+       0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,
+       0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,
+       0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+       0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,
+       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,
+       // Bytes 3ac0 - 3aff
+       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
+       0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,
+       0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,
+       0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,
+       0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,
+       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,
+       // Bytes 3b00 - 3b3f
+       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
+       0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,
+       0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+       0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,
+       0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,
+       0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,
+       0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,
+       0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,
+       // Bytes 3b40 - 3b7f
+       0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,
+       0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,
+       0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,
+       0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,
+       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,
+       0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,
+       0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
+       0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,
+       // Bytes 3b80 - 3bbf
+       0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,
+       0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,
+       0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,
+       0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,
+       0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,
+       0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,
+       0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,
+       0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,
+       // Bytes 3bc0 - 3bff
+       0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
+       0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,
+       // Bytes 3c00 - 3c3f
+       0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       // Bytes 3c40 - 3c7f
+       0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+       0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       // Bytes 3c80 - 3cbf
+       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,
+       0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,
+       0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+       0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+       0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,
+       // Bytes 3cc0 - 3cff
+       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,
+       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,
+       0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,
+       0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       // Bytes 3d00 - 3d3f
+       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3d40 - 3d7f
+       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       // Bytes 3d80 - 3dbf
+       0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       // Bytes 3dc0 - 3dff
+       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       // Bytes 3e00 - 3e3f
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       // Bytes 3e40 - 3e7f
+       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+       // Bytes 3e80 - 3ebf
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+       0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+       // Bytes 3ec0 - 3eff
+       0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+       0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+       0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,
+       0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,
+       0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,
+       // Bytes 3f00 - 3f3f
+       0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f40 - 3f7f
+       0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 3f80 - 3fbf
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,
+       // Bytes 3fc0 - 3fff
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4000 - 403f
+       0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4040 - 407f
+       0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 4080 - 40bf
+       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,
+       0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+       // Bytes 40c0 - 40ff
+       0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+       0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+       0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       // Bytes 4100 - 413f
+       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       // Bytes 4140 - 417f
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,
+       // Bytes 4180 - 41bf
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       // Bytes 41c0 - 41ff
+       0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,
+       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,
+       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+       0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,
+       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       // Bytes 4200 - 423f
+       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+       0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+       0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,
+       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+       0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,
+       // Bytes 4240 - 427f
+       0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,
+       0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,
+       0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,
+       0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,
+       0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,
+       0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,
+       0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,
+       0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,
+       // Bytes 4280 - 42bf
+       0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,
+       0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,
+       0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,
+       0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,
+       0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,
+       0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,
+       0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,
+       0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,
+       // Bytes 42c0 - 42ff
+       0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,
+       0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,
+       0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,
+       0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,
+       0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,
+       0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,
+       0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,
+       // Bytes 4300 - 433f
+       0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,
+       0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,
+       0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,
+       0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+       0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,
+       // Bytes 4340 - 437f
+       0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,
+       0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,
+       0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,
+       // Bytes 4380 - 43bf
+       0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,
+       0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+       0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,
+       // Bytes 43c0 - 43ff
+       0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,
+       0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+       0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,
+       0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,
+       0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,
+       0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,
+       // Bytes 4400 - 443f
+       0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,
+       0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,
+       0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,
+       0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+       0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,
+       0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,
+       0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,
+       0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,
+       // Bytes 4440 - 447f
+       0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,
+       0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,
+       0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,
+       0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,
+       0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,
+       0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,
+       0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,
+       0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,
+       // Bytes 4480 - 44bf
+       0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,
+       0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+       0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,
+       0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,
+       0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,
+       0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,
+       0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,
+       0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,
+       // Bytes 44c0 - 44ff
+       0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,
+       0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,
+       0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,
+       0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,
+       0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,
+       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,
+       0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,
+       // Bytes 4500 - 453f
+       0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,
+       0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+       0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,
+       // Bytes 4540 - 457f
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,
+       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,
+       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,
+       // Bytes 4580 - 45bf
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,
+       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,
+       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,
+       // Bytes 45c0 - 45ff
+       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,
+       0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,
+       0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,
+       0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,
+       0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,
+       // Bytes 4600 - 463f
+       0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,
+       0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,
+       0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       // Bytes 4640 - 467f
+       0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,
+       0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+       0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,
+       0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+       0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,
+       0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+       0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+       // Bytes 4680 - 46bf
+       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,
+       0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,
+       0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,
+       0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,
+       0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,
+       0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,
+       0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,
+       0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,
+       // Bytes 46c0 - 46ff
+       0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,
+       0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,
+       0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,
+       0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,
+       0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,
+       0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,
+       0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,
+       0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,
+       // Bytes 4700 - 473f
+       0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,
+       0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,
+       0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,
+       0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,
+       0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,
+       0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,
+       0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,
+       0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,
+       // Bytes 4740 - 477f
+       0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,
+       0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,
+       0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,
+       0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,
+       0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,
+       0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,
+       0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,
+       0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,
+       // Bytes 4780 - 47bf
+       0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,
+       0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,
+       0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,
+       0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,
+       0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,
+       0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,
+       // Bytes 47c0 - 47ff
+       0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+       0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,
+       // Bytes 4800 - 483f
+       0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,
+       0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,
+       0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,
+       0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,
+       0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,
+       0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,
+       // Bytes 4840 - 487f
+       0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,
+       0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,
+       0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,
+       0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,
+       0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,
+       0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,
+       0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,
+       // Bytes 4880 - 48bf
+       0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,
+       0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       // Bytes 48c0 - 48ff
+       0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       // Bytes 4900 - 493f
+       0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       // Bytes 4940 - 497f
+       0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+       0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       // Bytes 4980 - 49bf
+       0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,
+       0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,
+       0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,
+       // Bytes 49c0 - 49ff
+       0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,
+       // Bytes 4a00 - 4a3f
+       0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,
+       0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,
+       0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+       0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,
+       // Bytes 4a40 - 4a7f
+       0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,
+       0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,
+       0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,
+       0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,
+       0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,
+       0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,
+       // Bytes 4a80 - 4abf
+       0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,
+       0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,
+       0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,
+       0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,
+       0x01,
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfcValues[c0]
+       }
+       i := nfcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970.
+type nfcTrie struct{}
+
+func newNfcTrie(i int) *nfcTrie {
+       return &nfcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 44:
+               return uint16(nfcValues[n<<6+uint32(b)])
+       default:
+               n -= 44
+               return uint16(nfcSparse.lookup(n, b))
+       }
+}
+
+// nfcValues: 46 blocks, 2944 entries, 5888 bytes
+// The third block is the zero block.
+var nfcValues = [2944]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,
+       // Block 0x5, offset 0x140
+       0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,
+       // Block 0x6, offset 0x180
+       0x184: 0x8100, 0x185: 0x8100,
+       0x186: 0x8100,
+       0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x8100,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x8100, 0x285: 0x35a1,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,
+       0x2c6: 0xa000, 0x2c7: 0x3709,
+       0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,
+       0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
+       0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,
+       0x2de: 0xa000, 0x2e3: 0xa000,
+       0x2e7: 0xa000,
+       0x2eb: 0xa000, 0x2ed: 0xa000,
+       0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
+       0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,
+       0x2fe: 0xa000,
+       // Block 0xc, offset 0x300
+       0x301: 0x3733, 0x302: 0x37b7,
+       0x310: 0x370f, 0x311: 0x3793,
+       0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,
+       0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,
+       0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,
+       0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,
+       0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,
+       0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,
+       0x338: 0x3787, 0x339: 0x380b,
+       // Block 0xd, offset 0x340
+       0x351: 0x812d,
+       0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,
+       0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,
+       0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,
+       0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,
+       0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,
+       0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,
+       0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,
+       0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,
+       // Block 0xe, offset 0x380
+       0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,
+       0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,
+       0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x812d,
+       0x3b0: 0x811e,
+       // Block 0xf, offset 0x3c0
+       0x3c5: 0xa000,
+       0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,
+       0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,
+       0x3d2: 0x2d4e,
+       0x3f4: 0x8102, 0x3f5: 0x9900,
+       0x3fa: 0xa000, 0x3fb: 0x2d56,
+       0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,
+       // Block 0x10, offset 0x400
+       0x400: 0x2f97, 0x401: 0x32a3, 0x402: 0x2fa1, 0x403: 0x32ad, 0x404: 0x2fa6, 0x405: 0x32b2,
+       0x406: 0x2fab, 0x407: 0x32b7, 0x408: 0x38cc, 0x409: 0x3a5b, 0x40a: 0x2fc4, 0x40b: 0x32d0,
+       0x40c: 0x2fce, 0x40d: 0x32da, 0x40e: 0x2fdd, 0x40f: 0x32e9, 0x410: 0x2fd3, 0x411: 0x32df,
+       0x412: 0x2fd8, 0x413: 0x32e4, 0x414: 0x38ef, 0x415: 0x3a7e, 0x416: 0x38f6, 0x417: 0x3a85,
+       0x418: 0x3019, 0x419: 0x3325, 0x41a: 0x301e, 0x41b: 0x332a, 0x41c: 0x3904, 0x41d: 0x3a93,
+       0x41e: 0x3023, 0x41f: 0x332f, 0x420: 0x3032, 0x421: 0x333e, 0x422: 0x3050, 0x423: 0x335c,
+       0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370,
+       0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a,
+       0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de,
+       0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7,
+       0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc,
+       // Block 0x11, offset 0x440
+       0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a,
+       0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e,
+       0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9,
+       0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465,
+       0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26,
+       0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791,
+       0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b,
+       0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4,
+       0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f,
+       0x476: 0x31f4, 0x477: 0x350a, 0x478: 0x39b3, 0x479: 0x3b42, 0x47a: 0x39ba, 0x47b: 0x3b49,
+       0x47c: 0x31fe, 0x47d: 0x3514, 0x47e: 0x3203, 0x47f: 0x3519,
+       // Block 0x12, offset 0x480
+       0x480: 0x3208, 0x481: 0x351e, 0x482: 0x320d, 0x483: 0x3523, 0x484: 0x321c, 0x485: 0x3532,
+       0x486: 0x3217, 0x487: 0x352d, 0x488: 0x3221, 0x489: 0x353c, 0x48a: 0x3226, 0x48b: 0x3541,
+       0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582,
+       0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6,
+       0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1,
+       0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f,
+       0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15,
+       0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23,
+       0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a,
+       0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c,
+       0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70,
+       0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1,
+       0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf,
+       0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6,
+       0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5,
+       0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11,
+       0x4e4: 0x31e5, 0x4e5: 0x34fb, 0x4e6: 0x31c7, 0x4e7: 0x34dd, 0x4e8: 0x39e4, 0x4e9: 0x3b73,
+       0x4ea: 0x39dd, 0x4eb: 0x3b6c, 0x4ec: 0x39f2, 0x4ed: 0x3b81, 0x4ee: 0x39eb, 0x4ef: 0x3b7a,
+       0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578,
+       0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a,
+       // Block 0x14, offset 0x500
+       0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e,
+       0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6,
+       0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c,
+       0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0,
+       0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00,
+       0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966,
+       0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8,
+       0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6,
+       0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38,
+       0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30,
+       0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40,
+       // Block 0x15, offset 0x540
+       0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60,
+       0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58,
+       0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a,
+       0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8,
+       0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70,
+       0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996,
+       0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2,
+       0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916,
+       0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a,
+       0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c,
+       0x57c: 0x4870, 0x57d: 0x4342,
+       // Block 0x16, offset 0x580
+       0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac,
+       0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee,
+       0x58c: 0x40da, 0x58d: 0x40f8, 0x58e: 0x40e4, 0x58f: 0x4102, 0x590: 0x3de8, 0x591: 0x3df0,
+       0x592: 0x41c0, 0x593: 0x41de, 0x594: 0x41ca, 0x595: 0x41e8, 0x596: 0x41d4, 0x597: 0x41f2,
+       0x598: 0x3d08, 0x599: 0x3d10, 0x59a: 0x410c, 0x59b: 0x412a, 0x59c: 0x4116, 0x59d: 0x4134,
+       0x59e: 0x4120, 0x59f: 0x413e, 0x5a0: 0x3ec0, 0x5a1: 0x3ec8, 0x5a2: 0x41fc, 0x5a3: 0x421a,
+       0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88,
+       0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a,
+       0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98,
+       0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee,
+       0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0,
+       0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa,
+       0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af,
+       0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10,
+       0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4,
+       0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec,
+       0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b,
+       0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081,
+       0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8,
+       0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318,
+       0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100,
+       // Block 0x18, offset 0x600
+       0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000,
+       0x607: 0x3c14, 0x608: 0xa000, 0x609: 0x3c1b,
+       0x60d: 0xa000,
+       0x620: 0x2f65, 0x621: 0xa000, 0x622: 0x3c29,
+       0x624: 0xa000, 0x625: 0xa000,
+       0x62d: 0x3c22, 0x62e: 0x2f60, 0x62f: 0x2f6a,
+       0x630: 0x3c30, 0x631: 0x3c37, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3e, 0x635: 0x3c45,
+       0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c4c, 0x639: 0x3c53, 0x63a: 0xa000, 0x63b: 0xa000,
+       0x63c: 0xa000, 0x63d: 0xa000,
+       // Block 0x19, offset 0x640
+       0x640: 0x3c5a, 0x641: 0x3c61, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c76, 0x645: 0x3c7d,
+       0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c84, 0x649: 0x3c8b,
+       0x651: 0xa000,
+       0x652: 0xa000,
+       0x662: 0xa000,
+       0x668: 0xa000, 0x669: 0xa000,
+       0x66b: 0xa000, 0x66c: 0x3ca0, 0x66d: 0x3ca7, 0x66e: 0x3cae, 0x66f: 0x3cb5,
+       0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000,
+       // Block 0x1a, offset 0x680
+       0x686: 0xa000, 0x68b: 0xa000,
+       0x68c: 0x3f08, 0x68d: 0xa000, 0x68e: 0x3f10, 0x68f: 0xa000, 0x690: 0x3f18, 0x691: 0xa000,
+       0x692: 0x3f20, 0x693: 0xa000, 0x694: 0x3f28, 0x695: 0xa000, 0x696: 0x3f30, 0x697: 0xa000,
+       0x698: 0x3f38, 0x699: 0xa000, 0x69a: 0x3f40, 0x69b: 0xa000, 0x69c: 0x3f48, 0x69d: 0xa000,
+       0x69e: 0x3f50, 0x69f: 0xa000, 0x6a0: 0x3f58, 0x6a1: 0xa000, 0x6a2: 0x3f60,
+       0x6a4: 0xa000, 0x6a5: 0x3f68, 0x6a6: 0xa000, 0x6a7: 0x3f70, 0x6a8: 0xa000, 0x6a9: 0x3f78,
+       0x6af: 0xa000,
+       0x6b0: 0x3f80, 0x6b1: 0x3f88, 0x6b2: 0xa000, 0x6b3: 0x3f90, 0x6b4: 0x3f98, 0x6b5: 0xa000,
+       0x6b6: 0x3fa0, 0x6b7: 0x3fa8, 0x6b8: 0xa000, 0x6b9: 0x3fb0, 0x6ba: 0x3fb8, 0x6bb: 0xa000,
+       0x6bc: 0x3fc0, 0x6bd: 0x3fc8,
+       // Block 0x1b, offset 0x6c0
+       0x6d4: 0x3f00,
+       0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000,
+       0x6de: 0x3fd0,
+       0x6e6: 0xa000,
+       0x6eb: 0xa000, 0x6ec: 0x3fe0, 0x6ed: 0xa000, 0x6ee: 0x3fe8, 0x6ef: 0xa000,
+       0x6f0: 0x3ff0, 0x6f1: 0xa000, 0x6f2: 0x3ff8, 0x6f3: 0xa000, 0x6f4: 0x4000, 0x6f5: 0xa000,
+       0x6f6: 0x4008, 0x6f7: 0xa000, 0x6f8: 0x4010, 0x6f9: 0xa000, 0x6fa: 0x4018, 0x6fb: 0xa000,
+       0x6fc: 0x4020, 0x6fd: 0xa000, 0x6fe: 0x4028, 0x6ff: 0xa000,
+       // Block 0x1c, offset 0x700
+       0x700: 0x4030, 0x701: 0xa000, 0x702: 0x4038, 0x704: 0xa000, 0x705: 0x4040,
+       0x706: 0xa000, 0x707: 0x4048, 0x708: 0xa000, 0x709: 0x4050,
+       0x70f: 0xa000, 0x710: 0x4058, 0x711: 0x4060,
+       0x712: 0xa000, 0x713: 0x4068, 0x714: 0x4070, 0x715: 0xa000, 0x716: 0x4078, 0x717: 0x4080,
+       0x718: 0xa000, 0x719: 0x4088, 0x71a: 0x4090, 0x71b: 0xa000, 0x71c: 0x4098, 0x71d: 0x40a0,
+       0x72f: 0xa000,
+       0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd8,
+       0x737: 0x40a8, 0x738: 0x40b0, 0x739: 0x40b8, 0x73a: 0x40c0,
+       0x73d: 0xa000, 0x73e: 0x40c8,
+       // Block 0x1d, offset 0x740
+       0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb,
+       0x746: 0x08df, 0x747: 0x162b, 0x748: 0x162b, 0x749: 0x0a0b, 0x74a: 0x145f, 0x74b: 0x0943,
+       0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3,
+       0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43,
+       0x758: 0x125f, 0x759: 0x1447, 0x75a: 0x1573, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87,
+       0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15c3, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283,
+       0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f,
+       0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853,
+       0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b,
+       0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14ef, 0x779: 0x15a3, 0x77a: 0x15bf, 0x77b: 0x102b,
+       0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x147b,
+       // Block 0x1e, offset 0x780
+       0x780: 0x15cb, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b,
+       0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e7, 0x78a: 0x09c3, 0x78b: 0x0a8f,
+       0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a7,
+       0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127,
+       0x798: 0x125b, 0x799: 0x14af, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357,
+       0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873,
+       0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3,
+       0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b,
+       0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57,
+       0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb,
+       0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x145b, 0x7bf: 0x085b,
+       // Block 0x1f, offset 0x7c0
+       0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f,
+       0x7c6: 0x1497, 0x7c7: 0x157b, 0x7c8: 0x15cf, 0x7c9: 0x15e7, 0x7ca: 0x0837, 0x7cb: 0x0cf3,
+       0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83,
+       0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193,
+       0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147f, 0x7dc: 0x080f, 0x7dd: 0x083b,
+       0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b,
+       0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f,
+       0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b,
+       0x7f0: 0x118b, 0x7f1: 0x1463, 0x7f2: 0x14e3, 0x7f3: 0x14f3, 0x7f4: 0x152f, 0x7f5: 0x0753,
+       0x7f6: 0x107f, 0x7f7: 0x144f, 0x7f8: 0x14cb, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777,
+       0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73,
+       // Block 0x20, offset 0x800
+       0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x1623, 0x805: 0x0ce3,
+       0x806: 0x14a3, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47,
+       0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x153b, 0x811: 0x07af,
+       0x812: 0x0c03, 0x813: 0x14b3, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df,
+       0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14bb, 0x81d: 0x0817,
+       0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3,
+       0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1457,
+       0x82a: 0x14d7, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b,
+       0x830: 0x1287, 0x831: 0x14bf, 0x832: 0x15ab, 0x833: 0x15d3, 0x834: 0x0d37, 0x835: 0x0e27,
+       0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f,
+       0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b,
+       // Block 0x21, offset 0x840
+       0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03,
+       0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14ab, 0x84a: 0x1323, 0x84b: 0x0b27,
+       0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af,
+       0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3,
+       0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14fb, 0x85d: 0x10eb,
+       0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353,
+       0x865: 0x1407, 0x866: 0x1433,
+       0x86a: 0x154f, 0x86b: 0x1553, 0x86c: 0x1557, 0x86d: 0x15bb, 0x86e: 0x142b, 0x86f: 0x14c7,
+       0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897,
+       0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93,
+       0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3,
+       // Block 0x22, offset 0x880
+       0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b,
+       0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f,
+       0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f,
+       0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f,
+       0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff,
+       0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f,
+       0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14db, 0x8a9: 0x151f,
+       0x8aa: 0x1537, 0x8ab: 0x0b9b, 0x8ac: 0x171e, 0x8ad: 0x11e3,
+       0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7,
+       0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963,
+       0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b,
+       0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb,
+       0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf,
+       0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f,
+       0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013,
+       0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f,
+       0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b,
+       0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b,
+       0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb,
+       0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343,
+       0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f,
+       // Block 0x24, offset 0x900
+       0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x144b, 0x905: 0x146b,
+       0x906: 0x14b7, 0x907: 0x14db, 0x908: 0x14fb, 0x909: 0x150f, 0x90a: 0x151f, 0x90b: 0x152b,
+       0x90c: 0x1537, 0x90d: 0x158b, 0x90e: 0x162b, 0x90f: 0x16b5, 0x910: 0x16b0, 0x911: 0x16e2,
+       0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1764, 0x916: 0x1791, 0x917: 0x1809,
+       0x918: 0x1617, 0x919: 0x1627,
+       // Block 0x25, offset 0x940
+       0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1647, 0x944: 0x0747, 0x945: 0x0757,
+       0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773,
+       0x94c: 0x05b3, 0x94d: 0x165b, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3,
+       0x952: 0x164c, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1656, 0x957: 0x07cf,
+       0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x1831, 0x95d: 0x07ff,
+       0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f,
+       0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867,
+       0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af,
+       0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x166a, 0x975: 0x0e93,
+       0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166f, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3,
+       0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917,
+       // Block 0x26, offset 0x980
+       0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f,
+       0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983,
+       0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf,
+       0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3,
+       0x998: 0x09bb, 0x999: 0x1674, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef,
+       0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1679, 0x9a1: 0x167e, 0x9a2: 0x0a1f, 0x9a3: 0x0a23,
+       0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37,
+       0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x1683, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63,
+       0x9b0: 0x0a6b, 0x9b1: 0x1688, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f,
+       0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x1692,
+       0x9bc: 0x0aaf, 0x9bd: 0x1697, 0x9be: 0x0abb, 0x9bf: 0x0ab7,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb,
+       0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x169c, 0x9ca: 0x05db, 0x9cb: 0x0b0f,
+       0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x1863, 0x9d0: 0x0b37, 0x9d1: 0x16a6,
+       0x9d2: 0x16a6, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c9,
+       0x9d8: 0x179b, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83,
+       0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3,
+       0x9e4: 0x16ab, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf,
+       0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7,
+       0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f,
+       0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16ba, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b,
+       0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bf, 0x9ff: 0x0c6f,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87,
+       0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c4, 0xa0b: 0x0ccb,
+       0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7,
+       0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663,
+       0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16dd,
+       0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e7,
+       0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b,
+       0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16ec, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f,
+       0xa30: 0x16f1, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7,
+       0xa36: 0x0dbb, 0xa37: 0x16f6, 0xa38: 0x168d, 0xa39: 0x16fb, 0xa3a: 0x0ddb, 0xa3b: 0x1700,
+       0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23,
+       0xa46: 0x1705, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53,
+       0xa4c: 0x0e4f, 0xa4d: 0x170a, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170f, 0xa51: 0x1714,
+       0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b,
+       0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x1651, 0xa5c: 0x0eb3, 0xa5d: 0x1719,
+       0xa5e: 0x0ebf, 0xa5f: 0x1723, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1728,
+       0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x172d, 0xa67: 0x1732, 0xa68: 0x0f27, 0xa69: 0x0f37,
+       0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57,
+       0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1737,
+       0xa76: 0x0fa3, 0xa77: 0x173c, 0xa78: 0x0faf, 0xa79: 0x16a1, 0xa7a: 0x0fbf, 0xa7b: 0x1741,
+       0xa7c: 0x1746, 0xa7d: 0x174b, 0xa7e: 0x0627, 0xa7f: 0x062b,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x0ff7, 0xa81: 0x1755, 0xa82: 0x1750, 0xa83: 0x175a, 0xa84: 0x175f, 0xa85: 0x0fff,
+       0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637,
+       0xa8c: 0x063b, 0xa8d: 0x1769, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f,
+       0xa92: 0x176e, 0xa93: 0x105b, 0xa94: 0x1773, 0xa95: 0x1778, 0xa96: 0x107b, 0xa97: 0x1093,
+       0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x177d, 0xa9d: 0x1782,
+       0xa9e: 0x1782, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1787, 0xaa2: 0x10cf, 0xaa3: 0x10d3,
+       0xaa4: 0x064b, 0xaa5: 0x178c, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7,
+       0xaaa: 0x1107, 0xaab: 0x1796, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133,
+       0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x17a0, 0xab3: 0x17a5, 0xab4: 0x065b, 0xab5: 0x17aa,
+       0xab6: 0x115b, 0xab7: 0x17af, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b4,
+       0xabc: 0x17b9, 0xabd: 0x118f, 0xabe: 0x17be, 0xabf: 0x1197,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x16ce, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7,
+       0xac6: 0x0a33, 0xac7: 0x17c3, 0xac8: 0x17c8, 0xac9: 0x16d3, 0xaca: 0x16d8, 0xacb: 0x11d7,
+       0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b,
+       0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17cd,
+       0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f,
+       0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f,
+       0xae4: 0x17d2, 0xae5: 0x17dc, 0xae6: 0x17d7, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273,
+       0xaea: 0x127b, 0xaeb: 0x17f0, 0xaec: 0x127f, 0xaed: 0x17e1, 0xaee: 0x0673, 0xaef: 0x0677,
+       0xaf0: 0x17e6, 0xaf1: 0x17eb, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7,
+       0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb,
+       0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f5,
+       0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17fa,
+       0xb0c: 0x17ff, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b,
+       0xb12: 0x137b, 0xb13: 0x1804, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7,
+       0xb18: 0x180e, 0xb19: 0x1660, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1665,
+       0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x1813, 0xb21: 0x1818, 0xb22: 0x1423, 0xb23: 0x142f,
+       0xb24: 0x1437, 0xb25: 0x181d, 0xb26: 0x143b, 0xb27: 0x1467, 0xb28: 0x1473, 0xb29: 0x1477,
+       0xb2a: 0x146f, 0xb2b: 0x1483, 0xb2c: 0x1487, 0xb2d: 0x1822, 0xb2e: 0x1493, 0xb2f: 0x0693,
+       0xb30: 0x149b, 0xb31: 0x1827, 0xb32: 0x0697, 0xb33: 0x14d3, 0xb34: 0x0ac3, 0xb35: 0x14eb,
+       0xb36: 0x182c, 0xb37: 0x1836, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x1513, 0xb3b: 0x183b,
+       0xb3c: 0x06a3, 0xb3d: 0x1840, 0xb3e: 0x152b, 0xb3f: 0x152b,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x1533, 0xb41: 0x1845, 0xb42: 0x154b, 0xb43: 0x06a7, 0xb44: 0x155b, 0xb45: 0x1567,
+       0xb46: 0x156f, 0xb47: 0x1577, 0xb48: 0x06ab, 0xb49: 0x184a, 0xb4a: 0x158b, 0xb4b: 0x15a7,
+       0xb4c: 0x15b3, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b7, 0xb50: 0x184f, 0xb51: 0x06b7,
+       0xb52: 0x1854, 0xb53: 0x1859, 0xb54: 0x185e, 0xb55: 0x15db, 0xb56: 0x06bb, 0xb57: 0x15ef,
+       0xb58: 0x15f7, 0xb59: 0x15fb, 0xb5a: 0x1603, 0xb5b: 0x160b, 0xb5c: 0x1613, 0xb5d: 0x1868,
+}
+
+// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30,
+       0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33,
+       0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f,
+       0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46,
+       0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c,
+       0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54,
+       // Block 0x5, offset 0x140
+       0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a,
+       0x14d: 0x5b,
+       0x15c: 0x5c, 0x15f: 0x5d,
+       0x162: 0x5e, 0x164: 0x5f,
+       0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65,
+       0x170: 0x66, 0x173: 0x67, 0x177: 0x68,
+       0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15,
+       // Block 0x6, offset 0x180
+       0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,
+       0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70,
+       0x1ab: 0x71,
+       0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77,
+       0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,
+       // Block 0x8, offset 0x200
+       0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,
+       0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,
+       0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,
+       0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,
+       0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,
+       // Block 0x9, offset 0x240
+       0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,
+       0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,
+       0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,
+       0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,
+       0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,
+       0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,
+       0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,
+       0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,
+       // Block 0xa, offset 0x280
+       0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,
+       0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,
+       0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,
+       0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,
+       0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,
+       0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,
+       0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,
+       0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,
+       0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,
+       0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,
+       0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,
+       // Block 0xc, offset 0x300
+       0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e,
+       0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,
+       0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,
+       0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,
+       // Block 0xd, offset 0x340
+       0x347: 0x9c,
+       0x34b: 0x9d, 0x34d: 0x9e,
+       0x368: 0x9f, 0x36b: 0xa0,
+       // Block 0xe, offset 0x380
+       0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,
+       0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7,
+       0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,
+       0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,
+       0x3b0: 0x73,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xaf, 0x3ec: 0xb0,
+       // Block 0x10, offset 0x400
+       0x432: 0xb1,
+       // Block 0x11, offset 0x440
+       0x445: 0xb2, 0x446: 0xb3, 0x447: 0xb4,
+       0x449: 0xb5,
+       // Block 0x12, offset 0x480
+       0x480: 0xb6,
+       0x4a3: 0xb7, 0x4a5: 0xb8,
+       // Block 0x13, offset 0x4c0
+       0x4c8: 0xb9,
+       // Block 0x14, offset 0x500
+       0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a,
+       0x528: 0x2b,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfcSparseOffset: 142 entries, 284 bytes
+var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc7, 0xce, 0xd6, 0xd9, 0xdb, 0xdd, 0xdf, 0xe4, 0xf5, 0x101, 0x103, 0x109, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x118, 0x11b, 0x11d, 0x120, 0x123, 0x127, 0x12c, 0x135, 0x137, 0x13a, 0x13c, 0x147, 0x157, 0x15b, 0x169, 0x16c, 0x172, 0x178, 0x183, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x191, 0x197, 0x19b, 0x19d, 0x19f, 0x1a7, 0x1ab, 0x1ae, 0x1b0, 0x1b2, 0x1b4, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1bf, 0x1c5, 0x1c8, 0x1ca, 0x1d1, 0x1d7, 0x1dd, 0x1e5, 0x1eb, 0x1f1, 0x1f7, 0x1fb, 0x209, 0x212, 0x215, 0x218, 0x21a, 0x21d, 0x21f, 0x223, 0x228, 0x22a, 0x22c, 0x231, 0x237, 0x239, 0x23b, 0x23d, 0x243, 0x246, 0x249, 0x251, 0x258, 0x25b, 0x25e, 0x260, 0x268, 0x26b, 0x272, 0x275, 0x27b, 0x27d, 0x280, 0x282, 0x284, 0x286, 0x288, 0x295, 0x29f, 0x2a1, 0x2a3, 0x2a9, 0x2ab, 0x2ae}
+
+// nfcSparseValues: 688 entries, 2752 bytes
+var nfcSparseValues = [688]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0000, lo: 0x04},
+       {value: 0xa100, lo: 0xa8, hi: 0xa8},
+       {value: 0x8100, lo: 0xaf, hi: 0xaf},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb8, hi: 0xb8},
+       // Block 0x1, offset 0x5
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x9
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       // Block 0x3, offset 0xb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x98, hi: 0x9d},
+       // Block 0x4, offset 0xd
+       {value: 0x0006, lo: 0x0a},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x85, hi: 0x85},
+       {value: 0xa000, lo: 0x89, hi: 0x89},
+       {value: 0x4840, lo: 0x8a, hi: 0x8a},
+       {value: 0x485e, lo: 0x8b, hi: 0x8b},
+       {value: 0x36c7, lo: 0x8c, hi: 0x8c},
+       {value: 0x36df, lo: 0x8d, hi: 0x8d},
+       {value: 0x4876, lo: 0x8e, hi: 0x8e},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x36fd, lo: 0x93, hi: 0x94},
+       // Block 0x5, offset 0x18
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x6, offset 0x28
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x7, offset 0x2a
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x8, offset 0x2f
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x9, offset 0x3a
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0xa, offset 0x49
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xb, offset 0x56
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xc, offset 0x5e
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       // Block 0xd, offset 0x62
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xe, offset 0x67
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xf, offset 0x69
+       {value: 0x0000, lo: 0x10},
+       {value: 0x8132, lo: 0x94, hi: 0xa1},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8132, lo: 0xaa, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xaf},
+       {value: 0x8116, lo: 0xb0, hi: 0xb0},
+       {value: 0x8117, lo: 0xb1, hi: 0xb1},
+       {value: 0x8118, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb5},
+       {value: 0x812d, lo: 0xb6, hi: 0xb6},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x812d, lo: 0xb9, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbf},
+       // Block 0x10, offset 0x7a
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0x11, offset 0x82
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x12, offset 0x89
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x13, offset 0x8c
+       {value: 0x0008, lo: 0x06},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       // Block 0x14, offset 0x93
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x15, offset 0x97
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x16, offset 0x9b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x17, offset 0x9d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x18, offset 0x9f
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x19, offset 0xa8
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1a, offset 0xac
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1b, offset 0xb3
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1c, offset 0xb8
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1d, offset 0xbb
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1e, offset 0xc5
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1f, offset 0xc7
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x20, offset 0xce
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x21, offset 0xd6
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x22, offset 0xd9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x23, offset 0xdb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x24, offset 0xdd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       // Block 0x25, offset 0xdf
+       {value: 0x0000, lo: 0x04},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x26, offset 0xe4
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x8200, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x8200, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x27, offset 0xf5
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x28, offset 0x101
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x29, offset 0x103
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x2a, offset 0x109
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x2b, offset 0x10b
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2c, offset 0x10d
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2d, offset 0x10f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2e, offset 0x111
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2f, offset 0x113
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x30, offset 0x115
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x31, offset 0x118
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x32, offset 0x11b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x33, offset 0x11d
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x34, offset 0x120
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x35, offset 0x123
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x36, offset 0x127
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x37, offset 0x12c
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x38, offset 0x135
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x39, offset 0x137
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x3a, offset 0x13a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3b, offset 0x13c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3c, offset 0x147
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x8132, lo: 0x80, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x82},
+       {value: 0x8132, lo: 0x83, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8a},
+       {value: 0x8132, lo: 0x8b, hi: 0x8c},
+       {value: 0x8135, lo: 0x8d, hi: 0x8d},
+       {value: 0x812a, lo: 0x8e, hi: 0x8e},
+       {value: 0x812d, lo: 0x8f, hi: 0x8f},
+       {value: 0x8129, lo: 0x90, hi: 0x90},
+       {value: 0x8132, lo: 0x91, hi: 0xb5},
+       {value: 0x8132, lo: 0xbb, hi: 0xbb},
+       {value: 0x8134, lo: 0xbc, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       {value: 0x8132, lo: 0xbe, hi: 0xbe},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x157
+       {value: 0x0004, lo: 0x03},
+       {value: 0x0433, lo: 0x80, hi: 0x81},
+       {value: 0x8100, lo: 0x97, hi: 0x97},
+       {value: 0x8100, lo: 0xbe, hi: 0xbe},
+       // Block 0x3e, offset 0x15b
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x3f, offset 0x169
+       {value: 0x427b, lo: 0x02},
+       {value: 0x01b8, lo: 0xa6, hi: 0xa6},
+       {value: 0x0057, lo: 0xaa, hi: 0xab},
+       // Block 0x40, offset 0x16c
+       {value: 0x0007, lo: 0x05},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x41, offset 0x172
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x42, offset 0x178
+       {value: 0x6408, lo: 0x0a},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x43, offset 0x183
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x44, offset 0x187
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x45, offset 0x189
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x46, offset 0x18b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x47, offset 0x18d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x48, offset 0x18f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x49, offset 0x191
+       {value: 0x0000, lo: 0x05},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xaf},
+       // Block 0x4a, offset 0x197
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4a9f, lo: 0xb3, hi: 0xb3},
+       {value: 0x4a9f, lo: 0xb5, hi: 0xb6},
+       {value: 0x4a9f, lo: 0xba, hi: 0xbf},
+       // Block 0x4b, offset 0x19b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x4a9f, lo: 0x8f, hi: 0xa3},
+       // Block 0x4c, offset 0x19d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xae, hi: 0xbe},
+       // Block 0x4d, offset 0x19f
+       {value: 0x0000, lo: 0x07},
+       {value: 0x8100, lo: 0x84, hi: 0x84},
+       {value: 0x8100, lo: 0x87, hi: 0x87},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       {value: 0x8100, lo: 0x9e, hi: 0x9e},
+       {value: 0x8100, lo: 0xa1, hi: 0xa1},
+       {value: 0x8100, lo: 0xb2, hi: 0xb2},
+       {value: 0x8100, lo: 0xbb, hi: 0xbb},
+       // Block 0x4e, offset 0x1a7
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8100, lo: 0x80, hi: 0x80},
+       {value: 0x8100, lo: 0x8b, hi: 0x8b},
+       {value: 0x8100, lo: 0x8e, hi: 0x8e},
+       // Block 0x4f, offset 0x1ab
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x50, offset 0x1ae
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x51, offset 0x1b0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x52, offset 0x1b2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x53, offset 0x1b4
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x54, offset 0x1b7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x55, offset 0x1b9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x56, offset 0x1bb
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x57, offset 0x1bd
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x58, offset 0x1bf
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x59, offset 0x1c5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x5a, offset 0x1c8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x5b, offset 0x1ca
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x5c, offset 0x1d1
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x5d, offset 0x1d7
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x5e, offset 0x1dd
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x5f, offset 0x1e5
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x60, offset 0x1eb
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x61, offset 0x1f1
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x62, offset 0x1f7
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x63, offset 0x1fb
+       {value: 0x0006, lo: 0x0d},
+       {value: 0x4390, lo: 0x9d, hi: 0x9d},
+       {value: 0x8115, lo: 0x9e, hi: 0x9e},
+       {value: 0x4402, lo: 0x9f, hi: 0x9f},
+       {value: 0x43f0, lo: 0xaa, hi: 0xab},
+       {value: 0x44f4, lo: 0xac, hi: 0xac},
+       {value: 0x44fc, lo: 0xad, hi: 0xad},
+       {value: 0x4348, lo: 0xae, hi: 0xb1},
+       {value: 0x4366, lo: 0xb2, hi: 0xb4},
+       {value: 0x437e, lo: 0xb5, hi: 0xb6},
+       {value: 0x438a, lo: 0xb8, hi: 0xb8},
+       {value: 0x4396, lo: 0xb9, hi: 0xbb},
+       {value: 0x43ae, lo: 0xbc, hi: 0xbc},
+       {value: 0x43b4, lo: 0xbe, hi: 0xbe},
+       // Block 0x64, offset 0x209
+       {value: 0x0006, lo: 0x08},
+       {value: 0x43ba, lo: 0x80, hi: 0x81},
+       {value: 0x43c6, lo: 0x83, hi: 0x84},
+       {value: 0x43d8, lo: 0x86, hi: 0x89},
+       {value: 0x43fc, lo: 0x8a, hi: 0x8a},
+       {value: 0x4378, lo: 0x8b, hi: 0x8b},
+       {value: 0x4360, lo: 0x8c, hi: 0x8c},
+       {value: 0x43a8, lo: 0x8d, hi: 0x8d},
+       {value: 0x43d2, lo: 0x8e, hi: 0x8e},
+       // Block 0x65, offset 0x212
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0xa4, hi: 0xa5},
+       {value: 0x8100, lo: 0xb0, hi: 0xb1},
+       // Block 0x66, offset 0x215
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x9b, hi: 0x9d},
+       {value: 0x8200, lo: 0x9e, hi: 0xa3},
+       // Block 0x67, offset 0x218
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x90, hi: 0x90},
+       // Block 0x68, offset 0x21a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8100, lo: 0x99, hi: 0x99},
+       {value: 0x8200, lo: 0xb2, hi: 0xb4},
+       // Block 0x69, offset 0x21d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xbc, hi: 0xbd},
+       // Block 0x6a, offset 0x21f
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xa0, hi: 0xa6},
+       {value: 0x812d, lo: 0xa7, hi: 0xad},
+       {value: 0x8132, lo: 0xae, hi: 0xaf},
+       // Block 0x6b, offset 0x223
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8100, lo: 0x89, hi: 0x8c},
+       {value: 0x8100, lo: 0xb0, hi: 0xb2},
+       {value: 0x8100, lo: 0xb4, hi: 0xb4},
+       {value: 0x8100, lo: 0xb6, hi: 0xbf},
+       // Block 0x6c, offset 0x228
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x81, hi: 0x8c},
+       // Block 0x6d, offset 0x22a
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0xb5, hi: 0xba},
+       // Block 0x6e, offset 0x22c
+       {value: 0x0000, lo: 0x04},
+       {value: 0x4a9f, lo: 0x9e, hi: 0x9f},
+       {value: 0x4a9f, lo: 0xa3, hi: 0xa3},
+       {value: 0x4a9f, lo: 0xa5, hi: 0xa6},
+       {value: 0x4a9f, lo: 0xaa, hi: 0xaf},
+       // Block 0x6f, offset 0x231
+       {value: 0x0000, lo: 0x05},
+       {value: 0x4a9f, lo: 0x82, hi: 0x87},
+       {value: 0x4a9f, lo: 0x8a, hi: 0x8f},
+       {value: 0x4a9f, lo: 0x92, hi: 0x97},
+       {value: 0x4a9f, lo: 0x9a, hi: 0x9c},
+       {value: 0x8100, lo: 0xa3, hi: 0xa3},
+       // Block 0x70, offset 0x237
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x71, offset 0x239
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x72, offset 0x23b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x73, offset 0x23d
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x74, offset 0x243
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x75, offset 0x246
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x76, offset 0x249
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x77, offset 0x251
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x78, offset 0x258
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x79, offset 0x25b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x7a, offset 0x25e
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x7b, offset 0x260
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x7c, offset 0x268
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       // Block 0x7d, offset 0x26b
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x7e, offset 0x272
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x7f, offset 0x275
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x80, offset 0x27b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x81, offset 0x27d
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x82, offset 0x280
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x83, offset 0x282
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x84, offset 0x284
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x85, offset 0x286
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x86, offset 0x288
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x87, offset 0x295
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x88, offset 0x29f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x89, offset 0x2a1
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x8a, offset 0x2a3
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x8b, offset 0x2a9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x8c, offset 0x2ab
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x8d, offset 0x2ae
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8100, lo: 0x93, hi: 0x93},
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
+       c0 := s[0]
+       switch {
+       case c0 < 0x80: // is ASCII
+               return nfkcValues[c0], 1
+       case c0 < 0xC2:
+               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+       case c0 < 0xE0: // 2-byte UTF-8
+               if len(s) < 2 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c1), 2
+       case c0 < 0xF0: // 3-byte UTF-8
+               if len(s) < 3 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c2), 3
+       case c0 < 0xF8: // 4-byte UTF-8
+               if len(s) < 4 {
+                       return 0, 0
+               }
+               i := nfkcIndex[c0]
+               c1 := s[1]
+               if c1 < 0x80 || 0xC0 <= c1 {
+                       return 0, 1 // Illegal UTF-8: not a continuation byte.
+               }
+               o := uint32(i)<<6 + uint32(c1)
+               i = nfkcIndex[o]
+               c2 := s[2]
+               if c2 < 0x80 || 0xC0 <= c2 {
+                       return 0, 2 // Illegal UTF-8: not a continuation byte.
+               }
+               o = uint32(i)<<6 + uint32(c2)
+               i = nfkcIndex[o]
+               c3 := s[3]
+               if c3 < 0x80 || 0xC0 <= c3 {
+                       return 0, 3 // Illegal UTF-8: not a continuation byte.
+               }
+               return t.lookupValue(uint32(i), c3), 4
+       }
+       // Illegal rune
+       return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
+       c0 := s[0]
+       if c0 < 0x80 { // is ASCII
+               return nfkcValues[c0]
+       }
+       i := nfkcIndex[c0]
+       if c0 < 0xE0 { // 2-byte UTF-8
+               return t.lookupValue(uint32(i), s[1])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+       if c0 < 0xF0 { // 3-byte UTF-8
+               return t.lookupValue(uint32(i), s[2])
+       }
+       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+       if c0 < 0xF8 { // 4-byte UTF-8
+               return t.lookupValue(uint32(i), s[3])
+       }
+       return 0
+}
+
+// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46.
+type nfkcTrie struct{}
+
+func newNfkcTrie(i int) *nfkcTrie {
+       return &nfkcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
+       switch {
+       case n < 90:
+               return uint16(nfkcValues[n<<6+uint32(b)])
+       default:
+               n -= 90
+               return uint16(nfkcSparse.lookup(n, b))
+       }
+}
+
+// nfkcValues: 92 blocks, 5888 entries, 11776 bytes
+// The third block is the zero block.
+var nfkcValues = [5888]uint16{
+       // Block 0x0, offset 0x0
+       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+       // Block 0x1, offset 0x40
+       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+       // Block 0x4, offset 0x100
+       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+       0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,
+       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,
+       // Block 0x5, offset 0x140
+       0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,
+       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,
+       // Block 0x6, offset 0x180
+       0x184: 0x2dee, 0x185: 0x2df4,
+       0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,
+       0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+       0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,
+       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+       0x1de: 0x305a, 0x1df: 0x3366,
+       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+       // Block 0x8, offset 0x200
+       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+       // Block 0x9, offset 0x240
+       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+       0x274: 0x0170,
+       0x27a: 0x42a5,
+       0x27e: 0x0037,
+       // Block 0xa, offset 0x280
+       0x284: 0x425a, 0x285: 0x447b,
+       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+       0x295: 0xa000, 0x297: 0xa000,
+       0x299: 0xa000,
+       0x29f: 0xa000, 0x2a1: 0xa000,
+       0x2a5: 0xa000, 0x2a9: 0xa000,
+       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+       0x2b7: 0xa000, 0x2b9: 0xa000,
+       0x2bf: 0xa000,
+       // Block 0xb, offset 0x2c0
+       0x2c1: 0xa000, 0x2c5: 0xa000,
+       0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,
+       0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,
+       0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,
+       0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,
+       0x2f9: 0x01a6,
+       // Block 0xc, offset 0x300
+       0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,
+       0x306: 0xa000, 0x307: 0x3709,
+       0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,
+       0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
+       0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,
+       0x31e: 0xa000, 0x323: 0xa000,
+       0x327: 0xa000,
+       0x32b: 0xa000, 0x32d: 0xa000,
+       0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
+       0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,
+       0x33e: 0xa000,
+       // Block 0xd, offset 0x340
+       0x341: 0x3733, 0x342: 0x37b7,
+       0x350: 0x370f, 0x351: 0x3793,
+       0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,
+       0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,
+       0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,
+       0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,
+       0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,
+       0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,
+       0x378: 0x3787, 0x379: 0x380b,
+       // Block 0xe, offset 0x380
+       0x387: 0x1d61,
+       0x391: 0x812d,
+       0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,
+       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,
+       0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,
+       0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,
+       0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,
+       0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,
+       0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,
+       0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,
+       // Block 0xf, offset 0x3c0
+       0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,
+       0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,
+       0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,
+       0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,
+       0x3de: 0x8132, 0x3df: 0x812d,
+       0x3f0: 0x811e, 0x3f5: 0x1d84,
+       0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,
+       // Block 0x10, offset 0x400
+       0x405: 0xa000,
+       0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,
+       0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,
+       0x412: 0x2d4e,
+       0x434: 0x8102, 0x435: 0x9900,
+       0x43a: 0xa000, 0x43b: 0x2d56,
+       0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,
+       // Block 0x11, offset 0x440
+       0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,
+       0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,
+       0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,
+       0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,
+       0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,
+       0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,
+       0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,
+       0x46a: 0x01fd,
+       0x478: 0x020c,
+       // Block 0x12, offset 0x480
+       0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,
+       0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,
+       0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,
+       0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,
+       0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,
+       0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,
+       0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,
+       // Block 0x13, offset 0x4c0
+       0x4c0: 0x2f97, 0x4c1: 0x32a3, 0x4c2: 0x2fa1, 0x4c3: 0x32ad, 0x4c4: 0x2fa6, 0x4c5: 0x32b2,
+       0x4c6: 0x2fab, 0x4c7: 0x32b7, 0x4c8: 0x38cc, 0x4c9: 0x3a5b, 0x4ca: 0x2fc4, 0x4cb: 0x32d0,
+       0x4cc: 0x2fce, 0x4cd: 0x32da, 0x4ce: 0x2fdd, 0x4cf: 0x32e9, 0x4d0: 0x2fd3, 0x4d1: 0x32df,
+       0x4d2: 0x2fd8, 0x4d3: 0x32e4, 0x4d4: 0x38ef, 0x4d5: 0x3a7e, 0x4d6: 0x38f6, 0x4d7: 0x3a85,
+       0x4d8: 0x3019, 0x4d9: 0x3325, 0x4da: 0x301e, 0x4db: 0x332a, 0x4dc: 0x3904, 0x4dd: 0x3a93,
+       0x4de: 0x3023, 0x4df: 0x332f, 0x4e0: 0x3032, 0x4e1: 0x333e, 0x4e2: 0x3050, 0x4e3: 0x335c,
+       0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370,
+       0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a,
+       0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de,
+       0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7,
+       0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc,
+       // Block 0x14, offset 0x500
+       0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a,
+       0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e,
+       0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9,
+       0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465,
+       0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26,
+       0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791,
+       0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b,
+       0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4,
+       0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f,
+       0x536: 0x31f4, 0x537: 0x350a, 0x538: 0x39b3, 0x539: 0x3b42, 0x53a: 0x39ba, 0x53b: 0x3b49,
+       0x53c: 0x31fe, 0x53d: 0x3514, 0x53e: 0x3203, 0x53f: 0x3519,
+       // Block 0x15, offset 0x540
+       0x540: 0x3208, 0x541: 0x351e, 0x542: 0x320d, 0x543: 0x3523, 0x544: 0x321c, 0x545: 0x3532,
+       0x546: 0x3217, 0x547: 0x352d, 0x548: 0x3221, 0x549: 0x353c, 0x54a: 0x3226, 0x54b: 0x3541,
+       0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582,
+       0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6,
+       0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7,
+       0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f,
+       0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15,
+       0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23,
+       0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a,
+       0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c,
+       0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69,
+       // Block 0x16, offset 0x580
+       0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70,
+       0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1,
+       0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf,
+       0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6,
+       0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5,
+       0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11,
+       0x5a4: 0x31e5, 0x5a5: 0x34fb, 0x5a6: 0x31c7, 0x5a7: 0x34dd, 0x5a8: 0x39e4, 0x5a9: 0x3b73,
+       0x5aa: 0x39dd, 0x5ab: 0x3b6c, 0x5ac: 0x39f2, 0x5ad: 0x3b81, 0x5ae: 0x39eb, 0x5af: 0x3b7a,
+       0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578,
+       0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a,
+       // Block 0x17, offset 0x5c0
+       0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e,
+       0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6,
+       0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c,
+       0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0,
+       0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00,
+       0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966,
+       0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8,
+       0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6,
+       0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38,
+       0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30,
+       0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40,
+       // Block 0x18, offset 0x600
+       0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60,
+       0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58,
+       0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a,
+       0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8,
+       0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70,
+       0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996,
+       0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2,
+       0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916,
+       0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a,
+       0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c,
+       0x63c: 0x4870, 0x63d: 0x4342,
+       // Block 0x19, offset 0x640
+       0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac,
+       0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee,
+       0x64c: 0x40da, 0x64d: 0x40f8, 0x64e: 0x40e4, 0x64f: 0x4102, 0x650: 0x3de8, 0x651: 0x3df0,
+       0x652: 0x41c0, 0x653: 0x41de, 0x654: 0x41ca, 0x655: 0x41e8, 0x656: 0x41d4, 0x657: 0x41f2,
+       0x658: 0x3d08, 0x659: 0x3d10, 0x65a: 0x410c, 0x65b: 0x412a, 0x65c: 0x4116, 0x65d: 0x4134,
+       0x65e: 0x4120, 0x65f: 0x413e, 0x660: 0x3ec0, 0x661: 0x3ec8, 0x662: 0x41fc, 0x663: 0x421a,
+       0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88,
+       0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a,
+       0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98,
+       0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee,
+       0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287,
+       // Block 0x1a, offset 0x680
+       0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0,
+       0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa,
+       0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af,
+       0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10,
+       0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e,
+       0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec,
+       0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b,
+       0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081,
+       0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8,
+       0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318,
+       0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c,
+       // Block 0x1b, offset 0x6c0
+       0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8,
+       0x6c6: 0x1bec, 0x6c7: 0x00e9, 0x6c9: 0x1c58, 0x6ca: 0x008f, 0x6cb: 0x0051,
+       0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053,
+       0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x198d,
+       0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065,
+       0x6e0: 0x199f, 0x6e1: 0x1bc8, 0x6e2: 0x19a8,
+       0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075,
+       0x6ea: 0x0057, 0x6eb: 0x42d2, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b,
+       0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215,
+       0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b98,
+       0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0,
+       // Block 0x1c, offset 0x700
+       0x700: 0x0463, 0x705: 0x0049,
+       0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095,
+       0x710: 0x222e, 0x711: 0x223a,
+       0x712: 0x22ee, 0x713: 0x2216, 0x714: 0x229a, 0x715: 0x2222, 0x716: 0x22a0, 0x717: 0x22b8,
+       0x718: 0x22c4, 0x719: 0x2228, 0x71a: 0x22ca, 0x71b: 0x2234, 0x71c: 0x22be, 0x71d: 0x22d0,
+       0x71e: 0x22d6, 0x71f: 0x1cbc, 0x720: 0x0053, 0x721: 0x195a, 0x722: 0x1ba4, 0x723: 0x1963,
+       0x724: 0x006d, 0x725: 0x19ab, 0x726: 0x1bd0, 0x727: 0x1d48, 0x728: 0x1966, 0x729: 0x0071,
+       0x72a: 0x19b7, 0x72b: 0x1bd4, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b,
+       0x730: 0x0093, 0x731: 0x19e4, 0x732: 0x1c18, 0x733: 0x19ed, 0x734: 0x00ad, 0x735: 0x1a62,
+       0x736: 0x1c4c, 0x737: 0x1d5c, 0x738: 0x19f0, 0x739: 0x00b1, 0x73a: 0x1a65, 0x73b: 0x1c50,
+       0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b,
+       // Block 0x1d, offset 0x740
+       0x741: 0x3c06, 0x743: 0xa000, 0x744: 0x3c0d, 0x745: 0xa000,
+       0x747: 0x3c14, 0x748: 0xa000, 0x749: 0x3c1b,
+       0x74d: 0xa000,
+       0x760: 0x2f65, 0x761: 0xa000, 0x762: 0x3c29,
+       0x764: 0xa000, 0x765: 0xa000,
+       0x76d: 0x3c22, 0x76e: 0x2f60, 0x76f: 0x2f6a,
+       0x770: 0x3c30, 0x771: 0x3c37, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3e, 0x775: 0x3c45,
+       0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c4c, 0x779: 0x3c53, 0x77a: 0xa000, 0x77b: 0xa000,
+       0x77c: 0xa000, 0x77d: 0xa000,
+       // Block 0x1e, offset 0x780
+       0x780: 0x3c5a, 0x781: 0x3c61, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c76, 0x785: 0x3c7d,
+       0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c84, 0x789: 0x3c8b,
+       0x791: 0xa000,
+       0x792: 0xa000,
+       0x7a2: 0xa000,
+       0x7a8: 0xa000, 0x7a9: 0xa000,
+       0x7ab: 0xa000, 0x7ac: 0x3ca0, 0x7ad: 0x3ca7, 0x7ae: 0x3cae, 0x7af: 0x3cb5,
+       0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000,
+       // Block 0x1f, offset 0x7c0
+       0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029,
+       0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x1882,
+       0x7ea: 0x1885, 0x7eb: 0x1888, 0x7ec: 0x188b, 0x7ed: 0x188e, 0x7ee: 0x1891, 0x7ef: 0x1894,
+       0x7f0: 0x1897, 0x7f1: 0x189a, 0x7f2: 0x189d, 0x7f3: 0x18a6, 0x7f4: 0x1a68, 0x7f5: 0x1a6c,
+       0x7f6: 0x1a70, 0x7f7: 0x1a74, 0x7f8: 0x1a78, 0x7f9: 0x1a7c, 0x7fa: 0x1a80, 0x7fb: 0x1a84,
+       0x7fc: 0x1a88, 0x7fd: 0x1c80, 0x7fe: 0x1c85, 0x7ff: 0x1c8a,
+       // Block 0x20, offset 0x800
+       0x800: 0x1c8f, 0x801: 0x1c94, 0x802: 0x1c99, 0x803: 0x1c9e, 0x804: 0x1ca3, 0x805: 0x1ca8,
+       0x806: 0x1cad, 0x807: 0x1cb2, 0x808: 0x187f, 0x809: 0x18a3, 0x80a: 0x18c7, 0x80b: 0x18eb,
+       0x80c: 0x190f, 0x80d: 0x1918, 0x80e: 0x191e, 0x80f: 0x1924, 0x810: 0x192a, 0x811: 0x1b60,
+       0x812: 0x1b64, 0x813: 0x1b68, 0x814: 0x1b6c, 0x815: 0x1b70, 0x816: 0x1b74, 0x817: 0x1b78,
+       0x818: 0x1b7c, 0x819: 0x1b80, 0x81a: 0x1b84, 0x81b: 0x1b88, 0x81c: 0x1af4, 0x81d: 0x1af8,
+       0x81e: 0x1afc, 0x81f: 0x1b00, 0x820: 0x1b04, 0x821: 0x1b08, 0x822: 0x1b0c, 0x823: 0x1b10,
+       0x824: 0x1b14, 0x825: 0x1b18, 0x826: 0x1b1c, 0x827: 0x1b20, 0x828: 0x1b24, 0x829: 0x1b28,
+       0x82a: 0x1b2c, 0x82b: 0x1b30, 0x82c: 0x1b34, 0x82d: 0x1b38, 0x82e: 0x1b3c, 0x82f: 0x1b40,
+       0x830: 0x1b44, 0x831: 0x1b48, 0x832: 0x1b4c, 0x833: 0x1b50, 0x834: 0x1b54, 0x835: 0x1b58,
+       0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d,
+       0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055,
+       // Block 0x21, offset 0x840
+       0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713,
+       0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab,
+       0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803,
+       0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887,
+       0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db,
+       0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb,
+       0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b,
+       0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7,
+       0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33,
+       0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63,
+       0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f,
+       // Block 0x22, offset 0x880
+       0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb,
+       0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b,
+       0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb,
+       0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3,
+       0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f,
+       0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83,
+       0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7,
+       0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f,
+       0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf,
+       0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f,
+       0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187,
+       // Block 0x23, offset 0x8c0
+       0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3,
+       0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb,
+       0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b,
+       0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b,
+       0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf,
+       0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f,
+       0x8e4: 0x1453, 0x8e5: 0x1457, 0x8e6: 0x145f, 0x8e7: 0x148b, 0x8e8: 0x148f, 0x8e9: 0x149f,
+       0x8ea: 0x14c3, 0x8eb: 0x14cf, 0x8ec: 0x14df, 0x8ed: 0x14f7, 0x8ee: 0x14ff, 0x8ef: 0x1503,
+       0x8f0: 0x1507, 0x8f1: 0x150b, 0x8f2: 0x1517, 0x8f3: 0x151b, 0x8f4: 0x1523, 0x8f5: 0x153f,
+       0x8f6: 0x1543, 0x8f7: 0x1547, 0x8f8: 0x155f, 0x8f9: 0x1563, 0x8fa: 0x156b, 0x8fb: 0x157f,
+       0x8fc: 0x1583, 0x8fd: 0x1587, 0x8fe: 0x158f, 0x8ff: 0x1593,
+       // Block 0x24, offset 0x900
+       0x906: 0xa000, 0x90b: 0xa000,
+       0x90c: 0x3f08, 0x90d: 0xa000, 0x90e: 0x3f10, 0x90f: 0xa000, 0x910: 0x3f18, 0x911: 0xa000,
+       0x912: 0x3f20, 0x913: 0xa000, 0x914: 0x3f28, 0x915: 0xa000, 0x916: 0x3f30, 0x917: 0xa000,
+       0x918: 0x3f38, 0x919: 0xa000, 0x91a: 0x3f40, 0x91b: 0xa000, 0x91c: 0x3f48, 0x91d: 0xa000,
+       0x91e: 0x3f50, 0x91f: 0xa000, 0x920: 0x3f58, 0x921: 0xa000, 0x922: 0x3f60,
+       0x924: 0xa000, 0x925: 0x3f68, 0x926: 0xa000, 0x927: 0x3f70, 0x928: 0xa000, 0x929: 0x3f78,
+       0x92f: 0xa000,
+       0x930: 0x3f80, 0x931: 0x3f88, 0x932: 0xa000, 0x933: 0x3f90, 0x934: 0x3f98, 0x935: 0xa000,
+       0x936: 0x3fa0, 0x937: 0x3fa8, 0x938: 0xa000, 0x939: 0x3fb0, 0x93a: 0x3fb8, 0x93b: 0xa000,
+       0x93c: 0x3fc0, 0x93d: 0x3fc8,
+       // Block 0x25, offset 0x940
+       0x954: 0x3f00,
+       0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000,
+       0x95e: 0x3fd0, 0x95f: 0x26b4,
+       0x966: 0xa000,
+       0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000,
+       0x970: 0x3ff0, 0x971: 0xa000, 0x972: 0x3ff8, 0x973: 0xa000, 0x974: 0x4000, 0x975: 0xa000,
+       0x976: 0x4008, 0x977: 0xa000, 0x978: 0x4010, 0x979: 0xa000, 0x97a: 0x4018, 0x97b: 0xa000,
+       0x97c: 0x4020, 0x97d: 0xa000, 0x97e: 0x4028, 0x97f: 0xa000,
+       // Block 0x26, offset 0x980
+       0x980: 0x4030, 0x981: 0xa000, 0x982: 0x4038, 0x984: 0xa000, 0x985: 0x4040,
+       0x986: 0xa000, 0x987: 0x4048, 0x988: 0xa000, 0x989: 0x4050,
+       0x98f: 0xa000, 0x990: 0x4058, 0x991: 0x4060,
+       0x992: 0xa000, 0x993: 0x4068, 0x994: 0x4070, 0x995: 0xa000, 0x996: 0x4078, 0x997: 0x4080,
+       0x998: 0xa000, 0x999: 0x4088, 0x99a: 0x4090, 0x99b: 0xa000, 0x99c: 0x4098, 0x99d: 0x40a0,
+       0x9af: 0xa000,
+       0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd8,
+       0x9b7: 0x40a8, 0x9b8: 0x40b0, 0x9b9: 0x40b8, 0x9ba: 0x40c0,
+       0x9bd: 0xa000, 0x9be: 0x40c8, 0x9bf: 0x26c9,
+       // Block 0x27, offset 0x9c0
+       0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337,
+       0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f,
+       0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9,
+       0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed,
+       0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11,
+       0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35,
+       0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef,
+       0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403,
+       0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383,
+       0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b,
+       0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab,
+       // Block 0x28, offset 0xa00
+       0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb,
+       0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7,
+       0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3,
+       0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7,
+       0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff,
+       0xa1e: 0x098f, 0xa1f: 0x072f,
+       // Block 0x29, offset 0xa40
+       0xa40: 0x2054, 0xa41: 0x205a, 0xa42: 0x2060, 0xa43: 0x2066, 0xa44: 0x206c, 0xa45: 0x2072,
+       0xa46: 0x2078, 0xa47: 0x207e, 0xa48: 0x2084, 0xa49: 0x208a, 0xa4a: 0x2090, 0xa4b: 0x2096,
+       0xa4c: 0x209c, 0xa4d: 0x20a2, 0xa4e: 0x2726, 0xa4f: 0x272f, 0xa50: 0x2738, 0xa51: 0x2741,
+       0xa52: 0x274a, 0xa53: 0x2753, 0xa54: 0x275c, 0xa55: 0x2765, 0xa56: 0x276e, 0xa57: 0x2780,
+       0xa58: 0x2789, 0xa59: 0x2792, 0xa5a: 0x279b, 0xa5b: 0x27a4, 0xa5c: 0x2777, 0xa5d: 0x2bac,
+       0xa5e: 0x2aed, 0xa60: 0x20a8, 0xa61: 0x20c0, 0xa62: 0x20b4, 0xa63: 0x2108,
+       0xa64: 0x20c6, 0xa65: 0x20e4, 0xa66: 0x20ae, 0xa67: 0x20de, 0xa68: 0x20ba, 0xa69: 0x20f0,
+       0xa6a: 0x2120, 0xa6b: 0x213e, 0xa6c: 0x2138, 0xa6d: 0x212c, 0xa6e: 0x217a, 0xa6f: 0x210e,
+       0xa70: 0x211a, 0xa71: 0x2132, 0xa72: 0x2126, 0xa73: 0x2150, 0xa74: 0x20fc, 0xa75: 0x2144,
+       0xa76: 0x216e, 0xa77: 0x2156, 0xa78: 0x20ea, 0xa79: 0x20cc, 0xa7a: 0x2102, 0xa7b: 0x2114,
+       0xa7c: 0x214a, 0xa7d: 0x20d2, 0xa7e: 0x2174, 0xa7f: 0x20f6,
+       // Block 0x2a, offset 0xa80
+       0xa80: 0x215c, 0xa81: 0x20d8, 0xa82: 0x2162, 0xa83: 0x2168, 0xa84: 0x092f, 0xa85: 0x0b03,
+       0xa86: 0x0ca7, 0xa87: 0x10c7,
+       0xa90: 0x1bc4, 0xa91: 0x18a9,
+       0xa92: 0x18ac, 0xa93: 0x18af, 0xa94: 0x18b2, 0xa95: 0x18b5, 0xa96: 0x18b8, 0xa97: 0x18bb,
+       0xa98: 0x18be, 0xa99: 0x18c1, 0xa9a: 0x18ca, 0xa9b: 0x18cd, 0xa9c: 0x18d0, 0xa9d: 0x18d3,
+       0xa9e: 0x18d6, 0xa9f: 0x18d9, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327,
+       0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b,
+       0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e18, 0xaaf: 0x2e20,
+       0xab0: 0x2e28, 0xab1: 0x2e30, 0xab2: 0x2e38, 0xab3: 0x2e40, 0xab4: 0x2e48, 0xab5: 0x2e50,
+       0xab6: 0x2e60, 0xab7: 0x2e68, 0xab8: 0x2e70, 0xab9: 0x2e78, 0xaba: 0x2e80, 0xabb: 0x2e88,
+       0xabc: 0x2ed3, 0xabd: 0x2e9b, 0xabe: 0x2e58,
+       // Block 0x2b, offset 0xac0
+       0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af,
+       0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f,
+       0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145f, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b,
+       0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f,
+       0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f,
+       0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1527, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b,
+       0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f,
+       0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b,
+       0xaf0: 0x09f3, 0xaf1: 0x18dc, 0xaf2: 0x18df, 0xaf3: 0x18e2, 0xaf4: 0x18e5, 0xaf5: 0x18ee,
+       0xaf6: 0x18f1, 0xaf7: 0x18f4, 0xaf8: 0x18f7, 0xaf9: 0x18fa, 0xafa: 0x18fd, 0xafb: 0x1900,
+       0xafc: 0x1903, 0xafd: 0x1906, 0xafe: 0x1909, 0xaff: 0x1912,
+       // Block 0x2c, offset 0xb00
+       0xb00: 0x1cc6, 0xb01: 0x1cd5, 0xb02: 0x1ce4, 0xb03: 0x1cf3, 0xb04: 0x1d02, 0xb05: 0x1d11,
+       0xb06: 0x1d20, 0xb07: 0x1d2f, 0xb08: 0x1d3e, 0xb09: 0x218c, 0xb0a: 0x219e, 0xb0b: 0x21b0,
+       0xb0c: 0x1954, 0xb0d: 0x1c04, 0xb0e: 0x19d2, 0xb0f: 0x1ba8, 0xb10: 0x04cb, 0xb11: 0x04d3,
+       0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7,
+       0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f,
+       0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b,
+       0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543,
+       0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b,
+       0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f,
+       0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597,
+       0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3,
+       // Block 0x2d, offset 0xb40
+       0xb40: 0x2b0c, 0xb41: 0x29a8, 0xb42: 0x2b1c, 0xb43: 0x2880, 0xb44: 0x2ee4, 0xb45: 0x288a,
+       0xb46: 0x2894, 0xb47: 0x2f28, 0xb48: 0x29b5, 0xb49: 0x289e, 0xb4a: 0x28a8, 0xb4b: 0x28b2,
+       0xb4c: 0x29dc, 0xb4d: 0x29e9, 0xb4e: 0x29c2, 0xb4f: 0x29cf, 0xb50: 0x2ea9, 0xb51: 0x29f6,
+       0xb52: 0x2a03, 0xb53: 0x2bbe, 0xb54: 0x26bb, 0xb55: 0x2bd1, 0xb56: 0x2be4, 0xb57: 0x2b2c,
+       0xb58: 0x2a10, 0xb59: 0x2bf7, 0xb5a: 0x2c0a, 0xb5b: 0x2a1d, 0xb5c: 0x28bc, 0xb5d: 0x28c6,
+       0xb5e: 0x2eb7, 0xb5f: 0x2a2a, 0xb60: 0x2b3c, 0xb61: 0x2ef5, 0xb62: 0x28d0, 0xb63: 0x28da,
+       0xb64: 0x2a37, 0xb65: 0x28e4, 0xb66: 0x28ee, 0xb67: 0x26d0, 0xb68: 0x26d7, 0xb69: 0x28f8,
+       0xb6a: 0x2902, 0xb6b: 0x2c1d, 0xb6c: 0x2a44, 0xb6d: 0x2b4c, 0xb6e: 0x2c30, 0xb6f: 0x2a51,
+       0xb70: 0x2916, 0xb71: 0x290c, 0xb72: 0x2f3c, 0xb73: 0x2a5e, 0xb74: 0x2c43, 0xb75: 0x2920,
+       0xb76: 0x2b5c, 0xb77: 0x292a, 0xb78: 0x2a78, 0xb79: 0x2934, 0xb7a: 0x2a85, 0xb7b: 0x2f06,
+       0xb7c: 0x2a6b, 0xb7d: 0x2b6c, 0xb7e: 0x2a92, 0xb7f: 0x26de,
+       // Block 0x2e, offset 0xb80
+       0xb80: 0x2f17, 0xb81: 0x293e, 0xb82: 0x2948, 0xb83: 0x2a9f, 0xb84: 0x2952, 0xb85: 0x295c,
+       0xb86: 0x2966, 0xb87: 0x2b7c, 0xb88: 0x2aac, 0xb89: 0x26e5, 0xb8a: 0x2c56, 0xb8b: 0x2e90,
+       0xb8c: 0x2b8c, 0xb8d: 0x2ab9, 0xb8e: 0x2ec5, 0xb8f: 0x2970, 0xb90: 0x297a, 0xb91: 0x2ac6,
+       0xb92: 0x26ec, 0xb93: 0x2ad3, 0xb94: 0x2b9c, 0xb95: 0x26f3, 0xb96: 0x2c69, 0xb97: 0x2984,
+       0xb98: 0x1cb7, 0xb99: 0x1ccb, 0xb9a: 0x1cda, 0xb9b: 0x1ce9, 0xb9c: 0x1cf8, 0xb9d: 0x1d07,
+       0xb9e: 0x1d16, 0xb9f: 0x1d25, 0xba0: 0x1d34, 0xba1: 0x1d43, 0xba2: 0x2192, 0xba3: 0x21a4,
+       0xba4: 0x21b6, 0xba5: 0x21c2, 0xba6: 0x21ce, 0xba7: 0x21da, 0xba8: 0x21e6, 0xba9: 0x21f2,
+       0xbaa: 0x21fe, 0xbab: 0x220a, 0xbac: 0x2246, 0xbad: 0x2252, 0xbae: 0x225e, 0xbaf: 0x226a,
+       0xbb0: 0x2276, 0xbb1: 0x1c14, 0xbb2: 0x19c6, 0xbb3: 0x1936, 0xbb4: 0x1be4, 0xbb5: 0x1a47,
+       0xbb6: 0x1a56, 0xbb7: 0x19cc, 0xbb8: 0x1bfc, 0xbb9: 0x1c00, 0xbba: 0x1960, 0xbbb: 0x2701,
+       0xbbc: 0x270f, 0xbbd: 0x26fa, 0xbbe: 0x2708, 0xbbf: 0x2ae0,
+       // Block 0x2f, offset 0xbc0
+       0xbc0: 0x1a4a, 0xbc1: 0x1a32, 0xbc2: 0x1c60, 0xbc3: 0x1a1a, 0xbc4: 0x19f3, 0xbc5: 0x1969,
+       0xbc6: 0x1978, 0xbc7: 0x1948, 0xbc8: 0x1bf0, 0xbc9: 0x1d52, 0xbca: 0x1a4d, 0xbcb: 0x1a35,
+       0xbcc: 0x1c64, 0xbcd: 0x1c70, 0xbce: 0x1a26, 0xbcf: 0x19fc, 0xbd0: 0x1957, 0xbd1: 0x1c1c,
+       0xbd2: 0x1bb0, 0xbd3: 0x1b9c, 0xbd4: 0x1bcc, 0xbd5: 0x1c74, 0xbd6: 0x1a29, 0xbd7: 0x19c9,
+       0xbd8: 0x19ff, 0xbd9: 0x19de, 0xbda: 0x1a41, 0xbdb: 0x1c78, 0xbdc: 0x1a2c, 0xbdd: 0x19c0,
+       0xbde: 0x1a02, 0xbdf: 0x1c3c, 0xbe0: 0x1bf4, 0xbe1: 0x1a14, 0xbe2: 0x1c24, 0xbe3: 0x1c40,
+       0xbe4: 0x1bf8, 0xbe5: 0x1a17, 0xbe6: 0x1c28, 0xbe7: 0x22e8, 0xbe8: 0x22fc, 0xbe9: 0x1996,
+       0xbea: 0x1c20, 0xbeb: 0x1bb4, 0xbec: 0x1ba0, 0xbed: 0x1c48, 0xbee: 0x2716, 0xbef: 0x27ad,
+       0xbf0: 0x1a59, 0xbf1: 0x1a44, 0xbf2: 0x1c7c, 0xbf3: 0x1a2f, 0xbf4: 0x1a50, 0xbf5: 0x1a38,
+       0xbf6: 0x1c68, 0xbf7: 0x1a1d, 0xbf8: 0x19f6, 0xbf9: 0x1981, 0xbfa: 0x1a53, 0xbfb: 0x1a3b,
+       0xbfc: 0x1c6c, 0xbfd: 0x1a20, 0xbfe: 0x19f9, 0xbff: 0x1984,
+       // Block 0x30, offset 0xc00
+       0xc00: 0x1c2c, 0xc01: 0x1bb8, 0xc02: 0x1d4d, 0xc03: 0x1939, 0xc04: 0x19ba, 0xc05: 0x19bd,
+       0xc06: 0x22f5, 0xc07: 0x1b94, 0xc08: 0x19c3, 0xc09: 0x194b, 0xc0a: 0x19e1, 0xc0b: 0x194e,
+       0xc0c: 0x19ea, 0xc0d: 0x196c, 0xc0e: 0x196f, 0xc0f: 0x1a05, 0xc10: 0x1a0b, 0xc11: 0x1a0e,
+       0xc12: 0x1c30, 0xc13: 0x1a11, 0xc14: 0x1a23, 0xc15: 0x1c38, 0xc16: 0x1c44, 0xc17: 0x1990,
+       0xc18: 0x1d57, 0xc19: 0x1bbc, 0xc1a: 0x1993, 0xc1b: 0x1a5c, 0xc1c: 0x19a5, 0xc1d: 0x19b4,
+       0xc1e: 0x22e2, 0xc1f: 0x22dc, 0xc20: 0x1cc1, 0xc21: 0x1cd0, 0xc22: 0x1cdf, 0xc23: 0x1cee,
+       0xc24: 0x1cfd, 0xc25: 0x1d0c, 0xc26: 0x1d1b, 0xc27: 0x1d2a, 0xc28: 0x1d39, 0xc29: 0x2186,
+       0xc2a: 0x2198, 0xc2b: 0x21aa, 0xc2c: 0x21bc, 0xc2d: 0x21c8, 0xc2e: 0x21d4, 0xc2f: 0x21e0,
+       0xc30: 0x21ec, 0xc31: 0x21f8, 0xc32: 0x2204, 0xc33: 0x2240, 0xc34: 0x224c, 0xc35: 0x2258,
+       0xc36: 0x2264, 0xc37: 0x2270, 0xc38: 0x227c, 0xc39: 0x2282, 0xc3a: 0x2288, 0xc3b: 0x228e,
+       0xc3c: 0x2294, 0xc3d: 0x22a6, 0xc3e: 0x22ac, 0xc3f: 0x1c10,
+       // Block 0x31, offset 0xc40
+       0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb,
+       0xc46: 0x08df, 0xc47: 0x162b, 0xc48: 0x162b, 0xc49: 0x0a0b, 0xc4a: 0x145f, 0xc4b: 0x0943,
+       0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3,
+       0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43,
+       0xc58: 0x125f, 0xc59: 0x1447, 0xc5a: 0x1573, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87,
+       0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15c3, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283,
+       0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f,
+       0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853,
+       0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b,
+       0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14ef, 0xc79: 0x15a3, 0xc7a: 0x15bf, 0xc7b: 0x102b,
+       0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x147b,
+       // Block 0x32, offset 0xc80
+       0xc80: 0x15cb, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b,
+       0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e7, 0xc8a: 0x09c3, 0xc8b: 0x0a8f,
+       0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a7,
+       0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127,
+       0xc98: 0x125b, 0xc99: 0x14af, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357,
+       0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873,
+       0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3,
+       0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b,
+       0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57,
+       0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb,
+       0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x145b, 0xcbf: 0x085b,
+       // Block 0x33, offset 0xcc0
+       0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f,
+       0xcc6: 0x1497, 0xcc7: 0x157b, 0xcc8: 0x15cf, 0xcc9: 0x15e7, 0xcca: 0x0837, 0xccb: 0x0cf3,
+       0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83,
+       0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193,
+       0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147f, 0xcdc: 0x080f, 0xcdd: 0x083b,
+       0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b,
+       0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f,
+       0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b,
+       0xcf0: 0x118b, 0xcf1: 0x1463, 0xcf2: 0x14e3, 0xcf3: 0x14f3, 0xcf4: 0x152f, 0xcf5: 0x0753,
+       0xcf6: 0x107f, 0xcf7: 0x144f, 0xcf8: 0x14cb, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777,
+       0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73,
+       // Block 0x34, offset 0xd00
+       0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x1623, 0xd05: 0x0ce3,
+       0xd06: 0x14a3, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47,
+       0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x153b, 0xd11: 0x07af,
+       0xd12: 0x0c03, 0xd13: 0x14b3, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df,
+       0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14bb, 0xd1d: 0x0817,
+       0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3,
+       0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1457,
+       0xd2a: 0x14d7, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b,
+       0xd30: 0x1287, 0xd31: 0x14bf, 0xd32: 0x15ab, 0xd33: 0x15d3, 0xd34: 0x0d37, 0xd35: 0x0e27,
+       0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f,
+       0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b,
+       // Block 0x35, offset 0xd40
+       0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03,
+       0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14ab, 0xd4a: 0x1323, 0xd4b: 0x0b27,
+       0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af,
+       0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3,
+       0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14fb, 0xd5d: 0x10eb,
+       0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353,
+       0xd65: 0x1407, 0xd66: 0x1433,
+       0xd6a: 0x154f, 0xd6b: 0x1553, 0xd6c: 0x1557, 0xd6d: 0x15bb, 0xd6e: 0x142b, 0xd6f: 0x14c7,
+       0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897,
+       0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93,
+       0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3,
+       // Block 0x36, offset 0xd80
+       0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b,
+       0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f,
+       0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f,
+       0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f,
+       0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff,
+       0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f,
+       0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14db, 0xda9: 0x151f,
+       0xdaa: 0x1537, 0xdab: 0x0b9b, 0xdac: 0x171e, 0xdad: 0x11e3,
+       0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7,
+       0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963,
+       0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f,
+       // Block 0x37, offset 0xdc0
+       0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b,
+       0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb,
+       0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf,
+       0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f,
+       0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013,
+       0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f,
+       0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b,
+       0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b,
+       0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb,
+       0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343,
+       0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f,
+       // Block 0x38, offset 0xe00
+       0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x144b, 0xe05: 0x146b,
+       0xe06: 0x14b7, 0xe07: 0x14db, 0xe08: 0x14fb, 0xe09: 0x150f, 0xe0a: 0x151f, 0xe0b: 0x152b,
+       0xe0c: 0x1537, 0xe0d: 0x158b, 0xe0e: 0x162b, 0xe0f: 0x16b5, 0xe10: 0x16b0, 0xe11: 0x16e2,
+       0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1764, 0xe16: 0x1791, 0xe17: 0x1809,
+       0xe18: 0x1617, 0xe19: 0x1627,
+       // Block 0x39, offset 0xe40
+       0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f,
+       0xe46: 0x1a5f,
+       0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70,
+       0xe5d: 0x4390,
+       0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221,
+       0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017,
+       0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e,
+       0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e,
+       0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2,
+       0xe7c: 0x43ae, 0xe7e: 0x43b4,
+       // Block 0x3a, offset 0xe80
+       0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc,
+       0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378,
+       0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299,
+       0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5,
+       0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab,
+       0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8,
+       0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c,
+       0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2,
+       0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1,
+       0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4,
+       0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7,
+       // Block 0x3b, offset 0xec0
+       0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd,
+       0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9,
+       0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5,
+       0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1,
+       0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de,
+       0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7,
+       0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed,
+       0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308,
+       0xef0: 0x4468, 0xef1: 0x4468,
+       // Block 0x3c, offset 0xf00
+       0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6,
+       0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f,
+       0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc,
+       0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d,
+       0xf2a: 0x25aa, 0xf2b: 0x25aa, 0xf2c: 0x261a, 0xf2d: 0x261a, 0xf2e: 0x25e9, 0xf2f: 0x25e9,
+       0xf30: 0x2605, 0xf31: 0x2605, 0xf32: 0x25fe, 0xf33: 0x25fe, 0xf34: 0x260c, 0xf35: 0x260c,
+       0xf36: 0x2613, 0xf37: 0x2613, 0xf38: 0x2613, 0xf39: 0x25f0, 0xf3a: 0x25f0, 0xf3b: 0x25f0,
+       0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302,
+       // Block 0x3d, offset 0xf40
+       0xf40: 0x25b1, 0xf41: 0x25b8, 0xf42: 0x25d4, 0xf43: 0x25f0, 0xf44: 0x25f7, 0xf45: 0x1d89,
+       0xf46: 0x1d8e, 0xf47: 0x1d93, 0xf48: 0x1da2, 0xf49: 0x1db1, 0xf4a: 0x1db6, 0xf4b: 0x1dbb,
+       0xf4c: 0x1dc0, 0xf4d: 0x1dc5, 0xf4e: 0x1dd4, 0xf4f: 0x1de3, 0xf50: 0x1de8, 0xf51: 0x1ded,
+       0xf52: 0x1dfc, 0xf53: 0x1e0b, 0xf54: 0x1e10, 0xf55: 0x1e15, 0xf56: 0x1e1a, 0xf57: 0x1e29,
+       0xf58: 0x1e2e, 0xf59: 0x1e3d, 0xf5a: 0x1e42, 0xf5b: 0x1e47, 0xf5c: 0x1e56, 0xf5d: 0x1e5b,
+       0xf5e: 0x1e60, 0xf5f: 0x1e6a, 0xf60: 0x1ea6, 0xf61: 0x1eb5, 0xf62: 0x1ec4, 0xf63: 0x1ec9,
+       0xf64: 0x1ece, 0xf65: 0x1ed8, 0xf66: 0x1ee7, 0xf67: 0x1eec, 0xf68: 0x1efb, 0xf69: 0x1f00,
+       0xf6a: 0x1f05, 0xf6b: 0x1f14, 0xf6c: 0x1f19, 0xf6d: 0x1f28, 0xf6e: 0x1f2d, 0xf6f: 0x1f32,
+       0xf70: 0x1f37, 0xf71: 0x1f3c, 0xf72: 0x1f41, 0xf73: 0x1f46, 0xf74: 0x1f4b, 0xf75: 0x1f50,
+       0xf76: 0x1f55, 0xf77: 0x1f5a, 0xf78: 0x1f5f, 0xf79: 0x1f64, 0xf7a: 0x1f69, 0xf7b: 0x1f6e,
+       0xf7c: 0x1f73, 0xf7d: 0x1f78, 0xf7e: 0x1f7d, 0xf7f: 0x1f87,
+       // Block 0x3e, offset 0xf80
+       0xf80: 0x1f8c, 0xf81: 0x1f91, 0xf82: 0x1f96, 0xf83: 0x1fa0, 0xf84: 0x1fa5, 0xf85: 0x1faf,
+       0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd,
+       0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff,
+       0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022,
+       0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c,
+       0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6,
+       0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7,
+       0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6,
+       0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8,
+       0xfb6: 0x1df2, 0xfb7: 0x1df7, 0xfb8: 0x1dfc, 0xfb9: 0x1e01, 0xfba: 0x1e0b, 0xfbb: 0x1e10,
+       0xfbc: 0x1f3c, 0xfbd: 0x1f41, 0xfbe: 0x1f50, 0xfbf: 0x1f55,
+       // Block 0x3f, offset 0xfc0
+       0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96,
+       0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1,
+       0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027,
+       0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1,
+       0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e,
+       0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5,
+       0xfe4: 0x1dd4, 0xfe5: 0x1dde, 0xfe6: 0x1dfc, 0xfe7: 0x1e15, 0xfe8: 0x1e1a, 0xfe9: 0x1e29,
+       0xfea: 0x1e2e, 0xfeb: 0x1e3d, 0xfec: 0x1e47, 0xfed: 0x1e56, 0xfee: 0x1e5b, 0xfef: 0x1e60,
+       0xff0: 0x1e6a, 0xff1: 0x1ea6, 0xff2: 0x1eab, 0xff3: 0x1eb5, 0xff4: 0x1ec4, 0xff5: 0x1ec9,
+       0xff6: 0x1ece, 0xff7: 0x1ed8, 0xff8: 0x1ee7, 0xff9: 0x1efb, 0xffa: 0x1f00, 0xffb: 0x1f05,
+       0xffc: 0x1f14, 0xffd: 0x1f19, 0xffe: 0x1f28, 0xfff: 0x1f2d,
+       // Block 0x40, offset 0x1000
+       0x1000: 0x1f32, 0x1001: 0x1f37, 0x1002: 0x1f46, 0x1003: 0x1f4b, 0x1004: 0x1f5f, 0x1005: 0x1f64,
+       0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91,
+       0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe,
+       0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff,
+       0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031,
+       0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4,
+       0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92,
+       0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0,
+       0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1,
+       0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74,
+       0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33,
+       // Block 0x41, offset 0x1040
+       0x1040: 0x1e38, 0x1041: 0x1e1f, 0x1042: 0x1e24, 0x1043: 0x1e4c, 0x1044: 0x1e51, 0x1045: 0x1eba,
+       0x1046: 0x1ebf, 0x1047: 0x1edd, 0x1048: 0x1ee2, 0x1049: 0x1e7e, 0x104a: 0x1e83, 0x104b: 0x1e88,
+       0x104c: 0x1e92, 0x104d: 0x1e8d, 0x104e: 0x1e65, 0x104f: 0x1eb0, 0x1050: 0x1ed3, 0x1051: 0x1ef1,
+       0x1052: 0x1ef6, 0x1053: 0x1f0a, 0x1054: 0x1f0f, 0x1055: 0x1f1e, 0x1056: 0x1f23, 0x1057: 0x1e74,
+       0x1058: 0x1e79, 0x1059: 0x1e9c, 0x105a: 0x1ea1, 0x105b: 0x1e33, 0x105c: 0x1e38, 0x105d: 0x1e1f,
+       0x105e: 0x1e24, 0x105f: 0x1e4c, 0x1060: 0x1e51, 0x1061: 0x1eba, 0x1062: 0x1ebf, 0x1063: 0x1edd,
+       0x1064: 0x1ee2, 0x1065: 0x1e7e, 0x1066: 0x1e83, 0x1067: 0x1e88, 0x1068: 0x1e92, 0x1069: 0x1e8d,
+       0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88,
+       0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b,
+       0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb,
+       0x107c: 0x4408, 0x107d: 0x4408,
+       // Block 0x42, offset 0x1080
+       0x1090: 0x2311, 0x1091: 0x2326,
+       0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357,
+       0x1098: 0x237a, 0x1099: 0x237a, 0x109a: 0x239d, 0x109b: 0x2396, 0x109c: 0x23b2, 0x109d: 0x23a4,
+       0x109e: 0x23ab, 0x109f: 0x23ce, 0x10a0: 0x23ce, 0x10a1: 0x23c7, 0x10a2: 0x23d5, 0x10a3: 0x23d5,
+       0x10a4: 0x23ff, 0x10a5: 0x23ff, 0x10a6: 0x241b, 0x10a7: 0x23e3, 0x10a8: 0x23e3, 0x10a9: 0x23dc,
+       0x10aa: 0x23f1, 0x10ab: 0x23f1, 0x10ac: 0x23f8, 0x10ad: 0x23f8, 0x10ae: 0x2422, 0x10af: 0x2430,
+       0x10b0: 0x2430, 0x10b1: 0x2437, 0x10b2: 0x2437, 0x10b3: 0x243e, 0x10b4: 0x2445, 0x10b5: 0x244c,
+       0x10b6: 0x2453, 0x10b7: 0x2453, 0x10b8: 0x245a, 0x10b9: 0x2468, 0x10ba: 0x2476, 0x10bb: 0x246f,
+       0x10bc: 0x247d, 0x10bd: 0x247d, 0x10be: 0x2492, 0x10bf: 0x2499,
+       // Block 0x43, offset 0x10c0
+       0x10c0: 0x24ca, 0x10c1: 0x24d8, 0x10c2: 0x24d1, 0x10c3: 0x24b5, 0x10c4: 0x24b5, 0x10c5: 0x24df,
+       0x10c6: 0x24df, 0x10c7: 0x24e6, 0x10c8: 0x24e6, 0x10c9: 0x2510, 0x10ca: 0x2517, 0x10cb: 0x251e,
+       0x10cc: 0x24f4, 0x10cd: 0x2502, 0x10ce: 0x2525, 0x10cf: 0x252c,
+       0x10d2: 0x24fb, 0x10d3: 0x2580, 0x10d4: 0x2587, 0x10d5: 0x255d, 0x10d6: 0x2564, 0x10d7: 0x2548,
+       0x10d8: 0x2548, 0x10d9: 0x254f, 0x10da: 0x2579, 0x10db: 0x2572, 0x10dc: 0x259c, 0x10dd: 0x259c,
+       0x10de: 0x230a, 0x10df: 0x231f, 0x10e0: 0x2318, 0x10e1: 0x2342, 0x10e2: 0x233b, 0x10e3: 0x2365,
+       0x10e4: 0x235e, 0x10e5: 0x2388, 0x10e6: 0x236c, 0x10e7: 0x2381, 0x10e8: 0x23b9, 0x10e9: 0x2406,
+       0x10ea: 0x23ea, 0x10eb: 0x2429, 0x10ec: 0x24c3, 0x10ed: 0x24ed, 0x10ee: 0x2595, 0x10ef: 0x258e,
+       0x10f0: 0x25a3, 0x10f1: 0x253a, 0x10f2: 0x24a0, 0x10f3: 0x256b, 0x10f4: 0x2492, 0x10f5: 0x24ca,
+       0x10f6: 0x2461, 0x10f7: 0x24ae, 0x10f8: 0x2541, 0x10f9: 0x2533, 0x10fa: 0x24bc, 0x10fb: 0x24a7,
+       0x10fc: 0x24bc, 0x10fd: 0x2541, 0x10fe: 0x2373, 0x10ff: 0x238f,
+       // Block 0x44, offset 0x1100
+       0x1100: 0x2509, 0x1101: 0x2484, 0x1102: 0x2303, 0x1103: 0x24a7, 0x1104: 0x244c, 0x1105: 0x241b,
+       0x1106: 0x23c0, 0x1107: 0x2556,
+       0x1130: 0x2414, 0x1131: 0x248b, 0x1132: 0x27bf, 0x1133: 0x27b6, 0x1134: 0x27ec, 0x1135: 0x27da,
+       0x1136: 0x27c8, 0x1137: 0x27e3, 0x1138: 0x27f5, 0x1139: 0x240d, 0x113a: 0x2c7c, 0x113b: 0x2afc,
+       0x113c: 0x27d1,
+       // Block 0x45, offset 0x1140
+       0x1150: 0x0019, 0x1151: 0x0483,
+       0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf,
+       0x1158: 0x04c3, 0x1159: 0x1b5c,
+       0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132,
+       0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d,
+       0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132,
+       0x1170: 0x1873, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011,
+       0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab,
+       0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b,
+       // Block 0x46, offset 0x1180
+       0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7,
+       0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4269, 0x118a: 0x4269, 0x118b: 0x4269,
+       0x118c: 0x4269, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483,
+       0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003,
+       0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7,
+       0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b,
+       0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009,
+       0x11aa: 0x000b, 0x11ab: 0x0041,
+       0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4,
+       0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e,
+       0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a,
+       // Block 0x47, offset 0x11c0
+       0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456,
+       0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462,
+       0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c,
+       0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242,
+       0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248,
+       0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b,
+       0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251,
+       0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a,
+       0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260,
+       0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263,
+       0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266,
+       // Block 0x48, offset 0x1200
+       0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c,
+       0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f,
+       0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275,
+       0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278,
+       0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e,
+       0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281,
+       0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287,
+       0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d,
+       0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2e00,
+       0x1236: 0x2e00, 0x1237: 0x2e08, 0x1238: 0x2e08, 0x1239: 0x2e10, 0x123a: 0x2e10, 0x123b: 0x1f82,
+       0x123c: 0x1f82,
+       // Block 0x49, offset 0x1240
+       0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b,
+       0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097,
+       0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3,
+       0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af,
+       0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb,
+       0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f,
+       0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7,
+       0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f,
+       0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb,
+       0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503,
+       0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513,
+       // Block 0x4a, offset 0x1280
+       0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f,
+       0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547,
+       0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f,
+       0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583,
+       0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7,
+       0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b,
+       0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327,
+       0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b,
+       0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337,
+       0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f,
+       0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b,
+       // Block 0x4b, offset 0x12c0
+       0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf,
+       0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7,
+       0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff,
+       0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23,
+       0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35,
+       0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264,
+       0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b,
+       0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473,
+       // Block 0x4c, offset 0x1300
+       0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d,
+       0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085,
+       0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091,
+       0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d,
+       0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9,
+       0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5,
+       0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176,
+       0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188,
+       0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a,
+       0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9,
+       0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5,
+       // Block 0x4d, offset 0x1340
+       0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0,
+       0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209,
+       0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027,
+       0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033,
+       0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b,
+       0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023,
+       0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f,
+       0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027,
+       0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033,
+       0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b,
+       0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033,
+       // Block 0x4e, offset 0x1380
+       0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a,
+       0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e,
+       0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263,
+       0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e,
+       0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4,
+       0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248,
+       0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290,
+       0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f,
+       0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242,
+       0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272,
+       // Block 0x4f, offset 0x13c0
+       0x13c2: 0x0248,
+       0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e,
+       0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263,
+       0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e,
+       0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4,
+       0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,
+       0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290,
+       0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,
+       0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,
+       0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272,
+       0x13fc: 0x0293, 0x13fe: 0x02cc,
+       // Block 0x50, offset 0x1400
+       0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a,
+       0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e,
+       0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263,
+       0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e,
+       0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272,
+       0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251,
+       0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,
+       0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,
+       0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242,
+       0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,
+       // Block 0x51, offset 0x1440
+       0x1440: 0x1879, 0x1441: 0x1876, 0x1442: 0x187c, 0x1443: 0x18a0, 0x1444: 0x18c4, 0x1445: 0x18e8,
+       0x1446: 0x190c, 0x1447: 0x1915, 0x1448: 0x191b, 0x1449: 0x1921, 0x144a: 0x1927,
+       0x1450: 0x1a8c, 0x1451: 0x1a90,
+       0x1452: 0x1a94, 0x1453: 0x1a98, 0x1454: 0x1a9c, 0x1455: 0x1aa0, 0x1456: 0x1aa4, 0x1457: 0x1aa8,
+       0x1458: 0x1aac, 0x1459: 0x1ab0, 0x145a: 0x1ab4, 0x145b: 0x1ab8, 0x145c: 0x1abc, 0x145d: 0x1ac0,
+       0x145e: 0x1ac4, 0x145f: 0x1ac8, 0x1460: 0x1acc, 0x1461: 0x1ad0, 0x1462: 0x1ad4, 0x1463: 0x1ad8,
+       0x1464: 0x1adc, 0x1465: 0x1ae0, 0x1466: 0x1ae4, 0x1467: 0x1ae8, 0x1468: 0x1aec, 0x1469: 0x1af0,
+       0x146a: 0x271e, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x193c, 0x146e: 0x19b1,
+       0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d,
+       0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059,
+       0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061,
+       // Block 0x52, offset 0x1480
+       0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503,
+       0x1490: 0x0c0f, 0x1491: 0x0a47,
+       0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff,
+       0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b,
+       0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b,
+       0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf,
+       0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b,
+       0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43,
+       0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, 0x14bb: 0x1443,
+       // Block 0x53, offset 0x14c0
+       0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1647, 0x14c4: 0x0747, 0x14c5: 0x0757,
+       0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773,
+       0x14cc: 0x05b3, 0x14cd: 0x165b, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3,
+       0x14d2: 0x164c, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1656, 0x14d7: 0x07cf,
+       0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x1831, 0x14dd: 0x07ff,
+       0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f,
+       0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867,
+       0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af,
+       0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x166a, 0x14f5: 0x0e93,
+       0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166f, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3,
+       0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917,
+       // Block 0x54, offset 0x1500
+       0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f,
+       0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983,
+       0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf,
+       0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3,
+       0x1518: 0x09bb, 0x1519: 0x1674, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef,
+       0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1679, 0x1521: 0x167e, 0x1522: 0x0a1f, 0x1523: 0x0a23,
+       0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37,
+       0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x1683, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63,
+       0x1530: 0x0a6b, 0x1531: 0x1688, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f,
+       0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x1692,
+       0x153c: 0x0aaf, 0x153d: 0x1697, 0x153e: 0x0abb, 0x153f: 0x0ab7,
+       // Block 0x55, offset 0x1540
+       0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb,
+       0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x169c, 0x154a: 0x05db, 0x154b: 0x0b0f,
+       0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x1863, 0x1550: 0x0b37, 0x1551: 0x16a6,
+       0x1552: 0x16a6, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c9,
+       0x1558: 0x179b, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83,
+       0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3,
+       0x1564: 0x16ab, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf,
+       0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7,
+       0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f,
+       0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16ba, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b,
+       0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bf, 0x157f: 0x0c6f,
+       // Block 0x56, offset 0x1580
+       0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87,
+       0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c4, 0x158b: 0x0ccb,
+       0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7,
+       0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663,
+       0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16dd,
+       0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e7,
+       0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b,
+       0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16ec, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f,
+       0x15b0: 0x16f1, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7,
+       0x15b6: 0x0dbb, 0x15b7: 0x16f6, 0x15b8: 0x168d, 0x15b9: 0x16fb, 0x15ba: 0x0ddb, 0x15bb: 0x1700,
+       0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb,
+       // Block 0x57, offset 0x15c0
+       0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23,
+       0x15c6: 0x1705, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53,
+       0x15cc: 0x0e4f, 0x15cd: 0x170a, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170f, 0x15d1: 0x1714,
+       0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b,
+       0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x1651, 0x15dc: 0x0eb3, 0x15dd: 0x1719,
+       0x15de: 0x0ebf, 0x15df: 0x1723, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1728,
+       0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x172d, 0x15e7: 0x1732, 0x15e8: 0x0f27, 0x15e9: 0x0f37,
+       0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57,
+       0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1737,
+       0x15f6: 0x0fa3, 0x15f7: 0x173c, 0x15f8: 0x0faf, 0x15f9: 0x16a1, 0x15fa: 0x0fbf, 0x15fb: 0x1741,
+       0x15fc: 0x1746, 0x15fd: 0x174b, 0x15fe: 0x0627, 0x15ff: 0x062b,
+       // Block 0x58, offset 0x1600
+       0x1600: 0x0ff7, 0x1601: 0x1755, 0x1602: 0x1750, 0x1603: 0x175a, 0x1604: 0x175f, 0x1605: 0x0fff,
+       0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637,
+       0x160c: 0x063b, 0x160d: 0x1769, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f,
+       0x1612: 0x176e, 0x1613: 0x105b, 0x1614: 0x1773, 0x1615: 0x1778, 0x1616: 0x107b, 0x1617: 0x1093,
+       0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x177d, 0x161d: 0x1782,
+       0x161e: 0x1782, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1787, 0x1622: 0x10cf, 0x1623: 0x10d3,
+       0x1624: 0x064b, 0x1625: 0x178c, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7,
+       0x162a: 0x1107, 0x162b: 0x1796, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133,
+       0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x17a0, 0x1633: 0x17a5, 0x1634: 0x065b, 0x1635: 0x17aa,
+       0x1636: 0x115b, 0x1637: 0x17af, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b4,
+       0x163c: 0x17b9, 0x163d: 0x118f, 0x163e: 0x17be, 0x163f: 0x1197,
+       // Block 0x59, offset 0x1640
+       0x1640: 0x16ce, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7,
+       0x1646: 0x0a33, 0x1647: 0x17c3, 0x1648: 0x17c8, 0x1649: 0x16d3, 0x164a: 0x16d8, 0x164b: 0x11d7,
+       0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b,
+       0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17cd,
+       0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f,
+       0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f,
+       0x1664: 0x17d2, 0x1665: 0x17dc, 0x1666: 0x17d7, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273,
+       0x166a: 0x127b, 0x166b: 0x17f0, 0x166c: 0x127f, 0x166d: 0x17e1, 0x166e: 0x0673, 0x166f: 0x0677,
+       0x1670: 0x17e6, 0x1671: 0x17eb, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7,
+       0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb,
+       0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f,
+       // Block 0x5a, offset 0x1680
+       0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f5,
+       0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17fa,
+       0x168c: 0x17ff, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b,
+       0x1692: 0x137b, 0x1693: 0x1804, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7,
+       0x1698: 0x180e, 0x1699: 0x1660, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1665,
+       0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x1813, 0x16a1: 0x1818, 0x16a2: 0x1423, 0x16a3: 0x142f,
+       0x16a4: 0x1437, 0x16a5: 0x181d, 0x16a6: 0x143b, 0x16a7: 0x1467, 0x16a8: 0x1473, 0x16a9: 0x1477,
+       0x16aa: 0x146f, 0x16ab: 0x1483, 0x16ac: 0x1487, 0x16ad: 0x1822, 0x16ae: 0x1493, 0x16af: 0x0693,
+       0x16b0: 0x149b, 0x16b1: 0x1827, 0x16b2: 0x0697, 0x16b3: 0x14d3, 0x16b4: 0x0ac3, 0x16b5: 0x14eb,
+       0x16b6: 0x182c, 0x16b7: 0x1836, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x1513, 0x16bb: 0x183b,
+       0x16bc: 0x06a3, 0x16bd: 0x1840, 0x16be: 0x152b, 0x16bf: 0x152b,
+       // Block 0x5b, offset 0x16c0
+       0x16c0: 0x1533, 0x16c1: 0x1845, 0x16c2: 0x154b, 0x16c3: 0x06a7, 0x16c4: 0x155b, 0x16c5: 0x1567,
+       0x16c6: 0x156f, 0x16c7: 0x1577, 0x16c8: 0x06ab, 0x16c9: 0x184a, 0x16ca: 0x158b, 0x16cb: 0x15a7,
+       0x16cc: 0x15b3, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b7, 0x16d0: 0x184f, 0x16d1: 0x06b7,
+       0x16d2: 0x1854, 0x16d3: 0x1859, 0x16d4: 0x185e, 0x16d5: 0x15db, 0x16d6: 0x06bb, 0x16d7: 0x15ef,
+       0x16d8: 0x15f7, 0x16d9: 0x15fb, 0x16da: 0x1603, 0x16db: 0x160b, 0x16dc: 0x1613, 0x16dd: 0x1868,
+}
+
+// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfkcIndex = [1408]uint8{
+       // Block 0x0, offset 0x0
+       // Block 0x1, offset 0x40
+       // Block 0x2, offset 0x80
+       // Block 0x3, offset 0xc0
+       0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04,
+       0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
+       0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60,
+       0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65,
+       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+       0xf0: 0x13,
+       // Block 0x4, offset 0x100
+       0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c,
+       0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73,
+       0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79,
+       0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81,
+       // Block 0x5, offset 0x140
+       0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88,
+       0x14d: 0x89,
+       0x15c: 0x8a, 0x15f: 0x8b,
+       0x162: 0x8c, 0x164: 0x8d,
+       0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93,
+       0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97,
+       0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18,
+       // Block 0x6, offset 0x180
+       0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d,
+       0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0,
+       0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1,
+       0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,
+       0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,
+       0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab,
+       // Block 0x7, offset 0x1c0
+       0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26,
+       0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e,
+       // Block 0x8, offset 0x200
+       0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,
+       0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,
+       0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,
+       0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,
+       0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,
+       // Block 0x9, offset 0x240
+       0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,
+       0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,
+       0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,
+       0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,
+       0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,
+       0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,
+       0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,
+       0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,
+       // Block 0xa, offset 0x280
+       0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,
+       0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,
+       0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,
+       0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,
+       0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,
+       0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,
+       0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,
+       0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,
+       // Block 0xb, offset 0x2c0
+       0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,
+       0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,
+       0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,
+       0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,
+       // Block 0xc, offset 0x300
+       0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32,
+       0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a,
+       0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42,
+       0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49,
+       // Block 0xd, offset 0x340
+       0x347: 0xc6,
+       0x34b: 0xc7, 0x34d: 0xc8,
+       0x368: 0xc9, 0x36b: 0xca,
+       // Block 0xe, offset 0x380
+       0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,
+       0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1,
+       0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,
+       0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,
+       0x3b0: 0xd7,
+       // Block 0xf, offset 0x3c0
+       0x3eb: 0xda, 0x3ec: 0xdb,
+       // Block 0x10, offset 0x400
+       0x432: 0xdc,
+       // Block 0x11, offset 0x440
+       0x445: 0xdd, 0x446: 0xde, 0x447: 0xdf,
+       0x449: 0xe0,
+       0x450: 0xe1, 0x451: 0xe2, 0x452: 0xe3, 0x453: 0xe4, 0x454: 0xe5, 0x455: 0xe6, 0x456: 0xe7, 0x457: 0xe8,
+       0x458: 0xe9, 0x459: 0xea, 0x45a: 0x4a, 0x45b: 0xeb, 0x45c: 0xec, 0x45d: 0xed, 0x45e: 0xee, 0x45f: 0x4b,
+       // Block 0x12, offset 0x480
+       0x480: 0xef,
+       0x4a3: 0xf0, 0x4a5: 0xf1,
+       0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e,
+       // Block 0x13, offset 0x4c0
+       0x4c4: 0x4f, 0x4c5: 0xf2, 0x4c6: 0xf3,
+       0x4c8: 0x50, 0x4c9: 0xf4,
+       // Block 0x14, offset 0x500
+       0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58,
+       0x528: 0x59,
+       // Block 0x15, offset 0x540
+       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+       0x56f: 0x12,
+}
+
+// nfkcSparseOffset: 155 entries, 310 bytes
+var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd4, 0xdb, 0xe3, 0xe7, 0xe9, 0xec, 0xf0, 0xf6, 0x107, 0x113, 0x115, 0x11b, 0x11d, 0x11f, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12c, 0x12f, 0x131, 0x134, 0x137, 0x13b, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x176, 0x184, 0x192, 0x1a2, 0x1b0, 0x1b7, 0x1bd, 0x1cc, 0x1d0, 0x1d2, 0x1d6, 0x1d8, 0x1db, 0x1dd, 0x1e0, 0x1e2, 0x1e5, 0x1e7, 0x1e9, 0x1eb, 0x1f7, 0x201, 0x20b, 0x20e, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21d, 0x21f, 0x221, 0x223, 0x225, 0x22b, 0x22e, 0x232, 0x234, 0x23b, 0x241, 0x247, 0x24f, 0x255, 0x25b, 0x261, 0x265, 0x267, 0x269, 0x26b, 0x26d, 0x273, 0x276, 0x279, 0x281, 0x288, 0x28b, 0x28e, 0x290, 0x298, 0x29b, 0x2a2, 0x2a5, 0x2ab, 0x2ad, 0x2af, 0x2b2, 0x2b4, 0x2b6, 0x2b8, 0x2ba, 0x2c7, 0x2d1, 0x2d3, 0x2d5, 0x2d9, 0x2de, 0x2ea, 0x2ef, 0x2f8, 0x2fe, 0x303, 0x307, 0x30c, 0x310, 0x320, 0x32e, 0x33c, 0x34a, 0x350, 0x352, 0x355, 0x35f, 0x361}
+
+// nfkcSparseValues: 875 entries, 3500 bytes
+var nfkcSparseValues = [875]valueRange{
+       // Block 0x0, offset 0x0
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x0001, lo: 0xa0, hi: 0xa0},
+       {value: 0x4278, lo: 0xa8, hi: 0xa8},
+       {value: 0x0083, lo: 0xaa, hi: 0xaa},
+       {value: 0x4264, lo: 0xaf, hi: 0xaf},
+       {value: 0x0025, lo: 0xb2, hi: 0xb3},
+       {value: 0x425a, lo: 0xb4, hi: 0xb4},
+       {value: 0x01dc, lo: 0xb5, hi: 0xb5},
+       {value: 0x4291, lo: 0xb8, hi: 0xb8},
+       {value: 0x0023, lo: 0xb9, hi: 0xb9},
+       {value: 0x009f, lo: 0xba, hi: 0xba},
+       {value: 0x221c, lo: 0xbc, hi: 0xbc},
+       {value: 0x2210, lo: 0xbd, hi: 0xbd},
+       {value: 0x22b2, lo: 0xbe, hi: 0xbe},
+       // Block 0x1, offset 0xe
+       {value: 0x0091, lo: 0x03},
+       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+       {value: 0x4714, lo: 0xaf, hi: 0xb0},
+       {value: 0xa000, lo: 0xb7, hi: 0xb7},
+       // Block 0x2, offset 0x12
+       {value: 0x0003, lo: 0x08},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x0091, lo: 0xb0, hi: 0xb0},
+       {value: 0x0119, lo: 0xb1, hi: 0xb1},
+       {value: 0x0095, lo: 0xb2, hi: 0xb2},
+       {value: 0x00a5, lo: 0xb3, hi: 0xb3},
+       {value: 0x0143, lo: 0xb4, hi: 0xb6},
+       {value: 0x00af, lo: 0xb7, hi: 0xb7},
+       {value: 0x00b3, lo: 0xb8, hi: 0xb8},
+       // Block 0x3, offset 0x1b
+       {value: 0x000a, lo: 0x09},
+       {value: 0x426e, lo: 0x98, hi: 0x98},
+       {value: 0x4273, lo: 0x99, hi: 0x9a},
+       {value: 0x4296, lo: 0x9b, hi: 0x9b},
+       {value: 0x425f, lo: 0x9c, hi: 0x9c},
+       {value: 0x4282, lo: 0x9d, hi: 0x9d},
+       {value: 0x0113, lo: 0xa0, hi: 0xa0},
+       {value: 0x0099, lo: 0xa1, hi: 0xa1},
+       {value: 0x00a7, lo: 0xa2, hi: 0xa3},
+       {value: 0x0167, lo: 0xa4, hi: 0xa4},
+       // Block 0x4, offset 0x25
+       {value: 0x0000, lo: 0x0f},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0xa000, lo: 0x8d, hi: 0x8d},
+       {value: 0x37a5, lo: 0x90, hi: 0x90},
+       {value: 0x37b1, lo: 0x91, hi: 0x91},
+       {value: 0x379f, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x96, hi: 0x96},
+       {value: 0x3817, lo: 0x97, hi: 0x97},
+       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+       {value: 0xa000, lo: 0xb4, hi: 0xb5},
+       {value: 0x381d, lo: 0xb6, hi: 0xb6},
+       {value: 0x3823, lo: 0xb7, hi: 0xb7},
+       // Block 0x5, offset 0x35
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x83, hi: 0x87},
+       // Block 0x6, offset 0x37
+       {value: 0x0001, lo: 0x04},
+       {value: 0x8113, lo: 0x81, hi: 0x82},
+       {value: 0x8132, lo: 0x84, hi: 0x84},
+       {value: 0x812d, lo: 0x85, hi: 0x85},
+       {value: 0x810d, lo: 0x87, hi: 0x87},
+       // Block 0x7, offset 0x3c
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x97},
+       {value: 0x8119, lo: 0x98, hi: 0x98},
+       {value: 0x811a, lo: 0x99, hi: 0x99},
+       {value: 0x811b, lo: 0x9a, hi: 0x9a},
+       {value: 0x3841, lo: 0xa2, hi: 0xa2},
+       {value: 0x3847, lo: 0xa3, hi: 0xa3},
+       {value: 0x3853, lo: 0xa4, hi: 0xa4},
+       {value: 0x384d, lo: 0xa5, hi: 0xa5},
+       {value: 0x3859, lo: 0xa6, hi: 0xa6},
+       {value: 0xa000, lo: 0xa7, hi: 0xa7},
+       // Block 0x8, offset 0x47
+       {value: 0x0000, lo: 0x0e},
+       {value: 0x386b, lo: 0x80, hi: 0x80},
+       {value: 0xa000, lo: 0x81, hi: 0x81},
+       {value: 0x385f, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x3865, lo: 0x93, hi: 0x93},
+       {value: 0xa000, lo: 0x95, hi: 0x95},
+       {value: 0x8132, lo: 0x96, hi: 0x9c},
+       {value: 0x8132, lo: 0x9f, hi: 0xa2},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa4},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xaa, hi: 0xaa},
+       {value: 0x8132, lo: 0xab, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       // Block 0x9, offset 0x56
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x811f, lo: 0x91, hi: 0x91},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x812d, lo: 0xb1, hi: 0xb1},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb5, hi: 0xb6},
+       {value: 0x812d, lo: 0xb7, hi: 0xb9},
+       {value: 0x8132, lo: 0xba, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbc},
+       {value: 0x8132, lo: 0xbd, hi: 0xbd},
+       {value: 0x812d, lo: 0xbe, hi: 0xbe},
+       {value: 0x8132, lo: 0xbf, hi: 0xbf},
+       // Block 0xa, offset 0x63
+       {value: 0x0005, lo: 0x07},
+       {value: 0x8132, lo: 0x80, hi: 0x80},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x83},
+       {value: 0x812d, lo: 0x84, hi: 0x85},
+       {value: 0x812d, lo: 0x86, hi: 0x87},
+       {value: 0x812d, lo: 0x88, hi: 0x89},
+       {value: 0x8132, lo: 0x8a, hi: 0x8a},
+       // Block 0xb, offset 0x6b
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8132, lo: 0xab, hi: 0xb1},
+       {value: 0x812d, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb3},
+       // Block 0xc, offset 0x6f
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0x96, hi: 0x99},
+       {value: 0x8132, lo: 0x9b, hi: 0xa3},
+       {value: 0x8132, lo: 0xa5, hi: 0xa7},
+       {value: 0x8132, lo: 0xa9, hi: 0xad},
+       // Block 0xd, offset 0x74
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x99, hi: 0x9b},
+       // Block 0xe, offset 0x76
+       {value: 0x0000, lo: 0x10},
+       {value: 0x8132, lo: 0x94, hi: 0xa1},
+       {value: 0x812d, lo: 0xa3, hi: 0xa3},
+       {value: 0x8132, lo: 0xa4, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa8},
+       {value: 0x812d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8132, lo: 0xaa, hi: 0xac},
+       {value: 0x812d, lo: 0xad, hi: 0xaf},
+       {value: 0x8116, lo: 0xb0, hi: 0xb0},
+       {value: 0x8117, lo: 0xb1, hi: 0xb1},
+       {value: 0x8118, lo: 0xb2, hi: 0xb2},
+       {value: 0x8132, lo: 0xb3, hi: 0xb5},
+       {value: 0x812d, lo: 0xb6, hi: 0xb6},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x812d, lo: 0xb9, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbf},
+       // Block 0xf, offset 0x87
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0xa8, hi: 0xa8},
+       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+       {value: 0xa000, lo: 0xb0, hi: 0xb0},
+       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+       {value: 0xa000, lo: 0xb3, hi: 0xb3},
+       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+       {value: 0x9902, lo: 0xbc, hi: 0xbc},
+       // Block 0x10, offset 0x8f
+       {value: 0x0008, lo: 0x06},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x91, hi: 0x91},
+       {value: 0x812d, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x93, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x94},
+       {value: 0x451c, lo: 0x98, hi: 0x9f},
+       // Block 0x11, offset 0x96
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x12, offset 0x99
+       {value: 0x0008, lo: 0x06},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x455c, lo: 0x9c, hi: 0x9d},
+       {value: 0x456c, lo: 0x9f, hi: 0x9f},
+       // Block 0x13, offset 0xa0
+       {value: 0x0000, lo: 0x03},
+       {value: 0x4594, lo: 0xb3, hi: 0xb3},
+       {value: 0x459c, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x14, offset 0xa4
+       {value: 0x0008, lo: 0x03},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x4574, lo: 0x99, hi: 0x9b},
+       {value: 0x458c, lo: 0x9e, hi: 0x9e},
+       // Block 0x15, offset 0xa8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       // Block 0x16, offset 0xaa
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       // Block 0x17, offset 0xac
+       {value: 0x0000, lo: 0x08},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2cb6, lo: 0x88, hi: 0x88},
+       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x96, hi: 0x97},
+       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+       // Block 0x18, offset 0xb5
+       {value: 0x0000, lo: 0x03},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0x2cc6, lo: 0x94, hi: 0x94},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x19, offset 0xb9
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1a, offset 0xc0
+       {value: 0x1801, lo: 0x04},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x3ef0, lo: 0x88, hi: 0x88},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x8120, lo: 0x95, hi: 0x96},
+       // Block 0x1b, offset 0xc5
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xbc, hi: 0xbc},
+       {value: 0xa000, lo: 0xbf, hi: 0xbf},
+       // Block 0x1c, offset 0xc8
+       {value: 0x0000, lo: 0x09},
+       {value: 0x2ce6, lo: 0x80, hi: 0x80},
+       {value: 0x9900, lo: 0x82, hi: 0x82},
+       {value: 0xa000, lo: 0x86, hi: 0x86},
+       {value: 0x2cee, lo: 0x87, hi: 0x87},
+       {value: 0x2cf6, lo: 0x88, hi: 0x88},
+       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x95, hi: 0x96},
+       // Block 0x1d, offset 0xd2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xbe, hi: 0xbe},
+       // Block 0x1e, offset 0xd4
+       {value: 0x0000, lo: 0x06},
+       {value: 0xa000, lo: 0x86, hi: 0x87},
+       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       // Block 0x1f, offset 0xdb
+       {value: 0x6bea, lo: 0x07},
+       {value: 0x9904, lo: 0x8a, hi: 0x8a},
+       {value: 0x9900, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+       // Block 0x20, offset 0xe3
+       {value: 0x0000, lo: 0x03},
+       {value: 0x2621, lo: 0xb3, hi: 0xb3},
+       {value: 0x8122, lo: 0xb8, hi: 0xb9},
+       {value: 0x8104, lo: 0xba, hi: 0xba},
+       // Block 0x21, offset 0xe7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8123, lo: 0x88, hi: 0x8b},
+       // Block 0x22, offset 0xe9
+       {value: 0x0000, lo: 0x02},
+       {value: 0x2636, lo: 0xb3, hi: 0xb3},
+       {value: 0x8124, lo: 0xb8, hi: 0xb9},
+       // Block 0x23, offset 0xec
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8125, lo: 0x88, hi: 0x8b},
+       {value: 0x2628, lo: 0x9c, hi: 0x9c},
+       {value: 0x262f, lo: 0x9d, hi: 0x9d},
+       // Block 0x24, offset 0xf0
+       {value: 0x0000, lo: 0x05},
+       {value: 0x030b, lo: 0x8c, hi: 0x8c},
+       {value: 0x812d, lo: 0x98, hi: 0x99},
+       {value: 0x812d, lo: 0xb5, hi: 0xb5},
+       {value: 0x812d, lo: 0xb7, hi: 0xb7},
+       {value: 0x812b, lo: 0xb9, hi: 0xb9},
+       // Block 0x25, offset 0xf6
+       {value: 0x0000, lo: 0x10},
+       {value: 0x2644, lo: 0x83, hi: 0x83},
+       {value: 0x264b, lo: 0x8d, hi: 0x8d},
+       {value: 0x2652, lo: 0x92, hi: 0x92},
+       {value: 0x2659, lo: 0x97, hi: 0x97},
+       {value: 0x2660, lo: 0x9c, hi: 0x9c},
+       {value: 0x263d, lo: 0xa9, hi: 0xa9},
+       {value: 0x8126, lo: 0xb1, hi: 0xb1},
+       {value: 0x8127, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+       {value: 0x8128, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+       {value: 0x45f4, lo: 0xb7, hi: 0xb7},
+       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+       {value: 0x45ff, lo: 0xb9, hi: 0xb9},
+       {value: 0x8127, lo: 0xba, hi: 0xbd},
+       // Block 0x26, offset 0x107
+       {value: 0x0000, lo: 0x0b},
+       {value: 0x8127, lo: 0x80, hi: 0x80},
+       {value: 0x4a96, lo: 0x81, hi: 0x81},
+       {value: 0x8132, lo: 0x82, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0x86, hi: 0x87},
+       {value: 0x266e, lo: 0x93, hi: 0x93},
+       {value: 0x2675, lo: 0x9d, hi: 0x9d},
+       {value: 0x267c, lo: 0xa2, hi: 0xa2},
+       {value: 0x2683, lo: 0xa7, hi: 0xa7},
+       {value: 0x268a, lo: 0xac, hi: 0xac},
+       {value: 0x2667, lo: 0xb9, hi: 0xb9},
+       // Block 0x27, offset 0x113
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x86, hi: 0x86},
+       // Block 0x28, offset 0x115
+       {value: 0x0000, lo: 0x05},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+       {value: 0x9900, lo: 0xae, hi: 0xae},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x29, offset 0x11b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       // Block 0x2a, offset 0x11d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x030f, lo: 0xbc, hi: 0xbc},
+       // Block 0x2b, offset 0x11f
+       {value: 0x0000, lo: 0x01},
+       {value: 0xa000, lo: 0x80, hi: 0x92},
+       // Block 0x2c, offset 0x121
+       {value: 0x0000, lo: 0x01},
+       {value: 0xb900, lo: 0xa1, hi: 0xb5},
+       // Block 0x2d, offset 0x123
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0xa8, hi: 0xbf},
+       // Block 0x2e, offset 0x125
+       {value: 0x0000, lo: 0x01},
+       {value: 0x9900, lo: 0x80, hi: 0x82},
+       // Block 0x2f, offset 0x127
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x9d, hi: 0x9f},
+       // Block 0x30, offset 0x129
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x94, hi: 0x94},
+       {value: 0x8104, lo: 0xb4, hi: 0xb4},
+       // Block 0x31, offset 0x12c
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x92, hi: 0x92},
+       {value: 0x8132, lo: 0x9d, hi: 0x9d},
+       // Block 0x32, offset 0x12f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8131, lo: 0xa9, hi: 0xa9},
+       // Block 0x33, offset 0x131
+       {value: 0x0004, lo: 0x02},
+       {value: 0x812e, lo: 0xb9, hi: 0xba},
+       {value: 0x812d, lo: 0xbb, hi: 0xbb},
+       // Block 0x34, offset 0x134
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x97, hi: 0x97},
+       {value: 0x812d, lo: 0x98, hi: 0x98},
+       // Block 0x35, offset 0x137
+       {value: 0x0000, lo: 0x03},
+       {value: 0x8104, lo: 0xa0, hi: 0xa0},
+       {value: 0x8132, lo: 0xb5, hi: 0xbc},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x36, offset 0x13b
+       {value: 0x0000, lo: 0x04},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       {value: 0x812d, lo: 0xb5, hi: 0xba},
+       {value: 0x8132, lo: 0xbb, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x37, offset 0x140
+       {value: 0x0000, lo: 0x08},
+       {value: 0x2d66, lo: 0x80, hi: 0x80},
+       {value: 0x2d6e, lo: 0x81, hi: 0x81},
+       {value: 0xa000, lo: 0x82, hi: 0x82},
+       {value: 0x2d76, lo: 0x83, hi: 0x83},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xab, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xac},
+       {value: 0x8132, lo: 0xad, hi: 0xb3},
+       // Block 0x38, offset 0x149
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xaa, hi: 0xab},
+       // Block 0x39, offset 0x14b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8102, lo: 0xa6, hi: 0xa6},
+       {value: 0x8104, lo: 0xb2, hi: 0xb3},
+       // Block 0x3a, offset 0x14e
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x3b, offset 0x150
+       {value: 0x0000, lo: 0x0a},
+       {value: 0x8132, lo: 0x90, hi: 0x92},
+       {value: 0x8101, lo: 0x94, hi: 0x94},
+       {value: 0x812d, lo: 0x95, hi: 0x99},
+       {value: 0x8132, lo: 0x9a, hi: 0x9b},
+       {value: 0x812d, lo: 0x9c, hi: 0x9f},
+       {value: 0x8132, lo: 0xa0, hi: 0xa0},
+       {value: 0x8101, lo: 0xa2, hi: 0xa8},
+       {value: 0x812d, lo: 0xad, hi: 0xad},
+       {value: 0x8132, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb8, hi: 0xb9},
+       // Block 0x3c, offset 0x15b
+       {value: 0x0002, lo: 0x0a},
+       {value: 0x0043, lo: 0xac, hi: 0xac},
+       {value: 0x00d1, lo: 0xad, hi: 0xad},
+       {value: 0x0045, lo: 0xae, hi: 0xae},
+       {value: 0x0049, lo: 0xb0, hi: 0xb1},
+       {value: 0x00e6, lo: 0xb2, hi: 0xb2},
+       {value: 0x004f, lo: 0xb3, hi: 0xba},
+       {value: 0x005f, lo: 0xbc, hi: 0xbc},
+       {value: 0x00ef, lo: 0xbd, hi: 0xbd},
+       {value: 0x0061, lo: 0xbe, hi: 0xbe},
+       {value: 0x0065, lo: 0xbf, hi: 0xbf},
+       // Block 0x3d, offset 0x166
+       {value: 0x0000, lo: 0x0f},
+       {value: 0x8132, lo: 0x80, hi: 0x81},
+       {value: 0x812d, lo: 0x82, hi: 0x82},
+       {value: 0x8132, lo: 0x83, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8a},
+       {value: 0x8132, lo: 0x8b, hi: 0x8c},
+       {value: 0x8135, lo: 0x8d, hi: 0x8d},
+       {value: 0x812a, lo: 0x8e, hi: 0x8e},
+       {value: 0x812d, lo: 0x8f, hi: 0x8f},
+       {value: 0x8129, lo: 0x90, hi: 0x90},
+       {value: 0x8132, lo: 0x91, hi: 0xb5},
+       {value: 0x8132, lo: 0xbb, hi: 0xbb},
+       {value: 0x8134, lo: 0xbc, hi: 0xbc},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       {value: 0x8132, lo: 0xbe, hi: 0xbe},
+       {value: 0x812d, lo: 0xbf, hi: 0xbf},
+       // Block 0x3e, offset 0x176
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x0001, lo: 0x80, hi: 0x8a},
+       {value: 0x043b, lo: 0x91, hi: 0x91},
+       {value: 0x429b, lo: 0x97, hi: 0x97},
+       {value: 0x001d, lo: 0xa4, hi: 0xa4},
+       {value: 0x1873, lo: 0xa5, hi: 0xa5},
+       {value: 0x1b5c, lo: 0xa6, hi: 0xa6},
+       {value: 0x0001, lo: 0xaf, hi: 0xaf},
+       {value: 0x2691, lo: 0xb3, hi: 0xb3},
+       {value: 0x27fe, lo: 0xb4, hi: 0xb4},
+       {value: 0x2698, lo: 0xb6, hi: 0xb6},
+       {value: 0x2808, lo: 0xb7, hi: 0xb7},
+       {value: 0x186d, lo: 0xbc, hi: 0xbc},
+       {value: 0x4269, lo: 0xbe, hi: 0xbe},
+       // Block 0x3f, offset 0x184
+       {value: 0x0002, lo: 0x0d},
+       {value: 0x1933, lo: 0x87, hi: 0x87},
+       {value: 0x1930, lo: 0x88, hi: 0x88},
+       {value: 0x1870, lo: 0x89, hi: 0x89},
+       {value: 0x298e, lo: 0x97, hi: 0x97},
+       {value: 0x0001, lo: 0x9f, hi: 0x9f},
+       {value: 0x0021, lo: 0xb0, hi: 0xb0},
+       {value: 0x0093, lo: 0xb1, hi: 0xb1},
+       {value: 0x0029, lo: 0xb4, hi: 0xb9},
+       {value: 0x0017, lo: 0xba, hi: 0xba},
+       {value: 0x0467, lo: 0xbb, hi: 0xbb},
+       {value: 0x003b, lo: 0xbc, hi: 0xbc},
+       {value: 0x0011, lo: 0xbd, hi: 0xbe},
+       {value: 0x009d, lo: 0xbf, hi: 0xbf},
+       // Block 0x40, offset 0x192
+       {value: 0x0002, lo: 0x0f},
+       {value: 0x0021, lo: 0x80, hi: 0x89},
+       {value: 0x0017, lo: 0x8a, hi: 0x8a},
+       {value: 0x0467, lo: 0x8b, hi: 0x8b},
+       {value: 0x003b, lo: 0x8c, hi: 0x8c},
+       {value: 0x0011, lo: 0x8d, hi: 0x8e},
+       {value: 0x0083, lo: 0x90, hi: 0x90},
+       {value: 0x008b, lo: 0x91, hi: 0x91},
+       {value: 0x009f, lo: 0x92, hi: 0x92},
+       {value: 0x00b1, lo: 0x93, hi: 0x93},
+       {value: 0x0104, lo: 0x94, hi: 0x94},
+       {value: 0x0091, lo: 0x95, hi: 0x95},
+       {value: 0x0097, lo: 0x96, hi: 0x99},
+       {value: 0x00a1, lo: 0x9a, hi: 0x9a},
+       {value: 0x00a7, lo: 0x9b, hi: 0x9c},
+       {value: 0x1999, lo: 0xa8, hi: 0xa8},
+       // Block 0x41, offset 0x1a2
+       {value: 0x0000, lo: 0x0d},
+       {value: 0x8132, lo: 0x90, hi: 0x91},
+       {value: 0x8101, lo: 0x92, hi: 0x93},
+       {value: 0x8132, lo: 0x94, hi: 0x97},
+       {value: 0x8101, lo: 0x98, hi: 0x9a},
+       {value: 0x8132, lo: 0x9b, hi: 0x9c},
+       {value: 0x8132, lo: 0xa1, hi: 0xa1},
+       {value: 0x8101, lo: 0xa5, hi: 0xa6},
+       {value: 0x8132, lo: 0xa7, hi: 0xa7},
+       {value: 0x812d, lo: 0xa8, hi: 0xa8},
+       {value: 0x8132, lo: 0xa9, hi: 0xa9},
+       {value: 0x8101, lo: 0xaa, hi: 0xab},
+       {value: 0x812d, lo: 0xac, hi: 0xaf},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       // Block 0x42, offset 0x1b0
+       {value: 0x0007, lo: 0x06},
+       {value: 0x2180, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+       {value: 0x3bc7, lo: 0xae, hi: 0xae},
+       // Block 0x43, offset 0x1b7
+       {value: 0x000e, lo: 0x05},
+       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+       {value: 0xa000, lo: 0x90, hi: 0x90},
+       {value: 0xa000, lo: 0x92, hi: 0x92},
+       {value: 0xa000, lo: 0x94, hi: 0x94},
+       // Block 0x44, offset 0x1bd
+       {value: 0x0173, lo: 0x0e},
+       {value: 0xa000, lo: 0x83, hi: 0x83},
+       {value: 0x3be3, lo: 0x84, hi: 0x84},
+       {value: 0xa000, lo: 0x88, hi: 0x88},
+       {value: 0x3bea, lo: 0x89, hi: 0x89},
+       {value: 0xa000, lo: 0x8b, hi: 0x8b},
+       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+       {value: 0xa000, lo: 0xa3, hi: 0xa3},
+       {value: 0x3bf8, lo: 0xa4, hi: 0xa4},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+       {value: 0x269f, lo: 0xac, hi: 0xad},
+       {value: 0x26a6, lo: 0xaf, hi: 0xaf},
+       {value: 0x281c, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xbc, hi: 0xbc},
+       // Block 0x45, offset 0x1cc
+       {value: 0x0007, lo: 0x03},
+       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+       // Block 0x46, offset 0x1d0
+       {value: 0x0004, lo: 0x01},
+       {value: 0x048b, lo: 0xa9, hi: 0xaa},
+       // Block 0x47, offset 0x1d2
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0057, lo: 0x80, hi: 0x8f},
+       {value: 0x0083, lo: 0x90, hi: 0xa9},
+       {value: 0x0021, lo: 0xaa, hi: 0xaa},
+       // Block 0x48, offset 0x1d6
+       {value: 0x0000, lo: 0x01},
+       {value: 0x299b, lo: 0x8c, hi: 0x8c},
+       // Block 0x49, offset 0x1d8
+       {value: 0x0263, lo: 0x02},
+       {value: 0x1b8c, lo: 0xb4, hi: 0xb4},
+       {value: 0x192d, lo: 0xb5, hi: 0xb6},
+       // Block 0x4a, offset 0x1db
+       {value: 0x0000, lo: 0x01},
+       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+       // Block 0x4b, offset 0x1dd
+       {value: 0x0000, lo: 0x02},
+       {value: 0x0095, lo: 0xbc, hi: 0xbc},
+       {value: 0x006d, lo: 0xbd, hi: 0xbd},
+       // Block 0x4c, offset 0x1e0
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xaf, hi: 0xb1},
+       // Block 0x4d, offset 0x1e2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x047f, lo: 0xaf, hi: 0xaf},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x4e, offset 0x1e5
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xa0, hi: 0xbf},
+       // Block 0x4f, offset 0x1e7
+       {value: 0x0000, lo: 0x01},
+       {value: 0x0dc3, lo: 0x9f, hi: 0x9f},
+       // Block 0x50, offset 0x1e9
+       {value: 0x0000, lo: 0x01},
+       {value: 0x162f, lo: 0xb3, hi: 0xb3},
+       // Block 0x51, offset 0x1eb
+       {value: 0x0004, lo: 0x0b},
+       {value: 0x1597, lo: 0x80, hi: 0x82},
+       {value: 0x15af, lo: 0x83, hi: 0x83},
+       {value: 0x15c7, lo: 0x84, hi: 0x85},
+       {value: 0x15d7, lo: 0x86, hi: 0x89},
+       {value: 0x15eb, lo: 0x8a, hi: 0x8c},
+       {value: 0x15ff, lo: 0x8d, hi: 0x8d},
+       {value: 0x1607, lo: 0x8e, hi: 0x8e},
+       {value: 0x160f, lo: 0x8f, hi: 0x90},
+       {value: 0x161b, lo: 0x91, hi: 0x93},
+       {value: 0x162b, lo: 0x94, hi: 0x94},
+       {value: 0x1633, lo: 0x95, hi: 0x95},
+       // Block 0x52, offset 0x1f7
+       {value: 0x0004, lo: 0x09},
+       {value: 0x0001, lo: 0x80, hi: 0x80},
+       {value: 0x812c, lo: 0xaa, hi: 0xaa},
+       {value: 0x8131, lo: 0xab, hi: 0xab},
+       {value: 0x8133, lo: 0xac, hi: 0xac},
+       {value: 0x812e, lo: 0xad, hi: 0xad},
+       {value: 0x812f, lo: 0xae, hi: 0xae},
+       {value: 0x812f, lo: 0xaf, hi: 0xaf},
+       {value: 0x04b3, lo: 0xb6, hi: 0xb6},
+       {value: 0x0887, lo: 0xb8, hi: 0xba},
+       // Block 0x53, offset 0x201
+       {value: 0x0006, lo: 0x09},
+       {value: 0x0313, lo: 0xb1, hi: 0xb1},
+       {value: 0x0317, lo: 0xb2, hi: 0xb2},
+       {value: 0x4a3b, lo: 0xb3, hi: 0xb3},
+       {value: 0x031b, lo: 0xb4, hi: 0xb4},
+       {value: 0x4a41, lo: 0xb5, hi: 0xb6},
+       {value: 0x031f, lo: 0xb7, hi: 0xb7},
+       {value: 0x0323, lo: 0xb8, hi: 0xb8},
+       {value: 0x0327, lo: 0xb9, hi: 0xb9},
+       {value: 0x4a4d, lo: 0xba, hi: 0xbf},
+       // Block 0x54, offset 0x20b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xaf, hi: 0xaf},
+       {value: 0x8132, lo: 0xb4, hi: 0xbd},
+       // Block 0x55, offset 0x20e
+       {value: 0x0000, lo: 0x03},
+       {value: 0x020f, lo: 0x9c, hi: 0x9c},
+       {value: 0x0212, lo: 0x9d, hi: 0x9d},
+       {value: 0x8132, lo: 0x9e, hi: 0x9f},
+       // Block 0x56, offset 0x212
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb1},
+       // Block 0x57, offset 0x214
+       {value: 0x0000, lo: 0x01},
+       {value: 0x163b, lo: 0xb0, hi: 0xb0},
+       // Block 0x58, offset 0x216
+       {value: 0x000c, lo: 0x01},
+       {value: 0x00d7, lo: 0xb8, hi: 0xb9},
+       // Block 0x59, offset 0x218
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       // Block 0x5a, offset 0x21a
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x84, hi: 0x84},
+       {value: 0x8132, lo: 0xa0, hi: 0xb1},
+       // Block 0x5b, offset 0x21d
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xab, hi: 0xad},
+       // Block 0x5c, offset 0x21f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x93, hi: 0x93},
+       // Block 0x5d, offset 0x221
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0xb3, hi: 0xb3},
+       // Block 0x5e, offset 0x223
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       // Block 0x5f, offset 0x225
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0xb0, hi: 0xb0},
+       {value: 0x8132, lo: 0xb2, hi: 0xb3},
+       {value: 0x812d, lo: 0xb4, hi: 0xb4},
+       {value: 0x8132, lo: 0xb7, hi: 0xb8},
+       {value: 0x8132, lo: 0xbe, hi: 0xbf},
+       // Block 0x60, offset 0x22b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x81, hi: 0x81},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       // Block 0x61, offset 0x22e
+       {value: 0x0008, lo: 0x03},
+       {value: 0x1637, lo: 0x9c, hi: 0x9d},
+       {value: 0x0125, lo: 0x9e, hi: 0x9e},
+       {value: 0x1643, lo: 0x9f, hi: 0x9f},
+       // Block 0x62, offset 0x232
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xad, hi: 0xad},
+       // Block 0x63, offset 0x234
+       {value: 0x0000, lo: 0x06},
+       {value: 0xe500, lo: 0x80, hi: 0x80},
+       {value: 0xc600, lo: 0x81, hi: 0x9b},
+       {value: 0xe500, lo: 0x9c, hi: 0x9c},
+       {value: 0xc600, lo: 0x9d, hi: 0xb7},
+       {value: 0xe500, lo: 0xb8, hi: 0xb8},
+       {value: 0xc600, lo: 0xb9, hi: 0xbf},
+       // Block 0x64, offset 0x23b
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x93},
+       {value: 0xe500, lo: 0x94, hi: 0x94},
+       {value: 0xc600, lo: 0x95, hi: 0xaf},
+       {value: 0xe500, lo: 0xb0, hi: 0xb0},
+       {value: 0xc600, lo: 0xb1, hi: 0xbf},
+       // Block 0x65, offset 0x241
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8b},
+       {value: 0xe500, lo: 0x8c, hi: 0x8c},
+       {value: 0xc600, lo: 0x8d, hi: 0xa7},
+       {value: 0xe500, lo: 0xa8, hi: 0xa8},
+       {value: 0xc600, lo: 0xa9, hi: 0xbf},
+       // Block 0x66, offset 0x247
+       {value: 0x0000, lo: 0x07},
+       {value: 0xc600, lo: 0x80, hi: 0x83},
+       {value: 0xe500, lo: 0x84, hi: 0x84},
+       {value: 0xc600, lo: 0x85, hi: 0x9f},
+       {value: 0xe500, lo: 0xa0, hi: 0xa0},
+       {value: 0xc600, lo: 0xa1, hi: 0xbb},
+       {value: 0xe500, lo: 0xbc, hi: 0xbc},
+       {value: 0xc600, lo: 0xbd, hi: 0xbf},
+       // Block 0x67, offset 0x24f
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x97},
+       {value: 0xe500, lo: 0x98, hi: 0x98},
+       {value: 0xc600, lo: 0x99, hi: 0xb3},
+       {value: 0xe500, lo: 0xb4, hi: 0xb4},
+       {value: 0xc600, lo: 0xb5, hi: 0xbf},
+       // Block 0x68, offset 0x255
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x8f},
+       {value: 0xe500, lo: 0x90, hi: 0x90},
+       {value: 0xc600, lo: 0x91, hi: 0xab},
+       {value: 0xe500, lo: 0xac, hi: 0xac},
+       {value: 0xc600, lo: 0xad, hi: 0xbf},
+       // Block 0x69, offset 0x25b
+       {value: 0x0000, lo: 0x05},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       {value: 0xe500, lo: 0xa4, hi: 0xa4},
+       {value: 0xc600, lo: 0xa5, hi: 0xbf},
+       // Block 0x6a, offset 0x261
+       {value: 0x0000, lo: 0x03},
+       {value: 0xc600, lo: 0x80, hi: 0x87},
+       {value: 0xe500, lo: 0x88, hi: 0x88},
+       {value: 0xc600, lo: 0x89, hi: 0xa3},
+       // Block 0x6b, offset 0x265
+       {value: 0x0002, lo: 0x01},
+       {value: 0x0003, lo: 0x81, hi: 0xbf},
+       // Block 0x6c, offset 0x267
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xbd, hi: 0xbd},
+       // Block 0x6d, offset 0x269
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0xa0, hi: 0xa0},
+       // Block 0x6e, offset 0x26b
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb6, hi: 0xba},
+       // Block 0x6f, offset 0x26d
+       {value: 0x002c, lo: 0x05},
+       {value: 0x812d, lo: 0x8d, hi: 0x8d},
+       {value: 0x8132, lo: 0x8f, hi: 0x8f},
+       {value: 0x8132, lo: 0xb8, hi: 0xb8},
+       {value: 0x8101, lo: 0xb9, hi: 0xba},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x70, offset 0x273
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0xa5, hi: 0xa5},
+       {value: 0x812d, lo: 0xa6, hi: 0xa6},
+       // Block 0x71, offset 0x276
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x86, hi: 0x86},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x72, offset 0x279
+       {value: 0x17fe, lo: 0x07},
+       {value: 0xa000, lo: 0x99, hi: 0x99},
+       {value: 0x4238, lo: 0x9a, hi: 0x9a},
+       {value: 0xa000, lo: 0x9b, hi: 0x9b},
+       {value: 0x4242, lo: 0x9c, hi: 0x9c},
+       {value: 0xa000, lo: 0xa5, hi: 0xa5},
+       {value: 0x424c, lo: 0xab, hi: 0xab},
+       {value: 0x8104, lo: 0xb9, hi: 0xba},
+       // Block 0x73, offset 0x281
+       {value: 0x0000, lo: 0x06},
+       {value: 0x8132, lo: 0x80, hi: 0x82},
+       {value: 0x9900, lo: 0xa7, hi: 0xa7},
+       {value: 0x2d7e, lo: 0xae, hi: 0xae},
+       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb1, hi: 0xb2},
+       {value: 0x8104, lo: 0xb3, hi: 0xb4},
+       // Block 0x74, offset 0x288
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x80, hi: 0x80},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x75, offset 0x28b
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb5, hi: 0xb5},
+       {value: 0x8102, lo: 0xb6, hi: 0xb6},
+       // Block 0x76, offset 0x28e
+       {value: 0x0002, lo: 0x01},
+       {value: 0x8102, lo: 0xa9, hi: 0xaa},
+       // Block 0x77, offset 0x290
+       {value: 0x0000, lo: 0x07},
+       {value: 0xa000, lo: 0x87, hi: 0x87},
+       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+       {value: 0x8104, lo: 0x8d, hi: 0x8d},
+       {value: 0x9900, lo: 0x97, hi: 0x97},
+       {value: 0x8132, lo: 0xa6, hi: 0xac},
+       {value: 0x8132, lo: 0xb0, hi: 0xb4},
+       // Block 0x78, offset 0x298
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x86, hi: 0x86},
+       // Block 0x79, offset 0x29b
+       {value: 0x6b5a, lo: 0x06},
+       {value: 0x9900, lo: 0xb0, hi: 0xb0},
+       {value: 0xa000, lo: 0xb9, hi: 0xb9},
+       {value: 0x9900, lo: 0xba, hi: 0xba},
+       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+       // Block 0x7a, offset 0x2a2
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0x82, hi: 0x82},
+       {value: 0x8102, lo: 0x83, hi: 0x83},
+       // Block 0x7b, offset 0x2a5
+       {value: 0x0000, lo: 0x05},
+       {value: 0x9900, lo: 0xaf, hi: 0xaf},
+       {value: 0xa000, lo: 0xb8, hi: 0xb9},
+       {value: 0x2dc4, lo: 0xba, hi: 0xba},
+       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7c, offset 0x2ab
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8102, lo: 0x80, hi: 0x80},
+       // Block 0x7d, offset 0x2ad
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xbf, hi: 0xbf},
+       // Block 0x7e, offset 0x2af
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8104, lo: 0xb6, hi: 0xb6},
+       {value: 0x8102, lo: 0xb7, hi: 0xb7},
+       // Block 0x7f, offset 0x2b2
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8104, lo: 0xab, hi: 0xab},
+       // Block 0x80, offset 0x2b4
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0xb0, hi: 0xb4},
+       // Block 0x81, offset 0x2b6
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0xb0, hi: 0xb6},
+       // Block 0x82, offset 0x2b8
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8101, lo: 0x9e, hi: 0x9e},
+       // Block 0x83, offset 0x2ba
+       {value: 0x0000, lo: 0x0c},
+       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+       {value: 0x460a, lo: 0xa0, hi: 0xa0},
+       {value: 0x4618, lo: 0xa1, hi: 0xa1},
+       {value: 0x4626, lo: 0xa2, hi: 0xa2},
+       {value: 0x4634, lo: 0xa3, hi: 0xa3},
+       {value: 0x4642, lo: 0xa4, hi: 0xa4},
+       {value: 0x812b, lo: 0xa5, hi: 0xa6},
+       {value: 0x8101, lo: 0xa7, hi: 0xa9},
+       {value: 0x8130, lo: 0xad, hi: 0xad},
+       {value: 0x812b, lo: 0xae, hi: 0xb2},
+       {value: 0x812d, lo: 0xbb, hi: 0xbf},
+       // Block 0x84, offset 0x2c7
+       {value: 0x0000, lo: 0x09},
+       {value: 0x812d, lo: 0x80, hi: 0x82},
+       {value: 0x8132, lo: 0x85, hi: 0x89},
+       {value: 0x812d, lo: 0x8a, hi: 0x8b},
+       {value: 0x8132, lo: 0xaa, hi: 0xad},
+       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+       {value: 0x4650, lo: 0xbd, hi: 0xbd},
+       {value: 0x466c, lo: 0xbe, hi: 0xbe},
+       {value: 0x465e, lo: 0xbf, hi: 0xbf},
+       // Block 0x85, offset 0x2d1
+       {value: 0x0000, lo: 0x01},
+       {value: 0x467a, lo: 0x80, hi: 0x80},
+       // Block 0x86, offset 0x2d3
+       {value: 0x0000, lo: 0x01},
+       {value: 0x8132, lo: 0x82, hi: 0x84},
+       // Block 0x87, offset 0x2d5
+       {value: 0x0002, lo: 0x03},
+       {value: 0x0043, lo: 0x80, hi: 0x99},
+       {value: 0x0083, lo: 0x9a, hi: 0xb3},
+       {value: 0x0043, lo: 0xb4, hi: 0xbf},
+       // Block 0x88, offset 0x2d9
+       {value: 0x0002, lo: 0x04},
+       {value: 0x005b, lo: 0x80, hi: 0x8d},
+       {value: 0x0083, lo: 0x8e, hi: 0x94},
+       {value: 0x0093, lo: 0x96, hi: 0xa7},
+       {value: 0x0043, lo: 0xa8, hi: 0xbf},
+       // Block 0x89, offset 0x2de
+       {value: 0x0002, lo: 0x0b},
+       {value: 0x0073, lo: 0x80, hi: 0x81},
+       {value: 0x0083, lo: 0x82, hi: 0x9b},
+       {value: 0x0043, lo: 0x9c, hi: 0x9c},
+       {value: 0x0047, lo: 0x9e, hi: 0x9f},
+       {value: 0x004f, lo: 0xa2, hi: 0xa2},
+       {value: 0x0055, lo: 0xa5, hi: 0xa6},
+       {value: 0x005d, lo: 0xa9, hi: 0xac},
+       {value: 0x0067, lo: 0xae, hi: 0xb5},
+       {value: 0x0083, lo: 0xb6, hi: 0xb9},
+       {value: 0x008d, lo: 0xbb, hi: 0xbb},
+       {value: 0x0091, lo: 0xbd, hi: 0xbf},
+       // Block 0x8a, offset 0x2ea
+       {value: 0x0002, lo: 0x04},
+       {value: 0x0097, lo: 0x80, hi: 0x83},
+       {value: 0x00a1, lo: 0x85, hi: 0x8f},
+       {value: 0x0043, lo: 0x90, hi: 0xa9},
+       {value: 0x0083, lo: 0xaa, hi: 0xbf},
+       // Block 0x8b, offset 0x2ef
+       {value: 0x0002, lo: 0x08},
+       {value: 0x00af, lo: 0x80, hi: 0x83},
+       {value: 0x0043, lo: 0x84, hi: 0x85},
+       {value: 0x0049, lo: 0x87, hi: 0x8a},
+       {value: 0x0055, lo: 0x8d, hi: 0x94},
+       {value: 0x0067, lo: 0x96, hi: 0x9c},
+       {value: 0x0083, lo: 0x9e, hi: 0xb7},
+       {value: 0x0043, lo: 0xb8, hi: 0xb9},
+       {value: 0x0049, lo: 0xbb, hi: 0xbe},
+       // Block 0x8c, offset 0x2f8
+       {value: 0x0002, lo: 0x05},
+       {value: 0x0053, lo: 0x80, hi: 0x84},
+       {value: 0x005f, lo: 0x86, hi: 0x86},
+       {value: 0x0067, lo: 0x8a, hi: 0x90},
+       {value: 0x0083, lo: 0x92, hi: 0xab},
+       {value: 0x0043, lo: 0xac, hi: 0xbf},
+       // Block 0x8d, offset 0x2fe
+       {value: 0x0002, lo: 0x04},
+       {value: 0x006b, lo: 0x80, hi: 0x85},
+       {value: 0x0083, lo: 0x86, hi: 0x9f},
+       {value: 0x0043, lo: 0xa0, hi: 0xb9},
+       {value: 0x0083, lo: 0xba, hi: 0xbf},
+       // Block 0x8e, offset 0x303
+       {value: 0x0002, lo: 0x03},
+       {value: 0x008f, lo: 0x80, hi: 0x93},
+       {value: 0x0043, lo: 0x94, hi: 0xad},
+       {value: 0x0083, lo: 0xae, hi: 0xbf},
+       // Block 0x8f, offset 0x307
+       {value: 0x0002, lo: 0x04},
+       {value: 0x00a7, lo: 0x80, hi: 0x87},
+       {value: 0x0043, lo: 0x88, hi: 0xa1},
+       {value: 0x0083, lo: 0xa2, hi: 0xbb},
+       {value: 0x0043, lo: 0xbc, hi: 0xbf},
+       // Block 0x90, offset 0x30c
+       {value: 0x0002, lo: 0x03},
+       {value: 0x004b, lo: 0x80, hi: 0x95},
+       {value: 0x0083, lo: 0x96, hi: 0xaf},
+       {value: 0x0043, lo: 0xb0, hi: 0xbf},
+       // Block 0x91, offset 0x310
+       {value: 0x0003, lo: 0x0f},
+       {value: 0x01b8, lo: 0x80, hi: 0x80},
+       {value: 0x045f, lo: 0x81, hi: 0x81},
+       {value: 0x01bb, lo: 0x82, hi: 0x9a},
+       {value: 0x045b, lo: 0x9b, hi: 0x9b},
+       {value: 0x01c7, lo: 0x9c, hi: 0x9c},
+       {value: 0x01d0, lo: 0x9d, hi: 0x9d},
+       {value: 0x01d6, lo: 0x9e, hi: 0x9e},
+       {value: 0x01fa, lo: 0x9f, hi: 0x9f},
+       {value: 0x01eb, lo: 0xa0, hi: 0xa0},
+       {value: 0x01e8, lo: 0xa1, hi: 0xa1},
+       {value: 0x0173, lo: 0xa2, hi: 0xb2},
+       {value: 0x0188, lo: 0xb3, hi: 0xb3},
+       {value: 0x01a6, lo: 0xb4, hi: 0xba},
+       {value: 0x045f, lo: 0xbb, hi: 0xbb},
+       {value: 0x01bb, lo: 0xbc, hi: 0xbf},
+       // Block 0x92, offset 0x320
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01c7, lo: 0x80, hi: 0x94},
+       {value: 0x045b, lo: 0x95, hi: 0x95},
+       {value: 0x01c7, lo: 0x96, hi: 0x96},
+       {value: 0x01d0, lo: 0x97, hi: 0x97},
+       {value: 0x01d6, lo: 0x98, hi: 0x98},
+       {value: 0x01fa, lo: 0x99, hi: 0x99},
+       {value: 0x01eb, lo: 0x9a, hi: 0x9a},
+       {value: 0x01e8, lo: 0x9b, hi: 0x9b},
+       {value: 0x0173, lo: 0x9c, hi: 0xac},
+       {value: 0x0188, lo: 0xad, hi: 0xad},
+       {value: 0x01a6, lo: 0xae, hi: 0xb4},
+       {value: 0x045f, lo: 0xb5, hi: 0xb5},
+       {value: 0x01bb, lo: 0xb6, hi: 0xbf},
+       // Block 0x93, offset 0x32e
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01d9, lo: 0x80, hi: 0x8e},
+       {value: 0x045b, lo: 0x8f, hi: 0x8f},
+       {value: 0x01c7, lo: 0x90, hi: 0x90},
+       {value: 0x01d0, lo: 0x91, hi: 0x91},
+       {value: 0x01d6, lo: 0x92, hi: 0x92},
+       {value: 0x01fa, lo: 0x93, hi: 0x93},
+       {value: 0x01eb, lo: 0x94, hi: 0x94},
+       {value: 0x01e8, lo: 0x95, hi: 0x95},
+       {value: 0x0173, lo: 0x96, hi: 0xa6},
+       {value: 0x0188, lo: 0xa7, hi: 0xa7},
+       {value: 0x01a6, lo: 0xa8, hi: 0xae},
+       {value: 0x045f, lo: 0xaf, hi: 0xaf},
+       {value: 0x01bb, lo: 0xb0, hi: 0xbf},
+       // Block 0x94, offset 0x33c
+       {value: 0x0003, lo: 0x0d},
+       {value: 0x01eb, lo: 0x80, hi: 0x88},
+       {value: 0x045b, lo: 0x89, hi: 0x89},
+       {value: 0x01c7, lo: 0x8a, hi: 0x8a},
+       {value: 0x01d0, lo: 0x8b, hi: 0x8b},
+       {value: 0x01d6, lo: 0x8c, hi: 0x8c},
+       {value: 0x01fa, lo: 0x8d, hi: 0x8d},
+       {value: 0x01eb, lo: 0x8e, hi: 0x8e},
+       {value: 0x01e8, lo: 0x8f, hi: 0x8f},
+       {value: 0x0173, lo: 0x90, hi: 0xa0},
+       {value: 0x0188, lo: 0xa1, hi: 0xa1},
+       {value: 0x01a6, lo: 0xa2, hi: 0xa8},
+       {value: 0x045f, lo: 0xa9, hi: 0xa9},
+       {value: 0x01bb, lo: 0xaa, hi: 0xbf},
+       // Block 0x95, offset 0x34a
+       {value: 0x0000, lo: 0x05},
+       {value: 0x8132, lo: 0x80, hi: 0x86},
+       {value: 0x8132, lo: 0x88, hi: 0x98},
+       {value: 0x8132, lo: 0x9b, hi: 0xa1},
+       {value: 0x8132, lo: 0xa3, hi: 0xa4},
+       {value: 0x8132, lo: 0xa6, hi: 0xaa},
+       // Block 0x96, offset 0x350
+       {value: 0x0000, lo: 0x01},
+       {value: 0x812d, lo: 0x90, hi: 0x96},
+       // Block 0x97, offset 0x352
+       {value: 0x0000, lo: 0x02},
+       {value: 0x8132, lo: 0x84, hi: 0x89},
+       {value: 0x8102, lo: 0x8a, hi: 0x8a},
+       // Block 0x98, offset 0x355
+       {value: 0x0002, lo: 0x09},
+       {value: 0x0063, lo: 0x80, hi: 0x89},
+       {value: 0x1951, lo: 0x8a, hi: 0x8a},
+       {value: 0x1981, lo: 0x8b, hi: 0x8b},
+       {value: 0x199c, lo: 0x8c, hi: 0x8c},
+       {value: 0x19a2, lo: 0x8d, hi: 0x8d},
+       {value: 0x1bc0, lo: 0x8e, hi: 0x8e},
+       {value: 0x19ae, lo: 0x8f, hi: 0x8f},
+       {value: 0x197b, lo: 0xaa, hi: 0xaa},
+       {value: 0x197e, lo: 0xab, hi: 0xab},
+       // Block 0x99, offset 0x35f
+       {value: 0x0000, lo: 0x01},
+       {value: 0x193f, lo: 0x90, hi: 0x90},
+       // Block 0x9a, offset 0x361
+       {value: 0x0028, lo: 0x09},
+       {value: 0x2862, lo: 0x80, hi: 0x80},
+       {value: 0x2826, lo: 0x81, hi: 0x81},
+       {value: 0x2830, lo: 0x82, hi: 0x82},
+       {value: 0x2844, lo: 0x83, hi: 0x84},
+       {value: 0x284e, lo: 0x85, hi: 0x86},
+       {value: 0x283a, lo: 0x87, hi: 0x87},
+       {value: 0x2858, lo: 0x88, hi: 0x88},
+       {value: 0x0b6f, lo: 0x90, hi: 0x90},
+       {value: 0x08e7, lo: 0x91, hi: 0x91},
+}
+
+// recompMap: 7520 bytes (entries only)
+var recompMap map[uint32]rune
+var recompMapOnce sync.Once
+
+const recompMapPacked = "" +
+       "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0
+       "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1
+       "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2
+       "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3
+       "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4
+       "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5
+       "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7
+       "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8
+       "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9
+       "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA
+       "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB
+       "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC
+       "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD
+       "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE
+       "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF
+       "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1
+       "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2
+       "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3
+       "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4
+       "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5
+       "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6
+       "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9
+       "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA
+       "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB
+       "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC
+       "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD
+       "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0
+       "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1
+       "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2
+       "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3
+       "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4
+       "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5
+       "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7
+       "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8
+       "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9
+       "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA
+       "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB
+       "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC
+       "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED
+       "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE
+       "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF
+       "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1
+       "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2
+       "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3
+       "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4
+       "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5
+       "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6
+       "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9
+       "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA
+       "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB
+       "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC
+       "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD
+       "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF
+       "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100
+       "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101
+       "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102
+       "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103
+       "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104
+       "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105
+       "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106
+       "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107
+       "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108
+       "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109
+       "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A
+       "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B
+       "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C
+       "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D
+       "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E
+       "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F
+       "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112
+       "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113
+       "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114
+       "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115
+       "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116
+       "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117
+       "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118
+       "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119
+       "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A
+       "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B
+       "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C
+       "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D
+       "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E
+       "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F
+       "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120
+       "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121
+       "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122
+       "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123
+       "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124
+       "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125
+       "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128
+       "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129
+       "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A
+       "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B
+       "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C
+       "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D
+       "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E
+       "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F
+       "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130
+       "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134
+       "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135
+       "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136
+       "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137
+       "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139
+       "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A
+       "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B
+       "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C
+       "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D
+       "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E
+       "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143
+       "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144
+       "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145
+       "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146
+       "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147
+       "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148
+       "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C
+       "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D
+       "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E
+       "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F
+       "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150
+       "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151
+       "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154
+       "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155
+       "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156
+       "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157
+       "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158
+       "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159
+       "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A
+       "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B
+       "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C
+       "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D
+       "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E
+       "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F
+       "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160
+       "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161
+       "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162
+       "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163
+       "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164
+       "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165
+       "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168
+       "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169
+       "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A
+       "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B
+       "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C
+       "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D
+       "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E
+       "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F
+       "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170
+       "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171
+       "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172
+       "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173
+       "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174
+       "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175
+       "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176
+       "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177
+       "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178
+       "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179
+       "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A
+       "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B
+       "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C
+       "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D
+       "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E
+       "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0
+       "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1
+       "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF
+       "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0
+       "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD
+       "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE
+       "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF
+       "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0
+       "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1
+       "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2
+       "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3
+       "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4
+       "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5
+       "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6
+       "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7
+       "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8
+       "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9
+       "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA
+       "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB
+       "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC
+       "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE
+       "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF
+       "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0
+       "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1
+       "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2
+       "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3
+       "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6
+       "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7
+       "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8
+       "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9
+       "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA
+       "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB
+       "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC
+       "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED
+       "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE
+       "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF
+       "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0
+       "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4
+       "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5
+       "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8
+       "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9
+       "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA
+       "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB
+       "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC
+       "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD
+       "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE
+       "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF
+       "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200
+       "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201
+       "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202
+       "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203
+       "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204
+       "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205
+       "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206
+       "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207
+       "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208
+       "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209
+       "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A
+       "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B
+       "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C
+       "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D
+       "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E
+       "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F
+       "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210
+       "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211
+       "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212
+       "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213
+       "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214
+       "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215
+       "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216
+       "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217
+       "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218
+       "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219
+       "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A
+       "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B
+       "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E
+       "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F
+       "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226
+       "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227
+       "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228
+       "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229
+       "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A
+       "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B
+       "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C
+       "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D
+       "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E
+       "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F
+       "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230
+       "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231
+       "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232
+       "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233
+       "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385
+       "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386
+       "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388
+       "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389
+       "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A
+       "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C
+       "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E
+       "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F
+       "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390
+       "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA
+       "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB
+       "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC
+       "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD
+       "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE
+       "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF
+       "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0
+       "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA
+       "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB
+       "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC
+       "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD
+       "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE
+       "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3
+       "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4
+       "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400
+       "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401
+       "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403
+       "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407
+       "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C
+       "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D
+       "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E
+       "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419
+       "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439
+       "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450
+       "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451
+       "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453
+       "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457
+       "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C
+       "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D
+       "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E
+       "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476
+       "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477
+       "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1
+       "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2
+       "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0
+       "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1
+       "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2
+       "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3
+       "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6
+       "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7
+       "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA
+       "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB
+       "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC
+       "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD
+       "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE
+       "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF
+       "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2
+       "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3
+       "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4
+       "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5
+       "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6
+       "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7
+       "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA
+       "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB
+       "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC
+       "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED
+       "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE
+       "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF
+       "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0
+       "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1
+       "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2
+       "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3
+       "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4
+       "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5
+       "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8
+       "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9
+       "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622
+       "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623
+       "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624
+       "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625
+       "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626
+       "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0
+       "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2
+       "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3
+       "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929
+       "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931
+       "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934
+       "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB
+       "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC
+       "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48
+       "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B
+       "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C
+       "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94
+       "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA
+       "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB
+       "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC
+       "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48
+       "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0
+       "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7
+       "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8
+       "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA
+       "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB
+       "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A
+       "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B
+       "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C
+       "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA
+       "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC
+       "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD
+       "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE
+       "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026
+       "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06
+       "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08
+       "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A
+       "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C
+       "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E
+       "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12
+       "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B
+       "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D
+       "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40
+       "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41
+       "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43
+       "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00
+       "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01
+       "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02
+       "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03
+       "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04
+       "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05
+       "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06
+       "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07
+       "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08
+       "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09
+       "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A
+       "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B
+       "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C
+       "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D
+       "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E
+       "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F
+       "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10
+       "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11
+       "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12
+       "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13
+       "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14
+       "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15
+       "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16
+       "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17
+       "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18
+       "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19
+       "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A
+       "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B
+       "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C
+       "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D
+       "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E
+       "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F
+       "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20
+       "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21
+       "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22
+       "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23
+       "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24
+       "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25
+       "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26
+       "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27
+       "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28
+       "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29
+       "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A
+       "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B
+       "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C
+       "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D
+       "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E
+       "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F
+       "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30
+       "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31
+       "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32
+       "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33
+       "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34
+       "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35
+       "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36
+       "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37
+       "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38
+       "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39
+       "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A
+       "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B
+       "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C
+       "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D
+       "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E
+       "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F
+       "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40
+       "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41
+       "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42
+       "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43
+       "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44
+       "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45
+       "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46
+       "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47
+       "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48
+       "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49
+       "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A
+       "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B
+       "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C
+       "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D
+       "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E
+       "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F
+       "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50
+       "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51
+       "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52
+       "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53
+       "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54
+       "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55
+       "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56
+       "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57
+       "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58
+       "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59
+       "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A
+       "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B
+       "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C
+       "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D
+       "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E
+       "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F
+       "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60
+       "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61
+       "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62
+       "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63
+       "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64
+       "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65
+       "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66
+       "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67
+       "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68
+       "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69
+       "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A
+       "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B
+       "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C
+       "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D
+       "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E
+       "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F
+       "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70
+       "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71
+       "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72
+       "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73
+       "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74
+       "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75
+       "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76
+       "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77
+       "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78
+       "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79
+       "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A
+       "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B
+       "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C
+       "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D
+       "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E
+       "\x00v\x03#\x00\x00\x1e\u007f" + // 0x00760323: 0x00001E7F
+       "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80
+       "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81
+       "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82
+       "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83
+       "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84
+       "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85
+       "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86
+       "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87
+       "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88
+       "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89
+       "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A
+       "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B
+       "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C
+       "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D
+       "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E
+       "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F
+       "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90
+       "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91
+       "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92
+       "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93
+       "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94
+       "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95
+       "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96
+       "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97
+       "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98
+       "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99
+       "\x01\u007f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B
+       "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0
+       "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1
+       "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2
+       "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3
+       "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4
+       "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5
+       "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6
+       "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7
+       "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8
+       "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9
+       "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA
+       "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB
+       "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC
+       "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD
+       "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE
+       "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF
+       "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0
+       "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1
+       "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2
+       "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3
+       "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4
+       "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5
+       "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6
+       "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7
+       "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8
+       "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9
+       "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA
+       "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB
+       "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC
+       "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD
+       "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE
+       "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF
+       "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0
+       "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1
+       "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2
+       "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3
+       "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4
+       "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5
+       "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6
+       "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7
+       "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8
+       "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9
+       "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA
+       "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB
+       "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC
+       "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD
+       "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE
+       "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF
+       "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0
+       "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1
+       "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2
+       "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3
+       "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4
+       "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5
+       "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6
+       "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7
+       "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8
+       "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9
+       "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA
+       "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB
+       "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC
+       "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD
+       "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE
+       "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF
+       "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0
+       "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1
+       "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2
+       "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3
+       "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4
+       "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5
+       "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6
+       "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7
+       "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8
+       "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9
+       "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA
+       "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB
+       "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC
+       "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED
+       "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE
+       "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF
+       "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0
+       "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1
+       "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2
+       "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3
+       "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4
+       "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5
+       "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6
+       "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7
+       "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8
+       "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9
+       "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00
+       "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01
+       "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02
+       "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03
+       "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04
+       "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05
+       "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06
+       "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07
+       "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08
+       "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09
+       "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A
+       "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B
+       "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C
+       "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D
+       "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E
+       "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F
+       "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10
+       "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11
+       "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12
+       "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13
+       "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14
+       "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15
+       "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18
+       "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19
+       "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A
+       "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B
+       "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C
+       "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D
+       "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20
+       "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21
+       "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22
+       "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23
+       "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24
+       "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25
+       "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26
+       "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27
+       "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28
+       "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29
+       "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A
+       "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B
+       "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C
+       "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D
+       "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E
+       "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F
+       "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30
+       "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31
+       "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32
+       "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33
+       "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34
+       "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35
+       "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36
+       "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37
+       "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38
+       "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39
+       "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A
+       "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B
+       "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C
+       "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D
+       "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E
+       "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F
+       "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40
+       "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41
+       "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42
+       "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43
+       "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44
+       "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45
+       "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48
+       "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49
+       "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A
+       "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B
+       "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C
+       "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D
+       "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50
+       "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51
+       "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52
+       "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53
+       "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54
+       "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55
+       "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56
+       "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57
+       "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59
+       "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B
+       "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D
+       "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F
+       "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60
+       "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61
+       "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62
+       "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63
+       "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64
+       "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65
+       "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66
+       "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67
+       "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68
+       "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69
+       "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A
+       "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B
+       "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C
+       "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D
+       "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E
+       "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F
+       "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70
+       "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72
+       "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74
+       "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76
+       "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78
+       "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A
+       "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C
+       "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80
+       "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81
+       "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82
+       "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83
+       "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84
+       "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85
+       "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86
+       "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87
+       "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88
+       "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89
+       "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A
+       "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B
+       "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C
+       "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D
+       "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E
+       "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F
+       "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90
+       "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91
+       "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92
+       "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93
+       "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94
+       "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95
+       "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96
+       "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97
+       "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98
+       "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99
+       "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A
+       "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B
+       "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C
+       "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D
+       "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E
+       "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F
+       "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0
+       "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1
+       "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2
+       "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3
+       "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4
+       "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5
+       "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6
+       "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7
+       "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8
+       "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9
+       "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA
+       "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB
+       "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC
+       "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD
+       "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE
+       "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF
+       "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0
+       "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1
+       "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2
+       "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3
+       "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4
+       "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6
+       "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7
+       "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8
+       "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9
+       "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA
+       "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC
+       "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1
+       "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2
+       "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3
+       "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4
+       "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6
+       "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7
+       "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8
+       "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA
+       "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC
+       "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD
+       "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE
+       "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF
+       "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0
+       "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1
+       "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2
+       "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6
+       "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7
+       "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8
+       "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9
+       "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA
+       "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD
+       "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE
+       "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF
+       "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0
+       "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1
+       "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2
+       "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4
+       "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5
+       "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6
+       "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7
+       "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8
+       "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9
+       "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA
+       "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC
+       "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED
+       "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2
+       "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3
+       "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4
+       "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6
+       "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7
+       "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8
+       "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA
+       "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC
+       "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A
+       "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B
+       "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE
+       "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD
+       "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE
+       "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF
+       "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204
+       "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209
+       "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C
+       "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224
+       "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226
+       "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241
+       "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244
+       "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247
+       "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249
+       "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260
+       "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262
+       "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D
+       "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E
+       "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F
+       "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270
+       "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271
+       "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274
+       "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275
+       "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278
+       "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279
+       "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280
+       "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281
+       "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284
+       "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285
+       "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288
+       "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289
+       "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC
+       "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD
+       "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE
+       "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF
+       "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0
+       "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1
+       "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2
+       "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3
+       "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA
+       "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB
+       "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC
+       "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED
+       "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C
+       "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E
+       "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050
+       "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052
+       "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054
+       "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056
+       "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058
+       "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A
+       "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C
+       "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E
+       "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060
+       "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062
+       "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065
+       "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067
+       "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069
+       "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070
+       "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071
+       "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073
+       "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074
+       "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076
+       "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077
+       "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079
+       "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A
+       "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C
+       "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D
+       "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094
+       "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E
+       "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC
+       "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE
+       "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0
+       "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2
+       "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4
+       "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6
+       "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8
+       "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA
+       "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC
+       "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE
+       "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0
+       "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2
+       "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5
+       "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7
+       "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9
+       "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0
+       "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1
+       "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3
+       "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4
+       "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6
+       "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7
+       "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9
+       "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA
+       "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC
+       "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD
+       "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4
+       "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7
+       "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8
+       "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9
+       "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA
+       "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE
+       "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A
+       "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C
+       "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB
+       "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E
+       "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F
+       "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B
+       "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C
+       "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB
+       "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC
+       "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE
+       "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA
+       "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB
+       ""
+       // Total size of tables: 53KB (54006 bytes)
diff --git a/libgo/go/golang.org/x/text/unicode/norm/transform.go b/libgo/go/golang.org/x/text/unicode/norm/transform.go
new file mode 100644 (file)
index 0000000..a1d366a
--- /dev/null
@@ -0,0 +1,88 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+import (
+       "unicode/utf8"
+
+       "golang.org/x/text/transform"
+)
+
+// Reset implements the Reset method of the transform.Transformer interface.
+func (Form) Reset() {}
+
+// Transform implements the Transform method of the transform.Transformer
+// interface. It may need to write segments of up to MaxSegmentSize at once.
+// Users should either catch ErrShortDst and allow dst to grow or have dst be at
+// least of size MaxTransformChunkSize to be guaranteed of progress.
+func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       // Cap the maximum number of src bytes to check.
+       b := src
+       eof := atEOF
+       if ns := len(dst); ns < len(b) {
+               err = transform.ErrShortDst
+               eof = false
+               b = b[:ns]
+       }
+       i, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), eof)
+       n := copy(dst, b[:i])
+       if !ok {
+               nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF)
+               return nDst + n, nSrc + n, err
+       }
+
+       if err == nil && n < len(src) && !atEOF {
+               err = transform.ErrShortSrc
+       }
+       return n, n, err
+}
+
+func flushTransform(rb *reorderBuffer) bool {
+       // Write out (must fully fit in dst, or else it is an ErrShortDst).
+       if len(rb.out) < rb.nrune*utf8.UTFMax {
+               return false
+       }
+       rb.out = rb.out[rb.flushCopy(rb.out):]
+       return true
+}
+
+var errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc}
+
+// transform implements the transform.Transformer interface. It is only called
+// when quickSpan does not pass for a given string.
+func (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+       // TODO: get rid of reorderBuffer. See CL 23460044.
+       rb := reorderBuffer{}
+       rb.init(f, src)
+       for {
+               // Load segment into reorder buffer.
+               rb.setFlusher(dst[nDst:], flushTransform)
+               end := decomposeSegment(&rb, nSrc, atEOF)
+               if end < 0 {
+                       return nDst, nSrc, errs[-end]
+               }
+               nDst = len(dst) - len(rb.out)
+               nSrc = end
+
+               // Next quickSpan.
+               end = rb.nsrc
+               eof := atEOF
+               if n := nSrc + len(dst) - nDst; n < end {
+                       err = transform.ErrShortDst
+                       end = n
+                       eof = false
+               }
+               end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof)
+               n := copy(dst[nDst:], rb.src.bytes[nSrc:end])
+               nSrc += n
+               nDst += n
+               if ok {
+                       if err == nil && n < rb.nsrc && !atEOF {
+                               err = transform.ErrShortSrc
+                       }
+                       return nDst, nSrc, err
+               }
+       }
+}
diff --git a/libgo/go/golang.org/x/text/unicode/norm/trie.go b/libgo/go/golang.org/x/text/unicode/norm/trie.go
new file mode 100644 (file)
index 0000000..423386b
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package norm
+
+type valueRange struct {
+       value  uint16 // header: value:stride
+       lo, hi byte   // header: lo:n
+}
+
+type sparseBlocks struct {
+       values []valueRange
+       offset []uint16
+}
+
+var nfcSparse = sparseBlocks{
+       values: nfcSparseValues[:],
+       offset: nfcSparseOffset[:],
+}
+
+var nfkcSparse = sparseBlocks{
+       values: nfkcSparseValues[:],
+       offset: nfkcSparseOffset[:],
+}
+
+var (
+       nfcData  = newNfcTrie(0)
+       nfkcData = newNfkcTrie(0)
+)
+
+// lookupValue determines the type of block n and looks up the value for b.
+// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
+// is a list of ranges with an accompanying value. Given a matching range r,
+// the value for b is by r.value + (b - r.lo) * stride.
+func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
+       offset := t.offset[n]
+       header := t.values[offset]
+       lo := offset + 1
+       hi := lo + uint16(header.lo)
+       for lo < hi {
+               m := lo + (hi-lo)/2
+               r := t.values[m]
+               if r.lo <= b && b <= r.hi {
+                       return r.value + uint16(b-r.lo)*header.value
+               }
+               if b < r.lo {
+                       hi = m
+               } else {
+                       lo = m + 1
+               }
+       }
+       return 0
+}
index 21baa02a8de38b3eb7faf35ba56e281f8ab412cd..19e1e421a38c0dda4ea79990520c6ee69184b22d 100644 (file)
@@ -87,6 +87,7 @@ type Pass struct {
        OtherFiles []string       // names of non-Go files of this package
        Pkg        *types.Package // type information about the package
        TypesInfo  *types.Info    // type information about the syntax trees
+       TypesSizes types.Sizes    // function for computing sizes of types
 
        // Report reports a Diagnostic, a finding about a specific location
        // in the analyzed source code such as a potential mistake.
@@ -127,10 +128,32 @@ type Pass struct {
        // See comments for ExportObjectFact.
        ExportPackageFact func(fact Fact)
 
+       // AllPackageFacts returns a new slice containing all package facts in unspecified order.
+       // WARNING: This is an experimental API and may change in the future.
+       AllPackageFacts func() []PackageFact
+
+       // AllObjectFacts returns a new slice containing all object facts in unspecified order.
+       // WARNING: This is an experimental API and may change in the future.
+       AllObjectFacts func() []ObjectFact
+
        /* Further fields may be added in future. */
        // For example, suggested or applied refactorings.
 }
 
+// PackageFact is a package together with an associated fact.
+// WARNING: This is an experimental API and may change in the future.
+type PackageFact struct {
+       Package *types.Package
+       Fact    Fact
+}
+
+// ObjectFact is an object together with an associated fact.
+// WARNING: This is an experimental API and may change in the future.
+type ObjectFact struct {
+       Object types.Object
+       Fact   Fact
+}
+
 // Reportf is a helper function that reports a Diagnostic using the
 // specified position and formatted error message.
 func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) {
@@ -138,6 +161,15 @@ func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) {
        pass.Report(Diagnostic{Pos: pos, Message: msg})
 }
 
+// reportNodef is a helper function that reports a Diagnostic using the
+// range denoted by the AST node.
+//
+// WARNING: This is an experimental API and may change in the future.
+func (pass *Pass) reportNodef(node ast.Node, format string, args ...interface{}) {
+       msg := fmt.Sprintf(format, args...)
+       pass.Report(Diagnostic{Pos: node.Pos(), End: node.End(), Message: msg})
+}
+
 func (pass *Pass) String() string {
        return fmt.Sprintf("%s@%s", pass.Analyzer.Name, pass.Pkg.Path())
 }
@@ -180,13 +212,17 @@ type Fact interface {
        AFact() // dummy method to avoid type errors
 }
 
-// A Diagnostic is a message associated with a source location.
+// A Diagnostic is a message associated with a source location or range.
 //
 // An Analyzer may return a variety of diagnostics; the optional Category,
 // which should be a constant, may be used to classify them.
 // It is primarily intended to make it easy to look up documentation.
+//
+// If End is provided, the diagnostic is specified to apply to the range between
+// Pos and End.
 type Diagnostic struct {
        Pos      token.Pos
-       Category string // optional
+       End      token.Pos // optional
+       Category string    // optional
        Message  string
 }
index f925849ab508972b026d7c4f11e3ac660dc45136..2d44b0458a9a2b8b66008e17c9cc6d9cbe5f945c 100644 (file)
@@ -246,7 +246,7 @@ An Analyzer that uses facts must declare their types:
 
        var Analyzer = &analysis.Analyzer{
                Name:       "printf",
-               FactTypes: []reflect.Type{reflect.TypeOf(new(isWrapper))},
+               FactTypes: []analysis.Fact{new(isWrapper)},
                ...
        }
 
index 729ac3b41768dab8d13a68b634df46dd1f6543d9..a3c2f096300f2431a249e6a6fce21fbfc98e30fc 100644 (file)
@@ -8,6 +8,7 @@ package analysisflags
 
 import (
        "crypto/sha256"
+       "encoding/gob"
        "encoding/json"
        "flag"
        "fmt"
@@ -32,6 +33,14 @@ var (
 // including (in multi mode) a flag named after the analyzer,
 // parses the flags, then filters and returns the list of
 // analyzers enabled by flags.
+//
+// The result is intended to be passed to unitchecker.Run or checker.Run.
+// Use in unitchecker.Run will gob.Register all fact types for the returned
+// graph of analyzers but of course not the ones only reachable from
+// dropped analyzers. To avoid inconsistency about which gob types are
+// registered from run to run, Parse itself gob.Registers all the facts
+// only reachable from dropped analyzers.
+// This is not a particularly elegant API, but this is an internal package.
 func Parse(analyzers []*analysis.Analyzer, multi bool) []*analysis.Analyzer {
        // Connect each analysis flag to the command line as -analysis.flag.
        enabled := make(map[*analysis.Analyzer]*triState)
@@ -88,6 +97,8 @@ func Parse(analyzers []*analysis.Analyzer, multi bool) []*analysis.Analyzer {
                os.Exit(0)
        }
 
+       everything := expand(analyzers)
+
        // If any -NAME flag is true,  run only those analyzers. Otherwise,
        // if any -NAME flag is false, run all but those analyzers.
        if multi {
@@ -119,9 +130,35 @@ func Parse(analyzers []*analysis.Analyzer, multi bool) []*analysis.Analyzer {
                }
        }
 
+       // Register fact types of skipped analyzers
+       // in case we encounter them in imported files.
+       kept := expand(analyzers)
+       for a := range everything {
+               if !kept[a] {
+                       for _, f := range a.FactTypes {
+                               gob.Register(f)
+                       }
+               }
+       }
+
        return analyzers
 }
 
+func expand(analyzers []*analysis.Analyzer) map[*analysis.Analyzer]bool {
+       seen := make(map[*analysis.Analyzer]bool)
+       var visitAll func([]*analysis.Analyzer)
+       visitAll = func(analyzers []*analysis.Analyzer) {
+               for _, a := range analyzers {
+                       if !seen[a] {
+                               seen[a] = true
+                               visitAll(a.Requires)
+                       }
+               }
+       }
+       visitAll(analyzers)
+       return seen
+}
+
 func printFlags() {
        type jsonFlag struct {
                Name  string
@@ -152,12 +189,13 @@ func printFlags() {
 // addVersionFlag registers a -V flag that, if set,
 // prints the executable version and exits 0.
 //
-// It is a variable not a function to permit easy
-// overriding in the copy vendored in $GOROOT/src/cmd/vet:
-//
-// func init() { addVersionFlag = objabi.AddVersionFlag }
-var addVersionFlag = func() {
-       flag.Var(versionFlag{}, "V", "print version and exit")
+// If the -V flag already exists — for example, because it was already
+// registered by a call to cmd/internal/objabi.AddVersionFlag — then
+// addVersionFlag does nothing.
+func addVersionFlag() {
+       if flag.Lookup("V") == nil {
+               flag.Var(versionFlag{}, "V", "print version and exit")
+       }
 }
 
 // versionFlag minimally complies with the -V protocol required by "go vet".
@@ -285,9 +323,14 @@ func PrintPlain(fset *token.FileSet, diag analysis.Diagnostic) {
 
        // -c=N: show offending line plus N lines of context.
        if Context >= 0 {
+               posn := fset.Position(diag.Pos)
+               end := fset.Position(diag.End)
+               if !end.IsValid() {
+                       end = posn
+               }
                data, _ := ioutil.ReadFile(posn.Filename)
                lines := strings.Split(string(data), "\n")
-               for i := posn.Line - Context; i <= posn.Line+Context; i++ {
+               for i := posn.Line - Context; i <= end.Line+Context; i++ {
                        if 1 <= i && i <= len(lines) {
                                fmt.Fprintf(os.Stderr, "%d\t%s\n", i, lines[i-1])
                        }
@@ -315,6 +358,8 @@ func (tree JSONTree) Add(fset *token.FileSet, id, name string, diags []analysis.
                        Message  string `json:"message"`
                }
                var diagnostics []jsonDiagnostic
+               // TODO(matloob): Should the JSON diagnostics contain ranges?
+               // If so, how should they be formatted?
                for _, f := range diags {
                        diagnostics = append(diagnostics, jsonDiagnostic{
                                Category: f.Category,
index 043b97896dd6136463f52e4a45d30638ddbaf230..c5a70f3b7d65ada3d6b2acb201cda7d32ab9fb2f 100644 (file)
@@ -4,6 +4,7 @@ import (
        "flag"
        "fmt"
        "log"
+       "os"
        "sort"
        "strings"
 
@@ -47,6 +48,7 @@ func Help(progname string, analyzers []*analysis.Analyzer, args []string) {
                                fs.Var(f.Value, f.Name, f.Usage)
                        }
                })
+               fs.SetOutput(os.Stdout)
                fs.PrintDefaults()
 
                fmt.Printf("\nTo see details and flags of a specific analyzer, run '%s help name'.\n", progname)
@@ -75,6 +77,7 @@ outer:
                                        }
                                        fs.Var(f.Value, a.Name+"."+f.Name, f.Usage)
                                })
+                               fs.SetOutput(os.Stdout)
                                fs.PrintDefaults()
 
                                if len(paras) > 1 {
diff --git a/libgo/go/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go b/libgo/go/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go
deleted file mode 100644 (file)
index 8f97410..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package analysisflags
-
-import "cmd/internal/objabi"
-
-// This additional file changes the behavior of the vendored code.
-
-func init() { addVersionFlag = objabi.AddVersionFlag }
index dce1ef7bd5e6d0626cf441353db71329fc7712d8..d41c4e97e32689cb65c980405e3cd8a79983ddce 100644 (file)
@@ -114,7 +114,8 @@ func init() {
                        // library we cannot assume types.SizesFor is consistent with arches.
                        // For now, assume 64-bit norms and print a warning.
                        // But this warning should really be deferred until we attempt to use
-                       // arch, which is very unlikely.
+                       // arch, which is very unlikely. Better would be
+                       // to defer size computation until we have Pass.TypesSizes.
                        arch.sizes = types.SizesFor("gc", "amd64")
                        log.Printf("unknown architecture %s", arch.name)
                }
@@ -129,7 +130,7 @@ var (
        asmPlusBuild = re(`//\s+\+build\s+([^\n]+)`)
        asmTEXT      = re(`\bTEXT\b(.*)·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+()]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`)
        asmDATA      = re(`\b(DATA|GLOBL)\b`)
-       asmNamedFP   = re(`([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`)
+       asmNamedFP   = re(`\$?([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`)
        asmUnnamedFP = re(`[^+\-0-9](([0-9]+)\(FP\))`)
        asmSP        = re(`[^+\-0-9](([0-9]+)\(([A-Z0-9]+)\))`)
        asmOpcode    = re(`^\s*(?:[A-Z0-9a-z_]+:)?\s*([A-Z]+)\s*([^,]*)(?:,\s*(.*))?`)
@@ -183,6 +184,7 @@ Files:
                        fnName             string
                        localSize, argSize int
                        wroteSP            bool
+                       noframe            bool
                        haveRetArg         bool
                        retLine            []int
                )
@@ -230,6 +232,11 @@ Files:
                                }
                        }
 
+                       // Ignore comments and commented-out code.
+                       if i := strings.Index(line, "//"); i >= 0 {
+                               line = line[:i]
+                       }
+
                        if m := asmTEXT.FindStringSubmatch(line); m != nil {
                                flushRet()
                                if arch == "" {
@@ -253,7 +260,7 @@ Files:
                                        // identifiers to represent the directory separator.
                                        pkgPath = strings.Replace(pkgPath, "∕", "/", -1)
                                        if pkgPath != pass.Pkg.Path() {
-                                               log.Printf("%s:%d: [%s] cannot check cross-package assembly function: %s is in package %s", fname, lineno, arch, fnName, pkgPath)
+                                               // log.Printf("%s:%d: [%s] cannot check cross-package assembly function: %s is in package %s", fname, lineno, arch, fnName, pkgPath)
                                                fn = nil
                                                fnName = ""
                                                continue
@@ -274,7 +281,8 @@ Files:
                                        localSize += archDef.intSize
                                }
                                argSize, _ = strconv.Atoi(m[5])
-                               if fn == nil && !strings.Contains(fnName, "<>") {
+                               noframe = strings.Contains(flag, "NOFRAME")
+                               if fn == nil && !strings.Contains(fnName, "<>") && !noframe {
                                        badf("function %s missing Go declaration", fnName)
                                }
                                wroteSP = false
@@ -304,13 +312,18 @@ Files:
                                continue
                        }
 
-                       if strings.Contains(line, ", "+archDef.stack) || strings.Contains(line, ",\t"+archDef.stack) {
+                       if strings.Contains(line, ", "+archDef.stack) || strings.Contains(line, ",\t"+archDef.stack) || strings.Contains(line, "NOP "+archDef.stack) || strings.Contains(line, "NOP\t"+archDef.stack) {
                                wroteSP = true
                                continue
                        }
 
+                       if arch == "wasm" && strings.Contains(line, "CallImport") {
+                               // CallImport is a call out to magic that can write the result.
+                               haveRetArg = true
+                       }
+
                        for _, m := range asmSP.FindAllStringSubmatch(line, -1) {
-                               if m[3] != archDef.stack || wroteSP {
+                               if m[3] != archDef.stack || wroteSP || noframe {
                                        continue
                                }
                                off := 0
@@ -370,7 +383,7 @@ Files:
                                        }
                                        continue
                                }
-                               asmCheckVar(badf, fn, line, m[0], off, v)
+                               asmCheckVar(badf, fn, line, m[0], off, v, archDef)
                        }
                }
                flushRet()
@@ -588,7 +601,7 @@ func asmParseDecl(pass *analysis.Pass, decl *ast.FuncDecl) map[string]*asmFunc {
 }
 
 // asmCheckVar checks a single variable reference.
-func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr string, off int, v *asmVar) {
+func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr string, off int, v *asmVar, archDef *asmArch) {
        m := asmOpcode.FindStringSubmatch(line)
        if m == nil {
                if !strings.HasPrefix(strings.TrimSpace(line), "//") {
@@ -597,6 +610,8 @@ func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr stri
                return
        }
 
+       addr := strings.HasPrefix(expr, "$")
+
        // Determine operand sizes from instruction.
        // Typically the suffix suffices, but there are exceptions.
        var src, dst, kind asmKind
@@ -616,10 +631,13 @@ func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr stri
        // They just take the address of it.
        case "386.LEAL":
                dst = 4
+               addr = true
        case "amd64.LEAQ":
                dst = 8
+               addr = true
        case "amd64p32.LEAL":
                dst = 4
+               addr = true
        default:
                switch fn.arch.name {
                case "386", "amd64":
@@ -724,6 +742,11 @@ func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr stri
                vs = v.inner[0].size
                vt = v.inner[0].typ
        }
+       if addr {
+               vk = asmKind(archDef.ptrSize)
+               vs = archDef.ptrSize
+               vt = "address"
+       }
 
        if off != v.off {
                var inner bytes.Buffer
index 833c9d7aae1c4eed309107871846ac43db5a7325..c82d3675b95f49ef7081cb0448504e48ca5a44de 100644 (file)
@@ -30,8 +30,13 @@ func run(pass *analysis.Pass) (interface{}, error) {
        nodeFilter := []ast.Node{
                (*ast.BinaryExpr)(nil),
        }
+       seen := make(map[*ast.BinaryExpr]bool)
        inspect.Preorder(nodeFilter, func(n ast.Node) {
                e := n.(*ast.BinaryExpr)
+               if seen[e] {
+                       // Already processed as a subexpression of an earlier node.
+                       return
+               }
 
                var op boolOp
                switch e.Op {
@@ -43,10 +48,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
                        return
                }
 
-               // TODO(adonovan): this reports n(n-1)/2 errors for an
-               // expression e||...||e of depth n. Fix.
-               // See https://golang.org/issue/28086.
-               comm := op.commutativeSets(pass.TypesInfo, e)
+               comm := op.commutativeSets(pass.TypesInfo, e, seen)
                for _, exprs := range comm {
                        op.checkRedundant(pass, exprs)
                        op.checkSuspect(pass, exprs)
@@ -70,8 +72,9 @@ var (
 // expressions in e that are connected by op.
 // For example, given 'a || b || f() || c || d' with the or op,
 // commutativeSets returns {{b, a}, {d, c}}.
-func (op boolOp) commutativeSets(info *types.Info, e *ast.BinaryExpr) [][]ast.Expr {
-       exprs := op.split(e)
+// commutativeSets adds any expanded BinaryExprs to seen.
+func (op boolOp) commutativeSets(info *types.Info, e *ast.BinaryExpr, seen map[*ast.BinaryExpr]bool) [][]ast.Expr {
+       exprs := op.split(e, seen)
 
        // Partition the slice of expressions into commutative sets.
        i := 0
@@ -188,11 +191,13 @@ func hasSideEffects(info *types.Info, e ast.Expr) bool {
 // split returns a slice of all subexpressions in e that are connected by op.
 // For example, given 'a || (b || c) || d' with the or op,
 // split returns []{d, c, b, a}.
-func (op boolOp) split(e ast.Expr) (exprs []ast.Expr) {
+// seen[e] is already true; any newly processed exprs are added to seen.
+func (op boolOp) split(e ast.Expr, seen map[*ast.BinaryExpr]bool) (exprs []ast.Expr) {
        for {
                e = unparen(e)
                if b, ok := e.(*ast.BinaryExpr); ok && b.Op == op.tok {
-                       exprs = append(exprs, op.split(b.Y)...)
+                       seen[b] = true
+                       exprs = append(exprs, op.split(b.Y, seen)...)
                        e = b.X
                } else {
                        exprs = append(exprs, e)
index a6e76a192dea966a1a87bdc729cee467adb6344f..42a690dbab6be5ee707fee6e1748d3e1d4bc09b2 100644 (file)
@@ -9,7 +9,6 @@ package cgocall
 import (
        "fmt"
        "go/ast"
-       "go/build"
        "go/format"
        "go/parser"
        "go/token"
@@ -46,7 +45,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
                return nil, nil // doesn't use cgo
        }
 
-       cgofiles, info, err := typeCheckCgoSourceFiles(pass.Fset, pass.Pkg, pass.Files, pass.TypesInfo)
+       cgofiles, info, err := typeCheckCgoSourceFiles(pass.Fset, pass.Pkg, pass.Files, pass.TypesInfo, pass.TypesSizes)
        if err != nil {
                return nil, err
        }
@@ -172,7 +171,7 @@ func checkCgo(fset *token.FileSet, f *ast.File, info *types.Info, reportf func(t
 // limited ourselves here to preserving function bodies and initializer
 // expressions since that is all that the cgocall analyzer needs.
 //
-func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*ast.File, info *types.Info) ([]*ast.File, *types.Info, error) {
+func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*ast.File, info *types.Info, sizes types.Sizes) ([]*ast.File, *types.Info, error) {
        const thispkg = "·this·"
 
        // Which files are cgo files?
@@ -270,8 +269,7 @@ func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*a
                Importer: importerFunc(func(path string) (*types.Package, error) {
                        return importMap[path], nil
                }),
-               // TODO(adonovan): Sizes should probably be provided by analysis.Pass.
-               Sizes: types.SizesFor("gccgo", build.Default.GOARCH),
+               Sizes: sizes,
                Error: func(error) {}, // ignore errors (e.g. unused import)
        }
 
index 9cca7781d004429f5c2610b47fc065c71220426e..2abe7c6d51e803a5bc927d0581d3340d37254f16 100644 (file)
@@ -21,7 +21,16 @@ const Doc = `check for unkeyed composite literals
 This analyzer reports a diagnostic for composite literals of struct
 types imported from another package that do not use the field-keyed
 syntax. Such literals are fragile because the addition of a new field
-(even if unexported) to the struct will cause compilation to fail.`
+(even if unexported) to the struct will cause compilation to fail.
+
+As an example,
+
+       err = &net.DNSConfigError{err}
+
+should be replaced by:
+
+       err = &net.DNSConfigError{Err: err}
+`
 
 var Analyzer = &analysis.Analyzer{
        Name:             "composites",
diff --git a/libgo/go/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go b/libgo/go/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go
new file mode 100644 (file)
index 0000000..c411466
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// The errorsas package defines an Analyzer that checks that the second arugment to
+// errors.As is a pointer to a type implementing error.
+package errorsas
+
+import (
+       "go/ast"
+       "go/types"
+
+       "golang.org/x/tools/go/analysis"
+       "golang.org/x/tools/go/analysis/passes/inspect"
+       "golang.org/x/tools/go/ast/inspector"
+       "golang.org/x/tools/go/types/typeutil"
+)
+
+const doc = `report passing non-pointer or non-error values to errors.As
+
+The errorsas analysis reports calls to errors.As where the type
+of the second argument is not a pointer to a type implementing error.`
+
+var Analyzer = &analysis.Analyzer{
+       Name:     "errorsas",
+       Doc:      doc,
+       Requires: []*analysis.Analyzer{inspect.Analyzer},
+       Run:      run,
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+       switch pass.Pkg.Path() {
+       case "errors", "errors_test":
+               // These packages know how to use their own APIs.
+               // Sometimes they are testing what happens to incorrect programs.
+               return nil, nil
+       }
+
+       inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+
+       nodeFilter := []ast.Node{
+               (*ast.CallExpr)(nil),
+       }
+       inspect.Preorder(nodeFilter, func(n ast.Node) {
+               call := n.(*ast.CallExpr)
+               fn := typeutil.StaticCallee(pass.TypesInfo, call)
+               if fn == nil {
+                       return // not a static call
+               }
+               if len(call.Args) < 2 {
+                       return // not enough arguments, e.g. called with return values of another function
+               }
+               if fn.FullName() == "errors.As" && !pointerToInterfaceOrError(pass, call.Args[1]) {
+                       pass.Reportf(call.Pos(), "second argument to errors.As must be a pointer to an interface or a type implementing error")
+               }
+       })
+       return nil, nil
+}
+
+var errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
+
+// pointerToInterfaceOrError reports whether the type of e is a pointer to an interface or a type implementing error,
+// or is the empty interface.
+func pointerToInterfaceOrError(pass *analysis.Pass, e ast.Expr) bool {
+       t := pass.TypesInfo.Types[e].Type
+       if it, ok := t.Underlying().(*types.Interface); ok && it.NumMethods() == 0 {
+               return true
+       }
+       pt, ok := t.Underlying().(*types.Pointer)
+       if !ok {
+               return false
+       }
+       _, ok = pt.Elem().Underlying().(*types.Interface)
+       return ok || types.Implements(pt.Elem(), errorType)
+}
index bd06549984a2ad8b78ca45a33e44a43de7000236..8213f633135934088b7ec2711ecf7edb600b24b8 100644 (file)
@@ -8,7 +8,11 @@
 //
 // Example of use in another analysis:
 //
-//     import "golang.org/x/tools/go/analysis/passes/inspect"
+//     import (
+//             "golang.org/x/tools/go/analysis"
+//             "golang.org/x/tools/go/analysis/passes/inspect"
+//             "golang.org/x/tools/go/ast/inspector"
+//     )
 //
 //     var Analyzer = &analysis.Analyzer{
 //             ...
index b5161836a57a23ce79921360e636222c1f08f47f..e88cf57d8f7a048600a17b57964caf94466d8067 100644 (file)
@@ -45,6 +45,8 @@ var contextPackage = "context"
 // control-flow path from the call to a return statement and that path
 // does not "use" the cancel function.  Any reference to the variable
 // counts as a use, even within a nested function literal.
+// If the variable's scope is larger than the function
+// containing the assignment, we assume that other uses exist.
 //
 // checkLostCancel analyzes a single named or literal function.
 func run(pass *analysis.Pass) (interface{}, error) {
@@ -66,6 +68,15 @@ func run(pass *analysis.Pass) (interface{}, error) {
 }
 
 func runFunc(pass *analysis.Pass, node ast.Node) {
+       // Find scope of function node
+       var funcScope *types.Scope
+       switch v := node.(type) {
+       case *ast.FuncLit:
+               funcScope = pass.TypesInfo.Scopes[v.Type]
+       case *ast.FuncDecl:
+               funcScope = pass.TypesInfo.Scopes[v.Type]
+       }
+
        // Maps each cancel variable to its defining ValueSpec/AssignStmt.
        cancelvars := make(map[*types.Var]ast.Node)
 
@@ -114,7 +125,11 @@ func runFunc(pass *analysis.Pass, node ast.Node) {
                                        "the cancel function returned by context.%s should be called, not discarded, to avoid a context leak",
                                        n.(*ast.SelectorExpr).Sel.Name)
                        } else if v, ok := pass.TypesInfo.Uses[id].(*types.Var); ok {
-                               cancelvars[v] = stmt
+                               // If the cancel variable is defined outside function scope,
+                               // do not analyze it.
+                               if funcScope.Contains(v.Pos()) {
+                                       cancelvars[v] = stmt
+                               }
                        } else if v, ok := pass.TypesInfo.Defs[id].(*types.Var); ok {
                                cancelvars[v] = stmt
                        }
index c0265aafeee7ff132b6b37e366a088a97cd884e3..f59e95dc219f2ac602216fb8e542bb7e4bc6afc1 100644 (file)
@@ -453,15 +453,23 @@ func printfNameAndKind(pass *analysis.Pass, call *ast.CallExpr) (fn *types.Func,
 }
 
 // isFormatter reports whether t satisfies fmt.Formatter.
-// Unlike fmt.Stringer, it's impossible to satisfy fmt.Formatter without importing fmt.
-func isFormatter(pass *analysis.Pass, t types.Type) bool {
-       for _, imp := range pass.Pkg.Imports() {
-               if imp.Path() == "fmt" {
-                       formatter := imp.Scope().Lookup("Formatter").Type().Underlying().(*types.Interface)
-                       return types.Implements(t, formatter)
-               }
+// The only interface method to look for is "Format(State, rune)".
+func isFormatter(typ types.Type) bool {
+       obj, _, _ := types.LookupFieldOrMethod(typ, false, nil, "Format")
+       fn, ok := obj.(*types.Func)
+       if !ok {
+               return false
        }
-       return false
+       sig := fn.Type().(*types.Signature)
+       return sig.Params().Len() == 2 &&
+               sig.Results().Len() == 0 &&
+               isNamed(sig.Params().At(0).Type(), "fmt", "State") &&
+               types.Identical(sig.Params().At(1).Type(), types.Typ[types.Rune])
+}
+
+func isNamed(T types.Type, pkgpath, name string) bool {
+       named, ok := T.(*types.Named)
+       return ok && named.Obj().Pkg().Path() == pkgpath && named.Obj().Name() == name
 }
 
 // formatState holds the parsed representation of a printf directive such as "%3.*[4]d".
@@ -731,6 +739,7 @@ var printVerbs = []printVerb{
        {'T', "-", anyType},
        {'U', "-#", argRune | argInt},
        {'v', allFlags, anyType},
+       {'w', noFlag, anyType},
        {'x', sharpNumFlag, argRune | argInt | argString | argPointer},
        {'X', sharpNumFlag, argRune | argInt | argString | argPointer},
 }
@@ -753,7 +762,7 @@ func okPrintfArg(pass *analysis.Pass, call *ast.CallExpr, state *formatState) (o
        formatter := false
        if state.argNum < len(call.Args) {
                if tv, ok := pass.TypesInfo.Types[call.Args[state.argNum]]; ok {
-                       formatter = isFormatter(pass, tv.Type)
+                       formatter = isFormatter(tv.Type)
                }
        }
 
@@ -831,7 +840,7 @@ func recursiveStringer(pass *analysis.Pass, e ast.Expr) bool {
        typ := pass.TypesInfo.Types[e].Type
 
        // It's unlikely to be a recursive stringer if it has a Format method.
-       if isFormatter(pass, typ) {
+       if isFormatter(typ) {
                return false
        }
 
@@ -847,20 +856,28 @@ func recursiveStringer(pass *analysis.Pass, e ast.Expr) bool {
                return false
        }
 
-       // Is it the receiver r, or &r?
-       recv := stringMethod.Type().(*types.Signature).Recv()
-       if recv == nil {
+       sig := stringMethod.Type().(*types.Signature)
+       if !isStringer(sig) {
                return false
        }
+
+       // Is it the receiver r, or &r?
        if u, ok := e.(*ast.UnaryExpr); ok && u.Op == token.AND {
                e = u.X // strip off & from &r
        }
        if id, ok := e.(*ast.Ident); ok {
-               return pass.TypesInfo.Uses[id] == recv
+               return pass.TypesInfo.Uses[id] == sig.Recv()
        }
        return false
 }
 
+// isStringer reports whether the method signature matches the String() definition in fmt.Stringer.
+func isStringer(sig *types.Signature) bool {
+       return sig.Params().Len() == 0 &&
+               sig.Results().Len() == 1 &&
+               sig.Results().At(0).Type() == types.Typ[types.String]
+}
+
 // isFunctionValue reports whether the expression is a function as opposed to a function call.
 // It is almost always a mistake to print a function value.
 func isFunctionValue(pass *analysis.Pass, e ast.Expr) bool {
index 87523a19c67e0d44740e15f7d9e2f597ca15690d..12286fd5df554a00a6d6019915ff04a304a2fad6 100644 (file)
@@ -2,7 +2,6 @@ package printf
 
 import (
        "go/ast"
-       "go/build"
        "go/types"
 
        "golang.org/x/tools/go/analysis"
@@ -39,7 +38,7 @@ func matchArgTypeInternal(pass *analysis.Pass, t printfArgType, typ types.Type,
                }
        }
        // If the type implements fmt.Formatter, we have nothing to check.
-       if isFormatter(pass, typ) {
+       if isFormatter(typ) {
                return true
        }
        // If we can use a string, might arg (dynamically) implement the Stringer or Error interface?
@@ -235,5 +234,3 @@ func matchStructArgType(pass *analysis.Pass, t printfArgType, typ *types.Struct,
        }
        return true
 }
-
-var archSizes = types.SizesFor("gccgo", build.Default.GOARCH)
index 4142ac342ad72291a0b60a8ee906666d1b07f6ff..39f54573c9fd644c8279e89aa67f77b9b8129efb 100644 (file)
@@ -12,10 +12,8 @@ package shift
 
 import (
        "go/ast"
-       "go/build"
        "go/constant"
        "go/token"
-       "go/types"
 
        "golang.org/x/tools/go/analysis"
        "golang.org/x/tools/go/analysis/passes/inspect"
@@ -93,36 +91,9 @@ func checkLongShift(pass *analysis.Pass, node ast.Node, x, y ast.Expr) {
        if t == nil {
                return
        }
-       b, ok := t.Underlying().(*types.Basic)
-       if !ok {
-               return
-       }
-       var size int64
-       switch b.Kind() {
-       case types.Uint8, types.Int8:
-               size = 8
-       case types.Uint16, types.Int16:
-               size = 16
-       case types.Uint32, types.Int32:
-               size = 32
-       case types.Uint64, types.Int64:
-               size = 64
-       case types.Int, types.Uint:
-               size = uintBitSize
-       case types.Uintptr:
-               size = uintptrBitSize
-       default:
-               return
-       }
+       size := 8 * pass.TypesSizes.Sizeof(t)
        if amt >= size {
                ident := analysisutil.Format(pass.Fset, x)
                pass.Reportf(node.Pos(), "%s (%d bits) too small for shift of %d", ident, size, amt)
        }
 }
-
-var (
-       uintBitSize    = 8 * archSizes.Sizeof(types.Typ[types.Uint])
-       uintptrBitSize = 8 * archSizes.Sizeof(types.Typ[types.Uintptr])
-)
-
-var archSizes = types.SizesFor("gccgo", build.Default.GOARCH)
index 83495112243a441efbe64533650603d251450b77..bc1db7e4c2e5562e4bb5ad2f9880ba81839345d0 100644 (file)
@@ -8,7 +8,6 @@ package stdmethods
 
 import (
        "go/ast"
-       "go/token"
        "go/types"
        "strings"
 
@@ -117,6 +116,13 @@ func canonicalMethod(pass *analysis.Pass, id *ast.Ident) {
        args := sign.Params()
        results := sign.Results()
 
+       // Special case: WriteTo with more than one argument,
+       // not trying at all to implement io.WriterTo,
+       // comes up often enough to skip.
+       if id.Name == "WriteTo" && args.Len() > 1 {
+               return
+       }
+
        // Do the =s (if any) all match?
        if !matchParams(pass, expect.args, args, "=") || !matchParams(pass, expect.results, results, "=") {
                return
@@ -163,7 +169,7 @@ func matchParams(pass *analysis.Pass, expect []string, actual *types.Tuple, pref
                if i >= actual.Len() {
                        return false
                }
-               if !matchParamType(pass.Fset, pass.Pkg, x, actual.At(i).Type()) {
+               if !matchParamType(x, actual.At(i).Type()) {
                        return false
                }
        }
@@ -174,13 +180,8 @@ func matchParams(pass *analysis.Pass, expect []string, actual *types.Tuple, pref
 }
 
 // Does this one type match?
-func matchParamType(fset *token.FileSet, pkg *types.Package, expect string, actual types.Type) bool {
+func matchParamType(expect string, actual types.Type) bool {
        expect = strings.TrimPrefix(expect, "=")
-       // Strip package name if we're in that package.
-       if n := len(pkg.Name()); len(expect) > n && expect[:n] == pkg.Name() && expect[n] == '.' {
-               expect = expect[n+1:]
-       }
-
        // Overkill but easy.
        return typeString(actual) == expect
 }
index 2b67c376bab8b9703d1b62d9a75f1601c8ec6d34..acc6e6c770d8c796ee609155fbdea55714c98042 100644 (file)
@@ -41,7 +41,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
        }
        inspect.Preorder(nodeFilter, func(n ast.Node) {
                styp := pass.TypesInfo.Types[n.(*ast.StructType)].Type.(*types.Struct)
-               var seen map[[2]string]token.Pos
+               var seen namesSeen
                for i := 0; i < styp.NumFields(); i++ {
                        field := styp.Field(i)
                        tag := styp.Tag(i)
@@ -51,13 +51,47 @@ func run(pass *analysis.Pass) (interface{}, error) {
        return nil, nil
 }
 
+// namesSeen keeps track of encoding tags by their key, name, and nested level
+// from the initial struct. The level is taken into account because equal
+// encoding key names only conflict when at the same level; otherwise, the lower
+// level shadows the higher level.
+type namesSeen map[uniqueName]token.Pos
+
+type uniqueName struct {
+       key   string // "xml" or "json"
+       name  string // the encoding name
+       level int    // anonymous struct nesting level
+}
+
+func (s *namesSeen) Get(key, name string, level int) (token.Pos, bool) {
+       if *s == nil {
+               *s = make(map[uniqueName]token.Pos)
+       }
+       pos, ok := (*s)[uniqueName{key, name, level}]
+       return pos, ok
+}
+
+func (s *namesSeen) Set(key, name string, level int, pos token.Pos) {
+       if *s == nil {
+               *s = make(map[uniqueName]token.Pos)
+       }
+       (*s)[uniqueName{key, name, level}] = pos
+}
+
 var checkTagDups = []string{"json", "xml"}
 var checkTagSpaces = map[string]bool{"json": true, "xml": true, "asn1": true}
 
 // checkCanonicalFieldTag checks a single struct field tag.
-func checkCanonicalFieldTag(pass *analysis.Pass, field *types.Var, tag string, seen *map[[2]string]token.Pos) {
+func checkCanonicalFieldTag(pass *analysis.Pass, field *types.Var, tag string, seen *namesSeen) {
+       switch pass.Pkg.Path() {
+       case "encoding/json", "encoding/xml":
+               // These packages know how to use their own APIs.
+               // Sometimes they are testing what happens to incorrect programs.
+               return
+       }
+
        for _, key := range checkTagDups {
-               checkTagDuplicates(pass, tag, key, field, field, seen)
+               checkTagDuplicates(pass, tag, key, field, field, seen, 1)
        }
 
        if err := validateStructTag(tag); err != nil {
@@ -88,28 +122,29 @@ func checkCanonicalFieldTag(pass *analysis.Pass, field *types.Var, tag string, s
 // checkTagDuplicates checks a single struct field tag to see if any tags are
 // duplicated. nearest is the field that's closest to the field being checked,
 // while still being part of the top-level struct type.
-func checkTagDuplicates(pass *analysis.Pass, tag, key string, nearest, field *types.Var, seen *map[[2]string]token.Pos) {
+func checkTagDuplicates(pass *analysis.Pass, tag, key string, nearest, field *types.Var, seen *namesSeen, level int) {
        val := reflect.StructTag(tag).Get(key)
        if val == "-" {
                // Ignored, even if the field is anonymous.
                return
        }
        if val == "" || val[0] == ',' {
-               if field.Anonymous() {
-                       typ, ok := field.Type().Underlying().(*types.Struct)
-                       if !ok {
-                               return
-                       }
-                       for i := 0; i < typ.NumFields(); i++ {
-                               field := typ.Field(i)
-                               if !field.Exported() {
-                                       continue
-                               }
-                               tag := typ.Tag(i)
-                               checkTagDuplicates(pass, tag, key, nearest, field, seen)
+               if !field.Anonymous() {
+                       // Ignored if the field isn't anonymous.
+                       return
+               }
+               typ, ok := field.Type().Underlying().(*types.Struct)
+               if !ok {
+                       return
+               }
+               for i := 0; i < typ.NumFields(); i++ {
+                       field := typ.Field(i)
+                       if !field.Exported() {
+                               continue
                        }
+                       tag := typ.Tag(i)
+                       checkTagDuplicates(pass, tag, key, nearest, field, seen, level+1)
                }
-               // Ignored if the field isn't anonymous.
                return
        }
        if key == "xml" && field.Name() == "XMLName" {
@@ -132,10 +167,7 @@ func checkTagDuplicates(pass *analysis.Pass, tag, key string, nearest, field *ty
                }
                val = val[:i]
        }
-       if *seen == nil {
-               *seen = map[[2]string]token.Pos{}
-       }
-       if pos, ok := (*seen)[[2]string{key, val}]; ok {
+       if pos, ok := seen.Get(key, val, level); ok {
                alsoPos := pass.Fset.Position(pos)
                alsoPos.Column = 0
 
@@ -154,7 +186,7 @@ func checkTagDuplicates(pass *analysis.Pass, tag, key string, nearest, field *ty
 
                pass.Reportf(nearest.Pos(), "struct field %s repeats %s tag %q also at %s", field.Name(), key, val, alsoPos)
        } else {
-               (*seen)[[2]string{key, val}] = field.Pos()
+               seen.Set(key, val, level, field.Pos())
        }
 }
 
index 35b0a3e7cc2d57806b69e00206623efc58b163ba..8232276186aeab15f8bbecb5377ed9e20c220715 100644 (file)
@@ -20,7 +20,10 @@ const Doc = `check for common mistaken usages of tests and examples
 
 The tests checker walks Test, Benchmark and Example functions checking
 malformed names, wrong signatures and examples documenting non-existent
-identifiers.`
+identifiers.
+
+Please see the documentation for package testing in golang.org/pkg/testing
+for the conventions that are enforced for Tests, Benchmarks, and Examples.`
 
 var Analyzer = &analysis.Analyzer{
        Name: "tests",
@@ -84,23 +87,25 @@ func isTestParam(typ ast.Expr, wantType string) bool {
        return false
 }
 
-func lookup(pkg *types.Package, name string) types.Object {
+func lookup(pkg *types.Package, name string) []types.Object {
        if o := pkg.Scope().Lookup(name); o != nil {
-               return o
-       }
-
-       // If this package is ".../foo_test" and it imports a package
-       // ".../foo", try looking in the latter package.
-       // This heuristic should work even on build systems that do not
-       // record any special link between the packages.
-       if basePath := strings.TrimSuffix(pkg.Path(), "_test"); basePath != pkg.Path() {
-               for _, imp := range pkg.Imports() {
-                       if imp.Path() == basePath {
-                               return imp.Scope().Lookup(name)
-                       }
+               return []types.Object{o}
+       }
+
+       var ret []types.Object
+       // Search through the imports to see if any of them define name.
+       // It's hard to tell in general which package is being tested, so
+       // for the purposes of the analysis, allow the object to appear
+       // in any of the imports. This guarantees there are no false positives
+       // because the example needs to use the object so it must be defined
+       // in the package or one if its imports. On the other hand, false
+       // negatives are possible, but should be rare.
+       for _, imp := range pkg.Imports() {
+               if obj := imp.Scope().Lookup(name); obj != nil {
+                       ret = append(ret, obj)
                }
        }
-       return nil
+       return ret
 }
 
 func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) {
@@ -121,9 +126,9 @@ func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) {
                exName = strings.TrimPrefix(fnName, "Example")
                elems  = strings.SplitN(exName, "_", 3)
                ident  = elems[0]
-               obj    = lookup(pass.Pkg, ident)
+               objs   = lookup(pass.Pkg, ident)
        )
-       if ident != "" && obj == nil {
+       if ident != "" && len(objs) == 0 {
                // Check ExampleFoo and ExampleBadFoo.
                pass.Reportf(fn.Pos(), "%s refers to unknown identifier: %s", fnName, ident)
                // Abort since obj is absent and no subsequent checks can be performed.
@@ -145,7 +150,15 @@ func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) {
        mmbr := elems[1]
        if !isExampleSuffix(mmbr) {
                // Check ExampleFoo_Method and ExampleFoo_BadMethod.
-               if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj == nil {
+               found := false
+               // Check if Foo.Method exists in this package or its imports.
+               for _, obj := range objs {
+                       if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj != nil {
+                               found = true
+                               break
+                       }
+               }
+               if !found {
                        pass.Reportf(fn.Pos(), "%s refers to unknown field or method: %s.%s", fnName, ident, mmbr)
                }
        }
index 6cf4358ab9a31f291d2ef65ced1a67c44c81ac1f..d019ecef15a028ca5951f6327944892d4c5c7e1c 100644 (file)
@@ -29,6 +29,13 @@ var Analyzer = &analysis.Analyzer{
 }
 
 func run(pass *analysis.Pass) (interface{}, error) {
+       switch pass.Pkg.Path() {
+       case "encoding/gob", "encoding/json", "encoding/xml":
+               // These packages know how to use their own APIs.
+               // Sometimes they are testing what happens to incorrect programs.
+               return nil, nil
+       }
+
        inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
        nodeFilter := []ast.Node{
index 5943c99e13bcfa094e1150d911556bc5a083b348..b4fda19ecaa6fb0eb88d55b1b3074735c842b1c7 100644 (file)
@@ -329,6 +329,7 @@ func run(fset *token.FileSet, cfg *Config, analyzers []*analysis.Analyzer) ([]re
                                OtherFiles:        cfg.NonGoFiles,
                                Pkg:               pkg,
                                TypesInfo:         info,
+                               TypesSizes:        tc.Sizes,
                                ResultOf:          inputs,
                                Report:            func(d analysis.Diagnostic) { act.diagnostics = append(act.diagnostics, d) },
                                ImportObjectFact:  facts.ImportObjectFact,
index db88a951090a5a17a33dfea9c6f080c87165cdd1..ddbdd3f08fc2e5556865c9accf47713b5eee79e1 100644 (file)
@@ -14,7 +14,7 @@
 // Experiments suggest the inspector's traversals are about 2.5x faster
 // than ast.Inspect, but it may take around 5 traversals for this
 // benefit to amortize the inspector's construction cost.
-// If efficiency is the primary concern, do not use use Inspector for
+// If efficiency is the primary concern, do not use Inspector for
 // one-off traversals.
 package inspector
 
diff --git a/libgo/go/html/fuzz.go b/libgo/go/html/fuzz.go
new file mode 100644 (file)
index 0000000..ffa3e25
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gofuzz
+
+package html
+
+import (
+       "fmt"
+)
+
+func Fuzz(data []byte) int {
+       v := string(data)
+
+       e := EscapeString(v)
+       u := UnescapeString(e)
+       if v != u {
+               fmt.Printf("v = %q\n", v)
+               fmt.Printf("e = %q\n", e)
+               fmt.Printf("u = %q\n", u)
+               panic("not equal")
+       }
+
+       // As per the documentation, this isn't always equal to v, so it makes
+       // no sense to check for equality. It can still be interesting to find
+       // panics in it though.
+       EscapeString(UnescapeString(v))
+
+       return 0
+}
index 7ab3d1fed674cdfee4bc9c4e93e533dde0925494..f7d4849928d98603a1db9162496362ef45378a26 100644 (file)
@@ -26,7 +26,11 @@ type context struct {
 }
 
 func (c context) String() string {
-       return fmt.Sprintf("{%v %v %v %v %v %v %v}", c.state, c.delim, c.urlPart, c.jsCtx, c.attr, c.element, c.err)
+       var err error
+       if c.err != nil {
+               err = c.err
+       }
+       return fmt.Sprintf("{%v %v %v %v %v %v %v}", c.state, c.delim, c.urlPart, c.jsCtx, c.attr, c.element, err)
 }
 
 // eq reports whether two contexts are equal.
index 1587af8385e40e39214bc6b18f7594952715d8c4..eb92fc92b55ea65af2a45fe05b7496036d995356 100644 (file)
@@ -7,6 +7,7 @@ package template
 import (
        "bytes"
        "fmt"
+       "strings"
        "unicode"
        "unicode/utf8"
 )
@@ -156,7 +157,7 @@ func isCSSSpace(b byte) bool {
 // cssEscaper escapes HTML and CSS special characters using \<hex>+ escapes.
 func cssEscaper(args ...interface{}) string {
        s, _ := stringify(args...)
-       var b bytes.Buffer
+       var b strings.Builder
        r, w, written := rune(0), 0, 0
        for i := 0; i < len(s); i += w {
                // See comment in htmlEscaper.
@@ -168,6 +169,9 @@ func cssEscaper(args ...interface{}) string {
                default:
                        continue
                }
+               if written == 0 {
+                       b.Grow(len(s))
+               }
                b.WriteString(s[written:i])
                b.WriteString(repl)
                written = i + w
index e6c12a8a254b2bded9e565c213458851b617e4c2..e72a9ba11fe281bc2a2e3d82434c17bf6c442696 100644 (file)
@@ -1869,8 +1869,7 @@ func TestErrorOnUndefined(t *testing.T) {
        err := tmpl.Execute(nil, nil)
        if err == nil {
                t.Error("expected error")
-       }
-       if !strings.Contains(err.Error(), "incomplete") {
+       } else if !strings.Contains(err.Error(), "incomplete") {
                t.Errorf("expected error about incomplete template; got %s", err)
        }
 }
index 2ea5a7d4bc0e496d248ba89324a31a952ad53188..13a0cd043607d48d738a53a73c434f61528b707a 100644 (file)
@@ -137,7 +137,7 @@ var htmlNospaceNormReplacementTable = []string{
 // htmlReplacer returns s with runes replaced according to replacementTable
 // and when badRunes is true, certain bad runes are allowed through unescaped.
 func htmlReplacer(s string, replacementTable []string, badRunes bool) string {
-       written, b := 0, new(bytes.Buffer)
+       written, b := 0, new(strings.Builder)
        r, w := rune(0), 0
        for i := 0; i < len(s); i += w {
                // Cannot use 'for range s' because we need to preserve the width
@@ -146,6 +146,9 @@ func htmlReplacer(s string, replacementTable []string, badRunes bool) string {
                r, w = utf8.DecodeRuneInString(s[i:])
                if int(r) < len(replacementTable) {
                        if repl := replacementTable[r]; len(repl) != 0 {
+                               if written == 0 {
+                                       b.Grow(len(s))
+                               }
                                b.WriteString(s[written:i])
                                b.WriteString(repl)
                                written = i + w
@@ -154,6 +157,9 @@ func htmlReplacer(s string, replacementTable []string, badRunes bool) string {
                        // No-op.
                        // IE does not allow these ranges in unquoted attrs.
                } else if 0xfdd0 <= r && r <= 0xfdef || 0xfff0 <= r && r <= 0xffff {
+                       if written == 0 {
+                               b.Grow(len(s))
+                       }
                        fmt.Fprintf(b, "%s&#x%x;", s[written:i], r)
                        written = i + w
                }
index 872f6786b3555a634ea4542a4aaf901a8ef0845e..7025c1cfaac5786c9071eec08ddf4c97431b40e9 100644 (file)
@@ -187,7 +187,7 @@ func jsValEscaper(args ...interface{}) string {
        }
        first, _ := utf8.DecodeRune(b)
        last, _ := utf8.DecodeLastRune(b)
-       var buf bytes.Buffer
+       var buf strings.Builder
        // Prevent IdentifierNames and NumericLiterals from running into
        // keywords: in, instanceof, typeof, void
        pad := isJSIdentPart(first) || isJSIdentPart(last)
@@ -217,7 +217,7 @@ func jsValEscaper(args ...interface{}) string {
                if pad {
                        buf.WriteByte(' ')
                }
-               b = buf.Bytes()
+               return buf.String()
        }
        return string(b)
 }
@@ -253,7 +253,7 @@ func jsRegexpEscaper(args ...interface{}) string {
 // It also replaces runes U+2028 and U+2029 with the raw strings `\u2028` and
 // `\u2029`.
 func replace(s string, replacementTable []string) string {
-       var b bytes.Buffer
+       var b strings.Builder
        r, w, written := rune(0), 0, 0
        for i := 0; i < len(s); i += w {
                // See comment in htmlEscaper.
@@ -269,6 +269,9 @@ func replace(s string, replacementTable []string) string {
                default:
                        continue
                }
+               if written == 0 {
+                       b.Grow(len(s))
+               }
                b.WriteString(s[written:i])
                b.WriteString(repl)
                written = i + w
@@ -394,6 +397,7 @@ func isJSType(mimeType string) bool {
                "application/ld+json",
                "application/x-ecmascript",
                "application/x-javascript",
+               "module",
                "text/ecmascript",
                "text/javascript",
                "text/javascript1.0",
index 05fa105be02c705bb4d655209c8155412e6ef264..075adaafd3753c73d218ec8908e3d34fb0cb96dd 100644 (file)
@@ -344,6 +344,7 @@ func TestIsJsMimeType(t *testing.T) {
                {"text/javascript", true},
                {"application/json", true},
                {"application/ld+json", true},
+               {"module", true},
        }
 
        for _, test := range tests {
index 4641a37da3cddbc12d83b08cca835f4469082ced..75437879e2e6b26866fe25a572a431ad6b1d7eb7 100644 (file)
@@ -440,9 +440,10 @@ func parseFiles(t *Template, filenames ...string) (*Template, error) {
        return t, nil
 }
 
-// ParseGlob creates a new Template and parses the template definitions from the
-// files identified by the pattern, which must match at least one file. The
-// returned template will have the (base) name and (parsed) contents of the
+// ParseGlob creates a new Template and parses the template definitions from
+// the files identified by the pattern. The files are matched according to the
+// semantics of filepath.Match, and the pattern must match at least one file.
+// The returned template will have the (base) name and (parsed) contents of the
 // first file matched by the pattern. ParseGlob is equivalent to calling
 // ParseFiles with the list of files matched by the pattern.
 //
@@ -453,10 +454,10 @@ func ParseGlob(pattern string) (*Template, error) {
 }
 
 // ParseGlob parses the template definitions in the files identified by the
-// pattern and associates the resulting templates with t. The pattern is
-// processed by filepath.Glob and must match at least one file. ParseGlob is
-// equivalent to calling t.ParseFiles with the list of files matched by the
-// pattern.
+// pattern and associates the resulting templates with t. The files are matched
+// according to the semantics of filepath.Match, and the pattern must match at
+// least one file. ParseGlob is equivalent to calling t.ParseFiles with the
+// list of files matched by the pattern.
 //
 // When parsing multiple files with the same name in different directories,
 // the last one mentioned will be the one that results.
index 90c5a73ba7a3afa5bda0bf56702bcc32dcb46624..13e6ba406e12ef92130c8bfdb98661b25ef6f844 100644 (file)
@@ -115,6 +115,12 @@ func TestRedefineOtherParsers(t *testing.T) {
        }
 }
 
+func TestNumbers(t *testing.T) {
+       c := newTestCase(t)
+       c.mustParse(c.root, `{{print 1_2.3_4}} {{print 0x0_1.e_0p+02}}`)
+       c.mustExecute(c.root, nil, "12.34 7.5")
+}
+
 type testCase struct {
        t    *testing.T
        root *Template
index 85e235e729b7cc02cc75b0379ca1bfa33c9fb887..2b3ff6ba582662c11c4e19392741513e584e0b38 100644 (file)
@@ -123,6 +123,10 @@ loop:
                        continue
                }
                c, _, err := decodeConfig(it.filename)
+               if err != nil {
+                       t.Errorf("%s: %v", it.filename, err)
+                       continue loop
+               }
                if m.ColorModel() != c.ColorModel {
                        t.Errorf("%s: color models differ", it.filename)
                        continue loop
index 3ff1828dc0c0a06be70cc133d84a0385b8573910..932a5444831b92ddc7fb1778dd9139e8930e1fbc 100644 (file)
@@ -90,8 +90,8 @@ func clip(dst Image, r *image.Rectangle, src image.Image, sp *image.Point, mask
        }
 }
 
-func processBackward(dst Image, r image.Rectangle, src image.Image, sp image.Point) bool {
-       return image.Image(dst) == src &&
+func processBackward(dst image.Image, r image.Rectangle, src image.Image, sp image.Point) bool {
+       return dst == src &&
                r.Overlaps(r.Add(sp.Sub(r.Min))) &&
                (sp.Y < r.Min.Y || (sp.Y == r.Min.Y && sp.X < r.Min.X))
 }
index ed7dde2c84d05cdd00f85fb99d01547aa73af258..8bb249c1e0930fcaeeb5e997b6b823014dada10b 100644 (file)
@@ -67,6 +67,8 @@ func (p Point) Eq(q Point) bool {
 }
 
 // ZP is the zero Point.
+//
+// Deprecated: Use a literal image.Point{} instead.
 var ZP Point
 
 // Pt is shorthand for Point{X, Y}.
@@ -254,6 +256,8 @@ func (r Rectangle) ColorModel() color.Model {
 }
 
 // ZR is the zero Rectangle.
+//
+// Deprecated: Use a literal image.Rectangle{} instead.
 var ZR Rectangle
 
 // Rect is shorthand for Rectangle{Pt(x0, y0), Pt(x1, y1)}. The returned
index 5e80feb33f08812767e0175cf5e892b79167baae..7220446de5ebf308f38b94faefd49426ce6c3c99 100644 (file)
@@ -433,14 +433,27 @@ func Encode(w io.Writer, m image.Image, o *Options) error {
                opts.Drawer = draw.FloydSteinberg
        }
 
-       pm, ok := m.(*image.Paletted)
-       if !ok || len(pm.Palette) > opts.NumColors {
+       pm, _ := m.(*image.Paletted)
+       if pm == nil {
+               if cp, ok := m.ColorModel().(color.Palette); ok {
+                       pm = image.NewPaletted(b, cp)
+                       for y := b.Min.Y; y < b.Max.Y; y++ {
+                               for x := b.Min.X; x < b.Max.X; x++ {
+                                       pm.Set(x, y, cp.Convert(m.At(x, y)))
+                               }
+                       }
+               }
+       }
+       if pm == nil || len(pm.Palette) > opts.NumColors {
+               // Set pm to be a palettedized copy of m, including its bounds, which
+               // might not start at (0, 0).
+               //
                // TODO: Pick a better sub-sample of the Plan 9 palette.
                pm = image.NewPaletted(b, palette.Plan9[:opts.NumColors])
                if opts.Quantizer != nil {
                        pm.Palette = opts.Quantizer.Quantize(make(color.Palette, 0, opts.NumColors), m)
                }
-               opts.Drawer.Draw(pm, b, m, image.ZP)
+               opts.Drawer.Draw(pm, b, m, b.Min)
        }
 
        // When calling Encode instead of EncodeAll, the single-frame image is
index 69042ec67439be592f149e61bf5e523cd57a2f2c..0bc24d1beec47476c4ada6a9c6613480a7600b7e 100644 (file)
@@ -48,11 +48,17 @@ func delta(u0, u1 uint32) int64 {
 // have the same bounds.
 func averageDelta(m0, m1 image.Image) int64 {
        b := m0.Bounds()
+       return averageDeltaBound(m0, m1, b, b)
+}
+
+// averageDeltaBounds returns the average delta in RGB space. The average delta is
+// calulated in the specified bounds.
+func averageDeltaBound(m0, m1 image.Image, b0, b1 image.Rectangle) int64 {
        var sum, n int64
-       for y := b.Min.Y; y < b.Max.Y; y++ {
-               for x := b.Min.X; x < b.Max.X; x++ {
+       for y := b0.Min.Y; y < b0.Max.Y; y++ {
+               for x := b0.Min.X; x < b0.Max.X; x++ {
                        c0 := m0.At(x, y)
-                       c1 := m1.At(x, y)
+                       c1 := m1.At(x-b0.Min.X+b1.Min.X, y-b0.Min.Y+b1.Min.Y)
                        r0, g0, b0, _ := c0.RGBA()
                        r1, g1, b1, _ := c1.RGBA()
                        sum += delta(r0, r1)
@@ -339,7 +345,10 @@ func TestEncodeNonZeroMinPoint(t *testing.T) {
                {+2, +2},
        }
        for _, p := range points {
-               src := image.NewPaletted(image.Rectangle{Min: p, Max: p.Add(image.Point{6, 6})}, palette.Plan9)
+               src := image.NewPaletted(image.Rectangle{
+                       Min: p,
+                       Max: p.Add(image.Point{6, 6}),
+               }, palette.Plan9)
                var buf bytes.Buffer
                if err := Encode(&buf, src, nil); err != nil {
                        t.Errorf("p=%v: Encode: %v", p, err)
@@ -354,6 +363,52 @@ func TestEncodeNonZeroMinPoint(t *testing.T) {
                        t.Errorf("p=%v: got %v, want %v", p, got, want)
                }
        }
+
+       // Also test having a source image (gray on the diagonal) that has a
+       // non-zero Bounds().Min, but isn't an image.Paletted.
+       {
+               p := image.Point{+2, +2}
+               src := image.NewRGBA(image.Rectangle{
+                       Min: p,
+                       Max: p.Add(image.Point{6, 6}),
+               })
+               src.SetRGBA(2, 2, color.RGBA{0x22, 0x22, 0x22, 0xFF})
+               src.SetRGBA(3, 3, color.RGBA{0x33, 0x33, 0x33, 0xFF})
+               src.SetRGBA(4, 4, color.RGBA{0x44, 0x44, 0x44, 0xFF})
+               src.SetRGBA(5, 5, color.RGBA{0x55, 0x55, 0x55, 0xFF})
+               src.SetRGBA(6, 6, color.RGBA{0x66, 0x66, 0x66, 0xFF})
+               src.SetRGBA(7, 7, color.RGBA{0x77, 0x77, 0x77, 0xFF})
+
+               var buf bytes.Buffer
+               if err := Encode(&buf, src, nil); err != nil {
+                       t.Errorf("gray-diagonal: Encode: %v", err)
+                       return
+               }
+               m, err := Decode(&buf)
+               if err != nil {
+                       t.Errorf("gray-diagonal: Decode: %v", err)
+                       return
+               }
+               if got, want := m.Bounds(), image.Rect(0, 0, 6, 6); got != want {
+                       t.Errorf("gray-diagonal: got %v, want %v", got, want)
+                       return
+               }
+
+               rednessAt := func(x int, y int) uint32 {
+                       r, _, _, _ := m.At(x, y).RGBA()
+                       // Shift by 8 to convert from 16 bit color to 8 bit color.
+                       return r >> 8
+               }
+
+               // Round-tripping a still (non-animated) image.Image through
+               // Encode+Decode should shift the origin to (0, 0).
+               if got, want := rednessAt(0, 0), uint32(0x22); got != want {
+                       t.Errorf("gray-diagonal: rednessAt(0, 0): got 0x%02x, want 0x%02x", got, want)
+               }
+               if got, want := rednessAt(5, 5), uint32(0x77); got != want {
+                       t.Errorf("gray-diagonal: rednessAt(5, 5): got 0x%02x, want 0x%02x", got, want)
+               }
+       }
 }
 
 func TestEncodeImplicitConfigSize(t *testing.T) {
@@ -532,6 +587,75 @@ func TestEncodeCroppedSubImages(t *testing.T) {
        }
 }
 
+type offsetImage struct {
+       image.Image
+       Rect image.Rectangle
+}
+
+func (i offsetImage) Bounds() image.Rectangle {
+       return i.Rect
+}
+
+func TestEncodeWrappedImage(t *testing.T) {
+       m0, err := readImg("../testdata/video-001.gif")
+       if err != nil {
+               t.Fatalf("readImg: %v", err)
+       }
+
+       // Case 1: Enocde a wrapped image.Image
+       buf := new(bytes.Buffer)
+       w0 := offsetImage{m0, m0.Bounds()}
+       err = Encode(buf, w0, nil)
+       if err != nil {
+               t.Fatalf("Encode: %v", err)
+       }
+       w1, err := Decode(buf)
+       if err != nil {
+               t.Fatalf("Dencode: %v", err)
+       }
+       avgDelta := averageDelta(m0, w1)
+       if avgDelta > 0 {
+               t.Fatalf("Wrapped: average delta is too high. expected: 0, got %d", avgDelta)
+       }
+
+       // Case 2: Enocde a wrapped image.Image with offset
+       b0 := image.Rectangle{
+               Min: image.Point{
+                       X: 128,
+                       Y: 64,
+               },
+               Max: image.Point{
+                       X: 256,
+                       Y: 128,
+               },
+       }
+       w0 = offsetImage{m0, b0}
+       buf = new(bytes.Buffer)
+       err = Encode(buf, w0, nil)
+       if err != nil {
+               t.Fatalf("Encode: %v", err)
+       }
+       w1, err = Decode(buf)
+       if err != nil {
+               t.Fatalf("Dencode: %v", err)
+       }
+
+       b1 := image.Rectangle{
+               Min: image.Point{
+                       X: 0,
+                       Y: 0,
+               },
+               Max: image.Point{
+                       X: 128,
+                       Y: 64,
+               },
+       }
+       avgDelta = averageDeltaBound(m0, w1, b0, b1)
+       if avgDelta > 0 {
+               t.Fatalf("Wrapped and offset: average delta is too high. expected: 0, got %d", avgDelta)
+       }
+}
+
 func BenchmarkEncode(b *testing.B) {
        bo := image.Rect(0, 0, 640, 480)
        rnd := rand.New(rand.NewSource(123))
index 201a5abd0bab41355b3b83e6c37d7d67b2f20169..c7a973ec3c001dbb5975dae443b942f1528d6c40 100644 (file)
@@ -86,14 +86,16 @@ const (
 func fdct(b *block) {
        // Pass 1: process rows.
        for y := 0; y < 8; y++ {
-               x0 := b[y*8+0]
-               x1 := b[y*8+1]
-               x2 := b[y*8+2]
-               x3 := b[y*8+3]
-               x4 := b[y*8+4]
-               x5 := b[y*8+5]
-               x6 := b[y*8+6]
-               x7 := b[y*8+7]
+               y8 := y * 8
+               s := b[y8 : y8+8 : y8+8] // Small cap improves performance, see https://golang.org/issue/27857
+               x0 := s[0]
+               x1 := s[1]
+               x2 := s[2]
+               x3 := s[3]
+               x4 := s[4]
+               x5 := s[5]
+               x6 := s[6]
+               x7 := s[7]
 
                tmp0 := x0 + x7
                tmp1 := x1 + x6
@@ -110,12 +112,12 @@ func fdct(b *block) {
                tmp2 = x2 - x5
                tmp3 = x3 - x4
 
-               b[y*8+0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits
-               b[y*8+4] = (tmp10 - tmp11) << pass1Bits
+               s[0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits
+               s[4] = (tmp10 - tmp11) << pass1Bits
                z1 := (tmp12 + tmp13) * fix_0_541196100
                z1 += 1 << (constBits - pass1Bits - 1)
-               b[y*8+2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits)
-               b[y*8+6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits)
+               s[2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits)
+               s[6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits)
 
                tmp10 = tmp0 + tmp3
                tmp11 = tmp1 + tmp2
@@ -134,10 +136,10 @@ func fdct(b *block) {
 
                tmp12 += z1
                tmp13 += z1
-               b[y*8+1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits)
-               b[y*8+3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits)
-               b[y*8+5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits)
-               b[y*8+7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits)
+               s[1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits)
+               s[3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits)
+               s[5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits)
+               s[7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits)
        }
        // Pass 2: process columns.
        // We remove pass1Bits scaling, but leave results scaled up by an overall factor of 8.
index 46fcaecb798524ab0ec288c985935522a20a5818..a3957c8ada59ac0cd26a17e8237cb04347dc9735 100644 (file)
@@ -73,30 +73,31 @@ func idct(src *block) {
        // Horizontal 1-D IDCT.
        for y := 0; y < 8; y++ {
                y8 := y * 8
+               s := src[y8 : y8+8 : y8+8] // Small cap improves performance, see https://golang.org/issue/27857
                // If all the AC components are zero, then the IDCT is trivial.
-               if src[y8+1] == 0 && src[y8+2] == 0 && src[y8+3] == 0 &&
-                       src[y8+4] == 0 && src[y8+5] == 0 && src[y8+6] == 0 && src[y8+7] == 0 {
-                       dc := src[y8+0] << 3
-                       src[y8+0] = dc
-                       src[y8+1] = dc
-                       src[y8+2] = dc
-                       src[y8+3] = dc
-                       src[y8+4] = dc
-                       src[y8+5] = dc
-                       src[y8+6] = dc
-                       src[y8+7] = dc
+               if s[1] == 0 && s[2] == 0 && s[3] == 0 &&
+                       s[4] == 0 && s[5] == 0 && s[6] == 0 && s[7] == 0 {
+                       dc := s[0] << 3
+                       s[0] = dc
+                       s[1] = dc
+                       s[2] = dc
+                       s[3] = dc
+                       s[4] = dc
+                       s[5] = dc
+                       s[6] = dc
+                       s[7] = dc
                        continue
                }
 
                // Prescale.
-               x0 := (src[y8+0] << 11) + 128
-               x1 := src[y8+4] << 11
-               x2 := src[y8+6]
-               x3 := src[y8+2]
-               x4 := src[y8+1]
-               x5 := src[y8+7]
-               x6 := src[y8+5]
-               x7 := src[y8+3]
+               x0 := (s[0] << 11) + 128
+               x1 := s[4] << 11
+               x2 := s[6]
+               x3 := s[2]
+               x4 := s[1]
+               x5 := s[7]
+               x6 := s[5]
+               x7 := s[3]
 
                // Stage 1.
                x8 := w7 * (x4 + x5)
@@ -126,14 +127,14 @@ func idct(src *block) {
                x4 = (r2*(x4-x5) + 128) >> 8
 
                // Stage 4.
-               src[y8+0] = (x7 + x1) >> 8
-               src[y8+1] = (x3 + x2) >> 8
-               src[y8+2] = (x0 + x4) >> 8
-               src[y8+3] = (x8 + x6) >> 8
-               src[y8+4] = (x8 - x6) >> 8
-               src[y8+5] = (x0 - x4) >> 8
-               src[y8+6] = (x3 - x2) >> 8
-               src[y8+7] = (x7 - x1) >> 8
+               s[0] = (x7 + x1) >> 8
+               s[1] = (x3 + x2) >> 8
+               s[2] = (x0 + x4) >> 8
+               s[3] = (x8 + x6) >> 8
+               s[4] = (x8 - x6) >> 8
+               s[5] = (x0 - x4) >> 8
+               s[6] = (x3 - x2) >> 8
+               s[7] = (x7 - x1) >> 8
        }
 
        // Vertical 1-D IDCT.
@@ -141,16 +142,17 @@ func idct(src *block) {
                // Similar to the horizontal 1-D IDCT case, if all the AC components are zero, then the IDCT is trivial.
                // However, after performing the horizontal 1-D IDCT, there are typically non-zero AC components, so
                // we do not bother to check for the all-zero case.
+               s := src[x : x+57 : x+57] // Small cap improves performance, see https://golang.org/issue/27857
 
                // Prescale.
-               y0 := (src[8*0+x] << 8) + 8192
-               y1 := src[8*4+x] << 8
-               y2 := src[8*6+x]
-               y3 := src[8*2+x]
-               y4 := src[8*1+x]
-               y5 := src[8*7+x]
-               y6 := src[8*5+x]
-               y7 := src[8*3+x]
+               y0 := (s[8*0] << 8) + 8192
+               y1 := s[8*4] << 8
+               y2 := s[8*6]
+               y3 := s[8*2]
+               y4 := s[8*1]
+               y5 := s[8*7]
+               y6 := s[8*5]
+               y7 := s[8*3]
 
                // Stage 1.
                y8 := w7*(y4+y5) + 4
@@ -180,13 +182,13 @@ func idct(src *block) {
                y4 = (r2*(y4-y5) + 128) >> 8
 
                // Stage 4.
-               src[8*0+x] = (y7 + y1) >> 14
-               src[8*1+x] = (y3 + y2) >> 14
-               src[8*2+x] = (y0 + y4) >> 14
-               src[8*3+x] = (y8 + y6) >> 14
-               src[8*4+x] = (y8 - y6) >> 14
-               src[8*5+x] = (y0 - y4) >> 14
-               src[8*6+x] = (y3 - y2) >> 14
-               src[8*7+x] = (y7 - y1) >> 14
+               s[8*0] = (y7 + y1) >> 14
+               s[8*1] = (y3 + y2) >> 14
+               s[8*2] = (y0 + y4) >> 14
+               s[8*3] = (y8 + y6) >> 14
+               s[8*4] = (y8 - y6) >> 14
+               s[8*5] = (y0 - y4) >> 14
+               s[8*6] = (y3 - y2) >> 14
+               s[8*7] = (y7 - y1) >> 14
        }
 }
diff --git a/libgo/go/image/png/fuzz.go b/libgo/go/image/png/fuzz.go
new file mode 100644 (file)
index 0000000..d9cb392
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gofuzz
+
+package png
+
+import (
+       "bytes"
+       "fmt"
+)
+
+func Fuzz(data []byte) int {
+       cfg, err := DecodeConfig(bytes.NewReader(data))
+       if err != nil {
+               return 0
+       }
+       if cfg.Width*cfg.Height > 1e6 {
+               return 0
+       }
+       img, err := Decode(bytes.NewReader(data))
+       if err != nil {
+               return 0
+       }
+       levels := []CompressionLevel{
+               DefaultCompression,
+               NoCompression,
+               BestSpeed,
+               BestCompression,
+       }
+       for _, l := range levels {
+               var w bytes.Buffer
+               e := &Encoder{CompressionLevel: l}
+               err = e.Encode(&w, img)
+               if err != nil {
+                       panic(err)
+               }
+               img1, err := Decode(&w)
+               if err != nil {
+                       panic(err)
+               }
+               got := img1.Bounds()
+               want := img.Bounds()
+               if !got.Eq(want) {
+                       fmt.Printf("bounds0: %#v\n", want)
+                       fmt.Printf("bounds1: %#v\n", got)
+                       panic("bounds have changed")
+               }
+       }
+       return 1
+}
index 53fbf3e00a7cb755b5c6071e7f6eb62f9633f8a7..6771973bda9f6cd0b3a1a45f20db111b3b7bbe3b 100644 (file)
@@ -706,7 +706,7 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image
                                }
                        }
                case cbP8:
-                       if len(paletted.Palette) != 255 {
+                       if len(paletted.Palette) != 256 {
                                for x := 0; x < width; x++ {
                                        if len(paletted.Palette) <= int(cdat[x]) {
                                                paletted.Palette = paletted.Palette[:int(cdat[x])+1]
index 33dcd3debcc96e85eb2e9426e310a48f07368a1d..3325d2e8a59bb906d563ef34ae4b43413c04a9ca 100644 (file)
@@ -584,6 +584,21 @@ func TestUnknownChunkLengthUnderflow(t *testing.T) {
        }
 }
 
+func TestPaletted8OutOfRangePixel(t *testing.T) {
+       // IDAT contains a reference to a palette index that does not exist in the file.
+       img, err := readPNG("testdata/invalid-palette.png")
+       if err != nil {
+               t.Errorf("decoding invalid-palette.png: unexpected error %v", err)
+               return
+       }
+
+       // Expect that the palette is extended with opaque black.
+       want := color.RGBA{0x00, 0x00, 0x00, 0xff}
+       if got := img.At(15, 15); got != want {
+               t.Errorf("got %F %v, expected %T %v", got, got, want, want)
+       }
+}
+
 func TestGray8Transparent(t *testing.T) {
        // These bytes come from https://golang.org/issues/19553
        m, err := Decode(bytes.NewReader([]byte{
diff --git a/libgo/go/image/png/testdata/invalid-palette.png b/libgo/go/image/png/testdata/invalid-palette.png
new file mode 100644 (file)
index 0000000..a747e59
Binary files /dev/null and b/libgo/go/image/png/testdata/invalid-palette.png differ
index c03335120eb273c813fab767a6ff506603558df2..2bd4fde692c3cabc5dd5de3d1157597072b74f5a 100644 (file)
@@ -288,7 +288,6 @@ func filter(cr *[nFilter][]byte, pr []byte, bpp int) int {
                }
        }
        if sum < best {
-               best = sum
                filter = ftAverage
        }
 
diff --git a/libgo/go/index/suffixarray/gen.go b/libgo/go/index/suffixarray/gen.go
new file mode 100644 (file)
index 0000000..8c3de55
--- /dev/null
@@ -0,0 +1,92 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// Gen generates sais2.go by duplicating functions in sais.go
+// using different input types.
+// See the comment at the top of sais.go for details.
+package main
+
+import (
+       "bytes"
+       "io/ioutil"
+       "log"
+       "strings"
+)
+
+func main() {
+       log.SetPrefix("gen: ")
+       log.SetFlags(0)
+
+       data, err := ioutil.ReadFile("sais.go")
+       if err != nil {
+               log.Fatal(err)
+       }
+
+       x := bytes.Index(data, []byte("\n\n"))
+       if x < 0 {
+               log.Fatal("cannot find blank line after copyright comment")
+       }
+
+       var buf bytes.Buffer
+       buf.Write(data[:x])
+       buf.WriteString("\n\n// Code generated by go generate; DO NOT EDIT.\n\npackage suffixarray\n")
+
+       for {
+               x := bytes.Index(data, []byte("\nfunc "))
+               if x < 0 {
+                       break
+               }
+               data = data[x:]
+               p := bytes.IndexByte(data, '(')
+               if p < 0 {
+                       p = len(data)
+               }
+               name := string(data[len("\nfunc "):p])
+
+               x = bytes.Index(data, []byte("\n}\n"))
+               if x < 0 {
+                       log.Fatalf("cannot find end of func %s", name)
+               }
+               fn := string(data[:x+len("\n}\n")])
+               data = data[x+len("\n}"):]
+
+               if strings.HasSuffix(name, "_32") {
+                       buf.WriteString(fix32.Replace(fn))
+               }
+               if strings.HasSuffix(name, "_8_32") {
+                       // x_8_32 -> x_8_64 done above
+                       fn = fix8_32.Replace(stripByteOnly(fn))
+                       buf.WriteString(fn)
+                       buf.WriteString(fix32.Replace(fn))
+               }
+       }
+
+       if err := ioutil.WriteFile("sais2.go", buf.Bytes(), 0666); err != nil {
+               log.Fatal(err)
+       }
+}
+
+var fix32 = strings.NewReplacer(
+       "32", "64",
+       "int32", "int64",
+)
+
+var fix8_32 = strings.NewReplacer(
+       "_8_32", "_32",
+       "byte", "int32",
+)
+
+func stripByteOnly(s string) string {
+       lines := strings.SplitAfter(s, "\n")
+       w := 0
+       for _, line := range lines {
+               if !strings.Contains(line, "256") && !strings.Contains(line, "byte-only") {
+                       lines[w] = line
+                       w++
+               }
+       }
+       return strings.Join(lines[:w], "")
+}
diff --git a/libgo/go/index/suffixarray/qsufsort.go b/libgo/go/index/suffixarray/qsufsort.go
deleted file mode 100644 (file)
index 9c36a98..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This algorithm is based on "Faster Suffix Sorting"
-//   by N. Jesper Larsson and Kunihiko Sadakane
-// paper: http://www.larsson.dogma.net/ssrev-tr.pdf
-// code:  http://www.larsson.dogma.net/qsufsort.c
-
-// This algorithm computes the suffix array sa by computing its inverse.
-// Consecutive groups of suffixes in sa are labeled as sorted groups or
-// unsorted groups. For a given pass of the sorter, all suffixes are ordered
-// up to their first h characters, and sa is h-ordered. Suffixes in their
-// final positions and unambiguously sorted in h-order are in a sorted group.
-// Consecutive groups of suffixes with identical first h characters are an
-// unsorted group. In each pass of the algorithm, unsorted groups are sorted
-// according to the group number of their following suffix.
-
-// In the implementation, if sa[i] is negative, it indicates that i is
-// the first element of a sorted group of length -sa[i], and can be skipped.
-// An unsorted group sa[i:k] is given the group number of the index of its
-// last element, k-1. The group numbers are stored in the inverse slice (inv),
-// and when all groups are sorted, this slice is the inverse suffix array.
-
-package suffixarray
-
-import "sort"
-
-func qsufsort(data []byte) []int {
-       // initial sorting by first byte of suffix
-       sa := sortedByFirstByte(data)
-       if len(sa) < 2 {
-               return sa
-       }
-       // initialize the group lookup table
-       // this becomes the inverse of the suffix array when all groups are sorted
-       inv := initGroups(sa, data)
-
-       // the index starts 1-ordered
-       sufSortable := &suffixSortable{sa: sa, inv: inv, h: 1}
-
-       for sa[0] > -len(sa) { // until all suffixes are one big sorted group
-               // The suffixes are h-ordered, make them 2*h-ordered
-               pi := 0 // pi is first position of first group
-               sl := 0 // sl is negated length of sorted groups
-               for pi < len(sa) {
-                       if s := sa[pi]; s < 0 { // if pi starts sorted group
-                               pi -= s // skip over sorted group
-                               sl += s // add negated length to sl
-                       } else { // if pi starts unsorted group
-                               if sl != 0 {
-                                       sa[pi+sl] = sl // combine sorted groups before pi
-                                       sl = 0
-                               }
-                               pk := inv[s] + 1 // pk-1 is last position of unsorted group
-                               sufSortable.sa = sa[pi:pk]
-                               sort.Sort(sufSortable)
-                               sufSortable.updateGroups(pi)
-                               pi = pk // next group
-                       }
-               }
-               if sl != 0 { // if the array ends with a sorted group
-                       sa[pi+sl] = sl // combine sorted groups at end of sa
-               }
-
-               sufSortable.h *= 2 // double sorted depth
-       }
-
-       for i := range sa { // reconstruct suffix array from inverse
-               sa[inv[i]] = i
-       }
-       return sa
-}
-
-func sortedByFirstByte(data []byte) []int {
-       // total byte counts
-       var count [256]int
-       for _, b := range data {
-               count[b]++
-       }
-       // make count[b] equal index of first occurrence of b in sorted array
-       sum := 0
-       for b := range count {
-               count[b], sum = sum, count[b]+sum
-       }
-       // iterate through bytes, placing index into the correct spot in sa
-       sa := make([]int, len(data))
-       for i, b := range data {
-               sa[count[b]] = i
-               count[b]++
-       }
-       return sa
-}
-
-func initGroups(sa []int, data []byte) []int {
-       // label contiguous same-letter groups with the same group number
-       inv := make([]int, len(data))
-       prevGroup := len(sa) - 1
-       groupByte := data[sa[prevGroup]]
-       for i := len(sa) - 1; i >= 0; i-- {
-               if b := data[sa[i]]; b < groupByte {
-                       if prevGroup == i+1 {
-                               sa[i+1] = -1
-                       }
-                       groupByte = b
-                       prevGroup = i
-               }
-               inv[sa[i]] = prevGroup
-               if prevGroup == 0 {
-                       sa[0] = -1
-               }
-       }
-       // Separate out the final suffix to the start of its group.
-       // This is necessary to ensure the suffix "a" is before "aba"
-       // when using a potentially unstable sort.
-       lastByte := data[len(data)-1]
-       s := -1
-       for i := range sa {
-               if sa[i] >= 0 {
-                       if data[sa[i]] == lastByte && s == -1 {
-                               s = i
-                       }
-                       if sa[i] == len(sa)-1 {
-                               sa[i], sa[s] = sa[s], sa[i]
-                               inv[sa[s]] = s
-                               sa[s] = -1 // mark it as an isolated sorted group
-                               break
-                       }
-               }
-       }
-       return inv
-}
-
-type suffixSortable struct {
-       sa  []int
-       inv []int
-       h   int
-       buf []int // common scratch space
-}
-
-func (x *suffixSortable) Len() int           { return len(x.sa) }
-func (x *suffixSortable) Less(i, j int) bool { return x.inv[x.sa[i]+x.h] < x.inv[x.sa[j]+x.h] }
-func (x *suffixSortable) Swap(i, j int)      { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] }
-
-func (x *suffixSortable) updateGroups(offset int) {
-       bounds := x.buf[0:0]
-       group := x.inv[x.sa[0]+x.h]
-       for i := 1; i < len(x.sa); i++ {
-               if g := x.inv[x.sa[i]+x.h]; g > group {
-                       bounds = append(bounds, i)
-                       group = g
-               }
-       }
-       bounds = append(bounds, len(x.sa))
-       x.buf = bounds
-
-       // update the group numberings after all new groups are determined
-       prev := 0
-       for _, b := range bounds {
-               for i := prev; i < b; i++ {
-                       x.inv[x.sa[i]] = offset + b - 1
-               }
-               if b-prev == 1 {
-                       x.sa[prev] = -1
-               }
-               prev = b
-       }
-}
diff --git a/libgo/go/index/suffixarray/sais.go b/libgo/go/index/suffixarray/sais.go
new file mode 100644 (file)
index 0000000..b4496d2
--- /dev/null
@@ -0,0 +1,899 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Suffix array construction by induced sorting (SAIS).
+// See Ge Nong, Sen Zhang, and Wai Hong Chen,
+// "Two Efficient Algorithms for Linear Time Suffix Array Construction",
+// especially section 3 (https://ieeexplore.ieee.org/document/5582081).
+// See also http://zork.net/~st/jottings/sais.html.
+//
+// With optimizations inspired by Yuta Mori's sais-lite
+// (https://sites.google.com/site/yuta256/sais).
+//
+// And with other new optimizations.
+
+// Many of these functions are parameterized by the sizes of
+// the types they operate on. The generator gen.go makes
+// copies of these functions for use with other sizes.
+// Specifically:
+//
+// - A function with a name ending in _8_32 takes []byte and []int32 arguments
+//   and is duplicated into _32_32, _8_64, and _64_64 forms.
+//   The _32_32 and _64_64_ suffixes are shortened to plain _32 and _64.
+//   Any lines in the function body that contain the text "byte-only" or "256"
+//   are stripped when creating _32_32 and _64_64 forms.
+//   (Those lines are typically 8-bit-specific optimizations.)
+//
+// - A function with a name ending only in _32 operates on []int32
+//   and is duplicated into a _64 form. (Note that it may still take a []byte,
+//   but there is no need for a version of the function in which the []byte
+//   is widened to a full integer array.)
+
+// The overall runtime of this code is linear in the input size:
+// it runs a sequence of linear passes to reduce the problem to
+// a subproblem at most half as big, invokes itself recursively,
+// and then runs a sequence of linear passes to turn the answer
+// for the subproblem into the answer for the original problem.
+// This gives T(N) = O(N) + T(N/2) = O(N) + O(N/2) + O(N/4) + ... = O(N).
+//
+// The outline of the code, with the forward and backward scans
+// through O(N)-sized arrays called out, is:
+//
+// sais_I_N
+//     placeLMS_I_B
+//             bucketMax_I_B
+//                     freq_I_B
+//                             <scan +text> (1)
+//                     <scan +freq> (2)
+//             <scan -text, random bucket> (3)
+//     induceSubL_I_B
+//             bucketMin_I_B
+//                     freq_I_B
+//                             <scan +text, often optimized away> (4)
+//                     <scan +freq> (5)
+//             <scan +sa, random text, random bucket> (6)
+//     induceSubS_I_B
+//             bucketMax_I_B
+//                     freq_I_B
+//                             <scan +text, often optimized away> (7)
+//                     <scan +freq> (8)
+//             <scan -sa, random text, random bucket> (9)
+//     assignID_I_B
+//             <scan +sa, random text substrings> (10)
+//     map_B
+//             <scan -sa> (11)
+//     recurse_B
+//             (recursive call to sais_B_B for a subproblem of size at most 1/2 input, often much smaller)
+//     unmap_I_B
+//             <scan -text> (12)
+//             <scan +sa> (13)
+//     expand_I_B
+//             bucketMax_I_B
+//                     freq_I_B
+//                             <scan +text, often optimized away> (14)
+//                     <scan +freq> (15)
+//             <scan -sa, random text, random bucket> (16)
+//     induceL_I_B
+//             bucketMin_I_B
+//                     freq_I_B
+//                             <scan +text, often optimized away> (17)
+//                     <scan +freq> (18)
+//             <scan +sa, random text, random bucket> (19)
+//     induceS_I_B
+//             bucketMax_I_B
+//                     freq_I_B
+//                             <scan +text, often optimized away> (20)
+//                     <scan +freq> (21)
+//             <scan -sa, random text, random bucket> (22)
+//
+// Here, _B indicates the suffix array size (_32 or _64) and _I the input size (_8 or _B).
+//
+// The outline shows there are in general 22 scans through
+// O(N)-sized arrays for a given level of the recursion.
+// In the top level, operating on 8-bit input text,
+// the six freq scans are fixed size (256) instead of potentially
+// input-sized. Also, the frequency is counted once and cached
+// whenever there is room to do so (there is nearly always room in general,
+// and always room at the top level), which eliminates all but
+// the first freq_I_B text scans (that is, 5 of the 6).
+// So the top level of the recursion only does 22 - 6 - 5 = 11
+// input-sized scans and a typical level does 16 scans.
+//
+// The linear scans do not cost anywhere near as much as
+// the random accesses to the text made during a few of
+// the scans (specifically #6, #9, #16, #19, #22 marked above).
+// In real texts, there is not much but some locality to
+// the accesses, due to the repetitive structure of the text
+// (the same reason Burrows-Wheeler compression is so effective).
+// For random inputs, there is no locality, which makes those
+// accesses even more expensive, especially once the text
+// no longer fits in cache.
+// For example, running on 50 MB of Go source code, induceSubL_8_32
+// (which runs only once, at the top level of the recursion)
+// takes 0.44s, while on 50 MB of random input, it takes 2.55s.
+// Nearly all the relative slowdown is explained by the text access:
+//
+//             c0, c1 := text[k-1], text[k]
+//
+// That line runs for 0.23s on the Go text and 2.02s on random text.
+
+//go:generate go run gen.go
+
+package suffixarray
+
+// text_32 returns the suffix array for the input text.
+// It requires that len(text) fit in an int32
+// and that the caller zero sa.
+func text_32(text []byte, sa []int32) {
+       if int(int32(len(text))) != len(text) || len(text) != len(sa) {
+               panic("suffixarray: misuse of text_32")
+       }
+       sais_8_32(text, 256, sa, make([]int32, 2*256))
+}
+
+// sais_8_32 computes the suffix array of text.
+// The text must contain only values in [0, textMax).
+// The suffix array is stored in sa, which the caller
+// must ensure is already zeroed.
+// The caller must also provide temporary space tmp
+// with len(tmp) ≥ textMax. If len(tmp) ≥ 2*textMax
+// then the algorithm runs a little faster.
+// If sais_8_32 modifies tmp, it sets tmp[0] = -1 on return.
+func sais_8_32(text []byte, textMax int, sa, tmp []int32) {
+       if len(sa) != len(text) || len(tmp) < int(textMax) {
+               panic("suffixarray: misuse of sais_8_32")
+       }
+
+       // Trivial base cases. Sorting 0 or 1 things is easy.
+       if len(text) == 0 {
+               return
+       }
+       if len(text) == 1 {
+               sa[0] = 0
+               return
+       }
+
+       // Establish slices indexed by text character
+       // holding character frequency and bucket-sort offsets.
+       // If there's only enough tmp for one slice,
+       // we make it the bucket offsets and recompute
+       // the character frequency each time we need it.
+       var freq, bucket []int32
+       if len(tmp) >= 2*textMax {
+               freq, bucket = tmp[:textMax], tmp[textMax:2*textMax]
+               freq[0] = -1 // mark as uninitialized
+       } else {
+               freq, bucket = nil, tmp[:textMax]
+       }
+
+       // The SAIS algorithm.
+       // Each of these calls makes one scan through sa.
+       // See the individual functions for documentation
+       // about each's role in the algorithm.
+       numLMS := placeLMS_8_32(text, sa, freq, bucket)
+       if numLMS <= 1 {
+               // 0 or 1 items are already sorted. Do nothing.
+       } else {
+               induceSubL_8_32(text, sa, freq, bucket)
+               induceSubS_8_32(text, sa, freq, bucket)
+               length_8_32(text, sa, numLMS)
+               maxID := assignID_8_32(text, sa, numLMS)
+               if maxID < numLMS {
+                       map_32(sa, numLMS)
+                       recurse_32(sa, tmp, numLMS, maxID)
+                       unmap_8_32(text, sa, numLMS)
+               } else {
+                       // If maxID == numLMS, then each LMS-substring
+                       // is unique, so the relative ordering of two LMS-suffixes
+                       // is determined by just the leading LMS-substring.
+                       // That is, the LMS-suffix sort order matches the
+                       // (simpler) LMS-substring sort order.
+                       // Copy the original LMS-substring order into the
+                       // suffix array destination.
+                       copy(sa, sa[len(sa)-numLMS:])
+               }
+               expand_8_32(text, freq, bucket, sa, numLMS)
+       }
+       induceL_8_32(text, sa, freq, bucket)
+       induceS_8_32(text, sa, freq, bucket)
+
+       // Mark for caller that we overwrote tmp.
+       tmp[0] = -1
+}
+
+// freq_8_32 returns the character frequencies
+// for text, as a slice indexed by character value.
+// If freq is nil, freq_8_32 uses and returns bucket.
+// If freq is non-nil, freq_8_32 assumes that freq[0] >= 0
+// means the frequencies are already computed.
+// If the frequency data is overwritten or uninitialized,
+// the caller must set freq[0] = -1 to force recomputation
+// the next time it is needed.
+func freq_8_32(text []byte, freq, bucket []int32) []int32 {
+       if freq != nil && freq[0] >= 0 {
+               return freq // already computed
+       }
+       if freq == nil {
+               freq = bucket
+       }
+
+       freq = freq[:256] // eliminate bounds check for freq[c] below
+       for i := range freq {
+               freq[i] = 0
+       }
+       for _, c := range text {
+               freq[c]++
+       }
+       return freq
+}
+
+// bucketMin_8_32 stores into bucket[c] the minimum index
+// in the bucket for character c in a bucket-sort of text.
+func bucketMin_8_32(text []byte, freq, bucket []int32) {
+       freq = freq_8_32(text, freq, bucket)
+       freq = freq[:256]     // establish len(freq) = 256, so 0 ≤ i < 256 below
+       bucket = bucket[:256] // eliminate bounds check for bucket[i] below
+       total := int32(0)
+       for i, n := range freq {
+               bucket[i] = total
+               total += n
+       }
+}
+
+// bucketMax_8_32 stores into bucket[c] the maximum index
+// in the bucket for character c in a bucket-sort of text.
+// The bucket indexes for c are [min, max).
+// That is, max is one past the final index in that bucket.
+func bucketMax_8_32(text []byte, freq, bucket []int32) {
+       freq = freq_8_32(text, freq, bucket)
+       freq = freq[:256]     // establish len(freq) = 256, so 0 ≤ i < 256 below
+       bucket = bucket[:256] // eliminate bounds check for bucket[i] below
+       total := int32(0)
+       for i, n := range freq {
+               total += n
+               bucket[i] = total
+       }
+}
+
+// The SAIS algorithm proceeds in a sequence of scans through sa.
+// Each of the following functions implements one scan,
+// and the functions appear here in the order they execute in the algorithm.
+
+// placeLMS_8_32 places into sa the indexes of the
+// final characters of the LMS substrings of text,
+// sorted into the rightmost ends of their correct buckets
+// in the suffix array.
+//
+// The imaginary sentinel character at the end of the text
+// is the final character of the final LMS substring, but there
+// is no bucket for the imaginary sentinel character,
+// which has a smaller value than any real character.
+// The caller must therefore pretend that sa[-1] == len(text).
+//
+// The text indexes of LMS-substring characters are always ≥ 1
+// (the first LMS-substring must be preceded by one or more L-type
+// characters that are not part of any LMS-substring),
+// so using 0 as a “not present” suffix array entry is safe,
+// both in this function and in most later functions
+// (until induceL_8_32 below).
+func placeLMS_8_32(text []byte, sa, freq, bucket []int32) int {
+       bucketMax_8_32(text, freq, bucket)
+
+       numLMS := 0
+       lastB := int32(-1)
+       bucket = bucket[:256] // eliminate bounds check for bucket[c1] below
+
+       // The next stanza of code (until the blank line) loop backward
+       // over text, stopping to execute a code body at each position i
+       // such that text[i] is an L-character and text[i+1] is an S-character.
+       // That is, i+1 is the position of the start of an LMS-substring.
+       // These could be hoisted out into a function with a callback,
+       // but at a significant speed cost. Instead, we just write these
+       // seven lines a few times in this source file. The copies below
+       // refer back to the pattern established by this original as the
+       // "LMS-substring iterator".
+       //
+       // In every scan through the text, c0, c1 are successive characters of text.
+       // In this backward scan, c0 == text[i] and c1 == text[i+1].
+       // By scanning backward, we can keep track of whether the current
+       // position is type-S or type-L according to the usual definition:
+       //
+       //      - position len(text) is type S with text[len(text)] == -1 (the sentinel)
+       //      - position i is type S if text[i] < text[i+1], or if text[i] == text[i+1] && i+1 is type S.
+       //      - position i is type L if text[i] > text[i+1], or if text[i] == text[i+1] && i+1 is type L.
+       //
+       // The backward scan lets us maintain the current type,
+       // update it when we see c0 != c1, and otherwise leave it alone.
+       // We want to identify all S positions with a preceding L.
+       // Position len(text) is one such position by definition, but we have
+       // nowhere to write it down, so we eliminate it by untruthfully
+       // setting isTypeS = false at the start of the loop.
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Bucket the index i+1 for the start of an LMS-substring.
+                       b := bucket[c1] - 1
+                       bucket[c1] = b
+                       sa[b] = int32(i + 1)
+                       lastB = b
+                       numLMS++
+               }
+       }
+
+       // We recorded the LMS-substring starts but really want the ends.
+       // Luckily, with two differences, the start indexes and the end indexes are the same.
+       // The first difference is that the rightmost LMS-substring's end index is len(text),
+       // so the caller must pretend that sa[-1] == len(text), as noted above.
+       // The second difference is that the first leftmost LMS-substring start index
+       // does not end an earlier LMS-substring, so as an optimization we can omit
+       // that leftmost LMS-substring start index (the last one we wrote).
+       //
+       // Exception: if numLMS <= 1, the caller is not going to bother with
+       // the recursion at all and will treat the result as containing LMS-substring starts.
+       // In that case, we don't remove the final entry.
+       if numLMS > 1 {
+               sa[lastB] = 0
+       }
+       return numLMS
+}
+
+// induceSubL_8_32 inserts the L-type text indexes of LMS-substrings
+// into sa, assuming that the final characters of the LMS-substrings
+// are already inserted into sa, sorted by final character, and at the
+// right (not left) end of the corresponding character bucket.
+// Each LMS-substring has the form (as a regexp) /S+L+S/:
+// one or more S-type, one or more L-type, final S-type.
+// induceSubL_8_32 leaves behind only the leftmost L-type text
+// index for each LMS-substring. That is, it removes the final S-type
+// indexes that are present on entry, and it inserts but then removes
+// the interior L-type indexes too.
+// (Only the leftmost L-type index is needed by induceSubS_8_32.)
+func induceSubL_8_32(text []byte, sa, freq, bucket []int32) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_8_32(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // As we scan the array left-to-right, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type L.
+       // Because j-1 is type L, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type L from type S.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type S.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ > i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type S, at which point it must stop.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i], so that the loop finishes with sa containing
+       // only the indexes of the leftmost L-type indexes for each LMS-substring.
+       //
+       // The suffix array sa therefore serves simultaneously as input, output,
+       // and a miraculously well-tailored work queue.
+
+       // placeLMS_8_32 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index:
+       // we're processing suffixes in sorted order
+       // and accessing buckets indexed by the
+       // byte before the sorted order, which still
+       // has very good locality.
+       // Invariant: b is cached, possibly dirty copy of bucket[cB].
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int32(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               if j < 0 {
+                       // Leave discovered type-S index for caller.
+                       sa[i] = int32(-j)
+                       continue
+               }
+               sa[i] = 0
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               k := j - 1
+               c0, c1 := text[k-1], text[k]
+               if c0 < c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int32(k)
+               b++
+       }
+}
+
+// induceSubS_8_32 inserts the S-type text indexes of LMS-substrings
+// into sa, assuming that the leftmost L-type text indexes are already
+// inserted into sa, sorted by LMS-substring suffix, and at the
+// left end of the corresponding character bucket.
+// Each LMS-substring has the form (as a regexp) /S+L+S/:
+// one or more S-type, one or more L-type, final S-type.
+// induceSubS_8_32 leaves behind only the leftmost S-type text
+// index for each LMS-substring, in sorted order, at the right end of sa.
+// That is, it removes the L-type indexes that are present on entry,
+// and it inserts but then removes the interior S-type indexes too,
+// leaving the LMS-substring start indexes packed into sa[len(sa)-numLMS:].
+// (Only the LMS-substring start indexes are processed by the recursion.)
+func induceSubS_8_32(text []byte, sa, freq, bucket []int32) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_8_32(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // Analogous to induceSubL_8_32 above,
+       // as we scan the array right-to-left, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type S.
+       // Because j-1 is type S, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type S from type L.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type L.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ < i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type L, at which point it must stop.
+       // That index (preceded by one of type L) is an LMS-substring start.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i] and compact into the top of sa,
+       // so that the loop finishes with the top of sa containing exactly
+       // the LMS-substring start indexes, sorted by LMS-substring.
+
+       // Cache recently used bucket index:
+       cB := byte(0)
+       b := bucket[cB]
+
+       top := len(sa)
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               sa[i] = 0
+               if j < 0 {
+                       // Leave discovered LMS-substring start index for caller.
+                       top--
+                       sa[top] = int32(-j)
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is S-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue -k to save for the caller.
+               k := j - 1
+               c1 := text[k]
+               c0 := text[k-1]
+               if c0 > c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int32(k)
+       }
+}
+
+// length_8_32 computes and records the length of each LMS-substring in text.
+// The length of the LMS-substring at index j is stored at sa[j/2],
+// avoiding the LMS-substring indexes already stored in the top half of sa.
+// (If index j is an LMS-substring start, then index j-1 is type L and cannot be.)
+// There are two exceptions, made for optimizations in name_8_32 below.
+//
+// First, the final LMS-substring is recorded as having length 0, which is otherwise
+// impossible, instead of giving it a length that includes the implicit sentinel.
+// This ensures the final LMS-substring has length unequal to all others
+// and therefore can be detected as different without text comparison
+// (it is unequal because it is the only one that ends in the implicit sentinel,
+// and the text comparison would be problematic since the implicit sentinel
+// is not actually present at text[len(text)]).
+//
+// Second, to avoid text comparison entirely, if an LMS-substring is very short,
+// sa[j/2] records its actual text instead of its length, so that if two such
+// substrings have matching “length,” the text need not be read at all.
+// The definition of “very short” is that the text bytes must pack into an uint32,
+// and the unsigned encoding e must be ≥ len(text), so that it can be
+// distinguished from a valid length.
+func length_8_32(text []byte, sa []int32, numLMS int) {
+       end := 0 // index of current LMS-substring end (0 indicates final LMS-substring)
+
+       // The encoding of N text bytes into a “length” word
+       // adds 1 to each byte, packs them into the bottom
+       // N*8 bits of a word, and then bitwise inverts the result.
+       // That is, the text sequence A B C (hex 41 42 43)
+       // encodes as ^uint32(0x42_43_44).
+       // LMS-substrings can never start or end with 0xFF.
+       // Adding 1 ensures the encoded byte sequence never
+       // starts or ends with 0x00, so that present bytes can be
+       // distinguished from zero-padding in the top bits,
+       // so the length need not be separately encoded.
+       // Inverting the bytes increases the chance that a
+       // 4-byte encoding will still be ≥ len(text).
+       // In particular, if the first byte is ASCII (<= 0x7E, so +1 <= 0x7F)
+       // then the high bit of the inversion will be set,
+       // making it clearly not a valid length (it would be a negative one).
+       //
+       // cx holds the pre-inverted encoding (the packed incremented bytes).
+       cx := uint32(0) // byte-only
+
+       // This stanza (until the blank line) is the "LMS-substring iterator",
+       // described in placeLMS_8_32 above, with one line added to maintain cx.
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               cx = cx<<8 | uint32(c1+1) // byte-only
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Index j = i+1 is the start of an LMS-substring.
+                       // Compute length or encoded text to store in sa[j/2].
+                       j := i + 1
+                       var code int32
+                       if end == 0 {
+                               code = 0
+                       } else {
+                               code = int32(end - j)
+                               if code <= 32/8 && ^cx >= uint32(len(text)) { // byte-only
+                                       code = int32(^cx) // byte-only
+                               } // byte-only
+                       }
+                       sa[j>>1] = code
+                       end = j + 1
+                       cx = uint32(c1 + 1) // byte-only
+               }
+       }
+}
+
+// assignID_8_32 assigns a dense ID numbering to the
+// set of LMS-substrings respecting string ordering and equality,
+// returning the maximum assigned ID.
+// For example given the input "ababab", the LMS-substrings
+// are "aba", "aba", and "ab", renumbered as 2 2 1.
+// sa[len(sa)-numLMS:] holds the LMS-substring indexes
+// sorted in string order, so to assign numbers we can
+// consider each in turn, removing adjacent duplicates.
+// The new ID for the LMS-substring at index j is written to sa[j/2],
+// overwriting the length previously stored there (by length_8_32 above).
+func assignID_8_32(text []byte, sa []int32, numLMS int) int {
+       id := 0
+       lastLen := int32(-1) // impossible
+       lastPos := int32(0)
+       for _, j := range sa[len(sa)-numLMS:] {
+               // Is the LMS-substring at index j new, or is it the same as the last one we saw?
+               n := sa[j/2]
+               if n != lastLen {
+                       goto New
+               }
+               if uint32(n) >= uint32(len(text)) {
+                       // “Length” is really encoded full text, and they match.
+                       goto Same
+               }
+               {
+                       // Compare actual texts.
+                       n := int(n)
+                       this := text[j:][:n]
+                       last := text[lastPos:][:n]
+                       for i := 0; i < n; i++ {
+                               if this[i] != last[i] {
+                                       goto New
+                               }
+                       }
+                       goto Same
+               }
+       New:
+               id++
+               lastPos = j
+               lastLen = n
+       Same:
+               sa[j/2] = int32(id)
+       }
+       return id
+}
+
+// map_32 maps the LMS-substrings in text to their new IDs,
+// producing the subproblem for the recursion.
+// The mapping itself was mostly applied by assignID_8_32:
+// sa[i] is either 0, the ID for the LMS-substring at index 2*i,
+// or the ID for the LMS-substring at index 2*i+1.
+// To produce the subproblem we need only remove the zeros
+// and change ID into ID-1 (our IDs start at 1, but text chars start at 0).
+//
+// map_32 packs the result, which is the input to the recursion,
+// into the top of sa, so that the recursion result can be stored
+// in the bottom of sa, which sets up for expand_8_32 well.
+func map_32(sa []int32, numLMS int) {
+       w := len(sa)
+       for i := len(sa) / 2; i >= 0; i-- {
+               j := sa[i]
+               if j > 0 {
+                       w--
+                       sa[w] = j - 1
+               }
+       }
+}
+
+// recurse_32 calls sais_32 recursively to solve the subproblem we've built.
+// The subproblem is at the right end of sa, the suffix array result will be
+// written at the left end of sa, and the middle of sa is available for use as
+// temporary frequency and bucket storage.
+func recurse_32(sa, oldTmp []int32, numLMS, maxID int) {
+       dst, saTmp, text := sa[:numLMS], sa[numLMS:len(sa)-numLMS], sa[len(sa)-numLMS:]
+
+       // Set up temporary space for recursive call.
+       // We must pass sais_32 a tmp buffer wiith at least maxID entries.
+       //
+       // The subproblem is guaranteed to have length at most len(sa)/2,
+       // so that sa can hold both the subproblem and its suffix array.
+       // Nearly all the time, however, the subproblem has length < len(sa)/3,
+       // in which case there is a subproblem-sized middle of sa that
+       // we can reuse for temporary space (saTmp).
+       // When recurse_32 is called from sais_8_32, oldTmp is length 512
+       // (from text_32), and saTmp will typically be much larger, so we'll use saTmp.
+       // When deeper recursions come back to recurse_32, now oldTmp is
+       // the saTmp from the top-most recursion, it is typically larger than
+       // the current saTmp (because the current sa gets smaller and smaller
+       // as the recursion gets deeper), and we keep reusing that top-most
+       // large saTmp instead of the offered smaller ones.
+       //
+       // Why is the subproblem length so often just under len(sa)/3?
+       // See Nong, Zhang, and Chen, section 3.6 for a plausible explanation.
+       // In brief, the len(sa)/2 case would correspond to an SLSLSLSLSLSL pattern
+       // in the input, perfect alternation of larger and smaller input bytes.
+       // Real text doesn't do that. If each L-type index is randomly followed
+       // by either an L-type or S-type index, then half the substrings will
+       // be of the form SLS, but the other half will be longer. Of that half,
+       // half (a quarter overall) will be SLLS; an eighth will be SLLLS, and so on.
+       // Not counting the final S in each (which overlaps the first S in the next),
+       // This works out to an average length 2×½ + 3×¼ + 4×⅛ + ... = 3.
+       // The space we need is further reduced by the fact that many of the
+       // short patterns like SLS will often be the same character sequences
+       // repeated throughout the text, reducing maxID relative to numLMS.
+       //
+       // For short inputs, the averages may not run in our favor, but then we
+       // can often fall back to using the length-512 tmp available in the
+       // top-most call. (Also a short allocation would not be a big deal.)
+       //
+       // For pathological inputs, we fall back to allocating a new tmp of length
+       // max(maxID, numLMS/2). This level of the recursion needs maxID,
+       // and all deeper levels of the recursion will need no more than numLMS/2,
+       // so this one allocation is guaranteed to suffice for the entire stack
+       // of recursive calls.
+       tmp := oldTmp
+       if len(tmp) < len(saTmp) {
+               tmp = saTmp
+       }
+       if len(tmp) < numLMS {
+               // TestSAIS/forcealloc reaches this code.
+               n := maxID
+               if n < numLMS/2 {
+                       n = numLMS / 2
+               }
+               tmp = make([]int32, n)
+       }
+
+       // sais_32 requires that the caller arrange to clear dst,
+       // because in general the caller may know dst is
+       // freshly-allocated and already cleared. But this one is not.
+       for i := range dst {
+               dst[i] = 0
+       }
+       sais_32(text, maxID, dst, tmp)
+}
+
+// unmap_8_32 unmaps the subproblem back to the original.
+// sa[:numLMS] is the LMS-substring numbers, which don't matter much anymore.
+// sa[len(sa)-numLMS:] is the sorted list of those LMS-substring numbers.
+// The key part is that if the list says K that means the K'th substring.
+// We can replace sa[:numLMS] with the indexes of the LMS-substrings.
+// Then if the list says K it really means sa[K].
+// Having mapped the list back to LMS-substring indexes,
+// we can place those into the right buckets.
+func unmap_8_32(text []byte, sa []int32, numLMS int) {
+       unmap := sa[len(sa)-numLMS:]
+       j := len(unmap)
+
+       // "LMS-substring iterator" (see placeLMS_8_32 above).
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Populate inverse map.
+                       j--
+                       unmap[j] = int32(i + 1)
+               }
+       }
+
+       // Apply inverse map to subproblem suffix array.
+       sa = sa[:numLMS]
+       for i := 0; i < len(sa); i++ {
+               sa[i] = unmap[sa[i]]
+       }
+}
+
+// expand_8_32 distributes the compacted, sorted LMS-suffix indexes
+// from sa[:numLMS] into the tops of the appropriate buckets in sa,
+// preserving the sorted order and making room for the L-type indexes
+// to be slotted into the sorted sequence by induceL_8_32.
+func expand_8_32(text []byte, freq, bucket, sa []int32, numLMS int) {
+       bucketMax_8_32(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bound check for bucket[c] below
+
+       // Loop backward through sa, always tracking
+       // the next index to populate from sa[:numLMS].
+       // When we get to one, populate it.
+       // Zero the rest of the slots; they have dead values in them.
+       x := numLMS - 1
+       saX := sa[x]
+       c := text[saX]
+       b := bucket[c] - 1
+       bucket[c] = b
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               if i != int(b) {
+                       sa[i] = 0
+                       continue
+               }
+               sa[i] = saX
+
+               // Load next entry to put down (if any).
+               if x > 0 {
+                       x--
+                       saX = sa[x] // TODO bounds check
+                       c = text[saX]
+                       b = bucket[c] - 1
+                       bucket[c] = b
+               }
+       }
+}
+
+// induceL_8_32 inserts L-type text indexes into sa,
+// assuming that the leftmost S-type indexes are inserted
+// into sa, in sorted order, in the right bucket halves.
+// It leaves all the L-type indexes in sa, but the
+// leftmost L-type indexes are negated, to mark them
+// for processing by induceS_8_32.
+func induceL_8_32(text []byte, sa, freq, bucket []int32) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_8_32(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // This scan is similar to the one in induceSubL_8_32 above.
+       // That one arranges to clear all but the leftmost L-type indexes.
+       // This scan leaves all the L-type indexes and the original S-type
+       // indexes, but it negates the positive leftmost L-type indexes
+       // (the ones that induceS_8_32 needs to process).
+
+       // expand_8_32 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index.
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int32(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j <= 0 {
+                       // Skip empty or negated entry (including negated zero).
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller. The caller can't tell the difference between
+               // an empty slot and a non-empty zero, but there's no need
+               // to distinguish them anyway: the final suffix array will end up
+               // with one zero somewhere, and that will be a real zero.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 < c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int32(k)
+               b++
+       }
+}
+
+func induceS_8_32(text []byte, sa, freq, bucket []int32) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_8_32(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       cB := byte(0)
+       b := bucket[cB]
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j >= 0 {
+                       // Skip non-flagged entry.
+                       // (This loop can't see an empty entry; 0 means the real zero index.)
+                       continue
+               }
+
+               // Negative j is a work queue entry; rewrite to positive j for final suffix array.
+               j = -j
+               sa[i] = int32(j)
+
+               // Index j was on work queue (encoded as -j but now decoded),
+               // meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue -k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 <= c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int32(k)
+       }
+}
diff --git a/libgo/go/index/suffixarray/sais2.go b/libgo/go/index/suffixarray/sais2.go
new file mode 100644 (file)
index 0000000..f124702
--- /dev/null
@@ -0,0 +1,1741 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Code generated by go generate; DO NOT EDIT.
+
+package suffixarray
+
+func text_64(text []byte, sa []int64) {
+       if int(int64(len(text))) != len(text) || len(text) != len(sa) {
+               panic("suffixarray: misuse of text_64")
+       }
+       sais_8_64(text, 256, sa, make([]int64, 2*256))
+}
+
+func sais_8_64(text []byte, textMax int, sa, tmp []int64) {
+       if len(sa) != len(text) || len(tmp) < int(textMax) {
+               panic("suffixarray: misuse of sais_8_64")
+       }
+
+       // Trivial base cases. Sorting 0 or 1 things is easy.
+       if len(text) == 0 {
+               return
+       }
+       if len(text) == 1 {
+               sa[0] = 0
+               return
+       }
+
+       // Establish slices indexed by text character
+       // holding character frequency and bucket-sort offsets.
+       // If there's only enough tmp for one slice,
+       // we make it the bucket offsets and recompute
+       // the character frequency each time we need it.
+       var freq, bucket []int64
+       if len(tmp) >= 2*textMax {
+               freq, bucket = tmp[:textMax], tmp[textMax:2*textMax]
+               freq[0] = -1 // mark as uninitialized
+       } else {
+               freq, bucket = nil, tmp[:textMax]
+       }
+
+       // The SAIS algorithm.
+       // Each of these calls makes one scan through sa.
+       // See the individual functions for documentation
+       // about each's role in the algorithm.
+       numLMS := placeLMS_8_64(text, sa, freq, bucket)
+       if numLMS <= 1 {
+               // 0 or 1 items are already sorted. Do nothing.
+       } else {
+               induceSubL_8_64(text, sa, freq, bucket)
+               induceSubS_8_64(text, sa, freq, bucket)
+               length_8_64(text, sa, numLMS)
+               maxID := assignID_8_64(text, sa, numLMS)
+               if maxID < numLMS {
+                       map_64(sa, numLMS)
+                       recurse_64(sa, tmp, numLMS, maxID)
+                       unmap_8_64(text, sa, numLMS)
+               } else {
+                       // If maxID == numLMS, then each LMS-substring
+                       // is unique, so the relative ordering of two LMS-suffixes
+                       // is determined by just the leading LMS-substring.
+                       // That is, the LMS-suffix sort order matches the
+                       // (simpler) LMS-substring sort order.
+                       // Copy the original LMS-substring order into the
+                       // suffix array destination.
+                       copy(sa, sa[len(sa)-numLMS:])
+               }
+               expand_8_64(text, freq, bucket, sa, numLMS)
+       }
+       induceL_8_64(text, sa, freq, bucket)
+       induceS_8_64(text, sa, freq, bucket)
+
+       // Mark for caller that we overwrote tmp.
+       tmp[0] = -1
+}
+
+func sais_32(text []int32, textMax int, sa, tmp []int32) {
+       if len(sa) != len(text) || len(tmp) < int(textMax) {
+               panic("suffixarray: misuse of sais_32")
+       }
+
+       // Trivial base cases. Sorting 0 or 1 things is easy.
+       if len(text) == 0 {
+               return
+       }
+       if len(text) == 1 {
+               sa[0] = 0
+               return
+       }
+
+       // Establish slices indexed by text character
+       // holding character frequency and bucket-sort offsets.
+       // If there's only enough tmp for one slice,
+       // we make it the bucket offsets and recompute
+       // the character frequency each time we need it.
+       var freq, bucket []int32
+       if len(tmp) >= 2*textMax {
+               freq, bucket = tmp[:textMax], tmp[textMax:2*textMax]
+               freq[0] = -1 // mark as uninitialized
+       } else {
+               freq, bucket = nil, tmp[:textMax]
+       }
+
+       // The SAIS algorithm.
+       // Each of these calls makes one scan through sa.
+       // See the individual functions for documentation
+       // about each's role in the algorithm.
+       numLMS := placeLMS_32(text, sa, freq, bucket)
+       if numLMS <= 1 {
+               // 0 or 1 items are already sorted. Do nothing.
+       } else {
+               induceSubL_32(text, sa, freq, bucket)
+               induceSubS_32(text, sa, freq, bucket)
+               length_32(text, sa, numLMS)
+               maxID := assignID_32(text, sa, numLMS)
+               if maxID < numLMS {
+                       map_32(sa, numLMS)
+                       recurse_32(sa, tmp, numLMS, maxID)
+                       unmap_32(text, sa, numLMS)
+               } else {
+                       // If maxID == numLMS, then each LMS-substring
+                       // is unique, so the relative ordering of two LMS-suffixes
+                       // is determined by just the leading LMS-substring.
+                       // That is, the LMS-suffix sort order matches the
+                       // (simpler) LMS-substring sort order.
+                       // Copy the original LMS-substring order into the
+                       // suffix array destination.
+                       copy(sa, sa[len(sa)-numLMS:])
+               }
+               expand_32(text, freq, bucket, sa, numLMS)
+       }
+       induceL_32(text, sa, freq, bucket)
+       induceS_32(text, sa, freq, bucket)
+
+       // Mark for caller that we overwrote tmp.
+       tmp[0] = -1
+}
+
+func sais_64(text []int64, textMax int, sa, tmp []int64) {
+       if len(sa) != len(text) || len(tmp) < int(textMax) {
+               panic("suffixarray: misuse of sais_64")
+       }
+
+       // Trivial base cases. Sorting 0 or 1 things is easy.
+       if len(text) == 0 {
+               return
+       }
+       if len(text) == 1 {
+               sa[0] = 0
+               return
+       }
+
+       // Establish slices indexed by text character
+       // holding character frequency and bucket-sort offsets.
+       // If there's only enough tmp for one slice,
+       // we make it the bucket offsets and recompute
+       // the character frequency each time we need it.
+       var freq, bucket []int64
+       if len(tmp) >= 2*textMax {
+               freq, bucket = tmp[:textMax], tmp[textMax:2*textMax]
+               freq[0] = -1 // mark as uninitialized
+       } else {
+               freq, bucket = nil, tmp[:textMax]
+       }
+
+       // The SAIS algorithm.
+       // Each of these calls makes one scan through sa.
+       // See the individual functions for documentation
+       // about each's role in the algorithm.
+       numLMS := placeLMS_64(text, sa, freq, bucket)
+       if numLMS <= 1 {
+               // 0 or 1 items are already sorted. Do nothing.
+       } else {
+               induceSubL_64(text, sa, freq, bucket)
+               induceSubS_64(text, sa, freq, bucket)
+               length_64(text, sa, numLMS)
+               maxID := assignID_64(text, sa, numLMS)
+               if maxID < numLMS {
+                       map_64(sa, numLMS)
+                       recurse_64(sa, tmp, numLMS, maxID)
+                       unmap_64(text, sa, numLMS)
+               } else {
+                       // If maxID == numLMS, then each LMS-substring
+                       // is unique, so the relative ordering of two LMS-suffixes
+                       // is determined by just the leading LMS-substring.
+                       // That is, the LMS-suffix sort order matches the
+                       // (simpler) LMS-substring sort order.
+                       // Copy the original LMS-substring order into the
+                       // suffix array destination.
+                       copy(sa, sa[len(sa)-numLMS:])
+               }
+               expand_64(text, freq, bucket, sa, numLMS)
+       }
+       induceL_64(text, sa, freq, bucket)
+       induceS_64(text, sa, freq, bucket)
+
+       // Mark for caller that we overwrote tmp.
+       tmp[0] = -1
+}
+
+func freq_8_64(text []byte, freq, bucket []int64) []int64 {
+       if freq != nil && freq[0] >= 0 {
+               return freq // already computed
+       }
+       if freq == nil {
+               freq = bucket
+       }
+
+       freq = freq[:256] // eliminate bounds check for freq[c] below
+       for i := range freq {
+               freq[i] = 0
+       }
+       for _, c := range text {
+               freq[c]++
+       }
+       return freq
+}
+
+func freq_32(text []int32, freq, bucket []int32) []int32 {
+       if freq != nil && freq[0] >= 0 {
+               return freq // already computed
+       }
+       if freq == nil {
+               freq = bucket
+       }
+
+       for i := range freq {
+               freq[i] = 0
+       }
+       for _, c := range text {
+               freq[c]++
+       }
+       return freq
+}
+
+func freq_64(text []int64, freq, bucket []int64) []int64 {
+       if freq != nil && freq[0] >= 0 {
+               return freq // already computed
+       }
+       if freq == nil {
+               freq = bucket
+       }
+
+       for i := range freq {
+               freq[i] = 0
+       }
+       for _, c := range text {
+               freq[c]++
+       }
+       return freq
+}
+
+func bucketMin_8_64(text []byte, freq, bucket []int64) {
+       freq = freq_8_64(text, freq, bucket)
+       freq = freq[:256]     // establish len(freq) = 256, so 0 ≤ i < 256 below
+       bucket = bucket[:256] // eliminate bounds check for bucket[i] below
+       total := int64(0)
+       for i, n := range freq {
+               bucket[i] = total
+               total += n
+       }
+}
+
+func bucketMin_32(text []int32, freq, bucket []int32) {
+       freq = freq_32(text, freq, bucket)
+       total := int32(0)
+       for i, n := range freq {
+               bucket[i] = total
+               total += n
+       }
+}
+
+func bucketMin_64(text []int64, freq, bucket []int64) {
+       freq = freq_64(text, freq, bucket)
+       total := int64(0)
+       for i, n := range freq {
+               bucket[i] = total
+               total += n
+       }
+}
+
+func bucketMax_8_64(text []byte, freq, bucket []int64) {
+       freq = freq_8_64(text, freq, bucket)
+       freq = freq[:256]     // establish len(freq) = 256, so 0 ≤ i < 256 below
+       bucket = bucket[:256] // eliminate bounds check for bucket[i] below
+       total := int64(0)
+       for i, n := range freq {
+               total += n
+               bucket[i] = total
+       }
+}
+
+func bucketMax_32(text []int32, freq, bucket []int32) {
+       freq = freq_32(text, freq, bucket)
+       total := int32(0)
+       for i, n := range freq {
+               total += n
+               bucket[i] = total
+       }
+}
+
+func bucketMax_64(text []int64, freq, bucket []int64) {
+       freq = freq_64(text, freq, bucket)
+       total := int64(0)
+       for i, n := range freq {
+               total += n
+               bucket[i] = total
+       }
+}
+
+func placeLMS_8_64(text []byte, sa, freq, bucket []int64) int {
+       bucketMax_8_64(text, freq, bucket)
+
+       numLMS := 0
+       lastB := int64(-1)
+       bucket = bucket[:256] // eliminate bounds check for bucket[c1] below
+
+       // The next stanza of code (until the blank line) loop backward
+       // over text, stopping to execute a code body at each position i
+       // such that text[i] is an L-character and text[i+1] is an S-character.
+       // That is, i+1 is the position of the start of an LMS-substring.
+       // These could be hoisted out into a function with a callback,
+       // but at a significant speed cost. Instead, we just write these
+       // seven lines a few times in this source file. The copies below
+       // refer back to the pattern established by this original as the
+       // "LMS-substring iterator".
+       //
+       // In every scan through the text, c0, c1 are successive characters of text.
+       // In this backward scan, c0 == text[i] and c1 == text[i+1].
+       // By scanning backward, we can keep track of whether the current
+       // position is type-S or type-L according to the usual definition:
+       //
+       //      - position len(text) is type S with text[len(text)] == -1 (the sentinel)
+       //      - position i is type S if text[i] < text[i+1], or if text[i] == text[i+1] && i+1 is type S.
+       //      - position i is type L if text[i] > text[i+1], or if text[i] == text[i+1] && i+1 is type L.
+       //
+       // The backward scan lets us maintain the current type,
+       // update it when we see c0 != c1, and otherwise leave it alone.
+       // We want to identify all S positions with a preceding L.
+       // Position len(text) is one such position by definition, but we have
+       // nowhere to write it down, so we eliminate it by untruthfully
+       // setting isTypeS = false at the start of the loop.
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Bucket the index i+1 for the start of an LMS-substring.
+                       b := bucket[c1] - 1
+                       bucket[c1] = b
+                       sa[b] = int64(i + 1)
+                       lastB = b
+                       numLMS++
+               }
+       }
+
+       // We recorded the LMS-substring starts but really want the ends.
+       // Luckily, with two differences, the start indexes and the end indexes are the same.
+       // The first difference is that the rightmost LMS-substring's end index is len(text),
+       // so the caller must pretend that sa[-1] == len(text), as noted above.
+       // The second difference is that the first leftmost LMS-substring start index
+       // does not end an earlier LMS-substring, so as an optimization we can omit
+       // that leftmost LMS-substring start index (the last one we wrote).
+       //
+       // Exception: if numLMS <= 1, the caller is not going to bother with
+       // the recursion at all and will treat the result as containing LMS-substring starts.
+       // In that case, we don't remove the final entry.
+       if numLMS > 1 {
+               sa[lastB] = 0
+       }
+       return numLMS
+}
+
+func placeLMS_32(text []int32, sa, freq, bucket []int32) int {
+       bucketMax_32(text, freq, bucket)
+
+       numLMS := 0
+       lastB := int32(-1)
+
+       // The next stanza of code (until the blank line) loop backward
+       // over text, stopping to execute a code body at each position i
+       // such that text[i] is an L-character and text[i+1] is an S-character.
+       // That is, i+1 is the position of the start of an LMS-substring.
+       // These could be hoisted out into a function with a callback,
+       // but at a significant speed cost. Instead, we just write these
+       // seven lines a few times in this source file. The copies below
+       // refer back to the pattern established by this original as the
+       // "LMS-substring iterator".
+       //
+       // In every scan through the text, c0, c1 are successive characters of text.
+       // In this backward scan, c0 == text[i] and c1 == text[i+1].
+       // By scanning backward, we can keep track of whether the current
+       // position is type-S or type-L according to the usual definition:
+       //
+       //      - position len(text) is type S with text[len(text)] == -1 (the sentinel)
+       //      - position i is type S if text[i] < text[i+1], or if text[i] == text[i+1] && i+1 is type S.
+       //      - position i is type L if text[i] > text[i+1], or if text[i] == text[i+1] && i+1 is type L.
+       //
+       // The backward scan lets us maintain the current type,
+       // update it when we see c0 != c1, and otherwise leave it alone.
+       // We want to identify all S positions with a preceding L.
+       // Position len(text) is one such position by definition, but we have
+       // nowhere to write it down, so we eliminate it by untruthfully
+       // setting isTypeS = false at the start of the loop.
+       c0, c1, isTypeS := int32(0), int32(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Bucket the index i+1 for the start of an LMS-substring.
+                       b := bucket[c1] - 1
+                       bucket[c1] = b
+                       sa[b] = int32(i + 1)
+                       lastB = b
+                       numLMS++
+               }
+       }
+
+       // We recorded the LMS-substring starts but really want the ends.
+       // Luckily, with two differences, the start indexes and the end indexes are the same.
+       // The first difference is that the rightmost LMS-substring's end index is len(text),
+       // so the caller must pretend that sa[-1] == len(text), as noted above.
+       // The second difference is that the first leftmost LMS-substring start index
+       // does not end an earlier LMS-substring, so as an optimization we can omit
+       // that leftmost LMS-substring start index (the last one we wrote).
+       //
+       // Exception: if numLMS <= 1, the caller is not going to bother with
+       // the recursion at all and will treat the result as containing LMS-substring starts.
+       // In that case, we don't remove the final entry.
+       if numLMS > 1 {
+               sa[lastB] = 0
+       }
+       return numLMS
+}
+
+func placeLMS_64(text []int64, sa, freq, bucket []int64) int {
+       bucketMax_64(text, freq, bucket)
+
+       numLMS := 0
+       lastB := int64(-1)
+
+       // The next stanza of code (until the blank line) loop backward
+       // over text, stopping to execute a code body at each position i
+       // such that text[i] is an L-character and text[i+1] is an S-character.
+       // That is, i+1 is the position of the start of an LMS-substring.
+       // These could be hoisted out into a function with a callback,
+       // but at a significant speed cost. Instead, we just write these
+       // seven lines a few times in this source file. The copies below
+       // refer back to the pattern established by this original as the
+       // "LMS-substring iterator".
+       //
+       // In every scan through the text, c0, c1 are successive characters of text.
+       // In this backward scan, c0 == text[i] and c1 == text[i+1].
+       // By scanning backward, we can keep track of whether the current
+       // position is type-S or type-L according to the usual definition:
+       //
+       //      - position len(text) is type S with text[len(text)] == -1 (the sentinel)
+       //      - position i is type S if text[i] < text[i+1], or if text[i] == text[i+1] && i+1 is type S.
+       //      - position i is type L if text[i] > text[i+1], or if text[i] == text[i+1] && i+1 is type L.
+       //
+       // The backward scan lets us maintain the current type,
+       // update it when we see c0 != c1, and otherwise leave it alone.
+       // We want to identify all S positions with a preceding L.
+       // Position len(text) is one such position by definition, but we have
+       // nowhere to write it down, so we eliminate it by untruthfully
+       // setting isTypeS = false at the start of the loop.
+       c0, c1, isTypeS := int64(0), int64(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Bucket the index i+1 for the start of an LMS-substring.
+                       b := bucket[c1] - 1
+                       bucket[c1] = b
+                       sa[b] = int64(i + 1)
+                       lastB = b
+                       numLMS++
+               }
+       }
+
+       // We recorded the LMS-substring starts but really want the ends.
+       // Luckily, with two differences, the start indexes and the end indexes are the same.
+       // The first difference is that the rightmost LMS-substring's end index is len(text),
+       // so the caller must pretend that sa[-1] == len(text), as noted above.
+       // The second difference is that the first leftmost LMS-substring start index
+       // does not end an earlier LMS-substring, so as an optimization we can omit
+       // that leftmost LMS-substring start index (the last one we wrote).
+       //
+       // Exception: if numLMS <= 1, the caller is not going to bother with
+       // the recursion at all and will treat the result as containing LMS-substring starts.
+       // In that case, we don't remove the final entry.
+       if numLMS > 1 {
+               sa[lastB] = 0
+       }
+       return numLMS
+}
+
+func induceSubL_8_64(text []byte, sa, freq, bucket []int64) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_8_64(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // As we scan the array left-to-right, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type L.
+       // Because j-1 is type L, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type L from type S.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type S.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ > i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type S, at which point it must stop.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i], so that the loop finishes with sa containing
+       // only the indexes of the leftmost L-type indexes for each LMS-substring.
+       //
+       // The suffix array sa therefore serves simultaneously as input, output,
+       // and a miraculously well-tailored work queue.
+
+       // placeLMS_8_64 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index:
+       // we're processing suffixes in sorted order
+       // and accessing buckets indexed by the
+       // byte before the sorted order, which still
+       // has very good locality.
+       // Invariant: b is cached, possibly dirty copy of bucket[cB].
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int64(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               if j < 0 {
+                       // Leave discovered type-S index for caller.
+                       sa[i] = int64(-j)
+                       continue
+               }
+               sa[i] = 0
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               k := j - 1
+               c0, c1 := text[k-1], text[k]
+               if c0 < c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int64(k)
+               b++
+       }
+}
+
+func induceSubL_32(text []int32, sa, freq, bucket []int32) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_32(text, freq, bucket)
+
+       // As we scan the array left-to-right, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type L.
+       // Because j-1 is type L, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type L from type S.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type S.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ > i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type S, at which point it must stop.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i], so that the loop finishes with sa containing
+       // only the indexes of the leftmost L-type indexes for each LMS-substring.
+       //
+       // The suffix array sa therefore serves simultaneously as input, output,
+       // and a miraculously well-tailored work queue.
+
+       // placeLMS_32 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index:
+       // we're processing suffixes in sorted order
+       // and accessing buckets indexed by the
+       // int32 before the sorted order, which still
+       // has very good locality.
+       // Invariant: b is cached, possibly dirty copy of bucket[cB].
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int32(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               if j < 0 {
+                       // Leave discovered type-S index for caller.
+                       sa[i] = int32(-j)
+                       continue
+               }
+               sa[i] = 0
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               k := j - 1
+               c0, c1 := text[k-1], text[k]
+               if c0 < c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int32(k)
+               b++
+       }
+}
+
+func induceSubL_64(text []int64, sa, freq, bucket []int64) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_64(text, freq, bucket)
+
+       // As we scan the array left-to-right, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type L.
+       // Because j-1 is type L, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type L from type S.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type S.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ > i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type S, at which point it must stop.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i], so that the loop finishes with sa containing
+       // only the indexes of the leftmost L-type indexes for each LMS-substring.
+       //
+       // The suffix array sa therefore serves simultaneously as input, output,
+       // and a miraculously well-tailored work queue.
+
+       // placeLMS_64 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index:
+       // we're processing suffixes in sorted order
+       // and accessing buckets indexed by the
+       // int64 before the sorted order, which still
+       // has very good locality.
+       // Invariant: b is cached, possibly dirty copy of bucket[cB].
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int64(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               if j < 0 {
+                       // Leave discovered type-S index for caller.
+                       sa[i] = int64(-j)
+                       continue
+               }
+               sa[i] = 0
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               k := j - 1
+               c0, c1 := text[k-1], text[k]
+               if c0 < c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int64(k)
+               b++
+       }
+}
+
+func induceSubS_8_64(text []byte, sa, freq, bucket []int64) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_8_64(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // Analogous to induceSubL_8_64 above,
+       // as we scan the array right-to-left, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type S.
+       // Because j-1 is type S, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type S from type L.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type L.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ < i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type L, at which point it must stop.
+       // That index (preceded by one of type L) is an LMS-substring start.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i] and compact into the top of sa,
+       // so that the loop finishes with the top of sa containing exactly
+       // the LMS-substring start indexes, sorted by LMS-substring.
+
+       // Cache recently used bucket index:
+       cB := byte(0)
+       b := bucket[cB]
+
+       top := len(sa)
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               sa[i] = 0
+               if j < 0 {
+                       // Leave discovered LMS-substring start index for caller.
+                       top--
+                       sa[top] = int64(-j)
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is S-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue -k to save for the caller.
+               k := j - 1
+               c1 := text[k]
+               c0 := text[k-1]
+               if c0 > c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int64(k)
+       }
+}
+
+func induceSubS_32(text []int32, sa, freq, bucket []int32) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_32(text, freq, bucket)
+
+       // Analogous to induceSubL_32 above,
+       // as we scan the array right-to-left, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type S.
+       // Because j-1 is type S, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type S from type L.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type L.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ < i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type L, at which point it must stop.
+       // That index (preceded by one of type L) is an LMS-substring start.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i] and compact into the top of sa,
+       // so that the loop finishes with the top of sa containing exactly
+       // the LMS-substring start indexes, sorted by LMS-substring.
+
+       // Cache recently used bucket index:
+       cB := int32(0)
+       b := bucket[cB]
+
+       top := len(sa)
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               sa[i] = 0
+               if j < 0 {
+                       // Leave discovered LMS-substring start index for caller.
+                       top--
+                       sa[top] = int32(-j)
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is S-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue -k to save for the caller.
+               k := j - 1
+               c1 := text[k]
+               c0 := text[k-1]
+               if c0 > c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int32(k)
+       }
+}
+
+func induceSubS_64(text []int64, sa, freq, bucket []int64) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_64(text, freq, bucket)
+
+       // Analogous to induceSubL_64 above,
+       // as we scan the array right-to-left, each sa[i] = j > 0 is a correctly
+       // sorted suffix array entry (for text[j:]) for which we know that j-1 is type S.
+       // Because j-1 is type S, inserting it into sa now will sort it correctly.
+       // But we want to distinguish a j-1 with j-2 of type S from type L.
+       // We can process the former but want to leave the latter for the caller.
+       // We record the difference by negating j-1 if it is preceded by type L.
+       // Either way, the insertion (into the text[j-1] bucket) is guaranteed to
+       // happen at sa[i´] for some i´ < i, that is, in the portion of sa we have
+       // yet to scan. A single pass therefore sees indexes j, j-1, j-2, j-3,
+       // and so on, in sorted but not necessarily adjacent order, until it finds
+       // one preceded by an index of type L, at which point it must stop.
+       // That index (preceded by one of type L) is an LMS-substring start.
+       //
+       // As we scan through the array, we clear the worked entries (sa[i] > 0) to zero,
+       // and we flip sa[i] < 0 to -sa[i] and compact into the top of sa,
+       // so that the loop finishes with the top of sa containing exactly
+       // the LMS-substring start indexes, sorted by LMS-substring.
+
+       // Cache recently used bucket index:
+       cB := int64(0)
+       b := bucket[cB]
+
+       top := len(sa)
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j == 0 {
+                       // Skip empty entry.
+                       continue
+               }
+               sa[i] = 0
+               if j < 0 {
+                       // Leave discovered LMS-substring start index for caller.
+                       top--
+                       sa[top] = int64(-j)
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is S-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue -k to save for the caller.
+               k := j - 1
+               c1 := text[k]
+               c0 := text[k-1]
+               if c0 > c1 {
+                       k = -k
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int64(k)
+       }
+}
+
+func length_8_64(text []byte, sa []int64, numLMS int) {
+       end := 0 // index of current LMS-substring end (0 indicates final LMS-substring)
+
+       // The encoding of N text bytes into a “length” word
+       // adds 1 to each byte, packs them into the bottom
+       // N*8 bits of a word, and then bitwise inverts the result.
+       // That is, the text sequence A B C (hex 41 42 43)
+       // encodes as ^uint64(0x42_43_44).
+       // LMS-substrings can never start or end with 0xFF.
+       // Adding 1 ensures the encoded byte sequence never
+       // starts or ends with 0x00, so that present bytes can be
+       // distinguished from zero-padding in the top bits,
+       // so the length need not be separately encoded.
+       // Inverting the bytes increases the chance that a
+       // 4-byte encoding will still be ≥ len(text).
+       // In particular, if the first byte is ASCII (<= 0x7E, so +1 <= 0x7F)
+       // then the high bit of the inversion will be set,
+       // making it clearly not a valid length (it would be a negative one).
+       //
+       // cx holds the pre-inverted encoding (the packed incremented bytes).
+       cx := uint64(0) // byte-only
+
+       // This stanza (until the blank line) is the "LMS-substring iterator",
+       // described in placeLMS_8_64 above, with one line added to maintain cx.
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               cx = cx<<8 | uint64(c1+1) // byte-only
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Index j = i+1 is the start of an LMS-substring.
+                       // Compute length or encoded text to store in sa[j/2].
+                       j := i + 1
+                       var code int64
+                       if end == 0 {
+                               code = 0
+                       } else {
+                               code = int64(end - j)
+                               if code <= 64/8 && ^cx >= uint64(len(text)) { // byte-only
+                                       code = int64(^cx) // byte-only
+                               } // byte-only
+                       }
+                       sa[j>>1] = code
+                       end = j + 1
+                       cx = uint64(c1 + 1) // byte-only
+               }
+       }
+}
+
+func length_32(text []int32, sa []int32, numLMS int) {
+       end := 0 // index of current LMS-substring end (0 indicates final LMS-substring)
+
+       // The encoding of N text int32s into a “length” word
+       // adds 1 to each int32, packs them into the bottom
+       // N*8 bits of a word, and then bitwise inverts the result.
+       // That is, the text sequence A B C (hex 41 42 43)
+       // encodes as ^uint32(0x42_43_44).
+       // LMS-substrings can never start or end with 0xFF.
+       // Adding 1 ensures the encoded int32 sequence never
+       // starts or ends with 0x00, so that present int32s can be
+       // distinguished from zero-padding in the top bits,
+       // so the length need not be separately encoded.
+       // Inverting the int32s increases the chance that a
+       // 4-int32 encoding will still be ≥ len(text).
+       // In particular, if the first int32 is ASCII (<= 0x7E, so +1 <= 0x7F)
+       // then the high bit of the inversion will be set,
+       // making it clearly not a valid length (it would be a negative one).
+       //
+       // cx holds the pre-inverted encoding (the packed incremented int32s).
+
+       // This stanza (until the blank line) is the "LMS-substring iterator",
+       // described in placeLMS_32 above, with one line added to maintain cx.
+       c0, c1, isTypeS := int32(0), int32(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Index j = i+1 is the start of an LMS-substring.
+                       // Compute length or encoded text to store in sa[j/2].
+                       j := i + 1
+                       var code int32
+                       if end == 0 {
+                               code = 0
+                       } else {
+                               code = int32(end - j)
+                       }
+                       sa[j>>1] = code
+                       end = j + 1
+               }
+       }
+}
+
+func length_64(text []int64, sa []int64, numLMS int) {
+       end := 0 // index of current LMS-substring end (0 indicates final LMS-substring)
+
+       // The encoding of N text int64s into a “length” word
+       // adds 1 to each int64, packs them into the bottom
+       // N*8 bits of a word, and then bitwise inverts the result.
+       // That is, the text sequence A B C (hex 41 42 43)
+       // encodes as ^uint64(0x42_43_44).
+       // LMS-substrings can never start or end with 0xFF.
+       // Adding 1 ensures the encoded int64 sequence never
+       // starts or ends with 0x00, so that present int64s can be
+       // distinguished from zero-padding in the top bits,
+       // so the length need not be separately encoded.
+       // Inverting the int64s increases the chance that a
+       // 4-int64 encoding will still be ≥ len(text).
+       // In particular, if the first int64 is ASCII (<= 0x7E, so +1 <= 0x7F)
+       // then the high bit of the inversion will be set,
+       // making it clearly not a valid length (it would be a negative one).
+       //
+       // cx holds the pre-inverted encoding (the packed incremented int64s).
+
+       // This stanza (until the blank line) is the "LMS-substring iterator",
+       // described in placeLMS_64 above, with one line added to maintain cx.
+       c0, c1, isTypeS := int64(0), int64(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Index j = i+1 is the start of an LMS-substring.
+                       // Compute length or encoded text to store in sa[j/2].
+                       j := i + 1
+                       var code int64
+                       if end == 0 {
+                               code = 0
+                       } else {
+                               code = int64(end - j)
+                       }
+                       sa[j>>1] = code
+                       end = j + 1
+               }
+       }
+}
+
+func assignID_8_64(text []byte, sa []int64, numLMS int) int {
+       id := 0
+       lastLen := int64(-1) // impossible
+       lastPos := int64(0)
+       for _, j := range sa[len(sa)-numLMS:] {
+               // Is the LMS-substring at index j new, or is it the same as the last one we saw?
+               n := sa[j/2]
+               if n != lastLen {
+                       goto New
+               }
+               if uint64(n) >= uint64(len(text)) {
+                       // “Length” is really encoded full text, and they match.
+                       goto Same
+               }
+               {
+                       // Compare actual texts.
+                       n := int(n)
+                       this := text[j:][:n]
+                       last := text[lastPos:][:n]
+                       for i := 0; i < n; i++ {
+                               if this[i] != last[i] {
+                                       goto New
+                               }
+                       }
+                       goto Same
+               }
+       New:
+               id++
+               lastPos = j
+               lastLen = n
+       Same:
+               sa[j/2] = int64(id)
+       }
+       return id
+}
+
+func assignID_32(text []int32, sa []int32, numLMS int) int {
+       id := 0
+       lastLen := int32(-1) // impossible
+       lastPos := int32(0)
+       for _, j := range sa[len(sa)-numLMS:] {
+               // Is the LMS-substring at index j new, or is it the same as the last one we saw?
+               n := sa[j/2]
+               if n != lastLen {
+                       goto New
+               }
+               if uint32(n) >= uint32(len(text)) {
+                       // “Length” is really encoded full text, and they match.
+                       goto Same
+               }
+               {
+                       // Compare actual texts.
+                       n := int(n)
+                       this := text[j:][:n]
+                       last := text[lastPos:][:n]
+                       for i := 0; i < n; i++ {
+                               if this[i] != last[i] {
+                                       goto New
+                               }
+                       }
+                       goto Same
+               }
+       New:
+               id++
+               lastPos = j
+               lastLen = n
+       Same:
+               sa[j/2] = int32(id)
+       }
+       return id
+}
+
+func assignID_64(text []int64, sa []int64, numLMS int) int {
+       id := 0
+       lastLen := int64(-1) // impossible
+       lastPos := int64(0)
+       for _, j := range sa[len(sa)-numLMS:] {
+               // Is the LMS-substring at index j new, or is it the same as the last one we saw?
+               n := sa[j/2]
+               if n != lastLen {
+                       goto New
+               }
+               if uint64(n) >= uint64(len(text)) {
+                       // “Length” is really encoded full text, and they match.
+                       goto Same
+               }
+               {
+                       // Compare actual texts.
+                       n := int(n)
+                       this := text[j:][:n]
+                       last := text[lastPos:][:n]
+                       for i := 0; i < n; i++ {
+                               if this[i] != last[i] {
+                                       goto New
+                               }
+                       }
+                       goto Same
+               }
+       New:
+               id++
+               lastPos = j
+               lastLen = n
+       Same:
+               sa[j/2] = int64(id)
+       }
+       return id
+}
+
+func map_64(sa []int64, numLMS int) {
+       w := len(sa)
+       for i := len(sa) / 2; i >= 0; i-- {
+               j := sa[i]
+               if j > 0 {
+                       w--
+                       sa[w] = j - 1
+               }
+       }
+}
+
+func recurse_64(sa, oldTmp []int64, numLMS, maxID int) {
+       dst, saTmp, text := sa[:numLMS], sa[numLMS:len(sa)-numLMS], sa[len(sa)-numLMS:]
+
+       // Set up temporary space for recursive call.
+       // We must pass sais_64 a tmp buffer wiith at least maxID entries.
+       //
+       // The subproblem is guaranteed to have length at most len(sa)/2,
+       // so that sa can hold both the subproblem and its suffix array.
+       // Nearly all the time, however, the subproblem has length < len(sa)/3,
+       // in which case there is a subproblem-sized middle of sa that
+       // we can reuse for temporary space (saTmp).
+       // When recurse_64 is called from sais_8_64, oldTmp is length 512
+       // (from text_64), and saTmp will typically be much larger, so we'll use saTmp.
+       // When deeper recursions come back to recurse_64, now oldTmp is
+       // the saTmp from the top-most recursion, it is typically larger than
+       // the current saTmp (because the current sa gets smaller and smaller
+       // as the recursion gets deeper), and we keep reusing that top-most
+       // large saTmp instead of the offered smaller ones.
+       //
+       // Why is the subproblem length so often just under len(sa)/3?
+       // See Nong, Zhang, and Chen, section 3.6 for a plausible explanation.
+       // In brief, the len(sa)/2 case would correspond to an SLSLSLSLSLSL pattern
+       // in the input, perfect alternation of larger and smaller input bytes.
+       // Real text doesn't do that. If each L-type index is randomly followed
+       // by either an L-type or S-type index, then half the substrings will
+       // be of the form SLS, but the other half will be longer. Of that half,
+       // half (a quarter overall) will be SLLS; an eighth will be SLLLS, and so on.
+       // Not counting the final S in each (which overlaps the first S in the next),
+       // This works out to an average length 2×½ + 3×¼ + 4×⅛ + ... = 3.
+       // The space we need is further reduced by the fact that many of the
+       // short patterns like SLS will often be the same character sequences
+       // repeated throughout the text, reducing maxID relative to numLMS.
+       //
+       // For short inputs, the averages may not run in our favor, but then we
+       // can often fall back to using the length-512 tmp available in the
+       // top-most call. (Also a short allocation would not be a big deal.)
+       //
+       // For pathological inputs, we fall back to allocating a new tmp of length
+       // max(maxID, numLMS/2). This level of the recursion needs maxID,
+       // and all deeper levels of the recursion will need no more than numLMS/2,
+       // so this one allocation is guaranteed to suffice for the entire stack
+       // of recursive calls.
+       tmp := oldTmp
+       if len(tmp) < len(saTmp) {
+               tmp = saTmp
+       }
+       if len(tmp) < numLMS {
+               // TestSAIS/forcealloc reaches this code.
+               n := maxID
+               if n < numLMS/2 {
+                       n = numLMS / 2
+               }
+               tmp = make([]int64, n)
+       }
+
+       // sais_64 requires that the caller arrange to clear dst,
+       // because in general the caller may know dst is
+       // freshly-allocated and already cleared. But this one is not.
+       for i := range dst {
+               dst[i] = 0
+       }
+       sais_64(text, maxID, dst, tmp)
+}
+
+func unmap_8_64(text []byte, sa []int64, numLMS int) {
+       unmap := sa[len(sa)-numLMS:]
+       j := len(unmap)
+
+       // "LMS-substring iterator" (see placeLMS_8_64 above).
+       c0, c1, isTypeS := byte(0), byte(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Populate inverse map.
+                       j--
+                       unmap[j] = int64(i + 1)
+               }
+       }
+
+       // Apply inverse map to subproblem suffix array.
+       sa = sa[:numLMS]
+       for i := 0; i < len(sa); i++ {
+               sa[i] = unmap[sa[i]]
+       }
+}
+
+func unmap_32(text []int32, sa []int32, numLMS int) {
+       unmap := sa[len(sa)-numLMS:]
+       j := len(unmap)
+
+       // "LMS-substring iterator" (see placeLMS_32 above).
+       c0, c1, isTypeS := int32(0), int32(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Populate inverse map.
+                       j--
+                       unmap[j] = int32(i + 1)
+               }
+       }
+
+       // Apply inverse map to subproblem suffix array.
+       sa = sa[:numLMS]
+       for i := 0; i < len(sa); i++ {
+               sa[i] = unmap[sa[i]]
+       }
+}
+
+func unmap_64(text []int64, sa []int64, numLMS int) {
+       unmap := sa[len(sa)-numLMS:]
+       j := len(unmap)
+
+       // "LMS-substring iterator" (see placeLMS_64 above).
+       c0, c1, isTypeS := int64(0), int64(0), false
+       for i := len(text) - 1; i >= 0; i-- {
+               c0, c1 = text[i], c0
+               if c0 < c1 {
+                       isTypeS = true
+               } else if c0 > c1 && isTypeS {
+                       isTypeS = false
+
+                       // Populate inverse map.
+                       j--
+                       unmap[j] = int64(i + 1)
+               }
+       }
+
+       // Apply inverse map to subproblem suffix array.
+       sa = sa[:numLMS]
+       for i := 0; i < len(sa); i++ {
+               sa[i] = unmap[sa[i]]
+       }
+}
+
+func expand_8_64(text []byte, freq, bucket, sa []int64, numLMS int) {
+       bucketMax_8_64(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bound check for bucket[c] below
+
+       // Loop backward through sa, always tracking
+       // the next index to populate from sa[:numLMS].
+       // When we get to one, populate it.
+       // Zero the rest of the slots; they have dead values in them.
+       x := numLMS - 1
+       saX := sa[x]
+       c := text[saX]
+       b := bucket[c] - 1
+       bucket[c] = b
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               if i != int(b) {
+                       sa[i] = 0
+                       continue
+               }
+               sa[i] = saX
+
+               // Load next entry to put down (if any).
+               if x > 0 {
+                       x--
+                       saX = sa[x] // TODO bounds check
+                       c = text[saX]
+                       b = bucket[c] - 1
+                       bucket[c] = b
+               }
+       }
+}
+
+func expand_32(text []int32, freq, bucket, sa []int32, numLMS int) {
+       bucketMax_32(text, freq, bucket)
+
+       // Loop backward through sa, always tracking
+       // the next index to populate from sa[:numLMS].
+       // When we get to one, populate it.
+       // Zero the rest of the slots; they have dead values in them.
+       x := numLMS - 1
+       saX := sa[x]
+       c := text[saX]
+       b := bucket[c] - 1
+       bucket[c] = b
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               if i != int(b) {
+                       sa[i] = 0
+                       continue
+               }
+               sa[i] = saX
+
+               // Load next entry to put down (if any).
+               if x > 0 {
+                       x--
+                       saX = sa[x] // TODO bounds check
+                       c = text[saX]
+                       b = bucket[c] - 1
+                       bucket[c] = b
+               }
+       }
+}
+
+func expand_64(text []int64, freq, bucket, sa []int64, numLMS int) {
+       bucketMax_64(text, freq, bucket)
+
+       // Loop backward through sa, always tracking
+       // the next index to populate from sa[:numLMS].
+       // When we get to one, populate it.
+       // Zero the rest of the slots; they have dead values in them.
+       x := numLMS - 1
+       saX := sa[x]
+       c := text[saX]
+       b := bucket[c] - 1
+       bucket[c] = b
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               if i != int(b) {
+                       sa[i] = 0
+                       continue
+               }
+               sa[i] = saX
+
+               // Load next entry to put down (if any).
+               if x > 0 {
+                       x--
+                       saX = sa[x] // TODO bounds check
+                       c = text[saX]
+                       b = bucket[c] - 1
+                       bucket[c] = b
+               }
+       }
+}
+
+func induceL_8_64(text []byte, sa, freq, bucket []int64) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_8_64(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       // This scan is similar to the one in induceSubL_8_64 above.
+       // That one arranges to clear all but the leftmost L-type indexes.
+       // This scan leaves all the L-type indexes and the original S-type
+       // indexes, but it negates the positive leftmost L-type indexes
+       // (the ones that induceS_8_64 needs to process).
+
+       // expand_8_64 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index.
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int64(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j <= 0 {
+                       // Skip empty or negated entry (including negated zero).
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller. The caller can't tell the difference between
+               // an empty slot and a non-empty zero, but there's no need
+               // to distinguish them anyway: the final suffix array will end up
+               // with one zero somewhere, and that will be a real zero.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 < c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int64(k)
+               b++
+       }
+}
+
+func induceL_32(text []int32, sa, freq, bucket []int32) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_32(text, freq, bucket)
+
+       // This scan is similar to the one in induceSubL_32 above.
+       // That one arranges to clear all but the leftmost L-type indexes.
+       // This scan leaves all the L-type indexes and the original S-type
+       // indexes, but it negates the positive leftmost L-type indexes
+       // (the ones that induceS_32 needs to process).
+
+       // expand_32 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index.
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int32(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j <= 0 {
+                       // Skip empty or negated entry (including negated zero).
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller. The caller can't tell the difference between
+               // an empty slot and a non-empty zero, but there's no need
+               // to distinguish them anyway: the final suffix array will end up
+               // with one zero somewhere, and that will be a real zero.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 < c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int32(k)
+               b++
+       }
+}
+
+func induceL_64(text []int64, sa, freq, bucket []int64) {
+       // Initialize positions for left side of character buckets.
+       bucketMin_64(text, freq, bucket)
+
+       // This scan is similar to the one in induceSubL_64 above.
+       // That one arranges to clear all but the leftmost L-type indexes.
+       // This scan leaves all the L-type indexes and the original S-type
+       // indexes, but it negates the positive leftmost L-type indexes
+       // (the ones that induceS_64 needs to process).
+
+       // expand_64 left out the implicit entry sa[-1] == len(text),
+       // corresponding to the identified type-L index len(text)-1.
+       // Process it before the left-to-right scan of sa proper.
+       // See body in loop for commentary.
+       k := len(text) - 1
+       c0, c1 := text[k-1], text[k]
+       if c0 < c1 {
+               k = -k
+       }
+
+       // Cache recently used bucket index.
+       cB := c1
+       b := bucket[cB]
+       sa[b] = int64(k)
+       b++
+
+       for i := 0; i < len(sa); i++ {
+               j := int(sa[i])
+               if j <= 0 {
+                       // Skip empty or negated entry (including negated zero).
+                       continue
+               }
+
+               // Index j was on work queue, meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is L-type, queue k for processing later in this loop.
+               // If k-1 is S-type (text[k-1] < text[k]), queue -k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller. The caller can't tell the difference between
+               // an empty slot and a non-empty zero, but there's no need
+               // to distinguish them anyway: the final suffix array will end up
+               // with one zero somewhere, and that will be a real zero.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 < c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               sa[b] = int64(k)
+               b++
+       }
+}
+
+func induceS_8_64(text []byte, sa, freq, bucket []int64) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_8_64(text, freq, bucket)
+       bucket = bucket[:256] // eliminate bounds check for bucket[cB] below
+
+       cB := byte(0)
+       b := bucket[cB]
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j >= 0 {
+                       // Skip non-flagged entry.
+                       // (This loop can't see an empty entry; 0 means the real zero index.)
+                       continue
+               }
+
+               // Negative j is a work queue entry; rewrite to positive j for final suffix array.
+               j = -j
+               sa[i] = int64(j)
+
+               // Index j was on work queue (encoded as -j but now decoded),
+               // meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue -k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 <= c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int64(k)
+       }
+}
+
+func induceS_32(text []int32, sa, freq, bucket []int32) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_32(text, freq, bucket)
+
+       cB := int32(0)
+       b := bucket[cB]
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j >= 0 {
+                       // Skip non-flagged entry.
+                       // (This loop can't see an empty entry; 0 means the real zero index.)
+                       continue
+               }
+
+               // Negative j is a work queue entry; rewrite to positive j for final suffix array.
+               j = -j
+               sa[i] = int32(j)
+
+               // Index j was on work queue (encoded as -j but now decoded),
+               // meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue -k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 <= c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int32(k)
+       }
+}
+
+func induceS_64(text []int64, sa, freq, bucket []int64) {
+       // Initialize positions for right side of character buckets.
+       bucketMax_64(text, freq, bucket)
+
+       cB := int64(0)
+       b := bucket[cB]
+
+       for i := len(sa) - 1; i >= 0; i-- {
+               j := int(sa[i])
+               if j >= 0 {
+                       // Skip non-flagged entry.
+                       // (This loop can't see an empty entry; 0 means the real zero index.)
+                       continue
+               }
+
+               // Negative j is a work queue entry; rewrite to positive j for final suffix array.
+               j = -j
+               sa[i] = int64(j)
+
+               // Index j was on work queue (encoded as -j but now decoded),
+               // meaning k := j-1 is L-type,
+               // so we can now place k correctly into sa.
+               // If k-1 is S-type, queue -k for processing later in this loop.
+               // If k-1 is L-type (text[k-1] > text[k]), queue k to save for the caller.
+               // If k is zero, k-1 doesn't exist, so we only need to leave it
+               // for the caller.
+               k := j - 1
+               c1 := text[k]
+               if k > 0 {
+                       if c0 := text[k-1]; c0 <= c1 {
+                               k = -k
+                       }
+               }
+
+               if cB != c1 {
+                       bucket[cB] = b
+                       cB = c1
+                       b = bucket[cB]
+               }
+               b--
+               sa[b] = int64(k)
+       }
+}
index 0961ac4fb21beb9b712031e6c47282e61a2d80cc..9c169e7aca84e44951e41f3cd42402bd33f711d4 100644 (file)
@@ -19,21 +19,70 @@ package suffixarray
 import (
        "bytes"
        "encoding/binary"
+       "errors"
        "io"
+       "math"
        "regexp"
        "sort"
 )
 
+// Can change for testing
+var maxData32 int = realMaxData32
+
+const realMaxData32 = math.MaxInt32
+
 // Index implements a suffix array for fast substring search.
 type Index struct {
        data []byte
-       sa   []int // suffix array for data; len(sa) == len(data)
+       sa   ints // suffix array for data; sa.len() == len(data)
+}
+
+// An ints is either an []int32 or an []int64.
+// That is, one of them is empty, and one is the real data.
+// The int64 form is used when len(data) > maxData32
+type ints struct {
+       int32 []int32
+       int64 []int64
+}
+
+func (a *ints) len() int {
+       return len(a.int32) + len(a.int64)
+}
+
+func (a *ints) get(i int) int64 {
+       if a.int32 != nil {
+               return int64(a.int32[i])
+       }
+       return a.int64[i]
+}
+
+func (a *ints) set(i int, v int64) {
+       if a.int32 != nil {
+               a.int32[i] = int32(v)
+       } else {
+               a.int64[i] = v
+       }
+}
+
+func (a *ints) slice(i, j int) ints {
+       if a.int32 != nil {
+               return ints{a.int32[i:j], nil}
+       }
+       return ints{nil, a.int64[i:j]}
 }
 
 // New creates a new Index for data.
-// Index creation time is O(N*log(N)) for N = len(data).
+// Index creation time is O(N) for N = len(data).
 func New(data []byte) *Index {
-       return &Index{data, qsufsort(data)}
+       ix := &Index{data: data}
+       if len(data) <= maxData32 {
+               ix.sa.int32 = make([]int32, len(data))
+               text_32(data, ix.sa.int32)
+       } else {
+               ix.sa.int64 = make([]int64, len(data))
+               text_64(data, ix.sa.int64)
+       }
+       return ix
 }
 
 // writeInt writes an int x to w using buf to buffer the write.
@@ -44,19 +93,20 @@ func writeInt(w io.Writer, buf []byte, x int) error {
 }
 
 // readInt reads an int x from r using buf to buffer the read and returns x.
-func readInt(r io.Reader, buf []byte) (int, error) {
+func readInt(r io.Reader, buf []byte) (int64, error) {
        _, err := io.ReadFull(r, buf[0:binary.MaxVarintLen64]) // ok to continue with error
        x, _ := binary.Varint(buf)
-       return int(x), err
+       return x, err
 }
 
 // writeSlice writes data[:n] to w and returns n.
 // It uses buf to buffer the write.
-func writeSlice(w io.Writer, buf []byte, data []int) (n int, err error) {
+func writeSlice(w io.Writer, buf []byte, data ints) (n int, err error) {
        // encode as many elements as fit into buf
        p := binary.MaxVarintLen64
-       for ; n < len(data) && p+binary.MaxVarintLen64 <= len(buf); n++ {
-               p += binary.PutUvarint(buf[p:], uint64(data[n]))
+       m := data.len()
+       for ; n < m && p+binary.MaxVarintLen64 <= len(buf); n++ {
+               p += binary.PutUvarint(buf[p:], uint64(data.get(n)))
        }
 
        // update buffer size
@@ -67,15 +117,22 @@ func writeSlice(w io.Writer, buf []byte, data []int) (n int, err error) {
        return
 }
 
+var errTooBig = errors.New("suffixarray: data too large")
+
 // readSlice reads data[:n] from r and returns n.
 // It uses buf to buffer the read.
-func readSlice(r io.Reader, buf []byte, data []int) (n int, err error) {
+func readSlice(r io.Reader, buf []byte, data ints) (n int, err error) {
        // read buffer size
-       var size int
-       size, err = readInt(r, buf)
+       var size64 int64
+       size64, err = readInt(r, buf)
        if err != nil {
                return
        }
+       if int64(int(size64)) != size64 || int(size64) < 0 {
+               // We never write chunks this big anyway.
+               return 0, errTooBig
+       }
+       size := int(size64)
 
        // read buffer w/o the size
        if _, err = io.ReadFull(r, buf[binary.MaxVarintLen64:size]); err != nil {
@@ -85,7 +142,7 @@ func readSlice(r io.Reader, buf []byte, data []int) (n int, err error) {
        // decode as many elements as present in buf
        for p := binary.MaxVarintLen64; p < size; n++ {
                x, w := binary.Uvarint(buf[p:])
-               data[n] = int(x)
+               data.set(n, int64(x))
                p += w
        }
 
@@ -100,21 +157,31 @@ func (x *Index) Read(r io.Reader) error {
        buf := make([]byte, bufSize)
 
        // read length
-       n, err := readInt(r, buf)
+       n64, err := readInt(r, buf)
        if err != nil {
                return err
        }
+       if int64(int(n64)) != n64 || int(n64) < 0 {
+               return errTooBig
+       }
+       n := int(n64)
 
        // allocate space
-       if 2*n < cap(x.data) || cap(x.data) < n {
+       if 2*n < cap(x.data) || cap(x.data) < n || x.sa.int32 != nil && n > maxData32 || x.sa.int64 != nil && n <= maxData32 {
                // new data is significantly smaller or larger than
                // existing buffers - allocate new ones
                x.data = make([]byte, n)
-               x.sa = make([]int, n)
+               x.sa.int32 = nil
+               x.sa.int64 = nil
+               if n <= maxData32 {
+                       x.sa.int32 = make([]int32, n)
+               } else {
+                       x.sa.int64 = make([]int64, n)
+               }
        } else {
                // re-use existing buffers
                x.data = x.data[0:n]
-               x.sa = x.sa[0:n]
+               x.sa = x.sa.slice(0, n)
        }
 
        // read data
@@ -123,12 +190,13 @@ func (x *Index) Read(r io.Reader) error {
        }
 
        // read index
-       for sa := x.sa; len(sa) > 0; {
+       sa := x.sa
+       for sa.len() > 0 {
                n, err := readSlice(r, buf, sa)
                if err != nil {
                        return err
                }
-               sa = sa[n:]
+               sa = sa.slice(n, sa.len())
        }
        return nil
 }
@@ -149,12 +217,13 @@ func (x *Index) Write(w io.Writer) error {
        }
 
        // write index
-       for sa := x.sa; len(sa) > 0; {
+       sa := x.sa
+       for sa.len() > 0 {
                n, err := writeSlice(w, buf, sa)
                if err != nil {
                        return err
                }
-               sa = sa[n:]
+               sa = sa.slice(n, sa.len())
        }
        return nil
 }
@@ -167,18 +236,18 @@ func (x *Index) Bytes() []byte {
 }
 
 func (x *Index) at(i int) []byte {
-       return x.data[x.sa[i]:]
+       return x.data[x.sa.get(i):]
 }
 
 // lookupAll returns a slice into the matching region of the index.
 // The runtime is O(log(N)*len(s)).
-func (x *Index) lookupAll(s []byte) []int {
+func (x *Index) lookupAll(s []byte) ints {
        // find matching suffix index range [i:j]
        // find the first index where s would be the prefix
-       i := sort.Search(len(x.sa), func(i int) bool { return bytes.Compare(x.at(i), s) >= 0 })
+       i := sort.Search(x.sa.len(), func(i int) bool { return bytes.Compare(x.at(i), s) >= 0 })
        // starting at i, find the first index at which s is not a prefix
-       j := i + sort.Search(len(x.sa)-i, func(j int) bool { return !bytes.HasPrefix(x.at(j+i), s) })
-       return x.sa[i:j]
+       j := i + sort.Search(x.sa.len()-i, func(j int) bool { return !bytes.HasPrefix(x.at(j+i), s) })
+       return x.sa.slice(i, j)
 }
 
 // Lookup returns an unsorted list of at most n indices where the byte string s
@@ -190,13 +259,22 @@ func (x *Index) lookupAll(s []byte) []int {
 func (x *Index) Lookup(s []byte, n int) (result []int) {
        if len(s) > 0 && n != 0 {
                matches := x.lookupAll(s)
-               if n < 0 || len(matches) < n {
-                       n = len(matches)
+               count := matches.len()
+               if n < 0 || count < n {
+                       n = count
                }
-               // 0 <= n <= len(matches)
+               // 0 <= n <= count
                if n > 0 {
                        result = make([]int, n)
-                       copy(result, matches)
+                       if matches.int32 != nil {
+                               for i := range result {
+                                       result[i] = int(matches.int32[i])
+                               }
+                       } else {
+                               for i := range result {
+                                       result[i] = int(matches.int64[i])
+                               }
+                       }
                }
        }
        return
index 644f00c75771c6eb3d21ff9aa5c9b3009a28f845..28090de9aa2c6d9d2b9af9859674d9d0c1522c30 100644 (file)
@@ -6,7 +6,11 @@ package suffixarray
 
 import (
        "bytes"
+       "fmt"
+       "io/ioutil"
        "math/rand"
+       "os"
+       "path/filepath"
        "regexp"
        "sort"
        "strings"
@@ -207,10 +211,19 @@ func testLookups(t *testing.T, tc *testCase, x *Index, n int) {
 // index is used to hide the sort.Interface
 type index Index
 
-func (x *index) Len() int           { return len(x.sa) }
+func (x *index) Len() int           { return x.sa.len() }
 func (x *index) Less(i, j int) bool { return bytes.Compare(x.at(i), x.at(j)) < 0 }
-func (x *index) Swap(i, j int)      { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] }
-func (a *index) at(i int) []byte    { return a.data[a.sa[i]:] }
+func (x *index) Swap(i, j int) {
+       if x.sa.int32 != nil {
+               x.sa.int32[i], x.sa.int32[j] = x.sa.int32[j], x.sa.int32[i]
+       } else {
+               x.sa.int64[i], x.sa.int64[j] = x.sa.int64[j], x.sa.int64[i]
+       }
+}
+
+func (x *index) at(i int) []byte {
+       return x.data[x.sa.get(i):]
+}
 
 func testConstruction(t *testing.T, tc *testCase, x *Index) {
        if !sort.IsSorted((*index)(x)) {
@@ -222,8 +235,12 @@ func equal(x, y *Index) bool {
        if !bytes.Equal(x.data, y.data) {
                return false
        }
-       for i, j := range x.sa {
-               if j != y.sa[i] {
+       if x.sa.len() != y.sa.len() {
+               return false
+       }
+       n := x.sa.len()
+       for i := 0; i < n; i++ {
+               if x.sa.get(i) != y.sa.get(i) {
                        return false
                }
        }
@@ -238,16 +255,41 @@ func testSaveRestore(t *testing.T, tc *testCase, x *Index) int {
        }
        size := buf.Len()
        var y Index
-       if err := y.Read(&buf); err != nil {
+       if err := y.Read(bytes.NewReader(buf.Bytes())); err != nil {
+               t.Errorf("failed reading index %s (%s)", tc.name, err)
+       }
+       if !equal(x, &y) {
+               t.Errorf("restored index doesn't match saved index %s", tc.name)
+       }
+
+       old := maxData32
+       defer func() {
+               maxData32 = old
+       }()
+       // Reread as forced 32.
+       y = Index{}
+       maxData32 = realMaxData32
+       if err := y.Read(bytes.NewReader(buf.Bytes())); err != nil {
                t.Errorf("failed reading index %s (%s)", tc.name, err)
        }
        if !equal(x, &y) {
                t.Errorf("restored index doesn't match saved index %s", tc.name)
        }
+
+       // Reread as forced 64.
+       y = Index{}
+       maxData32 = -1
+       if err := y.Read(bytes.NewReader(buf.Bytes())); err != nil {
+               t.Errorf("failed reading index %s (%s)", tc.name, err)
+       }
+       if !equal(x, &y) {
+               t.Errorf("restored index doesn't match saved index %s", tc.name)
+       }
+
        return size
 }
 
-func TestIndex(t *testing.T) {
+func testIndex(t *testing.T) {
        for _, tc := range testCases {
                x := New([]byte(tc.source))
                testConstruction(t, &tc, x)
@@ -260,45 +302,314 @@ func TestIndex(t *testing.T) {
        }
 }
 
+func TestIndex32(t *testing.T) {
+       testIndex(t)
+}
+
+func TestIndex64(t *testing.T) {
+       maxData32 = -1
+       defer func() {
+               maxData32 = realMaxData32
+       }()
+       testIndex(t)
+}
+
+func TestNew32(t *testing.T) {
+       test(t, func(x []byte) []int {
+               sa := make([]int32, len(x))
+               text_32(x, sa)
+               out := make([]int, len(sa))
+               for i, v := range sa {
+                       out[i] = int(v)
+               }
+               return out
+       })
+}
+
+func TestNew64(t *testing.T) {
+       test(t, func(x []byte) []int {
+               sa := make([]int64, len(x))
+               text_64(x, sa)
+               out := make([]int, len(sa))
+               for i, v := range sa {
+                       out[i] = int(v)
+               }
+               return out
+       })
+}
+
+// test tests an arbitrary suffix array construction function.
+// Generates many inputs, builds and checks suffix arrays.
+func test(t *testing.T, build func([]byte) []int) {
+       t.Run("ababab...", func(t *testing.T) {
+               // Very repetitive input has numLMS = len(x)/2-1
+               // at top level, the largest it can be.
+               // But maxID is only two (aba and ab$).
+               size := 100000
+               if testing.Short() {
+                       size = 10000
+               }
+               x := make([]byte, size)
+               for i := range x {
+                       x[i] = "ab"[i%2]
+               }
+               testSA(t, x, build)
+       })
+
+       t.Run("forcealloc", func(t *testing.T) {
+               // Construct a pathological input that forces
+               // recurse_32 to allocate a new temporary buffer.
+               // The input must have more than N/3 LMS-substrings,
+               // which we arrange by repeating an SLSLSLSLSLSL pattern
+               // like ababab... above, but then we must also arrange
+               // for a large number of distinct LMS-substrings.
+               // We use this pattern:
+               // 1 255 1 254 1 253 1 ... 1 2 1 255 2 254 2 253 2 252 2 ...
+               // This gives approximately 2¹⁵ distinct LMS-substrings.
+               // We need to repeat at least one substring, though,
+               // or else the recursion can be bypassed entirely.
+               x := make([]byte, 100000, 100001)
+               lo := byte(1)
+               hi := byte(255)
+               for i := range x {
+                       if i%2 == 0 {
+                               x[i] = lo
+                       } else {
+                               x[i] = hi
+                               hi--
+                               if hi <= lo {
+                                       lo++
+                                       if lo == 0 {
+                                               lo = 1
+                                       }
+                                       hi = 255
+                               }
+                       }
+               }
+               x[:cap(x)][len(x)] = 0 // for sais.New
+               testSA(t, x, build)
+       })
+
+       t.Run("exhaustive2", func(t *testing.T) {
+               // All inputs over {0,1} up to length 21.
+               // Runs in about 10 seconds on my laptop.
+               x := make([]byte, 30)
+               numFail := 0
+               for n := 0; n <= 21; n++ {
+                       if n > 12 && testing.Short() {
+                               break
+                       }
+                       x[n] = 0 // for sais.New
+                       testRec(t, x[:n], 0, 2, &numFail, build)
+               }
+       })
+
+       t.Run("exhaustive3", func(t *testing.T) {
+               // All inputs over {0,1,2} up to length 14.
+               // Runs in about 10 seconds on my laptop.
+               x := make([]byte, 30)
+               numFail := 0
+               for n := 0; n <= 14; n++ {
+                       if n > 8 && testing.Short() {
+                               break
+                       }
+                       x[n] = 0 // for sais.New
+                       testRec(t, x[:n], 0, 3, &numFail, build)
+               }
+       })
+}
+
+// testRec fills x[i:] with all possible combinations of values in [1,max]
+// and then calls testSA(t, x, build) for each one.
+func testRec(t *testing.T, x []byte, i, max int, numFail *int, build func([]byte) []int) {
+       if i < len(x) {
+               for x[i] = 1; x[i] <= byte(max); x[i]++ {
+                       testRec(t, x, i+1, max, numFail, build)
+               }
+               return
+       }
+
+       if !testSA(t, x, build) {
+               *numFail++
+               if *numFail >= 10 {
+                       t.Errorf("stopping after %d failures", *numFail)
+                       t.FailNow()
+               }
+       }
+}
+
+// testSA tests the suffix array build function on the input x.
+// It constructs the suffix array and then checks that it is correct.
+func testSA(t *testing.T, x []byte, build func([]byte) []int) bool {
+       defer func() {
+               if e := recover(); e != nil {
+                       t.Logf("build %v", x)
+                       panic(e)
+               }
+       }()
+       sa := build(x)
+       if len(sa) != len(x) {
+               t.Errorf("build %v: len(sa) = %d, want %d", x, len(sa), len(x))
+               return false
+       }
+       for i := 0; i+1 < len(sa); i++ {
+               if sa[i] < 0 || sa[i] >= len(x) || sa[i+1] < 0 || sa[i+1] >= len(x) {
+                       t.Errorf("build %s: sa out of range: %v\n", x, sa)
+                       return false
+               }
+               if bytes.Compare(x[sa[i]:], x[sa[i+1]:]) >= 0 {
+                       t.Errorf("build %v -> %v\nsa[%d:] = %d,%d out of order", x, sa, i, sa[i], sa[i+1])
+                       return false
+               }
+       }
+
+       return true
+}
+
+var (
+       benchdata = make([]byte, 1e6)
+       benchrand = make([]byte, 1e6)
+)
+
 // Of all possible inputs, the random bytes have the least amount of substring
 // repetition, and the repeated bytes have the most. For most algorithms,
 // the running time of every input will be between these two.
 func benchmarkNew(b *testing.B, random bool) {
+       b.ReportAllocs()
        b.StopTimer()
-       data := make([]byte, 1e6)
+       data := benchdata
        if random {
-               for i := range data {
-                       data[i] = byte(rand.Intn(256))
+               data = benchrand
+               if data[0] == 0 {
+                       for i := range data {
+                               data[i] = byte(rand.Intn(256))
+                       }
                }
        }
        b.StartTimer()
+       b.SetBytes(int64(len(data)))
        for i := 0; i < b.N; i++ {
                New(data)
        }
 }
 
-func BenchmarkNewIndexRandom(b *testing.B) {
-       benchmarkNew(b, true)
+func makeText(name string) ([]byte, error) {
+       var data []byte
+       switch name {
+       case "opticks":
+               var err error
+               data, err = ioutil.ReadFile("../../testdata/Isaac.Newton-Opticks.txt")
+               if err != nil {
+                       return nil, err
+               }
+       case "go":
+               err := filepath.Walk("../..", func(path string, info os.FileInfo, err error) error {
+                       if err == nil && strings.HasSuffix(path, ".go") && !info.IsDir() {
+                               file, err := ioutil.ReadFile(path)
+                               if err != nil {
+                                       return err
+                               }
+                               data = append(data, file...)
+                       }
+                       return nil
+               })
+               if err != nil {
+                       return nil, err
+               }
+       case "zero":
+               data = make([]byte, 50e6)
+       case "rand":
+               data = make([]byte, 50e6)
+               for i := range data {
+                       data[i] = byte(rand.Intn(256))
+               }
+       }
+       return data, nil
 }
-func BenchmarkNewIndexRepeat(b *testing.B) {
-       benchmarkNew(b, false)
+
+func setBits(bits int) (cleanup func()) {
+       if bits == 32 {
+               maxData32 = realMaxData32
+       } else {
+               maxData32 = -1 // force use of 64-bit code
+       }
+       return func() {
+               maxData32 = realMaxData32
+       }
+}
+
+func BenchmarkNew(b *testing.B) {
+       for _, text := range []string{"opticks", "go", "zero", "rand"} {
+               b.Run("text="+text, func(b *testing.B) {
+                       data, err := makeText(text)
+                       if err != nil {
+                               b.Fatal(err)
+                       }
+                       if testing.Short() && len(data) > 5e6 {
+                               data = data[:5e6]
+                       }
+                       for _, size := range []int{100e3, 500e3, 1e6, 5e6, 10e6, 50e6} {
+                               if len(data) < size {
+                                       continue
+                               }
+                               data := data[:size]
+                               name := fmt.Sprintf("%dK", size/1e3)
+                               if size >= 1e6 {
+                                       name = fmt.Sprintf("%dM", size/1e6)
+                               }
+                               b.Run("size="+name, func(b *testing.B) {
+                                       for _, bits := range []int{32, 64} {
+                                               if ^uint(0) == 0xffffffff && bits == 64 {
+                                                       continue
+                                               }
+                                               b.Run(fmt.Sprintf("bits=%d", bits), func(b *testing.B) {
+                                                       cleanup := setBits(bits)
+                                                       defer cleanup()
+
+                                                       b.SetBytes(int64(len(data)))
+                                                       b.ReportAllocs()
+                                                       for i := 0; i < b.N; i++ {
+                                                               New(data)
+                                                       }
+                                               })
+                                       }
+                               })
+                       }
+               })
+       }
 }
 
 func BenchmarkSaveRestore(b *testing.B) {
-       b.StopTimer()
        r := rand.New(rand.NewSource(0x5a77a1)) // guarantee always same sequence
        data := make([]byte, 1<<20)             // 1MB of data to index
        for i := range data {
                data[i] = byte(r.Intn(256))
        }
-       x := New(data)
-       size := testSaveRestore(nil, nil, x)       // verify correctness
-       buf := bytes.NewBuffer(make([]byte, size)) // avoid growing
-       b.SetBytes(int64(size))
-       b.StartTimer()
-       for i := 0; i < b.N; i++ {
-               x.Write(buf)
-               var y Index
-               y.Read(buf)
+       for _, bits := range []int{32, 64} {
+               if ^uint(0) == 0xffffffff && bits == 64 {
+                       continue
+               }
+               b.Run(fmt.Sprintf("bits=%d", bits), func(b *testing.B) {
+                       cleanup := setBits(bits)
+                       defer cleanup()
+
+                       b.StopTimer()
+                       x := New(data)
+                       size := testSaveRestore(nil, nil, x)       // verify correctness
+                       buf := bytes.NewBuffer(make([]byte, size)) // avoid growing
+                       b.SetBytes(int64(size))
+                       b.StartTimer()
+                       b.ReportAllocs()
+                       for i := 0; i < b.N; i++ {
+                               buf.Reset()
+                               if err := x.Write(buf); err != nil {
+                                       b.Fatal(err)
+                               }
+                               var y Index
+                               if err := y.Read(buf); err != nil {
+                                       b.Fatal(err)
+                               }
+                       }
+               })
        }
 }
index c7c6cce8227618bcf55a109a3a009223df760e32..969732dfebc0284dab83623691f88ce9aaa49ec8 100644 (file)
@@ -68,21 +68,6 @@ intgo Compare(struct __go_open_array a, struct __go_open_array b)
        return 0;
 }
 
-_Bool Equal(struct __go_open_array, struct __go_open_array)
-  __asm__(GOSYM_PREFIX "internal..z2fbytealg.Equal")
-  __attribute__((no_split_stack));
-
-_Bool Equal(struct __go_open_array a, struct __go_open_array b)
-{
-       intgo l;
-
-       l = a.__count;
-       if (l != b.__count) {
-               return 0;
-       }
-       return __builtin_memcmp(a.__values, b.__values, l) == 0;
-}
-
 intgo IndexByte(struct __go_open_array, byte)
   __asm__(GOSYM_PREFIX "internal..z2fbytealg.IndexByte")
   __attribute__((no_split_stack));
index e93ac13335835f0ac1dbbf31b6581f31b65599d9..bdec26966feb0992fc9b9b97fd5f48195321b4ef 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// -build !amd64,!arm64,!ppc64le,!ppc64
+// -build !amd64,!arm,!arm64,!ppc64le,!ppc64
 
 package bytealg
 
index bb622aec01546a2c15a4716dc5938ff2039ffa7a..e084e43599ab4dd3ad73b9ff50b903d201651b18 100644 (file)
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // +build ignore_for_gccgo
-// +build amd64 arm64 ppc64le ppc64
+// +build amd64 arm arm64 ppc64le ppc64
 
 package bytealg
 
diff --git a/libgo/go/internal/bytealg/equal_generic.go b/libgo/go/internal/bytealg/equal_generic.go
new file mode 100644 (file)
index 0000000..59bdf8f
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bytealg
+
+// Equal reports whether a and b
+// are the same length and contain the same bytes.
+// A nil argument is equivalent to an empty slice.
+//
+// Equal is equivalent to bytes.Equal.
+// It is provided here for convenience,
+// because some packages cannot depend on bytes.
+func Equal(a, b []byte) bool {
+       // Neither cmd/compile nor gccgo allocates for these string conversions.
+       // There is a test for this in package bytes.
+       return string(a) == string(b)
+}
index 995f0749d441992b479331250b5babddd975eda2..cf3a245bc053b185574405c9eb40e3091d9f70f8 100644 (file)
@@ -6,11 +6,6 @@ package bytealg
 
 import "unsafe"
 
-// Note: there's no equal_generic.go because every platform must implement at least memequal_varlen in assembly.
-
-//go:noescape
-func Equal(a, b []byte) bool
-
 // The declarations below generate ABI wrappers for functions
 // implemented in assembly in this package but declared in another
 // package.
index 51bdf169cf2b842d7124219b9a1b1d92579f4018..0893e11e8ba84568050099f7b96b1f04152134cf 100644 (file)
@@ -6,7 +6,7 @@
 
 package bytealg
 
-// Empirical data shows that using IndexShortStr can get better
+// Empirical data shows that using Index can get better
 // performance when len(s) <= 16.
 const MaxBruteForce = 16
 
@@ -16,7 +16,7 @@ func init() {
 }
 
 // Cutover reports the number of failures of IndexByte we should tolerate
-// before switching over to IndexShortStr.
+// before switching over to Index.
 // n is the number of bytes processed so far.
 // See the bytes.Index implementation for details.
 func Cutover(n int) int {
index eb74a9fa82a59793995cceb5c81d1805658aa361..76fc878abe69c9ea9603ac62a2ff2afcef7f846d 100644 (file)
@@ -109,25 +109,29 @@ type arm64 struct {
 var S390X s390x
 
 type s390x struct {
-       _               CacheLinePad
-       HasZArch        bool // z architecture mode is active [mandatory]
-       HasSTFLE        bool // store facility list extended [mandatory]
-       HasLDisp        bool // long (20-bit) displacements [mandatory]
-       HasEImm         bool // 32-bit immediates [mandatory]
-       HasDFP          bool // decimal floating point
-       HasETF3Enhanced bool // ETF-3 enhanced
-       HasMSA          bool // message security assist (CPACF)
-       HasAES          bool // KM-AES{128,192,256} functions
-       HasAESCBC       bool // KMC-AES{128,192,256} functions
-       HasAESCTR       bool // KMCTR-AES{128,192,256} functions
-       HasAESGCM       bool // KMA-GCM-AES{128,192,256} functions
-       HasGHASH        bool // KIMD-GHASH function
-       HasSHA1         bool // K{I,L}MD-SHA-1 functions
-       HasSHA256       bool // K{I,L}MD-SHA-256 functions
-       HasSHA512       bool // K{I,L}MD-SHA-512 functions
-       HasVX           bool // vector facility. Note: the runtime sets this when it processes auxv records.
-       HasVE1          bool // vector-enhancement 1
-       _               CacheLinePad
+       _         CacheLinePad
+       HasZARCH  bool // z architecture mode is active [mandatory]
+       HasSTFLE  bool // store facility list extended [mandatory]
+       HasLDISP  bool // long (20-bit) displacements [mandatory]
+       HasEIMM   bool // 32-bit immediates [mandatory]
+       HasDFP    bool // decimal floating point
+       HasETF3EH bool // ETF-3 enhanced
+       HasMSA    bool // message security assist (CPACF)
+       HasAES    bool // KM-AES{128,192,256} functions
+       HasAESCBC bool // KMC-AES{128,192,256} functions
+       HasAESCTR bool // KMCTR-AES{128,192,256} functions
+       HasAESGCM bool // KMA-GCM-AES{128,192,256} functions
+       HasGHASH  bool // KIMD-GHASH function
+       HasSHA1   bool // K{I,L}MD-SHA-1 functions
+       HasSHA256 bool // K{I,L}MD-SHA-256 functions
+       HasSHA512 bool // K{I,L}MD-SHA-512 functions
+       HasSHA3   bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions
+       HasVX     bool // vector facility. Note: the runtime sets this when it processes auxv records.
+       HasVXE    bool // vector-enhancements facility 1
+       HasKDSA   bool // elliptic curve functions
+       HasECDSA  bool // NIST curves
+       HasEDDSA  bool // Edwards curves
+       _         CacheLinePad
 }
 
 // Initialize examines the processor and sets the relevant variables above.
index 22d9aef178a8db7c789cb17f8e128670b1ff2ad0..a7c5572010b118a9dbf145deaa7d0f7ea31ce8a7 100644 (file)
@@ -20,14 +20,34 @@ const (
        aes256 function = 20 // AES-256
 
        // K{I,L}MD function codes
-       sha1   function = 1 // SHA-1
-       sha256 function = 2 // SHA-256
-       sha512 function = 3 // SHA-512
+       sha1     function = 1  // SHA-1
+       sha256   function = 2  // SHA-256
+       sha512   function = 3  // SHA-512
+       sha3_224 function = 32 // SHA3-224
+       sha3_256 function = 33 // SHA3-256
+       sha3_384 function = 34 // SHA3-384
+       sha3_512 function = 35 // SHA3-512
+       shake128 function = 36 // SHAKE-128
+       shake256 function = 37 // SHAKE-256
 
        // KLMD function codes
        ghash function = 65 // GHASH
 )
 
+const (
+       // KDSA function codes
+       ecdsaVerifyP256    function = 1  // NIST P256
+       ecdsaVerifyP384    function = 2  // NIST P384
+       ecdsaVerifyP521    function = 3  // NIST P521
+       ecdsaSignP256      function = 9  // NIST P256
+       ecdsaSignP384      function = 10 // NIST P384
+       ecdsaSignP521      function = 11 // NIST P521
+       eddsaVerifyEd25519 function = 32 // Curve25519
+       eddsaVerifyEd448   function = 36 // Curve448
+       eddsaSignEd25519   function = 40 // Curve25519
+       eddsaSignEd448     function = 44 // Curve448
+)
+
 // queryResult contains the result of a Query function
 // call. Bits are numbered in big endian order so the
 // leftmost bit (the MSB) is at index 0.
@@ -68,9 +88,10 @@ const (
        msa4 facility = 77  // message-security-assist extension 4
        msa5 facility = 57  // message-security-assist extension 5
        msa8 facility = 146 // message-security-assist extension 8
+       msa9 facility = 155 // message-security-assist extension 9
 
        // vector facilities
-       ve1 facility = 135 // vector-enhancements 1
+       vxe facility = 135 // vector-enhancements 1
 
        // Note: vx and highgprs are excluded because they require
        // kernel support and so must be fetched from HWCAP.
@@ -105,18 +126,20 @@ func kmctrQuery() queryResult
 func kmaQuery() queryResult
 func kimdQuery() queryResult
 func klmdQuery() queryResult
+func kdsaQuery() queryResult
 
 func doinit() {
        options = []option{
-               {Name: "zarch", Feature: &S390X.HasZArch},
+               {Name: "zarch", Feature: &S390X.HasZARCH},
                {Name: "stfle", Feature: &S390X.HasSTFLE},
-               {Name: "ldisp", Feature: &S390X.HasLDisp},
+               {Name: "ldisp", Feature: &S390X.HasLDISP},
                {Name: "msa", Feature: &S390X.HasMSA},
-               {Name: "eimm", Feature: &S390X.HasEImm},
+               {Name: "eimm", Feature: &S390X.HasEIMM},
                {Name: "dfp", Feature: &S390X.HasDFP},
-               {Name: "etf3eh", Feature: &S390X.HasETF3Enhanced},
+               {Name: "etf3eh", Feature: &S390X.HasETF3EH},
                {Name: "vx", Feature: &S390X.HasVX},
-               {Name: "ve1", Feature: &S390X.HasVE1},
+               {Name: "vxe", Feature: &S390X.HasVXE},
+               {Name: "kdsa", Feature: &S390X.HasKDSA},
        }
 
        aes := []function{aes128, aes192, aes256}
@@ -143,8 +166,19 @@ func doinit() {
                S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256)
                S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512)
                S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist
+               sha3 := []function{
+                       sha3_224, sha3_256, sha3_384, sha3_512,
+                       shake128, shake256,
+               }
+               S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...)
+               S390X.HasKDSA = facilities.Has(msa9) // elliptic curves
+               if S390X.HasKDSA {
+                       kdsa := kdsaQuery()
+                       S390X.HasECDSA = kdsa.Has(ecdsaVerifyP256, ecdsaSignP256, ecdsaVerifyP384, ecdsaSignP384, ecdsaVerifyP521, ecdsaSignP521)
+                       S390X.HasEDDSA = kdsa.Has(eddsaVerifyEd25519, eddsaSignEd25519, eddsaVerifyEd448, eddsaSignEd448)
+               }
        }
        if S390X.HasVX {
-               S390X.HasVE1 = facilities.Has(ve1)
+               S390X.HasVXE = facilities.Has(vxe)
        }
 }
diff --git a/libgo/go/internal/goversion/goversion.go b/libgo/go/internal/goversion/goversion.go
new file mode 100644 (file)
index 0000000..8f9c7c9
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package goversion
+
+// Version is the current Go 1.x version. During development cycles on
+// the master branch it changes to be the version of the next Go 1.x
+// release.
+//
+// When incrementing this, also add to the list at src/go/build/doc.go
+// (search for "onward").
+const Version = 13
diff --git a/libgo/go/internal/lazyregexp/lazyre.go b/libgo/go/internal/lazyregexp/lazyre.go
new file mode 100644 (file)
index 0000000..2681af3
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package lazyregexp is a thin wrapper over regexp, allowing the use of global
+// regexp variables without forcing them to be compiled at init.
+package lazyregexp
+
+import (
+       "os"
+       "regexp"
+       "strings"
+       "sync"
+)
+
+// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be
+// compiled the first time it is needed.
+type Regexp struct {
+       str  string
+       once sync.Once
+       rx   *regexp.Regexp
+}
+
+func (r *Regexp) re() *regexp.Regexp {
+       r.once.Do(r.build)
+       return r.rx
+}
+
+func (r *Regexp) build() {
+       r.rx = regexp.MustCompile(r.str)
+       r.str = ""
+}
+
+func (r *Regexp) FindSubmatch(s []byte) [][]byte {
+       return r.re().FindSubmatch(s)
+}
+
+func (r *Regexp) FindStringSubmatch(s string) []string {
+       return r.re().FindStringSubmatch(s)
+}
+
+func (r *Regexp) FindStringSubmatchIndex(s string) []int {
+       return r.re().FindStringSubmatchIndex(s)
+}
+
+func (r *Regexp) ReplaceAllString(src, repl string) string {
+       return r.re().ReplaceAllString(src, repl)
+}
+
+func (r *Regexp) FindString(s string) string {
+       return r.re().FindString(s)
+}
+
+func (r *Regexp) FindAllString(s string, n int) []string {
+       return r.re().FindAllString(s, n)
+}
+
+func (r *Regexp) MatchString(s string) bool {
+       return r.re().MatchString(s)
+}
+
+func (r *Regexp) SubexpNames() []string {
+       return r.re().SubexpNames()
+}
+
+var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
+
+// New creates a new lazy regexp, delaying the compiling work until it is first
+// needed. If the code is being run as part of tests, the regexp compiling will
+// happen immediately.
+func New(str string) *Regexp {
+       lr := &Regexp{str: str}
+       if inTest {
+               // In tests, always compile the regexps early.
+               lr.re()
+       }
+       return lr
+}
diff --git a/libgo/go/internal/lazytemplate/lazytemplate.go b/libgo/go/internal/lazytemplate/lazytemplate.go
new file mode 100644 (file)
index 0000000..c83eaea
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package lazytemplate is a thin wrapper over text/template, allowing the use
+// of global template variables without forcing them to be parsed at init.
+package lazytemplate
+
+import (
+       "io"
+       "os"
+       "strings"
+       "sync"
+       "text/template"
+)
+
+// Template is a wrapper around text/template.Template, where the underlying
+// template will be parsed the first time it is needed.
+type Template struct {
+       name, text string
+
+       once sync.Once
+       tmpl *template.Template
+}
+
+func (r *Template) tp() *template.Template {
+       r.once.Do(r.build)
+       return r.tmpl
+}
+
+func (r *Template) build() {
+       r.tmpl = template.Must(template.New(r.name).Parse(r.text))
+       r.name, r.text = "", ""
+}
+
+func (r *Template) Execute(w io.Writer, data interface{}) error {
+       return r.tp().Execute(w, data)
+}
+
+var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
+
+// New creates a new lazy template, delaying the parsing work until it is first
+// needed. If the code is being run as part of tests, the template parsing will
+// happen immediately.
+func New(name, text string) *Template {
+       lt := &Template{name: name, text: text}
+       if inTest {
+               // In tests, always parse the templates early.
+               lt.tp()
+       }
+       return lt
+}
diff --git a/libgo/go/internal/oserror/errors.go b/libgo/go/internal/oserror/errors.go
new file mode 100644 (file)
index 0000000..8bd17c8
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package oserror defines errors values used in the os package.
+//
+// These types are defined here to permit the syscall package to reference them.
+package oserror
+
+import "errors"
+
+var (
+       ErrInvalid    = errors.New("invalid argument")
+       ErrPermission = errors.New("permission denied")
+       ErrExist      = errors.New("file already exists")
+       ErrNotExist   = errors.New("file does not exist")
+       ErrClosed     = errors.New("file already closed")
+       ErrTemporary  = temporaryError{}
+       ErrTimeout    = timeoutError{}
+)
+
+type timeoutError struct{}
+
+func (timeoutError) Error() string { return "deadline exceeded" }
+func (timeoutError) Timeout() bool { return true }
+
+type temporaryError struct{}
+
+func (temporaryError) Error() string   { return "temporary error" }
+func (temporaryError) Temporary() bool { return true }
+
+// IsTimeout reports whether err indicates a timeout.
+func IsTimeout(err error) bool {
+       for err != nil {
+               if err == ErrTimeout {
+                       return true
+               }
+               if x, ok := err.(interface{ Timeout() bool }); ok {
+                       return x.Timeout()
+               }
+               if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(ErrTimeout) {
+                       return true
+               }
+               err = errors.Unwrap(err)
+       }
+       return false
+}
+
+// IsTemporary reports whether err indicates a temporary condition.
+func IsTemporary(err error) bool {
+       for err != nil {
+               if err == ErrTemporary {
+                       return true
+               }
+               if x, ok := err.(interface{ Temporary() bool }); ok {
+                       return x.Temporary()
+               }
+               if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(ErrTemporary) {
+                       return true
+               }
+               err = errors.Unwrap(err)
+       }
+       return false
+}
diff --git a/libgo/go/internal/oserror/errors_test.go b/libgo/go/internal/oserror/errors_test.go
new file mode 100644 (file)
index 0000000..6d6a56a
--- /dev/null
@@ -0,0 +1,63 @@
+package oserror_test
+
+import (
+       "errors"
+       "fmt"
+       "internal/oserror"
+       "os"
+       "testing"
+)
+
+type ttError struct {
+       timeout   bool
+       temporary bool
+}
+
+func (e ttError) Error() string {
+       return fmt.Sprintf("ttError{timeout:%v temporary:%v}", e.timeout, e.temporary)
+}
+func (e ttError) Timeout() bool   { return e.timeout }
+func (e ttError) Temporary() bool { return e.temporary }
+
+type isError struct {
+       err error
+}
+
+func (e isError) Error() string        { return fmt.Sprintf("isError(%v)", e.err) }
+func (e isError) Is(target error) bool { return e.err == target }
+
+func TestIsTimeout(t *testing.T) {
+       for _, test := range []struct {
+               want bool
+               err  error
+       }{
+               {true, ttError{timeout: true}},
+               {true, isError{os.ErrTimeout}},
+               {true, os.ErrTimeout},
+               {true, fmt.Errorf("wrap: %w", os.ErrTimeout)},
+               {false, ttError{timeout: false}},
+               {false, errors.New("error")},
+       } {
+               if got, want := oserror.IsTimeout(test.err), test.want; got != want {
+                       t.Errorf("IsTimeout(err) = %v, want %v\n%+v", got, want, test.err)
+               }
+       }
+}
+
+func TestIsTemporary(t *testing.T) {
+       for _, test := range []struct {
+               want bool
+               err  error
+       }{
+               {true, ttError{temporary: true}},
+               {true, isError{os.ErrTemporary}},
+               {true, os.ErrTemporary},
+               {true, fmt.Errorf("wrap: %w", os.ErrTemporary)},
+               {false, ttError{temporary: false}},
+               {false, errors.New("error")},
+       } {
+               if got, want := oserror.IsTemporary(test.err), test.want; got != want {
+                       t.Errorf("IsTemporary(err) = %v, want %v\n%+v", got, want, test.err)
+               }
+       }
+}
diff --git a/libgo/go/internal/poll/errno_unix.go b/libgo/go/internal/poll/errno_unix.go
new file mode 100644 (file)
index 0000000..0b23fc3
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package poll
+
+import "syscall"
+
+// Do the interface allocations only once for common
+// Errno values.
+var (
+       errEAGAIN error = syscall.EAGAIN
+       errEINVAL error = syscall.EINVAL
+       errENOENT error = syscall.ENOENT
+)
+
+// errnoErr returns common boxed Errno values, to prevent
+// allocations at runtime.
+func errnoErr(e syscall.Errno) error {
+       switch e {
+       case 0:
+               return nil
+       case syscall.EAGAIN:
+               return errEAGAIN
+       case syscall.EINVAL:
+               return errEINVAL
+       case syscall.ENOENT:
+               return errENOENT
+       }
+       return e
+}
diff --git a/libgo/go/internal/poll/errno_windows.go b/libgo/go/internal/poll/errno_windows.go
new file mode 100644 (file)
index 0000000..e3bddb4
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows
+
+package poll
+
+import "syscall"
+
+// Do the interface allocations only once for common
+// Errno values.
+
+var (
+       errERROR_IO_PENDING error = syscall.Errno(syscall.ERROR_IO_PENDING)
+)
+
+// ErrnoErr returns common boxed Errno values, to prevent
+// allocations at runtime.
+func errnoErr(e syscall.Errno) error {
+       switch e {
+       case 0:
+               return nil
+       case syscall.ERROR_IO_PENDING:
+               return errERROR_IO_PENDING
+       }
+       // TODO: add more here, after collecting data on the common
+       // error values see on Windows. (perhaps when running
+       // all.bat?)
+       return e
+}
diff --git a/libgo/go/internal/poll/error_linux_test.go b/libgo/go/internal/poll/error_linux_test.go
new file mode 100644 (file)
index 0000000..059fb8e
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poll_test
+
+import (
+       "errors"
+       "internal/poll"
+       "os"
+       "syscall"
+)
+
+func badStateFile() (*os.File, error) {
+       if os.Getuid() != 0 {
+               return nil, errors.New("must be root")
+       }
+       // Using OpenFile for a device file is an easy way to make a
+       // file attached to the runtime-integrated network poller and
+       // configured in halfway.
+       return os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
+}
+
+func isBadStateFileError(err error) (string, bool) {
+       switch err {
+       case poll.ErrNotPollable, syscall.EBADFD:
+               return "", true
+       default:
+               return "not pollable or file in bad state error", false
+       }
+}
diff --git a/libgo/go/internal/poll/error_stub_test.go b/libgo/go/internal/poll/error_stub_test.go
new file mode 100644 (file)
index 0000000..c40ffcd
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !linux
+
+package poll_test
+
+import (
+       "errors"
+       "os"
+       "runtime"
+)
+
+func badStateFile() (*os.File, error) {
+       return nil, errors.New("not supported on " + runtime.GOOS)
+}
+
+func isBadStateFileError(err error) (string, bool) {
+       return "", false
+}
diff --git a/libgo/go/internal/poll/error_test.go b/libgo/go/internal/poll/error_test.go
new file mode 100644 (file)
index 0000000..06b96f6
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poll_test
+
+import (
+       "fmt"
+       "net"
+       "os"
+       "testing"
+       "time"
+)
+
+func TestReadError(t *testing.T) {
+       t.Run("ErrNotPollable", func(t *testing.T) {
+               f, err := badStateFile()
+               if err != nil {
+                       t.Skip(err)
+               }
+               defer f.Close()
+
+               // Give scheduler a chance to have two separated
+               // goroutines: an event poller and an event waiter.
+               time.Sleep(100 * time.Millisecond)
+
+               var b [1]byte
+               _, err = f.Read(b[:])
+               if perr := parseReadError(err, isBadStateFileError); perr != nil {
+                       t.Fatal(perr)
+               }
+       })
+}
+
+func parseReadError(nestedErr error, verify func(error) (string, bool)) error {
+       err := nestedErr
+       if nerr, ok := err.(*net.OpError); ok {
+               err = nerr.Err
+       }
+       if nerr, ok := err.(*os.PathError); ok {
+               err = nerr.Err
+       }
+       if nerr, ok := err.(*os.SyscallError); ok {
+               err = nerr.Err
+       }
+       if s, ok := verify(err); !ok {
+               return fmt.Errorf("got %v; want %s", nestedErr, s)
+       }
+       return nil
+}
index 2567746106f7b0961a51d487168c6e52c17d3f5e..784bea4b5a260924402cebcd2a872c684b419ade 100644 (file)
@@ -9,7 +9,10 @@
 // runtime scheduler.
 package poll
 
-import "errors"
+import (
+       "errors"
+       "internal/oserror"
+)
 
 // ErrNetClosing is returned when a network descriptor is used after
 // it has been closed. Keep this string consistent because of issue
@@ -44,6 +47,14 @@ func (e *TimeoutError) Error() string   { return "i/o timeout" }
 func (e *TimeoutError) Timeout() bool   { return true }
 func (e *TimeoutError) Temporary() bool { return true }
 
+func (e *TimeoutError) Is(target error) bool {
+       return target == oserror.ErrTimeout || target == oserror.ErrTemporary
+}
+
+// ErrNotPollable is returned when the file or socket is not suitable
+// for event notification.
+var ErrNotPollable = errors.New("not pollable")
+
 // consume removes data from a slice of byte slices, for writev.
 func consume(v *[][]byte, n int64) {
        for len(*v) > 0 {
diff --git a/libgo/go/internal/poll/fd_opendir_darwin.go b/libgo/go/internal/poll/fd_opendir_darwin.go
new file mode 100644 (file)
index 0000000..c7d3318
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poll
+
+import (
+       "syscall"
+       _ "unsafe" // for go:linkname
+)
+
+// OpenDir returns a pointer to a DIR structure suitable for
+// ReadDir. In case of an error, the name of the failed
+// syscall is returned along with a syscall.Errno.
+func (fd *FD) OpenDir() (uintptr, string, error) {
+       // fdopendir(3) takes control of the file descriptor,
+       // so use a dup.
+       fd2, call, err := fd.Dup()
+       if err != nil {
+               return 0, call, err
+       }
+       dir, err := fdopendir(fd2)
+       if err != nil {
+               syscall.Close(fd2)
+               return 0, "fdopendir", err
+       }
+       return dir, "", nil
+}
+
+// Implemented in syscall/syscall_darwin.go.
+//go:linkname fdopendir syscall.fdopendir
+func fdopendir(fd int) (dir uintptr, err error)
diff --git a/libgo/go/internal/poll/fd_opendir_ios.go b/libgo/go/internal/poll/fd_opendir_ios.go
deleted file mode 100644 (file)
index e646bd9..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-// +build arm arm64
-
-package poll
-
-import (
-       "syscall"
-       _ "unsafe" // for go:linkname
-)
-
-// OpenDir returns a pointer to a DIR structure suitable for
-// ReadDir. In case of an error, the name of the failed
-// syscall is returned along with a syscall.Errno.
-func (fd *FD) OpenDir() (uintptr, string, error) {
-       // fdopendir(3) takes control of the file descriptor,
-       // so use a dup.
-       fd2, call, err := fd.Dup()
-       if err != nil {
-               return 0, call, err
-       }
-       dir, err := fdopendir(fd2)
-       if err != nil {
-               syscall.Close(fd2)
-               return 0, "fdopendir", err
-       }
-       return dir, "", nil
-}
-
-// Implemented in syscall/syscall_darwin.go.
-//go:linkname fdopendir syscall.fdopendir
-func fdopendir(fd int) (dir uintptr, err error)
index a93ea1fe1ef5192f0bb0cd3d078998ff9d5888af..d80ec3f1c9b51c6c271b9a80b7ea7cb14ead0cc1 100644 (file)
@@ -42,7 +42,7 @@ func (pd *pollDesc) init(fd *FD) error {
                        runtime_pollUnblock(ctx)
                        runtime_pollClose(ctx)
                }
-               return syscall.Errno(errno)
+               return errnoErr(syscall.Errno(errno))
        }
        pd.runtimeCtx = ctx
        return nil
@@ -115,6 +115,8 @@ func convertErr(res int, isFile bool) error {
                return errClosing(isFile)
        case 2:
                return ErrTimeout
+       case 3:
+               return ErrNotPollable
        }
        println("unreachable: ", res)
        panic("unreachable")
index f860b82c97489e4e30c8cb3e28ae20f9ca8aed4f..f96e441abe17e047325ee96fa8a447670d4f4bba 100644 (file)
@@ -258,7 +258,7 @@ func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, erro
                s.req <- ioSrvReq{o, nil}
                <-o.errc
        }
-       // Wait for cancelation to complete.
+       // Wait for cancellation to complete.
        fd.pd.waitCanceled(int(o.mode))
        if o.errno != 0 {
                err = syscall.Errno(o.errno)
@@ -267,8 +267,8 @@ func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, erro
                }
                return 0, err
        }
-       // We issued a cancelation request. But, it seems, IO operation succeeded
-       // before the cancelation request run. We need to treat the IO operation as
+       // We issued a cancellation request. But, it seems, IO operation succeeded
+       // before the cancellation request run. We need to treat the IO operation as
        // succeeded (the bytes are actually sent/recv from network).
        return int(o.qty), nil
 }
@@ -309,7 +309,6 @@ type FD struct {
        l sync.Mutex
 
        // For console I/O.
-       isConsole      bool
        lastbits       []byte   // first few bytes of the last incomplete rune in last write
        readuint16     []uint16 // buffer to hold uint16s obtained with ReadConsole
        readbyte       []byte   // buffer to hold decoding of readuint16 from utf16 to utf8
@@ -328,13 +327,24 @@ type FD struct {
        // message based socket connection.
        ZeroReadIsEOF bool
 
-       // Whether this is a normal file.
+       // Whether this is a file rather than a network socket.
        isFile bool
 
-       // Whether this is a directory.
-       isDir bool
+       // The kind of this file.
+       kind fileKind
 }
 
+// fileKind describes the kind of file.
+type fileKind byte
+
+const (
+       kindNet fileKind = iota
+       kindFile
+       kindConsole
+       kindDir
+       kindPipe
+)
+
 // logInitFD is set by tests to enable file descriptor initialization logging.
 var logInitFD func(net string, fd *FD, err error)
 
@@ -350,18 +360,22 @@ func (fd *FD) Init(net string, pollable bool) (string, error) {
 
        switch net {
        case "file":
-               fd.isFile = true
+               fd.kind = kindFile
        case "console":
-               fd.isConsole = true
+               fd.kind = kindConsole
        case "dir":
-               fd.isDir = true
-       case "tcp", "tcp4", "tcp6":
-       case "udp", "udp4", "udp6":
-       case "ip", "ip4", "ip6":
-       case "unix", "unixgram", "unixpacket":
+               fd.kind = kindDir
+       case "pipe":
+               fd.kind = kindPipe
+       case "tcp", "tcp4", "tcp6",
+               "udp", "udp4", "udp6",
+               "ip", "ip4", "ip6",
+               "unix", "unixgram", "unixpacket":
+               fd.kind = kindNet
        default:
                return "", errors.New("internal error: unknown network type " + net)
        }
+       fd.isFile = fd.kind != kindNet
 
        var err error
        if pollable {
@@ -430,13 +444,14 @@ func (fd *FD) destroy() error {
        // so this must be executed before fd.CloseFunc.
        fd.pd.close()
        var err error
-       if fd.isFile || fd.isConsole {
-               err = syscall.CloseHandle(fd.Sysfd)
-       } else if fd.isDir {
-               err = syscall.FindClose(fd.Sysfd)
-       } else {
+       switch fd.kind {
+       case kindNet:
                // The net package uses the CloseFunc variable for testing.
                err = CloseFunc(fd.Sysfd)
+       case kindDir:
+               err = syscall.FindClose(fd.Sysfd)
+       default:
+               err = syscall.CloseHandle(fd.Sysfd)
        }
        fd.Sysfd = syscall.InvalidHandle
        runtime_Semrelease(&fd.csema)
@@ -449,6 +464,9 @@ func (fd *FD) Close() error {
        if !fd.fdmu.increfAndClose() {
                return errClosing(fd.isFile)
        }
+       if fd.kind == kindPipe {
+               syscall.CancelIoEx(fd.Sysfd, nil)
+       }
        // unblock pending reader and writer
        fd.pd.evict()
        err := fd.decref()
@@ -485,13 +503,20 @@ func (fd *FD) Read(buf []byte) (int, error) {
 
        var n int
        var err error
-       if fd.isFile || fd.isDir || fd.isConsole {
+       if fd.isFile {
                fd.l.Lock()
                defer fd.l.Unlock()
-               if fd.isConsole {
+               switch fd.kind {
+               case kindConsole:
                        n, err = fd.readConsole(buf)
-               } else {
+               default:
                        n, err = syscall.Read(fd.Sysfd, buf)
+                       if fd.kind == kindPipe && err == syscall.ERROR_OPERATION_ABORTED {
+                               // Close uses CancelIoEx to interrupt concurrent I/O for pipes.
+                               // If the fd is a pipe and the Read was interrupted by CancelIoEx,
+                               // we assume it is interrupted by Close.
+                               err = ErrFileClosing
+                       }
                }
                if err != nil {
                        n = 0
@@ -660,7 +685,7 @@ func (fd *FD) Write(buf []byte) (int, error) {
                return 0, err
        }
        defer fd.writeUnlock()
-       if fd.isFile || fd.isDir || fd.isConsole {
+       if fd.isFile {
                fd.l.Lock()
                defer fd.l.Unlock()
        }
@@ -673,11 +698,18 @@ func (fd *FD) Write(buf []byte) (int, error) {
                }
                var n int
                var err error
-               if fd.isFile || fd.isDir || fd.isConsole {
-                       if fd.isConsole {
+               if fd.isFile {
+                       switch fd.kind {
+                       case kindConsole:
                                n, err = fd.writeConsole(b)
-                       } else {
+                       default:
                                n, err = syscall.Write(fd.Sysfd, b)
+                               if fd.kind == kindPipe && err == syscall.ERROR_OPERATION_ABORTED {
+                                       // Close uses CancelIoEx to interrupt concurrent I/O for pipes.
+                                       // If the fd is a pipe and the Write was interrupted by CancelIoEx,
+                                       // we assume it is interrupted by Close.
+                                       err = ErrFileClosing
+                               }
                        }
                        if err != nil {
                                n = 0
diff --git a/libgo/go/internal/poll/read_test.go b/libgo/go/internal/poll/read_test.go
new file mode 100644 (file)
index 0000000..b4f5236
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poll_test
+
+import (
+       "io/ioutil"
+       "os"
+       "runtime"
+       "sync"
+       "testing"
+       "time"
+)
+
+func TestRead(t *testing.T) {
+       t.Run("SpecialFile", func(t *testing.T) {
+               var wg sync.WaitGroup
+               for _, p := range specialFiles() {
+                       for i := 0; i < 4; i++ {
+                               wg.Add(1)
+                               go func(p string) {
+                                       defer wg.Done()
+                                       for i := 0; i < 100; i++ {
+                                               if _, err := ioutil.ReadFile(p); err != nil {
+                                                       t.Error(err)
+                                                       return
+                                               }
+                                               time.Sleep(time.Nanosecond)
+                                       }
+                               }(p)
+                       }
+               }
+               wg.Wait()
+       })
+}
+
+func specialFiles() []string {
+       var ps []string
+       switch runtime.GOOS {
+       case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
+               ps = []string{
+                       "/dev/null",
+               }
+       case "linux":
+               ps = []string{
+                       "/dev/null",
+                       "/proc/stat",
+                       "/sys/devices/system/cpu/online",
+               }
+       }
+       nps := ps[:0]
+       for _, p := range ps {
+               f, err := os.Open(p)
+               if err != nil {
+                       continue
+               }
+               f.Close()
+               nps = append(nps, p)
+       }
+       return nps
+}
index 17a3681064b66df8da5a3f2f3a25f5fd2076c5b8..0fe9b9b420922f8acedf5a9dd5c801e675da9071 100644 (file)
@@ -8,12 +8,8 @@ import "syscall"
 
 // SendFile wraps the TransmitFile call.
 func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) {
-       ft, err := syscall.GetFileType(src)
-       if err != nil {
-               return 0, err
-       }
-       // TransmitFile does not work with pipes
-       if ft == syscall.FILE_TYPE_PIPE {
+       if fd.kind == kindPipe {
+               // TransmitFile does not work with pipes
                return 0, syscall.ESPIPE
        }
 
index 04e3522d8a19a290ee6defecf50c4c55b3857858..6050d1f6423ba7ac9f1df9ecfd9b47c6c594999c 100644 (file)
@@ -51,7 +51,10 @@ func (fd *FD) Writev(v *[][]byte) (int64, error) {
                if len(iovecs) == 0 {
                        break
                }
-               fd.iovecs = &iovecs // cache
+               if fd.iovecs == nil {
+                       fd.iovecs = new([]syscall.Iovec)
+               }
+               *fd.iovecs = iovecs // cache
 
                var wrote uintptr
                wrote, err = writev(fd.Sysfd, iovecs)
@@ -61,6 +64,9 @@ func (fd *FD) Writev(v *[][]byte) (int64, error) {
                TestHookDidWritev(int(wrote))
                n += int64(wrote)
                consume(v, int64(wrote))
+               for i := range iovecs {
+                       iovecs[i] = syscall.Iovec{}
+               }
                if err != nil {
                        if err.(syscall.Errno) == syscall.EAGAIN {
                                if err = fd.pd.waitWrite(fd.isFile); err == nil {
diff --git a/libgo/go/internal/reflectlite/all_test.go b/libgo/go/internal/reflectlite/all_test.go
new file mode 100644 (file)
index 0000000..2ea28e0
--- /dev/null
@@ -0,0 +1,1048 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite_test
+
+import (
+       "encoding/base64"
+       "fmt"
+       . "internal/reflectlite"
+       "math"
+       "reflect"
+       "runtime"
+       "testing"
+       "unsafe"
+)
+
+func ToValue(v Value) reflect.Value {
+       return reflect.ValueOf(ToInterface(v))
+}
+
+func TypeString(t Type) string {
+       return fmt.Sprintf("%T", ToInterface(Zero(t)))
+}
+
+type integer int
+type T struct {
+       a int
+       b float64
+       c string
+       d *int
+}
+
+type pair struct {
+       i interface{}
+       s string
+}
+
+func assert(t *testing.T, s, want string) {
+       t.Helper()
+       if s != want {
+               t.Errorf("have %#q want %#q", s, want)
+       }
+}
+
+var typeTests = []pair{
+       {struct{ x int }{}, "int"},
+       {struct{ x int8 }{}, "int8"},
+       {struct{ x int16 }{}, "int16"},
+       {struct{ x int32 }{}, "int32"},
+       {struct{ x int64 }{}, "int64"},
+       {struct{ x uint }{}, "uint"},
+       {struct{ x uint8 }{}, "uint8"},
+       {struct{ x uint16 }{}, "uint16"},
+       {struct{ x uint32 }{}, "uint32"},
+       {struct{ x uint64 }{}, "uint64"},
+       {struct{ x float32 }{}, "float32"},
+       {struct{ x float64 }{}, "float64"},
+       {struct{ x int8 }{}, "int8"},
+       {struct{ x (**int8) }{}, "**int8"},
+       {struct{ x (**integer) }{}, "**reflectlite_test.integer"},
+       {struct{ x ([32]int32) }{}, "[32]int32"},
+       {struct{ x ([]int8) }{}, "[]int8"},
+       {struct{ x (map[string]int32) }{}, "map[string]int32"},
+       {struct{ x (chan<- string) }{}, "chan<- string"},
+       {struct {
+               x struct {
+                       c chan *int32
+                       d float32
+               }
+       }{},
+               "struct { c chan *int32; d float32 }",
+       },
+       {struct{ x (func(a int8, b int32)) }{}, "func(int8, int32)"},
+       {struct {
+               x struct {
+                       c func(chan *integer, *int8)
+               }
+       }{},
+               "struct { c func(chan *reflectlite_test.integer, *int8) }",
+       },
+       {struct {
+               x struct {
+                       a int8
+                       b int32
+               }
+       }{},
+               "struct { a int8; b int32 }",
+       },
+       {struct {
+               x struct {
+                       a int8
+                       b int8
+                       c int32
+               }
+       }{},
+               "struct { a int8; b int8; c int32 }",
+       },
+       {struct {
+               x struct {
+                       a int8
+                       b int8
+                       c int8
+                       d int32
+               }
+       }{},
+               "struct { a int8; b int8; c int8; d int32 }",
+       },
+       {struct {
+               x struct {
+                       a int8
+                       b int8
+                       c int8
+                       d int8
+                       e int32
+               }
+       }{},
+               "struct { a int8; b int8; c int8; d int8; e int32 }",
+       },
+       {struct {
+               x struct {
+                       a int8
+                       b int8
+                       c int8
+                       d int8
+                       e int8
+                       f int32
+               }
+       }{},
+               "struct { a int8; b int8; c int8; d int8; e int8; f int32 }",
+       },
+       {struct {
+               x struct {
+                       a int8 `reflect:"hi there"`
+               }
+       }{},
+               `struct { a int8 "reflect:\"hi there\"" }`,
+       },
+       {struct {
+               x struct {
+                       a int8 `reflect:"hi \x00there\t\n\"\\"`
+               }
+       }{},
+               `struct { a int8 "reflect:\"hi \\x00there\\t\\n\\\"\\\\\"" }`,
+       },
+       {struct {
+               x struct {
+                       f func(args ...int)
+               }
+       }{},
+               "struct { f func(...int) }",
+       },
+       // {struct {
+       //      x (interface {
+       //              a(func(func(int) int) func(func(int)) int)
+       //              b()
+       //      })
+       // }{},
+       //      "interface { reflectlite_test.a(func(func(int) int) func(func(int)) int); reflectlite_test.b() }",
+       // },
+       {struct {
+               x struct {
+                       int32
+                       int64
+               }
+       }{},
+               "struct { int32; int64 }",
+       },
+}
+
+var valueTests = []pair{
+       {new(int), "132"},
+       {new(int8), "8"},
+       {new(int16), "16"},
+       {new(int32), "32"},
+       {new(int64), "64"},
+       {new(uint), "132"},
+       {new(uint8), "8"},
+       {new(uint16), "16"},
+       {new(uint32), "32"},
+       {new(uint64), "64"},
+       {new(float32), "256.25"},
+       {new(float64), "512.125"},
+       {new(complex64), "532.125+10i"},
+       {new(complex128), "564.25+1i"},
+       {new(string), "stringy cheese"},
+       {new(bool), "true"},
+       {new(*int8), "*int8(0)"},
+       {new(**int8), "**int8(0)"},
+       {new([5]int32), "[5]int32{0, 0, 0, 0, 0}"},
+       {new(**integer), "**reflectlite_test.integer(0)"},
+       {new(map[string]int32), "map[string]int32{<can't iterate on maps>}"},
+       {new(chan<- string), "chan<- string"},
+       {new(func(a int8, b int32)), "func(int8, int32)(arg)"},
+       {new(struct {
+               c chan *int32
+               d float32
+       }),
+               "struct { c chan *int32; d float32 }{chan *int32, 0}",
+       },
+       {new(struct{ c func(chan *integer, *int8) }),
+               "struct { c func(chan *reflectlite_test.integer, *int8) }{func(chan *reflectlite_test.integer, *int8)(arg)}",
+       },
+       {new(struct {
+               a int8
+               b int32
+       }),
+               "struct { a int8; b int32 }{0, 0}",
+       },
+       {new(struct {
+               a int8
+               b int8
+               c int32
+       }),
+               "struct { a int8; b int8; c int32 }{0, 0, 0}",
+       },
+}
+
+func testType(t *testing.T, i int, typ Type, want string) {
+       s := TypeString(typ)
+       if s != want {
+               t.Errorf("#%d: have %#q, want %#q", i, s, want)
+       }
+}
+
+func testReflectType(t *testing.T, i int, typ Type, want string) {
+       s := TypeString(typ)
+       if s != want {
+               t.Errorf("#%d: have %#q, want %#q", i, s, want)
+       }
+}
+
+func TestTypes(t *testing.T) {
+       for i, tt := range typeTests {
+               testReflectType(t, i, Field(ValueOf(tt.i), 0).Type(), tt.s)
+       }
+}
+
+func TestSetValue(t *testing.T) {
+       for i, tt := range valueTests {
+               v := ValueOf(tt.i).Elem()
+               switch v.Kind() {
+               case Int:
+                       v.Set(ValueOf(int(132)))
+               case Int8:
+                       v.Set(ValueOf(int8(8)))
+               case Int16:
+                       v.Set(ValueOf(int16(16)))
+               case Int32:
+                       v.Set(ValueOf(int32(32)))
+               case Int64:
+                       v.Set(ValueOf(int64(64)))
+               case Uint:
+                       v.Set(ValueOf(uint(132)))
+               case Uint8:
+                       v.Set(ValueOf(uint8(8)))
+               case Uint16:
+                       v.Set(ValueOf(uint16(16)))
+               case Uint32:
+                       v.Set(ValueOf(uint32(32)))
+               case Uint64:
+                       v.Set(ValueOf(uint64(64)))
+               case Float32:
+                       v.Set(ValueOf(float32(256.25)))
+               case Float64:
+                       v.Set(ValueOf(512.125))
+               case Complex64:
+                       v.Set(ValueOf(complex64(532.125 + 10i)))
+               case Complex128:
+                       v.Set(ValueOf(complex128(564.25 + 1i)))
+               case String:
+                       v.Set(ValueOf("stringy cheese"))
+               case Bool:
+                       v.Set(ValueOf(true))
+               }
+               s := valueToString(v)
+               if s != tt.s {
+                       t.Errorf("#%d: have %#q, want %#q", i, s, tt.s)
+               }
+       }
+}
+
+func TestCanSetField(t *testing.T) {
+       type embed struct{ x, X int }
+       type Embed struct{ x, X int }
+       type S1 struct {
+               embed
+               x, X int
+       }
+       type S2 struct {
+               *embed
+               x, X int
+       }
+       type S3 struct {
+               Embed
+               x, X int
+       }
+       type S4 struct {
+               *Embed
+               x, X int
+       }
+
+       type testCase struct {
+               index  []int
+               canSet bool
+       }
+       tests := []struct {
+               val   Value
+               cases []testCase
+       }{{
+               val: ValueOf(&S1{}),
+               cases: []testCase{
+                       {[]int{0}, false},
+                       {[]int{0, 0}, false},
+                       {[]int{0, 1}, true},
+                       {[]int{1}, false},
+                       {[]int{2}, true},
+               },
+       }, {
+               val: ValueOf(&S2{embed: &embed{}}),
+               cases: []testCase{
+                       {[]int{0}, false},
+                       {[]int{0, 0}, false},
+                       {[]int{0, 1}, true},
+                       {[]int{1}, false},
+                       {[]int{2}, true},
+               },
+       }, {
+               val: ValueOf(&S3{}),
+               cases: []testCase{
+                       {[]int{0}, true},
+                       {[]int{0, 0}, false},
+                       {[]int{0, 1}, true},
+                       {[]int{1}, false},
+                       {[]int{2}, true},
+               },
+       }, {
+               val: ValueOf(&S4{Embed: &Embed{}}),
+               cases: []testCase{
+                       {[]int{0}, true},
+                       {[]int{0, 0}, false},
+                       {[]int{0, 1}, true},
+                       {[]int{1}, false},
+                       {[]int{2}, true},
+               },
+       }}
+
+       for _, tt := range tests {
+               t.Run(tt.val.Type().Name(), func(t *testing.T) {
+                       for _, tc := range tt.cases {
+                               f := tt.val
+                               for _, i := range tc.index {
+                                       if f.Kind() == Ptr {
+                                               f = f.Elem()
+                                       }
+                                       f = Field(f, i)
+                               }
+                               if got := f.CanSet(); got != tc.canSet {
+                                       t.Errorf("CanSet() = %v, want %v", got, tc.canSet)
+                               }
+                       }
+               })
+       }
+}
+
+var _i = 7
+
+var valueToStringTests = []pair{
+       {123, "123"},
+       {123.5, "123.5"},
+       {byte(123), "123"},
+       {"abc", "abc"},
+       {T{123, 456.75, "hello", &_i}, "reflectlite_test.T{123, 456.75, hello, *int(&7)}"},
+       {new(chan *T), "*chan *reflectlite_test.T(&chan *reflectlite_test.T)"},
+       {[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
+       {&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
+       {[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
+       {&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
+}
+
+func TestValueToString(t *testing.T) {
+       for i, test := range valueToStringTests {
+               s := valueToString(ValueOf(test.i))
+               if s != test.s {
+                       t.Errorf("#%d: have %#q, want %#q", i, s, test.s)
+               }
+       }
+}
+
+func TestPtrSetNil(t *testing.T) {
+       var i int32 = 1234
+       ip := &i
+       vip := ValueOf(&ip)
+       vip.Elem().Set(Zero(vip.Elem().Type()))
+       if ip != nil {
+               t.Errorf("got non-nil (%d), want nil", *ip)
+       }
+}
+
+func TestMapSetNil(t *testing.T) {
+       m := make(map[string]int)
+       vm := ValueOf(&m)
+       vm.Elem().Set(Zero(vm.Elem().Type()))
+       if m != nil {
+               t.Errorf("got non-nil (%p), want nil", m)
+       }
+}
+
+func TestAll(t *testing.T) {
+       testType(t, 1, TypeOf((int8)(0)), "int8")
+       testType(t, 2, TypeOf((*int8)(nil)).Elem(), "int8")
+
+       typ := TypeOf((*struct {
+               c chan *int32
+               d float32
+       })(nil))
+       testType(t, 3, typ, "*struct { c chan *int32; d float32 }")
+       etyp := typ.Elem()
+       testType(t, 4, etyp, "struct { c chan *int32; d float32 }")
+}
+
+func TestInterfaceValue(t *testing.T) {
+       var inter struct {
+               E interface{}
+       }
+       inter.E = 123.456
+       v1 := ValueOf(&inter)
+       v2 := Field(v1.Elem(), 0)
+       // assert(t, TypeString(v2.Type()), "interface {}")
+       v3 := v2.Elem()
+       assert(t, TypeString(v3.Type()), "float64")
+
+       i3 := ToInterface(v2)
+       if _, ok := i3.(float64); !ok {
+               t.Error("v2.Interface() did not return float64, got ", TypeOf(i3))
+       }
+}
+
+func TestFunctionValue(t *testing.T) {
+       var x interface{} = func() {}
+       v := ValueOf(x)
+       if fmt.Sprint(ToInterface(v)) != fmt.Sprint(x) {
+               t.Fatalf("TestFunction returned wrong pointer")
+       }
+       assert(t, TypeString(v.Type()), "func()")
+}
+
+var appendTests = []struct {
+       orig, extra []int
+}{
+       {make([]int, 2, 4), []int{22}},
+       {make([]int, 2, 4), []int{22, 33, 44}},
+}
+
+func sameInts(x, y []int) bool {
+       if len(x) != len(y) {
+               return false
+       }
+       for i, xx := range x {
+               if xx != y[i] {
+                       return false
+               }
+       }
+       return true
+}
+
+func TestBigUnnamedStruct(t *testing.T) {
+       b := struct{ a, b, c, d int64 }{1, 2, 3, 4}
+       v := ValueOf(b)
+       b1 := ToInterface(v).(struct {
+               a, b, c, d int64
+       })
+       if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d {
+               t.Errorf("ValueOf(%v).Interface().(*Big) = %v", b, b1)
+       }
+}
+
+type big struct {
+       a, b, c, d, e int64
+}
+
+func TestBigStruct(t *testing.T) {
+       b := big{1, 2, 3, 4, 5}
+       v := ValueOf(b)
+       b1 := ToInterface(v).(big)
+       if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e {
+               t.Errorf("ValueOf(%v).Interface().(big) = %v", b, b1)
+       }
+}
+
+type Basic struct {
+       x int
+       y float32
+}
+
+type NotBasic Basic
+
+type DeepEqualTest struct {
+       a, b interface{}
+       eq   bool
+}
+
+// Simple functions for DeepEqual tests.
+var (
+       fn1 func()             // nil.
+       fn2 func()             // nil.
+       fn3 = func() { fn1() } // Not nil.
+)
+
+type self struct{}
+
+type Loop *Loop
+type Loopy interface{}
+
+var loop1, loop2 Loop
+var loopy1, loopy2 Loopy
+
+func init() {
+       loop1 = &loop2
+       loop2 = &loop1
+
+       loopy1 = &loopy2
+       loopy2 = &loopy1
+}
+
+var typeOfTests = []DeepEqualTest{
+       // Equalities
+       {nil, nil, true},
+       {1, 1, true},
+       {int32(1), int32(1), true},
+       {0.5, 0.5, true},
+       {float32(0.5), float32(0.5), true},
+       {"hello", "hello", true},
+       {make([]int, 10), make([]int, 10), true},
+       {&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true},
+       {Basic{1, 0.5}, Basic{1, 0.5}, true},
+       {error(nil), error(nil), true},
+       {map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true},
+       {fn1, fn2, true},
+
+       // Inequalities
+       {1, 2, false},
+       {int32(1), int32(2), false},
+       {0.5, 0.6, false},
+       {float32(0.5), float32(0.6), false},
+       {"hello", "hey", false},
+       {make([]int, 10), make([]int, 11), false},
+       {&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false},
+       {Basic{1, 0.5}, Basic{1, 0.6}, false},
+       {Basic{1, 0}, Basic{2, 0}, false},
+       {map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false},
+       {map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false},
+       {map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false},
+       {map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false},
+       {nil, 1, false},
+       {1, nil, false},
+       {fn1, fn3, false},
+       {fn3, fn3, false},
+       {[][]int{{1}}, [][]int{{2}}, false},
+       {math.NaN(), math.NaN(), false},
+       {&[1]float64{math.NaN()}, &[1]float64{math.NaN()}, false},
+       {&[1]float64{math.NaN()}, self{}, true},
+       {[]float64{math.NaN()}, []float64{math.NaN()}, false},
+       {[]float64{math.NaN()}, self{}, true},
+       {map[float64]float64{math.NaN(): 1}, map[float64]float64{1: 2}, false},
+       {map[float64]float64{math.NaN(): 1}, self{}, true},
+
+       // Nil vs empty: not the same.
+       {[]int{}, []int(nil), false},
+       {[]int{}, []int{}, true},
+       {[]int(nil), []int(nil), true},
+       {map[int]int{}, map[int]int(nil), false},
+       {map[int]int{}, map[int]int{}, true},
+       {map[int]int(nil), map[int]int(nil), true},
+
+       // Mismatched types
+       {1, 1.0, false},
+       {int32(1), int64(1), false},
+       {0.5, "hello", false},
+       {[]int{1, 2, 3}, [3]int{1, 2, 3}, false},
+       {&[3]interface{}{1, 2, 4}, &[3]interface{}{1, 2, "s"}, false},
+       {Basic{1, 0.5}, NotBasic{1, 0.5}, false},
+       {map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false},
+
+       // Possible loops.
+       {&loop1, &loop1, true},
+       {&loop1, &loop2, true},
+       {&loopy1, &loopy1, true},
+       {&loopy1, &loopy2, true},
+}
+
+func TestTypeOf(t *testing.T) {
+       // Special case for nil
+       if typ := TypeOf(nil); typ != nil {
+               t.Errorf("expected nil type for nil value; got %v", typ)
+       }
+       for _, test := range typeOfTests {
+               v := ValueOf(test.a)
+               if !v.IsValid() {
+                       continue
+               }
+               typ := TypeOf(test.a)
+               if typ != v.Type() {
+                       t.Errorf("TypeOf(%v) = %v, but ValueOf(%v).Type() = %v", test.a, typ, test.a, v.Type())
+               }
+       }
+}
+
+func Nil(a interface{}, t *testing.T) {
+       n := Field(ValueOf(a), 0)
+       if !n.IsNil() {
+               t.Errorf("%v should be nil", a)
+       }
+}
+
+func NotNil(a interface{}, t *testing.T) {
+       n := Field(ValueOf(a), 0)
+       if n.IsNil() {
+               t.Errorf("value of type %v should not be nil", TypeString(ValueOf(a).Type()))
+       }
+}
+
+func TestIsNil(t *testing.T) {
+       // These implement IsNil.
+       // Wrap in extra struct to hide interface type.
+       doNil := []interface{}{
+               struct{ x *int }{},
+               struct{ x interface{} }{},
+               struct{ x map[string]int }{},
+               struct{ x func() bool }{},
+               struct{ x chan int }{},
+               struct{ x []string }{},
+               struct{ x unsafe.Pointer }{},
+       }
+       for _, ts := range doNil {
+               ty := TField(TypeOf(ts), 0)
+               v := Zero(ty)
+               v.IsNil() // panics if not okay to call
+       }
+
+       // Check the implementations
+       var pi struct {
+               x *int
+       }
+       Nil(pi, t)
+       pi.x = new(int)
+       NotNil(pi, t)
+
+       var si struct {
+               x []int
+       }
+       Nil(si, t)
+       si.x = make([]int, 10)
+       NotNil(si, t)
+
+       var ci struct {
+               x chan int
+       }
+       Nil(ci, t)
+       ci.x = make(chan int)
+       NotNil(ci, t)
+
+       var mi struct {
+               x map[int]int
+       }
+       Nil(mi, t)
+       mi.x = make(map[int]int)
+       NotNil(mi, t)
+
+       var ii struct {
+               x interface{}
+       }
+       Nil(ii, t)
+       ii.x = 2
+       NotNil(ii, t)
+
+       var fi struct {
+               x func(t *testing.T)
+       }
+       Nil(fi, t)
+       fi.x = TestIsNil
+       NotNil(fi, t)
+}
+
+// Indirect returns the value that v points to.
+// If v is a nil pointer, Indirect returns a zero Value.
+// If v is not a pointer, Indirect returns v.
+func Indirect(v Value) Value {
+       if v.Kind() != Ptr {
+               return v
+       }
+       return v.Elem()
+}
+
+func TestNilPtrValueSub(t *testing.T) {
+       var pi *int
+       if pv := ValueOf(pi); pv.Elem().IsValid() {
+               t.Error("ValueOf((*int)(nil)).Elem().IsValid()")
+       }
+}
+
+type Point struct {
+       x, y int
+}
+
+// This will be index 0.
+func (p Point) AnotherMethod(scale int) int {
+       return -1
+}
+
+// This will be index 1.
+func (p Point) Dist(scale int) int {
+       //println("Point.Dist", p.x, p.y, scale)
+       return p.x*p.x*scale + p.y*p.y*scale
+}
+
+// This will be index 2.
+func (p Point) GCMethod(k int) int {
+       runtime.GC()
+       return k + p.x
+}
+
+// This will be index 3.
+func (p Point) NoArgs() {
+       // Exercise no-argument/no-result paths.
+}
+
+// This will be index 4.
+func (p Point) TotalDist(points ...Point) int {
+       tot := 0
+       for _, q := range points {
+               dx := q.x - p.x
+               dy := q.y - p.y
+               tot += dx*dx + dy*dy // Should call Sqrt, but it's just a test.
+
+       }
+       return tot
+}
+
+type D1 struct {
+       d int
+}
+type D2 struct {
+       d int
+}
+
+func TestImportPath(t *testing.T) {
+       tests := []struct {
+               t    Type
+               path string
+       }{
+               {TypeOf(&base64.Encoding{}).Elem(), "encoding/base64"},
+               {TypeOf(int(0)), ""},
+               {TypeOf(int8(0)), ""},
+               {TypeOf(int16(0)), ""},
+               {TypeOf(int32(0)), ""},
+               {TypeOf(int64(0)), ""},
+               {TypeOf(uint(0)), ""},
+               {TypeOf(uint8(0)), ""},
+               {TypeOf(uint16(0)), ""},
+               {TypeOf(uint32(0)), ""},
+               {TypeOf(uint64(0)), ""},
+               {TypeOf(uintptr(0)), ""},
+               {TypeOf(float32(0)), ""},
+               {TypeOf(float64(0)), ""},
+               {TypeOf(complex64(0)), ""},
+               {TypeOf(complex128(0)), ""},
+               {TypeOf(byte(0)), ""},
+               {TypeOf(rune(0)), ""},
+               {TypeOf([]byte(nil)), ""},
+               {TypeOf([]rune(nil)), ""},
+               {TypeOf(string("")), ""},
+               {TypeOf((*interface{})(nil)).Elem(), ""},
+               {TypeOf((*byte)(nil)), ""},
+               {TypeOf((*rune)(nil)), ""},
+               {TypeOf((*int64)(nil)), ""},
+               {TypeOf(map[string]int{}), ""},
+               {TypeOf((*error)(nil)).Elem(), ""},
+               {TypeOf((*Point)(nil)), ""},
+               {TypeOf((*Point)(nil)).Elem(), "internal/reflectlite_test"},
+       }
+       for _, test := range tests {
+               if path := test.t.PkgPath(); path != test.path {
+                       t.Errorf("%v.PkgPath() = %q, want %q", test.t, path, test.path)
+               }
+       }
+}
+
+func noAlloc(t *testing.T, n int, f func(int)) {
+       if testing.Short() {
+               t.Skip("skipping malloc count in short mode")
+       }
+       if runtime.GOMAXPROCS(0) > 1 {
+               t.Skip("skipping; GOMAXPROCS>1")
+       }
+       i := -1
+       allocs := testing.AllocsPerRun(n, func() {
+               f(i)
+               i++
+       })
+       if allocs > 0 {
+               t.Errorf("%d iterations: got %v mallocs, want 0", n, allocs)
+       }
+}
+
+func TestAllocations(t *testing.T) {
+       noAlloc(t, 100, func(j int) {
+               var i interface{}
+               var v Value
+
+               // We can uncomment this when compiler escape analysis
+               // is good enough to see that the integer assigned to i
+               // does not escape and therefore need not be allocated.
+               //
+               // i = 42 + j
+               // v = ValueOf(i)
+               // if int(v.Int()) != 42+j {
+               //      panic("wrong int")
+               // }
+
+               i = func(j int) int { return j }
+               v = ValueOf(i)
+               if ToInterface(v).(func(int) int)(j) != j {
+                       panic("wrong result")
+               }
+       })
+}
+
+func TestSetPanic(t *testing.T) {
+       ok := func(f func()) { f() }
+       bad := shouldPanic
+       clear := func(v Value) { v.Set(Zero(v.Type())) }
+
+       type t0 struct {
+               W int
+       }
+
+       type t1 struct {
+               Y int
+               t0
+       }
+
+       type T2 struct {
+               Z       int
+               namedT0 t0
+       }
+
+       type T struct {
+               X int
+               t1
+               T2
+               NamedT1 t1
+               NamedT2 T2
+               namedT1 t1
+               namedT2 T2
+       }
+
+       // not addressable
+       v := ValueOf(T{})
+       bad(func() { clear(Field(v, 0)) })                     // .X
+       bad(func() { clear(Field(v, 1)) })                     // .t1
+       bad(func() { clear(Field(Field(v, 1), 0)) })           // .t1.Y
+       bad(func() { clear(Field(Field(v, 1), 1)) })           // .t1.t0
+       bad(func() { clear(Field(Field(Field(v, 1), 1), 0)) }) // .t1.t0.W
+       bad(func() { clear(Field(v, 2)) })                     // .T2
+       bad(func() { clear(Field(Field(v, 2), 0)) })           // .T2.Z
+       bad(func() { clear(Field(Field(v, 2), 1)) })           // .T2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W
+       bad(func() { clear(Field(v, 3)) })                     // .NamedT1
+       bad(func() { clear(Field(Field(v, 3), 0)) })           // .NamedT1.Y
+       bad(func() { clear(Field(Field(v, 3), 1)) })           // .NamedT1.t0
+       bad(func() { clear(Field(Field(Field(v, 3), 1), 0)) }) // .NamedT1.t0.W
+       bad(func() { clear(Field(v, 4)) })                     // .NamedT2
+       bad(func() { clear(Field(Field(v, 4), 0)) })           // .NamedT2.Z
+       bad(func() { clear(Field(Field(v, 4), 1)) })           // .NamedT2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W
+       bad(func() { clear(Field(v, 5)) })                     // .namedT1
+       bad(func() { clear(Field(Field(v, 5), 0)) })           // .namedT1.Y
+       bad(func() { clear(Field(Field(v, 5), 1)) })           // .namedT1.t0
+       bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W
+       bad(func() { clear(Field(v, 6)) })                     // .namedT2
+       bad(func() { clear(Field(Field(v, 6), 0)) })           // .namedT2.Z
+       bad(func() { clear(Field(Field(v, 6), 1)) })           // .namedT2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W
+
+       // addressable
+       v = ValueOf(&T{}).Elem()
+       ok(func() { clear(Field(v, 0)) })                      // .X
+       bad(func() { clear(Field(v, 1)) })                     // .t1
+       ok(func() { clear(Field(Field(v, 1), 0)) })            // .t1.Y
+       bad(func() { clear(Field(Field(v, 1), 1)) })           // .t1.t0
+       ok(func() { clear(Field(Field(Field(v, 1), 1), 0)) })  // .t1.t0.W
+       ok(func() { clear(Field(v, 2)) })                      // .T2
+       ok(func() { clear(Field(Field(v, 2), 0)) })            // .T2.Z
+       bad(func() { clear(Field(Field(v, 2), 1)) })           // .T2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W
+       ok(func() { clear(Field(v, 3)) })                      // .NamedT1
+       ok(func() { clear(Field(Field(v, 3), 0)) })            // .NamedT1.Y
+       bad(func() { clear(Field(Field(v, 3), 1)) })           // .NamedT1.t0
+       ok(func() { clear(Field(Field(Field(v, 3), 1), 0)) })  // .NamedT1.t0.W
+       ok(func() { clear(Field(v, 4)) })                      // .NamedT2
+       ok(func() { clear(Field(Field(v, 4), 0)) })            // .NamedT2.Z
+       bad(func() { clear(Field(Field(v, 4), 1)) })           // .NamedT2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W
+       bad(func() { clear(Field(v, 5)) })                     // .namedT1
+       bad(func() { clear(Field(Field(v, 5), 0)) })           // .namedT1.Y
+       bad(func() { clear(Field(Field(v, 5), 1)) })           // .namedT1.t0
+       bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W
+       bad(func() { clear(Field(v, 6)) })                     // .namedT2
+       bad(func() { clear(Field(Field(v, 6), 0)) })           // .namedT2.Z
+       bad(func() { clear(Field(Field(v, 6), 1)) })           // .namedT2.namedT0
+       bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W
+}
+
+func shouldPanic(f func()) {
+       defer func() {
+               if recover() == nil {
+                       panic("did not panic")
+               }
+       }()
+       f()
+}
+
+type S struct {
+       i1 int64
+       i2 int64
+}
+
+func TestBigZero(t *testing.T) {
+       const size = 1 << 10
+       var v [size]byte
+       z := ToInterface(Zero(ValueOf(v).Type())).([size]byte)
+       for i := 0; i < size; i++ {
+               if z[i] != 0 {
+                       t.Fatalf("Zero object not all zero, index %d", i)
+               }
+       }
+}
+
+func TestInvalid(t *testing.T) {
+       // Used to have inconsistency between IsValid() and Kind() != Invalid.
+       type T struct{ v interface{} }
+
+       v := Field(ValueOf(T{}), 0)
+       if v.IsValid() != true || v.Kind() != Interface {
+               t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind())
+       }
+       v = v.Elem()
+       if v.IsValid() != false || v.Kind() != Invalid {
+               t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind())
+       }
+}
+
+type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int
+
+type nameTest struct {
+       v    interface{}
+       want string
+}
+
+var nameTests = []nameTest{
+       {(*int32)(nil), "int32"},
+       {(*D1)(nil), "D1"},
+       {(*[]D1)(nil), ""},
+       {(*chan D1)(nil), ""},
+       {(*func() D1)(nil), ""},
+       {(*<-chan D1)(nil), ""},
+       {(*chan<- D1)(nil), ""},
+       {(*interface{})(nil), ""},
+       {(*interface {
+               F()
+       })(nil), ""},
+       {(*TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678)(nil), "TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678"},
+}
+
+func TestNames(t *testing.T) {
+       for _, test := range nameTests {
+               typ := TypeOf(test.v).Elem()
+               if got := typ.Name(); got != test.want {
+                       t.Errorf("%v Name()=%q, want %q", typ, got, test.want)
+               }
+       }
+}
+
+type embed struct {
+       EmbedWithUnexpMeth
+}
+
+/*
+func TestNameBytesAreAligned(t *testing.T) {
+       typ := TypeOf(embed{})
+       b := FirstMethodNameBytes(typ)
+       v := uintptr(unsafe.Pointer(b))
+       if v%unsafe.Alignof((*byte)(nil)) != 0 {
+               t.Errorf("reflect.name.bytes pointer is not aligned: %x", v)
+       }
+}
+*/
+
+// TestUnaddressableField tests that the reflect package will not allow
+// a type from another package to be used as a named type with an
+// unexported field.
+//
+// This ensures that unexported fields cannot be modified by other packages.
+func TestUnaddressableField(t *testing.T) {
+       var b Buffer // type defined in reflect, a different package
+       var localBuffer struct {
+               buf []byte
+       }
+       lv := ValueOf(&localBuffer).Elem()
+       rv := ValueOf(b)
+       shouldPanic(func() {
+               lv.Set(rv)
+       })
+}
+
+type Tint int
+
+type Tint2 = Tint
+
+type Talias1 struct {
+       byte
+       uint8
+       int
+       int32
+       rune
+}
+
+type Talias2 struct {
+       Tint
+       Tint2
+}
+
+func TestAliasNames(t *testing.T) {
+       t1 := Talias1{byte: 1, uint8: 2, int: 3, int32: 4, rune: 5}
+       out := fmt.Sprintf("%#v", t1)
+       want := "reflectlite_test.Talias1{byte:0x1, uint8:0x2, int:3, int32:4, rune:5}"
+       if out != want {
+               t.Errorf("Talias1 print:\nhave: %s\nwant: %s", out, want)
+       }
+
+       t2 := Talias2{Tint: 1, Tint2: 2}
+       out = fmt.Sprintf("%#v", t2)
+       want = "reflectlite_test.Talias2{Tint:1, Tint2:2}"
+       if out != want {
+               t.Errorf("Talias2 print:\nhave: %s\nwant: %s", out, want)
+       }
+}
diff --git a/libgo/go/internal/reflectlite/export_test.go b/libgo/go/internal/reflectlite/export_test.go
new file mode 100644 (file)
index 0000000..ca1e0e1
--- /dev/null
@@ -0,0 +1,117 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite
+
+import (
+       "unsafe"
+)
+
+// Field returns the i'th field of the struct v.
+// It panics if v's Kind is not Struct or i is out of range.
+func Field(v Value, i int) Value {
+       if v.kind() != Struct {
+               panic(&ValueError{"reflect.Value.Field", v.kind()})
+       }
+       tt := (*structType)(unsafe.Pointer(v.typ))
+       if uint(i) >= uint(len(tt.fields)) {
+               panic("reflect: Field index out of range")
+       }
+       field := &tt.fields[i]
+       typ := field.typ
+
+       // Inherit permission bits from v, but clear flagEmbedRO.
+       fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind())
+       // Using an unexported field forces flagRO.
+       if field.pkgPath != nil {
+               if field.embedded() {
+                       fl |= flagEmbedRO
+               } else {
+                       fl |= flagStickyRO
+               }
+       }
+       // Either flagIndir is set and v.ptr points at struct,
+       // or flagIndir is not set and v.ptr is the actual struct data.
+       // In the former case, we want v.ptr + offset.
+       // In the latter case, we must have field.offset = 0,
+       // so v.ptr + field.offset is still the correct address.
+       ptr := add(v.ptr, field.offset(), "same as non-reflect &v.field")
+       return Value{typ, ptr, fl}
+}
+
+func TField(typ Type, i int) Type {
+       t := typ.(*rtype)
+       if t.Kind() != Struct {
+               panic("reflect: Field of non-struct type")
+       }
+       tt := (*structType)(unsafe.Pointer(t))
+
+       return StructFieldType(tt, i)
+}
+
+// Field returns the i'th struct field.
+func StructFieldType(t *structType, i int) Type {
+       if i < 0 || i >= len(t.fields) {
+               panic("reflect: Field index out of bounds")
+       }
+       p := &t.fields[i]
+       return toType(p.typ)
+}
+
+// Zero returns a Value representing the zero value for the specified type.
+// The result is different from the zero value of the Value struct,
+// which represents no value at all.
+// For example, Zero(TypeOf(42)) returns a Value with Kind Int and value 0.
+// The returned value is neither addressable nor settable.
+func Zero(typ Type) Value {
+       if typ == nil {
+               panic("reflect: Zero(nil)")
+       }
+       t := typ.(*rtype)
+       fl := flag(t.Kind())
+       if ifaceIndir(t) {
+               return Value{t, unsafe_New(t), fl | flagIndir}
+       }
+       return Value{t, nil, fl}
+}
+
+// ToInterface returns v's current value as an interface{}.
+// It is equivalent to:
+//     var i interface{} = (v's underlying value)
+// It panics if the Value was obtained by accessing
+// unexported struct fields.
+func ToInterface(v Value) (i interface{}) {
+       return valueInterface(v)
+}
+
+type EmbedWithUnexpMeth struct{}
+
+func (EmbedWithUnexpMeth) f() {}
+
+type pinUnexpMeth interface {
+       f()
+}
+
+var pinUnexpMethI = pinUnexpMeth(EmbedWithUnexpMeth{})
+
+/*
+func FirstMethodNameBytes(t Type) *byte {
+       _ = pinUnexpMethI
+
+       ut := t.uncommon()
+       if ut == nil {
+               panic("type has no methods")
+       }
+       m := ut.methods[0]
+       mname := t.(*rtype).nameOff(m.name)
+       if *mname.data(0, "name flag field")&(1<<2) == 0 {
+               panic("method name does not have pkgPath *string")
+       }
+       return mname.bytes
+}
+*/
+
+type Buffer struct {
+       buf []byte
+}
diff --git a/libgo/go/internal/reflectlite/set_test.go b/libgo/go/internal/reflectlite/set_test.go
new file mode 100644 (file)
index 0000000..817e4be
--- /dev/null
@@ -0,0 +1,92 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite_test
+
+import (
+       "bytes"
+       "go/ast"
+       "go/token"
+       . "internal/reflectlite"
+       "io"
+       "testing"
+)
+
+func TestImplicitSetConversion(t *testing.T) {
+       // Assume TestImplicitMapConversion covered the basics.
+       // Just make sure conversions are being applied at all.
+       var r io.Reader
+       b := new(bytes.Buffer)
+       rv := ValueOf(&r).Elem()
+       rv.Set(ValueOf(b))
+       if r != b {
+               t.Errorf("after Set: r=%T(%v)", r, r)
+       }
+}
+
+var implementsTests = []struct {
+       x interface{}
+       t interface{}
+       b bool
+}{
+       {new(*bytes.Buffer), new(io.Reader), true},
+       {new(bytes.Buffer), new(io.Reader), false},
+       {new(*bytes.Buffer), new(io.ReaderAt), false},
+       {new(*ast.Ident), new(ast.Expr), true},
+       {new(*notAnExpr), new(ast.Expr), false},
+       {new(*ast.Ident), new(notASTExpr), false},
+       {new(notASTExpr), new(ast.Expr), false},
+       {new(ast.Expr), new(notASTExpr), false},
+       {new(*notAnExpr), new(notASTExpr), true},
+}
+
+type notAnExpr struct{}
+
+func (notAnExpr) Pos() token.Pos { return token.NoPos }
+func (notAnExpr) End() token.Pos { return token.NoPos }
+func (notAnExpr) exprNode()      {}
+
+type notASTExpr interface {
+       Pos() token.Pos
+       End() token.Pos
+       exprNode()
+}
+
+func TestImplements(t *testing.T) {
+       for _, tt := range implementsTests {
+               xv := TypeOf(tt.x).Elem()
+               xt := TypeOf(tt.t).Elem()
+               if b := xv.Implements(xt); b != tt.b {
+                       t.Errorf("(%s).Implements(%s) = %v, want %v", TypeString(xv), TypeString(xt), b, tt.b)
+               }
+       }
+}
+
+var assignableTests = []struct {
+       x interface{}
+       t interface{}
+       b bool
+}{
+       {new(chan int), new(<-chan int), true},
+       {new(<-chan int), new(chan int), false},
+       {new(*int), new(IntPtr), true},
+       {new(IntPtr), new(*int), true},
+       {new(IntPtr), new(IntPtr1), false},
+       {new(Ch), new(<-chan interface{}), true},
+       // test runs implementsTests too
+}
+
+type IntPtr *int
+type IntPtr1 *int
+type Ch <-chan interface{}
+
+func TestAssignableTo(t *testing.T) {
+       for i, tt := range append(assignableTests, implementsTests...) {
+               xv := TypeOf(tt.x).Elem()
+               xt := TypeOf(tt.t).Elem()
+               if b := xv.AssignableTo(xt); b != tt.b {
+                       t.Errorf("%d:AssignableTo: got %v, want %v", i, b, tt.b)
+               }
+       }
+}
diff --git a/libgo/go/internal/reflectlite/swapper.go b/libgo/go/internal/reflectlite/swapper.go
new file mode 100644 (file)
index 0000000..4594fb5
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite
+
+import "unsafe"
+
+// Swapper returns a function that swaps the elements in the provided
+// slice.
+//
+// Swapper panics if the provided interface is not a slice.
+func Swapper(slice interface{}) func(i, j int) {
+       v := ValueOf(slice)
+       if v.Kind() != Slice {
+               panic(&ValueError{Method: "Swapper", Kind: v.Kind()})
+       }
+       // Fast path for slices of size 0 and 1. Nothing to swap.
+       switch v.Len() {
+       case 0:
+               return func(i, j int) { panic("reflect: slice index out of range") }
+       case 1:
+               return func(i, j int) {
+                       if i != 0 || j != 0 {
+                               panic("reflect: slice index out of range")
+                       }
+               }
+       }
+
+       typ := v.Type().Elem().(*rtype)
+       size := typ.Size()
+       hasPtr := typ.ptrdata != 0
+
+       // Some common & small cases, without using memmove:
+       if hasPtr {
+               if size == ptrSize {
+                       ps := *(*[]unsafe.Pointer)(v.ptr)
+                       return func(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
+               }
+               if typ.Kind() == String {
+                       ss := *(*[]string)(v.ptr)
+                       return func(i, j int) { ss[i], ss[j] = ss[j], ss[i] }
+               }
+       } else {
+               switch size {
+               case 8:
+                       is := *(*[]int64)(v.ptr)
+                       return func(i, j int) { is[i], is[j] = is[j], is[i] }
+               case 4:
+                       is := *(*[]int32)(v.ptr)
+                       return func(i, j int) { is[i], is[j] = is[j], is[i] }
+               case 2:
+                       is := *(*[]int16)(v.ptr)
+                       return func(i, j int) { is[i], is[j] = is[j], is[i] }
+               case 1:
+                       is := *(*[]int8)(v.ptr)
+                       return func(i, j int) { is[i], is[j] = is[j], is[i] }
+               }
+       }
+
+       s := (*sliceHeader)(v.ptr)
+       tmp := unsafe_New(typ) // swap scratch space
+
+       return func(i, j int) {
+               if uint(i) >= uint(s.Len) || uint(j) >= uint(s.Len) {
+                       panic("reflect: slice index out of range")
+               }
+               val1 := arrayAt(s.Data, i, size, "i < s.Len")
+               val2 := arrayAt(s.Data, j, size, "j < s.Len")
+               typedmemmove(typ, tmp, val1)
+               typedmemmove(typ, val1, val2)
+               typedmemmove(typ, val2, tmp)
+       }
+}
diff --git a/libgo/go/internal/reflectlite/tostring_test.go b/libgo/go/internal/reflectlite/tostring_test.go
new file mode 100644 (file)
index 0000000..a1e5dae
--- /dev/null
@@ -0,0 +1,98 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Formatting of reflection types and values for debugging.
+// Not defined as methods so they do not need to be linked into most binaries;
+// the functions are not used by the library itself, only in tests.
+
+package reflectlite_test
+
+import (
+       . "internal/reflectlite"
+       "reflect"
+       "strconv"
+)
+
+// valueToString returns a textual representation of the reflection value val.
+// For debugging only.
+func valueToString(v Value) string {
+       return valueToStringImpl(reflect.ValueOf(ToInterface(v)))
+}
+
+func valueToStringImpl(val reflect.Value) string {
+       var str string
+       if !val.IsValid() {
+               return "<zero Value>"
+       }
+       typ := val.Type()
+       switch val.Kind() {
+       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               return strconv.FormatInt(val.Int(), 10)
+       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+               return strconv.FormatUint(val.Uint(), 10)
+       case reflect.Float32, reflect.Float64:
+               return strconv.FormatFloat(val.Float(), 'g', -1, 64)
+       case reflect.Complex64, reflect.Complex128:
+               c := val.Complex()
+               return strconv.FormatFloat(real(c), 'g', -1, 64) + "+" + strconv.FormatFloat(imag(c), 'g', -1, 64) + "i"
+       case reflect.String:
+               return val.String()
+       case reflect.Bool:
+               if val.Bool() {
+                       return "true"
+               } else {
+                       return "false"
+               }
+       case reflect.Ptr:
+               v := val
+               str = typ.String() + "("
+               if v.IsNil() {
+                       str += "0"
+               } else {
+                       str += "&" + valueToStringImpl(v.Elem())
+               }
+               str += ")"
+               return str
+       case reflect.Array, reflect.Slice:
+               v := val
+               str += typ.String()
+               str += "{"
+               for i := 0; i < v.Len(); i++ {
+                       if i > 0 {
+                               str += ", "
+                       }
+                       str += valueToStringImpl(v.Index(i))
+               }
+               str += "}"
+               return str
+       case reflect.Map:
+               str += typ.String()
+               str += "{"
+               str += "<can't iterate on maps>"
+               str += "}"
+               return str
+       case reflect.Chan:
+               str = typ.String()
+               return str
+       case reflect.Struct:
+               t := typ
+               v := val
+               str += t.String()
+               str += "{"
+               for i, n := 0, v.NumField(); i < n; i++ {
+                       if i > 0 {
+                               str += ", "
+                       }
+                       str += valueToStringImpl(v.Field(i))
+               }
+               str += "}"
+               return str
+       case reflect.Interface:
+               return typ.String() + "(" + valueToStringImpl(val.Elem()) + ")"
+       case reflect.Func:
+               return typ.String() + "(arg)"
+       default:
+               panic("valueToString: can't print type " + typ.String())
+       }
+}
diff --git a/libgo/go/internal/reflectlite/type.go b/libgo/go/internal/reflectlite/type.go
new file mode 100644 (file)
index 0000000..02b2aee
--- /dev/null
@@ -0,0 +1,729 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package reflectlite implements lightweight version of reflect, not using
+// any package except for "runtime" and "unsafe".
+package reflectlite
+
+import (
+       "unsafe"
+)
+
+// Type is the representation of a Go type.
+//
+// Not all methods apply to all kinds of types. Restrictions,
+// if any, are noted in the documentation for each method.
+// Use the Kind method to find out the kind of type before
+// calling kind-specific methods. Calling a method
+// inappropriate to the kind of type causes a run-time panic.
+//
+// Type values are comparable, such as with the == operator,
+// so they can be used as map keys.
+// Two Type values are equal if they represent identical types.
+type Type interface {
+       // Methods applicable to all types.
+
+       // Name returns the type's name within its package for a defined type.
+       // For other (non-defined) types it returns the empty string.
+       Name() string
+
+       // PkgPath returns a defined type's package path, that is, the import path
+       // that uniquely identifies the package, such as "encoding/base64".
+       // If the type was predeclared (string, error) or not defined (*T, struct{},
+       // []int, or A where A is an alias for a non-defined type), the package path
+       // will be the empty string.
+       PkgPath() string
+
+       // Size returns the number of bytes needed to store
+       // a value of the given type; it is analogous to unsafe.Sizeof.
+       Size() uintptr
+
+       // Kind returns the specific kind of this type.
+       Kind() Kind
+
+       // Implements reports whether the type implements the interface type u.
+       Implements(u Type) bool
+
+       // AssignableTo reports whether a value of the type is assignable to type u.
+       AssignableTo(u Type) bool
+
+       // Comparable reports whether values of this type are comparable.
+       Comparable() bool
+
+       // String returns a string representation of the type.
+       // The string representation may use shortened package names
+       // (e.g., base64 instead of "encoding/base64") and is not
+       // guaranteed to be unique among types. To test for type identity,
+       // compare the Types directly.
+       String() string
+
+       // Elem returns a type's element type.
+       // It panics if the type's Kind is not Ptr.
+       Elem() Type
+
+       common() *rtype
+       uncommon() *uncommonType
+}
+
+/*
+ * These data structures are known to the compiler (../../cmd/internal/gc/reflect.go).
+ * A few are known to ../runtime/type.go to convey to debuggers.
+ * They are also known to ../runtime/type.go.
+ */
+
+// A Kind represents the specific kind of type that a Type represents.
+// The zero Kind is not a valid kind.
+type Kind uint
+
+const (
+       Invalid Kind = iota
+       Bool
+       Int
+       Int8
+       Int16
+       Int32
+       Int64
+       Uint
+       Uint8
+       Uint16
+       Uint32
+       Uint64
+       Uintptr
+       Float32
+       Float64
+       Complex64
+       Complex128
+       Array
+       Chan
+       Func
+       Interface
+       Map
+       Ptr
+       Slice
+       String
+       Struct
+       UnsafePointer
+)
+
+// tflag is used by an rtype to signal what extra type information is
+// available in the memory directly following the rtype value.
+//
+// tflag values must be kept in sync with copies in:
+//     cmd/compile/internal/gc/reflect.go
+//     cmd/link/internal/ld/decodesym.go
+//     runtime/type.go
+type tflag uint8
+
+const (
+       // tflagUncommon means that there is a pointer, *uncommonType,
+       // just beyond the outer type structure.
+       //
+       // For example, if t.Kind() == Struct and t.tflag&tflagUncommon != 0,
+       // then t has uncommonType data and it can be accessed as:
+       //
+       //      type tUncommon struct {
+       //              structType
+       //              u uncommonType
+       //      }
+       //      u := &(*tUncommon)(unsafe.Pointer(t)).u
+       tflagUncommon tflag = 1 << 0
+
+       // tflagExtraStar means the name in the str field has an
+       // extraneous '*' prefix. This is because for most types T in
+       // a program, the type *T also exists and reusing the str data
+       // saves binary size.
+       tflagExtraStar tflag = 1 << 1
+
+       // tflagNamed means the type has a name.
+       tflagNamed tflag = 1 << 2
+)
+
+// rtype is the common implementation of most values.
+// It is embedded in other struct types.
+//
+// rtype must be kept in sync with ../runtime/type.go:/^type._type.
+type rtype struct {
+       size       uintptr
+       ptrdata    uintptr // number of bytes in the type that can contain pointers
+       hash       uint32  // hash of type; avoids computation in hash tables
+       kind       uint8   // enumeration for C
+       align      uint8   // alignment of variable with this type
+       fieldAlign uint8   // alignment of struct field with this type
+       _          uint8   // unused/padding
+
+       hashfn  func(unsafe.Pointer, uintptr) uintptr     // hash function
+       equalfn func(unsafe.Pointer, unsafe.Pointer) bool // equality function
+
+       gcdata        *byte   // garbage collection data
+       string        *string // string form; unnecessary  but undeniably useful
+       *uncommonType         // (relatively) uncommon fields
+       ptrToThis     *rtype  // type for pointer to this type, may be zero
+}
+
+// Method on non-interface type
+type method struct {
+       name    *string        // name of method
+       pkgPath *string        // nil for exported Names; otherwise import path
+       mtyp    *rtype         // method type (without receiver)
+       typ     *rtype         // .(*FuncType) underneath (with receiver)
+       tfn     unsafe.Pointer // fn used for normal method call
+}
+
+// uncommonType is present only for defined types or types with methods
+// (if T is a defined type, the uncommonTypes for T and *T have methods).
+// Using a pointer to this struct reduces the overall size required
+// to describe a non-defined type with no methods.
+type uncommonType struct {
+       name    *string  // name of type
+       pkgPath *string  // import path; nil for built-in types like int, string
+       methods []method // methods associated with type
+}
+
+// chanDir represents a channel type's direction.
+type chanDir int
+
+const (
+       recvDir chanDir             = 1 << iota // <-chan
+       sendDir                                 // chan<-
+       bothDir = recvDir | sendDir             // chan
+)
+
+// arrayType represents a fixed array type.
+type arrayType struct {
+       rtype
+       elem  *rtype // array element type
+       slice *rtype // slice type
+       len   uintptr
+}
+
+// chanType represents a channel type.
+type chanType struct {
+       rtype
+       elem *rtype  // channel element type
+       dir  uintptr // channel direction (chanDir)
+}
+
+// funcType represents a function type.
+type funcType struct {
+       rtype
+       dotdotdot bool     // last input parameter is ...
+       in        []*rtype // input parameter types
+       out       []*rtype // output parameter types
+}
+
+// imethod represents a method on an interface type
+type imethod struct {
+       name    *string // name of method
+       pkgPath *string // nil for exported Names; otherwise import path
+       typ     *rtype  // .(*FuncType) underneath
+}
+
+// interfaceType represents an interface type.
+type interfaceType struct {
+       rtype
+       methods []imethod // sorted by hash
+}
+
+// mapType represents a map type.
+type mapType struct {
+       rtype
+       key        *rtype // map key type
+       elem       *rtype // map element (value) type
+       bucket     *rtype // internal bucket structure
+       keysize    uint8  // size of key slot
+       valuesize  uint8  // size of value slot
+       bucketsize uint16 // size of bucket
+       flags      uint32
+}
+
+// ptrType represents a pointer type.
+type ptrType struct {
+       rtype
+       elem *rtype // pointer element (pointed at) type
+}
+
+// sliceType represents a slice type.
+type sliceType struct {
+       rtype
+       elem *rtype // slice element type
+}
+
+// Struct field
+type structField struct {
+       name        *string // name is always non-empty
+       pkgPath     *string // nil for exported Names; otherwise import path
+       typ         *rtype  // type of field
+       tag         *string // nil if no tag
+       offsetEmbed uintptr // byte offset of field<<1 | isAnonymous
+}
+
+func (f *structField) offset() uintptr {
+       return f.offsetEmbed >> 1
+}
+
+func (f *structField) embedded() bool {
+       return f.offsetEmbed&1 != 0
+}
+
+// structType represents a struct type.
+type structType struct {
+       rtype
+       fields []structField // sorted by offset
+}
+
+/*
+ * The compiler knows the exact layout of all the data structures above.
+ * The compiler does not know about the data structures and methods below.
+ */
+
+const (
+       kindDirectIface = 1 << 5
+       kindGCProg      = 1 << 6 // Type.gc points to GC program
+       kindMask        = (1 << 5) - 1
+)
+
+func (t *uncommonType) exportedMethods() []method {
+       allm := t.methods
+       allExported := true
+       for _, m := range allm {
+               if m.pkgPath != nil {
+                       allExported = false
+                       break
+               }
+       }
+       var methods []method
+       if allExported {
+               methods = allm
+       } else {
+               methods = make([]method, 0, len(allm))
+               for _, m := range allm {
+                       if m.pkgPath == nil {
+                               methods = append(methods, m)
+                       }
+               }
+               methods = methods[:len(methods):len(methods)]
+       }
+
+       return methods
+}
+
+func (t *uncommonType) uncommon() *uncommonType {
+       return t
+}
+
+func (t *uncommonType) PkgPath() string {
+       if t == nil || t.pkgPath == nil {
+               return ""
+       }
+       return *t.pkgPath
+}
+
+func (t *uncommonType) Name() string {
+       if t == nil || t.name == nil {
+               return ""
+       }
+       return *t.name
+}
+
+func (t *rtype) String() string {
+       // For gccgo, strip out quoted strings.
+       s := *t.string
+       var q bool
+       r := make([]byte, len(s))
+       j := 0
+       for i := 0; i < len(s); i++ {
+               if s[i] == '\t' {
+                       q = !q
+               } else if !q {
+                       r[j] = s[i]
+                       j++
+               }
+       }
+       return string(r[:j])
+}
+
+func (t *rtype) Size() uintptr { return t.size }
+
+func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }
+
+func (t *rtype) pointers() bool { return t.ptrdata != 0 }
+
+func (t *rtype) common() *rtype { return t }
+
+func (t *rtype) exportedMethods() []method {
+       ut := t.uncommon()
+       if ut == nil {
+               return nil
+       }
+       return ut.exportedMethods()
+}
+
+func (t *rtype) NumMethod() int {
+       if t.Kind() == Interface {
+               tt := (*interfaceType)(unsafe.Pointer(t))
+               return tt.NumMethod()
+       }
+       return len(t.exportedMethods())
+}
+
+func (t *rtype) PkgPath() string {
+       return t.uncommonType.PkgPath()
+}
+
+func (t *rtype) Name() string {
+       return t.uncommonType.Name()
+}
+
+func (t *rtype) chanDir() chanDir {
+       if t.Kind() != Chan {
+               panic("reflect: chanDir of non-chan type")
+       }
+       tt := (*chanType)(unsafe.Pointer(t))
+       return chanDir(tt.dir)
+}
+
+func (t *rtype) Elem() Type {
+       switch t.Kind() {
+       case Array:
+               tt := (*arrayType)(unsafe.Pointer(t))
+               return toType(tt.elem)
+       case Chan:
+               tt := (*chanType)(unsafe.Pointer(t))
+               return toType(tt.elem)
+       case Map:
+               tt := (*mapType)(unsafe.Pointer(t))
+               return toType(tt.elem)
+       case Ptr:
+               tt := (*ptrType)(unsafe.Pointer(t))
+               return toType(tt.elem)
+       case Slice:
+               tt := (*sliceType)(unsafe.Pointer(t))
+               return toType(tt.elem)
+       }
+       panic("reflect: Elem of invalid type")
+}
+
+func (t *rtype) In(i int) Type {
+       if t.Kind() != Func {
+               panic("reflect: In of non-func type")
+       }
+       tt := (*funcType)(unsafe.Pointer(t))
+       return toType(tt.in[i])
+}
+
+func (t *rtype) Key() Type {
+       if t.Kind() != Map {
+               panic("reflect: Key of non-map type")
+       }
+       tt := (*mapType)(unsafe.Pointer(t))
+       return toType(tt.key)
+}
+
+func (t *rtype) Len() int {
+       if t.Kind() != Array {
+               panic("reflect: Len of non-array type")
+       }
+       tt := (*arrayType)(unsafe.Pointer(t))
+       return int(tt.len)
+}
+
+func (t *rtype) NumField() int {
+       if t.Kind() != Struct {
+               panic("reflect: NumField of non-struct type")
+       }
+       tt := (*structType)(unsafe.Pointer(t))
+       return len(tt.fields)
+}
+
+func (t *rtype) NumIn() int {
+       if t.Kind() != Func {
+               panic("reflect: NumIn of non-func type")
+       }
+       tt := (*funcType)(unsafe.Pointer(t))
+       return len(tt.in)
+}
+
+func (t *rtype) NumOut() int {
+       if t.Kind() != Func {
+               panic("reflect: NumOut of non-func type")
+       }
+       tt := (*funcType)(unsafe.Pointer(t))
+       return len(tt.out)
+}
+
+func (t *rtype) Out(i int) Type {
+       if t.Kind() != Func {
+               panic("reflect: Out of non-func type")
+       }
+       tt := (*funcType)(unsafe.Pointer(t))
+       return toType(tt.out[i])
+}
+
+// add returns p+x.
+//
+// The whySafe string is ignored, so that the function still inlines
+// as efficiently as p+x, but all call sites should use the string to
+// record why the addition is safe, which is to say why the addition
+// does not cause x to advance to the very end of p's allocation
+// and therefore point incorrectly at the next block in memory.
+func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {
+       return unsafe.Pointer(uintptr(p) + x)
+}
+
+// NumMethod returns the number of interface methods in the type's method set.
+func (t *interfaceType) NumMethod() int { return len(t.methods) }
+
+// TypeOf returns the reflection Type that represents the dynamic type of i.
+// If i is a nil interface value, TypeOf returns nil.
+func TypeOf(i interface{}) Type {
+       eface := *(*emptyInterface)(unsafe.Pointer(&i))
+       return toType(eface.typ)
+}
+
+func (t *rtype) Implements(u Type) bool {
+       if u == nil {
+               panic("reflect: nil type passed to Type.Implements")
+       }
+       if u.Kind() != Interface {
+               panic("reflect: non-interface type passed to Type.Implements")
+       }
+       return implements(u.(*rtype), t)
+}
+
+func (t *rtype) AssignableTo(u Type) bool {
+       if u == nil {
+               panic("reflect: nil type passed to Type.AssignableTo")
+       }
+       uu := u.(*rtype)
+       return directlyAssignable(uu, t) || implements(uu, t)
+}
+
+func (t *rtype) Comparable() bool {
+       switch t.Kind() {
+       case Bool, Int, Int8, Int16, Int32, Int64,
+               Uint, Uint8, Uint16, Uint32, Uint64, Uintptr,
+               Float32, Float64, Complex64, Complex128,
+               Chan, Interface, Ptr, String, UnsafePointer:
+               return true
+
+       case Func, Map, Slice:
+               return false
+
+       case Array:
+               return (*arrayType)(unsafe.Pointer(t)).elem.Comparable()
+
+       case Struct:
+               tt := (*structType)(unsafe.Pointer(t))
+               for i := range tt.fields {
+                       if !tt.fields[i].typ.Comparable() {
+                               return false
+                       }
+               }
+               return true
+
+       default:
+               panic("reflectlite: impossible")
+       }
+}
+
+// implements reports whether the type V implements the interface type T.
+func implements(T, V *rtype) bool {
+       if T.Kind() != Interface {
+               return false
+       }
+       t := (*interfaceType)(unsafe.Pointer(T))
+       if len(t.methods) == 0 {
+               return true
+       }
+
+       // The same algorithm applies in both cases, but the
+       // method tables for an interface type and a concrete type
+       // are different, so the code is duplicated.
+       // In both cases the algorithm is a linear scan over the two
+       // lists - T's methods and V's methods - simultaneously.
+       // Since method tables are stored in a unique sorted order
+       // (alphabetical, with no duplicate method names), the scan
+       // through V's methods must hit a match for each of T's
+       // methods along the way, or else V does not implement T.
+       // This lets us run the scan in overall linear time instead of
+       // the quadratic time  a naive search would require.
+       // See also ../runtime/iface.go.
+       if V.Kind() == Interface {
+               v := (*interfaceType)(unsafe.Pointer(V))
+               i := 0
+               for j := 0; j < len(v.methods); j++ {
+                       tm := &t.methods[i]
+                       vm := &v.methods[j]
+                       if *vm.name == *tm.name && (vm.pkgPath == tm.pkgPath || (vm.pkgPath != nil && tm.pkgPath != nil && *vm.pkgPath == *tm.pkgPath)) && toType(vm.typ).common() == toType(tm.typ).common() {
+                               if i++; i >= len(t.methods) {
+                                       return true
+                               }
+                       }
+               }
+               return false
+       }
+
+       v := V.uncommon()
+       if v == nil {
+               return false
+       }
+       i := 0
+       for j := 0; j < len(v.methods); j++ {
+               tm := &t.methods[i]
+               vm := &v.methods[j]
+               if *vm.name == *tm.name && (vm.pkgPath == tm.pkgPath || (vm.pkgPath != nil && tm.pkgPath != nil && *vm.pkgPath == *tm.pkgPath)) && toType(vm.mtyp).common() == toType(tm.typ).common() {
+                       if i++; i >= len(t.methods) {
+                               return true
+                       }
+               }
+       }
+       return false
+}
+
+// directlyAssignable reports whether a value x of type V can be directly
+// assigned (using memmove) to a value of type T.
+// https://golang.org/doc/go_spec.html#Assignability
+// Ignoring the interface rules (implemented elsewhere)
+// and the ideal constant rules (no ideal constants at run time).
+func directlyAssignable(T, V *rtype) bool {
+       // x's type V is identical to T?
+       if T == V {
+               return true
+       }
+
+       // Otherwise at least one of T and V must not be defined
+       // and they must have the same kind.
+       if T.Name() != "" && V.Name() != "" || T.Kind() != V.Kind() {
+               return false
+       }
+
+       // x's type T and V must  have identical underlying types.
+       return haveIdenticalUnderlyingType(T, V, true)
+}
+
+func haveIdenticalType(T, V Type, cmpTags bool) bool {
+       if cmpTags {
+               return T == V
+       }
+
+       if T.Name() != V.Name() || T.Kind() != V.Kind() {
+               return false
+       }
+
+       return haveIdenticalUnderlyingType(T.common(), V.common(), false)
+}
+
+func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
+       if T == V {
+               return true
+       }
+
+       kind := T.Kind()
+       if kind != V.Kind() {
+               return false
+       }
+
+       // Non-composite types of equal kind have same underlying type
+       // (the predefined instance of the type).
+       if Bool <= kind && kind <= Complex128 || kind == String || kind == UnsafePointer {
+               return true
+       }
+
+       // Composite types.
+       switch kind {
+       case Array:
+               return T.Len() == V.Len() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
+
+       case Chan:
+               // Special case:
+               // x is a bidirectional channel value, T is a channel type,
+               // and x's type V and T have identical element types.
+               if V.chanDir() == bothDir && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) {
+                       return true
+               }
+
+               // Otherwise continue test for identical underlying type.
+               return V.chanDir() == T.chanDir() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
+
+       case Func:
+               t := (*funcType)(unsafe.Pointer(T))
+               v := (*funcType)(unsafe.Pointer(V))
+               if t.dotdotdot != v.dotdotdot || len(t.in) != len(v.in) || len(t.out) != len(v.out) {
+                       return false
+               }
+               for i, typ := range t.in {
+                       if !haveIdenticalType(typ, v.in[i], cmpTags) {
+                               return false
+                       }
+               }
+               for i, typ := range t.out {
+                       if !haveIdenticalType(typ, v.out[i], cmpTags) {
+                               return false
+                       }
+               }
+               return true
+
+       case Interface:
+               t := (*interfaceType)(unsafe.Pointer(T))
+               v := (*interfaceType)(unsafe.Pointer(V))
+               if len(t.methods) == 0 && len(v.methods) == 0 {
+                       return true
+               }
+               // Might have the same methods but still
+               // need a run time conversion.
+               return false
+
+       case Map:
+               return haveIdenticalType(T.Key(), V.Key(), cmpTags) && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
+
+       case Ptr, Slice:
+               return haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
+
+       case Struct:
+               t := (*structType)(unsafe.Pointer(T))
+               v := (*structType)(unsafe.Pointer(V))
+               if len(t.fields) != len(v.fields) {
+                       return false
+               }
+               for i := range t.fields {
+                       tf := &t.fields[i]
+                       vf := &v.fields[i]
+                       if tf.name != vf.name && (tf.name == nil || vf.name == nil || *tf.name != *vf.name) {
+                               return false
+                       }
+                       if tf.pkgPath != vf.pkgPath && (tf.pkgPath == nil || vf.pkgPath == nil || *tf.pkgPath != *vf.pkgPath) {
+                               return false
+                       }
+                       if !haveIdenticalType(tf.typ, vf.typ, cmpTags) {
+                               return false
+                       }
+                       if cmpTags && tf.tag != vf.tag && (tf.tag == nil || vf.tag == nil || *tf.tag != *vf.tag) {
+                               return false
+                       }
+                       if tf.offsetEmbed != vf.offsetEmbed {
+                               return false
+                       }
+               }
+               return true
+       }
+
+       return false
+}
+
+// toType converts from a *rtype to a Type that can be returned
+// to the client of package reflect. In gc, the only concern is that
+// a nil *rtype must be replaced by a nil Type, but in gccgo this
+// function takes care of ensuring that multiple *rtype for the same
+// type are coalesced into a single Type.
+func toType(t *rtype) Type {
+       if t == nil {
+               return nil
+       }
+       return t
+}
+
+// ifaceIndir reports whether t is stored indirectly in an interface value.
+func ifaceIndir(t *rtype) bool {
+       return t.kind&kindDirectIface == 0
+}
diff --git a/libgo/go/internal/reflectlite/value.go b/libgo/go/internal/reflectlite/value.go
new file mode 100644 (file)
index 0000000..bfc321f
--- /dev/null
@@ -0,0 +1,497 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite
+
+import (
+       "runtime"
+       "unsafe"
+)
+
+const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const
+
+// Value is the reflection interface to a Go value.
+//
+// Not all methods apply to all kinds of values. Restrictions,
+// if any, are noted in the documentation for each method.
+// Use the Kind method to find out the kind of value before
+// calling kind-specific methods. Calling a method
+// inappropriate to the kind of type causes a run time panic.
+//
+// The zero Value represents no value.
+// Its IsValid method returns false, its Kind method returns Invalid,
+// its String method returns "<invalid Value>", and all other methods panic.
+// Most functions and methods never return an invalid value.
+// If one does, its documentation states the conditions explicitly.
+//
+// A Value can be used concurrently by multiple goroutines provided that
+// the underlying Go value can be used concurrently for the equivalent
+// direct operations.
+//
+// To compare two Values, compare the results of the Interface method.
+// Using == on two Values does not compare the underlying values
+// they represent.
+type Value struct {
+       // typ holds the type of the value represented by a Value.
+       typ *rtype
+
+       // Pointer-valued data or, if flagIndir is set, pointer to data.
+       // Valid when either flagIndir is set or typ.pointers() is true.
+       ptr unsafe.Pointer
+
+       // flag holds metadata about the value.
+       // The lowest bits are flag bits:
+       //      - flagStickyRO: obtained via unexported not embedded field, so read-only
+       //      - flagEmbedRO: obtained via unexported embedded field, so read-only
+       //      - flagIndir: val holds a pointer to the data
+       //      - flagAddr: v.CanAddr is true (implies flagIndir)
+       // Value cannot represent method values.
+       // The next five bits give the Kind of the value.
+       // This repeats typ.Kind() except for method values.
+       // The remaining 23+ bits give a method number for method values.
+       // If flag.kind() != Func, code can assume that flagMethod is unset.
+       // If ifaceIndir(typ), code can assume that flagIndir is set.
+       flag
+
+       // A method value represents a curried method invocation
+       // like r.Read for some receiver r. The typ+val+flag bits describe
+       // the receiver r, but the flag's Kind bits say Func (methods are
+       // functions), and the top bits of the flag give the method number
+       // in r's type's method table.
+}
+
+type flag uintptr
+
+const (
+       flagKindWidth        = 5 // there are 27 kinds
+       flagKindMask    flag = 1<<flagKindWidth - 1
+       flagStickyRO    flag = 1 << 5
+       flagEmbedRO     flag = 1 << 6
+       flagIndir       flag = 1 << 7
+       flagAddr        flag = 1 << 8
+       flagMethod      flag = 1 << 9
+       flagMethodFn    flag = 1 << 10 // gccgo: first fn parameter is always pointer
+       flagMethodShift      = 11
+       flagRO          flag = flagStickyRO | flagEmbedRO
+)
+
+func (f flag) kind() Kind {
+       return Kind(f & flagKindMask)
+}
+
+func (f flag) ro() flag {
+       if f&flagRO != 0 {
+               return flagStickyRO
+       }
+       return 0
+}
+
+// pointer returns the underlying pointer represented by v.
+// v.Kind() must be Ptr, Map, Chan, Func, or UnsafePointer
+func (v Value) pointer() unsafe.Pointer {
+       if v.typ.size != ptrSize || !v.typ.pointers() {
+               panic("can't call pointer on a non-pointer Value")
+       }
+       if v.flag&flagIndir != 0 {
+               return *(*unsafe.Pointer)(v.ptr)
+       }
+       return v.ptr
+}
+
+// packEface converts v to the empty interface.
+func packEface(v Value) interface{} {
+       t := v.typ
+       var i interface{}
+       e := (*emptyInterface)(unsafe.Pointer(&i))
+       // First, fill in the data portion of the interface.
+       switch {
+       case ifaceIndir(t):
+               if v.flag&flagIndir == 0 {
+                       panic("bad indir")
+               }
+               // Value is indirect, and so is the interface we're making.
+               ptr := v.ptr
+               if v.flag&flagAddr != 0 {
+                       // TODO: pass safe boolean from valueInterface so
+                       // we don't need to copy if safe==true?
+                       c := unsafe_New(t)
+                       typedmemmove(t, c, ptr)
+                       ptr = c
+               }
+               e.word = ptr
+       case v.flag&flagIndir != 0:
+               // Value is indirect, but interface is direct. We need
+               // to load the data at v.ptr into the interface data word.
+               e.word = *(*unsafe.Pointer)(v.ptr)
+       default:
+               // Value is direct, and so is the interface.
+               e.word = v.ptr
+       }
+       // Now, fill in the type portion. We're very careful here not
+       // to have any operation between the e.word and e.typ assignments
+       // that would let the garbage collector observe the partially-built
+       // interface value.
+       e.typ = t
+       return i
+}
+
+// unpackEface converts the empty interface i to a Value.
+func unpackEface(i interface{}) Value {
+       e := (*emptyInterface)(unsafe.Pointer(&i))
+       // NOTE: don't read e.word until we know whether it is really a pointer or not.
+       t := e.typ
+       if t == nil {
+               return Value{}
+       }
+       f := flag(t.Kind())
+       if ifaceIndir(t) {
+               f |= flagIndir
+       }
+       return Value{t, e.word, f}
+}
+
+// A ValueError occurs when a Value method is invoked on
+// a Value that does not support it. Such cases are documented
+// in the description of each method.
+type ValueError struct {
+       Method string
+       Kind   Kind
+}
+
+func (e *ValueError) Error() string {
+       return "reflect: call of " + e.Method + " on zero Value"
+}
+
+// methodName returns the name of the calling method,
+// assumed to be two stack frames above.
+func methodName() string {
+       pc, _, _, _ := runtime.Caller(2)
+       f := runtime.FuncForPC(pc)
+       if f == nil {
+               return "unknown method"
+       }
+       return f.Name()
+}
+
+// emptyInterface is the header for an interface{} value.
+type emptyInterface struct {
+       typ  *rtype
+       word unsafe.Pointer
+}
+
+// nonEmptyInterface is the header for an interface value with methods.
+type nonEmptyInterface struct {
+       // see ../runtime/iface.go:/Itab
+       itab *struct {
+               typ *rtype                 // dynamic concrete type
+               fun [100000]unsafe.Pointer // method table
+       }
+       word unsafe.Pointer
+}
+
+// mustBeExported panics if f records that the value was obtained using
+// an unexported field.
+func (f flag) mustBeExported() {
+       if f == 0 {
+               panic(&ValueError{methodName(), 0})
+       }
+       if f&flagRO != 0 {
+               panic("reflect: " + methodName() + " using value obtained using unexported field")
+       }
+}
+
+// mustBeAssignable panics if f records that the value is not assignable,
+// which is to say that either it was obtained using an unexported field
+// or it is not addressable.
+func (f flag) mustBeAssignable() {
+       if f == 0 {
+               panic(&ValueError{methodName(), Invalid})
+       }
+       // Assignable if addressable and not read-only.
+       if f&flagRO != 0 {
+               panic("reflect: " + methodName() + " using value obtained using unexported field")
+       }
+       if f&flagAddr == 0 {
+               panic("reflect: " + methodName() + " using unaddressable value")
+       }
+}
+
+// CanSet reports whether the value of v can be changed.
+// A Value can be changed only if it is addressable and was not
+// obtained by the use of unexported struct fields.
+// If CanSet returns false, calling Set or any type-specific
+// setter (e.g., SetBool, SetInt) will panic.
+func (v Value) CanSet() bool {
+       return v.flag&(flagAddr|flagRO) == flagAddr
+}
+
+// Elem returns the value that the interface v contains
+// or that the pointer v points to.
+// It panics if v's Kind is not Interface or Ptr.
+// It returns the zero Value if v is nil.
+func (v Value) Elem() Value {
+       k := v.kind()
+       switch k {
+       case Interface:
+               var eface interface{}
+               if v.typ.NumMethod() == 0 {
+                       eface = *(*interface{})(v.ptr)
+               } else {
+                       eface = (interface{})(*(*interface {
+                               M()
+                       })(v.ptr))
+               }
+               x := unpackEface(eface)
+               if x.flag != 0 {
+                       x.flag |= v.flag.ro()
+               }
+               return x
+       case Ptr:
+               ptr := v.ptr
+               if v.flag&flagIndir != 0 {
+                       ptr = *(*unsafe.Pointer)(ptr)
+               }
+               // The returned value's address is v's value.
+               if ptr == nil {
+                       return Value{}
+               }
+               tt := (*ptrType)(unsafe.Pointer(v.typ))
+               typ := tt.elem
+               fl := v.flag&flagRO | flagIndir | flagAddr
+               fl |= flag(typ.Kind())
+               return Value{typ, ptr, fl}
+       }
+       panic(&ValueError{"reflectlite.Value.Elem", v.kind()})
+}
+
+func valueInterface(v Value) interface{} {
+       if v.flag == 0 {
+               panic(&ValueError{"reflectlite.Value.Interface", 0})
+       }
+
+       if v.kind() == Interface {
+               // Special case: return the element inside the interface.
+               // Empty interface has one layout, all interfaces with
+               // methods have a second layout.
+               if v.numMethod() == 0 {
+                       return *(*interface{})(v.ptr)
+               }
+               return *(*interface {
+                       M()
+               })(v.ptr)
+       }
+
+       // TODO: pass safe to packEface so we don't need to copy if safe==true?
+       return packEface(v)
+}
+
+// IsNil reports whether its argument v is nil. The argument must be
+// a chan, func, interface, map, pointer, or slice value; if it is
+// not, IsNil panics. Note that IsNil is not always equivalent to a
+// regular comparison with nil in Go. For example, if v was created
+// by calling ValueOf with an uninitialized interface variable i,
+// i==nil will be true but v.IsNil will panic as v will be the zero
+// Value.
+func (v Value) IsNil() bool {
+       k := v.kind()
+       switch k {
+       case Chan, Func, Map, Ptr, UnsafePointer:
+               // if v.flag&flagMethod != 0 {
+               //      return false
+               // }
+               ptr := v.ptr
+               if v.flag&flagIndir != 0 {
+                       ptr = *(*unsafe.Pointer)(ptr)
+               }
+               return ptr == nil
+       case Interface, Slice:
+               // Both interface and slice are nil if first word is 0.
+               // Both are always bigger than a word; assume flagIndir.
+               return *(*unsafe.Pointer)(v.ptr) == nil
+       }
+       panic(&ValueError{"reflectlite.Value.IsNil", v.kind()})
+}
+
+// IsValid reports whether v represents a value.
+// It returns false if v is the zero Value.
+// If IsValid returns false, all other methods except String panic.
+// Most functions and methods never return an invalid value.
+// If one does, its documentation states the conditions explicitly.
+func (v Value) IsValid() bool {
+       return v.flag != 0
+}
+
+// Kind returns v's Kind.
+// If v is the zero Value (IsValid returns false), Kind returns Invalid.
+func (v Value) Kind() Kind {
+       return v.kind()
+}
+
+// implemented in runtime:
+func chanlen(unsafe.Pointer) int
+func maplen(unsafe.Pointer) int
+
+// Len returns v's length.
+// It panics if v's Kind is not Array, Chan, Map, Slice, or String.
+func (v Value) Len() int {
+       k := v.kind()
+       switch k {
+       case Array:
+               tt := (*arrayType)(unsafe.Pointer(v.typ))
+               return int(tt.len)
+       case Chan:
+               return chanlen(v.pointer())
+       case Map:
+               return maplen(v.pointer())
+       case Slice:
+               // Slice is bigger than a word; assume flagIndir.
+               return (*sliceHeader)(v.ptr).Len
+       case String:
+               // String is bigger than a word; assume flagIndir.
+               return (*stringHeader)(v.ptr).Len
+       }
+       panic(&ValueError{"reflect.Value.Len", v.kind()})
+}
+
+// NumMethod returns the number of exported methods in the value's method set.
+func (v Value) numMethod() int {
+       if v.typ == nil {
+               panic(&ValueError{"reflectlite.Value.NumMethod", Invalid})
+       }
+       return v.typ.NumMethod()
+}
+
+// Set assigns x to the value v.
+// It panics if CanSet returns false.
+// As in Go, x's value must be assignable to v's type.
+func (v Value) Set(x Value) {
+       v.mustBeAssignable()
+       x.mustBeExported() // do not let unexported x leak
+       var target unsafe.Pointer
+       if v.kind() == Interface {
+               target = v.ptr
+       }
+       x = x.assignTo("reflectlite.Set", v.typ, target)
+       if x.flag&flagIndir != 0 {
+               typedmemmove(v.typ, v.ptr, x.ptr)
+       } else {
+               *(*unsafe.Pointer)(v.ptr) = x.ptr
+       }
+}
+
+// Type returns v's type.
+func (v Value) Type() Type {
+       f := v.flag
+       if f == 0 {
+               panic(&ValueError{"reflectlite.Value.Type", Invalid})
+       }
+       // Method values not supported.
+       return v.typ
+}
+
+// stringHeader is a safe version of StringHeader used within this package.
+type stringHeader struct {
+       Data unsafe.Pointer
+       Len  int
+}
+
+// sliceHeader is a safe version of SliceHeader used within this package.
+type sliceHeader struct {
+       Data unsafe.Pointer
+       Len  int
+       Cap  int
+}
+
+/*
+ * constructors
+ */
+
+// implemented in package runtime
+func unsafe_New(*rtype) unsafe.Pointer
+
+// ValueOf returns a new Value initialized to the concrete value
+// stored in the interface i. ValueOf(nil) returns the zero Value.
+func ValueOf(i interface{}) Value {
+       if i == nil {
+               return Value{}
+       }
+
+       // TODO: Maybe allow contents of a Value to live on the stack.
+       // For now we make the contents always escape to the heap. It
+       // makes life easier in a few places (see chanrecv/mapassign
+       // comment below).
+       escapes(i)
+
+       return unpackEface(i)
+}
+
+// assignTo returns a value v that can be assigned directly to typ.
+// It panics if v is not assignable to typ.
+// For a conversion to an interface type, target is a suggested scratch space to use.
+func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value {
+       // if v.flag&flagMethod != 0 {
+       //      v = makeMethodValue(context, v)
+       // }
+
+       switch {
+       case directlyAssignable(dst, v.typ):
+               // Overwrite type so that they match.
+               // Same memory layout, so no harm done.
+               fl := v.flag&(flagAddr|flagIndir) | v.flag.ro()
+               fl |= flag(dst.Kind())
+               return Value{dst, v.ptr, fl}
+
+       case implements(dst, v.typ):
+               if target == nil {
+                       target = unsafe_New(dst)
+               }
+               if v.Kind() == Interface && v.IsNil() {
+                       // A nil ReadWriter passed to nil Reader is OK,
+                       // but using ifaceE2I below will panic.
+                       // Avoid the panic by returning a nil dst (e.g., Reader) explicitly.
+                       return Value{dst, nil, flag(Interface)}
+               }
+               x := valueInterface(v)
+               if dst.NumMethod() == 0 {
+                       *(*interface{})(target) = x
+               } else {
+                       ifaceE2I(dst, x, target)
+               }
+               return Value{dst, target, flagIndir | flag(Interface)}
+       }
+
+       // Failed.
+       panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
+}
+
+// arrayAt returns the i-th element of p,
+// an array whose elements are eltSize bytes wide.
+// The array pointed at by p must have at least i+1 elements:
+// it is invalid (but impossible to check here) to pass i >= len,
+// because then the result will point outside the array.
+// whySafe must explain why i < len. (Passing "i < len" is fine;
+// the benefit is to surface this assumption at the call site.)
+func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer {
+       return add(p, uintptr(i)*eltSize, "i < len")
+}
+
+func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
+
+// typedmemmove copies a value of type t to dst from src.
+//go:noescape
+func typedmemmove(t *rtype, dst, src unsafe.Pointer)
+
+// Dummy annotation marking that the value x escapes,
+// for use in cases where the reflect code is so clever that
+// the compiler cannot follow.
+func escapes(x interface{}) {
+       if dummy.b {
+               dummy.x = x
+       }
+}
+
+var dummy struct {
+       b bool
+       x interface{}
+}
index a8edafb3c3b5aec036e4f34ede3532ad8e57f373..0bf87dc95c272b0d70a8bad3c733744a2eac964d 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build generate
+
 package windows
 
 //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go security_windows.go psapi_windows.go symlink_windows.go
index 077215351ef5bcaf0f1b24475ffcbebd6ea33b8b..fa8e27e8ff69bb8dfb3323a09e1acbf8ecb4dbea 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build generate
+
 package registry
 
 //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
index 7c6ad8fb7e064b4fcf99fd55fd753bb639251b31..610b733c4a9dc38096d531704b13ec1e9c9bc460 100644 (file)
@@ -4,6 +4,11 @@
 
 package windows
 
+import (
+       "syscall"
+       "unsafe"
+)
+
 const (
        FSCTL_SET_REPARSE_POINT    = 0x000900A4
        IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
@@ -15,6 +20,13 @@ const (
 // in https://msdn.microsoft.com/en-us/library/cc232007.aspx
 // and https://msdn.microsoft.com/en-us/library/cc232006.aspx.
 
+type REPARSE_DATA_BUFFER struct {
+       ReparseTag        uint32
+       ReparseDataLength uint16
+       Reserved          uint16
+       DUMMYUNIONNAME    byte
+}
+
 // REPARSE_DATA_BUFFER_HEADER is a common part of REPARSE_DATA_BUFFER structure.
 type REPARSE_DATA_BUFFER_HEADER struct {
        ReparseTag uint32
@@ -46,6 +58,12 @@ type SymbolicLinkReparseBuffer struct {
        PathBuffer [1]uint16
 }
 
+// Path returns path stored in rb.
+func (rb *SymbolicLinkReparseBuffer) Path() string {
+       p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))
+       return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2])
+}
+
 type MountPointReparseBuffer struct {
        // The integer that contains the offset, in bytes,
        // of the substitute name string in the PathBuffer array,
@@ -62,3 +80,9 @@ type MountPointReparseBuffer struct {
        PrintNameLength uint16
        PathBuffer      [1]uint16
 }
+
+// Path returns path stored in rb.
+func (rb *MountPointReparseBuffer) Path() string {
+       p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))
+       return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2])
+}
index 121132f6f7326b90cc12c6078995d159afb1dca8..099e91ed68c9b4303e51fdb55d16bf6968e9fed2 100644 (file)
@@ -305,3 +305,6 @@ const (
 func LoadGetFinalPathNameByHandle() error {
        return procGetFinalPathNameByHandleW.Find()
 }
+
+//sys  CreateEnvironmentBlock(block **uint16, token syscall.Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
+//sys  DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
index 4e0018f3877905ae1a82acfae4fd2e70173845ec..c587c19c77d45a31af9d77e18a30e35e627e1a81 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build windows
+
 // Package sysdll is an internal leaf package that records and reports
 // which Windows DLL names are used by Go itself. These DLLs are then
 // only loaded from the System32 directory. See Issue 14959.
index 9527a370a4e011aff92e6638311ca757110a57e3..ca5b4e6f16ddb3165718d12349e36865aaa5a353 100644 (file)
@@ -58,6 +58,8 @@ var (
        procNetShareAdd                  = modnetapi32.NewProc("NetShareAdd")
        procNetShareDel                  = modnetapi32.NewProc("NetShareDel")
        procGetFinalPathNameByHandleW    = modkernel32.NewProc("GetFinalPathNameByHandleW")
+       procCreateEnvironmentBlock       = moduserenv.NewProc("CreateEnvironmentBlock")
+       procDestroyEnvironmentBlock      = moduserenv.NewProc("DestroyEnvironmentBlock")
        procImpersonateSelf              = modadvapi32.NewProc("ImpersonateSelf")
        procRevertToSelf                 = modadvapi32.NewProc("RevertToSelf")
        procOpenThreadToken              = modadvapi32.NewProc("OpenThreadToken")
@@ -220,6 +222,36 @@ func GetFinalPathNameByHandle(file syscall.Handle, filePath *uint16, filePathSiz
        return
 }
 
+func CreateEnvironmentBlock(block **uint16, token syscall.Token, inheritExisting bool) (err error) {
+       var _p0 uint32
+       if inheritExisting {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procCreateEnvironmentBlock.Addr(), 3, uintptr(unsafe.Pointer(block)), uintptr(token), uintptr(_p0))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DestroyEnvironmentBlock(block *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procDestroyEnvironmentBlock.Addr(), 1, uintptr(unsafe.Pointer(block)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func ImpersonateSelf(impersonationlevel uint32) (err error) {
        r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(impersonationlevel), 0, 0)
        if r1 == 0 {
index 151869002f1fe431427688f8c1219ee7c4766b98..4e2c62c741a74bee3c51b2f597c0aad7cb77c31b 100644 (file)
@@ -19,6 +19,7 @@ import (
        "runtime"
        "strconv"
        "strings"
+       "sync"
        "testing"
 )
 
@@ -163,6 +164,24 @@ func MustHaveExec(t testing.TB) {
        }
 }
 
+var execPaths sync.Map // path -> error
+
+// MustHaveExecPath checks that the current system can start the named executable
+// using os.StartProcess or (more commonly) exec.Command.
+// If not, MustHaveExecPath calls t.Skip with an explanation.
+func MustHaveExecPath(t testing.TB, path string) {
+       MustHaveExec(t)
+
+       err, found := execPaths.Load(path)
+       if !found {
+               _, err = exec.LookPath(path)
+               err, _ = execPaths.LoadOrStore(path, err)
+       }
+       if err != nil {
+               t.Skipf("skipping test: %s: %s", path, err)
+       }
+}
+
 // HasExternalNetwork reports whether the current system can use
 // external (non-localhost) networks.
 func HasExternalNetwork() bool {
index da1cb90f5cdf3a35ec6d6bfabbec972d84f735f4..4f9c77041a942bee05136190790a34c3b09b58da 100644 (file)
@@ -79,6 +79,10 @@ func TestMMU(t *testing.T) {
 func TestMMUTrace(t *testing.T) {
        // Can't be t.Parallel() because it modifies the
        // testingOneBand package variable.
+       if testing.Short() {
+               // test input too big for all.bash
+               t.Skip("skipping in -short mode")
+       }
 
        data, err := ioutil.ReadFile("testdata/stress_1_10_good")
        if err != nil {
index c9afa68c3c36c3c6543cacff4d6cdc6bd0deef39..6d87970157751527aff0112c5f22e1fcc4b4c727 100644 (file)
@@ -7,6 +7,7 @@ package trace
 import (
        "bytes"
        "io/ioutil"
+       "os"
        "path/filepath"
        "strings"
        "testing"
@@ -38,9 +39,17 @@ func TestParseCanned(t *testing.T) {
                t.Fatalf("failed to read ./testdata: %v", err)
        }
        for _, f := range files {
-               data, err := ioutil.ReadFile(filepath.Join("./testdata", f.Name()))
+               name := filepath.Join("./testdata", f.Name())
+               info, err := os.Stat(name)
                if err != nil {
-                       t.Fatalf("failed to read input file: %v", err)
+                       t.Fatal(err)
+               }
+               if testing.Short() && info.Size() > 10000 {
+                       continue
+               }
+               data, err := ioutil.ReadFile(name)
+               if err != nil {
+                       t.Fatal(err)
                }
                // Instead of Parse that requires a proper binary name for old traces,
                // we use 'parse' that omits symbol lookup if an empty string is given.
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305.go
deleted file mode 100644 (file)
index 80789a1..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539.
-package chacha20poly1305
-
-import (
-       "crypto/cipher"
-       "encoding/binary"
-       "errors"
-)
-
-const (
-       // KeySize is the size of the key used by this AEAD, in bytes.
-       KeySize = 32
-       // NonceSize is the size of the nonce used with this AEAD, in bytes.
-       NonceSize = 12
-)
-
-type chacha20poly1305 struct {
-       key [8]uint32
-}
-
-// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key.
-func New(key []byte) (cipher.AEAD, error) {
-       if len(key) != KeySize {
-               return nil, errors.New("chacha20poly1305: bad key length")
-       }
-       ret := new(chacha20poly1305)
-       ret.key[0] = binary.LittleEndian.Uint32(key[0:4])
-       ret.key[1] = binary.LittleEndian.Uint32(key[4:8])
-       ret.key[2] = binary.LittleEndian.Uint32(key[8:12])
-       ret.key[3] = binary.LittleEndian.Uint32(key[12:16])
-       ret.key[4] = binary.LittleEndian.Uint32(key[16:20])
-       ret.key[5] = binary.LittleEndian.Uint32(key[20:24])
-       ret.key[6] = binary.LittleEndian.Uint32(key[24:28])
-       ret.key[7] = binary.LittleEndian.Uint32(key[28:32])
-       return ret, nil
-}
-
-func (c *chacha20poly1305) NonceSize() int {
-       return NonceSize
-}
-
-func (c *chacha20poly1305) Overhead() int {
-       return 16
-}
-
-func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte {
-       if len(nonce) != NonceSize {
-               panic("chacha20poly1305: bad nonce length passed to Seal")
-       }
-
-       if uint64(len(plaintext)) > (1<<38)-64 {
-               panic("chacha20poly1305: plaintext too large")
-       }
-
-       return c.seal(dst, nonce, plaintext, additionalData)
-}
-
-var errOpen = errors.New("chacha20poly1305: message authentication failed")
-
-func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
-       if len(nonce) != NonceSize {
-               panic("chacha20poly1305: bad nonce length passed to Open")
-       }
-       if len(ciphertext) < 16 {
-               return nil, errOpen
-       }
-       if uint64(len(ciphertext)) > (1<<38)-48 {
-               panic("chacha20poly1305: ciphertext too large")
-       }
-
-       return c.open(dst, nonce, ciphertext, additionalData)
-}
-
-// sliceForAppend takes a slice and a requested number of bytes. It returns a
-// slice with the contents of the given slice followed by that many bytes and a
-// second slice that aliases into it and contains only the extra bytes. If the
-// original slice has sufficient capacity then no allocation is performed.
-func sliceForAppend(in []byte, n int) (head, tail []byte) {
-       if total := len(in) + n; cap(in) >= total {
-               head = in[:total]
-       } else {
-               head = make([]byte, total)
-               copy(head, in)
-       }
-       tail = head[len(in):]
-       return
-}
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go
deleted file mode 100644 (file)
index 4e7b6ea..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.7,amd64,!gccgo,!appengine
-
-package chacha20poly1305
-
-import (
-       "encoding/binary"
-
-       "internal/cpu"
-)
-
-//go:noescape
-func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool
-
-//go:noescape
-func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte)
-
-var (
-       useASM  = cpu.X86.HasSSSE3
-       useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI2
-)
-
-// setupState writes a ChaCha20 input matrix to state. See
-// https://tools.ietf.org/html/rfc7539#section-2.3.
-func setupState(state *[16]uint32, key *[8]uint32, nonce []byte) {
-       state[0] = 0x61707865
-       state[1] = 0x3320646e
-       state[2] = 0x79622d32
-       state[3] = 0x6b206574
-
-       state[4] = key[0]
-       state[5] = key[1]
-       state[6] = key[2]
-       state[7] = key[3]
-       state[8] = key[4]
-       state[9] = key[5]
-       state[10] = key[6]
-       state[11] = key[7]
-
-       state[12] = 0
-       state[13] = binary.LittleEndian.Uint32(nonce[:4])
-       state[14] = binary.LittleEndian.Uint32(nonce[4:8])
-       state[15] = binary.LittleEndian.Uint32(nonce[8:12])
-}
-
-func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte {
-       if !useASM {
-               return c.sealGeneric(dst, nonce, plaintext, additionalData)
-       }
-
-       var state [16]uint32
-       setupState(&state, &c.key, nonce)
-
-       ret, out := sliceForAppend(dst, len(plaintext)+16)
-       chacha20Poly1305Seal(out[:], state[:], plaintext, additionalData)
-       return ret
-}
-
-func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
-       if !useASM {
-               return c.openGeneric(dst, nonce, ciphertext, additionalData)
-       }
-
-       var state [16]uint32
-       setupState(&state, &c.key, nonce)
-
-       ciphertext = ciphertext[:len(ciphertext)-16]
-       ret, out := sliceForAppend(dst, len(ciphertext))
-       if !chacha20Poly1305Open(out, state[:], ciphertext, additionalData) {
-               for i := range out {
-                       out[i] = 0
-               }
-               return nil, errOpen
-       }
-
-       return ret, nil
-}
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go
deleted file mode 100644 (file)
index a77ab35..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package chacha20poly1305
-
-import (
-       "encoding/binary"
-
-       "internal/x/crypto/internal/chacha20"
-       "internal/x/crypto/poly1305"
-)
-
-func roundTo16(n int) int {
-       return 16 * ((n + 15) / 16)
-}
-
-func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte {
-       ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize)
-
-       var polyKey [32]byte
-       s := chacha20.New(c.key, [3]uint32{
-               binary.LittleEndian.Uint32(nonce[0:4]),
-               binary.LittleEndian.Uint32(nonce[4:8]),
-               binary.LittleEndian.Uint32(nonce[8:12]),
-       })
-       s.XORKeyStream(polyKey[:], polyKey[:])
-       s.Advance() // skip the next 32 bytes
-       s.XORKeyStream(out, plaintext)
-
-       polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8)
-       copy(polyInput, additionalData)
-       copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)])
-       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData)))
-       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext)))
-
-       var tag [poly1305.TagSize]byte
-       poly1305.Sum(&tag, polyInput, &polyKey)
-       copy(out[len(plaintext):], tag[:])
-
-       return ret
-}
-
-func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
-       var tag [poly1305.TagSize]byte
-       copy(tag[:], ciphertext[len(ciphertext)-16:])
-       ciphertext = ciphertext[:len(ciphertext)-16]
-
-       var polyKey [32]byte
-       s := chacha20.New(c.key, [3]uint32{
-               binary.LittleEndian.Uint32(nonce[0:4]),
-               binary.LittleEndian.Uint32(nonce[4:8]),
-               binary.LittleEndian.Uint32(nonce[8:12]),
-       })
-       s.XORKeyStream(polyKey[:], polyKey[:])
-       s.Advance() // skip the next 32 bytes
-
-       polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8)
-       copy(polyInput, additionalData)
-       copy(polyInput[roundTo16(len(additionalData)):], ciphertext)
-       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData)))
-       binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext)))
-
-       ret, out := sliceForAppend(dst, len(ciphertext))
-       if !poly1305.Verify(&tag, polyInput, &polyKey) {
-               for i := range out {
-                       out[i] = 0
-               }
-               return nil, errOpen
-       }
-
-       s.XORKeyStream(out, ciphertext)
-       return ret, nil
-}
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go
deleted file mode 100644 (file)
index 4c2eb70..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64 !go1.7 gccgo appengine
-
-package chacha20poly1305
-
-func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte {
-       return c.sealGeneric(dst, nonce, plaintext, additionalData)
-}
-
-func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) {
-       return c.openGeneric(dst, nonce, ciphertext, additionalData)
-}
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go
deleted file mode 100644 (file)
index 78f981a..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package chacha20poly1305
-
-import (
-       "bytes"
-       cr "crypto/rand"
-       "encoding/hex"
-       mr "math/rand"
-       "testing"
-)
-
-func TestVectors(t *testing.T) {
-       for i, test := range chacha20Poly1305Tests {
-               key, _ := hex.DecodeString(test.key)
-               nonce, _ := hex.DecodeString(test.nonce)
-               ad, _ := hex.DecodeString(test.aad)
-               plaintext, _ := hex.DecodeString(test.plaintext)
-
-               aead, err := New(key)
-               if err != nil {
-                       t.Fatal(err)
-               }
-
-               ct := aead.Seal(nil, nonce, plaintext, ad)
-               if ctHex := hex.EncodeToString(ct); ctHex != test.out {
-                       t.Errorf("#%d: got %s, want %s", i, ctHex, test.out)
-                       continue
-               }
-
-               plaintext2, err := aead.Open(nil, nonce, ct, ad)
-               if err != nil {
-                       t.Errorf("#%d: Open failed", i)
-                       continue
-               }
-
-               if !bytes.Equal(plaintext, plaintext2) {
-                       t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext)
-                       continue
-               }
-
-               if len(ad) > 0 {
-                       alterAdIdx := mr.Intn(len(ad))
-                       ad[alterAdIdx] ^= 0x80
-                       if _, err := aead.Open(nil, nonce, ct, ad); err == nil {
-                               t.Errorf("#%d: Open was successful after altering additional data", i)
-                       }
-                       ad[alterAdIdx] ^= 0x80
-               }
-
-               alterNonceIdx := mr.Intn(aead.NonceSize())
-               nonce[alterNonceIdx] ^= 0x80
-               if _, err := aead.Open(nil, nonce, ct, ad); err == nil {
-                       t.Errorf("#%d: Open was successful after altering nonce", i)
-               }
-               nonce[alterNonceIdx] ^= 0x80
-
-               alterCtIdx := mr.Intn(len(ct))
-               ct[alterCtIdx] ^= 0x80
-               if _, err := aead.Open(nil, nonce, ct, ad); err == nil {
-                       t.Errorf("#%d: Open was successful after altering ciphertext", i)
-               }
-               ct[alterCtIdx] ^= 0x80
-       }
-}
-
-func TestRandom(t *testing.T) {
-       // Some random tests to verify Open(Seal) == Plaintext
-       for i := 0; i < 256; i++ {
-               var nonce [12]byte
-               var key [32]byte
-
-               al := mr.Intn(128)
-               pl := mr.Intn(16384)
-               ad := make([]byte, al)
-               plaintext := make([]byte, pl)
-               cr.Read(key[:])
-               cr.Read(nonce[:])
-               cr.Read(ad)
-               cr.Read(plaintext)
-
-               aead, err := New(key[:])
-               if err != nil {
-                       t.Fatal(err)
-               }
-
-               ct := aead.Seal(nil, nonce[:], plaintext, ad)
-
-               plaintext2, err := aead.Open(nil, nonce[:], ct, ad)
-               if err != nil {
-                       t.Errorf("Random #%d: Open failed", i)
-                       continue
-               }
-
-               if !bytes.Equal(plaintext, plaintext2) {
-                       t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext)
-                       continue
-               }
-
-               if len(ad) > 0 {
-                       alterAdIdx := mr.Intn(len(ad))
-                       ad[alterAdIdx] ^= 0x80
-                       if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil {
-                               t.Errorf("Random #%d: Open was successful after altering additional data", i)
-                       }
-                       ad[alterAdIdx] ^= 0x80
-               }
-
-               alterNonceIdx := mr.Intn(aead.NonceSize())
-               nonce[alterNonceIdx] ^= 0x80
-               if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil {
-                       t.Errorf("Random #%d: Open was successful after altering nonce", i)
-               }
-               nonce[alterNonceIdx] ^= 0x80
-
-               alterCtIdx := mr.Intn(len(ct))
-               ct[alterCtIdx] ^= 0x80
-               if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil {
-                       t.Errorf("Random #%d: Open was successful after altering ciphertext", i)
-               }
-               ct[alterCtIdx] ^= 0x80
-       }
-}
-
-func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) {
-       b.SetBytes(int64(len(buf)))
-
-       var key [32]byte
-       var nonce [12]byte
-       var ad [13]byte
-       var out []byte
-
-       aead, _ := New(key[:])
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
-               out = aead.Seal(out[:0], nonce[:], buf[:], ad[:])
-       }
-}
-
-func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) {
-       b.SetBytes(int64(len(buf)))
-
-       var key [32]byte
-       var nonce [12]byte
-       var ad [13]byte
-       var ct []byte
-       var out []byte
-
-       aead, _ := New(key[:])
-       ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:])
-
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
-               out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:])
-       }
-}
-
-func BenchmarkChacha20Poly1305Open_64(b *testing.B) {
-       benchamarkChaCha20Poly1305Open(b, make([]byte, 64))
-}
-
-func BenchmarkChacha20Poly1305Seal_64(b *testing.B) {
-       benchamarkChaCha20Poly1305Seal(b, make([]byte, 64))
-}
-
-func BenchmarkChacha20Poly1305Open_1350(b *testing.B) {
-       benchamarkChaCha20Poly1305Open(b, make([]byte, 1350))
-}
-
-func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) {
-       benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350))
-}
-
-func BenchmarkChacha20Poly1305Open_8K(b *testing.B) {
-       benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024))
-}
-
-func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) {
-       benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024))
-}
diff --git a/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go b/libgo/go/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go
deleted file mode 100644 (file)
index 64f6a72..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package chacha20poly1305
-
-var chacha20Poly1305Tests = []struct {
-       plaintext, aad, key, nonce, out string
-}{
-       {
-               "",
-               "",
-               "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
-               "070000004041424344454647",
-               "a0784d7a4716f3feb4f64e7f4b39bf04",
-       },
-       {
-               "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e",
-               "50515253c0c1c2c3c4c5c6c7",
-               "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
-               "070000004041424344454647",
-               "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691",
-       },
-       {
-               "1400000cebccee3bf561b292340fec60",
-               "00000000000000001603030010",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163",
-       },
-       {
-               "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-               "00000000000000000000000000",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa",
-       },
-       {
-               "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87",
-               "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1",
-               "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f",
-               "4349e2131d44dc711148dfe3",
-               "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb",
-       },
-       {
-               "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad",
-               "85deea3dc4",
-               "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7",
-               "b34710f65aed442e4a40866b",
-               "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0",
-       },
-       {
-               "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5",
-               "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5",
-               "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e",
-               "2bbca0910cc47ca0b8517391",
-               "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f",
-       },
-       {
-               "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337",
-               "74ba3372d308910b5c9c3885f41252d57556",
-               "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3",
-               "b928935c4c966c60fd6583c0",
-               "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d",
-       },
-       {
-               "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b",
-               "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4",
-               "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093",
-               "8998e043d2961afa51ea262a",
-               "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7",
-       },
-       {
-               "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e",
-               "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7",
-               "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975",
-               "aeb6159fa88bb1ffd51d036d",
-               "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e",
-       },
-       {
-               "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296",
-               "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14",
-               "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c",
-               "4c46854e9e101090b1436f90",
-               "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb",
-       },
-       {
-               "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9",
-               "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521",
-               "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87",
-               "eaa4d916d261676d632455be",
-               "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd",
-       },
-       {
-               "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90",
-               "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a",
-               "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089",
-               "2403fe689e239c2ed261b381",
-               "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91",
-       },
-       {
-               "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae",
-               "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974",
-               "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be",
-               "231b5780fedfb06d724450b3",
-               "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7",
-       },
-       {
-               "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91",
-               "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3",
-               "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97",
-               "1e46a7486c5a03fd6758d938",
-               "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf",
-       },
-       {
-               "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf",
-               "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae",
-               "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369",
-               "e14de73c4b17581a7e0d0649",
-               "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d",
-       },
-       {
-               "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5",
-               "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81",
-               "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6",
-               "bb2d033de71d570ddf824e85",
-               "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2",
-       },
-       {
-               "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65",
-               "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497",
-               "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d",
-               "350287a6bed5709dfba3d35c",
-               "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95",
-       },
-       {
-               "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5",
-               "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68",
-               "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c",
-               "c0494bb7249f864f69beab46",
-               "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081",
-       },
-       {
-               "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c",
-               "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5",
-               "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7",
-               "674a516f8f59f9067e0485e3",
-               "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc",
-       },
-       {
-               "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c",
-               "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85",
-               "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b",
-               "8726dc5cae9497936658f603",
-               "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465",
-       },
-       {
-               "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c",
-               "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94",
-               "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea",
-               "b633c1a0e1ddf4727b149b3d",
-               "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527",
-       },
-       {
-               "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c",
-               "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655",
-               "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9",
-               "9f1d08be539f1244f0f69ad2",
-               "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a",
-       },
-       {
-               "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271",
-               "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442",
-               "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1",
-               "952f492fe00b26028c560fc6",
-               "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053",
-       },
-       {
-               "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34",
-               "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f",
-               "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769",
-               "7d3981073f90c6648c5e9c74",
-               "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7",
-       },
-       {
-               "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf",
-               "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062",
-               "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc",
-               "5f6267f6b3b21423267310e6",
-               "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5",
-       },
-       {
-               "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607",
-               "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd",
-               "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f",
-               "240cb25aaae4d085bbb747a5",
-               "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500",
-       },
-       {
-               "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e",
-               "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597",
-               "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31",
-               "d9ce7d249af9496e99c93b36",
-               "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb",
-       },
-       {
-               "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1",
-               "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555",
-               "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd",
-               "7df9824e774c5f86d83cb5d8",
-               "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f",
-       },
-       {
-               "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092",
-               "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5",
-               "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a",
-               "588d9bc1d98210d9700ef488",
-               "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3",
-       },
-       {
-               "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831",
-               "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f",
-               "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34",
-               "34a04df283c45655a52bdd84",
-               "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784",
-       },
-       {
-               "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154",
-               "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9",
-               "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6",
-               "bb21211f342379370f2642d3",
-               "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8",
-       },
-       {
-               "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459",
-               "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a",
-               "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb",
-               "47cc9eea11f9f3f9aafa23bd",
-               "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964",
-       },
-       {
-               "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768",
-               "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33",
-               "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b",
-               "e88c14ef96c7768f5dba9de9",
-               "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc",
-       },
-       {
-               "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64",
-               "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d",
-               "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81",
-               "36c79f9f14d431cc8c077439",
-               "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d",
-       },
-       {
-               "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30",
-               "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083",
-               "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55",
-               "7812a320691ca8442767a51a",
-               "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb",
-       },
-       {
-               "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e",
-               "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837",
-               "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c",
-               "e4709d225a552e90fb357413",
-               "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75",
-       },
-       {
-               "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718",
-               "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9",
-               "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257",
-               "8bf183347ec1ca4bceff3374",
-               "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b",
-               "0942e506c433afcda3847f2dad",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314",
-               "d3d934f75ea0f210a8f6059401",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314",
-               "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b",
-               "bc",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0",
-               "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d",
-       },
-       {
-               "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525",
-               "",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5",
-       },
-       {
-               "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a",
-               "026866d46aa940309fdcabf92a324fbc",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00",
-       },
-       {
-               "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9",
-               "56",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b",
-       },
-       {
-               "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2",
-               "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6",
-               "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e",
-               "129039b5572e8a7a8131f76a",
-               "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54",
-       },
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/asn1.go b/libgo/go/internal/x/crypto/cryptobyte/asn1.go
deleted file mode 100644 (file)
index 2d40680..0000000
+++ /dev/null
@@ -1,751 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cryptobyte
-
-import (
-       encoding_asn1 "encoding/asn1"
-       "fmt"
-       "math/big"
-       "reflect"
-       "time"
-
-       "internal/x/crypto/cryptobyte/asn1"
-)
-
-// This file contains ASN.1-related methods for String and Builder.
-
-// Builder
-
-// AddASN1Int64 appends a DER-encoded ASN.1 INTEGER.
-func (b *Builder) AddASN1Int64(v int64) {
-       b.addASN1Signed(asn1.INTEGER, v)
-}
-
-// AddASN1Int64WithTag appends a DER-encoded ASN.1 INTEGER with the
-// given tag.
-func (b *Builder) AddASN1Int64WithTag(v int64, tag asn1.Tag) {
-       b.addASN1Signed(tag, v)
-}
-
-// AddASN1Enum appends a DER-encoded ASN.1 ENUMERATION.
-func (b *Builder) AddASN1Enum(v int64) {
-       b.addASN1Signed(asn1.ENUM, v)
-}
-
-func (b *Builder) addASN1Signed(tag asn1.Tag, v int64) {
-       b.AddASN1(tag, func(c *Builder) {
-               length := 1
-               for i := v; i >= 0x80 || i < -0x80; i >>= 8 {
-                       length++
-               }
-
-               for ; length > 0; length-- {
-                       i := v >> uint((length-1)*8) & 0xff
-                       c.AddUint8(uint8(i))
-               }
-       })
-}
-
-// AddASN1Uint64 appends a DER-encoded ASN.1 INTEGER.
-func (b *Builder) AddASN1Uint64(v uint64) {
-       b.AddASN1(asn1.INTEGER, func(c *Builder) {
-               length := 1
-               for i := v; i >= 0x80; i >>= 8 {
-                       length++
-               }
-
-               for ; length > 0; length-- {
-                       i := v >> uint((length-1)*8) & 0xff
-                       c.AddUint8(uint8(i))
-               }
-       })
-}
-
-// AddASN1BigInt appends a DER-encoded ASN.1 INTEGER.
-func (b *Builder) AddASN1BigInt(n *big.Int) {
-       if b.err != nil {
-               return
-       }
-
-       b.AddASN1(asn1.INTEGER, func(c *Builder) {
-               if n.Sign() < 0 {
-                       // A negative number has to be converted to two's-complement form. So we
-                       // invert and subtract 1. If the most-significant-bit isn't set then
-                       // we'll need to pad the beginning with 0xff in order to keep the number
-                       // negative.
-                       nMinus1 := new(big.Int).Neg(n)
-                       nMinus1.Sub(nMinus1, bigOne)
-                       bytes := nMinus1.Bytes()
-                       for i := range bytes {
-                               bytes[i] ^= 0xff
-                       }
-                       if bytes[0]&0x80 == 0 {
-                               c.add(0xff)
-                       }
-                       c.add(bytes...)
-               } else if n.Sign() == 0 {
-                       c.add(0)
-               } else {
-                       bytes := n.Bytes()
-                       if bytes[0]&0x80 != 0 {
-                               c.add(0)
-                       }
-                       c.add(bytes...)
-               }
-       })
-}
-
-// AddASN1OctetString appends a DER-encoded ASN.1 OCTET STRING.
-func (b *Builder) AddASN1OctetString(bytes []byte) {
-       b.AddASN1(asn1.OCTET_STRING, func(c *Builder) {
-               c.AddBytes(bytes)
-       })
-}
-
-const generalizedTimeFormatStr = "20060102150405Z0700"
-
-// AddASN1GeneralizedTime appends a DER-encoded ASN.1 GENERALIZEDTIME.
-func (b *Builder) AddASN1GeneralizedTime(t time.Time) {
-       if t.Year() < 0 || t.Year() > 9999 {
-               b.err = fmt.Errorf("cryptobyte: cannot represent %v as a GeneralizedTime", t)
-               return
-       }
-       b.AddASN1(asn1.GeneralizedTime, func(c *Builder) {
-               c.AddBytes([]byte(t.Format(generalizedTimeFormatStr)))
-       })
-}
-
-// AddASN1BitString appends a DER-encoded ASN.1 BIT STRING. This does not
-// support BIT STRINGs that are not a whole number of bytes.
-func (b *Builder) AddASN1BitString(data []byte) {
-       b.AddASN1(asn1.BIT_STRING, func(b *Builder) {
-               b.AddUint8(0)
-               b.AddBytes(data)
-       })
-}
-
-func (b *Builder) addBase128Int(n int64) {
-       var length int
-       if n == 0 {
-               length = 1
-       } else {
-               for i := n; i > 0; i >>= 7 {
-                       length++
-               }
-       }
-
-       for i := length - 1; i >= 0; i-- {
-               o := byte(n >> uint(i*7))
-               o &= 0x7f
-               if i != 0 {
-                       o |= 0x80
-               }
-
-               b.add(o)
-       }
-}
-
-func isValidOID(oid encoding_asn1.ObjectIdentifier) bool {
-       if len(oid) < 2 {
-               return false
-       }
-
-       if oid[0] > 2 || (oid[0] <= 1 && oid[1] >= 40) {
-               return false
-       }
-
-       for _, v := range oid {
-               if v < 0 {
-                       return false
-               }
-       }
-
-       return true
-}
-
-func (b *Builder) AddASN1ObjectIdentifier(oid encoding_asn1.ObjectIdentifier) {
-       b.AddASN1(asn1.OBJECT_IDENTIFIER, func(b *Builder) {
-               if !isValidOID(oid) {
-                       b.err = fmt.Errorf("cryptobyte: invalid OID: %v", oid)
-                       return
-               }
-
-               b.addBase128Int(int64(oid[0])*40 + int64(oid[1]))
-               for _, v := range oid[2:] {
-                       b.addBase128Int(int64(v))
-               }
-       })
-}
-
-func (b *Builder) AddASN1Boolean(v bool) {
-       b.AddASN1(asn1.BOOLEAN, func(b *Builder) {
-               if v {
-                       b.AddUint8(0xff)
-               } else {
-                       b.AddUint8(0)
-               }
-       })
-}
-
-func (b *Builder) AddASN1NULL() {
-       b.add(uint8(asn1.NULL), 0)
-}
-
-// MarshalASN1 calls encoding_asn1.Marshal on its input and appends the result if
-// successful or records an error if one occurred.
-func (b *Builder) MarshalASN1(v interface{}) {
-       // NOTE(martinkr): This is somewhat of a hack to allow propagation of
-       // encoding_asn1.Marshal errors into Builder.err. N.B. if you call MarshalASN1 with a
-       // value embedded into a struct, its tag information is lost.
-       if b.err != nil {
-               return
-       }
-       bytes, err := encoding_asn1.Marshal(v)
-       if err != nil {
-               b.err = err
-               return
-       }
-       b.AddBytes(bytes)
-}
-
-// AddASN1 appends an ASN.1 object. The object is prefixed with the given tag.
-// Tags greater than 30 are not supported and result in an error (i.e.
-// low-tag-number form only). The child builder passed to the
-// BuilderContinuation can be used to build the content of the ASN.1 object.
-func (b *Builder) AddASN1(tag asn1.Tag, f BuilderContinuation) {
-       if b.err != nil {
-               return
-       }
-       // Identifiers with the low five bits set indicate high-tag-number format
-       // (two or more octets), which we don't support.
-       if tag&0x1f == 0x1f {
-               b.err = fmt.Errorf("cryptobyte: high-tag number identifier octects not supported: 0x%x", tag)
-               return
-       }
-       b.AddUint8(uint8(tag))
-       b.addLengthPrefixed(1, true, f)
-}
-
-// String
-
-// ReadASN1Boolean decodes an ASN.1 INTEGER and converts it to a boolean
-// representation into out and advances. It reports whether the read
-// was successful.
-func (s *String) ReadASN1Boolean(out *bool) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.INTEGER) || len(bytes) != 1 {
-               return false
-       }
-
-       switch bytes[0] {
-       case 0:
-               *out = false
-       case 0xff:
-               *out = true
-       default:
-               return false
-       }
-
-       return true
-}
-
-var bigIntType = reflect.TypeOf((*big.Int)(nil)).Elem()
-
-// ReadASN1Integer decodes an ASN.1 INTEGER into out and advances. If out does
-// not point to an integer or to a big.Int, it panics. It reports whether the
-// read was successful.
-func (s *String) ReadASN1Integer(out interface{}) bool {
-       if reflect.TypeOf(out).Kind() != reflect.Ptr {
-               panic("out is not a pointer")
-       }
-       switch reflect.ValueOf(out).Elem().Kind() {
-       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-               var i int64
-               if !s.readASN1Int64(&i) || reflect.ValueOf(out).Elem().OverflowInt(i) {
-                       return false
-               }
-               reflect.ValueOf(out).Elem().SetInt(i)
-               return true
-       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-               var u uint64
-               if !s.readASN1Uint64(&u) || reflect.ValueOf(out).Elem().OverflowUint(u) {
-                       return false
-               }
-               reflect.ValueOf(out).Elem().SetUint(u)
-               return true
-       case reflect.Struct:
-               if reflect.TypeOf(out).Elem() == bigIntType {
-                       return s.readASN1BigInt(out.(*big.Int))
-               }
-       }
-       panic("out does not point to an integer type")
-}
-
-func checkASN1Integer(bytes []byte) bool {
-       if len(bytes) == 0 {
-               // An INTEGER is encoded with at least one octet.
-               return false
-       }
-       if len(bytes) == 1 {
-               return true
-       }
-       if bytes[0] == 0 && bytes[1]&0x80 == 0 || bytes[0] == 0xff && bytes[1]&0x80 == 0x80 {
-               // Value is not minimally encoded.
-               return false
-       }
-       return true
-}
-
-var bigOne = big.NewInt(1)
-
-func (s *String) readASN1BigInt(out *big.Int) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) {
-               return false
-       }
-       if bytes[0]&0x80 == 0x80 {
-               // Negative number.
-               neg := make([]byte, len(bytes))
-               for i, b := range bytes {
-                       neg[i] = ^b
-               }
-               out.SetBytes(neg)
-               out.Add(out, bigOne)
-               out.Neg(out)
-       } else {
-               out.SetBytes(bytes)
-       }
-       return true
-}
-
-func (s *String) readASN1Int64(out *int64) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) || !asn1Signed(out, bytes) {
-               return false
-       }
-       return true
-}
-
-func asn1Signed(out *int64, n []byte) bool {
-       length := len(n)
-       if length > 8 {
-               return false
-       }
-       for i := 0; i < length; i++ {
-               *out <<= 8
-               *out |= int64(n[i])
-       }
-       // Shift up and down in order to sign extend the result.
-       *out <<= 64 - uint8(length)*8
-       *out >>= 64 - uint8(length)*8
-       return true
-}
-
-func (s *String) readASN1Uint64(out *uint64) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.INTEGER) || !checkASN1Integer(bytes) || !asn1Unsigned(out, bytes) {
-               return false
-       }
-       return true
-}
-
-func asn1Unsigned(out *uint64, n []byte) bool {
-       length := len(n)
-       if length > 9 || length == 9 && n[0] != 0 {
-               // Too large for uint64.
-               return false
-       }
-       if n[0]&0x80 != 0 {
-               // Negative number.
-               return false
-       }
-       for i := 0; i < length; i++ {
-               *out <<= 8
-               *out |= uint64(n[i])
-       }
-       return true
-}
-
-// ReadASN1Int64WithTag decodes an ASN.1 INTEGER with the given tag into out
-// and advances. It reports whether the read was successful and resulted in a
-// value that can be represented in an int64.
-func (s *String) ReadASN1Int64WithTag(out *int64, tag asn1.Tag) bool {
-       var bytes String
-       return s.ReadASN1(&bytes, tag) && checkASN1Integer(bytes) && asn1Signed(out, bytes)
-}
-
-// ReadASN1Enum decodes an ASN.1 ENUMERATION into out and advances. It reports
-// whether the read was successful.
-func (s *String) ReadASN1Enum(out *int) bool {
-       var bytes String
-       var i int64
-       if !s.ReadASN1(&bytes, asn1.ENUM) || !checkASN1Integer(bytes) || !asn1Signed(&i, bytes) {
-               return false
-       }
-       if int64(int(i)) != i {
-               return false
-       }
-       *out = int(i)
-       return true
-}
-
-func (s *String) readBase128Int(out *int) bool {
-       ret := 0
-       for i := 0; len(*s) > 0; i++ {
-               if i == 4 {
-                       return false
-               }
-               ret <<= 7
-               b := s.read(1)[0]
-               ret |= int(b & 0x7f)
-               if b&0x80 == 0 {
-                       *out = ret
-                       return true
-               }
-       }
-       return false // truncated
-}
-
-// ReadASN1ObjectIdentifier decodes an ASN.1 OBJECT IDENTIFIER into out and
-// advances. It reports whether the read was successful.
-func (s *String) ReadASN1ObjectIdentifier(out *encoding_asn1.ObjectIdentifier) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.OBJECT_IDENTIFIER) || len(bytes) == 0 {
-               return false
-       }
-
-       // In the worst case, we get two elements from the first byte (which is
-       // encoded differently) and then every varint is a single byte long.
-       components := make([]int, len(bytes)+1)
-
-       // The first varint is 40*value1 + value2:
-       // According to this packing, value1 can take the values 0, 1 and 2 only.
-       // When value1 = 0 or value1 = 1, then value2 is <= 39. When value1 = 2,
-       // then there are no restrictions on value2.
-       var v int
-       if !bytes.readBase128Int(&v) {
-               return false
-       }
-       if v < 80 {
-               components[0] = v / 40
-               components[1] = v % 40
-       } else {
-               components[0] = 2
-               components[1] = v - 80
-       }
-
-       i := 2
-       for ; len(bytes) > 0; i++ {
-               if !bytes.readBase128Int(&v) {
-                       return false
-               }
-               components[i] = v
-       }
-       *out = components[:i]
-       return true
-}
-
-// ReadASN1GeneralizedTime decodes an ASN.1 GENERALIZEDTIME into out and
-// advances. It reports whether the read was successful.
-func (s *String) ReadASN1GeneralizedTime(out *time.Time) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.GeneralizedTime) {
-               return false
-       }
-       t := string(bytes)
-       res, err := time.Parse(generalizedTimeFormatStr, t)
-       if err != nil {
-               return false
-       }
-       if serialized := res.Format(generalizedTimeFormatStr); serialized != t {
-               return false
-       }
-       *out = res
-       return true
-}
-
-// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances.
-// It reports whether the read was successful.
-func (s *String) ReadASN1BitString(out *encoding_asn1.BitString) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 {
-               return false
-       }
-
-       paddingBits := uint8(bytes[0])
-       bytes = bytes[1:]
-       if paddingBits > 7 ||
-               len(bytes) == 0 && paddingBits != 0 ||
-               len(bytes) > 0 && bytes[len(bytes)-1]&(1<<paddingBits-1) != 0 {
-               return false
-       }
-
-       out.BitLength = len(bytes)*8 - int(paddingBits)
-       out.Bytes = bytes
-       return true
-}
-
-// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances. It is
-// an error if the BIT STRING is not a whole number of bytes. It reports
-// whether the read was successful.
-func (s *String) ReadASN1BitStringAsBytes(out *[]byte) bool {
-       var bytes String
-       if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 {
-               return false
-       }
-
-       paddingBits := uint8(bytes[0])
-       if paddingBits != 0 {
-               return false
-       }
-       *out = bytes[1:]
-       return true
-}
-
-// ReadASN1Bytes reads the contents of a DER-encoded ASN.1 element (not including
-// tag and length bytes) into out, and advances. The element must match the
-// given tag. It reports whether the read was successful.
-func (s *String) ReadASN1Bytes(out *[]byte, tag asn1.Tag) bool {
-       return s.ReadASN1((*String)(out), tag)
-}
-
-// ReadASN1 reads the contents of a DER-encoded ASN.1 element (not including
-// tag and length bytes) into out, and advances. The element must match the
-// given tag. It reports whether the read was successful.
-//
-// Tags greater than 30 are not supported (i.e. low-tag-number format only).
-func (s *String) ReadASN1(out *String, tag asn1.Tag) bool {
-       var t asn1.Tag
-       if !s.ReadAnyASN1(out, &t) || t != tag {
-               return false
-       }
-       return true
-}
-
-// ReadASN1Element reads the contents of a DER-encoded ASN.1 element (including
-// tag and length bytes) into out, and advances. The element must match the
-// given tag. It reports whether the read was successful.
-//
-// Tags greater than 30 are not supported (i.e. low-tag-number format only).
-func (s *String) ReadASN1Element(out *String, tag asn1.Tag) bool {
-       var t asn1.Tag
-       if !s.ReadAnyASN1Element(out, &t) || t != tag {
-               return false
-       }
-       return true
-}
-
-// ReadAnyASN1 reads the contents of a DER-encoded ASN.1 element (not including
-// tag and length bytes) into out, sets outTag to its tag, and advances.
-// It reports whether the read was successful.
-//
-// Tags greater than 30 are not supported (i.e. low-tag-number format only).
-func (s *String) ReadAnyASN1(out *String, outTag *asn1.Tag) bool {
-       return s.readASN1(out, outTag, true /* skip header */)
-}
-
-// ReadAnyASN1Element reads the contents of a DER-encoded ASN.1 element
-// (including tag and length bytes) into out, sets outTag to is tag, and
-// advances. It reports whether the read was successful.
-//
-// Tags greater than 30 are not supported (i.e. low-tag-number format only).
-func (s *String) ReadAnyASN1Element(out *String, outTag *asn1.Tag) bool {
-       return s.readASN1(out, outTag, false /* include header */)
-}
-
-// PeekASN1Tag reports whether the next ASN.1 value on the string starts with
-// the given tag.
-func (s String) PeekASN1Tag(tag asn1.Tag) bool {
-       if len(s) == 0 {
-               return false
-       }
-       return asn1.Tag(s[0]) == tag
-}
-
-// SkipASN1 reads and discards an ASN.1 element with the given tag. It
-// reports whether the operation was successful.
-func (s *String) SkipASN1(tag asn1.Tag) bool {
-       var unused String
-       return s.ReadASN1(&unused, tag)
-}
-
-// ReadOptionalASN1 attempts to read the contents of a DER-encoded ASN.1
-// element (not including tag and length bytes) tagged with the given tag into
-// out. It stores whether an element with the tag was found in outPresent,
-// unless outPresent is nil. It reports whether the read was successful.
-func (s *String) ReadOptionalASN1(out *String, outPresent *bool, tag asn1.Tag) bool {
-       present := s.PeekASN1Tag(tag)
-       if outPresent != nil {
-               *outPresent = present
-       }
-       if present && !s.ReadASN1(out, tag) {
-               return false
-       }
-       return true
-}
-
-// SkipOptionalASN1 advances s over an ASN.1 element with the given tag, or
-// else leaves s unchanged. It reports whether the operation was successful.
-func (s *String) SkipOptionalASN1(tag asn1.Tag) bool {
-       if !s.PeekASN1Tag(tag) {
-               return true
-       }
-       var unused String
-       return s.ReadASN1(&unused, tag)
-}
-
-// ReadOptionalASN1Integer attempts to read an optional ASN.1 INTEGER
-// explicitly tagged with tag into out and advances. If no element with a
-// matching tag is present, it writes defaultValue into out instead. If out
-// does not point to an integer or to a big.Int, it panics. It reports
-// whether the read was successful.
-func (s *String) ReadOptionalASN1Integer(out interface{}, tag asn1.Tag, defaultValue interface{}) bool {
-       if reflect.TypeOf(out).Kind() != reflect.Ptr {
-               panic("out is not a pointer")
-       }
-       var present bool
-       var i String
-       if !s.ReadOptionalASN1(&i, &present, tag) {
-               return false
-       }
-       if !present {
-               switch reflect.ValueOf(out).Elem().Kind() {
-               case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
-                       reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-                       reflect.ValueOf(out).Elem().Set(reflect.ValueOf(defaultValue))
-               case reflect.Struct:
-                       if reflect.TypeOf(out).Elem() != bigIntType {
-                               panic("invalid integer type")
-                       }
-                       if reflect.TypeOf(defaultValue).Kind() != reflect.Ptr ||
-                               reflect.TypeOf(defaultValue).Elem() != bigIntType {
-                               panic("out points to big.Int, but defaultValue does not")
-                       }
-                       out.(*big.Int).Set(defaultValue.(*big.Int))
-               default:
-                       panic("invalid integer type")
-               }
-               return true
-       }
-       if !i.ReadASN1Integer(out) || !i.Empty() {
-               return false
-       }
-       return true
-}
-
-// ReadOptionalASN1OctetString attempts to read an optional ASN.1 OCTET STRING
-// explicitly tagged with tag into out and advances. If no element with a
-// matching tag is present, it sets "out" to nil instead. It reports
-// whether the read was successful.
-func (s *String) ReadOptionalASN1OctetString(out *[]byte, outPresent *bool, tag asn1.Tag) bool {
-       var present bool
-       var child String
-       if !s.ReadOptionalASN1(&child, &present, tag) {
-               return false
-       }
-       if outPresent != nil {
-               *outPresent = present
-       }
-       if present {
-               var oct String
-               if !child.ReadASN1(&oct, asn1.OCTET_STRING) || !child.Empty() {
-                       return false
-               }
-               *out = oct
-       } else {
-               *out = nil
-       }
-       return true
-}
-
-// ReadOptionalASN1Boolean sets *out to the value of the next ASN.1 BOOLEAN or,
-// if the next bytes are not an ASN.1 BOOLEAN, to the value of defaultValue.
-// It reports whether the operation was successful.
-func (s *String) ReadOptionalASN1Boolean(out *bool, defaultValue bool) bool {
-       var present bool
-       var child String
-       if !s.ReadOptionalASN1(&child, &present, asn1.BOOLEAN) {
-               return false
-       }
-
-       if !present {
-               *out = defaultValue
-               return true
-       }
-
-       return s.ReadASN1Boolean(out)
-}
-
-func (s *String) readASN1(out *String, outTag *asn1.Tag, skipHeader bool) bool {
-       if len(*s) < 2 {
-               return false
-       }
-       tag, lenByte := (*s)[0], (*s)[1]
-
-       if tag&0x1f == 0x1f {
-               // ITU-T X.690 section 8.1.2
-               //
-               // An identifier octet with a tag part of 0x1f indicates a high-tag-number
-               // form identifier with two or more octets. We only support tags less than
-               // 31 (i.e. low-tag-number form, single octet identifier).
-               return false
-       }
-
-       if outTag != nil {
-               *outTag = asn1.Tag(tag)
-       }
-
-       // ITU-T X.690 section 8.1.3
-       //
-       // Bit 8 of the first length byte indicates whether the length is short- or
-       // long-form.
-       var length, headerLen uint32 // length includes headerLen
-       if lenByte&0x80 == 0 {
-               // Short-form length (section 8.1.3.4), encoded in bits 1-7.
-               length = uint32(lenByte) + 2
-               headerLen = 2
-       } else {
-               // Long-form length (section 8.1.3.5). Bits 1-7 encode the number of octets
-               // used to encode the length.
-               lenLen := lenByte & 0x7f
-               var len32 uint32
-
-               if lenLen == 0 || lenLen > 4 || len(*s) < int(2+lenLen) {
-                       return false
-               }
-
-               lenBytes := String((*s)[2 : 2+lenLen])
-               if !lenBytes.readUnsigned(&len32, int(lenLen)) {
-                       return false
-               }
-
-               // ITU-T X.690 section 10.1 (DER length forms) requires encoding the length
-               // with the minimum number of octets.
-               if len32 < 128 {
-                       // Length should have used short-form encoding.
-                       return false
-               }
-               if len32>>((lenLen-1)*8) == 0 {
-                       // Leading octet is 0. Length should have been at least one byte shorter.
-                       return false
-               }
-
-               headerLen = 2 + uint32(lenLen)
-               if headerLen+len32 < len32 {
-                       // Overflow.
-                       return false
-               }
-               length = headerLen + len32
-       }
-
-       if uint32(int(length)) != length || !s.ReadBytes((*[]byte)(out), int(length)) {
-               return false
-       }
-       if skipHeader && !out.Skip(int(headerLen)) {
-               panic("cryptobyte: internal error")
-       }
-
-       return true
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/asn1/asn1.go b/libgo/go/internal/x/crypto/cryptobyte/asn1/asn1.go
deleted file mode 100644 (file)
index 90ef6a2..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package asn1 contains supporting types for parsing and building ASN.1
-// messages with the cryptobyte package.
-package asn1
-
-// Tag represents an ASN.1 identifier octet, consisting of a tag number
-// (indicating a type) and class (such as context-specific or constructed).
-//
-// Methods in the cryptobyte package only support the low-tag-number form, i.e.
-// a single identifier octet with bits 7-8 encoding the class and bits 1-6
-// encoding the tag number.
-type Tag uint8
-
-const (
-       classConstructed     = 0x20
-       classContextSpecific = 0x80
-)
-
-// Constructed returns t with the constructed class bit set.
-func (t Tag) Constructed() Tag { return t | classConstructed }
-
-// ContextSpecific returns t with the context-specific class bit set.
-func (t Tag) ContextSpecific() Tag { return t | classContextSpecific }
-
-// The following is a list of standard tag and class combinations.
-const (
-       BOOLEAN           = Tag(1)
-       INTEGER           = Tag(2)
-       BIT_STRING        = Tag(3)
-       OCTET_STRING      = Tag(4)
-       NULL              = Tag(5)
-       OBJECT_IDENTIFIER = Tag(6)
-       ENUM              = Tag(10)
-       UTF8String        = Tag(12)
-       SEQUENCE          = Tag(16 | classConstructed)
-       SET               = Tag(17 | classConstructed)
-       PrintableString   = Tag(19)
-       T61String         = Tag(20)
-       IA5String         = Tag(22)
-       UTCTime           = Tag(23)
-       GeneralizedTime   = Tag(24)
-       GeneralString     = Tag(27)
-)
diff --git a/libgo/go/internal/x/crypto/cryptobyte/asn1_test.go b/libgo/go/internal/x/crypto/cryptobyte/asn1_test.go
deleted file mode 100644 (file)
index ca28e3b..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cryptobyte
-
-import (
-       "bytes"
-       encoding_asn1 "encoding/asn1"
-       "math/big"
-       "reflect"
-       "testing"
-       "time"
-
-       "internal/x/crypto/cryptobyte/asn1"
-)
-
-type readASN1Test struct {
-       name string
-       in   []byte
-       tag  asn1.Tag
-       ok   bool
-       out  interface{}
-}
-
-var readASN1TestData = []readASN1Test{
-       {"valid", []byte{0x30, 2, 1, 2}, 0x30, true, []byte{1, 2}},
-       {"truncated", []byte{0x30, 3, 1, 2}, 0x30, false, nil},
-       {"zero length of length", []byte{0x30, 0x80}, 0x30, false, nil},
-       {"invalid long form length", []byte{0x30, 0x81, 1, 1}, 0x30, false, nil},
-       {"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil},
-       {"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil},
-       {"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil},
-}
-
-func TestReadASN1(t *testing.T) {
-       for _, test := range readASN1TestData {
-               t.Run(test.name, func(t *testing.T) {
-                       var in, out String = test.in, nil
-                       ok := in.ReadASN1(&out, test.tag)
-                       if ok != test.ok || ok && !bytes.Equal(out, test.out.([]byte)) {
-                               t.Errorf("in.ReadASN1() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out)
-                       }
-               })
-       }
-}
-
-func TestReadASN1Optional(t *testing.T) {
-       var empty String
-       var present bool
-       ok := empty.ReadOptionalASN1(nil, &present, 0xa0)
-       if !ok || present {
-               t.Errorf("empty.ReadOptionalASN1() = %v, want true; present = %v want false", ok, present)
-       }
-
-       var in, out String = []byte{0xa1, 3, 0x4, 1, 1}, nil
-       ok = in.ReadOptionalASN1(&out, &present, 0xa0)
-       if !ok || present {
-               t.Errorf("in.ReadOptionalASN1() = %v, want true, present = %v, want false", ok, present)
-       }
-       ok = in.ReadOptionalASN1(&out, &present, 0xa1)
-       wantBytes := []byte{4, 1, 1}
-       if !ok || !present || !bytes.Equal(out, wantBytes) {
-               t.Errorf("in.ReadOptionalASN1() = %v, want true; present = %v, want true; out = %v, want = %v", ok, present, out, wantBytes)
-       }
-}
-
-var optionalOctetStringTestData = []struct {
-       readASN1Test
-       present bool
-}{
-       {readASN1Test{"empty", []byte{}, 0xa0, true, []byte{}}, false},
-       {readASN1Test{"invalid", []byte{0xa1, 3, 0x4, 2, 1}, 0xa1, false, []byte{}}, true},
-       {readASN1Test{"missing", []byte{0xa1, 3, 0x4, 1, 1}, 0xa0, true, []byte{}}, false},
-       {readASN1Test{"present", []byte{0xa1, 3, 0x4, 1, 1}, 0xa1, true, []byte{1}}, true},
-}
-
-func TestReadASN1OptionalOctetString(t *testing.T) {
-       for _, test := range optionalOctetStringTestData {
-               t.Run(test.name, func(t *testing.T) {
-                       in := String(test.in)
-                       var out []byte
-                       var present bool
-                       ok := in.ReadOptionalASN1OctetString(&out, &present, test.tag)
-                       if ok != test.ok || present != test.present || !bytes.Equal(out, test.out.([]byte)) {
-                               t.Errorf("in.ReadOptionalASN1OctetString() = %v, want %v; present = %v want %v; out = %v, want %v", ok, test.ok, present, test.present, out, test.out)
-                       }
-               })
-       }
-}
-
-const defaultInt = -1
-
-var optionalIntTestData = []readASN1Test{
-       {"empty", []byte{}, 0xa0, true, defaultInt},
-       {"invalid", []byte{0xa1, 3, 0x2, 2, 127}, 0xa1, false, 0},
-       {"missing", []byte{0xa1, 3, 0x2, 1, 127}, 0xa0, true, defaultInt},
-       {"present", []byte{0xa1, 3, 0x2, 1, 42}, 0xa1, true, 42},
-}
-
-func TestReadASN1OptionalInteger(t *testing.T) {
-       for _, test := range optionalIntTestData {
-               t.Run(test.name, func(t *testing.T) {
-                       in := String(test.in)
-                       var out int
-                       ok := in.ReadOptionalASN1Integer(&out, test.tag, defaultInt)
-                       if ok != test.ok || ok && out != test.out.(int) {
-                               t.Errorf("in.ReadOptionalASN1Integer() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out)
-                       }
-               })
-       }
-}
-
-func TestReadASN1IntegerSigned(t *testing.T) {
-       testData64 := []struct {
-               in  []byte
-               out int64
-       }{
-               {[]byte{2, 3, 128, 0, 0}, -0x800000},
-               {[]byte{2, 2, 255, 0}, -256},
-               {[]byte{2, 2, 255, 127}, -129},
-               {[]byte{2, 1, 128}, -128},
-               {[]byte{2, 1, 255}, -1},
-               {[]byte{2, 1, 0}, 0},
-               {[]byte{2, 1, 1}, 1},
-               {[]byte{2, 1, 2}, 2},
-               {[]byte{2, 1, 127}, 127},
-               {[]byte{2, 2, 0, 128}, 128},
-               {[]byte{2, 2, 1, 0}, 256},
-               {[]byte{2, 4, 0, 128, 0, 0}, 0x800000},
-       }
-       for i, test := range testData64 {
-               in := String(test.in)
-               var out int64
-               ok := in.ReadASN1Integer(&out)
-               if !ok || out != test.out {
-                       t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out)
-               }
-       }
-
-       // Repeat the same cases, reading into a big.Int.
-       t.Run("big.Int", func(t *testing.T) {
-               for i, test := range testData64 {
-                       in := String(test.in)
-                       var out big.Int
-                       ok := in.ReadASN1Integer(&out)
-                       if !ok || out.Int64() != test.out {
-                               t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out.Int64(), test.out)
-                       }
-               }
-       })
-
-       // Repeat with the implicit-tagging functions
-       t.Run("WithTag", func(t *testing.T) {
-               for i, test := range testData64 {
-                       tag := asn1.Tag((i * 3) % 32).ContextSpecific()
-
-                       testData := make([]byte, len(test.in))
-                       copy(testData, test.in)
-
-                       // Alter the tag of the test case.
-                       testData[0] = uint8(tag)
-
-                       in := String(testData)
-                       var out int64
-                       ok := in.ReadASN1Int64WithTag(&out, tag)
-                       if !ok || out != test.out {
-                               t.Errorf("#%d: in.ReadASN1Int64WithTag() = %v, want true; out = %d, want %d", i, ok, out, test.out)
-                       }
-
-                       var b Builder
-                       b.AddASN1Int64WithTag(test.out, tag)
-                       result, err := b.Bytes()
-
-                       if err != nil {
-                               t.Errorf("#%d: AddASN1Int64WithTag failed: %s", i, err)
-                               continue
-                       }
-
-                       if !bytes.Equal(result, testData) {
-                               t.Errorf("#%d: AddASN1Int64WithTag: got %x, want %x", i, result, testData)
-                       }
-               }
-       })
-}
-
-func TestReadASN1IntegerUnsigned(t *testing.T) {
-       testData := []struct {
-               in  []byte
-               out uint64
-       }{
-               {[]byte{2, 1, 0}, 0},
-               {[]byte{2, 1, 1}, 1},
-               {[]byte{2, 1, 2}, 2},
-               {[]byte{2, 1, 127}, 127},
-               {[]byte{2, 2, 0, 128}, 128},
-               {[]byte{2, 2, 1, 0}, 256},
-               {[]byte{2, 4, 0, 128, 0, 0}, 0x800000},
-               {[]byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}, 0x7fffffffffffffff},
-               {[]byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}, 0x8000000000000000},
-               {[]byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}, 0xffffffffffffffff},
-       }
-       for i, test := range testData {
-               in := String(test.in)
-               var out uint64
-               ok := in.ReadASN1Integer(&out)
-               if !ok || out != test.out {
-                       t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out)
-               }
-       }
-}
-
-func TestReadASN1IntegerInvalid(t *testing.T) {
-       testData := []String{
-               []byte{3, 1, 0}, // invalid tag
-               // truncated
-               []byte{2, 1},
-               []byte{2, 2, 0},
-               // not minimally encoded
-               []byte{2, 2, 0, 1},
-               []byte{2, 2, 0xff, 0xff},
-       }
-
-       for i, test := range testData {
-               var out int64
-               if test.ReadASN1Integer(&out) {
-                       t.Errorf("#%d: in.ReadASN1Integer() = true, want false (out = %d)", i, out)
-               }
-       }
-}
-
-func TestASN1ObjectIdentifier(t *testing.T) {
-       testData := []struct {
-               in  []byte
-               ok  bool
-               out []int
-       }{
-               {[]byte{}, false, []int{}},
-               {[]byte{6, 0}, false, []int{}},
-               {[]byte{5, 1, 85}, false, []int{2, 5}},
-               {[]byte{6, 1, 85}, true, []int{2, 5}},
-               {[]byte{6, 2, 85, 0x02}, true, []int{2, 5, 2}},
-               {[]byte{6, 4, 85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}},
-               {[]byte{6, 3, 0x81, 0x34, 0x03}, true, []int{2, 100, 3}},
-               {[]byte{6, 7, 85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}},
-       }
-
-       for i, test := range testData {
-               in := String(test.in)
-               var out encoding_asn1.ObjectIdentifier
-               ok := in.ReadASN1ObjectIdentifier(&out)
-               if ok != test.ok || ok && !out.Equal(test.out) {
-                       t.Errorf("#%d: in.ReadASN1ObjectIdentifier() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out)
-                       continue
-               }
-
-               var b Builder
-               b.AddASN1ObjectIdentifier(out)
-               result, err := b.Bytes()
-               if builderOk := err == nil; test.ok != builderOk {
-                       t.Errorf("#%d: error from Builder.Bytes: %s", i, err)
-                       continue
-               }
-               if test.ok && !bytes.Equal(result, test.in) {
-                       t.Errorf("#%d: reserialisation didn't match, got %x, want %x", i, result, test.in)
-                       continue
-               }
-       }
-}
-
-func TestReadASN1GeneralizedTime(t *testing.T) {
-       testData := []struct {
-               in  string
-               ok  bool
-               out time.Time
-       }{
-               {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
-               {"20100102030405", false, time.Time{}},
-               {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))},
-               {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))},
-               /* These are invalid times. However, the time package normalises times
-                * and they were accepted in some versions. See #11134. */
-               {"00000100000000Z", false, time.Time{}},
-               {"20101302030405Z", false, time.Time{}},
-               {"20100002030405Z", false, time.Time{}},
-               {"20100100030405Z", false, time.Time{}},
-               {"20100132030405Z", false, time.Time{}},
-               {"20100231030405Z", false, time.Time{}},
-               {"20100102240405Z", false, time.Time{}},
-               {"20100102036005Z", false, time.Time{}},
-               {"20100102030460Z", false, time.Time{}},
-               {"-20100102030410Z", false, time.Time{}},
-               {"2010-0102030410Z", false, time.Time{}},
-               {"2010-0002030410Z", false, time.Time{}},
-               {"201001-02030410Z", false, time.Time{}},
-               {"20100102-030410Z", false, time.Time{}},
-               {"2010010203-0410Z", false, time.Time{}},
-               {"201001020304-10Z", false, time.Time{}},
-       }
-       for i, test := range testData {
-               in := String(append([]byte{byte(asn1.GeneralizedTime), byte(len(test.in))}, test.in...))
-               var out time.Time
-               ok := in.ReadASN1GeneralizedTime(&out)
-               if ok != test.ok || ok && !reflect.DeepEqual(out, test.out) {
-                       t.Errorf("#%d: in.ReadASN1GeneralizedTime() = %v, want %v; out = %q, want %q", i, ok, test.ok, out, test.out)
-               }
-       }
-}
-
-func TestReadASN1BitString(t *testing.T) {
-       testData := []struct {
-               in  []byte
-               ok  bool
-               out encoding_asn1.BitString
-       }{
-               {[]byte{}, false, encoding_asn1.BitString{}},
-               {[]byte{0x00}, true, encoding_asn1.BitString{}},
-               {[]byte{0x07, 0x00}, true, encoding_asn1.BitString{Bytes: []byte{0}, BitLength: 1}},
-               {[]byte{0x07, 0x01}, false, encoding_asn1.BitString{}},
-               {[]byte{0x07, 0x40}, false, encoding_asn1.BitString{}},
-               {[]byte{0x08, 0x00}, false, encoding_asn1.BitString{}},
-               {[]byte{0xff}, false, encoding_asn1.BitString{}},
-               {[]byte{0xfe, 0x00}, false, encoding_asn1.BitString{}},
-       }
-       for i, test := range testData {
-               in := String(append([]byte{3, byte(len(test.in))}, test.in...))
-               var out encoding_asn1.BitString
-               ok := in.ReadASN1BitString(&out)
-               if ok != test.ok || ok && (!bytes.Equal(out.Bytes, test.out.Bytes) || out.BitLength != test.out.BitLength) {
-                       t.Errorf("#%d: in.ReadASN1BitString() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/builder.go b/libgo/go/internal/x/crypto/cryptobyte/builder.go
deleted file mode 100644 (file)
index 29b4c76..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cryptobyte
-
-import (
-       "errors"
-       "fmt"
-)
-
-// A Builder builds byte strings from fixed-length and length-prefixed values.
-// Builders either allocate space as needed, or are ‘fixed’, which means that
-// they write into a given buffer and produce an error if it's exhausted.
-//
-// The zero value is a usable Builder that allocates space as needed.
-//
-// Simple values are marshaled and appended to a Builder using methods on the
-// Builder. Length-prefixed values are marshaled by providing a
-// BuilderContinuation, which is a function that writes the inner contents of
-// the value to a given Builder. See the documentation for BuilderContinuation
-// for details.
-type Builder struct {
-       err            error
-       result         []byte
-       fixedSize      bool
-       child          *Builder
-       offset         int
-       pendingLenLen  int
-       pendingIsASN1  bool
-       inContinuation *bool
-}
-
-// NewBuilder creates a Builder that appends its output to the given buffer.
-// Like append(), the slice will be reallocated if its capacity is exceeded.
-// Use Bytes to get the final buffer.
-func NewBuilder(buffer []byte) *Builder {
-       return &Builder{
-               result: buffer,
-       }
-}
-
-// NewFixedBuilder creates a Builder that appends its output into the given
-// buffer. This builder does not reallocate the output buffer. Writes that
-// would exceed the buffer's capacity are treated as an error.
-func NewFixedBuilder(buffer []byte) *Builder {
-       return &Builder{
-               result:    buffer,
-               fixedSize: true,
-       }
-}
-
-// Bytes returns the bytes written by the builder or an error if one has
-// occurred during during building.
-func (b *Builder) Bytes() ([]byte, error) {
-       if b.err != nil {
-               return nil, b.err
-       }
-       return b.result[b.offset:], nil
-}
-
-// BytesOrPanic returns the bytes written by the builder or panics if an error
-// has occurred during building.
-func (b *Builder) BytesOrPanic() []byte {
-       if b.err != nil {
-               panic(b.err)
-       }
-       return b.result[b.offset:]
-}
-
-// AddUint8 appends an 8-bit value to the byte string.
-func (b *Builder) AddUint8(v uint8) {
-       b.add(byte(v))
-}
-
-// AddUint16 appends a big-endian, 16-bit value to the byte string.
-func (b *Builder) AddUint16(v uint16) {
-       b.add(byte(v>>8), byte(v))
-}
-
-// AddUint24 appends a big-endian, 24-bit value to the byte string. The highest
-// byte of the 32-bit input value is silently truncated.
-func (b *Builder) AddUint24(v uint32) {
-       b.add(byte(v>>16), byte(v>>8), byte(v))
-}
-
-// AddUint32 appends a big-endian, 32-bit value to the byte string.
-func (b *Builder) AddUint32(v uint32) {
-       b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
-}
-
-// AddBytes appends a sequence of bytes to the byte string.
-func (b *Builder) AddBytes(v []byte) {
-       b.add(v...)
-}
-
-// BuilderContinuation is continuation-passing interface for building
-// length-prefixed byte sequences. Builder methods for length-prefixed
-// sequences (AddUint8LengthPrefixed etc) will invoke the BuilderContinuation
-// supplied to them. The child builder passed to the continuation can be used
-// to build the content of the length-prefixed sequence. For example:
-//
-//   parent := cryptobyte.NewBuilder()
-//   parent.AddUint8LengthPrefixed(func (child *Builder) {
-//     child.AddUint8(42)
-//     child.AddUint8LengthPrefixed(func (grandchild *Builder) {
-//       grandchild.AddUint8(5)
-//     })
-//   })
-//
-// It is an error to write more bytes to the child than allowed by the reserved
-// length prefix. After the continuation returns, the child must be considered
-// invalid, i.e. users must not store any copies or references of the child
-// that outlive the continuation.
-//
-// If the continuation panics with a value of type BuildError then the inner
-// error will be returned as the error from Bytes. If the child panics
-// otherwise then Bytes will repanic with the same value.
-type BuilderContinuation func(child *Builder)
-
-// BuildError wraps an error. If a BuilderContinuation panics with this value,
-// the panic will be recovered and the inner error will be returned from
-// Builder.Bytes.
-type BuildError struct {
-       Err error
-}
-
-// AddUint8LengthPrefixed adds a 8-bit length-prefixed byte sequence.
-func (b *Builder) AddUint8LengthPrefixed(f BuilderContinuation) {
-       b.addLengthPrefixed(1, false, f)
-}
-
-// AddUint16LengthPrefixed adds a big-endian, 16-bit length-prefixed byte sequence.
-func (b *Builder) AddUint16LengthPrefixed(f BuilderContinuation) {
-       b.addLengthPrefixed(2, false, f)
-}
-
-// AddUint24LengthPrefixed adds a big-endian, 24-bit length-prefixed byte sequence.
-func (b *Builder) AddUint24LengthPrefixed(f BuilderContinuation) {
-       b.addLengthPrefixed(3, false, f)
-}
-
-// AddUint32LengthPrefixed adds a big-endian, 32-bit length-prefixed byte sequence.
-func (b *Builder) AddUint32LengthPrefixed(f BuilderContinuation) {
-       b.addLengthPrefixed(4, false, f)
-}
-
-func (b *Builder) callContinuation(f BuilderContinuation, arg *Builder) {
-       if !*b.inContinuation {
-               *b.inContinuation = true
-
-               defer func() {
-                       *b.inContinuation = false
-
-                       r := recover()
-                       if r == nil {
-                               return
-                       }
-
-                       if buildError, ok := r.(BuildError); ok {
-                               b.err = buildError.Err
-                       } else {
-                               panic(r)
-                       }
-               }()
-       }
-
-       f(arg)
-}
-
-func (b *Builder) addLengthPrefixed(lenLen int, isASN1 bool, f BuilderContinuation) {
-       // Subsequent writes can be ignored if the builder has encountered an error.
-       if b.err != nil {
-               return
-       }
-
-       offset := len(b.result)
-       b.add(make([]byte, lenLen)...)
-
-       if b.inContinuation == nil {
-               b.inContinuation = new(bool)
-       }
-
-       b.child = &Builder{
-               result:         b.result,
-               fixedSize:      b.fixedSize,
-               offset:         offset,
-               pendingLenLen:  lenLen,
-               pendingIsASN1:  isASN1,
-               inContinuation: b.inContinuation,
-       }
-
-       b.callContinuation(f, b.child)
-       b.flushChild()
-       if b.child != nil {
-               panic("cryptobyte: internal error")
-       }
-}
-
-func (b *Builder) flushChild() {
-       if b.child == nil {
-               return
-       }
-       b.child.flushChild()
-       child := b.child
-       b.child = nil
-
-       if child.err != nil {
-               b.err = child.err
-               return
-       }
-
-       length := len(child.result) - child.pendingLenLen - child.offset
-
-       if length < 0 {
-               panic("cryptobyte: internal error") // result unexpectedly shrunk
-       }
-
-       if child.pendingIsASN1 {
-               // For ASN.1, we reserved a single byte for the length. If that turned out
-               // to be incorrect, we have to move the contents along in order to make
-               // space.
-               if child.pendingLenLen != 1 {
-                       panic("cryptobyte: internal error")
-               }
-               var lenLen, lenByte uint8
-               if int64(length) > 0xfffffffe {
-                       b.err = errors.New("pending ASN.1 child too long")
-                       return
-               } else if length > 0xffffff {
-                       lenLen = 5
-                       lenByte = 0x80 | 4
-               } else if length > 0xffff {
-                       lenLen = 4
-                       lenByte = 0x80 | 3
-               } else if length > 0xff {
-                       lenLen = 3
-                       lenByte = 0x80 | 2
-               } else if length > 0x7f {
-                       lenLen = 2
-                       lenByte = 0x80 | 1
-               } else {
-                       lenLen = 1
-                       lenByte = uint8(length)
-                       length = 0
-               }
-
-               // Insert the initial length byte, make space for successive length bytes,
-               // and adjust the offset.
-               child.result[child.offset] = lenByte
-               extraBytes := int(lenLen - 1)
-               if extraBytes != 0 {
-                       child.add(make([]byte, extraBytes)...)
-                       childStart := child.offset + child.pendingLenLen
-                       copy(child.result[childStart+extraBytes:], child.result[childStart:])
-               }
-               child.offset++
-               child.pendingLenLen = extraBytes
-       }
-
-       l := length
-       for i := child.pendingLenLen - 1; i >= 0; i-- {
-               child.result[child.offset+i] = uint8(l)
-               l >>= 8
-       }
-       if l != 0 {
-               b.err = fmt.Errorf("cryptobyte: pending child length %d exceeds %d-byte length prefix", length, child.pendingLenLen)
-               return
-       }
-
-       if !b.fixedSize {
-               b.result = child.result // In case child reallocated result.
-       }
-}
-
-func (b *Builder) add(bytes ...byte) {
-       if b.err != nil {
-               return
-       }
-       if b.child != nil {
-               panic("attempted write while child is pending")
-       }
-       if len(b.result)+len(bytes) < len(bytes) {
-               b.err = errors.New("cryptobyte: length overflow")
-       }
-       if b.fixedSize && len(b.result)+len(bytes) > cap(b.result) {
-               b.err = errors.New("cryptobyte: Builder is exceeding its fixed-size buffer")
-               return
-       }
-       b.result = append(b.result, bytes...)
-}
-
-// A MarshalingValue marshals itself into a Builder.
-type MarshalingValue interface {
-       // Marshal is called by Builder.AddValue. It receives a pointer to a builder
-       // to marshal itself into. It may return an error that occurred during
-       // marshaling, such as unset or invalid values.
-       Marshal(b *Builder) error
-}
-
-// AddValue calls Marshal on v, passing a pointer to the builder to append to.
-// If Marshal returns an error, it is set on the Builder so that subsequent
-// appends don't have an effect.
-func (b *Builder) AddValue(v MarshalingValue) {
-       err := v.Marshal(b)
-       if err != nil {
-               b.err = err
-       }
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/cryptobyte_test.go b/libgo/go/internal/x/crypto/cryptobyte/cryptobyte_test.go
deleted file mode 100644 (file)
index f294dd5..0000000
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cryptobyte
-
-import (
-       "bytes"
-       "errors"
-       "fmt"
-       "testing"
-)
-
-func builderBytesEq(b *Builder, want ...byte) error {
-       got := b.BytesOrPanic()
-       if !bytes.Equal(got, want) {
-               return fmt.Errorf("Bytes() = %v, want %v", got, want)
-       }
-       return nil
-}
-
-func TestContinuationError(t *testing.T) {
-       const errorStr = "TestContinuationError"
-       var b Builder
-       b.AddUint8LengthPrefixed(func(b *Builder) {
-               b.AddUint8(1)
-               panic(BuildError{Err: errors.New(errorStr)})
-       })
-
-       ret, err := b.Bytes()
-       if ret != nil {
-               t.Error("expected nil result")
-       }
-       if err == nil {
-               t.Fatal("unexpected nil error")
-       }
-       if s := err.Error(); s != errorStr {
-               t.Errorf("expected error %q, got %v", errorStr, s)
-       }
-}
-
-func TestContinuationNonError(t *testing.T) {
-       defer func() {
-               recover()
-       }()
-
-       var b Builder
-       b.AddUint8LengthPrefixed(func(b *Builder) {
-               b.AddUint8(1)
-               panic(1)
-       })
-
-       t.Error("Builder did not panic")
-}
-
-func TestGeneratedPanic(t *testing.T) {
-       defer func() {
-               recover()
-       }()
-
-       var b Builder
-       b.AddUint8LengthPrefixed(func(b *Builder) {
-               var p *byte
-               *p = 0
-       })
-
-       t.Error("Builder did not panic")
-}
-
-func TestBytes(t *testing.T) {
-       var b Builder
-       v := []byte("foobarbaz")
-       b.AddBytes(v[0:3])
-       b.AddBytes(v[3:4])
-       b.AddBytes(v[4:9])
-       if err := builderBytesEq(&b, v...); err != nil {
-               t.Error(err)
-       }
-       s := String(b.BytesOrPanic())
-       for _, w := range []string{"foo", "bar", "baz"} {
-               var got []byte
-               if !s.ReadBytes(&got, 3) {
-                       t.Errorf("ReadBytes() = false, want true (w = %v)", w)
-               }
-               want := []byte(w)
-               if !bytes.Equal(got, want) {
-                       t.Errorf("ReadBytes(): got = %v, want %v", got, want)
-               }
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUint8(t *testing.T) {
-       var b Builder
-       b.AddUint8(42)
-       if err := builderBytesEq(&b, 42); err != nil {
-               t.Error(err)
-       }
-
-       var s String = b.BytesOrPanic()
-       var v uint8
-       if !s.ReadUint8(&v) {
-               t.Error("ReadUint8() = false, want true")
-       }
-       if v != 42 {
-               t.Errorf("v = %d, want 42", v)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUint16(t *testing.T) {
-       var b Builder
-       b.AddUint16(65534)
-       if err := builderBytesEq(&b, 255, 254); err != nil {
-               t.Error(err)
-       }
-       var s String = b.BytesOrPanic()
-       var v uint16
-       if !s.ReadUint16(&v) {
-               t.Error("ReadUint16() == false, want true")
-       }
-       if v != 65534 {
-               t.Errorf("v = %d, want 65534", v)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUint24(t *testing.T) {
-       var b Builder
-       b.AddUint24(0xfffefd)
-       if err := builderBytesEq(&b, 255, 254, 253); err != nil {
-               t.Error(err)
-       }
-
-       var s String = b.BytesOrPanic()
-       var v uint32
-       if !s.ReadUint24(&v) {
-               t.Error("ReadUint8() = false, want true")
-       }
-       if v != 0xfffefd {
-               t.Errorf("v = %d, want fffefd", v)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUint24Truncation(t *testing.T) {
-       var b Builder
-       b.AddUint24(0x10111213)
-       if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil {
-               t.Error(err)
-       }
-}
-
-func TestUint32(t *testing.T) {
-       var b Builder
-       b.AddUint32(0xfffefdfc)
-       if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil {
-               t.Error(err)
-       }
-
-       var s String = b.BytesOrPanic()
-       var v uint32
-       if !s.ReadUint32(&v) {
-               t.Error("ReadUint8() = false, want true")
-       }
-       if v != 0xfffefdfc {
-               t.Errorf("v = %x, want fffefdfc", v)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUMultiple(t *testing.T) {
-       var b Builder
-       b.AddUint8(23)
-       b.AddUint32(0xfffefdfc)
-       b.AddUint16(42)
-       if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil {
-               t.Error(err)
-       }
-
-       var s String = b.BytesOrPanic()
-       var (
-               x uint8
-               y uint32
-               z uint16
-       )
-       if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) {
-               t.Error("ReadUint8() = false, want true")
-       }
-       if x != 23 || y != 0xfffefdfc || z != 42 {
-               t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-}
-
-func TestUint8LengthPrefixedSimple(t *testing.T) {
-       var b Builder
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8(23)
-               c.AddUint8(42)
-       })
-       if err := builderBytesEq(&b, 2, 23, 42); err != nil {
-               t.Error(err)
-       }
-
-       var base, child String = b.BytesOrPanic(), nil
-       var x, y uint8
-       if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) ||
-               !child.ReadUint8(&y) {
-               t.Error("parsing failed")
-       }
-       if x != 23 || y != 42 {
-               t.Errorf("want x, y == 23, 42; got %d, %d", x, y)
-       }
-       if len(base) != 0 {
-               t.Errorf("len(base) = %d, want 0", len(base))
-       }
-       if len(child) != 0 {
-               t.Errorf("len(child) = %d, want 0", len(child))
-       }
-}
-
-func TestUint8LengthPrefixedMulti(t *testing.T) {
-       var b Builder
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8(23)
-               c.AddUint8(42)
-       })
-       b.AddUint8(5)
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8(123)
-               c.AddUint8(234)
-       })
-       if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil {
-               t.Error(err)
-       }
-
-       var s, child String = b.BytesOrPanic(), nil
-       var u, v, w, x, y uint8
-       if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) ||
-               !s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) {
-               t.Error("parsing failed")
-       }
-       if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 {
-               t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234",
-                       u, v, w, x, y)
-       }
-       if len(s) != 0 {
-               t.Errorf("len(s) = %d, want 0", len(s))
-       }
-       if len(child) != 0 {
-               t.Errorf("len(child) = %d, want 0", len(child))
-       }
-}
-
-func TestUint8LengthPrefixedNested(t *testing.T) {
-       var b Builder
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8(5)
-               c.AddUint8LengthPrefixed(func(d *Builder) {
-                       d.AddUint8(23)
-                       d.AddUint8(42)
-               })
-               c.AddUint8(123)
-       })
-       if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil {
-               t.Error(err)
-       }
-
-       var base, child1, child2 String = b.BytesOrPanic(), nil, nil
-       var u, v, w, x uint8
-       if !base.ReadUint8LengthPrefixed(&child1) {
-               t.Error("parsing base failed")
-       }
-       if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) {
-               t.Error("parsing child1 failed")
-       }
-       if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) {
-               t.Error("parsing child2 failed")
-       }
-       if u != 5 || v != 23 || w != 42 || x != 123 {
-               t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123",
-                       u, v, w, x)
-       }
-       if len(base) != 0 {
-               t.Errorf("len(base) = %d, want 0", len(base))
-       }
-       if len(child1) != 0 {
-               t.Errorf("len(child1) = %d, want 0", len(child1))
-       }
-       if len(base) != 0 {
-               t.Errorf("len(child2) = %d, want 0", len(child2))
-       }
-}
-
-func TestPreallocatedBuffer(t *testing.T) {
-       var buf [5]byte
-       b := NewBuilder(buf[0:0])
-       b.AddUint8(1)
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8(3)
-               c.AddUint8(4)
-       })
-       b.AddUint16(1286) // Outgrow buf by one byte.
-       want := []byte{1, 2, 3, 4, 0}
-       if !bytes.Equal(buf[:], want) {
-               t.Errorf("buf = %v want %v", buf, want)
-       }
-       if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil {
-               t.Error(err)
-       }
-}
-
-func TestWriteWithPendingChild(t *testing.T) {
-       var b Builder
-       b.AddUint8LengthPrefixed(func(c *Builder) {
-               c.AddUint8LengthPrefixed(func(d *Builder) {
-                       defer func() {
-                               if recover() == nil {
-                                       t.Errorf("recover() = nil, want error; c.AddUint8() did not panic")
-                               }
-                       }()
-                       c.AddUint8(2) // panics
-
-                       defer func() {
-                               if recover() == nil {
-                                       t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
-                               }
-                       }()
-                       b.AddUint8(2) // panics
-               })
-
-               defer func() {
-                       if recover() == nil {
-                               t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
-                       }
-               }()
-               b.AddUint8(2) // panics
-       })
-}
-
-// ASN.1
-
-func TestASN1Int64(t *testing.T) {
-       tests := []struct {
-               in   int64
-               want []byte
-       }{
-               {-0x800000, []byte{2, 3, 128, 0, 0}},
-               {-256, []byte{2, 2, 255, 0}},
-               {-129, []byte{2, 2, 255, 127}},
-               {-128, []byte{2, 1, 128}},
-               {-1, []byte{2, 1, 255}},
-               {0, []byte{2, 1, 0}},
-               {1, []byte{2, 1, 1}},
-               {2, []byte{2, 1, 2}},
-               {127, []byte{2, 1, 127}},
-               {128, []byte{2, 2, 0, 128}},
-               {256, []byte{2, 2, 1, 0}},
-               {0x800000, []byte{2, 4, 0, 128, 0, 0}},
-       }
-       for i, tt := range tests {
-               var b Builder
-               b.AddASN1Int64(tt.in)
-               if err := builderBytesEq(&b, tt.want...); err != nil {
-                       t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
-               }
-
-               var n int64
-               s := String(b.BytesOrPanic())
-               ok := s.ReadASN1Integer(&n)
-               if !ok || n != tt.in {
-                       t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
-                               ok, n, tt.in, i)
-               }
-               if len(s) != 0 {
-                       t.Errorf("len(s) = %d, want 0", len(s))
-               }
-       }
-}
-
-func TestASN1Uint64(t *testing.T) {
-       tests := []struct {
-               in   uint64
-               want []byte
-       }{
-               {0, []byte{2, 1, 0}},
-               {1, []byte{2, 1, 1}},
-               {2, []byte{2, 1, 2}},
-               {127, []byte{2, 1, 127}},
-               {128, []byte{2, 2, 0, 128}},
-               {256, []byte{2, 2, 1, 0}},
-               {0x800000, []byte{2, 4, 0, 128, 0, 0}},
-               {0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}},
-               {0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}},
-               {0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}},
-       }
-       for i, tt := range tests {
-               var b Builder
-               b.AddASN1Uint64(tt.in)
-               if err := builderBytesEq(&b, tt.want...); err != nil {
-                       t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
-               }
-
-               var n uint64
-               s := String(b.BytesOrPanic())
-               ok := s.ReadASN1Integer(&n)
-               if !ok || n != tt.in {
-                       t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
-                               ok, n, tt.in, i)
-               }
-               if len(s) != 0 {
-                       t.Errorf("len(s) = %d, want 0", len(s))
-               }
-       }
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/example_test.go b/libgo/go/internal/x/crypto/cryptobyte/example_test.go
deleted file mode 100644 (file)
index 414c7f4..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package cryptobyte_test
-
-import (
-       "errors"
-       "fmt"
-
-       "internal/x/crypto/cryptobyte"
-       "internal/x/crypto/cryptobyte/asn1"
-)
-
-func ExampleString_lengthPrefixed() {
-       // This is an example of parsing length-prefixed data (as found in, for
-       // example, TLS). Imagine a 16-bit prefixed series of 8-bit prefixed
-       // strings.
-
-       input := cryptobyte.String([]byte{0, 12, 5, 'h', 'e', 'l', 'l', 'o', 5, 'w', 'o', 'r', 'l', 'd'})
-       var result []string
-
-       var values cryptobyte.String
-       if !input.ReadUint16LengthPrefixed(&values) ||
-               !input.Empty() {
-               panic("bad format")
-       }
-
-       for !values.Empty() {
-               var value cryptobyte.String
-               if !values.ReadUint8LengthPrefixed(&value) {
-                       panic("bad format")
-               }
-
-               result = append(result, string(value))
-       }
-
-       // Output: []string{"hello", "world"}
-       fmt.Printf("%#v\n", result)
-}
-
-func ExampleString_aSN1() {
-       // This is an example of parsing ASN.1 data that looks like:
-       //    Foo ::= SEQUENCE {
-       //      version [6] INTEGER DEFAULT 0
-       //      data OCTET STRING
-       //    }
-
-       input := cryptobyte.String([]byte{0x30, 12, 0xa6, 3, 2, 1, 2, 4, 5, 'h', 'e', 'l', 'l', 'o'})
-
-       var (
-               version                   int64
-               data, inner, versionBytes cryptobyte.String
-               haveVersion               bool
-       )
-       if !input.ReadASN1(&inner, asn1.SEQUENCE) ||
-               !input.Empty() ||
-               !inner.ReadOptionalASN1(&versionBytes, &haveVersion, asn1.Tag(6).Constructed().ContextSpecific()) ||
-               (haveVersion && !versionBytes.ReadASN1Integer(&version)) ||
-               (haveVersion && !versionBytes.Empty()) ||
-               !inner.ReadASN1(&data, asn1.OCTET_STRING) ||
-               !inner.Empty() {
-               panic("bad format")
-       }
-
-       // Output: haveVersion: true, version: 2, data: hello
-       fmt.Printf("haveVersion: %t, version: %d, data: %s\n", haveVersion, version, string(data))
-}
-
-func ExampleBuilder_aSN1() {
-       // This is an example of building ASN.1 data that looks like:
-       //    Foo ::= SEQUENCE {
-       //      version [6] INTEGER DEFAULT 0
-       //      data OCTET STRING
-       //    }
-
-       version := int64(2)
-       data := []byte("hello")
-       const defaultVersion = 0
-
-       var b cryptobyte.Builder
-       b.AddASN1(asn1.SEQUENCE, func(b *cryptobyte.Builder) {
-               if version != defaultVersion {
-                       b.AddASN1(asn1.Tag(6).Constructed().ContextSpecific(), func(b *cryptobyte.Builder) {
-                               b.AddASN1Int64(version)
-                       })
-               }
-               b.AddASN1OctetString(data)
-       })
-
-       result, err := b.Bytes()
-       if err != nil {
-               panic(err)
-       }
-
-       // Output: 300ca603020102040568656c6c6f
-       fmt.Printf("%x\n", result)
-}
-
-func ExampleBuilder_lengthPrefixed() {
-       // This is an example of building length-prefixed data (as found in,
-       // for example, TLS). Imagine a 16-bit prefixed series of 8-bit
-       // prefixed strings.
-       input := []string{"hello", "world"}
-
-       var b cryptobyte.Builder
-       b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
-               for _, value := range input {
-                       b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
-                               b.AddBytes([]byte(value))
-                       })
-               }
-       })
-
-       result, err := b.Bytes()
-       if err != nil {
-               panic(err)
-       }
-
-       // Output: 000c0568656c6c6f05776f726c64
-       fmt.Printf("%x\n", result)
-}
-
-func ExampleBuilder_lengthPrefixOverflow() {
-       // Writing more data that can be expressed by the length prefix results
-       // in an error from Bytes().
-
-       tooLarge := make([]byte, 256)
-
-       var b cryptobyte.Builder
-       b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
-               b.AddBytes(tooLarge)
-       })
-
-       result, err := b.Bytes()
-       fmt.Printf("len=%d err=%s\n", len(result), err)
-
-       // Output: len=0 err=cryptobyte: pending child length 256 exceeds 1-byte length prefix
-}
-
-func ExampleBuilderContinuation_errorHandling() {
-       var b cryptobyte.Builder
-       // Continuations that panic with a BuildError will cause Bytes to
-       // return the inner error.
-       b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
-               b.AddUint32(0)
-               panic(cryptobyte.BuildError{Err: errors.New("example error")})
-       })
-
-       result, err := b.Bytes()
-       fmt.Printf("len=%d err=%s\n", len(result), err)
-
-       // Output: len=0 err=example error
-}
diff --git a/libgo/go/internal/x/crypto/cryptobyte/string.go b/libgo/go/internal/x/crypto/cryptobyte/string.go
deleted file mode 100644 (file)
index bd2ed2e..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cryptobyte contains types that help with parsing and constructing
-// length-prefixed, binary messages, including ASN.1 DER. (The asn1 subpackage
-// contains useful ASN.1 constants.)
-//
-// The String type is for parsing. It wraps a []byte slice and provides helper
-// functions for consuming structures, value by value.
-//
-// The Builder type is for constructing messages. It providers helper functions
-// for appending values and also for appending length-prefixed submessages –
-// without having to worry about calculating the length prefix ahead of time.
-//
-// See the documentation and examples for the Builder and String types to get
-// started.
-package cryptobyte
-
-// String represents a string of bytes. It provides methods for parsing
-// fixed-length and length-prefixed values from it.
-type String []byte
-
-// read advances a String by n bytes and returns them. If less than n bytes
-// remain, it returns nil.
-func (s *String) read(n int) []byte {
-       if len(*s) < n {
-               return nil
-       }
-       v := (*s)[:n]
-       *s = (*s)[n:]
-       return v
-}
-
-// Skip advances the String by n byte and reports whether it was successful.
-func (s *String) Skip(n int) bool {
-       return s.read(n) != nil
-}
-
-// ReadUint8 decodes an 8-bit value into out and advances over it.
-// It reports whether the read was successful.
-func (s *String) ReadUint8(out *uint8) bool {
-       v := s.read(1)
-       if v == nil {
-               return false
-       }
-       *out = uint8(v[0])
-       return true
-}
-
-// ReadUint16 decodes a big-endian, 16-bit value into out and advances over it.
-// It reports whether the read was successful.
-func (s *String) ReadUint16(out *uint16) bool {
-       v := s.read(2)
-       if v == nil {
-               return false
-       }
-       *out = uint16(v[0])<<8 | uint16(v[1])
-       return true
-}
-
-// ReadUint24 decodes a big-endian, 24-bit value into out and advances over it.
-// It reports whether the read was successful.
-func (s *String) ReadUint24(out *uint32) bool {
-       v := s.read(3)
-       if v == nil {
-               return false
-       }
-       *out = uint32(v[0])<<16 | uint32(v[1])<<8 | uint32(v[2])
-       return true
-}
-
-// ReadUint32 decodes a big-endian, 32-bit value into out and advances over it.
-// It reports whether the read was successful.
-func (s *String) ReadUint32(out *uint32) bool {
-       v := s.read(4)
-       if v == nil {
-               return false
-       }
-       *out = uint32(v[0])<<24 | uint32(v[1])<<16 | uint32(v[2])<<8 | uint32(v[3])
-       return true
-}
-
-func (s *String) readUnsigned(out *uint32, length int) bool {
-       v := s.read(length)
-       if v == nil {
-               return false
-       }
-       var result uint32
-       for i := 0; i < length; i++ {
-               result <<= 8
-               result |= uint32(v[i])
-       }
-       *out = result
-       return true
-}
-
-func (s *String) readLengthPrefixed(lenLen int, outChild *String) bool {
-       lenBytes := s.read(lenLen)
-       if lenBytes == nil {
-               return false
-       }
-       var length uint32
-       for _, b := range lenBytes {
-               length = length << 8
-               length = length | uint32(b)
-       }
-       if int(length) < 0 {
-               // This currently cannot overflow because we read uint24 at most, but check
-               // anyway in case that changes in the future.
-               return false
-       }
-       v := s.read(int(length))
-       if v == nil {
-               return false
-       }
-       *outChild = v
-       return true
-}
-
-// ReadUint8LengthPrefixed reads the content of an 8-bit length-prefixed value
-// into out and advances over it. It reports whether the read was successful.
-func (s *String) ReadUint8LengthPrefixed(out *String) bool {
-       return s.readLengthPrefixed(1, out)
-}
-
-// ReadUint16LengthPrefixed reads the content of a big-endian, 16-bit
-// length-prefixed value into out and advances over it. It reports whether the
-// read was successful.
-func (s *String) ReadUint16LengthPrefixed(out *String) bool {
-       return s.readLengthPrefixed(2, out)
-}
-
-// ReadUint24LengthPrefixed reads the content of a big-endian, 24-bit
-// length-prefixed value into out and advances over it. It reports whether
-// the read was successful.
-func (s *String) ReadUint24LengthPrefixed(out *String) bool {
-       return s.readLengthPrefixed(3, out)
-}
-
-// ReadBytes reads n bytes into out and advances over them. It reports
-// whether the read was successful.
-func (s *String) ReadBytes(out *[]byte, n int) bool {
-       v := s.read(n)
-       if v == nil {
-               return false
-       }
-       *out = v
-       return true
-}
-
-// CopyBytes copies len(out) bytes into out and advances over them. It reports
-// whether the copy operation was successful
-func (s *String) CopyBytes(out []byte) bool {
-       n := len(out)
-       v := s.read(n)
-       if v == nil {
-               return false
-       }
-       return copy(out, v) == n
-}
-
-// Empty reports whether the string does not contain any bytes.
-func (s String) Empty() bool {
-       return len(s) == 0
-}
diff --git a/libgo/go/internal/x/crypto/curve25519/curve25519.go b/libgo/go/internal/x/crypto/curve25519/curve25519.go
deleted file mode 100644 (file)
index cb8fbc5..0000000
+++ /dev/null
@@ -1,834 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// We have an implementation in amd64 assembly so this code is only run on
-// non-amd64 platforms. The amd64 assembly does not support gccgo.
-// +build !amd64 gccgo appengine
-
-package curve25519
-
-import (
-       "encoding/binary"
-)
-
-// This code is a port of the public domain, "ref10" implementation of
-// curve25519 from SUPERCOP 20130419 by D. J. Bernstein.
-
-// fieldElement represents an element of the field GF(2^255 - 19). An element
-// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
-// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on
-// context.
-type fieldElement [10]int32
-
-func feZero(fe *fieldElement) {
-       for i := range fe {
-               fe[i] = 0
-       }
-}
-
-func feOne(fe *fieldElement) {
-       feZero(fe)
-       fe[0] = 1
-}
-
-func feAdd(dst, a, b *fieldElement) {
-       for i := range dst {
-               dst[i] = a[i] + b[i]
-       }
-}
-
-func feSub(dst, a, b *fieldElement) {
-       for i := range dst {
-               dst[i] = a[i] - b[i]
-       }
-}
-
-func feCopy(dst, src *fieldElement) {
-       for i := range dst {
-               dst[i] = src[i]
-       }
-}
-
-// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0.
-//
-// Preconditions: b in {0,1}.
-func feCSwap(f, g *fieldElement, b int32) {
-       b = -b
-       for i := range f {
-               t := b & (f[i] ^ g[i])
-               f[i] ^= t
-               g[i] ^= t
-       }
-}
-
-// load3 reads a 24-bit, little-endian value from in.
-func load3(in []byte) int64 {
-       var r int64
-       r = int64(in[0])
-       r |= int64(in[1]) << 8
-       r |= int64(in[2]) << 16
-       return r
-}
-
-// load4 reads a 32-bit, little-endian value from in.
-func load4(in []byte) int64 {
-       return int64(binary.LittleEndian.Uint32(in))
-}
-
-func feFromBytes(dst *fieldElement, src *[32]byte) {
-       h0 := load4(src[:])
-       h1 := load3(src[4:]) << 6
-       h2 := load3(src[7:]) << 5
-       h3 := load3(src[10:]) << 3
-       h4 := load3(src[13:]) << 2
-       h5 := load4(src[16:])
-       h6 := load3(src[20:]) << 7
-       h7 := load3(src[23:]) << 5
-       h8 := load3(src[26:]) << 4
-       h9 := load3(src[29:]) << 2
-
-       var carry [10]int64
-       carry[9] = (h9 + 1<<24) >> 25
-       h0 += carry[9] * 19
-       h9 -= carry[9] << 25
-       carry[1] = (h1 + 1<<24) >> 25
-       h2 += carry[1]
-       h1 -= carry[1] << 25
-       carry[3] = (h3 + 1<<24) >> 25
-       h4 += carry[3]
-       h3 -= carry[3] << 25
-       carry[5] = (h5 + 1<<24) >> 25
-       h6 += carry[5]
-       h5 -= carry[5] << 25
-       carry[7] = (h7 + 1<<24) >> 25
-       h8 += carry[7]
-       h7 -= carry[7] << 25
-
-       carry[0] = (h0 + 1<<25) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-       carry[2] = (h2 + 1<<25) >> 26
-       h3 += carry[2]
-       h2 -= carry[2] << 26
-       carry[4] = (h4 + 1<<25) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-       carry[6] = (h6 + 1<<25) >> 26
-       h7 += carry[6]
-       h6 -= carry[6] << 26
-       carry[8] = (h8 + 1<<25) >> 26
-       h9 += carry[8]
-       h8 -= carry[8] << 26
-
-       dst[0] = int32(h0)
-       dst[1] = int32(h1)
-       dst[2] = int32(h2)
-       dst[3] = int32(h3)
-       dst[4] = int32(h4)
-       dst[5] = int32(h5)
-       dst[6] = int32(h6)
-       dst[7] = int32(h7)
-       dst[8] = int32(h8)
-       dst[9] = int32(h9)
-}
-
-// feToBytes marshals h to s.
-// Preconditions:
-//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
-//
-// Write p=2^255-19; q=floor(h/p).
-// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
-//
-// Proof:
-//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
-//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
-//
-//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
-//   Then 0<y<1.
-//
-//   Write r=h-pq.
-//   Have 0<=r<=p-1=2^255-20.
-//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
-//
-//   Write x=r+19(2^-255)r+y.
-//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
-//
-//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
-//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
-func feToBytes(s *[32]byte, h *fieldElement) {
-       var carry [10]int32
-
-       q := (19*h[9] + (1 << 24)) >> 25
-       q = (h[0] + q) >> 26
-       q = (h[1] + q) >> 25
-       q = (h[2] + q) >> 26
-       q = (h[3] + q) >> 25
-       q = (h[4] + q) >> 26
-       q = (h[5] + q) >> 25
-       q = (h[6] + q) >> 26
-       q = (h[7] + q) >> 25
-       q = (h[8] + q) >> 26
-       q = (h[9] + q) >> 25
-
-       // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
-       h[0] += 19 * q
-       // Goal: Output h-2^255 q, which is between 0 and 2^255-20.
-
-       carry[0] = h[0] >> 26
-       h[1] += carry[0]
-       h[0] -= carry[0] << 26
-       carry[1] = h[1] >> 25
-       h[2] += carry[1]
-       h[1] -= carry[1] << 25
-       carry[2] = h[2] >> 26
-       h[3] += carry[2]
-       h[2] -= carry[2] << 26
-       carry[3] = h[3] >> 25
-       h[4] += carry[3]
-       h[3] -= carry[3] << 25
-       carry[4] = h[4] >> 26
-       h[5] += carry[4]
-       h[4] -= carry[4] << 26
-       carry[5] = h[5] >> 25
-       h[6] += carry[5]
-       h[5] -= carry[5] << 25
-       carry[6] = h[6] >> 26
-       h[7] += carry[6]
-       h[6] -= carry[6] << 26
-       carry[7] = h[7] >> 25
-       h[8] += carry[7]
-       h[7] -= carry[7] << 25
-       carry[8] = h[8] >> 26
-       h[9] += carry[8]
-       h[8] -= carry[8] << 26
-       carry[9] = h[9] >> 25
-       h[9] -= carry[9] << 25
-       // h10 = carry9
-
-       // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
-       // Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
-       // evidently 2^255 h10-2^255 q = 0.
-       // Goal: Output h[0]+...+2^230 h[9].
-
-       s[0] = byte(h[0] >> 0)
-       s[1] = byte(h[0] >> 8)
-       s[2] = byte(h[0] >> 16)
-       s[3] = byte((h[0] >> 24) | (h[1] << 2))
-       s[4] = byte(h[1] >> 6)
-       s[5] = byte(h[1] >> 14)
-       s[6] = byte((h[1] >> 22) | (h[2] << 3))
-       s[7] = byte(h[2] >> 5)
-       s[8] = byte(h[2] >> 13)
-       s[9] = byte((h[2] >> 21) | (h[3] << 5))
-       s[10] = byte(h[3] >> 3)
-       s[11] = byte(h[3] >> 11)
-       s[12] = byte((h[3] >> 19) | (h[4] << 6))
-       s[13] = byte(h[4] >> 2)
-       s[14] = byte(h[4] >> 10)
-       s[15] = byte(h[4] >> 18)
-       s[16] = byte(h[5] >> 0)
-       s[17] = byte(h[5] >> 8)
-       s[18] = byte(h[5] >> 16)
-       s[19] = byte((h[5] >> 24) | (h[6] << 1))
-       s[20] = byte(h[6] >> 7)
-       s[21] = byte(h[6] >> 15)
-       s[22] = byte((h[6] >> 23) | (h[7] << 3))
-       s[23] = byte(h[7] >> 5)
-       s[24] = byte(h[7] >> 13)
-       s[25] = byte((h[7] >> 21) | (h[8] << 4))
-       s[26] = byte(h[8] >> 4)
-       s[27] = byte(h[8] >> 12)
-       s[28] = byte((h[8] >> 20) | (h[9] << 6))
-       s[29] = byte(h[9] >> 2)
-       s[30] = byte(h[9] >> 10)
-       s[31] = byte(h[9] >> 18)
-}
-
-// feMul calculates h = f * g
-// Can overlap h with f or g.
-//
-// Preconditions:
-//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
-//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
-//
-// Postconditions:
-//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
-//
-// Notes on implementation strategy:
-//
-// Using schoolbook multiplication.
-// Karatsuba would save a little in some cost models.
-//
-// Most multiplications by 2 and 19 are 32-bit precomputations;
-// cheaper than 64-bit postcomputations.
-//
-// There is one remaining multiplication by 19 in the carry chain;
-// one *19 precomputation can be merged into this,
-// but the resulting data flow is considerably less clean.
-//
-// There are 12 carries below.
-// 10 of them are 2-way parallelizable and vectorizable.
-// Can get away with 11 carries, but then data flow is much deeper.
-//
-// With tighter constraints on inputs can squeeze carries into int32.
-func feMul(h, f, g *fieldElement) {
-       f0 := f[0]
-       f1 := f[1]
-       f2 := f[2]
-       f3 := f[3]
-       f4 := f[4]
-       f5 := f[5]
-       f6 := f[6]
-       f7 := f[7]
-       f8 := f[8]
-       f9 := f[9]
-       g0 := g[0]
-       g1 := g[1]
-       g2 := g[2]
-       g3 := g[3]
-       g4 := g[4]
-       g5 := g[5]
-       g6 := g[6]
-       g7 := g[7]
-       g8 := g[8]
-       g9 := g[9]
-       g1_19 := 19 * g1 // 1.4*2^29
-       g2_19 := 19 * g2 // 1.4*2^30; still ok
-       g3_19 := 19 * g3
-       g4_19 := 19 * g4
-       g5_19 := 19 * g5
-       g6_19 := 19 * g6
-       g7_19 := 19 * g7
-       g8_19 := 19 * g8
-       g9_19 := 19 * g9
-       f1_2 := 2 * f1
-       f3_2 := 2 * f3
-       f5_2 := 2 * f5
-       f7_2 := 2 * f7
-       f9_2 := 2 * f9
-       f0g0 := int64(f0) * int64(g0)
-       f0g1 := int64(f0) * int64(g1)
-       f0g2 := int64(f0) * int64(g2)
-       f0g3 := int64(f0) * int64(g3)
-       f0g4 := int64(f0) * int64(g4)
-       f0g5 := int64(f0) * int64(g5)
-       f0g6 := int64(f0) * int64(g6)
-       f0g7 := int64(f0) * int64(g7)
-       f0g8 := int64(f0) * int64(g8)
-       f0g9 := int64(f0) * int64(g9)
-       f1g0 := int64(f1) * int64(g0)
-       f1g1_2 := int64(f1_2) * int64(g1)
-       f1g2 := int64(f1) * int64(g2)
-       f1g3_2 := int64(f1_2) * int64(g3)
-       f1g4 := int64(f1) * int64(g4)
-       f1g5_2 := int64(f1_2) * int64(g5)
-       f1g6 := int64(f1) * int64(g6)
-       f1g7_2 := int64(f1_2) * int64(g7)
-       f1g8 := int64(f1) * int64(g8)
-       f1g9_38 := int64(f1_2) * int64(g9_19)
-       f2g0 := int64(f2) * int64(g0)
-       f2g1 := int64(f2) * int64(g1)
-       f2g2 := int64(f2) * int64(g2)
-       f2g3 := int64(f2) * int64(g3)
-       f2g4 := int64(f2) * int64(g4)
-       f2g5 := int64(f2) * int64(g5)
-       f2g6 := int64(f2) * int64(g6)
-       f2g7 := int64(f2) * int64(g7)
-       f2g8_19 := int64(f2) * int64(g8_19)
-       f2g9_19 := int64(f2) * int64(g9_19)
-       f3g0 := int64(f3) * int64(g0)
-       f3g1_2 := int64(f3_2) * int64(g1)
-       f3g2 := int64(f3) * int64(g2)
-       f3g3_2 := int64(f3_2) * int64(g3)
-       f3g4 := int64(f3) * int64(g4)
-       f3g5_2 := int64(f3_2) * int64(g5)
-       f3g6 := int64(f3) * int64(g6)
-       f3g7_38 := int64(f3_2) * int64(g7_19)
-       f3g8_19 := int64(f3) * int64(g8_19)
-       f3g9_38 := int64(f3_2) * int64(g9_19)
-       f4g0 := int64(f4) * int64(g0)
-       f4g1 := int64(f4) * int64(g1)
-       f4g2 := int64(f4) * int64(g2)
-       f4g3 := int64(f4) * int64(g3)
-       f4g4 := int64(f4) * int64(g4)
-       f4g5 := int64(f4) * int64(g5)
-       f4g6_19 := int64(f4) * int64(g6_19)
-       f4g7_19 := int64(f4) * int64(g7_19)
-       f4g8_19 := int64(f4) * int64(g8_19)
-       f4g9_19 := int64(f4) * int64(g9_19)
-       f5g0 := int64(f5) * int64(g0)
-       f5g1_2 := int64(f5_2) * int64(g1)
-       f5g2 := int64(f5) * int64(g2)
-       f5g3_2 := int64(f5_2) * int64(g3)
-       f5g4 := int64(f5) * int64(g4)
-       f5g5_38 := int64(f5_2) * int64(g5_19)
-       f5g6_19 := int64(f5) * int64(g6_19)
-       f5g7_38 := int64(f5_2) * int64(g7_19)
-       f5g8_19 := int64(f5) * int64(g8_19)
-       f5g9_38 := int64(f5_2) * int64(g9_19)
-       f6g0 := int64(f6) * int64(g0)
-       f6g1 := int64(f6) * int64(g1)
-       f6g2 := int64(f6) * int64(g2)
-       f6g3 := int64(f6) * int64(g3)
-       f6g4_19 := int64(f6) * int64(g4_19)
-       f6g5_19 := int64(f6) * int64(g5_19)
-       f6g6_19 := int64(f6) * int64(g6_19)
-       f6g7_19 := int64(f6) * int64(g7_19)
-       f6g8_19 := int64(f6) * int64(g8_19)
-       f6g9_19 := int64(f6) * int64(g9_19)
-       f7g0 := int64(f7) * int64(g0)
-       f7g1_2 := int64(f7_2) * int64(g1)
-       f7g2 := int64(f7) * int64(g2)
-       f7g3_38 := int64(f7_2) * int64(g3_19)
-       f7g4_19 := int64(f7) * int64(g4_19)
-       f7g5_38 := int64(f7_2) * int64(g5_19)
-       f7g6_19 := int64(f7) * int64(g6_19)
-       f7g7_38 := int64(f7_2) * int64(g7_19)
-       f7g8_19 := int64(f7) * int64(g8_19)
-       f7g9_38 := int64(f7_2) * int64(g9_19)
-       f8g0 := int64(f8) * int64(g0)
-       f8g1 := int64(f8) * int64(g1)
-       f8g2_19 := int64(f8) * int64(g2_19)
-       f8g3_19 := int64(f8) * int64(g3_19)
-       f8g4_19 := int64(f8) * int64(g4_19)
-       f8g5_19 := int64(f8) * int64(g5_19)
-       f8g6_19 := int64(f8) * int64(g6_19)
-       f8g7_19 := int64(f8) * int64(g7_19)
-       f8g8_19 := int64(f8) * int64(g8_19)
-       f8g9_19 := int64(f8) * int64(g9_19)
-       f9g0 := int64(f9) * int64(g0)
-       f9g1_38 := int64(f9_2) * int64(g1_19)
-       f9g2_19 := int64(f9) * int64(g2_19)
-       f9g3_38 := int64(f9_2) * int64(g3_19)
-       f9g4_19 := int64(f9) * int64(g4_19)
-       f9g5_38 := int64(f9_2) * int64(g5_19)
-       f9g6_19 := int64(f9) * int64(g6_19)
-       f9g7_38 := int64(f9_2) * int64(g7_19)
-       f9g8_19 := int64(f9) * int64(g8_19)
-       f9g9_38 := int64(f9_2) * int64(g9_19)
-       h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38
-       h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19
-       h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38
-       h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19
-       h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38
-       h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19
-       h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38
-       h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19
-       h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38
-       h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0
-       var carry [10]int64
-
-       // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
-       //   i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
-       // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
-       //   i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
-
-       carry[0] = (h0 + (1 << 25)) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-       carry[4] = (h4 + (1 << 25)) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-       // |h0| <= 2^25
-       // |h4| <= 2^25
-       // |h1| <= 1.51*2^58
-       // |h5| <= 1.51*2^58
-
-       carry[1] = (h1 + (1 << 24)) >> 25
-       h2 += carry[1]
-       h1 -= carry[1] << 25
-       carry[5] = (h5 + (1 << 24)) >> 25
-       h6 += carry[5]
-       h5 -= carry[5] << 25
-       // |h1| <= 2^24; from now on fits into int32
-       // |h5| <= 2^24; from now on fits into int32
-       // |h2| <= 1.21*2^59
-       // |h6| <= 1.21*2^59
-
-       carry[2] = (h2 + (1 << 25)) >> 26
-       h3 += carry[2]
-       h2 -= carry[2] << 26
-       carry[6] = (h6 + (1 << 25)) >> 26
-       h7 += carry[6]
-       h6 -= carry[6] << 26
-       // |h2| <= 2^25; from now on fits into int32 unchanged
-       // |h6| <= 2^25; from now on fits into int32 unchanged
-       // |h3| <= 1.51*2^58
-       // |h7| <= 1.51*2^58
-
-       carry[3] = (h3 + (1 << 24)) >> 25
-       h4 += carry[3]
-       h3 -= carry[3] << 25
-       carry[7] = (h7 + (1 << 24)) >> 25
-       h8 += carry[7]
-       h7 -= carry[7] << 25
-       // |h3| <= 2^24; from now on fits into int32 unchanged
-       // |h7| <= 2^24; from now on fits into int32 unchanged
-       // |h4| <= 1.52*2^33
-       // |h8| <= 1.52*2^33
-
-       carry[4] = (h4 + (1 << 25)) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-       carry[8] = (h8 + (1 << 25)) >> 26
-       h9 += carry[8]
-       h8 -= carry[8] << 26
-       // |h4| <= 2^25; from now on fits into int32 unchanged
-       // |h8| <= 2^25; from now on fits into int32 unchanged
-       // |h5| <= 1.01*2^24
-       // |h9| <= 1.51*2^58
-
-       carry[9] = (h9 + (1 << 24)) >> 25
-       h0 += carry[9] * 19
-       h9 -= carry[9] << 25
-       // |h9| <= 2^24; from now on fits into int32 unchanged
-       // |h0| <= 1.8*2^37
-
-       carry[0] = (h0 + (1 << 25)) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-       // |h0| <= 2^25; from now on fits into int32 unchanged
-       // |h1| <= 1.01*2^24
-
-       h[0] = int32(h0)
-       h[1] = int32(h1)
-       h[2] = int32(h2)
-       h[3] = int32(h3)
-       h[4] = int32(h4)
-       h[5] = int32(h5)
-       h[6] = int32(h6)
-       h[7] = int32(h7)
-       h[8] = int32(h8)
-       h[9] = int32(h9)
-}
-
-// feSquare calculates h = f*f. Can overlap h with f.
-//
-// Preconditions:
-//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
-//
-// Postconditions:
-//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
-func feSquare(h, f *fieldElement) {
-       f0 := f[0]
-       f1 := f[1]
-       f2 := f[2]
-       f3 := f[3]
-       f4 := f[4]
-       f5 := f[5]
-       f6 := f[6]
-       f7 := f[7]
-       f8 := f[8]
-       f9 := f[9]
-       f0_2 := 2 * f0
-       f1_2 := 2 * f1
-       f2_2 := 2 * f2
-       f3_2 := 2 * f3
-       f4_2 := 2 * f4
-       f5_2 := 2 * f5
-       f6_2 := 2 * f6
-       f7_2 := 2 * f7
-       f5_38 := 38 * f5 // 1.31*2^30
-       f6_19 := 19 * f6 // 1.31*2^30
-       f7_38 := 38 * f7 // 1.31*2^30
-       f8_19 := 19 * f8 // 1.31*2^30
-       f9_38 := 38 * f9 // 1.31*2^30
-       f0f0 := int64(f0) * int64(f0)
-       f0f1_2 := int64(f0_2) * int64(f1)
-       f0f2_2 := int64(f0_2) * int64(f2)
-       f0f3_2 := int64(f0_2) * int64(f3)
-       f0f4_2 := int64(f0_2) * int64(f4)
-       f0f5_2 := int64(f0_2) * int64(f5)
-       f0f6_2 := int64(f0_2) * int64(f6)
-       f0f7_2 := int64(f0_2) * int64(f7)
-       f0f8_2 := int64(f0_2) * int64(f8)
-       f0f9_2 := int64(f0_2) * int64(f9)
-       f1f1_2 := int64(f1_2) * int64(f1)
-       f1f2_2 := int64(f1_2) * int64(f2)
-       f1f3_4 := int64(f1_2) * int64(f3_2)
-       f1f4_2 := int64(f1_2) * int64(f4)
-       f1f5_4 := int64(f1_2) * int64(f5_2)
-       f1f6_2 := int64(f1_2) * int64(f6)
-       f1f7_4 := int64(f1_2) * int64(f7_2)
-       f1f8_2 := int64(f1_2) * int64(f8)
-       f1f9_76 := int64(f1_2) * int64(f9_38)
-       f2f2 := int64(f2) * int64(f2)
-       f2f3_2 := int64(f2_2) * int64(f3)
-       f2f4_2 := int64(f2_2) * int64(f4)
-       f2f5_2 := int64(f2_2) * int64(f5)
-       f2f6_2 := int64(f2_2) * int64(f6)
-       f2f7_2 := int64(f2_2) * int64(f7)
-       f2f8_38 := int64(f2_2) * int64(f8_19)
-       f2f9_38 := int64(f2) * int64(f9_38)
-       f3f3_2 := int64(f3_2) * int64(f3)
-       f3f4_2 := int64(f3_2) * int64(f4)
-       f3f5_4 := int64(f3_2) * int64(f5_2)
-       f3f6_2 := int64(f3_2) * int64(f6)
-       f3f7_76 := int64(f3_2) * int64(f7_38)
-       f3f8_38 := int64(f3_2) * int64(f8_19)
-       f3f9_76 := int64(f3_2) * int64(f9_38)
-       f4f4 := int64(f4) * int64(f4)
-       f4f5_2 := int64(f4_2) * int64(f5)
-       f4f6_38 := int64(f4_2) * int64(f6_19)
-       f4f7_38 := int64(f4) * int64(f7_38)
-       f4f8_38 := int64(f4_2) * int64(f8_19)
-       f4f9_38 := int64(f4) * int64(f9_38)
-       f5f5_38 := int64(f5) * int64(f5_38)
-       f5f6_38 := int64(f5_2) * int64(f6_19)
-       f5f7_76 := int64(f5_2) * int64(f7_38)
-       f5f8_38 := int64(f5_2) * int64(f8_19)
-       f5f9_76 := int64(f5_2) * int64(f9_38)
-       f6f6_19 := int64(f6) * int64(f6_19)
-       f6f7_38 := int64(f6) * int64(f7_38)
-       f6f8_38 := int64(f6_2) * int64(f8_19)
-       f6f9_38 := int64(f6) * int64(f9_38)
-       f7f7_38 := int64(f7) * int64(f7_38)
-       f7f8_38 := int64(f7_2) * int64(f8_19)
-       f7f9_76 := int64(f7_2) * int64(f9_38)
-       f8f8_19 := int64(f8) * int64(f8_19)
-       f8f9_38 := int64(f8) * int64(f9_38)
-       f9f9_38 := int64(f9) * int64(f9_38)
-       h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38
-       h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38
-       h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19
-       h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38
-       h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38
-       h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38
-       h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19
-       h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38
-       h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38
-       h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2
-       var carry [10]int64
-
-       carry[0] = (h0 + (1 << 25)) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-       carry[4] = (h4 + (1 << 25)) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-
-       carry[1] = (h1 + (1 << 24)) >> 25
-       h2 += carry[1]
-       h1 -= carry[1] << 25
-       carry[5] = (h5 + (1 << 24)) >> 25
-       h6 += carry[5]
-       h5 -= carry[5] << 25
-
-       carry[2] = (h2 + (1 << 25)) >> 26
-       h3 += carry[2]
-       h2 -= carry[2] << 26
-       carry[6] = (h6 + (1 << 25)) >> 26
-       h7 += carry[6]
-       h6 -= carry[6] << 26
-
-       carry[3] = (h3 + (1 << 24)) >> 25
-       h4 += carry[3]
-       h3 -= carry[3] << 25
-       carry[7] = (h7 + (1 << 24)) >> 25
-       h8 += carry[7]
-       h7 -= carry[7] << 25
-
-       carry[4] = (h4 + (1 << 25)) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-       carry[8] = (h8 + (1 << 25)) >> 26
-       h9 += carry[8]
-       h8 -= carry[8] << 26
-
-       carry[9] = (h9 + (1 << 24)) >> 25
-       h0 += carry[9] * 19
-       h9 -= carry[9] << 25
-
-       carry[0] = (h0 + (1 << 25)) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-
-       h[0] = int32(h0)
-       h[1] = int32(h1)
-       h[2] = int32(h2)
-       h[3] = int32(h3)
-       h[4] = int32(h4)
-       h[5] = int32(h5)
-       h[6] = int32(h6)
-       h[7] = int32(h7)
-       h[8] = int32(h8)
-       h[9] = int32(h9)
-}
-
-// feMul121666 calculates h = f * 121666. Can overlap h with f.
-//
-// Preconditions:
-//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
-//
-// Postconditions:
-//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
-func feMul121666(h, f *fieldElement) {
-       h0 := int64(f[0]) * 121666
-       h1 := int64(f[1]) * 121666
-       h2 := int64(f[2]) * 121666
-       h3 := int64(f[3]) * 121666
-       h4 := int64(f[4]) * 121666
-       h5 := int64(f[5]) * 121666
-       h6 := int64(f[6]) * 121666
-       h7 := int64(f[7]) * 121666
-       h8 := int64(f[8]) * 121666
-       h9 := int64(f[9]) * 121666
-       var carry [10]int64
-
-       carry[9] = (h9 + (1 << 24)) >> 25
-       h0 += carry[9] * 19
-       h9 -= carry[9] << 25
-       carry[1] = (h1 + (1 << 24)) >> 25
-       h2 += carry[1]
-       h1 -= carry[1] << 25
-       carry[3] = (h3 + (1 << 24)) >> 25
-       h4 += carry[3]
-       h3 -= carry[3] << 25
-       carry[5] = (h5 + (1 << 24)) >> 25
-       h6 += carry[5]
-       h5 -= carry[5] << 25
-       carry[7] = (h7 + (1 << 24)) >> 25
-       h8 += carry[7]
-       h7 -= carry[7] << 25
-
-       carry[0] = (h0 + (1 << 25)) >> 26
-       h1 += carry[0]
-       h0 -= carry[0] << 26
-       carry[2] = (h2 + (1 << 25)) >> 26
-       h3 += carry[2]
-       h2 -= carry[2] << 26
-       carry[4] = (h4 + (1 << 25)) >> 26
-       h5 += carry[4]
-       h4 -= carry[4] << 26
-       carry[6] = (h6 + (1 << 25)) >> 26
-       h7 += carry[6]
-       h6 -= carry[6] << 26
-       carry[8] = (h8 + (1 << 25)) >> 26
-       h9 += carry[8]
-       h8 -= carry[8] << 26
-
-       h[0] = int32(h0)
-       h[1] = int32(h1)
-       h[2] = int32(h2)
-       h[3] = int32(h3)
-       h[4] = int32(h4)
-       h[5] = int32(h5)
-       h[6] = int32(h6)
-       h[7] = int32(h7)
-       h[8] = int32(h8)
-       h[9] = int32(h9)
-}
-
-// feInvert sets out = z^-1.
-func feInvert(out, z *fieldElement) {
-       var t0, t1, t2, t3 fieldElement
-       var i int
-
-       feSquare(&t0, z)
-       for i = 1; i < 1; i++ {
-               feSquare(&t0, &t0)
-       }
-       feSquare(&t1, &t0)
-       for i = 1; i < 2; i++ {
-               feSquare(&t1, &t1)
-       }
-       feMul(&t1, z, &t1)
-       feMul(&t0, &t0, &t1)
-       feSquare(&t2, &t0)
-       for i = 1; i < 1; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t1, &t1, &t2)
-       feSquare(&t2, &t1)
-       for i = 1; i < 5; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t1, &t2, &t1)
-       feSquare(&t2, &t1)
-       for i = 1; i < 10; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t2, &t2, &t1)
-       feSquare(&t3, &t2)
-       for i = 1; i < 20; i++ {
-               feSquare(&t3, &t3)
-       }
-       feMul(&t2, &t3, &t2)
-       feSquare(&t2, &t2)
-       for i = 1; i < 10; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t1, &t2, &t1)
-       feSquare(&t2, &t1)
-       for i = 1; i < 50; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t2, &t2, &t1)
-       feSquare(&t3, &t2)
-       for i = 1; i < 100; i++ {
-               feSquare(&t3, &t3)
-       }
-       feMul(&t2, &t3, &t2)
-       feSquare(&t2, &t2)
-       for i = 1; i < 50; i++ {
-               feSquare(&t2, &t2)
-       }
-       feMul(&t1, &t2, &t1)
-       feSquare(&t1, &t1)
-       for i = 1; i < 5; i++ {
-               feSquare(&t1, &t1)
-       }
-       feMul(out, &t1, &t0)
-}
-
-func scalarMult(out, in, base *[32]byte) {
-       var e [32]byte
-
-       copy(e[:], in[:])
-       e[0] &= 248
-       e[31] &= 127
-       e[31] |= 64
-
-       var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement
-       feFromBytes(&x1, base)
-       feOne(&x2)
-       feCopy(&x3, &x1)
-       feOne(&z3)
-
-       swap := int32(0)
-       for pos := 254; pos >= 0; pos-- {
-               b := e[pos/8] >> uint(pos&7)
-               b &= 1
-               swap ^= int32(b)
-               feCSwap(&x2, &x3, swap)
-               feCSwap(&z2, &z3, swap)
-               swap = int32(b)
-
-               feSub(&tmp0, &x3, &z3)
-               feSub(&tmp1, &x2, &z2)
-               feAdd(&x2, &x2, &z2)
-               feAdd(&z2, &x3, &z3)
-               feMul(&z3, &tmp0, &x2)
-               feMul(&z2, &z2, &tmp1)
-               feSquare(&tmp0, &tmp1)
-               feSquare(&tmp1, &x2)
-               feAdd(&x3, &z3, &z2)
-               feSub(&z2, &z3, &z2)
-               feMul(&x2, &tmp1, &tmp0)
-               feSub(&tmp1, &tmp1, &tmp0)
-               feSquare(&z2, &z2)
-               feMul121666(&z3, &tmp1)
-               feSquare(&x3, &x3)
-               feAdd(&tmp0, &tmp0, &z3)
-               feMul(&z3, &x1, &z2)
-               feMul(&z2, &tmp1, &tmp0)
-       }
-
-       feCSwap(&x2, &x3, swap)
-       feCSwap(&z2, &z3, swap)
-
-       feInvert(&z2, &z2)
-       feMul(&x2, &x2, &z2)
-       feToBytes(out, &x2)
-}
diff --git a/libgo/go/internal/x/crypto/curve25519/curve25519_test.go b/libgo/go/internal/x/crypto/curve25519/curve25519_test.go
deleted file mode 100644 (file)
index 051a830..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package curve25519
-
-import (
-       "fmt"
-       "testing"
-)
-
-const expectedHex = "89161fde887b2b53de549af483940106ecc114d6982daa98256de23bdf77661a"
-
-func TestBaseScalarMult(t *testing.T) {
-       var a, b [32]byte
-       in := &a
-       out := &b
-       a[0] = 1
-
-       for i := 0; i < 200; i++ {
-               ScalarBaseMult(out, in)
-               in, out = out, in
-       }
-
-       result := fmt.Sprintf("%x", in[:])
-       if result != expectedHex {
-               t.Errorf("incorrect result: got %s, want %s", result, expectedHex)
-       }
-}
-
-func BenchmarkScalarBaseMult(b *testing.B) {
-       var in, out [32]byte
-       in[0] = 1
-
-       b.SetBytes(32)
-       for i := 0; i < b.N; i++ {
-               ScalarBaseMult(&out, &in)
-       }
-}
diff --git a/libgo/go/internal/x/crypto/curve25519/doc.go b/libgo/go/internal/x/crypto/curve25519/doc.go
deleted file mode 100644 (file)
index 076a8d4..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package curve25519 provides an implementation of scalar multiplication on
-// the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html
-package curve25519
-
-// basePoint is the x coordinate of the generator of the curve.
-var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-
-// ScalarMult sets dst to the product in*base where dst and base are the x
-// coordinates of group points and all values are in little-endian form.
-func ScalarMult(dst, in, base *[32]byte) {
-       scalarMult(dst, in, base)
-}
-
-// ScalarBaseMult sets dst to the product in*base where dst and base are the x
-// coordinates of group points, base is the standard generator and all values
-// are in little-endian form.
-func ScalarBaseMult(dst, in *[32]byte) {
-       ScalarMult(dst, in, &basePoint)
-}
diff --git a/libgo/go/internal/x/crypto/curve25519/mont25519_amd64.go b/libgo/go/internal/x/crypto/curve25519/mont25519_amd64.go
deleted file mode 100644 (file)
index 5822bd5..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!gccgo,!appengine
-
-package curve25519
-
-// These functions are implemented in the .s files. The names of the functions
-// in the rest of the file are also taken from the SUPERCOP sources to help
-// people following along.
-
-//go:noescape
-
-func cswap(inout *[5]uint64, v uint64)
-
-//go:noescape
-
-func ladderstep(inout *[5][5]uint64)
-
-//go:noescape
-
-func freeze(inout *[5]uint64)
-
-//go:noescape
-
-func mul(dest, a, b *[5]uint64)
-
-//go:noescape
-
-func square(out, in *[5]uint64)
-
-// mladder uses a Montgomery ladder to calculate (xr/zr) *= s.
-func mladder(xr, zr *[5]uint64, s *[32]byte) {
-       var work [5][5]uint64
-
-       work[0] = *xr
-       setint(&work[1], 1)
-       setint(&work[2], 0)
-       work[3] = *xr
-       setint(&work[4], 1)
-
-       j := uint(6)
-       var prevbit byte
-
-       for i := 31; i >= 0; i-- {
-               for j < 8 {
-                       bit := ((*s)[i] >> j) & 1
-                       swap := bit ^ prevbit
-                       prevbit = bit
-                       cswap(&work[1], uint64(swap))
-                       ladderstep(&work)
-                       j--
-               }
-               j = 7
-       }
-
-       *xr = work[1]
-       *zr = work[2]
-}
-
-func scalarMult(out, in, base *[32]byte) {
-       var e [32]byte
-       copy(e[:], (*in)[:])
-       e[0] &= 248
-       e[31] &= 127
-       e[31] |= 64
-
-       var t, z [5]uint64
-       unpack(&t, base)
-       mladder(&t, &z, &e)
-       invert(&z, &z)
-       mul(&t, &t, &z)
-       pack(out, &t)
-}
-
-func setint(r *[5]uint64, v uint64) {
-       r[0] = v
-       r[1] = 0
-       r[2] = 0
-       r[3] = 0
-       r[4] = 0
-}
-
-// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian
-// order.
-func unpack(r *[5]uint64, x *[32]byte) {
-       r[0] = uint64(x[0]) |
-               uint64(x[1])<<8 |
-               uint64(x[2])<<16 |
-               uint64(x[3])<<24 |
-               uint64(x[4])<<32 |
-               uint64(x[5])<<40 |
-               uint64(x[6]&7)<<48
-
-       r[1] = uint64(x[6])>>3 |
-               uint64(x[7])<<5 |
-               uint64(x[8])<<13 |
-               uint64(x[9])<<21 |
-               uint64(x[10])<<29 |
-               uint64(x[11])<<37 |
-               uint64(x[12]&63)<<45
-
-       r[2] = uint64(x[12])>>6 |
-               uint64(x[13])<<2 |
-               uint64(x[14])<<10 |
-               uint64(x[15])<<18 |
-               uint64(x[16])<<26 |
-               uint64(x[17])<<34 |
-               uint64(x[18])<<42 |
-               uint64(x[19]&1)<<50
-
-       r[3] = uint64(x[19])>>1 |
-               uint64(x[20])<<7 |
-               uint64(x[21])<<15 |
-               uint64(x[22])<<23 |
-               uint64(x[23])<<31 |
-               uint64(x[24])<<39 |
-               uint64(x[25]&15)<<47
-
-       r[4] = uint64(x[25])>>4 |
-               uint64(x[26])<<4 |
-               uint64(x[27])<<12 |
-               uint64(x[28])<<20 |
-               uint64(x[29])<<28 |
-               uint64(x[30])<<36 |
-               uint64(x[31]&127)<<44
-}
-
-// pack sets out = x where out is the usual, little-endian form of the 5,
-// 51-bit limbs in x.
-func pack(out *[32]byte, x *[5]uint64) {
-       t := *x
-       freeze(&t)
-
-       out[0] = byte(t[0])
-       out[1] = byte(t[0] >> 8)
-       out[2] = byte(t[0] >> 16)
-       out[3] = byte(t[0] >> 24)
-       out[4] = byte(t[0] >> 32)
-       out[5] = byte(t[0] >> 40)
-       out[6] = byte(t[0] >> 48)
-
-       out[6] ^= byte(t[1]<<3) & 0xf8
-       out[7] = byte(t[1] >> 5)
-       out[8] = byte(t[1] >> 13)
-       out[9] = byte(t[1] >> 21)
-       out[10] = byte(t[1] >> 29)
-       out[11] = byte(t[1] >> 37)
-       out[12] = byte(t[1] >> 45)
-
-       out[12] ^= byte(t[2]<<6) & 0xc0
-       out[13] = byte(t[2] >> 2)
-       out[14] = byte(t[2] >> 10)
-       out[15] = byte(t[2] >> 18)
-       out[16] = byte(t[2] >> 26)
-       out[17] = byte(t[2] >> 34)
-       out[18] = byte(t[2] >> 42)
-       out[19] = byte(t[2] >> 50)
-
-       out[19] ^= byte(t[3]<<1) & 0xfe
-       out[20] = byte(t[3] >> 7)
-       out[21] = byte(t[3] >> 15)
-       out[22] = byte(t[3] >> 23)
-       out[23] = byte(t[3] >> 31)
-       out[24] = byte(t[3] >> 39)
-       out[25] = byte(t[3] >> 47)
-
-       out[25] ^= byte(t[4]<<4) & 0xf0
-       out[26] = byte(t[4] >> 4)
-       out[27] = byte(t[4] >> 12)
-       out[28] = byte(t[4] >> 20)
-       out[29] = byte(t[4] >> 28)
-       out[30] = byte(t[4] >> 36)
-       out[31] = byte(t[4] >> 44)
-}
-
-// invert calculates r = x^-1 mod p using Fermat's little theorem.
-func invert(r *[5]uint64, x *[5]uint64) {
-       var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64
-
-       square(&z2, x)        /* 2 */
-       square(&t, &z2)       /* 4 */
-       square(&t, &t)        /* 8 */
-       mul(&z9, &t, x)       /* 9 */
-       mul(&z11, &z9, &z2)   /* 11 */
-       square(&t, &z11)      /* 22 */
-       mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */
-
-       square(&t, &z2_5_0)      /* 2^6 - 2^1 */
-       for i := 1; i < 5; i++ { /* 2^20 - 2^10 */
-               square(&t, &t)
-       }
-       mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */
-
-       square(&t, &z2_10_0)      /* 2^11 - 2^1 */
-       for i := 1; i < 10; i++ { /* 2^20 - 2^10 */
-               square(&t, &t)
-       }
-       mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */
-
-       square(&t, &z2_20_0)      /* 2^21 - 2^1 */
-       for i := 1; i < 20; i++ { /* 2^40 - 2^20 */
-               square(&t, &t)
-       }
-       mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */
-
-       square(&t, &t)            /* 2^41 - 2^1 */
-       for i := 1; i < 10; i++ { /* 2^50 - 2^10 */
-               square(&t, &t)
-       }
-       mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */
-
-       square(&t, &z2_50_0)      /* 2^51 - 2^1 */
-       for i := 1; i < 50; i++ { /* 2^100 - 2^50 */
-               square(&t, &t)
-       }
-       mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */
-
-       square(&t, &z2_100_0)      /* 2^101 - 2^1 */
-       for i := 1; i < 100; i++ { /* 2^200 - 2^100 */
-               square(&t, &t)
-       }
-       mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */
-
-       square(&t, &t)            /* 2^201 - 2^1 */
-       for i := 1; i < 50; i++ { /* 2^250 - 2^50 */
-               square(&t, &t)
-       }
-       mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */
-
-       square(&t, &t) /* 2^251 - 2^1 */
-       square(&t, &t) /* 2^252 - 2^2 */
-       square(&t, &t) /* 2^253 - 2^3 */
-
-       square(&t, &t) /* 2^254 - 2^4 */
-
-       square(&t, &t)   /* 2^255 - 2^5 */
-       mul(r, &t, &z11) /* 2^255 - 21 */
-}
diff --git a/libgo/go/internal/x/crypto/hkdf/example_test.go b/libgo/go/internal/x/crypto/hkdf/example_test.go
deleted file mode 100644 (file)
index cdfbbc8..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package hkdf_test
-
-import (
-       "bytes"
-       "crypto/rand"
-       "crypto/sha256"
-       "fmt"
-       "io"
-
-       "internal/x/crypto/hkdf"
-)
-
-// Usage example that expands one master secret into three other
-// cryptographically secure keys.
-func Example_usage() {
-       // Underlying hash function for HMAC.
-       hash := sha256.New
-
-       // Cryptographically secure master secret.
-       secret := []byte{0x00, 0x01, 0x02, 0x03} // i.e. NOT this.
-
-       // Non-secret salt, optional (can be nil).
-       // Recommended: hash-length random value.
-       salt := make([]byte, hash().Size())
-       if _, err := rand.Read(salt); err != nil {
-               panic(err)
-       }
-
-       // Non-secret context info, optional (can be nil).
-       info := []byte("hkdf example")
-
-       // Generate three 128-bit derived keys.
-       hkdf := hkdf.New(hash, secret, salt, info)
-
-       var keys [][]byte
-       for i := 0; i < 3; i++ {
-               key := make([]byte, 16)
-               if _, err := io.ReadFull(hkdf, key); err != nil {
-                       panic(err)
-               }
-               keys = append(keys, key)
-       }
-
-       for i := range keys {
-               fmt.Printf("Key #%d: %v\n", i+1, !bytes.Equal(keys[i], make([]byte, 16)))
-       }
-
-       // Output:
-       // Key #1: true
-       // Key #2: true
-       // Key #3: true
-}
diff --git a/libgo/go/internal/x/crypto/hkdf/hkdf.go b/libgo/go/internal/x/crypto/hkdf/hkdf.go
deleted file mode 100644 (file)
index c907765..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package hkdf implements the HMAC-based Extract-and-Expand Key Derivation
-// Function (HKDF) as defined in RFC 5869.
-//
-// HKDF is a cryptographic key derivation function (KDF) with the goal of
-// expanding limited input keying material into one or more cryptographically
-// strong secret keys.
-package hkdf
-
-import (
-       "crypto/hmac"
-       "errors"
-       "hash"
-       "io"
-)
-
-// Extract generates a pseudorandom key for use with Expand from an input secret
-// and an optional independent salt.
-//
-// Only use this function if you need to reuse the extracted key with multiple
-// Expand invocations and different context values. Most common scenarios,
-// including the generation of multiple keys, should use New instead.
-func Extract(hash func() hash.Hash, secret, salt []byte) []byte {
-       if salt == nil {
-               salt = make([]byte, hash().Size())
-       }
-       extractor := hmac.New(hash, salt)
-       extractor.Write(secret)
-       return extractor.Sum(nil)
-}
-
-type hkdf struct {
-       expander hash.Hash
-       size     int
-
-       info    []byte
-       counter byte
-
-       prev []byte
-       buf  []byte
-}
-
-func (f *hkdf) Read(p []byte) (int, error) {
-       // Check whether enough data can be generated
-       need := len(p)
-       remains := len(f.buf) + int(255-f.counter+1)*f.size
-       if remains < need {
-               return 0, errors.New("hkdf: entropy limit reached")
-       }
-       // Read any leftover from the buffer
-       n := copy(p, f.buf)
-       p = p[n:]
-
-       // Fill the rest of the buffer
-       for len(p) > 0 {
-               f.expander.Reset()
-               f.expander.Write(f.prev)
-               f.expander.Write(f.info)
-               f.expander.Write([]byte{f.counter})
-               f.prev = f.expander.Sum(f.prev[:0])
-               f.counter++
-
-               // Copy the new batch into p
-               f.buf = f.prev
-               n = copy(p, f.buf)
-               p = p[n:]
-       }
-       // Save leftovers for next run
-       f.buf = f.buf[n:]
-
-       return need, nil
-}
-
-// Expand returns a Reader, from which keys can be read, using the given
-// pseudorandom key and optional context info, skipping the extraction step.
-//
-// The pseudorandomKey should have been generated by Extract, or be a uniformly
-// random or pseudorandom cryptographically strong key. See RFC 5869, Section
-// 3.3. Most common scenarios will want to use New instead.
-func Expand(hash func() hash.Hash, pseudorandomKey, info []byte) io.Reader {
-       expander := hmac.New(hash, pseudorandomKey)
-       return &hkdf{expander, expander.Size(), info, 1, nil, nil}
-}
-
-// New returns a Reader, from which keys can be read, using the given hash,
-// secret, salt and context info. Salt and info can be nil.
-func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader {
-       prk := Extract(hash, secret, salt)
-       return Expand(hash, prk, info)
-}
diff --git a/libgo/go/internal/x/crypto/hkdf/hkdf_test.go b/libgo/go/internal/x/crypto/hkdf/hkdf_test.go
deleted file mode 100644 (file)
index ea57577..0000000
+++ /dev/null
@@ -1,449 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package hkdf
-
-import (
-       "bytes"
-       "crypto/md5"
-       "crypto/sha1"
-       "crypto/sha256"
-       "crypto/sha512"
-       "hash"
-       "io"
-       "testing"
-)
-
-type hkdfTest struct {
-       hash   func() hash.Hash
-       master []byte
-       salt   []byte
-       prk    []byte
-       info   []byte
-       out    []byte
-}
-
-var hkdfTests = []hkdfTest{
-       // Tests from RFC 5869
-       {
-               sha256.New,
-               []byte{
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-               },
-               []byte{
-                       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-                       0x08, 0x09, 0x0a, 0x0b, 0x0c,
-               },
-               []byte{
-                       0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
-                       0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
-                       0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
-                       0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5,
-               },
-               []byte{
-                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                       0xf8, 0xf9,
-               },
-               []byte{
-                       0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a,
-                       0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
-                       0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
-                       0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf,
-                       0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
-                       0x58, 0x65,
-               },
-       },
-       {
-               sha256.New,
-               []byte{
-                       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-                       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-                       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-                       0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-                       0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-                       0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-                       0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-                       0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-                       0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-                       0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-               },
-               []byte{
-                       0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-                       0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-                       0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-                       0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-                       0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-                       0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-                       0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-                       0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-                       0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-                       0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-               },
-               []byte{
-                       0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a,
-                       0x06, 0x10, 0x4c, 0x9c, 0xeb, 0x35, 0xb4, 0x5c,
-                       0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01,
-                       0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44,
-               },
-               []byte{
-                       0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-                       0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-                       0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-                       0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
-                       0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
-                       0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
-                       0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-                       0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
-                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
-               },
-               []byte{
-                       0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1,
-                       0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34,
-                       0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
-                       0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c,
-                       0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72,
-                       0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
-                       0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8,
-                       0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71,
-                       0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
-                       0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f,
-                       0x1d, 0x87,
-               },
-       },
-       {
-               sha256.New,
-               []byte{
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-               },
-               []byte{},
-               []byte{
-                       0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16,
-                       0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf,
-                       0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
-                       0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04,
-               },
-               []byte{},
-               []byte{
-                       0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
-                       0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
-                       0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
-                       0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
-                       0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
-                       0x96, 0xc8,
-               },
-       },
-       {
-               sha256.New,
-               []byte{
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-               },
-               nil,
-               []byte{
-                       0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16,
-                       0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf,
-                       0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
-                       0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04,
-               },
-               nil,
-               []byte{
-                       0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
-                       0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
-                       0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
-                       0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
-                       0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
-                       0x96, 0xc8,
-               },
-       },
-       {
-               sha1.New,
-               []byte{
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b,
-               },
-               []byte{
-                       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-                       0x08, 0x09, 0x0a, 0x0b, 0x0c,
-               },
-               []byte{
-                       0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f,
-                       0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b,
-                       0xaa, 0x2b, 0xa2, 0x43,
-               },
-               []byte{
-                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                       0xf8, 0xf9,
-               },
-               []byte{
-                       0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69,
-                       0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81,
-                       0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15,
-                       0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2,
-                       0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3,
-                       0xf8, 0x96,
-               },
-       },
-       {
-               sha1.New,
-               []byte{
-                       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-                       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-                       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-                       0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-                       0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-                       0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-                       0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-                       0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-                       0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-                       0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-               },
-               []byte{
-                       0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-                       0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-                       0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-                       0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-                       0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-                       0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-                       0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-                       0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-                       0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-                       0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-               },
-               []byte{
-                       0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59,
-                       0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a,
-                       0x22, 0x4c, 0xfa, 0xf6,
-               },
-               []byte{
-                       0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-                       0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-                       0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-                       0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
-                       0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
-                       0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
-                       0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-                       0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
-                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
-               },
-               []byte{
-                       0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7,
-                       0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb,
-                       0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19,
-                       0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe,
-                       0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3,
-                       0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
-                       0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed,
-                       0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e,
-                       0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43,
-                       0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52,
-                       0xd3, 0xb4,
-               },
-       },
-       {
-               sha1.New,
-               []byte{
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-                       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-               },
-               []byte{},
-               []byte{
-                       0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28,
-                       0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a,
-                       0xa0, 0xd3, 0x2d, 0x01,
-               },
-               []byte{},
-               []byte{
-                       0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61,
-                       0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06,
-                       0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06,
-                       0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0,
-                       0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3,
-                       0x49, 0x18,
-               },
-       },
-       {
-               sha1.New,
-               []byte{
-                       0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-                       0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-                       0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-               },
-               nil,
-               []byte{
-                       0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c,
-                       0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e,
-                       0x73, 0x13, 0x85, 0xdd,
-               },
-               nil,
-               []byte{
-                       0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3,
-                       0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a,
-                       0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23,
-                       0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5,
-                       0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac,
-                       0xfc, 0x48,
-               },
-       },
-}
-
-func TestHKDF(t *testing.T) {
-       for i, tt := range hkdfTests {
-               prk := Extract(tt.hash, tt.master, tt.salt)
-               if !bytes.Equal(prk, tt.prk) {
-                       t.Errorf("test %d: incorrect PRK: have %v, need %v.", i, prk, tt.prk)
-               }
-
-               hkdf := New(tt.hash, tt.master, tt.salt, tt.info)
-               out := make([]byte, len(tt.out))
-
-               n, err := io.ReadFull(hkdf, out)
-               if n != len(tt.out) || err != nil {
-                       t.Errorf("test %d: not enough output bytes: %d.", i, n)
-               }
-
-               if !bytes.Equal(out, tt.out) {
-                       t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
-               }
-
-               hkdf = Expand(tt.hash, prk, tt.info)
-
-               n, err = io.ReadFull(hkdf, out)
-               if n != len(tt.out) || err != nil {
-                       t.Errorf("test %d: not enough output bytes from Expand: %d.", i, n)
-               }
-
-               if !bytes.Equal(out, tt.out) {
-                       t.Errorf("test %d: incorrect output from Expand: have %v, need %v.", i, out, tt.out)
-               }
-       }
-}
-
-func TestHKDFMultiRead(t *testing.T) {
-       for i, tt := range hkdfTests {
-               hkdf := New(tt.hash, tt.master, tt.salt, tt.info)
-               out := make([]byte, len(tt.out))
-
-               for b := 0; b < len(tt.out); b++ {
-                       n, err := io.ReadFull(hkdf, out[b:b+1])
-                       if n != 1 || err != nil {
-                               t.Errorf("test %d.%d: not enough output bytes: have %d, need %d .", i, b, n, len(tt.out))
-                       }
-               }
-
-               if !bytes.Equal(out, tt.out) {
-                       t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
-               }
-       }
-}
-
-func TestHKDFLimit(t *testing.T) {
-       hash := sha1.New
-       master := []byte{0x00, 0x01, 0x02, 0x03}
-       info := []byte{}
-
-       hkdf := New(hash, master, nil, info)
-       limit := hash().Size() * 255
-       out := make([]byte, limit)
-
-       // The maximum output bytes should be extractable
-       n, err := io.ReadFull(hkdf, out)
-       if n != limit || err != nil {
-               t.Errorf("not enough output bytes: %d, %v.", n, err)
-       }
-
-       // Reading one more should fail
-       n, err = io.ReadFull(hkdf, make([]byte, 1))
-       if n > 0 || err == nil {
-               t.Errorf("key expansion overflowed: n = %d, err = %v", n, err)
-       }
-}
-
-func Benchmark16ByteMD5Single(b *testing.B) {
-       benchmarkHKDFSingle(md5.New, 16, b)
-}
-
-func Benchmark20ByteSHA1Single(b *testing.B) {
-       benchmarkHKDFSingle(sha1.New, 20, b)
-}
-
-func Benchmark32ByteSHA256Single(b *testing.B) {
-       benchmarkHKDFSingle(sha256.New, 32, b)
-}
-
-func Benchmark64ByteSHA512Single(b *testing.B) {
-       benchmarkHKDFSingle(sha512.New, 64, b)
-}
-
-func Benchmark8ByteMD5Stream(b *testing.B) {
-       benchmarkHKDFStream(md5.New, 8, b)
-}
-
-func Benchmark16ByteMD5Stream(b *testing.B) {
-       benchmarkHKDFStream(md5.New, 16, b)
-}
-
-func Benchmark8ByteSHA1Stream(b *testing.B) {
-       benchmarkHKDFStream(sha1.New, 8, b)
-}
-
-func Benchmark20ByteSHA1Stream(b *testing.B) {
-       benchmarkHKDFStream(sha1.New, 20, b)
-}
-
-func Benchmark8ByteSHA256Stream(b *testing.B) {
-       benchmarkHKDFStream(sha256.New, 8, b)
-}
-
-func Benchmark32ByteSHA256Stream(b *testing.B) {
-       benchmarkHKDFStream(sha256.New, 32, b)
-}
-
-func Benchmark8ByteSHA512Stream(b *testing.B) {
-       benchmarkHKDFStream(sha512.New, 8, b)
-}
-
-func Benchmark64ByteSHA512Stream(b *testing.B) {
-       benchmarkHKDFStream(sha512.New, 64, b)
-}
-
-func benchmarkHKDFSingle(hasher func() hash.Hash, block int, b *testing.B) {
-       master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
-       salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17}
-       info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27}
-       out := make([]byte, block)
-
-       b.SetBytes(int64(block))
-       b.ResetTimer()
-
-       for i := 0; i < b.N; i++ {
-               hkdf := New(hasher, master, salt, info)
-               io.ReadFull(hkdf, out)
-       }
-}
-
-func benchmarkHKDFStream(hasher func() hash.Hash, block int, b *testing.B) {
-       master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
-       salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17}
-       info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27}
-       out := make([]byte, block)
-
-       b.SetBytes(int64(block))
-       b.ResetTimer()
-
-       hkdf := New(hasher, master, salt, info)
-       for i := 0; i < b.N; i++ {
-               _, err := io.ReadFull(hkdf, out)
-               if err != nil {
-                       hkdf = New(hasher, master, salt, info)
-                       i--
-               }
-       }
-}
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/chacha_generic.go b/libgo/go/internal/x/crypto/internal/chacha20/chacha_generic.go
deleted file mode 100644 (file)
index 7ed1cd9..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ChaCha20 implements the core ChaCha20 function as specified
-// in https://tools.ietf.org/html/rfc7539#section-2.3.
-package chacha20
-
-import (
-       "crypto/cipher"
-       "encoding/binary"
-)
-
-// assert that *Cipher implements cipher.Stream
-var _ cipher.Stream = (*Cipher)(nil)
-
-// Cipher is a stateful instance of ChaCha20 using a particular key
-// and nonce. A *Cipher implements the cipher.Stream interface.
-type Cipher struct {
-       key     [8]uint32
-       counter uint32 // incremented after each block
-       nonce   [3]uint32
-       buf     [bufSize]byte // buffer for unused keystream bytes
-       len     int           // number of unused keystream bytes at end of buf
-}
-
-// New creates a new ChaCha20 stream cipher with the given key and nonce.
-// The initial counter value is set to 0.
-func New(key [8]uint32, nonce [3]uint32) *Cipher {
-       return &Cipher{key: key, nonce: nonce}
-}
-
-// XORKeyStream XORs each byte in the given slice with a byte from the
-// cipher's key stream. Dst and src must overlap entirely or not at all.
-//
-// If len(dst) < len(src), XORKeyStream will panic. It is acceptable
-// to pass a dst bigger than src, and in that case, XORKeyStream will
-// only update dst[:len(src)] and will not touch the rest of dst.
-//
-// Multiple calls to XORKeyStream behave as if the concatenation of
-// the src buffers was passed in a single run. That is, Cipher
-// maintains state and does not reset at each XORKeyStream call.
-func (s *Cipher) XORKeyStream(dst, src []byte) {
-       // xor src with buffered keystream first
-       if s.len != 0 {
-               buf := s.buf[len(s.buf)-s.len:]
-               if len(src) < len(buf) {
-                       buf = buf[:len(src)]
-               }
-               td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint
-               for i, b := range buf {
-                       td[i] = ts[i] ^ b
-               }
-               s.len -= len(buf)
-               if s.len != 0 {
-                       return
-               }
-               s.buf = [len(s.buf)]byte{} // zero the empty buffer
-               src = src[len(buf):]
-               dst = dst[len(buf):]
-       }
-
-       if len(src) == 0 {
-               return
-       }
-       if haveAsm {
-               s.xorKeyStreamAsm(dst, src)
-               return
-       }
-
-       // set up a 64-byte buffer to pad out the final block if needed
-       // (hoisted out of the main loop to avoid spills)
-       rem := len(src) % 64  // length of final block
-       fin := len(src) - rem // index of final block
-       if rem > 0 {
-               copy(s.buf[len(s.buf)-64:], src[fin:])
-       }
-
-       // qr calculates a quarter round
-       qr := func(a, b, c, d uint32) (uint32, uint32, uint32, uint32) {
-               a += b
-               d ^= a
-               d = (d << 16) | (d >> 16)
-               c += d
-               b ^= c
-               b = (b << 12) | (b >> 20)
-               a += b
-               d ^= a
-               d = (d << 8) | (d >> 24)
-               c += d
-               b ^= c
-               b = (b << 7) | (b >> 25)
-               return a, b, c, d
-       }
-
-       // ChaCha20 constants
-       const (
-               j0 = 0x61707865
-               j1 = 0x3320646e
-               j2 = 0x79622d32
-               j3 = 0x6b206574
-       )
-
-       // pre-calculate most of the first round
-       s1, s5, s9, s13 := qr(j1, s.key[1], s.key[5], s.nonce[0])
-       s2, s6, s10, s14 := qr(j2, s.key[2], s.key[6], s.nonce[1])
-       s3, s7, s11, s15 := qr(j3, s.key[3], s.key[7], s.nonce[2])
-
-       n := len(src)
-       src, dst = src[:n:n], dst[:n:n] // BCE hint
-       for i := 0; i < n; i += 64 {
-               // calculate the remainder of the first round
-               s0, s4, s8, s12 := qr(j0, s.key[0], s.key[4], s.counter)
-
-               // execute the second round
-               x0, x5, x10, x15 := qr(s0, s5, s10, s15)
-               x1, x6, x11, x12 := qr(s1, s6, s11, s12)
-               x2, x7, x8, x13 := qr(s2, s7, s8, s13)
-               x3, x4, x9, x14 := qr(s3, s4, s9, s14)
-
-               // execute the remaining 18 rounds
-               for i := 0; i < 9; i++ {
-                       x0, x4, x8, x12 = qr(x0, x4, x8, x12)
-                       x1, x5, x9, x13 = qr(x1, x5, x9, x13)
-                       x2, x6, x10, x14 = qr(x2, x6, x10, x14)
-                       x3, x7, x11, x15 = qr(x3, x7, x11, x15)
-
-                       x0, x5, x10, x15 = qr(x0, x5, x10, x15)
-                       x1, x6, x11, x12 = qr(x1, x6, x11, x12)
-                       x2, x7, x8, x13 = qr(x2, x7, x8, x13)
-                       x3, x4, x9, x14 = qr(x3, x4, x9, x14)
-               }
-
-               x0 += j0
-               x1 += j1
-               x2 += j2
-               x3 += j3
-
-               x4 += s.key[0]
-               x5 += s.key[1]
-               x6 += s.key[2]
-               x7 += s.key[3]
-               x8 += s.key[4]
-               x9 += s.key[5]
-               x10 += s.key[6]
-               x11 += s.key[7]
-
-               x12 += s.counter
-               x13 += s.nonce[0]
-               x14 += s.nonce[1]
-               x15 += s.nonce[2]
-
-               // increment the counter
-               s.counter += 1
-               if s.counter == 0 {
-                       panic("chacha20: counter overflow")
-               }
-
-               // pad to 64 bytes if needed
-               in, out := src[i:], dst[i:]
-               if i == fin {
-                       // src[fin:] has already been copied into s.buf before
-                       // the main loop
-                       in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:]
-               }
-               in, out = in[:64], out[:64] // BCE hint
-
-               // XOR the key stream with the source and write out the result
-               xor(out[0:], in[0:], x0)
-               xor(out[4:], in[4:], x1)
-               xor(out[8:], in[8:], x2)
-               xor(out[12:], in[12:], x3)
-               xor(out[16:], in[16:], x4)
-               xor(out[20:], in[20:], x5)
-               xor(out[24:], in[24:], x6)
-               xor(out[28:], in[28:], x7)
-               xor(out[32:], in[32:], x8)
-               xor(out[36:], in[36:], x9)
-               xor(out[40:], in[40:], x10)
-               xor(out[44:], in[44:], x11)
-               xor(out[48:], in[48:], x12)
-               xor(out[52:], in[52:], x13)
-               xor(out[56:], in[56:], x14)
-               xor(out[60:], in[60:], x15)
-       }
-       // copy any trailing bytes out of the buffer and into dst
-       if rem != 0 {
-               s.len = 64 - rem
-               copy(dst[fin:], s.buf[len(s.buf)-64:])
-       }
-}
-
-// Advance discards bytes in the key stream until the next 64 byte block
-// boundary is reached and updates the counter accordingly. If the key
-// stream is already at a block boundary no bytes will be discarded and
-// the counter will be unchanged.
-func (s *Cipher) Advance() {
-       s.len -= s.len % 64
-       if s.len == 0 {
-               s.buf = [len(s.buf)]byte{}
-       }
-}
-
-// XORKeyStream crypts bytes from in to out using the given key and counters.
-// In and out must overlap entirely or not at all. Counter contains the raw
-// ChaCha20 counter bytes (i.e. block counter followed by nonce).
-func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) {
-       s := Cipher{
-               key: [8]uint32{
-                       binary.LittleEndian.Uint32(key[0:4]),
-                       binary.LittleEndian.Uint32(key[4:8]),
-                       binary.LittleEndian.Uint32(key[8:12]),
-                       binary.LittleEndian.Uint32(key[12:16]),
-                       binary.LittleEndian.Uint32(key[16:20]),
-                       binary.LittleEndian.Uint32(key[20:24]),
-                       binary.LittleEndian.Uint32(key[24:28]),
-                       binary.LittleEndian.Uint32(key[28:32]),
-               },
-               nonce: [3]uint32{
-                       binary.LittleEndian.Uint32(counter[4:8]),
-                       binary.LittleEndian.Uint32(counter[8:12]),
-                       binary.LittleEndian.Uint32(counter[12:16]),
-               },
-               counter: binary.LittleEndian.Uint32(counter[0:4]),
-       }
-       s.XORKeyStream(out, in)
-}
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/chacha_noasm.go b/libgo/go/internal/x/crypto/internal/chacha20/chacha_noasm.go
deleted file mode 100644 (file)
index 91520d1..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !s390x gccgo appengine
-
-package chacha20
-
-const (
-       bufSize = 64
-       haveAsm = false
-)
-
-func (*Cipher) xorKeyStreamAsm(dst, src []byte) {
-       panic("not implemented")
-}
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/chacha_s390x.go b/libgo/go/internal/x/crypto/internal/chacha20/chacha_s390x.go
deleted file mode 100644 (file)
index 0c1c671..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build s390x,!gccgo,!appengine
-
-package chacha20
-
-var haveAsm = hasVectorFacility()
-
-const bufSize = 256
-
-// hasVectorFacility reports whether the machine supports the vector
-// facility (vx).
-// Implementation in asm_s390x.s.
-func hasVectorFacility() bool
-
-// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only
-// be called when the vector facility is available.
-// Implementation in asm_s390x.s.
-//go:noescape
-func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int)
-
-func (c *Cipher) xorKeyStreamAsm(dst, src []byte) {
-       xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len)
-}
-
-// EXRL targets, DO NOT CALL!
-func mvcSrcToBuf()
-func mvcBufToDst()
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/chacha_test.go b/libgo/go/internal/x/crypto/internal/chacha20/chacha_test.go
deleted file mode 100644 (file)
index bf99330..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package chacha20
-
-import (
-       "encoding/hex"
-       "fmt"
-       "math/rand"
-       "testing"
-)
-
-func TestCore(t *testing.T) {
-       // This is just a smoke test that checks the example from
-       // https://tools.ietf.org/html/rfc7539#section-2.3.2. The
-       // chacha20poly1305 package contains much more extensive tests of this
-       // code.
-       var key [32]byte
-       for i := range key {
-               key[i] = byte(i)
-       }
-
-       var input [16]byte
-       input[0] = 1
-       input[7] = 9
-       input[11] = 0x4a
-
-       var out [64]byte
-       XORKeyStream(out[:], out[:], &input, &key)
-       const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e"
-       if result := hex.EncodeToString(out[:]); result != expected {
-               t.Errorf("wanted %x but got %x", expected, result)
-       }
-}
-
-// Run the test cases with the input and output in different buffers.
-func TestNoOverlap(t *testing.T) {
-       for _, c := range testVectors {
-               s := New(c.key, c.nonce)
-               input, err := hex.DecodeString(c.input)
-               if err != nil {
-                       t.Fatalf("cannot decode input %#v: %v", c.input, err)
-               }
-               output := make([]byte, c.length)
-               s.XORKeyStream(output, input)
-               got := hex.EncodeToString(output)
-               if got != c.output {
-                       t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output)
-               }
-       }
-}
-
-// Run the test cases with the input and output overlapping entirely.
-func TestOverlap(t *testing.T) {
-       for _, c := range testVectors {
-               s := New(c.key, c.nonce)
-               data, err := hex.DecodeString(c.input)
-               if err != nil {
-                       t.Fatalf("cannot decode input %#v: %v", c.input, err)
-               }
-               s.XORKeyStream(data, data)
-               got := hex.EncodeToString(data)
-               if got != c.output {
-                       t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output)
-               }
-       }
-}
-
-// Run the test cases with various source and destination offsets.
-func TestUnaligned(t *testing.T) {
-       const max = 8 // max offset (+1) to test
-       for _, c := range testVectors {
-               input := make([]byte, c.length+max)
-               output := make([]byte, c.length+max)
-               for i := 0; i < max; i++ { // input offsets
-                       for j := 0; j < max; j++ { // output offsets
-                               s := New(c.key, c.nonce)
-
-                               input := input[i : i+c.length]
-                               output := output[j : j+c.length]
-
-                               data, err := hex.DecodeString(c.input)
-                               if err != nil {
-                                       t.Fatalf("cannot decode input %#v: %v", c.input, err)
-                               }
-                               copy(input, data)
-                               s.XORKeyStream(output, input)
-                               got := hex.EncodeToString(output)
-                               if got != c.output {
-                                       t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output)
-                               }
-                       }
-               }
-       }
-}
-
-// Run the test cases by calling XORKeyStream multiple times.
-func TestStep(t *testing.T) {
-       // wide range of step sizes to try and hit edge cases
-       steps := [...]int{1, 3, 4, 7, 8, 17, 24, 30, 64, 256}
-       rnd := rand.New(rand.NewSource(123))
-       for _, c := range testVectors {
-               s := New(c.key, c.nonce)
-               input, err := hex.DecodeString(c.input)
-               if err != nil {
-                       t.Fatalf("cannot decode input %#v: %v", c.input, err)
-               }
-               output := make([]byte, c.length)
-
-               // step through the buffers
-               i, step := 0, steps[rnd.Intn(len(steps))]
-               for i+step < c.length {
-                       s.XORKeyStream(output[i:i+step], input[i:i+step])
-                       if i+step < c.length && output[i+step] != 0 {
-                               t.Errorf("length=%v, i=%v, step=%v: output overwritten", c.length, i, step)
-                       }
-                       i += step
-                       step = steps[rnd.Intn(len(steps))]
-               }
-               // finish the encryption
-               s.XORKeyStream(output[i:], input[i:])
-
-               got := hex.EncodeToString(output)
-               if got != c.output {
-                       t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output)
-               }
-       }
-}
-
-// Test that Advance() discards bytes until a block boundary is hit.
-func TestAdvance(t *testing.T) {
-       for _, c := range testVectors {
-               for i := 0; i < 63; i++ {
-                       s := New(c.key, c.nonce)
-                       z := New(c.key, c.nonce)
-                       input, err := hex.DecodeString(c.input)
-                       if err != nil {
-                               t.Fatalf("cannot decode input %#v: %v", c.input, err)
-                       }
-                       zeros, discard := make([]byte, 64), make([]byte, 64)
-                       so, zo := make([]byte, c.length), make([]byte, c.length)
-                       for j := 0; j < c.length; j += 64 {
-                               lim := j + i
-                               if lim > c.length {
-                                       lim = c.length
-                               }
-                               s.XORKeyStream(so[j:lim], input[j:lim])
-                               // calling s.Advance() multiple times should have no effect
-                               for k := 0; k < i%3+1; k++ {
-                                       s.Advance()
-                               }
-                               z.XORKeyStream(zo[j:lim], input[j:lim])
-                               if lim < c.length {
-                                       end := 64 - i
-                                       if c.length-lim < end {
-                                               end = c.length - lim
-                                       }
-                                       z.XORKeyStream(discard[:], zeros[:end])
-                               }
-                       }
-
-                       got := hex.EncodeToString(so)
-                       want := hex.EncodeToString(zo)
-                       if got != want {
-                               t.Errorf("length=%v: got %#v, want %#v", c.length, got, want)
-                       }
-               }
-       }
-}
-
-func BenchmarkChaCha20(b *testing.B) {
-       sizes := []int{32, 63, 64, 256, 1024, 1350, 65536}
-       for _, size := range sizes {
-               s := size
-               b.Run(fmt.Sprint(s), func(b *testing.B) {
-                       k := [32]byte{}
-                       c := [16]byte{}
-                       src := make([]byte, s)
-                       dst := make([]byte, s)
-                       b.SetBytes(int64(s))
-                       b.ResetTimer()
-                       for i := 0; i < b.N; i++ {
-                               XORKeyStream(dst, src, &c, &k)
-                       }
-               })
-       }
-}
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/vectors_test.go b/libgo/go/internal/x/crypto/internal/chacha20/vectors_test.go
deleted file mode 100644 (file)
index b441fbd..0000000
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package chacha20
-
-// Test vectors for ChaCha20 implementations.
-
-type testCase struct {
-       length int
-       nonce  [3]uint32
-       key    [8]uint32
-       input  string
-       output string
-}
-
-var testVectors = [...]testCase{
-       {
-               length: 0,
-               nonce:  [3]uint32{0x94d13317, 0x6b6a2b3, 0x3ffe0036},
-               key:    [8]uint32{0x9da8a3b6, 0x3abf4ae6, 0xa2f19cae, 0x1068c707, 0x72e4801e, 0xce165d92, 0x61e7028f, 0x82ac3d57},
-               input:  "",
-               output: "",
-       },
-       {
-               length: 5,
-               nonce:  [3]uint32{0x469fadd, 0xee3fcc1e, 0x45cf77b0},
-               key:    [8]uint32{0x3477e02b, 0x45bf809f, 0x27f4a1fa, 0xdb901de8, 0xd8a190dc, 0x1d2c21d4, 0x87bdf2ac, 0xdfbf0000},
-               input:  "23dbad0780",
-               output: "415a3e498d",
-       },
-       {
-               length: 9,
-               nonce:  [3]uint32{0x512a6b49, 0x8df9af6d, 0x5336a2a5},
-               key:    [8]uint32{0xe9124c25, 0x4fd1a373, 0x7945f7bb, 0xeed5f064, 0x29c4185d, 0x3c9acf13, 0x4c94a367, 0x7c2c2c53},
-               input:  "f518831fab69c054a6",
-               output: "cfe40f63f81391484b",
-       },
-       {
-               length: 12,
-               nonce:  [3]uint32{0xca697a9e, 0x6b2f6717, 0xb7859220},
-               key:    [8]uint32{0xfc825020, 0x5ca4410b, 0x7d5285d0, 0x160a1c9d, 0x15470b41, 0x3634742a, 0xe64aa7fa, 0xca0be67a},
-               input:  "805fad1d62951537aeed9859",
-               output: "47bd303f93c3ce04bce44710",
-       },
-       {
-               length: 14,
-               nonce:  [3]uint32{0xcded3db3, 0x35770a7f, 0x6aede9b},
-               key:    [8]uint32{0x44632def, 0xa5e420a7, 0xfc12a8f, 0x63b79a15, 0x337de314, 0xb82fbf16, 0x3104bc57, 0x677c9227},
-               input:  "f4e8a7577affb841cf48392cf5df",
-               output: "f445c0fb7e3d5bfdab47090ddee6",
-       },
-       {
-               length: 15,
-               nonce:  [3]uint32{0x348a50b1, 0x4acc9280, 0x8d6014ce},
-               key:    [8]uint32{0x34bd31a8, 0x2808f47e, 0x9d8b19f9, 0x4df59683, 0x31584348, 0x34a74a45, 0xde174a2, 0x29d4c7dc},
-               input:  "1179b71ec4dc34bd812f742b5a0b27",
-               output: "cc7f80f333c647d6e592e4f7ecc834",
-       },
-       {
-               length: 20,
-               nonce:  [3]uint32{0xc8754703, 0x9188c521, 0xac8ce8a6},
-               key:    [8]uint32{0xe93c79ed, 0xce89162b, 0x116a8366, 0xecdc657f, 0x5bc81d98, 0xff5d2f52, 0x171f3ebb, 0x50773f2f},
-               input:  "7bd94943d55392d0311c413ac755ce0347872ba3",
-               output: "c43665de15136af232675d9d5dbbeca77f3c542a",
-       },
-       {
-               length: 21,
-               nonce:  [3]uint32{0x9a8655cb, 0x6e9d6ea5, 0x5dad705e},
-               key:    [8]uint32{0x3542d5b3, 0x1f7bfd8f, 0x1038abf8, 0x7214e8ec, 0xedd05693, 0x60e663bd, 0xe8e5d506, 0xeea923a2},
-               input:  "1505f669acc5ad9aaa0e993ba8c24e744d13655e1f",
-               output: "26cad1ccf4cf4c49b267ab7be10bc2ffa3ba66bc86",
-       },
-       {
-               length: 25,
-               nonce:  [3]uint32{0x3f202ca4, 0x63fc86, 0x7260a10e},
-               key:    [8]uint32{0xe28ab1d6, 0xe83b3d47, 0x671271ca, 0xb977bcff, 0xa2f64476, 0x311d79b4, 0x180d91d0, 0xec1a6e0c},
-               input:  "20070523ddb4ebf0d5f20fd95aacf47fb269ebadda6879638a",
-               output: "5ce972624cb2b7e7c28f5b865ba08c887911b4f5e361830a4b",
-       },
-       {
-               length: 31,
-               nonce:  [3]uint32{0xcf8671ea, 0x8d72df2f, 0x8b5a538a},
-               key:    [8]uint32{0xe46ca2bb, 0xd06ab5ef, 0xb0e2966b, 0x54dd0c2d, 0x8815d89a, 0x426c30a9, 0x15b0f1e, 0x254bae75},
-               input:  "d10f8050c1186f92e26f351db36490d82ea677498562d8d4f487a0a4058adf",
-               output: "f30c11bc553b2baf6870760d735680897c9fee168f976b2a33ef395fdbd4fc",
-       },
-       {
-               length: 34,
-               nonce:  [3]uint32{0xd1be983a, 0xf5aa389, 0xfa26c7e1},
-               key:    [8]uint32{0x795c6da7, 0x8cb1aadc, 0xa042359a, 0x95ea2e27, 0x128253c4, 0xaabc592f, 0x391e810, 0xf641d971},
-               input:  "e88dc380b7d45a4a762c34f310199587867516fac4a2634022b96a9f862e17714d17",
-               output: "aac98ba3821399e55a5eab5862f7f1bfc63637d700125878c2b17151f306c9aec80e",
-       },
-       {
-               length: 34,
-               nonce:  [3]uint32{0x98f5f4b8, 0x3f181d73, 0x5bf4572e},
-               key:    [8]uint32{0xa86f8cf7, 0x8db41a2b, 0xe0e03156, 0x3dad8a59, 0xb3e4d1ba, 0x75f6fb38, 0xdb94709d, 0xc3db34f3},
-               input:  "b0fcf0a731e2902787309697db2384e1cda07b60002c95355a4e261fb601f034b2b3",
-               output: "b6c8c40ddda029a70a21c25f724cc90c43f6edc407055683572a9f5e9690a1d571bb",
-       },
-       {
-               length: 40,
-               nonce:  [3]uint32{0x7289ae18, 0x7ebe7e50, 0x7d819176},
-               key:    [8]uint32{0x336c07a0, 0x4a2ea22b, 0xa8872f46, 0xa47b5e28, 0xbe645e3f, 0x371c6591, 0xd2dc237a, 0x92c59580},
-               input:  "cf9ec6fa3f0a67488adb5598a48ed916729a1e416d206f9675dfa9fd6585793f274f363bbca348b3",
-               output: "bb7ed8a199aa329dcd18736ce705804ffae8c3e2ba341ae907f94f4672d57175df25d28e16962fd6",
-       },
-       {
-               length: 47,
-               nonce:  [3]uint32{0xfd3181de, 0x8b193e26, 0xbebc799},
-               key:    [8]uint32{0x781a4c2e, 0x27ab55e2, 0x814aaf43, 0xa0bab01, 0x9de62ce0, 0x472b03d2, 0xdfee18e8, 0x8b855b93},
-               input:  "be9a8211d68642310724eda3dd02f63fcc03a101d9564b0ecee6f4ecececcb0099bb26aabee46b1a2c0416b4ac269e",
-               output: "3152f317cf3626e26d02cff9392619ea02e22115b6d43d6dd2e1177c6bb3cb71c4a90c3d13b63c43e03605ec98d9a1",
-       },
-       {
-               length: 51,
-               nonce:  [3]uint32{0x27b02ff6, 0xa510613e, 0x218b22d8},
-               key:    [8]uint32{0x62fc7732, 0xcef06cf4, 0xa4f45ed5, 0x2f96654f, 0x9f2b956e, 0x42b572f4, 0x5bb59c86, 0x35e4784f},
-               input:  "495343a257250f8970f791f493b89d10edba89806b88aaaeb3b5aefd078ba7b765746164bce653f5e6c096dd8499fb76d97d77",
-               output: "62c01f426581551b5b16e8b1a3a23c86bcdd189ab695dbea4bf811a14741e6ebbb0261ef8ae47778a6be7e0ef11697b891412c",
-       },
-       {
-               length: 52,
-               nonce:  [3]uint32{0x9db97a63, 0xff50248, 0xf2b6df56},
-               key:    [8]uint32{0x2b657a8f, 0xfe67575d, 0xaa56d261, 0x30179a97, 0xaefcfff1, 0x9b8eb698, 0x1efe3756, 0xb4ea450c},
-               input:  "e37fbbd3fe37ce5a99d18e5dcb0dafe7adf8b596528708f7d310569ab44c251377f7363a390c653965e0cb8dd217464b3d8f79c1",
-               output: "b07d4c56fb83a49e8d9fc992e1230bb5086fecbd828cdbc7353f61b1a3cec0baf9c5bf67c9da06b49469a999ba3b37916ec125be",
-       },
-       {
-               length: 56,
-               nonce:  [3]uint32{0xc1dfec38, 0x7d7503d3, 0x9a3e3c66},
-               key:    [8]uint32{0x8614d8e7, 0xde9b0413, 0x2a48b4fa, 0xcbbde744, 0xad5ddc5e, 0x9144d83e, 0x74d9d617, 0x230bdb45},
-               input:  "9efab614388a7d99102bcc901e3623d31fd9dd9d3c3338d086f69c13e7aa8653f9ce76e722e5a6a8cbbbee067a6cb9c59aa9b4b4c518bbed",
-               output: "829d9fe74b7a4b3aeb04580b41d38a156ffbebba5d49ad55d1b0370f25abcd41221304941ad8e0d5095e15fbd839295bf1e7a509a807c005",
-       },
-       {
-               length: 63,
-               nonce:  [3]uint32{0xc7e2521c, 0x795499b4, 0xc7946cd7},
-               key:    [8]uint32{0x53fce774, 0x9a4b53bf, 0x5f614134, 0xa3c39414, 0xa8a07c72, 0x93242311, 0x43aeec99, 0x216deb5a},
-               input:  "03b5d7ab4bd8c9a4f47ec122cbeb595bd1a0d58de3bb3dcc66c4e288f29622d6863e846fdfb27a90740feb03a4761c6017250bc0f129cc65d19680ab9d6970",
-               output: "83db55d9eb441a909268311da67d432c732ad6bda0a0dae710d1bce040b91269deb558a68ced4aa5760ca0b9c5efc84e725f297bdbdadbc368bea4e20261c5",
-       },
-       {
-               length: 66,
-               nonce:  [3]uint32{0x1d41f0a1, 0x7c3b7778, 0x6991eea5},
-               key:    [8]uint32{0x1f213e39, 0x56261d14, 0x15fc7c2c, 0x21feccc5, 0xa95684c5, 0x26600506, 0xdadcc06b, 0xf2c810b0},
-               input:  "2f4da518578a2a82c8c855155645838ca431cdf35d9f8562f256746150580ca1c74f79b3e9ae78224573da8b47a4b3cc63fbed8d4e831a6b4d796c124d87c78a66e5",
-               output: "6fc086ded3d1d5566577ccd9971e713c1126ec52d3894f09ab701116c7b5abda959cbb207f4468eb7b6a6b7e1b6d2bc6047f337499d63522f256ee751b91f84f70b6",
-       },
-       {
-               length: 72,
-               nonce:  [3]uint32{0x749f022c, 0xa021dab0, 0x648c2252},
-               key:    [8]uint32{0xa1ace7b0, 0x567a0ea1, 0x52af13b9, 0xcba30c08, 0xe07a6d74, 0x5c3bca39, 0x85b2ac07, 0x3b5afc0},
-               input:  "55739a1738b4a4028021b21549e2661b050e3d830ad9a56f57bfcaca3e0f72051b9ca92411840061083e5e45124d8425061ab26c632ac7852118411ac80026da946357c630f27225",
-               output: "8051bf98f8f2617e159ba205a9342ab700973dd045e09321805eed89e419f37f3211c5aa82666b9a097270babc26d3bfe0c990fe245ae982a31f23cfbf6156b5c8cfb77f340e2bf5",
-       },
-       {
-               length: 74,
-               nonce:  [3]uint32{0x23c16ba8, 0x9fd1cd4e, 0xcb224ecb},
-               key:    [8]uint32{0xb694404a, 0x86b5f198, 0x10fd1bff, 0x13a84e54, 0xab21e509, 0x7443d764, 0x931b3f1, 0x686e87f2},
-               input:  "7ffd8d5970fdee613eeae531d1c673fd379d64b0b6bfedd010433b080b561038f7f266fa7e15d7d8e10d23f21b9d7724bb200b0f58b9250483e784f4a6555d09c234e8d1c549ebb76a8e",
-               output: "c173617e36ea20ce04c490803b2098bd4f1ff4b31fdca1c51c6475ade83892c5f12731652d5774631d55ae2938617a5e9462bb6083328a23a4fba52de50ca9075586f2efc22aae56e3a8",
-       },
-       {
-               length: 81,
-               nonce:  [3]uint32{0xd65f6f29, 0xf3f76219, 0x9a033c9e},
-               key:    [8]uint32{0xeba017c4, 0x69e0421a, 0x449e2317, 0x29858a11, 0xd0c8523a, 0xa8b0c9a2, 0xab2ca84, 0xaf011a45},
-               input:  "7a5766097562361cfaeac5b8a6175e1ceeeda30aec5e354df4302e7700ea48c505da9fdc57874da879480ecfea9c6c8904f330cbac5e27f296b33b667fea483348f031bef761d0b8e318a8132caa7a5943",
-               output: "5e9fbf427c4f0fcf44db3180ea47d923f52bee933a985543622eff70e2b3f5c673be8e05cd7acbcadd8593da454c60d5f19131e61730a73b9c0f87e3921ee5a591a086446b2a0fadd8a4bc7b49a8e83764",
-       },
-       {
-               length: 88,
-               nonce:  [3]uint32{0xc70ee56e, 0xe58ec41, 0xafd96f61},
-               key:    [8]uint32{0x172af2bb, 0x9085d27c, 0x8ca2c44d, 0x8aa148da, 0x290c88b0, 0x88187439, 0x18d54781, 0x633f2cce},
-               input:  "0777c02a2900052d9b79f38387d2c234108a2ad066cbf7df6ea6acc5a3f86b3d6156abb5b18ad4ecf79e171383a1897e64a95ecdbba6aa3f1c7c12fe31283629ff547cb113a826cb348a7c10507cc645fa2eb97b5f22e44d",
-               output: "368c90db3464ba488340b1960e9f75d2c3b5b392bdd5622ff70e85e6d00b1e6a996ba3978ce64f8f2b5a9a90576c8f32b908233e15d2f443cccc98af87745c93c8056603407a3fb37ce0c1f8ab6384cc37c69c98bfecf337",
-       },
-       {
-               length: 92,
-               nonce:  [3]uint32{0x3006da79, 0x2748051d, 0x72c17cdc},
-               key:    [8]uint32{0x60cdb7e8, 0xcecbe928, 0xe19b7ab9, 0x30d61537, 0xa0fbc199, 0x897738bf, 0xdd7705a9, 0x3e5c1763},
-               input:  "cf2dccbcfd781c030376f9019d841ca701cb54a1791f50f50bee0c2bf178182603a4712b5916eebd5001595c3f48283f1ba097ce2e7bf94f2b7fa957ce776e14a7a570093be2de386ececbd6525e72c5970c3e7d35974b8f0b831fbc",
-               output: "7c92b8c75e6eb8675229660cedcb10334965a7737cde7336512d9eff846c670d1fa8f8a427ea4f43e66be609466711fd241ccff7d3f049bda3a2394e5aa2108abc80e859611dbd3c7ba2d044a3ececa4980dd65e823dd110fea7a548",
-       },
-       {
-               length: 96,
-               nonce:  [3]uint32{0xfc0fb1ee, 0x414cc60a, 0x4144bd67},
-               key:    [8]uint32{0x103291c6, 0x822b03b6, 0xd29ab548, 0xc88f3efe, 0x6936056a, 0x28aaa61f, 0xa0df7858, 0xdaa23519},
-               input:  "e08a8949a1bfd6a8c1186b431b6ad59b106ae5552821db69b66dc03fbc4a2b970dcf9c7da4f5082572bc978f8ee27c554c8884b5a450b36d70453348cd6cac9b80c9900cf98a4088803f564bb1281d24507b2f61ba737c8145c71b50eb0f6dfc",
-               output: "73d043acf9dcd758c7299bd1fd1f4100d61ff77d339e279bfbe6f9233b0d9afa24992a9c1c7a19545d469fdfb369c201322f6fe8c633fcdcffef31032bfb41b9fb55506e301d049fd447d61f974a713debeaed886f486a98efd3d6c3f25fbb30",
-       },
-       {
-               length: 103,
-               nonce:  [3]uint32{0xc2030c57, 0x1e3b59e1, 0x607ede1a},
-               key:    [8]uint32{0xd1bac2b5, 0x56a94583, 0x628b479b, 0x3056a51e, 0x69bf8f8f, 0x2df1e03d, 0x4b9d48d2, 0x7df5c379},
-               input:  "a0c302120111f00c99cff7d839cdf43207a7e2f73d5dd888daa00d84254db0e621a72493480420c9c61ce1cfc54188ff525bb7a0e6c1cd298f598973a1de9fd2d79a21401588775b0adbe261ba4e4f79a894d1bd5835b5924d09ba32ef03cb4bc0bd6eb4ee4274",
-               output: "bc714bd7d8399beedc238f7ddeb0b99d94ad6bf8bf54548a3e4b90a76aa5673c91db6482591e8ff9126e1412bce56d52a4c2d89f22c29858e24482f177abacef428d0ae1779f0ae0778c44f9f02fe474da93c35c615b5fad29eca697978891f426714441317f2b",
-       },
-       {
-               length: 109,
-               nonce:  [3]uint32{0xf44dc81f, 0xcf6e03e7, 0xf4966796},
-               key:    [8]uint32{0xd7b12f4, 0x683f4789, 0xc7828fb4, 0x820fc6a0, 0xc51231eb, 0xe46716d7, 0x4036ef93, 0x26afb96c},
-               input:  "ebce290c03c7cb65d053918ba2da0256dc700b337b8c124c43d5da4746888ca78387feea1a3a72c5e249d3d93a1907977dd4009699a15be5da2ca89c60e971c8df5d4553b61b710d92d3453dea595a0e45ae1e093f02ea70608b7b32f9c6aadc661a052f9b14c03ea0117a3192",
-               output: "cbb8c4ec827a1123c1141327c594d4a8b0b4a74b0008115bb9ec4275db3a8e5529a4f145551af29c473764cbaa0794b2d1eb1066f32a07fd39f5f3fe51498c46fba5310ae7c3664571d6a851e673ded3badc25e426f9c6038724779aa6d2d8ec3f54865f7df612e25575635ab5",
-       },
-       {
-               length: 115,
-               nonce:  [3]uint32{0x8d3e461b, 0x7e05c360, 0x3bbbafdd},
-               key:    [8]uint32{0xf9b917c9, 0x9af89bf7, 0x7decbbc9, 0xe7e5ea7b, 0x9b4aab55, 0x90eff6be, 0xa19b6d90, 0xb9f69b1a},
-               input:  "275c97de985aa265332065ccce437770b110737a77dea62137a5d6cb62e9cb8b504d34334a58a71aba153d9b86f21377467b2fafaf54829331bf2ce0009acb37842b7a4b5f152aab650a393153f1ed479abc21f7a6fe205b9852ff2f7f3a0e3bfe76ca9770efada4e29e06db0569a99d08648e",
-               output: "b225aa01d5c438d572deaea51ac12c0c694e0f9dc0ed2884a98e5e2943d52bb4692d7d8f12486de12d0559087e8c09e4f2d5b74e350838aa2bd36023032ccbcae56be75c6a17c59583d81a1fd60e305af5053ac89f753c9347f3040e48405232dc8428c49dcb3d9b899145f5b3bc955f34dbbe",
-       },
-       {
-               length: 119,
-               nonce:  [3]uint32{0x871f33f5, 0xe4fee3ba, 0xcb8c1e93},
-               key:    [8]uint32{0x33124903, 0x7e0287e5, 0xe9d6988f, 0x1962405f, 0x5f21c1b5, 0x2ac695e6, 0x46b200c9, 0x9fda98ba},
-               input:  "ceda15cfffd53ccebe31b5886facd863f6166e02ec65f46f54148860a5c2702e34fd204d881af6055952690cd1ffa8ba4d0e297cc165d981b371932adb935398c987baff335108c5e77f2e5dd5e1ca9a017bc376cbdbe3c0f45e079c212e8986b438444e79cd37927c1479f45c9e75b0076cc9f8679011",
-               output: "a3f1c3f885583b999c85cd118e2ababfa5a2de0c8eb28aacc161b1efee89d8de36ddeb584174c0e92011b8d667cb64009049976082072e6262933dbf7b14839805e1face375b7cbb54f9828ba1ed8aa55634ec5d72b6351feff4d77a3a22b34203b02e096f5e5f9ae9ad6a9dd16c57ce6d94dcc8873d18",
-       },
-       {
-               length: 120,
-               nonce:  [3]uint32{0xef553ce8, 0xdfe120ea, 0x9a047e3a},
-               key:    [8]uint32{0xbef479c1, 0x59554f8b, 0xbf97f089, 0x52316f1e, 0x141e428, 0xff26dc04, 0xe10c8f57, 0xa7568a59},
-               input:  "799bb2d634406753416b3a2b67513293a0b3496ef5b2d019758dedaaac2edd72502fc4a375b3f0d4237bc16b0e3d47e7ddc315c6aef3a23fcae2eb3a6083bc7ac4fd1b5bf0025cc1cb266b40234b77db762c747d3a7b27956cf3a4cf72320fb60c0d0713fa60b37a6cb5b21a599e79d0f06a5b7201aeb5d2",
-               output: "e84dfb3dbaac364085497aeabd197db852d3140c0c07f5f10e5c144c1fe26a50a9877649e88c6fe04283f4b7590a8d0d042ef577693f76f706e31c4979437590fe0ab03d89afb089d1be50ae173ea5458810372838eceac53bf4bac792735d8149e548efb432e236da92bf3168bbcf36f644c23efb478a4e",
-       },
-       {
-               length: 123,
-               nonce:  [3]uint32{0xd98124a0, 0x78cd80aa, 0x3dc55cfc},
-               key:    [8]uint32{0x2286e41, 0xf13e38e3, 0xf735476b, 0x33c44bfc, 0xd7978797, 0x4a9c4595, 0x6080413, 0x1299fdd8},
-               input:  "b2d060bd173955f44ee01b8bfcf0a6fad017c3517e4e8c8da728379f6d54471c955615e2b1effe4ce3d0139df225223c361be1cac416ade10a749c5da324563696dae8272577e44e8588cd5306bff0bfbdb32af3ac7cbc78be24b51baf4d5e47cf8f1d6b0a63ed9359da45c3e7297b2314028848f5816feab885e2",
-               output: "ffa4aa66dd5d39694ae64696bfa96f771accef68f195456ad815751e25c47ed4f27b436f1b3e3fcaa3e0d04133b53559c100cd633ced3d4321fc56225c85d2443727bce40434455aa4c1f3e6768c0fe58ad88b3a928313d41a7629f1ce874d2c8bcf822ebdaebfd9d95a31bb62daab5385eb8eefe026e8cbf1ff7a",
-       },
-       {
-               length: 127,
-               nonce:  [3]uint32{0x53106b0f, 0xdf11fd81, 0x69d1b6f3},
-               key:    [8]uint32{0x736b138, 0x55cde194, 0xf8273c1, 0xf7c268e6, 0x61362bd5, 0xbb3cb455, 0x44d3c9fc, 0x7d56d3fd},
-               input:  "4f0171d7309493a349530940feece3c6200693f9cff38924114d53f723d090fffa3c80731b5ca989d3e924d1fa14266632cb9ab879e1a36df22dc9f8d1dadea229db72fded0c42187c38b9fa263c20e5fb5b4aa80eb90e8616e36d9b8c613b371c402343823184ecad3532058a46cf9e7ea5a9ecad043ac3028cbcc3f36d32",
-               output: "88c773ff34b23e691e14018ba1b2bd48a4a6979b377eb0d68336ce6192dcd5177e6b4f1c4bea2df90af56b35fe2a1d6279d253c0194dcbca9bf136f92d69165b216e4c9d1ce6b3fbe40c71e32c3f4088de352732d0e2bad9c16fd0bb9bde3d6c30257ce063432d09f19da79d49aa7641124a6c9e3f09449e911edbae11a053",
-       },
-       {
-               length: 130,
-               nonce:  [3]uint32{0x5e90ffbd, 0xa898f173, 0x269f9a88},
-               key:    [8]uint32{0x5244e05f, 0xf9adbe9b, 0x9e9f54ac, 0x23460046, 0x6782cdea, 0xba982c96, 0xc721506b, 0xed10f7e3},
-               input:  "8f8d9e18d3212bd20b96d75c06d1a63622fd83d13f79d542e45996135368772ea81511302a0d87e246dd346314cfe019bae8a5c97f567f12d82aca98dfea397c6a47dd0c419f1c609d9c52dcfcbe7eee68b2635954206ed592b7081442ce9ce3187d10ccd41cc856fb924b011f817c676c9419f52a2938c7af5f76755a75eb065411",
-               output: "4e130c5df384b9c3c84aa38a744260735e93783da0337ade99f777e692c5ea276ac4cc65880b4ae9c3b96888760fdddb74bc2e2694bedf1ee6f14619c8015f951ba81b274b466e318d09defe80bdbed57bc213ac4631d2eb14c8e348181d60f6295ceee1e9231ae047830ef4778ff66146621b76974773b5d11c8e17a476450f46ef",
-       },
-       {
-               length: 130,
-               nonce:  [3]uint32{0x308e39e8, 0x9aa4f14f, 0xf511db96},
-               key:    [8]uint32{0x833b5219, 0x4b82e588, 0x4b2d652c, 0x7c8f6ed7, 0xfe4be863, 0x9d3a50e5, 0xb888099b, 0x9f8d1968},
-               input:  "30d2379dd3ceae612182576f9acf6de505ab5a9445fe1a86ae75c5c29429e11c50fd9ec657b29b173a3763b1e171b5a7da1803ba5d64fccb2d32cb7788be194dbca00c3c91774c4c4c8ede48c1027d7cc8b387101a4fe5e44a1d9693b2f627626025072806083aadbced91c9711a0171f52ffb8ed5596cf34130022398c8a1da99c7",
-               output: "b1e8da34ad0189038ee24673979b405ef73fdbdd6f376f800031d64005a4ebed51a37f2180571223848decbea6dd22b198ab9560d7edc047c5d69183dc69b5fca346911d25cb2a1a9f830dc6382ad0024e8c3eef3aa2d155abcfe43bff01956a5e20a862fbed5c5e8df8eed0601a120caac634b068314e221f175baa11ae29002bb9",
-       },
-       {
-               length: 135,
-               nonce:  [3]uint32{0xa5feca5a, 0x753ac1b4, 0xc5a46609},
-               key:    [8]uint32{0xabbf4859, 0x828d9bf6, 0xf7f7aa6d, 0x25208ca2, 0xd7a4c0ad, 0x2fdd3282, 0x2bfcb8c2, 0x8389d84b},
-               input:  "d9404ccdcc8ef128a1b1ace4f9f1669d274ec82aa914cac34b83ac00b236478fd6167e96ec658850c6c139eb0f6fc0dd7191ba9a39828032008f7f37eb9a8df9d6cdd54240e600efe7fc49a674000c5030d825b2c5c96d0f19b8ecdbf4eeb86d3e569c5e3131abc7d6359dd4255284ccacf150d42e7a899536d51ee6db329654a4581c5ac6e419",
-               output: "c5534b5fb40b4834300e9577a9d87440c5272263d06e6aee84aa92cdf5d1b033145d336f26e5fe55c09a7e75753af93d0786dfc1cb435e86c67bd3ec8e766d0801b99e68691e2c3c3ffec539cf62e68285ea9027daa2716cd6f97e8eb7b9e266357a25eb2d4839a829508a6b7228f2832b3cd998f77597ae530430e6e4ecb53eb9efe456863a04",
-       },
-       {
-               length: 135,
-               nonce:  [3]uint32{0x12aa5846, 0x88604f6c, 0xc10d9585},
-               key:    [8]uint32{0x1491ccd6, 0x602f559d, 0xd4080c06, 0x202fabd, 0xffd3f4f8, 0xbf144c17, 0x88bf3f3c, 0x8083375},
-               input:  "231765f832927461f338aceb0f4cf51fd8469348c69c549c1dec7333d4aa4968c1ed58b65ab3fe3d0562600a2b076d56fd9ef91f589752e0455dd1d2e614cacfc0d757a11a4a2264bd38f23d3cca108632201b4f6c3b06477467726dde0c2f3aee01d66d788247663f1d0e66b044da9393ede27b9905b44115b067914961bdade85a2eca2844e1",
-               output: "1dd35f3f774f66d88cb7c2b23820ee078a093d0d85f86c4f103d869f93e2dbdd8a7cb8f101084fe1d7281a71754ec9aac5eb4fca8c365b24ed80e695caace1a8781a5a225938b50b8be96d0499752fdabd4f50d0b6ce396c6e2ca45308d1f2cc5a2a2361a8ca7a334e6ee62d466d74a1b0bf5b352f4ef6d8f8c589b733748bd3d7cda593243fab",
-       },
-       {
-               length: 140,
-               nonce:  [3]uint32{0x1c9d70f0, 0xa088a367, 0x4ec24d2b},
-               key:    [8]uint32{0x494e9775, 0xd07a852, 0xaf8af24a, 0xc65b825c, 0xc5e06780, 0x17fbbace, 0x651d71b5, 0xf548d8ef},
-               input:  "e46841f12d98aeb7710b9162d342895a971b0e3a499886bbb6aa74dc744a28d89a54542b628acdc2f693cb7c03f73fc3b74069bc3f2d000a145fb8a806cdc7d6fa971da09a33b92851cc3d1f6f5646d7fa2b1d564876feefeb63b6e66dba1c0b86ca345235bb822e0f93132346840d2a3d6eb1b541178ea51affc7b31f8da02732cc4e5bcb5d8683ae0a91c9",
-               output: "1dcbfd0bb2b905656c52bd7b1bcdad9b4d434ae9ac221a0d3a316115cdd4a463fa9b3444d2612a4e277d0dcd881fa6e80e59e5a54e35e1a14747aed31edf4ac24214f9d9c329ebe2157620b64efaded9976549bc4aa100d5c15be3f85f700f8a21dfe77590dfee2de9a23cc1ed1e44f32ebf68ca289b097bc13b42802dc7c75309c4afc25b5741839f7db3d5",
-       },
-       {
-               length: 144,
-               nonce:  [3]uint32{0x23067b8b, 0x5b276c6d, 0xaeca6c60},
-               key:    [8]uint32{0x29d64488, 0x893a2973, 0x32e3b4ef, 0x2af3d5d4, 0x95ec01b, 0xc805b64c, 0x884e8b7d, 0x798d7062},
-               input:  "e98e4a9550bdd29e4106f0cc8669dcc646a69438408e9a72c7cdb9b9d437b5f7a13fcb197629541c55bca1f8972a80cd1c1f591a0e24f977cdeb84763eab2648e42286e6473ea95e3a6a43b07a32b6a6cd80fe007ba0cf7f5ac7e651431f5e72690ec52a7134f9757daf0d8eff6b831a229db4ab8288f6bbf81e16fedebe621fd1737c8792cfd15fb3040f4f6a4cbc1e",
-               output: "5c69cf522c058790a3bc38979e172b60e71f7896d362d754edc1668d4f388b3fc0acdf40786d2f34886e107a142b1e724b9b9b171cb0e38fd78b35f8ac5269d74296c39c9f8628d848f57af9d8525a33f19021db2b9c64ba113171ebb3882075019ec7e77b51ce80b063ed41d48dad481d9536c030002a75d15c1c10ce0ec3ff17bc483f8416055a99b53035f4b6ea60",
-       },
-       {
-               length: 148,
-               nonce:  [3]uint32{0x2b079658, 0xbdf5da85, 0x8a75450d},
-               key:    [8]uint32{0x49c9eaa3, 0x62048819, 0x9baacfa5, 0x3870addc, 0x5c682e1, 0xf4f9fff3, 0xa3848e4b, 0xac1ebc1},
-               input:  "ce0f0d900dd0d31749d08631ec59f216a1391f66a73bae81d3b0e2919a461bc9a14d6a01b827e3bcb55bbccf27c1ed574157e6becd5cf47181a73c9d3e865ab48a20551027e560e965876b0e1a256bfa5cb5179bf54bd8ec65e5570e374b853b37bf4b3ef1ec612d288ebc19275fa88da9419e012f957f9b6a7e375b3377db0eb3619c731aebfeb0930772b4020d3a3e90723e72",
-               output: "b06981b57fe184091ef9f8ccf522a5bcdb59bf9a68a3ddb817fdd999a6ecf81053a602141cf1b17017bae592b6b6e64756631a2b29a9e1b4f877c8b2ae30f71bc921e4f34b6f9cd8e587c57a30245f80e95005d0f18f5114400785140e6743da352d921fb4a74632a9c40115ad7706263ac9b41a11609fa0c42fc00f8d60931976162598df63ebad9496dd8943d25a03fa47475c",
-       },
-       {
-               length: 148,
-               nonce:  [3]uint32{0x98e8ab8, 0x84d8e77b, 0xbb305841},
-               key:    [8]uint32{0x46b5f93c, 0xc8b2778d, 0x2cc5278f, 0xd2a3904c, 0x6ce5d4f, 0xc4459e8, 0x4a35c30, 0x2feadc02},
-               input:  "eccfd66bdc691478f354b8423d6a3f20932a1f591d8e6cefa734975fb8ee6881b6dc92c0d1d5ed54fd1999efd7f11ac697a1f130587dd895eb498c9a8fc7d1714c385ec156ecae3bdea2a3462834245e724531d0fedda2b77693a53ed7354b758e875b23cfc83219a091fb2076e7a88cd77f779ed96f8d81ffa3fe5059303ac706086494b9f2982f4f88a0c6fadc3748625004db",
-               output: "925529047d4177b72bf50905ba77e47608815522c1829b24046e439d5451901257903a5409fb910373167e8b7f4fdfa543a477608ddfc11bbd1efc138366961463b9915b302a346b795dd593f6fcf4fa73529b6fe83079552aabbe99474a72806f59688d826675fa7f6649b9f5307e5028853c9821b8c4a1a0fc4bfdc7c8c78b25aeaba2b5821d17b36317381a3bd578917d2504",
-       },
-       {
-               length: 152,
-               nonce:  [3]uint32{0x2e2a6e4a, 0x9a6d488a, 0xf9966cb6},
-               key:    [8]uint32{0x58903bff, 0xc2be173f, 0xe26128b5, 0xb6b6af53, 0x92f8eeb, 0x38cf3336, 0x7fdf90fb, 0x7ae24b37},
-               input:  "f0c7139c69413869bca980d7f192b2bc3f57e34ca4f26164e1a54a234e84e1aa285cc02cfbaef3dfba2dbb52a555ec1f6ef0e89d0b2f0bd1846e65b74444b5f003a7308965e67bed558689be2668ca10ca368fac072e0e4535a031af23b3c37c561e185872b86c9bceddb5c1199e43fb5f735384766d33710460b541b52d3f5b6c108c08e76724bcac7ad2d866a8bbeeea92a3d867660d2e",
-               output: "d2c16c7a242b493038203daec65960de384c030eb698ef6a53c36eabb7556cbfa4770eaa8bc0a2b385ad97495eeb1c03ff4e6efcb804aefa81c177dc62700a9eefe6e8dd10cff5d43a2f47463cab5eb1ee260c3826cac9bfa070f1e0435541a89ebd224d13cc43f8fff12f38091c2b3f2102d5c20d8b1c3ae4f129364bbe9f9ce2147dcf0639668ddb90dffe6a50f939f53fa7ba358e913f",
-       },
-       {
-               length: 155,
-               nonce:  [3]uint32{0x243e0198, 0x884448c, 0x9a31e760},
-               key:    [8]uint32{0x37e017bc, 0x9b1e2e90, 0x15679daa, 0xf94a23ee, 0xda86dfe, 0xc3eea84c, 0xdd199799, 0x6eeffb92},
-               input:  "7024974ebf3f66e25631c0699bcc057be0af06bc60d81a7131acaa620a998e15f385c4eaf51ff1e0a81ae5c6a7442d28a3cdc8aeb9701055e75d39ecac35f1e0ac9f9affb6f9197c0066bf39338a2286316e9d1bb7464398e411da1507c470d64f88d11d86d09e6958fa856583ace697f4ee4edc82618662cb3c5380cb4ce7f01c770aab3467d6367c409a83e447c36768a92fc78f9cbe5698c11e",
-               output: "ff56a3a6e3867588c753260b320c301ce80de8c406545fdd69025abc21ce7430cba6b4f4a08ad3d95dc09be50e67beeff20d1983a98b9cb544b91165f9a0a5b803a66c4e21bd3a10b463b7c1f565e66064f7019362290c77238d72b0ea1e264c0939d76799843439b9f09e220982eb1dc075d449412f838709428a6b8975db25163c58f40bf320514abf7a685150d37a98bac8b34ccb5245edb551",
-       },
-       {
-               length: 160,
-               nonce:  [3]uint32{0xd24e866d, 0xc59d25d8, 0xfcf623f1},
-               key:    [8]uint32{0x5f32cca0, 0x4167cac5, 0xc04943ee, 0x507fa1ec, 0xad8fdfc0, 0x6266fa2d, 0x22f05341, 0x8074143e},
-               input:  "8d79329cf647e966fde65a57fc959223c745801c55312046b791671773cca0af4cd48ead1f316eba0da44aa5d18025eced0c9ed97abaabb24570d89b5b00c179dca15dbae89c0b12bb9e67028e3ae4d6065041b76e508706bec36517a135554d8e6ef7cf3b613cbf894bec65d4dc4e8cb5ca8734ad397238e1e5f528fa11181a57dc71cc3d8c29f3aba45f746b1e8c7faace119c9ba23a05fffd9022c6c85260",
-               output: "60aea840869f7be6fcc5584b87f43d7ba91ed2d246a8f0a58e82c5153772a9561bdf08e31a0a974f8a057b04a238feb014403cd5ffe9cf231db292199198271f9793c9202387f0835a1e1dc24f85dd86cb34608923783fd38226244a2dd745071b27d49cbffebea80d9dacad1578c09852406aa15250de58d6d09cf50c3fcfff3313fac92c8dad5cb0a61ccc02c91cecee3f628e30c666698edecf81831e55ec",
-       },
-       {
-               length: 167,
-               nonce:  [3]uint32{0x30b61047, 0x810cf901, 0x4d681524},
-               key:    [8]uint32{0xe51476d0, 0xdf98008d, 0x59dfe69e, 0xdb39166, 0x6c1e4a4a, 0xfb76165e, 0x5180f185, 0x7359fb35},
-               input:  "85484293a843d2d80b72924b7972dfa97cbe5b8c6bcc096f4d5b38956eb3f13f47b02b0f759ea37014ecdecfb55f2707ef6d7e81fd4973c92b0043eac160aaf90a4f32b83067b708a08b48db7c5900d87e4f2f62b932cf0981de72b4feea50a5eb00e39429c374698cbe5b86cf3e1fc313a6156a1559f73c5bac146ceaaaf3ccf81917c3fdd0b639d57cf19ab5bc98295fff3c779242f8be486ba348bd757ba920ca6579be2156",
-               output: "bb1650260ef2e86d96d39170f355411b6561082dcc763df0e018fdea8f10e9dc48489fb7a075f7f84260aecc10abcfadbc6e1cd26924b25dedb1cc887ada49bb4e3e02006bdd39098ef404c1c320fb3b294ded3e82b3920c8798727badfb0d63853138c29cf1ebf1759423a1457b3d2c252acf0d1cde8165f01c0b2266297e688ff03756d1b06cb79a2cc3ba649d161b8d9ef1f8fb792bd823c4eabb7fb799393f4106ab324d98",
-       },
-       {
-               length: 172,
-               nonce:  [3]uint32{0x42020cbe, 0xad62af90, 0x29e53cd},
-               key:    [8]uint32{0xabad2095, 0x601ec477, 0x3bc923a1, 0x1edede1a, 0x33612355, 0x285b4858, 0xd3fd6714, 0xe0f4bcc3},
-               input:  "a2fc6e1b5281a4e0330eecd1ab4c41670570423173255979953142b78733b2910fa5540e8294208df6ae4f18672d5ac65acf851bcd394e1932db13c81b21e6f165e5538aff862e46126c650bbe055e54b31c78f2f0221d2631d66ef6d3f4c5ae25eada043b74d8770e2c29799c0954d8ccbd17766b79e6e94e88f478db3566a20cb890846917591a07738328d5c05f7ed4695a82607660f1239661faa9af0368aeb89726f13c2aaecf0deaf7",
-               output: "d8fe402a641c388522842385de98be60f87d922c318215947d4b7562d4ca1e2dbc7ee86494e65fb0bfddfdebdb2ae6469312f95b32c722b2720d64bb8d7cc3dd82f9055b1d89f05b77984f91f94ba4ac79c5129cd7c91cc751b0defc3f2799518e372d27aa683f1e7bbd4f55414c48fe8a3a37ac1f179a1a329cda775aec0d31d75a5a38addb1de67c06bddbedf4c8d87abc18c9f9dd072d457ea29ad4dfb109ce7e99a4a82fbe330b0afbb5",
-       },
-       {
-               length: 176,
-               nonce:  [3]uint32{0xa8021c8f, 0x667a02c4, 0x7a68b693},
-               key:    [8]uint32{0xece401c8, 0xfa805a47, 0x6d572fca, 0x9c1c780c, 0x647545e5, 0xd7ef4c11, 0x91dc1e46, 0xba2a694e},
-               input:  "480387bc6d2bbc9e4ced2448d9ec39a4f27abe8cfb46752d773552ad7808a794058962b49e005fef4e403e6a391d1d3f59025eeb5fb8fbbe920f5361862c205d430eac613cd66108f2f2f0bd4d95a8f6ca7bd1f917eaeb388be87d8b7084a2eb98c575034578edf1b3dafff051a59313873a7be78908599e7e1c442d883d3fd3d26787eb7467eed3a3fb2d40046a4460d5d14215565606bcf8b6270af8500e3504d6d27dacf45bace32214472d525fdc",
-               output: "ab81a9c28358dfe12e35a21e96f5f4190afb59214f3cf310c092ab273c63cd73a783d080c7d4db2faccd70d1180b954cd700c0a56b086691e2c2cd735c88e765e2266cd9ebe1830d63df4b34e2611a8abeeca9c8c4fac71135dafb1cb3569540ed1362ddeb744ed62f6fd21de87b836ec2980f165c02506e0c316ae3cf3d18a862954d9781f726ecc1723af4a730ccc6d6de82553450a52499acb58fb2008969401c45b2f20e12b58f308db1d199b4ff",
-       },
-       {
-               length: 176,
-               nonce:  [3]uint32{0x414e687c, 0xc6fc69c2, 0xd3ca12d3},
-               key:    [8]uint32{0x1b51cca, 0xbc8455af, 0x3f904842, 0x6042b452, 0xcd4dd164, 0xda83f3f0, 0xff04b972, 0xf972dd0e},
-               input:  "b274e61059f3215173ae226e30a92ee4b4f8a3da95f2e768e3fac2e54ddac92c200c525f190403a6ef9d13c0661c6a7e52ed14c73b821c9680f1f29711f28a6f3163cf762742ed9474dbea51ff94503a5a404adbbdfbf4c6041e57cb14ea90945dc6cb095a52a1c57c69c5f62ac1a91cd8784b925666335bbfee331820b5f7470bc566f8bbb303366aafe75d77c4df5de2649ed55b2e5e514c3cb9f632b567594a0cf02ec6089a950dbe00554ee4dfb9",
-               output: "a0969730d48ee881792a3927b2f5d279aba9f2ed01e6b31b92d0e1fb8ba7f35a236d838e0ce5f8654957167de864f324c870864b4e7450a6050cd4950aa35e5a1a34a595e88dd6f6396300aff285de369691b6e0e894106dc5b31525e4539c1e56df3ceedbbab1e85da8c0914e816270a4bae3af294b04a3ea6e9ef7e2aab4da5f5370df2706b5e3f000d88179ac756deaa652a1cc85e80ad9622f1bf91a2776262eb7289846d44f7f8192e763cb37aa",
-       },
-       {
-               length: 183,
-               nonce:  [3]uint32{0xdd315c1d, 0x2335da98, 0xe0a0da0f},
-               key:    [8]uint32{0x6419c7d6, 0xd340f42, 0x7af2f4b8, 0x3536cf42, 0x2f68c6fb, 0xac9d855f, 0x7c4d490, 0x9711b1b1},
-               input:  "ee849039c6cd972dc943d2a4468844d130c0150276f4e0889047e2300c3ecc6792c4527bfe9437dad877eb986e6b1aa9b867d1798c9d314243f0a87ec9ee5b601c2554876c87cbf50df3334a077c4152f8b8fef4a2d301ddbfa90c887ece757c3eb6c4fc1e0212d6b5a8bb038acaec28cba064c9b34f5364cb7f0fc2ac4ef2c7ddde0f5ba17014459eaa78f08a46a01882ebf7c6e409dadda250bb899dc8b3b70e160bbcb4412a9963b174d0fc6bc16383a46ffaacb6e0",
-               output: "3e272ded9c0a5cebe7cf17ac03f69eb20f62996e047501b6cc3c8691ddb2780ea72c21a81888bfea96e4373a412c55ca95648390de740102d661143043baec3976230e024477d134b8504a223c36a215b34164c9e9e1fa99a49fdc56f2f04ea525a6b82997d9bbc95c4b5baeab4dec50061efb7c1a757887acb8b47b142e0a2e61885a2c14c4642d83d718a0546b90699adc545a48129603862a1c89d8e665cde54b3ba487754db6d6f5acf6a4b95693cc569577a2dc48",
-       },
-       {
-               length: 185,
-               nonce:  [3]uint32{0xebb44f7c, 0xaf14c7dd, 0x4543cd7a},
-               key:    [8]uint32{0xce71977, 0x99790e86, 0x6510d6dc, 0x37968ae7, 0x2917fb9a, 0x19ef25f, 0xd282d085, 0x6128d043},
-               input:  "0992396a6f29b861dd0bc256e1d1b7dce88435733506a6aa20c62e43afa542d1c46e28b2e6d8e2eacb7c08db05e356fe404684b0e3a9849596db82eb788aa09258c28eb19e9838f757425b4edef12deeca56e30cf030272e325d4246d6e083219b2f965124963ca91f066d47bf5a8282a011a78b0155aa70038259a4a59135f241fd2f88c908b9f4eef7b7df0f3a1c16a52c009b522f89dabd52601bbf6e3ce68732e1a6d444469480f06da218786cf6c9666362e7a7f7be12",
-               output: "545c05a84b5a4fffd1dd623c8f2b11443818560bdb0c26dadd3b694d4790d294b99059f4127b7cca122c4000954d745af96094ff4623f60db33e994bb6903263d775f48d7047427b3a498c2ecde65bd37bcb8ee7e240a1e08c884c0079cab518f4e1c38ba5ea547f4da83b7c6036e4259bee91c42e8fae895df07781cc166f1d50e1550a88ee0244bb2950070714dd80a891aa8a9f0580a67a35cb44609b82a5cc7235f16deea2c4f3667f2c2b33e8eeef944e1abdc25e48fa",
-       },
-       {
-               length: 187,
-               nonce:  [3]uint32{0x35cb7190, 0x212e9a86, 0xbc423ce4},
-               key:    [8]uint32{0xfa19cede, 0x576ae8f2, 0x58055dab, 0x91b3355d, 0x69d2501a, 0x736323c2, 0x266c1385, 0x134f4557},
-               input:  "3b9efcbbb607fad5e9f1263dad014cc5c2617d439fcd980408f4f9a93acb1a33d1c3a22f38c037e4603dfbbfb5571bc08c4a1958cbbf510e3e4dd19007fe15fad7808369149a9c4db7ca0496f7a600a6f2454ee1cffd5a68d45c270e4b53ac9b77f33a1ffbb1804244f57d2b05b8036fe2cda9efead3d4eff074ea5c07128e0b354a4a11ffa179163933bc6bd10d200804cc93b64575746e94e975f990bddcc8a4335e99e2459fbe9bc0e004ffcd6cac52f48ef55cc0637a75c1dc",
-               output: "631ba7301e33236da2477506ea98d3b732447389e849b68e1f09bd5fd814f40dc3247a1012fa654f08e3dda0c104ee2dff12ecf5cb018644de50d70dfb6c8cc1f5f552e5f1e50466bbb538ad6b98fd37f33fe615c326efc9cc97899b829b007f91569fa9b28ce0076c53daedf9cc0f838e22cf1125b86a6a2c2eb4a45dadea45ad00fb4f054e7d6b09c13ab1dd5328debfbf4f1b70af2b8a5b1d02df8a87d7661473e0c180ba4c815f14db87c5bdc15f11a29d8e0ce3d747d5dcd4",
-       },
-       {
-               length: 191,
-               nonce:  [3]uint32{0xccc941ac, 0xdba45b02, 0xab0d7ad6},
-               key:    [8]uint32{0x9b750752, 0xa627090a, 0x967c95f0, 0xf8ff2c3f, 0x69beb97e, 0xa30b99c1, 0xadddc83, 0x443f9baf},
-               input:  "f28a71efd95e963e5e0bc0fcf04d8768ce93cb55dc73c32e6496022e214596314b7f843f5c7b136a371c2776a0bfbdd534dccbe7f55e9d3d3b5e938f2d7e74393e4caf6c38fa4b05c948e31dc6a9126817fa3d7892c478f75ab9f6ab85c0e12091bd06e89c7d3ca8d9dcdd4c21fead3d769a253919c2c72dd068474ea322b7e71cafa31684e05a63e179e6432fb70661792cc626a5060cec9e506b35d9286f15dc53cc220b1826314eec337dd8e7af688e5950b2316c30516620569ea65aab",
-               output: "1bcea54b1bf4e6e17f87e0d16388abe49b988b9c785b31f67f49f2ca4011ecd2ad5283d52ef707dd3b803e73a17663b5bfa9027710e045a0da4237f77a725cf92792b178575456de731b2971718937dd0e9ea12558c3fa06e80bbf769e9799f7470db5b91476d6175f1a6d8e974fd505854c1230b252bb892a318e6d0c24dcc9ecb4861769cd746abab58805bc41c6086a6d22b951fba57b00c5b78f6dcb2831715b9d4d788b11c06086f1d6e6279cd130bc752218d7836abc77d255a9e7a1",
-       },
-       {
-               length: 198,
-               nonce:  [3]uint32{0x987e7c58, 0xcc839a94, 0x30952e60},
-               key:    [8]uint32{0xe34a286f, 0x4adcd996, 0x97168712, 0xa82dde8, 0x14249e5, 0x5e82810b, 0xb4a445e8, 0x9579adb0},
-               input:  "c1d1ede73bd89b7c3d4ea43b7d49c065a99f789c57452670d1f92f04f2e26f4f5325c825f545016c854f2db2b3448f3dc00afe37c547d0740223515de57fd7a0861b00acfb39931dc9b1681035d69702183e4b9c6559fb8196acbf80b45e8cc5348b638c6d12cea11f6ef3cc370073c5467d0e077d2fb75e6bf89cea9e93e5cf9612862219ca743ef1696783140d833cd2147d8821a33310e3a49360cb26e393b3fee6dba08fcda38d1b7e2310ec1f715e3d8fa0c6b5e291eea07c25afd5c82759a834a89cc5",
-               output: "11a8493cdc495c179f0d29c2b4672997205a9080f596ee3c80d79b55162b1c875ac18eb94bf2a9e05b08024f524a1e9665912394a330c593d23260e6bdf87620c10a48f678693196fb744c49054182fba667c601e7b7ebf0f068e8d69ba004b804fda616a4a0d5350e1a3bd424b8266462be282308219c578569aefc1ccd09ecdf5da283356c9e524e14e69d25b0e19643dab26f54373a7272b43755c3f1ddaee6c5fb9e8e093110c41697e95f73a68c75454e050239197c9fbd8cec76698bd11894ebf6e2b2",
-       },
-       {
-               length: 204,
-               nonce:  [3]uint32{0x851f025a, 0xe6f3c800, 0x85ae7530},
-               key:    [8]uint32{0x2d0dbe47, 0xda05e465, 0x42f6b3b2, 0x7026e79e, 0x9e446680, 0x691df976, 0xf7b23da2, 0xbb3421fa},
-               input:  "37b2dc4b6a5203d3a753d2aeffcdaed5a7c1741ed04d755dd6325902128f63b6981f93c8cc540f678987f0ddb13aae6965abb975a565f0769528e2bc8c6c19d66b8934f2a39f1234f5a5e16f8f0e47789cd3042ca24d7e1d4ddb9f69d6a96e4fd648673a3a7e988a0730229512382caaded327b6bbbbd00a35df681aca21b186bc7ac3356d50889bbf891839a22bb85db4c00bfa43717b26699c485892eb5e16d1034b08d3afa61f3b5f798af502bba33d7281f2f1942b18fb733ca983244e57963615a43b64184f00a5e220",
-               output: "b68c7a2a1c8d8c8a03fc33495199c432726b9a1500bc5b0f8034ce32c3e3a78c42c1078e087665bd93c72a41df6bfa4e5beb63e3d3226aeeba686128229a584fab0c8c074a65cef417ad06ab1565675a41cf06bb0fb38f51204eccccb75edd724cdd16b1d65a272f939c01508f0385ca55ac68a0e145806317cc12e6848b1124943a6b2d99a8c92083fc5f31ab2e7354db3f8f2d783dbf1cfec9c54f8bfcb93d6f28ef66f18f19b0fab8836458e9b09bee742ba936cb2b747dd9dcf97ca7f6c82bf0af6f1b433592d65143fe",
-       },
-       {
-               length: 210,
-               nonce:  [3]uint32{0xaebfd97f, 0xf583442d, 0x15ab2f1f},
-               key:    [8]uint32{0xd3d1cf9b, 0xe43187e6, 0x5071a757, 0x412a83b4, 0x3f27716f, 0x17fdc488, 0x271f77ed, 0x6c4bb056},
-               input:  "68c2c5612912b5f994172720130dff092ee85a2c1395111efa64d5a281ca864d3db9600e685854d81c6de7e8747b92fb7c4c2efa829d3d4c0c9fc9d689e2e5c84c9eae8ba4ab536fb6c7523124b9e9f2997f0b36e05fb16163d6952eee066dd22fb7585925ffded0204cc76818bcead0d1f8095ca2cf9cd1ddcd0361b9c9451940e14332dac4e870e8b2af57f8c55996447e2a8c9d548255fe3ed6c08aedaf05bb599743ecb0df8655152bbb162a52e3f21bea51cb8bf29f6df8525eb1aa9f2dd73cd3d99f4cca31f90c05316a146aab2b5b",
-               output: "d0ae327fa3c4d6270a2750b1125145bdeef8ab5d0a11662c25372e56f368c82c6f5fc99115a06a5968f22ffe1e4c3034c231614dd6304e6853090c5940b4d1f7905ef4588356d16d903199186167fec57e3d5ce72c900fe1330a389200ed61eec0bdc3672554f1588ec342961bf4be874139b95df66431178d1d10b178e11fcbd26963ff589d5d5faf301b7774a56bbfa836112a6ea9c3026ebdd051085f9131132c2700674bef6e6c2c5b96aace94eb2ba6c0e0aef0eefa88995e742ca51ac50af83683b801b7c2c5af4880e2b344cc5564",
-       },
-       {
-               length: 216,
-               nonce:  [3]uint32{0xf9e973b8, 0x2485a6a7, 0x2ea7dee6},
-               key:    [8]uint32{0x96edef11, 0x8cf57f26, 0xb6e3a83c, 0x9ef434c6, 0x4607ea48, 0xace87e4d, 0xa0d87475, 0x3a9c9458},
-               input:  "fed3d1efa309c8b50cb9da02b95167f3b77c76e0f213490a404f049270a9c105158160357b7922e6be78bc014053360534add61c2052265d9d1985022af6c2327cf2d565e9cef25a13202577948c01edc22337dc4c45defe6adbfb36385b2766e4fa7e9059b23754b1bad52e42fce76c87782918c5911f57a9394a565620d4b2d46716aa6b2ba73e9c4001298c77bfdca6e9f7df8c20807fa71278bd11d6c318ed323584978ad345c9d383b9186db3bd9cec6d128f43ff89998f315dd07fa56e2230c89d803c1c000a1b749107a3159a54398dac37487d9a",
-               output: "6a95fba06be8147a269599bccda0ce8f5c693398a83738512e972808ec2f25bc72402d4bcd1bc808cc7772b6e863b0e49d1d70c58fcf4fcaa442215eeb3a4648ade085177b4e7a0b0e2198f0acf5465c97bd63f93781db3f0b9a0a184c3e06a76c4793a13923f83b2242b62511c2edff00b5304584cbe317c538de23785d2504fae8faabee81c5315298186ce3dcbf63370d1ccd9efec718cbc90b3d2e0b0b6aefb3a9b31e4311f8f518be22fdc2b0f00e79a283701c53f6936dd63734ecb24480d5365d1a81392498faf9a1ddee577007acc5f8c87895be",
-       },
-       {
-               length: 217,
-               nonce:  [3]uint32{0xe3bd4c44, 0xa3b75a31, 0xfe92010f},
-               key:    [8]uint32{0xdd05ab8b, 0x5ac7cd1, 0xb8113720, 0x53524706, 0x8e0ceea1, 0x52eb23e7, 0x1c85730b, 0xb33914d5},
-               input:  "d776bee5625d29a2ebf6fec4df94d2b9ac62e8e7c56704fd38a87ee932b787cbc555621535e76ea30183cb0ee30604f485b541f45feb8c01b9750d37fded5cdffbbc34fb90fdc9c7c7ddf949a1d50b796f1ea5db437238c7fb83c4b22c9e491f75b33d84746f1cd10bfda56851b8514ff0ded0adfd5092a66a85202d06bd967485d06a2c56011110da74bf40b6e59f61b0273164744da02ce2b285d5c3f03aee79eea4d4503e517177692ed3bb035071d77fc1b95c97a4d6cc0d41462ae4a357edf478d457c4805fa586515614697e647e19271091d5734d90",
-               output: "60e9b2dd15da511770162345251edfb15cea929fb79285a42f6c616dfde6befc77f252e653b2d7902a403032fc4ce4934620931a2ec952a8d0f14bf1c0b65cc287b23c2300999ed993446eb416749bf0c9c7dfe60181903e5d78a92d85e7a46b5e1f824c6004d851810b0875ec7b4083e7d861aabdd251b255b3f1fd1ee64619a17d97fde45c5704ab1ef28242d607d9501709a3ac28ee7d91a3aac00cd7f27eb9e7feaf7279962b9d3468bb4367e8e725ecf168a2e1af0b0dc5ca3f5a205b8a7a2aae6534edd224efa2cf1a9cd113b372577decaaf83c1afd",
-       },
-       {
-               length: 218,
-               nonce:  [3]uint32{0xcdabfd50, 0xd10d5b99, 0x9e160a85},
-               key:    [8]uint32{0x8231a4e9, 0x89f33c8b, 0xf96b11b, 0x853cae9d, 0xf6624a33, 0xee9523ee, 0x28bb7853, 0x688ac6f8},
-               input:  "4f57848ff5398e61bcafd4d4609bcd616ef109c0f5aa826c84f0e5055d475c6a3a90f978a38d0bd773df153179465ab6402b2c03a4bf43de1f7516eb8626d057ae1ab455316dd87f7636b15762a9e46a332645648b707b139e609b377165207bb501b8bccfa05f1bf0084631c648279afdf51c26798899777812de520f6a6f0d3c7f3ef866982f5d57f9c8d81c9a4eabb036651e8055a43c23a7f558b893dd66d8534bf8d179d8aa7d9e8987cfdaaa7b5a9381ba9c79d5c1161b1bdbd30defdd304ee07f19b7ba829a0d5b40a04b42edd6407b68399caac69069",
-               output: "e096cc68956ed16d2dea1154a259e01647913eeea488be0b54bd1816c781a35e161772ae1f7a26b82e864ade297a51cc9be518641b2e5f195b557ec6fc183e4e5c1fc01d84fe6ca75e5b073af8339427569b1b8ee7fcff0ffa5e7e6237987c40deec0abf091c06a3b28469c8f955fc72e4f3727557f78e8606123e0639dff782e954d55e236448f4223ff6301accda9f8fa6cd43a8d6381e5dde61851a5aec0f23aeca7262659bc793ce71fa7992f80e44611ae080b7d36066e5c75c30851306f0af514591d4d5034ecdf0d6c704bfdf85473f86141c9eb59377",
-       },
-       {
-               length: 219,
-               nonce:  [3]uint32{0x67de323f, 0xa0442ac9, 0x9d77b1d9},
-               key:    [8]uint32{0xca8d33d4, 0x834349d9, 0x5e68d581, 0x99a7c30e, 0xdc7f6038, 0x697e8b63, 0x284c2ece, 0xee3e3bfa},
-               input:  "046a61c0f09dcbf3e3af52fab8bbcded365092fad817b66ed8ca6603b649780ed812af0150adbc8b988c43a6ada564a70df677661aff7b9f380d62977d8180d2506c63637c0585dcef6fe3f7a2cf3bbb7b3d0df7769f04bf0f2e3af9439ab7615c304b32055aea0fc060890beb34fa9f90084814b6ed7363b400dfc52ee87925c5b4a14a98e3b50c7f65adc48c89ddd6414626c5e0bdefabab85c4a0e012243e682d4931be413af62fd7123ab7e7774fcae7e423bf1d3a31d036195437e9ea8f38aa40182daa9aacf3c9f3d90cc0050977c6065c9a46bcca6ba745",
-               output: "cd5a6a263e3ee50dda0e34c614b94c3ec1b14b99a2f4095a6b5715fdfc3449fcdf8a09d1ae02d4c52e5e638f1ee87a4a629f99f15a23dd06718792f24285f5a415e40f698752c697ee81f2f9248da1506ce04a7f489f8e2b02e6834671a2da79acc1cdfb78ea01822d09a1c4a87ffa44e56c4f85f97507044cf946ccb6a2e06e2917bac013f608d75ee78fa422a5efc9c569226bf7068d4705fde3a9fad2030256db0acf9a1d12666e0acf9f5346ad62e5af4c01a008d67ab1224b3e98278d073116ff966cdc779fb3aff985ec9411a3eefa042d71dd4ae5b15d5e",
-       },
-       {
-               length: 221,
-               nonce:  [3]uint32{0xa36a3d5a, 0x1747a05f, 0x5440eb4},
-               key:    [8]uint32{0x2d701ee6, 0x143d5a1a, 0xbb67b9ab, 0xabc88ccc, 0x20baad8f, 0x6507e48b, 0xdb1e1b39, 0x9e521d80},
-               input:  "af516216f74a6344cbe458cbba820f7e25c0b10aa84b790da2ee6317e059171076d7246c2878be83fc00c200d546c007f849e4c163d52c7b0da31beff4abff481be3266b92e668cf4dd1c84d9d7b3e5191dcd6ddb51d17d337621046e83e9ac035fccfb239648bc3c6fd340fbb50707e5a33b3ef439d292192d0e4bc727690c61450e5a28789e5ea50e746bc66d039493e080fb70e9ae06d89004cb71de8178941c422f1e9862492fc9149a4864ff52b1277b9f5a63c2f16e9adb5263cf65a034a62ebb0f1a385d2681c87a35f1c45670b4edef1c68fe9544fcf411d95",
-               output: "b22ffd8f0e549bd3e0206d7f01ff222f92d39b41cf995a331d5ef0cf5c24bcc3ddb36e64d351b5755400246fe4989b5f912e18daa46cdd33e52dafbd2872f16e94220b56315d72c1dbb1525fd34831d7202970c11711ff36de3fc479407c34fef0aea86e172f9beb0f393194355b9dd59625639f4a6bf72ba571c229f2fb053c1114e82793deb2dfe8232f1a327949689d2fb2820662dcd2a39a2546c7df12b3ff7e87e58c74badf568cddebd3c558f0f7874c834c4b8aa988653f138ec79620f5e3ed737690928a30f981dca9f2920ac7307607063b40f87c204de47c",
-       },
-       {
-               length: 223,
-               nonce:  [3]uint32{0xb92be022, 0x1e1257c7, 0xad7c01e},
-               key:    [8]uint32{0xca1dbb9c, 0xaadb9504, 0x77b8a95c, 0xc50deb5e, 0x2dbc0fb8, 0x9e654bc2, 0x94d8925a, 0xfe9cfb66},
-               input:  "a3d70bdb509f10bb28a8caab96db61652467cf4d8e608ee365699d6148d4e84d5d93bdabe29aa4f0bc8ee155f0b1fb73293c5293929eaacdd070e770c7cccfb2de120b0c3811abeeddaf77b7214a375ca67d618a5d169bb274a477421d71a651cfb9370bcf7e0d38f913754c11002089cf6cd6a8de1c8a937fb216591d57b37efdf3797f280773950f7eddeb9c3385c8315ff5ff581c64610a86ada7ff6a1657e262df94892dff9fdfb6e958d101f4c26296470c138dc4e1ca4bb565b3ff877a7f78b3d11d64b7c24e27ba6f6b06f6e368f5ac218cd5d11b815ab0987678eb",
-               output: "646314264896a6e25601e536f6e783d465b2ead1e0be4422bc9cc8eacabae4a749ad533eb28091be8397328dcfb34c92006bbda930ab070ed7b806095bb1c8f476350e7b08ffbd4d7d6055c8defaa8deff9d54f5215c2d7db27ce09e08f5d87a859145ea3126e2a01882921c3fddef3985bd451bca44063258390aec8ec725b07d064314fe43a9c83e9287b47616dfefbf539b82da209aa08a6d3176b7e3b4be4a17d44e581280a684e4a64414649bfcea82b541729f8178b580e8b972a89f5b8c4f9b68205e9396d8ae5e81873b61da074080fd44c52d50fb0880ee9c35da",
-       },
-       {
-               length: 224,
-               nonce:  [3]uint32{0x5091927, 0x661c75ba, 0xc23dad},
-               key:    [8]uint32{0x2e00499d, 0xafdc63db, 0xc3c62efb, 0xb4157a19, 0x84ce8b13, 0x85326279, 0x2ee71e9d, 0x318721e4},
-               input:  "f48b5ae62f9968baa9ba0754276cd8e9dcfa8a88e4571856d483ee857b1e7bc98b4732e81f1b4421a3bf05ab9020d56c573474b2a2ac4a2daf0a7e0c3a692a097e746d12507ba6c47bec1d91d4c7cfc8993c6700c65a0e5f11b1ccd07a04eac41f59b15b085c1e2a38b7d3be9eb7d08984782753ae23acdafbd01ae0065ab9c6d2a2d157c1fc9c49c2444f2e5f9b0f0bbfb055cc04e29b2658b85d414b448a5b62d32af9a1e115d3d396387d4bb97ba656a9202f868b32353cc05f15ae46cbe983d47b78ba73d2578a94d149e2c64a48d0c1a04fc68baf34c24b641ea0b7a800",
-               output: "b9af1016275eaff9905356292944168c3fe5fdffd9e4494eb33d539b34546680936c664420769204e91ead32c2bb33a8b4868b563174d1a46108b9dfe6d9ac6cc1e975f9662c8473b14950cbc9bc2c08de19d5d0653bb460bea37b4c20a9ab118a9550bfeb1b4892a3ff774e8efe3656adcdf48239f96e844d242525ee9f9559f6a469e920dcb3eaa283a0f31f5dfac3c4fac7befa586ac31bd17f8406f5c4379ba8c3e03a6992a1915afa526d5ed8cc7d5a2605423ece9f4a44f0c41d6dc35a5d2085916ca8cabd85ac257421eb78d73451f69aaedeb4ec57840231436654ce",
-       },
-       {
-               length: 227,
-               nonce:  [3]uint32{0x5d6d997c, 0x9d623987, 0x5742de36},
-               key:    [8]uint32{0x57b2a5ea, 0xc5bdd68b, 0x99c7b0c6, 0x26aea960, 0xba5c75f1, 0xa904cf6b, 0x685031de, 0xa0f0e99},
-               input:  "b39101601efa2ecdf41878b0fd920a3005ce709e4ec2970abb76e32c232ea21069f81b246eda75aace7555ce8ae203455d3723e684bd671389300e353eec0d2f499d10654fafda2e7a69bfca7198eb172249167ca8864b5d5f58d28723090ec86e251a1bac0346d52fd81f06e0c05429e0b2b895588290b7d00878a4da3378eb6c7e61487de2b318fedf68fa7ad7c88ee746827c1f60d98c7716f3f9695c5ffd4670f71a0fa78a1fb554ba482c5de83feaed7c65fc71acc9f541342eb8f7622b12bb2cfa222fa2ddd8b3ed210ce442275afa3132c8a0e17dd504ecbc92525c118952be",
-               output: "50eb5b21c179a03b9a822f0075906a3ce4acc32486139f92635c7d834f69071d5a6dc0e15ed06a5cee37147071d59641d140a82ad5815b954e7f28e080c3dbbeaf13943d7b7c66d49d51ba1132eeadd4cb7a7e7d726d08d95f1578d55519f267f753f3e16ff39504a87b2286d8bfba0fe6bc28887b466bf276453a82cdd0abbbbf08db0e1c26c317d50ad9b8dc09cd621bc566d362024e8404739df6468869d2125c58b25d70e392f5e75924c4341be81c263915bb514ad436fb24c2c67450e84f6d1b72d1a02a3310c07a7814d930264fdbbf5ddca7067e18e8a44faa87169b7f2e35",
-       },
-       {
-               length: 233,
-               nonce:  [3]uint32{0x75bca707, 0x89f6d1f4, 0x2a6f657a},
-               key:    [8]uint32{0x949f42cc, 0x2b5d3c48, 0xfe0be473, 0x17ac92aa, 0xbdc9d9dd, 0x74f9df26, 0x26487508, 0x7c7b41a2},
-               input:  "0a42f63b975ad0e12a1e32615813dfd6f79e53ce011e2a2f0534dd054689f8df73a8326fecfd517ff7fe530d78081af66c3a8c7c189eb9d9efed1e5577b5512d42ef1fe273f670ce380c64bc62e217a7e410a8ed89998344e29301e4e053a3a3cf7e71587fd056a6bd976f16e157476a06997dfaaff32172dd84190570621f2221420c0a0ea607ea756e9792c8c0e7157c95b89c9490e20b750ee85e4c27c9b8f409e848ec90afcad33342010bb9808358afbcb3d9b094127c38c243a204e76899677079758e7cbada9a5c18363449eebc07bab516a16372722403a046df85c7dd2ffc804c54d38aab",
-               output: "87a47bcaa1c1eb8e55151011c4f39af4b9e108a55a7124cdcf66d0dee727306e6971f783b038bd6b215f530cdbb53e17975742ec304fdb3792a88b674504396978c6a5e4a9c87a7c3ca430d61165c1a3f6162eeaf38c93e18b6ccb6a595ad428cdc98efef8f84463eed757a72ffd827b71c0579fcc1f4baa11812be2bc5a2a95df8e41d04b33343df09ce628c367d1f88488f7a2787f013c8e76f0b9257cee777ec4adc6df8c5790e41ea02da85142b777a0d4e7c7157a48118046935f8888b5352d1750bf00b92843027a349cf5685e8a2a2efde16dcf5e1c1ed8c779bb38cabfb42ec4dd87d58273",
-       },
-       {
-               length: 234,
-               nonce:  [3]uint32{0x5003a4f7, 0x40bd8cde, 0xfe35fb25},
-               key:    [8]uint32{0x576e49d9, 0xe84e9df, 0x9f227a3, 0x437c9de0, 0xc46ac8de, 0x1a6a2d2b, 0x42ab7684, 0x4253fbb6},
-               input:  "abeff48fa082dfe78cac33636c421991b0d94c3bc9e5bd6d22763601a55201fa47b09ce60cb959ba107020213c28ae31d54923d1e74ab1d9ddc2762b2d23d8c6961d81068230884a39682fa4b30676ffec19319362c075df0b879a0f083a67b23597bf95c4bb997fae4736479cb8a9c00520ba2f6e5962d54c313c576180d17779ff239ad60f1f1373627770d50a1c49718b2b2e536846299e052f8c1a5d3079e91cb1b8eac4661daac32d73b3b99e2051f8f694a61d1e9d3935f802921a4d979b6ade453cf30d73a4a498a6a2c5395c60fcf271d50b4967ac12b0d7bf818c2679d552e9b3b963f9f789",
-               output: "a0d11e732984ad575570ed51031b8ac2d7b4c536f7e85f6fce9ef5d2b946cefe2ee009227d6747c7d133ba69609f4a1e2253d0eb59d1f930611e0c26a7c0cf2d2ce7ccea6e079eadf2eb1acf0463d90fb4b3269faae3febfc88cb9fb0873d8b74894506199394c8e44a96e6b479bd3e045749cce1c3f57243abdb37e67084eb573cd820c6cee424227019592a027e9da8f7b8997bfb292627a986f83c8fb8d156a91a12a8b52659cf9272924631745ed3a2453a4c2d87a167faa9104e799c715ed597bcb66949ab15dae29a86ba147507e8d8af66e96c09c53caa053ad3b79d9ed3c0c6c00169eaec3a3",
-       },
-       {
-               length: 237,
-               nonce:  [3]uint32{0xc6ae48ce, 0x26f0906f, 0xfd8ab8bf},
-               key:    [8]uint32{0x42b82c50, 0x7f519e0d, 0xcbb95098, 0x6f75e532, 0xe2c9f61b, 0x5a4af942, 0x2679777b, 0x6a8e1c9c},
-               input:  "a77b7a5870335b9145fd2e08ec898ba2f158fda16e8a2661a7a416857b6ba6937b4843ecaa79d3635d28383af80290842de9ca0bb621ee22b7fd6bf379922741e812b1739c33dd6923d0607826fc84d46bbdbd1fe9d1255f56a167779a560a6eed1b9c9579b8f771147df467e67a070d9e9ce8ad92dc0543d1c28216c1dec82614ac5e853ed49b6abac7eb3426ef0c749febce2ca4e589d06ccfc8f9f622ede388282d69ceb2fd5122ba024b7a194da9dffc7acb481eabfcd127e9b854be1da727483452a83d1ca14238a496db89958afd7140dd057773ea9a1eee412875b552d464ba0fab31239c752d7dd3d9",
-               output: "b330c33a511d9809436ab0c4b84253eeda63b095d5e8dc74803de5f070444a0256d21d6c1cf82054a231b43648c3547aa37919b32cfd9893e265b55545be6d7cd11d3f238ef66c3c278fcccb7dd0dc59f57750562cb28da05d86ee30265ff6a3991a466ba7e6208c56fc8862e19ac332e5fb3cbcc84e83a6205dee61a71acd363a3c9de96d54070a69860c152d4ceb9c4b4cc3b878547b6116699885654b11f888dc3c23483a4b24fbe27c52545c06dd80ab7223d4578ab89bff5f9cbf5d55b19611a5251031df5da5060a1f198226c638ab5e8ec5db459e9cd8210f64b2521a2329d79228cc484c5065ef8a1d",
-       },
-       {
-               length: 244,
-               nonce:  [3]uint32{0xea38678b, 0xc41eada, 0x3381147b},
-               key:    [8]uint32{0x268fc2ac, 0x21297e86, 0xdf9ef8cf, 0xd4b45234, 0x2a95c4f2, 0xcec36ce3, 0xd5fa38c9, 0x7dc43790},
-               input:  "322d634bc180458123e10d0509870b54e0f0a3a72a2bd9e9cf44324c7a1ca37dd6adf9db1fcc8dadabd881f91d47d93b58382802b42ee936802fac8612ea4dd9eca5f215935ea9ba6233b9c8bddba3385861de669d95c888c8977851cb305db577a4eb2360f362fa459d61ffc8fcaa1502905b073bd8e9567ac7cff8e5fb1002c55641a3af5fc47ac0131fae372f073e19721ffcce9821e0241d7fa67bfc499c8f100e050d39bd4d7cae4557d208629603ec4a007852762ec1905d0e81b873510fd334dedcd9c288eb8415db505913af06bea94d197ab627d58f6a9944f6c56247595fc54ae3f8604aa37c3466f74561131e11dc",
-               output: "edbfb1090987762f75eba2439d746cdbefe8605b8ebad59e075d28b54edfe48813ccae891f6ed655c5ab5211ba896fff0c8e09bd1554aad987dc53f355d0822e9b0f524a99a79c68a9f3b4e30506cd725b07be135e4540078be88dac64fc545c433837b96a924452f6b844291c4c3fb5f8cc94f06d9f19dad7fc945f093020e82ed19f9eb3ddff68b813629991d1a460e5455e1cb41cf23bb3d96fdb6b96581c3bf9ef72814406329bbbba5b835e7724c728cebe88efcd996dea71d0fd5c53e081c21ce8b3764738d693e390fbf8e0137a716760fc9cd2014cd9bf3fd706bc3464d1f15803606976e96b1077cda0a62921ff7c32",
-       },
-       {
-               length: 250,
-               nonce:  [3]uint32{0x883ac584, 0x8fb8e7d5, 0xdf07de66},
-               key:    [8]uint32{0xc7747e47, 0x853d88c6, 0xbf9aa631, 0x78f16480, 0x7c248080, 0x15ff973b, 0x31528a40, 0x629686e5},
-               input:  "e6b8a9012cdfd2041ab2b65b4e4f1442794fdf1c3685e6622ce70f80b9c2252ba6d9e6384d474a7622053d35df946a3b19408b3e1712da00525070279ce381359b542a9ad7c07750e393e0834593777352c1f7dbc84cc1a2b1eba787377d2cb1d08a7d20e1393d44022107acac5d765be37f9075af02e4bbf8e60ceb262aa34e2b870cc7adcf54329a667249cb4958393bff4f4333338cae45cbca419d59e605aa0cecb1241080339198b9b283e4201afc07360b8ae2a57b0b9b97167c315f03fd7a87a00ae73f91ca560a1505f3cdf04576b9aee5ea775f719916f1e1942ad5311c7f87153f8e62855ace3f34afb08d4d7c7f4fd2bf83e42f76",
-               output: "fc2673c80812d101bca7a2e0e105fa449550e695a016596f5c3cde11fb7dc518b94fdb74058e634546a726c37896110e1d1f9cdeccba1c89958041061ded8e8bc2751ec6dad76a305e70c57f9c81a5a65b5116390af4f7bf7053a03ec13f5d60a58cc5ba61f8c46ef6d2d291de490082dcfdf294aeb3a9414d64e4bd6497d4625acfa591627bfd98f0aec7e7def71515c09942db6911d73b96b4bd2d6df03bb729e945d71549d40e4bc401e1f73baf263a74280537692240638619f92645a5ade1eb8151191c7ff8bd715b3c1cd667e69745b806e16d46d9aa680a7367b8fb45a1598631cf3d44c1f5cfcd95bc8dafdb65a2083905a6937fcf21",
-       },
-       {
-               length: 256,
-               nonce:  [3]uint32{0x79cd7a62, 0xae619be, 0x7d96d236},
-               key:    [8]uint32{0x7dec8e64, 0x9f12b14, 0x6c70df2a, 0xeae0aa0d, 0x27b1ac14, 0x7a00d833, 0xe63c0aca, 0x189438e2},
-               input:  "0cfd93b195e37dd15dfae83132c24ed5bfce7fe6fad4064b213b2c31a39e39ddad2f977e904c9c5b055ed03db46fcdd845bbb6ff0ab5a8c92e89295b6801f36ae63eba61fba24a3858aeb36f2da226b23b24d7b2c7d2670f23a9a1b60db85c0ecee584bef1b00e42d10ca17432a74bbb220d88356d82c850da4c09dd5baf413caf8f9479e02a330065fb865489c0f59605d56146ec8434182345de2d15e2a1dceeeee2fe94871d41913f6788738947ed9849ca0ae985e3e19a97bee82b96feeddceb196c9b6012264661945981c279f43db9599a4ef01116f592478619690daa64387290484d21e8d2444751194e1f361fb37f04014a3c7e4b409e5c828d8990",
-               output: "0502848571d1472ff10bec06c1299fad23a2cb824d88bf91b5447c5139500bd837a2fddc629e4a964e84907c1e6740263f1fef4f5ed41062982c150d9e77a1047b7d86c0e191945e8db00ca3845a39560857fc9e0e4a394eea4ba80a689cb5714c4bab7124ffdbfa8bbb91c3eb3caa1621f49dba1eea3ebf1d547ee337f9085638a12317b86c11aa1525813445107038942fc519eebdc1b98d313ad822bf0b94a054259aa8cf1be4b3a68f974269729941747f9a23fa5d83453071b431dac62274c24f6a32248b0785ff90aad5840fadc89af0aef7553d9352cfb00d3999ffbe28cd9fde7854e95710f4532b8bf5011e518c93361e58d22a2302182e00e8bccd",
-       },
-       {
-               length: 268,
-               nonce:  [3]uint32{0xb7581e00, 0x9a1bba92, 0x64356674},
-               key:    [8]uint32{0xdc2c9fcd, 0x5e50de1a, 0x8546466b, 0xc1b49b21, 0x36a670cd, 0x2887f367, 0x2fbf4300, 0xf90a0374},
-               input:  "0d8d864010ce8df1c0179cf0236dce1c100f9c115eaa5294c24a2e1afa27f9d57ebc18f00482be0218d44262bd4db73002ff53c6388f5e333470aced2a42a73b376686c8d02e05ece27cdd8b1e3f675c715981f8b656d68d0e16227b529cf881d2433e4371fbcd933eaa72346e77e688ac80ee95324512c66a4c16338cf38c941b72c21c3d01e005a07c0eb436014fb1ee61806de7e96842ca3217ab8c7607d609dd2f637f9fda8a85cb0549f262c9e4a955c384319a6ad2b696e2593d7d174f5ddb98e2a8d5d12558c18ab67571e9a0202e91ce26d720cbe41a3a6a4f309296ca4d9d9a59a9043dd2e5a707ed7d5034023d5ea06ab14b39b7852e5c984848d5670c6f2f0b189c2a8a4a4bca",
-               output: "d2a5693c9d503a8821751d085a0837579233e65b691366e4a7464481d22800e786939349f721a815f28b4e47c8889f0814fb95d592d1185e45d6dbcac14ffa4f1d6c79194f2f7eb7323439d9607edf80f01e3a968b483eb93c01d9cb9d3625d21d66927e7aeedc1d9bd589560ed2b61cbed5ad0e0310c8ebe140c64c67d4909c010902d5386efa359ab60a9573493d3e5d8761cfd4023eba23de48372032d4673b5f6ad66cd0dfab02a73aa81f269ae88fcabb3ae9cb09f6bf60fd3575a3046bc6843f444e1e9fb9ff9b991620344fb99da68df09496b40f8b9dfc34e830a87f65710940603ebab554d36e8b4c9228bc9c26c07b828f34cdfdd40b161717236ba325e8c20bd018b324345e09",
-       },
-       {
-               length: 305,
-               nonce:  [3]uint32{0x2c641fcb, 0x5170c7e2, 0x62a23688},
-               key:    [8]uint32{0x5aed5915, 0xc5c4cc18, 0xf0e51574, 0x75d894c6, 0x1b7082d1, 0x5d2ea1db, 0x709fd24, 0xf5f69898},
-               input:  "07c50a69e168e388caf6f91471cf436886a3de58ef2c44795d94fba6538add8d414d84f3ef0ac9377fd5bed6aa6805a695f3a711025550bb6f014893c664e09bd05f4d3b850771991fc02f41c7353cd062156243b67fce9c1f0c21eb73087a5de0db0578923eb49bf87a583351e8441c7b121645bcb64ef5960fdca85af863dca7ebb56662e9707d541513bc91bf9b301431423b552e2c148e66ecfd48045ecb3a940dd65694d7fc8bf511e691b9cfd7547fe7bca6465b72ff9f1748723c4eb14f8bc1efb2fbc6726115c597a3881e0d5019335daf2e5ea8796c2a8b893ca798c4ef2639465505c4bd492bf7e934bb35be9b66c9f35730736c65fa4c1a2485378b9d71912cb924634a8e0db2802b75728818dc00fc28effdf1d8a05e4de4608bb6a78bb19c377d5ec77dca1b5ad38fded7",
-               output: "3dff5fde2ca24bf419e13cb7d12368e70449d41f2aa22e4b567f5cbdbcf3257975e44097deb180f2621ec36acf375dad3b7a19234b9856dc6c7842a7f86be00304b41a8c1662a02e8390346cbd0ff6be7bc1ceb821dbd805ab5c93c9c6ea5093249b5dc52081cbbbe1b326e831ef3c6c42fb791790086d1586f7daf031e70a71b54e9134f942e9ce229fc77980eb80c985ee0c5965eaba375d156f9b423b0615f4ca6fd77de28e28f35aba327e4f1b75725730155b7b4d6c5c264bf3d9dc9a16e7ededcc261add8c666278bac5cf0b3275d6d6678060eae30bbf2ce5f63e6a53a450b65aa0adbd1c90cf045f5ddd9700c2a99c80586c5244cf4c08035b6ff630c82cec3a4fcc83860e987898b42fe746939f8b37c814f8dab65de276e9784fb90f0751d3ba0826889e1e7e4fdbf8a90942",
-       },
-       {
-               length: 430,
-               nonce:  [3]uint32{0x99b172cc, 0x91056d0, 0x48057533},
-               key:    [8]uint32{0xe6cf398e, 0xc3c56066, 0xc5ff194c, 0xf6d2d8c4, 0x6d1d8908, 0x63e62065, 0xcca485cb, 0x1eb03dd6},
-               input:  "3ddcd3c00014747903c95e49f64258615455a0b26c5070a9532382a9bbd18eeb19c9fe1a902f5c6baf544c5938fc256d310a9332223dc3c54a6eb79a4b4091c3b01c798d2800418863f2865c1cd8add760e445588576d4a6c945e1d6d50dc913674daa4737ac94d84eb0ff57cda95df915989c75adc97c4e3c1c837c798a432ba4803a246bb274b032db77e5c1bb554a5342ef2e5d3ff7f102adb5d4e282ad800ccae83f68c4bfd3b6046786a8cfaa2b63c62d64c938189b1039ae1a81ce5c91530772cca0f4a3470ba68e4e0548a221eb4addf91554e603155a4592dc5c338aa0f75a8cc2822b318fbfba4a8f73fa08512132705dae792eed6b809c251d35cca60c476406d964187b63cd59333771e37367671d0ccb393f5b8bde77bebc133485ec5c66bdd631d98cdbee78a3cf435d2f824fa2f9e91e89af28b2e155df4fb04bbe4ce0b6162dcd8e81ee8d5922ebf9c957b26c343a0396d91f6287a4af9e11b7fbb5a5a5c1fcdb186365a20617d4ff5037b0bfa97b6213a6ebcf0b78b81c65737378787b255cba03d715fed4addc2c70c1fb4d3ab16f2bff287186c26a164dae2fe9dbe3c4a2e1617f01cae79f",
-               output: "ecea5fc18dc4aed23359cacb8f79a457512e0a27d9816f353e315519d2b2faf74d14ae8ae5e227b203823998a47a050c363a807f45f610942fed4518b8091b88dff8b2af8fb6552eb654c85d2b6a918bcf56fb898392941d983b1afd867ef840e12313059ed3e4d217498dd511563a939c3c536fbbf8e019deed29262f0a655fc680b15939475e0cee0ce2e8bab5834f7354b93e2e0958a5bc608fab369b6aee3c9d73a6898e402484eac7300150517bbd137bf55762897696a3dc4be74b0c141755ac8f2f6e59f707b1690c451a774c46bbe195d826a6784f8d807b78f8ebc343ecacf37cb9b1b2fdbff6a1237b5098853d783e77515c419894c2628f8b5117042294ee2ed58a33746f9e79b13fdfaa25a75fc95340a89076e786e0ecad7de437a9a3fb3092146d255005b22895310b1252a3e34572cf74665b97f4adc30dd0f34e3216c7757953a4b618a775bbe68f9e0922d75afc80a1379aaf1745f2263afb6f0b37553d9c984f1ef781ea75b1980c559c77565c83f3e0bd7a3cd7cdb594658beb7e5eb940633dbc6ae2f50383beea676cb6c814b17b1d73dd133f544da88ab371415889ead21803c1ffe3f2",
-       },
-       {
-               length: 449,
-               nonce:  [3]uint32{0x2adb4a6d, 0x33d00c1c, 0x10a0193c},
-               key:    [8]uint32{0x8bd707df, 0x70212019, 0xdb685581, 0x9cdbd1a3, 0x7db9ff1a, 0x1af119ee, 0xb1d8c0ff, 0x3c4a22cb},
-               input:  "93ce72a518ae892e00c271a08ead720cc4a32b676016612b5bf2b45d9ae9a27da52e664dbbdf709d9a69ba0506e2c988bb5a587400bca8ae4773bf1f315a8f383826741bfd36afeae5219796f5ce34b229cac71c066988dbcae2cbcfcdbb49efcf335380519669aaf3058e9df7f364bfd66c84703d3faaf8747442bdd35ac98acdc719011d27beba39f62eab8656060df02fab7039223f2a96caac8649bc34da45f6f224f928d69c18b281a9b3065f376858c9fd10f26658ae21f5166a50fe9a0d20739402eec84f5240ee05e61268f34408089e264e7006a59bb63eeaa629ba72603e65718d48e94e244e7b39d21d85848d5f6f417631f3876f51b76b6c264356d7d7b1b27bbac78316c5167b689eff236078cf9e2e4626a4ae8bedeecbcaf6883e2e6e9304969b4fc7a4280dcdc5196267e9bb980e225fcbf7a9b2f7098f7f5c9edd06f50c8791edaf387ff3e85ff7bee1f61e4660fddd4eaf5ab0320508e3ccaa9823ae5a71faa86bd76e16d862d83ed57bf6a13de046a3095a74a10c4da952b3c9b8fbde36048537f76eef631a83d55d3a13096e48f02b96a5a8da74c287a9164ce03ddf2f868e9ca3119ec41f0233792e64086c903eb9247dbae80e923eae",
-               output: "bcf49d62dcd1cff9dc37d7096df0c39031e64ccaeea3830fa485edb71b7fcf2ec709a4b327ef9c7d4ea2b35f113a8485d4c236e06b3baccee30e79c6c08739fe5fbed59db30479b56dfbe584a5d79b169b200430ed27072137e940a34170606b31f22095f2151b4d9b901f6337f991a23e4c8997a1ebf5105361fdade1c889b8dc9565e3b33e0bd608c39d725becbb60da8a797186fe0986736112da3d09906442364d6e253e5b27fd5ad72e877c120ea7a11d42b19948f0df5ddabf9cf661c5ce14b81adc2a95b6b0009ece48922b6a2b6efffdf961be8f8ec1b51ad7cfc5c1bca371f42cdac2389cbddcdc5373b6507cdf3ffc7bfb7e81487a778fcf380b934f7326b131cb568bbaa14c8f427920aa78cc0b323d6ea65260022113e2febfb93dcfce791ab6a18489e9b38de281169f1cd3b35eee0a57ed30533d7411a7e50641a78d2e80db1f872398e4ae49938b8d5aa930c0c0da2182bd176e3df56ab90af3e46cdb862cfc12070bc3bd62d6b0387e4eee66d90c50972427b34acaf2baff9d8a76002a20f43c22ac93686defc68b98b7b707d78d0e7265aabadde32507a67f425cbd16c22a426d56b9892bac3a73dd2d2c03efdb22ecc6483f8d1ca67fc7d5",
-       },
-       {
-               length: 487,
-               nonce:  [3]uint32{0xecf15215, 0x45e31add, 0x56499d31},
-               key:    [8]uint32{0xf5988496, 0x49bcc2df, 0x7b4ba3c3, 0x5d5138be, 0xd6cb466b, 0xe98c82f8, 0x147d3f27, 0xc82389f0},
-               input:  "f72bec13b0f0b6f2317118f14c2a0d8e963b1bd49ae7584e710dbde75bb1e30c79281847cb822a5f3ae4fa56825e511212f17f0d293cfe80f872e6992d304e9283d08ce65ceeacb003b36a862c91282a22536e0b9c19953512a1bf9e20d3e7a8f1a2dff45dec0b9b04c592e88a7814540cf636a024d10008463d0b3aafbc4c9359889149433ef173124866aa6f53526ef3b3f2c630860ecdd08ffd9fc050e95da512cc87f812f9391085cdec5cc87258b8560806a52336d612da7ab05e0f60566b950904aa27c975a48c7d78455728c87f9b53aa4978374ab9592e12c22d9a760e26eb527133534ac5bbf969596b71cde8b4ef3587fa7ffa7116834348c275ad4dce68ab3397521ddc8e54380129cc81b981f9b32db20dddb0ecaa0f1ff7b06495a42b4a800a207b8e9ca38794e2fa9f40546e0e3aef7b5236d7fdadd72b1158714a5ad8d6264df1e75120088e449b9e911eddac59f1f19a795205ab7532783a93159876133b3fe3a518475a545fbe8dd2ac143f33c35d98e3ee13b63606b1e671917ac3ff9412773a3ac47b8c6627b8ba9dde6820f4f16c2ed9cb7d7086cfbb0cf2d7533eff253d14f634ab2aad3fb4289b9a0bb667a6fdd0acd5949185d53f1dd2b96ff060bb44f872a67259100669e6eaf1a7e2b11dd5fc35792db0c44a1127765934a068bf",
-               output: "bb618ae6b7739a4dedde1dbacf864b0892b93dea3007237d2f6f23be0718bdd29321e6b0fcb6a44dacf0f5c53d91e16165997e2302ae7ebc2dbd02c0fd8e8606a4ad13e409a4e807f331cf4174171c5fff23ca232192906b4eefdf2ffb4c65af78be01b0ba7d15b4341dd5a2edd49b17db2812358c8af0a4a9724e0169f50d1d331936bc2400012a60849876c3ead52cc9fe60173c9992f83f3e41ebd24fe3961835109612994c7620280539d483f91ef9a64c16032a35612a119589efe6357fa35b19531274576e304be75bc7e91d58015792095bb00ce4de251a52b946554366ea7ed9ce9317020ec155ae0071e022af36ad10eda5d671e5090c136e381cecdb8bc179474fabc7dab2d8a134772976cf0791b6cebe2333d34b4b8e2b6b2eab2b5dc7c6a08a583d091df64328cbcde36bc1b81095d82c741a1503c55d833d551a855e098166c5efffb8e4146e32e54abcaa85076ca6660abdfca9e82824217b5d3f23f7ff3455872bc76751480c1a8e3e725365c82fc135cd3713cc0f1ea733754142f8c37716a2a4fa8a6b898215c287565325774c2510df6b49e78cb986853ac5ca532c9a7e2bceb7c0157f60433f29fe29009343d6035d7b5892c77f821b644590615dc505604501dd218dcab789e6f0525387919cf25c7c6d62a8979e39d346decbed2657",
-       },
-       {
-               length: 511,
-               nonce:  [3]uint32{0xba68c47, 0xbc020097, 0xbf7d14a7},
-               key:    [8]uint32{0x3bbeedde, 0x6e8f4d6c, 0x6e27cd72, 0x140ff360, 0xc891efa0, 0x4aaa227f, 0x733cfef2, 0x2b51f1f3},
-               input:  "96eb94e1adbcc0646440c8824a2fc0f2c4b17d9cbddbb8ba8d9dbd6482fbf7201c74eb923153e0138b2f6f182f9c3d5656ee40bb7c26a01740b5c7d125261d4e4197614800aa152b402ba581bfbf4288e73c9ef7e7e37491212b921420eaaff880eeb458e3d0aa108b01b53492c97e328e9d10e3220b924351d583c00e76aee9325d6b89b1f162ffa30b386b37b5eaf4dfc25d22987dde4496158818c4d8f19ea300fe140be921d3f1abdaf9ab8946833a57cda5f41f995ff80e98b0f10f7afd736dd33438dfd395547f11563056078ff8f7c202aac262955f0ca5dae2365472de40f069028104ac552ea5a45ff2773335e5d3242f1e62e0e98003333dc51a3c8abbaf368f284536672e55d005b24b7aeba8e4cef23289adc12db2213aa037c797e7e753ae985568199cfe14cf1704fbca443e6036bdd05859e3583897cbefe7a0cf268b75d554b2da6e503ee04b126fbf74eaac0ebca37e84ab9c726973af780fe2bc9869fe67b7d9e4a04062ee535b2c1740d1347224e211b5cd37ee14c3325f40abee930eb6a1634986e756b3a1f86a3d7ee7184d95ea948506d8ab8b23f92ecf3eb0586f7a8b1bc227e08a0e32ca75ca4eeffc5c0a2a623547788bca66f3dc2c48671e462544d52a87d34307a7f111aeacb7da50262deab33d9f29dd6b47c3bb555be598d619cc66be8c4b74b01772725268a43d467f39bc565e5efcd0",
-               output: "590965d18ebdf1a89689662cfae1b8c8a73db8b26941313006b9b9bd6afa6a57149d09a27390b8883069e4fc2dfcf75035def1f8b865e24c21b1a1ed3e9f220d7b48046577b661bc92d9888a912984ad415ea2fc92c9e37da0bef5c7dab11495c612c27b5babe6eee28fd26482272fce69ca7f11bac95251735ad808365ac587830ec04105304f8e440a4da47d30e788718da4282941c9c76f18de4f954b8be750b54cb1145489edf273625a0df9a694a23fe7bfea12579b53c3b2a3de85705568cd7e603f3b8beba9a14cad9979ea283a8a291d3e1105b7f890e2a569804d9b7dd4c7e50bd0dcd11223fd7247af77f04212ece1b98c238d2fa0386a994bc502f83dcdd2e5a0d45b185155e1a395d91726d383c2c198fff1590e983c65ee041638510787c8c59c2e96f31678226a033e027bb40c416b73c3dbef31affc93a659c8ec7ffeca313fd5283a80533b2d63941c8f245d22b160c5fe57c5fa4b759c407b9acd6d9c4f80f244360b9acd11e2b43d4af757e16a6ef9d6756df39ca3a8a235e74351f50b2ebf54df633c8c400fd80b41b07117676d486377095660f2f20f62c034563b4560b473a8f4d6a740306d2a822fd8bd98012a840ba9b1709df9a0d61ecc305f7180fd764e334045d9a8ca23cb8036c05616a8b21fc488429ba4168c59dfa231f0ffa668a3be7b16583df1a55bb9c15d51660ddeca730d66f7a9",
-       },
-       {
-               length: 607,
-               nonce:  [3]uint32{0x9419df54, 0x4593f2a, 0x71c06dd6},
-               key:    [8]uint32{0x7b517740, 0x41e86353, 0xed629408, 0x5fe32cea, 0xb06bc5df, 0xaec9b350, 0xc00c2a6f, 0xb3aaf44f},
-               input:  "be3f309c6e7b89e1ec4a855cf161156d09f8a04d5630534ee19e9e071e3f4603f23f0c59a7b7f8a32c4c203ec8c129a268faba09abde7b61135c6c37fd091e2d695f0e242488098ebed30c7d321f4dcef0bdd23fa85a53569868cf2008bf4d2ee7a12a6673298c7e797321b9f4559748223b590e6fcf17aa72251586b01181cefcd32c6a1a20a0fc27143426f6572b1aab0e7301e390cb857f912d78d5153906c698ee140b36cdc72693cc019cb7add747ca3a07b2b82a2332bfa76c962b186ad94209fcf590ed0f6a73b08a771a58eb9649f2f1da4f7c385da83d50c939231f745514d14b0920deedd9c4dc6d2e547f83643d13541870875e52c610372b14b602e7a47f0b3721cfca60ec68e2eee91f40ceba2d0fdb4ebe19cb1d1ab170726c9e600030454ef355f9a40033672be520e528937f38e7a862a5ae50cd94f667cd015a72ee3f91b1a09031bf4c207e0c516b2e7a4baedf373f1ee71843e560741ed3a3094d2b513e2248caf27ce135716f6887d9f1fe5b11e02c12c989d29054ab183a3f55d9b40d78e12ff56edf936ab966c7c3130bea472b71fd69e70165a76afbf720e2c1587a77943b35acfd81b2ab6f39476623edf3663024fb84da8057ed3a361e9533caf9fc58a5e4897e4bf84f58ed063b5c353bdca3792952eec0a1404149ebeb5b17cd6350ab3e27e44e40fbcb00780d001a48d0365d534ff830553409919608881e665f83bb5cf0736d728c41cc4e985c377f89ee1186303d0d76bc634875ab3ebd87059969f24b0464ae11967bcc47f300a34e3b917b1affceea716c5ad9abf1aa3a1106e2f4d006514dc62cfd2a52426968f2f3991c9f9d8fcd",
-               output: "e4032c01bcece73fde73961ed216820dcb44ce20134678c98afb674bb03afec2f4aacbade7f87a32fff57ae9213eaf0509e9d9db1313b06fd1df53561f85896ba627cccd2d0e2ae4f24f5579bf02f6599f5e63412ba084cf53a5bc9a8061b5c029b755329fcd73f629fadd3bcf6cb4c572fea86466cb5159d19eaaf0f44c3471d0323bc7206bb514ed8117a61c6d98d44faff6a83716657531d965ba3efbcf067c452e0d2807db3423958d9a4421886fe132d7c47e82086db9507616b67f0051dffc1a49ecce3ca8e4d5f5af15684cd8837a471430ddd333ea0b6ee603b7d9e702692f857fab060ccf26f2a8e61dfd3b12923acca78b83a6004e4ff09113becf6bdd0bec3a449a195559dfeafd4e2a79ead5ae3c993a15ad9b1a2ce818e18edb010b7fece9aa437d85ba9841d89026d6aac1a3a6ab6dad932a26d7db6f3664b06d51584cf4d22a75c06e2840db7292798306e4d39379af85a6bc8dcaebb5246e07fadd5e336f122de0ecb99ca24a971701a1f43bd69933beef6e52d299b132e7510caf27b99739e32bd272afc36755ea80cc7ed3957d91325584b338d15b19fe554ee70bee903babe21d0cbecd49235c70a3a4f516ce16761d1cfcd70bb4b9c7c73c359f3fdd0753d6c1ac1a1463142f18266b6a9c84675f247d56563646fb2c8c3b6b81944c2ba2b76b685ba5ea40cf539bcf3850a8af3e0a69c0b38164de520a3bea82b91f67d36bbd87877b5be7f06c2d26b2dc747a26a51f51fe293197db0e91e6ac617c71ddc6edfeb7db8f067ac2012268deb7e5f00a640c1bbec5c4c71f10f921071308cadededad5c90e72d744d0bf790b043fd35729570889ebe5",
-       },
-       {
-               length: 682,
-               nonce:  [3]uint32{0x17cebe90, 0xeffe259b, 0xbdf9d4ca},
-               key:    [8]uint32{0x172d51e8, 0x5b80f5c6, 0xb9c9e438, 0xa56119c0, 0x62212323, 0xf5386589, 0xde7079a3, 0x669e643},
-               input:  "0aa4fbce7e1774f0607e7ea01fc0e6d210bb283964ae75e180a9f6ff3d2c4d50914bfc32bca6d243eb33551521d54d66f377fdc1d31974ece79b157905ff7e7a9b064f349727ce37c83c15ae13df635c3e6b4baf994d9aa0bb90b06c6cda51deefda72c97a2993448e654b746b216d2b949bff1af5238558205cfc3162f1d7a020a919db4d4eb44bcf7b269d4df57e24133d1e540694b9148444cee16e64035ef006a6079dff449949c1b342991f2a27f21c8bd74ccf4bc944284a46e9fd9f9bfd4b95f80c05553950fabbf5e5aed6babb8427832266aa4d175114de9127ff6ee848534d6dd5aa6d2dc361319863cdf32cfb1b074faed17d368964393352df01fe8d86af0e994bc9dac315f7d9efa7bef47a16676cdf17a535ae71d399c4c11a3a3ba0491e8d41f419685258a4ec7d1ae588b3ca341719c0827ce5f5a653959a8671844f2d0293c09bc7d35497ed18c160fc7b6d073a311b621a7a37f7ded1df3d73dcba1821278c9e17a191997fa4dab0802e1ee1b468e91e4272c4569a17dc0b2805b980bde798640aa328a3605abea1865083d7446e960c27f69d32882a2a2295efc9c440dc203872373411925f8839715e9441d31dd9cc14bab09a3e03b4a63e14db3039d58725796326ea6327f189beecd63955f1409467c81f4691ecfe9f0ac5234f23dfb84e3199e415ee7b4f67189e8857ff6cb3f64c2ac1b554bfbd679a6ea8491cfd69d96d08ee2744d9103e0b044212560ff707974b1a9043e1f2c3592828fde8ab5e993652c00e2b3fdb19082611b67866ece6c4a2635f87e04d2136d679f632416b03ece4d7e9406f3437163f4fe0c8cc7b87d487f6de3b3022665bcafa847c2b9199e1ba9af7deb0e29b66ad41688d03a8369416dfbee6d03526adb3ebc4b4f8531d73589499a3010b5309e9d9d2f5a9cf347983a92722dbf6c4f0bae8aba57b37d322",
-               output: "a31f9a532f35f20ba604a9ab9989260e5a4ed04e6ecfa1cb9e0e1d16943906acbbb4e761a2bebc86cad0ce8b3f26d98b455e4b0835eb8b43791cea29fe8fa6e5187b60198142059bbce98917aa2957ae2555bee70e6e9e21ff6197a51ac2ca2952c413efec4d9903a2f6883e88aebe7ca8316831f6a8f2cd0e486319b58dc8db862779adff98b7f35c33faa53d56acd7a81e0feffc286b728f3a11afab7cace4c30b1a45780276b1f0ab89242410d07cb1191c7b9da5d09db7c9a729d91ac3ed82f4350f2871a12d125ba672861d1b0af7219c360a0e023a8b7c23fb9d72631c72e032c097118d90e5db0576586d8224165a8376fe8d04de93516848e7c2653cb4f7d24a971ccf4f16c527ea5b4153fad5fd5bf473b15806671854507bf1a6d9e5fe4a6f6ec977197d21d69a041dd955e199031f895adefd850c8b0ae327ba0c18ca1783560e1ff0feb2f659137e34a91e9e9ff04fe3375b7db6e4326986e6265e5fef00297f6ae627c7563846e531762748fe8d0b6baff17acf1e6c5cfefa35a95ef634ff96f83f16342a6c62311fc653d314f8a6de109356ab7801316e69a48834cb6325816b1f66d5c67d6e9c9cbc8e1a0521fd6e4bf77a7d2609f99c9579e143f530677b99d198a97620d087f058edf35eb7271701ecebb8bfde5671641ed21aeee9e7db06b932e0def91be93cf2955159e9666c770cdffa03886eb6e98dfca8f91ff5cef1927c0f82b9226d65c68d011416cbef802c264e34244ead7a6ebbe28a510a37e1276f4f3cf27a3944a08aaa23bd321092761627dae20dc269b6150545c75e995cfee0a9bcedb1ad8b364beb8839fd5c9f7984fa0a08a1a354aebe18f62acf6d6664978fcfda2ce6fc16eaa2cda5b835339001b3b98d3a407a3e18e0ec2da6ee3d1448c1ece2ed67c3f51f01e76ed59f0e61102b103a3c65aea94275e8d1f0d331538efe",
-       },
-       {
-               length: 768,
-               nonce:  [3]uint32{0xb1c9bd09, 0xdbe6497d, 0x16c73b95},
-               key:    [8]uint32{0xbf9d9e5, 0x2eede668, 0x631dca95, 0x4233e36d, 0xd83fe644, 0x99b11f89, 0xef055717, 0x1ae9695f},
-               input:  "e097b1e8dea40f63714e63ab3ad9bdd518ac3e188926d1086a9850a5580affb592f6e421abc617c103479ba39a3924eea1c0bbbb051614c4b5003bbd5fcbb8093864fc1c130748194d6b560e203b889b98b574a98ec3e0e07cb2d9f271ba7794e5419123b4f2ebc7e0d65cd404104868905ff2c38d30c967fe9d77ebdd4b8fa836c3b0ad15e3e70e9a28236d5593e761e694b047f63bc62c7b0d493c3e2528c8af78f56725172ac9416ec2bdc54de92b92a63f9ccb61e686f9249c7cc337d99b2160400bb5535eb8f8eb1e3cafcbceaa821c1088edbacb3b01b5bed977e702de747ad00268ffe72e3d877dd75816db65b5459607cd1b963fe43bf2405ec223ddc0de514d59cde74f7522dc72285caa3eeb7eae527a7723b33d21ce91c91c8d26bf36eeb1dcdfc1e9e475c1565ed9c7e64ef601874a4f277280a5ceec26717e9385aee8b159379e3feed7952b87240c942970d63351259aa7a286ddb4a2620fa67565c92f592902e49422f1eecea2f44d1c0bbbf54a9e5612b86a9549aa3e6639a924c7bbe2d3c1b5669da73c0e2c6f6f6084f54a912ad2635d0141c2f5ac925414dce0da09ab8f86eae2a7b7e48741253189e5fd554d5c04d9807ac6ffd8a4f8229a3e8ab75ca5c778bd7ec5a5c02085faba9792cbc47f9e9311f3444e6544359769e1b3eb4d42ac8923ec94536e1a44497766b5da523f5763749dbc2738dfa8e13c191dfeac56c7614a96bd3ae23e4e6e5ac00be851ac9831108989b491eaade62113c531385ef3e964ce817c8ed0857adca946467682c2f4387fab2f31ce71b58370853171720268459588d5d216faca58d0bebbd7cd83a78445d9b49e83ec2cdb59b5d760880bf60532178d60372752b47d52562b316c7de5c74af9cd588643002d66bc6260595a540d2f82cf2c07fa64e0cdd1f79877b6a25b0608c735a7d35ca10852da441fcfb31061fd7e482a0989866f9eea8b0b39c3d519715c1c2766c3ad99f041143cdb36557ed647403458155dccbb80c3a365f0a85b1135695648ab67ac76b3d219c7b77e49d735c72ac947b1d7eeb279beb9d2602aba7b36ca",
-               output: "7b6e07e6415660affba56047b988f4548b308e7a642c76791f5c3742cc4cb744cde48fc30e50d458084e06c6dd29a52cb4c306a69a493a17c0838d14b107d07b81c983a2dbad09b80f087ba48465a8beaae5b16e8093e17cfb9e84ea3bdb9af00889268a5c01ddf25af434de56f65882322432aa275fac8519e317ef4d89478f29182143f97350983050f5d37c4b518611da6fa2aed7bb73e614231a194fe17c9073e377fc6ea0aa491e15ca54808e0536c8c3f1bf657283f807ebfc89b55049ac8fb86f89f17974fcf0afc1a2c690c0442842d0f4af9ee29dd960e499d1077bfdad4c0c9189a6e83799bb585acdb853c1e99da7ce9c7eeb9bf431f8d364d0ea80b0a95a7807f196c6ee69fe90e6d1f5d23e5cb256e37e65826d7a111f2272884d6319f968580b3164b2697ea6556816cea3ca316651fe2fd68dfa905d080c28622606f7d24da216289fa2c54c6f42dc244ecb047512ace62f0801f2dfad8f0218f45e2b3bbac97c2176c842398b16dfa1fdfc9a68b7b5a1e785d2a0cc592bc491f5a69c81127b758ee02c66b81674d3135c5882d1dc89dadcffa06f4b0644df5c7fd65c72611d79be7ad637edd6fc38b39946aa2a2c6d08ca9d3ff9a8ffe2e7989546489539b1a623fa937c468e59e0978602526b4367de277526895aa222fbaeae2084f418c5745d8ee844da0baa47f592970c14cf710f49539c12104a62baddb3382f5773dd18c83ecb238ae2e749a51584a38e394ebadd175bf5c3cec787907abb1d94af70ae63d3b7d8d5ff254da90b78ec8fe2ea95dfbc6e3e69ecad856c9e54906df8fe39859f2014b74dc3ca0ee2a957001939d37a6c0b489bd3f1658b835a57b24aa282c23e875c9e67e6eb8b32fe44e7d7d8e285d85da0ce1b53990f9fdb5e2e74728e433ed2c1044df9e89cb9bb316c39fc6fc8bcc74a382093926a288170e857d6b7f47858a4c2d05c74263dc9e8199332d0179687f4a4cdfc80ee6737300cefba75905b22d21e897f887b67aa3051877fff11d98bf96ca5091bb225bddd5eae697f3dfb0efcdb788ebf6694b5b39dbb0d4bf9427382a3a58f0b",
-       },
-       {
-               length: 828,
-               nonce:  [3]uint32{0xc7e503e, 0xf8110ddf, 0x83316c8c},
-               key:    [8]uint32{0xfa2d1cd, 0x4fe7f905, 0x2b9e4c1b, 0x115bc881, 0x2922bcc5, 0x3f60aa25, 0x13c26d31, 0x2096af63},
-               input:  "0a1064714f20d9e47fe53250ecfec759f4137e60afaf65755f4709a483504c3855833b6dcaf7aa0180fd735fa9a73d46697f6c45004adf12452ea4c04a720fd7c20b9783b74b8b3ea0c8b1563d5a85f44af8afd7d91ca6298ca22642a684f66e365edd6f6bdb2dd32dfa13c62dc497fb341b86f65d40655931171416e23e3b2623c0b4a67d448877b6e3d4e0fe284034a10162b2b5e21639047036874f4bcde22b145b5f18aa8ff32dec81e6a5ac68b3c30c24bd8fd3b8e098a1cf202e2ab2a3bb66a9393222b9f7384653cda7707f00bc3c81e9591fd040a07d3629410c2db78781a4c9db3df5f9d648162f1b087974f56a89db07aa21ba827e3864a1618945b2fba06853a13c35da2909f5013feb313bae09870b8eab904024adab0d6ac46c1a1499791b47413139dee59db676949b9e9ab8d3d6abaa954ec2a9fc83953c91b483c3b6bd6700b96484850734e72e3710a1b379c0d0698aeaf68f13a0d317bfd689471e3299288e7a383a58522f0daaff210cc4917fa05f0b8ceefc2afc46148a05a100d30787accfb4da094e61ea6b58f132692aedcabae928e53c2594b01507b8fc2d0a85a1d111d1f4de0b95258281ae01873a72606753b6f878ecd8c4f613fb3477710d260f0bca0d4c06f675ab7113eded395f88755a98a0ad22b4a002cfe9447c4e39eda13738f4eccb9c13367ebc2878257c4647d31b67e5e32b6a77f23e9593658d19c0a40e8a7228767afba1cf23072b013b2d76ee66e42b57bec2797ce3619c695a661004c8129cb5c5d6a2836be22483f3b7e40bf8ac5535bf6cd065c4821a87829948c88163cfe3c0f60cea4e7ff59df4cdbf80064b2d664b39487413039999b5e86f1d467b12682d0cd355e9f7cd980e87d584ddbda89f68632d3b8fd6bc3b80205d7feb97a46842b093f74aa14bb21accda7474247b5e39ac76ef75e9b5b52b6a829a7e2297ab88fb0eb690d54ab1af2d7437149a6202035ce15f1e6c6267458d62677c263d83d3f8119af191b7d766582620e0f08b411c996c25ba6a32c2d73f592e789ed662e94103329bfa5e6573f1116ec04438997f3e4ad91b4123b570743455020d914bde2d8417fb24671e6db261732fb89dda1a36614b095529e4f97374c9bc0e55aa577bfffa663c816ca9fae3472e0a",
-               output: "b00a7caf5359c5bcebe590e6bab9aa03370050c55cbd45a257f4869937e922a15f2d38121b1493d6b5dd4a8a47d7b4e5cb049d396ad84ed421df774b0408b6939f18ebf5cf83f48c540affcc2a885967bf4bd222c42904b8a73c4185bde3f97e874fad25b46714235e60c9ff53ed2975c9c85ebad0752249e4b627ffa41555eb9074f63a5f7d61d207d2ce11b2a9fa23a13a0832eccb91efa2afd8d9acfee94ac78a733fa156bfea5006da1d0127c32aadbb75c015b68c627903e1c85bf3a1a9f99c6cfbdbb5c871f7f9661b78cf5e16d819f53e9930e201d4f58e69bcdce77ec5b9b1d2cf206a71f744342273c26b9abc71303c20df3d51f52222893d803fc8e0e0afcd99ee1c7f95b48680403566f7f9e296d7ccc0ec348b6ad515af58d11fd82c628ea29ee6a5d67aaeabd8823addc01a078b04313af73105d4ce4abef8e6ee8ce649640a19678292d4f1017d121549fd2c19ba6cdc0b613e512bc9551d759c6d38aea7e35c0847a142e273a16bb1495e652f9668b97801ba3f6d9931c0a1efaa4452e15732dca1ca9cb45ed289e0fd08d1cee1cdcc9dfba8d0b2562b0b1a180f4ee69d63573222c8d4789bf0d63d2a201a70c7b27c84e620e33e8a863cf49b784269a51ead3d4ad26f044d5859988d5485a11533ea805f5a8f6313caa6b421071a34f57170fdd8e4663e9a4cdcdcc1ddaa9f6e651fb365cf827667b018ae7d028c7f96295b2b4f9eeb4b361b48af86463a79f50b107ab0935e3cec3f4f203cea801ff95fb870d2c2f0e315dc8a6a547dd3c390a1f5403917315164bd2d40362489b389a54e8dc0ddb83e6a43a26c65923e6f76ee0ee0e3a33b0a9066620a01f0319e20b9f1beb3910ad962a3000e6aacb0ae57f3f6c5e0315be5de93edcf0e45e0e47332f9daf7f33e6e8bf1929910b78b8f88ca12bf5519a3217b7554c8c8350cc314561d580bf67a3878e3979430d070121a5e070a3458742e8549bda972f603222e2b30eb8a49a955805307e6e02f8c60a08188f69340e116422458d4a8841f46a78c833b1a822e3f6c9c97422c918f17c36175ca4b3d1c081ee4b175b4b07bf101c3836eb5b9e3cbd08a89b4a1c50edcb41ea8ea6ceb1532f5b842715d50dc21e2499e08c373d3dedb96bb477c8802ab7aa957e0b5810f38",
-       },
-       {
-               length: 859,
-               nonce:  [3]uint32{0xeb02dac9, 0xa7cba06c, 0xc24764c},
-               key:    [8]uint32{0xe9414a57, 0xd5e29546, 0x1a5e2f4c, 0x806e4c46, 0x48098d1f, 0x4351ca1a, 0x53ed97c, 0xa6a495ca},
-               input:  "00fa3b13b5cfa9b5d65a41cc2d3c420518802c22c4582873f1ad52a22032d2cef7c975078b199787e852fb1f914529f60d1cc854e5d6d547216dce043e0fc94866bb2193343c3a07fde60e668266d1cee3067c6f2ce0f9f63456ad08094b6c7f515f7ca90caa96494e2a6835ba1f3f166012ad1ff6af6b5f8455d5c26e72402966af9066ca70ad027eed23b0eb02c751195064a62283975efeb29bc5993f83360d012a2f5275ac758a9e8fe458fc7cc0673e6b9e338678f0faff60a67fff3784c3054dcbd95d1b00ed4c6156b3831cc42a2ccdeee55541f228b88e6c318e2d797c6fc035ae12868c4a4e3843b5b25a530b1477dec3f5ac27644476b5766e0ee132d833f9a63200eb0980bf72c3666150e567e01e3e1f469cf36beea65946fce714a3f354983e54ca4315b57ea35c5f48bd5eada05f49db1004cbb39888ebab3afad62f6509abad77ca8c4ff28731c7ae545e6876c8f4a80b6cc26928ee05001a9764694b52edd605e182d5a3a5fd192bff58aba90f57e4debe612d02cf6f08af33a78ebf8823bb3eb46d4da25b7dfa15ad436c380633d3db3d0dc4dfec6c2324d105e7090e65342b554854e777b40b5dab8125a58e8b212364ff88459a8466ff5ae661034abc8286a78ad5aa582e2dabbcd7a0b0cedcb9fd5f0bb8c3bef9117f2ca6520a72b94e528c1a4a464398e654995d5f4c77cbabf2b204b96a058cf1b38284b34e41ac37b05a003ed51be9602050f21c6b9326714bc425c1e22833da95a6e77571691d4dcab4ef9056c4c7f85d5b445b902eb375b5164c6bdf629ccfd4127a6c024bb6c4da0b6b08350432e58f8229e04e2e76f704be17d36e0c04fcc7a98f721d4572aa7f66ae8e9664300a189bc3862da47b60c8b33424f6d577cc10f4755f36c2a6decc30ba81bf48f96616ccfcfb74965d6bdcab82728bb224c560d1cfd7a175413ad1c14c734746be3b062b4e7514e9075c688103515e32e3335dbd272a315024d56f4ecd354264da9bc712080657b2b51b06dc7c4c441d9858935a4c3e6b207bde38ea83bba4c6854b2bcf914d758e0a174c0528e0e385c7cff355c38db1c22440369141e91266824c59f1ed23e7d4b99d31b0baa7bed4526e24259dbef5c9ae275e97267b756645f804c274d65ac7ab0f7683435bc2e4f24075cd1b790aa2b53fbf044e8f2092bdf0dbe88a582ff8f8de291e8220",
-               output: "bea32587095caac661c3ac49e65654b282192b2addf5b9a403aea6c8bd0096291a0a66ca4062acf1da91fb5749952096ec63ab652ecf94c29807f0aaac939b6896edcd6f0cd8dd8d208b906ef4d7a8766831fecd6ce98f4ea0c34fa9a5114dbeb23c2cd6d3aa962e39b18cb343c24e65d49fad0a0fb50736f8d2b24b011108932484399f4c4510ac9a5e6bc78ff0b450e67f87b49f253b99d95d6294e15a9934fc8b89a5913c08f75d3516766fb0f60f82e2b2647b4619991c78adbcf548c07c0dda30c629349d84f298313c3e629e03760b1cf860264205a950d6fd86732a6513827f72c0dff5aff96f7203464f60849c1065beb70f282cca1334f6f6c767dfff94f063361f592e85597de5d313eaed17bd533db24818d9ba9aea2afa797721fbd19eea7b8d46bbc4b9dc0164636d2e754f5e9e8c04e2a381096331731c645ea1f613a37bfa9a6fb2c6307e9bacacbeab7f5672163ff9742a8115049bce0269d7d5f6f35787be031dbee1535b0516ec0b46d12f5833cde5f2cc569edcdd20993e9776aacf48ace7bfadf79065f2803fba6b2b27aa622abb7ae023ff2b27b727f509f313f92026392485a5ed4fd53b2e22b2d2dc1538ce158d34921214638be30ae054a0f5f1d4f9c590a2d215ac2a5b23ed33871ab26c8bb6db7fe9d6f51e527c9547248a4e9734c64658b22893f4f6867a35f18e2bbfd7d62142025955cb51af8e40b6fcb91c7e959cea2c92022c87c29dae107a306f41b00e73c7bceef8cb070e8f9e830caeee463170e919cba6eee63092a5a7ee33b74db09cdd022fdafbcd5d524253a29a103ba6f4d668d31d18f867557871c0e0258221c3050d57c18bdae4cc4ff8da0daddb5c08619be127ee76a317b59a9d8e67808603a1bfce6b4e0d070082b283bf9c0e6ef8256208e482f3e2d1a40d30807f60a868e2279dfbc3586d44ee25fdca3505cd39fd469c2cd03bc2f921d22a8346750f346c919e7247301c1c8a4a3ddb8eabc6e80d85cd2459afe1cbb4851ea2c86b8075e0fef3177cb074894410ecf681242fac62b5fa4ed3a10ddaa595427851d376cf69e350207b667f7aa26d003f1ec739a8792532ebd93f3cafb1fea40d227bcadda2fb6da794cea3371240f257f80b1b8a857ea453b46938397c1f4b303a46257750003a60666a11d03bf2afb5c71e059933d617288891733b63784bd9c662234f",
-       },
-       {
-               length: 985,
-               nonce:  [3]uint32{0x3c2b47a4, 0xf614c813, 0xa26f7014},
-               key:    [8]uint32{0x39bd3d18, 0xc9aacd67, 0xcb5485b5, 0x20536a22, 0xbb22ac87, 0x1c9da580, 0x7d996b2e, 0x456fe461},
-               input:  "01847d8a97d56e55e12f89adb13c8c0f9dea5555e8dc61171fbb8e181f6cf846a4dd68b2c75335c0896fa215bf7f9eb7e398e4520aaaf33461ecfb61051f43d43569fb75fabd79d319bf39469f951e4da7932a74624c46d8d26a9499c701c00d3dea57a6f65b4c0f33b568d13989340294d17cd005b26d89cf6fa1c88e7b6ef4d074291fa8c117ae05d7c785459ef4561c45af63a811e9aa1c31b69a5bdac2356d955a0f579791247a757a691b3de447a53619878397cd82a74053f06da3574045bc856500ec01fd2afbc64d8dd283ac876a50e9396f78c424ab157f481316fd9c90cd899f5aca46dad32c68f1d64ea7f1c4bdb994ad847072609bd89adc2fa8382a5d573b680533640b8321b6adf27926274660b2cbaf04fbc9a4fb17ce8957c38c7bab1aafd5bf7263171e47d2e1ae5cf0494815642209d303dba561754479c24ea01a573c9083b68acc49907b1748924d3c6a82feb9417ca932578c123f9db35521c0d992565f7396f0c23e436289c1720e4e7c6e285c04a8159f93e06801334e523b18fe188355cc6a155febe64ba053e6b5d1cc87787fd5ae68fa86d8c51868b9f6a9664cf0d56aa6cb8463362bb671e6b8423bcbefe2a1a0acba3f135496736b5cec5e329494af46aba322bf5d1cc108c98298459558773a316e09b0bb960a26f4b0bfbaa493b5f98a0e522b6203c471b10e662abe9b9e60de2a1517843933add02017fadd62608383ad53796159f3d21b2c8ed7295802ca79ea65d550114ca2bcc7f7c3b4c6709fffc3c2de00da06e83d8f0cf04b8c8edd21c0fc11a0b2aa7f6adad255fef25e5c0a9d59546e97446e1fbf6a51a8ea6cad54cabfdd19cd10d7d33ff0549b710557e3931821dd8809ab0a9d3aaa761a01ae0f2e378906672924d6a1b12fb1cca7bed41f31974b9917a05de60c32796f502e7035a2c01cb49bc8e1734b9fa138b81b4dfe19d37f5942dd1b42f03e1e5a6a046ecd457174150e17dd148e4bfea44b72da35ef42a7251244700e59e702033677d42611168fd246e1b18b9a464b6c20fc7fcf6360cd00466ece059a69d7d54a4f5565d08799f85dd3c849a08ba43415077c1c0e5dbdba52bb3167ee99a11db551f0260493be1dde58d2072e8c02251f4f574b6e115cbb6136dc2c3fbce75fdcefe812d9c07a91a89088985a52cb1fb9f6cef80fa30364706414175e42c75e8e37f6e7cd028c99f59caa88c49db5b46e8d6301bc39034013718a9eeef5506415016fb21d70e46a03b4c5ba72f91dd9321ff5e210e5e5f7b0723a3bc4bb02b5a74c1f4a63aa5a993a31f79a768fe8033c9abfeb4deb536af1054be02d8d1c4a6a0fa75f3eb787d57a03b7ae994fb1b54b2c43b230ce32e6245d944b3cea4fa6",
-               output: "785dbea5d1e50af4743ed5fd2209e441fc7c50bc7f6fd9cc7f24654c619e2606178dcbbd81a1f94c1b3176837024098bd31326145be326b32fd9277a55a6fb38780c8dc8b471a3184379d90da4aa87d80b889b1f4d8d0755c1704a526b99ac829b8ad157ca54b2b05ff8b2917e27b0c147ab54add9a89fdcad7b93ba1fe2d5be9de88b68a5324f1b42943e45ee31c4ef783ec9e2337b3f2834b10cf452b313fafdf0c03719140f64060da0a565e185cb8e544e1c185ca230ff2321739a285abe8be4be0ce76678a7b0902a77a645194de49fef8ff64cc464ea25e1f1d72c775e450f08ddd7680d27a4142879787b198583d93b84cd87fd5b4063d92d13d9c9cb580c01fac0174686a18f64e6fa0b3589624cfae04aad74950559bdf92b2b199c60cb04013aa0ef56d1f9ec5b7e968f6a83756ecc9cee7dd8b433f64649f948df5474a64549e71e46fd8bb16568d21f5fb67f5ed555f2b8aec4709383e8cbc45b9fe47c0434178ad4c6d0d42606d6eef0e21d0370898d1d5d646830a88d5f024094fe9c7a2003ca13d20ab7cd748dc11a22f578ddab416f3500eff3d89fc177b46436108e2e2c7973910cb8454a01c9e9b98f966848325444b2ac205b1ed6919fa76aaf63717574761b7f62b10649357df49f85a845a30b6acd57fa202fe58673930ec59399f537e9682b1f5f6f409988789a8e0c1f803478dded14b40d3b6eb3109758efeb6a7fe21f41c4dcc8027258da27ad74010839dbfdf8fe55050511f85c321e653f76e55f22248f46da529a380c6b1a16a19ce73af9715545c2cae098dc42dd61248dbcf7b295f4dc6b8930b41baeef677156c534869be65e723e1aa0336e8be8a3b138f840c9cd63bab6d9d61f239a47d8cf56258544e6ef65edca27069f7a57f087a7cc021fa1294b75c0c0f1093c025e426e4f041ed5187f358402676d5da5fb6ceba76a178f65c8c3046f258531c165b8808bdd221c59ff56e3e06247576e144aac01ea96a07f1be15d7a2b0b3b6c259a9133f8a50b56154ecf9f61022f470027247e6e70e6eaf7ece5e324ec8f95667ffed10337652b119e7cb8d197e306e81ea251340b9fb2c33aa230c0a16e1ca783f9344b3acbf413acd96616e6d477dba90e39326089934bc5ca6620855cdc442e25bf8b8debf335e16e7e25cceb68659cc81b13a507fbd9f30b347126beeb57016bd348fe3df592d4778011664a218227e70d7360d139480500b7f6f84153e61ca4dea105875e19ce3d11a3dfd0ad0074035ff6a9fac0ece91afd8be74c168da20c8baafcc14632eb0e774db758a3d90709cddf0266c27963788c35a842beea8ba2d916234431efde4bb32fd7e1cef51dcf580f4697206bbc3f991f4046360aea6e88ec",
-       },
-}
diff --git a/libgo/go/internal/x/crypto/internal/chacha20/xor.go b/libgo/go/internal/x/crypto/internal/chacha20/xor.go
deleted file mode 100644 (file)
index 9c5ba0b..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found src the LICENSE file.
-
-package chacha20
-
-import (
-       "runtime"
-)
-
-// Platforms that have fast unaligned 32-bit little endian accesses.
-const unaligned = runtime.GOARCH == "386" ||
-       runtime.GOARCH == "amd64" ||
-       runtime.GOARCH == "arm64" ||
-       runtime.GOARCH == "ppc64le" ||
-       runtime.GOARCH == "s390x"
-
-// xor reads a little endian uint32 from src, XORs it with u and
-// places the result in little endian byte order in dst.
-func xor(dst, src []byte, u uint32) {
-       _, _ = src[3], dst[3] // eliminate bounds checks
-       if unaligned {
-               // The compiler should optimize this code into
-               // 32-bit unaligned little endian loads and stores.
-               // TODO: delete once the compiler does a reliably
-               // good job with the generic code below.
-               // See issue #25111 for more details.
-               v := uint32(src[0])
-               v |= uint32(src[1]) << 8
-               v |= uint32(src[2]) << 16
-               v |= uint32(src[3]) << 24
-               v ^= u
-               dst[0] = byte(v)
-               dst[1] = byte(v >> 8)
-               dst[2] = byte(v >> 16)
-               dst[3] = byte(v >> 24)
-       } else {
-               dst[0] = src[0] ^ byte(u)
-               dst[1] = src[1] ^ byte(u>>8)
-               dst[2] = src[2] ^ byte(u>>16)
-               dst[3] = src[3] ^ byte(u>>24)
-       }
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/poly1305.go b/libgo/go/internal/x/crypto/poly1305/poly1305.go
deleted file mode 100644 (file)
index 6d6be9a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package poly1305 implements Poly1305 one-time message authentication code as
-specified in https://cr.yp.to/mac/poly1305-20050329.pdf.
-
-Poly1305 is a fast, one-time authentication function. It is infeasible for an
-attacker to generate an authenticator for a message without the key. However, a
-key must only be used for a single message. Authenticating two different
-messages with the same key allows an attacker to forge authenticators for other
-messages with the same key.
-
-Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was
-used with a fixed key in order to generate one-time keys from an nonce.
-However, in this package AES isn't used and the one-time key is specified
-directly.
-*/
-package poly1305
-
-import "crypto/subtle"
-
-// TagSize is the size, in bytes, of a poly1305 authenticator.
-const TagSize = 16
-
-// Verify returns true if mac is a valid authenticator for m with the given
-// key.
-func Verify(mac *[16]byte, m []byte, key *[32]byte) bool {
-       var tmp [16]byte
-       Sum(&tmp, m, key)
-       return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/poly1305_test.go b/libgo/go/internal/x/crypto/poly1305/poly1305_test.go
deleted file mode 100644 (file)
index 256bdbb..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package poly1305
-
-import (
-       "encoding/hex"
-       "flag"
-       "testing"
-       "unsafe"
-)
-
-var stressFlag = flag.Bool("stress", false, "run slow stress tests")
-
-type test struct {
-       in  string
-       key string
-       tag string
-}
-
-func (t *test) Input() []byte {
-       in, err := hex.DecodeString(t.in)
-       if err != nil {
-               panic(err)
-       }
-       return in
-}
-
-func (t *test) Key() [32]byte {
-       buf, err := hex.DecodeString(t.key)
-       if err != nil {
-               panic(err)
-       }
-       var key [32]byte
-       copy(key[:], buf[:32])
-       return key
-}
-
-func (t *test) Tag() [16]byte {
-       buf, err := hex.DecodeString(t.tag)
-       if err != nil {
-               panic(err)
-       }
-       var tag [16]byte
-       copy(tag[:], buf[:16])
-       return tag
-}
-
-func testSum(t *testing.T, unaligned bool, sumImpl func(tag *[TagSize]byte, msg []byte, key *[32]byte)) {
-       var tag [16]byte
-       for i, v := range testData {
-               in := v.Input()
-               if unaligned {
-                       in = unalignBytes(in)
-               }
-               key := v.Key()
-               sumImpl(&tag, in, &key)
-               if tag != v.Tag() {
-                       t.Errorf("%d: expected %x, got %x", i, v.Tag(), tag[:])
-               }
-       }
-}
-
-func TestBurnin(t *testing.T) {
-       // This test can be used to sanity-check significant changes. It can
-       // take about many minutes to run, even on fast machines. It's disabled
-       // by default.
-       if !*stressFlag {
-               t.Skip("skipping without -stress")
-       }
-
-       var key [32]byte
-       var input [25]byte
-       var output [16]byte
-
-       for i := range key {
-               key[i] = 1
-       }
-       for i := range input {
-               input[i] = 2
-       }
-
-       for i := uint64(0); i < 1e10; i++ {
-               Sum(&output, input[:], &key)
-               copy(key[0:], output[:])
-               copy(key[16:], output[:])
-               copy(input[:], output[:])
-               copy(input[16:], output[:])
-       }
-
-       const expected = "5e3b866aea0b636d240c83c428f84bfa"
-       if got := hex.EncodeToString(output[:]); got != expected {
-               t.Errorf("expected %s, got %s", expected, got)
-       }
-}
-
-func TestSum(t *testing.T)                 { testSum(t, false, Sum) }
-func TestSumUnaligned(t *testing.T)        { testSum(t, true, Sum) }
-func TestSumGeneric(t *testing.T)          { testSum(t, false, sumGeneric) }
-func TestSumGenericUnaligned(t *testing.T) { testSum(t, true, sumGeneric) }
-
-func benchmark(b *testing.B, size int, unaligned bool) {
-       var out [16]byte
-       var key [32]byte
-       in := make([]byte, size)
-       if unaligned {
-               in = unalignBytes(in)
-       }
-       b.SetBytes(int64(len(in)))
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
-               Sum(&out, in, &key)
-       }
-}
-
-func Benchmark64(b *testing.B)          { benchmark(b, 64, false) }
-func Benchmark1K(b *testing.B)          { benchmark(b, 1024, false) }
-func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) }
-func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) }
-func Benchmark2M(b *testing.B)          { benchmark(b, 2097152, true) }
-
-func unalignBytes(in []byte) []byte {
-       out := make([]byte, len(in)+1)
-       if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 {
-               out = out[1:]
-       } else {
-               out = out[:len(in)]
-       }
-       copy(out, in)
-       return out
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/sum_amd64.go b/libgo/go/internal/x/crypto/poly1305/sum_amd64.go
deleted file mode 100644 (file)
index 4dd72fe..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!gccgo,!appengine
-
-package poly1305
-
-// This function is implemented in sum_amd64.s
-//go:noescape
-func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
-
-// Sum generates an authenticator for m using a one-time key and puts the
-// 16-byte result into out. Authenticating two different messages with the same
-// key allows an attacker to forge messages at will.
-func Sum(out *[16]byte, m []byte, key *[32]byte) {
-       var mPtr *byte
-       if len(m) > 0 {
-               mPtr = &m[0]
-       }
-       poly1305(out, mPtr, uint64(len(m)), key)
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/sum_arm.go b/libgo/go/internal/x/crypto/poly1305/sum_arm.go
deleted file mode 100644 (file)
index 5dc321c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build arm,!gccgo,!appengine,!nacl
-
-package poly1305
-
-// This function is implemented in sum_arm.s
-//go:noescape
-func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte)
-
-// Sum generates an authenticator for m using a one-time key and puts the
-// 16-byte result into out. Authenticating two different messages with the same
-// key allows an attacker to forge messages at will.
-func Sum(out *[16]byte, m []byte, key *[32]byte) {
-       var mPtr *byte
-       if len(m) > 0 {
-               mPtr = &m[0]
-       }
-       poly1305_auth_armv6(out, mPtr, uint32(len(m)), key)
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/sum_noasm.go b/libgo/go/internal/x/crypto/poly1305/sum_noasm.go
deleted file mode 100644 (file)
index 751eec5..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl
-
-package poly1305
-
-// Sum generates an authenticator for msg using a one-time key and puts the
-// 16-byte result into out. Authenticating two different messages with the same
-// key allows an attacker to forge messages at will.
-func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
-       sumGeneric(out, msg, key)
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/sum_ref.go b/libgo/go/internal/x/crypto/poly1305/sum_ref.go
deleted file mode 100644 (file)
index c4d59bd..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package poly1305
-
-import "encoding/binary"
-
-// sumGeneric generates an authenticator for msg using a one-time key and
-// puts the 16-byte result into out. This is the generic implementation of
-// Sum and should be called if no assembly implementation is available.
-func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) {
-       var (
-               h0, h1, h2, h3, h4 uint32 // the hash accumulators
-               r0, r1, r2, r3, r4 uint64 // the r part of the key
-       )
-
-       r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff)
-       r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03)
-       r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff)
-       r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff)
-       r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff)
-
-       R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5
-
-       for len(msg) >= TagSize {
-               // h += msg
-               h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff
-               h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff
-               h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff
-               h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff
-               h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24)
-
-               // h *= r
-               d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1)
-               d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2)
-               d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3)
-               d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4)
-               d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0)
-
-               // h %= p
-               h0 = uint32(d0) & 0x3ffffff
-               h1 = uint32(d1) & 0x3ffffff
-               h2 = uint32(d2) & 0x3ffffff
-               h3 = uint32(d3) & 0x3ffffff
-               h4 = uint32(d4) & 0x3ffffff
-
-               h0 += uint32(d4>>26) * 5
-               h1 += h0 >> 26
-               h0 = h0 & 0x3ffffff
-
-               msg = msg[TagSize:]
-       }
-
-       if len(msg) > 0 {
-               var block [TagSize]byte
-               off := copy(block[:], msg)
-               block[off] = 0x01
-
-               // h += msg
-               h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff
-               h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff
-               h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff
-               h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff
-               h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8)
-
-               // h *= r
-               d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1)
-               d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2)
-               d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3)
-               d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4)
-               d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0)
-
-               // h %= p
-               h0 = uint32(d0) & 0x3ffffff
-               h1 = uint32(d1) & 0x3ffffff
-               h2 = uint32(d2) & 0x3ffffff
-               h3 = uint32(d3) & 0x3ffffff
-               h4 = uint32(d4) & 0x3ffffff
-
-               h0 += uint32(d4>>26) * 5
-               h1 += h0 >> 26
-               h0 = h0 & 0x3ffffff
-       }
-
-       // h %= p reduction
-       h2 += h1 >> 26
-       h1 &= 0x3ffffff
-       h3 += h2 >> 26
-       h2 &= 0x3ffffff
-       h4 += h3 >> 26
-       h3 &= 0x3ffffff
-       h0 += 5 * (h4 >> 26)
-       h4 &= 0x3ffffff
-       h1 += h0 >> 26
-       h0 &= 0x3ffffff
-
-       // h - p
-       t0 := h0 + 5
-       t1 := h1 + (t0 >> 26)
-       t2 := h2 + (t1 >> 26)
-       t3 := h3 + (t2 >> 26)
-       t4 := h4 + (t3 >> 26) - (1 << 26)
-       t0 &= 0x3ffffff
-       t1 &= 0x3ffffff
-       t2 &= 0x3ffffff
-       t3 &= 0x3ffffff
-
-       // select h if h < p else h - p
-       t_mask := (t4 >> 31) - 1
-       h_mask := ^t_mask
-       h0 = (h0 & h_mask) | (t0 & t_mask)
-       h1 = (h1 & h_mask) | (t1 & t_mask)
-       h2 = (h2 & h_mask) | (t2 & t_mask)
-       h3 = (h3 & h_mask) | (t3 & t_mask)
-       h4 = (h4 & h_mask) | (t4 & t_mask)
-
-       // h %= 2^128
-       h0 |= h1 << 26
-       h1 = ((h1 >> 6) | (h2 << 20))
-       h2 = ((h2 >> 12) | (h3 << 14))
-       h3 = ((h3 >> 18) | (h4 << 8))
-
-       // s: the s part of the key
-       // tag = (h + s) % (2^128)
-       t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:]))
-       h0 = uint32(t)
-       t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32)
-       h1 = uint32(t)
-       t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32)
-       h2 = uint32(t)
-       t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32)
-       h3 = uint32(t)
-
-       binary.LittleEndian.PutUint32(out[0:], h0)
-       binary.LittleEndian.PutUint32(out[4:], h1)
-       binary.LittleEndian.PutUint32(out[8:], h2)
-       binary.LittleEndian.PutUint32(out[12:], h3)
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/sum_s390x.go b/libgo/go/internal/x/crypto/poly1305/sum_s390x.go
deleted file mode 100644 (file)
index 7a266ce..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build s390x,go1.11,!gccgo,!appengine
-
-package poly1305
-
-// hasVectorFacility reports whether the machine supports
-// the vector facility (vx).
-func hasVectorFacility() bool
-
-// hasVMSLFacility reports whether the machine supports
-// Vector Multiply Sum Logical (VMSL).
-func hasVMSLFacility() bool
-
-var hasVX = hasVectorFacility()
-var hasVMSL = hasVMSLFacility()
-
-// poly1305vx is an assembly implementation of Poly1305 that uses vector
-// instructions. It must only be called if the vector facility (vx) is
-// available.
-//go:noescape
-func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
-
-// poly1305vmsl is an assembly implementation of Poly1305 that uses vector
-// instructions, including VMSL. It must only be called if the vector facility (vx) is
-// available and if VMSL is supported.
-//go:noescape
-func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
-
-// Sum generates an authenticator for m using a one-time key and puts the
-// 16-byte result into out. Authenticating two different messages with the same
-// key allows an attacker to forge messages at will.
-func Sum(out *[16]byte, m []byte, key *[32]byte) {
-       if hasVX {
-               var mPtr *byte
-               if len(m) > 0 {
-                       mPtr = &m[0]
-               }
-               if hasVMSL && len(m) > 256 {
-                       poly1305vmsl(out, mPtr, uint64(len(m)), key)
-               } else {
-                       poly1305vx(out, mPtr, uint64(len(m)), key)
-               }
-       } else {
-               sumGeneric(out, m, key)
-       }
-}
diff --git a/libgo/go/internal/x/crypto/poly1305/vectors_test.go b/libgo/go/internal/x/crypto/poly1305/vectors_test.go
deleted file mode 100644 (file)
index 18d7ff8..0000000
+++ /dev/null
@@ -1,2943 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package poly1305
-
-var testData = [...]test{
-       // edge cases
-       {
-               // see https://go-review.googlesource.com/#/c/30101/
-               key: "3b3a29e93b213a5c5c3b3b053a3a8c0d00000000000000000000000000000000",
-               tag: "6dc18b8c344cd79927118bbe84b7f314",
-               in:  "81d8b2e46a25213b58fee4213a2a28e921c12a9632516d3b73272727becf2129",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "04000000000000000000000000000000", // (2¹³⁰-1) % (2¹³⁰-5)
-               in: "ffffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "faffffffffffffffffffffffffffffff", // (2¹³⁰-6) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (2¹³⁰-5) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "f9ffffffffffffffffffffffffffffff", // (2*(2¹³⁰-6)) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (2*(2¹³⁰-5)) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "f8ffffffffffffffffffffffffffffff", // (3*(2¹³⁰-6)) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (3*(2¹³⁰-5)) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "f7ffffffffffffffffffffffffffffff", // (4*(2¹³⁰-6)) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (4*(2¹³⁰-5)) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "f3ffffffffffffffffffffffffffffff", // (8*(2¹³⁰-6)) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (8*(2¹³⁰-5)) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "ebffffffffffffffffffffffffffffff", // (16*(2¹³⁰-6)) % (2¹³⁰-5)
-               in: "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "faffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       {
-               key: "0100000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000", // (16*(2¹³⁰-5)) % (2¹³⁰-5)
-               in: "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "fbffffffffffffffffffffffffffffff" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000" +
-                       "00000000000000000000000000000000",
-       },
-       // original smoke tests
-       {
-               key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035",
-               tag: "a6f745008f81c916a20dcc74eef2b2f0",
-               in:  "48656c6c6f20776f726c6421",
-       },
-       {
-               key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035",
-               tag: "49ec78090e481ec6c26b33b91ccc0307",
-               in:  "0000000000000000000000000000000000000000000000000000000000000000",
-       },
-       {
-               key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035",
-               tag: "da84bcab02676c38cdb015604274c2aa",
-               in: "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000",
-       },
-       {
-               key: "0000000000000000000000000000000000000000000000000000000000000000",
-               tag: "00000000000000000000000000000000",
-               in: "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000000000" +
-                       "000000000000000000000000000000000000000000000000000000",
-       },
-       // randomly generated
-       {
-               key: "52fdfc072182654f163f5f0f9a621d729566c74d10037c4d7bbb0407d1e2c649",
-               tag: "9566c74d10037c4d7bbb0407d1e2c649",
-               in:  "",
-       },
-       {
-               key: "81855ad8681d0d86d1e91e00167939cb6694d2c422acd208a0072939487f6999",
-               tag: "eaa270caaa12faa39b797374a4b8a420",
-               in:  "eb",
-       },
-       {
-               key: "9d18a44784045d87f3c67cf22746e995af5a25367951baa2ff6cd471c483f15f",
-               tag: "dbea66e1da48a8f822887c6162c2acf1",
-               in:  "b90b",
-       },
-       {
-               key: "adb37c5821b6d95526a41a9504680b4e7c8b763a1b1d49d4955c848621632525",
-               tag: "6ac09aaa88c32ee95a7198376f16abdb",
-               in:  "3fec73",
-       },
-       {
-               key: "8dd7a9e28bf921119c160f0702448615bbda08313f6a8eb668d20bf505987592",
-               tag: "b1443487f97fe340b04a74719ed4de68",
-               in:  "1e668a5b",
-       },
-       {
-               key: "df2c7fc4844592d2572bcd0668d2d6c52f5054e2d0836bf84c7174cb7476364c",
-               tag: "7463be0f9d99a5348039e4afcbf4019c",
-               in:  "c3dbd968b0",
-       },
-       {
-               key: "f7172ed85794bb358b0c3b525da1786f9fff094279db1944ebd7a19d0f7bbacb",
-               tag: "2edaee3bcf303fd05609e131716f8157",
-               in:  "e0255aa5b7d4",
-       },
-       {
-               key: "4bec40f84c892b9bffd43629b0223beea5f4f74391f445d15afd4294040374f6",
-               tag: "965f18767420c1d94a4ef657e8d15e1e",
-               in:  "924b98cbf8713f",
-       },
-       {
-               key: "8d962d7c8d019192c24224e2cafccae3a61fb586b14323a6bc8f9e7df1d92933",
-               tag: "2bf4a33287dd6d87e1ed4282f7342b6a",
-               in:  "3ff993933bea6f5b",
-       },
-       {
-               key: "3af6de0374366c4719e43a1b067d89bc7f01f1f573981659a44ff17a4c7215a3",
-               tag: "c5e987b60373a48893c5af30acf2471f",
-               in:  "b539eb1e5849c6077d",
-       },
-       {
-               key: "bb5722f5717a289a266f97647981998ebea89c0b4b373970115e82ed6f4125c8",
-               tag: "19f0f640b309d168ea1b480e6a4faee5",
-               in:  "fa7311e4d7defa922daa",
-       },
-       {
-               key: "e7786667f7e936cd4f24abf7df866baa56038367ad6145de1ee8f4a8b0993ebd",
-               tag: "de75e5565d97834b9fa84ad568d31359",
-               in:  "f8883a0ad8be9c3978b048",
-       },
-       {
-               key: "83e56a156a8de563afa467d49dec6a40e9a1d007f033c2823061bdd0eaa59f8e",
-               tag: "de184a5a9b826aa203c5c017986d6690",
-               in:  "4da6430105220d0b29688b73",
-       },
-       {
-               key: "4b8ea0f3ca9936e8461f10d77c96ea80a7a665f606f6a63b7f3dfd2567c18979",
-               tag: "7478f18d9684905aa5d1a34ee67e4c84",
-               in:  "e4d60f26686d9bf2fb26c901ff",
-       },
-       {
-               key: "354cde1607ee294b39f32b7c7822ba64f84ab43ca0c6e6b91c1fd3be89904341",
-               tag: "3b2008a9c52b5308f5538b789ab5506f",
-               in:  "79d3af4491a369012db92d184fc3",
-       },
-       {
-               key: "9d1734ff5716428953bb6865fcf92b0c3a17c9028be9914eb7649c6c93478009",
-               tag: "71c8e76a67a505b7370b562ba15ba032",
-               in:  "79d1830356f2a54c3deab2a4b4475d",
-       },
-       {
-               key: "63afbe8fb56987c77f5818526f1814be823350eab13935f31d84484517e924ae",
-               tag: "1dc895f74f866bdb3edf6c4430829c1c",
-               in:  "f78ae151c00755925836b7075885650c",
-       },
-       {
-               key: "30ec29a3703934bf50a28da102975deda77e758579ea3dfe4136abf752b3b827",
-               tag: "afca2b3ba7b0e1a928001966883e9b16",
-               in: "1d03e944b3c9db366b75045f8efd69d22ae5411947cb553d7694267aef4e" +
-                       "bcea406b32d6108bd68584f57e37caac6e33feaa3263a399437024ba9c9b" +
-                       "14678a274f01a910ae295f6efbfe5f5abf44ccde263b5606633e2bf0006f" +
-                       "28295d7d39069f01a239c4365854c3af7f6b41d631f92b9a8d12f4125732" +
-                       "5fff332f7576b0620556304a3e3eae14c28d0cea39d2901a52720da85ca1" +
-                       "e4b38eaf3f",
-       },
-       {
-               key: "44c6c6ef8362f2f54fc00e09d6fc25640854c15dfcacaa8a2cecce5a3aba53ab",
-               tag: "6f2a09aa76c9b76774e31ec02dcf7991",
-               in: "705b18db94b4d338a5143e63408d8724b0cf3fae17a3f79be1072fb63c35" +
-                       "d6042c4160f38ee9e2a9f3fb4ffb0019b454d522b5ffa17604193fb89667" +
-                       "10a7960732ca52cf53c3f520c889b79bf504cfb57c7601232d589baccea9" +
-                       "d6e263e25c27741d3f6c62cbbb15d9afbcbf7f7da41ab0408e3969c2e2cd" +
-                       "cf233438bf1774ace7709a4f091e9a83fdeae0ec55eb233a9b5394cb3c78" +
-                       "56b546d313c8a3b4c1c0e05447f4ba370eb36dbcfdec90b302dcdc3b9ef5" +
-                       "22e2a6f1ed0afec1f8e20faabedf6b162e717d3a748a58677a0c56348f89" +
-                       "21a266b11d0f334c62fe52ba53af19779cb2948b6570ffa0b773963c130a" +
-                       "d797ddea",
-       },
-       {
-               key: "fe4e3ad29b5125210f0ef1c314090f07c79a6f571c246f3e9ac0b7413ef110bd",
-               tag: "27381e3fc2a356103fb796f107d826e7",
-               in: "58b00ce73bff706f7ff4b6f44090a32711f3208e4e4b89cb5165ce64002c" +
-                       "bd9c2887aa113df2468928d5a23b9ca740f80c9382d9c6034ad2960c7965" +
-                       "03e1ce221725f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e1386" +
-                       "47a4b44ed4bce964ed47f74aa594468ced323cb76f0d3fac476c9fb03fc9" +
-                       "228fbae88fd580663a0454b68312207f0a3b584c62316492b49753b5d502" +
-                       "7ce15a4f0a58250d8fb50e77f2bf4f0152e5d49435807f9d4b97be6fb779" +
-                       "70466a5626fe33408cf9e88e2c797408a32d29416baf206a329cfffd4a75" +
-                       "e498320982c85aad70384859c05a4b13a1d5b2f5bfef5a6ed92da482caa9" +
-                       "568e5b6fe9d8a9ddd9eb09277b92cef9046efa18500944cbe800a0b1527e" +
-                       "a6",
-       },
-       {
-               key: "4729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b03072e641",
-               tag: "0173965669fb9de88d38a827a0271271",
-               in: "5a761f03abaa40abc9448fddeb2191d945c04767af847afd0edb5d8857b7" +
-                       "99acb18e4affabe3037ffe7fa68aa8af5e39cc416e734d373c5ebebc9cdc" +
-                       "c595bcce3c7bd3d8df93fab7e125ddebafe65a31bd5d41e2d2ce9c2b1789" +
-                       "2f0fea1931a290220777a93143dfdcbfa68406e877073ff08834e197a403" +
-                       "4aa48afa3f85b8a62708caebbac880b5b89b93da53810164402104e648b6" +
-                       "226a1b78021851f5d9ac0f313a89ddfc454c5f8f72ac89b38b19f53784c1" +
-                       "9e9beac03c875a27db029de37ae37a42318813487685929359ca8c5eb94e" +
-                       "152dc1af42ea3d1676c1bdd19ab8e2925c6daee4de5ef9f9dcf08dfcbd02" +
-                       "b80809398585928a0f7de50be1a6dc1d5768e8537988fddce562e9b948c9" +
-                       "18bba3e933e5c400cde5e60c5ead6fc7ae77ba1d259b188a4b21c86fbc23" +
-                       "d728b45347eada650af24c56d0800a8691332088a805bd55c446e25eb075" +
-                       "90bafcccbec6177536401d9a2b7f512b54bfc9d00532adf5aaa7c3a96bc5" +
-                       "9b489f77d9042c5bce26b163defde5ee6a0fbb3e9346cef81f0ae9515ef3" +
-                       "0fa47a364e75aea9e111d596e685a591121966e031650d510354aa845580" +
-                       "ff560760fd36514ca197c875f1d02d9216eba7627e2398322eb5cf43d72b" +
-                       "d2e5b887d4630fb8d4747ead6eb82acd1c5b078143ee26a586ad23139d50" +
-                       "41723470bf24a865837c",
-       },
-       {
-               key: "9123461c41f5ff99aa99ce24eb4d788576e3336e65491622558fdf297b9fa007",
-               tag: "1eb0cdad9237905250d30a24fe172a34",
-               in: "864bafd7cd4ca1b2fb5766ab431a032b72b9a7e937ed648d0801f29055d3" +
-                       "090d2463718254f9442483c7b98b938045da519843854b0ed3f7ba951a49" +
-                       "3f321f0966603022c1dfc579b99ed9d20d573ad53171c8fef7f1f4e4613b" +
-                       "b365b2ebb44f0ffb6907136385cdc838f0bdd4c812f042577410aca008c2" +
-                       "afbc4c79c62572e20f8ed94ee62b4de7aa1cc84c887e1f7c31e927dfe52a" +
-                       "5f8f46627eb5d3a4fe16fafce23623e196c9dfff7fbaff4ffe94f4589733" +
-                       "e563e19d3045aad3e226488ac02cca4291aed169dce5039d6ab00e40f67a" +
-                       "ab29332de1448b35507c7c8a09c4db07105dc31003620405da3b2169f5a9" +
-                       "10c9d0096e5e3ef1b570680746acd0cc7760331b663138d6d342b051b5df" +
-                       "410637cf7aee9b0c8c10a8f9980630f34ce001c0ab7ac65e502d39b216cb" +
-                       "c50e73a32eaf936401e2506bd8b82c30d346bc4b2fa319f245a8657ec122" +
-                       "eaf4ad5425c249ee160e17b95541c2aee5df820ac85de3f8e784870fd87a" +
-                       "36cc0d163833df636613a9cc947437b6592835b9f6f4f8c0e70dbeebae7b" +
-                       "14cdb9bc41033aa5baf40d45e24d72eac4a28e3ca030c9937ab8409a7cbf" +
-                       "05ae21f97425254543d94d115900b90ae703b97d9856d2441d14ba49a677" +
-                       "de8b18cb454b99ddd9daa7ccbb7500dae4e2e5df8cf3859ebddada6745fb" +
-                       "a6a04c5c37c7ca35036f11732ce8bc27b48868611fc73c82a491bfabd7a1" +
-                       "9df50fdc78a55dbbc2fd37f9296566557fab885b039f30e706f0cd5961e1" +
-                       "9b642221db44a69497b8ad99408fe1e037c68bf7c5e5de1d2c68192348ec" +
-                       "1189fb2e36973cef09ff14be23922801f6eaee41409158b45f2dec82d17c" +
-                       "aaba160cd6",
-       },
-       {
-               key: "40ff73495fe4a05ce1202ca7287ed3235b95e69f571fa5e656aaa51fae1ebdd7",
-               tag: "2e619d8ea81b77484e4fddeb29844e4b",
-               in: "aa6269c2ec7f4057b33593bc84888c970fd528d4a99a1eab9d2420134537" +
-                       "cd6d02282e0981e140232a4a87383a21d1845c408ad757043813032a0bd5" +
-                       "a30dcca6e3aa2df04715d879279a96879a4f3690ac2025a60c7db15e0501" +
-                       "ebc34b734355fe4a059bd3899d920e95f1c46d432f9b08e64d7f9b38965d" +
-                       "5a77a7ac183c3833e1a3425ead69d4f975012fd1a49ed832f69e6e9c63b4" +
-                       "53ec049c9e7a5cf944232d10353f64434abae060f6506ad3fdb1f4415b0a" +
-                       "f9ce8c208bc20ee526741539fa3203c77ecba410fd6718f227e0b430f9bc" +
-                       "b049a3d38540dc222969120ce80f2007cd42a708a721aa29987b45d4e428" +
-                       "811984ecad349cc35dd93515cefe0b002cee5e71c47935e281ebfc4b8b65" +
-                       "2b69ccb092e55a20f1b9f97d046296124621928739a86671cc180152b953" +
-                       "e3bf9d19f825c3dd54ae1688e49efb5efe65dcdad34bc860010e7c8c997c" +
-                       "d5f9e320ca7d39d4ba801a175b1c76f057832f3f36d7d893e216e4c7bbdb" +
-                       "548d0ba48449330027368b34f9c69776b4591532da1c5be68ef4eebe8cb8" +
-                       "fa7dc5483fb70c2c896334cb1f9cb5dfe044fa086197ff5dfd02f2ba3884" +
-                       "c53dd718c8560da743a8e9d4aeae20ccef002d82ca352592b8d8f2a8df3b" +
-                       "0c35f15b9b370dca80d4ca8e9a133eb52094f2dd5c08731f52315d828846" +
-                       "e37df68fd10658b480f2ac84233633957e688e924ffe3713b52c76fd8a56" +
-                       "da8bb07daa8eb4eb8f7334f99256e2766a4109150eed424f0f743543cdea" +
-                       "66e5baaa03edc918e8305bb19fc0c6b4ddb4aa3886cb5090940fc6d4cabe" +
-                       "2153809e4ed60a0e2af07f1b2a6bb5a6017a578a27cbdc20a1759f76b088" +
-                       "9a83ce25ce3ca91a4eb5c2f8580819da04d02c41770c01746de44f3db6e3" +
-                       "402e7873db7635516e87b33e4b412ba3df68544920f5ea27ec097710954f" +
-                       "42158bdba66d4814c064b4112538676095467c89ba98e6a543758d7093a4" +
-                       "94df",
-       },
-       {
-               key: "5cc36d09c7a6472a41f29c380a987b1ecdcf84765f4e5d3ceefc1c02181f570f",
-               tag: "0d57b8cbea8090df0541354673dcb4e0",
-               in: "44fcd629f08dc1ef53c9ae0d8869fe67fdc7a2c67b425f13c5be8d9f630c" +
-                       "1d063c02fd75cf64c1aec9d2e2ef6e6431d5f5ad0489078dc61f46494dcc" +
-                       "f403dad7f094170d2c3e29c198b0f341e284c4be8fa60c1a478d6bd55dd2" +
-                       "c04dad86d2053d5d25b014e3d8b64322cdcb5004faa46cfa2d6ad2ff933b" +
-                       "c3bd9a5a74660af3d048a9a43634c0250427d9a6219197a3f3633f841753" +
-                       "ba7c27f3619f387b6b1a6cb9c1dc227674aa020724d137da2cb87b1615d5" +
-                       "12974fa4747dd1e17d02c9462a44fec150ca3a8f99cc1e4953365e429956" +
-                       "5e108535b1f62e1d4ba18e17a52164418bfd1a933f7fb3a126c860830a87" +
-                       "293d9271da736e4398c1e37fb75c4bf02786e1faf4b610cd1377fbb9ae18" +
-                       "0655a0abefbad700c09473469f1eca5a66d53fa3dc7cd3e7c3b0411d7e14" +
-                       "5f96eb9654ab94913dda503a50f9e773842f4d2a5faa60869bf365830511" +
-                       "f2ededd03e0a73000edb60c9a29a5f5e194cf3b5667a694690384599d116" +
-                       "f8d2fd93b2aed55b7d44b5b054f3f38e788e4fdf36e591568c41d1052cad" +
-                       "0fcb68ca4c4bf5090d57df9db6f0d91dd8b11b804f331adb7efb087a5604" +
-                       "e9e22b4d54db40bcbc6e272ff5eaddfc1471459e59f0554c58251342134a" +
-                       "8daaef1498069ba581ef1da2510be92843487a4eb8111c79a6f0195fc38a" +
-                       "d6aee93c1df2b5897eaa38ad8f47ab2fe0e3aa3e6accbfd4c16d46843318" +
-                       "5fc61c861b96ca65e34d31f24d6f56ee85092314a4d7656205c15322f1c9" +
-                       "7613c079eae292ba966e10d1e700164e518b243f424c46f9ea63db1c2c34" +
-                       "b512c403c128ee19030a6226517b805a072512a5e4cd274b7fd1fa23f830" +
-                       "058208ff1a063b41039c74036b5b3da8b1a0b93135a710352da0f6c31203" +
-                       "a09d1f2329651bb3ab3984ab591f2247e71cd44835e7a1a1b66d8595f7ae" +
-                       "f9bf39d1417d2d31ea3599d405ff4b5999a86f52f3259b452909b57937d8" +
-                       "5364d6c23deb4f14e0d9fcee9184df5994fdc11f045c025c8d561adb0e7d" +
-                       "fd4748fd4b20f84e53322471a410cdb3fd88e48b2e7eb7ae5dae994cb5ea" +
-                       "e3eaf21cf9005db560d6d22e4d9b97d7e9e488751afcd72aa176c0fcde93" +
-                       "16f676fd527d9c42105b851639f09ea70533d26fc60cbeb4b76ed554fc99" +
-                       "177620b28ca6f56a716f8cb384",
-       },
-       {
-               key: "811c3e356e7c793acf114c624dc86ace38e67bff2a60e5b2a6c20723c1b9f003",
-               tag: "c6e59044cefc43ee681c3eed872d02b3",
-               in: "e115b304c023792448794546a2474f04294d7a616215e5dd6c40a65bb6ed" +
-                       "b508c3680b14c176c327fdfb1ee21962c0006b7deb4e5de87db21989d13c" +
-                       "3ab0462d5d2a52ef4ca0d366ae06a314f50e3a21d9247f814037798cc5e1" +
-                       "0a63de027477decdeb8a8e0c279299272490106ddf8683126f60d35772c6" +
-                       "dfc744b0adbfd5dcf118c4f2b06cfaf077881d733a5e643b7c46976647d1" +
-                       "c1d3f8f6237c6218fa86fb47080b1f7966137667bd6661660c43b75b6339" +
-                       "0b514bbe491aa46b524bde1c5b7456255fb214c3f74907b7ce1cba94210b" +
-                       "78b5e68f049fcb002b96a5d38d59df6e977d587abb42d0972d5f3ffc898b" +
-                       "3cbec26f104255761aee1b8a232d703585dd276ee1f43c8cd7e92a993eb1" +
-                       "5107d02f59ba75f8dd1442ee37786ddb902deb88dd0ebdbf229fb25a9dca" +
-                       "86d0ce46a278a45f5517bff2c049cc959a227dcdd3aca677e96ce84390e9" +
-                       "b9a28e0988777331847a59f1225b027a66c1421422683dd6081af95e16f2" +
-                       "48ab03da494112449ce7bdace6c988292f95699bb5e4d9c8d250aa28a6df" +
-                       "44c0c265156deb27e9476a0a4af44f34bdf631b4af1146afe34ea988fc95" +
-                       "3e71fc21ce60b3962313000fe46d757109281f6e55bc950200d0834ceb5c" +
-                       "41553afd12576f3fbb9a8e05883ccc51c9a1269b6d8e9d27123dce5d0bd6" +
-                       "db649c6fea06b4e4e9dea8d2d17709dc50ae8aa38231fd409e9580e255fe" +
-                       "2bf59e6e1b6e310610ea4881206262be76120d6c97db969e003947f08bad" +
-                       "8fa731f149397c47d2c964e84f090e77e19046277e18cd8917c48a776c9d" +
-                       "e627b6656203b522c60e97cc61914621c564243913ae643f1c9c9e0ad00a" +
-                       "14f66eaa45844229ecc35abb2637317ae5d5e338c68691bea8fa1fd469b7" +
-                       "b54d0fccd730c1284ec7e6fccdec800b8fa67e6e55ac574f1e53a65ab976" +
-                       "4c218a404184793cc9892308e296b334c85f7097edc16927c2451c4cd7e5" +
-                       "3f239aa4f4c83241bde178f692898b1ece2dbcb19a97e64c4710326528f2" +
-                       "4b099d0b674bd614fad307d9b9440adab32117f0f15b1450277b00eb366e" +
-                       "0260fca84c1d27e50a1116d2ce16c8f5eb212c77c1a84425744ea3195edb" +
-                       "b54c970b77e090b644942d43fe8c4546a158bad7620217a40e34b9bb84d1" +
-                       "89eff32b20ef3f015714dbb1f150015d6eeb84cbccbd3fffa63bde89",
-       },
-       {
-               key: "f33691f5db2dea41e1e608af3ff39f3a6988dba204ce1b09214475ae0ea864b8",
-               tag: "6e50e70411201378c8d67857d7b631d2",
-               in: "439bc9ea10db4d2b08c7fcf2e8bd89fa9844f8061d462e28f174489e7514" +
-                       "0f84e842040141cc59ce38f9551850cfbdfac2d75337d155090d70d0d930" +
-                       "04340bdfe60062f17c53f3c9005b9995a0feb49f6bef8eaff80f4feb7ef3" +
-                       "f2181733a4b43b6ac43a5130a73a9b3c2cbc93bd296cd5f48c9df022b6c8" +
-                       "2bb752bc21e3d8379be31328aa32edc11efc8a4b4b3f370ee8c870cd281d" +
-                       "614e6bc2c0a5ca303bc48696a3bd574ee34738de4c4c29910f8feb7557bf" +
-                       "ffcfe7428b4703144bd6d7fe5b3f5de748918553df5453b3c6001696f3de" +
-                       "0137e454aadf30cedfb6be36b0b908a38409f1a2dc202fc285610765e4c8" +
-                       "6414692bf4bde20ed899e97727b7ea1d95d7c621717c560f1d260ab3624e" +
-                       "d6168d77c483dd5ce0d234049017795f2e5a7569d7ad323c50a5b1170337" +
-                       "4174a9977026c20cd52c10b72f14e0569a684a3dcf2ccbc148fd3db506e2" +
-                       "8d24f6c55544cb3980a36e86747adc89ebad78d1630618d113fa445f8625" +
-                       "b583cd7be33913c30c419d047cf3baf40fd05219a1fcec717b87a65fa022" +
-                       "1a3aa8143062d77588168019454240ae3d37640996f2967810459bc658df" +
-                       "e556de4d07263dc3d9158ec242008226d1c6aea7f0846e12ce2d316e80da" +
-                       "522343264ec9451ec23aaaa367d640faad4af3d44d6d86544ade34c93518" +
-                       "2843f6b4d1c934996778affa9ee962e7dfef5e70d933d4309f0f343e9606" +
-                       "1b91b11ac380a9675e17a96099fe411bedc28a298cd78d5496e28fbbd4f5" +
-                       "b0a27735d1144348e22be5b75724d8f125e99c4cb4e9c3a1f0b4e9da5146" +
-                       "e6afaa33d02fda74bf58a8badee2b634b989c01755afa6ab20ee494c6ae4" +
-                       "c2c6f17af6b53b61d2947d83a18eb3b8a1612aad5d3ea7e8e35f325c9168" +
-                       "ac490f22cb713ddb61fbd96011c5849ac8e2fcd42db820349bdf9157dcc0" +
-                       "0d9f9ed9c099b10c7194d48b623b0df43759734b2a2e5f8a35e7192bf9a0" +
-                       "03dcb9d16a54bd84d922f85b6021b28aacc5264fe9e83deb48f18f864cbd" +
-                       "367eb163d39c45b0eb907311a2a4b09fb26109088df782ce031b02f3caff" +
-                       "d2dbe25b1cbde9f35ba7c47292a4fd49e7def7a28824f3dfda259a86c3de" +
-                       "59257c255c712686ee47d128a55c7b9e8c546035eab7e2da420f32ed5c94" +
-                       "bc12a34dc68eb99257a7ea03b69d6c760b0681fa24e4ca97b7c377182ab5" +
-                       "fee30a278b08c44c988a8f925af2997883111c750d176b432735868208f4" +
-                       "0de7137331b544f2d28040a3581d195e82811c945c3f9fde68fc21b36a44" +
-                       "e1cfa2d8eb625f3102461539b3f13c660936a5ddb29a0ae791fbf52c2f69" +
-                       "7bd334653f3605b362d91cd78569b41dbd09b2a5892440b5097fa08d0b4b" +
-                       "291fc5b934585dd8d5adc80d573fdd194b2eae26dfc49f5e51c1f1607d7e" +
-                       "87740702f244bf39ca1d52423e0ae84891dfdf4f43ef984c7a5f293a2007" +
-                       "a1e00e39c757f064518953f55621f955986f63",
-       },
-       {
-               key: "d115b6ac998a65b48b3dae5977abaf985258d3d1cfe1616cec3d6a77f7a75785",
-               tag: "b431c9318ec2769fc8ee8f5fc3c079c3",
-               in: "7e7eb43839a6d7616b8a7b1fb7144817904342a9bd34167051162941a6b1" +
-                       "b85db5e587f76e4a53211755d5ab29c11822d7711a97b3f1ff5b21f2485d" +
-                       "9c86241fb56cdd6796245d3112df11ad9a7344db44d09934c4efb280ed65" +
-                       "80cfcafb5c97a32993cbbf4917183e0b7bb38f2ce2479c28e1d39f673962" +
-                       "17a7010448dfd39a4e7f406c8bd2d804f993bb410fffa4eb57518a531ecf" +
-                       "259a8af068230acb826d9ffc20ee0fc43885221a321e3928971bb28615f0" +
-                       "d9f099f5b68a80503a910fdba0bc643c60b64837900be38770b6b30c362c" +
-                       "4580722b5dbb1b9c8cd02a18fd7b5661d2c4d28aa941c50af6655c826690" +
-                       "37312fbf9f1cf4adb0b9400532755011b40e8252bd0e3c7a22efb0ef9122" +
-                       "1e04b4aa8316d4a4ffeaa11909d38cc264650e7ca416835ded0953f39e29" +
-                       "b01d3a33bba454760fb0a96d9fe50b3e42c95271e57840380d1fd39a375b" +
-                       "3e5513a31a4b80a2dad8731d4fd1ced5ff61e1fbe8ff3ff90a277e6b5631" +
-                       "f99f046c4c3c66158554f61af2ede73aede97e94b1d1f129aaadf9b53548" +
-                       "553cc2304103e245b77701f134d94d2a3658f2b41108c5a519c2c8f450db" +
-                       "027824f1c0ab94010589a4139ff521938b4f0c7bf0986585f535b6e292e5" +
-                       "b3ded23bf81cec17c8420fe67a449e508864e4cbb7eaf335975668f013e9" +
-                       "da70b33bd52a72094a8f03762ea7440ce9fcd10e251837cfc9ccc1a8cc47" +
-                       "0c67379f6a32f16cf70ea8c19d1a67779a9b2d2b379665e0e908a88b26e7" +
-                       "8c9f94f17acefa6d5feb70a7095e0297c53e091cf98df132a23a5ce5aa72" +
-                       "59f1154b92e079f0b6f95d2a38aa5d62a2fd97c12ee7b085e57cc4652863" +
-                       "8defacc1e70c3aceab82a9fa04e6aa70f5fbfd19de075bee4e3aac4a87d0" +
-                       "ad0226a463a554816f1ebac08f30f4c3a93fa85d79b92f0da06348b4f008" +
-                       "880fac2df0f768d8f9d082f5a747afb0f62eb29c89d926de9fc491921474" +
-                       "1d8647c67d57ac55f94751389ee466bbd44dbe186f2f38abbc61a0425613" +
-                       "e9b6a64e6bcb45a2e2bb783b9103483643d5610a7e2dcdb10b5d78423285" +
-                       "506b42a99b00a4fb7b619b4526bb4ec78299dd01ad894fde2f053e18c55b" +
-                       "6047f86333f2690c2cb8e87d9834ab8a5e339aa346e4d9952ed62dc083e3" +
-                       "b11a823a67f23fec099a033f127ebe8626a89fa1a5a6b3520aa0d215a8e7" +
-                       "dea3af37907686c16521739a95d6c532cc259c497bf397fceaea49cd46b9" +
-                       "ad5c1b39a36fdd2f0d2225fef1b6ca2bb73fe604646c10ba4c572ab13a26" +
-                       "559ededc98f5a34c874cc25621e65ba4852529b5a4e9c1b2bf8e1a8f8ff0" +
-                       "5a31095b84696c6381eb9ad37ac0db184fe5fccf3554e514946a33cabe6f" +
-                       "4d617b549d28ad1cc4642dac96e0215ee1596481600d3619e8f45e2c9ae1" +
-                       "da834d44aca216bba0efef6254503ca90339f2d7ca508b2722d50c08def8" +
-                       "a736590fa44855cd9eb9979c743783aa26e633696739f2ae25ff7b72ceb2" +
-                       "4dff4455b85bbd675c8cb71ad18386dc58c371bdf37b4b3875b98a9423ff" +
-                       "3becfc0d0ba2aacab3ee7683cb3b345095fefcaca5751ca793da63c89428",
-       },
-       {
-               key: "f3717306b9729be998cdb2c9d856306c5ae3d89da2cdcef12f86f6110c98d873",
-               tag: "907dba0f4849c7cf4570b5128b5f31d5",
-               in: "079572187d4559f24d8e48dc366441acf226a4db79e214ec3ee288acc349" +
-                       "887e2e377419bcafa377d0151497b52e4d9cf2a02b0fc91ad9516482bdf6" +
-                       "eccd1497954b53241bfb0bc5c04cc45045c6251f23a510060fee32721872" +
-                       "bbc95cd8d400dff00bcac2ecce6229c7d73d8f85ed5a87afdccf6dedd299" +
-                       "2d5c7b5b8090c47c737ded036ff0e9aedf02a2242fd9820be618b9601e73" +
-                       "d3ba5d8f1ae9805cfd2306251704bc74e3546997f109f1dfae20c03ff31f" +
-                       "17564769aa49f01233c9c4b79f90fa3d1433d18cdc497914046ad77d2792" +
-                       "2588a7d0e61d4258d7d80cdab8503e3111ddca22cf7f39c1f80f1e16a68d" +
-                       "9e21db8b53dd316dfa4233cb453a39a90101c60efc08514a3057db007e96" +
-                       "507745bd4a0764ed8717a250bffb5fd1ea58474bdfb5b869681939693926" +
-                       "40d832a3387ed4ac9cdab0d2af8fcb51b86e4d927097f1e79b5af96574ec" +
-                       "d59d0dd150a0208978c41de28ad6cadf72a49279cffd6dc281c640f2e294" +
-                       "4cde49a13ed390da1dd92e3011ce0f4a0863375a9db3f67fca1e3b8288a0" +
-                       "78611161d7cb668ecdb932e1ff3733982c8c460eeeff2bca46c96e8a02cf" +
-                       "b55d770940de556373a4dd676e3a0dd66f1280c8cb77a85136b3f003fab4" +
-                       "887dad548de7bfe6488ae55e7a71da4097db03900d4b94e776a939530328" +
-                       "83492da900b2a6c3e73d7a6f12ee30c9dd06cc34e5a3893976eb1de5864d" +
-                       "32e792ac02e68d052d9d0cfc7cfb40b77728422f6c26cf68987c6b40fcfe" +
-                       "9d660abc657360eb129de11bd70af5eb8fe350af2c27a6ece2cdf81b94c8" +
-                       "0e68e8c51106497cfa5171236efe2d71d76b5dff3352af9b407dc5aab60f" +
-                       "46b5683646f5b28732b7c750d351a08a507243d8e437cc4bef13a3edaa20" +
-                       "5fc4e9968b4e563fa0dc965ba20b8e48bc188a321b16d3213bed69647512" +
-                       "7a20afc1a3680ef261df6d37b017dee05cfc3a42e4130216e5540cf715c4" +
-                       "e638d7d615c50bef576eeb19b3b15b2c2b454dfcef2b18161a143ddf52fc" +
-                       "8e88fa71cbe34c92cd4b5a0adc81e5c33e11d2721bc1b95a9e693ac3cabc" +
-                       "490889a8a42bf7e22375b679e8598c8faef22a006ed2da8ab1c08aaed2f5" +
-                       "6d6f26649036335c0881bfec1e3a5346335c3b3707ee92173f1a7a3305c2" +
-                       "933f78e995da8f1df64daf12b81ce23c8813c27fd4551103dc33561c2e80" +
-                       "45b6b6770fa03498fd359a104884699d628020173edbcc4398b977e456e4" +
-                       "885964840466176a490e7c513ba5d66090277c1ab1632a995a54f555a452" +
-                       "1170a000507865b6650730aa6d6050a55959102836fff3d37e4773340e59" +
-                       "2e56951ff9652519de4421d9c5b63edbeb30a3852a1ea110a9a29721aee3" +
-                       "23d5a306de1624cecc87badc47aa87f489635d2fb60bff62ba67f5257999" +
-                       "6af0a1f1a6fbcd8704e119196fcc289a6db6a4170a2cae31a1d30744b702" +
-                       "2536d1526d41659c2dcc8b39c26aecfc0f8a707136d81b2827a158fd7386" +
-                       "a537514471c213a8c859016748e0264cf3fbde10f40c620840ec4df99432" +
-                       "e2b9e1e368e33f126ec40c572e841c2618d49d4eb098b9533b1f4ae00b46" +
-                       "8d15de8c8ab6d0b650e599576f2bd90a124c9c6a0f911fd1bd8253bac272" +
-                       "942cbdf8864f3747ff7f09d8a5a9d8599be7ee1744e5f1faf3e526cd2a06" +
-                       "b157527272af9d38565957c9ce663c295766c0e0e464971c6282b70d4c0c" +
-                       "1fb3b69856b34c089ad2b2c745f5a033cee1429c5b855581ee285278893c" +
-                       "43a5968d9c28384b7abe8d072ba69089c938685cb1eab461f05314ad6d06" +
-                       "eaa58512f8738bde35b7b15ef359dd2e8753cb1ed6",
-       },
-       {
-               key: "9772c1a4b74cbf53586e5df04369b35f1fdca390565872251bc6844bc81bda88",
-               tag: "68eb7fc459ecc3be819485001ab438dc",
-               in: "e115cc2f33e367cb85c01a914b3a512404ad6a98b5b0c3a211d4bffd5802" +
-                       "ee43b3fb07451c74524ec8b4eddbb41ca33dd6e49791875d716a44bec97b" +
-                       "7c2d4546616939ffa3b1ab9b8ba1d1a637e7c985cc922606caa0453085e3" +
-                       "5f2fe0bd2de129d1d1856ade975a3281a62965927d8bb695e54514e69558" +
-                       "89361a2a00a1b24e62bda78d0b71a0d40147016fcdaf1a702331dda8e678" +
-                       "d8f476dcc91698da1688c610ec0cb1d9b8fbcd45dfde6d1503ba60a01337" +
-                       "ae5b2f5c854a82c3087779babd2e522dd92f4718cd9f8c649ac226745ca2" +
-                       "fa1696442764758f67cd926369578ae87612790dc56ed9cda935281a490e" +
-                       "5c984950ec7a4e930520d273a69da4ed3a330e532508e26f942961fed0e3" +
-                       "efeed52a7b96250d723155aa39a8ae85131c255c32bf406b647de1a37fba" +
-                       "dc61e302bb5b70adec4505ee66b3a1d1b7bfe9c58b11e53ad556d56e5807" +
-                       "017bb30b71be94e8f86aaf1496e8b8d6db75ec0afbe1cd336c23963c745d" +
-                       "7b4ba1787ceb30728f1762b46f6eaad5064c8029d29b86266b87f93142a2" +
-                       "74f519f3281d8c1cb43c23eb184ae41f3f625cf624b05a48d73cd7783fdf" +
-                       "14954a03ec1a930e9a954424eff030e3f15357de4c19983f484619a0e9e2" +
-                       "b67221cf965e9aa8d8926595c793adfe0181050df8b845ce648a66df532f" +
-                       "78b10c83ecc86374a4f8abf8edcc303654bafd3dcc7de9c77a0a9d1d98fb" +
-                       "121534b47d16f75b55fdc2a5e2e6799f8a2f8000d4292282e56863ae422a" +
-                       "5779900ad6881b78946e750d7777f33f2f013a75c19615632c0e40b98338" +
-                       "1e9b8d35a26abe30242c45662eebb157e6d7a8a5519de60268ac289b8295" +
-                       "5d4feb47b9eef6da65031c6f52c2c4f5baa36fce3618b6a331f1e8bdd621" +
-                       "48954fcf0846afeeb0a6cadb495c909a7fe671b021d5b0b4669961052187" +
-                       "d01b67d44218471bfb04c1a3d82bf7b776208013fc8adabaefb11719f7a7" +
-                       "e6cb0b92d4cc39b403ceb56bd806cbdcc9ee75362ab4aaeb760e170fdc6a" +
-                       "23c038d45f465d8ec8519af8b0aad2eb5fae2972c603ed35ff8e46644803" +
-                       "fc042ff8044540280766e35d8aaddcaa81e7c0c7eba28674f710492924c6" +
-                       "1743da4d241e12b0c519910d4e31de332c2672ea77c9a3d5c60cd78a35d7" +
-                       "924fda105b6f0a7cc11523157982418405be0bacf554b6398aeb9a1a3b12" +
-                       "fe411c09e9bfb66416a47dd51cbd29abf8fbbd264dd57ba21a388c7e19e8" +
-                       "12e66768b2584ad8471bef36245881fc04a22d9900a246668592ca35cfc3" +
-                       "a8faf77da494df65f7d5c3daa129b7c98cef57e0826dee394eb927b3d6b3" +
-                       "a3c42fa2576dcc6efd1259b6819da9544c82728276b324a36121a519aee5" +
-                       "ae850738a44349cdec1220a6a933808aee44ba48ce46ec8fb7d897bd9e6b" +
-                       "c4c325a27d1b457eb6be5c1806cd301c5d874d2e863fb0a01cbd3e1f5b0f" +
-                       "8e0c771fca0c0b14042a7b0f3ae6264294a82212119b73821dcfbbfd85bb" +
-                       "625b6f75e4dc0ee0292ab4f17daf1d507e6c97364260480d406bd43b7d8e" +
-                       "8c2f26672a916321b482d5fa7166e282bfeed9b3598c8f8c19d2f8c8b98d" +
-                       "f24c2500c8ad41cd6ed3f2835737916d846f1a6406cda1125ed7740fe301" +
-                       "d1144559b7c95fa407599ae40a795226513153f86c9b8abe7d8aa6963c99" +
-                       "5646ec586cbf20a03a698cc0681b7bd333402d00fa8e15cb32300b5a24ea" +
-                       "316c5e1df67de78891846cb9183a4b112c3bcc17bcaa5fecd6c1dbbf6ef8" +
-                       "272d9269e7f0ba9f17050a6aa5f11cb28874360396ab647941f2c9a85cb0" +
-                       "6a969919b16997b0827af8f909c614545f1ad638ebb23109f6bab6b49b22" +
-                       "b2285cabbb998b3e1bf42771b4d4e52330b224e5a1d63169ec85fe1c7dd2" +
-                       "46dbafa6138448420f463d547a41c2b26026d4621b854bc7786ab3a0a93a" +
-                       "e5390dd840f2454028b7c3bb87680f04f084089bbc8786ee42cf06904d01" +
-                       "7e405144d2fae141599e2babe71abfbe7644fb25ec8a8a44a8928ff77a59" +
-                       "a3e235de6bd7c7b803cf3cf60435e473e3315f02d7292b1c3f5a19c93646" +
-                       "3cc4ccd6b24961083756f86ffa107322c5c7dd8d2e4ca0466f6725e8a35b" +
-                       "574f0439f34ca52a393b2f017d2503ba2018fb4a0991fddc1949832d370a" +
-                       "27c42e",
-       },
-       {
-               key: "d18a328b63a1d0f34e987682fe6ca3d48b4834b4312a17e99b3d88827b8d2238",
-               tag: "938b43b80cb3935e39b21dd8ba133cf8",
-               in: "bc2b0baf92580ee6c5efe640f2a029a791a3c77bec459be74cbc30931508" +
-                       "d9f312c3a0944212831cbe4fc92e8f107f2f750c91bcc09f7624fa9a09b4" +
-                       "9b7712cf5d619ea9da100fc23068ae2f4e353047e3956b215884bdb12235" +
-                       "3f06b8ee98f36c3212493d61ae9ce151cd0453f3075b18a12d7d73da3de7" +
-                       "dc2d98376cfb420069ca8148c511ca6bbae57572394a3c615a6fefb30c5f" +
-                       "d727f964b4065ac9ee252bdd2bcae3e70162fe0e8069974e073f0a093d45" +
-                       "be52d7de16a8f5f65c548aa6525822ffb00dc642530fedf355f7188ef017" +
-                       "56384760c80afb61ad903d10119a7d615ec4fbdc79c490160bdeaf200915" +
-                       "e405f2a921a2380c0ab9d2ac1e4fdc8ec4b907368c004458598efac13dc7" +
-                       "2751e7faded538e3dc8b16590cac9b7ec294da0ad53e22cb9c05d8ef494f" +
-                       "a04f6ab7c843c867fbe3cf1b4eb146d65339b0b03392259f12627a8e98e8" +
-                       "0f4896c30b8ecd210acb2365539a872541921dcd8e1e54caf4936dfc7e1f" +
-                       "68f3bbce61d325b447a8cce7f0fcad28494f2e47dae46b136594b5dfca7a" +
-                       "bdafd6856f91496c05b21079aa55aa8c41628220a2cf0cdd755893375b7b" +
-                       "b13d914c9a1d1db4a18f8fa36c55e52d0342352052032fb62d32fcd51cb1" +
-                       "ac46f44b06e682db5d96d583cda03b966c650c03ae53542e8da1066b6884" +
-                       "4a7e2280c664415e413f270b1fdcfbb40b9daa6131d071ee7eb1553dc5b1" +
-                       "a50677971223dc316d2d326d57cbd529c88698facdca425e2d5c6b10d7ae" +
-                       "cae28b8890aa44ede9b9193dbe8d1d8aa1fa580ca384b57eadcbefc96dd8" +
-                       "bfccbe3b855a96f1fd4913035f817b75954ef1827c7718aab24d353e41cb" +
-                       "a73748e14e0c2750d5b6a9752125708cc7ee7a498c7fbadf4186e7f8fa93" +
-                       "bfdf281a49400f877621651b8ba87edda5231e80b758564e75139b61b1a9" +
-                       "9fb9ec694f928ab1f47c6c4287bd4182d1b2be053380616e98da06f3ef57" +
-                       "b570ade17c51da1d602b6ebc5a638ebde30d99bf4f91d0e01557c7dcd8f7" +
-                       "9e5120143c935fc699eb5616ccd3cac56b5f8a53ed9e6c47ba896bfefe71" +
-                       "2004ad908c12cf6d954b83bec8fb0e641cc261ff8f542b86e62d90e227f2" +
-                       "a5bd59c9d390c0dd857f6da2b7624787a0bb31908bae84896890b283da61" +
-                       "d8ec4f56eea38b22b438d6374b42243f9c1d94288874e53ab90c554cc1f1" +
-                       "d736acde67aff55007fd4b3becc4d0f3ddd96f10dc75255cb0327aa47076" +
-                       "2b3a3a656e33c87b02a682658b6cd2a75d9c0462803c9bbffa51441501a0" +
-                       "3a2fbb2344aa13d27ffb9e98704ea6720b6a9992e53449688cd74d0648fa" +
-                       "e8e776b0ea6bf048b2ec05341e5948cab0af015328b284ae7bd89a5f763c" +
-                       "eaf5ca3e647a9f5bff7197e4d357e4359fa5fe30709545453149be510e3b" +
-                       "ff86beeba5110c79c0215fbe9ac9339a8ac7d41f7488588ab14ac657aaf7" +
-                       "d5c03a353932bbb2b261f0e83f3526c5e8e0c2348a10ab4eed6ecdcf9014" +
-                       "7550abcb0a722f257e01d38bad47cdd5a64eef43ef4e741bf50da275720a" +
-                       "0aee47adfc5cd2534b911dc269197c3c396820b303f6941e3fd85b5ed21d" +
-                       "6d8136745c3eeb9f36b1f226434e334dc94be8a5606079cb7643136aacd2" +
-                       "da9c38b2eb7e2b898bd8632003767bf0c87d00a3c2fcee48bbbcdd949af3" +
-                       "3455128216709df25879b0ce894ac4f121dfca6b8c7865002b828696641d" +
-                       "14ffc59924fbda50866fded0afaea545c8008c564a3a0b023f519a9980ea" +
-                       "d541d91d1c07a739fd02286ea5660e473f80494236a68e84ea31aad71348" +
-                       "e45055ded69c39941e31d51df257a4d0b0d8f025dbedee093f2b91795bc1" +
-                       "533dc472020769a157a187abd6d8d52e1693e2ef56b2212759d0c0120e54" +
-                       "c425d0084fdb3925e296dd6cdd8e677043a90674904057d88ebdea5998aa" +
-                       "03562a790adecc4399352df43e5179cf8c584d95ef8e4b37295946b1d37f" +
-                       "faf4b3b7b98869184e42ea8b304fe1059f180ff83d14a0861ca7c0682c34" +
-                       "b48a70df8653bd8d9a26f9489e1271fa44e41b392e648d0e619ecdad2c53" +
-                       "952094802eeb70ade4ffe096e3049867de93a824217e31364b18204e9681" +
-                       "dd8e84ae2678aad155b238f59dd9bf9ce07e97183a690b2a46a8f3624843" +
-                       "5b2f713e7d8dcda4dea1e3c4cf9692dda082322c51f7bb1f63d92aa987ec" +
-                       "cf1355a043e21a7b8d60a2b97f18487f6fff4c77df92dbfdc9837540c518" +
-                       "9fd9585731bc6e726a34ca21154b0499522c9d1016953dd0fa2eb6a92b6d" +
-                       "14d6e3da5c12fabe92bd639e253983fc91041091791643",
-       },
-       {
-               key: "46e8eb27acfdc8f4be622d8741c7bc414464c149e21da97ab4afbf3e07b98b0e",
-               tag: "56b5f49be824c7a19b19faabf0787a87",
-               in: "ced52b76c057872a60107194b432cf04b7be05e65209045d2952ea0284d8" +
-                       "3e2ed5a15cfdc58071204573c18ab03765b4d5e63a601419e039c42075b2" +
-                       "7ebb2827de9c6233d6632e6d3db9140bdb4a9291d53f33734c2dc8e24df9" +
-                       "0764dc10e0d321d20fdf659bfa2a81bc9e04fd0f83448143276647c08bfa" +
-                       "dcfe3bc23898eda655c9353693ed7b022f43eefa23c21db7660c5029ca64" +
-                       "a6085d93029ea6c43197356f56b7624d4819f5008d053357d981ffbe7f40" +
-                       "96d6c55d8417002d36189b04bbb2c637339d90f4910a400833a8d422d88d" +
-                       "c816c1636e8d9f7f926c244a28d9e0a956cec11e81d0fd81d4b2b5d4904a" +
-                       "d1a5f55b5ec078dcb5c2bc1112bbfd5efc8c2577fe6d9872a985ee129e5b" +
-                       "953e9cebf28cf23c6f9c6a5e09cb09ab586c6a50e4389cd3110777591d7f" +
-                       "0608a3fd95b99f6ba03984fb0e13c6bbbde3668c59f2f2b69d7caadffa94" +
-                       "6f67e725d56280e59e66dca025a18d4616e81abd9801835bd94485bb2025" +
-                       "dee81fba440005b181ee81dc1d7796cbec92e4ec1c9016c8e8073cf281ce" +
-                       "f749993f09a618a4671d58b476feffa454600f82955c591882715148a826" +
-                       "586f68bb50059914dce1c1c85e5e3951647c9964ec9316005209a58baeb5" +
-                       "2c6d01e6b4c275c0050a7e2bdc52133e433b050a700b556d4314e5c041d1" +
-                       "93ee47f47adc971aed1b63259dd5cd4f95854a71a947eae3d3d12d0d7b52" +
-                       "c6cd2fef2d2e892607a9681d73ac3236fad21ee30a4f857010bc95c00d5f" +
-                       "6f0c6b3fe50cd6452be6eec4f5f01542dc2cb5e2db1f52224f11348fe2a0" +
-                       "5d1e5885f1317f2d06ce2813dc4c723008e836a2ee95d0aac66855fe4c3b" +
-                       "1b2e02ba0700be759b1ef1c2a3123ee4ccf9200d8d4de5e0d503f04c2053" +
-                       "66393d1e91b648392ca28389d976aa618b4796acbfe8aa356ecdce1f7786" +
-                       "bf09af226bb9402317b6fa319bbb9248d8ce00b1f49f066c69d4df93266b" +
-                       "938342cd7fd4b07c320c2409ef72d8a57c21d0c6d6d493f7ca94d01b9852" +
-                       "e4fca6a9291e9060154bc38af6c86932645f53914709fc90e11db56ec471" +
-                       "6d600ee6452041248ea8244f79534f793bfc1f2020855d817cb4ca3c48ea" +
-                       "7f6441ce9af9bda61936c226d810086c04a35e8654fdc30d4b35701adccc" +
-                       "016d5895b2121ba4066e44d694f6371d97911786edb73dc3020ba186a01f" +
-                       "ee3dd6036c0e205a8d05979bad228fd12c0fd2fded6c7f1e4c11354d266e" +
-                       "d9c2f706269c43cd90504997d93a17b39b10dab0ff083ab3bd06540ce612" +
-                       "d08f46ce75a16ef330525737410a0d98fb3d484968f9c12edcaf50103fdc" +
-                       "c14128ea4ad6c30b56247eab28197fe617e5f88afa5cbe003c63d423647a" +
-                       "d3042626fafd2084a0582ff1b1efdb5baa162662048019546234e2f6b6a1" +
-                       "d8bb971114aae41df7795b4f3598f2af9e8921a9aadc7fab6c780aaa32a3" +
-                       "84865a4ccb02351dbc55ec92a3152d1e66ec9d478be5dca17b4a131b4a0d" +
-                       "3d4420fc6123fef80fd56ca266407d58a7880d6b7e5ce2b6bdc9a3721071" +
-                       "7feec573d83c83a2e3f7d4023f2f68e785cde728fdbf5054060e4c89faa6" +
-                       "1c9dd10524a08811d15c627b3b4ada549a3fa1d8dd77c005daaf2addeb10" +
-                       "0abf694da8dd692f113965cd6366a5a7b0c17e1f2a320243e2c90b01418e" +
-                       "22426d0401a2c8fd02cb3129a14fdfa6cbcaa1f1c2f17706e9ac374a3458" +
-                       "777761e986ee4c358d26f8e420d33230d198fd86704e77298dd4c40c5205" +
-                       "7566ac0cd92993b21937c3a3b4a8b89110a97cf38c781ad758bdc28f3565" +
-                       "60cf3acbedfa8e05b396d226ef619746e8e4fa84c8e00a7f0e6d652808c8" +
-                       "9c9b123d9bd802624cfa949eb68af85ca459b9aa85b81dbc0b630856cb9d" +
-                       "7e18cdc96b3c069a006dd5b716e218a5ed1f580be3e3ccf0083017607902" +
-                       "a7967a02d0a439e7c54b3b7ca4cc9d94a7754efba0bb5e192e8d1a6e7c79" +
-                       "4aa59e410869b21009d9443204213f7bceb880ccf1f61edb6a67c395a361" +
-                       "ff14144262b4d90c0e715dbefce92339ff704cc4065d56118624a7e429e4" +
-                       "cadf0b9d2e7ffc4eb31c6078474a5265beba0774209c79bf81a930b302bd" +
-                       "0f142534a6ae402da6d355a010d8c82dc379ea16d49b9d859a7de4db6e62" +
-                       "40f6976ae0f47bc583b327df7ec88f5bd68f713b5d53796e72e28c29e843" +
-                       "6c64cd411d335623ff4f5d167f3c7b8cba411e82f03714662425c8e1bc1e" +
-                       "fbf435d28df541a914a55317de0ded8c744a1c3a6e047590244b207bcdcb" +
-                       "f4bd1f9f81210deddd629192c58e6fd73e83812f084ef52f21c67bea98ee" +
-                       "17554437d9642e2e",
-       },
-       {
-               key: "b41210e5ef845bd5a8128455c4e67b533e3e2b19dffc1fb754caa528c234d6a0",
-               tag: "72c9534aec8c1d883eef899f04e1c65e",
-               in: "7eeca180bb20d99635e36b9208221b2b8ef073fbf5a57f5190e19cb86c49" +
-                       "89b0e8150d22ec3aaf56f6ed9cb6720284d13a4b0a34cd3d7f7fc7089326" +
-                       "6d1893fa4185269fb806677ff490aec8f889896fca50d6c80d295875b1d5" +
-                       "4a779b6d49305360b31011b48537157d0f323ff4e865d46fba6bd23a06c1" +
-                       "46878cf9404360d325432312ff08ce495edca63a3c93c44d79c050e3f1de" +
-                       "4b6ca5fedbbd43dbdef9ceb26d440a59c7e0be3a8e461c4f15b6b1e1dc36" +
-                       "a71fc723ad593fb903e83d0804ce497fc49bfc6b6a602b9dc6e9891010b1" +
-                       "4ca066cb1c68044c1ad837c638076dd3708078509cba49fdc54922cdf5d7" +
-                       "715fb43e9b5a5942cb8950eade143577bc9dcedde58d51deddc70075e452" +
-                       "bbceab1e95b5d003eb96bea69687faa6d50d9c605769cb4287b5d9924dd6" +
-                       "8881c699abaa6f93e41dac7639cdbbbd0259099a3ed096f482a1fa322b15" +
-                       "ffc379812c74e09e95f1bd3706347eac421fe56895e738a47fcd3e118773" +
-                       "c3a7e7e264cc7ff5a53a80e436df058265dab9756fdf6913786a47e98bbc" +
-                       "411052d58ffec9ee948e28cbaadaae471c5d828eaf3b3c87d3bfd495477b" +
-                       "403da54f1418a15ace0d4d0df68f6a8f2b0457b127d5eae1f45ae055afa1" +
-                       "8f058d5dd7eea559de3ae9378ca53f7d6dc9a9465ea1f945295f16ee0404" +
-                       "7fc9dd3deda8ee32631d7af70c20edc1e12c5f8abd2e78f43dbd4cd6407f" +
-                       "038efab144a24ea8a090a7ba3e6499345a60106220c2959a388e1a73d070" +
-                       "1d854bfaaa86165a5aee934b615ac7f45da7c43a1e8f74613917ed10dcd2" +
-                       "27e4b070414412e77851db5bc053e5f502bb4e2b2645bca074c18643e814" +
-                       "4caeccb58be49ea9a552913c0616382c899635eea79a166988c206b9aaa0" +
-                       "977c7ced89c4c7aaeaa8fb89b38030c44530a97187fda592b088198b63a5" +
-                       "2dfad59a0a4c1aadf812bdf1881924e8b51b8fd4dbca8e73b2986b3ab484" +
-                       "171e9d0cbb08be40ae60de8818bd7f400191b42c7b3200c27643f06720a7" +
-                       "e0a17441f34131629388ac43955b78c31ea6602a70dd665f872e7669e865" +
-                       "f6f40e634e8772d747608cd3a570e1726eb1ddca64f08582b022bb026eda" +
-                       "6a913dc83f174ce3c18b9fc0503d3ac74e2fe45691d6dfb4af8c86d752a1" +
-                       "6d6664fab4de08afe8858392fcc35cb9ea82fc42c42d48c0c0556267ea0d" +
-                       "cc19b10f05e0318c4488ffe704b5036908f5cb938eebd3163503acaa874f" +
-                       "592d945448fbeb93a877a26a72306a36e181745ba300afdc30cb7986919f" +
-                       "3dbdc5c47ef1fa052a9e4aeeda3955f61ce2f30a0593a81dbaffebac5a49" +
-                       "e5a8d1308352701d1ca9e620a67a89abdf5f0f8b1a0acfde5819981d4b77" +
-                       "58799c0fe41030b86754837712af821c315301aa8dd50d1387b9fb92ee63" +
-                       "10777e08229edd54e5e86b086ac281bd321082ef46ce298a6211aaa3aa4f" +
-                       "6e55b5a4641220ec94cca73087760da1b1ac3e0da3f438214e691aa184b0" +
-                       "535950b715a64d11485940dcaa3f72e0aa521002b1443f5e7880e2a85b83" +
-                       "40d32db0fc4c4702e10f0fa24a35da9307850e945f608ad34d6cfdf6f2b9" +
-                       "ff4f6b8e9eb5a883546578e2ff3cc5787322e4384640f42dc5bd05f432d9" +
-                       "610dcf7c06cdf34762dd2a5e805e24aee8cebb3b4db9e4d1471da995bba9" +
-                       "a72cf59ea8a040671b1d8ce24a3dce4fc86d2df85c8ab5e1eb2b0567c186" +
-                       "4fb464f48c3ca72c7df2749542ed4d4be51b63769012ce3d06356856b2a4" +
-                       "24995a2429a156ad93bc79c705e7b163149ce53a42c34a19680dfe4fd0f7" +
-                       "fce38c30dffe9da9bc941d131f435c1398f8284a230e9d6e3992710074c3" +
-                       "881d03aa309a9edd0fde7a39c33f6455dfcc5ae3fa20ea0e0d6549a43536" +
-                       "b4cd8a2991a135b7d7a4265fb840318813091274414108f13fe191db7774" +
-                       "6a5f4270f6d51a29ff523954f84cb76131d4abee79161dcbd97dc1ef24cf" +
-                       "db1fade057dddee00a1e0de0db1afaeed1b535f7bb402afa3b297551fd14" +
-                       "8c8f3e05f1351d3a8ee2948daaf14e7fc448c4670c906ae076eac5a7c656" +
-                       "fd5f9cd937b91e26c9e5adb43c138f8d65e447b0022a524e059f879c6e27" +
-                       "4ff7e671f75717233aae70853d5bd7bbb41b43c47bb08d6dc2f54f9ec606" +
-                       "9487d1267add72403d01552a3d138abab9ca8a0d2dc32439759aa5695f70" +
-                       "1a17d28dfb85850fdb55fddadcdde4d220e4b05821e5736d346e7dc9c945" +
-                       "72743366488b1de8975184771361894b6520e3407c5c2e38473430969e35" +
-                       "b106024da8618665d58c9d084824a28991a33658d6ec702139e01b65b7d0" +
-                       "cc537a644caeee880657803d95f5f67816948d5ab362922f8ffbd531473e" +
-                       "b0ff8fde2afc37a4abfa28dbed0be1b3d4ed48a1d02358e8403905d33b12" +
-                       "3066e7a9fe2491ee9eb24fc9de7dbd322c8ddbc5ebcd0d92cd102ebac96b" +
-                       "90e2fd784fd6d4b699304df23b17d963080a013794322690456be525c071" +
-                       "b78fcd2d1148026e44ff14c4d0f942cd44d2b3263f4a93b79ec7a618b4b0" +
-                       "d77ae7a1f6e6c7c7e2f498b825bf1954df348bae45ae1d7c87b6787f1212" +
-                       "60c9a724429a4a2491ef989f65acfdc72fa717486dcf1984905218e11cc3" +
-                       "970a09d71061e6df751f100abfbf",
-       },
-       {
-               key: "d9b0dc303188756312c12d08488c29f43a72e78714560fe476703c1d9d3e20c1",
-               tag: "6b9782f2a09b59653aa448348a49291b",
-               in: "dbde1820035997dc8a8ff3015b4e0674e7ce7bf0c2d994b7977f2d91b49b" +
-                       "f200995040daeb1218a0f4307b6b8211913992b070d321bdb947b4ba5017" +
-                       "a0885e7e5502710a75cbbcb56d49e1bdc2bc2afa5a0e83851162dec41340" +
-                       "bafc41c5e11fcbf4ea2ac45bc57def4742281bbf734777f83c9ae1ea3d5e" +
-                       "d42380230570f59c40d5dd9a2d89b75fa3c92664f12a274d965ed8de79a8" +
-                       "b37f3763939ad21d1703ad794f617c8b32b20cc4dd7c1b7f969a65e1bafa" +
-                       "f6c43f30c9eba256f10201910e2cc31a9b13a46ad29257024ef8f2ee29b2" +
-                       "ee63cc5b6230ab9f87cd5cb534f4b0bb08a790466e0d57b849fffa1ed21b" +
-                       "fb0b27804e3ff9df7bebf14e100cf91691a493e53870abfad6321f6711c5" +
-                       "0fbcf1f0b2c1e5231d6c0a08e710525176355f6f82bedc1f787f0d3cb41f" +
-                       "a11e91ebf9f4cbae46035a371232d63ef0d8bda0355af8cd0a2f7d1327d8" +
-                       "0ab769ea0f1da0f76ec99cc737b5ce84675fa8a9ac0c98342bb82b5848bf" +
-                       "656d35327ea01a1b09d84ab974c307511af68a30cd6978b529a8f58c68a5" +
-                       "9d476062ace8897ec0d1a90d5d167e29ebaa6f46d93d697760c8771417ce" +
-                       "94c0f3698985a98702833d1b68641b811840ca3d935386dbd4600fbc81c8" +
-                       "728c4fd0e4588be739a048f03bd4ac651ceecd7e2fb120fe7190011f957f" +
-                       "cbbfdc025f1ca0b356208db8cad87fcd53c5d3a30a7c2a48140ccd4cdb49" +
-                       "f3961cef742caedd1e848bf3cacafb0da030416bf3177877aa0bc5f9d1cc" +
-                       "41fafcb829d5e3ace9394028683d712552579e024084a6b855830ad9f567" +
-                       "ff58f05d3ec263eddd6f56adec378f167e8dabbeaf7d0a9e65c71660314d" +
-                       "6c8d54beeca2711113fbc32a2ff8c0daa8373278d10085d2a0660ad53f4e" +
-                       "1ade74a483be180180acf9e9ad3ea5bdd9162ccd69599163a451c6837d5e" +
-                       "a5e115bd9a560f395128ea002ee739009a44fa46078b18959933fb6e866f" +
-                       "eb4612a56ce93b1affcb95fccaa18d71a148582ba1412a5daa07404fcb39" +
-                       "c3cb4a2519cc506c1172c6c326016ae2e5410f6a438569f35a50d45cbf3c" +
-                       "c46188651aa22c257858f60649cee8c05c75953ce49358dfe5980445fce9" +
-                       "614ccd16d333ad236e29d204691ca0bf46f29da954bcaae52e41016556d2" +
-                       "f4cae1d37565bcbe84de1b49f344d0200478a38187da29c155cc98184d9d" +
-                       "33dca088d70054e0fce321f7a90c48a14963d0ace2b4e7a24b21c14a5e67" +
-                       "1994fe1f7d22d1135d4df9268dd18d323fde3603288735626a5449582d35" +
-                       "30e2c2225414e05a8c7b987c873a82e272a5d83e59b90f3d7264631d6ad0" +
-                       "4a0cf3b5e96596a66ed5bfbc24ab6e4870aeec0acbad2cc5affaee06de32" +
-                       "dca06f175bf763cf8e7fdf95941a177e934f0078be7dbaa4c9b6f5c16b4a" +
-                       "5607bab5d56144a6ba3c7d9a084b8d1f4b24b6f9754ed207b230d3a2cc26" +
-                       "259ccc725e1f8a44c4df8143e13edb5ebf073e2c9d2da5f1562df4feece2" +
-                       "f6480987f093f642eb7afa3aa92dce2a8b60bb925cd2d11cf6c2ae7d2153" +
-                       "1a9c8f068d71d0e682023932fe64e956a49347aed22b21084c4a84480491" +
-                       "244ac6b337b6d12d5551ad5684766c68bacca62bdcafab6603c81bdbd8e6" +
-                       "80d9d8b3825eaea4df023142e840f98ee251466a0422d810a54726a9f03a" +
-                       "7e0afeb0043e60e2ba4908f951d2e87fcbc372096f2a9f4f2a95ad5faede" +
-                       "3796b11ecf4401c3ee3d268bd8c46476c61e0ffc5c43c0f3c58c79e20f75" +
-                       "520c102aa3c260972a870fc50f8841fa0553a9e30bf37ad282fb51b34adc" +
-                       "7a933ca1691a8a706605ce0b906fdccbe954f8e5f2f63c42599a483c4be7" +
-                       "3a041ef90ad930fe60e7e6d44bab29eebde5abb111e433447825c8a46ef7" +
-                       "070d1f65862b30418efd93bfea9c2b601a994354a2ff1fc11c383e7bc555" +
-                       "9e7546b8bf8d44358b1ce8cb63978dd194260e00a88a8fd17df06373aa80" +
-                       "04a89172a6051bd5b8cea41bdaf3f23fc0612197f5573f3f72bce39c9f89" +
-                       "faf3fb48d8ca918586d4feaea7e0f2a0d7a6afca096a081af462ea5318cc" +
-                       "898a9cc09e8258a837559570cbd5eb901e8c0e04ee88ba31c81a76b000b8" +
-                       "0e544feba576b3eb5272b53e46e96a0b35b9c759caadcec61444f8ec47c3" +
-                       "45a1d2304e2708eeddfbfa75a98eab3493889047d690e84431d445407fdd" +
-                       "99560c0bdd287e0944116f8ac62ab992ed3f1e2b415aea784b03c6904795" +
-                       "f4326ff60bc839615f2894570dc9c27cf928ef192047528a1a19ec990978" +
-                       "3b0d1a13dd4baf4a19e49bf798975abe2ad167dd574b32b3d0c22aa4d9b5" +
-                       "2761e8f56cf2100fe5a39fceae3d865f3724d4f299d07ff899fed6baf7fc" +
-                       "eb7189357bf56cf94a6493e61301b43e3ed158cb9c7a0e615fd9888c2db0" +
-                       "7f7689762f62ef6b3ad4125e06b07a422f5040c3aa8b8f205d68356c9225" +
-                       "56fc4c976165fed9599daeb297498ecf744bf6c7dc5e30604c461ad99402" +
-                       "2eea0fb6fe33f82a97b5c272fd24162a94b761ec7e52173e7bb42e88b343" +
-                       "64f5fa2c141ed04a86b8d00fd9c25bf77a8dc3e63f5543331405be6bf421" +
-                       "6a891089b316aa4f887cb4aff0dfb4e80c2ccd65ddd9daa74b17b4411c0f" +
-                       "c849dc748d9b138279dcd9ebfc6e6759a53f5c28a41bb82107d71cc161fa" +
-                       "81291a8290",
-       },
-       {
-               key: "fb70ae7ec12264ff9f51124da188e5b11dbf53cae2671363f6054b575b1ddcc1",
-               tag: "d9ab81fab28b3be96fa3331714e78c9a",
-               in: "c62edf20b1d53962b42386eb570b10378f9764421ecbd7c4802853332747" +
-                       "19ff4c89c06005050fa9ba6579a844060eb7ece6c43bab520e683e0f36ba" +
-                       "49cba259edc6ae35d41e0d7812a7d5edbe4d90cd5e0504d16f4c3f70d01f" +
-                       "5a0313de55934b661ce1ec317968c2c4de60f45c66cded8c10565a1ca6d2" +
-                       "3a84bf182df2fcb05956ed4d46b49fc0fe3bd23961d9466fde070341ce41" +
-                       "bc6e148449360a31634fe10e91082d82def90d9da2c250ea72c58add2058" +
-                       "d046b4392b78bc3af5b3936ed568733e8ad5672dabbfa3130a6a535ec73b" +
-                       "da8e7223535f49f96cd35d56ed4792c5cb7076720d5461d96a2692b2ada5" +
-                       "2be08fb7bad15d15a0108143790024f0f15f5adc275e783aa56b70844061" +
-                       "e30952a040e4cb9650f2a010417812790105d8f58bd25d99b0db3cb16229" +
-                       "3f6322e86cd5b0bb1505a7b998fb0f81d1e1915faca3c2c8ddea39115507" +
-                       "80339430a7955521839deff5b301f3fad54edd5ebd2ac4ec9b1795cb4dc0" +
-                       "e2eb62ebca8e886c3f1e507d10a0228c3027b472a7104b815f5ec8dae55e" +
-                       "0783ff7ae9a3e6b99e381ad788206b135520cb870ba0cdbe876feea843b8" +
-                       "5a82adc95a6d71c555f798da92b82daf0abfcdbc82ec30b1f12d78490b06" +
-                       "7315735017a94ac150b44dfaace151896f873923310ffcd41e91bac04de6" +
-                       "d70ea71565948c907ab21c4a23703fbbd2a8de6d3095f3d8f901538968e3" +
-                       "60e7bfddb9d22036b1c23f4f5f1b2ee22623426a2d5de68c1e1a38e38e08" +
-                       "e2b5670aac1edff69e9c73c2ca56cb69c709009ef1d541aff1fdb2b40c92" +
-                       "9b87f162f394b76cdbba1f5605993e4dd9c312321d59b0aa5c6e33be1b10" +
-                       "bfd00b92d4c02db064d0e4a98f2913c89051b0f0ead163deb5087b6466d9" +
-                       "84f57553b0fa53850eaa142e072fd91802eb9f0d2eb7318dd620555e6ce1" +
-                       "86706b866d41cf6ba81f100342faa14d801dc6f3d522db38fab17a879fcb" +
-                       "b6acfe922163505bd23a6842f6ef6397ae5fb6e6016421998bd43b0142b0" +
-                       "3ca3b16d6ccb7a47891c75c687d791a930b26aaa2e3412e7aa16e2cf1501" +
-                       "7bf6df6d2e1c289af0d7ce03954a60c1dfcee5e4b3da51eb43ddd14faf59" +
-                       "082005d0c8b104561f66c002ff426be60be769282fc5685cfd1968df1941" +
-                       "73667e48e9ad681d35757f1199f1d93377bbad093c8cc3efa2bcb6ecb703" +
-                       "694422772d15aaa58cab9e9ab277ed510f684114cc4a44ccadb3eb1c9a76" +
-                       "d8619a9b7743106df6fb6f927ac49b22ae5bb9a9a4d231e340a2cd0e3282" +
-                       "53f6d75df694826f60e4b3e758398793eaf73ef5d4b56cd1471e16400f40" +
-                       "4a947e9737f4f874fe09a29ad799f4525156e3abbf0585c3c3c0a3744c86" +
-                       "5d56db3d2ecba6bcbb1adcc8bf5f3b2a2d46d3eba18cda55201598a8112f" +
-                       "d8f14e205f0e615f081b8ff6c5aa6669da776bfc7c34d5af4d0b26d0d819" +
-                       "f6aacc53cf3c6653138b9a962acee9d6ea01d280c35bb1f05d1509238ccf" +
-                       "004c5013167f804d1780d9f4ef9d45742fccac346b0472bde24ff5db9ae0" +
-                       "16455a3c02256358fcd8e6a9aae94f8a37a1a3da58a889bbe3d295e16544" +
-                       "2e580f59bdd31c92ffcab40c49c1cdbb4db1dd4882b66edc10fcb1704203" +
-                       "c518c1d8d4c268588ce13fc38e0210aeb47d11d2603d4b3de5c6ff5e969b" +
-                       "9d5904abb282b699bd04a6e9f1cb323679e30400d725aab128a032745dc0" +
-                       "be05a46b02b34b93bff02523cd8498c021fc35a488f164a70ef1ceb873d9" +
-                       "14a681d3a3a34cc76bfd5a547e2630d7741a284511bae5897d9f7a197fc2" +
-                       "456af5c6cd7e1a93d3388c7a990b5feacd7749cf39fdecdc20adfdd540c6" +
-                       "9d330195db7cc0d4555ea5f5356a3647e2265399f153c34ed1e217c5dafd" +
-                       "c2c5dd3d566c332c7ddacb0d76ecd3a0ad505a4165443aa81b0f43cabfb4" +
-                       "62942fe74a77c22b8f68a8b1a6d712d1e9b86e6a750005a3796ba1545396" +
-                       "13170906d228dabf572ab969c762f8b296054f23d5d4a37bff64bf9cc46f" +
-                       "43b491b41101256018376d487fe8097f1653a7a9e99e1ef2492600598fb0" +
-                       "bbb7df8270be8b9106126d6f491f8b342a96ab95df6133e883d3db4c6a99" +
-                       "402aeb58d371263a32dcf76d33c8904395b9cf0016fdfc15608eb43e20b0" +
-                       "99cbe7455f7a76f69bba058ef96f83ae752587485657f89c7f26fde7fbeb" +
-                       "a82ede581ee92821dc13b8202930aa58bd4f1c86f68926baca0d06fee642" +
-                       "ea8c652d226af91a9638a0244f1a03c7ce56969b87cd5c1f86110d192e0b" +
-                       "98dd979d74acca6c1956b1127d9a1f456053d17974081ed8ced0faa4293a" +
-                       "319e5b25ba285c1151214f52c283e39c35af51c4572c8e395b7856697bfe" +
-                       "dfc4145ab4ed0bdbe43ba509c06a196ae6bf30d7582550cb546c63b51833" +
-                       "cb0dfff7196d83f6a1c6d6d712cce2ec1989fd9ff5a0a22ac5022b49d566" +
-                       "58f196703e4809e7624fe7cfa6c13b378f5aac7e66e657ed7eaa942d1a00" +
-                       "544a947199f24d736b8976ec2cfb563433c49ba131bd08b63636854219d4" +
-                       "c45100c98e3092773ef492dd9210bfd8f54cfe2cddafcf5c05468d90e620" +
-                       "0c2ef99d17fa6992cc45eff3072b7cfd51cabb07ea3019582c245b3ff758" +
-                       "0302e88edc2c13fc43646ba34de37338568baa66ecff3accfebad88d143a" +
-                       "fd1c3b09ae39c501e3f116af33b0b720d6c2baf5acd7f31220788b2f9017" +
-                       "3ed7a51f400054e174d3b692273fcab263eb87bc38b1f486e707d399fe8d" +
-                       "5a3f0a7ed4f5e443d477d1ab30bc0b312b7d85754cb886e9",
-       },
-       {
-               key: "f7e7affceb80a0127d9ce2f27693f447be80efc695d2e3ee9ca37c3f1b4120f4",
-               tag: "41c32ced08a16bb35ac8c23868f58ac9",
-               in: "5a3607fb98eaea52e4d642e98aa35719bfce5b7d7902950995f4a87c3dc6" +
-                       "ad6238aadc71b7884318c2b93cd24139eed13d68773f901307a90189e272" +
-                       "6471e4bf9e786b2e4cf144764f33c3ac3e66521f845f6f0688f09eaa227f" +
-                       "e71033b0f74295f6ddb91fe741323f2b54f420cb9b774d4291b06219f1fb" +
-                       "4410b55900425c5e6fcabec76a5c2424d637a1641db6f0f6cad564a36a91" +
-                       "0f49894bfd598e91f38ceea65e8253c1284f210cf7b50a96e664e562f3cc" +
-                       "01c4fc490fa6d4679fd63fbb3ed8995a8a05166b573e92d22ef4370c6aac" +
-                       "74ae94c94177e5f71143c6f340efceefda679ae76f6ed7f26eaa4848a8de" +
-                       "8c40894316efbb06400f9695b18ba279e8947c032a84a40ca647d9ace457" +
-                       "6dd0082494d6bd7be4e7928e749c78110af8774a5d43e9c9479964e2fddc" +
-                       "ee51146460eac734311225d08c60706e40f298a7cb97f369ef599be097ac" +
-                       "3bf1c275497bbd68968a235fdf8a61bc7cfeef0fe451bb04e662ca39f34e" +
-                       "a8e3acdd0befe9762f9eeb275c0cdd43c80fc91131d1e0e790020975ab65" +
-                       "afbea81f303ebd86760821efb4cad7cc01fd6d6fd194ac5ffe7703d890d0" +
-                       "169e21b444cdbaf691fc741a5d99bd47357c37785755fa72582ca4754a03" +
-                       "b4def86ded39aa6d9eb3f38801077e6d17e3cee3fb57ae83f30c79c3cf29" +
-                       "0e2739c6b7323612cec3a561ebeadb4faa642f150323aaa9d270658c907c" +
-                       "4c1610a5e1834730c08be3379cf1abc50c30e2bf01ce903927c27d85e135" +
-                       "3db9e216dda8860c45925e2bb791abe5c8281ee6d16607bdca87f60662dc" +
-                       "bd6e20224e7f009a86db66fadd8e37e0a59559328385090c6953cd20bb61" +
-                       "f28a734fb056714f5159977f18e5c5f11de75f7a00ba807e47a29e4da32d" +
-                       "5c67ec76ce4d7b669b5e6ee17e1df7c673dd8a7c87fce665cda8adb9547d" +
-                       "1dccbdbe7be44846b4b121b0bfa65e4ed530789510d79bc4477e50178060" +
-                       "f2668ac8956f39ef422ecb0e4cf90b8ce508552eedeeefa6c7d1bccc077e" +
-                       "8088bd7e0e6aaf0bda9f11c412c270ee2ad6912f9808f9344a4bb137bdac" +
-                       "b5b9372b00b0de026a8f5d1fb13972e1290b5005689f7636c43aee2fd443" +
-                       "93d390371ae573f0e064b2d7df552b9adf04bf173d71c621795b9fb503dc" +
-                       "5e918536c6ad25ce4a76f70e6b752b6d44be321187269a19bcf33ec899ca" +
-                       "40e88b4eb23217095a85057bf95d8a54812cae4a7d32e0c2966a21376110" +
-                       "74c6c8c3dd45a553c43c675d23308709f91be0b235d0222aa5e1e1ce08f9" +
-                       "c6b45ceb5b47bcd7d7b2d4380bcdbd6eced452d93e6d8cbe18123277889c" +
-                       "7f86b15fb991364a501fbf5d8244f2e3332ea0ab49e833c6f765017a4006" +
-                       "cc7cd1a0365945a8d8873cb21832b210c83e451c01ac949de2fb0f7a420e" +
-                       "405bf64eb251c6f022181595d68174b91e503187d3b3f49b60c23e44ea40" +
-                       "ca20311305b413047bb22e89672758b74d6bd1a06decf09e9556421087a4" +
-                       "0c1d2c44c5fb13d4d9625581ac4ccef1a1b5eeb5689aac5c0291aebda276" +
-                       "50daf9d4396a64d02c6d58bcbd609d9a0017880ae0cbaf02ad0f1fc8d1b3" +
-                       "ec987ffe13102d77352690c9b761bf13ea0b3a8ebad4a0823817fcaab4d0" +
-                       "9b0bf03486620761dc77a6ba007ba07153b17425c4026597473e78863cbf" +
-                       "430c0e5e9b04a83ad11506b61b8d9be3aeb06b5114e0d53d4724863eba12" +
-                       "4f3b974bdb0d02743520409910621cd730c97ca984fe2921c38055f83ee8" +
-                       "c4611db92e52d8ea51d89203e89df7586c574df15f3a96ed5a10bf04cb27" +
-                       "f9656b5b11cf35fd21360b029ab26e9a741c6b3e6357aa1a41de2cac6e85" +
-                       "f9a49e3441e60a60e74f434e1b8cd4454b11962e5507ebf904e9d6c52a7d" +
-                       "9722300517c434758fbd6191f4550108b143eb16c0b60094fdc29327492c" +
-                       "18a3f36737e506fda2ae48cd48691533f525acfffb619d356bf8347a8bbb" +
-                       "4babdc2ac866e497f192e65a694d620687cfb4f631fbd6ae5d20ac2e3a12" +
-                       "4d85f9391a240b616d829ac2adceedf8f3451ee77e4835639b13c622ef8c" +
-                       "48a181fc7598eacb419fa438d4046aa971942c86b36eb8e16eab67105783" +
-                       "d27fc56f5b66f35451b2a407d4648a87ae70807e45bccf14983b3abcb198" +
-                       "d661d562dfcb00ffc569ca967171746e4e36f839946bc7d2ea9a0eda85b5" +
-                       "a5594f6a9c1b179f7230eaa7797a6aaf8628d67fd538050cf47aa654778c" +
-                       "11dbdc149458c1ec2233c7ca5cb172356424eb79479b6a3eed1deb9f3278" +
-                       "5282a1034ba165032b0d30733912e7cd775cdb7e0f2616b05d521dc407a2" +
-                       "ae7dfcf46fbae30547b56f14dbb0ead11b3666666c45d345cd5dbfa200ae" +
-                       "24d5d0b747cdc29dfe7d9029a3e8c94d205c0b78b56d5e18613b3169bd44" +
-                       "1b3c31513528fe102f9bac588c400f29c515d59bbcb0725a62c2e5bfb32b" +
-                       "5cf291d737e67f923080f52d8a79f2324e45a3bd051bd51bac2816c501af" +
-                       "873b27f253ef9b92ba4d7a422e2fb26a35c1e99eca605acc10d2a60369d0" +
-                       "1f52bca5850299a522b3aa126f470675fa2ec84793a31e9ac0d11beab08e" +
-                       "2c66d989a1e1b89db8d11439ad0d0e79617eafe0160e88384f936c15eb15" +
-                       "ece4ff00e1ba80b0f9fb7a7d6138bdf0bf48d5d2ad494deae0ccf448c4bd" +
-                       "60f0788d3f2b76de8ad1456f7572bd0ffd27bc2836d704d95e9c0df34571" +
-                       "9dab267dd805577fafda03b834dd225ad9714d2bd182b4103faa5975180f" +
-                       "90d5d6cac1825a19b9d4c87cc825512ae9dbeb33d2759c990905050f960c" +
-                       "db3eb364c15b593524c882902b2a1d7fe40ea3f54fb0202fd8821463c7e3" +
-                       "4b02a1209ba0048a9805f0468a13e03d18009318ecd92042959be263a51a" +
-                       "407f1e660632c4247419659a4e073a8e9cd4a226763a7daea464d5427270" +
-                       "7efd053cb4efc0504602c4f63e7d247b55db2ce1c07138f585d16cec97a3" +
-                       "0731d5aec2166cb4de41695feb76280cbae1af8a2e67c2d5a3ac5487ffe8" +
-                       "640f308ace6137e83576b79d586b663122221c20aba7a6bf60f73958f436" +
-                       "59f087f850ba6e2d7fd862249c5fa6b20e3e43d4f2aa10d4c9cebfcbdf02" +
-                       "6b8d103e4f89b93dd8af172f421001c8b162bd6d0b847a58ac108b6d6cc4" +
-                       "9c7a9ba069deee",
-       },
-       {
-               key: "e3d21f9674f72ae65661aebe726a8a6496dd3cc4b3319f797e75ccbc98125caa",
-               tag: "3c95668130de728d24f7bca0c91588bc",
-               in: "baaea2b4b4cbe9dbc4fa193c376271f40a9e216836dc35ac8012476e9abd" +
-                       "43dac6b9ce67dc6815904e6c84a5730cea0f9b4c6900a04ae2f7344fd846" +
-                       "58a99513ffb268c6899dfe98d605c11e7dc77de77b0d30986f3051754503" +
-                       "7c26be7b719aa9ca1140cfdf4c586b7fe726a8bc403249396a11cfee0a6a" +
-                       "f6c5e72259785cfd13c2897384fe527100170001ea19106aed38f7d5d9a7" +
-                       "ad43f0b41451e19989192a46b4f9734a774b6304cb74feb7d83822044a24" +
-                       "2e51d55c0b8318e0439493bd1a57cc13f6079166cabc46877d003dcd39b2" +
-                       "c0b90f6b32fc77acf04a6c125e11b35d91e2b18401cd53df4aff804e3c67" +
-                       "a8bb3894b27c6e9b0070b53a85aafab0c0a253f9cfd4d3cd3be52428385b" +
-                       "24a3f9f71660ca2c38474d14a0309e2f400e2c21af6e379099283ff241d7" +
-                       "51da5a96a8dcbfdc43b913b29cc8cf8020eebb4a67f5bed31f2e383f8656" +
-                       "8c815ff172382b425e95902e80f5fc219eccb51b656d37b56660f749e5b1" +
-                       "4976a23648680a472d02ba71476e0afb29a0e084984f4eac3befbf8dd802" +
-                       "2b7dca4dadd18bbe58e49c49ce48a06a71557a9a620c51e2623f818e4d62" +
-                       "c2564c7ba04595cc109685869b183faeff2ac7a65049fc57cb10fb01951e" +
-                       "a525332782d691f9759ec2ecd68bebb9c7aece5d522a08ce7830be520db4" +
-                       "c9d60a2e490eaa0c91e37b256a97f84b39fe3c77953748c3b86fd84e9547" +
-                       "a298c049cb28b8c85d59548b8dce635d59487c9de615802d16a8adc4c0e7" +
-                       "80f35b9f10588a431b39b499dca929ab9d225f26e5721820627fe62427fe" +
-                       "06d5773a50878b6effe840dc55bd3ea0c35168f6b6a972d57e8f88c5993d" +
-                       "1ae33e0b7e9459c123753b518c184de7aaf429df078c9a18a29af77c727b" +
-                       "796f5c1a501fa8105ee873c4e78c907142eb19690638a182fddb413adb06" +
-                       "d66db19c7f6f46dac582bd72a6347b4427a576eb769d233febaf7be8f768" +
-                       "337273c12253924f15653f9f3602b783703a81454a1dd7a8772a9ab1eeb8" +
-                       "51be33e0c6c0708f3cc2012cabe8e2f0c38e35372abe27bc148fc4e1054d" +
-                       "9d151f80aec0232a3a92dd77928a3678ebd7d09ba7b4e1d83227257292c0" +
-                       "b8bc4a76de36bff6c9deb383029afaf4f37d5b935dc080a18665545e4acc" +
-                       "195da0b9545d8902408886204b64f8548b32d012e0cdc520c17d9fb3be97" +
-                       "800c2e2b945cb09a75a0a49e5d4d81c4194d91e839333b2b9b9e34d588e4" +
-                       "e20cc1e911ca0a1429fa70ff063f0090fd842f89dfc5cc44affcce4e1e1b" +
-                       "8b11c612f66b074c03ac2a055fd8f51ac9ed4f2e624589ff5730721d077a" +
-                       "fb4c19e43abf8cf3ffa698362be8be51e92c2c91a4a56be64d9ac6d3fbaf" +
-                       "5536a24c7fd0adaf74ca84c508e5e8c8bf7d4254e0c44158bd26acdf3f64" +
-                       "e78438b3aaff89ac9986cef1e3a88d5bf2016340367a1cacd01ec167ec6d" +
-                       "185d93a2a220d718b43ce1d429d2cb598605660b030e51e8d75fdbdd5b8f" +
-                       "8677675e196a40a88285b18b24c5d2d594bab3d457e6f9e503e38cd470a6" +
-                       "9ff8037c9a0a0f110a434335d954fa856a3721e0edcfb14287c3dd9639ba" +
-                       "4db32b7da0670dd0a872e468e3819741d0d4ecf0a4f7a011bbae1493c01e" +
-                       "642757491189f8664be3ec6437c4f3c76abfb0276e44a4d28871d3487c2c" +
-                       "ce2f230452cb06184bb8620919659a7ba0a3d5c12ec25678b03403715ee4" +
-                       "acb6a53d281036d8f3a085143cf5ecc3a0c6c92129caa7ac1f645c7bb95e" +
-                       "4f63da38dc319e2ccff4a9006f9b9b1a38c4c39f6dc686bb82d43fb9fce4" +
-                       "0c767d3ff22f52c5f9900130c65bb6a9cc7408a777d49b70946665f4a733" +
-                       "5099376b276a43dc9a6382bb2d40425f6481b1846148434c672b84dd7a20" +
-                       "33deb5140d43ba39e04ffe83659b6deb48629e1abf51e68748deffb756a3" +
-                       "ed9e0807506b248a024cd509f539f4161366547c62c72933584e851599b6" +
-                       "82ec16f1d79e9c6a01cff6f51ba7f46b67cdca09f3ab8496322b990a6116" +
-                       "8d7574854a1cb1cb8f30a303dbd13a095df56dbb940dd16ce79879cd2d73" +
-                       "80a419842fa1b34da668286de4c1ff5917b7aaa64713c349dc8f855d04ae" +
-                       "de9a3a4d0739dfc36510b1e7bb1695418164285c44631b4b1a7c5798ecb2" +
-                       "d976c1a3679a827bf0e8c662567e402bcc1354222036ad5959a6f0b8508c" +
-                       "6a8c7d4a63e7dde154d778fc80a011592771d55801c7e1297b00b77f80d6" +
-                       "314ebd1f5b3057398d1943599897cfabb65e7568d8fbdfcbecfd4b8a83ca" +
-                       "0a7bed08ab9a656424831e0d7718c15727af7c83b2ef5eb5684aa044eca2" +
-                       "ba896811246766248b20a325094a4b4159f9cde1ee349be6dc3c9a190453" +
-                       "0349212a9537f65ae333c288753cd2bef6c5beb2f4164168d965a2c0fb9c" +
-                       "c8c73d9e776e23d53ddcfb83bb7dfe2a1b8c781280f449d6f310faf8b53e" +
-                       "89e6a611d6d3f42f2aaed5259730d149b3e7dabdc9f865bc1555374738c8" +
-                       "456abe112e9628fb31efc2ecdc972da05987aafce728ccaed246cfcdf518" +
-                       "3fe5dae528bbfb99d33194167e0f84d462d3d0da83e92227cf57922c7956" +
-                       "4fe44648d87c69ad708e797972c44c4a5183fd5d1150a1182e3d39c3cd16" +
-                       "3920f1d7ed83992bc4116d9351ae1c6c4827d1374242e374310409f32d5f" +
-                       "0f38c78b6489c568b791c70394d29ea2516dcb10e51bdad862ce3339d5e6" +
-                       "14fe14f150961809c36e0a2c8eb872e9f7a1c0956fbc9194cb63ff9993e5" +
-                       "d0dcf62c0f49e81dbe99f3656c4dea57b766ae9a11254f9970618f1b33c8" +
-                       "f339f440de240170f7a21f03ff2da42102b323ce2b9b7d0de5aae324d1ba" +
-                       "c87b1e4c5279a566bf659778f8b03882aded57377a0f1b063af2897060e4" +
-                       "23be7cefd4aa9a28479c16773944d254fc21d3e1acdf508b7972372b5991" +
-                       "3b8b088e93471a7d54c6ae4c52ba465ef07f19f269677fc2f64d3fb3d7f1" +
-                       "9069d6c7001d4b002ed6683c59bd5651a450503b68a4a00820b8c17e3263" +
-                       "18f32c21dfbcb2a02a104edaeff67ec09533aaf3d1a7fb41aa5d506ccdbb" +
-                       "e6e35fa0a263c0aad3acc91182addf8c5bdfbd0626702694b8d652a63c65" +
-                       "8d6b2b7c75d015630de508195e1fca9573b61bc549ca017c4bd888194d44" +
-                       "3e031f36170215a301f922736a819f3ffda69117170d1933300366c5f2ae" +
-                       "1052446ef7c3b82c5868be158a881597132f51c91c80c24ebf621393dc45" +
-                       "05fe057364a76ae67494a8a5f67acb551cfe89f447df272ed9c1509fc330" +
-                       "2c3e16541452d4d68438f26858724012ad3b72c094b9f166c6bedb8336a3" +
-                       "41e032988f39cf53535789b320b5424d07b6bf5f8792e3aceb0e868765b8" +
-                       "611d7905089949e0c273e2410c72a146cd63981f420405bd883e5390e985" +
-                       "8214a8db714e8400a21d0636d7e5d9671a3582ab9ff032170b8dd6b9d5a2" +
-                       "144d065228fa54aea9a22654df67f3f62c5fc59d68914d8b219829b536cd" +
-                       "2ae937ecccdb6031d94cb3",
-       },
-       {
-               key: "84373472e362a356bd5c9b50f55c588d067b939009944f02564f136c62dac36b",
-               tag: "12dd5297cfcec53deae1dd5f9325d894",
-               in: "860d9b2954c3daf18fd67eb8bd9e6e3de2e4988ad9b04b1987219204dee2" +
-                       "388db1c59a935de27bce29e7cd3ebdf038785efb35eabd4c3785a62b1d9c" +
-                       "3ffa25e2273cfe5eb10b4ec6152cd8f21dea415421b452efc7cc4ea6bf1a" +
-                       "b85fa6614e7f6d650125424865386ff8ab53247a63ff023b2d0753a9e5bd" +
-                       "458d6ab0156fd3cf2d5002f902f927a847e8c4a8426b0a5191f5e237d590" +
-                       "2659ce9be9024750d1d618a6b8dd57efb6c2bbac2930858f1132639391aa" +
-                       "9e8a620a2a7d64bb7e943c77753401b5b619d95ef857df25a52b4eb97372" +
-                       "a05416706b2644e2687bf1d42c0cf06e5eef8a1fc7e178440bfebb85c44a" +
-                       "4837f69e43a1789728a999c5e04291576e757510f22bca11583a4e93688b" +
-                       "442f2b2dab8d5ea9441ff09b8287862ca538ad979297cc75510a3d9ef36a" +
-                       "662b4b7c373f184202befa5bf3f315642e6210763d033b7e2c59731cb356" +
-                       "045e9470bf2f83cd62f11b3e904b0c0b1be99bcb805150ba7ef12b8df3ca" +
-                       "bfc5055640687d710ab88e0fa8034b26112ebfd044a4b290b1c6f6d18c31" +
-                       "ba9880b1cf2d81b5d02f00d6d351da5dbf47b6a5cb7b53eaf6de52c8a68d" +
-                       "053602ccffa37ccb44a7683ab4f8a58c4bbc9e140e4e6f3cc10a5c07ebd6" +
-                       "070818db983f9f415168606011efab6b8d7b4e61e8eadd8bfd8d028b89bf" +
-                       "b0a16996252d7b4ee4f9ab50fc9d6e482ecf99beeabc38d70efbb9a0d4b7" +
-                       "9a1c5d2835adf8e25111352eabd24d562644efc97637f695e4792f2049c6" +
-                       "00f4d889ceb951cfe289adf159865d013046985d7fe2598014bf2dbbc528" +
-                       "b4166fc2180e724ded8e7ea1c8d66338ec50d955d5594a0a7b4655338b70" +
-                       "e8978485a722df814fdc6fd2436dbc060121fcb575672b2a5e454c1209bc" +
-                       "2bb21a99d39dcb3c697306dbc2104d60fd8051c43ea2fce268987d0ec249" +
-                       "a5c02f91d3b0dfee181b3cf8ef1ba9665daf7ea1f1d3b216e378943b78b6" +
-                       "bb41e5dba095748bc776f8df6383033a1f5504955da3f42153b1c7ea83e2" +
-                       "f90b990ea0c5bd3906b5c4060b19f447ec7762916b8766e5a23bc4d39cdf" +
-                       "8e27752df8129b60ccee1731e47383b589d4fcad865eed4041a186df206e" +
-                       "9fb69ab6ea092e36f186a6fea8d77bd7f3ab0fa0e29404d617317c75c832" +
-                       "854427848237cfc18486c95f7213b9d53f324da036e8d298133b5003984a" +
-                       "b9d71836f9f1b059db90005a9067c261bd85aaeed4d623df2220eb52b73d" +
-                       "d683abcdee5cebd411996f853752f638bd28df6d78bec2ed3e00d7beea06" +
-                       "2b81c19682ffb2f6abe3a3623a2e0570650c1384f1818d76fbefe3a7ef3f" +
-                       "46138160ef897f9934e00e066e215230e719c23905dc60d7fa4d666fa52f" +
-                       "e7737db15126d3262c3a4c385cdb23ff3b56c131e43b241f4a6062a1a248" +
-                       "de9f13eb82c11f7b6a22c28904a1eb6513cdb11179067b13c7b5f83a58c1" +
-                       "4f2753f19fdb356f124f52923249d6e4a2c8dadc8bb0fc91e360155a14c5" +
-                       "c194334b9f0a566d51fad98592b59c1cc4b40eeddb34e64f337f83874884" +
-                       "0583f853398c343dabc29b9444be1e316309fb8d81304d654b3d4bc4cff3" +
-                       "55fc31278fe22e649324ef10acd247c0b72397edf96a1c16bbbef0640296" +
-                       "4d219575fd23c36efc1fb8f8a34b510ba9bdfb3b478e236777ef7c6c47f5" +
-                       "5a2bd0383d8eed3759456ffcffb15e61985b08c022658a5ffc875821bdf8" +
-                       "83f69f096dcc72a96888c3af76db57a54be701759670bf05cc9015f5bf1a" +
-                       "745cf755a25b1403a870875701427f820c4b29eccc260f30113629ba03e2" +
-                       "785014bdcbf34d0c67aa6aca20d2dece811788686d5a45820d2980bf7d69" +
-                       "d5c820a09bad7bd95166f63dcfbe8652565c285e60e2704955d69b3037d8" +
-                       "7f5e6567d95b8891276d5cf7c59047d10a02ae4a28794405e2524ec2d595" +
-                       "1b36ad1b9d5265fa098a033b88aa66cd9eaf01eea49c7dc4cc51c486f624" +
-                       "507a2be23f152f43709b2cfecee44945ca506950e90e70164b77e12e1c13" +
-                       "0b4d1021c2afa20038f190096276cd22e89b6e7dd10fd58fa033c9d42536" +
-                       "98de3f4908203be8dbf259112f840c76726d982b4a837cae7139e27182b6" +
-                       "1b4dfbcc50e42d5ab8532edfbd30f668879824e9ebc34b63ff1526cda81a" +
-                       "e38352a774d79f73219500e57f0159a32326195d8895d965071834876a45" +
-                       "c1a3c0bc4b1638535f7d40011cd5b23343fc27fa318c1aa3f9d8c43351c6" +
-                       "6148dc2175e0e620813266da3000954dfa22048f305244629d512e852376" +
-                       "6248a897a3ec3e2983aaa8a0f025f18feea57a5153a59b02604ebfcc7a9f" +
-                       "b03e62443df88ead9dee955e23bcf6528c278a353f254c9484a67a7b263d" +
-                       "a301923a4efb6866aeaaafd428e6da48781365bc49e90cd16b2388220d08" +
-                       "bb9f79d14012b5a8299a651917b6a829488753b6ca449a14e8dd8c5fd5ef" +
-                       "657d627b8e7773475b802655dc033694f24376e3b01e519d1aa8365d0e55" +
-                       "92d0a4adbf555639b6d75d7ee59a7d12c6c11317b7927f11bbe75ed90508" +
-                       "b0698420e231206704d22dd1f1740edbdcaf19a47d66ace4eecbcefb77b0" +
-                       "85cfcfaced4d2d6048ce76434eb79990f0898adb4af2c377b581ebab3f3a" +
-                       "150f40dcae002d4caa60050591c0de4ba83bfd59a08670beaa4641aa9829" +
-                       "bdbb720d6eb8b2f3e864a98676a67271a82cffdca2b3590a0b5f97efa5d4" +
-                       "ba062b4798707159782bedc75e5363d5f5d55ec2bef70db22955adf401fa" +
-                       "c3b7af937816eb25d54d9f2a92e5a2a04bd8b8d7568204fd289f5ed2e033" +
-                       "a76209d288e11e8a4dbb06b9029e90cb186446746853f02d738e06bba538" +
-                       "894e03e2658ab3d7f9ac861d2cffdf12396004d1cd15f18812d3803ab9e0" +
-                       "6f41c9b374d6a0678bb82ce06d9e3b9dbc8d2e90b8f64d0d040f3fa8a3fa" +
-                       "8be71d2b3183cceae1bcbfa2353689d842f7d7052e5699dcc70ab2b58761" +
-                       "7041e5aa1e2f41911d525505f061d3ca45152f5a7a1fab50c674e4597a52" +
-                       "b46aafb4ba57413879cad1308321843abb7c39696fc2f2e225878bb1191e" +
-                       "e151cc76f1a1b8d491c1672fecbf710db82dcd32554361967fc839c8e5d4" +
-                       "e488856e1b9382eb3fc3bdc3b6886a3cd79761b02bafa080a745ef6afa26" +
-                       "822f1d10d5e8eefb842837d82c9986e78fc3390caa142b7643de8f613e5a" +
-                       "890a57f5883409549537f8139534f4ca1b60f33e42be25433f1d82add530" +
-                       "6a4cfce258c0d4f1f3c9148ffb5c4b626d51f78ac20bff0393b7fdb4b9cd" +
-                       "70fee7f69892c8a9ee089c6c5c7bee0a1b825e5b9517f2c82d6c149735fe" +
-                       "45a8839812c2deb2a355b6230697053092eca450b7b0d3242b2689efe364" +
-                       "09e820d91fa4932034d96495d9dd3baa4b385da815a7cb69438ff648b326" +
-                       "e7efe8d688e88570ba59df7c439faf72c95317a10c984c5ec0043407e9fc" +
-                       "9b46487810eac19d2bb40e0a654935f76e7d8861480c5f48419eb33084d4" +
-                       "0e1070e5ad542c94f58b49e67dd05b6637a2c67d41451b7e00ba30eff221" +
-                       "755d6d427ec634a2b95980d274a89579feccf1c7df3787a9435e588f2496" +
-                       "06a93b7ac41c8aaa84b91c95cad9463d4881de7353d95b13bbde4c9da90b" +
-                       "f1fe96257309a416407c64368b5564f022c4a493f2a39df1696f45801e42" +
-                       "a5",
-       },
-       {
-               key: "2d0035a30d19b9cbc7a27561f3ab474c01115c4499b4adec660ea06ebaa1a14c",
-               tag: "a2c77b55cb0c076d8ea83cfe0e64f293",
-               in: "4e667580ba4f38f64e5cb5566bffb486dcae10cd17acb3754251e837767f" +
-                       "16429bba2b832f29ba538f97f3556548d163be25e69f88fff0743150623b" +
-                       "e0a1d82af9384ca335927a0e9cacc3dadbdf1e24fa5c81f2602d109e1400" +
-                       "33929e409b9a0fa4f2653944edcb8b3ef963ba7f8806196c73bff0ded670" +
-                       "c6def5d240c5f3daa121f8d5bec9b2a0b0f1d62d54b013dc742d6bd46325" +
-                       "460f692b76d4991f0796820ddebf150c7d33829795784dd2759b334d2706" +
-                       "70a7264941be5d99d460d078a9eedc3660cb3176ad302f9365f0bd698e46" +
-                       "9f3e63511abc81109995dba17be1abe8bcd28407c7fc8d02c14794bb033e" +
-                       "178a94f6dc73719d5bc235f980a16eccb4121ca83b13c4e165931ae4f192" +
-                       "4292f8cfdf1c3ed40feb71e13d919b48fa296dddb4d23114a3d86ec10f16" +
-                       "f314de4cef813ed24b49f4c7bc44cb8424df1f70e8d77366161c7cdd709e" +
-                       "97610aca3a24fb2202ffe15eaaa25d711cb5179212a2c6497a13e5d7c365" +
-                       "7bc502b3d2ebde2e57b714dd9bc21e73795f3d35d620613918c4c9aa0e89" +
-                       "031481c97a5a4c15ec6abe42d40498c33d71c823bf1d5bb5fee457e2fff0" +
-                       "bf777c80c6e3336ab3ce793440e74b336a8f7034f6ea2e4ff5ea4ea7c350" +
-                       "65cf2ccd2da1d6df29bde10f4cc0202b5e4cf7ed097da49b970a6db41e5e" +
-                       "98f3845b42f46663b1d1ff01da71389a8737ba8f51eac1ef357ba5ac9a80" +
-                       "dd2c7f9476111dcd651fc33f4c86dc8658656f3f02a8878bc38ff0d0a1af" +
-                       "2e31fb92eaef08c50195490818661feaf90e8b6f5daa1ebedb2cdbc8d5dc" +
-                       "16db3505f9611ac46bc37931e02c1fd6aad6e4b7e187d5e6f990fddc9563" +
-                       "2b33f55bf68b0db3890b11113ecc839a4fa4de25160e574289aabe4d8fb7" +
-                       "9cecf9d2fa75ac8d0195beefbdfe0815f8d7d9751c1280a29b547149ec7c" +
-                       "2295f5afa53cfb516158086bf203357eec2a5db71143f996c81555a47f92" +
-                       "209719a71570a5553f1ff9b4b41827dd74657b463f36623565f0c9f4d2ee" +
-                       "8735d6af56ceb3b3d0ec516b22f0ddafbc24647481f61ab169e2616c91c0" +
-                       "e1f6a35436598ed801670e1dba76226cbd0544959ebe70f836c8a7df575c" +
-                       "b907d780ed5aa0d6e4e8e0d2f457efe89a777374aa49d4961db96dbb787f" +
-                       "021d99231001360d532a70ee1fb94bd6f26524dd4b7556c6d40e08723d7f" +
-                       "9905aca66c4743f2bf8b34493bdabcfca617809a867bfe0a4f94c756a6a3" +
-                       "dcd04ffc0a3ac671a0afefe0d5d447efcec48c6368998760db6a572676d4" +
-                       "29b6d3d6e0c815650447748c4b27541c5447acfb8f7261b6378f3fc0fdd7" +
-                       "375eb9d458648c7fe9cd96344f11aca912cc5098e9ee39e0b6794cc1dc2d" +
-                       "f1b10f927102705efa20e667b63a91f935c17764650b287f5289d5790766" +
-                       "555f31985c5aad94c652ba41fa9c0195d15405f1fcce9e23054a42c8a252" +
-                       "da83bf6268782ba44edec5d8f94a20b1830cd1c5894cc6b9b52ad0b12a5e" +
-                       "cf3195a32a0b02483ae3b954ac6f3af1e0f334221279d03a72138f3a2cb2" +
-                       "1e706427c4d604674dab88d429f28a67be7a996126e077a1dcf8989d90d0" +
-                       "8b08f4abb9a546b3c64ecaa287bf3468c59add86365b885f52afe13ed8d2" +
-                       "69ea61832a7ecbb96ff3336f58a1eeaa6dde3611f3ff7c2cc8c9b745b0e8" +
-                       "b5919914245a49ac192cd77d10deb9a249623f696065a532c20eef9e9b0f" +
-                       "e706579566a9eeb14d4e8251a7750e29eaa60f034c1a7a1d51aa03a45fff" +
-                       "89acf41080deec5506128b06f003fa46bc4021a82fad6a8052a49744ed69" +
-                       "45bd9331b5ae80d873cd042bff079b2b9d8af8065a22c449c32a56dbbe7a" +
-                       "80d0f3e30b9167532506915883dce0aa9cb749e4368c595c5bd33b57e36d" +
-                       "98cc9bf91cbfa47331d69b5cbe9c92bc66c0fc9ca8717bfc108e1f710333" +
-                       "14dba02a28b9aa05890cb01ae9175806c3c4215bd446f6cc96ec5d08982b" +
-                       "4f83cd1646160e1d306b3cdec02d251f0901b03e8c3c35464eaa5082586b" +
-                       "b55482db97599d513ed8d7a82e32fae302684b7ede058474c1fac7893444" +
-                       "16fec93fb982accd162dd956ba2f31a894e9366eca00e6e997fbbf9a2980" +
-                       "8b83a139f6432147a717381bb8baa2205715f735c1e0db273cdda6897c9f" +
-                       "39bf0d7eb7caf93f657ef4d3fecea28baf69cf36d3cf347081df3114455e" +
-                       "b4fe3e49ad3c3f14435e0b39b6c0d16db0fbcfd7ba8da8760d5952c03667" +
-                       "251e7a4c3008cfb0904225e55c23b884bb09d26631650460c4240bd5a165" +
-                       "b531ee76ba5749b3bc60adad35de519321c1672b47bc35fb59f7792a3495" +
-                       "11b2bb3504ba4a28717823a27a1f99ce6970290b26efcf1e7a0399b10eb1" +
-                       "0c1299c09b80f4520d00e7908d004d5b6a72a411759cfa9523f6b2912234" +
-                       "481b1d8fe4c2365961c0528bd593d42bebb398b5836ae6ca013fe440adbb" +
-                       "0090e8ea274f4d8bcae483e3663051a328f7c12870b40e4973a9797a2336" +
-                       "3d3c53e1b0d1a9159bfb26158f44734b3c34b571be641bba2db937d4ae1e" +
-                       "edc807b95b1c2a7d44804885536316ad38aedf0d83b1519661f2bb5283cb" +
-                       "9c50dd61c3753433e988189f26962d1f4befd444257d0b6d5b819d5fd572" +
-                       "22c9fdff032e07a4d8686d451e71de4748965309c0a2d7c422ab7cf3d96a" +
-                       "8c0a1b0afb229debd1c9421cb828b9f2be96bb9d6b5be7ef8134bd9ccf81" +
-                       "51620937d720d83dbdddbfaba8ecd2eab6f1974090efde0ca963e9fdd691" +
-                       "ed0cc5e074c5780779222552fa46ddcd951763a32aa3a044ff4a73cbab41" +
-                       "dabb3c2c03fcda68303477f0dc26f35bdb5c9bde721fba1a2db732a89629" +
-                       "a8de3cfebc3918df1a9d5053d09da5b7316e3285bf62156ca28cb64d343e" +
-                       "72445fd66757bf4ab374fe7932a65f3d7fb6e42cb12e5b67ddf8530383a4" +
-                       "6c1ee7ec8883e454a467df1aa7e468a6e7035515f473901efca5d46ff358" +
-                       "70e0cc2575bbd7f8866c8e73cb157903a1694ff3051424f28de826984dcd" +
-                       "065dc3658df144ae3a6d37b88c367e3cf7c58169dfdedda4a2821ce22188" +
-                       "40472ff72f0dd1a6b0100555ff188b80f835259a634405e3dad61fc299f9" +
-                       "307e27503b2cb7714bf3b636cc64b61d2e374119c8ef8adb21f1516c7fe2" +
-                       "38c807818065bf312003c12e02525d69d9629a99e4ac66ad2e792f302cd2" +
-                       "a6f5f702dd28040738a084a7052f2c3ed0924c33b7a5d357b7c9a29cebd8" +
-                       "621a4bfb7bb34676ff210d59f7f9d4eafb7c5c490c9ea48402af5bb072c4" +
-                       "731bdebcbed4e8e08a67931b6d7342d4ef7bc4a75ca1dfbd32ed6027d8fc" +
-                       "b71e3f55565c02e06daa8c579b69774889181291c470576a99e11f2c5acf" +
-                       "77e091ef65ed243d4287176f7f6ac7aba6908c9ff1fa43b894a499b642ad" +
-                       "c01b2fa1c4b58801411941bb448f1f7a04794d2cfe5db1be61f7b86d6eca" +
-                       "c547ee51d4c9050f9e9f318dae958c150acc21c878f0c7df6065294eb1d9" +
-                       "a278c920838a0db752b080a32e67ac312fa76b589a385f31847196076ed8" +
-                       "1021fcc375bfcc8e1361878e2693860eb21ff0595e4eaaf7897f2b79367f" +
-                       "7c4f711279bf0c93a97dcb1cd8d87e444ad5f4cb5c1de44e37868c6743f1" +
-                       "cd72cec376726f26c8bd4836f9a9f9c68042f95ca6f9d7cde493e531c553" +
-                       "8bf7ace6dd768db69ac7b41ce93e8ca27ff20a83ff2148ec5b89e05d8b8f" +
-                       "5d78d0fe16b96f6eb8d3b20126a186085c6825df81aa16b3dbf57eabc360" +
-                       "71299ccdda60e250c652408d9cd1da94d73c728440ae08fddb901aec0fac" +
-                       "1050a778b10f94f84883bee158bc53b1c001807c43a3151fbf581b18dda2" +
-                       "527430872834e5c380575c54b7aa50f817cf3249fb943d46933cad32092e" +
-                       "bfc575bd31cc744b7405580a5f2eabe27a02eec31e0d7306750adbbb9f08" +
-                       "c78cb2d4c738b2274c7310cbf8dd0e59138b6a91b8253ae9512fe3d7367e" +
-                       "a965ac44d54a7ed664e5e5c3c6c2d942eac388cd32beffb38f",
-       },
-       {
-               key: "2f29d71d73f7af98f96b34e939e1a21e2789ec6271b878bbebd14d7942d30080",
-               tag: "ec02f4953a9a63ab6f2bfc3501e4fab8",
-               in: "0e0950987f3508239063e26a13727fefcdfd2cea6a903615c64bf12d9ed3" +
-                       "887f9b2cf7ccaa196ccc7756b09471475b9daefd4261e69abd23b9faf9c5" +
-                       "1fd5d5788bb39d3c068fa6807d30f6201d3f6dfd31715d08b1733440cde1" +
-                       "049608d23c4e45c5ed61f863350232f85827e7c292dc5f1eced1cbc912e3" +
-                       "f5c420bd945911d3881ede5153d3b2cc85371fff98d2caf97cad6ef59001" +
-                       "4017f9690cab08989851c2647e77e81401714a93ed9f938b79f8f54e3133" +
-                       "fc2cdef259df2ba0d48f37bf9e43792e3a777214cf4aab6dde6deeb543a8" +
-                       "813b71b5974136c1220d6218a252881f0f5677ff5b6aba127f19a5f3c5aa" +
-                       "c988543d7839a90a3f947c4e4d5c6ae1ab48dbd40456d1aa65339a4c15eb" +
-                       "520e8ff9f965ac4c37735937cf09942e7958f8a6cddee41707423f715903" +
-                       "ffe0d15af8c3140d3a736d23be7485fceb9f07c6509f2c506eda4ec9d30c" +
-                       "cc133708f48d8828e332808c84a745d337296d871b9794de1c5d06534aaf" +
-                       "65587526a84e2521f8b332645e0e72564bb308ecf99b7bc69608474389d1" +
-                       "686ffab8c49b7f04dadc28d2ecdd0f508dad2135843304e378b3bc7a4f25" +
-                       "7fa4316be956e0a021edb8045f39fa9f002087f067199bd6001acaadd261" +
-                       "4bf6aefd3f098f92a959685f24bb2206c347359d9c6adc6847117bb434ac" +
-                       "6c40ec618f6ae8b75a5e2e4d44c332b7b06c8b4d521493b9b0bde8894209" +
-                       "717a24b320214297b62dec741cea018ea681c9b56702068528b3726953e8" +
-                       "c5e4ccd5029e4183e772d9834a56a88d45bf87603dfda40e03f7e894766a" +
-                       "7623ab4dcc0dfc3086d17566945069173935916f772e2a5f8e1547348f28" +
-                       "782400fc069ac0e2b94242e9e0f1ba2d0e76898f9b986540e61ea64d7f69" +
-                       "1006b86ce61565da75eb16a8b4c5865ca4eebdde2190e354734bda94fe7e" +
-                       "12ff47dcb5d5e6ad93cfadcc491cb350b09ffe391a157e14b65e3a211b5d" +
-                       "4e447c3ff95571dbab33a83126d68dfddf9383b4359d4103ca64af1e6963" +
-                       "d09e17eb944aa71e76711dca33168586bfc44ebe9fdc55497d83f238c66d" +
-                       "bcb16063bc85635f0f1a6280563bca49ef971db96a41b6ac5e0642643262" +
-                       "61eb4662f3d6ad4cac826db895de22c9b8aa35e6464a7f44e1ae7238e355" +
-                       "068d68754ffcca76c50b7ce7ef9bfebac9eeab32c87d059cc7ef2adb5d57" +
-                       "c7419adb394eef48441952253e8391e555730e29789d6293c3696f441449" +
-                       "0aebe2bbe541e191a6652ffbec1192f0f9395b7ea370aefc1f1cc8438035" +
-                       "d7681f12f1e11d6e334da188b10c302fc0f4bcf1de448090510a8f1d5683" +
-                       "0c943a3c388b33a038c26741a4cf3487313f755fe7a28e25e44b5383c5f4" +
-                       "cd6ef34d7dd73462226281899dc3f2e69809a0150f694673f31addc89888" +
-                       "072a7d4ecd63d6b90540f9522ec05829a7f17d48728345ad808fb0203883" +
-                       "3cbd018d612992a88df944b8e34a70920b3f26cda2e8bb16c3aa38b12b33" +
-                       "b395c9ba5e809f60ff05f087112151af1b5987403cff8bb2dce79093f431" +
-                       "2c744f911a6f3091e4f9ef9375c4dce4c241d2f6024a1797321851ca316c" +
-                       "4e460fc060e7839deaff8ab5e8bf682c0f21ab6952eb793cffe690db911f" +
-                       "50b11f56ea352942c43bfff51d4360882754faeb7cf28b6b32bf7fc9ca71" +
-                       "fbfe1d72be05b8bac9ba513d731e2c9d13d6f2f10eb926edaaf0e3996656" +
-                       "da8718a8e103c59326529e91ebac6ed52657c9690ccbf81028cd9fb189ec" +
-                       "4de94fc0771e53302c8d9082835a68780cccd772660a110a1b40c57bef3a" +
-                       "c1d69428aea549ed17663a96895a66a3bb5ff6ff61dc64908df49b760caf" +
-                       "a5aff05e2766a418dbaa1e7d189a9edd55a04fee8c9d6e506d299abc36a9" +
-                       "d67be035fea5d220f41d081af67615fe627c4dd04bd8659c7fa4f57f35d0" +
-                       "db40d9684aa178d7483ed5d86f04eaea412e0ea05a4698377dbff4fc3a39" +
-                       "1f6ce0cb833d3118d6c69319b511cce65fdc74928e270da0c537f8201eff" +
-                       "77416155d4a39c7ad38c22cdbf7d2b7ff7d85383c178a835ec604c3f9ee3" +
-                       "7399f7dd826e34f1a35ab75da44ba56f86097ddc0f3658ef5bd65a24f4de" +
-                       "4255d0b03411a9d7f0ddc29e33cb865da23393471aa94e6c9e72e789206d" +
-                       "3ba118aecd39727068f528f01b25fae2280d70033e4ee46b41b864bb922e" +
-                       "001d8bf46d6fbaa5a594e926f45eb3a4d2f074506d7834b606f43c89699a" +
-                       "6db00b374658d9333700894d440a712a1f25f5538f9e7c8ee57ae7e612df" +
-                       "13292c8ba9dbede4fb77cc6c8944aaef59ea6ad3b36db398f4bb0f82d40b" +
-                       "44879835f224d6e05992b1b8a68dd58c3dbda2fd73786492ee48c7a25f87" +
-                       "264b766930fe9427487504fad17f8d230934f044e49ba219f26ead728856" +
-                       "cb30eecc33a3946d3b1b781061f2458c7c46f6d96f3e06f369f97be91835" +
-                       "f23b38347d1e381ad5be4419275772c2abd549522a0203c1ee9c96faefe1" +
-                       "df413c4b7b2624417890e0716854b7092b3b3b368cb674035d3e6bab2357" +
-                       "e7c262b606f7141b6dad2f6145ebc1deb7597814719784f3c17848a90ffb" +
-                       "cb0289e2f3cc7da12442b837c4e47f468bca3eb4e944a31c48562c2f144e" +
-                       "9e920ab5e4cf90a14ccadbae29af13db38cda911e3c8f6f525e6722809b5" +
-                       "31a4de1926ab12f643d25af87eb8610df59eded6ec278242247dc69a4213" +
-                       "13f7c2b26ae7a917c1bdaf66c56876e9104d40b59e6ca1431ddb77fc89f3" +
-                       "14b46a154cf127688564a4f9e120d7b5816cd24a6e095dc8ab8b43bc3639" +
-                       "329719f0e0f723e2f5136d82638e2249e648ebca67cf0306741e9e8d45cb" +
-                       "903bca85485c4007397c88a1ce07266f4f611b96b7e0ace3074247a7dfb1" +
-                       "cdbbdd66e25e172fd2bda74abde7f3b4cb5cc7ee7859f053b2f04f9de03b" +
-                       "a8e96264117f502087c3ddbee8d850bf3618b4de90f7b3e562dfa57e4426" +
-                       "5357236e35e71d1669226d63bca50b1b944ac07a1f794e73e80985689b25" +
-                       "f18fc709367d63b8639d71865cee667536040be827145c08cf3e57a66678" +
-                       "4c81115706a146eccadc7aa1a9f074b47e95bcba7db8108a13279077bef2" +
-                       "64699fb87e5abf5b05ff3879d7c7c5169c7cae817c13f0859d4e9c05db0f" +
-                       "74c045ecc30a51e515feea627da387ff780719395b5b9ad93179b16fad10" +
-                       "5856049169dcebd43a7f39c549762405f807378e854b1654a1179d895ef0" +
-                       "85aafc72c7fe1e0e1cd3abf8e20935e331145bbcece4f17ad24ebb6c64ea" +
-                       "73bd98a7494c134859206c9422f7c4a057db0ae0770c4bcb08c1a6b9ca4b" +
-                       "7dd8c1cdb3e4977c7ce6c1e79b9d6ad98e27d2759b53cee73ec037a8b686" +
-                       "f1ff78eb8421f41c74ce9c62a90d38b75159ec925f232e0db71362f31e29" +
-                       "4336f5580a34b26c5a01ee3454cba227c7f400f6889a319d7121dcea27b9" +
-                       "584f33ac796d48a9a24cc5b6799ee12f10725fbc10d7cf83e4b87d9c444b" +
-                       "f43e2f5ee49d8f3b531ebb58fed4234cb8bcab1b8b18bf50956506baae8b" +
-                       "c1b7492250f3adf64294310387f1d4bcac12652895d4f2dce26f380733ce" +
-                       "0b5820e9fcd8512a1585a49940a32fc8875ac3c9542a4270602e5e97e720" +
-                       "90ed71b51badb775340429fdbe45b887fb9ee61cf9e091c06092cf0a2129" +
-                       "b26572574c46910cb458bca7c63eddd29d89753d57e568323e380065794d" +
-                       "3fa1ffb874543f5b0ddc702b087e91e22604d9600d37fa0dd90d7acb2458" +
-                       "4cd408a4e66bb781dde5f39efda6a8fc26be0d08ffdf851e422ab1500c28" +
-                       "bf6b4c85bdfa94e8aef5cda22870c39ad49c3c6acdbb3b0d58cd05424c65" +
-                       "20740b5c2bce4336545eda12716317df58e6fb764fcb3004f5248c5ccd84" +
-                       "f63abdc0dd2a64e447c0de4da4a1082a729d8ebe14810d396933085cde18" +
-                       "318278481fdb9a748b637cacb491f5234bfe16b53a35da6677336baeedb7" +
-                       "4a28c19a412e7812dace251446d40ec07afd63854c3dffbd5c0f6a9a3cac" +
-                       "ee3bab07fba94800fd1fa0fe44f5f2ecb2b4a188cd02b8a2df0728347c50" +
-                       "7d0cc58fcd5d54dffdbda11dd1bcc59758396ed8db77498fbe13238d3d8a" +
-                       "0040194dfe66811542ddaa658094a9580d4e4b4e29",
-       },
-       {
-               key: "1285f117bd90b70ef078ae62f37d2218419e894b7d334759ddb2d88833b287b5",
-               tag: "429b2b39195a10357043c9601590a277",
-               in: "00ef065a1adb4ce7108b497813ccc748933fa8442689a7cb8dc7c1ffdbf6" +
-                       "c09adfe05ca2cc5ec3acb7493f3497ee8f9cd9bb8a4b332c18e33f78114a" +
-                       "c8f9a72ddb9f13494e934ad711818909831013ba195b53f5e9e5b4689399" +
-                       "6d0b669f3860958a32b85a21009d47fddbc8697b7c9b92dc75d5060eb4fb" +
-                       "40aed7a1dbe69dbbeb6296f5467ea2426cd17d323671fa408855bc53e5c2" +
-                       "d111203ae38cecac7719c0bd7f21f6bd6a1588187b3b513983627b80ac0b" +
-                       "300b7fa038af1cc8512403ac2cea6e406595202ec3e74014d94cf8780ed0" +
-                       "33c570e887ca7fb35ee4768202aa52427d02c24e63f7f2cede95ca9909e9" +
-                       "dfa86246a27db757750667c198c9aff4ce348f7ac51864b36ef5695df713" +
-                       "d17b8f561a972d0136bd9ee9aa16079c2ab5d29ac9ab472255ade05dc49c" +
-                       "b966e0c1c04258ef9ec59ded01f402d9fdcd9a2020a2038a8c78892ca218" +
-                       "30136069485527069132959dab2b81c73ca590fde2a7ecff761d95a54d63" +
-                       "a2664aa5a6deec163e46b5225bc98976a4f363063b0f42e29f792d138af8" +
-                       "eae68d3854b5c1985d5cd1c9f49f529b0b4d2c936887b5b92cdebacef992" +
-                       "c35e0b7bbd52114aff8c6b261852e28e451b02099814f809b0289cba0586" +
-                       "04a363e3f969aad3d982f645ec4c549f943fb360fb8fa0d5a597bf89842f" +
-                       "8ced6014a5b2590ef71524a7ad50fe0ef0e2f81b6e26b99f9ebbc8036549" +
-                       "f7eacbf6ab884710c6406ff59788e03ede35c30d4781ad5af171e0623e8f" +
-                       "cf5344d71165f0475e256e9159040f702b359a2963116ed135dd6c1d111d" +
-                       "2a1e33e15c178ca4f02c5fb15593c50cf9a8a492f01e04778dbb81d26c99" +
-                       "0c58cf50a9bcf4fe38fbfc0fc0685d8bd422a773c7bce649f7a86c59118e" +
-                       "f5f857b2c72508cd1ef05e1a0c0b7ab4687fdd57437092eb49bf41a9ae8b" +
-                       "bd98272ea2f8ee2515ff267fa6ae892c266a7effe61ed54984924aefc461" +
-                       "6cf483dec024ad666bc797beaa429a742d1b8806f67d451b6d3a85b4d474" +
-                       "003cfe9e9dd906df47da5559c41f15afabecc3e6af279cca0f2a200eb2e8" +
-                       "31437e034d457fc880f60f5ae635690bce82bf6d1ad6b4f5344ec042bf25" +
-                       "7d010273c861e3ac516e9ee2bab3a255f570baa32298467bf704bf6d9076" +
-                       "a4c0b08a528a05cd1fcbdf51f3885fbaba7891a144fc058919903b269b4a" +
-                       "29f43926eda32c38853b814a7d528156c223748d674d8f7f5448350f011b" +
-                       "bfab1511001b8014e20fee37ccd4a0456f638c197c86dc116b34f955c0b7" +
-                       "dee10bac5ea0c2fec8a780ac05098b51b902ca6afff4db3c6fb4f761df79" +
-                       "b2039dc5f16d9402442a6fcf6c4297769e6c36824d908beba8e584ea0b3a" +
-                       "91b9017baeefac651d0307bd89f517789236c0693c65a5a20f244d39684c" +
-                       "eb810cd2ffd3c78fe9285d2eb9f55d133b86113efb8dffcbc6d258e84c38" +
-                       "2dd8f4d7d63b65672516d9bfcc3310a79ce244b60d380128d529487f99b7" +
-                       "d532d5f5c28fad8b9a071fd2fab8fd98f6d7ed9dadbd2fc4396476eba6e2" +
-                       "1a1b1cc594a31fbd3418d98e4aa736cab285a2786fbbd4650e49f9b080ed" +
-                       "3fda34941c28d25545395e1408fc3e60730d0696061f821a4d24123cadf2" +
-                       "3af3d37ba7ce1ba3cde1368d468f136df82c02f9be9210022192aa02117a" +
-                       "ef5ff70bcfeffd47bc37b920826a4d3db001f956939abc0df520f3ec1613" +
-                       "ba1c4b3385cad97e42bfd15a3150711fe86ba4562f17780cee1cdf198615" +
-                       "ca06270db84986f33e1d53d552b0da82397c496a23c7a78ca7641a908e71" +
-                       "89249cc657c0431f1e09ae0213f28a27e6267e9d17b5bba0ea4f3c21f266" +
-                       "fe538e215ec62f85517ae6bd87799ac5ce68453f09cbbc50d6e2a168f0cf" +
-                       "7166ad50cb65b6c76406c326573c00e04a3186251c6181933828c58f4198" +
-                       "f8208c4484805639b0d428fd05b57e4356239638f458a84000c7a7a8de62" +
-                       "ec25b54d1e39d2579ec9c512fec475f243576f35efc02a1cd6b0478e2dc8" +
-                       "be5f17aa4e3849cd42e76fbffe6e7d6f912d6edf80f718f94a7e48e1fc10" +
-                       "6cac29627d9d4b82f05a30cd7c739f7f3ef7ea368d22612f189da450e274" +
-                       "de7b61c6361521e684d639be5af4cb11fefa5fce6f8a5065c90873e504c1" +
-                       "2c940571ea7bd7e9221129b83039d2edb069e8b5bb68567d8fcae34c6ee0" +
-                       "cb94474d8b056cc3c7403873f2fe6db3b567a44e702e4f4813b2a264231b" +
-                       "0a998207b41916715ef94e5eec281589d0a711f8e74be32bc60f43d693de" +
-                       "77f21d5f7eef892abe87725f3d2b01d9ddb6dee15f40735a8fb67766dbcd" +
-                       "020a93b8eef4361dc3a891d521551f65dbe6e3f68c60819b0a540b0991c6" +
-                       "4449d207cf5b1c198c17ad6caf3adc628d09fa0baae7a696d84e1879577c" +
-                       "ffe9b3f62669d4ea5ebab6364f08c66d170ee4a94d61fb77d60b33dd6b60" +
-                       "650f034c5c9879243d5c16f853dd7a89885a9047a341b076912d47872b3b" +
-                       "3de49edf7451b435698ac4e182d16c339be83e18531a34aebad36c5c7c93" +
-                       "aaf121cf99ff92d3844d40740fe001eeca9ee71300d826bc3cfc87a29d39" +
-                       "ea108a3cf259657ec4b967fbb534e7513ef3a96bffb35abc5ce0e890696e" +
-                       "54fab515af3d2c0be6e003747504e486c0ec6e30fa4ca79d6596ae0425f3" +
-                       "396e40fd37432e52c74f812250dad603b3502f97ada48a26e39fd4d44584" +
-                       "6591bfa5ffb3770d95d3dbd49e9c3a38c6305796b8f7d79bd0845170925d" +
-                       "575774445299bdf9d3f8ad3dc2dc5cfd3ef0293b84d6e11370851af05ebf" +
-                       "b3510a22edd930797dcb76b759a9b5a77ed8dd5130e79ff5ac44b01901bb" +
-                       "79603cecf674202bc5d84076ff41b3c806454ce80cb9e5fa9db77294d20e" +
-                       "6d3008ae3017aba712862ecd4b32daafef1b8cc8b19ee8f8bc3835e2372b" +
-                       "5cec66222ad5ea9df753c033508ec43c8b5995e88c36c13ea3465c8bc462" +
-                       "ae0a659d9767db34499e9d01fb1588410257d6f588b3fdb766a66bce28b5" +
-                       "e0880f8cf988a2e5eb5bf80cd7d83192b7392fbb2e3a07d51aea2b6bfac0" +
-                       "d74d304f56d5af3598a0712cb09c04c5dc14194eca8e1b9b29f88344c0ea" +
-                       "55638c0f8ebb70b6242b797fe2525fa1bde76293dbc0a66ab4715e6f9b11" +
-                       "f7ecd8f35a20ee4ff3552caf01bb307e257ec0576023d624d6094d43d25a" +
-                       "aadfce939a6808f8baacb2109c3de50a1cfada9e384cdba3e97d2c9025a3" +
-                       "2377bb195fce68c5569d2d1267e1bc68fcd925ddb4acf567fb29ea80517a" +
-                       "7e4056fb014cdee597333ac2408157ff60cfa1afdc363a11fd4883308cab" +
-                       "d9a8fe56c2b41c95eaef854f20bf5941ed23156d86de3bd413465a3bc74d" +
-                       "5acffcd15722879849c261c1bbe987f89a1f00b3069453841b7da667d566" +
-                       "e41fd894d94de44c23fed08d9bdffb723aa8449bf236261240d865efd7b1" +
-                       "74a4460e5004ff77f4196d1d421227dff7c78f1726df7b5eebddb4bb5f57" +
-                       "5ade25296dda2e71ab87ea2b44ef2ce8742a7ad5c1e7a40e097eb336561e" +
-                       "865515f7ee0efbe01d5a928f208f7c9f2f58974d1c11af0e737c673dc446" +
-                       "1795da9757010cefc6e7f2784658717938735ed8cbcbd7981a1bb8f31cab" +
-                       "b901c87a3218dd1195c59f64d0bc3ce8b72580fe38e6dbf1181e0090e5c6" +
-                       "d162df9f31cc52fa6a8ac61897e9b4b3cb0ca2bfb38a38d9b78e46d775d5" +
-                       "7645d2d6da16bda8edd8675e2ba121f7f85400cf7cacb9ffcdfae583fb93" +
-                       "753d07985a00afc3a4e26c9939a5116d9b61196502f5d774ab4c7fb6cfa6" +
-                       "01bcfddcfabfcd28055e858d7d3c19feb6bd7c02565add3a3af61bfba8b6" +
-                       "f4b52c072a8613e878368318383143059a98a85ba521f781a8983c2486ba" +
-                       "b83f5b91fce02acee0be8d0dda7489975f0506c8f363b5adc48ba971adeb" +
-                       "4e1c830b5f264ed42da36d2b5ce2fdab1e63333b1061ec5a44ec1b6e99da" +
-                       "0f25e7f7250e788fe3f1b8e64467d3d709aeb7360720f854afe38e190cc0" +
-                       "925c6cbd77fbfccc07d8beeb0ce68e47442fadaf13b53c30a03ce317cf79" +
-                       "dc9155ddf96814583695f15c970fd0b6cea0b04b1825eb26e65ea9351bf2" +
-                       "f7a841ddaa8c9f8e885b7c30b9985bac23d3ce777b",
-       },
-       {
-               key: "491ebd0dddefc9f0117176772f9bab61b92a1f1de13796176091c56d1e53dfbe",
-               tag: "fbd3f884a3dc2a8be06ce03883282e1e",
-               in: "953b9a40789b206fb507ec2c5e9c88ca1baf25ad24c11a62f664db1da8bf" +
-                       "dbe9b54f8e93b0bfb4adb12f8873096b8960fd91eb92a8ddb53232ac9141" +
-                       "57caced33424cff943a8db129049af7e7b733afbec6637d8ee4f39d063e2" +
-                       "be241cca6a339e48d72372efabceac57220692c40856532d95529adfae87" +
-                       "a71c72f30244126d01a875375ad8836ef8db929bc81027935042a05c346f" +
-                       "bc94dcc057db015e55c56064d2b11154596b813ee64b73bcac05d2688bf6" +
-                       "f1fbb0cf3f8307b3df44c3e2dd1d226a4d0e9dc5f7482bada9611970f887" +
-                       "f656dcb19ce1f8c5c86f4cbd1e4f49b18f170ecfd184028e769e79d7424f" +
-                       "d01cb315897c21111f53f4d41c3b71402eea695272cb5b4e5f33abb9df50" +
-                       "cbdaa55ed629d3ed7d93b43e550295502db1f2ed884afc320518e88be4c6" +
-                       "b62a13f8d3636ba091d07dbc6c20c7e7fda016c05b2fadcfc9ea32f4ee2c" +
-                       "4893de78ad8a1771aacf6efdbd8fb1f6ee9b0572ced3edc6313185b5d398" +
-                       "88ce77950aa4c5201a256e3ae3e74f05b70faada14124b35b105a70e7769" +
-                       "7184576b69708eaabd36e0ba885fc6bafd5738a67307a1181792333cddfd" +
-                       "a4ef19c88497c82fccff05a8f9f732fc7505f0467a14e135288ee018aef3" +
-                       "d0412f6b0760573d8ee4ab455d2789b4d22a42eebdf60616fe403627cfca" +
-                       "fea672bd0a49e8e7b80e7b7b8feebce3381f2fc16819a8996a99ea230c3a" +
-                       "84b510cf2e0d914610d646a2f45a14268ec1d6fca03d0aea5c9ae1c8d519" +
-                       "b0e8b0f6fb8ad176b5d6aa620b253cc492b5e5645353fbd9b6c02bea48f0" +
-                       "286e2c669782b5ffefa4d8f3f1037151026d9cca78e7808dfbe61df29e82" +
-                       "951d7154f3c97606cd1e99300012578ea6a776dcef0811338b56606b51a6" +
-                       "9893fe68f762af6c9c26066b1d503e64877d8cd988b443af66a36af8bdfa" +
-                       "41b4dfb3721d1d81895884755b9c52527030afdfaecd66d4638fab1d1786" +
-                       "3d5517ef7ee7d081b5555d24991810f1edde30930fd392f817cfe632b4ca" +
-                       "6fb0460c36bde4a5620b9c369bf51c7d870c43998b8171a553d2f643fe8a" +
-                       "58aabfce8cf7363ea978ff4d53f58284db822ca95b80306ec02a64d26a29" +
-                       "c98520f1924c70d161682c54d08a2c48f54bb72980a8cf5babd0aaf0fd72" +
-                       "7d5b1b9d9b731dc49bad228fe83f7347750e277a4fbd526983c206e075d6" +
-                       "a03d68957b3e925a71bc1ea7304c77660d112a5d19fd21a785d4a8d7f2eb" +
-                       "dc4183376d8125341eb28b2df5be0b4e04bbf95c47d2fe2aed939619cb97" +
-                       "79548b752f57b723cf8295dfce69c9b7486b75a4e900f91926636f3fc78f" +
-                       "7b7720a5151abdf5868fecf1e1a1d830cd6a4c5e3cd739da4432cf1fe2af" +
-                       "a1090d6a1eeb32e7236ecfddb9d07b97220ab8e23edcc93d91abc11b0c30" +
-                       "460d2027869d1c2487070cf60b85ad0b8bc5df566f6fdb0e58fd044da530" +
-                       "6d277e564ca6cbfa820ca73fb6201b240a5a94c4ecd11d466cdc44046a66" +
-                       "32478221bfa69b3a2cebd16baa302a573c90895d7f4cab453b11e3a4d8bb" +
-                       "b5a9bf264781ce5b9796e3c47d0fa57f46b923889af4d073270a360dae8d" +
-                       "51d85ea916f14787c6500d2d906ccaaa92d20d93edd09139f79bfeb5fcd9" +
-                       "8c1cdbcbe9f2587e9c9094e3c4a32ab9ba56f400b929e80c0551f953896b" +
-                       "e8eda6ecf22e6d4a541957dec21d6a9cf388ff0ba58169ab934902892a58" +
-                       "86e1126b16118e965a271495ffa339c49466209ed3875b568a4290b7b949" +
-                       "69d0465744a3c2a75c599c3a04ab1a3fd09125fe8f45724b2f48c7822b9f" +
-                       "ef95af4b758ae66a8b6646df7a0a1aabe2a24c052fd6d30561cae0389263" +
-                       "e3388c4c1effe431a04356c334aac64f36593544885c4b7295b57dc39638" +
-                       "b665b22dcbf7dd6da867615de38c6a575cc66391135d47f8e1f0c73c6129" +
-                       "17ada4099723933a758d83311b384364263cad5fe14bdd7c825d9601c400" +
-                       "3537a5aca7f9da4710c132ce8b0f1464cee625633ef57f507739a0ab1cd2" +
-                       "21ae634d4d0b3ff07e9ecb1baaef0a82a97279d46543a0464855cd62c07d" +
-                       "5e890265612906a9eac88bec07b1dea5f67054c31ae40f8c673296cc5df7" +
-                       "f0dd8cc9e643b44fd90dc2d1e870ad8acdbe165237642fd04c00965837cf" +
-                       "bd2344ae830887a5719a3c16dc8ec08bd9131d055bfb959b64ff4cb638a1" +
-                       "002a4fe02e369871cc4e3ffda17dd85343e679fab43e11970e60198b424b" +
-                       "676ab17fb0dee10cc9c2e92b32b68d5b05b7a559176f822850c0557ed98b" +
-                       "7454916e32af549a0027db95f02b88cfc5e7e05f28f53757dd97cc0f0594" +
-                       "212f8801e58043cb17b040413c226dfce2104a172d218caa4353890de17d" +
-                       "be1f53af6ceda24b8781801516cc51de9ca459e469b3c322be13d8c9541f" +
-                       "755c518ca41a0ed42e44b9f87faa2a968b0292216e9f3d3e8987282103e5" +
-                       "016fe9f7681496e1e8d663eb2d8bc30b41d735465527f19e336a98d2dc54" +
-                       "d7c020bfab30fe6c62cbae7d09f84af69bc2c51a1839ffba15015d381ba0" +
-                       "a44a3758771c4f18d13827f518f30bb74f4bff29a87d4b9e949f1063f63f" +
-                       "662721cfd64ffe1dab3761852387f78fa83fb48ae2c75fc567475b673da6" +
-                       "fa8f53770b6e5a3c9fad951ec099c6bc1e72d1c489e1ae620e7f12ddc29f" +
-                       "ed65f29c65cef75014b999d739e2e6e015f928a30f2fee3f2e59bf65b54d" +
-                       "89948bf2bfde98b076e5460643952befd02fc1b0f472a8b75195c53ea296" +
-                       "6403b9028db529cd04b97231bac3068855fa211f4d976a88bc27a0088f04" +
-                       "576e2487ac0467992066ef7667ca8429faee92db38003728e5c219c751f6" +
-                       "6f011b5d679fdd957f4575a0cfb6b54693a9624f2c7e66c578f5f0367005" +
-                       "c66addd1e3ab7ea1ac404e357cbdab9438b9b4f80b3a6761b864b006f1df" +
-                       "689ae4c0434b06b686d5353d3e421b57381ea24fdcf6199195ccdb3d5cf4" +
-                       "623a6bb1f9eba9b22fa15395f65f8093b5f90455061c1cbf8128b44a31e3" +
-                       "910862a59e187aa7f4d22e0317ae6c177cef24eebc44171f70c25efac73b" +
-                       "38ada0cba0b74f72d1c171277a734819c1111ebe46d5db20a6ff20e2c1a9" +
-                       "a57edae95a3c1f80ddf2b12c86d3df0078a7bf68695b16ccf92053c727a4" +
-                       "80586b8d87d0d1772e456fde0c20a7927f351a641bff5f22f9ee2217b6a2" +
-                       "d0983c8102d7d5356dea60a19e105ce366b9d000987c8c33396569f97c56" +
-                       "2d0fc0bc5859779aa10efd1f8df0909c307a9110083cc6d9748456c9bddf" +
-                       "16dccee52b7974867cec718bb0b76b3353379a621257094277a30148ac38" +
-                       "e5cf67ed7cc9c1bae12dbdeb99d7d880ce98e17f0dc93c5330d1824a3c9e" +
-                       "ffd86f89e15b59a4bee5a48d4f674766896e187abaa39917b83f8d2f3265" +
-                       "bbe7aac44c9f8d92f775fe6493e85ab44e6e28f79f28eff156c21e1abdae" +
-                       "d10a291b88c4020b1ae8be001080870847a852d073e82bfc751028ac62d5" +
-                       "6aeac1b18f2cff1c0c7d336bf08f8cd5099d9d3b28f9e16077e9caabab49" +
-                       "f2d234616a7522a6bde1a3b3c608df4cc74a6c633d4c8068138abda8d26b" +
-                       "4ca70f95d152888fb32bdee5dfad8ff4a5b002a0a327c873656db8d6fdd8" +
-                       "ed882e47ce8e47c729e1292db9122ce2e9fa275f9bb986eb7e0a1dccb7cf" +
-                       "abd0449c92fd35e2aedc4aa89caf53bcd28170cae85e93f93988e723a896" +
-                       "10cefb4edb6fa545835fba3107e21dceb272c5a32da26fa77df070f41d7c" +
-                       "ad1d68b836199ff0f1221e36b9b976b5e69bed54b5bfec67fe9cbb383484" +
-                       "696265204797634594bc335150daea92dbc1004f613b4c27bf5c699debf9" +
-                       "4365041b5a894701da68a93bcb61f4e546c553fe61f14ab0322b45915da6" +
-                       "ecacaa093b0071f2516ca8c3fef2f1e3c403993d734403c47bfe5f4379e9" +
-                       "cb5b613fde3c0d880cecef4101aad8b8b1c60a92ac5185f6c243fdf1711b" +
-                       "0b56f0fd8e5ed6cc0f99da888e4f156455a0f0eb365b8964347eedd15d80" +
-                       "2f297977af667ed1376dfcc610f5152421b97afaaf16f9db57a435328595" +
-                       "b9aa00b5ed9ff106c66970fafef379f4d2f98f2c5984ea05aad64651fbf7" +
-                       "7968c8cbc4e959859b85302a88a3c2faed37765f3f6ced59d8feb6c72e71" +
-                       "f9d4497d98bccf95fcb650f29131e1df1bf06a5443f8af844aa1a7b5a68e" +
-                       "bb250c7de3a65ae9b1086cf83f832050e55030d0f67c6a54ea2a1dbe18e2" +
-                       "8a96c9e0dea2966997bfc5c5afd4244e3c8477c4f5e8bee8fc8ca9a5cde4" +
-                       "d9c5a2c7f3d2e811b1de7ce4279229319e432674c609b4c8b70dc6172e9e" +
-                       "653fe1969bbc2cb3685e64fd81d96d33",
-       },
-       {
-               key: "b41db44465a0f0d70093f0303bbd7776017bca8461c92116595ae89f1da1e95f",
-               tag: "d8a111a09db22b841fa28367ce35438b",
-               in: "b074b0984fb83749586881e8ec2c5ce9e086cfb2aad17b42b2429d4cf43a" +
-                       "0400fd15352d182e6c51e9338da892f886f460d40bd178d81c52e9ab9c1c" +
-                       "bdd812594e6fe7a9bb7fb729c11328d3288604097600a0c151fa3d9e4268" +
-                       "de75866558e9f47d8dd331994bf69f826fd4a6cb475ae5e18365f59a477a" +
-                       "dde7fbcf7e40b4e3dee020a115830b86f0faae561751e9b596c07491c42d" +
-                       "e02fc979e69071113953729d7b99f1867116d058a90f1b8c0f9ba12c6322" +
-                       "4ebd1b563a87734f5d6e2d4e6715d5f0213e33316500cc4b23784f78a9bf" +
-                       "13fdf99bfe149cf47aeaaeb9df1cee140c3c1264fe89bcde8acda6bde16c" +
-                       "e3d770ba51950b67ad2c5232ae0cff048ddfda8540cf18e673582dc96987" +
-                       "4b127f655e7d4e08859f2c6b95403cd5b4e2c21f72bb872e49e592306286" +
-                       "48ba1b16fc9637709636b198f9a297aec364d4c3bc869dcad32b1830e434" +
-                       "b556b429136f0012a0a0b6fb3797bc8668014b010ea51674ef8865348dcc" +
-                       "197672047fcf72e6b6910a0e32a4f110d85e28db0e338d9cfdec715a8800" +
-                       "b4f007a7951d09e41620815848c89f8768344c50bd522c46f64ac6c98e53" +
-                       "92176651961c7a70b62f3d1819bfda674e2ecd3167415edc4b97419e8ae4" +
-                       "9974b56cd8d52e1d05b82610b59606a750b34844ca33bfc9b21fb970738d" +
-                       "b66f48928df79cf67730a30b0b612f8c15c22892120548ab460a6b9bb3ac" +
-                       "e30554c86c9681c797821a1b1ce91d0e87fe90ad4097c974cfbdfd5c4c24" +
-                       "a5f808f388e1b1473e858f48a387614501c8c39d6973ded69b1764663cd5" +
-                       "166be02b596a49e392d637e3d8afc91323f7450318b79d5488c040e346cf" +
-                       "0cee512044514b570aa66bb98d639a9ee23a7cebe28474592623d082873b" +
-                       "73efb3eaa4721fc4761e15a390497cb13cce181107e8b1a0186b9e47a5a4" +
-                       "b67a5be3cd88a43d341ef63f10af6970aaf56035db938655020809033a92" +
-                       "8d4fe6d2f5424fbde2fe82adfd991d388edf293cb4e3eb68d876f225a5f1" +
-                       "58208bcb1aaefcbc28d6763d267406aa8d6ecb413d18cff7a318ba031ba6" +
-                       "0ac4560748c248de64eec56dd4540124b38581604f502d94a2004f9eb1d6" +
-                       "edb009e16af6c6d3ccbea79b10743da98aee7ace407a90c6cfdde694f36b" +
-                       "e0271e722618a457be68619b980754795f4ac95ebf4f1820b85ca8e3fbff" +
-                       "a2430f8e01ab422d7140751f7741f2c921400dac404b04e049736738a87b" +
-                       "6f49bd54b1b447b922c473831a65f224ab84fc96e4551a0333bc6187e15c" +
-                       "c0f0ad628068bcd7c043bd1e3036ec01e7fdc3d157476149917baafaced0" +
-                       "15d09fafb92181a0ec65b00c9c13631e65de184377416e04d3d93b847e0e" +
-                       "286c1d88245d4d550d30d4fbfcb416ff26a39a94275631c2deafc7cb6780" +
-                       "f149e4d0e9c4515b708fcd62be5252485407a6ceeb9247de34e0266ef384" +
-                       "976f6d31284c97468b3b03e951d87a5a00836ea303a266147a79ff3431b4" +
-                       "b382e86c74d92661e0f65e266b7d569c03994b667a8137f3080eda2ff542" +
-                       "0f0b52b427558dc26932a22a615c9e6b1834a251c6b68fdfc0bbe0e8781e" +
-                       "36adf669f2d78bd23509ef7e086634e526258e8d11a1e0be0a678ac09c7b" +
-                       "b4e3c5758504011e701dc85997fe2a3e40c7af83f032bdbe7adc10ef1e4a" +
-                       "666946c2bf31dd8e3a383211c9684d5302f89dafcf77976d5a02c14e2462" +
-                       "09d2d99918e82402cb0eacaa12032ad8316315af1b3d3bd5058f7c935d35" +
-                       "ef0d4e71373958fd5e4140a9a586d89c53e4144c00148a4706a524896eb0" +
-                       "5b1479a0de5d3f57be46b3f5fa4e49bffe027c81a33e37abc01a4cafe08b" +
-                       "8e21fa86b42be52d75d6407e6cdf399de7aedb9b61a6917b2677b211c979" +
-                       "33536664c637a57ce2234e3319fe8b4a77d7285ae6347464dfd0aab3e6f1" +
-                       "178e0029686770d3b0dd541490b097f001e95f27efe8eb16e4747937d643" +
-                       "cdefd49e586ecad541270cedc3064bdb7c79f086bf1fa8c666304d977a15" +
-                       "54ae268881e17d8bc3fe51fa9969f7e560e3d3e050424febec0998b35f2a" +
-                       "7378b2c3e384cbfc80c4987734d76c78224cb81cc5376f88f0ceda28aa50" +
-                       "44e956537c3ee209071d84a66173384e0aa466d989759fb1f2f17fe627a0" +
-                       "ffeaae7c5a3884b237f5151278a07117c2e833f1815c7e0e0b1611f25058" +
-                       "ca338d21deb1a571faf1d0486667cb7c58e2814c3722d24fb77ce1b7e018" +
-                       "2ae5746442b5ad00208b17c0a68bab4df8a8f36edead4fbe79b4c9220dd6" +
-                       "acea6d23c7caaf6ce7cabeeca677a1c764d610ea6c7e994d6a9c88f57fda" +
-                       "ef160b251e7595578ea2cc1441d480c14b8b6945e76a001891b1f214979b" +
-                       "c52ec15e9480d706a40cb6e3b259ee99a9e84e63a738f1b52cf71c8ecb04" +
-                       "fc833c2c680bfed587aa1541e5ffe8bbd7b21302bbf745011e559f94f952" +
-                       "8b7fad8a37f6d855306a5be22725859cc950bcc334179d49564af3b9c78c" +
-                       "e1de59a9cb45086a33856ba7195c17cef573950155bea73ed16645768bf0" +
-                       "a5cefce78ba3ff98a54a8e8afc5dfcb0d422bd811ba9b7770a663b081dbb" +
-                       "40aefffbeabca955a9638830f0c5d70663cbf5b26067cd061c4a3f5cf8fa" +
-                       "4b6678d82d9a2aa33f8538b7499a3466f6b0ae2a1daf280ab91a6c220684" +
-                       "12705245f353b4b83db50bedd3bf99d42bde6363fd6212cb745467acb007" +
-                       "b678128f6580629a06171f7f3af272f8900b801af3bf47439167871e7b0c" +
-                       "33f198333992a6c52c32be46071738cfbf245937d48f816ebb88ff0e726a" +
-                       "dc41de4c771ff0bd320a4c0b1fcccd9fd6c42ec9c5185943c70e9a4b7c26" +
-                       "a980afe104bb1f99576671a254704c7d4233eaf9915e1d56c103ba9f6e8a" +
-                       "46aff466933bf58c9842796ae9cd21f7ac6aa96ef42ca54e390203bac354" +
-                       "b7c1de7d1887c48255201335f819020e2782a2ee8af92ceb206b651ae92b" +
-                       "3f4fdefed05e08974aee0a353d104b1be9a5e75c7f958f1981271b0a6928" +
-                       "05a7a2f28a0448d86102b4fadf9ab4ec2f98e31e64fcfdf2b524780b3342" +
-                       "7a2a3100c2032fc93199f3ea7a9e8063fe73282dcb1fafaa9496c7da868f" +
-                       "dcf33bbb761df0bfc6fef30fadd2b6efef4fd3216a8aee48a2ef28102491" +
-                       "cf7278b567c272d1064a277eb193b3f6f01df641ddb729f72454943cbd3b" +
-                       "671ec077f9e3548f5f57d063c653ebee4f228a78f8a128d26f7f4b44160a" +
-                       "07e942bab87b2d043c77ecdf10c1a419e0a1c4162a99c21d4abae0558b8f" +
-                       "4dc0b7f1ca3892a6babf71f2f70aaca26bb813ac884ee5d71abd273ff1c4" +
-                       "add230a771b678afbb12a1ca7fbcb2c0f5589c9ce67fe8f78a8db87825b3" +
-                       "09ca34f48ac35aa7ac69c2fb2423807650fcf47ee5529e9d79dd2628718e" +
-                       "230ffe5b83f9d5bdfd9c5d211282e71cbcacf972995bf1b13d21419f7fa2" +
-                       "8829ed1dcc459da35883b9269a474f7fceff01d44ab78caf1ef7d8117f50" +
-                       "cc83eb624062b149a6ed06ddd1cd1feafccdee7122353e7b3eb82978ca69" +
-                       "247fde52d2d6cfe7324f04af5259e1b5c2460889da4541b431ba342a1c25" +
-                       "3a1b1b65fce7120829e5466e7ad2fe4e0f773c7c13954a9c92d906c91aa1" +
-                       "de211f40916596bfa8245344e257e5907a2c49ebcc864cfbe28663e700d8" +
-                       "472c50355313d5cf088e9e8a19cdd85bcfc483520498c6386050e53a3ff8" +
-                       "1e2b77b55b116a853d71f60d621265166cd7e95ff5cb4466226d7cef68ff" +
-                       "d0a35b61e76a43cdcfa8da7fff9558e2f89b981ec6be632b126303ca1fe8" +
-                       "53d5c628d967d39317b60ac904d6a882beb0746f6925a86693aff4deaac2" +
-                       "e5b64b611de86767d55a6e11221605508b1c5cc828251539b1b6f65c2c04" +
-                       "8e65be5422c1b11194eb687d906c559068c0a810713b23b30d8b17f10df7" +
-                       "0962c5e7e782aff7bb95adfe4cba9d90b0ebc975fa56822025100b5cb8b3" +
-                       "8bdc8928c1a2a8034dd66e2a763696d7ce6cef4dd586b83f7d01749d37fc" +
-                       "4fe8d7abd324d4ff1efdbdbfeb0a2fbb8b266fc2bce8e5e5b95d0089e7c5" +
-                       "d7de4db837d1822ac8db8198889d6bfe778d0b19e842f12b5afd740aaecd" +
-                       "e36e2cefc2cf0b082aa0c4f75684d024b8d828d8f2911fe1aae270251f62" +
-                       "4f49584e40bb193577c9d8e04eb16c094653cdf9a15fe9210f724c7a7c73" +
-                       "74cfd1a74abb5ceae88ea54f7e7569f8eb674529cbec965ed05bb62f1968" +
-                       "8fdaa97297268bfeefd06eb21f700cc56f9bf7f6cecbbbe7278ada8399fb" +
-                       "960371a2d5cdb852b11c9fa17650e614c5297bf46cb7889d52bcf49d2560" +
-                       "720852822b75bb16524d88273cb366b84b88282da91875562e5a1fe73973" +
-                       "afe90e5cdd3f5381612d3ba7bfa058d023a9326e403ec474d8938313fb32" +
-                       "bdb5bf899b900c3818c43c8a0af6a061bd26e847ed75983402ee8a9cf4ef" +
-                       "85bba5545a0d329ba81495157eda0286f1917de512fe448251697dea406d" +
-                       "a510adcb05",
-       },
-       {
-               key: "b78d5b3019688e6ef5980c17d28d7f543ca5b8f9f360f805ee459717ca0d85a1",
-               tag: "f01babc4901e957d0c2032a7279321e1",
-               in: "ba7d35b2ef8af1118bce1e78018c9314b0c8c320591e103d23f715acb05e" +
-                       "dc98fbc618de06627661df5842dbba9f604c2d20d664e5db06e949b11d49" +
-                       "665088dbafdb0d39d20beaca7d723f8dcdc57e9c5583d303b6cdfdbecf95" +
-                       "7d8daf2f1c72b2a6fa27e3d18841f4841abafd334c110cd2b74efb6191db" +
-                       "ab9b8fc8427ee17664082f31db98d30bf15dda967e20730a9ef525abe9f3" +
-                       "f620e559ed22bf74d347c9869f0311f33da7f1a3dc858b3a8aa73a35989d" +
-                       "b055a4a2c269c95e352259c57de8b94d8de48984ecde426d3ef60ec1c7b4" +
-                       "41cc950f7764f55bd0cf52d069b9ad446d1f765f35d02ec104ffcc00bf1e" +
-                       "dc1b951ef953acd19984ff1b41041bea0e9f5326a7c9ed97e6aab42174ee" +
-                       "971ea1dbe2fd1c1f67f977ab215962b0195417170f6b7748fd57262424d6" +
-                       "cf7c235b34425f4047191232722932213b3eb73904cadd6a2e9c7571d7c6" +
-                       "6c2f705b5039ff75e5e71c5aa738bf4177653e6eb0b49303a4bc0e641e91" +
-                       "2691f217296a3325431d578d615afddf47784e4618a2ca40ccecb05d621d" +
-                       "a52f272b8cf84f7fd8177c83af1580d25a764cc06436d67171cb5d1e3b39" +
-                       "367b46d9a59d849d87ab6bfcf3fb9bac2b1ebfcd1cef4459e74b0e1b7080" +
-                       "dabd2dea79f75581a55de63c4b23ff67d986ad060102933fc6cce8d614c9" +
-                       "c86dc84068828dd9e21ffc5665c809d83b09432fd315dfce5d7a4ebd8143" +
-                       "181953e3f8716e47b0b30cc1f753e31a7d509f2dbd4177b6da310cf3cd02" +
-                       "5db270adf98e96259a5ae1b81f5be4d5c76f502a612ca73c76b91e0ca695" +
-                       "aa921f9489948619482c2956205ae71fffc3aba4476ff754e4878e36c763" +
-                       "2c935c076857c5b90cd63ea4764efbcee53e2ddc9bdce54b1cbbcf0e7544" +
-                       "d023e7c2b79419ad92221a1f76abe31a8236e370d38e2493cc9ca2aaa811" +
-                       "30fc713d11f500fd071d6eba6861e8b0859b372e62fe60b627a96c377f66" +
-                       "236aedf307e1d148a61bdad072b93d7d2a73367c595b1e048f7023e72729" +
-                       "1ec508326f5424a5bbf4e010d0240b71fa9137e6642ab40c5e4fff79877d" +
-                       "b3253c663a221b49b3e77ea307c7b9f3f72a0f3a54d0112c45c64a0c0034" +
-                       "baf2b55ae36ea6f811bbb480cee663136474dacac174c73b1e8be817916c" +
-                       "fd4eb1876582bb3a36cfbabad91776aa676305ddf568a86e3a5eb687fa81" +
-                       "67771fca7b5ca00e974b3cc3e322b4bd9bcee2a87d0ae7976da5e04fa18c" +
-                       "219fa988d4f6fce62f194b05c26ed3ae1b066cd9751a2d916d53426a454d" +
-                       "58f9c3b2fb49374e5791b412fdee1b6029144f1ca787f56fece4f64f4fac" +
-                       "bfe4cfd8ba7c807a83cf44008fe5126a283ab2631a87acd8e2a3bd10979c" +
-                       "4b07a84a49b0687a45a4798ded0b5e9b2acce30e714d78395bfa8f33ca91" +
-                       "e68b2138bd67d8a694cd87c88dcefcd101a3b408d7a9095cc6a4b38898ec" +
-                       "c8b375f5a67deaaf73eb7e99b10314ca6bba824658bee85dd731d9a1475f" +
-                       "976b7c0aed4b67b088f0db5ca5091273217f724969dff6cf184181377c45" +
-                       "5722beb23fd9d097a82ea2d8d527ba6284acc20cb30f2e52af28800c61fd" +
-                       "1faf9f4f619550e0162a1a63758e202533889b27420fe7d0eac9a47a6e11" +
-                       "1d80054412340e0426cdddbb3c7b9b823b8db3ef58230fad7a3ac21a7805" +
-                       "d30878d4ea78dda95c951b7a5dc552e9434c35e03e1dd88652d3714f8fbe" +
-                       "a39936cc0717c2e0335371f2a751204f5d9386baaec853f019325edfd1b0" +
-                       "719d1fdac3fbd774a64bf957fc54039501f66df94b5b9b82c2076c597065" +
-                       "dfcfe58b2e215a3734066aeb685ef97759c704b5f32dd672ba59b74806cf" +
-                       "ad5daeeb98d16f7332ff0ca713d541c84e4aef0750bab7477ea707e2e497" +
-                       "e12882dbc0765106070ec6a722d08fe5c84a677817b28fa3a41a6117f2f5" +
-                       "465c2a2f0eb2b8be4f36e676b4115008bade3573c86cfb1370c03b6b0dc4" +
-                       "bbbb0ada4dedac10a593655068a26febc2bf10d869cac84e046c9c846ce7" +
-                       "927431f606f07b92abdfd81260199ae05ed01dfa07088c56a6a8de9c6d51" +
-                       "d61d6a6d3f9904c216ea8329467a006a3d2495a768a39ef99a21827d2def" +
-                       "909bb743fed7209f7fe59ff1c1e710095b05f166c6173deef5c6ec4105c5" +
-                       "fc3b87c8269c786bebd999af4acbf12d20453b125f338aee87e9509ee405" +
-                       "9c9e568e336304d7be9ffe81d1700555b0800242d9b7450d7256f2b17f6e" +
-                       "d46a39f67bb2980572ce73169e352070dbafd4c7fa5a6be78cf9b72981c0" +
-                       "a01f1e1e30ee3736c59828b791d2373799854497a28a44bbe0e074925723" +
-                       "4986696fbb06ef9ea83fbd49c45a583ce12ff10258ba06127c67b0f66dd1" +
-                       "09f1366d8036853973d8884f93de54fb2a12949eefc020717eff47898cef" +
-                       "306b5de068411f1e113ffdfe2556e0faedc3e27d95a45b8afc15ba0eeeff" +
-                       "eb86da7b4324e20af80c62bf0ceb4aee1515f5912f71c6bf2febf20123e3" +
-                       "dd3a82dc1e58a108f1039942dcdacdeb1f0ad0b2ef34488d98d6a52311ae" +
-                       "acbd03c12f6e775e375d5979c7c295bb049f2cfd3580e3da3841ddd8e6af" +
-                       "4de5e6512ca79cebcab9280554524881da37984d340e8f0163fe10a02ed0" +
-                       "88682560bc6d3c4dbcf1a542ffb3dcc2ed16a2eb96896e8269697ffeb50b" +
-                       "73f2cc354092e782a0072fc12e1eaff117c2cc8a5a1ad8b47802ac9e23fb" +
-                       "91a0cef9e4027595e0885464e61563093ee2b1dc5f22dfd04af7de6a70d5" +
-                       "977d3751a4b3cc0c71a71c59c0534cb1f8c0eeddcf1c0e1b3e5ad0d083b6" +
-                       "6e8b998ddf9ae9d3b365c851d42e995b9afdf8d66b2ac40bf514ce32e456" +
-                       "0880afd38c42c08926067eb243c4b1184e667ba756c14ace5f525eb48df7" +
-                       "ebb429d0a23d159664f8021d27dc7167081de331c7114c9c6456e1ffdb42" +
-                       "2172a81c06d8deca995e158c48df27261a83f83e0127f5e056a139be9b76" +
-                       "e25dadf534d3d1ed6ebc0b5d77d51e5b90ff86f30d4023066115bc11b33c" +
-                       "c827b1103098826d0bf8777176b2da6f1e5b580e407ccf7e614fdf4f5b53" +
-                       "3ef6d30b20c1bee61eab90e983b1a97173a62720ffd27abb8976a948d532" +
-                       "d06596c23b0ef31c79831bead8f8e99ad209af3658cac0cb3c3f9c88379b" +
-                       "9bc871d8e84171d53400902da1243f664afeaff60bd96ba2639a7644676c" +
-                       "a79f43130af12ba2c877d67f7ec030a4217a72f5368af7c9f24e643db6ac" +
-                       "97a04adaf57dbc53762d8dfa1afd49667c4041adcb5ec303e191b786273b" +
-                       "bb065cd9f16a3a4a399c6a7aab9c1a6604998264e8b3dbd13d8f2228b13b" +
-                       "2c2b9fec5055d8e9f2df1d9a25e4bfe2029776389877bbef7e2c7621f06b" +
-                       "c0b7fc0786e2b2d042483ccd4a59d2872a6c5ac73e217123e5c8401580a8" +
-                       "d967e0895aaa28f4d25ce68c90b4394d8113bc423e9fae46ac47bc2ac191" +
-                       "fb97b80b5a85feb2bb54f84c493235c1408662fe253c6786fcf6fdb8be87" +
-                       "dc66a72cc847f94dfb5214af5905b7039a7363a1b23a07853daa26862783" +
-                       "ba08a80846fbb93ce98700a4f9961115128dd67bd7d19e0c588fdf6196c1" +
-                       "1cb0154002ae862f11421f5dc3a57b6c0870b452272be556a1d14eab1af0" +
-                       "a91ff5b89de6bbeed6e03bc64f5efddf9e54da71c594bc5ef78e0192cfde" +
-                       "da36e4ad1a6b0b51110c1b24d20dea1f19e18cb1184d80189f842d4f07ac" +
-                       "834744dd009aa3771b1e5502fe4b65a403a4bb319e1880ff6ba852e90a8f" +
-                       "4fcb52cf374c88408428cdb1255291b04ed58c992310955198d61fa1fd9d" +
-                       "762d48f2f65a287773efc67d549981c291b427889d3e3dfc0cc6cd68415c" +
-                       "dbed81b516786dacf431472a7dfc99688d15bb6c1b85b1a2015a106e5de8" +
-                       "cb9eec4c80b17d00fdcf4a9c64de4643a95dade8fa9f1bc5c839037d86c1" +
-                       "3800a244188e3b18561a74912ed72f99f2365f0126732d037dd54a3ab77f" +
-                       "9a9f6a1c1469ea92eb707482066bd4990dec4d7614ccb4ea6dd4deb8bee2" +
-                       "2c4dc0b9b4d4cc70a500d2c8a5ac3ef88a38439b7dc254a6d920cfd317a8" +
-                       "4d7747148c65b6730709e43369d4c995b03c58b9df444f77f216944e70f6" +
-                       "6446554d8d513b8f7f28ef0a2d7ad5ca2f6110304196953247a7ac184f68" +
-                       "61fba896c2d5a59007ec2b2c8e263957e54cdc1f3b4a145228823fdf0960" +
-                       "c33a28f59b03ee4be21001d2f56fd49ed14db33b2c4eec2c3f41b250a624" +
-                       "99a9b6602c1e838526a54cdcd058af1c252d56009d4c7769deace53bdb66" +
-                       "543f5a081cdde775e61efa70956fe2a7a6019a164c6e413ded314bc928b4" +
-                       "aebccb946ffdf3eb33e187bf421febe26112b3262a526de65678cd1fa03b" +
-                       "83513705108fe0bb87aa99aceb28af3641c46a2c4427cc1063de01aedaea" +
-                       "fba68155d4de494a27ff6b7fcc8f5c5c3f7d3a115c397a1a295bc55aec8f" +
-                       "7f150cbce2a8aa4706d54ec863877bb966ad441c57e612a1b5d438b98d9e" +
-                       "fcdfe6d4f66e885f96407e038015cf974ae5a3540692b054d2ddfde59b28" +
-                       "ede7e2f581eeb56c5b88e2779aea60c1d8ca6107b0cdda1ac93e6c7520da" +
-                       "edc66afeed12f980e20e1e1c327d15ade4bb90de30b011a9cb33855ca3ca" +
-                       "e2",
-       },
-       {
-               key: "2b0b0fd3347e73c2fa3a9234e2787e690a11aec97a1c6d555ff7b4047b36f372",
-               tag: "81b1a6633f849ab0aa7baafa58a5d9b8",
-               in: "427f3a7a5f1142ffa68e83df5f917e07b2bc454f3adce068a8ae9e0908e1" +
-                       "3e0099aaa9074697593c6d8c2528fedddeca05e3888be1a0a201c389a72d" +
-                       "20cb661017544d95a431e70e7c6580d8fb46ea4495bc59db6ae2cd69510a" +
-                       "02426c50de1b6110120f759960605aca718d4d0a497e003e1ea2b8ae9a53" +
-                       "df3c1eb4f704eb32f8f05eb08cecba0fd4a94f0daa3b0984c30a38f94b7a" +
-                       "10cde723182d30588bc40f1f9d38a3bab4800fdd5148e34e396144763696" +
-                       "c9b3e9b8adfdb337123d54237c7413f98bb2056152b256e37a27bb947c67" +
-                       "240fa3ce8da62ab367db540bcdd9eb873d6c71c75a08fe99b5c11ec8e6af" +
-                       "f926d2adfcf073479de394d4aac5fdc6241824d944b8773db604c59afc01" +
-                       "495ee755905e5616f256c8a64321d743a1c9368d46418826d99b762e2f6b" +
-                       "f998d37a995969cdc1de85f0ce3987c6550459f5e5bfd9173bfcb9e0112a" +
-                       "d91f092de446beba14fb3b8ce3fb2f9c941815b2cb5a3b406e2d887b7912" +
-                       "bba07c8dc7caab9836827da93ca71fa5ada810da1e5e9b09738524564d8c" +
-                       "923746d19c78dc9107b9f20f653e05d7f2eb6bd90cf5eb30fdd7b587eb46" +
-                       "74a1064c70ef0af2e75373044d32b78d96eb1db3112342d38dca0e47b96e" +
-                       "9307fcdd711b1c66355186369a28481cb47ef6bf6651c2ff7ee4665247cb" +
-                       "12b573933d3b626d1c6264c88bd77873c2e73e73ee649216bf0b6d6615ab" +
-                       "245c43569d0b8096596f25ceca8667661de1cd60dd575697370ebd63f7e9" +
-                       "5333e8a2cdb829b75ea83d72cd246d50358f7c094c8a515805fda03165d5" +
-                       "21391617c9f9a2ea562b419632df611a67912d2b369e5e505dbd5c719253" +
-                       "16d66cd608cc4a9583a8eaa4661b7279870345fac3031631c1a220551527" +
-                       "5be7d8d89b71960e687aace3a0e8f206e475053d6fbf97717b154c75406f" +
-                       "2caa97d1ab66048f1c99281c188a2f37b8bfc736c25840a9130ef2031c05" +
-                       "6acd9dc10592eddf94f5bac85319b10ae46cc136a0738aa803837287ed7e" +
-                       "dafe08d1fcf31d5e63763e39a5e1f4d7d0edab368d44e63fdb33c28905ff" +
-                       "d6be406a024c017081b4f2d70860776e9d2556cd008fa5017b58733da13c" +
-                       "634938407a118827a80baa28d4e605db59430f65862b90cd8356baa287b8" +
-                       "4e6d9199fd80abb9fa697e2c2c4c760128e4ec0438388cf407e2a2fe0f57" +
-                       "908187ed8efd4c5cb83cc91dbe6a11444eede85099149ca82921bc28bdd6" +
-                       "b9999594a41d97307f8854b1bf77b697e8cdd4daead2aa49fbc571aa44c0" +
-                       "bc84a57cb5fd85f06847ad897ceaf449eec45bddd4e4eb1e1e119d15d5e7" +
-                       "90957e686acbdda1bbe47ea935ebc4b8c2e3cf9b7157cc6dc03bcb19508d" +
-                       "a9e19cb76d166da55559ec7e0995d9b50c6c45932d5b46eee400c56d9dee" +
-                       "618977dcf6f76e3e86bc5207493afbc2aae9f569ec9277f33d9f61c03d59" +
-                       "dd6d8250ee8cb3e54e5e941afb74f0735c41d52ef967610c9f55b2b52868" +
-                       "4b549a99ae3392a7237bb52ff5f8d97327e2837268e767bed0bea51f76bf" +
-                       "88bf0286bf22b881f93f1d54fab5cd4e3c148c96c39e7aeef375de249df0" +
-                       "4d89d1bd97a7afb2be0cbfd3380cb861d31e4ad1ea8627721e4518b9db3c" +
-                       "cda20273ec23549c4adc3c027e3ac9558de2010a0263c1225a77dac8be60" +
-                       "d498b913f91391d8b2656ffddb06e748cb454dc2b7226745f11030a6b9ae" +
-                       "09ac8ac428d9c6500801fb540650c94610ab70465b1210c6db2064dc84dd" +
-                       "7f52573f8f40c281470e85176c85ec6de3c718663d30ad6b3dfc1a3a9606" +
-                       "1936744357ca62fb8bb066aa1fcac6d7a2adf0a635cd546bef39fbd3ee0a" +
-                       "8802ab0466ec9b049b5892a9befa4377cd199a887c34569b6f90852139a7" +
-                       "86babc0049ee2b527aa96b988237a52eae8b4b49d2ee15ee5294118cee62" +
-                       "3c3e11cecb836b21af88555f10be2eff8379beb615b7b3d6c01d545cacf6" +
-                       "61be8ebbf7a3c58ac5e0e7b17997659a2bf15f2b2e3d680d142fd29d23a7" +
-                       "aea9890f3ff7c337fce49ecedaf38573edfae07810ba9806723e576d687e" +
-                       "a11700b8ccb96a6559259c367cef4e3999a05a373ab00a5672ce8b3d1dec" +
-                       "a414187f383e449d10021b73c1f7e39ce01516b7af96193f9993036049fc" +
-                       "72ac059ef36b2bcfbe13acf140d41592880fb8294ebffb98eb428ce9e65e" +
-                       "1094521bcf8ecd71b84c7064539a7a1aac1ad2a8a22558fb3febe8a44b87" +
-                       "72fc00c735773d4ce2868a0b478ee574b4f2e2ceb189221d36780b66212c" +
-                       "dd8fd3627cf2faaa23a3d0b3cd7779b4d2b7f5b01eb8f1d78f5b6549c32a" +
-                       "cc27945b5209f2dc82979324aebb5a80ab8a3b02129d358a7a98003e701c" +
-                       "788a64de89726da470010eda8fdcf3da58b020fadc8970fafb08a29bef20" +
-                       "2bd0707e994015258b08958fc2af4c86c3a570443fe6e1d786d7617b0c66" +
-                       "29a6d9a97740c487622b5b8186c529d7f8af04d9f0a9f883043f08103ca4" +
-                       "d70057ee76639f3b1046d86928d54cd79fb5bb7b46defdf15d2f8578568f" +
-                       "1d7b73e475e798ec6812586700e038ed4791b23ac9439d679a1a4bc04cea" +
-                       "e328330c24b065c9cdcdcedfbaf58e5299779e6f48783d29ec3b1643bc8f" +
-                       "1095c724dea75770583b15797fc666f787510d91e65a8e2090cc1ed2013f" +
-                       "e63ab17bc7640ee817487f4eac8326e9c4698cb4df05d01bae8c0d00fc00" +
-                       "08919484d5e386c8f60b8ac097c93c025d74faa56e8cb688d1f0c554fc95" +
-                       "aae30873e09aae39b2b53b1fd330b8546e82d9e09bbb80132d794c46263f" +
-                       "4fd7b45fda61f86576dec52c49f2373e4dca31f276d033e155bbcdda82af" +
-                       "8f823948498f4949bf23a08f4c8ca5fcc8598b89c7691a13e5aba3299ee0" +
-                       "0b479b031463a11b97a9d0ed3189d60a6b6c2390fa5c27ce27e28384e4fb" +
-                       "04291b476f01689292ace4db14abcb22a1a37556675c3497ac08098dfd94" +
-                       "d682401cabec239377dff592c91aca7eb86634e9d5a2848161dc9f8c0c3a" +
-                       "f7b6a728371fac9be057107b32634478476a34cbc8b95f83e5b7c08d28f6" +
-                       "fb793e557513ca4c5342b124ad7808c7de9ecd2ac22d35d6d3c9ce2f8418" +
-                       "7f16103879ed1f4827d1537f7a92b5bbd7cd12d1ecc13b91b2257ad073b7" +
-                       "a9b1ea8f56b781bea1bddf19b3d7b5973f1065fb72105bb4aeecca5b7513" +
-                       "ffd44d62bf41751e58490f171eb9e9eb6d57ffebedd4f77dd32f4016b769" +
-                       "fed08dd96929e8efb39774d3c694b0d30c58610541dcfab3c1cd34970195" +
-                       "7bf50204acd498da7e83947815e40f42338204392563a7b9039c8583a4dc" +
-                       "faba5eaf2d0c27ada3b357b4fccd1595b9de09c607ebf20c537eb5b214b8" +
-                       "e358cd97992fa5487bc1572c8459c583116a71e87c45c0ba2ca801931a47" +
-                       "a18ef0785ebbe420790a30278d2d0d42a0225d211900618438d1a0b2d5be" +
-                       "d14f8b4be850dc8cb08d775a011683a69ee1970bb114d8d5017de492f672" +
-                       "09062d9ba3616e256d24078536f30489e4dacd6429ed37aab9b73c53fdd8" +
-                       "a8a7aff1b914b9d82d75a46d0ccf85f48d3ce9a8d3f959b596ae9994ac3e" +
-                       "3b4af137d0c8e07ece1b21fd8aa05522ba98f85a7ab24ed8c1e265fadf4e" +
-                       "9a18c5ab5684d8ba8d3382ad53b415c73ebfaba35abeebaf973b6f18e0d8" +
-                       "7f019420eb34e09bbb12afc5b149f1e9e9b6ae36ebde429d437ada1a2d52" +
-                       "b998f7c75ef731132aafc3bb106a2ad3ae11223a355804d4869ebaa47166" +
-                       "2df261d95d48ac6eb17c1781e81c0027ccf8f05c39e1eda7793cb16622be" +
-                       "ce7a1ad5d2f72f8bf4bdb2f4f4dcadac3db3bf727f0d447adddad4500360" +
-                       "09ee011bf4155e5e46c74b00d72e8e6a88de9a81a5a4685651b90e874dfe" +
-                       "eba41698c98370fd9e99619ce59ebb8342417d03fc724f9c910ae36ac5e5" +
-                       "b46c424141073199aaac34232a8e17ebbfdd80eb75e82290de92968f3893" +
-                       "0ab53dc83ac433833576e86fbabfb9d7cd792c7e062811f4cb017710f841" +
-                       "1e0fb65ea4b3cd68b0af132cb08330aa13579196ec632091476f268b44ba" +
-                       "8f2e64b482427dfc535d40d3f58b4dee99053b35a3fed1cb245c711fa16f" +
-                       "c141974c8db04f4c525205dad6ca23ccaebde585cd3bc91f5874452ed473" +
-                       "08de95cb6164102744f90b3007e511e091653c97d364fe0cbd7f4cd3249c" +
-                       "1f5c452becd722ccc8c6b4e371e2631337dff78efd903a8fc195a90ca5a2" +
-                       "aa4513bc63cd43794ff06c5337329055c43d4fb547e63d6e4d14fbe37b52" +
-                       "1411caf2f1b0df51a68f677db59aa227c725cf494ccb7f8cacc5a06ac5bd" +
-                       "f135a2603175a5fd5e5af615fd2e7cea61934e6d938b9e672290aaccd99a" +
-                       "7e26dc55efe928e56ae6354168264e61668a61f842a581cd0c4b39e0e429" +
-                       "04631c01320857b4d7e260a39c7fbed0593875b495a76aa782b51fee4f88" +
-                       "84ca8ddb8dda560b695323cdde78f82dd85757cadea12ef7cf205138c7ba" +
-                       "db6a7361a8d7868c7aefa7aaf15f212f5f5ab090fd40113e5e3ad1ab04f9" +
-                       "b7f68a12ad0c6db642d4efb3d9f54070cc80d05842272991bcdae54cd484" +
-                       "9a017d2879fd2f6d6ebce27469dda28ad5c345c7f3c9738038667cc9a5bf" +
-                       "97f8f3bc",
-       },
-       {
-               key: "aa3a83a6843cec16ab9a02db3725654cb177e55ec9c0c4abd03ada0fbafca99a",
-               tag: "719dbe5a028d634398ce98e6702a164b",
-               in: "643883153c215352a4ff2bb2d6c857bafa6444f910653cacd2bbdb50ffdb" +
-                       "cae23cc297a66e3afefbd85ab885e8ccf8d8f4930e403662fb4db5121aca" +
-                       "82dfcc3069bd5f90be4f5bfd3c10f8038272021f155e5de0a381d1716abe" +
-                       "0b64b6d0f73c30baf6ddfe0e6a700483cad0fa14f637afb2f72361e84915" +
-                       "78ba117e1c03f01fd61aa8f31da6464f3d0c529524d12dc53b68f4d4b326" +
-                       "db7fc45c63f75244002b8f9a185556f8aab85948647818f1486d32c73614" +
-                       "b8c4763e2645bdb457721ff3901327588da01622a37ccbbd0374fec6fd1b" +
-                       "cce62157e64c4cde22c3a5f14c54cd6db63db0bd77e14579989f1dd46461" +
-                       "4c8691ef26406984b3f794bb7b612e8b160374be11586ec91e3dbb3d2ccc" +
-                       "dbfd9c4b52f0069df27f04853e7cc8b2e382323345b82ce19473c30296cc" +
-                       "453f479af9a09ec759597337221e37e395b5ef958d91767eeb2df37069a4" +
-                       "f3a530399961b6bf01a88ce9dfcc21c573e899b7951723d76d3993666b7e" +
-                       "24dc2570afe738cbe215272ccedb9d752e1a2da00d76adb4bc0bd05b52c3" +
-                       "fa08445671c7c99981a1b535582e9b3228ce61662a1d90a9c79afbdcfcd4" +
-                       "74def2b7880cac6533ba0a73fa0ba595e81fd9a72ec26965acc0f4159ba5" +
-                       "08cd42553c23540bc582e6e9ac996a95a63309f3fa012eac14128818a377" +
-                       "4d39936338827bbaafad7316e500a89ed0df7af81be99e2f6aae6bb62568" +
-                       "1dfa7e100ebca5c8d70f67be3c1e534f25446738d990ee821c195c98d19c" +
-                       "fd901e7722b4e388da90b95ac0b5b5dc5d052ad6b54f6ea34a824bcf0cd8" +
-                       "7f1fc9a07e8f5b8aa0793e3c9c1022109a7c7ae97ee2a2867fd0cf0f8971" +
-                       "34b3d150d3b24fcf8323de929b73cca01244df02510393f0b3905caa0268" +
-                       "7fe35f64391e7d4b30be1cc98319716528ca4f35bb75d7e55cf7749968c5" +
-                       "37136eddb149a9f91c456fde51937c0f35e7e524647311077e6fbe7f3c12" +
-                       "37b9584fcf3b0f78744c7b2d3b452823aca06d144e4463eb5b01014201cc" +
-                       "bfed1adf3414427072135d48e705b1b36ab602cae69428e7c19d39cbb4e0" +
-                       "ca26a871d607ed4daa158b5c58a0a9f4aa935c18a66bdeff42f3dc44166b" +
-                       "a299d71a2141877f23213b11c52d068b5afadc1fad76387cf1e76571e334" +
-                       "0b066ade8da02fe3b0bdc575b1d9ec5d5f5a5f78599f14b62db0bef7ccc6" +
-                       "1711482dfa4787957d42a58fdc2f99525c32962b06492229399980601bd2" +
-                       "ee252306b1464914424de9aa414a0a6e5dadf8ffbf789e6d18a761035d3e" +
-                       "f2ff0753becbd2dd19fc1c28f9acebec86f934f20b608a9ef735ac91f6b7" +
-                       "83d9327cce7f4870d39bbbfb0100838dee83e6baf2b40cfc98415dd174ed" +
-                       "72e393ad0459e8035dce7eb18eb3af2f39d2712846b9e1852cd61d06dfc3" +
-                       "5e34fb761b67e2a711ceb4a82557371ed32ca8db2e4cd7fea0b6bd026177" +
-                       "4057b9abc45dae6869cab1097459473a389a80a4523e5de696554f8b0bec" +
-                       "0ca605e6acfaa00386fb5a48e0f5893860a29f35e680be979cf3bf81ee7e" +
-                       "ed88262dc80af042b8cfe6359cf8b475560bb704728034e2bd67e590bd76" +
-                       "1632e516e3292b564c7265d7a6dc15c75ba6f6a447b1c98c25315ac7de59" +
-                       "9edc4993e4dc7d1dbfcea7e50ebd0b226e096500216c42de3abe352e5b09" +
-                       "a3c9754aa35d00883906599c90a80284d172a90abbeaf7e156fe2166ada1" +
-                       "794420fe55b1a166d752d0eb7f04e822d021c615e84777101e7c9f9dd12e" +
-                       "565b7d093fe978f85e6142c1ca26798b45f4b8d23ecff6be836e810e314f" +
-                       "ebd2ea66f2ac95bad84b39b7a6bac41448f237b45e9ec579235ba2bf5fa1" +
-                       "f00286379ec107c743f06ae0d11b57a2f5b32e3bc5f1697aae812d7ca303" +
-                       "b196a8a43259257f7697bae67adc7f121be561b2d0725982532ffc06cb22" +
-                       "839d9066dce0e4d683d9348899089f6732de62751ca77f1c439e43054468" +
-                       "2c531b9c61977bc221b66030f7571dfb3ddfb91d9838529dbc99612f650a" +
-                       "d72bb78de061192068941a81d6ac341101aeb745b61bd7a87a35a2714d50" +
-                       "c3eb2c3ea148fb9ebed948307f8b491aec277ac01903ba36e6ad54f89fe4" +
-                       "280a17f8e7ae639e75aec16d56576f03c2a1efe4af995eb825ccaa6efe0f" +
-                       "d6d878299a351591d791c286cac5cb049834580d47a9bb7720d0603e3141" +
-                       "ad7c1ec2dd23d3002e15d73c1828a7f08062848b1b6fcf816bd954743547" +
-                       "6f0d6f882125bd03095eb1b1a846d535730e258fc279f7095de7c2d3fcca" +
-                       "a4640a2e2d5ce0974c1e073c60bb78171c1c88ae62c7213a95d36ea9ab17" +
-                       "59093813b85d17ff106e69100bd739ede9656388bf47cc52730766a8a186" +
-                       "9dcc623e09e43cfba1f83ae1d9f16789064ec73504c29686760ea02c6634" +
-                       "a929ca10c6d334b1751494c6d143671ce8e1e7dcc9bcda25af895a193032" +
-                       "ce27c1016ccc4d85507fd2265ebf280d3419f54f66ba2a161c068491578f" +
-                       "be056f02f97be745db443e25ed2647c5348f278f4ad8bf5b2a2c2d56e795" +
-                       "532e25585984a3a94f435ef2742a0413abed7230ff2e9724187c91f73a7a" +
-                       "726ebf36bc8d0d959418dd586452664990889358c56720c1001c004ff768" +
-                       "54b9850890ce1b31735fd9f4a3640622ef0b25c659e8a937daa0df7a21f1" +
-                       "77be13dfdb8f729da1f48e39a05f592d8c98da416b022fd8edab8e6132eb" +
-                       "a80c00501f5cc1e0243b6b096c8dbe7f8c6ffa2f8bcc7f309fb80b489b92" +
-                       "c4878fabad42d91876e10ee64ccd415124461cdc7d86c7bb6bcd9133f3c0" +
-                       "dfa8f629ddb43ab914c0ac5ecddf4398052229876fd838b9ae72523946cb" +
-                       "bba0906a6b3ef26672c78cb24cbf691a5ec869d9fc912009d840772b7da0" +
-                       "c7f47856037c7608705cd533918c207a744f75fdfac618a6981778e09332" +
-                       "5c7d22170da85bdc61044b4c397919d601a30746cefefa798c58f02cb827" +
-                       "0d130c813cbeb67b77fe67da37a1b04bf3f1e9ee95b104939220fb8a0394" +
-                       "86ab8954b2a1468016f546406d1946d531966eadce8af3e02a1f59043ff6" +
-                       "e1efc237dbf4dfd482c876531d131c9b120af8b8fd9662cef1a47a32da40" +
-                       "da96c57dc4efad707a4e86d0b84262d850b451bda48e630c482ef7ede5bd" +
-                       "c55147f69e2ff8d49262d9fe66368d1e38ecdb5c1d4e4042effff0670e69" +
-                       "04e47d7d3047a971d65372126ff5d0426d82b12b253bb4b55005e7a22de5" +
-                       "6fa54f1dfcce30b1e4b4f12b1e3c0de27cea30ce79b08c8c1aceb1ffa285" +
-                       "c317d203a9f2e01d542874fc8035b7670f3648eec79561d6ff2fc20d114f" +
-                       "ba4fbed462f1cd975ee78763c41663849b44cb2827ee875e500b445193e1" +
-                       "4556bcccfaba833bb4ea331d24a6a3bd8ec09906c7b75598b44ce1820a49" +
-                       "fca4a0c1501e6c67515d4fa7f88f6aa3cd7fbc6802131a7b14b219e154db" +
-                       "9ed241133e10ace40e4d963f904dd9f3bdaaade99f19de1ddfe8af2b3cc4" +
-                       "0a48374dd8eb559782bea5410f8f9a1cd128523c0157b6baad9ea331c273" +
-                       "311492fa65c032d0d3b513d23b13b86201840d51759021e4133f873f2781" +
-                       "8f54f34ba73b4f33107d49c8de1533856ec37bb440f3c67d42148765610c" +
-                       "3296bce932c839fd866bec3762a38406ac2b39d0d93730d0c88cb8f765dc" +
-                       "d8ee71263fc96068b538da06fc49e25dbeaa10a5111a9af8e8f8d78e6ed1" +
-                       "3752ad021d9f2c6b5ff18a859fee9651d23a7237bd5a5c29029db3882c47" +
-                       "0470de59fd19fb3bfbd25d116f2f13ef5c534bf3a84284ae03e3cf9cf01d" +
-                       "9e984af9a2e63de54e030857b1a071267cc33d22843b28b64b66e4e02803" +
-                       "c6ab5635291aefa69cfeb3958c09d0b37176842b902da26caae3f0d305e7" +
-                       "c6ab550414e862e1d13d9bb9dc6122cb90ddb1a7bc6d31c55f146659baa9" +
-                       "6cca4ea283e5e1639967889543ecb6849e355b6c0227572097221dd46c1d" +
-                       "f8600b230e9644ba611ba45cd83fa4ac7df647b3be57387b6db12682018a" +
-                       "de9be50a8ea7d5f7c743bf0c6382964bb385b3c207c0cdd63279c16130b3" +
-                       "73ba974125291673344b35c8ef9a33be5a8a394e28dc1448f54d46af675a" +
-                       "edc88ce85a11ad7e50058df4f3f2364abd243683d58a2b13fcb0dc0eed21" +
-                       "380b666eb87f4be75e7f2842bae916c15af3e9658c55408537b2301faa6e" +
-                       "42af4d94e3eda6a41d6d302be281e2a9299e9d0fb1f20cf4ca978e66bdd7" +
-                       "4c8bea0f15c84d6513cdea787dacbd4bb529ed03528284cb12f6ecd841d3" +
-                       "c58c3a57c6bc19b65d6d10692f4e1ad63b091137c8acacc6bc1496953f81" +
-                       "2972bf6362cf883bb75a2d10614029596bf9f35e92addbb50315b30161b7" +
-                       "de8867a1393d9583887a292cadceb54078c9c846ec30882e6ff987494060" +
-                       "721d3c761940b91a126e8d1e0118617bdae01a7f9c1aa96bdd6c78ca06f2" +
-                       "6c8d85664a8705334f4997c724ef98fe265985593d5a9c30798714e6de1e" +
-                       "bd04b648be47a6b5d986a3103e738a5cd114b19b7ba99d2e2eec6181bf3d" +
-                       "ff0fec8c54ae6118be8702c3e775d493a6fafb509712a43ee66c3f4b75b0" +
-                       "194c88937cffa5fa17b284d2556f2b0eebf876e05f92c065515198bd5e83" +
-                       "00d0db432cb256a4a0f9963a05694ffce3ecbd182209e0b7bb50120f6be4" +
-                       "eeb9d268b17790ee14a2c887dc5753e0086630b3123734053aa37595aa8f" +
-                       "31968ddae4991af4ab970c1e3cfa1146a2efd9dc42abd6af14777b8a0455" +
-                       "3865691cbac4b4417b3fa13c154d581b498f3b8cb77adf0e42dc2f2fb521" +
-                       "732447de97271e542c6cf8cad3ba0148cc3ba1f2983ead836a25a2c022d0" +
-                       "43ba18fcd009d518d07b53344a5bc4d626b3b38405a114471f75dc70e015" +
-                       "d11e8f6f57d087fa72909785573008b1",
-       },
-       {
-               key: "1793bfda9c8666f0839b4b983776735a927bdaa3da99b13c9f3d1cc57d4d6b03",
-               tag: "bc89cfec34ab2f4f2d5308b8c1a5e70a",
-               in: "a09f661aa125471417d88912f0a4a14115df9a3a19c1de184878291acb0e" +
-                       "89ee1f9d8213f62df442f8969a9a5a7c402fea09bdbe236fb832544e1f93" +
-                       "9cdd4873802b2bb8fc35ba06b7ff96da6dc7efddfeeda84116bc525a7fc5" +
-                       "2d84d2e63cbac00b122dc64f2d15b36595259d81a1d2a09f204c54072751" +
-                       "dd812259df1104bb2d2ee58baee917c5d0aa2649c8a1503114501e6ed6fe" +
-                       "239847d3d88dccd63d5f842426b600079c6bf06e80a2813b2208181163b8" +
-                       "61dca07fa4d88254e84dac1c78c38397a016b5ad55a6b58878f99036db56" +
-                       "89871ab3c321f6ed5895f218f8fd976c348b3f1269fcdf4d38c9492b4721" +
-                       "6c45f499f5705830b33114d721f9731acf6c69fca681b74c2d82c92e145b" +
-                       "7bab77110821d3a12cc818d7595a5c60c4b5e5219376c38a4dd52d435d41" +
-                       "562802ff65ba2bba5c331c333d5adf194d29b2cd9ebb55927bb4ec17681a" +
-                       "3f5574ad34fb4e964f2c756f6dbbb7a6876a21579a515263444de7a30a33" +
-                       "15005458bc137ccfdff18a3892fc9f58f1de10d4de20bbcf860f5f036d8e" +
-                       "8a188f18e5cf7ea3cd260710e7491befcb131d49a28dfb1ef688fd021a1e" +
-                       "e4420d32fbfb03b47f5e85c37d91e49a1b0db85d966eb5434c4197433eb4" +
-                       "9d56f2ff999c9a72230447032dc949202468261b48b6ac212e3f651d6c63" +
-                       "03a06c90bb2d3a755ed91ba73bcdc28e1c5b0936e51e0a9f69c3ebabd3db" +
-                       "add7abab6d8f6a44daeb3126429a01815f57444fb7022a4a510f8b564ae2" +
-                       "dd9779b3a273fef15859a33e233724846c30d89fb78a595b6ff6c834812c" +
-                       "00a991e405806aafd0c26a788895ad00a5e43c5426197aa8247207077548" +
-                       "ee67db4cd6f878431a2e36e952d84b5fb89d681f553198e2c066310ea6ac" +
-                       "3a31f5b1792620616f6c41d486fb844eeacc7fd36971abf416e8d6d50985" +
-                       "c83cc92ea46ac37da8f0026aba30c945d8bb15080d2d95e4081bad626199" +
-                       "3f95f57ed3252822a7caa035ae22a36c35e280cbbc82d729346cacdb1794" +
-                       "ae9a9bb2793fd1d5c47121b135c2836063367339c5151b4e35278e97f62a" +
-                       "fdd2f231d4b47812d083a829ebb9c374ff2ae8479cc4b76d55f9cef3ec6c" +
-                       "4894f53e8caaeb0d8cd072960cedaf758e48e3640590d4f728626e0a08ee" +
-                       "ebf719c96bf8ed4d0c283be09c0ae67b609e22d3b9aa6b03642854909de0" +
-                       "5ed52b39673867bf586a632ab8072de15c637cc212cba8387515c9c9c433" +
-                       "abd7ba6b02abd09da06a34694ad34f88515b65c0c9c247fdf9819fb05a1a" +
-                       "ea4728c1182f8a08a64b7581cd0fb2131265edcb3d4874b009aede0e87ed" +
-                       "463a2e4392aefd55e008eb7ba931788262f56e53193122a3555d4c08133b" +
-                       "66020154b15643fa7f4f5e9f17621d350ede3dc70be02c59e40fea74dbbd" +
-                       "7919d1a8d4e22ef07c916fa65e7d4b89fb11a7c24ddc4ca5f43344c753b6" +
-                       "1331c3fa4558738ba7832b5b2a275bc9b7989b6e6888865793329806cd3b" +
-                       "f0ba57c941d4428623e062f4ac05e7cd79ad5446f8838f2b247b66bddadf" +
-                       "540845a1bb304a04b7edbbff579c8d37e2f6718f8690abd5231822c7e565" +
-                       "69365ce532449a41ae963ec23a2a75e88307dc6b59cbb3fab913e43ed74d" +
-                       "841ca9f6e4ef96dfd9f04e29e89361aece439c0b2e1943b30410a63d495c" +
-                       "522ac3ec1b04ec4cb345f7f86969957ad750e5bd7dbf1d6a22eed02f70b8" +
-                       "1cb5b2b020c0694d7f63044f9de0c3de1ede52009c858992d01ebb92ff19" +
-                       "a9e0fbea18942fbafb77746c8e9e687dd58ccc569e767528bde43b62c7c1" +
-                       "270a5721f1212de2b29a7aae2d6ba6cd173d7fbc78aec4356ce2e8ba9164" +
-                       "d97dec061dd0c3a0e3c520a7611ac99739049dd5825537c70b7ef660046c" +
-                       "1785546cd99aa400da848eb7c3c91247415c8e245d0f14c30d482c5849ae" +
-                       "aaeab2568288229b08267818dae8f76fc674c684c99eb5faf88a0783813d" +
-                       "f7298e0b50cb233f78471e5ca9cc3b04927c26a3871cf253798cc49aa717" +
-                       "d8f18a1ddcbdc26497d188f15f86ec494dcf8f942c3e07e572385c6fa0ef" +
-                       "40c0b625f1737543074a747a369482a0b342a08b3eccac9f9209be31aefe" +
-                       "5a7794974f71ac0bc9a58026397ea3dd4f5e40511d58d2a3b45925c194ef" +
-                       "13987037d736dd48b509d003a86471d5f161e0e5dd168b4f1ce32f703b89" +
-                       "15004d8dfc708a5bb02b2e6fb67424b2cbcb31ddaa0114c4016b0917382d" +
-                       "aad11815ff5b6e37d5af48daa5ef67cee3439283712bc51b5adf2356cb2a" +
-                       "5181b8941fd78945c7c9d61497683e44fee456ad345e12b4258f15945d45" +
-                       "b6ca4369ee792d849112d583fdb39cd4d333ee057355f0abc8d1eea4640c" +
-                       "128cc1617982db0394233dbd416102eec1874081247d2982bbf9fed1b1b3" +
-                       "8f4da923d68c8975c698f189a4d7840fd7aca9dceb7d91c076f85e1c546f" +
-                       "4d5de4f60c91348455aaea30cac134c844dad93d583c139dd52b3be6346c" +
-                       "4d2e6864125c5a2d0aed8f67930e1ebf8700ca88aacc914ea76ff17148f0" +
-                       "777738cc126e75a2c81110faf02fefc47c91edbab7814599000ce55fe20e" +
-                       "f313566e9b62457acf2f22e1141e220bd9d4747417d03e703d4e39282803" +
-                       "386327fc65dd597f723ee28185c78d9195fc70a75706c36287ab9c6e00e8" +
-                       "5cecbbd6043c6af8d30df6cdd8777be0686853b7c8a55a5b1e03e4431d39" +
-                       "1725ff99875a85cae6926998723b36d13ad458220712209bfc5e8d2ca5d4" +
-                       "4ea044d5ba846b4035e7ac7e9885f55d3f85c0c1b3d09fe929a74450f5d2" +
-                       "9c9672e42d3f59be4ca9d864a4322cc454c2578493bd498a51bbe960e657" +
-                       "3e5dd02c4a3a386d4f29e4578a39e9184024cd28d0e86ecac893b8e271bf" +
-                       "ce3f944d130817378c74d471bd20a4086f2429ed66c5c99969fd8da358ff" +
-                       "5c3be72bf356ae49a385aa0a631b588ddb63628fd162673e915cfc4de56e" +
-                       "ae6ff7101df3b33125c9bab95928f6e61c60039b6cc07a66f9c733251447" +
-                       "ef9c1ffefa2158a8ddf89dc08686a4cf9b86ea09914e79842d72a3236afc" +
-                       "98a3afa0a1cac5590ab6a923e35a2ab8db6410a9d33cb84d1c48a054377e" +
-                       "549774b25f50fbb343ecd5db095155cce9fb0c77d09752f62d4bbf16a770" +
-                       "30452a75f6bdf73f7807d8f3a6bae16ad06b22175fee60549c22548de9c1" +
-                       "3df35ef4e7bf7b66491a62b93c2c3fb0c5edc51f60f5704b56af30f1079d" +
-                       "7c385b99f958ef8209e030e381d1ee8d67d3cb84f32e030e8ea2c1d0c77f" +
-                       "d6b242a9f48707557c8682a08e1127f51221a55c733ab1edd00a9c2912cb" +
-                       "36dde85f73b524e1a4f4da6414c5e4c18d9537722b2becc8a91bcc63f2b0" +
-                       "9f32409c53c2beee0de6726dabcd6bf33118a5c23fb9c5c1810476efe658" +
-                       "4bb6109c516b45e16b2f79f96755680374d82b91f2c519639a1815fd485b" +
-                       "a3c00b46fbefeafcf25554ec5a6a5ae2da07c85b8a0f9fcde50263d9ed85" +
-                       "038b2f7aadb9de765655bd201235218bfc74bcad6a9ddf4506167a649afa" +
-                       "df400b85752d68a92b7a97f26b334dd77fce824862046b286a7c8e0adc36" +
-                       "f713a252a673d4d995b268badf4bec8b8eefe85c25b823b6728582d35c4a" +
-                       "60041114dab72b0623b99e2758f6a1e97365279bfba0eb1fc8952ca4f2c6" +
-                       "fbffd9f5fd7dcad1125b18a796981b5ead0b6431141315898ace96f0d38f" +
-                       "865698df8822ca7b65644b6b1f0a0f0d2e5850d4c93ec48ca3eba1b919e2" +
-                       "4413a46d595ffa427715e499db3b7b9ab53c64abec7302bc737a5bd124bc" +
-                       "da756abbca132f7f67e6989e09bfb23b497da31bf156bb9c69ae54588df1" +
-                       "7420e8fe989f0472c8893b2bfe57cdae265a8cc7aeb39624167a567a6fbe" +
-                       "bb1aa30c3dcfd14f2808a070994085e6e1fa79021e77c399f90ab1f995a7" +
-                       "baff672cb693bd39b798b4c890b7d0a57978d6b9bcdc5bf3f4d205f8f24b" +
-                       "2b43d3ae300a96971c9182be297618b9adceebedba1ab0f324b01d23d7e6" +
-                       "35f009db3dbbc643c2d787567594bc639bfd78c4f3e6d948caf06f013423" +
-                       "eb3c764666b58f886d5d28137c053c2a28535efcea400147e92ac6753574" +
-                       "3b47f9cb48852abed1d057647d5b1c6f334eab1a813401fccd3dae332738" +
-                       "776bb223e359f3c459b5c573ba64fa945bdd66c5ac0fcbd53b67032a7b80" +
-                       "25f551e8d1fd2a4291bdb7941cbabe3a09765dc263e2bbb6db7077cc8fe6" +
-                       "790d4bed5e36bd976d1e37dfdba36aafcdaa10c5f3ed51ba973379bcb8fd" +
-                       "203d8b7282abbd271ecf947e54486e8653b7712c9df996a8ad035f41f29c" +
-                       "ab81509f922c67dacb03f25f8f120cb1365ab3c1c286849c2722448ba9bc" +
-                       "ff42a6b8a7a52f2c79b2bfcbdd22ef8a5651c18879a9575dac35f57d8107" +
-                       "d6bece37b15d7dfff480c01f4461ef11f22228792accda4f7936d29d4c56" +
-                       "cbba103b6d3e6db86e39e5f1bb9e9fd955df65b8a6e44a148620f02b5b90" +
-                       "b2be9e5bb526d0ec75b1e723e94da933a356d7ca42d0ce8349699f730b8e" +
-                       "59bac24a6b633759c88041d29399ce60a2ca2261c7eec1acb9a56e0e65bd" +
-                       "e37653ce2cf7eb83a4d019c755bdc5d685b6394ecddb9006823182dd8138" +
-                       "a1bf79a32d07a8e5e8ab221995c714e571b40bb255b79e328ab883542c16" +
-                       "4899fffa16eb3296f310e302512352a864fd809beaab4169113027c6ccca" +
-                       "99a92c6ce35c30f9449a3add70f10db1ed08078e8e6cbaafef630aab7e9f" +
-                       "c8adb09c18e33fe1af3620d1e4d069ac11325e23cc18e5519a1ed249caf8" +
-                       "ddba871c701f1287cc160019766988f63e089bd9bf1af7e6f5b9002e3b6c" +
-                       "264d69a8bac16914ab55c418d3a8e974677cdcbea36c912e90386a839a37" +
-                       "77b878e680c07c7cc99f42a7dd71924babf7fb0627d1f2cc60d9d390d1e1" +
-                       "50d47386be6eefec9ddbb83b28fa7e2fd28cc3867cbe42d13b00545af8a0" +
-                       "48cc07016ec79808b180e0b258c564739185da754f2e",
-       },
-       {
-               key: "0d41cb4ac25217feb20e86fc2490e8d2ea2e8225c051252a9395cc4f56e1ae5a",
-               tag: "42df9f9a59d6dc05c98fd9e9577f7176",
-               in: "01caba7a19cdb09dc0ec6c522c61c628eacf17ef15485aa5710fed723875" +
-                       "2e4e8e93dd4bbc414e4c5620bab596876dfbea33987e568ddabf7814b318" +
-                       "8210a5f8d70041351e4d8410840642a29cc8d901c25fa67cc8f9664ea5e1" +
-                       "9e433eaff7c722d0258ae112b7aca47120aa8af4420d4412a10732551db2" +
-                       "cd3e0af6e5855d5eea61035af15a4d0d898d04033809e995706eba750a7c" +
-                       "ac07aaa0dc71477d3020f778d0347f1a8e37c18540deb9ae967e734c0264" +
-                       "df0e1f52b0b5334805579ea744c8784c3ae0c3ff8217cd3f53cb747f6996" +
-                       "f3d2147699799e649061b205f97f7992e147fb20f21ff862c6c512e95534" +
-                       "f03075e8e52f162e0d70d7a259e3618474427f400f44f75198edebae6e40" +
-                       "a2173257d114e1bb5a13cf419c821eb124d90e89a938d91f4d2e70dfd1ab" +
-                       "60446f1b602614930a329e98a0c30f107d342281db25b8f8259933e14d20" +
-                       "8bbd991e42969e8b0600272f9bd408483cddfc4cb8dfe7bc19be1989c7fa" +
-                       "129d38e1078d094b82e0a845040ddd69f220dc4aa2b236c44101d7da7779" +
-                       "9827a7b037561b51e50fa033a045571c7267af93b96192df3bf6180c9a30" +
-                       "7e8c8f2b1d6b9391767369625015da02730ad6070df4595eb8099bd8e484" +
-                       "59214310cb62c3a91a4fa8ac3b3d7b2017d4254fb465f0a248e1bf45819b" +
-                       "4f0360f37c9a79d405e2bb72e5c25a1b4df192cfd524d61e1e8b274f2fe0" +
-                       "634c73f0653c7c9e9062c9d081f22a8b0327897eed7c6e870f2815bbac8f" +
-                       "585c1bd868759a98dcb5c3db2f6c53244b9cc494a56f28a9ba673167cea8" +
-                       "b799f37049ee7b0772972b3a6603f0b80eddb58ef03f916106814d72f000" +
-                       "250b3573c97c5c105910d79b2f85ad9d56002a76a1f43d9d1c244ef56d3e" +
-                       "032a9bab95fe3bd5dd830ad7d7e341f28b58c0440658f7fc2ca98f157708" +
-                       "1c647e91432cb0739d9acdbf973ceb9b0047634d695279e8837b04dc5357" +
-                       "f013fde3c55c9c53bf1d817ec59a1b18ed0ac0081ed9bbb3bcd1a5d3634f" +
-                       "50f7506f79dc6a4ebfa640bf65682fe9aeca68088e276937669250064de1" +
-                       "c19ad6d5c697f862114d0f81d2cc52be831ed20d3aab1e41fe6f476b5392" +
-                       "af4799392464c51394c2d1a8325ee2e84f1635d295ee663490e538eb338c" +
-                       "7126a8e731ad5c0becf144c7a9cae5c6493350b589385de29e1a0ad6716c" +
-                       "346ec4f0a31ca5ea35c59ab6b099f65d7f0b3d00925a1da1b5777c029aea" +
-                       "9679e895d7100645dc83f81d82a6174beab2357f7888ea640900cf3ee67a" +
-                       "e0724a123919d78e70e05288f67e5e69ffa6f345be8a96e58bbe260184b5" +
-                       "ec5c0c1354cfd516ebdb8d420029137d41b029641959cc07fa7b4e16b39d" +
-                       "17f36b2367057410a42e0550e9ec1dcd2df4604d52d4f9dd1140d57af08d" +
-                       "50e1527dad793b6d649324de799754f755818bf10e6d1ab614958dbb24ac" +
-                       "8e2c01270a90ec3df4379c3f509b5ef721b0fd4f91a1bdb8127ae4dc74d0" +
-                       "75f6cd8bb28319d6f8e8d8ff64fb4a42d646e9365156c6bc72cc46e9cd1c" +
-                       "f9e735549e3df9a8e6b5fe541948b126190117db71fd1d61ad84be0f725f" +
-                       "20b99eb141b240326d399976c4f2ce5823d94649a9580e1e8820bf49184d" +
-                       "fc34378a60bea89b12aca69cb996c17847b7fb517cf2d51f16d78e3875ce" +
-                       "aa33be15f6a154004f0e1134c6652c815c705efc34bcf35bd7743d28f0a2" +
-                       "77d82dea4709dab41fbfb4e0cbc118c17aa00808872f0edc6437c357cd31" +
-                       "74a02aee61890464e03e9458853189431bf5df6a0ad5d69951e24be7f266" +
-                       "5bb3c904aa03f799fe7edc7bc6779d621cab7e520b5994f81505d0f01e55" +
-                       "96e14b4c1efdf3e8aadee866c5337c1e50066b3acc039c84567b29b7d957" +
-                       "683cadfb04fb35402acaba631e46ca83dbdd8adf28e377ec147e4d555a21" +
-                       "e6d779d7c5a3078ab72702234d36ca65f68bd01221c9411f68f32e16ef04" +
-                       "99a20c2d945fa31b79d9965853d38ada9d48eead9084d868c6bad974b0f4" +
-                       "0956aa0fcbce6dac905858e46c4b62c0ee576b8db7d484a524e951f4c179" +
-                       "decfc7d6f619e86dee808f246dd71c7e0b51d28bc958110d122fa2717148" +
-                       "77823242711632f6e1c7c15248655ced8e451a107707cec8c84929beece4" +
-                       "efe5503d3c1763d0ab7f139f043e26027d5e52a00d5414dd98a324a8fc2a" +
-                       "06a1345cbde747f41099c3377b86bbdc5a17c8f6e5b773a761f78573832e" +
-                       "4359b143810361dedc79142fffc49ddc0b32f225d50d360ceec3920fb0ba" +
-                       "0693b644ee07fbd1ce829e223a02794b197614061c4bfa46112d105c2b7b" +
-                       "4efea448501d146dece44f6640d674d5749db498b32969de6e165e705a18" +
-                       "2aa1f3d8e16892b0120337640d52c9bee35e5b4b17f03eaeb31205c8ecbe" +
-                       "1ae1b110023016e40ee87370a65c5c20bfb00f100d3c6c1de6e4a1c90162" +
-                       "f25bddbf300ed637330206788a4ff96903f971c9618493ad074412af625c" +
-                       "ff9e0f8f183bbd5e96c1f28307e6cae8b50cc0eb1a3a8154e44e9de947af" +
-                       "002e4d1098d6b0ee3f2e71a10d03eb444729c42461283f37be8af2ce81ba" +
-                       "bac246a05c2c94efacc43f0cf9ff3df38ab6fc1648c796ae7026ea95752e" +
-                       "b70873a6da59da10d8b5316126431c4a17289466e95dc739c061d7a4b13a" +
-                       "450809479eef421bddcdade77a6df133410328c754af8999a09b1a5c056b" +
-                       "ecbb6fc2c339586ab92100f46d2fa1fa689994b36aa70703d76bf7738adc" +
-                       "f0589fdfa6bd215339ad69ed983f62efce0add5a63fe7dfe4bfa006ff16e" +
-                       "0cc06d39199ad60adcae12b75ca98d764502a783373da3a41281e03c2037" +
-                       "e1b3ca7f7eb60e2b67427e97ec72d36670db7662c6daa505701fd279f116" +
-                       "ac0ef569471f204e1531c25a4ac3ce19b6f68a8994b6f89b5abf034a6507" +
-                       "32c7fad4206eb4eaa7cd9a710d866bf3c3f13c16faa268ae0cf4f69be909" +
-                       "bb9b79aab80dd25101d4cc813a48d3f38d870f10ac0b6768005aa0e69e87" +
-                       "dfc0424deef06414c9ba6f498c93c41c692a7a6221fb5595b390a32c70e0" +
-                       "2cd64471c797ee8a143725849c1e054ee2043dcfc0b4cb1c00be21a14be9" +
-                       "2d9a07f1b4e975d4c86b8a5c1387e6c42bf393e078fe86d24612d497e14b" +
-                       "874485a3cc922b5b6d91295d7b79ab8bfa1c7f64b51e761d19bb9da82a5a" +
-                       "a34aa469699036b6b2c55e2b84f84942f10585027ab07e2e0e562e0fc3dd" +
-                       "36047850ded84be4416e22aa41c7a2f7d4a4d8e3dd420d746a1d8d56d87e" +
-                       "5133a1b4380bd9a89500fd6d7e68a1ec02eb9e79e4a13edfdde1273466e4" +
-                       "6b0e6a75f59ff6175716629da52463ad21de27f40fa2e25a566eec4b2696" +
-                       "4af3a717dfb0170a73144c0bd9b00bed67ad8c0a146eb5a055812d071209" +
-                       "c9d530cd4f50a41488c2238898dea8bb36b0f1496d3ea8c4ff8e263b367f" +
-                       "64977679e697d88e5295bd97ac16a0420850d1ead9621e25a3f58925c266" +
-                       "ef5246488b1c15a8fe0d8ec4291864faa5a67b2388b7786f47b6d27e8fe8" +
-                       "46f85f85163e54155ef95cea4901e712a44404a4d3f27f28dd961ce36b84" +
-                       "f3856770f07f20a2ebd34d77405beab04ddfc09770167d7d6340f494dc6b" +
-                       "7e4c3df896bd974730193b1e862b58d4a5938e6e4ae8897dba8812924379" +
-                       "e54f51a71364d39f76e24fdf2c6c704479ce85b456558ca6947b8fd76f03" +
-                       "78273f0a7bcd1d860ef1defe4eea8fdb81c73eda028d82fdcb2248582ac4" +
-                       "59eb7698a811e6c5823be886410f6b8577ff2e8252343b6ea890016ae846" +
-                       "01c5894cfb988121059fd9c8fbc1596da470a149404fc67baa15383d38cb" +
-                       "d17ac107b4ff3c1ca4c76b7930de02b240e7547d39f4978e0cc1fa37f8c1" +
-                       "012b677f07bb4df4486196e9b0beb823a3827585475b878e3f6f0a2d3836" +
-                       "2c7d34f9f3c91ed46c39cec95c2a0b6f0279a03a00ed5035b0725c393849" +
-                       "cdb1ed3c0ecbcf3c2ce108017f468e1c3d469c03e8231d4195344ced70cf" +
-                       "daa667252cc1554dce8d0c54eb4cf4da62367d77d7dcc02f81e788ce9f8d" +
-                       "d306ba1b48192359cfe92bdbea9980f87ea0677d7d2082205a436cf514e6" +
-                       "fde5eadd21b13dc836ce33b5dfb6118bcac79ae00fbb16d61f00a923b145" +
-                       "f9caa9f3a2c7f0104f8b052e390987e57c8dc80cd5f0358afb0111af1fc4" +
-                       "e31f92bd832ad35fd2e0bdf768272de52ce0b152f74d43a8973ad516b3ea" +
-                       "f5937ec8a236ebc86adeba610de0cf7168453111f3c983b64df07678cae0" +
-                       "a75466ae15adfb127328e716448cdbd2c1b73424cc29d93df11a765441e0" +
-                       "0eeed72228e1099bd20569d9d0e9e5a0b3c11d0002e2896631186483db61" +
-                       "c1a0cb407951f9b1ea6d3ebc79b37afb5a7037e957985e4955979b91fb85" +
-                       "61ca7d5e8b9cdd5b7ce0130a880d9241027b011fea7696b0c695d4949ca2" +
-                       "d0cf22d44b9fee073ecaef66d4981e172e03ea71a6edc7144393bfea5071" +
-                       "2afac137f091bae2f5700bfb073a6d57fddcba674a899d7349044a10aadb" +
-                       "2e7f547887dd2f765f394de5dc9ef5dbf1eab4d869be8cb68aad8e2614ac" +
-                       "37bbf21ccd5a832ee09fdd07ce50a580a2af36256b1046e646fe3dff6d20" +
-                       "0c5110f1ad1311bc39b8114cd11ecdb87f94df43d4f6468932fc0ed892d0" +
-                       "3d8f3db3f8323ebb29776ab7d260493a36700bcda668abd62126a8189e91" +
-                       "df2d2970ef688d4e8172fc942e69ba63941a36b79ac546fff38f5f7d1176" +
-                       "57612a662ea38134e1090c3e903c9adacdeefd3ac2a0467e9f5125058c19" +
-                       "7b2260d2afad2b0e627a9ae52cd579ee27168065658089e1b83a2d8cdb47" +
-                       "e08966e4ec0018e78c4d267f9575b8fea2a42de5c2d25356fe4b8c9cb1ac" +
-                       "daf0d1af4bf58b9704cd4bc08471e3b9a0e45a5693433ede2eb1374bce44" +
-                       "1f1811cdc7612d7bb61f4f34aea0a44757bbcc12a55c1ba41a7901eb004e" +
-                       "689587a38e5b4df4574ddcc7b2eda97f6e480d7d39f45247ea3b03c90a93" +
-                       "0dd168b65d52a59ce9c2cb4e860cc6aaa0ee02a58d0c8ba990194bce80fe" +
-                       "8c34ba5693fb0943ec2cbfc919e534cc47c04f502b6c217c2f860d1d482a" +
-                       "a016aa02adfc2bea3171fc4e27e2a262fd37b824099aa227fccca508f778" +
-                       "b8c6ec7aaff1d15f6497753f439daa9e52060fd6e9e056e6843d770fb057" +
-                       "6d9e2e782db4843c0c2c7f408a17376719a3c5cf9fa08f04f8a779885a16" +
-                       "5cf93ce404be",
-       },
-       {
-               key: "ddbd5d6c5ebd61fa72b453dd849dc302c98a0f3e300f4768bf1dc698a3827dd2",
-               tag: "af608b71a353e63c64911558baa122f3",
-               in: "c67e2524b0de16483158a0232078fadcf611e4fbdb9e642e397b21222423" +
-                       "cc2ed42ed34ffcb178448919ee337eff9d7d691f622e70fd3317cfd271df" +
-                       "fe6a9d9b7e07db0d20813e2331164a654386db2ab06ae2983bf2460eaaa6" +
-                       "3aa0171fb87afb82e85b40d95c8993b2039d32e9d38473dd13f41fb1ff1e" +
-                       "261752ab004b221a4472b9b1a0e139f0c999f826a26a7e7df362b0611aac" +
-                       "fa83c55cca2f7c0138d2c30313c2f6eb357278328ea6ebd6a5077947e18a" +
-                       "a97c34b9dde3b6f2de4b83778ffcebc8c9cb58756691d5e2a3d15a759a2e" +
-                       "5050b6da937a6f5551aec069a08027d60dd870d175d2a5b5f0b4f3143904" +
-                       "7445c368a5c866370e9426abbc1a1c5a272b96731c4128aedeee93e8e00b" +
-                       "b450601a6d31ea279b9450e738b4a47c0dc22d2d8ed5d44257f6318e0c59" +
-                       "b951fb6b57746062ab95cd73c23ef0a5c000a7d14c18bfff172e59b6f6de" +
-                       "aa61b81009e803eb05e24fb0b706870e18889a9180ac16a042d12dfff9d9" +
-                       "1b88130f045d2342fd5ddc5f443681c31090459f262d1a65654c55251fc7" +
-                       "d5a67bd2e62940ccd606f3e50700e4d1e992a3fdf0388b9ce3df9de6dda1" +
-                       "5c1cd6b70622ac062dcb7ed7058872c00ff3df94032853927126cf6fa4cd" +
-                       "c468d91c9b52dcbc272fd7ba920dcd3ea1e048af9c3286dba74d988ce9ce" +
-                       "77174e25a87935352721dc23b60a9549322fadbe6a00dd1197dfa25b33fd" +
-                       "9e5713afcfd0fae6dbcf27147fa58d995580d7e0a903c895752fe9819f5b" +
-                       "b002ed752719552d0f3575312f2e618173a8ae7c147ca64a709053e5d2e1" +
-                       "2f4d1ea337afa9ac4f9ba62760046ec1e48f4ed8f6df66786c9fd9f5bc7f" +
-                       "9ca2526e1327b042f4657c405757690e190c91f260dee2dd3d2e6616b721" +
-                       "e489c7c3cb828478a3d953b88f09904e7927cdf6dbd6a5419eeeb83c0be2" +
-                       "51934a80dfe61e09442f0761aa2d013e10aeec3a32df204571ce8984a430" +
-                       "9bbe30ccc91977790bf0305d2651ee450b749c3e7761534e45970e70a0a8" +
-                       "473cadbc88f096970c275f188c9d2644e237fd50c2e24c1eabbf7578e80e" +
-                       "6500762ac513fcd68cf6f8bb7a9d9eedadca059d9ecec07fe6fe7792b468" +
-                       "9311861728dd482f087c28374cf9c5ea20b2c8630029e8485fa6fe518c74" +
-                       "ef77d44eb7526ca764e50b5f34ed0f253a91fb2af6e59338e2af6e041e01" +
-                       "084e1efade1aebb7d1b698ccdb8b4248ac89cd40d9517d840960c08f5e86" +
-                       "88d8ba2b54889c1870d315498b70e0e9720f2c8c53a3377a8c0bd2d6a1c6" +
-                       "f17c6ff847eb14def6855dc3886b99039e528b421ccbf6064e39263f8f3d" +
-                       "340d5d20b1b14c264ac2310b5f3a0c6f0c1006d0d4f1a69af68d28ab447f" +
-                       "cd17387e1fc98f164982a6d05dd32d6b4f0f1b04e40c6c6e0fb4467dd6b1" +
-                       "0c5a9c92cc8c2bc97ef669b6d55cdd0aa8a15c46af954359165949012713" +
-                       "4ea9f74181d54a300d3172c9f01db73288ef6a709c763a4891666d0baf88" +
-                       "8531dcc77f0911412d096aef9033fa36b5c1ed283b8b5c109e45b5cde911" +
-                       "6f3da2533fa0ab81929bd5783271d5501a9e4fce2aff9eb5a70a4215b253" +
-                       "46885d7e4225fe34bb55b309a114a312693d60ccc61267359a8c2dd28141" +
-                       "226e7cfd99f0f12c69df57d75dd790dbabfe3145f7fd1a24fa58e03bc2e2" +
-                       "6ea19288af4929e5acc517d8f52a074745ff4644d94179eae6ba7d267292" +
-                       "bbd2053167a0da9be5e4b6cd0a4200fcac5182d9957dffbefa857e662b82" +
-                       "fc3a7cc32506e78030ed5c5d448d7f1b4fd854a735a0c50016bb85e6e716" +
-                       "0f87527bca0de235f4b7dacb75be84919c15a5b8cf6bec035795cb67061b" +
-                       "7855c2134c1b1bfa6affe04b7db239f73af6ea9c02bc9f7972b7f6400b6b" +
-                       "838f4653aefc42179c21765e3ca7a5e96b4402ff544d4bc2332756a23500" +
-                       "11241dc42ec6848afe127c00b9c333e69bb5a54ea5c7193e59ea22bd6d32" +
-                       "af4f56b1bd2d5982ef7d9c1b02d7668525e4e81b68a400f7afc2653f0f41" +
-                       "a03e11c7a02bd094830093481afbab96397245b9f37a568ea1c4ae248cdf" +
-                       "afc87f88b1fb5dc300d8e9039af4e6e701b458ed3f32d693f2e869b76bb5" +
-                       "1358cbbe5b5089013bf452734388a176cccfc1ae9b7cff603631ca48e129" +
-                       "b5c9573d4e379547272cce8aeeeb407d3fc57f782a0eb5fcbd41e6fb13be" +
-                       "7e4f1067cd407b42a6121b2969c384916ba2b32563e659f52aae09c8ce2e" +
-                       "3c500fbb7e58be74cc1592dcfacd9f0d4cea1a90a18658147c81cccf6fb3" +
-                       "078ed27f369e7646f551386a74e1b07074d93e0c1f298c761af46cdaae9f" +
-                       "f4be86808b66d0e228016d27a3a77c843365cb847fddccb0bbcfb3b9008a" +
-                       "1bacac59ffb0aa759a0568c72c556caf0ac1091431b574687c5fc7bd486e" +
-                       "963e0fc3bdc828d988734a21070747c955cf8dba2df1c3a0ba8146cd58b5" +
-                       "91b6d54712db67a9851b1607c8445bc97406eeb7488f5f85e547850d619c" +
-                       "407f97632ca1801f52c09c2b314b4ab0f8e7fb5851fd60852f4666913ca6" +
-                       "bc840c1ec8f8f06caefdbfbf02ce00f20b87b14ba9e651c80f40a31d0306" +
-                       "403f541776075fbf23733a6b19e3b44d04b455b29ef8effa70cce0c59331" +
-                       "7119abc07aa8c8d0246a760b0b36a3d87b244e83bae8a745b8277a531298" +
-                       "f5d0283498a509c89898ddf0f7a7455be1f8a6889c46d323f1dd18c3babe" +
-                       "1751a05f871f0639f50967afa46c19cb93d9c2a79c81e2436a7a62f225bc" +
-                       "37c90698640f5b43673e1dc276de05ff1e29acdb4ace5121659db5f23c49" +
-                       "57aae22f53e6f2cc935824fbd07c2ac87672eeeab895c3f06e09e178560e" +
-                       "2fcfa7097f10201dfb8b1ebac08ca806c1b3ba3aff9284846a1a3beada53" +
-                       "e9f7ade12eb89b5591f462b2543bb4090e081fee9fb53bbf821dc92d6b16" +
-                       "fe820ab2ee4b1f6c0b6a6f19edb0bf6479e257fc73bcd60dc2261d0a4752" +
-                       "e23a0be18abf355f3065177d8c3c14e21edc178d0abd1b39f703e6335131" +
-                       "ec90cba3d9846cee7354a06c320a3f61b8a269abc7138831614f57ca6c19" +
-                       "a4a621142889cd924bf4ffb82b57f871b854f3157e8874c22d43a5726900" +
-                       "bafbb8f2260a1eba3a462e23d4def2ccf68ebaae8e52739a1ce67c039eaf" +
-                       "9a6c3232fbb5a91d1e59a8dcd3798ba71345fbf83d09b83b41cc49d5ff5f" +
-                       "2e809d2b1d5fbc1e7001ea76b9b2d8f896eb6609e2e1c5c562d2a6e74960" +
-                       "2d67a0f6b43a201d5087509b8dc7b0440144e308c18ff8b96b607de2f20c" +
-                       "6ee99bb05367a8b25947011889f724965a2b5c52c9db1e0622df9343c548" +
-                       "d054699badeb15fc41055af0d79a2bfc1a5b4574634fa0dd9dd10a6213ed" +
-                       "b6991187dc560facdc27440456a0a209fd7f5ee4fb350ae71f869723e5eb" +
-                       "5338e3d1448bc993afca6957f4cc7b047a2c7c9593b7234725e66cc0eb23" +
-                       "3824eb4cb905701cc522ec210950b871397c6c0bb3d0b839f2eb1a120f70" +
-                       "36107246df4dfb2c24891bef0bd1dc131f2c9d7c295ee967e3184d963037" +
-                       "fcc9e0b8c7011c8e04b4e70038150d34caab4f8c0230418cd2d8a91146e4" +
-                       "4e11cf6707452ddc03d9b4e6380658135dfb48f62c0690ebad75167f4dd1" +
-                       "c0df3ed555b5081a7b82616d9e501757c83c2193d0f640236d59f9c97a4a" +
-                       "5c8bf532aea2cf5964ed2dbd8a70c01ca5c7677224cf2a37f3b24d8fe4ba" +
-                       "91cd3b5033715de227de51deed15afb8eda9d2b9615d197b8f98322d7096" +
-                       "79c5131eed48050fbe0145a9284e236605c25a4876e2adba42f4e35a8949" +
-                       "3d59bbf44b3338d9d2e65a7d7ec6c863cd47cae9e23181b07298078a5e9b" +
-                       "06a5c7e1059f474eb1a4247e8f02cdd4efdca67d22035b12abecf9b15982" +
-                       "de4932a28e797bc4de38442cff2cba263eeddba0ab14fc706dbca04eaca1" +
-                       "b4cc13000a10e35b32461424809b299798e4d8e66c92aa3181c5df16ab65" +
-                       "9611cb625e895a8021af8c60960227d6f2ebeacb17b13536a5ff139734ef" +
-                       "37cb67018ef9a410b856e6f6eddbe3f59b088d538c50a8f3f0912d06e47b" +
-                       "88d773069aa759cc614e1f53cf6e572c127123d1ab56b79ee753a921cb22" +
-                       "a60e4e6cae768c9966de4e2625484f2e990154da7fca84b6e6c0b59201e7" +
-                       "fb8a729cb20b4c774381e84f1bd6e304543d952dc76ef741b72f3a4ca7a6" +
-                       "ea7958b8b6337994ed82dcf988eb70f509610b9a279ab4d0f28cc2b2dd99" +
-                       "3b8637a6be0cb4b5f67c79654c6b15e1b61120374ba9b974a628c547f11e" +
-                       "52d72d39f8f9c5dbfc23a89f22d38984dd8d5c3ca72cd54e6adfe2b3d163" +
-                       "86afdb50967846a4c311351a51e5fd322757bdb061d44c8796a61fa4db36" +
-                       "793bc11984eac83bbcefb40d0bc7bab0ca81e7df3a7f58c6fe800396716d" +
-                       "832acaddff6d72c8e19dc9ea838294ead800deadb6bc18d3e399fa76c46c" +
-                       "5d88ee72a86a87399423b0578eb6e27d78156ea2abf6f08b5cbf747f2f74" +
-                       "5301b694bfba84bfe3c5527acd50660eea5105a2644c1aa92f954a604fb6" +
-                       "a1b3b2d0331497deafc3aaadc7040b9188a36cf607ee85a0655ae963fd32" +
-                       "91dd58f8bb50b4e46dcf7c2957639bffa6b12d895660dc0323b7a092f999" +
-                       "813380b820e1873c60d3e3038129c66d507862100a5d5842150869e7873d" +
-                       "6bb6ad022350ffa3813aca26c80ccae72692bed9c77c9d4da23178c57153" +
-                       "90b5f4505240a796ec9d10a7f280bd60a570b1b693453807707651fc0464" +
-                       "03e4768965a6f42f112152942134f0a38c84137c7a6e086ef1ab9ad20d24" +
-                       "3b93356b305c0996ab7d02c02c44cbaf8f7e60b8c0b8c9fece3f189b099d" +
-                       "dbd126b7357c1c4ea1c8bc1ad93db91ea9bf043a4320acb60b502bec37b8" +
-                       "6b2a5004b8225e549e613c6f83b97b7e4aeda1b013e0a442d7ce2f14e78e" +
-                       "a94bab700c9ac0abba945e28f39fdadff223c4498cb204f01ddfcb450a41" +
-                       "f32ae47f99a49114c6646a5cb103e9cd75f9d81dba417e48c4053e3b0295" +
-                       "2267cd30589b0f5d993a5485a6ead1ffab9f2f4294c5853ba76383a326a6" +
-                       "a42fb8b78948aa49f0f1f614bd0a3fbd2a58a3197daf2094605bd838285a" +
-                       "1260f1265dca74aadd95652632335fd17cafcb73b202c3f0e5da836c2dcf" +
-                       "2934f005935dca80154af43fa34c8ba440d1581b74ff17dfaca369dc9aa6" +
-                       "734c03916d78e1b952691cef918fe033d33f7f4323cf724ffb8cd6c219bd" +
-                       "046e9f268eb0601098e93daa59dde370e46269dd7c54891f71bee2829a53" +
-                       "df86a2c7fb1046cd7c98fa21cd83597be554997a70acebe0b6e60f1f7098" +
-                       "6f65adcae24385cb7102bdd3e01300ffd15d00f9764b3a5c51e35e5c9cdd" +
-                       "da84f4b656fe514ec4ff8dcd774373f8a9103cf36abefe875f7084b9bbd9" +
-                       "42e0c997ec2d860a4b622ff1a39a628582fd81f237d3d8f6843d26ac77cf" +
-                       "bd48003e8e8c591ff813a9a897e3149ff0297ff476299d717e54d885cdd4" +
-                       "4c3ba6ebf54bc7a1",
-       },
-       {
-               key: "b15578da1020f662ada0ad4f33a180d9f8ad4991b3720bc42a22b52625c7414a",
-               tag: "b0e4ad4a010afd6dd41ed82868cda555",
-               in: "6d2afb7a9154064341bdbb533f11990d4987e7c90fbfc0167c1e58d6efff" +
-                       "6010f7ed569dac62ad37183b0d384519ebed0bf9c6e05a070b4858e6b846" +
-                       "547ab5e45619c866f83cce83dcdab6a8a6c36b115ac832de1c6d433b94fa" +
-                       "35803fa1a36f1ee114f8632402a027a74ac110394f32ec4006beb0057f09" +
-                       "a94dada8bd0d1ca9a14b1f2efb8f526d79d6438bbbaac0ca1a43935627e5" +
-                       "d129d52c06bf6413af07513bc579447eccc3a9406645c94dae59dab98d6a" +
-                       "f92fa90fd4efaaa4bec466806ed401d2083cda587139ad7e9ee2adbb1dfe" +
-                       "a88b59dd788b954a0f52c3854a3fffecb4bea83debbb2f5f8883e6415d3b" +
-                       "ac1b872df1afe185468adc59364c173082f1dd6da9d348f5f5ba2d216243" +
-                       "23de1f623eeec875bf31d12acec40dc0c1b9562826f3105cdad4c43cf45d" +
-                       "829aa8b14012c47847aef7a2a6e3935fd972235f5d3a7ce4ad3582785393" +
-                       "602e2e27329914021eff38ed2926c88acec1551f17a1b818fc1c3ed4b3b6" +
-                       "6825d55bea269d710123b52e12ca9520a069d9c6a21df3a0253b3a4a6a8c" +
-                       "dc226d667541548834da6bdbbdc165f39e40047d4b647c507d981be17b3a" +
-                       "836063436241a8bb46b11a2867b621413c42d838e4578b72cc1982e34bde" +
-                       "c303b5575ef4b8dd9fea8ed5bf69539413909d03461d3853b5fbf714a61c" +
-                       "769569f42b38fac4b849104e2f2ac1dad0e388646278789f83e0b0511571" +
-                       "019d3bfc5b03ca4cb5564e4e75e103ea1b6000be6588e27105d7cdc2d2f1" +
-                       "f680ad34ef823ac4bd4068146e9997834665aec7dcc7a82ff28d85d52dd6" +
-                       "9c18dd35f326bcf709f74df5981bb90ca8e765fef9f0698a19e12220b287" +
-                       "24a6d9e4f4c7ce93f8ca9a126689ad1df820072557ce3db246cdf41599dd" +
-                       "44ca841bece6c7869358005536e1189aa86b764e890ef90970d6e3831def" +
-                       "fa890bf8692381123924e7d9df804fd770a0a30ee97d5dcdca302833efe8" +
-                       "1d4b2505b17382f0b3429b38c41269ac95e36e9f5a1dbc6e6c8963741917" +
-                       "02a23198decb4efe6809fcbeb5d0c9098a4c300155dc841610e55c8a6e27" +
-                       "2a38a39de3d8ebf38a750af25836ffb1bb7822bb98886280f0cab6838c01" +
-                       "cec57961bdc2e1bf158248309ff9294adcb962252b1c24646d132a3be2c9" +
-                       "1ff82e8e101facbdb807826cc9d1840a90874ba08692e808c336c9d280ee" +
-                       "f36a43a75c746fb864f85711e802546ab5cc3f8f117904ba1a85d6e4b729" +
-                       "85122c5041891e16d55b93d6fc1b7fcfdc80ed3d72d55d64b8895bbf2f8e" +
-                       "d188684e7e89afdc1e6a7ab9bd1d3da95d68698df2cdcbb2e1a4ae70e2fd" +
-                       "dd4760f9e5cf4255eeb1e9e8009ab507395bacb8b2177e7c5757ad02baa9" +
-                       "a96db967d20a150d2dd7f3081d90675fe0c82f94aa3cfdf6ac5585583901" +
-                       "7a8e122170cc817f327a3c8ef44acd6e4fa81b73bcd0bcb5792eed470481" +
-                       "152e87f7a20c3f7c69d5a8199bf9bb7c7269b450dc37a9b22102acaa8438" +
-                       "134d6d733d231cee9522f7d02fbb37b5818ad3ca72df4752230ee11392ef" +
-                       "8f8219be55202bc3d476f5a9078b32fb63d42bed4cda5ef90cc62467bf5e" +
-                       "418ecd9d5d0cf1a33eb9a930e652ce96057fef40b65588aac67621d651a0" +
-                       "9003dbc3925912e385296cd3b2b386a44113308ddf2af52ca390487eb20c" +
-                       "716b76d78ad45129e7c285d918de7107ea8c3b0cfd9e73933b87c0b2b505" +
-                       "cb4c95794f2ee6d6d43e2e76026923a0bbfbc3bb22df9ad729452283ce62" +
-                       "dc9b26684fd45e07650581afd73713a708869a069c58b599ab478974f206" +
-                       "dbd3e4e563e346ff1881723c5fd440bdf9f70f761c6f746113397d7c04b6" +
-                       "b341d7e44de7de0aae79badaaef5ed372ef629dffd52926110683ab2d4da" +
-                       "a4be83eb86c8700703a660edd5a5029f66f1581da96fe1feefc970ab4086" +
-                       "a83ae02e959821967bd27b3b629652f5bc3db2b7f1af674f9f3fb3a788f7" +
-                       "88e6dc1722382971831a7ed72502f85b25888c1534d81c0a4f7351ecc40f" +
-                       "4e0412e05718403fae5746d313a78c80ac297f1391ad389070410e1330a1" +
-                       "b07d683d1c795bda74bde947f2cf0dc9638b5d0851cda27df030403816dd" +
-                       "3b70f042888c9c192656cc4b9fea10b81b5347900d9199c8f0f47d42f2ee" +
-                       "482b68acfa5ff47d9950c950a926a497d94c6a796e0b715416520bd6c59f" +
-                       "30217718d5f1d7bf7c24039f6467214ac8783cf011b25c37c67dfddde426" +
-                       "40afe97f94879f4586954737b86701b32d560f08caec3fc45184bc719c7c" +
-                       "5bf699074fde814acae32c189158c737665a8f94637068322f0c23ff8860" +
-                       "f1b1c1bd766440afee290aa6f7150c7adefa6d72a738cd2268da7c94788e" +
-                       "bb39002e9a328a51f3a92dc5c7cd9e4faed5702d3592ad16217c4978f84e" +
-                       "af0fd2c9e4c6f4dcdd9112c781eb41a9aacb0f7935bb5c92d41e67cfff6b" +
-                       "991ccefbd667ffeded1de325da50c33e28e2eef2f636c9726dc5bfe753ee" +
-                       "c7bb6e1f080c89451f81bc8c29dc9067ce83deed02769714fa9bb477aca5" +
-                       "c09089934674a0cc8e4b2c3136b2e4af8040cc601b90a4dec898dc922ca4" +
-                       "976ab5ae4ac5af93fa5b1854a76ac3bcc2090bdeaa49ec4f319cf7c7b674" +
-                       "6d8e617abb3361b28b27983dd1b139ec4f5af7e116439d7ecb16534817bf" +
-                       "264dbd8f59e80b443be12c17fa013c7f4d029504c9bb62b296c2326f4f49" +
-                       "cc3201b70ac3f62abb683c630179594a6d4cf30fd55b163bf8d01986bb6b" +
-                       "cb7050fd527f095c45661920268e56f760fee80a29c9d37b7fc23f608710" +
-                       "1e723038e64ee1b91c4849d69bd95fc9bc24fc4a234f4855f2a203e3f699" +
-                       "c32698585c83781677739f2c48697c93b3388dcc64aa61f01118495ded33" +
-                       "21ef9a1c949481f96005f8d5b277a7d6a0d906ec304cf4292df172e72d20" +
-                       "29ecdeb65f06267a605f376804bf7bc5b82d5c8facfe7e41dc10806d27e0" +
-                       "bcc5a341d80b3c1532407f75088716d732632cd88b0037f0d829bf385fec" +
-                       "b52a202956489f61f16b0f4781bf59068b33d7330571d0b4a6ed91830258" +
-                       "e1220b308784fa155be9bc821f5c0009a33802fa66dd66d1dde997dddd97" +
-                       "873ddf65927dc1be979af2b5f110eee627dc1e210326ac20544a757ac168" +
-                       "1823f3dd04b1ddc4bf96677a0a87633994e7af2ec99b7d5dfe44c6192be6" +
-                       "a6e69d17b074256da3947808fbf68c7506a7e2c99e6b64d1ffadbd6285d8" +
-                       "e7e032e24d42dde0594bf03fd550be05e5d66c91a660cd1ab7cb1f43fa9d" +
-                       "69885203a7aee35a28f117427d7ac02b742f53d13b818f8631081b1730d1" +
-                       "5b4e1e283cc8e5c4fc3b4652fce05fd8db821f99fcf93e6842816a549791" +
-                       "7f6c49cc53d733788b2fe3c687de58bfe6153c70d99380df1fd566a7c758" +
-                       "8052c62e73340d6a9eccd2ed26b763d518f3a0c4d6362212fbecebb4ffb7" +
-                       "dc94d29944fcc4ab37725b105aa7571f364146782356d8ef056a0be93a55" +
-                       "0c890df8fecc178776fe40703ad1bd2443d92c420be4306d99686592c030" +
-                       "fd3e2230c0b48d8db79002e8a832ef27edb53a45532955f1171203d38414" +
-                       "b4692e901e9f40f918528fc494430f86cf967452f456b01846ac6a383fc0" +
-                       "de2243c7d804e8643aabcb78e2653b145f400a999670217c8da43bbb9c11" +
-                       "e074176424be0c116c304a420120138e901eca4b12ce68fec460b23bc0c7" +
-                       "765a74fc66cbda0e503e7b1baf5883744e468c97c5f1c4b0acc4b87de9f1" +
-                       "4b537405dfb28195439d1ff848d9cd28a8d375038ebb540a9075b7b5074b" +
-                       "ebc18418a370f1d3ac5d68f5d239513002ad11bfc2b7ff53e2e41ccffc4b" +
-                       "0503acc4967c93ae8590a43439b5e7987d10cb8d1957bd9ef717ee3d12df" +
-                       "5d6736c1d8bd8da102337a94b7d14f830f6c403cbaf7925a8a2a7af1311c" +
-                       "57224967a38f6ca374013a9819c55fd2e2a5fac4f2490be5b059f4cd9c60" +
-                       "2d62f80789eb8d9ab893c7f44a4945e41886af218179dfa754bbb59aab68" +
-                       "13b71d2202eb8fc8a425625d21176a28a620e21bb0dad820c0b7051ce8d1" +
-                       "3a33f3af0958bb6cd89f9d6414ab00ddd1d2f9fdece9183d0c05fcdfd117" +
-                       "10d250e4b2029e6992a88293d0457e73e5b1b6a1aae182c69b9cb664992f" +
-                       "073595ef68117026ad7ea579a4043cda318931eee7b2946a34cdc7c9755f" +
-                       "80cc79a2bfe3ed9c79dc52faa5126b824868c965eeb37e9e4e6a49600f3a" +
-                       "cce93c0853b546edb310dcd16a5755f15b1098b2f59dbd2d90e2ea8360ba" +
-                       "f12108236e854465456598ae2f7bc380f008f2e3cd7c98c87643cafd7c36" +
-                       "d40e2597236428d46aa5b260f84b4212d5e26804086adcf00363ce4becb4" +
-                       "9b57eb2847b2f18ec82c99714ad4ddfe4ff3bcac1d0fcaa32660a1dccc68" +
-                       "5bed83254c8e2ea0ae3632a70cfbcbeadef922d78a006d43ac7ab1f8a609" +
-                       "c6e0ebc3ca6bb8430f1a562f41010db74b9febf931ca794fa08d1bc17780" +
-                       "532ae76f25c4ee679d788835dfa4e70ca154c9e2865c3750ffe7b837eed1" +
-                       "972be058fdf2bdb3eb301867bb132306c7aa237f6771d60bbc56cf31cb30" +
-                       "32a87204d454542de747418470025ab84935d3eaaca01dbbdae9ef6b5d3a" +
-                       "ca62ce9f871a3e1272b2b671582c096a349c00f32d742ddb17993994d8ae" +
-                       "fc178cbcf9abc03114ff2bf7db8f757c63d6898faccd822f5c2e9a7570fb" +
-                       "9cfff148570888be24ae42644c1a5bebb6f6287147a4bcc01c7675be9e4a" +
-                       "897519dd3132a7cc2e778f8c90d23dc8073f6fa108d7ef82d561794bd9d5" +
-                       "f1faa306334f338ac3ba99c853f79c24f7048fa906fde87d1ed28a7b11c0" +
-                       "66a3bb98f8d21055aaafdf7e069b77b60b3d5cbe7c5e4379c7651af955cd" +
-                       "82a19a09caf36becb6cd3fe9e12f40379941542709991066df21b7b12dfb" +
-                       "2416d83fcdc33bb583e3b42f24f53edf8dc7c579ad3be831c99f72bf9fb7" +
-                       "a35b6562e824e039e6bf1adc8f5ca53846de7bae11c4317e696d887df33c" +
-                       "525f0a9c01fc29f2c26c90b85fe82ed8bd50954cd4e9ac7c85c7f3efec75" +
-                       "da1da4ed173cb695cee295190527edb3cb06c5dbdabe0228cc60b6455153" +
-                       "76244f27aa56da2db10f2659090137ffb82c57233c833e0bbf22d6f647fb" +
-                       "97b3652d2888b3ab08010b8e8a6967d560b747757806736dc98b78226634" +
-                       "f1eecaa4a2e23ba36591acb5737d735c5bc7a2e36f1a46946927e061fdf7" +
-                       "7a3b68ef582c26b01f5aa9a438ecc26c6941221d1590c838072f9e471fe7" +
-                       "fd59dacb0d092d40d76ea2f7c6e954a132a015bd4cb31147f3ebe4518322" +
-                       "916438a62836ac85a4cf4492190a85bcc8edb37e38b99ea552d749c30f74" +
-                       "ca20c298165e8ed02d4671e0b41cac3a32a345b9349ad22c2a4bb2c16a4c" +
-                       "e0613ca0f0518759f7d2b33cfad2fae764f410d4d9ff8a76ae02a8107e7e" +
-                       "01d9cd0552676b85ba002f19c01ad5f416d1d08bb84fec7c3555b098dbce" +
-                       "48e1a5d847895e54db9c5b80cc22d5b87cd41a1a94be102bdd45a3cda5d1" +
-                       "181e10446d213d6b3fdc350d486d2011d705c5f16ccf7519065c47bad7d6" +
-                       "89c71e5fdf9d04bfb91eb1f07fa0f001009c1d4b1f6a116a570823a8580b",
-       },
-       {
-               key: "392468efccff36dade31fc1c62eb38bb61394fe448def9d9d9beec2413ddb418",
-               tag: "e1122e7c8e6965b90addbd46d8a548d6",
-               in: "6a13d37f0ec933194c227351f4a19b507d93465b1f3e88dcb5f1ed1262fa" +
-                       "58ea99ff31e6fc85c39c04129fa69195b71b2060122fe618dd9430a63f97" +
-                       "54b52a80b3cd099f248f91a468bae211a27bdb47ba005d29881ea5143a82" +
-                       "967c4c30c9a4f0dba1a4975e6407fe296d40023a00efa06be763f2d73d46" +
-                       "a2901ae28b3d8ce18009a462e223b71476d7b954c138e177d15a390847de" +
-                       "96a7f7fd0598748e86b0f08e64d915e67c7e3cf936f3dcd60edebd36e2a1" +
-                       "d65b6ac29530c48ab3bd52d45b4f938a19b9b31e2911105a8561600d5377" +
-                       "905a67112ec28025aa680350ff85b808c5b4c98b7b9567d03f5ed3911ec9" +
-                       "365a8de4b15ca62adaa69e5ba710eb1756a346016c67a297d8624f9f1ab5" +
-                       "b3fbce98b141049f0ce26c85d2f8a9cc6ca8ab6c6e148be968931430dcc6" +
-                       "2bf58ea9698ef52a5d271cf48e6748ac9e04bc7ae7da205a1a7535478322" +
-                       "d820eca146cedf4b2f9aa9fcfd77ab56a7276977401dcc1f96baa1b607e0" +
-                       "256bd04ec324ec67a4313e2d5a53d3a3fb5332927929b20c63bde805f637" +
-                       "eb1050fee2a152a0405634f55c48a59fe370d54b2ab1671dae2c7fd92243" +
-                       "10627808e553127c74f724362b4a6ee49b697daae7df3ddc5d2ed9d6befd" +
-                       "77fb9f68fe3041f6ef13f46f34ab682ab8563e8996344f82b2ef006a8d54" +
-                       "3dd9c1db4979d7da97bda45e722065f8a238f0873217b783a9a629a12b3a" +
-                       "4de437445039997bd243efbf5e3b6059b9459d395290efb9081c632fb694" +
-                       "81000dc74c395cb507422df181aba20f776ce3fd8765ac485021992c98b1" +
-                       "67c68805662cb4356a0ee7ba6bdae51ac10cd06bb5b2f3a72841c714c8ed" +
-                       "bc56998fe2fefb9bf69e172fdf54b2ab138ae59372c52a67e93882a3000f" +
-                       "d966992aa2250c6ff93e9cac89645d70625d79332ade5dab7eb1adbe7dce" +
-                       "5a013fb65ad32fe22ed16fb9bb35eca1f37a0433c320e8752f8fc4b7618c" +
-                       "5e4df2efece832e259ad98b895c474e47d0e3fc488bea8f717a17de0dcf7" +
-                       "597fb8fe12e62246296f9a887dcc3a700820c190a55a4931a7d44bd3bb2e" +
-                       "ab6c8a8126f1be93790cebabc1d69e01796e6cc80e7c16bbc82fb333fb21" +
-                       "c774ab7db843242838e82d8e1cb8ccab385e67a4271fe7031d74b6e8edcc" +
-                       "8ed585d1c05a365c7665899c1dbc561151d3b44bceace77c4f53c0e0f6f7" +
-                       "74d42f9ad3e56f1c2a8d53879d695f895690afb4698472a3d52d67159313" +
-                       "133c87823fe0500eb68fe286f8b9a2f59f12785d026dc97bdbf793c7d1eb" +
-                       "155f1f136aae66c256583e987f718afbe733e0a5ce30d021493fb84e2242" +
-                       "5b18754d126235ef80335004fa84f88361a584753df409360cd8bd45bace" +
-                       "8f48156bec66577bf2c685089f5ac7e7ec76c0df068fbaa47661f8517f92" +
-                       "e14723b3b278f151816537a7212c96bd340a00c15c9c9bc9a2a5d163655d" +
-                       "84b38073e2be9217cad97d362d89d4baf3ce0a8d8562f19a8c97a9aaf5e7" +
-                       "77d60456360ffb77b30f177d2809052020d141697ecf9cb65f42b9190caf" +
-                       "6540b2c82f6e5a8482934a6a1a5711a8c24546cd8ba432068404eae5a827" +
-                       "2e09efc3c6037af4feaac0a46329229b010ecac6b9f077a9b076bb6d9ce1" +
-                       "38401eb38d124baa11507a994185295020bf9b754fcf78430db9253f5929" +
-                       "87c46c0f8589c4e463b15a3840b1cea795e24cf6b20f29a630136e0589b3" +
-                       "8dd7fbe5ea21da72c88bd8e56473586822aa3765660a45a988df9b8eb8e8" +
-                       "141939d3e4cc637c5d788064d40a9f7c734e43fdf8d7189a5d76700d9743" +
-                       "fe0122944663afdb88c5201318ca782f6848b742ddebe7463fd4a32280ac" +
-                       "1cf8311e9137d319de05ce9cd85abab24c5364041c14d3b4ce650400498e" +
-                       "122166eccc12784b7ac3b262ac0b198ffc26eeed9a5da5374f7a2a53c87a" +
-                       "78c217ea1fbf8d38f62511657b73109f31691aef14d82ce6e1010eae9e6f" +
-                       "a419e5c1c16c0cc70651eb3374c03549a1bc7d3ed42d60f886102c798dbc" +
-                       "ba56f0a2b3b9b412530c35f5f7ed06311ee14571f9c26ed9c81ef38ff000" +
-                       "2f5ef3aab7351e32049a6ef8f48a43da1d84402d229df513dfaf1b2e4043" +
-                       "6ce68c70ebeddd7477c9164f0dce45a6fc5de050f52ec269659d5854bcae" +
-                       "f7762ed7400713c27a4d523eaf8c136c4a1ca00b9e9e55902daf6cdf8528" +
-                       "c22ca1f2fa7ce87902d75a6850e1a5a4592497be1bb401878f18b189b0e2" +
-                       "c59d10705bfabde3cd2da01eb452006b294108d5d42e88e9e15424d8cd0b" +
-                       "8ab43a6c546b3dbf52e47b59cde6a3e417b0395220b6d63736d429da3458" +
-                       "9a2524f1629320206fa7f1d8a041e17222c4a5814561937e1030e6375c77" +
-                       "9dc988bb928bbdbe2c2eb20111639725d82b5d7192cd3e4acc27581f0ba7" +
-                       "286cff41f97aa5a52ea0083de5057fd2ba985aa738e4d03fcf11ebab1d97" +
-                       "e2ac77d1c2beb8799150a421a07b3777d0b850f24194b8309135b13da6c7" +
-                       "e38653a711e407a1811290fbb7bc15d8b12efc6916e97ead41e042a44721" +
-                       "e9cde3388073d921595bcddcac758dc675173f38242e65e4a284aaa7e8fa" +
-                       "6adddaf00bc46428ab2d8601205b8895bcedfc80ca0aa4619ed6bb082ddf" +
-                       "33ec04fa5d417f33fcdd238c6b11320c5a08f800e0f350b75d81e3bcbd15" +
-                       "58a1eab87a3c8c2ffd7ba1d7e754e607cf98ba22a3fc766c45bd6f2569b4" +
-                       "84639e6611714119d188a24a5e963089a16ed34e20b9f154cad8ac6031dd" +
-                       "7a3a885afc2ae5e003ae8d4e4aabdb3e51dfc423b8cf4ed9ae2010072cbb" +
-                       "b1108c7da1ff075e54ed827a0963ac5523ecdf3fc5eee7b4d1a6773764ec" +
-                       "5c30f41690523fd70d895edb7ca6a1806d54240c4c7b43410da73503a323" +
-                       "90d9070ed30da3a2fb5eccd40d083be7cf8bf40b4279f819cf795b6f075b" +
-                       "5a67a10a06a6076d0d83c72efea05f244901c4b5fd9eb380432519311baf" +
-                       "8c81f6325df4d37ff4d30d318f904ebb837ec76b341dd00a8f247cf0bbe9" +
-                       "6f3784dc8f5feb344958fdf1a9ececb105f8770826db1f17a5281e997951" +
-                       "d3c60cc28fc3e66ffeb5dbac315f98f6d240208043f28dee963d843e68ab" +
-                       "57d847f76ae2f96ce6e37f377ef5dfef2176ecd7440ce4dadcec2231b606" +
-                       "e4a80420fb3ed135640e1f05d6bd58b8dce062dd7d36b885d424f6318e5e" +
-                       "a0753efbb33bbc7360d2b5dfab3ae0d5e000b8d31f2ba0f5fd8b34f96b55" +
-                       "28fff35e769461d0f03cf3bfdf0b801dcbbf2838180cb9b108e06c353e3f" +
-                       "0b9ef61678cfed1ea37ae76bccb5ef5957ac2c8e8f4794c8145a15f1cc88" +
-                       "bfb0881080326c481b373c3bc9b07a9b60a0c8bd5fa4f6f90145590a5227" +
-                       "6fcc0ccc2375d0ccb571d414d1b0c38b4e02c39db4d701c5e25e90785ef4" +
-                       "d26f35edd8c4b96455bdca7245cfefd9cfbd2f319615e5fdf07bb9564fa0" +
-                       "44bb35a58391d02e3927780b4076bc0893dfcb4b63a32cd7a541a4a8c253" +
-                       "0349c6e96e378dbeb66dedf87d813d0b744452c1c4088507dca722193827" +
-                       "9e2dfa24e4a409de494acf654f44262db9206a7717fa434ac4fdc6a6eb5b" +
-                       "1fd5a193b6043bc4327c8c09fd6822eaa9df37bbcac1077754a295621601" +
-                       "267b68733b62dadc2563f1700af180141f29899e2689dbbe9745ba8477f4" +
-                       "352921900b403a01c9dd042a8c1b0e0489959fb0b0a8431c97b41e202204" +
-                       "212ebfa00c593399dbd14d7aec07b8292d2e40b48f05fcd54a15da4a24d7" +
-                       "2759e409f4c7b5b98fce4abac6c30e4872d92efa1f96479ec30f21699825" +
-                       "50fa60584f5a09051a00f8e7dbb3853e66ca3f05fbfe43bef9b120a25a01" +
-                       "eb436ba8ecda715201eda72e517d628f883386c1503aa8b8e75610f7155e" +
-                       "9f916335ab6d6f0f9589b6220cd2b81c2c937dc065d3d14a7df8cc916cd0" +
-                       "0ce1bb53fd9c8974298d3bd316f3658aa8cc6904f073a1472149e4b08c64" +
-                       "5e11abe0428ccb6174df2103edd735965d6454b543d3f01410f77053f65e" +
-                       "c1d1aee56fdd3af23bcd4e1a7fcc4e600c4831007c33fe5f0c8300f686eb" +
-                       "9b4d1e4f08fe4ddc8a90be14dc3a5a88ff96716509341d5db24c0d016863" +
-                       "998b1859c5021df815a6f1ca9845f1a8e99dbad132b406227c5897a1bdf3" +
-                       "e698962f799133ff4429decbef6ce036296facf38e4812fec102b76c6d30" +
-                       "beba1b70722254fafbc471096153478c971db7d96263660209265cb10f13" +
-                       "b34b5fd55c4abe818a5f9715d8a85094e2946b7a001b47f629e26c636d86" +
-                       "4968ad2ab616dfe28840bd60b4b9855c8dbe1cb873fcbc4577b5fefeb8bb" +
-                       "4832039867dc35db9c036c83bc204396e3474ddfe806c77c65c936f488b6" +
-                       "7c1028739562d7bb055d21441af29ae2921290e548dccf8a56021385422b" +
-                       "15da6b232b24151309a75a00296d11aa1952a1513110b0faa93d1d8cd9ae" +
-                       "fa9f1c59377ec9165b2c9e07cbde40db7b81bca6d58fc28bae8f473cd0e9" +
-                       "a2420e0b943a83d284108626c24ac570b1d6c1ab971e71f43fbd6c00e171" +
-                       "238141a6dc987a60385c3a04dd147a2f8e80dfe727b104c0fdd80b326f59" +
-                       "0b9f86fd7b2fd1122a390979889eabd803ab57159c8509a1443eb6789382" +
-                       "090a770ae4eba03306f96e50e19a7d44c584ccc230d104548946efca4520" +
-                       "d61de5f473e2f4eada6c8ce9c7ee975eb4f63c0483cb775ed7d3cf690a61" +
-                       "7d6656d683a8512707d81ca5ba176a42bcffcfa692129f292607d2a47536" +
-                       "ccaeb464c9272d6f3816074b712af602470088b253deba18771e5f67734b" +
-                       "587707cdd06f35264b2262fd253c25b5d38ee7db287610e5398062b7a34e" +
-                       "6e4cf7447d00873b930ad148fd96f0ab18771bc468b874bb109924101c84" +
-                       "c4e239ecc7687d875e4d94a1a973620ca61e35a872c2e2e61a502169f1bb" +
-                       "4e5ff5fa2bff657be6195b3e2c7151a52fc0096d98e7f08f5a98f570aee1" +
-                       "7b4275f1356e87e080ce0e1b9bbabe7dea48b5903bc390ce23472ad64a89" +
-                       "41c3247bfd23ea90b2dee09085571bad85568040105e098f993bb37e43c3" +
-                       "e6d511171c77cfc450570dfb9fc6a3930ef43c03f8213f6203d545d791c7" +
-                       "d3fa42d5dde1655038d35c5dfacc12e9dee24fe833977549eda68ae8b508" +
-                       "be277e743921b584f9dfa0eefbd8bf3c23f51efdef7f7487001d29e8097b" +
-                       "ba63289cfca743023d1668555a46fe6d5b7421377414df1e9ef135480622" +
-                       "22e2e9a7baa618d88f407517f6317b6a0ba3384ace16d68631d59ea169d5" +
-                       "092d20afc1a481b82be5e734bb092953a0a94702bae1a0f48d2a22b9a05f" +
-                       "f64493b7b2e984f27582b1eb937fddf8512c49830435d146dcc291a4118d" +
-                       "5dc638b99cdcbcc5860de7a92c5b13cbd1e01e051f01af40afe124346320" +
-                       "d3626bf9d8f7850744e032a993c276fd388718237740c6caf260fca60b8d" +
-                       "d846102e3262b6e05ceca00c6affe938fac1847350865fc858d3ddd1d130" +
-                       "71d1221ce7c5d575587fcba580e544b74d877ed5ca92763ef0ca0d7bfa08" +
-                       "d57a0216b2a01a2b9ec74b8430051e0074862b7be25b6766ab520f2eb75d" +
-                       "eeb979c28f03795f6f1e4b8410beab19a20febc91985b8a7c298534a6598" +
-                       "f2c5b0dc5de9f5e55a97791507bc6373db26",
-       },
-}
diff --git a/libgo/go/internal/x/net/dns/dnsmessage/example_test.go b/libgo/go/internal/x/net/dns/dnsmessage/example_test.go
deleted file mode 100644 (file)
index 4cfe2ef..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package dnsmessage_test
-
-import (
-       "fmt"
-       "net"
-       "strings"
-
-       "internal/x/net/dns/dnsmessage"
-)
-
-func mustNewName(name string) dnsmessage.Name {
-       n, err := dnsmessage.NewName(name)
-       if err != nil {
-               panic(err)
-       }
-       return n
-}
-
-func ExampleParser() {
-       msg := dnsmessage.Message{
-               Header: dnsmessage.Header{Response: true, Authoritative: true},
-               Questions: []dnsmessage.Question{
-                       {
-                               Name:  mustNewName("foo.bar.example.com."),
-                               Type:  dnsmessage.TypeA,
-                               Class: dnsmessage.ClassINET,
-                       },
-                       {
-                               Name:  mustNewName("bar.example.com."),
-                               Type:  dnsmessage.TypeA,
-                               Class: dnsmessage.ClassINET,
-                       },
-               },
-               Answers: []dnsmessage.Resource{
-                       {
-                               Header: dnsmessage.ResourceHeader{
-                                       Name:  mustNewName("foo.bar.example.com."),
-                                       Type:  dnsmessage.TypeA,
-                                       Class: dnsmessage.ClassINET,
-                               },
-                               Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}},
-                       },
-                       {
-                               Header: dnsmessage.ResourceHeader{
-                                       Name:  mustNewName("bar.example.com."),
-                                       Type:  dnsmessage.TypeA,
-                                       Class: dnsmessage.ClassINET,
-                               },
-                               Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 2}},
-                       },
-               },
-       }
-
-       buf, err := msg.Pack()
-       if err != nil {
-               panic(err)
-       }
-
-       wantName := "bar.example.com."
-
-       var p dnsmessage.Parser
-       if _, err := p.Start(buf); err != nil {
-               panic(err)
-       }
-
-       for {
-               q, err := p.Question()
-               if err == dnsmessage.ErrSectionDone {
-                       break
-               }
-               if err != nil {
-                       panic(err)
-               }
-
-               if q.Name.String() != wantName {
-                       continue
-               }
-
-               fmt.Println("Found question for name", wantName)
-               if err := p.SkipAllQuestions(); err != nil {
-                       panic(err)
-               }
-               break
-       }
-
-       var gotIPs []net.IP
-       for {
-               h, err := p.AnswerHeader()
-               if err == dnsmessage.ErrSectionDone {
-                       break
-               }
-               if err != nil {
-                       panic(err)
-               }
-
-               if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET {
-                       continue
-               }
-
-               if !strings.EqualFold(h.Name.String(), wantName) {
-                       if err := p.SkipAnswer(); err != nil {
-                               panic(err)
-                       }
-                       continue
-               }
-
-               switch h.Type {
-               case dnsmessage.TypeA:
-                       r, err := p.AResource()
-                       if err != nil {
-                               panic(err)
-                       }
-                       gotIPs = append(gotIPs, r.A[:])
-               case dnsmessage.TypeAAAA:
-                       r, err := p.AAAAResource()
-                       if err != nil {
-                               panic(err)
-                       }
-                       gotIPs = append(gotIPs, r.AAAA[:])
-               }
-       }
-
-       fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs)
-
-       // Output:
-       // Found question for name bar.example.com.
-       // Found A/AAAA records for name bar.example.com.: [127.0.0.2]
-}
diff --git a/libgo/go/internal/x/net/dns/dnsmessage/message.go b/libgo/go/internal/x/net/dns/dnsmessage/message.go
deleted file mode 100644 (file)
index d8d3b03..0000000
+++ /dev/null
@@ -1,2103 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package dnsmessage provides a mostly RFC 1035 compliant implementation of
-// DNS message packing and unpacking.
-//
-// This implementation is designed to minimize heap allocations and avoid
-// unnecessary packing and unpacking as much as possible.
-package dnsmessage
-
-import (
-       "errors"
-)
-
-// Message formats
-
-// A Type is a type of DNS request and response.
-type Type uint16
-
-// A Class is a type of network.
-type Class uint16
-
-// An OpCode is a DNS operation code.
-type OpCode uint16
-
-// An RCode is a DNS response status code.
-type RCode uint16
-
-// Wire constants.
-const (
-       // ResourceHeader.Type and Question.Type
-       TypeA     Type = 1
-       TypeNS    Type = 2
-       TypeCNAME Type = 5
-       TypeSOA   Type = 6
-       TypePTR   Type = 12
-       TypeMX    Type = 15
-       TypeTXT   Type = 16
-       TypeAAAA  Type = 28
-       TypeSRV   Type = 33
-
-       // Question.Type
-       TypeWKS   Type = 11
-       TypeHINFO Type = 13
-       TypeMINFO Type = 14
-       TypeAXFR  Type = 252
-       TypeALL   Type = 255
-
-       // ResourceHeader.Class and Question.Class
-       ClassINET   Class = 1
-       ClassCSNET  Class = 2
-       ClassCHAOS  Class = 3
-       ClassHESIOD Class = 4
-
-       // Question.Class
-       ClassANY Class = 255
-
-       // Message.Rcode
-       RCodeSuccess        RCode = 0
-       RCodeFormatError    RCode = 1
-       RCodeServerFailure  RCode = 2
-       RCodeNameError      RCode = 3
-       RCodeNotImplemented RCode = 4
-       RCodeRefused        RCode = 5
-)
-
-var (
-       // ErrNotStarted indicates that the prerequisite information isn't
-       // available yet because the previous records haven't been appropriately
-       // parsed, skipped or finished.
-       ErrNotStarted = errors.New("parsing/packing of this type isn't available yet")
-
-       // ErrSectionDone indicated that all records in the section have been
-       // parsed or finished.
-       ErrSectionDone = errors.New("parsing/packing of this section has completed")
-
-       errBaseLen            = errors.New("insufficient data for base length type")
-       errCalcLen            = errors.New("insufficient data for calculated length type")
-       errReserved           = errors.New("segment prefix is reserved")
-       errTooManyPtr         = errors.New("too many pointers (>10)")
-       errInvalidPtr         = errors.New("invalid pointer")
-       errNilResouceBody     = errors.New("nil resource body")
-       errResourceLen        = errors.New("insufficient data for resource body length")
-       errSegTooLong         = errors.New("segment length too long")
-       errZeroSegLen         = errors.New("zero length segment")
-       errResTooLong         = errors.New("resource length too long")
-       errTooManyQuestions   = errors.New("too many Questions to pack (>65535)")
-       errTooManyAnswers     = errors.New("too many Answers to pack (>65535)")
-       errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)")
-       errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)")
-       errNonCanonicalName   = errors.New("name is not in canonical format (it must end with a .)")
-       errStringTooLong      = errors.New("character string exceeds maximum length (255)")
-       errCompressedSRV      = errors.New("compressed name in SRV resource data")
-)
-
-// Internal constants.
-const (
-       // packStartingCap is the default initial buffer size allocated during
-       // packing.
-       //
-       // The starting capacity doesn't matter too much, but most DNS responses
-       // Will be <= 512 bytes as it is the limit for DNS over UDP.
-       packStartingCap = 512
-
-       // uint16Len is the length (in bytes) of a uint16.
-       uint16Len = 2
-
-       // uint32Len is the length (in bytes) of a uint32.
-       uint32Len = 4
-
-       // headerLen is the length (in bytes) of a DNS header.
-       //
-       // A header is comprised of 6 uint16s and no padding.
-       headerLen = 6 * uint16Len
-)
-
-type nestedError struct {
-       // s is the current level's error message.
-       s string
-
-       // err is the nested error.
-       err error
-}
-
-// nestedError implements error.Error.
-func (e *nestedError) Error() string {
-       return e.s + ": " + e.err.Error()
-}
-
-// Header is a representation of a DNS message header.
-type Header struct {
-       ID                 uint16
-       Response           bool
-       OpCode             OpCode
-       Authoritative      bool
-       Truncated          bool
-       RecursionDesired   bool
-       RecursionAvailable bool
-       RCode              RCode
-}
-
-func (m *Header) pack() (id uint16, bits uint16) {
-       id = m.ID
-       bits = uint16(m.OpCode)<<11 | uint16(m.RCode)
-       if m.RecursionAvailable {
-               bits |= headerBitRA
-       }
-       if m.RecursionDesired {
-               bits |= headerBitRD
-       }
-       if m.Truncated {
-               bits |= headerBitTC
-       }
-       if m.Authoritative {
-               bits |= headerBitAA
-       }
-       if m.Response {
-               bits |= headerBitQR
-       }
-       return
-}
-
-// Message is a representation of a DNS message.
-type Message struct {
-       Header
-       Questions   []Question
-       Answers     []Resource
-       Authorities []Resource
-       Additionals []Resource
-}
-
-type section uint8
-
-const (
-       sectionNotStarted section = iota
-       sectionHeader
-       sectionQuestions
-       sectionAnswers
-       sectionAuthorities
-       sectionAdditionals
-       sectionDone
-
-       headerBitQR = 1 << 15 // query/response (response=1)
-       headerBitAA = 1 << 10 // authoritative
-       headerBitTC = 1 << 9  // truncated
-       headerBitRD = 1 << 8  // recursion desired
-       headerBitRA = 1 << 7  // recursion available
-)
-
-var sectionNames = map[section]string{
-       sectionHeader:      "header",
-       sectionQuestions:   "Question",
-       sectionAnswers:     "Answer",
-       sectionAuthorities: "Authority",
-       sectionAdditionals: "Additional",
-}
-
-// header is the wire format for a DNS message header.
-type header struct {
-       id          uint16
-       bits        uint16
-       questions   uint16
-       answers     uint16
-       authorities uint16
-       additionals uint16
-}
-
-func (h *header) count(sec section) uint16 {
-       switch sec {
-       case sectionQuestions:
-               return h.questions
-       case sectionAnswers:
-               return h.answers
-       case sectionAuthorities:
-               return h.authorities
-       case sectionAdditionals:
-               return h.additionals
-       }
-       return 0
-}
-
-// pack appends the wire format of the header to msg.
-func (h *header) pack(msg []byte) []byte {
-       msg = packUint16(msg, h.id)
-       msg = packUint16(msg, h.bits)
-       msg = packUint16(msg, h.questions)
-       msg = packUint16(msg, h.answers)
-       msg = packUint16(msg, h.authorities)
-       return packUint16(msg, h.additionals)
-}
-
-func (h *header) unpack(msg []byte, off int) (int, error) {
-       newOff := off
-       var err error
-       if h.id, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"id", err}
-       }
-       if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"bits", err}
-       }
-       if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"questions", err}
-       }
-       if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"answers", err}
-       }
-       if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"authorities", err}
-       }
-       if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"additionals", err}
-       }
-       return newOff, nil
-}
-
-func (h *header) header() Header {
-       return Header{
-               ID:                 h.id,
-               Response:           (h.bits & headerBitQR) != 0,
-               OpCode:             OpCode(h.bits>>11) & 0xF,
-               Authoritative:      (h.bits & headerBitAA) != 0,
-               Truncated:          (h.bits & headerBitTC) != 0,
-               RecursionDesired:   (h.bits & headerBitRD) != 0,
-               RecursionAvailable: (h.bits & headerBitRA) != 0,
-               RCode:              RCode(h.bits & 0xF),
-       }
-}
-
-// A Resource is a DNS resource record.
-type Resource struct {
-       Header ResourceHeader
-       Body   ResourceBody
-}
-
-// A ResourceBody is a DNS resource record minus the header.
-type ResourceBody interface {
-       // pack packs a Resource except for its header.
-       pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error)
-
-       // realType returns the actual type of the Resource. This is used to
-       // fill in the header Type field.
-       realType() Type
-}
-
-// pack appends the wire format of the Resource to msg.
-func (r *Resource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       if r.Body == nil {
-               return msg, errNilResouceBody
-       }
-       oldMsg := msg
-       r.Header.Type = r.Body.realType()
-       msg, length, err := r.Header.pack(msg, compression, compressionOff)
-       if err != nil {
-               return msg, &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       msg, err = r.Body.pack(msg, compression, compressionOff)
-       if err != nil {
-               return msg, &nestedError{"content", err}
-       }
-       if err := r.Header.fixLen(msg, length, preLen); err != nil {
-               return oldMsg, err
-       }
-       return msg, nil
-}
-
-// A Parser allows incrementally parsing a DNS message.
-//
-// When parsing is started, the Header is parsed. Next, each Question can be
-// either parsed or skipped. Alternatively, all Questions can be skipped at
-// once. When all Questions have been parsed, attempting to parse Questions
-// will return (nil, nil) and attempting to skip Questions will return
-// (true, nil). After all Questions have been either parsed or skipped, all
-// Answers, Authorities and Additionals can be either parsed or skipped in the
-// same way, and each type of Resource must be fully parsed or skipped before
-// proceeding to the next type of Resource.
-//
-// Note that there is no requirement to fully skip or parse the message.
-type Parser struct {
-       msg    []byte
-       header header
-
-       section        section
-       off            int
-       index          int
-       resHeaderValid bool
-       resHeader      ResourceHeader
-}
-
-// Start parses the header and enables the parsing of Questions.
-func (p *Parser) Start(msg []byte) (Header, error) {
-       if p.msg != nil {
-               *p = Parser{}
-       }
-       p.msg = msg
-       var err error
-       if p.off, err = p.header.unpack(msg, 0); err != nil {
-               return Header{}, &nestedError{"unpacking header", err}
-       }
-       p.section = sectionQuestions
-       return p.header.header(), nil
-}
-
-func (p *Parser) checkAdvance(sec section) error {
-       if p.section < sec {
-               return ErrNotStarted
-       }
-       if p.section > sec {
-               return ErrSectionDone
-       }
-       p.resHeaderValid = false
-       if p.index == int(p.header.count(sec)) {
-               p.index = 0
-               p.section++
-               return ErrSectionDone
-       }
-       return nil
-}
-
-func (p *Parser) resource(sec section) (Resource, error) {
-       var r Resource
-       var err error
-       r.Header, err = p.resourceHeader(sec)
-       if err != nil {
-               return r, err
-       }
-       p.resHeaderValid = false
-       r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header)
-       if err != nil {
-               return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err}
-       }
-       p.index++
-       return r, nil
-}
-
-func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) {
-       if p.resHeaderValid {
-               return p.resHeader, nil
-       }
-       if err := p.checkAdvance(sec); err != nil {
-               return ResourceHeader{}, err
-       }
-       var hdr ResourceHeader
-       off, err := hdr.unpack(p.msg, p.off)
-       if err != nil {
-               return ResourceHeader{}, err
-       }
-       p.resHeaderValid = true
-       p.resHeader = hdr
-       p.off = off
-       return hdr, nil
-}
-
-func (p *Parser) skipResource(sec section) error {
-       if p.resHeaderValid {
-               newOff := p.off + int(p.resHeader.Length)
-               if newOff > len(p.msg) {
-                       return errResourceLen
-               }
-               p.off = newOff
-               p.resHeaderValid = false
-               p.index++
-               return nil
-       }
-       if err := p.checkAdvance(sec); err != nil {
-               return err
-       }
-       var err error
-       p.off, err = skipResource(p.msg, p.off)
-       if err != nil {
-               return &nestedError{"skipping: " + sectionNames[sec], err}
-       }
-       p.index++
-       return nil
-}
-
-// Question parses a single Question.
-func (p *Parser) Question() (Question, error) {
-       if err := p.checkAdvance(sectionQuestions); err != nil {
-               return Question{}, err
-       }
-       var name Name
-       off, err := name.unpack(p.msg, p.off)
-       if err != nil {
-               return Question{}, &nestedError{"unpacking Question.Name", err}
-       }
-       typ, off, err := unpackType(p.msg, off)
-       if err != nil {
-               return Question{}, &nestedError{"unpacking Question.Type", err}
-       }
-       class, off, err := unpackClass(p.msg, off)
-       if err != nil {
-               return Question{}, &nestedError{"unpacking Question.Class", err}
-       }
-       p.off = off
-       p.index++
-       return Question{name, typ, class}, nil
-}
-
-// AllQuestions parses all Questions.
-func (p *Parser) AllQuestions() ([]Question, error) {
-       // Multiple questions are valid according to the spec,
-       // but servers don't actually support them. There will
-       // be at most one question here.
-       //
-       // Do not pre-allocate based on info in p.header, since
-       // the data is untrusted.
-       qs := []Question{}
-       for {
-               q, err := p.Question()
-               if err == ErrSectionDone {
-                       return qs, nil
-               }
-               if err != nil {
-                       return nil, err
-               }
-               qs = append(qs, q)
-       }
-}
-
-// SkipQuestion skips a single Question.
-func (p *Parser) SkipQuestion() error {
-       if err := p.checkAdvance(sectionQuestions); err != nil {
-               return err
-       }
-       off, err := skipName(p.msg, p.off)
-       if err != nil {
-               return &nestedError{"skipping Question Name", err}
-       }
-       if off, err = skipType(p.msg, off); err != nil {
-               return &nestedError{"skipping Question Type", err}
-       }
-       if off, err = skipClass(p.msg, off); err != nil {
-               return &nestedError{"skipping Question Class", err}
-       }
-       p.off = off
-       p.index++
-       return nil
-}
-
-// SkipAllQuestions skips all Questions.
-func (p *Parser) SkipAllQuestions() error {
-       for {
-               if err := p.SkipQuestion(); err == ErrSectionDone {
-                       return nil
-               } else if err != nil {
-                       return err
-               }
-       }
-}
-
-// AnswerHeader parses a single Answer ResourceHeader.
-func (p *Parser) AnswerHeader() (ResourceHeader, error) {
-       return p.resourceHeader(sectionAnswers)
-}
-
-// Answer parses a single Answer Resource.
-func (p *Parser) Answer() (Resource, error) {
-       return p.resource(sectionAnswers)
-}
-
-// AllAnswers parses all Answer Resources.
-func (p *Parser) AllAnswers() ([]Resource, error) {
-       // The most common query is for A/AAAA, which usually returns
-       // a handful of IPs.
-       //
-       // Pre-allocate up to a certain limit, since p.header is
-       // untrusted data.
-       n := int(p.header.answers)
-       if n > 20 {
-               n = 20
-       }
-       as := make([]Resource, 0, n)
-       for {
-               a, err := p.Answer()
-               if err == ErrSectionDone {
-                       return as, nil
-               }
-               if err != nil {
-                       return nil, err
-               }
-               as = append(as, a)
-       }
-}
-
-// SkipAnswer skips a single Answer Resource.
-func (p *Parser) SkipAnswer() error {
-       return p.skipResource(sectionAnswers)
-}
-
-// SkipAllAnswers skips all Answer Resources.
-func (p *Parser) SkipAllAnswers() error {
-       for {
-               if err := p.SkipAnswer(); err == ErrSectionDone {
-                       return nil
-               } else if err != nil {
-                       return err
-               }
-       }
-}
-
-// AuthorityHeader parses a single Authority ResourceHeader.
-func (p *Parser) AuthorityHeader() (ResourceHeader, error) {
-       return p.resourceHeader(sectionAuthorities)
-}
-
-// Authority parses a single Authority Resource.
-func (p *Parser) Authority() (Resource, error) {
-       return p.resource(sectionAuthorities)
-}
-
-// AllAuthorities parses all Authority Resources.
-func (p *Parser) AllAuthorities() ([]Resource, error) {
-       // Authorities contains SOA in case of NXDOMAIN and friends,
-       // otherwise it is empty.
-       //
-       // Pre-allocate up to a certain limit, since p.header is
-       // untrusted data.
-       n := int(p.header.authorities)
-       if n > 10 {
-               n = 10
-       }
-       as := make([]Resource, 0, n)
-       for {
-               a, err := p.Authority()
-               if err == ErrSectionDone {
-                       return as, nil
-               }
-               if err != nil {
-                       return nil, err
-               }
-               as = append(as, a)
-       }
-}
-
-// SkipAuthority skips a single Authority Resource.
-func (p *Parser) SkipAuthority() error {
-       return p.skipResource(sectionAuthorities)
-}
-
-// SkipAllAuthorities skips all Authority Resources.
-func (p *Parser) SkipAllAuthorities() error {
-       for {
-               if err := p.SkipAuthority(); err == ErrSectionDone {
-                       return nil
-               } else if err != nil {
-                       return err
-               }
-       }
-}
-
-// AdditionalHeader parses a single Additional ResourceHeader.
-func (p *Parser) AdditionalHeader() (ResourceHeader, error) {
-       return p.resourceHeader(sectionAdditionals)
-}
-
-// Additional parses a single Additional Resource.
-func (p *Parser) Additional() (Resource, error) {
-       return p.resource(sectionAdditionals)
-}
-
-// AllAdditionals parses all Additional Resources.
-func (p *Parser) AllAdditionals() ([]Resource, error) {
-       // Additionals usually contain OPT, and sometimes A/AAAA
-       // glue records.
-       //
-       // Pre-allocate up to a certain limit, since p.header is
-       // untrusted data.
-       n := int(p.header.additionals)
-       if n > 10 {
-               n = 10
-       }
-       as := make([]Resource, 0, n)
-       for {
-               a, err := p.Additional()
-               if err == ErrSectionDone {
-                       return as, nil
-               }
-               if err != nil {
-                       return nil, err
-               }
-               as = append(as, a)
-       }
-}
-
-// SkipAdditional skips a single Additional Resource.
-func (p *Parser) SkipAdditional() error {
-       return p.skipResource(sectionAdditionals)
-}
-
-// SkipAllAdditionals skips all Additional Resources.
-func (p *Parser) SkipAllAdditionals() error {
-       for {
-               if err := p.SkipAdditional(); err == ErrSectionDone {
-                       return nil
-               } else if err != nil {
-                       return err
-               }
-       }
-}
-
-// CNAMEResource parses a single CNAMEResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) CNAMEResource() (CNAMEResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeCNAME {
-               return CNAMEResource{}, ErrNotStarted
-       }
-       r, err := unpackCNAMEResource(p.msg, p.off)
-       if err != nil {
-               return CNAMEResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// MXResource parses a single MXResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) MXResource() (MXResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeMX {
-               return MXResource{}, ErrNotStarted
-       }
-       r, err := unpackMXResource(p.msg, p.off)
-       if err != nil {
-               return MXResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// NSResource parses a single NSResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) NSResource() (NSResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeNS {
-               return NSResource{}, ErrNotStarted
-       }
-       r, err := unpackNSResource(p.msg, p.off)
-       if err != nil {
-               return NSResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// PTRResource parses a single PTRResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) PTRResource() (PTRResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypePTR {
-               return PTRResource{}, ErrNotStarted
-       }
-       r, err := unpackPTRResource(p.msg, p.off)
-       if err != nil {
-               return PTRResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// SOAResource parses a single SOAResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) SOAResource() (SOAResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeSOA {
-               return SOAResource{}, ErrNotStarted
-       }
-       r, err := unpackSOAResource(p.msg, p.off)
-       if err != nil {
-               return SOAResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// TXTResource parses a single TXTResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) TXTResource() (TXTResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeTXT {
-               return TXTResource{}, ErrNotStarted
-       }
-       r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length)
-       if err != nil {
-               return TXTResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// SRVResource parses a single SRVResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) SRVResource() (SRVResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeSRV {
-               return SRVResource{}, ErrNotStarted
-       }
-       r, err := unpackSRVResource(p.msg, p.off)
-       if err != nil {
-               return SRVResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// AResource parses a single AResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) AResource() (AResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeA {
-               return AResource{}, ErrNotStarted
-       }
-       r, err := unpackAResource(p.msg, p.off)
-       if err != nil {
-               return AResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// AAAAResource parses a single AAAAResource.
-//
-// One of the XXXHeader methods must have been called before calling this
-// method.
-func (p *Parser) AAAAResource() (AAAAResource, error) {
-       if !p.resHeaderValid || p.resHeader.Type != TypeAAAA {
-               return AAAAResource{}, ErrNotStarted
-       }
-       r, err := unpackAAAAResource(p.msg, p.off)
-       if err != nil {
-               return AAAAResource{}, err
-       }
-       p.off += int(p.resHeader.Length)
-       p.resHeaderValid = false
-       p.index++
-       return r, nil
-}
-
-// Unpack parses a full Message.
-func (m *Message) Unpack(msg []byte) error {
-       var p Parser
-       var err error
-       if m.Header, err = p.Start(msg); err != nil {
-               return err
-       }
-       if m.Questions, err = p.AllQuestions(); err != nil {
-               return err
-       }
-       if m.Answers, err = p.AllAnswers(); err != nil {
-               return err
-       }
-       if m.Authorities, err = p.AllAuthorities(); err != nil {
-               return err
-       }
-       if m.Additionals, err = p.AllAdditionals(); err != nil {
-               return err
-       }
-       return nil
-}
-
-// Pack packs a full Message.
-func (m *Message) Pack() ([]byte, error) {
-       return m.AppendPack(make([]byte, 0, packStartingCap))
-}
-
-// AppendPack is like Pack but appends the full Message to b and returns the
-// extended buffer.
-func (m *Message) AppendPack(b []byte) ([]byte, error) {
-       // Validate the lengths. It is very unlikely that anyone will try to
-       // pack more than 65535 of any particular type, but it is possible and
-       // we should fail gracefully.
-       if len(m.Questions) > int(^uint16(0)) {
-               return nil, errTooManyQuestions
-       }
-       if len(m.Answers) > int(^uint16(0)) {
-               return nil, errTooManyAnswers
-       }
-       if len(m.Authorities) > int(^uint16(0)) {
-               return nil, errTooManyAuthorities
-       }
-       if len(m.Additionals) > int(^uint16(0)) {
-               return nil, errTooManyAdditionals
-       }
-
-       var h header
-       h.id, h.bits = m.Header.pack()
-
-       h.questions = uint16(len(m.Questions))
-       h.answers = uint16(len(m.Answers))
-       h.authorities = uint16(len(m.Authorities))
-       h.additionals = uint16(len(m.Additionals))
-
-       compressionOff := len(b)
-       msg := h.pack(b)
-
-       // RFC 1035 allows (but does not require) compression for packing. RFC
-       // 1035 requires unpacking implementations to support compression, so
-       // unconditionally enabling it is fine.
-       //
-       // DNS lookups are typically done over UDP, and RFC 1035 states that UDP
-       // DNS messages can be a maximum of 512 bytes long. Without compression,
-       // many DNS response messages are over this limit, so enabling
-       // compression will help ensure compliance.
-       compression := map[string]int{}
-
-       for i := range m.Questions {
-               var err error
-               if msg, err = m.Questions[i].pack(msg, compression, compressionOff); err != nil {
-                       return nil, &nestedError{"packing Question", err}
-               }
-       }
-       for i := range m.Answers {
-               var err error
-               if msg, err = m.Answers[i].pack(msg, compression, compressionOff); err != nil {
-                       return nil, &nestedError{"packing Answer", err}
-               }
-       }
-       for i := range m.Authorities {
-               var err error
-               if msg, err = m.Authorities[i].pack(msg, compression, compressionOff); err != nil {
-                       return nil, &nestedError{"packing Authority", err}
-               }
-       }
-       for i := range m.Additionals {
-               var err error
-               if msg, err = m.Additionals[i].pack(msg, compression, compressionOff); err != nil {
-                       return nil, &nestedError{"packing Additional", err}
-               }
-       }
-
-       return msg, nil
-}
-
-// A Builder allows incrementally packing a DNS message.
-//
-// Example usage:
-//     buf := make([]byte, 2, 514)
-//     b := NewBuilder(buf, Header{...})
-//     b.EnableCompression()
-//     // Optionally start a section and add things to that section.
-//     // Repeat adding sections as necessary.
-//     buf, err := b.Finish()
-//     // If err is nil, buf[2:] will contain the built bytes.
-type Builder struct {
-       // msg is the storage for the message being built.
-       msg []byte
-
-       // section keeps track of the current section being built.
-       section section
-
-       // header keeps track of what should go in the header when Finish is
-       // called.
-       header header
-
-       // start is the starting index of the bytes allocated in msg for header.
-       start int
-
-       // compression is a mapping from name suffixes to their starting index
-       // in msg.
-       compression map[string]int
-}
-
-// NewBuilder creates a new builder with compression disabled.
-//
-// Note: Most users will want to immediately enable compression with the
-// EnableCompression method. See that method's comment for why you may or may
-// not want to enable compression.
-//
-// The DNS message is appended to the provided initial buffer buf (which may be
-// nil) as it is built. The final message is returned by the (*Builder).Finish
-// method, which may return the same underlying array if there was sufficient
-// capacity in the slice.
-func NewBuilder(buf []byte, h Header) Builder {
-       if buf == nil {
-               buf = make([]byte, 0, packStartingCap)
-       }
-       b := Builder{msg: buf, start: len(buf)}
-       b.header.id, b.header.bits = h.pack()
-       var hb [headerLen]byte
-       b.msg = append(b.msg, hb[:]...)
-       b.section = sectionHeader
-       return b
-}
-
-// EnableCompression enables compression in the Builder.
-//
-// Leaving compression disabled avoids compression related allocations, but can
-// result in larger message sizes. Be careful with this mode as it can cause
-// messages to exceed the UDP size limit.
-//
-// According to RFC 1035, section 4.1.4, the use of compression is optional, but
-// all implementations must accept both compressed and uncompressed DNS
-// messages.
-//
-// Compression should be enabled before any sections are added for best results.
-func (b *Builder) EnableCompression() {
-       b.compression = map[string]int{}
-}
-
-func (b *Builder) startCheck(s section) error {
-       if b.section <= sectionNotStarted {
-               return ErrNotStarted
-       }
-       if b.section > s {
-               return ErrSectionDone
-       }
-       return nil
-}
-
-// StartQuestions prepares the builder for packing Questions.
-func (b *Builder) StartQuestions() error {
-       if err := b.startCheck(sectionQuestions); err != nil {
-               return err
-       }
-       b.section = sectionQuestions
-       return nil
-}
-
-// StartAnswers prepares the builder for packing Answers.
-func (b *Builder) StartAnswers() error {
-       if err := b.startCheck(sectionAnswers); err != nil {
-               return err
-       }
-       b.section = sectionAnswers
-       return nil
-}
-
-// StartAuthorities prepares the builder for packing Authorities.
-func (b *Builder) StartAuthorities() error {
-       if err := b.startCheck(sectionAuthorities); err != nil {
-               return err
-       }
-       b.section = sectionAuthorities
-       return nil
-}
-
-// StartAdditionals prepares the builder for packing Additionals.
-func (b *Builder) StartAdditionals() error {
-       if err := b.startCheck(sectionAdditionals); err != nil {
-               return err
-       }
-       b.section = sectionAdditionals
-       return nil
-}
-
-func (b *Builder) incrementSectionCount() error {
-       var count *uint16
-       var err error
-       switch b.section {
-       case sectionQuestions:
-               count = &b.header.questions
-               err = errTooManyQuestions
-       case sectionAnswers:
-               count = &b.header.answers
-               err = errTooManyAnswers
-       case sectionAuthorities:
-               count = &b.header.authorities
-               err = errTooManyAuthorities
-       case sectionAdditionals:
-               count = &b.header.additionals
-               err = errTooManyAdditionals
-       }
-       if *count == ^uint16(0) {
-               return err
-       }
-       *count++
-       return nil
-}
-
-// Question adds a single Question.
-func (b *Builder) Question(q Question) error {
-       if b.section < sectionQuestions {
-               return ErrNotStarted
-       }
-       if b.section > sectionQuestions {
-               return ErrSectionDone
-       }
-       msg, err := q.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-func (b *Builder) checkResourceSection() error {
-       if b.section < sectionAnswers {
-               return ErrNotStarted
-       }
-       if b.section > sectionAdditionals {
-               return ErrSectionDone
-       }
-       return nil
-}
-
-// CNAMEResource adds a single CNAMEResource.
-func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"CNAMEResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// MXResource adds a single MXResource.
-func (b *Builder) MXResource(h ResourceHeader, r MXResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"MXResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// NSResource adds a single NSResource.
-func (b *Builder) NSResource(h ResourceHeader, r NSResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"NSResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// PTRResource adds a single PTRResource.
-func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"PTRResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// SOAResource adds a single SOAResource.
-func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"SOAResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// TXTResource adds a single TXTResource.
-func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"TXTResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// SRVResource adds a single SRVResource.
-func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"SRVResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// AResource adds a single AResource.
-func (b *Builder) AResource(h ResourceHeader, r AResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"AResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// AAAAResource adds a single AAAAResource.
-func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error {
-       if err := b.checkResourceSection(); err != nil {
-               return err
-       }
-       h.Type = r.realType()
-       msg, length, err := h.pack(b.msg, b.compression, b.start)
-       if err != nil {
-               return &nestedError{"ResourceHeader", err}
-       }
-       preLen := len(msg)
-       if msg, err = r.pack(msg, b.compression, b.start); err != nil {
-               return &nestedError{"AAAAResource body", err}
-       }
-       if err := h.fixLen(msg, length, preLen); err != nil {
-               return err
-       }
-       if err := b.incrementSectionCount(); err != nil {
-               return err
-       }
-       b.msg = msg
-       return nil
-}
-
-// Finish ends message building and generates a binary message.
-func (b *Builder) Finish() ([]byte, error) {
-       if b.section < sectionHeader {
-               return nil, ErrNotStarted
-       }
-       b.section = sectionDone
-       // Space for the header was allocated in NewBuilder.
-       b.header.pack(b.msg[b.start:b.start])
-       return b.msg, nil
-}
-
-// A ResourceHeader is the header of a DNS resource record. There are
-// many types of DNS resource records, but they all share the same header.
-type ResourceHeader struct {
-       // Name is the domain name for which this resource record pertains.
-       Name Name
-
-       // Type is the type of DNS resource record.
-       //
-       // This field will be set automatically during packing.
-       Type Type
-
-       // Class is the class of network to which this DNS resource record
-       // pertains.
-       Class Class
-
-       // TTL is the length of time (measured in seconds) which this resource
-       // record is valid for (time to live). All Resources in a set should
-       // have the same TTL (RFC 2181 Section 5.2).
-       TTL uint32
-
-       // Length is the length of data in the resource record after the header.
-       //
-       // This field will be set automatically during packing.
-       Length uint16
-}
-
-// pack appends the wire format of the ResourceHeader to oldMsg.
-//
-// The bytes where length was packed are returned as a slice so they can be
-// updated after the rest of the Resource has been packed.
-func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int, compressionOff int) (msg []byte, length []byte, err error) {
-       msg = oldMsg
-       if msg, err = h.Name.pack(msg, compression, compressionOff); err != nil {
-               return oldMsg, nil, &nestedError{"Name", err}
-       }
-       msg = packType(msg, h.Type)
-       msg = packClass(msg, h.Class)
-       msg = packUint32(msg, h.TTL)
-       lenBegin := len(msg)
-       msg = packUint16(msg, h.Length)
-       return msg, msg[lenBegin : lenBegin+uint16Len], nil
-}
-
-func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) {
-       newOff := off
-       var err error
-       if newOff, err = h.Name.unpack(msg, newOff); err != nil {
-               return off, &nestedError{"Name", err}
-       }
-       if h.Type, newOff, err = unpackType(msg, newOff); err != nil {
-               return off, &nestedError{"Type", err}
-       }
-       if h.Class, newOff, err = unpackClass(msg, newOff); err != nil {
-               return off, &nestedError{"Class", err}
-       }
-       if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil {
-               return off, &nestedError{"TTL", err}
-       }
-       if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil {
-               return off, &nestedError{"Length", err}
-       }
-       return newOff, nil
-}
-
-func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error {
-       conLen := len(msg) - preLen
-       if conLen > int(^uint16(0)) {
-               return errResTooLong
-       }
-
-       // Fill in the length now that we know how long the content is.
-       packUint16(length[:0], uint16(conLen))
-       h.Length = uint16(conLen)
-
-       return nil
-}
-
-func skipResource(msg []byte, off int) (int, error) {
-       newOff, err := skipName(msg, off)
-       if err != nil {
-               return off, &nestedError{"Name", err}
-       }
-       if newOff, err = skipType(msg, newOff); err != nil {
-               return off, &nestedError{"Type", err}
-       }
-       if newOff, err = skipClass(msg, newOff); err != nil {
-               return off, &nestedError{"Class", err}
-       }
-       if newOff, err = skipUint32(msg, newOff); err != nil {
-               return off, &nestedError{"TTL", err}
-       }
-       length, newOff, err := unpackUint16(msg, newOff)
-       if err != nil {
-               return off, &nestedError{"Length", err}
-       }
-       if newOff += int(length); newOff > len(msg) {
-               return off, errResourceLen
-       }
-       return newOff, nil
-}
-
-// packUint16 appends the wire format of field to msg.
-func packUint16(msg []byte, field uint16) []byte {
-       return append(msg, byte(field>>8), byte(field))
-}
-
-func unpackUint16(msg []byte, off int) (uint16, int, error) {
-       if off+uint16Len > len(msg) {
-               return 0, off, errBaseLen
-       }
-       return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil
-}
-
-func skipUint16(msg []byte, off int) (int, error) {
-       if off+uint16Len > len(msg) {
-               return off, errBaseLen
-       }
-       return off + uint16Len, nil
-}
-
-// packType appends the wire format of field to msg.
-func packType(msg []byte, field Type) []byte {
-       return packUint16(msg, uint16(field))
-}
-
-func unpackType(msg []byte, off int) (Type, int, error) {
-       t, o, err := unpackUint16(msg, off)
-       return Type(t), o, err
-}
-
-func skipType(msg []byte, off int) (int, error) {
-       return skipUint16(msg, off)
-}
-
-// packClass appends the wire format of field to msg.
-func packClass(msg []byte, field Class) []byte {
-       return packUint16(msg, uint16(field))
-}
-
-func unpackClass(msg []byte, off int) (Class, int, error) {
-       c, o, err := unpackUint16(msg, off)
-       return Class(c), o, err
-}
-
-func skipClass(msg []byte, off int) (int, error) {
-       return skipUint16(msg, off)
-}
-
-// packUint32 appends the wire format of field to msg.
-func packUint32(msg []byte, field uint32) []byte {
-       return append(
-               msg,
-               byte(field>>24),
-               byte(field>>16),
-               byte(field>>8),
-               byte(field),
-       )
-}
-
-func unpackUint32(msg []byte, off int) (uint32, int, error) {
-       if off+uint32Len > len(msg) {
-               return 0, off, errBaseLen
-       }
-       v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3])
-       return v, off + uint32Len, nil
-}
-
-func skipUint32(msg []byte, off int) (int, error) {
-       if off+uint32Len > len(msg) {
-               return off, errBaseLen
-       }
-       return off + uint32Len, nil
-}
-
-// packText appends the wire format of field to msg.
-func packText(msg []byte, field string) ([]byte, error) {
-       l := len(field)
-       if l > 255 {
-               return nil, errStringTooLong
-       }
-       msg = append(msg, byte(l))
-       msg = append(msg, field...)
-
-       return msg, nil
-}
-
-func unpackText(msg []byte, off int) (string, int, error) {
-       if off >= len(msg) {
-               return "", off, errBaseLen
-       }
-       beginOff := off + 1
-       endOff := beginOff + int(msg[off])
-       if endOff > len(msg) {
-               return "", off, errCalcLen
-       }
-       return string(msg[beginOff:endOff]), endOff, nil
-}
-
-func skipText(msg []byte, off int) (int, error) {
-       if off >= len(msg) {
-               return off, errBaseLen
-       }
-       endOff := off + 1 + int(msg[off])
-       if endOff > len(msg) {
-               return off, errCalcLen
-       }
-       return endOff, nil
-}
-
-// packBytes appends the wire format of field to msg.
-func packBytes(msg []byte, field []byte) []byte {
-       return append(msg, field...)
-}
-
-func unpackBytes(msg []byte, off int, field []byte) (int, error) {
-       newOff := off + len(field)
-       if newOff > len(msg) {
-               return off, errBaseLen
-       }
-       copy(field, msg[off:newOff])
-       return newOff, nil
-}
-
-func skipBytes(msg []byte, off int, field []byte) (int, error) {
-       newOff := off + len(field)
-       if newOff > len(msg) {
-               return off, errBaseLen
-       }
-       return newOff, nil
-}
-
-const nameLen = 255
-
-// A Name is a non-encoded domain name. It is used instead of strings to avoid
-// allocations.
-type Name struct {
-       Data   [nameLen]byte
-       Length uint8
-}
-
-// NewName creates a new Name from a string.
-func NewName(name string) (Name, error) {
-       if len([]byte(name)) > nameLen {
-               return Name{}, errCalcLen
-       }
-       n := Name{Length: uint8(len(name))}
-       copy(n.Data[:], []byte(name))
-       return n, nil
-}
-
-func (n Name) String() string {
-       return string(n.Data[:n.Length])
-}
-
-// pack appends the wire format of the Name to msg.
-//
-// Domain names are a sequence of counted strings split at the dots. They end
-// with a zero-length string. Compression can be used to reuse domain suffixes.
-//
-// The compression map will be updated with new domain suffixes. If compression
-// is nil, compression will not be used.
-func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       oldMsg := msg
-
-       // Add a trailing dot to canonicalize name.
-       if n.Length == 0 || n.Data[n.Length-1] != '.' {
-               return oldMsg, errNonCanonicalName
-       }
-
-       // Allow root domain.
-       if n.Data[0] == '.' && n.Length == 1 {
-               return append(msg, 0), nil
-       }
-
-       // Emit sequence of counted strings, chopping at dots.
-       for i, begin := 0, 0; i < int(n.Length); i++ {
-               // Check for the end of the segment.
-               if n.Data[i] == '.' {
-                       // The two most significant bits have special meaning.
-                       // It isn't allowed for segments to be long enough to
-                       // need them.
-                       if i-begin >= 1<<6 {
-                               return oldMsg, errSegTooLong
-                       }
-
-                       // Segments must have a non-zero length.
-                       if i-begin == 0 {
-                               return oldMsg, errZeroSegLen
-                       }
-
-                       msg = append(msg, byte(i-begin))
-
-                       for j := begin; j < i; j++ {
-                               msg = append(msg, n.Data[j])
-                       }
-
-                       begin = i + 1
-                       continue
-               }
-
-               // We can only compress domain suffixes starting with a new
-               // segment. A pointer is two bytes with the two most significant
-               // bits set to 1 to indicate that it is a pointer.
-               if (i == 0 || n.Data[i-1] == '.') && compression != nil {
-                       if ptr, ok := compression[string(n.Data[i:])]; ok {
-                               // Hit. Emit a pointer instead of the rest of
-                               // the domain.
-                               return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil
-                       }
-
-                       // Miss. Add the suffix to the compression table if the
-                       // offset can be stored in the available 14 bytes.
-                       if len(msg) <= int(^uint16(0)>>2) {
-                               compression[string(n.Data[i:])] = len(msg) - compressionOff
-                       }
-               }
-       }
-       return append(msg, 0), nil
-}
-
-// unpack unpacks a domain name.
-func (n *Name) unpack(msg []byte, off int) (int, error) {
-       return n.unpackCompressed(msg, off, true /* allowCompression */)
-}
-
-func (n *Name) unpackCompressed(msg []byte, off int, allowCompression bool) (int, error) {
-       // currOff is the current working offset.
-       currOff := off
-
-       // newOff is the offset where the next record will start. Pointers lead
-       // to data that belongs to other names and thus doesn't count towards to
-       // the usage of this name.
-       newOff := off
-
-       // ptr is the number of pointers followed.
-       var ptr int
-
-       // Name is a slice representation of the name data.
-       name := n.Data[:0]
-
-Loop:
-       for {
-               if currOff >= len(msg) {
-                       return off, errBaseLen
-               }
-               c := int(msg[currOff])
-               currOff++
-               switch c & 0xC0 {
-               case 0x00: // String segment
-                       if c == 0x00 {
-                               // A zero length signals the end of the name.
-                               break Loop
-                       }
-                       endOff := currOff + c
-                       if endOff > len(msg) {
-                               return off, errCalcLen
-                       }
-                       name = append(name, msg[currOff:endOff]...)
-                       name = append(name, '.')
-                       currOff = endOff
-               case 0xC0: // Pointer
-                       if !allowCompression {
-                               return off, errCompressedSRV
-                       }
-                       if currOff >= len(msg) {
-                               return off, errInvalidPtr
-                       }
-                       c1 := msg[currOff]
-                       currOff++
-                       if ptr == 0 {
-                               newOff = currOff
-                       }
-                       // Don't follow too many pointers, maybe there's a loop.
-                       if ptr++; ptr > 10 {
-                               return off, errTooManyPtr
-                       }
-                       currOff = (c^0xC0)<<8 | int(c1)
-               default:
-                       // Prefixes 0x80 and 0x40 are reserved.
-                       return off, errReserved
-               }
-       }
-       if len(name) == 0 {
-               name = append(name, '.')
-       }
-       if len(name) > len(n.Data) {
-               return off, errCalcLen
-       }
-       n.Length = uint8(len(name))
-       if ptr == 0 {
-               newOff = currOff
-       }
-       return newOff, nil
-}
-
-func skipName(msg []byte, off int) (int, error) {
-       // newOff is the offset where the next record will start. Pointers lead
-       // to data that belongs to other names and thus doesn't count towards to
-       // the usage of this name.
-       newOff := off
-
-Loop:
-       for {
-               if newOff >= len(msg) {
-                       return off, errBaseLen
-               }
-               c := int(msg[newOff])
-               newOff++
-               switch c & 0xC0 {
-               case 0x00:
-                       if c == 0x00 {
-                               // A zero length signals the end of the name.
-                               break Loop
-                       }
-                       // literal string
-                       newOff += c
-                       if newOff > len(msg) {
-                               return off, errCalcLen
-                       }
-               case 0xC0:
-                       // Pointer to somewhere else in msg.
-
-                       // Pointers are two bytes.
-                       newOff++
-
-                       // Don't follow the pointer as the data here has ended.
-                       break Loop
-               default:
-                       // Prefixes 0x80 and 0x40 are reserved.
-                       return off, errReserved
-               }
-       }
-
-       return newOff, nil
-}
-
-// A Question is a DNS query.
-type Question struct {
-       Name  Name
-       Type  Type
-       Class Class
-}
-
-// pack appends the wire format of the Question to msg.
-func (q *Question) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       msg, err := q.Name.pack(msg, compression, compressionOff)
-       if err != nil {
-               return msg, &nestedError{"Name", err}
-       }
-       msg = packType(msg, q.Type)
-       return packClass(msg, q.Class), nil
-}
-
-func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) {
-       var (
-               r    ResourceBody
-               err  error
-               name string
-       )
-       switch hdr.Type {
-       case TypeA:
-               var rb AResource
-               rb, err = unpackAResource(msg, off)
-               r = &rb
-               name = "A"
-       case TypeNS:
-               var rb NSResource
-               rb, err = unpackNSResource(msg, off)
-               r = &rb
-               name = "NS"
-       case TypeCNAME:
-               var rb CNAMEResource
-               rb, err = unpackCNAMEResource(msg, off)
-               r = &rb
-               name = "CNAME"
-       case TypeSOA:
-               var rb SOAResource
-               rb, err = unpackSOAResource(msg, off)
-               r = &rb
-               name = "SOA"
-       case TypePTR:
-               var rb PTRResource
-               rb, err = unpackPTRResource(msg, off)
-               r = &rb
-               name = "PTR"
-       case TypeMX:
-               var rb MXResource
-               rb, err = unpackMXResource(msg, off)
-               r = &rb
-               name = "MX"
-       case TypeTXT:
-               var rb TXTResource
-               rb, err = unpackTXTResource(msg, off, hdr.Length)
-               r = &rb
-               name = "TXT"
-       case TypeAAAA:
-               var rb AAAAResource
-               rb, err = unpackAAAAResource(msg, off)
-               r = &rb
-               name = "AAAA"
-       case TypeSRV:
-               var rb SRVResource
-               rb, err = unpackSRVResource(msg, off)
-               r = &rb
-               name = "SRV"
-       }
-       if err != nil {
-               return nil, off, &nestedError{name + " record", err}
-       }
-       if r == nil {
-               return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0'))
-       }
-       return r, off + int(hdr.Length), nil
-}
-
-// A CNAMEResource is a CNAME Resource record.
-type CNAMEResource struct {
-       CNAME Name
-}
-
-func (r *CNAMEResource) realType() Type {
-       return TypeCNAME
-}
-
-// pack appends the wire format of the CNAMEResource to msg.
-func (r *CNAMEResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       return r.CNAME.pack(msg, compression, compressionOff)
-}
-
-func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) {
-       var cname Name
-       if _, err := cname.unpack(msg, off); err != nil {
-               return CNAMEResource{}, err
-       }
-       return CNAMEResource{cname}, nil
-}
-
-// An MXResource is an MX Resource record.
-type MXResource struct {
-       Pref uint16
-       MX   Name
-}
-
-func (r *MXResource) realType() Type {
-       return TypeMX
-}
-
-// pack appends the wire format of the MXResource to msg.
-func (r *MXResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       oldMsg := msg
-       msg = packUint16(msg, r.Pref)
-       msg, err := r.MX.pack(msg, compression, compressionOff)
-       if err != nil {
-               return oldMsg, &nestedError{"MXResource.MX", err}
-       }
-       return msg, nil
-}
-
-func unpackMXResource(msg []byte, off int) (MXResource, error) {
-       pref, off, err := unpackUint16(msg, off)
-       if err != nil {
-               return MXResource{}, &nestedError{"Pref", err}
-       }
-       var mx Name
-       if _, err := mx.unpack(msg, off); err != nil {
-               return MXResource{}, &nestedError{"MX", err}
-       }
-       return MXResource{pref, mx}, nil
-}
-
-// An NSResource is an NS Resource record.
-type NSResource struct {
-       NS Name
-}
-
-func (r *NSResource) realType() Type {
-       return TypeNS
-}
-
-// pack appends the wire format of the NSResource to msg.
-func (r *NSResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       return r.NS.pack(msg, compression, compressionOff)
-}
-
-func unpackNSResource(msg []byte, off int) (NSResource, error) {
-       var ns Name
-       if _, err := ns.unpack(msg, off); err != nil {
-               return NSResource{}, err
-       }
-       return NSResource{ns}, nil
-}
-
-// A PTRResource is a PTR Resource record.
-type PTRResource struct {
-       PTR Name
-}
-
-func (r *PTRResource) realType() Type {
-       return TypePTR
-}
-
-// pack appends the wire format of the PTRResource to msg.
-func (r *PTRResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       return r.PTR.pack(msg, compression, compressionOff)
-}
-
-func unpackPTRResource(msg []byte, off int) (PTRResource, error) {
-       var ptr Name
-       if _, err := ptr.unpack(msg, off); err != nil {
-               return PTRResource{}, err
-       }
-       return PTRResource{ptr}, nil
-}
-
-// An SOAResource is an SOA Resource record.
-type SOAResource struct {
-       NS      Name
-       MBox    Name
-       Serial  uint32
-       Refresh uint32
-       Retry   uint32
-       Expire  uint32
-
-       // MinTTL the is the default TTL of Resources records which did not
-       // contain a TTL value and the TTL of negative responses. (RFC 2308
-       // Section 4)
-       MinTTL uint32
-}
-
-func (r *SOAResource) realType() Type {
-       return TypeSOA
-}
-
-// pack appends the wire format of the SOAResource to msg.
-func (r *SOAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       oldMsg := msg
-       msg, err := r.NS.pack(msg, compression, compressionOff)
-       if err != nil {
-               return oldMsg, &nestedError{"SOAResource.NS", err}
-       }
-       msg, err = r.MBox.pack(msg, compression, compressionOff)
-       if err != nil {
-               return oldMsg, &nestedError{"SOAResource.MBox", err}
-       }
-       msg = packUint32(msg, r.Serial)
-       msg = packUint32(msg, r.Refresh)
-       msg = packUint32(msg, r.Retry)
-       msg = packUint32(msg, r.Expire)
-       return packUint32(msg, r.MinTTL), nil
-}
-
-func unpackSOAResource(msg []byte, off int) (SOAResource, error) {
-       var ns Name
-       off, err := ns.unpack(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"NS", err}
-       }
-       var mbox Name
-       if off, err = mbox.unpack(msg, off); err != nil {
-               return SOAResource{}, &nestedError{"MBox", err}
-       }
-       serial, off, err := unpackUint32(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"Serial", err}
-       }
-       refresh, off, err := unpackUint32(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"Refresh", err}
-       }
-       retry, off, err := unpackUint32(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"Retry", err}
-       }
-       expire, off, err := unpackUint32(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"Expire", err}
-       }
-       minTTL, _, err := unpackUint32(msg, off)
-       if err != nil {
-               return SOAResource{}, &nestedError{"MinTTL", err}
-       }
-       return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil
-}
-
-// A TXTResource is a TXT Resource record.
-type TXTResource struct {
-       TXT []string
-}
-
-func (r *TXTResource) realType() Type {
-       return TypeTXT
-}
-
-// pack appends the wire format of the TXTResource to msg.
-func (r *TXTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       oldMsg := msg
-       for _, s := range r.TXT {
-               var err error
-               msg, err = packText(msg, s)
-               if err != nil {
-                       return oldMsg, err
-               }
-       }
-       return msg, nil
-}
-
-func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) {
-       txts := make([]string, 0, 1)
-       for n := uint16(0); n < length; {
-               var t string
-               var err error
-               if t, off, err = unpackText(msg, off); err != nil {
-                       return TXTResource{}, &nestedError{"text", err}
-               }
-               // Check if we got too many bytes.
-               if length-n < uint16(len(t))+1 {
-                       return TXTResource{}, errCalcLen
-               }
-               n += uint16(len(t)) + 1
-               txts = append(txts, t)
-       }
-       return TXTResource{txts}, nil
-}
-
-// An SRVResource is an SRV Resource record.
-type SRVResource struct {
-       Priority uint16
-       Weight   uint16
-       Port     uint16
-       Target   Name // Not compressed as per RFC 2782.
-}
-
-func (r *SRVResource) realType() Type {
-       return TypeSRV
-}
-
-// pack appends the wire format of the SRVResource to msg.
-func (r *SRVResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       oldMsg := msg
-       msg = packUint16(msg, r.Priority)
-       msg = packUint16(msg, r.Weight)
-       msg = packUint16(msg, r.Port)
-       msg, err := r.Target.pack(msg, nil, compressionOff)
-       if err != nil {
-               return oldMsg, &nestedError{"SRVResource.Target", err}
-       }
-       return msg, nil
-}
-
-func unpackSRVResource(msg []byte, off int) (SRVResource, error) {
-       priority, off, err := unpackUint16(msg, off)
-       if err != nil {
-               return SRVResource{}, &nestedError{"Priority", err}
-       }
-       weight, off, err := unpackUint16(msg, off)
-       if err != nil {
-               return SRVResource{}, &nestedError{"Weight", err}
-       }
-       port, off, err := unpackUint16(msg, off)
-       if err != nil {
-               return SRVResource{}, &nestedError{"Port", err}
-       }
-       var target Name
-       if _, err := target.unpackCompressed(msg, off, false /* allowCompression */); err != nil {
-               return SRVResource{}, &nestedError{"Target", err}
-       }
-       return SRVResource{priority, weight, port, target}, nil
-}
-
-// An AResource is an A Resource record.
-type AResource struct {
-       A [4]byte
-}
-
-func (r *AResource) realType() Type {
-       return TypeA
-}
-
-// pack appends the wire format of the AResource to msg.
-func (r *AResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       return packBytes(msg, r.A[:]), nil
-}
-
-func unpackAResource(msg []byte, off int) (AResource, error) {
-       var a [4]byte
-       if _, err := unpackBytes(msg, off, a[:]); err != nil {
-               return AResource{}, err
-       }
-       return AResource{a}, nil
-}
-
-// An AAAAResource is an AAAA Resource record.
-type AAAAResource struct {
-       AAAA [16]byte
-}
-
-func (r *AAAAResource) realType() Type {
-       return TypeAAAA
-}
-
-// pack appends the wire format of the AAAAResource to msg.
-func (r *AAAAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
-       return packBytes(msg, r.AAAA[:]), nil
-}
-
-func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) {
-       var aaaa [16]byte
-       if _, err := unpackBytes(msg, off, aaaa[:]); err != nil {
-               return AAAAResource{}, err
-       }
-       return AAAAResource{aaaa}, nil
-}
diff --git a/libgo/go/internal/x/net/dns/dnsmessage/message_test.go b/libgo/go/internal/x/net/dns/dnsmessage/message_test.go
deleted file mode 100644 (file)
index 052897f..0000000
+++ /dev/null
@@ -1,1137 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dnsmessage
-
-import (
-       "bytes"
-       "fmt"
-       "reflect"
-       "strings"
-       "testing"
-)
-
-func mustNewName(name string) Name {
-       n, err := NewName(name)
-       if err != nil {
-               panic(err)
-       }
-       return n
-}
-
-func (m *Message) String() string {
-       s := fmt.Sprintf("Message: %#v\n", &m.Header)
-       if len(m.Questions) > 0 {
-               s += "-- Questions\n"
-               for _, q := range m.Questions {
-                       s += fmt.Sprintf("%#v\n", q)
-               }
-       }
-       if len(m.Answers) > 0 {
-               s += "-- Answers\n"
-               for _, a := range m.Answers {
-                       s += fmt.Sprintf("%#v\n", a)
-               }
-       }
-       if len(m.Authorities) > 0 {
-               s += "-- Authorities\n"
-               for _, ns := range m.Authorities {
-                       s += fmt.Sprintf("%#v\n", ns)
-               }
-       }
-       if len(m.Additionals) > 0 {
-               s += "-- Additionals\n"
-               for _, e := range m.Additionals {
-                       s += fmt.Sprintf("%#v\n", e)
-               }
-       }
-       return s
-}
-
-func TestNameString(t *testing.T) {
-       want := "foo"
-       name := mustNewName(want)
-       if got := fmt.Sprint(name); got != want {
-               t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want)
-       }
-}
-
-func TestQuestionPackUnpack(t *testing.T) {
-       want := Question{
-               Name:  mustNewName("."),
-               Type:  TypeA,
-               Class: ClassINET,
-       }
-       buf, err := want.pack(make([]byte, 1, 50), map[string]int{}, 1)
-       if err != nil {
-               t.Fatal("Packing failed:", err)
-       }
-       var p Parser
-       p.msg = buf
-       p.header.questions = 1
-       p.section = sectionQuestions
-       p.off = 1
-       got, err := p.Question()
-       if err != nil {
-               t.Fatalf("Unpacking failed: %v\n%s", err, string(buf[1:]))
-       }
-       if p.off != len(buf) {
-               t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", p.off, len(buf))
-       }
-       if !reflect.DeepEqual(got, want) {
-               t.Errorf("Got = %+v, want = %+v", got, want)
-       }
-}
-
-func TestName(t *testing.T) {
-       tests := []string{
-               "",
-               ".",
-               "google..com",
-               "google.com",
-               "google..com.",
-               "google.com.",
-               ".google.com.",
-               "www..google.com.",
-               "www.google.com.",
-       }
-
-       for _, test := range tests {
-               n, err := NewName(test)
-               if err != nil {
-                       t.Errorf("Creating name for %q: %v", test, err)
-                       continue
-               }
-               if ns := n.String(); ns != test {
-                       t.Errorf("Got %#v.String() = %q, want = %q", n, ns, test)
-                       continue
-               }
-       }
-}
-
-func TestNamePackUnpack(t *testing.T) {
-       tests := []struct {
-               in   string
-               want string
-               err  error
-       }{
-               {"", "", errNonCanonicalName},
-               {".", ".", nil},
-               {"google..com", "", errNonCanonicalName},
-               {"google.com", "", errNonCanonicalName},
-               {"google..com.", "", errZeroSegLen},
-               {"google.com.", "google.com.", nil},
-               {".google.com.", "", errZeroSegLen},
-               {"www..google.com.", "", errZeroSegLen},
-               {"www.google.com.", "www.google.com.", nil},
-       }
-
-       for _, test := range tests {
-               in := mustNewName(test.in)
-               want := mustNewName(test.want)
-               buf, err := in.pack(make([]byte, 0, 30), map[string]int{}, 0)
-               if err != test.err {
-                       t.Errorf("Packing of %q: got err = %v, want err = %v", test.in, err, test.err)
-                       continue
-               }
-               if test.err != nil {
-                       continue
-               }
-               var got Name
-               n, err := got.unpack(buf, 0)
-               if err != nil {
-                       t.Errorf("Unpacking for %q failed: %v", test.in, err)
-                       continue
-               }
-               if n != len(buf) {
-                       t.Errorf(
-                               "Unpacked different amount than packed for %q: got n = %d, want = %d",
-                               test.in,
-                               n,
-                               len(buf),
-                       )
-               }
-               if got != want {
-                       t.Errorf("Unpacking packing of %q: got = %#v, want = %#v", test.in, got, want)
-               }
-       }
-}
-
-func TestIncompressibleName(t *testing.T) {
-       name := mustNewName("example.com.")
-       compression := map[string]int{}
-       buf, err := name.pack(make([]byte, 0, 100), compression, 0)
-       if err != nil {
-               t.Fatal("First packing failed:", err)
-       }
-       buf, err = name.pack(buf, compression, 0)
-       if err != nil {
-               t.Fatal("Second packing failed:", err)
-       }
-       var n1 Name
-       off, err := n1.unpackCompressed(buf, 0, false /* allowCompression */)
-       if err != nil {
-               t.Fatal("Unpacking incompressible name without pointers failed:", err)
-       }
-       var n2 Name
-       if _, err := n2.unpackCompressed(buf, off, false /* allowCompression */); err != errCompressedSRV {
-               t.Errorf("Unpacking compressed incompressible name with pointers: got err = %v, want = %v", err, errCompressedSRV)
-       }
-}
-
-func checkErrorPrefix(err error, prefix string) bool {
-       e, ok := err.(*nestedError)
-       return ok && e.s == prefix
-}
-
-func TestHeaderUnpackError(t *testing.T) {
-       wants := []string{
-               "id",
-               "bits",
-               "questions",
-               "answers",
-               "authorities",
-               "additionals",
-       }
-       var buf []byte
-       var h header
-       for _, want := range wants {
-               n, err := h.unpack(buf, 0)
-               if n != 0 || !checkErrorPrefix(err, want) {
-                       t.Errorf("got h.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want)
-               }
-               buf = append(buf, 0, 0)
-       }
-}
-
-func TestParserStart(t *testing.T) {
-       const want = "unpacking header"
-       var p Parser
-       for i := 0; i <= 1; i++ {
-               _, err := p.Start([]byte{})
-               if !checkErrorPrefix(err, want) {
-                       t.Errorf("got p.Start(nil) = _, %v, want = _, %s", err, want)
-               }
-       }
-}
-
-func TestResourceNotStarted(t *testing.T) {
-       tests := []struct {
-               name string
-               fn   func(*Parser) error
-       }{
-               {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }},
-               {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }},
-               {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }},
-               {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }},
-               {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }},
-               {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }},
-               {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }},
-               {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }},
-               {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }},
-       }
-
-       for _, test := range tests {
-               if err := test.fn(&Parser{}); err != ErrNotStarted {
-                       t.Errorf("got _, %v = p.%s(), want = _, %v", err, test.name, ErrNotStarted)
-               }
-       }
-}
-
-func TestDNSPackUnpack(t *testing.T) {
-       wants := []Message{
-               {
-                       Questions: []Question{
-                               {
-                                       Name:  mustNewName("."),
-                                       Type:  TypeAAAA,
-                                       Class: ClassINET,
-                               },
-                       },
-                       Answers:     []Resource{},
-                       Authorities: []Resource{},
-                       Additionals: []Resource{},
-               },
-               largeTestMsg(),
-       }
-       for i, want := range wants {
-               b, err := want.Pack()
-               if err != nil {
-                       t.Fatalf("%d: packing failed: %v", i, err)
-               }
-               var got Message
-               err = got.Unpack(b)
-               if err != nil {
-                       t.Fatalf("%d: unpacking failed: %v", i, err)
-               }
-               if !reflect.DeepEqual(got, want) {
-                       t.Errorf("%d: got = %+v, want = %+v", i, &got, &want)
-               }
-       }
-}
-
-func TestDNSAppendPackUnpack(t *testing.T) {
-       wants := []Message{
-               {
-                       Questions: []Question{
-                               {
-                                       Name:  mustNewName("."),
-                                       Type:  TypeAAAA,
-                                       Class: ClassINET,
-                               },
-                       },
-                       Answers:     []Resource{},
-                       Authorities: []Resource{},
-                       Additionals: []Resource{},
-               },
-               largeTestMsg(),
-       }
-       for i, want := range wants {
-               b := make([]byte, 2, 514)
-               b, err := want.AppendPack(b)
-               if err != nil {
-                       t.Fatalf("%d: packing failed: %v", i, err)
-               }
-               b = b[2:]
-               var got Message
-               err = got.Unpack(b)
-               if err != nil {
-                       t.Fatalf("%d: unpacking failed: %v", i, err)
-               }
-               if !reflect.DeepEqual(got, want) {
-                       t.Errorf("%d: got = %+v, want = %+v", i, &got, &want)
-               }
-       }
-}
-
-func TestSkipAll(t *testing.T) {
-       msg := largeTestMsg()
-       buf, err := msg.Pack()
-       if err != nil {
-               t.Fatal("Packing large test message:", err)
-       }
-       var p Parser
-       if _, err := p.Start(buf); err != nil {
-               t.Fatal(err)
-       }
-
-       tests := []struct {
-               name string
-               f    func() error
-       }{
-               {"SkipAllQuestions", p.SkipAllQuestions},
-               {"SkipAllAnswers", p.SkipAllAnswers},
-               {"SkipAllAuthorities", p.SkipAllAuthorities},
-               {"SkipAllAdditionals", p.SkipAllAdditionals},
-       }
-       for _, test := range tests {
-               for i := 1; i <= 3; i++ {
-                       if err := test.f(); err != nil {
-                               t.Errorf("Call #%d to %s(): %v", i, test.name, err)
-                       }
-               }
-       }
-}
-
-func TestSkipEach(t *testing.T) {
-       msg := smallTestMsg()
-
-       buf, err := msg.Pack()
-       if err != nil {
-               t.Fatal("Packing test message:", err)
-       }
-       var p Parser
-       if _, err := p.Start(buf); err != nil {
-               t.Fatal(err)
-       }
-
-       tests := []struct {
-               name string
-               f    func() error
-       }{
-               {"SkipQuestion", p.SkipQuestion},
-               {"SkipAnswer", p.SkipAnswer},
-               {"SkipAuthority", p.SkipAuthority},
-               {"SkipAdditional", p.SkipAdditional},
-       }
-       for _, test := range tests {
-               if err := test.f(); err != nil {
-                       t.Errorf("First call: got %s() = %v, want = %v", test.name, err, nil)
-               }
-               if err := test.f(); err != ErrSectionDone {
-                       t.Errorf("Second call: got %s() = %v, want = %v", test.name, err, ErrSectionDone)
-               }
-       }
-}
-
-func TestSkipAfterRead(t *testing.T) {
-       msg := smallTestMsg()
-
-       buf, err := msg.Pack()
-       if err != nil {
-               t.Fatal("Packing test message:", err)
-       }
-       var p Parser
-       if _, err := p.Start(buf); err != nil {
-               t.Fatal(err)
-       }
-
-       tests := []struct {
-               name string
-               skip func() error
-               read func() error
-       }{
-               {"Question", p.SkipQuestion, func() error { _, err := p.Question(); return err }},
-               {"Answer", p.SkipAnswer, func() error { _, err := p.Answer(); return err }},
-               {"Authority", p.SkipAuthority, func() error { _, err := p.Authority(); return err }},
-               {"Additional", p.SkipAdditional, func() error { _, err := p.Additional(); return err }},
-       }
-       for _, test := range tests {
-               if err := test.read(); err != nil {
-                       t.Errorf("Got %s() = _, %v, want = _, %v", test.name, err, nil)
-               }
-               if err := test.skip(); err != ErrSectionDone {
-                       t.Errorf("Got Skip%s() = %v, want = %v", test.name, err, ErrSectionDone)
-               }
-       }
-}
-
-func TestSkipNotStarted(t *testing.T) {
-       var p Parser
-
-       tests := []struct {
-               name string
-               f    func() error
-       }{
-               {"SkipAllQuestions", p.SkipAllQuestions},
-               {"SkipAllAnswers", p.SkipAllAnswers},
-               {"SkipAllAuthorities", p.SkipAllAuthorities},
-               {"SkipAllAdditionals", p.SkipAllAdditionals},
-       }
-       for _, test := range tests {
-               if err := test.f(); err != ErrNotStarted {
-                       t.Errorf("Got %s() = %v, want = %v", test.name, err, ErrNotStarted)
-               }
-       }
-}
-
-func TestTooManyRecords(t *testing.T) {
-       const recs = int(^uint16(0)) + 1
-       tests := []struct {
-               name string
-               msg  Message
-               want error
-       }{
-               {
-                       "Questions",
-                       Message{
-                               Questions: make([]Question, recs),
-                       },
-                       errTooManyQuestions,
-               },
-               {
-                       "Answers",
-                       Message{
-                               Answers: make([]Resource, recs),
-                       },
-                       errTooManyAnswers,
-               },
-               {
-                       "Authorities",
-                       Message{
-                               Authorities: make([]Resource, recs),
-                       },
-                       errTooManyAuthorities,
-               },
-               {
-                       "Additionals",
-                       Message{
-                               Additionals: make([]Resource, recs),
-                       },
-                       errTooManyAdditionals,
-               },
-       }
-
-       for _, test := range tests {
-               if _, got := test.msg.Pack(); got != test.want {
-                       t.Errorf("Packing %d %s: got = %v, want = %v", recs, test.name, got, test.want)
-               }
-       }
-}
-
-func TestVeryLongTxt(t *testing.T) {
-       want := Resource{
-               ResourceHeader{
-                       Name:  mustNewName("foo.bar.example.com."),
-                       Type:  TypeTXT,
-                       Class: ClassINET,
-               },
-               &TXTResource{[]string{
-                       "",
-                       "",
-                       "foo bar",
-                       "",
-                       "www.example.com",
-                       "www.example.com.",
-                       strings.Repeat(".", 255),
-               }},
-       }
-       buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}, 0)
-       if err != nil {
-               t.Fatal("Packing failed:", err)
-       }
-       var got Resource
-       off, err := got.Header.unpack(buf, 0)
-       if err != nil {
-               t.Fatal("Unpacking ResourceHeader failed:", err)
-       }
-       body, n, err := unpackResourceBody(buf, off, got.Header)
-       if err != nil {
-               t.Fatal("Unpacking failed:", err)
-       }
-       got.Body = body
-       if n != len(buf) {
-               t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf))
-       }
-       if !reflect.DeepEqual(got, want) {
-               t.Errorf("Got = %#v, want = %#v", got, want)
-       }
-}
-
-func TestTooLongTxt(t *testing.T) {
-       rb := TXTResource{[]string{strings.Repeat(".", 256)}}
-       if _, err := rb.pack(make([]byte, 0, 8000), map[string]int{}, 0); err != errStringTooLong {
-               t.Errorf("Packing TXTRecord with 256 character string: got err = %v, want = %v", err, errStringTooLong)
-       }
-}
-
-func TestStartAppends(t *testing.T) {
-       buf := make([]byte, 2, 514)
-       wantBuf := []byte{4, 44}
-       copy(buf, wantBuf)
-
-       b := NewBuilder(buf, Header{})
-       b.EnableCompression()
-
-       buf, err := b.Finish()
-       if err != nil {
-               t.Fatal("Building failed:", err)
-       }
-       if got, want := len(buf), headerLen+2; got != want {
-               t.Errorf("Got len(buf} = %d, want = %d", got, want)
-       }
-       if string(buf[:2]) != string(wantBuf) {
-               t.Errorf("Original data not preserved, got = %v, want = %v", buf[:2], wantBuf)
-       }
-}
-
-func TestStartError(t *testing.T) {
-       tests := []struct {
-               name string
-               fn   func(*Builder) error
-       }{
-               {"Questions", func(b *Builder) error { return b.StartQuestions() }},
-               {"Answers", func(b *Builder) error { return b.StartAnswers() }},
-               {"Authorities", func(b *Builder) error { return b.StartAuthorities() }},
-               {"Additionals", func(b *Builder) error { return b.StartAdditionals() }},
-       }
-
-       envs := []struct {
-               name string
-               fn   func() *Builder
-               want error
-       }{
-               {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted},
-               {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone},
-       }
-
-       for _, env := range envs {
-               for _, test := range tests {
-                       if got := test.fn(env.fn()); got != env.want {
-                               t.Errorf("got Builder{%s}.Start%s = %v, want = %v", env.name, test.name, got, env.want)
-                       }
-               }
-       }
-}
-
-func TestBuilderResourceError(t *testing.T) {
-       tests := []struct {
-               name string
-               fn   func(*Builder) error
-       }{
-               {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }},
-               {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }},
-               {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }},
-               {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }},
-               {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }},
-               {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }},
-               {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }},
-               {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }},
-               {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }},
-       }
-
-       envs := []struct {
-               name string
-               fn   func() *Builder
-               want error
-       }{
-               {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted},
-               {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted},
-               {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted},
-               {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone},
-       }
-
-       for _, env := range envs {
-               for _, test := range tests {
-                       if got := test.fn(env.fn()); got != env.want {
-                               t.Errorf("got Builder{%s}.%s = %v, want = %v", env.name, test.name, got, env.want)
-                       }
-               }
-       }
-}
-
-func TestFinishError(t *testing.T) {
-       var b Builder
-       want := ErrNotStarted
-       if _, got := b.Finish(); got != want {
-               t.Errorf("got Builder{}.Finish() = %v, want = %v", got, want)
-       }
-}
-
-func TestBuilder(t *testing.T) {
-       msg := largeTestMsg()
-       want, err := msg.Pack()
-       if err != nil {
-               t.Fatal("Packing without builder:", err)
-       }
-
-       b := NewBuilder(nil, msg.Header)
-       b.EnableCompression()
-
-       if err := b.StartQuestions(); err != nil {
-               t.Fatal("b.StartQuestions():", err)
-       }
-       for _, q := range msg.Questions {
-               if err := b.Question(q); err != nil {
-                       t.Fatalf("b.Question(%#v): %v", q, err)
-               }
-       }
-
-       if err := b.StartAnswers(); err != nil {
-               t.Fatal("b.StartAnswers():", err)
-       }
-       for _, a := range msg.Answers {
-               switch a.Header.Type {
-               case TypeA:
-                       if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil {
-                               t.Fatalf("b.AResource(%#v): %v", a, err)
-                       }
-               case TypeNS:
-                       if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil {
-                               t.Fatalf("b.NSResource(%#v): %v", a, err)
-                       }
-               case TypeCNAME:
-                       if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil {
-                               t.Fatalf("b.CNAMEResource(%#v): %v", a, err)
-                       }
-               case TypeSOA:
-                       if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil {
-                               t.Fatalf("b.SOAResource(%#v): %v", a, err)
-                       }
-               case TypePTR:
-                       if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil {
-                               t.Fatalf("b.PTRResource(%#v): %v", a, err)
-                       }
-               case TypeMX:
-                       if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil {
-                               t.Fatalf("b.MXResource(%#v): %v", a, err)
-                       }
-               case TypeTXT:
-                       if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil {
-                               t.Fatalf("b.TXTResource(%#v): %v", a, err)
-                       }
-               case TypeAAAA:
-                       if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil {
-                               t.Fatalf("b.AAAAResource(%#v): %v", a, err)
-                       }
-               case TypeSRV:
-                       if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil {
-                               t.Fatalf("b.SRVResource(%#v): %v", a, err)
-                       }
-               }
-       }
-
-       if err := b.StartAuthorities(); err != nil {
-               t.Fatal("b.StartAuthorities():", err)
-       }
-       for _, a := range msg.Authorities {
-               if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil {
-                       t.Fatalf("b.NSResource(%#v): %v", a, err)
-               }
-       }
-
-       if err := b.StartAdditionals(); err != nil {
-               t.Fatal("b.StartAdditionals():", err)
-       }
-       for _, a := range msg.Additionals {
-               if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil {
-                       t.Fatalf("b.TXTResource(%#v): %v", a, err)
-               }
-       }
-
-       got, err := b.Finish()
-       if err != nil {
-               t.Fatal("b.Finish():", err)
-       }
-       if !bytes.Equal(got, want) {
-               t.Fatalf("Got from Builder: %#v\nwant = %#v", got, want)
-       }
-}
-
-func TestResourcePack(t *testing.T) {
-       for _, tt := range []struct {
-               m   Message
-               err error
-       }{
-               {
-                       Message{
-                               Questions: []Question{
-                                       {
-                                               Name:  mustNewName("."),
-                                               Type:  TypeAAAA,
-                                               Class: ClassINET,
-                                       },
-                               },
-                               Answers: []Resource{{ResourceHeader{}, nil}},
-                       },
-                       &nestedError{"packing Answer", errNilResouceBody},
-               },
-               {
-                       Message{
-                               Questions: []Question{
-                                       {
-                                               Name:  mustNewName("."),
-                                               Type:  TypeAAAA,
-                                               Class: ClassINET,
-                                       },
-                               },
-                               Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}},
-                       },
-                       &nestedError{"packing Authority",
-                               &nestedError{"ResourceHeader",
-                                       &nestedError{"Name", errNonCanonicalName},
-                               },
-                       },
-               },
-               {
-                       Message{
-                               Questions: []Question{
-                                       {
-                                               Name:  mustNewName("."),
-                                               Type:  TypeA,
-                                               Class: ClassINET,
-                                       },
-                               },
-                               Additionals: []Resource{{ResourceHeader{}, nil}},
-                       },
-                       &nestedError{"packing Additional", errNilResouceBody},
-               },
-       } {
-               _, err := tt.m.Pack()
-               if !reflect.DeepEqual(err, tt.err) {
-                       t.Errorf("got %v for %v; want %v", err, tt.m, tt.err)
-               }
-       }
-}
-
-func benchmarkParsingSetup() ([]byte, error) {
-       name := mustNewName("foo.bar.example.com.")
-       msg := Message{
-               Header: Header{Response: true, Authoritative: true},
-               Questions: []Question{
-                       {
-                               Name:  name,
-                               Type:  TypeA,
-                               Class: ClassINET,
-                       },
-               },
-               Answers: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Class: ClassINET,
-                               },
-                               &AAAAResource{[16]byte{}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Class: ClassINET,
-                               },
-                               &CNAMEResource{name},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Class: ClassINET,
-                               },
-                               &NSResource{name},
-                       },
-               },
-       }
-
-       buf, err := msg.Pack()
-       if err != nil {
-               return nil, fmt.Errorf("msg.Pack(): %v", err)
-       }
-       return buf, nil
-}
-
-func benchmarkParsing(tb testing.TB, buf []byte) {
-       var p Parser
-       if _, err := p.Start(buf); err != nil {
-               tb.Fatal("p.Start(buf):", err)
-       }
-
-       for {
-               _, err := p.Question()
-               if err == ErrSectionDone {
-                       break
-               }
-               if err != nil {
-                       tb.Fatal("p.Question():", err)
-               }
-       }
-
-       for {
-               h, err := p.AnswerHeader()
-               if err == ErrSectionDone {
-                       break
-               }
-               if err != nil {
-                       panic(err)
-               }
-
-               switch h.Type {
-               case TypeA:
-                       if _, err := p.AResource(); err != nil {
-                               tb.Fatal("p.AResource():", err)
-                       }
-               case TypeAAAA:
-                       if _, err := p.AAAAResource(); err != nil {
-                               tb.Fatal("p.AAAAResource():", err)
-                       }
-               case TypeCNAME:
-                       if _, err := p.CNAMEResource(); err != nil {
-                               tb.Fatal("p.CNAMEResource():", err)
-                       }
-               case TypeNS:
-                       if _, err := p.NSResource(); err != nil {
-                               tb.Fatal("p.NSResource():", err)
-                       }
-               default:
-                       tb.Fatalf("unknown type: %T", h)
-               }
-       }
-}
-
-func BenchmarkParsing(b *testing.B) {
-       buf, err := benchmarkParsingSetup()
-       if err != nil {
-               b.Fatal(err)
-       }
-
-       b.ReportAllocs()
-       for i := 0; i < b.N; i++ {
-               benchmarkParsing(b, buf)
-       }
-}
-
-func TestParsingAllocs(t *testing.T) {
-       buf, err := benchmarkParsingSetup()
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       if allocs := testing.AllocsPerRun(100, func() { benchmarkParsing(t, buf) }); allocs > 0.5 {
-               t.Errorf("Allocations during parsing: got = %f, want ~0", allocs)
-       }
-}
-
-func benchmarkBuildingSetup() (Name, []byte) {
-       name := mustNewName("foo.bar.example.com.")
-       buf := make([]byte, 0, packStartingCap)
-       return name, buf
-}
-
-func benchmarkBuilding(tb testing.TB, name Name, buf []byte) {
-       bld := NewBuilder(buf, Header{Response: true, Authoritative: true})
-
-       if err := bld.StartQuestions(); err != nil {
-               tb.Fatal("bld.StartQuestions():", err)
-       }
-       q := Question{
-               Name:  name,
-               Type:  TypeA,
-               Class: ClassINET,
-       }
-       if err := bld.Question(q); err != nil {
-               tb.Fatalf("bld.Question(%+v): %v", q, err)
-       }
-
-       hdr := ResourceHeader{
-               Name:  name,
-               Class: ClassINET,
-       }
-       if err := bld.StartAnswers(); err != nil {
-               tb.Fatal("bld.StartQuestions():", err)
-       }
-
-       ar := AResource{[4]byte{}}
-       if err := bld.AResource(hdr, ar); err != nil {
-               tb.Fatalf("bld.AResource(%+v, %+v): %v", hdr, ar, err)
-       }
-
-       aaar := AAAAResource{[16]byte{}}
-       if err := bld.AAAAResource(hdr, aaar); err != nil {
-               tb.Fatalf("bld.AAAAResource(%+v, %+v): %v", hdr, aaar, err)
-       }
-
-       cnr := CNAMEResource{name}
-       if err := bld.CNAMEResource(hdr, cnr); err != nil {
-               tb.Fatalf("bld.CNAMEResource(%+v, %+v): %v", hdr, cnr, err)
-       }
-
-       nsr := NSResource{name}
-       if err := bld.NSResource(hdr, nsr); err != nil {
-               tb.Fatalf("bld.NSResource(%+v, %+v): %v", hdr, nsr, err)
-       }
-
-       if _, err := bld.Finish(); err != nil {
-               tb.Fatal("bld.Finish():", err)
-       }
-}
-
-func BenchmarkBuilding(b *testing.B) {
-       name, buf := benchmarkBuildingSetup()
-       b.ReportAllocs()
-       for i := 0; i < b.N; i++ {
-               benchmarkBuilding(b, name, buf)
-       }
-}
-
-func TestBuildingAllocs(t *testing.T) {
-       name, buf := benchmarkBuildingSetup()
-       if allocs := testing.AllocsPerRun(100, func() { benchmarkBuilding(t, name, buf) }); allocs > 0.5 {
-               t.Errorf("Allocations during building: got = %f, want ~0", allocs)
-       }
-}
-
-func smallTestMsg() Message {
-       name := mustNewName("example.com.")
-       return Message{
-               Header: Header{Response: true, Authoritative: true},
-               Questions: []Question{
-                       {
-                               Name:  name,
-                               Type:  TypeA,
-                               Class: ClassINET,
-                       },
-               },
-               Answers: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeA,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{127, 0, 0, 1}},
-                       },
-               },
-               Authorities: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeA,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{127, 0, 0, 1}},
-                       },
-               },
-               Additionals: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeA,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{127, 0, 0, 1}},
-                       },
-               },
-       }
-}
-
-func BenchmarkPack(b *testing.B) {
-       msg := largeTestMsg()
-
-       b.ReportAllocs()
-
-       for i := 0; i < b.N; i++ {
-               if _, err := msg.Pack(); err != nil {
-                       b.Fatal(err)
-               }
-       }
-}
-
-func BenchmarkAppendPack(b *testing.B) {
-       msg := largeTestMsg()
-       buf := make([]byte, 0, packStartingCap)
-
-       b.ReportAllocs()
-
-       for i := 0; i < b.N; i++ {
-               if _, err := msg.AppendPack(buf[:0]); err != nil {
-                       b.Fatal(err)
-               }
-       }
-}
-
-func largeTestMsg() Message {
-       name := mustNewName("foo.bar.example.com.")
-       return Message{
-               Header: Header{Response: true, Authoritative: true},
-               Questions: []Question{
-                       {
-                               Name:  name,
-                               Type:  TypeA,
-                               Class: ClassINET,
-                       },
-               },
-               Answers: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeA,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{127, 0, 0, 1}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeA,
-                                       Class: ClassINET,
-                               },
-                               &AResource{[4]byte{127, 0, 0, 2}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeAAAA,
-                                       Class: ClassINET,
-                               },
-                               &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeCNAME,
-                                       Class: ClassINET,
-                               },
-                               &CNAMEResource{mustNewName("alias.example.com.")},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeSOA,
-                                       Class: ClassINET,
-                               },
-                               &SOAResource{
-                                       NS:      mustNewName("ns1.example.com."),
-                                       MBox:    mustNewName("mb.example.com."),
-                                       Serial:  1,
-                                       Refresh: 2,
-                                       Retry:   3,
-                                       Expire:  4,
-                                       MinTTL:  5,
-                               },
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypePTR,
-                                       Class: ClassINET,
-                               },
-                               &PTRResource{mustNewName("ptr.example.com.")},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeMX,
-                                       Class: ClassINET,
-                               },
-                               &MXResource{
-                                       7,
-                                       mustNewName("mx.example.com."),
-                               },
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeSRV,
-                                       Class: ClassINET,
-                               },
-                               &SRVResource{
-                                       8,
-                                       9,
-                                       11,
-                                       mustNewName("srv.example.com."),
-                               },
-                       },
-               },
-               Authorities: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeNS,
-                                       Class: ClassINET,
-                               },
-                               &NSResource{mustNewName("ns1.example.com.")},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeNS,
-                                       Class: ClassINET,
-                               },
-                               &NSResource{mustNewName("ns2.example.com.")},
-                       },
-               },
-               Additionals: []Resource{
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeTXT,
-                                       Class: ClassINET,
-                               },
-                               &TXTResource{[]string{"So Long, and Thanks for All the Fish"}},
-                       },
-                       {
-                               ResourceHeader{
-                                       Name:  name,
-                                       Type:  TypeTXT,
-                                       Class: ClassINET,
-                               },
-                               &TXTResource{[]string{"Hamster Huey and the Gooey Kablooie"}},
-                       },
-               },
-       }
-}
diff --git a/libgo/go/internal/x/net/http/httpguts/guts.go b/libgo/go/internal/x/net/http/httpguts/guts.go
deleted file mode 100644 (file)
index e6cd0ce..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package httpguts provides functions implementing various details
-// of the HTTP specification.
-//
-// This package is shared by the standard library (which vendors it)
-// and x/net/http2. It comes with no API stability promise.
-package httpguts
-
-import (
-       "net/textproto"
-       "strings"
-)
-
-// ValidTrailerHeader reports whether name is a valid header field name to appear
-// in trailers.
-// See RFC 7230, Section 4.1.2
-func ValidTrailerHeader(name string) bool {
-       name = textproto.CanonicalMIMEHeaderKey(name)
-       if strings.HasPrefix(name, "If-") || badTrailer[name] {
-               return false
-       }
-       return true
-}
-
-var badTrailer = map[string]bool{
-       "Authorization":       true,
-       "Cache-Control":       true,
-       "Connection":          true,
-       "Content-Encoding":    true,
-       "Content-Length":      true,
-       "Content-Range":       true,
-       "Content-Type":        true,
-       "Expect":              true,
-       "Host":                true,
-       "Keep-Alive":          true,
-       "Max-Forwards":        true,
-       "Pragma":              true,
-       "Proxy-Authenticate":  true,
-       "Proxy-Authorization": true,
-       "Proxy-Connection":    true,
-       "Range":               true,
-       "Realm":               true,
-       "Te":                  true,
-       "Trailer":             true,
-       "Transfer-Encoding":   true,
-       "Www-Authenticate":    true,
-}
diff --git a/libgo/go/internal/x/net/http/httpguts/httplex.go b/libgo/go/internal/x/net/http/httpguts/httplex.go
deleted file mode 100644 (file)
index 7f3cdd8..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httpguts
-
-import (
-       "net"
-       "strings"
-       "unicode/utf8"
-
-       "internal/x/net/idna"
-)
-
-var isTokenTable = [127]bool{
-       '!':  true,
-       '#':  true,
-       '$':  true,
-       '%':  true,
-       '&':  true,
-       '\'': true,
-       '*':  true,
-       '+':  true,
-       '-':  true,
-       '.':  true,
-       '0':  true,
-       '1':  true,
-       '2':  true,
-       '3':  true,
-       '4':  true,
-       '5':  true,
-       '6':  true,
-       '7':  true,
-       '8':  true,
-       '9':  true,
-       'A':  true,
-       'B':  true,
-       'C':  true,
-       'D':  true,
-       'E':  true,
-       'F':  true,
-       'G':  true,
-       'H':  true,
-       'I':  true,
-       'J':  true,
-       'K':  true,
-       'L':  true,
-       'M':  true,
-       'N':  true,
-       'O':  true,
-       'P':  true,
-       'Q':  true,
-       'R':  true,
-       'S':  true,
-       'T':  true,
-       'U':  true,
-       'W':  true,
-       'V':  true,
-       'X':  true,
-       'Y':  true,
-       'Z':  true,
-       '^':  true,
-       '_':  true,
-       '`':  true,
-       'a':  true,
-       'b':  true,
-       'c':  true,
-       'd':  true,
-       'e':  true,
-       'f':  true,
-       'g':  true,
-       'h':  true,
-       'i':  true,
-       'j':  true,
-       'k':  true,
-       'l':  true,
-       'm':  true,
-       'n':  true,
-       'o':  true,
-       'p':  true,
-       'q':  true,
-       'r':  true,
-       's':  true,
-       't':  true,
-       'u':  true,
-       'v':  true,
-       'w':  true,
-       'x':  true,
-       'y':  true,
-       'z':  true,
-       '|':  true,
-       '~':  true,
-}
-
-func IsTokenRune(r rune) bool {
-       i := int(r)
-       return i < len(isTokenTable) && isTokenTable[i]
-}
-
-func isNotToken(r rune) bool {
-       return !IsTokenRune(r)
-}
-
-// HeaderValuesContainsToken reports whether any string in values
-// contains the provided token, ASCII case-insensitively.
-func HeaderValuesContainsToken(values []string, token string) bool {
-       for _, v := range values {
-               if headerValueContainsToken(v, token) {
-                       return true
-               }
-       }
-       return false
-}
-
-// isOWS reports whether b is an optional whitespace byte, as defined
-// by RFC 7230 section 3.2.3.
-func isOWS(b byte) bool { return b == ' ' || b == '\t' }
-
-// trimOWS returns x with all optional whitespace removes from the
-// beginning and end.
-func trimOWS(x string) string {
-       // TODO: consider using strings.Trim(x, " \t") instead,
-       // if and when it's fast enough. See issue 10292.
-       // But this ASCII-only code will probably always beat UTF-8
-       // aware code.
-       for len(x) > 0 && isOWS(x[0]) {
-               x = x[1:]
-       }
-       for len(x) > 0 && isOWS(x[len(x)-1]) {
-               x = x[:len(x)-1]
-       }
-       return x
-}
-
-// headerValueContainsToken reports whether v (assumed to be a
-// 0#element, in the ABNF extension described in RFC 7230 section 7)
-// contains token amongst its comma-separated tokens, ASCII
-// case-insensitively.
-func headerValueContainsToken(v string, token string) bool {
-       v = trimOWS(v)
-       if comma := strings.IndexByte(v, ','); comma != -1 {
-               return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token)
-       }
-       return tokenEqual(v, token)
-}
-
-// lowerASCII returns the ASCII lowercase version of b.
-func lowerASCII(b byte) byte {
-       if 'A' <= b && b <= 'Z' {
-               return b + ('a' - 'A')
-       }
-       return b
-}
-
-// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively.
-func tokenEqual(t1, t2 string) bool {
-       if len(t1) != len(t2) {
-               return false
-       }
-       for i, b := range t1 {
-               if b >= utf8.RuneSelf {
-                       // No UTF-8 or non-ASCII allowed in tokens.
-                       return false
-               }
-               if lowerASCII(byte(b)) != lowerASCII(t2[i]) {
-                       return false
-               }
-       }
-       return true
-}
-
-// isLWS reports whether b is linear white space, according
-// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
-//      LWS            = [CRLF] 1*( SP | HT )
-func isLWS(b byte) bool { return b == ' ' || b == '\t' }
-
-// isCTL reports whether b is a control byte, according
-// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
-//      CTL            = <any US-ASCII control character
-//                       (octets 0 - 31) and DEL (127)>
-func isCTL(b byte) bool {
-       const del = 0x7f // a CTL
-       return b < ' ' || b == del
-}
-
-// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name.
-// HTTP/2 imposes the additional restriction that uppercase ASCII
-// letters are not allowed.
-//
-//  RFC 7230 says:
-//   header-field   = field-name ":" OWS field-value OWS
-//   field-name     = token
-//   token          = 1*tchar
-//   tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
-//           "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
-func ValidHeaderFieldName(v string) bool {
-       if len(v) == 0 {
-               return false
-       }
-       for _, r := range v {
-               if !IsTokenRune(r) {
-                       return false
-               }
-       }
-       return true
-}
-
-// ValidHostHeader reports whether h is a valid host header.
-func ValidHostHeader(h string) bool {
-       // The latest spec is actually this:
-       //
-       // http://tools.ietf.org/html/rfc7230#section-5.4
-       //     Host = uri-host [ ":" port ]
-       //
-       // Where uri-host is:
-       //     http://tools.ietf.org/html/rfc3986#section-3.2.2
-       //
-       // But we're going to be much more lenient for now and just
-       // search for any byte that's not a valid byte in any of those
-       // expressions.
-       for i := 0; i < len(h); i++ {
-               if !validHostByte[h[i]] {
-                       return false
-               }
-       }
-       return true
-}
-
-// See the validHostHeader comment.
-var validHostByte = [256]bool{
-       '0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true,
-       '8': true, '9': true,
-
-       'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true,
-       'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true,
-       'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true,
-       'y': true, 'z': true,
-
-       'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true,
-       'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true,
-       'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true,
-       'Y': true, 'Z': true,
-
-       '!':  true, // sub-delims
-       '$':  true, // sub-delims
-       '%':  true, // pct-encoded (and used in IPv6 zones)
-       '&':  true, // sub-delims
-       '(':  true, // sub-delims
-       ')':  true, // sub-delims
-       '*':  true, // sub-delims
-       '+':  true, // sub-delims
-       ',':  true, // sub-delims
-       '-':  true, // unreserved
-       '.':  true, // unreserved
-       ':':  true, // IPv6address + Host expression's optional port
-       ';':  true, // sub-delims
-       '=':  true, // sub-delims
-       '[':  true,
-       '\'': true, // sub-delims
-       ']':  true,
-       '_':  true, // unreserved
-       '~':  true, // unreserved
-}
-
-// ValidHeaderFieldValue reports whether v is a valid "field-value" according to
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 :
-//
-//        message-header = field-name ":" [ field-value ]
-//        field-value    = *( field-content | LWS )
-//        field-content  = <the OCTETs making up the field-value
-//                         and consisting of either *TEXT or combinations
-//                         of token, separators, and quoted-string>
-//
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 :
-//
-//        TEXT           = <any OCTET except CTLs,
-//                          but including LWS>
-//        LWS            = [CRLF] 1*( SP | HT )
-//        CTL            = <any US-ASCII control character
-//                         (octets 0 - 31) and DEL (127)>
-//
-// RFC 7230 says:
-//  field-value    = *( field-content / obs-fold )
-//  obj-fold       =  N/A to http2, and deprecated
-//  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
-//  field-vchar    = VCHAR / obs-text
-//  obs-text       = %x80-FF
-//  VCHAR          = "any visible [USASCII] character"
-//
-// http2 further says: "Similarly, HTTP/2 allows header field values
-// that are not valid. While most of the values that can be encoded
-// will not alter header field parsing, carriage return (CR, ASCII
-// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII
-// 0x0) might be exploited by an attacker if they are translated
-// verbatim. Any request or response that contains a character not
-// permitted in a header field value MUST be treated as malformed
-// (Section 8.1.2.6). Valid characters are defined by the
-// field-content ABNF rule in Section 3.2 of [RFC7230]."
-//
-// This function does not (yet?) properly handle the rejection of
-// strings that begin or end with SP or HTAB.
-func ValidHeaderFieldValue(v string) bool {
-       for i := 0; i < len(v); i++ {
-               b := v[i]
-               if isCTL(b) && !isLWS(b) {
-                       return false
-               }
-       }
-       return true
-}
-
-func isASCII(s string) bool {
-       for i := 0; i < len(s); i++ {
-               if s[i] >= utf8.RuneSelf {
-                       return false
-               }
-       }
-       return true
-}
-
-// PunycodeHostPort returns the IDNA Punycode version
-// of the provided "host" or "host:port" string.
-func PunycodeHostPort(v string) (string, error) {
-       if isASCII(v) {
-               return v, nil
-       }
-
-       host, port, err := net.SplitHostPort(v)
-       if err != nil {
-               // The input 'v' argument was just a "host" argument,
-               // without a port. This error should not be returned
-               // to the caller.
-               host = v
-               port = ""
-       }
-       host, err = idna.ToASCII(host)
-       if err != nil {
-               // Non-UTF-8? Not representable in Punycode, in any
-               // case.
-               return "", err
-       }
-       if port == "" {
-               return host, nil
-       }
-       return net.JoinHostPort(host, port), nil
-}
diff --git a/libgo/go/internal/x/net/http/httpguts/httplex_test.go b/libgo/go/internal/x/net/http/httpguts/httplex_test.go
deleted file mode 100644 (file)
index a2c57f3..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httpguts
-
-import (
-       "testing"
-)
-
-func isChar(c rune) bool { return c <= 127 }
-
-func isCtl(c rune) bool { return c <= 31 || c == 127 }
-
-func isSeparator(c rune) bool {
-       switch c {
-       case '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t':
-               return true
-       }
-       return false
-}
-
-func TestIsToken(t *testing.T) {
-       for i := 0; i <= 130; i++ {
-               r := rune(i)
-               expected := isChar(r) && !isCtl(r) && !isSeparator(r)
-               if IsTokenRune(r) != expected {
-                       t.Errorf("isToken(0x%x) = %v", r, !expected)
-               }
-       }
-}
-
-func TestHeaderValuesContainsToken(t *testing.T) {
-       tests := []struct {
-               vals  []string
-               token string
-               want  bool
-       }{
-               {
-                       vals:  []string{"foo"},
-                       token: "foo",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"bar", "foo"},
-                       token: "foo",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"foo"},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"foo"},
-                       token: "bar",
-                       want:  false,
-               },
-               {
-                       vals:  []string{" foo "},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"foo,bar"},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"bar,foo,bar"},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"bar , foo"},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"foo ,bar "},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"bar, foo ,bar"},
-                       token: "FOO",
-                       want:  true,
-               },
-               {
-                       vals:  []string{"bar , foo"},
-                       token: "FOO",
-                       want:  true,
-               },
-       }
-       for _, tt := range tests {
-               got := HeaderValuesContainsToken(tt.vals, tt.token)
-               if got != tt.want {
-                       t.Errorf("headerValuesContainsToken(%q, %q) = %v; want %v", tt.vals, tt.token, got, tt.want)
-               }
-       }
-}
-
-func TestPunycodeHostPort(t *testing.T) {
-       tests := []struct {
-               in, want string
-       }{
-               {"www.google.com", "www.google.com"},
-               {"гофер.рф", "xn--c1ae0ajs.xn--p1ai"},
-               {"bücher.de", "xn--bcher-kva.de"},
-               {"bücher.de:8080", "xn--bcher-kva.de:8080"},
-               {"[1::6]:8080", "[1::6]:8080"},
-       }
-       for _, tt := range tests {
-               got, err := PunycodeHostPort(tt.in)
-               if tt.want != got || err != nil {
-                       t.Errorf("PunycodeHostPort(%q) = %q, %v, want %q, nil", tt.in, got, err, tt.want)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/http/httpproxy/export_test.go b/libgo/go/internal/x/net/http/httpproxy/export_test.go
deleted file mode 100644 (file)
index 5d30018..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httpproxy
-
-func ExportUseProxy(cfg *Config, host string) bool {
-       cfg1 := &config{
-               Config: *cfg,
-       }
-       cfg1.init()
-       return cfg1.useProxy(host)
-}
diff --git a/libgo/go/internal/x/net/http/httpproxy/proxy.go b/libgo/go/internal/x/net/http/httpproxy/proxy.go
deleted file mode 100644 (file)
index d394784..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package httpproxy provides support for HTTP proxy determination
-// based on environment variables, as provided by net/http's
-// ProxyFromEnvironment function.
-//
-// The API is not subject to the Go 1 compatibility promise and may change at
-// any time.
-package httpproxy
-
-import (
-       "errors"
-       "fmt"
-       "net"
-       "net/url"
-       "os"
-       "strings"
-       "unicode/utf8"
-
-       "internal/x/net/idna"
-)
-
-// Config holds configuration for HTTP proxy settings. See
-// FromEnvironment for details.
-type Config struct {
-       // HTTPProxy represents the value of the HTTP_PROXY or
-       // http_proxy environment variable. It will be used as the proxy
-       // URL for HTTP requests and HTTPS requests unless overridden by
-       // HTTPSProxy or NoProxy.
-       HTTPProxy string
-
-       // HTTPSProxy represents the HTTPS_PROXY or https_proxy
-       // environment variable. It will be used as the proxy URL for
-       // HTTPS requests unless overridden by NoProxy.
-       HTTPSProxy string
-
-       // NoProxy represents the NO_PROXY or no_proxy environment
-       // variable. It specifies a string that contains comma-separated values
-       // specifying hosts that should be excluded from proxying. Each value is
-       // represented by an IP address prefix (1.2.3.4), an IP address prefix in
-       // CIDR notation (1.2.3.4/8), a domain name, or a special DNS label (*).
-       // An IP address prefix and domain name can also include a literal port
-       // number (1.2.3.4:80).
-       // A domain name matches that name and all subdomains. A domain name with
-       // a leading "." matches subdomains only. For example "foo.com" matches
-       // "foo.com" and "bar.foo.com"; ".y.com" matches "x.y.com" but not "y.com".
-       // A single asterisk (*) indicates that no proxying should be done.
-       // A best effort is made to parse the string and errors are
-       // ignored.
-       NoProxy string
-
-       // CGI holds whether the current process is running
-       // as a CGI handler (FromEnvironment infers this from the
-       // presence of a REQUEST_METHOD environment variable).
-       // When this is set, ProxyForURL will return an error
-       // when HTTPProxy applies, because a client could be
-       // setting HTTP_PROXY maliciously. See https://golang.org/s/cgihttpproxy.
-       CGI bool
-}
-
-// config holds the parsed configuration for HTTP proxy settings.
-type config struct {
-       // Config represents the original configuration as defined above.
-       Config
-
-       // httpsProxy is the parsed URL of the HTTPSProxy if defined.
-       httpsProxy *url.URL
-
-       // httpProxy is the parsed URL of the HTTPProxy if defined.
-       httpProxy *url.URL
-
-       // ipMatchers represent all values in the NoProxy that are IP address
-       // prefixes or an IP address in CIDR notation.
-       ipMatchers []matcher
-
-       // domainMatchers represent all values in the NoProxy that are a domain
-       // name or hostname & domain name
-       domainMatchers []matcher
-}
-
-// FromEnvironment returns a Config instance populated from the
-// environment variables HTTP_PROXY, HTTPS_PROXY and NO_PROXY (or the
-// lowercase versions thereof). HTTPS_PROXY takes precedence over
-// HTTP_PROXY for https requests.
-//
-// The environment values may be either a complete URL or a
-// "host[:port]", in which case the "http" scheme is assumed. An error
-// is returned if the value is a different form.
-func FromEnvironment() *Config {
-       return &Config{
-               HTTPProxy:  getEnvAny("HTTP_PROXY", "http_proxy"),
-               HTTPSProxy: getEnvAny("HTTPS_PROXY", "https_proxy"),
-               NoProxy:    getEnvAny("NO_PROXY", "no_proxy"),
-               CGI:        os.Getenv("REQUEST_METHOD") != "",
-       }
-}
-
-func getEnvAny(names ...string) string {
-       for _, n := range names {
-               if val := os.Getenv(n); val != "" {
-                       return val
-               }
-       }
-       return ""
-}
-
-// ProxyFunc returns a function that determines the proxy URL to use for
-// a given request URL. Changing the contents of cfg will not affect
-// proxy functions created earlier.
-//
-// A nil URL and nil error are returned if no proxy is defined in the
-// environment, or a proxy should not be used for the given request, as
-// defined by NO_PROXY.
-//
-// As a special case, if req.URL.Host is "localhost" (with or without a
-// port number), then a nil URL and nil error will be returned.
-func (cfg *Config) ProxyFunc() func(reqURL *url.URL) (*url.URL, error) {
-       // Preprocess the Config settings for more efficient evaluation.
-       cfg1 := &config{
-               Config: *cfg,
-       }
-       cfg1.init()
-       return cfg1.proxyForURL
-}
-
-func (cfg *config) proxyForURL(reqURL *url.URL) (*url.URL, error) {
-       var proxy *url.URL
-       if reqURL.Scheme == "https" {
-               proxy = cfg.httpsProxy
-       }
-       if proxy == nil {
-               proxy = cfg.httpProxy
-               if proxy != nil && cfg.CGI {
-                       return nil, errors.New("refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy")
-               }
-       }
-       if proxy == nil {
-               return nil, nil
-       }
-       if !cfg.useProxy(canonicalAddr(reqURL)) {
-               return nil, nil
-       }
-
-       return proxy, nil
-}
-
-func parseProxy(proxy string) (*url.URL, error) {
-       if proxy == "" {
-               return nil, nil
-       }
-
-       proxyURL, err := url.Parse(proxy)
-       if err != nil ||
-               (proxyURL.Scheme != "http" &&
-                       proxyURL.Scheme != "https" &&
-                       proxyURL.Scheme != "socks5") {
-               // proxy was bogus. Try prepending "http://" to it and
-               // see if that parses correctly. If not, we fall
-               // through and complain about the original one.
-               if proxyURL, err := url.Parse("http://" + proxy); err == nil {
-                       return proxyURL, nil
-               }
-       }
-       if err != nil {
-               return nil, fmt.Errorf("invalid proxy address %q: %v", proxy, err)
-       }
-       return proxyURL, nil
-}
-
-// useProxy reports whether requests to addr should use a proxy,
-// according to the NO_PROXY or no_proxy environment variable.
-// addr is always a canonicalAddr with a host and port.
-func (cfg *config) useProxy(addr string) bool {
-       if len(addr) == 0 {
-               return true
-       }
-       host, port, err := net.SplitHostPort(addr)
-       if err != nil {
-               return false
-       }
-       if host == "localhost" {
-               return false
-       }
-       ip := net.ParseIP(host)
-       if ip != nil {
-               if ip.IsLoopback() {
-                       return false
-               }
-       }
-
-       addr = strings.ToLower(strings.TrimSpace(host))
-
-       if ip != nil {
-               for _, m := range cfg.ipMatchers {
-                       if m.match(addr, port, ip) {
-                               return false
-                       }
-               }
-       }
-       for _, m := range cfg.domainMatchers {
-               if m.match(addr, port, ip) {
-                       return false
-               }
-       }
-       return true
-}
-
-func (c *config) init() {
-       if parsed, err := parseProxy(c.HTTPProxy); err == nil {
-               c.httpProxy = parsed
-       }
-       if parsed, err := parseProxy(c.HTTPSProxy); err == nil {
-               c.httpsProxy = parsed
-       }
-
-       for _, p := range strings.Split(c.NoProxy, ",") {
-               p = strings.ToLower(strings.TrimSpace(p))
-               if len(p) == 0 {
-                       continue
-               }
-
-               if p == "*" {
-                       c.ipMatchers = []matcher{allMatch{}}
-                       c.domainMatchers = []matcher{allMatch{}}
-                       return
-               }
-
-               // IPv4/CIDR, IPv6/CIDR
-               if _, pnet, err := net.ParseCIDR(p); err == nil {
-                       c.ipMatchers = append(c.ipMatchers, cidrMatch{cidr: pnet})
-                       continue
-               }
-
-               // IPv4:port, [IPv6]:port
-               phost, pport, err := net.SplitHostPort(p)
-               if err == nil {
-                       if len(phost) == 0 {
-                               // There is no host part, likely the entry is malformed; ignore.
-                               continue
-                       }
-                       if phost[0] == '[' && phost[len(phost)-1] == ']' {
-                               phost = phost[1 : len(phost)-1]
-                       }
-               } else {
-                       phost = p
-               }
-               // IPv4, IPv6
-               if pip := net.ParseIP(phost); pip != nil {
-                       c.ipMatchers = append(c.ipMatchers, ipMatch{ip: pip, port: pport})
-                       continue
-               }
-
-               if len(phost) == 0 {
-                       // There is no host part, likely the entry is malformed; ignore.
-                       continue
-               }
-
-               // domain.com or domain.com:80
-               // foo.com matches bar.foo.com
-               // .domain.com or .domain.com:port
-               // *.domain.com or *.domain.com:port
-               if strings.HasPrefix(phost, "*.") {
-                       phost = phost[1:]
-               }
-               matchHost := false
-               if phost[0] != '.' {
-                       matchHost = true
-                       phost = "." + phost
-               }
-               c.domainMatchers = append(c.domainMatchers, domainMatch{host: phost, port: pport, matchHost: matchHost})
-       }
-}
-
-var portMap = map[string]string{
-       "http":   "80",
-       "https":  "443",
-       "socks5": "1080",
-}
-
-// canonicalAddr returns url.Host but always with a ":port" suffix
-func canonicalAddr(url *url.URL) string {
-       addr := url.Hostname()
-       if v, err := idnaASCII(addr); err == nil {
-               addr = v
-       }
-       port := url.Port()
-       if port == "" {
-               port = portMap[url.Scheme]
-       }
-       return net.JoinHostPort(addr, port)
-}
-
-// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
-// return true if the string includes a port.
-func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
-
-func idnaASCII(v string) (string, error) {
-       // TODO: Consider removing this check after verifying performance is okay.
-       // Right now punycode verification, length checks, context checks, and the
-       // permissible character tests are all omitted. It also prevents the ToASCII
-       // call from salvaging an invalid IDN, when possible. As a result it may be
-       // possible to have two IDNs that appear identical to the user where the
-       // ASCII-only version causes an error downstream whereas the non-ASCII
-       // version does not.
-       // Note that for correct ASCII IDNs ToASCII will only do considerably more
-       // work, but it will not cause an allocation.
-       if isASCII(v) {
-               return v, nil
-       }
-       return idna.Lookup.ToASCII(v)
-}
-
-func isASCII(s string) bool {
-       for i := 0; i < len(s); i++ {
-               if s[i] >= utf8.RuneSelf {
-                       return false
-               }
-       }
-       return true
-}
-
-// matcher represents the matching rule for a given value in the NO_PROXY list
-type matcher interface {
-       // match returns true if the host and optional port or ip and optional port
-       // are allowed
-       match(host, port string, ip net.IP) bool
-}
-
-// allMatch matches on all possible inputs
-type allMatch struct{}
-
-func (a allMatch) match(host, port string, ip net.IP) bool {
-       return true
-}
-
-type cidrMatch struct {
-       cidr *net.IPNet
-}
-
-func (m cidrMatch) match(host, port string, ip net.IP) bool {
-       return m.cidr.Contains(ip)
-}
-
-type ipMatch struct {
-       ip   net.IP
-       port string
-}
-
-func (m ipMatch) match(host, port string, ip net.IP) bool {
-       if m.ip.Equal(ip) {
-               return m.port == "" || m.port == port
-       }
-       return false
-}
-
-type domainMatch struct {
-       host string
-       port string
-
-       matchHost bool
-}
-
-func (m domainMatch) match(host, port string, ip net.IP) bool {
-       if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) {
-               return m.port == "" || m.port == port
-       }
-       return false
-}
diff --git a/libgo/go/internal/x/net/http/httpproxy/proxy_test.go b/libgo/go/internal/x/net/http/httpproxy/proxy_test.go
deleted file mode 100644 (file)
index cf0589d..0000000
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httpproxy_test
-
-import (
-       "bytes"
-       "errors"
-       "fmt"
-       "net/url"
-       "os"
-       "strings"
-       "testing"
-
-       "internal/x/net/http/httpproxy"
-)
-
-// setHelper calls t.Helper() for Go 1.9+ (see go19_test.go) and does nothing otherwise.
-var setHelper = func(t *testing.T) {}
-
-type proxyForURLTest struct {
-       cfg     httpproxy.Config
-       req     string // URL to fetch; blank means "http://example.com"
-       want    string
-       wanterr error
-}
-
-func (t proxyForURLTest) String() string {
-       var buf bytes.Buffer
-       space := func() {
-               if buf.Len() > 0 {
-                       buf.WriteByte(' ')
-               }
-       }
-       if t.cfg.HTTPProxy != "" {
-               fmt.Fprintf(&buf, "http_proxy=%q", t.cfg.HTTPProxy)
-       }
-       if t.cfg.HTTPSProxy != "" {
-               space()
-               fmt.Fprintf(&buf, "https_proxy=%q", t.cfg.HTTPSProxy)
-       }
-       if t.cfg.NoProxy != "" {
-               space()
-               fmt.Fprintf(&buf, "no_proxy=%q", t.cfg.NoProxy)
-       }
-       req := "http://example.com"
-       if t.req != "" {
-               req = t.req
-       }
-       space()
-       fmt.Fprintf(&buf, "req=%q", req)
-       return strings.TrimSpace(buf.String())
-}
-
-var proxyForURLTests = []proxyForURLTest{{
-       cfg: httpproxy.Config{
-               HTTPProxy: "127.0.0.1:8080",
-       },
-       want: "http://127.0.0.1:8080",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "cache.corp.example.com:1234",
-       },
-       want: "http://cache.corp.example.com:1234",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "cache.corp.example.com",
-       },
-       want: "http://cache.corp.example.com",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "https://cache.corp.example.com",
-       },
-       want: "https://cache.corp.example.com",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "http://127.0.0.1:8080",
-       },
-       want: "http://127.0.0.1:8080",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "https://127.0.0.1:8080",
-       },
-       want: "https://127.0.0.1:8080",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy: "socks5://127.0.0.1",
-       },
-       want: "socks5://127.0.0.1",
-}, {
-       // Don't use secure for http
-       cfg: httpproxy.Config{
-               HTTPProxy:  "http.proxy.tld",
-               HTTPSProxy: "secure.proxy.tld",
-       },
-       req:  "http://insecure.tld/",
-       want: "http://http.proxy.tld",
-}, {
-       // Use secure for https.
-       cfg: httpproxy.Config{
-               HTTPProxy:  "http.proxy.tld",
-               HTTPSProxy: "secure.proxy.tld",
-       },
-       req:  "https://secure.tld/",
-       want: "http://secure.proxy.tld",
-}, {
-       cfg: httpproxy.Config{
-               HTTPProxy:  "http.proxy.tld",
-               HTTPSProxy: "https://secure.proxy.tld",
-       },
-       req:  "https://secure.tld/",
-       want: "https://secure.proxy.tld",
-}, {
-       // Issue 16405: don't use HTTP_PROXY in a CGI environment,
-       // where HTTP_PROXY can be attacker-controlled.
-       cfg: httpproxy.Config{
-               HTTPProxy: "http://10.1.2.3:8080",
-               CGI:       true,
-       },
-       want:    "<nil>",
-       wanterr: errors.New("refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy"),
-}, {
-       // HTTPS proxy is still used even in CGI environment.
-       // (perhaps dubious but it's the historical behaviour).
-       cfg: httpproxy.Config{
-               HTTPSProxy: "https://secure.proxy.tld",
-               CGI:        true,
-       },
-       req:  "https://secure.tld/",
-       want: "https://secure.proxy.tld",
-}, {
-       want: "<nil>",
-}, {
-       cfg: httpproxy.Config{
-               NoProxy:   "example.com",
-               HTTPProxy: "proxy",
-       },
-       req:  "http://example.com/",
-       want: "<nil>",
-}, {
-       cfg: httpproxy.Config{
-               NoProxy:   ".example.com",
-               HTTPProxy: "proxy",
-       },
-       req:  "http://example.com/",
-       want: "http://proxy",
-}, {
-       cfg: httpproxy.Config{
-               NoProxy:   "ample.com",
-               HTTPProxy: "proxy",
-       },
-       req:  "http://example.com/",
-       want: "http://proxy",
-}, {
-       cfg: httpproxy.Config{
-               NoProxy:   "example.com",
-               HTTPProxy: "proxy",
-       },
-       req:  "http://foo.example.com/",
-       want: "<nil>",
-}, {
-       cfg: httpproxy.Config{
-               NoProxy:   ".foo.com",
-               HTTPProxy: "proxy",
-       },
-       req:  "http://example.com/",
-       want: "http://proxy",
-}}
-
-func testProxyForURL(t *testing.T, tt proxyForURLTest) {
-       setHelper(t)
-       reqURLStr := tt.req
-       if reqURLStr == "" {
-               reqURLStr = "http://example.com"
-       }
-       reqURL, err := url.Parse(reqURLStr)
-       if err != nil {
-               t.Errorf("invalid URL %q", reqURLStr)
-               return
-       }
-       cfg := tt.cfg
-       proxyForURL := cfg.ProxyFunc()
-       url, err := proxyForURL(reqURL)
-       if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e {
-               t.Errorf("%v: got error = %q, want %q", tt, g, e)
-               return
-       }
-       if got := fmt.Sprintf("%s", url); got != tt.want {
-               t.Errorf("%v: got URL = %q, want %q", tt, url, tt.want)
-       }
-
-       // Check that changing the Config doesn't change the results
-       // of the functuon.
-       cfg = httpproxy.Config{}
-       url, err = proxyForURL(reqURL)
-       if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e {
-               t.Errorf("(after mutating config) %v: got error = %q, want %q", tt, g, e)
-               return
-       }
-       if got := fmt.Sprintf("%s", url); got != tt.want {
-               t.Errorf("(after mutating config) %v: got URL = %q, want %q", tt, url, tt.want)
-       }
-}
-
-func TestProxyForURL(t *testing.T) {
-       for _, tt := range proxyForURLTests {
-               testProxyForURL(t, tt)
-       }
-}
-
-func TestFromEnvironment(t *testing.T) {
-       os.Setenv("HTTP_PROXY", "httpproxy")
-       os.Setenv("HTTPS_PROXY", "httpsproxy")
-       os.Setenv("NO_PROXY", "noproxy")
-       os.Setenv("REQUEST_METHOD", "")
-       got := httpproxy.FromEnvironment()
-       want := httpproxy.Config{
-               HTTPProxy:  "httpproxy",
-               HTTPSProxy: "httpsproxy",
-               NoProxy:    "noproxy",
-       }
-       if *got != want {
-               t.Errorf("unexpected proxy config, got %#v want %#v", got, want)
-       }
-}
-
-func TestFromEnvironmentWithRequestMethod(t *testing.T) {
-       os.Setenv("HTTP_PROXY", "httpproxy")
-       os.Setenv("HTTPS_PROXY", "httpsproxy")
-       os.Setenv("NO_PROXY", "noproxy")
-       os.Setenv("REQUEST_METHOD", "PUT")
-       got := httpproxy.FromEnvironment()
-       want := httpproxy.Config{
-               HTTPProxy:  "httpproxy",
-               HTTPSProxy: "httpsproxy",
-               NoProxy:    "noproxy",
-               CGI:        true,
-       }
-       if *got != want {
-               t.Errorf("unexpected proxy config, got %#v want %#v", got, want)
-       }
-}
-
-func TestFromEnvironmentLowerCase(t *testing.T) {
-       os.Setenv("http_proxy", "httpproxy")
-       os.Setenv("https_proxy", "httpsproxy")
-       os.Setenv("no_proxy", "noproxy")
-       os.Setenv("REQUEST_METHOD", "")
-       got := httpproxy.FromEnvironment()
-       want := httpproxy.Config{
-               HTTPProxy:  "httpproxy",
-               HTTPSProxy: "httpsproxy",
-               NoProxy:    "noproxy",
-       }
-       if *got != want {
-               t.Errorf("unexpected proxy config, got %#v want %#v", got, want)
-       }
-}
-
-var UseProxyTests = []struct {
-       host  string
-       match bool
-}{
-       // Never proxy localhost:
-       {"localhost", false},
-       {"127.0.0.1", false},
-       {"127.0.0.2", false},
-       {"[::1]", false},
-       {"[::2]", true}, // not a loopback address
-
-       {"192.168.1.1", false},                // matches exact IPv4
-       {"192.168.1.2", true},                 // ports do not match
-       {"192.168.1.3", false},                // matches exact IPv4:port
-       {"192.168.1.4", true},                 // no match
-       {"10.0.0.2", false},                   // matches IPv4/CIDR
-       {"[2001:db8::52:0:1]", false},         // matches exact IPv6
-       {"[2001:db8::52:0:2]", true},          // no match
-       {"[2001:db8::52:0:3]", false},         // matches exact [IPv6]:port
-       {"[2002:db8:a::123]", false},          // matches IPv6/CIDR
-       {"[fe80::424b:c8be:1643:a1b6]", true}, // no match
-
-       {"barbaz.net", true},          // does not match as .barbaz.net
-       {"www.barbaz.net", false},     // does match as .barbaz.net
-       {"foobar.com", false},         // does match as foobar.com
-       {"www.foobar.com", false},     // match because NO_PROXY includes "foobar.com"
-       {"foofoobar.com", true},       // not match as a part of foobar.com
-       {"baz.com", true},             // not match as a part of barbaz.com
-       {"localhost.net", true},       // not match as suffix of address
-       {"local.localhost", true},     // not match as prefix as address
-       {"barbarbaz.net", true},       // not match, wrong domain
-       {"wildcard.io", true},         // does not match as *.wildcard.io
-       {"nested.wildcard.io", false}, // match as *.wildcard.io
-       {"awildcard.io", true},        // not a match because of '*'
-}
-
-var noProxy = "foobar.com, .barbaz.net, *.wildcard.io, 192.168.1.1, 192.168.1.2:81, 192.168.1.3:80, 10.0.0.0/30, 2001:db8::52:0:1, [2001:db8::52:0:2]:443, [2001:db8::52:0:3]:80, 2002:db8:a::45/64"
-
-func TestUseProxy(t *testing.T) {
-       cfg := &httpproxy.Config{
-               NoProxy: noProxy,
-       }
-       for _, test := range UseProxyTests {
-               if httpproxy.ExportUseProxy(cfg, test.host+":80") != test.match {
-                       t.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match)
-               }
-       }
-}
-
-func TestInvalidNoProxy(t *testing.T) {
-       cfg := &httpproxy.Config{
-               NoProxy: ":1",
-       }
-       ok := httpproxy.ExportUseProxy(cfg, "example.com:80") // should not panic
-       if !ok {
-               t.Errorf("useProxy unexpected return; got false; want true")
-       }
-}
-
-func TestAllNoProxy(t *testing.T) {
-       cfg := &httpproxy.Config{
-               NoProxy: "*",
-       }
-       for _, test := range UseProxyTests {
-               if httpproxy.ExportUseProxy(cfg, test.host+":80") != false {
-                       t.Errorf("useProxy(%v) = true, want false", test.host)
-               }
-       }
-}
-
-func BenchmarkProxyForURL(b *testing.B) {
-       cfg := &httpproxy.Config{
-               HTTPProxy:  "http://proxy.example.org",
-               HTTPSProxy: "https://proxy.example.org",
-               NoProxy:    noProxy,
-       }
-       for _, test := range UseProxyTests {
-               u, err := url.Parse("https://" + test.host + ":80")
-               if err != nil {
-                       b.Fatalf("parsed failed: %s", test.host)
-               }
-               proxyFunc := cfg.ProxyFunc()
-               b.Run(test.host, func(b *testing.B) {
-                       for n := 0; n < b.N; n++ {
-                               if au, e := proxyFunc(u); e != nil && test.match == (au != nil) {
-                                       b.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match)
-                               }
-                       }
-               })
-       }
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/encode.go b/libgo/go/internal/x/net/http2/hpack/encode.go
deleted file mode 100644 (file)
index 1565cf2..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "io"
-)
-
-const (
-       uint32Max              = ^uint32(0)
-       initialHeaderTableSize = 4096
-)
-
-type Encoder struct {
-       dynTab dynamicTable
-       // minSize is the minimum table size set by
-       // SetMaxDynamicTableSize after the previous Header Table Size
-       // Update.
-       minSize uint32
-       // maxSizeLimit is the maximum table size this encoder
-       // supports. This will protect the encoder from too large
-       // size.
-       maxSizeLimit uint32
-       // tableSizeUpdate indicates whether "Header Table Size
-       // Update" is required.
-       tableSizeUpdate bool
-       w               io.Writer
-       buf             []byte
-}
-
-// NewEncoder returns a new Encoder which performs HPACK encoding. An
-// encoded data is written to w.
-func NewEncoder(w io.Writer) *Encoder {
-       e := &Encoder{
-               minSize:         uint32Max,
-               maxSizeLimit:    initialHeaderTableSize,
-               tableSizeUpdate: false,
-               w:               w,
-       }
-       e.dynTab.table.init()
-       e.dynTab.setMaxSize(initialHeaderTableSize)
-       return e
-}
-
-// WriteField encodes f into a single Write to e's underlying Writer.
-// This function may also produce bytes for "Header Table Size Update"
-// if necessary. If produced, it is done before encoding f.
-func (e *Encoder) WriteField(f HeaderField) error {
-       e.buf = e.buf[:0]
-
-       if e.tableSizeUpdate {
-               e.tableSizeUpdate = false
-               if e.minSize < e.dynTab.maxSize {
-                       e.buf = appendTableSize(e.buf, e.minSize)
-               }
-               e.minSize = uint32Max
-               e.buf = appendTableSize(e.buf, e.dynTab.maxSize)
-       }
-
-       idx, nameValueMatch := e.searchTable(f)
-       if nameValueMatch {
-               e.buf = appendIndexed(e.buf, idx)
-       } else {
-               indexing := e.shouldIndex(f)
-               if indexing {
-                       e.dynTab.add(f)
-               }
-
-               if idx == 0 {
-                       e.buf = appendNewName(e.buf, f, indexing)
-               } else {
-                       e.buf = appendIndexedName(e.buf, f, idx, indexing)
-               }
-       }
-       n, err := e.w.Write(e.buf)
-       if err == nil && n != len(e.buf) {
-               err = io.ErrShortWrite
-       }
-       return err
-}
-
-// searchTable searches f in both stable and dynamic header tables.
-// The static header table is searched first. Only when there is no
-// exact match for both name and value, the dynamic header table is
-// then searched. If there is no match, i is 0. If both name and value
-// match, i is the matched index and nameValueMatch becomes true. If
-// only name matches, i points to that index and nameValueMatch
-// becomes false.
-func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) {
-       i, nameValueMatch = staticTable.search(f)
-       if nameValueMatch {
-               return i, true
-       }
-
-       j, nameValueMatch := e.dynTab.table.search(f)
-       if nameValueMatch || (i == 0 && j != 0) {
-               return j + uint64(staticTable.len()), nameValueMatch
-       }
-
-       return i, false
-}
-
-// SetMaxDynamicTableSize changes the dynamic header table size to v.
-// The actual size is bounded by the value passed to
-// SetMaxDynamicTableSizeLimit.
-func (e *Encoder) SetMaxDynamicTableSize(v uint32) {
-       if v > e.maxSizeLimit {
-               v = e.maxSizeLimit
-       }
-       if v < e.minSize {
-               e.minSize = v
-       }
-       e.tableSizeUpdate = true
-       e.dynTab.setMaxSize(v)
-}
-
-// SetMaxDynamicTableSizeLimit changes the maximum value that can be
-// specified in SetMaxDynamicTableSize to v. By default, it is set to
-// 4096, which is the same size of the default dynamic header table
-// size described in HPACK specification. If the current maximum
-// dynamic header table size is strictly greater than v, "Header Table
-// Size Update" will be done in the next WriteField call and the
-// maximum dynamic header table size is truncated to v.
-func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) {
-       e.maxSizeLimit = v
-       if e.dynTab.maxSize > v {
-               e.tableSizeUpdate = true
-               e.dynTab.setMaxSize(v)
-       }
-}
-
-// shouldIndex reports whether f should be indexed.
-func (e *Encoder) shouldIndex(f HeaderField) bool {
-       return !f.Sensitive && f.Size() <= e.dynTab.maxSize
-}
-
-// appendIndexed appends index i, as encoded in "Indexed Header Field"
-// representation, to dst and returns the extended buffer.
-func appendIndexed(dst []byte, i uint64) []byte {
-       first := len(dst)
-       dst = appendVarInt(dst, 7, i)
-       dst[first] |= 0x80
-       return dst
-}
-
-// appendNewName appends f, as encoded in one of "Literal Header field
-// - New Name" representation variants, to dst and returns the
-// extended buffer.
-//
-// If f.Sensitive is true, "Never Indexed" representation is used. If
-// f.Sensitive is false and indexing is true, "Inremental Indexing"
-// representation is used.
-func appendNewName(dst []byte, f HeaderField, indexing bool) []byte {
-       dst = append(dst, encodeTypeByte(indexing, f.Sensitive))
-       dst = appendHpackString(dst, f.Name)
-       return appendHpackString(dst, f.Value)
-}
-
-// appendIndexedName appends f and index i referring indexed name
-// entry, as encoded in one of "Literal Header field - Indexed Name"
-// representation variants, to dst and returns the extended buffer.
-//
-// If f.Sensitive is true, "Never Indexed" representation is used. If
-// f.Sensitive is false and indexing is true, "Incremental Indexing"
-// representation is used.
-func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte {
-       first := len(dst)
-       var n byte
-       if indexing {
-               n = 6
-       } else {
-               n = 4
-       }
-       dst = appendVarInt(dst, n, i)
-       dst[first] |= encodeTypeByte(indexing, f.Sensitive)
-       return appendHpackString(dst, f.Value)
-}
-
-// appendTableSize appends v, as encoded in "Header Table Size Update"
-// representation, to dst and returns the extended buffer.
-func appendTableSize(dst []byte, v uint32) []byte {
-       first := len(dst)
-       dst = appendVarInt(dst, 5, uint64(v))
-       dst[first] |= 0x20
-       return dst
-}
-
-// appendVarInt appends i, as encoded in variable integer form using n
-// bit prefix, to dst and returns the extended buffer.
-//
-// See
-// http://http2.github.io/http2-spec/compression.html#integer.representation
-func appendVarInt(dst []byte, n byte, i uint64) []byte {
-       k := uint64((1 << n) - 1)
-       if i < k {
-               return append(dst, byte(i))
-       }
-       dst = append(dst, byte(k))
-       i -= k
-       for ; i >= 128; i >>= 7 {
-               dst = append(dst, byte(0x80|(i&0x7f)))
-       }
-       return append(dst, byte(i))
-}
-
-// appendHpackString appends s, as encoded in "String Literal"
-// representation, to dst and returns the extended buffer.
-//
-// s will be encoded in Huffman codes only when it produces strictly
-// shorter byte string.
-func appendHpackString(dst []byte, s string) []byte {
-       huffmanLength := HuffmanEncodeLength(s)
-       if huffmanLength < uint64(len(s)) {
-               first := len(dst)
-               dst = appendVarInt(dst, 7, huffmanLength)
-               dst = AppendHuffmanString(dst, s)
-               dst[first] |= 0x80
-       } else {
-               dst = appendVarInt(dst, 7, uint64(len(s)))
-               dst = append(dst, s...)
-       }
-       return dst
-}
-
-// encodeTypeByte returns type byte. If sensitive is true, type byte
-// for "Never Indexed" representation is returned. If sensitive is
-// false and indexing is true, type byte for "Incremental Indexing"
-// representation is returned. Otherwise, type byte for "Without
-// Indexing" is returned.
-func encodeTypeByte(indexing, sensitive bool) byte {
-       if sensitive {
-               return 0x10
-       }
-       if indexing {
-               return 0x40
-       }
-       return 0
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/encode_test.go b/libgo/go/internal/x/net/http2/hpack/encode_test.go
deleted file mode 100644 (file)
index 05f12db..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "bytes"
-       "encoding/hex"
-       "fmt"
-       "math/rand"
-       "reflect"
-       "strings"
-       "testing"
-)
-
-func TestEncoderTableSizeUpdate(t *testing.T) {
-       tests := []struct {
-               size1, size2 uint32
-               wantHex      string
-       }{
-               // Should emit 2 table size updates (2048 and 4096)
-               {2048, 4096, "3fe10f 3fe11f 82"},
-
-               // Should emit 1 table size update (2048)
-               {16384, 2048, "3fe10f 82"},
-       }
-       for _, tt := range tests {
-               var buf bytes.Buffer
-               e := NewEncoder(&buf)
-               e.SetMaxDynamicTableSize(tt.size1)
-               e.SetMaxDynamicTableSize(tt.size2)
-               if err := e.WriteField(pair(":method", "GET")); err != nil {
-                       t.Fatal(err)
-               }
-               want := removeSpace(tt.wantHex)
-               if got := hex.EncodeToString(buf.Bytes()); got != want {
-                       t.Errorf("e.SetDynamicTableSize %v, %v = %q; want %q", tt.size1, tt.size2, got, want)
-               }
-       }
-}
-
-func TestEncoderWriteField(t *testing.T) {
-       var buf bytes.Buffer
-       e := NewEncoder(&buf)
-       var got []HeaderField
-       d := NewDecoder(4<<10, func(f HeaderField) {
-               got = append(got, f)
-       })
-
-       tests := []struct {
-               hdrs []HeaderField
-       }{
-               {[]HeaderField{
-                       pair(":method", "GET"),
-                       pair(":scheme", "http"),
-                       pair(":path", "/"),
-                       pair(":authority", "www.example.com"),
-               }},
-               {[]HeaderField{
-                       pair(":method", "GET"),
-                       pair(":scheme", "http"),
-                       pair(":path", "/"),
-                       pair(":authority", "www.example.com"),
-                       pair("cache-control", "no-cache"),
-               }},
-               {[]HeaderField{
-                       pair(":method", "GET"),
-                       pair(":scheme", "https"),
-                       pair(":path", "/index.html"),
-                       pair(":authority", "www.example.com"),
-                       pair("custom-key", "custom-value"),
-               }},
-       }
-       for i, tt := range tests {
-               buf.Reset()
-               got = got[:0]
-               for _, hf := range tt.hdrs {
-                       if err := e.WriteField(hf); err != nil {
-                               t.Fatal(err)
-                       }
-               }
-               _, err := d.Write(buf.Bytes())
-               if err != nil {
-                       t.Errorf("%d. Decoder Write = %v", i, err)
-               }
-               if !reflect.DeepEqual(got, tt.hdrs) {
-                       t.Errorf("%d. Decoded %+v; want %+v", i, got, tt.hdrs)
-               }
-       }
-}
-
-func TestEncoderSearchTable(t *testing.T) {
-       e := NewEncoder(nil)
-
-       e.dynTab.add(pair("foo", "bar"))
-       e.dynTab.add(pair("blake", "miz"))
-       e.dynTab.add(pair(":method", "GET"))
-
-       tests := []struct {
-               hf        HeaderField
-               wantI     uint64
-               wantMatch bool
-       }{
-               // Name and Value match
-               {pair("foo", "bar"), uint64(staticTable.len()) + 3, true},
-               {pair("blake", "miz"), uint64(staticTable.len()) + 2, true},
-               {pair(":method", "GET"), 2, true},
-
-               // Only name match because Sensitive == true. This is allowed to match
-               // any ":method" entry. The current implementation uses the last entry
-               // added in newStaticTable.
-               {HeaderField{":method", "GET", true}, 3, false},
-
-               // Only Name matches
-               {pair("foo", "..."), uint64(staticTable.len()) + 3, false},
-               {pair("blake", "..."), uint64(staticTable.len()) + 2, false},
-               // As before, this is allowed to match any ":method" entry.
-               {pair(":method", "..."), 3, false},
-
-               // None match
-               {pair("foo-", "bar"), 0, false},
-       }
-       for _, tt := range tests {
-               if gotI, gotMatch := e.searchTable(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch {
-                       t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch)
-               }
-       }
-}
-
-func TestAppendVarInt(t *testing.T) {
-       tests := []struct {
-               n    byte
-               i    uint64
-               want []byte
-       }{
-               // Fits in a byte:
-               {1, 0, []byte{0}},
-               {2, 2, []byte{2}},
-               {3, 6, []byte{6}},
-               {4, 14, []byte{14}},
-               {5, 30, []byte{30}},
-               {6, 62, []byte{62}},
-               {7, 126, []byte{126}},
-               {8, 254, []byte{254}},
-
-               // Multiple bytes:
-               {5, 1337, []byte{31, 154, 10}},
-       }
-       for _, tt := range tests {
-               got := appendVarInt(nil, tt.n, tt.i)
-               if !bytes.Equal(got, tt.want) {
-                       t.Errorf("appendVarInt(nil, %v, %v) = %v; want %v", tt.n, tt.i, got, tt.want)
-               }
-       }
-}
-
-func TestAppendHpackString(t *testing.T) {
-       tests := []struct {
-               s, wantHex string
-       }{
-               // Huffman encoded
-               {"www.example.com", "8c f1e3 c2e5 f23a 6ba0 ab90 f4ff"},
-
-               // Not Huffman encoded
-               {"a", "01 61"},
-
-               // zero length
-               {"", "00"},
-       }
-       for _, tt := range tests {
-               want := removeSpace(tt.wantHex)
-               buf := appendHpackString(nil, tt.s)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("appendHpackString(nil, %q) = %q; want %q", tt.s, got, want)
-               }
-       }
-}
-
-func TestAppendIndexed(t *testing.T) {
-       tests := []struct {
-               i       uint64
-               wantHex string
-       }{
-               // 1 byte
-               {1, "81"},
-               {126, "fe"},
-
-               // 2 bytes
-               {127, "ff00"},
-               {128, "ff01"},
-       }
-       for _, tt := range tests {
-               want := removeSpace(tt.wantHex)
-               buf := appendIndexed(nil, tt.i)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("appendIndex(nil, %v) = %q; want %q", tt.i, got, want)
-               }
-       }
-}
-
-func TestAppendNewName(t *testing.T) {
-       tests := []struct {
-               f        HeaderField
-               indexing bool
-               wantHex  string
-       }{
-               // Incremental indexing
-               {HeaderField{"custom-key", "custom-value", false}, true, "40 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"},
-
-               // Without indexing
-               {HeaderField{"custom-key", "custom-value", false}, false, "00 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"},
-
-               // Never indexed
-               {HeaderField{"custom-key", "custom-value", true}, true, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"},
-               {HeaderField{"custom-key", "custom-value", true}, false, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"},
-       }
-       for _, tt := range tests {
-               want := removeSpace(tt.wantHex)
-               buf := appendNewName(nil, tt.f, tt.indexing)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("appendNewName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want)
-               }
-       }
-}
-
-func TestAppendIndexedName(t *testing.T) {
-       tests := []struct {
-               f        HeaderField
-               i        uint64
-               indexing bool
-               wantHex  string
-       }{
-               // Incremental indexing
-               {HeaderField{":status", "302", false}, 8, true, "48 82 6402"},
-
-               // Without indexing
-               {HeaderField{":status", "302", false}, 8, false, "08 82 6402"},
-
-               // Never indexed
-               {HeaderField{":status", "302", true}, 8, true, "18 82 6402"},
-               {HeaderField{":status", "302", true}, 8, false, "18 82 6402"},
-       }
-       for _, tt := range tests {
-               want := removeSpace(tt.wantHex)
-               buf := appendIndexedName(nil, tt.f, tt.i, tt.indexing)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("appendIndexedName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want)
-               }
-       }
-}
-
-func TestAppendTableSize(t *testing.T) {
-       tests := []struct {
-               i       uint32
-               wantHex string
-       }{
-               // Fits into 1 byte
-               {30, "3e"},
-
-               // Extra byte
-               {31, "3f00"},
-               {32, "3f01"},
-       }
-       for _, tt := range tests {
-               want := removeSpace(tt.wantHex)
-               buf := appendTableSize(nil, tt.i)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("appendTableSize(nil, %v) = %q; want %q", tt.i, got, want)
-               }
-       }
-}
-
-func TestEncoderSetMaxDynamicTableSize(t *testing.T) {
-       var buf bytes.Buffer
-       e := NewEncoder(&buf)
-       tests := []struct {
-               v           uint32
-               wantUpdate  bool
-               wantMinSize uint32
-               wantMaxSize uint32
-       }{
-               // Set new table size to 2048
-               {2048, true, 2048, 2048},
-
-               // Set new table size to 16384, but still limited to
-               // 4096
-               {16384, true, 2048, 4096},
-       }
-       for _, tt := range tests {
-               e.SetMaxDynamicTableSize(tt.v)
-               if got := e.tableSizeUpdate; tt.wantUpdate != got {
-                       t.Errorf("e.tableSizeUpdate = %v; want %v", got, tt.wantUpdate)
-               }
-               if got := e.minSize; tt.wantMinSize != got {
-                       t.Errorf("e.minSize = %v; want %v", got, tt.wantMinSize)
-               }
-               if got := e.dynTab.maxSize; tt.wantMaxSize != got {
-                       t.Errorf("e.maxSize = %v; want %v", got, tt.wantMaxSize)
-               }
-       }
-}
-
-func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) {
-       e := NewEncoder(nil)
-       // 4095 < initialHeaderTableSize means maxSize is truncated to
-       // 4095.
-       e.SetMaxDynamicTableSizeLimit(4095)
-       if got, want := e.dynTab.maxSize, uint32(4095); got != want {
-               t.Errorf("e.dynTab.maxSize = %v; want %v", got, want)
-       }
-       if got, want := e.maxSizeLimit, uint32(4095); got != want {
-               t.Errorf("e.maxSizeLimit = %v; want %v", got, want)
-       }
-       if got, want := e.tableSizeUpdate, true; got != want {
-               t.Errorf("e.tableSizeUpdate = %v; want %v", got, want)
-       }
-       // maxSize will be truncated to maxSizeLimit
-       e.SetMaxDynamicTableSize(16384)
-       if got, want := e.dynTab.maxSize, uint32(4095); got != want {
-               t.Errorf("e.dynTab.maxSize = %v; want %v", got, want)
-       }
-       // 8192 > current maxSizeLimit, so maxSize does not change.
-       e.SetMaxDynamicTableSizeLimit(8192)
-       if got, want := e.dynTab.maxSize, uint32(4095); got != want {
-               t.Errorf("e.dynTab.maxSize = %v; want %v", got, want)
-       }
-       if got, want := e.maxSizeLimit, uint32(8192); got != want {
-               t.Errorf("e.maxSizeLimit = %v; want %v", got, want)
-       }
-}
-
-func removeSpace(s string) string {
-       return strings.Replace(s, " ", "", -1)
-}
-
-func BenchmarkEncoderSearchTable(b *testing.B) {
-       e := NewEncoder(nil)
-
-       // A sample of possible header fields.
-       // This is not based on any actual data from HTTP/2 traces.
-       var possible []HeaderField
-       for _, f := range staticTable.ents {
-               if f.Value == "" {
-                       possible = append(possible, f)
-                       continue
-               }
-               // Generate 5 random values, except for cookie and set-cookie,
-               // which we know can have many values in practice.
-               num := 5
-               if f.Name == "cookie" || f.Name == "set-cookie" {
-                       num = 25
-               }
-               for i := 0; i < num; i++ {
-                       f.Value = fmt.Sprintf("%s-%d", f.Name, i)
-                       possible = append(possible, f)
-               }
-       }
-       for k := 0; k < 10; k++ {
-               f := HeaderField{
-                       Name:      fmt.Sprintf("x-header-%d", k),
-                       Sensitive: rand.Int()%2 == 0,
-               }
-               for i := 0; i < 5; i++ {
-                       f.Value = fmt.Sprintf("%s-%d", f.Name, i)
-                       possible = append(possible, f)
-               }
-       }
-
-       // Add a random sample to the dynamic table. This very loosely simulates
-       // a history of 100 requests with 20 header fields per request.
-       for r := 0; r < 100*20; r++ {
-               f := possible[rand.Int31n(int32(len(possible)))]
-               // Skip if this is in the staticTable verbatim.
-               if _, has := staticTable.search(f); !has {
-                       e.dynTab.add(f)
-               }
-       }
-
-       b.ResetTimer()
-       for n := 0; n < b.N; n++ {
-               for _, f := range possible {
-                       e.searchTable(f)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/hpack.go b/libgo/go/internal/x/net/http2/hpack/hpack.go
deleted file mode 100644 (file)
index 85f18a2..0000000
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package hpack implements HPACK, a compression format for
-// efficiently representing HTTP header fields in the context of HTTP/2.
-//
-// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09
-package hpack
-
-import (
-       "bytes"
-       "errors"
-       "fmt"
-)
-
-// A DecodingError is something the spec defines as a decoding error.
-type DecodingError struct {
-       Err error
-}
-
-func (de DecodingError) Error() string {
-       return fmt.Sprintf("decoding error: %v", de.Err)
-}
-
-// An InvalidIndexError is returned when an encoder references a table
-// entry before the static table or after the end of the dynamic table.
-type InvalidIndexError int
-
-func (e InvalidIndexError) Error() string {
-       return fmt.Sprintf("invalid indexed representation index %d", int(e))
-}
-
-// A HeaderField is a name-value pair. Both the name and value are
-// treated as opaque sequences of octets.
-type HeaderField struct {
-       Name, Value string
-
-       // Sensitive means that this header field should never be
-       // indexed.
-       Sensitive bool
-}
-
-// IsPseudo reports whether the header field is an http2 pseudo header.
-// That is, it reports whether it starts with a colon.
-// It is not otherwise guaranteed to be a valid pseudo header field,
-// though.
-func (hf HeaderField) IsPseudo() bool {
-       return len(hf.Name) != 0 && hf.Name[0] == ':'
-}
-
-func (hf HeaderField) String() string {
-       var suffix string
-       if hf.Sensitive {
-               suffix = " (sensitive)"
-       }
-       return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix)
-}
-
-// Size returns the size of an entry per RFC 7541 section 4.1.
-func (hf HeaderField) Size() uint32 {
-       // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1
-       // "The size of the dynamic table is the sum of the size of
-       // its entries. The size of an entry is the sum of its name's
-       // length in octets (as defined in Section 5.2), its value's
-       // length in octets (see Section 5.2), plus 32.  The size of
-       // an entry is calculated using the length of the name and
-       // value without any Huffman encoding applied."
-
-       // This can overflow if somebody makes a large HeaderField
-       // Name and/or Value by hand, but we don't care, because that
-       // won't happen on the wire because the encoding doesn't allow
-       // it.
-       return uint32(len(hf.Name) + len(hf.Value) + 32)
-}
-
-// A Decoder is the decoding context for incremental processing of
-// header blocks.
-type Decoder struct {
-       dynTab dynamicTable
-       emit   func(f HeaderField)
-
-       emitEnabled bool // whether calls to emit are enabled
-       maxStrLen   int  // 0 means unlimited
-
-       // buf is the unparsed buffer. It's only written to
-       // saveBuf if it was truncated in the middle of a header
-       // block. Because it's usually not owned, we can only
-       // process it under Write.
-       buf []byte // not owned; only valid during Write
-
-       // saveBuf is previous data passed to Write which we weren't able
-       // to fully parse before. Unlike buf, we own this data.
-       saveBuf bytes.Buffer
-
-       firstField bool // processing the first field of the header block
-}
-
-// NewDecoder returns a new decoder with the provided maximum dynamic
-// table size. The emitFunc will be called for each valid field
-// parsed, in the same goroutine as calls to Write, before Write returns.
-func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder {
-       d := &Decoder{
-               emit:        emitFunc,
-               emitEnabled: true,
-               firstField:  true,
-       }
-       d.dynTab.table.init()
-       d.dynTab.allowedMaxSize = maxDynamicTableSize
-       d.dynTab.setMaxSize(maxDynamicTableSize)
-       return d
-}
-
-// ErrStringLength is returned by Decoder.Write when the max string length
-// (as configured by Decoder.SetMaxStringLength) would be violated.
-var ErrStringLength = errors.New("hpack: string too long")
-
-// SetMaxStringLength sets the maximum size of a HeaderField name or
-// value string. If a string exceeds this length (even after any
-// decompression), Write will return ErrStringLength.
-// A value of 0 means unlimited and is the default from NewDecoder.
-func (d *Decoder) SetMaxStringLength(n int) {
-       d.maxStrLen = n
-}
-
-// SetEmitFunc changes the callback used when new header fields
-// are decoded.
-// It must be non-nil. It does not affect EmitEnabled.
-func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) {
-       d.emit = emitFunc
-}
-
-// SetEmitEnabled controls whether the emitFunc provided to NewDecoder
-// should be called. The default is true.
-//
-// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE
-// while still decoding and keeping in-sync with decoder state, but
-// without doing unnecessary decompression or generating unnecessary
-// garbage for header fields past the limit.
-func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v }
-
-// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder
-// are currently enabled. The default is true.
-func (d *Decoder) EmitEnabled() bool { return d.emitEnabled }
-
-// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their
-// underlying buffers for garbage reasons.
-
-func (d *Decoder) SetMaxDynamicTableSize(v uint32) {
-       d.dynTab.setMaxSize(v)
-}
-
-// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded
-// stream (via dynamic table size updates) may set the maximum size
-// to.
-func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) {
-       d.dynTab.allowedMaxSize = v
-}
-
-type dynamicTable struct {
-       // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2
-       table          headerFieldTable
-       size           uint32 // in bytes
-       maxSize        uint32 // current maxSize
-       allowedMaxSize uint32 // maxSize may go up to this, inclusive
-}
-
-func (dt *dynamicTable) setMaxSize(v uint32) {
-       dt.maxSize = v
-       dt.evict()
-}
-
-func (dt *dynamicTable) add(f HeaderField) {
-       dt.table.addEntry(f)
-       dt.size += f.Size()
-       dt.evict()
-}
-
-// If we're too big, evict old stuff.
-func (dt *dynamicTable) evict() {
-       var n int
-       for dt.size > dt.maxSize && n < dt.table.len() {
-               dt.size -= dt.table.ents[n].Size()
-               n++
-       }
-       dt.table.evictOldest(n)
-}
-
-func (d *Decoder) maxTableIndex() int {
-       // This should never overflow. RFC 7540 Section 6.5.2 limits the size of
-       // the dynamic table to 2^32 bytes, where each entry will occupy more than
-       // one byte. Further, the staticTable has a fixed, small length.
-       return d.dynTab.table.len() + staticTable.len()
-}
-
-func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) {
-       // See Section 2.3.3.
-       if i == 0 {
-               return
-       }
-       if i <= uint64(staticTable.len()) {
-               return staticTable.ents[i-1], true
-       }
-       if i > uint64(d.maxTableIndex()) {
-               return
-       }
-       // In the dynamic table, newer entries have lower indices.
-       // However, dt.ents[0] is the oldest entry. Hence, dt.ents is
-       // the reversed dynamic table.
-       dt := d.dynTab.table
-       return dt.ents[dt.len()-(int(i)-staticTable.len())], true
-}
-
-// Decode decodes an entire block.
-//
-// TODO: remove this method and make it incremental later? This is
-// easier for debugging now.
-func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
-       var hf []HeaderField
-       saveFunc := d.emit
-       defer func() { d.emit = saveFunc }()
-       d.emit = func(f HeaderField) { hf = append(hf, f) }
-       if _, err := d.Write(p); err != nil {
-               return nil, err
-       }
-       if err := d.Close(); err != nil {
-               return nil, err
-       }
-       return hf, nil
-}
-
-// Close declares that the decoding is complete and resets the Decoder
-// to be reused again for a new header block. If there is any remaining
-// data in the decoder's buffer, Close returns an error.
-func (d *Decoder) Close() error {
-       if d.saveBuf.Len() > 0 {
-               d.saveBuf.Reset()
-               return DecodingError{errors.New("truncated headers")}
-       }
-       d.firstField = true
-       return nil
-}
-
-func (d *Decoder) Write(p []byte) (n int, err error) {
-       if len(p) == 0 {
-               // Prevent state machine CPU attacks (making us redo
-               // work up to the point of finding out we don't have
-               // enough data)
-               return
-       }
-       // Only copy the data if we have to. Optimistically assume
-       // that p will contain a complete header block.
-       if d.saveBuf.Len() == 0 {
-               d.buf = p
-       } else {
-               d.saveBuf.Write(p)
-               d.buf = d.saveBuf.Bytes()
-               d.saveBuf.Reset()
-       }
-
-       for len(d.buf) > 0 {
-               err = d.parseHeaderFieldRepr()
-               if err == errNeedMore {
-                       // Extra paranoia, making sure saveBuf won't
-                       // get too large. All the varint and string
-                       // reading code earlier should already catch
-                       // overlong things and return ErrStringLength,
-                       // but keep this as a last resort.
-                       const varIntOverhead = 8 // conservative
-                       if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) {
-                               return 0, ErrStringLength
-                       }
-                       d.saveBuf.Write(d.buf)
-                       return len(p), nil
-               }
-               d.firstField = false
-               if err != nil {
-                       break
-               }
-       }
-       return len(p), err
-}
-
-// errNeedMore is an internal sentinel error value that means the
-// buffer is truncated and we need to read more data before we can
-// continue parsing.
-var errNeedMore = errors.New("need more data")
-
-type indexType int
-
-const (
-       indexedTrue indexType = iota
-       indexedFalse
-       indexedNever
-)
-
-func (v indexType) indexed() bool   { return v == indexedTrue }
-func (v indexType) sensitive() bool { return v == indexedNever }
-
-// returns errNeedMore if there isn't enough data available.
-// any other error is fatal.
-// consumes d.buf iff it returns nil.
-// precondition: must be called with len(d.buf) > 0
-func (d *Decoder) parseHeaderFieldRepr() error {
-       b := d.buf[0]
-       switch {
-       case b&128 != 0:
-               // Indexed representation.
-               // High bit set?
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1
-               return d.parseFieldIndexed()
-       case b&192 == 64:
-               // 6.2.1 Literal Header Field with Incremental Indexing
-               // 0b10xxxxxx: top two bits are 10
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1
-               return d.parseFieldLiteral(6, indexedTrue)
-       case b&240 == 0:
-               // 6.2.2 Literal Header Field without Indexing
-               // 0b0000xxxx: top four bits are 0000
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2
-               return d.parseFieldLiteral(4, indexedFalse)
-       case b&240 == 16:
-               // 6.2.3 Literal Header Field never Indexed
-               // 0b0001xxxx: top four bits are 0001
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3
-               return d.parseFieldLiteral(4, indexedNever)
-       case b&224 == 32:
-               // 6.3 Dynamic Table Size Update
-               // Top three bits are '001'.
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3
-               return d.parseDynamicTableSizeUpdate()
-       }
-
-       return DecodingError{errors.New("invalid encoding")}
-}
-
-// (same invariants and behavior as parseHeaderFieldRepr)
-func (d *Decoder) parseFieldIndexed() error {
-       buf := d.buf
-       idx, buf, err := readVarInt(7, buf)
-       if err != nil {
-               return err
-       }
-       hf, ok := d.at(idx)
-       if !ok {
-               return DecodingError{InvalidIndexError(idx)}
-       }
-       d.buf = buf
-       return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value})
-}
-
-// (same invariants and behavior as parseHeaderFieldRepr)
-func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error {
-       buf := d.buf
-       nameIdx, buf, err := readVarInt(n, buf)
-       if err != nil {
-               return err
-       }
-
-       var hf HeaderField
-       wantStr := d.emitEnabled || it.indexed()
-       if nameIdx > 0 {
-               ihf, ok := d.at(nameIdx)
-               if !ok {
-                       return DecodingError{InvalidIndexError(nameIdx)}
-               }
-               hf.Name = ihf.Name
-       } else {
-               hf.Name, buf, err = d.readString(buf, wantStr)
-               if err != nil {
-                       return err
-               }
-       }
-       hf.Value, buf, err = d.readString(buf, wantStr)
-       if err != nil {
-               return err
-       }
-       d.buf = buf
-       if it.indexed() {
-               d.dynTab.add(hf)
-       }
-       hf.Sensitive = it.sensitive()
-       return d.callEmit(hf)
-}
-
-func (d *Decoder) callEmit(hf HeaderField) error {
-       if d.maxStrLen != 0 {
-               if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen {
-                       return ErrStringLength
-               }
-       }
-       if d.emitEnabled {
-               d.emit(hf)
-       }
-       return nil
-}
-
-// (same invariants and behavior as parseHeaderFieldRepr)
-func (d *Decoder) parseDynamicTableSizeUpdate() error {
-       // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
-       // beginning of the first header block following the change to the dynamic table size.
-       if !d.firstField && d.dynTab.size > 0 {
-               return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
-       }
-
-       buf := d.buf
-       size, buf, err := readVarInt(5, buf)
-       if err != nil {
-               return err
-       }
-       if size > uint64(d.dynTab.allowedMaxSize) {
-               return DecodingError{errors.New("dynamic table size update too large")}
-       }
-       d.dynTab.setMaxSize(uint32(size))
-       d.buf = buf
-       return nil
-}
-
-var errVarintOverflow = DecodingError{errors.New("varint integer overflow")}
-
-// readVarInt reads an unsigned variable length integer off the
-// beginning of p. n is the parameter as described in
-// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1.
-//
-// n must always be between 1 and 8.
-//
-// The returned remain buffer is either a smaller suffix of p, or err != nil.
-// The error is errNeedMore if p doesn't contain a complete integer.
-func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) {
-       if n < 1 || n > 8 {
-               panic("bad n")
-       }
-       if len(p) == 0 {
-               return 0, p, errNeedMore
-       }
-       i = uint64(p[0])
-       if n < 8 {
-               i &= (1 << uint64(n)) - 1
-       }
-       if i < (1<<uint64(n))-1 {
-               return i, p[1:], nil
-       }
-
-       origP := p
-       p = p[1:]
-       var m uint64
-       for len(p) > 0 {
-               b := p[0]
-               p = p[1:]
-               i += uint64(b&127) << m
-               if b&128 == 0 {
-                       return i, p, nil
-               }
-               m += 7
-               if m >= 63 { // TODO: proper overflow check. making this up.
-                       return 0, origP, errVarintOverflow
-               }
-       }
-       return 0, origP, errNeedMore
-}
-
-// readString decodes an hpack string from p.
-//
-// wantStr is whether s will be used. If false, decompression and
-// []byte->string garbage are skipped if s will be ignored
-// anyway. This does mean that huffman decoding errors for non-indexed
-// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server
-// is returning an error anyway, and because they're not indexed, the error
-// won't affect the decoding state.
-func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) {
-       if len(p) == 0 {
-               return "", p, errNeedMore
-       }
-       isHuff := p[0]&128 != 0
-       strLen, p, err := readVarInt(7, p)
-       if err != nil {
-               return "", p, err
-       }
-       if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) {
-               return "", nil, ErrStringLength
-       }
-       if uint64(len(p)) < strLen {
-               return "", p, errNeedMore
-       }
-       if !isHuff {
-               if wantStr {
-                       s = string(p[:strLen])
-               }
-               return s, p[strLen:], nil
-       }
-
-       if wantStr {
-               buf := bufPool.Get().(*bytes.Buffer)
-               buf.Reset() // don't trust others
-               defer bufPool.Put(buf)
-               if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil {
-                       buf.Reset()
-                       return "", nil, err
-               }
-               s = buf.String()
-               buf.Reset() // be nice to GC
-       }
-       return s, p[strLen:], nil
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/hpack_test.go b/libgo/go/internal/x/net/http2/hpack/hpack_test.go
deleted file mode 100644 (file)
index a361a2a..0000000
+++ /dev/null
@@ -1,770 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "bytes"
-       "encoding/hex"
-       "fmt"
-       "math/rand"
-       "reflect"
-       "strings"
-       "testing"
-       "time"
-)
-
-func (d *Decoder) mustAt(idx int) HeaderField {
-       if hf, ok := d.at(uint64(idx)); !ok {
-               panic(fmt.Sprintf("bogus index %d", idx))
-       } else {
-               return hf
-       }
-}
-
-func TestDynamicTableAt(t *testing.T) {
-       d := NewDecoder(4096, nil)
-       at := d.mustAt
-       if got, want := at(2), (pair(":method", "GET")); got != want {
-               t.Errorf("at(2) = %v; want %v", got, want)
-       }
-       d.dynTab.add(pair("foo", "bar"))
-       d.dynTab.add(pair("blake", "miz"))
-       if got, want := at(staticTable.len()+1), (pair("blake", "miz")); got != want {
-               t.Errorf("at(dyn 1) = %v; want %v", got, want)
-       }
-       if got, want := at(staticTable.len()+2), (pair("foo", "bar")); got != want {
-               t.Errorf("at(dyn 2) = %v; want %v", got, want)
-       }
-       if got, want := at(3), (pair(":method", "POST")); got != want {
-               t.Errorf("at(3) = %v; want %v", got, want)
-       }
-}
-
-func TestDynamicTableSizeEvict(t *testing.T) {
-       d := NewDecoder(4096, nil)
-       if want := uint32(0); d.dynTab.size != want {
-               t.Fatalf("size = %d; want %d", d.dynTab.size, want)
-       }
-       add := d.dynTab.add
-       add(pair("blake", "eats pizza"))
-       if want := uint32(15 + 32); d.dynTab.size != want {
-               t.Fatalf("after pizza, size = %d; want %d", d.dynTab.size, want)
-       }
-       add(pair("foo", "bar"))
-       if want := uint32(15 + 32 + 6 + 32); d.dynTab.size != want {
-               t.Fatalf("after foo bar, size = %d; want %d", d.dynTab.size, want)
-       }
-       d.dynTab.setMaxSize(15 + 32 + 1 /* slop */)
-       if want := uint32(6 + 32); d.dynTab.size != want {
-               t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want)
-       }
-       if got, want := d.mustAt(staticTable.len()+1), (pair("foo", "bar")); got != want {
-               t.Errorf("at(dyn 1) = %v; want %v", got, want)
-       }
-       add(pair("long", strings.Repeat("x", 500)))
-       if want := uint32(0); d.dynTab.size != want {
-               t.Fatalf("after big one, size = %d; want %d", d.dynTab.size, want)
-       }
-}
-
-func TestDecoderDecode(t *testing.T) {
-       tests := []struct {
-               name       string
-               in         []byte
-               want       []HeaderField
-               wantDynTab []HeaderField // newest entry first
-       }{
-               // C.2.1 Literal Header Field with Indexing
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.1
-               {"C.2.1", dehex("400a 6375 7374 6f6d 2d6b 6579 0d63 7573 746f 6d2d 6865 6164 6572"),
-                       []HeaderField{pair("custom-key", "custom-header")},
-                       []HeaderField{pair("custom-key", "custom-header")},
-               },
-
-               // C.2.2 Literal Header Field without Indexing
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.2
-               {"C.2.2", dehex("040c 2f73 616d 706c 652f 7061 7468"),
-                       []HeaderField{pair(":path", "/sample/path")},
-                       []HeaderField{}},
-
-               // C.2.3 Literal Header Field never Indexed
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.3
-               {"C.2.3", dehex("1008 7061 7373 776f 7264 0673 6563 7265 74"),
-                       []HeaderField{{"password", "secret", true}},
-                       []HeaderField{}},
-
-               // C.2.4 Indexed Header Field
-               // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.4
-               {"C.2.4", []byte("\x82"),
-                       []HeaderField{pair(":method", "GET")},
-                       []HeaderField{}},
-       }
-       for _, tt := range tests {
-               d := NewDecoder(4096, nil)
-               hf, err := d.DecodeFull(tt.in)
-               if err != nil {
-                       t.Errorf("%s: %v", tt.name, err)
-                       continue
-               }
-               if !reflect.DeepEqual(hf, tt.want) {
-                       t.Errorf("%s: Got %v; want %v", tt.name, hf, tt.want)
-               }
-               gotDynTab := d.dynTab.reverseCopy()
-               if !reflect.DeepEqual(gotDynTab, tt.wantDynTab) {
-                       t.Errorf("%s: dynamic table after = %v; want %v", tt.name, gotDynTab, tt.wantDynTab)
-               }
-       }
-}
-
-func (dt *dynamicTable) reverseCopy() (hf []HeaderField) {
-       hf = make([]HeaderField, len(dt.table.ents))
-       for i := range hf {
-               hf[i] = dt.table.ents[len(dt.table.ents)-1-i]
-       }
-       return
-}
-
-type encAndWant struct {
-       enc         []byte
-       want        []HeaderField
-       wantDynTab  []HeaderField
-       wantDynSize uint32
-}
-
-// C.3 Request Examples without Huffman Coding
-// http://http2.github.io/http2-spec/compression.html#rfc.section.C.3
-func TestDecodeC3_NoHuffman(t *testing.T) {
-       testDecodeSeries(t, 4096, []encAndWant{
-               {dehex("8286 8441 0f77 7777 2e65 7861 6d70 6c65 2e63 6f6d"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "http"),
-                               pair(":path", "/"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       []HeaderField{
-                               pair(":authority", "www.example.com"),
-                       },
-                       57,
-               },
-               {dehex("8286 84be 5808 6e6f 2d63 6163 6865"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "http"),
-                               pair(":path", "/"),
-                               pair(":authority", "www.example.com"),
-                               pair("cache-control", "no-cache"),
-                       },
-                       []HeaderField{
-                               pair("cache-control", "no-cache"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       110,
-               },
-               {dehex("8287 85bf 400a 6375 7374 6f6d 2d6b 6579 0c63 7573 746f 6d2d 7661 6c75 65"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "https"),
-                               pair(":path", "/index.html"),
-                               pair(":authority", "www.example.com"),
-                               pair("custom-key", "custom-value"),
-                       },
-                       []HeaderField{
-                               pair("custom-key", "custom-value"),
-                               pair("cache-control", "no-cache"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       164,
-               },
-       })
-}
-
-// C.4 Request Examples with Huffman Coding
-// http://http2.github.io/http2-spec/compression.html#rfc.section.C.4
-func TestDecodeC4_Huffman(t *testing.T) {
-       testDecodeSeries(t, 4096, []encAndWant{
-               {dehex("8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 ff"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "http"),
-                               pair(":path", "/"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       []HeaderField{
-                               pair(":authority", "www.example.com"),
-                       },
-                       57,
-               },
-               {dehex("8286 84be 5886 a8eb 1064 9cbf"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "http"),
-                               pair(":path", "/"),
-                               pair(":authority", "www.example.com"),
-                               pair("cache-control", "no-cache"),
-                       },
-                       []HeaderField{
-                               pair("cache-control", "no-cache"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       110,
-               },
-               {dehex("8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 a849 e95b b8e8 b4bf"),
-                       []HeaderField{
-                               pair(":method", "GET"),
-                               pair(":scheme", "https"),
-                               pair(":path", "/index.html"),
-                               pair(":authority", "www.example.com"),
-                               pair("custom-key", "custom-value"),
-                       },
-                       []HeaderField{
-                               pair("custom-key", "custom-value"),
-                               pair("cache-control", "no-cache"),
-                               pair(":authority", "www.example.com"),
-                       },
-                       164,
-               },
-       })
-}
-
-// http://http2.github.io/http2-spec/compression.html#rfc.section.C.5
-// "This section shows several consecutive header lists, corresponding
-// to HTTP responses, on the same connection. The HTTP/2 setting
-// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256
-// octets, causing some evictions to occur."
-func TestDecodeC5_ResponsesNoHuff(t *testing.T) {
-       testDecodeSeries(t, 256, []encAndWant{
-               {dehex(`
-4803 3330 3258 0770 7269 7661 7465 611d
-4d6f 6e2c 2032 3120 4f63 7420 3230 3133
-2032 303a 3133 3a32 3120 474d 546e 1768
-7474 7073 3a2f 2f77 7777 2e65 7861 6d70
-6c65 2e63 6f6d
-`),
-                       []HeaderField{
-                               pair(":status", "302"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("location", "https://www.example.com"),
-                       },
-                       []HeaderField{
-                               pair("location", "https://www.example.com"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("cache-control", "private"),
-                               pair(":status", "302"),
-                       },
-                       222,
-               },
-               {dehex("4803 3330 37c1 c0bf"),
-                       []HeaderField{
-                               pair(":status", "307"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("location", "https://www.example.com"),
-                       },
-                       []HeaderField{
-                               pair(":status", "307"),
-                               pair("location", "https://www.example.com"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("cache-control", "private"),
-                       },
-                       222,
-               },
-               {dehex(`
-88c1 611d 4d6f 6e2c 2032 3120 4f63 7420
-3230 3133 2032 303a 3133 3a32 3220 474d
-54c0 5a04 677a 6970 7738 666f 6f3d 4153
-444a 4b48 514b 425a 584f 5157 454f 5049
-5541 5851 5745 4f49 553b 206d 6178 2d61
-6765 3d33 3630 303b 2076 6572 7369 6f6e
-3d31
-`),
-                       []HeaderField{
-                               pair(":status", "200"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
-                               pair("location", "https://www.example.com"),
-                               pair("content-encoding", "gzip"),
-                               pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"),
-                       },
-                       []HeaderField{
-                               pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"),
-                               pair("content-encoding", "gzip"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
-                       },
-                       215,
-               },
-       })
-}
-
-// http://http2.github.io/http2-spec/compression.html#rfc.section.C.6
-// "This section shows the same examples as the previous section, but
-// using Huffman encoding for the literal values. The HTTP/2 setting
-// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256
-// octets, causing some evictions to occur. The eviction mechanism
-// uses the length of the decoded literal values, so the same
-// evictions occurs as in the previous section."
-func TestDecodeC6_ResponsesHuffman(t *testing.T) {
-       testDecodeSeries(t, 256, []encAndWant{
-               {dehex(`
-4882 6402 5885 aec3 771a 4b61 96d0 7abe
-9410 54d4 44a8 2005 9504 0b81 66e0 82a6
-2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8
-e9ae 82ae 43d3
-`),
-                       []HeaderField{
-                               pair(":status", "302"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("location", "https://www.example.com"),
-                       },
-                       []HeaderField{
-                               pair("location", "https://www.example.com"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("cache-control", "private"),
-                               pair(":status", "302"),
-                       },
-                       222,
-               },
-               {dehex("4883 640e ffc1 c0bf"),
-                       []HeaderField{
-                               pair(":status", "307"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("location", "https://www.example.com"),
-                       },
-                       []HeaderField{
-                               pair(":status", "307"),
-                               pair("location", "https://www.example.com"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
-                               pair("cache-control", "private"),
-                       },
-                       222,
-               },
-               {dehex(`
-88c1 6196 d07a be94 1054 d444 a820 0595
-040b 8166 e084 a62d 1bff c05a 839b d9ab
-77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b
-3960 d5af 2708 7f36 72c1 ab27 0fb5 291f
-9587 3160 65c0 03ed 4ee5 b106 3d50 07
-`),
-                       []HeaderField{
-                               pair(":status", "200"),
-                               pair("cache-control", "private"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
-                               pair("location", "https://www.example.com"),
-                               pair("content-encoding", "gzip"),
-                               pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"),
-                       },
-                       []HeaderField{
-                               pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"),
-                               pair("content-encoding", "gzip"),
-                               pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
-                       },
-                       215,
-               },
-       })
-}
-
-func testDecodeSeries(t *testing.T, size uint32, steps []encAndWant) {
-       d := NewDecoder(size, nil)
-       for i, step := range steps {
-               hf, err := d.DecodeFull(step.enc)
-               if err != nil {
-                       t.Fatalf("Error at step index %d: %v", i, err)
-               }
-               if !reflect.DeepEqual(hf, step.want) {
-                       t.Fatalf("At step index %d: Got headers %v; want %v", i, hf, step.want)
-               }
-               gotDynTab := d.dynTab.reverseCopy()
-               if !reflect.DeepEqual(gotDynTab, step.wantDynTab) {
-                       t.Errorf("After step index %d, dynamic table = %v; want %v", i, gotDynTab, step.wantDynTab)
-               }
-               if d.dynTab.size != step.wantDynSize {
-                       t.Errorf("After step index %d, dynamic table size = %v; want %v", i, d.dynTab.size, step.wantDynSize)
-               }
-       }
-}
-
-func TestHuffmanDecodeExcessPadding(t *testing.T) {
-       tests := [][]byte{
-               {0xff},                                   // Padding Exceeds 7 bits
-               {0x1f, 0xff},                             // {"a", 1 byte excess padding}
-               {0x1f, 0xff, 0xff},                       // {"a", 2 byte excess padding}
-               {0x1f, 0xff, 0xff, 0xff},                 // {"a", 3 byte excess padding}
-               {0xff, 0x9f, 0xff, 0xff, 0xff},           // {"a", 29 bit excess padding}
-               {'R', 0xbc, '0', 0xff, 0xff, 0xff, 0xff}, // Padding ends on partial symbol.
-       }
-       for i, in := range tests {
-               var buf bytes.Buffer
-               if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman {
-                       t.Errorf("test-%d: decode(%q) = %v; want ErrInvalidHuffman", i, in, err)
-               }
-       }
-}
-
-func TestHuffmanDecodeEOS(t *testing.T) {
-       in := []byte{0xff, 0xff, 0xff, 0xff, 0xfc} // {EOS, "?"}
-       var buf bytes.Buffer
-       if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman {
-               t.Errorf("error = %v; want ErrInvalidHuffman", err)
-       }
-}
-
-func TestHuffmanDecodeMaxLengthOnTrailingByte(t *testing.T) {
-       in := []byte{0x00, 0x01} // {"0", "0", "0"}
-       var buf bytes.Buffer
-       if err := huffmanDecode(&buf, 2, in); err != ErrStringLength {
-               t.Errorf("error = %v; want ErrStringLength", err)
-       }
-}
-
-func TestHuffmanDecodeCorruptPadding(t *testing.T) {
-       in := []byte{0x00}
-       var buf bytes.Buffer
-       if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman {
-               t.Errorf("error = %v; want ErrInvalidHuffman", err)
-       }
-}
-
-func TestHuffmanDecode(t *testing.T) {
-       tests := []struct {
-               inHex, want string
-       }{
-               {"f1e3 c2e5 f23a 6ba0 ab90 f4ff", "www.example.com"},
-               {"a8eb 1064 9cbf", "no-cache"},
-               {"25a8 49e9 5ba9 7d7f", "custom-key"},
-               {"25a8 49e9 5bb8 e8b4 bf", "custom-value"},
-               {"6402", "302"},
-               {"aec3 771a 4b", "private"},
-               {"d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff", "Mon, 21 Oct 2013 20:13:21 GMT"},
-               {"9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3", "https://www.example.com"},
-               {"9bd9 ab", "gzip"},
-               {"94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07",
-                       "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"},
-       }
-       for i, tt := range tests {
-               var buf bytes.Buffer
-               in, err := hex.DecodeString(strings.Replace(tt.inHex, " ", "", -1))
-               if err != nil {
-                       t.Errorf("%d. hex input error: %v", i, err)
-                       continue
-               }
-               if _, err := HuffmanDecode(&buf, in); err != nil {
-                       t.Errorf("%d. decode error: %v", i, err)
-                       continue
-               }
-               if got := buf.String(); tt.want != got {
-                       t.Errorf("%d. decode = %q; want %q", i, got, tt.want)
-               }
-       }
-}
-
-func BenchmarkHuffmanDecode(b *testing.B) {
-       b.StopTimer()
-       enc, err := hex.DecodeString(strings.Replace("94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07",
-               " ", "", -1))
-       if err != nil {
-               b.Fatal(err)
-       }
-       b.ReportAllocs()
-       b.StartTimer()
-       var buf bytes.Buffer
-       for i := 0; i < b.N; i++ {
-               buf.Reset()
-               if _, err := HuffmanDecode(&buf, enc); err != nil {
-                       b.Fatalf("decode error: %v", err)
-               }
-               if string(buf.Bytes()) != "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" {
-                       b.Fatalf("bogus output %q", buf.Bytes())
-               }
-       }
-}
-
-func TestAppendHuffmanString(t *testing.T) {
-       tests := []struct {
-               in, want string
-       }{
-               {"www.example.com", "f1e3 c2e5 f23a 6ba0 ab90 f4ff"},
-               {"no-cache", "a8eb 1064 9cbf"},
-               {"custom-key", "25a8 49e9 5ba9 7d7f"},
-               {"custom-value", "25a8 49e9 5bb8 e8b4 bf"},
-               {"302", "6402"},
-               {"private", "aec3 771a 4b"},
-               {"Mon, 21 Oct 2013 20:13:21 GMT", "d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff"},
-               {"https://www.example.com", "9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3"},
-               {"gzip", "9bd9 ab"},
-               {"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1",
-                       "94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07"},
-       }
-       for i, tt := range tests {
-               buf := []byte{}
-               want := strings.Replace(tt.want, " ", "", -1)
-               buf = AppendHuffmanString(buf, tt.in)
-               if got := hex.EncodeToString(buf); want != got {
-                       t.Errorf("%d. encode = %q; want %q", i, got, want)
-               }
-       }
-}
-
-func TestHuffmanMaxStrLen(t *testing.T) {
-       const msg = "Some string"
-       huff := AppendHuffmanString(nil, msg)
-
-       testGood := func(max int) {
-               var out bytes.Buffer
-               if err := huffmanDecode(&out, max, huff); err != nil {
-                       t.Errorf("For maxLen=%d, unexpected error: %v", max, err)
-               }
-               if out.String() != msg {
-                       t.Errorf("For maxLen=%d, out = %q; want %q", max, out.String(), msg)
-               }
-       }
-       testGood(0)
-       testGood(len(msg))
-       testGood(len(msg) + 1)
-
-       var out bytes.Buffer
-       if err := huffmanDecode(&out, len(msg)-1, huff); err != ErrStringLength {
-               t.Errorf("err = %v; want ErrStringLength", err)
-       }
-}
-
-func TestHuffmanRoundtripStress(t *testing.T) {
-       const Len = 50 // of uncompressed string
-       input := make([]byte, Len)
-       var output bytes.Buffer
-       var huff []byte
-
-       n := 5000
-       if testing.Short() {
-               n = 100
-       }
-       seed := time.Now().UnixNano()
-       t.Logf("Seed = %v", seed)
-       src := rand.New(rand.NewSource(seed))
-       var encSize int64
-       for i := 0; i < n; i++ {
-               for l := range input {
-                       input[l] = byte(src.Intn(256))
-               }
-               huff = AppendHuffmanString(huff[:0], string(input))
-               encSize += int64(len(huff))
-               output.Reset()
-               if err := huffmanDecode(&output, 0, huff); err != nil {
-                       t.Errorf("Failed to decode %q -> %q -> error %v", input, huff, err)
-                       continue
-               }
-               if !bytes.Equal(output.Bytes(), input) {
-                       t.Errorf("Roundtrip failure on %q -> %q -> %q", input, huff, output.Bytes())
-               }
-       }
-       t.Logf("Compressed size of original: %0.02f%% (%v -> %v)", 100*(float64(encSize)/(Len*float64(n))), Len*n, encSize)
-}
-
-func TestHuffmanDecodeFuzz(t *testing.T) {
-       const Len = 50 // of compressed
-       var buf, zbuf bytes.Buffer
-
-       n := 5000
-       if testing.Short() {
-               n = 100
-       }
-       seed := time.Now().UnixNano()
-       t.Logf("Seed = %v", seed)
-       src := rand.New(rand.NewSource(seed))
-       numFail := 0
-       for i := 0; i < n; i++ {
-               zbuf.Reset()
-               if i == 0 {
-                       // Start with at least one invalid one.
-                       zbuf.WriteString("00\x91\xff\xff\xff\xff\xc8")
-               } else {
-                       for l := 0; l < Len; l++ {
-                               zbuf.WriteByte(byte(src.Intn(256)))
-                       }
-               }
-
-               buf.Reset()
-               if err := huffmanDecode(&buf, 0, zbuf.Bytes()); err != nil {
-                       if err == ErrInvalidHuffman {
-                               numFail++
-                               continue
-                       }
-                       t.Errorf("Failed to decode %q: %v", zbuf.Bytes(), err)
-                       continue
-               }
-       }
-       t.Logf("%0.02f%% are invalid (%d / %d)", 100*float64(numFail)/float64(n), numFail, n)
-       if numFail < 1 {
-               t.Error("expected at least one invalid huffman encoding (test starts with one)")
-       }
-}
-
-func TestReadVarInt(t *testing.T) {
-       type res struct {
-               i        uint64
-               consumed int
-               err      error
-       }
-       tests := []struct {
-               n    byte
-               p    []byte
-               want res
-       }{
-               // Fits in a byte:
-               {1, []byte{0}, res{0, 1, nil}},
-               {2, []byte{2}, res{2, 1, nil}},
-               {3, []byte{6}, res{6, 1, nil}},
-               {4, []byte{14}, res{14, 1, nil}},
-               {5, []byte{30}, res{30, 1, nil}},
-               {6, []byte{62}, res{62, 1, nil}},
-               {7, []byte{126}, res{126, 1, nil}},
-               {8, []byte{254}, res{254, 1, nil}},
-
-               // Doesn't fit in a byte:
-               {1, []byte{1}, res{0, 0, errNeedMore}},
-               {2, []byte{3}, res{0, 0, errNeedMore}},
-               {3, []byte{7}, res{0, 0, errNeedMore}},
-               {4, []byte{15}, res{0, 0, errNeedMore}},
-               {5, []byte{31}, res{0, 0, errNeedMore}},
-               {6, []byte{63}, res{0, 0, errNeedMore}},
-               {7, []byte{127}, res{0, 0, errNeedMore}},
-               {8, []byte{255}, res{0, 0, errNeedMore}},
-
-               // Ignoring top bits:
-               {5, []byte{255, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 111
-               {5, []byte{159, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 100
-               {5, []byte{191, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 101
-
-               // Extra byte:
-               {5, []byte{191, 154, 10, 2}, res{1337, 3, nil}}, // extra byte
-
-               // Short a byte:
-               {5, []byte{191, 154}, res{0, 0, errNeedMore}},
-
-               // integer overflow:
-               {1, []byte{255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, res{0, 0, errVarintOverflow}},
-       }
-       for _, tt := range tests {
-               i, remain, err := readVarInt(tt.n, tt.p)
-               consumed := len(tt.p) - len(remain)
-               got := res{i, consumed, err}
-               if got != tt.want {
-                       t.Errorf("readVarInt(%d, %v ~ %x) = %+v; want %+v", tt.n, tt.p, tt.p, got, tt.want)
-               }
-       }
-}
-
-// Fuzz crash, originally reported at https://github.com/bradfitz/http2/issues/56
-func TestHuffmanFuzzCrash(t *testing.T) {
-       got, err := HuffmanDecodeToString([]byte("00\x91\xff\xff\xff\xff\xc8"))
-       if got != "" {
-               t.Errorf("Got %q; want empty string", got)
-       }
-       if err != ErrInvalidHuffman {
-               t.Errorf("Err = %v; want ErrInvalidHuffman", err)
-       }
-}
-
-func pair(name, value string) HeaderField {
-       return HeaderField{Name: name, Value: value}
-}
-
-func dehex(s string) []byte {
-       s = strings.Replace(s, " ", "", -1)
-       s = strings.Replace(s, "\n", "", -1)
-       b, err := hex.DecodeString(s)
-       if err != nil {
-               panic(err)
-       }
-       return b
-}
-
-func TestEmitEnabled(t *testing.T) {
-       var buf bytes.Buffer
-       enc := NewEncoder(&buf)
-       enc.WriteField(HeaderField{Name: "foo", Value: "bar"})
-       enc.WriteField(HeaderField{Name: "foo", Value: "bar"})
-
-       numCallback := 0
-       var dec *Decoder
-       dec = NewDecoder(8<<20, func(HeaderField) {
-               numCallback++
-               dec.SetEmitEnabled(false)
-       })
-       if !dec.EmitEnabled() {
-               t.Errorf("initial emit enabled = false; want true")
-       }
-       if _, err := dec.Write(buf.Bytes()); err != nil {
-               t.Error(err)
-       }
-       if numCallback != 1 {
-               t.Errorf("num callbacks = %d; want 1", numCallback)
-       }
-       if dec.EmitEnabled() {
-               t.Errorf("emit enabled = true; want false")
-       }
-}
-
-func TestSaveBufLimit(t *testing.T) {
-       const maxStr = 1 << 10
-       var got []HeaderField
-       dec := NewDecoder(initialHeaderTableSize, func(hf HeaderField) {
-               got = append(got, hf)
-       })
-       dec.SetMaxStringLength(maxStr)
-       var frag []byte
-       frag = append(frag[:0], encodeTypeByte(false, false))
-       frag = appendVarInt(frag, 7, 3)
-       frag = append(frag, "foo"...)
-       frag = appendVarInt(frag, 7, 3)
-       frag = append(frag, "bar"...)
-
-       if _, err := dec.Write(frag); err != nil {
-               t.Fatal(err)
-       }
-
-       want := []HeaderField{{Name: "foo", Value: "bar"}}
-       if !reflect.DeepEqual(got, want) {
-               t.Errorf("After small writes, got %v; want %v", got, want)
-       }
-
-       frag = append(frag[:0], encodeTypeByte(false, false))
-       frag = appendVarInt(frag, 7, maxStr*3)
-       frag = append(frag, make([]byte, maxStr*3)...)
-
-       _, err := dec.Write(frag)
-       if err != ErrStringLength {
-               t.Fatalf("Write error = %v; want ErrStringLength", err)
-       }
-}
-
-func TestDynamicSizeUpdate(t *testing.T) {
-       var buf bytes.Buffer
-       enc := NewEncoder(&buf)
-       enc.SetMaxDynamicTableSize(255)
-       enc.WriteField(HeaderField{Name: "foo", Value: "bar"})
-
-       d := NewDecoder(4096, func(_ HeaderField) {})
-       _, err := d.Write(buf.Bytes())
-       if err != nil {
-               t.Fatalf("unexpected error: got = %v", err)
-       }
-
-       d.Close()
-
-       // Start a new header
-       _, err = d.Write(buf.Bytes())
-       if err != nil {
-               t.Fatalf("unexpected error: got = %v", err)
-       }
-
-       // must fail since the dynamic table update must be at the beginning
-       _, err = d.Write(buf.Bytes())
-       if err == nil {
-               t.Fatalf("dynamic table size update not at the beginning of a header block")
-       }
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/huffman.go b/libgo/go/internal/x/net/http2/hpack/huffman.go
deleted file mode 100644 (file)
index b412a96..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "bytes"
-       "errors"
-       "io"
-       "sync"
-)
-
-var bufPool = sync.Pool{
-       New: func() interface{} { return new(bytes.Buffer) },
-}
-
-// HuffmanDecode decodes the string in v and writes the expanded
-// result to w, returning the number of bytes written to w and the
-// Write call's return value. At most one Write call is made.
-func HuffmanDecode(w io.Writer, v []byte) (int, error) {
-       buf := bufPool.Get().(*bytes.Buffer)
-       buf.Reset()
-       defer bufPool.Put(buf)
-       if err := huffmanDecode(buf, 0, v); err != nil {
-               return 0, err
-       }
-       return w.Write(buf.Bytes())
-}
-
-// HuffmanDecodeToString decodes the string in v.
-func HuffmanDecodeToString(v []byte) (string, error) {
-       buf := bufPool.Get().(*bytes.Buffer)
-       buf.Reset()
-       defer bufPool.Put(buf)
-       if err := huffmanDecode(buf, 0, v); err != nil {
-               return "", err
-       }
-       return buf.String(), nil
-}
-
-// ErrInvalidHuffman is returned for errors found decoding
-// Huffman-encoded strings.
-var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data")
-
-// huffmanDecode decodes v to buf.
-// If maxLen is greater than 0, attempts to write more to buf than
-// maxLen bytes will return ErrStringLength.
-func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
-       rootHuffmanNode := getRootHuffmanNode()
-       n := rootHuffmanNode
-       // cur is the bit buffer that has not been fed into n.
-       // cbits is the number of low order bits in cur that are valid.
-       // sbits is the number of bits of the symbol prefix being decoded.
-       cur, cbits, sbits := uint(0), uint8(0), uint8(0)
-       for _, b := range v {
-               cur = cur<<8 | uint(b)
-               cbits += 8
-               sbits += 8
-               for cbits >= 8 {
-                       idx := byte(cur >> (cbits - 8))
-                       n = n.children[idx]
-                       if n == nil {
-                               return ErrInvalidHuffman
-                       }
-                       if n.children == nil {
-                               if maxLen != 0 && buf.Len() == maxLen {
-                                       return ErrStringLength
-                               }
-                               buf.WriteByte(n.sym)
-                               cbits -= n.codeLen
-                               n = rootHuffmanNode
-                               sbits = cbits
-                       } else {
-                               cbits -= 8
-                       }
-               }
-       }
-       for cbits > 0 {
-               n = n.children[byte(cur<<(8-cbits))]
-               if n == nil {
-                       return ErrInvalidHuffman
-               }
-               if n.children != nil || n.codeLen > cbits {
-                       break
-               }
-               if maxLen != 0 && buf.Len() == maxLen {
-                       return ErrStringLength
-               }
-               buf.WriteByte(n.sym)
-               cbits -= n.codeLen
-               n = rootHuffmanNode
-               sbits = cbits
-       }
-       if sbits > 7 {
-               // Either there was an incomplete symbol, or overlong padding.
-               // Both are decoding errors per RFC 7541 section 5.2.
-               return ErrInvalidHuffman
-       }
-       if mask := uint(1<<cbits - 1); cur&mask != mask {
-               // Trailing bits must be a prefix of EOS per RFC 7541 section 5.2.
-               return ErrInvalidHuffman
-       }
-
-       return nil
-}
-
-type node struct {
-       // children is non-nil for internal nodes
-       children *[256]*node
-
-       // The following are only valid if children is nil:
-       codeLen uint8 // number of bits that led to the output of sym
-       sym     byte  // output symbol
-}
-
-func newInternalNode() *node {
-       return &node{children: new([256]*node)}
-}
-
-var (
-       buildRootOnce       sync.Once
-       lazyRootHuffmanNode *node
-)
-
-func getRootHuffmanNode() *node {
-       buildRootOnce.Do(buildRootHuffmanNode)
-       return lazyRootHuffmanNode
-}
-
-func buildRootHuffmanNode() {
-       if len(huffmanCodes) != 256 {
-               panic("unexpected size")
-       }
-       lazyRootHuffmanNode = newInternalNode()
-       for i, code := range huffmanCodes {
-               addDecoderNode(byte(i), code, huffmanCodeLen[i])
-       }
-}
-
-func addDecoderNode(sym byte, code uint32, codeLen uint8) {
-       cur := lazyRootHuffmanNode
-       for codeLen > 8 {
-               codeLen -= 8
-               i := uint8(code >> codeLen)
-               if cur.children[i] == nil {
-                       cur.children[i] = newInternalNode()
-               }
-               cur = cur.children[i]
-       }
-       shift := 8 - codeLen
-       start, end := int(uint8(code<<shift)), int(1<<shift)
-       for i := start; i < start+end; i++ {
-               cur.children[i] = &node{sym: sym, codeLen: codeLen}
-       }
-}
-
-// AppendHuffmanString appends s, as encoded in Huffman codes, to dst
-// and returns the extended buffer.
-func AppendHuffmanString(dst []byte, s string) []byte {
-       rembits := uint8(8)
-
-       for i := 0; i < len(s); i++ {
-               if rembits == 8 {
-                       dst = append(dst, 0)
-               }
-               dst, rembits = appendByteToHuffmanCode(dst, rembits, s[i])
-       }
-
-       if rembits < 8 {
-               // special EOS symbol
-               code := uint32(0x3fffffff)
-               nbits := uint8(30)
-
-               t := uint8(code >> (nbits - rembits))
-               dst[len(dst)-1] |= t
-       }
-
-       return dst
-}
-
-// HuffmanEncodeLength returns the number of bytes required to encode
-// s in Huffman codes. The result is round up to byte boundary.
-func HuffmanEncodeLength(s string) uint64 {
-       n := uint64(0)
-       for i := 0; i < len(s); i++ {
-               n += uint64(huffmanCodeLen[s[i]])
-       }
-       return (n + 7) / 8
-}
-
-// appendByteToHuffmanCode appends Huffman code for c to dst and
-// returns the extended buffer and the remaining bits in the last
-// element. The appending is not byte aligned and the remaining bits
-// in the last element of dst is given in rembits.
-func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) {
-       code := huffmanCodes[c]
-       nbits := huffmanCodeLen[c]
-
-       for {
-               if rembits > nbits {
-                       t := uint8(code << (rembits - nbits))
-                       dst[len(dst)-1] |= t
-                       rembits -= nbits
-                       break
-               }
-
-               t := uint8(code >> (nbits - rembits))
-               dst[len(dst)-1] |= t
-
-               nbits -= rembits
-               rembits = 8
-
-               if nbits == 0 {
-                       break
-               }
-
-               dst = append(dst, 0)
-       }
-
-       return dst, rembits
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/tables.go b/libgo/go/internal/x/net/http2/hpack/tables.go
deleted file mode 100644 (file)
index a66cfbe..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "fmt"
-)
-
-// headerFieldTable implements a list of HeaderFields.
-// This is used to implement the static and dynamic tables.
-type headerFieldTable struct {
-       // For static tables, entries are never evicted.
-       //
-       // For dynamic tables, entries are evicted from ents[0] and added to the end.
-       // Each entry has a unique id that starts at one and increments for each
-       // entry that is added. This unique id is stable across evictions, meaning
-       // it can be used as a pointer to a specific entry. As in hpack, unique ids
-       // are 1-based. The unique id for ents[k] is k + evictCount + 1.
-       //
-       // Zero is not a valid unique id.
-       //
-       // evictCount should not overflow in any remotely practical situation. In
-       // practice, we will have one dynamic table per HTTP/2 connection. If we
-       // assume a very powerful server that handles 1M QPS per connection and each
-       // request adds (then evicts) 100 entries from the table, it would still take
-       // 2M years for evictCount to overflow.
-       ents       []HeaderField
-       evictCount uint64
-
-       // byName maps a HeaderField name to the unique id of the newest entry with
-       // the same name. See above for a definition of "unique id".
-       byName map[string]uint64
-
-       // byNameValue maps a HeaderField name/value pair to the unique id of the newest
-       // entry with the same name and value. See above for a definition of "unique id".
-       byNameValue map[pairNameValue]uint64
-}
-
-type pairNameValue struct {
-       name, value string
-}
-
-func (t *headerFieldTable) init() {
-       t.byName = make(map[string]uint64)
-       t.byNameValue = make(map[pairNameValue]uint64)
-}
-
-// len reports the number of entries in the table.
-func (t *headerFieldTable) len() int {
-       return len(t.ents)
-}
-
-// addEntry adds a new entry.
-func (t *headerFieldTable) addEntry(f HeaderField) {
-       id := uint64(t.len()) + t.evictCount + 1
-       t.byName[f.Name] = id
-       t.byNameValue[pairNameValue{f.Name, f.Value}] = id
-       t.ents = append(t.ents, f)
-}
-
-// evictOldest evicts the n oldest entries in the table.
-func (t *headerFieldTable) evictOldest(n int) {
-       if n > t.len() {
-               panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len()))
-       }
-       for k := 0; k < n; k++ {
-               f := t.ents[k]
-               id := t.evictCount + uint64(k) + 1
-               if t.byName[f.Name] == id {
-                       delete(t.byName, f.Name)
-               }
-               if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id {
-                       delete(t.byNameValue, p)
-               }
-       }
-       copy(t.ents, t.ents[n:])
-       for k := t.len() - n; k < t.len(); k++ {
-               t.ents[k] = HeaderField{} // so strings can be garbage collected
-       }
-       t.ents = t.ents[:t.len()-n]
-       if t.evictCount+uint64(n) < t.evictCount {
-               panic("evictCount overflow")
-       }
-       t.evictCount += uint64(n)
-}
-
-// search finds f in the table. If there is no match, i is 0.
-// If both name and value match, i is the matched index and nameValueMatch
-// becomes true. If only name matches, i points to that index and
-// nameValueMatch becomes false.
-//
-// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says
-// that index 1 should be the newest entry, but t.ents[0] is the oldest entry,
-// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic
-// table, the return value i actually refers to the entry t.ents[t.len()-i].
-//
-// All tables are assumed to be a dynamic tables except for the global
-// staticTable pointer.
-//
-// See Section 2.3.3.
-func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) {
-       if !f.Sensitive {
-               if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 {
-                       return t.idToIndex(id), true
-               }
-       }
-       if id := t.byName[f.Name]; id != 0 {
-               return t.idToIndex(id), false
-       }
-       return 0, false
-}
-
-// idToIndex converts a unique id to an HPACK index.
-// See Section 2.3.3.
-func (t *headerFieldTable) idToIndex(id uint64) uint64 {
-       if id <= t.evictCount {
-               panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount))
-       }
-       k := id - t.evictCount - 1 // convert id to an index t.ents[k]
-       if t != staticTable {
-               return uint64(t.len()) - k // dynamic table
-       }
-       return k + 1
-}
-
-// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B
-var staticTable = newStaticTable()
-var staticTableEntries = [...]HeaderField{
-       {Name: ":authority"},
-       {Name: ":method", Value: "GET"},
-       {Name: ":method", Value: "POST"},
-       {Name: ":path", Value: "/"},
-       {Name: ":path", Value: "/index.html"},
-       {Name: ":scheme", Value: "http"},
-       {Name: ":scheme", Value: "https"},
-       {Name: ":status", Value: "200"},
-       {Name: ":status", Value: "204"},
-       {Name: ":status", Value: "206"},
-       {Name: ":status", Value: "304"},
-       {Name: ":status", Value: "400"},
-       {Name: ":status", Value: "404"},
-       {Name: ":status", Value: "500"},
-       {Name: "accept-charset"},
-       {Name: "accept-encoding", Value: "gzip, deflate"},
-       {Name: "accept-language"},
-       {Name: "accept-ranges"},
-       {Name: "accept"},
-       {Name: "access-control-allow-origin"},
-       {Name: "age"},
-       {Name: "allow"},
-       {Name: "authorization"},
-       {Name: "cache-control"},
-       {Name: "content-disposition"},
-       {Name: "content-encoding"},
-       {Name: "content-language"},
-       {Name: "content-length"},
-       {Name: "content-location"},
-       {Name: "content-range"},
-       {Name: "content-type"},
-       {Name: "cookie"},
-       {Name: "date"},
-       {Name: "etag"},
-       {Name: "expect"},
-       {Name: "expires"},
-       {Name: "from"},
-       {Name: "host"},
-       {Name: "if-match"},
-       {Name: "if-modified-since"},
-       {Name: "if-none-match"},
-       {Name: "if-range"},
-       {Name: "if-unmodified-since"},
-       {Name: "last-modified"},
-       {Name: "link"},
-       {Name: "location"},
-       {Name: "max-forwards"},
-       {Name: "proxy-authenticate"},
-       {Name: "proxy-authorization"},
-       {Name: "range"},
-       {Name: "referer"},
-       {Name: "refresh"},
-       {Name: "retry-after"},
-       {Name: "server"},
-       {Name: "set-cookie"},
-       {Name: "strict-transport-security"},
-       {Name: "transfer-encoding"},
-       {Name: "user-agent"},
-       {Name: "vary"},
-       {Name: "via"},
-       {Name: "www-authenticate"},
-}
-
-func newStaticTable() *headerFieldTable {
-       t := &headerFieldTable{}
-       t.init()
-       for _, e := range staticTableEntries[:] {
-               t.addEntry(e)
-       }
-       return t
-}
-
-var huffmanCodes = [256]uint32{
-       0x1ff8,
-       0x7fffd8,
-       0xfffffe2,
-       0xfffffe3,
-       0xfffffe4,
-       0xfffffe5,
-       0xfffffe6,
-       0xfffffe7,
-       0xfffffe8,
-       0xffffea,
-       0x3ffffffc,
-       0xfffffe9,
-       0xfffffea,
-       0x3ffffffd,
-       0xfffffeb,
-       0xfffffec,
-       0xfffffed,
-       0xfffffee,
-       0xfffffef,
-       0xffffff0,
-       0xffffff1,
-       0xffffff2,
-       0x3ffffffe,
-       0xffffff3,
-       0xffffff4,
-       0xffffff5,
-       0xffffff6,
-       0xffffff7,
-       0xffffff8,
-       0xffffff9,
-       0xffffffa,
-       0xffffffb,
-       0x14,
-       0x3f8,
-       0x3f9,
-       0xffa,
-       0x1ff9,
-       0x15,
-       0xf8,
-       0x7fa,
-       0x3fa,
-       0x3fb,
-       0xf9,
-       0x7fb,
-       0xfa,
-       0x16,
-       0x17,
-       0x18,
-       0x0,
-       0x1,
-       0x2,
-       0x19,
-       0x1a,
-       0x1b,
-       0x1c,
-       0x1d,
-       0x1e,
-       0x1f,
-       0x5c,
-       0xfb,
-       0x7ffc,
-       0x20,
-       0xffb,
-       0x3fc,
-       0x1ffa,
-       0x21,
-       0x5d,
-       0x5e,
-       0x5f,
-       0x60,
-       0x61,
-       0x62,
-       0x63,
-       0x64,
-       0x65,
-       0x66,
-       0x67,
-       0x68,
-       0x69,
-       0x6a,
-       0x6b,
-       0x6c,
-       0x6d,
-       0x6e,
-       0x6f,
-       0x70,
-       0x71,
-       0x72,
-       0xfc,
-       0x73,
-       0xfd,
-       0x1ffb,
-       0x7fff0,
-       0x1ffc,
-       0x3ffc,
-       0x22,
-       0x7ffd,
-       0x3,
-       0x23,
-       0x4,
-       0x24,
-       0x5,
-       0x25,
-       0x26,
-       0x27,
-       0x6,
-       0x74,
-       0x75,
-       0x28,
-       0x29,
-       0x2a,
-       0x7,
-       0x2b,
-       0x76,
-       0x2c,
-       0x8,
-       0x9,
-       0x2d,
-       0x77,
-       0x78,
-       0x79,
-       0x7a,
-       0x7b,
-       0x7ffe,
-       0x7fc,
-       0x3ffd,
-       0x1ffd,
-       0xffffffc,
-       0xfffe6,
-       0x3fffd2,
-       0xfffe7,
-       0xfffe8,
-       0x3fffd3,
-       0x3fffd4,
-       0x3fffd5,
-       0x7fffd9,
-       0x3fffd6,
-       0x7fffda,
-       0x7fffdb,
-       0x7fffdc,
-       0x7fffdd,
-       0x7fffde,
-       0xffffeb,
-       0x7fffdf,
-       0xffffec,
-       0xffffed,
-       0x3fffd7,
-       0x7fffe0,
-       0xffffee,
-       0x7fffe1,
-       0x7fffe2,
-       0x7fffe3,
-       0x7fffe4,
-       0x1fffdc,
-       0x3fffd8,
-       0x7fffe5,
-       0x3fffd9,
-       0x7fffe6,
-       0x7fffe7,
-       0xffffef,
-       0x3fffda,
-       0x1fffdd,
-       0xfffe9,
-       0x3fffdb,
-       0x3fffdc,
-       0x7fffe8,
-       0x7fffe9,
-       0x1fffde,
-       0x7fffea,
-       0x3fffdd,
-       0x3fffde,
-       0xfffff0,
-       0x1fffdf,
-       0x3fffdf,
-       0x7fffeb,
-       0x7fffec,
-       0x1fffe0,
-       0x1fffe1,
-       0x3fffe0,
-       0x1fffe2,
-       0x7fffed,
-       0x3fffe1,
-       0x7fffee,
-       0x7fffef,
-       0xfffea,
-       0x3fffe2,
-       0x3fffe3,
-       0x3fffe4,
-       0x7ffff0,
-       0x3fffe5,
-       0x3fffe6,
-       0x7ffff1,
-       0x3ffffe0,
-       0x3ffffe1,
-       0xfffeb,
-       0x7fff1,
-       0x3fffe7,
-       0x7ffff2,
-       0x3fffe8,
-       0x1ffffec,
-       0x3ffffe2,
-       0x3ffffe3,
-       0x3ffffe4,
-       0x7ffffde,
-       0x7ffffdf,
-       0x3ffffe5,
-       0xfffff1,
-       0x1ffffed,
-       0x7fff2,
-       0x1fffe3,
-       0x3ffffe6,
-       0x7ffffe0,
-       0x7ffffe1,
-       0x3ffffe7,
-       0x7ffffe2,
-       0xfffff2,
-       0x1fffe4,
-       0x1fffe5,
-       0x3ffffe8,
-       0x3ffffe9,
-       0xffffffd,
-       0x7ffffe3,
-       0x7ffffe4,
-       0x7ffffe5,
-       0xfffec,
-       0xfffff3,
-       0xfffed,
-       0x1fffe6,
-       0x3fffe9,
-       0x1fffe7,
-       0x1fffe8,
-       0x7ffff3,
-       0x3fffea,
-       0x3fffeb,
-       0x1ffffee,
-       0x1ffffef,
-       0xfffff4,
-       0xfffff5,
-       0x3ffffea,
-       0x7ffff4,
-       0x3ffffeb,
-       0x7ffffe6,
-       0x3ffffec,
-       0x3ffffed,
-       0x7ffffe7,
-       0x7ffffe8,
-       0x7ffffe9,
-       0x7ffffea,
-       0x7ffffeb,
-       0xffffffe,
-       0x7ffffec,
-       0x7ffffed,
-       0x7ffffee,
-       0x7ffffef,
-       0x7fffff0,
-       0x3ffffee,
-}
-
-var huffmanCodeLen = [256]uint8{
-       13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28,
-       28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-       6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6,
-       5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10,
-       13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-       7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6,
-       15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5,
-       6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28,
-       20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23,
-       24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24,
-       22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23,
-       21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23,
-       26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25,
-       19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27,
-       20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23,
-       26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26,
-}
diff --git a/libgo/go/internal/x/net/http2/hpack/tables_test.go b/libgo/go/internal/x/net/http2/hpack/tables_test.go
deleted file mode 100644 (file)
index d963f36..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hpack
-
-import (
-       "bufio"
-       "regexp"
-       "strconv"
-       "strings"
-       "testing"
-)
-
-func TestHeaderFieldTable(t *testing.T) {
-       table := &headerFieldTable{}
-       table.init()
-       table.addEntry(pair("key1", "value1-1"))
-       table.addEntry(pair("key2", "value2-1"))
-       table.addEntry(pair("key1", "value1-2"))
-       table.addEntry(pair("key3", "value3-1"))
-       table.addEntry(pair("key4", "value4-1"))
-       table.addEntry(pair("key2", "value2-2"))
-
-       // Tests will be run twice: once before evicting anything, and
-       // again after evicting the three oldest entries.
-       tests := []struct {
-               f                 HeaderField
-               beforeWantStaticI uint64
-               beforeWantMatch   bool
-               afterWantStaticI  uint64
-               afterWantMatch    bool
-       }{
-               {HeaderField{"key1", "value1-1", false}, 1, true, 0, false},
-               {HeaderField{"key1", "value1-2", false}, 3, true, 0, false},
-               {HeaderField{"key1", "value1-3", false}, 3, false, 0, false},
-               {HeaderField{"key2", "value2-1", false}, 2, true, 3, false},
-               {HeaderField{"key2", "value2-2", false}, 6, true, 3, true},
-               {HeaderField{"key2", "value2-3", false}, 6, false, 3, false},
-               {HeaderField{"key4", "value4-1", false}, 5, true, 2, true},
-               // Name match only, because sensitive.
-               {HeaderField{"key4", "value4-1", true}, 5, false, 2, false},
-               // Key not found.
-               {HeaderField{"key5", "value5-x", false}, 0, false, 0, false},
-       }
-
-       staticToDynamic := func(i uint64) uint64 {
-               if i == 0 {
-                       return 0
-               }
-               return uint64(table.len()) - i + 1 // dynamic is the reversed table
-       }
-
-       searchStatic := func(f HeaderField) (uint64, bool) {
-               old := staticTable
-               staticTable = table
-               defer func() { staticTable = old }()
-               return staticTable.search(f)
-       }
-
-       searchDynamic := func(f HeaderField) (uint64, bool) {
-               return table.search(f)
-       }
-
-       for _, test := range tests {
-               gotI, gotMatch := searchStatic(test.f)
-               if wantI, wantMatch := test.beforeWantStaticI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch {
-                       t.Errorf("before evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch)
-               }
-               gotI, gotMatch = searchDynamic(test.f)
-               wantDynamicI := staticToDynamic(test.beforeWantStaticI)
-               if wantI, wantMatch := wantDynamicI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch {
-                       t.Errorf("before evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch)
-               }
-       }
-
-       table.evictOldest(3)
-
-       for _, test := range tests {
-               gotI, gotMatch := searchStatic(test.f)
-               if wantI, wantMatch := test.afterWantStaticI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch {
-                       t.Errorf("after evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch)
-               }
-               gotI, gotMatch = searchDynamic(test.f)
-               wantDynamicI := staticToDynamic(test.afterWantStaticI)
-               if wantI, wantMatch := wantDynamicI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch {
-                       t.Errorf("after evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch)
-               }
-       }
-}
-
-func TestHeaderFieldTable_LookupMapEviction(t *testing.T) {
-       table := &headerFieldTable{}
-       table.init()
-       table.addEntry(pair("key1", "value1-1"))
-       table.addEntry(pair("key2", "value2-1"))
-       table.addEntry(pair("key1", "value1-2"))
-       table.addEntry(pair("key3", "value3-1"))
-       table.addEntry(pair("key4", "value4-1"))
-       table.addEntry(pair("key2", "value2-2"))
-
-       // evict all pairs
-       table.evictOldest(table.len())
-
-       if l := table.len(); l > 0 {
-               t.Errorf("table.len() = %d, want 0", l)
-       }
-
-       if l := len(table.byName); l > 0 {
-               t.Errorf("len(table.byName) = %d, want 0", l)
-       }
-
-       if l := len(table.byNameValue); l > 0 {
-               t.Errorf("len(table.byNameValue) = %d, want 0", l)
-       }
-}
-
-func TestStaticTable(t *testing.T) {
-       fromSpec := `
-          +-------+-----------------------------+---------------+
-          | 1     | :authority                  |               |
-          | 2     | :method                     | GET           |
-          | 3     | :method                     | POST          |
-          | 4     | :path                       | /             |
-          | 5     | :path                       | /index.html   |
-          | 6     | :scheme                     | http          |
-          | 7     | :scheme                     | https         |
-          | 8     | :status                     | 200           |
-          | 9     | :status                     | 204           |
-          | 10    | :status                     | 206           |
-          | 11    | :status                     | 304           |
-          | 12    | :status                     | 400           |
-          | 13    | :status                     | 404           |
-          | 14    | :status                     | 500           |
-          | 15    | accept-charset              |               |
-          | 16    | accept-encoding             | gzip, deflate |
-          | 17    | accept-language             |               |
-          | 18    | accept-ranges               |               |
-          | 19    | accept                      |               |
-          | 20    | access-control-allow-origin |               |
-          | 21    | age                         |               |
-          | 22    | allow                       |               |
-          | 23    | authorization               |               |
-          | 24    | cache-control               |               |
-          | 25    | content-disposition         |               |
-          | 26    | content-encoding            |               |
-          | 27    | content-language            |               |
-          | 28    | content-length              |               |
-          | 29    | content-location            |               |
-          | 30    | content-range               |               |
-          | 31    | content-type                |               |
-          | 32    | cookie                      |               |
-          | 33    | date                        |               |
-          | 34    | etag                        |               |
-          | 35    | expect                      |               |
-          | 36    | expires                     |               |
-          | 37    | from                        |               |
-          | 38    | host                        |               |
-          | 39    | if-match                    |               |
-          | 40    | if-modified-since           |               |
-          | 41    | if-none-match               |               |
-          | 42    | if-range                    |               |
-          | 43    | if-unmodified-since         |               |
-          | 44    | last-modified               |               |
-          | 45    | link                        |               |
-          | 46    | location                    |               |
-          | 47    | max-forwards                |               |
-          | 48    | proxy-authenticate          |               |
-          | 49    | proxy-authorization         |               |
-          | 50    | range                       |               |
-          | 51    | referer                     |               |
-          | 52    | refresh                     |               |
-          | 53    | retry-after                 |               |
-          | 54    | server                      |               |
-          | 55    | set-cookie                  |               |
-          | 56    | strict-transport-security   |               |
-          | 57    | transfer-encoding           |               |
-          | 58    | user-agent                  |               |
-          | 59    | vary                        |               |
-          | 60    | via                         |               |
-          | 61    | www-authenticate            |               |
-          +-------+-----------------------------+---------------+
-`
-       bs := bufio.NewScanner(strings.NewReader(fromSpec))
-       re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`)
-       for bs.Scan() {
-               l := bs.Text()
-               if !strings.Contains(l, "|") {
-                       continue
-               }
-               m := re.FindStringSubmatch(l)
-               if m == nil {
-                       continue
-               }
-               i, err := strconv.Atoi(m[1])
-               if err != nil {
-                       t.Errorf("Bogus integer on line %q", l)
-                       continue
-               }
-               if i < 1 || i > staticTable.len() {
-                       t.Errorf("Bogus index %d on line %q", i, l)
-                       continue
-               }
-               if got, want := staticTable.ents[i-1].Name, m[2]; got != want {
-                       t.Errorf("header index %d name = %q; want %q", i, got, want)
-               }
-               if got, want := staticTable.ents[i-1].Value, m[3]; got != want {
-                       t.Errorf("header index %d value = %q; want %q", i, got, want)
-               }
-       }
-       if err := bs.Err(); err != nil {
-               t.Error(err)
-       }
-}
diff --git a/libgo/go/internal/x/net/idna/idna.go b/libgo/go/internal/x/net/idna/idna.go
deleted file mode 100644 (file)
index 7f2471e..0000000
+++ /dev/null
@@ -1,732 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package idna implements IDNA2008 using the compatibility processing
-// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
-// deal with the transition from IDNA2003.
-//
-// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
-// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
-// UTS #46 is defined in http://www.unicode.org/reports/tr46.
-// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the
-// differences between these two standards.
-package idna
-
-import (
-       "fmt"
-       "strings"
-       "unicode/utf8"
-
-       "internal/x/text/secure/bidirule"
-       "internal/x/text/unicode/bidi"
-       "internal/x/text/unicode/norm"
-)
-
-// NOTE: Unlike common practice in Go APIs, the functions will return a
-// sanitized domain name in case of errors. Browsers sometimes use a partially
-// evaluated string as lookup.
-// TODO: the current error handling is, in my opinion, the least opinionated.
-// Other strategies are also viable, though:
-// Option 1) Return an empty string in case of error, but allow the user to
-//    specify explicitly which errors to ignore.
-// Option 2) Return the partially evaluated string if it is itself a valid
-//    string, otherwise return the empty string in case of error.
-// Option 3) Option 1 and 2.
-// Option 4) Always return an empty string for now and implement Option 1 as
-//    needed, and document that the return string may not be empty in case of
-//    error in the future.
-// I think Option 1 is best, but it is quite opinionated.
-
-// ToASCII is a wrapper for Punycode.ToASCII.
-func ToASCII(s string) (string, error) {
-       return Punycode.process(s, true)
-}
-
-// ToUnicode is a wrapper for Punycode.ToUnicode.
-func ToUnicode(s string) (string, error) {
-       return Punycode.process(s, false)
-}
-
-// An Option configures a Profile at creation time.
-type Option func(*options)
-
-// Transitional sets a Profile to use the Transitional mapping as defined in UTS
-// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
-// transitional mapping provides a compromise between IDNA2003 and IDNA2008
-// compatibility. It is used by most browsers when resolving domain names. This
-// option is only meaningful if combined with MapForLookup.
-func Transitional(transitional bool) Option {
-       return func(o *options) { o.transitional = true }
-}
-
-// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
-// are longer than allowed by the RFC.
-func VerifyDNSLength(verify bool) Option {
-       return func(o *options) { o.verifyDNSLength = verify }
-}
-
-// RemoveLeadingDots removes leading label separators. Leading runes that map to
-// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
-//
-// This is the behavior suggested by the UTS #46 and is adopted by some
-// browsers.
-func RemoveLeadingDots(remove bool) Option {
-       return func(o *options) { o.removeLeadingDots = remove }
-}
-
-// ValidateLabels sets whether to check the mandatory label validation criteria
-// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
-// of hyphens ('-'), normalization, validity of runes, and the context rules.
-func ValidateLabels(enable bool) Option {
-       return func(o *options) {
-               // Don't override existing mappings, but set one that at least checks
-               // normalization if it is not set.
-               if o.mapping == nil && enable {
-                       o.mapping = normalize
-               }
-               o.trie = trie
-               o.validateLabels = enable
-               o.fromPuny = validateFromPunycode
-       }
-}
-
-// StrictDomainName limits the set of permissible ASCII characters to those
-// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
-// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
-//
-// This option is useful, for instance, for browsers that allow characters
-// outside this range, for example a '_' (U+005F LOW LINE). See
-// http://www.rfc-editor.org/std/std3.txt for more details This option
-// corresponds to the UseSTD3ASCIIRules option in UTS #46.
-func StrictDomainName(use bool) Option {
-       return func(o *options) {
-               o.trie = trie
-               o.useSTD3Rules = use
-               o.fromPuny = validateFromPunycode
-       }
-}
-
-// NOTE: the following options pull in tables. The tables should not be linked
-// in as long as the options are not used.
-
-// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
-// that relies on proper validation of labels should include this rule.
-func BidiRule() Option {
-       return func(o *options) { o.bidirule = bidirule.ValidString }
-}
-
-// ValidateForRegistration sets validation options to verify that a given IDN is
-// properly formatted for registration as defined by Section 4 of RFC 5891.
-func ValidateForRegistration() Option {
-       return func(o *options) {
-               o.mapping = validateRegistration
-               StrictDomainName(true)(o)
-               ValidateLabels(true)(o)
-               VerifyDNSLength(true)(o)
-               BidiRule()(o)
-       }
-}
-
-// MapForLookup sets validation and mapping options such that a given IDN is
-// transformed for domain name lookup according to the requirements set out in
-// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
-// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
-// to add this check.
-//
-// The mappings include normalization and mapping case, width and other
-// compatibility mappings.
-func MapForLookup() Option {
-       return func(o *options) {
-               o.mapping = validateAndMap
-               StrictDomainName(true)(o)
-               ValidateLabels(true)(o)
-       }
-}
-
-type options struct {
-       transitional      bool
-       useSTD3Rules      bool
-       validateLabels    bool
-       verifyDNSLength   bool
-       removeLeadingDots bool
-
-       trie *idnaTrie
-
-       // fromPuny calls validation rules when converting A-labels to U-labels.
-       fromPuny func(p *Profile, s string) error
-
-       // mapping implements a validation and mapping step as defined in RFC 5895
-       // or UTS 46, tailored to, for example, domain registration or lookup.
-       mapping func(p *Profile, s string) (mapped string, isBidi bool, err error)
-
-       // bidirule, if specified, checks whether s conforms to the Bidi Rule
-       // defined in RFC 5893.
-       bidirule func(s string) bool
-}
-
-// A Profile defines the configuration of an IDNA mapper.
-type Profile struct {
-       options
-}
-
-func apply(o *options, opts []Option) {
-       for _, f := range opts {
-               f(o)
-       }
-}
-
-// New creates a new Profile.
-//
-// With no options, the returned Profile is the most permissive and equals the
-// Punycode Profile. Options can be passed to further restrict the Profile. The
-// MapForLookup and ValidateForRegistration options set a collection of options,
-// for lookup and registration purposes respectively, which can be tailored by
-// adding more fine-grained options, where later options override earlier
-// options.
-func New(o ...Option) *Profile {
-       p := &Profile{}
-       apply(&p.options, o)
-       return p
-}
-
-// ToASCII converts a domain or domain label to its ASCII form. For example,
-// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
-// ToASCII("golang") is "golang". If an error is encountered it will return
-// an error and a (partially) processed result.
-func (p *Profile) ToASCII(s string) (string, error) {
-       return p.process(s, true)
-}
-
-// ToUnicode converts a domain or domain label to its Unicode form. For example,
-// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
-// ToUnicode("golang") is "golang". If an error is encountered it will return
-// an error and a (partially) processed result.
-func (p *Profile) ToUnicode(s string) (string, error) {
-       pp := *p
-       pp.transitional = false
-       return pp.process(s, false)
-}
-
-// String reports a string with a description of the profile for debugging
-// purposes. The string format may change with different versions.
-func (p *Profile) String() string {
-       s := ""
-       if p.transitional {
-               s = "Transitional"
-       } else {
-               s = "NonTransitional"
-       }
-       if p.useSTD3Rules {
-               s += ":UseSTD3Rules"
-       }
-       if p.validateLabels {
-               s += ":ValidateLabels"
-       }
-       if p.verifyDNSLength {
-               s += ":VerifyDNSLength"
-       }
-       return s
-}
-
-var (
-       // Punycode is a Profile that does raw punycode processing with a minimum
-       // of validation.
-       Punycode *Profile = punycode
-
-       // Lookup is the recommended profile for looking up domain names, according
-       // to Section 5 of RFC 5891. The exact configuration of this profile may
-       // change over time.
-       Lookup *Profile = lookup
-
-       // Display is the recommended profile for displaying domain names.
-       // The configuration of this profile may change over time.
-       Display *Profile = display
-
-       // Registration is the recommended profile for checking whether a given
-       // IDN is valid for registration, according to Section 4 of RFC 5891.
-       Registration *Profile = registration
-
-       punycode = &Profile{}
-       lookup   = &Profile{options{
-               transitional:   true,
-               useSTD3Rules:   true,
-               validateLabels: true,
-               trie:           trie,
-               fromPuny:       validateFromPunycode,
-               mapping:        validateAndMap,
-               bidirule:       bidirule.ValidString,
-       }}
-       display = &Profile{options{
-               useSTD3Rules:   true,
-               validateLabels: true,
-               trie:           trie,
-               fromPuny:       validateFromPunycode,
-               mapping:        validateAndMap,
-               bidirule:       bidirule.ValidString,
-       }}
-       registration = &Profile{options{
-               useSTD3Rules:    true,
-               validateLabels:  true,
-               verifyDNSLength: true,
-               trie:            trie,
-               fromPuny:        validateFromPunycode,
-               mapping:         validateRegistration,
-               bidirule:        bidirule.ValidString,
-       }}
-
-       // TODO: profiles
-       // Register: recommended for approving domain names: don't do any mappings
-       // but rather reject on invalid input. Bundle or block deviation characters.
-)
-
-type labelError struct{ label, code_ string }
-
-func (e labelError) code() string { return e.code_ }
-func (e labelError) Error() string {
-       return fmt.Sprintf("idna: invalid label %q", e.label)
-}
-
-type runeError rune
-
-func (e runeError) code() string { return "P1" }
-func (e runeError) Error() string {
-       return fmt.Sprintf("idna: disallowed rune %U", e)
-}
-
-// process implements the algorithm described in section 4 of UTS #46,
-// see http://www.unicode.org/reports/tr46.
-func (p *Profile) process(s string, toASCII bool) (string, error) {
-       var err error
-       var isBidi bool
-       if p.mapping != nil {
-               s, isBidi, err = p.mapping(p, s)
-       }
-       // Remove leading empty labels.
-       if p.removeLeadingDots {
-               for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
-               }
-       }
-       // TODO: allow for a quick check of the tables data.
-       // It seems like we should only create this error on ToASCII, but the
-       // UTS 46 conformance tests suggests we should always check this.
-       if err == nil && p.verifyDNSLength && s == "" {
-               err = &labelError{s, "A4"}
-       }
-       labels := labelIter{orig: s}
-       for ; !labels.done(); labels.next() {
-               label := labels.label()
-               if label == "" {
-                       // Empty labels are not okay. The label iterator skips the last
-                       // label if it is empty.
-                       if err == nil && p.verifyDNSLength {
-                               err = &labelError{s, "A4"}
-                       }
-                       continue
-               }
-               if strings.HasPrefix(label, acePrefix) {
-                       u, err2 := decode(label[len(acePrefix):])
-                       if err2 != nil {
-                               if err == nil {
-                                       err = err2
-                               }
-                               // Spec says keep the old label.
-                               continue
-                       }
-                       isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight
-                       labels.set(u)
-                       if err == nil && p.validateLabels {
-                               err = p.fromPuny(p, u)
-                       }
-                       if err == nil {
-                               // This should be called on NonTransitional, according to the
-                               // spec, but that currently does not have any effect. Use the
-                               // original profile to preserve options.
-                               err = p.validateLabel(u)
-                       }
-               } else if err == nil {
-                       err = p.validateLabel(label)
-               }
-       }
-       if isBidi && p.bidirule != nil && err == nil {
-               for labels.reset(); !labels.done(); labels.next() {
-                       if !p.bidirule(labels.label()) {
-                               err = &labelError{s, "B"}
-                               break
-                       }
-               }
-       }
-       if toASCII {
-               for labels.reset(); !labels.done(); labels.next() {
-                       label := labels.label()
-                       if !ascii(label) {
-                               a, err2 := encode(acePrefix, label)
-                               if err == nil {
-                                       err = err2
-                               }
-                               label = a
-                               labels.set(a)
-                       }
-                       n := len(label)
-                       if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
-                               err = &labelError{label, "A4"}
-                       }
-               }
-       }
-       s = labels.result()
-       if toASCII && p.verifyDNSLength && err == nil {
-               // Compute the length of the domain name minus the root label and its dot.
-               n := len(s)
-               if n > 0 && s[n-1] == '.' {
-                       n--
-               }
-               if len(s) < 1 || n > 253 {
-                       err = &labelError{s, "A4"}
-               }
-       }
-       return s, err
-}
-
-func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) {
-       // TODO: consider first doing a quick check to see if any of these checks
-       // need to be done. This will make it slower in the general case, but
-       // faster in the common case.
-       mapped = norm.NFC.String(s)
-       isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft
-       return mapped, isBidi, nil
-}
-
-func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) {
-       // TODO: filter need for normalization in loop below.
-       if !norm.NFC.IsNormalString(s) {
-               return s, false, &labelError{s, "V1"}
-       }
-       for i := 0; i < len(s); {
-               v, sz := trie.lookupString(s[i:])
-               if sz == 0 {
-                       return s, bidi, runeError(utf8.RuneError)
-               }
-               bidi = bidi || info(v).isBidi(s[i:])
-               // Copy bytes not copied so far.
-               switch p.simplify(info(v).category()) {
-               // TODO: handle the NV8 defined in the Unicode idna data set to allow
-               // for strict conformance to IDNA2008.
-               case valid, deviation:
-               case disallowed, mapped, unknown, ignored:
-                       r, _ := utf8.DecodeRuneInString(s[i:])
-                       return s, bidi, runeError(r)
-               }
-               i += sz
-       }
-       return s, bidi, nil
-}
-
-func (c info) isBidi(s string) bool {
-       if !c.isMapped() {
-               return c&attributesMask == rtl
-       }
-       // TODO: also store bidi info for mapped data. This is possible, but a bit
-       // cumbersome and not for the common case.
-       p, _ := bidi.LookupString(s)
-       switch p.Class() {
-       case bidi.R, bidi.AL, bidi.AN:
-               return true
-       }
-       return false
-}
-
-func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {
-       var (
-               b []byte
-               k int
-       )
-       // combinedInfoBits contains the or-ed bits of all runes. We use this
-       // to derive the mayNeedNorm bit later. This may trigger normalization
-       // overeagerly, but it will not do so in the common case. The end result
-       // is another 10% saving on BenchmarkProfile for the common case.
-       var combinedInfoBits info
-       for i := 0; i < len(s); {
-               v, sz := trie.lookupString(s[i:])
-               if sz == 0 {
-                       b = append(b, s[k:i]...)
-                       b = append(b, "\ufffd"...)
-                       k = len(s)
-                       if err == nil {
-                               err = runeError(utf8.RuneError)
-                       }
-                       break
-               }
-               combinedInfoBits |= info(v)
-               bidi = bidi || info(v).isBidi(s[i:])
-               start := i
-               i += sz
-               // Copy bytes not copied so far.
-               switch p.simplify(info(v).category()) {
-               case valid:
-                       continue
-               case disallowed:
-                       if err == nil {
-                               r, _ := utf8.DecodeRuneInString(s[start:])
-                               err = runeError(r)
-                       }
-                       continue
-               case mapped, deviation:
-                       b = append(b, s[k:start]...)
-                       b = info(v).appendMapping(b, s[start:i])
-               case ignored:
-                       b = append(b, s[k:start]...)
-                       // drop the rune
-               case unknown:
-                       b = append(b, s[k:start]...)
-                       b = append(b, "\ufffd"...)
-               }
-               k = i
-       }
-       if k == 0 {
-               // No changes so far.
-               if combinedInfoBits&mayNeedNorm != 0 {
-                       s = norm.NFC.String(s)
-               }
-       } else {
-               b = append(b, s[k:]...)
-               if norm.NFC.QuickSpan(b) != len(b) {
-                       b = norm.NFC.Bytes(b)
-               }
-               // TODO: the punycode converters require strings as input.
-               s = string(b)
-       }
-       return s, bidi, err
-}
-
-// A labelIter allows iterating over domain name labels.
-type labelIter struct {
-       orig     string
-       slice    []string
-       curStart int
-       curEnd   int
-       i        int
-}
-
-func (l *labelIter) reset() {
-       l.curStart = 0
-       l.curEnd = 0
-       l.i = 0
-}
-
-func (l *labelIter) done() bool {
-       return l.curStart >= len(l.orig)
-}
-
-func (l *labelIter) result() string {
-       if l.slice != nil {
-               return strings.Join(l.slice, ".")
-       }
-       return l.orig
-}
-
-func (l *labelIter) label() string {
-       if l.slice != nil {
-               return l.slice[l.i]
-       }
-       p := strings.IndexByte(l.orig[l.curStart:], '.')
-       l.curEnd = l.curStart + p
-       if p == -1 {
-               l.curEnd = len(l.orig)
-       }
-       return l.orig[l.curStart:l.curEnd]
-}
-
-// next sets the value to the next label. It skips the last label if it is empty.
-func (l *labelIter) next() {
-       l.i++
-       if l.slice != nil {
-               if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
-                       l.curStart = len(l.orig)
-               }
-       } else {
-               l.curStart = l.curEnd + 1
-               if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
-                       l.curStart = len(l.orig)
-               }
-       }
-}
-
-func (l *labelIter) set(s string) {
-       if l.slice == nil {
-               l.slice = strings.Split(l.orig, ".")
-       }
-       l.slice[l.i] = s
-}
-
-// acePrefix is the ASCII Compatible Encoding prefix.
-const acePrefix = "xn--"
-
-func (p *Profile) simplify(cat category) category {
-       switch cat {
-       case disallowedSTD3Mapped:
-               if p.useSTD3Rules {
-                       cat = disallowed
-               } else {
-                       cat = mapped
-               }
-       case disallowedSTD3Valid:
-               if p.useSTD3Rules {
-                       cat = disallowed
-               } else {
-                       cat = valid
-               }
-       case deviation:
-               if !p.transitional {
-                       cat = valid
-               }
-       case validNV8, validXV8:
-               // TODO: handle V2008
-               cat = valid
-       }
-       return cat
-}
-
-func validateFromPunycode(p *Profile, s string) error {
-       if !norm.NFC.IsNormalString(s) {
-               return &labelError{s, "V1"}
-       }
-       // TODO: detect whether string may have to be normalized in the following
-       // loop.
-       for i := 0; i < len(s); {
-               v, sz := trie.lookupString(s[i:])
-               if sz == 0 {
-                       return runeError(utf8.RuneError)
-               }
-               if c := p.simplify(info(v).category()); c != valid && c != deviation {
-                       return &labelError{s, "V6"}
-               }
-               i += sz
-       }
-       return nil
-}
-
-const (
-       zwnj = "\u200c"
-       zwj  = "\u200d"
-)
-
-type joinState int8
-
-const (
-       stateStart joinState = iota
-       stateVirama
-       stateBefore
-       stateBeforeVirama
-       stateAfter
-       stateFAIL
-)
-
-var joinStates = [][numJoinTypes]joinState{
-       stateStart: {
-               joiningL:   stateBefore,
-               joiningD:   stateBefore,
-               joinZWNJ:   stateFAIL,
-               joinZWJ:    stateFAIL,
-               joinVirama: stateVirama,
-       },
-       stateVirama: {
-               joiningL: stateBefore,
-               joiningD: stateBefore,
-       },
-       stateBefore: {
-               joiningL:   stateBefore,
-               joiningD:   stateBefore,
-               joiningT:   stateBefore,
-               joinZWNJ:   stateAfter,
-               joinZWJ:    stateFAIL,
-               joinVirama: stateBeforeVirama,
-       },
-       stateBeforeVirama: {
-               joiningL: stateBefore,
-               joiningD: stateBefore,
-               joiningT: stateBefore,
-       },
-       stateAfter: {
-               joiningL:   stateFAIL,
-               joiningD:   stateBefore,
-               joiningT:   stateAfter,
-               joiningR:   stateStart,
-               joinZWNJ:   stateFAIL,
-               joinZWJ:    stateFAIL,
-               joinVirama: stateAfter, // no-op as we can't accept joiners here
-       },
-       stateFAIL: {
-               0:          stateFAIL,
-               joiningL:   stateFAIL,
-               joiningD:   stateFAIL,
-               joiningT:   stateFAIL,
-               joiningR:   stateFAIL,
-               joinZWNJ:   stateFAIL,
-               joinZWJ:    stateFAIL,
-               joinVirama: stateFAIL,
-       },
-}
-
-// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
-// already implicitly satisfied by the overall implementation.
-func (p *Profile) validateLabel(s string) (err error) {
-       if s == "" {
-               if p.verifyDNSLength {
-                       return &labelError{s, "A4"}
-               }
-               return nil
-       }
-       if !p.validateLabels {
-               return nil
-       }
-       trie := p.trie // p.validateLabels is only set if trie is set.
-       if len(s) > 4 && s[2] == '-' && s[3] == '-' {
-               return &labelError{s, "V2"}
-       }
-       if s[0] == '-' || s[len(s)-1] == '-' {
-               return &labelError{s, "V3"}
-       }
-       // TODO: merge the use of this in the trie.
-       v, sz := trie.lookupString(s)
-       x := info(v)
-       if x.isModifier() {
-               return &labelError{s, "V5"}
-       }
-       // Quickly return in the absence of zero-width (non) joiners.
-       if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
-               return nil
-       }
-       st := stateStart
-       for i := 0; ; {
-               jt := x.joinType()
-               if s[i:i+sz] == zwj {
-                       jt = joinZWJ
-               } else if s[i:i+sz] == zwnj {
-                       jt = joinZWNJ
-               }
-               st = joinStates[st][jt]
-               if x.isViramaModifier() {
-                       st = joinStates[st][joinVirama]
-               }
-               if i += sz; i == len(s) {
-                       break
-               }
-               v, sz = trie.lookupString(s[i:])
-               x = info(v)
-       }
-       if st == stateFAIL || st == stateAfter {
-               return &labelError{s, "C"}
-       }
-       return nil
-}
-
-func ascii(s string) bool {
-       for i := 0; i < len(s); i++ {
-               if s[i] >= utf8.RuneSelf {
-                       return false
-               }
-       }
-       return true
-}
diff --git a/libgo/go/internal/x/net/idna/punycode.go b/libgo/go/internal/x/net/idna/punycode.go
deleted file mode 100644 (file)
index 02c7d59..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package idna
-
-// This file implements the Punycode algorithm from RFC 3492.
-
-import (
-       "math"
-       "strings"
-       "unicode/utf8"
-)
-
-// These parameter values are specified in section 5.
-//
-// All computation is done with int32s, so that overflow behavior is identical
-// regardless of whether int is 32-bit or 64-bit.
-const (
-       base        int32 = 36
-       damp        int32 = 700
-       initialBias int32 = 72
-       initialN    int32 = 128
-       skew        int32 = 38
-       tmax        int32 = 26
-       tmin        int32 = 1
-)
-
-func punyError(s string) error { return &labelError{s, "A3"} }
-
-// decode decodes a string as specified in section 6.2.
-func decode(encoded string) (string, error) {
-       if encoded == "" {
-               return "", nil
-       }
-       pos := 1 + strings.LastIndex(encoded, "-")
-       if pos == 1 {
-               return "", punyError(encoded)
-       }
-       if pos == len(encoded) {
-               return encoded[:len(encoded)-1], nil
-       }
-       output := make([]rune, 0, len(encoded))
-       if pos != 0 {
-               for _, r := range encoded[:pos-1] {
-                       output = append(output, r)
-               }
-       }
-       i, n, bias := int32(0), initialN, initialBias
-       for pos < len(encoded) {
-               oldI, w := i, int32(1)
-               for k := base; ; k += base {
-                       if pos == len(encoded) {
-                               return "", punyError(encoded)
-                       }
-                       digit, ok := decodeDigit(encoded[pos])
-                       if !ok {
-                               return "", punyError(encoded)
-                       }
-                       pos++
-                       i += digit * w
-                       if i < 0 {
-                               return "", punyError(encoded)
-                       }
-                       t := k - bias
-                       if t < tmin {
-                               t = tmin
-                       } else if t > tmax {
-                               t = tmax
-                       }
-                       if digit < t {
-                               break
-                       }
-                       w *= base - t
-                       if w >= math.MaxInt32/base {
-                               return "", punyError(encoded)
-                       }
-               }
-               x := int32(len(output) + 1)
-               bias = adapt(i-oldI, x, oldI == 0)
-               n += i / x
-               i %= x
-               if n > utf8.MaxRune || len(output) >= 1024 {
-                       return "", punyError(encoded)
-               }
-               output = append(output, 0)
-               copy(output[i+1:], output[i:])
-               output[i] = n
-               i++
-       }
-       return string(output), nil
-}
-
-// encode encodes a string as specified in section 6.3 and prepends prefix to
-// the result.
-//
-// The "while h < length(input)" line in the specification becomes "for
-// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
-func encode(prefix, s string) (string, error) {
-       output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
-       copy(output, prefix)
-       delta, n, bias := int32(0), initialN, initialBias
-       b, remaining := int32(0), int32(0)
-       for _, r := range s {
-               if r < 0x80 {
-                       b++
-                       output = append(output, byte(r))
-               } else {
-                       remaining++
-               }
-       }
-       h := b
-       if b > 0 {
-               output = append(output, '-')
-       }
-       for remaining != 0 {
-               m := int32(0x7fffffff)
-               for _, r := range s {
-                       if m > r && r >= n {
-                               m = r
-                       }
-               }
-               delta += (m - n) * (h + 1)
-               if delta < 0 {
-                       return "", punyError(s)
-               }
-               n = m
-               for _, r := range s {
-                       if r < n {
-                               delta++
-                               if delta < 0 {
-                                       return "", punyError(s)
-                               }
-                               continue
-                       }
-                       if r > n {
-                               continue
-                       }
-                       q := delta
-                       for k := base; ; k += base {
-                               t := k - bias
-                               if t < tmin {
-                                       t = tmin
-                               } else if t > tmax {
-                                       t = tmax
-                               }
-                               if q < t {
-                                       break
-                               }
-                               output = append(output, encodeDigit(t+(q-t)%(base-t)))
-                               q = (q - t) / (base - t)
-                       }
-                       output = append(output, encodeDigit(q))
-                       bias = adapt(delta, h+1, h == b)
-                       delta = 0
-                       h++
-                       remaining--
-               }
-               delta++
-               n++
-       }
-       return string(output), nil
-}
-
-func decodeDigit(x byte) (digit int32, ok bool) {
-       switch {
-       case '0' <= x && x <= '9':
-               return int32(x - ('0' - 26)), true
-       case 'A' <= x && x <= 'Z':
-               return int32(x - 'A'), true
-       case 'a' <= x && x <= 'z':
-               return int32(x - 'a'), true
-       }
-       return 0, false
-}
-
-func encodeDigit(digit int32) byte {
-       switch {
-       case 0 <= digit && digit < 26:
-               return byte(digit + 'a')
-       case 26 <= digit && digit < 36:
-               return byte(digit + ('0' - 26))
-       }
-       panic("idna: internal error in punycode encoding")
-}
-
-// adapt is the bias adaptation function specified in section 6.1.
-func adapt(delta, numPoints int32, firstTime bool) int32 {
-       if firstTime {
-               delta /= damp
-       } else {
-               delta /= 2
-       }
-       delta += delta / numPoints
-       k := int32(0)
-       for delta > ((base-tmin)*tmax)/2 {
-               delta /= base - tmin
-               k += base
-       }
-       return k + (base-tmin+1)*delta/(delta+skew)
-}
diff --git a/libgo/go/internal/x/net/idna/punycode_test.go b/libgo/go/internal/x/net/idna/punycode_test.go
deleted file mode 100644 (file)
index bfec81d..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package idna
-
-import (
-       "strings"
-       "testing"
-)
-
-var punycodeTestCases = [...]struct {
-       s, encoded string
-}{
-       {"", ""},
-       {"-", "--"},
-       {"-a", "-a-"},
-       {"-a-", "-a--"},
-       {"a", "a-"},
-       {"a-", "a--"},
-       {"a-b", "a-b-"},
-       {"books", "books-"},
-       {"bücher", "bcher-kva"},
-       {"Hello世界", "Hello-ck1hg65u"},
-       {"ü", "tda"},
-       {"üý", "tdac"},
-
-       // The test cases below come from RFC 3492 section 7.1 with Errata 3026.
-       {
-               // (A) Arabic (Egyptian).
-               "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" +
-                       "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F",
-               "egbpdaj6bu4bxfgehfvwxn",
-       },
-       {
-               // (B) Chinese (simplified).
-               "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587",
-               "ihqwcrb4cv8a8dqg056pqjye",
-       },
-       {
-               // (C) Chinese (traditional).
-               "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587",
-               "ihqwctvzc91f659drss3x8bo0yb",
-       },
-       {
-               // (D) Czech.
-               "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" +
-                       "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" +
-                       "\u0065\u0073\u006B\u0079",
-               "Proprostnemluvesky-uyb24dma41a",
-       },
-       {
-               // (E) Hebrew.
-               "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" +
-                       "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" +
-                       "\u05D1\u05E8\u05D9\u05EA",
-               "4dbcagdahymbxekheh6e0a7fei0b",
-       },
-       {
-               // (F) Hindi (Devanagari).
-               "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" +
-                       "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" +
-                       "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" +
-                       "\u0939\u0948\u0902",
-               "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd",
-       },
-       {
-               // (G) Japanese (kanji and hiragana).
-               "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" +
-                       "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B",
-               "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa",
-       },
-       {
-               // (H) Korean (Hangul syllables).
-               "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" +
-                       "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" +
-                       "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C",
-               "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" +
-                       "psd879ccm6fea98c",
-       },
-       {
-               // (I) Russian (Cyrillic).
-               "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" +
-                       "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" +
-                       "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" +
-                       "\u0438",
-               "b1abfaaepdrnnbgefbadotcwatmq2g4l",
-       },
-       {
-               // (J) Spanish.
-               "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" +
-                       "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" +
-                       "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" +
-                       "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" +
-                       "\u0061\u00F1\u006F\u006C",
-               "PorqunopuedensimplementehablarenEspaol-fmd56a",
-       },
-       {
-               // (K) Vietnamese.
-               "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" +
-                       "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" +
-                       "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" +
-                       "\u0056\u0069\u1EC7\u0074",
-               "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g",
-       },
-       {
-               // (L) 3<nen>B<gumi><kinpachi><sensei>.
-               "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F",
-               "3B-ww4c5e180e575a65lsy2b",
-       },
-       {
-               // (M) <amuro><namie>-with-SUPER-MONKEYS.
-               "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" +
-                       "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" +
-                       "\u004F\u004E\u004B\u0045\u0059\u0053",
-               "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n",
-       },
-       {
-               // (N) Hello-Another-Way-<sorezore><no><basho>.
-               "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" +
-                       "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" +
-                       "\u305D\u308C\u305E\u308C\u306E\u5834\u6240",
-               "Hello-Another-Way--fc4qua05auwb3674vfr0b",
-       },
-       {
-               // (O) <hitotsu><yane><no><shita>2.
-               "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032",
-               "2-u9tlzr9756bt3uc0v",
-       },
-       {
-               // (P) Maji<de>Koi<suru>5<byou><mae>
-               "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" +
-                       "\u308B\u0035\u79D2\u524D",
-               "MajiKoi5-783gue6qz075azm5e",
-       },
-       {
-               // (Q) <pafii>de<runba>
-               "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0",
-               "de-jg4avhby1noc0d",
-       },
-       {
-               // (R) <sono><supiido><de>
-               "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067",
-               "d9juau41awczczp",
-       },
-       {
-               // (S) -> $1.00 <-
-               "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" +
-                       "\u003C\u002D",
-               "-> $1.00 <--",
-       },
-}
-
-func TestPunycode(t *testing.T) {
-       for _, tc := range punycodeTestCases {
-               if got, err := decode(tc.encoded); err != nil {
-                       t.Errorf("decode(%q): %v", tc.encoded, err)
-               } else if got != tc.s {
-                       t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s)
-               }
-
-               if got, err := encode("", tc.s); err != nil {
-                       t.Errorf(`encode("", %q): %v`, tc.s, err)
-               } else if got != tc.encoded {
-                       t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded)
-               }
-       }
-}
-
-var punycodeErrorTestCases = [...]string{
-       "decode -",            // A sole '-' is invalid.
-       "decode foo\x00bar",   // '\x00' is not in [0-9A-Za-z].
-       "decode foo#bar",      // '#' is not in [0-9A-Za-z].
-       "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z].
-       "decode 9",            // "9a" decodes to codepoint \u00A3; "9" is truncated.
-       "decode 99999a",       // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF.
-       "decode 9999999999a",  // "9999999999a" overflows the int32 calculation.
-
-       "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow.
-}
-
-func TestPunycodeErrors(t *testing.T) {
-       for _, tc := range punycodeErrorTestCases {
-               var err error
-               switch {
-               case strings.HasPrefix(tc, "decode "):
-                       _, err = decode(tc[7:])
-               case strings.HasPrefix(tc, "encode "):
-                       _, err = encode("", tc[7:])
-               }
-               if err == nil {
-                       if len(tc) > 256 {
-                               tc = tc[:100] + "..." + tc[len(tc)-100:]
-                       }
-                       t.Errorf("no error for %s", tc)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/idna/tables.go b/libgo/go/internal/x/net/idna/tables.go
deleted file mode 100644 (file)
index 41cf9c1..0000000
+++ /dev/null
@@ -1,4559 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Code generated by running "go generate" in internal/x/text. DO NOT EDIT.
-
-package idna
-
-// UnicodeVersion is the Unicode version from which the tables in this package are derived.
-const UnicodeVersion = "10.0.0"
-
-var mappings string = "" + // Size: 8176 bytes
-       "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
-       "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
-       "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
-       "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" +
-       "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" +
-       "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" +
-       "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" +
-       "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" +
-       "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" +
-       "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" +
-       "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" +
-       "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" +
-       "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" +
-       "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" +
-       "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" +
-       "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" +
-       "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" +
-       "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" +
-       "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" +
-       "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" +
-       "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" +
-       "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" +
-       "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" +
-       "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" +
-       "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" +
-       "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" +
-       ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" +
-       "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" +
-       "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" +
-       "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" +
-       "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" +
-       "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" +
-       "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" +
-       "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" +
-       "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" +
-       "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" +
-       "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" +
-       "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" +
-       "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" +
-       "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" +
-       "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" +
-       "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" +
-       "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" +
-       "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" +
-       "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" +
-       "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" +
-       "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" +
-       "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" +
-       "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" +
-       "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" +
-       "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" +
-       "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" +
-       "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" +
-       "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" +
-       "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" +
-       "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" +
-       "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" +
-       "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" +
-       "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" +
-       "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" +
-       "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" +
-       "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" +
-       "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" +
-       "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" +
-       "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" +
-       "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" +
-       "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" +
-       "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" +
-       "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" +
-       "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" +
-       "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" +
-       "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" +
-       "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" +
-       " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" +
-       "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" +
-       "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" +
-       "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" +
-       "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" +
-       "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" +
-       "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" +
-       "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" +
-       "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" +
-       "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" +
-       "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" +
-       "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" +
-       "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" +
-       "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" +
-       "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" +
-       "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" +
-       "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" +
-       "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" +
-       "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" +
-       "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" +
-       "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" +
-       "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" +
-       "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" +
-       "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" +
-       "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" +
-       "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" +
-       "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" +
-       "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" +
-       "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" +
-       "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" +
-       "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" +
-       "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" +
-       "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" +
-       "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" +
-       "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" +
-       "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" +
-       "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" +
-       "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" +
-       "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" +
-       "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" +
-       "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" +
-       "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" +
-       "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" +
-       "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" +
-       "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" +
-       "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" +
-       "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" +
-       "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" +
-       "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" +
-       "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" +
-       "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" +
-       "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" +
-       "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" +
-       "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" +
-       "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" +
-       "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" +
-       "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" +
-       "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" +
-       "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" +
-       "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" +
-       "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" +
-       "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" +
-       "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" +
-       "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻"
-
-var xorData string = "" + // Size: 4855 bytes
-       "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
-       "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" +
-       "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" +
-       "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" +
-       "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" +
-       "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" +
-       "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" +
-       "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" +
-       "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" +
-       "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" +
-       "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" +
-       "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" +
-       "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" +
-       "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" +
-       "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" +
-       "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" +
-       "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" +
-       "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" +
-       "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" +
-       "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" +
-       "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" +
-       "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" +
-       "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" +
-       "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" +
-       "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" +
-       "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" +
-       "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" +
-       "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" +
-       "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" +
-       "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" +
-       "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" +
-       "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" +
-       "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" +
-       "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" +
-       "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" +
-       "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" +
-       "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " +
-       "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" +
-       "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" +
-       "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" +
-       "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" +
-       "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" +
-       ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" +
-       "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" +
-       "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" +
-       "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" +
-       "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" +
-       "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" +
-       "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" +
-       "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" +
-       "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" +
-       "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" +
-       "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" +
-       "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" +
-       "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" +
-       "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" +
-       "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" +
-       "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" +
-       "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" +
-       "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" +
-       "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" +
-       "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" +
-       "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" +
-       "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" +
-       "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" +
-       "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" +
-       "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" +
-       "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" +
-       "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" +
-       "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" +
-       "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" +
-       "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" +
-       "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" +
-       "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" +
-       "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" +
-       "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" +
-       "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" +
-       "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" +
-       "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" +
-       "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" +
-       "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" +
-       "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" +
-       "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" +
-       "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" +
-       "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" +
-       "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" +
-       "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" +
-       "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" +
-       "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," +
-       "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" +
-       "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" +
-       "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" +
-       "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" +
-       ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" +
-       "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" +
-       "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" +
-       "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" +
-       "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" +
-       "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" +
-       "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" +
-       "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" +
-       "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" +
-       "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" +
-       "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" +
-       "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" +
-       "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" +
-       "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" +
-       "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" +
-       "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" +
-       "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" +
-       "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" +
-       "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" +
-       "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" +
-       "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" +
-       "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" +
-       "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" +
-       "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" +
-       "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" +
-       "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" +
-       "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" +
-       "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" +
-       "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" +
-       "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" +
-       "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" +
-       "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" +
-       "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" +
-       "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" +
-       "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" +
-       "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" +
-       "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." +
-       "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" +
-       "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" +
-       "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " +
-       "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" +
-       "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" +
-       "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" +
-       "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" +
-       "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" +
-       "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" +
-       "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," +
-       "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" +
-       "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" +
-       "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" +
-       "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" +
-       "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" +
-       "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" +
-       "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" +
-       "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" +
-       "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" +
-       "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" +
-       "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" +
-       "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" +
-       "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" +
-       "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" +
-       "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" +
-       "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" +
-       "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" +
-       "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" +
-       "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" +
-       "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" +
-       "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" +
-       "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" +
-       "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" +
-       "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" +
-       "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" +
-       "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" +
-       "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" +
-       "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" +
-       "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" +
-       "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" +
-       "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" +
-       "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" +
-       "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" +
-       "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" +
-       "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" +
-       "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" +
-       "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" +
-       "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" +
-       "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," +
-       "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" +
-       "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" +
-       "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" +
-       "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" +
-       "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" +
-       "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" +
-       "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" +
-       "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" +
-       "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" +
-       "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" +
-       "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" +
-       "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" +
-       "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" +
-       "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" +
-       "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" +
-       "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" +
-       "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" +
-       "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" +
-       "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" +
-       "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" +
-       "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" +
-       "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" +
-       "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" +
-       "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" +
-       "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" +
-       "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" +
-       "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" +
-       "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" +
-       "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" +
-       "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" +
-       "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" +
-       "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" +
-       "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" +
-       "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" +
-       "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" +
-       "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" +
-       "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" +
-       "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" +
-       "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" +
-       "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" +
-       "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" +
-       "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" +
-       "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" +
-       "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" +
-       "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" +
-       "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" +
-       "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" +
-       "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" +
-       "\x05\x22\x05\x03\x050\x1d"
-
-// lookup returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return idnaValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = idnaIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = idnaIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = idnaIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *idnaTrie) lookupUnsafe(s []byte) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return idnaValues[c0]
-       }
-       i := idnaIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// lookupString returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *idnaTrie) lookupString(s string) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return idnaValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = idnaIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := idnaIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = idnaIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = idnaIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return idnaValues[c0]
-       }
-       i := idnaIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = idnaIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = idnaIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd.
-type idnaTrie struct{}
-
-func newIdnaTrie(i int) *idnaTrie {
-       return &idnaTrie{}
-}
-
-// lookupValue determines the type of block n and looks up the value for b.
-func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
-       switch {
-       case n < 125:
-               return uint16(idnaValues[n<<6+uint32(b)])
-       default:
-               n -= 125
-               return uint16(idnaSparse.lookup(n, b))
-       }
-}
-
-// idnaValues: 127 blocks, 8128 entries, 16256 bytes
-// The third block is the zero block.
-var idnaValues = [8128]uint16{
-       // Block 0x0, offset 0x0
-       0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
-       0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
-       0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,
-       0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,
-       0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,
-       0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,
-       0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,
-       0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,
-       0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,
-       0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,
-       0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,
-       // Block 0x1, offset 0x40
-       0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,
-       0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,
-       0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,
-       0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,
-       0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,
-       0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,
-       0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,
-       0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,
-       0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,
-       0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,
-       0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,
-       0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,
-       0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,
-       0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
-       0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
-       0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
-       0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,
-       0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,
-       0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,
-       0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,
-       0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,
-       // Block 0x4, offset 0x100
-       0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
-       0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
-       0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,
-       0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,
-       0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,
-       0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
-       0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
-       0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
-       0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
-       0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
-       0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,
-       // Block 0x5, offset 0x140
-       0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
-       0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,
-       0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
-       0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
-       0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
-       0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,
-       0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,
-       0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
-       0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
-       0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
-       0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,
-       // Block 0x6, offset 0x180
-       0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
-       0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
-       0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,
-       0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,
-       0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,
-       0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,
-       0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,
-       0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,
-       0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,
-       0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
-       0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,
-       0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
-       0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
-       0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
-       0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
-       0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,
-       0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,
-       0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,
-       0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,
-       0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,
-       0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,
-       // Block 0x8, offset 0x200
-       0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,
-       0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,
-       0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,
-       0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,
-       0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,
-       0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,
-       0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
-       0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
-       0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
-       0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,
-       0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,
-       // Block 0x9, offset 0x240
-       0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
-       0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
-       0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
-       0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
-       0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,
-       0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,
-       0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
-       0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
-       0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
-       0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
-       0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
-       // Block 0xa, offset 0x280
-       0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
-       0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
-       0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
-       0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
-       0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
-       0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
-       0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
-       0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
-       0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
-       0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
-       0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
-       // Block 0xb, offset 0x2c0
-       0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,
-       0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
-       0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
-       0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
-       0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,
-       0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,
-       0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,
-       0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,
-       0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,
-       0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,
-       0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,
-       // Block 0xc, offset 0x300
-       0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,
-       0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,
-       0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,
-       0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,
-       0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,
-       0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,
-       0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,
-       0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,
-       0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,
-       0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,
-       0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,
-       // Block 0xd, offset 0x340
-       0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,
-       0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,
-       0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,
-       0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,
-       0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,
-       0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,
-       0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,
-       0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,
-       0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,
-       0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
-       0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
-       // Block 0xe, offset 0x380
-       0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
-       0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
-       0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
-       0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
-       0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
-       0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,
-       0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,
-       0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,
-       0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,
-       0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,
-       0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,
-       // Block 0xf, offset 0x3c0
-       0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,
-       0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,
-       0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,
-       0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,
-       0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,
-       0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,
-       0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,
-       0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,
-       0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,
-       0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,
-       0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,
-       // Block 0x10, offset 0x400
-       0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,
-       0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,
-       0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,
-       0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,
-       0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,
-       0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,
-       0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,
-       0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,
-       0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,
-       0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
-       0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
-       // Block 0x11, offset 0x440
-       0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
-       0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
-       0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
-       0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
-       0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,
-       0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
-       0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
-       0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
-       0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
-       0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
-       0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
-       // Block 0x12, offset 0x480
-       0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
-       0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
-       0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
-       0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
-       0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
-       0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
-       0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
-       0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
-       0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
-       0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
-       0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
-       // Block 0x13, offset 0x4c0
-       0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
-       0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
-       0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
-       0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
-       0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
-       0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
-       0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
-       0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
-       0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
-       0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
-       0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
-       // Block 0x14, offset 0x500
-       0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
-       0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
-       0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
-       0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
-       0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
-       0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
-       0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
-       0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
-       0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
-       0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
-       0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
-       // Block 0x15, offset 0x540
-       0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,
-       0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,
-       0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,
-       0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808,
-       0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,
-       0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,
-       0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,
-       0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,
-       0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,
-       0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040,
-       0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040,
-       // Block 0x16, offset 0x580
-       0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308,
-       0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,
-       0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,
-       0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,
-       0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,
-       0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
-       0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
-       0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
-       0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,
-       0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008,
-       0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008,
-       // Block 0x17, offset 0x5c0
-       0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008,
-       0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008,
-       0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,
-       0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008,
-       0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008,
-       0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008,
-       0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040,
-       0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
-       0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040,
-       0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,
-       0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008,
-       // Block 0x18, offset 0x600
-       0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040,
-       0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,
-       0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,
-       0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,
-       0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,
-       0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
-       0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,
-       0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
-       0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,
-       0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018,
-       0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040,
-       // Block 0x19, offset 0x640
-       0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008,
-       0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040,
-       0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040,
-       0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008,
-       0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008,
-       0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,
-       0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,
-       0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
-       0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,
-       0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
-       0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,
-       // Block 0x1a, offset 0x680
-       0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,
-       0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,
-       0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,
-       0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,
-       0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,
-       0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
-       0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,
-       0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
-       0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,
-       0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040,
-       0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040,
-       // Block 0x1b, offset 0x6c0
-       0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008,
-       0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008,
-       0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008,
-       0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008,
-       0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008,
-       0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008,
-       0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040,
-       0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
-       0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008,
-       0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,
-       0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008,
-       // Block 0x1c, offset 0x700
-       0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308,
-       0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008,
-       0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040,
-       0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040,
-       0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040,
-       0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308,
-       0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008,
-       0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
-       0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040,
-       0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308,
-       0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308,
-       // Block 0x1d, offset 0x740
-       0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008,
-       0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008,
-       0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,
-       0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008,
-       0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008,
-       0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008,
-       0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040,
-       0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
-       0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008,
-       0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040,
-       0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308,
-       // Block 0x1e, offset 0x780
-       0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040,
-       0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,
-       0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
-       0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008,
-       0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,
-       0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,
-       0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,
-       0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
-       0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018,
-       0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040,
-       0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040,
-       // Block 0x1f, offset 0x7c0
-       0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008,
-       0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040,
-       0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,
-       0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040,
-       0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040,
-       0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008,
-       0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008,
-       0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008,
-       0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008,
-       0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040,
-       0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008,
-       // Block 0x20, offset 0x800
-       0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040,
-       0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308,
-       0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,
-       0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040,
-       0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,
-       0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308,
-       0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008,
-       0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,
-       0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,
-       0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018,
-       0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018,
-       // Block 0x21, offset 0x840
-       0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008,
-       0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008,
-       0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040,
-       0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008,
-       0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008,
-       0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008,
-       0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040,
-       0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
-       0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008,
-       0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040,
-       0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308,
-       // Block 0x22, offset 0x880
-       0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040,
-       0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,
-       0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,
-       0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040,
-       0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040,
-       0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,
-       0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,
-       0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
-       0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040,
-       0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040,
-       0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040,
-       // Block 0x23, offset 0x8c0
-       0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040,
-       0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,
-       0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040,
-       0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008,
-       0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018,
-       0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,
-       0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,
-       0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
-       0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018,
-       0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008,
-       0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008,
-       // Block 0x24, offset 0x900
-       0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040,
-       0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040,
-       0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040,
-       0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008,
-       0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008,
-       0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
-       0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040,
-       0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
-       0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,
-       0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308,
-       0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,
-       // Block 0x25, offset 0x940
-       0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,
-       0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
-       0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
-       0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,
-       0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,
-       0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
-       0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,
-       0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,
-       0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,
-       0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,
-       0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,
-       // Block 0x26, offset 0x980
-       0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
-       0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
-       0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,
-       0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
-       0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,
-       0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,
-       0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,
-       0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
-       0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,
-       0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,
-       0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,
-       // Block 0x27, offset 0x9c0
-       0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,
-       0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,
-       0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008,
-       0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008,
-       0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,
-       0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,
-       0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,
-       0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,
-       0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,
-       0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,
-       0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,
-       // Block 0x28, offset 0xa00
-       0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,
-       0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,
-       0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,
-       0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9,
-       0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099,
-       0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,
-       0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,
-       0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
-       0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,
-       0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
-       0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,
-       // Block 0x29, offset 0xa40
-       0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,
-       0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,
-       0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,
-       0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
-       0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,
-       0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,
-       0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251,
-       0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,
-       0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,
-       0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,
-       0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,
-       // Block 0x2a, offset 0xa80
-       0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
-       0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
-       0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,
-       0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008,
-       0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008,
-       0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,
-       0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,
-       0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,
-       0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,
-       0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,
-       0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,
-       // Block 0x2b, offset 0xac0
-       0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,
-       0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,
-       0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
-       0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
-       0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008,
-       0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
-       0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
-       0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
-       0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
-       0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,
-       0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,
-       // Block 0x2c, offset 0xb00
-       0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008,
-       0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045,
-       0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008,
-       0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,
-       0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045,
-       0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,
-       0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,
-       0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,
-       0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,
-       0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,
-       0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,
-       // Block 0x2d, offset 0xb40
-       0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,
-       0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,
-       0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,
-       0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,
-       0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,
-       0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,
-       0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,
-       0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,
-       0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,
-       0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459,
-       0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686,
-       // Block 0x2e, offset 0xb80
-       0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,
-       0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489,
-       0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,
-       0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
-       0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,
-       0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,
-       0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,
-       0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,
-       0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,
-       0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,
-       0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040,
-       // Block 0x2f, offset 0xbc0
-       0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,
-       0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,
-       0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d,
-       0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e,
-       0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,
-       0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
-       0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,
-       0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,
-       0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,
-       0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
-       0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018,
-       // Block 0x30, offset 0xc00
-       0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,
-       0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,
-       0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,
-       0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,
-       0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
-       0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,
-       0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,
-       0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,
-       0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,
-       0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd,
-       0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,
-       // Block 0x31, offset 0xc40
-       0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,
-       0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5,
-       0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,
-       0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,
-       0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,
-       0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,
-       0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,
-       0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,
-       0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,
-       0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,
-       0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,
-       // Block 0x32, offset 0xc80
-       0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e,
-       0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249,
-       0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,
-       0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,
-       0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,
-       0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018,
-       0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,
-       0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,
-       0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,
-       0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd,
-       0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,
-       // Block 0x33, offset 0xcc0
-       0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,
-       0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,
-       0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,
-       0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,
-       0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,
-       0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439,
-       0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,
-       0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,
-       0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,
-       0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5,
-       0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,
-       // Block 0x34, offset 0xd00
-       0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,
-       0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,
-       0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
-       0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
-       0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,
-       0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,
-       0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,
-       0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,
-       0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26,
-       0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6,
-       0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,
-       // Block 0x35, offset 0xd40
-       0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,
-       0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
-       0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
-       0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
-       0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46,
-       0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06,
-       0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6,
-       0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86,
-       0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46,
-       0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,
-       0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,
-       // Block 0x36, offset 0xd80
-       0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,
-       0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,
-       0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,
-       0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,
-       0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,
-       0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,
-       0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,
-       0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
-       0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,
-       0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
-       0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,
-       // Block 0x37, offset 0xdc0
-       0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008,
-       0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008,
-       0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,
-       0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,
-       0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,
-       0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd,
-       0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
-       0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,
-       0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
-       0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,
-       0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,
-       // Block 0x38, offset 0xe00
-       0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,
-       0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,
-       0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008,
-       0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008,
-       0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008,
-       0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008,
-       0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,
-       0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308,
-       0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040,
-       0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018,
-       0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,
-       // Block 0x39, offset 0xe40
-       0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d,
-       0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d,
-       0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d,
-       0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040,
-       0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040,
-       0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040,
-       0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040,
-       0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040,
-       0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040,
-       0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,
-       0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,
-       // Block 0x3a, offset 0xe80
-       0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
-       0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,
-       0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,
-       0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,
-       0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018,
-       0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018,
-       0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018,
-       0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018,
-       0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018,
-       0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018,
-       0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018,
-       // Block 0x3b, offset 0xec0
-       0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd,
-       0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd,
-       0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d,
-       0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d,
-       0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d,
-       0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd,
-       0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d,
-       0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd,
-       0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d,
-       0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd,
-       0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d,
-       // Block 0x3c, offset 0xf00
-       0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd,
-       0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d,
-       0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018,
-       0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd,
-       0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d,
-       0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008,
-       0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008,
-       0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008,
-       0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008,
-       0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040,
-       0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040,
-       // Block 0x3d, offset 0xf40
-       0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd,
-       0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,
-       0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761,
-       0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,
-       0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,
-       0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd,
-       0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d,
-       0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d,
-       0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd,
-       0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d,
-       0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018,
-       // Block 0x3e, offset 0xf80
-       0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d,
-       0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d,
-       0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd,
-       0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd,
-       0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d,
-       0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d,
-       0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd,
-       0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d,
-       0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,
-       0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,
-       0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,
-       // Block 0x3f, offset 0xfc0
-       0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,
-       0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,
-       0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15,
-       0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75,
-       0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded,
-       0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d,
-       0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5,
-       0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d,
-       0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d,
-       0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd,
-       0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040,
-       // Block 0x40, offset 0x1000
-       0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9,
-       0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1,
-       0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9,
-       0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549,
-       0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1,
-       0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11,
-       0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91,
-       0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9,
-       0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011,
-       0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209,
-       0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361,
-       // Block 0x41, offset 0x1040
-       0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541,
-       0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781,
-       0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979,
-       0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89,
-       0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1,
-       0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99,
-       0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9,
-       0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9,
-       0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069,
-       0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9,
-       0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9,
-       // Block 0x42, offset 0x1080
-       0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271,
-       0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9,
-       0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed,
-       0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371,
-       0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9,
-       0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d,
-       0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211,
-       0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1,
-       0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599,
-       0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9,
-       0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611,
-       // Block 0x43, offset 0x10c0
-       0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671,
-       0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709,
-       0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781,
-       0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1,
-       0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811,
-       0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901,
-       0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1,
-       0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11,
-       0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31,
-       0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51,
-       0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d,
-       // Block 0x44, offset 0x1100
-       0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
-       0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
-       0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
-       0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
-       0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,
-       0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,
-       0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,
-       0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,
-       0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,
-       0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,
-       0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,
-       // Block 0x45, offset 0x1140
-       0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,
-       0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,
-       0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,
-       0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,
-       0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11,
-       0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,
-       0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,
-       0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,
-       0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
-       0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,
-       0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,
-       // Block 0x46, offset 0x1180
-       0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,
-       0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,
-       0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,
-       0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,
-       0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,
-       0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,
-       0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
-       0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
-       0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,
-       0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,
-       0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,
-       // Block 0x47, offset 0x11c0
-       0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
-       0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,
-       0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
-       0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
-       0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
-       0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
-       0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
-       0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,
-       0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,
-       0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,
-       0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008,
-       // Block 0x48, offset 0x1200
-       0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,
-       0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,
-       0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,
-       0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
-       0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,
-       0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,
-       0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,
-       0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040,
-       0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008,
-       0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,
-       0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,
-       // Block 0x49, offset 0x1240
-       0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575,
-       0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635,
-       0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008,
-       0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715,
-       0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5,
-       0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008,
-       0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
-       0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935,
-       0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5,
-       0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5,
-       0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35,
-       // Block 0x4a, offset 0x1280
-       0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35,
-       0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5,
-       0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19,
-       0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91,
-       0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
-       0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
-       0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
-       0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
-       0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
-       0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
-       0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
-       // Block 0x4b, offset 0x12c0
-       0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001,
-       0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
-       0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
-       0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9,
-       0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1,
-       0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149,
-       0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2,
-       0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1,
-       0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1,
-       0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479,
-       0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040,
-       // Block 0x4c, offset 0x1300
-       0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040,
-       0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659,
-       0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721,
-       0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751,
-       0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769,
-       0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799,
-       0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1,
-       0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1,
-       0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9,
-       0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829,
-       0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841,
-       // Block 0x4d, offset 0x1340
-       0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871,
-       0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9,
-       0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9,
-       0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919,
-       0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931,
-       0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961,
-       0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991,
-       0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1,
-       0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
-       0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
-       0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
-       // Block 0x4e, offset 0x1380
-       0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
-       0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
-       0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
-       0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09,
-       0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479,
-       0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81,
-       0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1,
-       0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19,
-       0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91,
-       0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1,
-       0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09,
-       // Block 0x4f, offset 0x13c0
-       0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1,
-       0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1,
-       0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1,
-       0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991,
-       0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81,
-       0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a,
-       0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99,
-       0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89,
-       0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79,
-       0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19,
-       0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469,
-       // Block 0x50, offset 0x1400
-       0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649,
-       0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9,
-       0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49,
-       0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21,
-       0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9,
-       0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01,
-       0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91,
-       0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9,
-       0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171,
-       0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289,
-       0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329,
-       // Block 0x51, offset 0x1440
-       0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1,
-       0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621,
-       0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739,
-       0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1,
-       0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9,
-       0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29,
-       0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079,
-       0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1,
-       0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171,
-       0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261,
-       0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301,
-       // Block 0x52, offset 0x1480
-       0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1,
-       0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1,
-       0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171,
-       0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261,
-       0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351,
-       0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441,
-       0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509,
-       0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1,
-       0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081,
-       0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239,
-       0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018,
-       // Block 0x53, offset 0x14c0
-       0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,
-       0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
-       0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609,
-       0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721,
-       0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839,
-       0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919,
-       0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9,
-       0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9,
-       0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9,
-       0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1,
-       0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79,
-       // Block 0x54, offset 0x1500
-       0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989,
-       0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
-       0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,
-       0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
-       0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
-       0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
-       0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
-       0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
-       0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9,
-       0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12,
-       0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,
-       // Block 0x55, offset 0x1540
-       0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
-       0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
-       0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55,
-       0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75,
-       0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
-       0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
-       0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
-       0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
-       0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2,
-       0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35,
-       0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55,
-       // Block 0x56, offset 0x1580
-       0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018,
-       0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56,
-       0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95,
-       0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa,
-       0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95,
-       0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99,
-       0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda,
-       0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
-       0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040,
-       0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081,
-       0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1,
-       // Block 0x57, offset 0x15c0
-       0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141,
-       0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171,
-       0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1,
-       0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1,
-       0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201,
-       0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219,
-       0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249,
-       0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291,
-       0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1,
-       0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9,
-       0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1,
-       // Block 0x58, offset 0x1600
-       0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321,
-       0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339,
-       0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369,
-       0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381,
-       0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1,
-       0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9,
-       0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9,
-       0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1,
-       0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441,
-       0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9,
-       0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
-       // Block 0x59, offset 0x1640
-       0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea,
-       0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2,
-       0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9,
-       0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,
-       0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2,
-       0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,
-       0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,
-       0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,
-       0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,
-       0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a,
-       0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a,
-       // Block 0x5a, offset 0x1680
-       0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,
-       0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,
-       0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,
-       0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,
-       0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a,
-       0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115,
-       0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5,
-       0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295,
-       0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355,
-       0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415,
-       0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215,
-       // Block 0x5b, offset 0x16c0
-       0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515,
-       0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595,
-       0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5,
-       0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655,
-       0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115,
-       0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735,
-       0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5,
-       0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5,
-       0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5,
-       0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5,
-       0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040,
-       // Block 0x5c, offset 0x1700
-       0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5,
-       0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715,
-       0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040,
-       0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935,
-       0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040,
-       0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6,
-       0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35,
-       0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040,
-       0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
-       0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
-       0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
-       // Block 0x5d, offset 0x1740
-       0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,
-       0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,
-       0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,
-       0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,
-       0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,
-       0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,
-       0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
-       0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,
-       0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,
-       0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
-       0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
-       // Block 0x5e, offset 0x1780
-       0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,
-       0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,
-       0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,
-       0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,
-       0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,
-       0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,
-       0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,
-       0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,
-       0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,
-       0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,
-       0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
-       // Block 0x5f, offset 0x17c0
-       0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,
-       0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,
-       0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,
-       0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,
-       0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,
-       0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,
-       0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,
-       0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,
-       0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,
-       0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040,
-       0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,
-       // Block 0x60, offset 0x1800
-       0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,
-       0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,
-       0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,
-       0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,
-       0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,
-       0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,
-       0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,
-       0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,
-       0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,
-       0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
-       0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
-       // Block 0x61, offset 0x1840
-       0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199,
-       0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359,
-       0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269,
-       0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369,
-       0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9,
-       0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259,
-       0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99,
-       0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089,
-       0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9,
-       0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249,
-       0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359,
-       // Block 0x62, offset 0x1880
-       0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269,
-       0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369,
-       0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9,
-       0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259,
-       0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99,
-       0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089,
-       0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9,
-       0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249,
-       0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71,
-       0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9,
-       0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369,
-       // Block 0x63, offset 0x18c0
-       0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9,
-       0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259,
-       0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99,
-       0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089,
-       0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040,
-       0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040,
-       0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71,
-       0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9,
-       0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1,
-       0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199,
-       0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259,
-       // Block 0x64, offset 0x1900
-       0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99,
-       0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089,
-       0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9,
-       0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249,
-       0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71,
-       0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9,
-       0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1,
-       0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199,
-       0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359,
-       0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269,
-       0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089,
-       // Block 0x65, offset 0x1940
-       0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9,
-       0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040,
-       0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71,
-       0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9,
-       0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040,
-       0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199,
-       0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359,
-       0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269,
-       0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369,
-       0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9,
-       0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040,
-       // Block 0x66, offset 0x1980
-       0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040,
-       0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9,
-       0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040,
-       0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199,
-       0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359,
-       0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269,
-       0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369,
-       0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9,
-       0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259,
-       0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99,
-       0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9,
-       // Block 0x67, offset 0x19c0
-       0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1,
-       0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199,
-       0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359,
-       0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269,
-       0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369,
-       0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9,
-       0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259,
-       0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99,
-       0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089,
-       0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9,
-       0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199,
-       // Block 0x68, offset 0x1a00
-       0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359,
-       0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269,
-       0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369,
-       0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9,
-       0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259,
-       0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99,
-       0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089,
-       0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9,
-       0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249,
-       0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71,
-       0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269,
-       // Block 0x69, offset 0x1a40
-       0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369,
-       0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9,
-       0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259,
-       0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99,
-       0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089,
-       0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9,
-       0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249,
-       0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71,
-       0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9,
-       0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1,
-       0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9,
-       // Block 0x6a, offset 0x1a80
-       0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259,
-       0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99,
-       0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089,
-       0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9,
-       0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249,
-       0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71,
-       0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9,
-       0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1,
-       0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199,
-       0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359,
-       0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99,
-       // Block 0x6b, offset 0x1ac0
-       0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089,
-       0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9,
-       0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249,
-       0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71,
-       0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9,
-       0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1,
-       0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099,
-       0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429,
-       0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71,
-       0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9,
-       0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9,
-       // Block 0x6c, offset 0x1b00
-       0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9,
-       0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11,
-       0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109,
-       0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1,
-       0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429,
-       0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099,
-       0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429,
-       0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71,
-       0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9,
-       0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01,
-       0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9,
-       // Block 0x6d, offset 0x1b40
-       0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11,
-       0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109,
-       0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1,
-       0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429,
-       0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099,
-       0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429,
-       0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71,
-       0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9,
-       0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01,
-       0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1,
-       0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11,
-       // Block 0x6e, offset 0x1b80
-       0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109,
-       0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1,
-       0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429,
-       0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099,
-       0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429,
-       0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71,
-       0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9,
-       0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01,
-       0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1,
-       0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41,
-       0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109,
-       // Block 0x6f, offset 0x1bc0
-       0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1,
-       0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429,
-       0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099,
-       0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429,
-       0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71,
-       0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9,
-       0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01,
-       0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1,
-       0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41,
-       0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1,
-       0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1,
-       // Block 0x70, offset 0x1c00
-       0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429,
-       0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41,
-       0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079,
-       0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1,
-       0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61,
-       0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9,
-       0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81,
-       0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079,
-       0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1,
-       0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61,
-       0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1,
-       // Block 0x71, offset 0x1c40
-       0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115,
-       0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135,
-       0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115,
-       0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175,
-       0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115,
-       0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08,
-       0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08,
-       0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08,
-       0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08,
-       0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08,
-       0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08,
-       // Block 0x72, offset 0x1c80
-       0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411,
-       0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1,
-       0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9,
-       0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231,
-       0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949,
-       0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,
-       0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429,
-       0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
-       0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
-       0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351,
-       0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040,
-       // Block 0x73, offset 0x1cc0
-       0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040,
-       0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,
-       0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9,
-       0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231,
-       0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949,
-       0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040,
-       0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,
-       0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,
-       0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,
-       0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,
-       0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040,
-       // Block 0x74, offset 0x1d00
-       0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411,
-       0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1,
-       0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9,
-       0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231,
-       0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040,
-       0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249,
-       0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429,
-       0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339,
-       0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1,
-       0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351,
-       0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040,
-       // Block 0x75, offset 0x1d40
-       0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02,
-       0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018,
-       0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2,
-       0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72,
-       0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32,
-       0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2,
-       0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2,
-       0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040,
-       0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199,
-       0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359,
-       0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99,
-       // Block 0x76, offset 0x1d80
-       0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089,
-       0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1,
-       0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018,
-       0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018,
-       0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018,
-       0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018,
-       0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018,
-       0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040,
-       0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018,
-       0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018,
-       0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018,
-       // Block 0x77, offset 0x1dc0
-       0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040,
-       0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040,
-       0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289,
-       0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349,
-       0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409,
-       0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9,
-       0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589,
-       0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649,
-       0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709,
-       0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9,
-       0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040,
-       // Block 0x78, offset 0x1e00
-       0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79,
-       0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39,
-       0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9,
-       0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39,
-       0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9,
-       0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79,
-       0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39,
-       0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9,
-       0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059,
-       0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9,
-       0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179,
-       // Block 0x79, offset 0x1e40
-       0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239,
-       0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9,
-       0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399,
-       0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459,
-       0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309,
-       0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559,
-       0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9,
-       0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679,
-       0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9,
-       0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d,
-       0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9,
-       // Block 0x7a, offset 0x1e80
-       0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9,
-       0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959,
-       0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d,
-       0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d,
-       0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9,
-       0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99,
-       0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9,
-       0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9,
-       0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99,
-       0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39,
-       0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99,
-       // Block 0x7b, offset 0x1ec0
-       0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639,
-       0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9,
-       0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d,
-       0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9,
-       0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d,
-       0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd,
-       0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979,
-       0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19,
-       0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d,
-       0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d,
-       0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59,
-       // Block 0x7c, offset 0x1f00
-       0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99,
-       0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39,
-       0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9,
-       0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39,
-       0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd,
-       0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19,
-       0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9,
-       0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59,
-       0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd,
-       0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d,
-       0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079,
-       // Block 0x7d, offset 0x1f40
-       0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d,
-       0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d,
-       0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879,
-       0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919,
-       0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd,
-       0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9,
-       0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99,
-       0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39,
-       0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9,
-       0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d,
-       0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79,
-       // Block 0x7e, offset 0x1f80
-       0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19,
-       0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9,
-       0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59,
-       0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9,
-       0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d,
-       0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040,
-       0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040,
-       0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040,
-       0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040,
-       0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040,
-       0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040,
-}
-
-// idnaIndex: 36 blocks, 2304 entries, 4608 bytes
-// Block 0 is the zero block.
-var idnaIndex = [2304]uint16{
-       // Block 0x0, offset 0x0
-       // Block 0x1, offset 0x40
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
-       0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
-       0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84,
-       0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88,
-       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
-       0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,
-       0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21,
-       // Block 0x4, offset 0x100
-       0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16,
-       0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d,
-       0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91,
-       0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96,
-       // Block 0x5, offset 0x140
-       0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,
-       0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,
-       0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,
-       0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,
-       0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,
-       0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,
-       0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3,
-       0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c,
-       // Block 0x6, offset 0x180
-       0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b,
-       0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b,
-       0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
-       0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,
-       0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,
-       0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0,
-       0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5,
-       0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,
-       0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,
-       0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,
-       0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,
-       0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,
-       0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,
-       0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,
-       0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,
-       // Block 0x8, offset 0x200
-       0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,
-       0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,
-       0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,
-       0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,
-       0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,
-       0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,
-       0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,
-       0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,
-       // Block 0x9, offset 0x240
-       0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,
-       0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,
-       0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,
-       0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,
-       0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,
-       0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,
-       0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,
-       0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,
-       // Block 0xa, offset 0x280
-       0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,
-       0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,
-       0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,
-       0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,
-       0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,
-       0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,
-       0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,
-       0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3,
-       // Block 0xb, offset 0x2c0
-       0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,
-       0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,
-       0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,
-       0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,
-       0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,
-       0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,
-       0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,
-       0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,
-       // Block 0xc, offset 0x300
-       0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,
-       0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,
-       0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,
-       0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa,
-       // Block 0xd, offset 0x340
-       0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,
-       0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,
-       0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,
-       0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,
-       0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,
-       0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,
-       0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,
-       0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,
-       // Block 0xe, offset 0x380
-       0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,
-       0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,
-       0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,
-       0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,
-       0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe,
-       0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,
-       0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52,
-       0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,
-       // Block 0xf, offset 0x3c0
-       0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108,
-       0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e,
-       0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba,
-       0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba,
-       0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c,
-       0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba,
-       0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,
-       0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba,
-       // Block 0x10, offset 0x400
-       0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e,
-       0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba,
-       0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137,
-       0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,
-       0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,
-       0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,
-       0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba,
-       0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,
-       // Block 0x11, offset 0x440
-       0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,
-       0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba,
-       0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba,
-       0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,
-       0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,
-       0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,
-       0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,
-       0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,
-       // Block 0x12, offset 0x480
-       0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,
-       0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,
-       0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,
-       0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,
-       0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,
-       0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,
-       0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,
-       0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,
-       // Block 0x13, offset 0x4c0
-       0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,
-       0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,
-       0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,
-       0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,
-       0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,
-       0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,
-       0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,
-       0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,
-       // Block 0x14, offset 0x500
-       0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,
-       0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,
-       0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,
-       0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,
-       0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,
-       0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba,
-       0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,
-       0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154,
-       // Block 0x15, offset 0x540
-       0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,
-       0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,
-       0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,
-       0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155,
-       0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,
-       0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,
-       0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,
-       0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,
-       // Block 0x16, offset 0x580
-       0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f,
-       0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,
-       0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,
-       0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,
-       0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,
-       0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,
-       0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,
-       0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,
-       // Block 0x17, offset 0x5c0
-       0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160,
-       0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba,
-       0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66,
-       0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e,
-       0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,
-       0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,
-       0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,
-       0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,
-       // Block 0x18, offset 0x600
-       0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,
-       0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,
-       0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,
-       0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,
-       0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba,
-       0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,
-       0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,
-       0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,
-       // Block 0x19, offset 0x640
-       0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e,
-       0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
-       0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,
-       0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172,
-       0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179,
-       0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,
-       0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,
-       0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,
-       // Block 0x1a, offset 0x680
-       0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,
-       0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,
-       0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,
-       0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,
-       0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,
-       0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,
-       0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,
-       0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,
-       // Block 0x1b, offset 0x6c0
-       0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,
-       0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,
-       0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,
-       0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,
-       0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,
-       0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,
-       0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,
-       0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,
-       // Block 0x1c, offset 0x700
-       0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,
-       0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,
-       0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,
-       0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,
-       0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,
-       0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,
-       0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,
-       0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f,
-       // Block 0x1d, offset 0x740
-       0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f,
-       0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f,
-       0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f,
-       0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f,
-       0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f,
-       0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e,
-       0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,
-       0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,
-       // Block 0x1e, offset 0x780
-       0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba,
-       0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba,
-       0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba,
-       0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba,
-       0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b,
-       0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba,
-       0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba,
-       0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba,
-       // Block 0x1f, offset 0x7c0
-       0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07,
-       0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17,
-       0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07,
-       0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c,
-       0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,
-       0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,
-       // Block 0x20, offset 0x800
-       0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b,
-       0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b,
-       0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b,
-       0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b,
-       0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b,
-       0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b,
-       0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b,
-       0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b,
-       // Block 0x21, offset 0x840
-       0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184,
-       0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba,
-       0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba,
-       0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba,
-       0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba,
-       0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba,
-       0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba,
-       0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba,
-       // Block 0x22, offset 0x880
-       0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,
-       0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,
-       0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b,
-       0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b,
-       0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b,
-       0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b,
-       0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b,
-       0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b,
-       // Block 0x23, offset 0x8c0
-       0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,
-       0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,
-}
-
-// idnaSparseOffset: 264 entries, 528 bytes
-var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778}
-
-// idnaSparseValues: 1915 entries, 7660 bytes
-var idnaSparseValues = [1915]valueRange{
-       // Block 0x0, offset 0x0
-       {value: 0x0000, lo: 0x07},
-       {value: 0xe105, lo: 0x80, hi: 0x96},
-       {value: 0x0018, lo: 0x97, hi: 0x97},
-       {value: 0xe105, lo: 0x98, hi: 0x9e},
-       {value: 0x001f, lo: 0x9f, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xb7},
-       {value: 0x0008, lo: 0xb8, hi: 0xbf},
-       // Block 0x1, offset 0x8
-       {value: 0x0000, lo: 0x10},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0xe01d, lo: 0x81, hi: 0x81},
-       {value: 0x0008, lo: 0x82, hi: 0x82},
-       {value: 0x0335, lo: 0x83, hi: 0x83},
-       {value: 0x034d, lo: 0x84, hi: 0x84},
-       {value: 0x0365, lo: 0x85, hi: 0x85},
-       {value: 0xe00d, lo: 0x86, hi: 0x86},
-       {value: 0x0008, lo: 0x87, hi: 0x87},
-       {value: 0xe00d, lo: 0x88, hi: 0x88},
-       {value: 0x0008, lo: 0x89, hi: 0x89},
-       {value: 0xe00d, lo: 0x8a, hi: 0x8a},
-       {value: 0x0008, lo: 0x8b, hi: 0x8b},
-       {value: 0xe00d, lo: 0x8c, hi: 0x8c},
-       {value: 0x0008, lo: 0x8d, hi: 0x8d},
-       {value: 0xe00d, lo: 0x8e, hi: 0x8e},
-       {value: 0x0008, lo: 0x8f, hi: 0xbf},
-       // Block 0x2, offset 0x19
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0xaf},
-       {value: 0x0249, lo: 0xb0, hi: 0xb0},
-       {value: 0x037d, lo: 0xb1, hi: 0xb1},
-       {value: 0x0259, lo: 0xb2, hi: 0xb2},
-       {value: 0x0269, lo: 0xb3, hi: 0xb3},
-       {value: 0x034d, lo: 0xb4, hi: 0xb4},
-       {value: 0x0395, lo: 0xb5, hi: 0xb5},
-       {value: 0xe1bd, lo: 0xb6, hi: 0xb6},
-       {value: 0x0279, lo: 0xb7, hi: 0xb7},
-       {value: 0x0289, lo: 0xb8, hi: 0xb8},
-       {value: 0x0008, lo: 0xb9, hi: 0xbf},
-       // Block 0x3, offset 0x25
-       {value: 0x0000, lo: 0x01},
-       {value: 0x3308, lo: 0x80, hi: 0xbf},
-       // Block 0x4, offset 0x27
-       {value: 0x0000, lo: 0x04},
-       {value: 0x03f5, lo: 0x80, hi: 0x8f},
-       {value: 0xe105, lo: 0x90, hi: 0x9f},
-       {value: 0x049d, lo: 0xa0, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x5, offset 0x2c
-       {value: 0x0000, lo: 0x07},
-       {value: 0xe185, lo: 0x80, hi: 0x8f},
-       {value: 0x0545, lo: 0x90, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x98},
-       {value: 0x0008, lo: 0x99, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xa0},
-       {value: 0x0008, lo: 0xa1, hi: 0xbf},
-       // Block 0x6, offset 0x34
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0401, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x88},
-       {value: 0x0018, lo: 0x89, hi: 0x8a},
-       {value: 0x0040, lo: 0x8b, hi: 0x8c},
-       {value: 0x0018, lo: 0x8d, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0x90},
-       {value: 0x3308, lo: 0x91, hi: 0xbd},
-       {value: 0x0818, lo: 0xbe, hi: 0xbe},
-       {value: 0x3308, lo: 0xbf, hi: 0xbf},
-       // Block 0x7, offset 0x3f
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0818, lo: 0x80, hi: 0x80},
-       {value: 0x3308, lo: 0x81, hi: 0x82},
-       {value: 0x0818, lo: 0x83, hi: 0x83},
-       {value: 0x3308, lo: 0x84, hi: 0x85},
-       {value: 0x0818, lo: 0x86, hi: 0x86},
-       {value: 0x3308, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0808, lo: 0x90, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xaf},
-       {value: 0x0808, lo: 0xb0, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0x8, offset 0x4b
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0a08, lo: 0x80, hi: 0x87},
-       {value: 0x0c08, lo: 0x88, hi: 0x99},
-       {value: 0x0a08, lo: 0x9a, hi: 0xbf},
-       // Block 0x9, offset 0x4f
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x3308, lo: 0x80, hi: 0x8a},
-       {value: 0x0040, lo: 0x8b, hi: 0x8c},
-       {value: 0x0c08, lo: 0x8d, hi: 0x8d},
-       {value: 0x0a08, lo: 0x8e, hi: 0x98},
-       {value: 0x0c08, lo: 0x99, hi: 0x9b},
-       {value: 0x0a08, lo: 0x9c, hi: 0xaa},
-       {value: 0x0c08, lo: 0xab, hi: 0xac},
-       {value: 0x0a08, lo: 0xad, hi: 0xb0},
-       {value: 0x0c08, lo: 0xb1, hi: 0xb1},
-       {value: 0x0a08, lo: 0xb2, hi: 0xb2},
-       {value: 0x0c08, lo: 0xb3, hi: 0xb4},
-       {value: 0x0a08, lo: 0xb5, hi: 0xb7},
-       {value: 0x0c08, lo: 0xb8, hi: 0xb9},
-       {value: 0x0a08, lo: 0xba, hi: 0xbf},
-       // Block 0xa, offset 0x5e
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0808, lo: 0x80, hi: 0xa5},
-       {value: 0x3308, lo: 0xa6, hi: 0xb0},
-       {value: 0x0808, lo: 0xb1, hi: 0xb1},
-       {value: 0x0040, lo: 0xb2, hi: 0xbf},
-       // Block 0xb, offset 0x63
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0808, lo: 0x80, hi: 0x89},
-       {value: 0x0a08, lo: 0x8a, hi: 0xaa},
-       {value: 0x3308, lo: 0xab, hi: 0xb3},
-       {value: 0x0808, lo: 0xb4, hi: 0xb5},
-       {value: 0x0018, lo: 0xb6, hi: 0xb9},
-       {value: 0x0818, lo: 0xba, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbf},
-       // Block 0xc, offset 0x6b
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0808, lo: 0x80, hi: 0x95},
-       {value: 0x3308, lo: 0x96, hi: 0x99},
-       {value: 0x0808, lo: 0x9a, hi: 0x9a},
-       {value: 0x3308, lo: 0x9b, hi: 0xa3},
-       {value: 0x0808, lo: 0xa4, hi: 0xa4},
-       {value: 0x3308, lo: 0xa5, hi: 0xa7},
-       {value: 0x0808, lo: 0xa8, hi: 0xa8},
-       {value: 0x3308, lo: 0xa9, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x0818, lo: 0xb0, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0xd, offset 0x77
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x0040, lo: 0x80, hi: 0x9f},
-       {value: 0x0a08, lo: 0xa0, hi: 0xa9},
-       {value: 0x0c08, lo: 0xaa, hi: 0xac},
-       {value: 0x0808, lo: 0xad, hi: 0xad},
-       {value: 0x0c08, lo: 0xae, hi: 0xae},
-       {value: 0x0a08, lo: 0xaf, hi: 0xb0},
-       {value: 0x0c08, lo: 0xb1, hi: 0xb2},
-       {value: 0x0a08, lo: 0xb3, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xb5},
-       {value: 0x0a08, lo: 0xb6, hi: 0xb8},
-       {value: 0x0c08, lo: 0xb9, hi: 0xb9},
-       {value: 0x0a08, lo: 0xba, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbf},
-       // Block 0xe, offset 0x85
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0040, lo: 0x80, hi: 0x93},
-       {value: 0x3308, lo: 0x94, hi: 0xa1},
-       {value: 0x0840, lo: 0xa2, hi: 0xa2},
-       {value: 0x3308, lo: 0xa3, hi: 0xbf},
-       // Block 0xf, offset 0x8a
-       {value: 0x0000, lo: 0x08},
-       {value: 0x3308, lo: 0x80, hi: 0x82},
-       {value: 0x3008, lo: 0x83, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0xb9},
-       {value: 0x3308, lo: 0xba, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbf},
-       // Block 0x10, offset 0x93
-       {value: 0x0000, lo: 0x0f},
-       {value: 0x3308, lo: 0x80, hi: 0x80},
-       {value: 0x3008, lo: 0x81, hi: 0x82},
-       {value: 0x0040, lo: 0x83, hi: 0x85},
-       {value: 0x3008, lo: 0x86, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x3008, lo: 0x8a, hi: 0x8c},
-       {value: 0x3b08, lo: 0x8d, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x96},
-       {value: 0x3008, lo: 0x97, hi: 0x97},
-       {value: 0x0040, lo: 0x98, hi: 0xa5},
-       {value: 0x0008, lo: 0xa6, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbf},
-       // Block 0x11, offset 0xa3
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x3308, lo: 0x80, hi: 0x80},
-       {value: 0x3008, lo: 0x81, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8d},
-       {value: 0x0008, lo: 0x8e, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x91},
-       {value: 0x0008, lo: 0x92, hi: 0xa8},
-       {value: 0x0040, lo: 0xa9, hi: 0xa9},
-       {value: 0x0008, lo: 0xaa, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbd},
-       {value: 0x3308, lo: 0xbe, hi: 0xbf},
-       // Block 0x12, offset 0xb1
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x3308, lo: 0x80, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8d},
-       {value: 0x0008, lo: 0x8e, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x91},
-       {value: 0x0008, lo: 0x92, hi: 0xba},
-       {value: 0x3b08, lo: 0xbb, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbf},
-       // Block 0x13, offset 0xbd
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0040, lo: 0x80, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x99},
-       {value: 0x0008, lo: 0x9a, hi: 0xb1},
-       {value: 0x0040, lo: 0xb2, hi: 0xb2},
-       {value: 0x0008, lo: 0xb3, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbf},
-       // Block 0x14, offset 0xc9
-       {value: 0x0000, lo: 0x10},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x89},
-       {value: 0x3b08, lo: 0x8a, hi: 0x8a},
-       {value: 0x0040, lo: 0x8b, hi: 0x8e},
-       {value: 0x3008, lo: 0x8f, hi: 0x91},
-       {value: 0x3308, lo: 0x92, hi: 0x94},
-       {value: 0x0040, lo: 0x95, hi: 0x95},
-       {value: 0x3308, lo: 0x96, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x97},
-       {value: 0x3008, lo: 0x98, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xa5},
-       {value: 0x0008, lo: 0xa6, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xb1},
-       {value: 0x3008, lo: 0xb2, hi: 0xb3},
-       {value: 0x0018, lo: 0xb4, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0x15, offset 0xda
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0xb0},
-       {value: 0x3308, lo: 0xb1, hi: 0xb1},
-       {value: 0x0008, lo: 0xb2, hi: 0xb2},
-       {value: 0x08f1, lo: 0xb3, hi: 0xb3},
-       {value: 0x3308, lo: 0xb4, hi: 0xb9},
-       {value: 0x3b08, lo: 0xba, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbe},
-       {value: 0x0018, lo: 0xbf, hi: 0xbf},
-       // Block 0x16, offset 0xe4
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x3308, lo: 0x87, hi: 0x8e},
-       {value: 0x0018, lo: 0x8f, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0x9b},
-       {value: 0x0040, lo: 0x9c, hi: 0xbf},
-       // Block 0x17, offset 0xeb
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x84},
-       {value: 0x0040, lo: 0x85, hi: 0x85},
-       {value: 0x0008, lo: 0x86, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x87},
-       {value: 0x3308, lo: 0x88, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9b},
-       {value: 0x0961, lo: 0x9c, hi: 0x9c},
-       {value: 0x0999, lo: 0x9d, hi: 0x9d},
-       {value: 0x0008, lo: 0x9e, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xbf},
-       // Block 0x18, offset 0xf8
-       {value: 0x0000, lo: 0x10},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x8a},
-       {value: 0x0008, lo: 0x8b, hi: 0x8b},
-       {value: 0xe03d, lo: 0x8c, hi: 0x8c},
-       {value: 0x0018, lo: 0x8d, hi: 0x97},
-       {value: 0x3308, lo: 0x98, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa9},
-       {value: 0x0018, lo: 0xaa, hi: 0xb4},
-       {value: 0x3308, lo: 0xb5, hi: 0xb5},
-       {value: 0x0018, lo: 0xb6, hi: 0xb6},
-       {value: 0x3308, lo: 0xb7, hi: 0xb7},
-       {value: 0x0018, lo: 0xb8, hi: 0xb8},
-       {value: 0x3308, lo: 0xb9, hi: 0xb9},
-       {value: 0x0018, lo: 0xba, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbf},
-       // Block 0x19, offset 0x109
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0018, lo: 0x80, hi: 0x85},
-       {value: 0x3308, lo: 0x86, hi: 0x86},
-       {value: 0x0018, lo: 0x87, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8d},
-       {value: 0x0018, lo: 0x8e, hi: 0x9a},
-       {value: 0x0040, lo: 0x9b, hi: 0xbf},
-       // Block 0x1a, offset 0x110
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0xaa},
-       {value: 0x3008, lo: 0xab, hi: 0xac},
-       {value: 0x3308, lo: 0xad, hi: 0xb0},
-       {value: 0x3008, lo: 0xb1, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb7},
-       {value: 0x3008, lo: 0xb8, hi: 0xb8},
-       {value: 0x3b08, lo: 0xb9, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbc},
-       {value: 0x3308, lo: 0xbd, hi: 0xbe},
-       {value: 0x0008, lo: 0xbf, hi: 0xbf},
-       // Block 0x1b, offset 0x11b
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x0008, lo: 0x80, hi: 0x89},
-       {value: 0x0018, lo: 0x8a, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x95},
-       {value: 0x3008, lo: 0x96, hi: 0x97},
-       {value: 0x3308, lo: 0x98, hi: 0x99},
-       {value: 0x0008, lo: 0x9a, hi: 0x9d},
-       {value: 0x3308, lo: 0x9e, hi: 0xa0},
-       {value: 0x0008, lo: 0xa1, hi: 0xa1},
-       {value: 0x3008, lo: 0xa2, hi: 0xa4},
-       {value: 0x0008, lo: 0xa5, hi: 0xa6},
-       {value: 0x3008, lo: 0xa7, hi: 0xad},
-       {value: 0x0008, lo: 0xae, hi: 0xb0},
-       {value: 0x3308, lo: 0xb1, hi: 0xb4},
-       {value: 0x0008, lo: 0xb5, hi: 0xbf},
-       // Block 0x1c, offset 0x12a
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x0008, lo: 0x80, hi: 0x81},
-       {value: 0x3308, lo: 0x82, hi: 0x82},
-       {value: 0x3008, lo: 0x83, hi: 0x84},
-       {value: 0x3308, lo: 0x85, hi: 0x86},
-       {value: 0x3008, lo: 0x87, hi: 0x8c},
-       {value: 0x3308, lo: 0x8d, hi: 0x8d},
-       {value: 0x0008, lo: 0x8e, hi: 0x8e},
-       {value: 0x3008, lo: 0x8f, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x3008, lo: 0x9a, hi: 0x9c},
-       {value: 0x3308, lo: 0x9d, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xbf},
-       // Block 0x1d, offset 0x138
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0040, lo: 0x80, hi: 0x86},
-       {value: 0x055d, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8c},
-       {value: 0x055d, lo: 0x8d, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xba},
-       {value: 0x0018, lo: 0xbb, hi: 0xbb},
-       {value: 0xe105, lo: 0xbc, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbf},
-       // Block 0x1e, offset 0x142
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0018, lo: 0x80, hi: 0xbf},
-       // Block 0x1f, offset 0x144
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0xa0},
-       {value: 0x2018, lo: 0xa1, hi: 0xb5},
-       {value: 0x0018, lo: 0xb6, hi: 0xbf},
-       // Block 0x20, offset 0x149
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0xa7},
-       {value: 0x2018, lo: 0xa8, hi: 0xbf},
-       // Block 0x21, offset 0x14c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x2018, lo: 0x80, hi: 0x82},
-       {value: 0x0018, lo: 0x83, hi: 0xbf},
-       // Block 0x22, offset 0x14f
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0008, lo: 0x80, hi: 0xbf},
-       // Block 0x23, offset 0x151
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0008, lo: 0x8a, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0x98},
-       {value: 0x0040, lo: 0x99, hi: 0x99},
-       {value: 0x0008, lo: 0x9a, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x24, offset 0x15d
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0008, lo: 0x8a, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xb0},
-       {value: 0x0040, lo: 0xb1, hi: 0xb1},
-       {value: 0x0008, lo: 0xb2, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xb7},
-       {value: 0x0008, lo: 0xb8, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0x25, offset 0x168
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x0040, lo: 0x81, hi: 0x81},
-       {value: 0x0008, lo: 0x82, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x87},
-       {value: 0x0008, lo: 0x88, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0xbf},
-       // Block 0x26, offset 0x170
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x91},
-       {value: 0x0008, lo: 0x92, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0xbf},
-       // Block 0x27, offset 0x176
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0x9a},
-       {value: 0x0040, lo: 0x9b, hi: 0x9c},
-       {value: 0x3308, lo: 0x9d, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbf},
-       // Block 0x28, offset 0x17c
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x29, offset 0x181
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xb7},
-       {value: 0xe045, lo: 0xb8, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbf},
-       // Block 0x2a, offset 0x186
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0xbf},
-       // Block 0x2b, offset 0x189
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xac},
-       {value: 0x0018, lo: 0xad, hi: 0xae},
-       {value: 0x0008, lo: 0xaf, hi: 0xbf},
-       // Block 0x2c, offset 0x18d
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0x9c},
-       {value: 0x0040, lo: 0x9d, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x2d, offset 0x193
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xaa},
-       {value: 0x0018, lo: 0xab, hi: 0xb0},
-       {value: 0x0008, lo: 0xb1, hi: 0xb8},
-       {value: 0x0040, lo: 0xb9, hi: 0xbf},
-       // Block 0x2e, offset 0x198
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8d},
-       {value: 0x0008, lo: 0x8e, hi: 0x91},
-       {value: 0x3308, lo: 0x92, hi: 0x93},
-       {value: 0x3b08, lo: 0x94, hi: 0x94},
-       {value: 0x0040, lo: 0x95, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb3},
-       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
-       {value: 0x0018, lo: 0xb5, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0x2f, offset 0x1a4
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x91},
-       {value: 0x3308, lo: 0x92, hi: 0x93},
-       {value: 0x0040, lo: 0x94, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xad},
-       {value: 0x0008, lo: 0xae, hi: 0xb0},
-       {value: 0x0040, lo: 0xb1, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xbf},
-       // Block 0x30, offset 0x1ae
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0xb3},
-       {value: 0x3340, lo: 0xb4, hi: 0xb5},
-       {value: 0x3008, lo: 0xb6, hi: 0xb6},
-       {value: 0x3308, lo: 0xb7, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbf},
-       // Block 0x31, offset 0x1b4
-       {value: 0x0000, lo: 0x10},
-       {value: 0x3008, lo: 0x80, hi: 0x85},
-       {value: 0x3308, lo: 0x86, hi: 0x86},
-       {value: 0x3008, lo: 0x87, hi: 0x88},
-       {value: 0x3308, lo: 0x89, hi: 0x91},
-       {value: 0x3b08, lo: 0x92, hi: 0x92},
-       {value: 0x3308, lo: 0x93, hi: 0x93},
-       {value: 0x0018, lo: 0x94, hi: 0x96},
-       {value: 0x0008, lo: 0x97, hi: 0x97},
-       {value: 0x0018, lo: 0x98, hi: 0x9b},
-       {value: 0x0008, lo: 0x9c, hi: 0x9c},
-       {value: 0x3308, lo: 0x9d, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa9},
-       {value: 0x0040, lo: 0xaa, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0x32, offset 0x1c5
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0018, lo: 0x80, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x86},
-       {value: 0x0218, lo: 0x87, hi: 0x87},
-       {value: 0x0018, lo: 0x88, hi: 0x8a},
-       {value: 0x33c0, lo: 0x8b, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x0208, lo: 0xa0, hi: 0xbf},
-       // Block 0x33, offset 0x1cf
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0208, lo: 0x80, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbf},
-       // Block 0x34, offset 0x1d2
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0x84},
-       {value: 0x3308, lo: 0x85, hi: 0x86},
-       {value: 0x0208, lo: 0x87, hi: 0xa8},
-       {value: 0x3308, lo: 0xa9, hi: 0xa9},
-       {value: 0x0208, lo: 0xaa, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x35, offset 0x1da
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xbf},
-       // Block 0x36, offset 0x1dd
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0x9f},
-       {value: 0x3308, lo: 0xa0, hi: 0xa2},
-       {value: 0x3008, lo: 0xa3, hi: 0xa6},
-       {value: 0x3308, lo: 0xa7, hi: 0xa8},
-       {value: 0x3008, lo: 0xa9, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xaf},
-       {value: 0x3008, lo: 0xb0, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb2},
-       {value: 0x3008, lo: 0xb3, hi: 0xb8},
-       {value: 0x3308, lo: 0xb9, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbf},
-       // Block 0x37, offset 0x1ea
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0018, lo: 0x80, hi: 0x80},
-       {value: 0x0040, lo: 0x81, hi: 0x83},
-       {value: 0x0018, lo: 0x84, hi: 0x85},
-       {value: 0x0008, lo: 0x86, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0x38, offset 0x1f2
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x39, offset 0x1f6
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0008, lo: 0x80, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0028, lo: 0x9a, hi: 0x9a},
-       {value: 0x0040, lo: 0x9b, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0xbf},
-       // Block 0x3a, offset 0x1fd
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0x96},
-       {value: 0x3308, lo: 0x97, hi: 0x98},
-       {value: 0x3008, lo: 0x99, hi: 0x9a},
-       {value: 0x3308, lo: 0x9b, hi: 0x9b},
-       {value: 0x0040, lo: 0x9c, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x3b, offset 0x205
-       {value: 0x0000, lo: 0x0f},
-       {value: 0x0008, lo: 0x80, hi: 0x94},
-       {value: 0x3008, lo: 0x95, hi: 0x95},
-       {value: 0x3308, lo: 0x96, hi: 0x96},
-       {value: 0x3008, lo: 0x97, hi: 0x97},
-       {value: 0x3308, lo: 0x98, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0x9f},
-       {value: 0x3b08, lo: 0xa0, hi: 0xa0},
-       {value: 0x3008, lo: 0xa1, hi: 0xa1},
-       {value: 0x3308, lo: 0xa2, hi: 0xa2},
-       {value: 0x3008, lo: 0xa3, hi: 0xa4},
-       {value: 0x3308, lo: 0xa5, hi: 0xac},
-       {value: 0x3008, lo: 0xad, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbe},
-       {value: 0x3308, lo: 0xbf, hi: 0xbf},
-       // Block 0x3c, offset 0x215
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xa6},
-       {value: 0x0008, lo: 0xa7, hi: 0xa7},
-       {value: 0x0018, lo: 0xa8, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xbd},
-       {value: 0x3318, lo: 0xbe, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0x3d, offset 0x221
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0040, lo: 0x80, hi: 0xbf},
-       // Block 0x3e, offset 0x223
-       {value: 0x0000, lo: 0x09},
-       {value: 0x3308, lo: 0x80, hi: 0x83},
-       {value: 0x3008, lo: 0x84, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0xb3},
-       {value: 0x3308, lo: 0xb4, hi: 0xb4},
-       {value: 0x3008, lo: 0xb5, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbc},
-       {value: 0x3008, lo: 0xbd, hi: 0xbf},
-       // Block 0x3f, offset 0x22d
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x3008, lo: 0x80, hi: 0x81},
-       {value: 0x3308, lo: 0x82, hi: 0x82},
-       {value: 0x3008, lo: 0x83, hi: 0x83},
-       {value: 0x3808, lo: 0x84, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0xaa},
-       {value: 0x3308, lo: 0xab, hi: 0xb3},
-       {value: 0x0018, lo: 0xb4, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbf},
-       // Block 0x40, offset 0x239
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x3308, lo: 0x80, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0xa0},
-       {value: 0x3008, lo: 0xa1, hi: 0xa1},
-       {value: 0x3308, lo: 0xa2, hi: 0xa5},
-       {value: 0x3008, lo: 0xa6, hi: 0xa7},
-       {value: 0x3308, lo: 0xa8, hi: 0xa9},
-       {value: 0x3808, lo: 0xaa, hi: 0xaa},
-       {value: 0x3b08, lo: 0xab, hi: 0xab},
-       {value: 0x3308, lo: 0xac, hi: 0xad},
-       {value: 0x0008, lo: 0xae, hi: 0xbf},
-       // Block 0x41, offset 0x245
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0xa5},
-       {value: 0x3308, lo: 0xa6, hi: 0xa6},
-       {value: 0x3008, lo: 0xa7, hi: 0xa7},
-       {value: 0x3308, lo: 0xa8, hi: 0xa9},
-       {value: 0x3008, lo: 0xaa, hi: 0xac},
-       {value: 0x3308, lo: 0xad, hi: 0xad},
-       {value: 0x3008, lo: 0xae, hi: 0xae},
-       {value: 0x3308, lo: 0xaf, hi: 0xb1},
-       {value: 0x3808, lo: 0xb2, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xbb},
-       {value: 0x0018, lo: 0xbc, hi: 0xbf},
-       // Block 0x42, offset 0x251
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0xa3},
-       {value: 0x3008, lo: 0xa4, hi: 0xab},
-       {value: 0x3308, lo: 0xac, hi: 0xb3},
-       {value: 0x3008, lo: 0xb4, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xba},
-       {value: 0x0018, lo: 0xbb, hi: 0xbf},
-       // Block 0x43, offset 0x259
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0x8c},
-       {value: 0x0008, lo: 0x8d, hi: 0xbd},
-       {value: 0x0018, lo: 0xbe, hi: 0xbf},
-       // Block 0x44, offset 0x25e
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0e29, lo: 0x80, hi: 0x80},
-       {value: 0x0e41, lo: 0x81, hi: 0x81},
-       {value: 0x0e59, lo: 0x82, hi: 0x82},
-       {value: 0x0e71, lo: 0x83, hi: 0x83},
-       {value: 0x0e89, lo: 0x84, hi: 0x85},
-       {value: 0x0ea1, lo: 0x86, hi: 0x86},
-       {value: 0x0eb9, lo: 0x87, hi: 0x87},
-       {value: 0x057d, lo: 0x88, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0xbf},
-       // Block 0x45, offset 0x268
-       {value: 0x0000, lo: 0x10},
-       {value: 0x0018, lo: 0x80, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x3308, lo: 0x90, hi: 0x92},
-       {value: 0x0018, lo: 0x93, hi: 0x93},
-       {value: 0x3308, lo: 0x94, hi: 0xa0},
-       {value: 0x3008, lo: 0xa1, hi: 0xa1},
-       {value: 0x3308, lo: 0xa2, hi: 0xa8},
-       {value: 0x0008, lo: 0xa9, hi: 0xac},
-       {value: 0x3308, lo: 0xad, hi: 0xad},
-       {value: 0x0008, lo: 0xae, hi: 0xb1},
-       {value: 0x3008, lo: 0xb2, hi: 0xb3},
-       {value: 0x3308, lo: 0xb4, hi: 0xb4},
-       {value: 0x0008, lo: 0xb5, hi: 0xb6},
-       {value: 0x3008, lo: 0xb7, hi: 0xb7},
-       {value: 0x3308, lo: 0xb8, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0x46, offset 0x279
-       {value: 0x0000, lo: 0x03},
-       {value: 0x3308, lo: 0x80, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xba},
-       {value: 0x3308, lo: 0xbb, hi: 0xbf},
-       // Block 0x47, offset 0x27d
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0x87},
-       {value: 0xe045, lo: 0x88, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x97},
-       {value: 0xe045, lo: 0x98, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa7},
-       {value: 0xe045, lo: 0xa8, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb7},
-       {value: 0xe045, lo: 0xb8, hi: 0xbf},
-       // Block 0x48, offset 0x288
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0040, lo: 0x80, hi: 0x8f},
-       {value: 0x3318, lo: 0x90, hi: 0xb0},
-       {value: 0x0040, lo: 0xb1, hi: 0xbf},
-       // Block 0x49, offset 0x28c
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0018, lo: 0x80, hi: 0x82},
-       {value: 0x0040, lo: 0x83, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0x84},
-       {value: 0x0018, lo: 0x85, hi: 0x88},
-       {value: 0x24c1, lo: 0x89, hi: 0x89},
-       {value: 0x0018, lo: 0x8a, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xbf},
-       // Block 0x4a, offset 0x295
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0018, lo: 0x80, hi: 0xab},
-       {value: 0x24f1, lo: 0xac, hi: 0xac},
-       {value: 0x2529, lo: 0xad, hi: 0xad},
-       {value: 0x0018, lo: 0xae, hi: 0xae},
-       {value: 0x2579, lo: 0xaf, hi: 0xaf},
-       {value: 0x25b1, lo: 0xb0, hi: 0xb0},
-       {value: 0x0018, lo: 0xb1, hi: 0xbf},
-       // Block 0x4b, offset 0x29d
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x9f},
-       {value: 0x0080, lo: 0xa0, hi: 0xa0},
-       {value: 0x0018, lo: 0xa1, hi: 0xad},
-       {value: 0x0080, lo: 0xae, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xbf},
-       // Block 0x4c, offset 0x2a3
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0xa8},
-       {value: 0x09c5, lo: 0xa9, hi: 0xa9},
-       {value: 0x09e5, lo: 0xaa, hi: 0xaa},
-       {value: 0x0018, lo: 0xab, hi: 0xbf},
-       // Block 0x4d, offset 0x2a8
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xbf},
-       // Block 0x4e, offset 0x2ab
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0x8b},
-       {value: 0x28c1, lo: 0x8c, hi: 0x8c},
-       {value: 0x0018, lo: 0x8d, hi: 0xbf},
-       // Block 0x4f, offset 0x2af
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0xb3},
-       {value: 0x0e66, lo: 0xb4, hi: 0xb4},
-       {value: 0x292a, lo: 0xb5, hi: 0xb5},
-       {value: 0x0e86, lo: 0xb6, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xbf},
-       // Block 0x50, offset 0x2b5
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0x9b},
-       {value: 0x2941, lo: 0x9c, hi: 0x9c},
-       {value: 0x0018, lo: 0x9d, hi: 0xbf},
-       // Block 0x51, offset 0x2b9
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xb5},
-       {value: 0x0018, lo: 0xb6, hi: 0xbf},
-       // Block 0x52, offset 0x2bd
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x97},
-       {value: 0x0018, lo: 0x98, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbc},
-       {value: 0x0018, lo: 0xbd, hi: 0xbf},
-       // Block 0x53, offset 0x2c3
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0018, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0018, lo: 0x8a, hi: 0x92},
-       {value: 0x0040, lo: 0x93, hi: 0xab},
-       {value: 0x0018, lo: 0xac, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-       // Block 0x54, offset 0x2ca
-       {value: 0x0000, lo: 0x05},
-       {value: 0xe185, lo: 0x80, hi: 0x8f},
-       {value: 0x03f5, lo: 0x90, hi: 0x9f},
-       {value: 0x0ea5, lo: 0xa0, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x55, offset 0x2d0
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0xa5},
-       {value: 0x0040, lo: 0xa6, hi: 0xa6},
-       {value: 0x0008, lo: 0xa7, hi: 0xa7},
-       {value: 0x0040, lo: 0xa8, hi: 0xac},
-       {value: 0x0008, lo: 0xad, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x56, offset 0x2d8
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0008, lo: 0x80, hi: 0xa7},
-       {value: 0x0040, lo: 0xa8, hi: 0xae},
-       {value: 0xe075, lo: 0xaf, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb0},
-       {value: 0x0040, lo: 0xb1, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0x57, offset 0x2df
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xa7},
-       {value: 0x0008, lo: 0xa8, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xb7},
-       {value: 0x0008, lo: 0xb8, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0x58, offset 0x2ea
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x87},
-       {value: 0x0008, lo: 0x88, hi: 0x8e},
-       {value: 0x0040, lo: 0x8f, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0x9f},
-       {value: 0x3308, lo: 0xa0, hi: 0xbf},
-       // Block 0x59, offset 0x2f4
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xae},
-       {value: 0x0008, lo: 0xaf, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xbf},
-       // Block 0x5a, offset 0x2f8
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0xbf},
-       // Block 0x5b, offset 0x2fb
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0x9e},
-       {value: 0x0edd, lo: 0x9f, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xbf},
-       // Block 0x5c, offset 0x301
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xb2},
-       {value: 0x0efd, lo: 0xb3, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xbf},
-       // Block 0x5d, offset 0x305
-       {value: 0x0020, lo: 0x01},
-       {value: 0x0f1d, lo: 0x80, hi: 0xbf},
-       // Block 0x5e, offset 0x307
-       {value: 0x0020, lo: 0x02},
-       {value: 0x171d, lo: 0x80, hi: 0x8f},
-       {value: 0x18fd, lo: 0x90, hi: 0xbf},
-       // Block 0x5f, offset 0x30a
-       {value: 0x0020, lo: 0x01},
-       {value: 0x1efd, lo: 0x80, hi: 0xbf},
-       // Block 0x60, offset 0x30c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0xbf},
-       // Block 0x61, offset 0x30f
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x98},
-       {value: 0x3308, lo: 0x99, hi: 0x9a},
-       {value: 0x29e2, lo: 0x9b, hi: 0x9b},
-       {value: 0x2a0a, lo: 0x9c, hi: 0x9c},
-       {value: 0x0008, lo: 0x9d, hi: 0x9e},
-       {value: 0x2a31, lo: 0x9f, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xa0},
-       {value: 0x0008, lo: 0xa1, hi: 0xbf},
-       // Block 0x62, offset 0x319
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xbe},
-       {value: 0x2a69, lo: 0xbf, hi: 0xbf},
-       // Block 0x63, offset 0x31c
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x0040, lo: 0x80, hi: 0x84},
-       {value: 0x0008, lo: 0x85, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xb0},
-       {value: 0x2a1d, lo: 0xb1, hi: 0xb1},
-       {value: 0x2a3d, lo: 0xb2, hi: 0xb2},
-       {value: 0x2a5d, lo: 0xb3, hi: 0xb3},
-       {value: 0x2a7d, lo: 0xb4, hi: 0xb4},
-       {value: 0x2a5d, lo: 0xb5, hi: 0xb5},
-       {value: 0x2a9d, lo: 0xb6, hi: 0xb6},
-       {value: 0x2abd, lo: 0xb7, hi: 0xb7},
-       {value: 0x2add, lo: 0xb8, hi: 0xb9},
-       {value: 0x2afd, lo: 0xba, hi: 0xbb},
-       {value: 0x2b1d, lo: 0xbc, hi: 0xbd},
-       {value: 0x2afd, lo: 0xbe, hi: 0xbf},
-       // Block 0x64, offset 0x32b
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xa3},
-       {value: 0x0040, lo: 0xa4, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x65, offset 0x32f
-       {value: 0x0030, lo: 0x04},
-       {value: 0x2aa2, lo: 0x80, hi: 0x9d},
-       {value: 0x305a, lo: 0x9e, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0x9f},
-       {value: 0x30a2, lo: 0xa0, hi: 0xbf},
-       // Block 0x66, offset 0x334
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xbf},
-       // Block 0x67, offset 0x337
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xbf},
-       // Block 0x68, offset 0x33b
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xbd},
-       {value: 0x0018, lo: 0xbe, hi: 0xbf},
-       // Block 0x69, offset 0x340
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x8c},
-       {value: 0x0018, lo: 0x8d, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xbf},
-       // Block 0x6a, offset 0x345
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0xa5},
-       {value: 0x0018, lo: 0xa6, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb1},
-       {value: 0x0018, lo: 0xb2, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbf},
-       // Block 0x6b, offset 0x34b
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0040, lo: 0x80, hi: 0xb6},
-       {value: 0x0008, lo: 0xb7, hi: 0xb7},
-       {value: 0x2009, lo: 0xb8, hi: 0xb8},
-       {value: 0x6e89, lo: 0xb9, hi: 0xb9},
-       {value: 0x0008, lo: 0xba, hi: 0xbf},
-       // Block 0x6c, offset 0x351
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x0008, lo: 0x80, hi: 0x81},
-       {value: 0x3308, lo: 0x82, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0x85},
-       {value: 0x3b08, lo: 0x86, hi: 0x86},
-       {value: 0x0008, lo: 0x87, hi: 0x8a},
-       {value: 0x3308, lo: 0x8b, hi: 0x8b},
-       {value: 0x0008, lo: 0x8c, hi: 0xa2},
-       {value: 0x3008, lo: 0xa3, hi: 0xa4},
-       {value: 0x3308, lo: 0xa5, hi: 0xa6},
-       {value: 0x3008, lo: 0xa7, hi: 0xa7},
-       {value: 0x0018, lo: 0xa8, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0x6d, offset 0x360
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0208, lo: 0x80, hi: 0xb1},
-       {value: 0x0108, lo: 0xb2, hi: 0xb2},
-       {value: 0x0008, lo: 0xb3, hi: 0xb3},
-       {value: 0x0018, lo: 0xb4, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbf},
-       // Block 0x6e, offset 0x366
-       {value: 0x0000, lo: 0x03},
-       {value: 0x3008, lo: 0x80, hi: 0x81},
-       {value: 0x0008, lo: 0x82, hi: 0xb3},
-       {value: 0x3008, lo: 0xb4, hi: 0xbf},
-       // Block 0x6f, offset 0x36a
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x3008, lo: 0x80, hi: 0x83},
-       {value: 0x3b08, lo: 0x84, hi: 0x84},
-       {value: 0x3308, lo: 0x85, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x8d},
-       {value: 0x0018, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x3308, lo: 0xa0, hi: 0xb1},
-       {value: 0x0008, lo: 0xb2, hi: 0xb7},
-       {value: 0x0018, lo: 0xb8, hi: 0xba},
-       {value: 0x0008, lo: 0xbb, hi: 0xbb},
-       {value: 0x0018, lo: 0xbc, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbf},
-       // Block 0x70, offset 0x379
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xa5},
-       {value: 0x3308, lo: 0xa6, hi: 0xad},
-       {value: 0x0018, lo: 0xae, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x71, offset 0x37e
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x3308, lo: 0x87, hi: 0x91},
-       {value: 0x3008, lo: 0x92, hi: 0x92},
-       {value: 0x3808, lo: 0x93, hi: 0x93},
-       {value: 0x0040, lo: 0x94, hi: 0x9e},
-       {value: 0x0018, lo: 0x9f, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbf},
-       // Block 0x72, offset 0x386
-       {value: 0x0000, lo: 0x09},
-       {value: 0x3308, lo: 0x80, hi: 0x82},
-       {value: 0x3008, lo: 0x83, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xb3},
-       {value: 0x3008, lo: 0xb4, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xb9},
-       {value: 0x3008, lo: 0xba, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbc},
-       {value: 0x3008, lo: 0xbd, hi: 0xbf},
-       // Block 0x73, offset 0x390
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x3808, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8e},
-       {value: 0x0008, lo: 0x8f, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa4},
-       {value: 0x3308, lo: 0xa5, hi: 0xa5},
-       {value: 0x0008, lo: 0xa6, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0x74, offset 0x39b
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0xa8},
-       {value: 0x3308, lo: 0xa9, hi: 0xae},
-       {value: 0x3008, lo: 0xaf, hi: 0xb0},
-       {value: 0x3308, lo: 0xb1, hi: 0xb2},
-       {value: 0x3008, lo: 0xb3, hi: 0xb4},
-       {value: 0x3308, lo: 0xb5, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0x75, offset 0x3a3
-       {value: 0x0000, lo: 0x10},
-       {value: 0x0008, lo: 0x80, hi: 0x82},
-       {value: 0x3308, lo: 0x83, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0x8b},
-       {value: 0x3308, lo: 0x8c, hi: 0x8c},
-       {value: 0x3008, lo: 0x8d, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9b},
-       {value: 0x0018, lo: 0x9c, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xb9},
-       {value: 0x0008, lo: 0xba, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbc},
-       {value: 0x3008, lo: 0xbd, hi: 0xbd},
-       {value: 0x0008, lo: 0xbe, hi: 0xbf},
-       // Block 0x76, offset 0x3b4
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0008, lo: 0x80, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb0},
-       {value: 0x0008, lo: 0xb1, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb4},
-       {value: 0x0008, lo: 0xb5, hi: 0xb6},
-       {value: 0x3308, lo: 0xb7, hi: 0xb8},
-       {value: 0x0008, lo: 0xb9, hi: 0xbd},
-       {value: 0x3308, lo: 0xbe, hi: 0xbf},
-       // Block 0x77, offset 0x3bd
-       {value: 0x0000, lo: 0x0f},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x3308, lo: 0x81, hi: 0x81},
-       {value: 0x0008, lo: 0x82, hi: 0x82},
-       {value: 0x0040, lo: 0x83, hi: 0x9a},
-       {value: 0x0008, lo: 0x9b, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xaa},
-       {value: 0x3008, lo: 0xab, hi: 0xab},
-       {value: 0x3308, lo: 0xac, hi: 0xad},
-       {value: 0x3008, lo: 0xae, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb1},
-       {value: 0x0008, lo: 0xb2, hi: 0xb4},
-       {value: 0x3008, lo: 0xb5, hi: 0xb5},
-       {value: 0x3b08, lo: 0xb6, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0x78, offset 0x3cd
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x88},
-       {value: 0x0008, lo: 0x89, hi: 0x8e},
-       {value: 0x0040, lo: 0x8f, hi: 0x90},
-       {value: 0x0008, lo: 0x91, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xa7},
-       {value: 0x0008, lo: 0xa8, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x79, offset 0x3da
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0x9b},
-       {value: 0x4465, lo: 0x9c, hi: 0x9c},
-       {value: 0x447d, lo: 0x9d, hi: 0x9d},
-       {value: 0x2971, lo: 0x9e, hi: 0x9e},
-       {value: 0xe06d, lo: 0x9f, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa5},
-       {value: 0x0040, lo: 0xa6, hi: 0xaf},
-       {value: 0x4495, lo: 0xb0, hi: 0xbf},
-       // Block 0x7a, offset 0x3e4
-       {value: 0x0000, lo: 0x04},
-       {value: 0x44b5, lo: 0x80, hi: 0x8f},
-       {value: 0x44d5, lo: 0x90, hi: 0x9f},
-       {value: 0x44f5, lo: 0xa0, hi: 0xaf},
-       {value: 0x44d5, lo: 0xb0, hi: 0xbf},
-       // Block 0x7b, offset 0x3e9
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0xa2},
-       {value: 0x3008, lo: 0xa3, hi: 0xa4},
-       {value: 0x3308, lo: 0xa5, hi: 0xa5},
-       {value: 0x3008, lo: 0xa6, hi: 0xa7},
-       {value: 0x3308, lo: 0xa8, hi: 0xa8},
-       {value: 0x3008, lo: 0xa9, hi: 0xaa},
-       {value: 0x0018, lo: 0xab, hi: 0xab},
-       {value: 0x3008, lo: 0xac, hi: 0xac},
-       {value: 0x3b08, lo: 0xad, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0x7c, offset 0x3f6
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xa3},
-       {value: 0x0040, lo: 0xa4, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xbf},
-       // Block 0x7d, offset 0x3fa
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x8a},
-       {value: 0x0018, lo: 0x8b, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbf},
-       // Block 0x7e, offset 0x3ff
-       {value: 0x0020, lo: 0x01},
-       {value: 0x4515, lo: 0x80, hi: 0xbf},
-       // Block 0x7f, offset 0x401
-       {value: 0x0020, lo: 0x03},
-       {value: 0x4d15, lo: 0x80, hi: 0x94},
-       {value: 0x4ad5, lo: 0x95, hi: 0x95},
-       {value: 0x4fb5, lo: 0x96, hi: 0xbf},
-       // Block 0x80, offset 0x405
-       {value: 0x0020, lo: 0x01},
-       {value: 0x54f5, lo: 0x80, hi: 0xbf},
-       // Block 0x81, offset 0x407
-       {value: 0x0020, lo: 0x03},
-       {value: 0x5cf5, lo: 0x80, hi: 0x84},
-       {value: 0x5655, lo: 0x85, hi: 0x85},
-       {value: 0x5d95, lo: 0x86, hi: 0xbf},
-       // Block 0x82, offset 0x40b
-       {value: 0x0020, lo: 0x08},
-       {value: 0x6b55, lo: 0x80, hi: 0x8f},
-       {value: 0x6d15, lo: 0x90, hi: 0x90},
-       {value: 0x6d55, lo: 0x91, hi: 0xab},
-       {value: 0x6ea1, lo: 0xac, hi: 0xac},
-       {value: 0x70b5, lo: 0xad, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xaf},
-       {value: 0x70d5, lo: 0xb0, hi: 0xbf},
-       // Block 0x83, offset 0x414
-       {value: 0x0020, lo: 0x05},
-       {value: 0x72d5, lo: 0x80, hi: 0xad},
-       {value: 0x6535, lo: 0xae, hi: 0xae},
-       {value: 0x7895, lo: 0xaf, hi: 0xb5},
-       {value: 0x6f55, lo: 0xb6, hi: 0xb6},
-       {value: 0x7975, lo: 0xb7, hi: 0xbf},
-       // Block 0x84, offset 0x41a
-       {value: 0x0028, lo: 0x03},
-       {value: 0x7c21, lo: 0x80, hi: 0x82},
-       {value: 0x7be1, lo: 0x83, hi: 0x83},
-       {value: 0x7c99, lo: 0x84, hi: 0xbf},
-       // Block 0x85, offset 0x41e
-       {value: 0x0038, lo: 0x0f},
-       {value: 0x9db1, lo: 0x80, hi: 0x83},
-       {value: 0x9e59, lo: 0x84, hi: 0x85},
-       {value: 0x9e91, lo: 0x86, hi: 0x87},
-       {value: 0x9ec9, lo: 0x88, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x91},
-       {value: 0xa089, lo: 0x92, hi: 0x97},
-       {value: 0xa1a1, lo: 0x98, hi: 0x9c},
-       {value: 0xa281, lo: 0x9d, hi: 0xb3},
-       {value: 0x9d41, lo: 0xb4, hi: 0xb4},
-       {value: 0x9db1, lo: 0xb5, hi: 0xb5},
-       {value: 0xa789, lo: 0xb6, hi: 0xbb},
-       {value: 0xa869, lo: 0xbc, hi: 0xbc},
-       {value: 0xa7f9, lo: 0xbd, hi: 0xbd},
-       {value: 0xa8d9, lo: 0xbe, hi: 0xbf},
-       // Block 0x86, offset 0x42e
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x8c},
-       {value: 0x0008, lo: 0x8d, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xa7},
-       {value: 0x0008, lo: 0xa8, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbb},
-       {value: 0x0008, lo: 0xbc, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbe},
-       {value: 0x0008, lo: 0xbf, hi: 0xbf},
-       // Block 0x87, offset 0x438
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0xbf},
-       // Block 0x88, offset 0x43d
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbf},
-       // Block 0x89, offset 0x440
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x82},
-       {value: 0x0040, lo: 0x83, hi: 0x86},
-       {value: 0x0018, lo: 0x87, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xbf},
-       // Block 0x8a, offset 0x446
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0018, lo: 0x80, hi: 0x8e},
-       {value: 0x0040, lo: 0x8f, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0x9b},
-       {value: 0x0040, lo: 0x9c, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xa0},
-       {value: 0x0040, lo: 0xa1, hi: 0xbf},
-       // Block 0x8b, offset 0x44d
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0040, lo: 0x80, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xbc},
-       {value: 0x3308, lo: 0xbd, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbf},
-       // Block 0x8c, offset 0x452
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0x9c},
-       {value: 0x0040, lo: 0x9d, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x8d, offset 0x456
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0x90},
-       {value: 0x0040, lo: 0x91, hi: 0x9f},
-       {value: 0x3308, lo: 0xa0, hi: 0xa0},
-       {value: 0x0018, lo: 0xa1, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbf},
-       // Block 0x8e, offset 0x45c
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xa3},
-       {value: 0x0040, lo: 0xa4, hi: 0xac},
-       {value: 0x0008, lo: 0xad, hi: 0xbf},
-       // Block 0x8f, offset 0x461
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x81},
-       {value: 0x0008, lo: 0x82, hi: 0x89},
-       {value: 0x0018, lo: 0x8a, hi: 0x8a},
-       {value: 0x0040, lo: 0x8b, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbf},
-       // Block 0x90, offset 0x46a
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9e},
-       {value: 0x0018, lo: 0x9f, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x91, offset 0x46f
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x87},
-       {value: 0x0008, lo: 0x88, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0xbf},
-       // Block 0x92, offset 0x475
-       {value: 0x0000, lo: 0x06},
-       {value: 0xe145, lo: 0x80, hi: 0x87},
-       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
-       {value: 0xe145, lo: 0x90, hi: 0x97},
-       {value: 0x8ad5, lo: 0x98, hi: 0x9f},
-       {value: 0x8aed, lo: 0xa0, hi: 0xa7},
-       {value: 0x0008, lo: 0xa8, hi: 0xbf},
-       // Block 0x93, offset 0x47c
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0008, lo: 0x80, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa9},
-       {value: 0x0040, lo: 0xaa, hi: 0xaf},
-       {value: 0x8aed, lo: 0xb0, hi: 0xb7},
-       {value: 0x8ad5, lo: 0xb8, hi: 0xbf},
-       // Block 0x94, offset 0x483
-       {value: 0x0000, lo: 0x06},
-       {value: 0xe145, lo: 0x80, hi: 0x87},
-       {value: 0xe1c5, lo: 0x88, hi: 0x8f},
-       {value: 0xe145, lo: 0x90, hi: 0x93},
-       {value: 0x0040, lo: 0x94, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbf},
-       // Block 0x95, offset 0x48a
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xa7},
-       {value: 0x0040, lo: 0xa8, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x96, offset 0x48e
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xa3},
-       {value: 0x0040, lo: 0xa4, hi: 0xae},
-       {value: 0x0018, lo: 0xaf, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-       // Block 0x97, offset 0x493
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0x98, offset 0x496
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa7},
-       {value: 0x0040, lo: 0xa8, hi: 0xbf},
-       // Block 0x99, offset 0x49b
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0808, lo: 0x80, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x87},
-       {value: 0x0808, lo: 0x88, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0808, lo: 0x8a, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xb6},
-       {value: 0x0808, lo: 0xb7, hi: 0xb8},
-       {value: 0x0040, lo: 0xb9, hi: 0xbb},
-       {value: 0x0808, lo: 0xbc, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbe},
-       {value: 0x0808, lo: 0xbf, hi: 0xbf},
-       // Block 0x9a, offset 0x4a7
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0808, lo: 0x80, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x96},
-       {value: 0x0818, lo: 0x97, hi: 0x9f},
-       {value: 0x0808, lo: 0xa0, hi: 0xb6},
-       {value: 0x0818, lo: 0xb7, hi: 0xbf},
-       // Block 0x9b, offset 0x4ad
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0808, lo: 0x80, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0xa6},
-       {value: 0x0818, lo: 0xa7, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-       // Block 0x9c, offset 0x4b2
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0040, lo: 0x80, hi: 0x9f},
-       {value: 0x0808, lo: 0xa0, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xb3},
-       {value: 0x0808, lo: 0xb4, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xba},
-       {value: 0x0818, lo: 0xbb, hi: 0xbf},
-       // Block 0x9d, offset 0x4b9
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0808, lo: 0x80, hi: 0x95},
-       {value: 0x0818, lo: 0x96, hi: 0x9b},
-       {value: 0x0040, lo: 0x9c, hi: 0x9e},
-       {value: 0x0018, lo: 0x9f, hi: 0x9f},
-       {value: 0x0808, lo: 0xa0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbe},
-       {value: 0x0818, lo: 0xbf, hi: 0xbf},
-       // Block 0x9e, offset 0x4c1
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0808, lo: 0x80, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbb},
-       {value: 0x0818, lo: 0xbc, hi: 0xbd},
-       {value: 0x0808, lo: 0xbe, hi: 0xbf},
-       // Block 0x9f, offset 0x4c6
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0818, lo: 0x80, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0x91},
-       {value: 0x0818, lo: 0x92, hi: 0xbf},
-       // Block 0xa0, offset 0x4ca
-       {value: 0x0000, lo: 0x0f},
-       {value: 0x0808, lo: 0x80, hi: 0x80},
-       {value: 0x3308, lo: 0x81, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x84},
-       {value: 0x3308, lo: 0x85, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x8b},
-       {value: 0x3308, lo: 0x8c, hi: 0x8f},
-       {value: 0x0808, lo: 0x90, hi: 0x93},
-       {value: 0x0040, lo: 0x94, hi: 0x94},
-       {value: 0x0808, lo: 0x95, hi: 0x97},
-       {value: 0x0040, lo: 0x98, hi: 0x98},
-       {value: 0x0808, lo: 0x99, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xb7},
-       {value: 0x3308, lo: 0xb8, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0xa1, offset 0x4da
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0818, lo: 0x80, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0818, lo: 0x90, hi: 0x98},
-       {value: 0x0040, lo: 0x99, hi: 0x9f},
-       {value: 0x0808, lo: 0xa0, hi: 0xbc},
-       {value: 0x0818, lo: 0xbd, hi: 0xbf},
-       // Block 0xa2, offset 0x4e1
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0808, lo: 0x80, hi: 0x9c},
-       {value: 0x0818, lo: 0x9d, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xbf},
-       // Block 0xa3, offset 0x4e5
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0808, lo: 0x80, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xb8},
-       {value: 0x0018, lo: 0xb9, hi: 0xbf},
-       // Block 0xa4, offset 0x4e9
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0808, lo: 0x80, hi: 0x95},
-       {value: 0x0040, lo: 0x96, hi: 0x97},
-       {value: 0x0818, lo: 0x98, hi: 0x9f},
-       {value: 0x0808, lo: 0xa0, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xb7},
-       {value: 0x0818, lo: 0xb8, hi: 0xbf},
-       // Block 0xa5, offset 0x4f0
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0808, lo: 0x80, hi: 0xbf},
-       // Block 0xa6, offset 0x4f2
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0808, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0xbf},
-       // Block 0xa7, offset 0x4f5
-       {value: 0x0000, lo: 0x02},
-       {value: 0x03dd, lo: 0x80, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xbf},
-       // Block 0xa8, offset 0x4f8
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0808, lo: 0x80, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xb9},
-       {value: 0x0818, lo: 0xba, hi: 0xbf},
-       // Block 0xa9, offset 0x4fc
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0040, lo: 0x80, hi: 0x9f},
-       {value: 0x0818, lo: 0xa0, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0xaa, offset 0x500
-       {value: 0x0000, lo: 0x05},
-       {value: 0x3008, lo: 0x80, hi: 0x80},
-       {value: 0x3308, lo: 0x81, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0xb7},
-       {value: 0x3308, lo: 0xb8, hi: 0xbf},
-       // Block 0xab, offset 0x506
-       {value: 0x0000, lo: 0x08},
-       {value: 0x3308, lo: 0x80, hi: 0x85},
-       {value: 0x3b08, lo: 0x86, hi: 0x86},
-       {value: 0x0018, lo: 0x87, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x91},
-       {value: 0x0018, lo: 0x92, hi: 0xa5},
-       {value: 0x0008, lo: 0xa6, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0xac, offset 0x50f
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x3308, lo: 0x80, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0xaf},
-       {value: 0x3008, lo: 0xb0, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xb6},
-       {value: 0x3008, lo: 0xb7, hi: 0xb8},
-       {value: 0x3b08, lo: 0xb9, hi: 0xb9},
-       {value: 0x3308, lo: 0xba, hi: 0xba},
-       {value: 0x0018, lo: 0xbb, hi: 0xbc},
-       {value: 0x0340, lo: 0xbd, hi: 0xbd},
-       {value: 0x0018, lo: 0xbe, hi: 0xbf},
-       // Block 0xad, offset 0x51b
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0018, lo: 0x80, hi: 0x81},
-       {value: 0x0040, lo: 0x82, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xa8},
-       {value: 0x0040, lo: 0xa9, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0xae, offset 0x522
-       {value: 0x0000, lo: 0x08},
-       {value: 0x3308, lo: 0x80, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0xa6},
-       {value: 0x3308, lo: 0xa7, hi: 0xab},
-       {value: 0x3008, lo: 0xac, hi: 0xac},
-       {value: 0x3308, lo: 0xad, hi: 0xb2},
-       {value: 0x3b08, lo: 0xb3, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xb5},
-       {value: 0x0008, lo: 0xb6, hi: 0xbf},
-       // Block 0xaf, offset 0x52b
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0018, lo: 0x80, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xb3},
-       {value: 0x0018, lo: 0xb4, hi: 0xb5},
-       {value: 0x0008, lo: 0xb6, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0xb0, offset 0x533
-       {value: 0x0000, lo: 0x06},
-       {value: 0x3308, lo: 0x80, hi: 0x81},
-       {value: 0x3008, lo: 0x82, hi: 0x82},
-       {value: 0x0008, lo: 0x83, hi: 0xb2},
-       {value: 0x3008, lo: 0xb3, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xbe},
-       {value: 0x3008, lo: 0xbf, hi: 0xbf},
-       // Block 0xb1, offset 0x53a
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x3808, lo: 0x80, hi: 0x80},
-       {value: 0x0008, lo: 0x81, hi: 0x84},
-       {value: 0x0018, lo: 0x85, hi: 0x89},
-       {value: 0x3308, lo: 0x8a, hi: 0x8c},
-       {value: 0x0018, lo: 0x8d, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0x9b},
-       {value: 0x0008, lo: 0x9c, hi: 0x9c},
-       {value: 0x0018, lo: 0x9d, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xa0},
-       {value: 0x0018, lo: 0xa1, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0xb2, offset 0x548
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x91},
-       {value: 0x0040, lo: 0x92, hi: 0x92},
-       {value: 0x0008, lo: 0x93, hi: 0xab},
-       {value: 0x3008, lo: 0xac, hi: 0xae},
-       {value: 0x3308, lo: 0xaf, hi: 0xb1},
-       {value: 0x3008, lo: 0xb2, hi: 0xb3},
-       {value: 0x3308, lo: 0xb4, hi: 0xb4},
-       {value: 0x3808, lo: 0xb5, hi: 0xb5},
-       {value: 0x3308, lo: 0xb6, hi: 0xb7},
-       {value: 0x0018, lo: 0xb8, hi: 0xbd},
-       {value: 0x3308, lo: 0xbe, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0xb3, offset 0x555
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x87},
-       {value: 0x0008, lo: 0x88, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0008, lo: 0x8a, hi: 0x8d},
-       {value: 0x0040, lo: 0x8e, hi: 0x8e},
-       {value: 0x0008, lo: 0x8f, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9e},
-       {value: 0x0008, lo: 0x9f, hi: 0xa8},
-       {value: 0x0018, lo: 0xa9, hi: 0xa9},
-       {value: 0x0040, lo: 0xaa, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0xb4, offset 0x562
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0008, lo: 0x80, hi: 0x9e},
-       {value: 0x3308, lo: 0x9f, hi: 0x9f},
-       {value: 0x3008, lo: 0xa0, hi: 0xa2},
-       {value: 0x3308, lo: 0xa3, hi: 0xa9},
-       {value: 0x3b08, lo: 0xaa, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb9},
-       {value: 0x0040, lo: 0xba, hi: 0xbf},
-       // Block 0xb5, offset 0x56b
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xb4},
-       {value: 0x3008, lo: 0xb5, hi: 0xb7},
-       {value: 0x3308, lo: 0xb8, hi: 0xbf},
-       // Block 0xb6, offset 0x56f
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x3008, lo: 0x80, hi: 0x81},
-       {value: 0x3b08, lo: 0x82, hi: 0x82},
-       {value: 0x3308, lo: 0x83, hi: 0x84},
-       {value: 0x3008, lo: 0x85, hi: 0x85},
-       {value: 0x3308, lo: 0x86, hi: 0x86},
-       {value: 0x0008, lo: 0x87, hi: 0x8a},
-       {value: 0x0018, lo: 0x8b, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0x9b},
-       {value: 0x0040, lo: 0x9c, hi: 0x9c},
-       {value: 0x0018, lo: 0x9d, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0xbf},
-       // Block 0xb7, offset 0x57d
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0xaf},
-       {value: 0x3008, lo: 0xb0, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xb8},
-       {value: 0x3008, lo: 0xb9, hi: 0xb9},
-       {value: 0x3308, lo: 0xba, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbe},
-       {value: 0x3308, lo: 0xbf, hi: 0xbf},
-       // Block 0xb8, offset 0x585
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x3308, lo: 0x80, hi: 0x80},
-       {value: 0x3008, lo: 0x81, hi: 0x81},
-       {value: 0x3b08, lo: 0x82, hi: 0x82},
-       {value: 0x3308, lo: 0x83, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0x85},
-       {value: 0x0018, lo: 0x86, hi: 0x86},
-       {value: 0x0008, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0xbf},
-       // Block 0xb9, offset 0x590
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0008, lo: 0x80, hi: 0xae},
-       {value: 0x3008, lo: 0xaf, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xb7},
-       {value: 0x3008, lo: 0xb8, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0xba, offset 0x599
-       {value: 0x0000, lo: 0x05},
-       {value: 0x3308, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x97},
-       {value: 0x0008, lo: 0x98, hi: 0x9b},
-       {value: 0x3308, lo: 0x9c, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0xbf},
-       // Block 0xbb, offset 0x59f
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0008, lo: 0x80, hi: 0xaf},
-       {value: 0x3008, lo: 0xb0, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xba},
-       {value: 0x3008, lo: 0xbb, hi: 0xbc},
-       {value: 0x3308, lo: 0xbd, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0xbc, offset 0x5a7
-       {value: 0x0000, lo: 0x08},
-       {value: 0x3308, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x83},
-       {value: 0x0008, lo: 0x84, hi: 0x84},
-       {value: 0x0040, lo: 0x85, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xbf},
-       // Block 0xbd, offset 0x5b0
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0xaa},
-       {value: 0x3308, lo: 0xab, hi: 0xab},
-       {value: 0x3008, lo: 0xac, hi: 0xac},
-       {value: 0x3308, lo: 0xad, hi: 0xad},
-       {value: 0x3008, lo: 0xae, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb5},
-       {value: 0x3808, lo: 0xb6, hi: 0xb6},
-       {value: 0x3308, lo: 0xb7, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbf},
-       // Block 0xbe, offset 0x5ba
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0xbf},
-       // Block 0xbf, offset 0x5bd
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9c},
-       {value: 0x3308, lo: 0x9d, hi: 0x9f},
-       {value: 0x3008, lo: 0xa0, hi: 0xa1},
-       {value: 0x3308, lo: 0xa2, hi: 0xa5},
-       {value: 0x3008, lo: 0xa6, hi: 0xa6},
-       {value: 0x3308, lo: 0xa7, hi: 0xaa},
-       {value: 0x3b08, lo: 0xab, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xb9},
-       {value: 0x0018, lo: 0xba, hi: 0xbf},
-       // Block 0xc0, offset 0x5c9
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0040, lo: 0x80, hi: 0x9f},
-       {value: 0x049d, lo: 0xa0, hi: 0xbf},
-       // Block 0xc1, offset 0x5cc
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xa9},
-       {value: 0x0018, lo: 0xaa, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xbe},
-       {value: 0x0008, lo: 0xbf, hi: 0xbf},
-       // Block 0xc2, offset 0x5d1
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x3308, lo: 0x81, hi: 0x86},
-       {value: 0x3008, lo: 0x87, hi: 0x88},
-       {value: 0x3308, lo: 0x89, hi: 0x8a},
-       {value: 0x0008, lo: 0x8b, hi: 0xb2},
-       {value: 0x3308, lo: 0xb3, hi: 0xb3},
-       {value: 0x3b08, lo: 0xb4, hi: 0xb4},
-       {value: 0x3308, lo: 0xb5, hi: 0xb8},
-       {value: 0x3008, lo: 0xb9, hi: 0xb9},
-       {value: 0x0008, lo: 0xba, hi: 0xba},
-       {value: 0x3308, lo: 0xbb, hi: 0xbe},
-       {value: 0x0018, lo: 0xbf, hi: 0xbf},
-       // Block 0xc3, offset 0x5de
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0018, lo: 0x80, hi: 0x86},
-       {value: 0x3b08, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x90},
-       {value: 0x3308, lo: 0x91, hi: 0x96},
-       {value: 0x3008, lo: 0x97, hi: 0x98},
-       {value: 0x3308, lo: 0x99, hi: 0x9b},
-       {value: 0x0008, lo: 0x9c, hi: 0xbf},
-       // Block 0xc4, offset 0x5e7
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0x85},
-       {value: 0x0008, lo: 0x86, hi: 0x89},
-       {value: 0x3308, lo: 0x8a, hi: 0x96},
-       {value: 0x3008, lo: 0x97, hi: 0x97},
-       {value: 0x3308, lo: 0x98, hi: 0x98},
-       {value: 0x3b08, lo: 0x99, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0x9c},
-       {value: 0x0040, lo: 0x9d, hi: 0x9d},
-       {value: 0x0018, lo: 0x9e, hi: 0xa2},
-       {value: 0x0040, lo: 0xa3, hi: 0xbf},
-       // Block 0xc5, offset 0x5f3
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xb8},
-       {value: 0x0040, lo: 0xb9, hi: 0xbf},
-       // Block 0xc6, offset 0x5f6
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x89},
-       {value: 0x0008, lo: 0x8a, hi: 0xae},
-       {value: 0x3008, lo: 0xaf, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xb7},
-       {value: 0x3308, lo: 0xb8, hi: 0xbd},
-       {value: 0x3008, lo: 0xbe, hi: 0xbe},
-       {value: 0x3b08, lo: 0xbf, hi: 0xbf},
-       // Block 0xc7, offset 0x600
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0008, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0018, lo: 0x9a, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb1},
-       {value: 0x0008, lo: 0xb2, hi: 0xbf},
-       // Block 0xc8, offset 0x609
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x0008, lo: 0x80, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0x91},
-       {value: 0x3308, lo: 0x92, hi: 0xa7},
-       {value: 0x0040, lo: 0xa8, hi: 0xa8},
-       {value: 0x3008, lo: 0xa9, hi: 0xa9},
-       {value: 0x3308, lo: 0xaa, hi: 0xb0},
-       {value: 0x3008, lo: 0xb1, hi: 0xb1},
-       {value: 0x3308, lo: 0xb2, hi: 0xb3},
-       {value: 0x3008, lo: 0xb4, hi: 0xb4},
-       {value: 0x3308, lo: 0xb5, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xbf},
-       // Block 0xc9, offset 0x615
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x87},
-       {value: 0x0008, lo: 0x88, hi: 0x89},
-       {value: 0x0040, lo: 0x8a, hi: 0x8a},
-       {value: 0x0008, lo: 0x8b, hi: 0xb0},
-       {value: 0x3308, lo: 0xb1, hi: 0xb6},
-       {value: 0x0040, lo: 0xb7, hi: 0xb9},
-       {value: 0x3308, lo: 0xba, hi: 0xba},
-       {value: 0x0040, lo: 0xbb, hi: 0xbb},
-       {value: 0x3308, lo: 0xbc, hi: 0xbd},
-       {value: 0x0040, lo: 0xbe, hi: 0xbe},
-       {value: 0x3308, lo: 0xbf, hi: 0xbf},
-       // Block 0xca, offset 0x622
-       {value: 0x0000, lo: 0x07},
-       {value: 0x3308, lo: 0x80, hi: 0x83},
-       {value: 0x3b08, lo: 0x84, hi: 0x85},
-       {value: 0x0008, lo: 0x86, hi: 0x86},
-       {value: 0x3308, lo: 0x87, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0xbf},
-       // Block 0xcb, offset 0x62a
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0xbf},
-       // Block 0xcc, offset 0x62d
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0xcd, offset 0x632
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x83},
-       {value: 0x0040, lo: 0x84, hi: 0xbf},
-       // Block 0xce, offset 0x635
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xbf},
-       // Block 0xcf, offset 0x638
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0xbf},
-       // Block 0xd0, offset 0x63b
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0008, lo: 0x80, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa9},
-       {value: 0x0040, lo: 0xaa, hi: 0xad},
-       {value: 0x0018, lo: 0xae, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-       // Block 0xd1, offset 0x642
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0040, lo: 0x80, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb4},
-       {value: 0x0018, lo: 0xb5, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xbf},
-       // Block 0xd2, offset 0x649
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xaf},
-       {value: 0x3308, lo: 0xb0, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xbf},
-       // Block 0xd3, offset 0x64d
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x0008, lo: 0x80, hi: 0x83},
-       {value: 0x0018, lo: 0x84, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9a},
-       {value: 0x0018, lo: 0x9b, hi: 0xa1},
-       {value: 0x0040, lo: 0xa2, hi: 0xa2},
-       {value: 0x0008, lo: 0xa3, hi: 0xb7},
-       {value: 0x0040, lo: 0xb8, hi: 0xbc},
-       {value: 0x0008, lo: 0xbd, hi: 0xbf},
-       // Block 0xd4, offset 0x658
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0xbf},
-       // Block 0xd5, offset 0x65b
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0008, lo: 0x80, hi: 0x84},
-       {value: 0x0040, lo: 0x85, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x90},
-       {value: 0x3008, lo: 0x91, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0xd6, offset 0x661
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0040, lo: 0x80, hi: 0x8e},
-       {value: 0x3308, lo: 0x8f, hi: 0x92},
-       {value: 0x0008, lo: 0x93, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xbf},
-       // Block 0xd7, offset 0x666
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0040, lo: 0x80, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xa1},
-       {value: 0x0040, lo: 0xa2, hi: 0xbf},
-       // Block 0xd8, offset 0x66a
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xbf},
-       // Block 0xd9, offset 0x66d
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xb2},
-       {value: 0x0040, lo: 0xb3, hi: 0xbf},
-       // Block 0xda, offset 0x670
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x9e},
-       {value: 0x0040, lo: 0x9f, hi: 0xbf},
-       // Block 0xdb, offset 0x673
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0040, lo: 0x80, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0xdc, offset 0x676
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xbb},
-       {value: 0x0040, lo: 0xbc, hi: 0xbf},
-       // Block 0xdd, offset 0x679
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0008, lo: 0x80, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbc},
-       {value: 0x0040, lo: 0xbd, hi: 0xbf},
-       // Block 0xde, offset 0x67e
-       {value: 0x0000, lo: 0x09},
-       {value: 0x0008, lo: 0x80, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x8f},
-       {value: 0x0008, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9b},
-       {value: 0x0018, lo: 0x9c, hi: 0x9c},
-       {value: 0x3308, lo: 0x9d, hi: 0x9e},
-       {value: 0x0018, lo: 0x9f, hi: 0x9f},
-       {value: 0x03c0, lo: 0xa0, hi: 0xa3},
-       {value: 0x0040, lo: 0xa4, hi: 0xbf},
-       // Block 0xdf, offset 0x688
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xbf},
-       // Block 0xe0, offset 0x68b
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xa8},
-       {value: 0x0018, lo: 0xa9, hi: 0xbf},
-       // Block 0xe1, offset 0x68f
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x0018, lo: 0x80, hi: 0x9d},
-       {value: 0xb5b9, lo: 0x9e, hi: 0x9e},
-       {value: 0xb601, lo: 0x9f, hi: 0x9f},
-       {value: 0xb649, lo: 0xa0, hi: 0xa0},
-       {value: 0xb6b1, lo: 0xa1, hi: 0xa1},
-       {value: 0xb719, lo: 0xa2, hi: 0xa2},
-       {value: 0xb781, lo: 0xa3, hi: 0xa3},
-       {value: 0xb7e9, lo: 0xa4, hi: 0xa4},
-       {value: 0x3018, lo: 0xa5, hi: 0xa6},
-       {value: 0x3318, lo: 0xa7, hi: 0xa9},
-       {value: 0x0018, lo: 0xaa, hi: 0xac},
-       {value: 0x3018, lo: 0xad, hi: 0xb2},
-       {value: 0x0340, lo: 0xb3, hi: 0xba},
-       {value: 0x3318, lo: 0xbb, hi: 0xbf},
-       // Block 0xe2, offset 0x69e
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x3318, lo: 0x80, hi: 0x82},
-       {value: 0x0018, lo: 0x83, hi: 0x84},
-       {value: 0x3318, lo: 0x85, hi: 0x8b},
-       {value: 0x0018, lo: 0x8c, hi: 0xa9},
-       {value: 0x3318, lo: 0xaa, hi: 0xad},
-       {value: 0x0018, lo: 0xae, hi: 0xba},
-       {value: 0xb851, lo: 0xbb, hi: 0xbb},
-       {value: 0xb899, lo: 0xbc, hi: 0xbc},
-       {value: 0xb8e1, lo: 0xbd, hi: 0xbd},
-       {value: 0xb949, lo: 0xbe, hi: 0xbe},
-       {value: 0xb9b1, lo: 0xbf, hi: 0xbf},
-       // Block 0xe3, offset 0x6aa
-       {value: 0x0000, lo: 0x03},
-       {value: 0xba19, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0xa8},
-       {value: 0x0040, lo: 0xa9, hi: 0xbf},
-       // Block 0xe4, offset 0x6ae
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x81},
-       {value: 0x3318, lo: 0x82, hi: 0x84},
-       {value: 0x0018, lo: 0x85, hi: 0x85},
-       {value: 0x0040, lo: 0x86, hi: 0xbf},
-       // Block 0xe5, offset 0x6b3
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xb1},
-       {value: 0x0040, lo: 0xb2, hi: 0xbf},
-       // Block 0xe6, offset 0x6b8
-       {value: 0x0000, lo: 0x03},
-       {value: 0x3308, lo: 0x80, hi: 0xb6},
-       {value: 0x0018, lo: 0xb7, hi: 0xba},
-       {value: 0x3308, lo: 0xbb, hi: 0xbf},
-       // Block 0xe7, offset 0x6bc
-       {value: 0x0000, lo: 0x04},
-       {value: 0x3308, lo: 0x80, hi: 0xac},
-       {value: 0x0018, lo: 0xad, hi: 0xb4},
-       {value: 0x3308, lo: 0xb5, hi: 0xb5},
-       {value: 0x0018, lo: 0xb6, hi: 0xbf},
-       // Block 0xe8, offset 0x6c1
-       {value: 0x0000, lo: 0x08},
-       {value: 0x0018, lo: 0x80, hi: 0x83},
-       {value: 0x3308, lo: 0x84, hi: 0x84},
-       {value: 0x0018, lo: 0x85, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x9a},
-       {value: 0x3308, lo: 0x9b, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xa0},
-       {value: 0x3308, lo: 0xa1, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-       // Block 0xe9, offset 0x6ca
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x3308, lo: 0x80, hi: 0x86},
-       {value: 0x0040, lo: 0x87, hi: 0x87},
-       {value: 0x3308, lo: 0x88, hi: 0x98},
-       {value: 0x0040, lo: 0x99, hi: 0x9a},
-       {value: 0x3308, lo: 0x9b, hi: 0xa1},
-       {value: 0x0040, lo: 0xa2, hi: 0xa2},
-       {value: 0x3308, lo: 0xa3, hi: 0xa4},
-       {value: 0x0040, lo: 0xa5, hi: 0xa5},
-       {value: 0x3308, lo: 0xa6, hi: 0xaa},
-       {value: 0x0040, lo: 0xab, hi: 0xbf},
-       // Block 0xea, offset 0x6d5
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0808, lo: 0x80, hi: 0x84},
-       {value: 0x0040, lo: 0x85, hi: 0x86},
-       {value: 0x0818, lo: 0x87, hi: 0x8f},
-       {value: 0x3308, lo: 0x90, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0xbf},
-       // Block 0xeb, offset 0x6db
-       {value: 0x0000, lo: 0x07},
-       {value: 0x0a08, lo: 0x80, hi: 0x83},
-       {value: 0x3308, lo: 0x84, hi: 0x8a},
-       {value: 0x0040, lo: 0x8b, hi: 0x8f},
-       {value: 0x0808, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9d},
-       {value: 0x0818, lo: 0x9e, hi: 0x9f},
-       {value: 0x0040, lo: 0xa0, hi: 0xbf},
-       // Block 0xec, offset 0x6e3
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0040, lo: 0x80, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb1},
-       {value: 0x0040, lo: 0xb2, hi: 0xbf},
-       // Block 0xed, offset 0x6e7
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xbf},
-       // Block 0xee, offset 0x6eb
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x93},
-       {value: 0x0040, lo: 0x94, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xae},
-       {value: 0x0040, lo: 0xaf, hi: 0xb0},
-       {value: 0x0018, lo: 0xb1, hi: 0xbf},
-       // Block 0xef, offset 0x6f1
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0018, lo: 0x81, hi: 0x8f},
-       {value: 0x0040, lo: 0x90, hi: 0x90},
-       {value: 0x0018, lo: 0x91, hi: 0xb5},
-       {value: 0x0040, lo: 0xb6, hi: 0xbf},
-       // Block 0xf0, offset 0x6f7
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x8f},
-       {value: 0xc1c1, lo: 0x90, hi: 0x90},
-       {value: 0x0018, lo: 0x91, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xbf},
-       // Block 0xf1, offset 0x6fc
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0040, lo: 0x80, hi: 0xa5},
-       {value: 0x0018, lo: 0xa6, hi: 0xbf},
-       // Block 0xf2, offset 0x6ff
-       {value: 0x0000, lo: 0x0f},
-       {value: 0xc7e9, lo: 0x80, hi: 0x80},
-       {value: 0xc839, lo: 0x81, hi: 0x81},
-       {value: 0xc889, lo: 0x82, hi: 0x82},
-       {value: 0xc8d9, lo: 0x83, hi: 0x83},
-       {value: 0xc929, lo: 0x84, hi: 0x84},
-       {value: 0xc979, lo: 0x85, hi: 0x85},
-       {value: 0xc9c9, lo: 0x86, hi: 0x86},
-       {value: 0xca19, lo: 0x87, hi: 0x87},
-       {value: 0xca69, lo: 0x88, hi: 0x88},
-       {value: 0x0040, lo: 0x89, hi: 0x8f},
-       {value: 0xcab9, lo: 0x90, hi: 0x90},
-       {value: 0xcad9, lo: 0x91, hi: 0x91},
-       {value: 0x0040, lo: 0x92, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xa5},
-       {value: 0x0040, lo: 0xa6, hi: 0xbf},
-       // Block 0xf3, offset 0x70f
-       {value: 0x0000, lo: 0x06},
-       {value: 0x0018, lo: 0x80, hi: 0x94},
-       {value: 0x0040, lo: 0x95, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xac},
-       {value: 0x0040, lo: 0xad, hi: 0xaf},
-       {value: 0x0018, lo: 0xb0, hi: 0xb8},
-       {value: 0x0040, lo: 0xb9, hi: 0xbf},
-       // Block 0xf4, offset 0x716
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0xb3},
-       {value: 0x0040, lo: 0xb4, hi: 0xbf},
-       // Block 0xf5, offset 0x719
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0x94},
-       {value: 0x0040, lo: 0x95, hi: 0xbf},
-       // Block 0xf6, offset 0x71c
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0018, lo: 0x80, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xbf},
-       // Block 0xf7, offset 0x720
-       {value: 0x0000, lo: 0x05},
-       {value: 0x0018, lo: 0x80, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0x99},
-       {value: 0x0040, lo: 0x9a, hi: 0x9f},
-       {value: 0x0018, lo: 0xa0, hi: 0xbf},
-       // Block 0xf8, offset 0x726
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x87},
-       {value: 0x0040, lo: 0x88, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xad},
-       {value: 0x0040, lo: 0xae, hi: 0xbf},
-       // Block 0xf9, offset 0x72b
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x8b},
-       {value: 0x0040, lo: 0x8c, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xbe},
-       {value: 0x0040, lo: 0xbf, hi: 0xbf},
-       // Block 0xfa, offset 0x730
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x8c},
-       {value: 0x0040, lo: 0x8d, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xab},
-       {value: 0x0040, lo: 0xac, hi: 0xbf},
-       // Block 0xfb, offset 0x735
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0018, lo: 0x80, hi: 0x97},
-       {value: 0x0040, lo: 0x98, hi: 0xbf},
-       // Block 0xfc, offset 0x738
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0018, lo: 0x80, hi: 0x80},
-       {value: 0x0040, lo: 0x81, hi: 0x8f},
-       {value: 0x0018, lo: 0x90, hi: 0xa6},
-       {value: 0x0040, lo: 0xa7, hi: 0xbf},
-       // Block 0xfd, offset 0x73d
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0x96},
-       {value: 0x0040, lo: 0x97, hi: 0xbf},
-       // Block 0xfe, offset 0x740
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xb4},
-       {value: 0x0040, lo: 0xb5, hi: 0xbf},
-       // Block 0xff, offset 0x743
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0x9d},
-       {value: 0x0040, lo: 0x9e, hi: 0x9f},
-       {value: 0x0008, lo: 0xa0, hi: 0xbf},
-       // Block 0x100, offset 0x747
-       {value: 0x0000, lo: 0x03},
-       {value: 0x0008, lo: 0x80, hi: 0xa1},
-       {value: 0x0040, lo: 0xa2, hi: 0xaf},
-       {value: 0x0008, lo: 0xb0, hi: 0xbf},
-       // Block 0x101, offset 0x74b
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0008, lo: 0x80, hi: 0xa0},
-       {value: 0x0040, lo: 0xa1, hi: 0xbf},
-       // Block 0x102, offset 0x74e
-       {value: 0x0020, lo: 0x0f},
-       {value: 0xdeb9, lo: 0x80, hi: 0x89},
-       {value: 0x8dfd, lo: 0x8a, hi: 0x8a},
-       {value: 0xdff9, lo: 0x8b, hi: 0x9c},
-       {value: 0x8e1d, lo: 0x9d, hi: 0x9d},
-       {value: 0xe239, lo: 0x9e, hi: 0xa2},
-       {value: 0x8e3d, lo: 0xa3, hi: 0xa3},
-       {value: 0xe2d9, lo: 0xa4, hi: 0xab},
-       {value: 0x7ed5, lo: 0xac, hi: 0xac},
-       {value: 0xe3d9, lo: 0xad, hi: 0xaf},
-       {value: 0x8e5d, lo: 0xb0, hi: 0xb0},
-       {value: 0xe439, lo: 0xb1, hi: 0xb6},
-       {value: 0x8e7d, lo: 0xb7, hi: 0xb9},
-       {value: 0xe4f9, lo: 0xba, hi: 0xba},
-       {value: 0x8edd, lo: 0xbb, hi: 0xbb},
-       {value: 0xe519, lo: 0xbc, hi: 0xbf},
-       // Block 0x103, offset 0x75e
-       {value: 0x0020, lo: 0x10},
-       {value: 0x937d, lo: 0x80, hi: 0x80},
-       {value: 0xf099, lo: 0x81, hi: 0x86},
-       {value: 0x939d, lo: 0x87, hi: 0x8a},
-       {value: 0xd9f9, lo: 0x8b, hi: 0x8b},
-       {value: 0xf159, lo: 0x8c, hi: 0x96},
-       {value: 0x941d, lo: 0x97, hi: 0x97},
-       {value: 0xf2b9, lo: 0x98, hi: 0xa3},
-       {value: 0x943d, lo: 0xa4, hi: 0xa6},
-       {value: 0xf439, lo: 0xa7, hi: 0xaa},
-       {value: 0x949d, lo: 0xab, hi: 0xab},
-       {value: 0xf4b9, lo: 0xac, hi: 0xac},
-       {value: 0x94bd, lo: 0xad, hi: 0xad},
-       {value: 0xf4d9, lo: 0xae, hi: 0xaf},
-       {value: 0x94dd, lo: 0xb0, hi: 0xb1},
-       {value: 0xf519, lo: 0xb2, hi: 0xbe},
-       {value: 0x2040, lo: 0xbf, hi: 0xbf},
-       // Block 0x104, offset 0x76f
-       {value: 0x0000, lo: 0x04},
-       {value: 0x0040, lo: 0x80, hi: 0x80},
-       {value: 0x0340, lo: 0x81, hi: 0x81},
-       {value: 0x0040, lo: 0x82, hi: 0x9f},
-       {value: 0x0340, lo: 0xa0, hi: 0xbf},
-       // Block 0x105, offset 0x774
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0340, lo: 0x80, hi: 0xbf},
-       // Block 0x106, offset 0x776
-       {value: 0x0000, lo: 0x01},
-       {value: 0x33c0, lo: 0x80, hi: 0xbf},
-       // Block 0x107, offset 0x778
-       {value: 0x0000, lo: 0x02},
-       {value: 0x33c0, lo: 0x80, hi: 0xaf},
-       {value: 0x0040, lo: 0xb0, hi: 0xbf},
-}
-
-// Total table size 42115 bytes (41KiB); checksum: F4A1FA4E
diff --git a/libgo/go/internal/x/net/idna/trie.go b/libgo/go/internal/x/net/idna/trie.go
deleted file mode 100644 (file)
index c4ef847..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package idna
-
-// appendMapping appends the mapping for the respective rune. isMapped must be
-// true. A mapping is a categorization of a rune as defined in UTS #46.
-func (c info) appendMapping(b []byte, s string) []byte {
-       index := int(c >> indexShift)
-       if c&xorBit == 0 {
-               s := mappings[index:]
-               return append(b, s[1:s[0]+1]...)
-       }
-       b = append(b, s...)
-       if c&inlineXOR == inlineXOR {
-               // TODO: support and handle two-byte inline masks
-               b[len(b)-1] ^= byte(index)
-       } else {
-               for p := len(b) - int(xorData[index]); p < len(b); p++ {
-                       index++
-                       b[p] ^= xorData[index]
-               }
-       }
-       return b
-}
-
-// Sparse block handling code.
-
-type valueRange struct {
-       value  uint16 // header: value:stride
-       lo, hi byte   // header: lo:n
-}
-
-type sparseBlocks struct {
-       values []valueRange
-       offset []uint16
-}
-
-var idnaSparse = sparseBlocks{
-       values: idnaSparseValues[:],
-       offset: idnaSparseOffset[:],
-}
-
-// Don't use newIdnaTrie to avoid unconditional linking in of the table.
-var trie = &idnaTrie{}
-
-// lookup determines the type of block n and looks up the value for b.
-// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
-// is a list of ranges with an accompanying value. Given a matching range r,
-// the value for b is by r.value + (b - r.lo) * stride.
-func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
-       offset := t.offset[n]
-       header := t.values[offset]
-       lo := offset + 1
-       hi := lo + uint16(header.lo)
-       for lo < hi {
-               m := lo + (hi-lo)/2
-               r := t.values[m]
-               if r.lo <= b && b <= r.hi {
-                       return r.value + uint16(b-r.lo)*header.value
-               }
-               if b < r.lo {
-                       hi = m
-               } else {
-                       lo = m + 1
-               }
-       }
-       return 0
-}
diff --git a/libgo/go/internal/x/net/idna/trieval.go b/libgo/go/internal/x/net/idna/trieval.go
deleted file mode 100644 (file)
index bf57260..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Code generated by running "go generate" in internal/x/text. DO NOT EDIT.
-
-package idna
-
-// This file contains definitions for interpreting the trie value of the idna
-// trie generated by "go run gen*.go". It is shared by both the generator
-// program and the resultant package. Sharing is achieved by the generator
-// copying gen_trieval.go to trieval.go and changing what's above this comment.
-
-// info holds information from the IDNA mapping table for a single rune. It is
-// the value returned by a trie lookup. In most cases, all information fits in
-// a 16-bit value. For mappings, this value may contain an index into a slice
-// with the mapped string. Such mappings can consist of the actual mapped value
-// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
-// input rune. This technique is used by the cases packages and reduces the
-// table size significantly.
-//
-// The per-rune values have the following format:
-//
-//   if mapped {
-//     if inlinedXOR {
-//       15..13 inline XOR marker
-//       12..11 unused
-//       10..3  inline XOR mask
-//     } else {
-//       15..3  index into xor or mapping table
-//     }
-//   } else {
-//       15..14 unused
-//       13     mayNeedNorm
-//       12..11 attributes
-//       10..8  joining type
-//        7..3  category type
-//   }
-//      2  use xor pattern
-//   1..0  mapped category
-//
-// See the definitions below for a more detailed description of the various
-// bits.
-type info uint16
-
-const (
-       catSmallMask = 0x3
-       catBigMask   = 0xF8
-       indexShift   = 3
-       xorBit       = 0x4    // interpret the index as an xor pattern
-       inlineXOR    = 0xE000 // These bits are set if the XOR pattern is inlined.
-
-       joinShift = 8
-       joinMask  = 0x07
-
-       // Attributes
-       attributesMask = 0x1800
-       viramaModifier = 0x1800
-       modifier       = 0x1000
-       rtl            = 0x0800
-
-       mayNeedNorm = 0x2000
-)
-
-// A category corresponds to a category defined in the IDNA mapping table.
-type category uint16
-
-const (
-       unknown              category = 0 // not currently defined in unicode.
-       mapped               category = 1
-       disallowedSTD3Mapped category = 2
-       deviation            category = 3
-)
-
-const (
-       valid               category = 0x08
-       validNV8            category = 0x18
-       validXV8            category = 0x28
-       disallowed          category = 0x40
-       disallowedSTD3Valid category = 0x80
-       ignored             category = 0xC0
-)
-
-// join types and additional rune information
-const (
-       joiningL = (iota + 1)
-       joiningD
-       joiningT
-       joiningR
-
-       //the following types are derived during processing
-       joinZWJ
-       joinZWNJ
-       joinVirama
-       numJoinTypes
-)
-
-func (c info) isMapped() bool {
-       return c&0x3 != 0
-}
-
-func (c info) category() category {
-       small := c & catSmallMask
-       if small != 0 {
-               return category(small)
-       }
-       return category(c & catBigMask)
-}
-
-func (c info) joinType() info {
-       if c.isMapped() {
-               return 0
-       }
-       return (c >> joinShift) & joinMask
-}
-
-func (c info) isModifier() bool {
-       return c&(modifier|catSmallMask) == modifier
-}
-
-func (c info) isViramaModifier() bool {
-       return c&(attributesMask|catSmallMask) == viramaModifier
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_bsd.go b/libgo/go/internal/x/net/internal/nettest/helper_bsd.go
deleted file mode 100644 (file)
index a6e433b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package nettest
-
-import (
-       "runtime"
-       "strconv"
-       "strings"
-       "syscall"
-)
-
-var darwinVersion int
-
-func init() {
-       if runtime.GOOS == "darwin" {
-               // See http://support.apple.com/kb/HT1633.
-               s, err := syscall.Sysctl("kern.osrelease")
-               if err != nil {
-                       return
-               }
-               ss := strings.Split(s, ".")
-               if len(ss) == 0 {
-                       return
-               }
-               darwinVersion, _ = strconv.Atoi(ss[0])
-       }
-}
-
-func supportsIPv6MulticastDeliveryOnLoopback() bool {
-       switch runtime.GOOS {
-       case "freebsd":
-               // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065.
-               // Even after the fix, it looks like the latest
-               // kernels don't deliver link-local scoped multicast
-               // packets correctly.
-               return false
-       case "darwin":
-               return !causesIPv6Crash()
-       default:
-               return true
-       }
-}
-
-func causesIPv6Crash() bool {
-       // We see some kernel crash when running IPv6 with IP-level
-       // options on Darwin kernel version 12 or below.
-       // See golang.org/issues/17015.
-       return darwinVersion < 13
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_nobsd.go b/libgo/go/internal/x/net/internal/nettest/helper_nobsd.go
deleted file mode 100644 (file)
index fc85532..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build aix hurd linux solaris
-
-package nettest
-
-func supportsIPv6MulticastDeliveryOnLoopback() bool {
-       return true
-}
-
-func causesIPv6Crash() bool {
-       return false
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_posix.go b/libgo/go/internal/x/net/internal/nettest/helper_posix.go
deleted file mode 100644 (file)
index ffbe4f9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris windows
-
-package nettest
-
-import (
-       "os"
-       "syscall"
-)
-
-func protocolNotSupported(err error) bool {
-       switch err := err.(type) {
-       case syscall.Errno:
-               switch err {
-               case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT:
-                       return true
-               }
-       case *os.SyscallError:
-               switch err := err.Err.(type) {
-               case syscall.Errno:
-                       switch err {
-                       case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT:
-                               return true
-                       }
-               }
-       }
-       return false
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_stub.go b/libgo/go/internal/x/net/internal/nettest/helper_stub.go
deleted file mode 100644 (file)
index d89cf29..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build js nacl plan9
-
-package nettest
-
-import (
-       "fmt"
-       "runtime"
-)
-
-func maxOpenFiles() int {
-       return defaultMaxOpenFiles
-}
-
-func supportsRawIPSocket() (string, bool) {
-       return fmt.Sprintf("not supported on %s", runtime.GOOS), false
-}
-
-func supportsIPv6MulticastDeliveryOnLoopback() bool {
-       return false
-}
-
-func causesIPv6Crash() bool {
-       return false
-}
-
-func protocolNotSupported(err error) bool {
-       return false
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_unix.go b/libgo/go/internal/x/net/internal/nettest/helper_unix.go
deleted file mode 100644 (file)
index d8397da..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris
-
-package nettest
-
-import (
-       "fmt"
-       "os"
-       "runtime"
-       "syscall"
-)
-
-func maxOpenFiles() int {
-       var rlim syscall.Rlimit
-       if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil {
-               return defaultMaxOpenFiles
-       }
-       return int(rlim.Cur)
-}
-
-func supportsRawIPSocket() (string, bool) {
-       if os.Getuid() != 0 {
-               return fmt.Sprintf("must be root on %s", runtime.GOOS), false
-       }
-       return "", true
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/helper_windows.go b/libgo/go/internal/x/net/internal/nettest/helper_windows.go
deleted file mode 100644 (file)
index 3dcb727..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package nettest
-
-import (
-       "fmt"
-       "runtime"
-       "syscall"
-)
-
-func maxOpenFiles() int {
-       return 4 * defaultMaxOpenFiles /* actually it's 16581375 */
-}
-
-func supportsRawIPSocket() (string, bool) {
-       // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx:
-       // Note: To use a socket of type SOCK_RAW requires administrative privileges.
-       // Users running Winsock applications that use raw sockets must be a member of
-       // the Administrators group on the local computer, otherwise raw socket calls
-       // will fail with an error code of WSAEACCES. On Windows Vista and later, access
-       // for raw sockets is enforced at socket creation. In earlier versions of Windows,
-       // access for raw sockets is enforced during other socket operations.
-       s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0)
-       if err == syscall.WSAEACCES {
-               return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false
-       }
-       if err != nil {
-               return err.Error(), false
-       }
-       syscall.Closesocket(s)
-       return "", true
-}
-
-func supportsIPv6MulticastDeliveryOnLoopback() bool {
-       return true
-}
-
-func causesIPv6Crash() bool {
-       return false
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/interface.go b/libgo/go/internal/x/net/internal/nettest/interface.go
deleted file mode 100644 (file)
index 8e6333a..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package nettest
-
-import "net"
-
-// IsMulticastCapable reports whether ifi is an IP multicast-capable
-// network interface. Network must be "ip", "ip4" or "ip6".
-func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) {
-       switch network {
-       case "ip", "ip4", "ip6":
-       default:
-               return nil, false
-       }
-       if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 {
-               return nil, false
-       }
-       return hasRoutableIP(network, ifi)
-}
-
-// RoutedInterface returns a network interface that can route IP
-// traffic and satisfies flags. It returns nil when an appropriate
-// network interface is not found. Network must be "ip", "ip4" or
-// "ip6".
-func RoutedInterface(network string, flags net.Flags) *net.Interface {
-       switch network {
-       case "ip", "ip4", "ip6":
-       default:
-               return nil
-       }
-       ift, err := net.Interfaces()
-       if err != nil {
-               return nil
-       }
-       for _, ifi := range ift {
-               if ifi.Flags&flags != flags {
-                       continue
-               }
-               if _, ok := hasRoutableIP(network, &ifi); !ok {
-                       continue
-               }
-               return &ifi
-       }
-       return nil
-}
-
-func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) {
-       ifat, err := ifi.Addrs()
-       if err != nil {
-               return nil, false
-       }
-       for _, ifa := range ifat {
-               switch ifa := ifa.(type) {
-               case *net.IPAddr:
-                       if ip := routableIP(network, ifa.IP); ip != nil {
-                               return ip, true
-                       }
-               case *net.IPNet:
-                       if ip := routableIP(network, ifa.IP); ip != nil {
-                               return ip, true
-                       }
-               }
-       }
-       return nil, false
-}
-
-func routableIP(network string, ip net.IP) net.IP {
-       if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() {
-               return nil
-       }
-       switch network {
-       case "ip4":
-               if ip := ip.To4(); ip != nil {
-                       return ip
-               }
-       case "ip6":
-               if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation
-                       return nil
-               }
-               if ip := ip.To16(); ip != nil && ip.To4() == nil {
-                       return ip
-               }
-       default:
-               if ip := ip.To4(); ip != nil {
-                       return ip
-               }
-               if ip := ip.To16(); ip != nil {
-                       return ip
-               }
-       }
-       return nil
-}
diff --git a/libgo/go/internal/x/net/internal/nettest/rlimit.go b/libgo/go/internal/x/net/internal/nettest/rlimit.go
deleted file mode 100644 (file)
index bb34aec..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package nettest
-
-const defaultMaxOpenFiles = 256
-
-// MaxOpenFiles returns the maximum number of open files for the
-// caller's process.
-func MaxOpenFiles() int { return maxOpenFiles() }
diff --git a/libgo/go/internal/x/net/internal/nettest/stack.go b/libgo/go/internal/x/net/internal/nettest/stack.go
deleted file mode 100644 (file)
index 1a545e2..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package nettest provides utilities for network testing.
-package nettest
-
-import (
-       "fmt"
-       "io/ioutil"
-       "net"
-       "os"
-       "runtime"
-)
-
-var (
-       supportsIPv4 bool
-       supportsIPv6 bool
-)
-
-func init() {
-       if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
-               ln.Close()
-               supportsIPv4 = true
-       }
-       if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil {
-               ln.Close()
-               supportsIPv6 = true
-       }
-}
-
-// SupportsIPv4 reports whether the platform supports IPv4 networking
-// functionality.
-func SupportsIPv4() bool { return supportsIPv4 }
-
-// SupportsIPv6 reports whether the platform supports IPv6 networking
-// functionality.
-func SupportsIPv6() bool { return supportsIPv6 }
-
-// SupportsRawIPSocket reports whether the platform supports raw IP
-// sockets.
-func SupportsRawIPSocket() (string, bool) {
-       return supportsRawIPSocket()
-}
-
-// SupportsIPv6MulticastDeliveryOnLoopback reports whether the
-// platform supports IPv6 multicast packet delivery on software
-// loopback interface.
-func SupportsIPv6MulticastDeliveryOnLoopback() bool {
-       return supportsIPv6MulticastDeliveryOnLoopback()
-}
-
-// ProtocolNotSupported reports whether err is a protocol not
-// supported error.
-func ProtocolNotSupported(err error) bool {
-       return protocolNotSupported(err)
-}
-
-// TestableNetwork reports whether network is testable on the current
-// platform configuration.
-func TestableNetwork(network string) bool {
-       // This is based on logic from standard library's
-       // net/platform_test.go.
-       switch network {
-       case "unix", "unixgram":
-               switch runtime.GOOS {
-               case "android", "js", "nacl", "plan9", "windows":
-                       return false
-               }
-               if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-                       return false
-               }
-       case "unixpacket":
-               switch runtime.GOOS {
-               case "aix", "android", "darwin", "freebsd", "js", "nacl", "plan9", "windows":
-                       return false
-               case "netbsd":
-                       // It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown.
-                       if runtime.GOARCH == "386" {
-                               return false
-                       }
-               }
-       }
-       return true
-}
-
-// NewLocalListener returns a listener which listens to a loopback IP
-// address or local file system path.
-// Network must be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
-func NewLocalListener(network string) (net.Listener, error) {
-       switch network {
-       case "tcp":
-               if supportsIPv4 {
-                       if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
-                               return ln, nil
-                       }
-               }
-               if supportsIPv6 {
-                       return net.Listen("tcp6", "[::1]:0")
-               }
-       case "tcp4":
-               if supportsIPv4 {
-                       return net.Listen("tcp4", "127.0.0.1:0")
-               }
-       case "tcp6":
-               if supportsIPv6 {
-                       return net.Listen("tcp6", "[::1]:0")
-               }
-       case "unix", "unixpacket":
-               return net.Listen(network, localPath())
-       }
-       return nil, fmt.Errorf("%s is not supported", network)
-}
-
-// NewLocalPacketListener returns a packet listener which listens to a
-// loopback IP address or local file system path.
-// Network must be "udp", "udp4", "udp6" or "unixgram".
-func NewLocalPacketListener(network string) (net.PacketConn, error) {
-       switch network {
-       case "udp":
-               if supportsIPv4 {
-                       if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil {
-                               return c, nil
-                       }
-               }
-               if supportsIPv6 {
-                       return net.ListenPacket("udp6", "[::1]:0")
-               }
-       case "udp4":
-               if supportsIPv4 {
-                       return net.ListenPacket("udp4", "127.0.0.1:0")
-               }
-       case "udp6":
-               if supportsIPv6 {
-                       return net.ListenPacket("udp6", "[::1]:0")
-               }
-       case "unixgram":
-               return net.ListenPacket(network, localPath())
-       }
-       return nil, fmt.Errorf("%s is not supported", network)
-}
-
-func localPath() string {
-       f, err := ioutil.TempFile("", "nettest")
-       if err != nil {
-               panic(err)
-       }
-       path := f.Name()
-       f.Close()
-       os.Remove(path)
-       return path
-}
diff --git a/libgo/go/internal/x/net/lif/address.go b/libgo/go/internal/x/net/lif/address.go
deleted file mode 100644 (file)
index afb957f..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import (
-       "errors"
-       "unsafe"
-)
-
-// An Addr represents an address associated with packet routing.
-type Addr interface {
-       // Family returns an address family.
-       Family() int
-}
-
-// An Inet4Addr represents an internet address for IPv4.
-type Inet4Addr struct {
-       IP        [4]byte // IP address
-       PrefixLen int     // address prefix length
-}
-
-// Family implements the Family method of Addr interface.
-func (a *Inet4Addr) Family() int { return sysAF_INET }
-
-// An Inet6Addr represents an internet address for IPv6.
-type Inet6Addr struct {
-       IP        [16]byte // IP address
-       PrefixLen int      // address prefix length
-       ZoneID    int      // zone identifier
-}
-
-// Family implements the Family method of Addr interface.
-func (a *Inet6Addr) Family() int { return sysAF_INET6 }
-
-// Addrs returns a list of interface addresses.
-//
-// The provided af must be an address family and name must be a data
-// link name. The zero value of af or name means a wildcard.
-func Addrs(af int, name string) ([]Addr, error) {
-       eps, err := newEndpoints(af)
-       if len(eps) == 0 {
-               return nil, err
-       }
-       defer func() {
-               for _, ep := range eps {
-                       ep.close()
-               }
-       }()
-       lls, err := links(eps, name)
-       if len(lls) == 0 {
-               return nil, err
-       }
-       var as []Addr
-       for _, ll := range lls {
-               var lifr lifreq
-               for i := 0; i < len(ll.Name); i++ {
-                       lifr.Name[i] = int8(ll.Name[i])
-               }
-               for _, ep := range eps {
-                       ioc := int64(sysSIOCGLIFADDR)
-                       err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifr))
-                       if err != nil {
-                               continue
-                       }
-                       sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0]))
-                       l := int(nativeEndian.Uint32(lifr.Lifru1[:4]))
-                       if l == 0 {
-                               continue
-                       }
-                       switch sa.Family {
-                       case sysAF_INET:
-                               a := &Inet4Addr{PrefixLen: l}
-                               copy(a.IP[:], lifr.Lifru[4:8])
-                               as = append(as, a)
-                       case sysAF_INET6:
-                               a := &Inet6Addr{PrefixLen: l, ZoneID: int(nativeEndian.Uint32(lifr.Lifru[24:28]))}
-                               copy(a.IP[:], lifr.Lifru[8:24])
-                               as = append(as, a)
-                       }
-               }
-       }
-       return as, nil
-}
-
-func parseLinkAddr(b []byte) ([]byte, error) {
-       nlen, alen, slen := int(b[1]), int(b[2]), int(b[3])
-       l := 4 + nlen + alen + slen
-       if len(b) < l {
-               return nil, errors.New("invalid address")
-       }
-       b = b[4:]
-       var addr []byte
-       if nlen > 0 {
-               b = b[nlen:]
-       }
-       if alen > 0 {
-               addr = make([]byte, alen)
-               copy(addr, b[:alen])
-       }
-       return addr, nil
-}
diff --git a/libgo/go/internal/x/net/lif/address_test.go b/libgo/go/internal/x/net/lif/address_test.go
deleted file mode 100644 (file)
index a25f10b..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import (
-       "fmt"
-       "testing"
-)
-
-type addrFamily int
-
-func (af addrFamily) String() string {
-       switch af {
-       case sysAF_UNSPEC:
-               return "unspec"
-       case sysAF_INET:
-               return "inet4"
-       case sysAF_INET6:
-               return "inet6"
-       default:
-               return fmt.Sprintf("%d", af)
-       }
-}
-
-const hexDigit = "0123456789abcdef"
-
-type llAddr []byte
-
-func (a llAddr) String() string {
-       if len(a) == 0 {
-               return ""
-       }
-       buf := make([]byte, 0, len(a)*3-1)
-       for i, b := range a {
-               if i > 0 {
-                       buf = append(buf, ':')
-               }
-               buf = append(buf, hexDigit[b>>4])
-               buf = append(buf, hexDigit[b&0xF])
-       }
-       return string(buf)
-}
-
-type ipAddr []byte
-
-func (a ipAddr) String() string {
-       if len(a) == 0 {
-               return "<nil>"
-       }
-       if len(a) == 4 {
-               return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3])
-       }
-       if len(a) == 16 {
-               return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15])
-       }
-       s := make([]byte, len(a)*2)
-       for i, tn := range a {
-               s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf]
-       }
-       return string(s)
-}
-
-func (a *Inet4Addr) String() string {
-       return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen)
-}
-
-func (a *Inet6Addr) String() string {
-       return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID)
-}
-
-type addrPack struct {
-       af int
-       as []Addr
-}
-
-func addrPacks() ([]addrPack, error) {
-       var lastErr error
-       var aps []addrPack
-       for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-               as, err := Addrs(af, "")
-               if err != nil {
-                       lastErr = err
-                       continue
-               }
-               aps = append(aps, addrPack{af: af, as: as})
-       }
-       return aps, lastErr
-}
-
-func TestAddrs(t *testing.T) {
-       aps, err := addrPacks()
-       if len(aps) == 0 && err != nil {
-               t.Fatal(err)
-       }
-       lps, err := linkPacks()
-       if len(lps) == 0 && err != nil {
-               t.Fatal(err)
-       }
-       for _, lp := range lps {
-               n := 0
-               for _, ll := range lp.lls {
-                       as, err := Addrs(lp.af, ll.Name)
-                       if err != nil {
-                               t.Fatal(lp.af, ll.Name, err)
-                       }
-                       t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as)
-                       n += len(as)
-               }
-               for _, ap := range aps {
-                       if ap.af != lp.af {
-                               continue
-                       }
-                       if n != len(ap.as) {
-                               t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as))
-                               continue
-                       }
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/lif/binary.go b/libgo/go/internal/x/net/lif/binary.go
deleted file mode 100644 (file)
index 738a94f..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-// This file contains duplicates of encoding/binary package.
-//
-// This package is supposed to be used by the net package of standard
-// library. Therefore the package set used in the package must be the
-// same as net package.
-
-var (
-       littleEndian binaryLittleEndian
-       bigEndian    binaryBigEndian
-)
-
-type binaryByteOrder interface {
-       Uint16([]byte) uint16
-       Uint32([]byte) uint32
-       Uint64([]byte) uint64
-       PutUint16([]byte, uint16)
-       PutUint32([]byte, uint32)
-       PutUint64([]byte, uint64)
-}
-
-type binaryLittleEndian struct{}
-
-func (binaryLittleEndian) Uint16(b []byte) uint16 {
-       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint16(b[0]) | uint16(b[1])<<8
-}
-
-func (binaryLittleEndian) PutUint16(b []byte, v uint16) {
-       _ = b[1] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v)
-       b[1] = byte(v >> 8)
-}
-
-func (binaryLittleEndian) Uint32(b []byte) uint32 {
-       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
-}
-
-func (binaryLittleEndian) PutUint32(b []byte, v uint32) {
-       _ = b[3] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v)
-       b[1] = byte(v >> 8)
-       b[2] = byte(v >> 16)
-       b[3] = byte(v >> 24)
-}
-
-func (binaryLittleEndian) Uint64(b []byte) uint64 {
-       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
-               uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
-}
-
-func (binaryLittleEndian) PutUint64(b []byte, v uint64) {
-       _ = b[7] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v)
-       b[1] = byte(v >> 8)
-       b[2] = byte(v >> 16)
-       b[3] = byte(v >> 24)
-       b[4] = byte(v >> 32)
-       b[5] = byte(v >> 40)
-       b[6] = byte(v >> 48)
-       b[7] = byte(v >> 56)
-}
-
-type binaryBigEndian struct{}
-
-func (binaryBigEndian) Uint16(b []byte) uint16 {
-       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint16(b[1]) | uint16(b[0])<<8
-}
-
-func (binaryBigEndian) PutUint16(b []byte, v uint16) {
-       _ = b[1] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v >> 8)
-       b[1] = byte(v)
-}
-
-func (binaryBigEndian) Uint32(b []byte) uint32 {
-       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
-}
-
-func (binaryBigEndian) PutUint32(b []byte, v uint32) {
-       _ = b[3] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v >> 24)
-       b[1] = byte(v >> 16)
-       b[2] = byte(v >> 8)
-       b[3] = byte(v)
-}
-
-func (binaryBigEndian) Uint64(b []byte) uint64 {
-       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
-               uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
-}
-
-func (binaryBigEndian) PutUint64(b []byte, v uint64) {
-       _ = b[7] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v >> 56)
-       b[1] = byte(v >> 48)
-       b[2] = byte(v >> 40)
-       b[3] = byte(v >> 32)
-       b[4] = byte(v >> 24)
-       b[5] = byte(v >> 16)
-       b[6] = byte(v >> 8)
-       b[7] = byte(v)
-}
diff --git a/libgo/go/internal/x/net/lif/defs_solaris.go b/libgo/go/internal/x/net/lif/defs_solaris.go
deleted file mode 100644 (file)
index 02c1998..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package lif
-
-/*
-#include <sys/socket.h>
-#include <sys/sockio.h>
-
-#include <net/if.h>
-#include <net/if_types.h>
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_DGRAM = C.SOCK_DGRAM
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-const (
-       sysLIFC_NOXMIT          = C.LIFC_NOXMIT
-       sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE
-       sysLIFC_TEMPORARY       = C.LIFC_TEMPORARY
-       sysLIFC_ALLZONES        = C.LIFC_ALLZONES
-       sysLIFC_UNDER_IPMP      = C.LIFC_UNDER_IPMP
-       sysLIFC_ENABLED         = C.LIFC_ENABLED
-
-       sysSIOCGLIFADDR    = C.SIOCGLIFADDR
-       sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR
-       sysSIOCGLIFFLAGS   = C.SIOCGLIFFLAGS
-       sysSIOCGLIFMTU     = C.SIOCGLIFMTU
-       sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK
-       sysSIOCGLIFMETRIC  = C.SIOCGLIFMETRIC
-       sysSIOCGLIFNUM     = C.SIOCGLIFNUM
-       sysSIOCGLIFINDEX   = C.SIOCGLIFINDEX
-       sysSIOCGLIFSUBNET  = C.SIOCGLIFSUBNET
-       sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO
-       sysSIOCGLIFCONF    = C.SIOCGLIFCONF
-       sysSIOCGLIFHWADDR  = C.SIOCGLIFHWADDR
-)
-
-const (
-       sysIFF_UP          = C.IFF_UP
-       sysIFF_BROADCAST   = C.IFF_BROADCAST
-       sysIFF_DEBUG       = C.IFF_DEBUG
-       sysIFF_LOOPBACK    = C.IFF_LOOPBACK
-       sysIFF_POINTOPOINT = C.IFF_POINTOPOINT
-       sysIFF_NOTRAILERS  = C.IFF_NOTRAILERS
-       sysIFF_RUNNING     = C.IFF_RUNNING
-       sysIFF_NOARP       = C.IFF_NOARP
-       sysIFF_PROMISC     = C.IFF_PROMISC
-       sysIFF_ALLMULTI    = C.IFF_ALLMULTI
-       sysIFF_INTELLIGENT = C.IFF_INTELLIGENT
-       sysIFF_MULTICAST   = C.IFF_MULTICAST
-       sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST
-       sysIFF_UNNUMBERED  = C.IFF_UNNUMBERED
-       sysIFF_PRIVATE     = C.IFF_PRIVATE
-)
-
-const (
-       sizeofLifnum       = C.sizeof_struct_lifnum
-       sizeofLifreq       = C.sizeof_struct_lifreq
-       sizeofLifconf      = C.sizeof_struct_lifconf
-       sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req
-)
-
-type lifnum C.struct_lifnum
-
-type lifreq C.struct_lifreq
-
-type lifconf C.struct_lifconf
-
-type lifIfinfoReq C.struct_lif_ifinfo_req
-
-const (
-       sysIFT_IPV4 = C.IFT_IPV4
-       sysIFT_IPV6 = C.IFT_IPV6
-       sysIFT_6TO4 = C.IFT_6TO4
-)
diff --git a/libgo/go/internal/x/net/lif/lif.go b/libgo/go/internal/x/net/lif/lif.go
deleted file mode 100644 (file)
index 6e81f81..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-// Package lif provides basic functions for the manipulation of
-// logical network interfaces and interface addresses on Solaris.
-//
-// The package supports Solaris 11 or above.
-package lif
-
-import "syscall"
-
-type endpoint struct {
-       af int
-       s  uintptr
-}
-
-func (ep *endpoint) close() error {
-       return syscall.Close(int(ep.s))
-}
-
-func newEndpoints(af int) ([]endpoint, error) {
-       var lastErr error
-       var eps []endpoint
-       afs := []int{sysAF_INET, sysAF_INET6}
-       if af != sysAF_UNSPEC {
-               afs = []int{af}
-       }
-       for _, af := range afs {
-               s, err := syscall.Socket(af, sysSOCK_DGRAM, 0)
-               if err != nil {
-                       lastErr = err
-                       continue
-               }
-               eps = append(eps, endpoint{af: af, s: uintptr(s)})
-       }
-       if len(eps) == 0 {
-               return nil, lastErr
-       }
-       return eps, nil
-}
diff --git a/libgo/go/internal/x/net/lif/link.go b/libgo/go/internal/x/net/lif/link.go
deleted file mode 100644 (file)
index 913a53e..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import "unsafe"
-
-// A Link represents logical data link information.
-//
-// It also represents base information for logical network interface.
-// On Solaris, each logical network interface represents network layer
-// adjacency information and the interface has a only single network
-// address or address pair for tunneling. It's usual that multiple
-// logical network interfaces share the same logical data link.
-type Link struct {
-       Name  string // name, equivalent to IP interface name
-       Index int    // index, equivalent to IP interface index
-       Type  int    // type
-       Flags int    // flags
-       MTU   int    // maximum transmission unit, basically link MTU but may differ between IP address families
-       Addr  []byte // address
-}
-
-func (ll *Link) fetch(s uintptr) {
-       var lifr lifreq
-       for i := 0; i < len(ll.Name); i++ {
-               lifr.Name[i] = int8(ll.Name[i])
-       }
-       ioc := int64(sysSIOCGLIFINDEX)
-       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
-               ll.Index = int(nativeEndian.Uint32(lifr.Lifru[:4]))
-       }
-       ioc = int64(sysSIOCGLIFFLAGS)
-       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
-               ll.Flags = int(nativeEndian.Uint64(lifr.Lifru[:8]))
-       }
-       ioc = int64(sysSIOCGLIFMTU)
-       if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
-               ll.MTU = int(nativeEndian.Uint32(lifr.Lifru[:4]))
-       }
-       switch ll.Type {
-       case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4:
-       default:
-               ioc = int64(sysSIOCGLIFHWADDR)
-               if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil {
-                       ll.Addr, _ = parseLinkAddr(lifr.Lifru[4:])
-               }
-       }
-}
-
-// Links returns a list of logical data links.
-//
-// The provided af must be an address family and name must be a data
-// link name. The zero value of af or name means a wildcard.
-func Links(af int, name string) ([]Link, error) {
-       eps, err := newEndpoints(af)
-       if len(eps) == 0 {
-               return nil, err
-       }
-       defer func() {
-               for _, ep := range eps {
-                       ep.close()
-               }
-       }()
-       return links(eps, name)
-}
-
-func links(eps []endpoint, name string) ([]Link, error) {
-       var lls []Link
-       lifn := lifnum{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP}
-       lifc := lifconf{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP}
-       for _, ep := range eps {
-               lifn.Family = uint16(ep.af)
-               ioc := int64(sysSIOCGLIFNUM)
-               if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifn)); err != nil {
-                       continue
-               }
-               if lifn.Count == 0 {
-                       continue
-               }
-               b := make([]byte, lifn.Count*sizeofLifreq)
-               lifc.Family = uint16(ep.af)
-               lifc.Len = lifn.Count * sizeofLifreq
-               if len(lifc.Lifcu) == 8 {
-                       nativeEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0]))))
-               } else {
-                       nativeEndian.PutUint32(lifc.Lifcu[:], uint32(uintptr(unsafe.Pointer(&b[0]))))
-               }
-               ioc = int64(sysSIOCGLIFCONF)
-               if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil {
-                       continue
-               }
-               nb := make([]byte, 32) // see LIFNAMSIZ in net/if.h
-               for i := 0; i < int(lifn.Count); i++ {
-                       lifr := (*lifreq)(unsafe.Pointer(&b[i*sizeofLifreq]))
-                       for i := 0; i < 32; i++ {
-                               if lifr.Name[i] == 0 {
-                                       nb = nb[:i]
-                                       break
-                               }
-                               nb[i] = byte(lifr.Name[i])
-                       }
-                       llname := string(nb)
-                       nb = nb[:32]
-                       if isDupLink(lls, llname) || name != "" && name != llname {
-                               continue
-                       }
-                       ll := Link{Name: llname, Type: int(lifr.Type)}
-                       ll.fetch(ep.s)
-                       lls = append(lls, ll)
-               }
-       }
-       return lls, nil
-}
-
-func isDupLink(lls []Link, name string) bool {
-       for _, ll := range lls {
-               if ll.Name == name {
-                       return true
-               }
-       }
-       return false
-}
diff --git a/libgo/go/internal/x/net/lif/link_test.go b/libgo/go/internal/x/net/lif/link_test.go
deleted file mode 100644 (file)
index 0cb9b95..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import (
-       "fmt"
-       "testing"
-)
-
-func (ll *Link) String() string {
-       return fmt.Sprintf("name=%s index=%d type=%d flags=%#x mtu=%d addr=%v", ll.Name, ll.Index, ll.Type, ll.Flags, ll.MTU, llAddr(ll.Addr))
-}
-
-type linkPack struct {
-       af  int
-       lls []Link
-}
-
-func linkPacks() ([]linkPack, error) {
-       var lastErr error
-       var lps []linkPack
-       for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-               lls, err := Links(af, "")
-               if err != nil {
-                       lastErr = err
-                       continue
-               }
-               lps = append(lps, linkPack{af: af, lls: lls})
-       }
-       return lps, lastErr
-}
-
-func TestLinks(t *testing.T) {
-       lps, err := linkPacks()
-       if len(lps) == 0 && err != nil {
-               t.Fatal(err)
-       }
-       for _, lp := range lps {
-               n := 0
-               for _, sll := range lp.lls {
-                       lls, err := Links(lp.af, sll.Name)
-                       if err != nil {
-                               t.Fatal(lp.af, sll.Name, err)
-                       }
-                       for _, ll := range lls {
-                               if ll.Name != sll.Name || ll.Index != sll.Index {
-                                       t.Errorf("af=%s got %v; want %v", addrFamily(lp.af), &ll, &sll)
-                                       continue
-                               }
-                               t.Logf("af=%s name=%s %v", addrFamily(lp.af), sll.Name, &ll)
-                               n++
-                       }
-               }
-               if n != len(lp.lls) {
-                       t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(lp.lls))
-                       continue
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/lif/sys.go b/libgo/go/internal/x/net/lif/sys.go
deleted file mode 100644 (file)
index c896041..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import "unsafe"
-
-var nativeEndian binaryByteOrder
-
-func init() {
-       i := uint32(1)
-       b := (*[4]byte)(unsafe.Pointer(&i))
-       if b[0] == 1 {
-               nativeEndian = littleEndian
-       } else {
-               nativeEndian = bigEndian
-       }
-}
diff --git a/libgo/go/internal/x/net/lif/syscall.go b/libgo/go/internal/x/net/lif/syscall.go
deleted file mode 100644 (file)
index ea75414..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package lif
-
-import (
-       "syscall"
-       "unsafe"
-)
-
-//extern __go_ioctl_ptr
-func libc_ioctl(int32, int32, unsafe.Pointer) int32
-
-func ioctl(s, ioc uintptr, arg unsafe.Pointer) error {
-       if libc_ioctl(int32(s), int32(ioc), arg) < 0 {
-               return syscall.GetErrno()
-       }
-       return nil
-}
diff --git a/libgo/go/internal/x/net/lif/zsys_solaris.go b/libgo/go/internal/x/net/lif/zsys_solaris.go
deleted file mode 100644 (file)
index 0d9ed2f..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_solaris.go
-
-package lif
-
-import "unsafe"
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_INET6  = 0x1a
-
-       sysSOCK_DGRAM = 0x1
-)
-
-type sockaddrStorage struct {
-       Family     uint16
-       X_ss_pad1  [6]int8
-       X_ss_align float64
-       X_ss_pad2  [240]int8
-}
-
-const (
-       sysLIFC_NOXMIT          = 0x1
-       sysLIFC_EXTERNAL_SOURCE = 0x2
-       sysLIFC_TEMPORARY       = 0x4
-       sysLIFC_ALLZONES        = 0x8
-       sysLIFC_UNDER_IPMP      = 0x10
-       sysLIFC_ENABLED         = 0x20
-
-       sysSIOCGLIFADDR    = -0x3f87968f
-       sysSIOCGLIFDSTADDR = -0x3f87968d
-       sysSIOCGLIFFLAGS   = -0x3f87968b
-       sysSIOCGLIFMTU     = -0x3f879686
-       sysSIOCGLIFNETMASK = -0x3f879683
-       sysSIOCGLIFMETRIC  = -0x3f879681
-       sysSIOCGLIFNUM     = -0x3ff3967e
-       sysSIOCGLIFINDEX   = -0x3f87967b
-       sysSIOCGLIFSUBNET  = -0x3f879676
-       sysSIOCGLIFLNKINFO = -0x3f879674
-       sysSIOCGLIFCONF    = -0x3fef965b
-       sysSIOCGLIFHWADDR  = -0x3f879640
-)
-
-const (
-       sysIFF_UP          = 0x1
-       sysIFF_BROADCAST   = 0x2
-       sysIFF_DEBUG       = 0x4
-       sysIFF_LOOPBACK    = 0x8
-       sysIFF_POINTOPOINT = 0x10
-       sysIFF_NOTRAILERS  = 0x20
-       sysIFF_RUNNING     = 0x40
-       sysIFF_NOARP       = 0x80
-       sysIFF_PROMISC     = 0x100
-       sysIFF_ALLMULTI    = 0x200
-       sysIFF_INTELLIGENT = 0x400
-       sysIFF_MULTICAST   = 0x800
-       sysIFF_MULTI_BCAST = 0x1000
-       sysIFF_UNNUMBERED  = 0x2000
-       sysIFF_PRIVATE     = 0x8000
-)
-
-const (
-       sizeofLifnum       = 0xc
-       sizeofLifreq       = 0x178
-       sizeofLifconf      = 0x18
-       sizeofLifIfinfoReq = 0x10
-)
-
-type lifnum struct {
-       Family    uint16
-       Flags     int32
-       Count     int32
-}
-
-type lifreq struct {
-       Name   [32]int8
-       Lifru1 [4]byte
-       Type   uint32
-       Lifru  [336]byte
-}
-
-type lifconf struct {
-       Family    uint16
-       Flags     int32
-       Len       int32
-       Lifcu     [unsafe.Sizeof(unsafe.Pointer(nil))]byte
-}
-
-type lifIfinfoReq struct {
-       Maxhops      uint8
-       Reachtime    uint32
-       Reachretrans uint32
-       Maxmtu       uint32
-}
-
-const (
-       sysIFT_IPV4 = 0xc8
-       sysIFT_IPV6 = 0xc9
-       sysIFT_6TO4 = 0xca
-)
diff --git a/libgo/go/internal/x/net/nettest/conntest.go b/libgo/go/internal/x/net/nettest/conntest.go
deleted file mode 100644 (file)
index 5bd3a8c..0000000
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package nettest provides utilities for network testing.
-package nettest
-
-import (
-       "bytes"
-       "encoding/binary"
-       "io"
-       "io/ioutil"
-       "math/rand"
-       "net"
-       "runtime"
-       "sync"
-       "testing"
-       "time"
-)
-
-var (
-       aLongTimeAgo = time.Unix(233431200, 0)
-       neverTimeout = time.Time{}
-)
-
-// MakePipe creates a connection between two endpoints and returns the pair
-// as c1 and c2, such that anything written to c1 is read by c2 and vice-versa.
-// The stop function closes all resources, including c1, c2, and the underlying
-// net.Listener (if there is one), and should not be nil.
-type MakePipe func() (c1, c2 net.Conn, stop func(), err error)
-
-// TestConn tests that a net.Conn implementation properly satisfies the interface.
-// The tests should not produce any false positives, but may experience
-// false negatives. Thus, some issues may only be detected when the test is
-// run multiple times. For maximal effectiveness, run the tests under the
-// race detector.
-func TestConn(t *testing.T, mp MakePipe) {
-       testConn(t, mp)
-}
-
-type connTester func(t *testing.T, c1, c2 net.Conn)
-
-func timeoutWrapper(t *testing.T, mp MakePipe, f connTester) {
-       c1, c2, stop, err := mp()
-       if err != nil {
-               t.Fatalf("unable to make pipe: %v", err)
-       }
-       var once sync.Once
-       defer once.Do(func() { stop() })
-       timer := time.AfterFunc(time.Minute, func() {
-               once.Do(func() {
-                       t.Error("test timed out; terminating pipe")
-                       stop()
-               })
-       })
-       defer timer.Stop()
-       f(t, c1, c2)
-}
-
-// testBasicIO tests that the data sent on c1 is properly received on c2.
-func testBasicIO(t *testing.T, c1, c2 net.Conn) {
-       want := make([]byte, 1<<20)
-       rand.New(rand.NewSource(0)).Read(want)
-
-       dataCh := make(chan []byte)
-       go func() {
-               rd := bytes.NewReader(want)
-               if err := chunkedCopy(c1, rd); err != nil {
-                       t.Errorf("unexpected c1.Write error: %v", err)
-               }
-               if err := c1.Close(); err != nil {
-                       t.Errorf("unexpected c1.Close error: %v", err)
-               }
-       }()
-
-       go func() {
-               wr := new(bytes.Buffer)
-               if err := chunkedCopy(wr, c2); err != nil {
-                       t.Errorf("unexpected c2.Read error: %v", err)
-               }
-               if err := c2.Close(); err != nil {
-                       t.Errorf("unexpected c2.Close error: %v", err)
-               }
-               dataCh <- wr.Bytes()
-       }()
-
-       if got := <-dataCh; !bytes.Equal(got, want) {
-               t.Errorf("transmitted data differs")
-       }
-}
-
-// testPingPong tests that the two endpoints can synchronously send data to
-// each other in a typical request-response pattern.
-func testPingPong(t *testing.T, c1, c2 net.Conn) {
-       var wg sync.WaitGroup
-       defer wg.Wait()
-
-       pingPonger := func(c net.Conn) {
-               defer wg.Done()
-               buf := make([]byte, 8)
-               var prev uint64
-               for {
-                       if _, err := io.ReadFull(c, buf); err != nil {
-                               if err == io.EOF {
-                                       break
-                               }
-                               t.Errorf("unexpected Read error: %v", err)
-                       }
-
-                       v := binary.LittleEndian.Uint64(buf)
-                       binary.LittleEndian.PutUint64(buf, v+1)
-                       if prev != 0 && prev+2 != v {
-                               t.Errorf("mismatching value: got %d, want %d", v, prev+2)
-                       }
-                       prev = v
-                       if v == 1000 {
-                               break
-                       }
-
-                       if _, err := c.Write(buf); err != nil {
-                               t.Errorf("unexpected Write error: %v", err)
-                               break
-                       }
-               }
-               if err := c.Close(); err != nil {
-                       t.Errorf("unexpected Close error: %v", err)
-               }
-       }
-
-       wg.Add(2)
-       go pingPonger(c1)
-       go pingPonger(c2)
-
-       // Start off the chain reaction.
-       if _, err := c1.Write(make([]byte, 8)); err != nil {
-               t.Errorf("unexpected c1.Write error: %v", err)
-       }
-}
-
-// testRacyRead tests that it is safe to mutate the input Read buffer
-// immediately after cancelation has occurred.
-func testRacyRead(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(c2, rand.New(rand.NewSource(0)))
-
-       var wg sync.WaitGroup
-       defer wg.Wait()
-
-       c1.SetReadDeadline(time.Now().Add(time.Millisecond))
-       for i := 0; i < 10; i++ {
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
-
-                       b1 := make([]byte, 1024)
-                       b2 := make([]byte, 1024)
-                       for j := 0; j < 100; j++ {
-                               _, err := c1.Read(b1)
-                               copy(b1, b2) // Mutate b1 to trigger potential race
-                               if err != nil {
-                                       checkForTimeoutError(t, err)
-                                       c1.SetReadDeadline(time.Now().Add(time.Millisecond))
-                               }
-                       }
-               }()
-       }
-}
-
-// testRacyWrite tests that it is safe to mutate the input Write buffer
-// immediately after cancelation has occurred.
-func testRacyWrite(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(ioutil.Discard, c2)
-
-       var wg sync.WaitGroup
-       defer wg.Wait()
-
-       c1.SetWriteDeadline(time.Now().Add(time.Millisecond))
-       for i := 0; i < 10; i++ {
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
-
-                       b1 := make([]byte, 1024)
-                       b2 := make([]byte, 1024)
-                       for j := 0; j < 100; j++ {
-                               _, err := c1.Write(b1)
-                               copy(b1, b2) // Mutate b1 to trigger potential race
-                               if err != nil {
-                                       checkForTimeoutError(t, err)
-                                       c1.SetWriteDeadline(time.Now().Add(time.Millisecond))
-                               }
-                       }
-               }()
-       }
-}
-
-// testReadTimeout tests that Read timeouts do not affect Write.
-func testReadTimeout(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(ioutil.Discard, c2)
-
-       c1.SetReadDeadline(aLongTimeAgo)
-       _, err := c1.Read(make([]byte, 1024))
-       checkForTimeoutError(t, err)
-       if _, err := c1.Write(make([]byte, 1024)); err != nil {
-               t.Errorf("unexpected Write error: %v", err)
-       }
-}
-
-// testWriteTimeout tests that Write timeouts do not affect Read.
-func testWriteTimeout(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(c2, rand.New(rand.NewSource(0)))
-
-       c1.SetWriteDeadline(aLongTimeAgo)
-       _, err := c1.Write(make([]byte, 1024))
-       checkForTimeoutError(t, err)
-       if _, err := c1.Read(make([]byte, 1024)); err != nil {
-               t.Errorf("unexpected Read error: %v", err)
-       }
-}
-
-// testPastTimeout tests that a deadline set in the past immediately times out
-// Read and Write requests.
-func testPastTimeout(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(c2, c2)
-
-       testRoundtrip(t, c1)
-
-       c1.SetDeadline(aLongTimeAgo)
-       n, err := c1.Write(make([]byte, 1024))
-       if n != 0 {
-               t.Errorf("unexpected Write count: got %d, want 0", n)
-       }
-       checkForTimeoutError(t, err)
-       n, err = c1.Read(make([]byte, 1024))
-       if n != 0 {
-               t.Errorf("unexpected Read count: got %d, want 0", n)
-       }
-       checkForTimeoutError(t, err)
-
-       testRoundtrip(t, c1)
-}
-
-// testPresentTimeout tests that a deadline set while there are pending
-// Read and Write operations immediately times out those operations.
-func testPresentTimeout(t *testing.T, c1, c2 net.Conn) {
-       var wg sync.WaitGroup
-       defer wg.Wait()
-       wg.Add(3)
-
-       deadlineSet := make(chan bool, 1)
-       go func() {
-               defer wg.Done()
-               time.Sleep(100 * time.Millisecond)
-               deadlineSet <- true
-               c1.SetReadDeadline(aLongTimeAgo)
-               c1.SetWriteDeadline(aLongTimeAgo)
-       }()
-       go func() {
-               defer wg.Done()
-               n, err := c1.Read(make([]byte, 1024))
-               if n != 0 {
-                       t.Errorf("unexpected Read count: got %d, want 0", n)
-               }
-               checkForTimeoutError(t, err)
-               if len(deadlineSet) == 0 {
-                       t.Error("Read timed out before deadline is set")
-               }
-       }()
-       go func() {
-               defer wg.Done()
-               var err error
-               for err == nil {
-                       _, err = c1.Write(make([]byte, 1024))
-               }
-               checkForTimeoutError(t, err)
-               if len(deadlineSet) == 0 {
-                       t.Error("Write timed out before deadline is set")
-               }
-       }()
-}
-
-// testFutureTimeout tests that a future deadline will eventually time out
-// Read and Write operations.
-func testFutureTimeout(t *testing.T, c1, c2 net.Conn) {
-       var wg sync.WaitGroup
-       wg.Add(2)
-
-       c1.SetDeadline(time.Now().Add(100 * time.Millisecond))
-       go func() {
-               defer wg.Done()
-               _, err := c1.Read(make([]byte, 1024))
-               checkForTimeoutError(t, err)
-       }()
-       go func() {
-               defer wg.Done()
-               var err error
-               for err == nil {
-                       _, err = c1.Write(make([]byte, 1024))
-               }
-               checkForTimeoutError(t, err)
-       }()
-       wg.Wait()
-
-       go chunkedCopy(c2, c2)
-       resyncConn(t, c1)
-       testRoundtrip(t, c1)
-}
-
-// testCloseTimeout tests that calling Close immediately times out pending
-// Read and Write operations.
-func testCloseTimeout(t *testing.T, c1, c2 net.Conn) {
-       go chunkedCopy(c2, c2)
-
-       var wg sync.WaitGroup
-       defer wg.Wait()
-       wg.Add(3)
-
-       // Test for cancelation upon connection closure.
-       c1.SetDeadline(neverTimeout)
-       go func() {
-               defer wg.Done()
-               time.Sleep(100 * time.Millisecond)
-               c1.Close()
-       }()
-       go func() {
-               defer wg.Done()
-               var err error
-               buf := make([]byte, 1024)
-               for err == nil {
-                       _, err = c1.Read(buf)
-               }
-       }()
-       go func() {
-               defer wg.Done()
-               var err error
-               buf := make([]byte, 1024)
-               for err == nil {
-                       _, err = c1.Write(buf)
-               }
-       }()
-}
-
-// testConcurrentMethods tests that the methods of net.Conn can safely
-// be called concurrently.
-func testConcurrentMethods(t *testing.T, c1, c2 net.Conn) {
-       if runtime.GOOS == "plan9" {
-               t.Skip("skipping on plan9; see https://golang.org/issue/20489")
-       }
-       go chunkedCopy(c2, c2)
-
-       // The results of the calls may be nonsensical, but this should
-       // not trigger a race detector warning.
-       var wg sync.WaitGroup
-       for i := 0; i < 100; i++ {
-               wg.Add(7)
-               go func() {
-                       defer wg.Done()
-                       c1.Read(make([]byte, 1024))
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.Write(make([]byte, 1024))
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.SetDeadline(time.Now().Add(10 * time.Millisecond))
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.SetReadDeadline(aLongTimeAgo)
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.SetWriteDeadline(aLongTimeAgo)
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.LocalAddr()
-               }()
-               go func() {
-                       defer wg.Done()
-                       c1.RemoteAddr()
-               }()
-       }
-       wg.Wait() // At worst, the deadline is set 10ms into the future
-
-       resyncConn(t, c1)
-       testRoundtrip(t, c1)
-}
-
-// checkForTimeoutError checks that the error satisfies the Error interface
-// and that Timeout returns true.
-func checkForTimeoutError(t *testing.T, err error) {
-       if nerr, ok := err.(net.Error); ok {
-               if !nerr.Timeout() {
-                       t.Errorf("err.Timeout() = false, want true")
-               }
-       } else {
-               t.Errorf("got %T, want net.Error", err)
-       }
-}
-
-// testRoundtrip writes something into c and reads it back.
-// It assumes that everything written into c is echoed back to itself.
-func testRoundtrip(t *testing.T, c net.Conn) {
-       if err := c.SetDeadline(neverTimeout); err != nil {
-               t.Errorf("roundtrip SetDeadline error: %v", err)
-       }
-
-       const s = "Hello, world!"
-       buf := []byte(s)
-       if _, err := c.Write(buf); err != nil {
-               t.Errorf("roundtrip Write error: %v", err)
-       }
-       if _, err := io.ReadFull(c, buf); err != nil {
-               t.Errorf("roundtrip Read error: %v", err)
-       }
-       if string(buf) != s {
-               t.Errorf("roundtrip data mismatch: got %q, want %q", buf, s)
-       }
-}
-
-// resyncConn resynchronizes the connection into a sane state.
-// It assumes that everything written into c is echoed back to itself.
-// It assumes that 0xff is not currently on the wire or in the read buffer.
-func resyncConn(t *testing.T, c net.Conn) {
-       c.SetDeadline(neverTimeout)
-       errCh := make(chan error)
-       go func() {
-               _, err := c.Write([]byte{0xff})
-               errCh <- err
-       }()
-       buf := make([]byte, 1024)
-       for {
-               n, err := c.Read(buf)
-               if n > 0 && bytes.IndexByte(buf[:n], 0xff) == n-1 {
-                       break
-               }
-               if err != nil {
-                       t.Errorf("unexpected Read error: %v", err)
-                       break
-               }
-       }
-       if err := <-errCh; err != nil {
-               t.Errorf("unexpected Write error: %v", err)
-       }
-}
-
-// chunkedCopy copies from r to w in fixed-width chunks to avoid
-// causing a Write that exceeds the maximum packet size for packet-based
-// connections like "unixpacket".
-// We assume that the maximum packet size is at least 1024.
-func chunkedCopy(w io.Writer, r io.Reader) error {
-       b := make([]byte, 1024)
-       _, err := io.CopyBuffer(struct{ io.Writer }{w}, struct{ io.Reader }{r}, b)
-       return err
-}
diff --git a/libgo/go/internal/x/net/nettest/conntest_go16.go b/libgo/go/internal/x/net/nettest/conntest_go16.go
deleted file mode 100644 (file)
index 4cbf48e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.7
-
-package nettest
-
-import "testing"
-
-func testConn(t *testing.T, mp MakePipe) {
-       // Avoid using subtests on Go 1.6 and below.
-       timeoutWrapper(t, mp, testBasicIO)
-       timeoutWrapper(t, mp, testPingPong)
-       timeoutWrapper(t, mp, testRacyRead)
-       timeoutWrapper(t, mp, testRacyWrite)
-       timeoutWrapper(t, mp, testReadTimeout)
-       timeoutWrapper(t, mp, testWriteTimeout)
-       timeoutWrapper(t, mp, testPastTimeout)
-       timeoutWrapper(t, mp, testPresentTimeout)
-       timeoutWrapper(t, mp, testFutureTimeout)
-       timeoutWrapper(t, mp, testCloseTimeout)
-       timeoutWrapper(t, mp, testConcurrentMethods)
-}
diff --git a/libgo/go/internal/x/net/nettest/conntest_go17.go b/libgo/go/internal/x/net/nettest/conntest_go17.go
deleted file mode 100644 (file)
index fa039f0..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.7
-
-package nettest
-
-import "testing"
-
-func testConn(t *testing.T, mp MakePipe) {
-       // Use subtests on Go 1.7 and above since it is better organized.
-       t.Run("BasicIO", func(t *testing.T) { timeoutWrapper(t, mp, testBasicIO) })
-       t.Run("PingPong", func(t *testing.T) { timeoutWrapper(t, mp, testPingPong) })
-       t.Run("RacyRead", func(t *testing.T) { timeoutWrapper(t, mp, testRacyRead) })
-       t.Run("RacyWrite", func(t *testing.T) { timeoutWrapper(t, mp, testRacyWrite) })
-       t.Run("ReadTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testReadTimeout) })
-       t.Run("WriteTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testWriteTimeout) })
-       t.Run("PastTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPastTimeout) })
-       t.Run("PresentTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPresentTimeout) })
-       t.Run("FutureTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testFutureTimeout) })
-       t.Run("CloseTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testCloseTimeout) })
-       t.Run("ConcurrentMethods", func(t *testing.T) { timeoutWrapper(t, mp, testConcurrentMethods) })
-}
diff --git a/libgo/go/internal/x/net/nettest/conntest_test.go b/libgo/go/internal/x/net/nettest/conntest_test.go
deleted file mode 100644 (file)
index e14df0e..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.8
-
-package nettest
-
-import (
-       "net"
-       "os"
-       "runtime"
-       "testing"
-
-       "internal/x/net/internal/nettest"
-)
-
-func TestTestConn(t *testing.T) {
-       tests := []struct{ name, network string }{
-               {"TCP", "tcp"},
-               {"UnixPipe", "unix"},
-               {"UnixPacketPipe", "unixpacket"},
-       }
-
-       for _, tt := range tests {
-               t.Run(tt.name, func(t *testing.T) {
-                       if !nettest.TestableNetwork(tt.network) {
-                               t.Skipf("not supported on %s", runtime.GOOS)
-                       }
-
-                       mp := func() (c1, c2 net.Conn, stop func(), err error) {
-                               ln, err := nettest.NewLocalListener(tt.network)
-                               if err != nil {
-                                       return nil, nil, nil, err
-                               }
-
-                               // Start a connection between two endpoints.
-                               var err1, err2 error
-                               done := make(chan bool)
-                               go func() {
-                                       c2, err2 = ln.Accept()
-                                       close(done)
-                               }()
-                               c1, err1 = net.Dial(ln.Addr().Network(), ln.Addr().String())
-                               <-done
-
-                               stop = func() {
-                                       if err1 == nil {
-                                               c1.Close()
-                                       }
-                                       if err2 == nil {
-                                               c2.Close()
-                                       }
-                                       ln.Close()
-                                       switch tt.network {
-                                       case "unix", "unixpacket":
-                                               os.Remove(ln.Addr().String())
-                                       }
-                               }
-
-                               switch {
-                               case err1 != nil:
-                                       stop()
-                                       return nil, nil, nil, err1
-                               case err2 != nil:
-                                       stop()
-                                       return nil, nil, nil, err2
-                               default:
-                                       return c1, c2, stop, nil
-                               }
-                       }
-
-                       TestConn(t, mp)
-               })
-       }
-}
diff --git a/libgo/go/internal/x/net/route/address.go b/libgo/go/internal/x/net/route/address.go
deleted file mode 100644 (file)
index e6bfa39..0000000
+++ /dev/null
@@ -1,425 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-import "runtime"
-
-// An Addr represents an address associated with packet routing.
-type Addr interface {
-       // Family returns an address family.
-       Family() int
-}
-
-// A LinkAddr represents a link-layer address.
-type LinkAddr struct {
-       Index int    // interface index when attached
-       Name  string // interface name when attached
-       Addr  []byte // link-layer address when attached
-}
-
-// Family implements the Family method of Addr interface.
-func (a *LinkAddr) Family() int { return sysAF_LINK }
-
-func (a *LinkAddr) lenAndSpace() (int, int) {
-       l := 8 + len(a.Name) + len(a.Addr)
-       return l, roundup(l)
-}
-
-func (a *LinkAddr) marshal(b []byte) (int, error) {
-       l, ll := a.lenAndSpace()
-       if len(b) < ll {
-               return 0, errShortBuffer
-       }
-       nlen, alen := len(a.Name), len(a.Addr)
-       if nlen > 255 || alen > 255 {
-               return 0, errInvalidAddr
-       }
-       b[0] = byte(l)
-       b[1] = sysAF_LINK
-       if a.Index > 0 {
-               nativeEndian.PutUint16(b[2:4], uint16(a.Index))
-       }
-       data := b[8:]
-       if nlen > 0 {
-               b[5] = byte(nlen)
-               copy(data[:nlen], a.Addr)
-               data = data[nlen:]
-       }
-       if alen > 0 {
-               b[6] = byte(alen)
-               copy(data[:alen], a.Name)
-               data = data[alen:]
-       }
-       return ll, nil
-}
-
-func parseLinkAddr(b []byte) (Addr, error) {
-       if len(b) < 8 {
-               return nil, errInvalidAddr
-       }
-       _, a, err := parseKernelLinkAddr(sysAF_LINK, b[4:])
-       if err != nil {
-               return nil, err
-       }
-       a.(*LinkAddr).Index = int(nativeEndian.Uint16(b[2:4]))
-       return a, nil
-}
-
-// parseKernelLinkAddr parses b as a link-layer address in
-// conventional BSD kernel form.
-func parseKernelLinkAddr(_ int, b []byte) (int, Addr, error) {
-       // The encoding looks like the following:
-       // +----------------------------+
-       // | Type             (1 octet) |
-       // +----------------------------+
-       // | Name length      (1 octet) |
-       // +----------------------------+
-       // | Address length   (1 octet) |
-       // +----------------------------+
-       // | Selector length  (1 octet) |
-       // +----------------------------+
-       // | Data            (variable) |
-       // +----------------------------+
-       //
-       // On some platforms, all-bit-one of length field means "don't
-       // care".
-       nlen, alen, slen := int(b[1]), int(b[2]), int(b[3])
-       if nlen == 0xff {
-               nlen = 0
-       }
-       if alen == 0xff {
-               alen = 0
-       }
-       if slen == 0xff {
-               slen = 0
-       }
-       l := 4 + nlen + alen + slen
-       if len(b) < l {
-               return 0, nil, errInvalidAddr
-       }
-       data := b[4:]
-       var name string
-       var addr []byte
-       if nlen > 0 {
-               name = string(data[:nlen])
-               data = data[nlen:]
-       }
-       if alen > 0 {
-               addr = data[:alen]
-               data = data[alen:]
-       }
-       return l, &LinkAddr{Name: name, Addr: addr}, nil
-}
-
-// An Inet4Addr represents an internet address for IPv4.
-type Inet4Addr struct {
-       IP [4]byte // IP address
-}
-
-// Family implements the Family method of Addr interface.
-func (a *Inet4Addr) Family() int { return sysAF_INET }
-
-func (a *Inet4Addr) lenAndSpace() (int, int) {
-       return sizeofSockaddrInet, roundup(sizeofSockaddrInet)
-}
-
-func (a *Inet4Addr) marshal(b []byte) (int, error) {
-       l, ll := a.lenAndSpace()
-       if len(b) < ll {
-               return 0, errShortBuffer
-       }
-       b[0] = byte(l)
-       b[1] = sysAF_INET
-       copy(b[4:8], a.IP[:])
-       return ll, nil
-}
-
-// An Inet6Addr represents an internet address for IPv6.
-type Inet6Addr struct {
-       IP     [16]byte // IP address
-       ZoneID int      // zone identifier
-}
-
-// Family implements the Family method of Addr interface.
-func (a *Inet6Addr) Family() int { return sysAF_INET6 }
-
-func (a *Inet6Addr) lenAndSpace() (int, int) {
-       return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6)
-}
-
-func (a *Inet6Addr) marshal(b []byte) (int, error) {
-       l, ll := a.lenAndSpace()
-       if len(b) < ll {
-               return 0, errShortBuffer
-       }
-       b[0] = byte(l)
-       b[1] = sysAF_INET6
-       copy(b[8:24], a.IP[:])
-       if a.ZoneID > 0 {
-               nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID))
-       }
-       return ll, nil
-}
-
-// parseInetAddr parses b as an internet address for IPv4 or IPv6.
-func parseInetAddr(af int, b []byte) (Addr, error) {
-       switch af {
-       case sysAF_INET:
-               if len(b) < sizeofSockaddrInet {
-                       return nil, errInvalidAddr
-               }
-               a := &Inet4Addr{}
-               copy(a.IP[:], b[4:8])
-               return a, nil
-       case sysAF_INET6:
-               if len(b) < sizeofSockaddrInet6 {
-                       return nil, errInvalidAddr
-               }
-               a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))}
-               copy(a.IP[:], b[8:24])
-               if a.IP[0] == 0xfe && a.IP[1]&0xc0 == 0x80 || a.IP[0] == 0xff && (a.IP[1]&0x0f == 0x01 || a.IP[1]&0x0f == 0x02) {
-                       // KAME based IPv6 protocol stack usually
-                       // embeds the interface index in the
-                       // interface-local or link-local address as
-                       // the kernel-internal form.
-                       id := int(bigEndian.Uint16(a.IP[2:4]))
-                       if id != 0 {
-                               a.ZoneID = id
-                               a.IP[2], a.IP[3] = 0, 0
-                       }
-               }
-               return a, nil
-       default:
-               return nil, errInvalidAddr
-       }
-}
-
-// parseKernelInetAddr parses b as an internet address in conventional
-// BSD kernel form.
-func parseKernelInetAddr(af int, b []byte) (int, Addr, error) {
-       // The encoding looks similar to the NLRI encoding.
-       // +----------------------------+
-       // | Length           (1 octet) |
-       // +----------------------------+
-       // | Address prefix  (variable) |
-       // +----------------------------+
-       //
-       // The differences between the kernel form and the NLRI
-       // encoding are:
-       //
-       // - The length field of the kernel form indicates the prefix
-       //   length in bytes, not in bits
-       //
-       // - In the kernel form, zero value of the length field
-       //   doesn't mean 0.0.0.0/0 or ::/0
-       //
-       // - The kernel form appends leading bytes to the prefix field
-       //   to make the <length, prefix> tuple to be conformed with
-       //   the routing message boundary
-       l := int(b[0])
-       if runtime.GOOS == "darwin" {
-               // On Darwn, an address in the kernel form is also
-               // used as a message filler.
-               if l == 0 || len(b) > roundup(l) {
-                       l = roundup(l)
-               }
-       } else {
-               l = roundup(l)
-       }
-       if len(b) < l {
-               return 0, nil, errInvalidAddr
-       }
-       // Don't reorder case expressions.
-       // The case expressions for IPv6 must come first.
-       const (
-               off4 = 4 // offset of in_addr
-               off6 = 8 // offset of in6_addr
-       )
-       switch {
-       case b[0] == sizeofSockaddrInet6:
-               a := &Inet6Addr{}
-               copy(a.IP[:], b[off6:off6+16])
-               return int(b[0]), a, nil
-       case af == sysAF_INET6:
-               a := &Inet6Addr{}
-               if l-1 < off6 {
-                       copy(a.IP[:], b[1:l])
-               } else {
-                       copy(a.IP[:], b[l-off6:l])
-               }
-               return int(b[0]), a, nil
-       case b[0] == sizeofSockaddrInet:
-               a := &Inet4Addr{}
-               copy(a.IP[:], b[off4:off4+4])
-               return int(b[0]), a, nil
-       default: // an old fashion, AF_UNSPEC or unknown means AF_INET
-               a := &Inet4Addr{}
-               if l-1 < off4 {
-                       copy(a.IP[:], b[1:l])
-               } else {
-                       copy(a.IP[:], b[l-off4:l])
-               }
-               return int(b[0]), a, nil
-       }
-}
-
-// A DefaultAddr represents an address of various operating
-// system-specific features.
-type DefaultAddr struct {
-       af  int
-       Raw []byte // raw format of address
-}
-
-// Family implements the Family method of Addr interface.
-func (a *DefaultAddr) Family() int { return a.af }
-
-func (a *DefaultAddr) lenAndSpace() (int, int) {
-       l := len(a.Raw)
-       return l, roundup(l)
-}
-
-func (a *DefaultAddr) marshal(b []byte) (int, error) {
-       l, ll := a.lenAndSpace()
-       if len(b) < ll {
-               return 0, errShortBuffer
-       }
-       if l > 255 {
-               return 0, errInvalidAddr
-       }
-       b[1] = byte(l)
-       copy(b[:l], a.Raw)
-       return ll, nil
-}
-
-func parseDefaultAddr(b []byte) (Addr, error) {
-       if len(b) < 2 || len(b) < int(b[0]) {
-               return nil, errInvalidAddr
-       }
-       a := &DefaultAddr{af: int(b[1]), Raw: b[:b[0]]}
-       return a, nil
-}
-
-func addrsSpace(as []Addr) int {
-       var l int
-       for _, a := range as {
-               switch a := a.(type) {
-               case *LinkAddr:
-                       _, ll := a.lenAndSpace()
-                       l += ll
-               case *Inet4Addr:
-                       _, ll := a.lenAndSpace()
-                       l += ll
-               case *Inet6Addr:
-                       _, ll := a.lenAndSpace()
-                       l += ll
-               case *DefaultAddr:
-                       _, ll := a.lenAndSpace()
-                       l += ll
-               }
-       }
-       return l
-}
-
-// marshalAddrs marshals as and returns a bitmap indicating which
-// address is stored in b.
-func marshalAddrs(b []byte, as []Addr) (uint, error) {
-       var attrs uint
-       for i, a := range as {
-               switch a := a.(type) {
-               case *LinkAddr:
-                       l, err := a.marshal(b)
-                       if err != nil {
-                               return 0, err
-                       }
-                       b = b[l:]
-                       attrs |= 1 << uint(i)
-               case *Inet4Addr:
-                       l, err := a.marshal(b)
-                       if err != nil {
-                               return 0, err
-                       }
-                       b = b[l:]
-                       attrs |= 1 << uint(i)
-               case *Inet6Addr:
-                       l, err := a.marshal(b)
-                       if err != nil {
-                               return 0, err
-                       }
-                       b = b[l:]
-                       attrs |= 1 << uint(i)
-               case *DefaultAddr:
-                       l, err := a.marshal(b)
-                       if err != nil {
-                               return 0, err
-                       }
-                       b = b[l:]
-                       attrs |= 1 << uint(i)
-               }
-       }
-       return attrs, nil
-}
-
-func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) {
-       var as [sysRTAX_MAX]Addr
-       af := int(sysAF_UNSPEC)
-       for i := uint(0); i < sysRTAX_MAX && len(b) >= roundup(0); i++ {
-               if attrs&(1<<i) == 0 {
-                       continue
-               }
-               if i <= sysRTAX_BRD {
-                       switch b[1] {
-                       case sysAF_LINK:
-                               a, err := parseLinkAddr(b)
-                               if err != nil {
-                                       return nil, err
-                               }
-                               as[i] = a
-                               l := roundup(int(b[0]))
-                               if len(b) < l {
-                                       return nil, errMessageTooShort
-                               }
-                               b = b[l:]
-                       case sysAF_INET, sysAF_INET6:
-                               af = int(b[1])
-                               a, err := parseInetAddr(af, b)
-                               if err != nil {
-                                       return nil, err
-                               }
-                               as[i] = a
-                               l := roundup(int(b[0]))
-                               if len(b) < l {
-                                       return nil, errMessageTooShort
-                               }
-                               b = b[l:]
-                       default:
-                               l, a, err := fn(af, b)
-                               if err != nil {
-                                       return nil, err
-                               }
-                               as[i] = a
-                               ll := roundup(l)
-                               if len(b) < ll {
-                                       b = b[l:]
-                               } else {
-                                       b = b[ll:]
-                               }
-                       }
-               } else {
-                       a, err := parseDefaultAddr(b)
-                       if err != nil {
-                               return nil, err
-                       }
-                       as[i] = a
-                       l := roundup(int(b[0]))
-                       if len(b) < l {
-                               return nil, errMessageTooShort
-                       }
-                       b = b[l:]
-               }
-       }
-       return as[:], nil
-}
diff --git a/libgo/go/internal/x/net/route/address_darwin_test.go b/libgo/go/internal/x/net/route/address_darwin_test.go
deleted file mode 100644 (file)
index b86bd3d..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import (
-       "reflect"
-       "testing"
-)
-
-type parseAddrsOnDarwinTest struct {
-       attrs uint
-       fn    func(int, []byte) (int, Addr, error)
-       b     []byte
-       as    []Addr
-}
-
-var parseAddrsOnDarwinLittleEndianTests = []parseAddrsOnDarwinTest{
-       {
-               sysRTA_DST | sysRTA_GATEWAY | sysRTA_NETMASK,
-               parseKernelInetAddr,
-               []byte{
-                       0x10, 0x2, 0x0, 0x0, 0xc0, 0xa8, 0x56, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-
-                       0x14, 0x12, 0x4, 0x0, 0x6, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0,
-
-                       0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-               },
-               []Addr{
-                       &Inet4Addr{IP: [4]byte{192, 168, 86, 0}},
-                       &LinkAddr{Index: 4},
-                       &Inet4Addr{IP: [4]byte{255, 255, 255, 255}},
-                       nil,
-                       nil,
-                       nil,
-                       nil,
-                       nil,
-               },
-       },
-}
-
-func TestParseAddrsOnDarwin(t *testing.T) {
-       tests := parseAddrsOnDarwinLittleEndianTests
-       if nativeEndian != littleEndian {
-               t.Skip("no test for non-little endian machine yet")
-       }
-
-       for i, tt := range tests {
-               as, err := parseAddrs(tt.attrs, tt.fn, tt.b)
-               if err != nil {
-                       t.Error(i, err)
-                       continue
-               }
-               if !reflect.DeepEqual(as, tt.as) {
-                       t.Errorf("#%d: got %+v; want %+v", i, as, tt.as)
-                       continue
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/route/address_test.go b/libgo/go/internal/x/net/route/address_test.go
deleted file mode 100644 (file)
index 2005ef7..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-import (
-       "reflect"
-       "testing"
-)
-
-type parseAddrsTest struct {
-       attrs uint
-       fn    func(int, []byte) (int, Addr, error)
-       b     []byte
-       as    []Addr
-}
-
-var parseAddrsLittleEndianTests = []parseAddrsTest{
-       {
-               sysRTA_DST | sysRTA_GATEWAY | sysRTA_NETMASK | sysRTA_BRD,
-               parseKernelInetAddr,
-               []byte{
-                       0x38, 0x12, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-
-                       0x38, 0x12, 0x2, 0x0, 0x6, 0x3, 0x6, 0x0,
-                       0x65, 0x6d, 0x31, 0x0, 0xc, 0x29, 0x66, 0x2c,
-                       0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-
-                       0x10, 0x2, 0x0, 0x0, 0xac, 0x10, 0xdc, 0xb4,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-
-                       0x10, 0x2, 0x0, 0x0, 0xac, 0x10, 0xdc, 0xff,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-               },
-               []Addr{
-                       &LinkAddr{Index: 0},
-                       &LinkAddr{Index: 2, Name: "em1", Addr: []byte{0x00, 0x0c, 0x29, 0x66, 0x2c, 0xdc}},
-                       &Inet4Addr{IP: [4]byte{172, 16, 220, 180}},
-                       nil,
-                       nil,
-                       nil,
-                       nil,
-                       &Inet4Addr{IP: [4]byte{172, 16, 220, 255}},
-               },
-       },
-       {
-               sysRTA_NETMASK | sysRTA_IFP | sysRTA_IFA,
-               parseKernelInetAddr,
-               []byte{
-                       0x7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0,
-
-                       0x18, 0x12, 0xa, 0x0, 0x87, 0x8, 0x0, 0x0,
-                       0x76, 0x6c, 0x61, 0x6e, 0x35, 0x36, 0x38, 0x32,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-
-                       0x10, 0x2, 0x0, 0x0, 0xa9, 0xfe, 0x0, 0x1,
-                       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-               },
-               []Addr{
-                       nil,
-                       nil,
-                       &Inet4Addr{IP: [4]byte{255, 255, 255, 0}},
-                       nil,
-                       &LinkAddr{Index: 10, Name: "vlan5682"},
-                       &Inet4Addr{IP: [4]byte{169, 254, 0, 1}},
-                       nil,
-                       nil,
-               },
-       },
-}
-
-func TestParseAddrs(t *testing.T) {
-       tests := parseAddrsLittleEndianTests
-       if nativeEndian != littleEndian {
-               t.Skip("no test for non-little endian machine yet")
-       }
-
-       for i, tt := range tests {
-               as, err := parseAddrs(tt.attrs, tt.fn, tt.b)
-               if err != nil {
-                       t.Error(i, err)
-                       continue
-               }
-               as = as[:8] // the list varies between operating systems
-               if !reflect.DeepEqual(as, tt.as) {
-                       t.Errorf("#%d: got %+v; want %+v", i, as, tt.as)
-                       continue
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/route/binary.go b/libgo/go/internal/x/net/route/binary.go
deleted file mode 100644 (file)
index 6910520..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-// This file contains duplicates of encoding/binary package.
-//
-// This package is supposed to be used by the net package of standard
-// library. Therefore the package set used in the package must be the
-// same as net package.
-
-var (
-       littleEndian binaryLittleEndian
-       bigEndian    binaryBigEndian
-)
-
-type binaryByteOrder interface {
-       Uint16([]byte) uint16
-       Uint32([]byte) uint32
-       PutUint16([]byte, uint16)
-       PutUint32([]byte, uint32)
-       Uint64([]byte) uint64
-}
-
-type binaryLittleEndian struct{}
-
-func (binaryLittleEndian) Uint16(b []byte) uint16 {
-       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint16(b[0]) | uint16(b[1])<<8
-}
-
-func (binaryLittleEndian) PutUint16(b []byte, v uint16) {
-       _ = b[1] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v)
-       b[1] = byte(v >> 8)
-}
-
-func (binaryLittleEndian) Uint32(b []byte) uint32 {
-       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
-}
-
-func (binaryLittleEndian) PutUint32(b []byte, v uint32) {
-       _ = b[3] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v)
-       b[1] = byte(v >> 8)
-       b[2] = byte(v >> 16)
-       b[3] = byte(v >> 24)
-}
-
-func (binaryLittleEndian) Uint64(b []byte) uint64 {
-       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
-               uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
-}
-
-type binaryBigEndian struct{}
-
-func (binaryBigEndian) Uint16(b []byte) uint16 {
-       _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint16(b[1]) | uint16(b[0])<<8
-}
-
-func (binaryBigEndian) PutUint16(b []byte, v uint16) {
-       _ = b[1] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v >> 8)
-       b[1] = byte(v)
-}
-
-func (binaryBigEndian) Uint32(b []byte) uint32 {
-       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
-}
-
-func (binaryBigEndian) PutUint32(b []byte, v uint32) {
-       _ = b[3] // early bounds check to guarantee safety of writes below
-       b[0] = byte(v >> 24)
-       b[1] = byte(v >> 16)
-       b[2] = byte(v >> 8)
-       b[3] = byte(v)
-}
-
-func (binaryBigEndian) Uint64(b []byte) uint64 {
-       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
-       return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
-               uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
-}
diff --git a/libgo/go/internal/x/net/route/defs_darwin.go b/libgo/go/internal/x/net/route/defs_darwin.go
deleted file mode 100644 (file)
index e771644..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package route
-
-/*
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_ROUTE  = C.AF_ROUTE
-       sysAF_LINK   = C.AF_LINK
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_RAW = C.SOCK_RAW
-
-       sysNET_RT_DUMP    = C.NET_RT_DUMP
-       sysNET_RT_FLAGS   = C.NET_RT_FLAGS
-       sysNET_RT_IFLIST  = C.NET_RT_IFLIST
-       sysNET_RT_STAT    = C.NET_RT_STAT
-       sysNET_RT_TRASH   = C.NET_RT_TRASH
-       sysNET_RT_IFLIST2 = C.NET_RT_IFLIST2
-       sysNET_RT_DUMP2   = C.NET_RT_DUMP2
-       sysNET_RT_MAXID   = C.NET_RT_MAXID
-)
-
-const (
-       sysCTL_MAXNAME = C.CTL_MAXNAME
-
-       sysCTL_UNSPEC  = C.CTL_UNSPEC
-       sysCTL_KERN    = C.CTL_KERN
-       sysCTL_VM      = C.CTL_VM
-       sysCTL_VFS     = C.CTL_VFS
-       sysCTL_NET     = C.CTL_NET
-       sysCTL_DEBUG   = C.CTL_DEBUG
-       sysCTL_HW      = C.CTL_HW
-       sysCTL_MACHDEP = C.CTL_MACHDEP
-       sysCTL_USER    = C.CTL_USER
-       sysCTL_MAXID   = C.CTL_MAXID
-)
-
-const (
-       sysRTM_VERSION = C.RTM_VERSION
-
-       sysRTM_ADD       = C.RTM_ADD
-       sysRTM_DELETE    = C.RTM_DELETE
-       sysRTM_CHANGE    = C.RTM_CHANGE
-       sysRTM_GET       = C.RTM_GET
-       sysRTM_LOSING    = C.RTM_LOSING
-       sysRTM_REDIRECT  = C.RTM_REDIRECT
-       sysRTM_MISS      = C.RTM_MISS
-       sysRTM_LOCK      = C.RTM_LOCK
-       sysRTM_OLDADD    = C.RTM_OLDADD
-       sysRTM_OLDDEL    = C.RTM_OLDDEL
-       sysRTM_RESOLVE   = C.RTM_RESOLVE
-       sysRTM_NEWADDR   = C.RTM_NEWADDR
-       sysRTM_DELADDR   = C.RTM_DELADDR
-       sysRTM_IFINFO    = C.RTM_IFINFO
-       sysRTM_NEWMADDR  = C.RTM_NEWMADDR
-       sysRTM_DELMADDR  = C.RTM_DELMADDR
-       sysRTM_IFINFO2   = C.RTM_IFINFO2
-       sysRTM_NEWMADDR2 = C.RTM_NEWMADDR2
-       sysRTM_GET2      = C.RTM_GET2
-
-       sysRTA_DST     = C.RTA_DST
-       sysRTA_GATEWAY = C.RTA_GATEWAY
-       sysRTA_NETMASK = C.RTA_NETMASK
-       sysRTA_GENMASK = C.RTA_GENMASK
-       sysRTA_IFP     = C.RTA_IFP
-       sysRTA_IFA     = C.RTA_IFA
-       sysRTA_AUTHOR  = C.RTA_AUTHOR
-       sysRTA_BRD     = C.RTA_BRD
-
-       sysRTAX_DST     = C.RTAX_DST
-       sysRTAX_GATEWAY = C.RTAX_GATEWAY
-       sysRTAX_NETMASK = C.RTAX_NETMASK
-       sysRTAX_GENMASK = C.RTAX_GENMASK
-       sysRTAX_IFP     = C.RTAX_IFP
-       sysRTAX_IFA     = C.RTAX_IFA
-       sysRTAX_AUTHOR  = C.RTAX_AUTHOR
-       sysRTAX_BRD     = C.RTAX_BRD
-       sysRTAX_MAX     = C.RTAX_MAX
-)
-
-const (
-       sizeofIfMsghdrDarwin15    = C.sizeof_struct_if_msghdr
-       sizeofIfaMsghdrDarwin15   = C.sizeof_struct_ifa_msghdr
-       sizeofIfmaMsghdrDarwin15  = C.sizeof_struct_ifma_msghdr
-       sizeofIfMsghdr2Darwin15   = C.sizeof_struct_if_msghdr2
-       sizeofIfmaMsghdr2Darwin15 = C.sizeof_struct_ifma_msghdr2
-       sizeofIfDataDarwin15      = C.sizeof_struct_if_data
-       sizeofIfData64Darwin15    = C.sizeof_struct_if_data64
-
-       sizeofRtMsghdrDarwin15  = C.sizeof_struct_rt_msghdr
-       sizeofRtMsghdr2Darwin15 = C.sizeof_struct_rt_msghdr2
-       sizeofRtMetricsDarwin15 = C.sizeof_struct_rt_metrics
-
-       sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
-       sizeofSockaddrInet    = C.sizeof_struct_sockaddr_in
-       sizeofSockaddrInet6   = C.sizeof_struct_sockaddr_in6
-)
diff --git a/libgo/go/internal/x/net/route/defs_dragonfly.go b/libgo/go/internal/x/net/route/defs_dragonfly.go
deleted file mode 100644 (file)
index dd31de2..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package route
-
-/*
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_ROUTE  = C.AF_ROUTE
-       sysAF_LINK   = C.AF_LINK
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_RAW = C.SOCK_RAW
-
-       sysNET_RT_DUMP   = C.NET_RT_DUMP
-       sysNET_RT_FLAGS  = C.NET_RT_FLAGS
-       sysNET_RT_IFLIST = C.NET_RT_IFLIST
-       sysNET_RT_MAXID  = C.NET_RT_MAXID
-)
-
-const (
-       sysCTL_MAXNAME = C.CTL_MAXNAME
-
-       sysCTL_UNSPEC   = C.CTL_UNSPEC
-       sysCTL_KERN     = C.CTL_KERN
-       sysCTL_VM       = C.CTL_VM
-       sysCTL_VFS      = C.CTL_VFS
-       sysCTL_NET      = C.CTL_NET
-       sysCTL_DEBUG    = C.CTL_DEBUG
-       sysCTL_HW       = C.CTL_HW
-       sysCTL_MACHDEP  = C.CTL_MACHDEP
-       sysCTL_USER     = C.CTL_USER
-       sysCTL_P1003_1B = C.CTL_P1003_1B
-       sysCTL_LWKT     = C.CTL_LWKT
-       sysCTL_MAXID    = C.CTL_MAXID
-)
-
-const (
-       sysRTM_VERSION = C.RTM_VERSION
-
-       sysRTM_ADD        = C.RTM_ADD
-       sysRTM_DELETE     = C.RTM_DELETE
-       sysRTM_CHANGE     = C.RTM_CHANGE
-       sysRTM_GET        = C.RTM_GET
-       sysRTM_LOSING     = C.RTM_LOSING
-       sysRTM_REDIRECT   = C.RTM_REDIRECT
-       sysRTM_MISS       = C.RTM_MISS
-       sysRTM_LOCK       = C.RTM_LOCK
-       sysRTM_OLDADD     = C.RTM_OLDADD
-       sysRTM_OLDDEL     = C.RTM_OLDDEL
-       sysRTM_RESOLVE    = C.RTM_RESOLVE
-       sysRTM_NEWADDR    = C.RTM_NEWADDR
-       sysRTM_DELADDR    = C.RTM_DELADDR
-       sysRTM_IFINFO     = C.RTM_IFINFO
-       sysRTM_NEWMADDR   = C.RTM_NEWMADDR
-       sysRTM_DELMADDR   = C.RTM_DELMADDR
-       sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE
-       sysRTM_IEEE80211  = C.RTM_IEEE80211
-
-       sysRTA_DST     = C.RTA_DST
-       sysRTA_GATEWAY = C.RTA_GATEWAY
-       sysRTA_NETMASK = C.RTA_NETMASK
-       sysRTA_GENMASK = C.RTA_GENMASK
-       sysRTA_IFP     = C.RTA_IFP
-       sysRTA_IFA     = C.RTA_IFA
-       sysRTA_AUTHOR  = C.RTA_AUTHOR
-       sysRTA_BRD     = C.RTA_BRD
-       sysRTA_MPLS1   = C.RTA_MPLS1
-       sysRTA_MPLS2   = C.RTA_MPLS2
-       sysRTA_MPLS3   = C.RTA_MPLS3
-
-       sysRTAX_DST     = C.RTAX_DST
-       sysRTAX_GATEWAY = C.RTAX_GATEWAY
-       sysRTAX_NETMASK = C.RTAX_NETMASK
-       sysRTAX_GENMASK = C.RTAX_GENMASK
-       sysRTAX_IFP     = C.RTAX_IFP
-       sysRTAX_IFA     = C.RTAX_IFA
-       sysRTAX_AUTHOR  = C.RTAX_AUTHOR
-       sysRTAX_BRD     = C.RTAX_BRD
-       sysRTAX_MPLS1   = C.RTAX_MPLS1
-       sysRTAX_MPLS2   = C.RTAX_MPLS2
-       sysRTAX_MPLS3   = C.RTAX_MPLS3
-       sysRTAX_MAX     = C.RTAX_MAX
-)
-
-const (
-       sizeofIfMsghdrDragonFlyBSD4         = C.sizeof_struct_if_msghdr
-       sizeofIfaMsghdrDragonFlyBSD4        = C.sizeof_struct_ifa_msghdr
-       sizeofIfmaMsghdrDragonFlyBSD4       = C.sizeof_struct_ifma_msghdr
-       sizeofIfAnnouncemsghdrDragonFlyBSD4 = C.sizeof_struct_if_announcemsghdr
-
-       sizeofRtMsghdrDragonFlyBSD4  = C.sizeof_struct_rt_msghdr
-       sizeofRtMetricsDragonFlyBSD4 = C.sizeof_struct_rt_metrics
-
-       sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
-       sizeofSockaddrInet    = C.sizeof_struct_sockaddr_in
-       sizeofSockaddrInet6   = C.sizeof_struct_sockaddr_in6
-)
diff --git a/libgo/go/internal/x/net/route/defs_freebsd.go b/libgo/go/internal/x/net/route/defs_freebsd.go
deleted file mode 100644 (file)
index d95594d..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package route
-
-/*
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-
-struct if_data_freebsd7 {
-       u_char ifi_type;
-       u_char ifi_physical;
-       u_char ifi_addrlen;
-       u_char ifi_hdrlen;
-       u_char ifi_link_state;
-       u_char ifi_spare_char1;
-       u_char ifi_spare_char2;
-       u_char ifi_datalen;
-       u_long ifi_mtu;
-       u_long ifi_metric;
-       u_long ifi_baudrate;
-       u_long ifi_ipackets;
-       u_long ifi_ierrors;
-       u_long ifi_opackets;
-       u_long ifi_oerrors;
-       u_long ifi_collisions;
-       u_long ifi_ibytes;
-       u_long ifi_obytes;
-       u_long ifi_imcasts;
-       u_long ifi_omcasts;
-       u_long ifi_iqdrops;
-       u_long ifi_noproto;
-       u_long ifi_hwassist;
-       time_t __ifi_epoch;
-       struct timeval __ifi_lastchange;
-};
-
-struct if_data_freebsd8 {
-       u_char ifi_type;
-       u_char ifi_physical;
-       u_char ifi_addrlen;
-       u_char ifi_hdrlen;
-       u_char ifi_link_state;
-       u_char ifi_spare_char1;
-       u_char ifi_spare_char2;
-       u_char ifi_datalen;
-       u_long ifi_mtu;
-       u_long ifi_metric;
-       u_long ifi_baudrate;
-       u_long ifi_ipackets;
-       u_long ifi_ierrors;
-       u_long ifi_opackets;
-       u_long ifi_oerrors;
-       u_long ifi_collisions;
-       u_long ifi_ibytes;
-       u_long ifi_obytes;
-       u_long ifi_imcasts;
-       u_long ifi_omcasts;
-       u_long ifi_iqdrops;
-       u_long ifi_noproto;
-       u_long ifi_hwassist;
-       time_t __ifi_epoch;
-       struct timeval __ifi_lastchange;
-};
-
-struct if_data_freebsd9 {
-       u_char ifi_type;
-       u_char ifi_physical;
-       u_char ifi_addrlen;
-       u_char ifi_hdrlen;
-       u_char ifi_link_state;
-       u_char ifi_spare_char1;
-       u_char ifi_spare_char2;
-       u_char ifi_datalen;
-       u_long ifi_mtu;
-       u_long ifi_metric;
-       u_long ifi_baudrate;
-       u_long ifi_ipackets;
-       u_long ifi_ierrors;
-       u_long ifi_opackets;
-       u_long ifi_oerrors;
-       u_long ifi_collisions;
-       u_long ifi_ibytes;
-       u_long ifi_obytes;
-       u_long ifi_imcasts;
-       u_long ifi_omcasts;
-       u_long ifi_iqdrops;
-       u_long ifi_noproto;
-       u_long ifi_hwassist;
-       time_t __ifi_epoch;
-       struct timeval __ifi_lastchange;
-};
-
-struct if_data_freebsd10 {
-       u_char ifi_type;
-       u_char ifi_physical;
-       u_char ifi_addrlen;
-       u_char ifi_hdrlen;
-       u_char ifi_link_state;
-       u_char ifi_vhid;
-       u_char ifi_baudrate_pf;
-       u_char ifi_datalen;
-       u_long ifi_mtu;
-       u_long ifi_metric;
-       u_long ifi_baudrate;
-       u_long ifi_ipackets;
-       u_long ifi_ierrors;
-       u_long ifi_opackets;
-       u_long ifi_oerrors;
-       u_long ifi_collisions;
-       u_long ifi_ibytes;
-       u_long ifi_obytes;
-       u_long ifi_imcasts;
-       u_long ifi_omcasts;
-       u_long ifi_iqdrops;
-       u_long ifi_noproto;
-       uint64_t ifi_hwassist;
-       time_t __ifi_epoch;
-       struct timeval __ifi_lastchange;
-};
-
-struct if_data_freebsd11 {
-       uint8_t ifi_type;
-       uint8_t ifi_physical;
-       uint8_t ifi_addrlen;
-       uint8_t ifi_hdrlen;
-       uint8_t ifi_link_state;
-       uint8_t ifi_vhid;
-       uint16_t ifi_datalen;
-       uint32_t ifi_mtu;
-       uint32_t ifi_metric;
-       uint64_t ifi_baudrate;
-       uint64_t ifi_ipackets;
-       uint64_t ifi_ierrors;
-       uint64_t ifi_opackets;
-       uint64_t ifi_oerrors;
-       uint64_t ifi_collisions;
-       uint64_t ifi_ibytes;
-       uint64_t ifi_obytes;
-       uint64_t ifi_imcasts;
-       uint64_t ifi_omcasts;
-       uint64_t ifi_iqdrops;
-       uint64_t ifi_oqdrops;
-       uint64_t ifi_noproto;
-       uint64_t ifi_hwassist;
-       union {
-               time_t tt;
-               uint64_t ph;
-       } __ifi_epoch;
-       union {
-               struct timeval tv;
-               struct {
-                       uint64_t ph1;
-                       uint64_t ph2;
-               } ph;
-       } __ifi_lastchange;
-};
-
-struct if_msghdr_freebsd7 {
-       u_short ifm_msglen;
-       u_char ifm_version;
-       u_char ifm_type;
-       int ifm_addrs;
-       int ifm_flags;
-       u_short ifm_index;
-       struct if_data_freebsd7 ifm_data;
-};
-
-struct if_msghdr_freebsd8 {
-       u_short ifm_msglen;
-       u_char ifm_version;
-       u_char ifm_type;
-       int ifm_addrs;
-       int ifm_flags;
-       u_short ifm_index;
-       struct if_data_freebsd8 ifm_data;
-};
-
-struct if_msghdr_freebsd9 {
-       u_short ifm_msglen;
-       u_char ifm_version;
-       u_char ifm_type;
-       int ifm_addrs;
-       int ifm_flags;
-       u_short ifm_index;
-       struct if_data_freebsd9 ifm_data;
-};
-
-struct if_msghdr_freebsd10 {
-       u_short ifm_msglen;
-       u_char ifm_version;
-       u_char ifm_type;
-       int ifm_addrs;
-       int ifm_flags;
-       u_short ifm_index;
-       struct if_data_freebsd10 ifm_data;
-};
-
-struct if_msghdr_freebsd11 {
-       u_short ifm_msglen;
-       u_char ifm_version;
-       u_char ifm_type;
-       int ifm_addrs;
-       int ifm_flags;
-       u_short ifm_index;
-       struct if_data_freebsd11 ifm_data;
-};
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_ROUTE  = C.AF_ROUTE
-       sysAF_LINK   = C.AF_LINK
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_RAW = C.SOCK_RAW
-
-       sysNET_RT_DUMP     = C.NET_RT_DUMP
-       sysNET_RT_FLAGS    = C.NET_RT_FLAGS
-       sysNET_RT_IFLIST   = C.NET_RT_IFLIST
-       sysNET_RT_IFMALIST = C.NET_RT_IFMALIST
-       sysNET_RT_IFLISTL  = C.NET_RT_IFLISTL
-)
-
-const (
-       sysCTL_MAXNAME = C.CTL_MAXNAME
-
-       sysCTL_UNSPEC   = C.CTL_UNSPEC
-       sysCTL_KERN     = C.CTL_KERN
-       sysCTL_VM       = C.CTL_VM
-       sysCTL_VFS      = C.CTL_VFS
-       sysCTL_NET      = C.CTL_NET
-       sysCTL_DEBUG    = C.CTL_DEBUG
-       sysCTL_HW       = C.CTL_HW
-       sysCTL_MACHDEP  = C.CTL_MACHDEP
-       sysCTL_USER     = C.CTL_USER
-       sysCTL_P1003_1B = C.CTL_P1003_1B
-)
-
-const (
-       sysRTM_VERSION = C.RTM_VERSION
-
-       sysRTM_ADD        = C.RTM_ADD
-       sysRTM_DELETE     = C.RTM_DELETE
-       sysRTM_CHANGE     = C.RTM_CHANGE
-       sysRTM_GET        = C.RTM_GET
-       sysRTM_LOSING     = C.RTM_LOSING
-       sysRTM_REDIRECT   = C.RTM_REDIRECT
-       sysRTM_MISS       = C.RTM_MISS
-       sysRTM_LOCK       = C.RTM_LOCK
-       sysRTM_RESOLVE    = C.RTM_RESOLVE
-       sysRTM_NEWADDR    = C.RTM_NEWADDR
-       sysRTM_DELADDR    = C.RTM_DELADDR
-       sysRTM_IFINFO     = C.RTM_IFINFO
-       sysRTM_NEWMADDR   = C.RTM_NEWMADDR
-       sysRTM_DELMADDR   = C.RTM_DELMADDR
-       sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE
-       sysRTM_IEEE80211  = C.RTM_IEEE80211
-
-       sysRTA_DST     = C.RTA_DST
-       sysRTA_GATEWAY = C.RTA_GATEWAY
-       sysRTA_NETMASK = C.RTA_NETMASK
-       sysRTA_GENMASK = C.RTA_GENMASK
-       sysRTA_IFP     = C.RTA_IFP
-       sysRTA_IFA     = C.RTA_IFA
-       sysRTA_AUTHOR  = C.RTA_AUTHOR
-       sysRTA_BRD     = C.RTA_BRD
-
-       sysRTAX_DST     = C.RTAX_DST
-       sysRTAX_GATEWAY = C.RTAX_GATEWAY
-       sysRTAX_NETMASK = C.RTAX_NETMASK
-       sysRTAX_GENMASK = C.RTAX_GENMASK
-       sysRTAX_IFP     = C.RTAX_IFP
-       sysRTAX_IFA     = C.RTAX_IFA
-       sysRTAX_AUTHOR  = C.RTAX_AUTHOR
-       sysRTAX_BRD     = C.RTAX_BRD
-       sysRTAX_MAX     = C.RTAX_MAX
-)
-
-const (
-       sizeofIfMsghdrlFreeBSD10        = C.sizeof_struct_if_msghdrl
-       sizeofIfaMsghdrFreeBSD10        = C.sizeof_struct_ifa_msghdr
-       sizeofIfaMsghdrlFreeBSD10       = C.sizeof_struct_ifa_msghdrl
-       sizeofIfmaMsghdrFreeBSD10       = C.sizeof_struct_ifma_msghdr
-       sizeofIfAnnouncemsghdrFreeBSD10 = C.sizeof_struct_if_announcemsghdr
-
-       sizeofRtMsghdrFreeBSD10  = C.sizeof_struct_rt_msghdr
-       sizeofRtMetricsFreeBSD10 = C.sizeof_struct_rt_metrics
-
-       sizeofIfMsghdrFreeBSD7  = C.sizeof_struct_if_msghdr_freebsd7
-       sizeofIfMsghdrFreeBSD8  = C.sizeof_struct_if_msghdr_freebsd8
-       sizeofIfMsghdrFreeBSD9  = C.sizeof_struct_if_msghdr_freebsd9
-       sizeofIfMsghdrFreeBSD10 = C.sizeof_struct_if_msghdr_freebsd10
-       sizeofIfMsghdrFreeBSD11 = C.sizeof_struct_if_msghdr_freebsd11
-
-       sizeofIfDataFreeBSD7  = C.sizeof_struct_if_data_freebsd7
-       sizeofIfDataFreeBSD8  = C.sizeof_struct_if_data_freebsd8
-       sizeofIfDataFreeBSD9  = C.sizeof_struct_if_data_freebsd9
-       sizeofIfDataFreeBSD10 = C.sizeof_struct_if_data_freebsd10
-       sizeofIfDataFreeBSD11 = C.sizeof_struct_if_data_freebsd11
-
-       sizeofIfMsghdrlFreeBSD10Emu        = C.sizeof_struct_if_msghdrl
-       sizeofIfaMsghdrFreeBSD10Emu        = C.sizeof_struct_ifa_msghdr
-       sizeofIfaMsghdrlFreeBSD10Emu       = C.sizeof_struct_ifa_msghdrl
-       sizeofIfmaMsghdrFreeBSD10Emu       = C.sizeof_struct_ifma_msghdr
-       sizeofIfAnnouncemsghdrFreeBSD10Emu = C.sizeof_struct_if_announcemsghdr
-
-       sizeofRtMsghdrFreeBSD10Emu  = C.sizeof_struct_rt_msghdr
-       sizeofRtMetricsFreeBSD10Emu = C.sizeof_struct_rt_metrics
-
-       sizeofIfMsghdrFreeBSD7Emu  = C.sizeof_struct_if_msghdr_freebsd7
-       sizeofIfMsghdrFreeBSD8Emu  = C.sizeof_struct_if_msghdr_freebsd8
-       sizeofIfMsghdrFreeBSD9Emu  = C.sizeof_struct_if_msghdr_freebsd9
-       sizeofIfMsghdrFreeBSD10Emu = C.sizeof_struct_if_msghdr_freebsd10
-       sizeofIfMsghdrFreeBSD11Emu = C.sizeof_struct_if_msghdr_freebsd11
-
-       sizeofIfDataFreeBSD7Emu  = C.sizeof_struct_if_data_freebsd7
-       sizeofIfDataFreeBSD8Emu  = C.sizeof_struct_if_data_freebsd8
-       sizeofIfDataFreeBSD9Emu  = C.sizeof_struct_if_data_freebsd9
-       sizeofIfDataFreeBSD10Emu = C.sizeof_struct_if_data_freebsd10
-       sizeofIfDataFreeBSD11Emu = C.sizeof_struct_if_data_freebsd11
-
-       sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
-       sizeofSockaddrInet    = C.sizeof_struct_sockaddr_in
-       sizeofSockaddrInet6   = C.sizeof_struct_sockaddr_in6
-)
diff --git a/libgo/go/internal/x/net/route/defs_netbsd.go b/libgo/go/internal/x/net/route/defs_netbsd.go
deleted file mode 100644 (file)
index b0abd54..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package route
-
-/*
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_ROUTE  = C.AF_ROUTE
-       sysAF_LINK   = C.AF_LINK
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_RAW = C.SOCK_RAW
-
-       sysNET_RT_DUMP   = C.NET_RT_DUMP
-       sysNET_RT_FLAGS  = C.NET_RT_FLAGS
-       sysNET_RT_IFLIST = C.NET_RT_IFLIST
-       sysNET_RT_MAXID  = C.NET_RT_MAXID
-)
-
-const (
-       sysCTL_MAXNAME = C.CTL_MAXNAME
-
-       sysCTL_UNSPEC   = C.CTL_UNSPEC
-       sysCTL_KERN     = C.CTL_KERN
-       sysCTL_VM       = C.CTL_VM
-       sysCTL_VFS      = C.CTL_VFS
-       sysCTL_NET      = C.CTL_NET
-       sysCTL_DEBUG    = C.CTL_DEBUG
-       sysCTL_HW       = C.CTL_HW
-       sysCTL_MACHDEP  = C.CTL_MACHDEP
-       sysCTL_USER     = C.CTL_USER
-       sysCTL_DDB      = C.CTL_DDB
-       sysCTL_PROC     = C.CTL_PROC
-       sysCTL_VENDOR   = C.CTL_VENDOR
-       sysCTL_EMUL     = C.CTL_EMUL
-       sysCTL_SECURITY = C.CTL_SECURITY
-       sysCTL_MAXID    = C.CTL_MAXID
-)
-
-const (
-       sysRTM_VERSION = C.RTM_VERSION
-
-       sysRTM_ADD        = C.RTM_ADD
-       sysRTM_DELETE     = C.RTM_DELETE
-       sysRTM_CHANGE     = C.RTM_CHANGE
-       sysRTM_GET        = C.RTM_GET
-       sysRTM_LOSING     = C.RTM_LOSING
-       sysRTM_REDIRECT   = C.RTM_REDIRECT
-       sysRTM_MISS       = C.RTM_MISS
-       sysRTM_LOCK       = C.RTM_LOCK
-       sysRTM_OLDADD     = C.RTM_OLDADD
-       sysRTM_OLDDEL     = C.RTM_OLDDEL
-       sysRTM_RESOLVE    = C.RTM_RESOLVE
-       sysRTM_NEWADDR    = C.RTM_NEWADDR
-       sysRTM_DELADDR    = C.RTM_DELADDR
-       sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE
-       sysRTM_IEEE80211  = C.RTM_IEEE80211
-       sysRTM_SETGATE    = C.RTM_SETGATE
-       sysRTM_LLINFO_UPD = C.RTM_LLINFO_UPD
-       sysRTM_IFINFO     = C.RTM_IFINFO
-       sysRTM_CHGADDR    = C.RTM_CHGADDR
-
-       sysRTA_DST     = C.RTA_DST
-       sysRTA_GATEWAY = C.RTA_GATEWAY
-       sysRTA_NETMASK = C.RTA_NETMASK
-       sysRTA_GENMASK = C.RTA_GENMASK
-       sysRTA_IFP     = C.RTA_IFP
-       sysRTA_IFA     = C.RTA_IFA
-       sysRTA_AUTHOR  = C.RTA_AUTHOR
-       sysRTA_BRD     = C.RTA_BRD
-       sysRTA_TAG     = C.RTA_TAG
-
-       sysRTAX_DST     = C.RTAX_DST
-       sysRTAX_GATEWAY = C.RTAX_GATEWAY
-       sysRTAX_NETMASK = C.RTAX_NETMASK
-       sysRTAX_GENMASK = C.RTAX_GENMASK
-       sysRTAX_IFP     = C.RTAX_IFP
-       sysRTAX_IFA     = C.RTAX_IFA
-       sysRTAX_AUTHOR  = C.RTAX_AUTHOR
-       sysRTAX_BRD     = C.RTAX_BRD
-       sysRTAX_TAG     = C.RTAX_TAG
-       sysRTAX_MAX     = C.RTAX_MAX
-)
-
-const (
-       sizeofIfMsghdrNetBSD7         = C.sizeof_struct_if_msghdr
-       sizeofIfaMsghdrNetBSD7        = C.sizeof_struct_ifa_msghdr
-       sizeofIfAnnouncemsghdrNetBSD7 = C.sizeof_struct_if_announcemsghdr
-
-       sizeofRtMsghdrNetBSD7  = C.sizeof_struct_rt_msghdr
-       sizeofRtMetricsNetBSD7 = C.sizeof_struct_rt_metrics
-
-       sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
-       sizeofSockaddrInet    = C.sizeof_struct_sockaddr_in
-       sizeofSockaddrInet6   = C.sizeof_struct_sockaddr_in6
-)
diff --git a/libgo/go/internal/x/net/route/defs_openbsd.go b/libgo/go/internal/x/net/route/defs_openbsd.go
deleted file mode 100644 (file)
index 173bb5d..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package route
-
-/*
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-*/
-import "C"
-
-const (
-       sysAF_UNSPEC = C.AF_UNSPEC
-       sysAF_INET   = C.AF_INET
-       sysAF_ROUTE  = C.AF_ROUTE
-       sysAF_LINK   = C.AF_LINK
-       sysAF_INET6  = C.AF_INET6
-
-       sysSOCK_RAW = C.SOCK_RAW
-
-       sysNET_RT_DUMP    = C.NET_RT_DUMP
-       sysNET_RT_FLAGS   = C.NET_RT_FLAGS
-       sysNET_RT_IFLIST  = C.NET_RT_IFLIST
-       sysNET_RT_STATS   = C.NET_RT_STATS
-       sysNET_RT_TABLE   = C.NET_RT_TABLE
-       sysNET_RT_IFNAMES = C.NET_RT_IFNAMES
-       sysNET_RT_MAXID   = C.NET_RT_MAXID
-)
-
-const (
-       sysCTL_MAXNAME = C.CTL_MAXNAME
-
-       sysCTL_UNSPEC  = C.CTL_UNSPEC
-       sysCTL_KERN    = C.CTL_KERN
-       sysCTL_VM      = C.CTL_VM
-       sysCTL_FS      = C.CTL_FS
-       sysCTL_NET     = C.CTL_NET
-       sysCTL_DEBUG   = C.CTL_DEBUG
-       sysCTL_HW      = C.CTL_HW
-       sysCTL_MACHDEP = C.CTL_MACHDEP
-       sysCTL_DDB     = C.CTL_DDB
-       sysCTL_VFS     = C.CTL_VFS
-       sysCTL_MAXID   = C.CTL_MAXID
-)
-
-const (
-       sysRTM_VERSION = C.RTM_VERSION
-
-       sysRTM_ADD        = C.RTM_ADD
-       sysRTM_DELETE     = C.RTM_DELETE
-       sysRTM_CHANGE     = C.RTM_CHANGE
-       sysRTM_GET        = C.RTM_GET
-       sysRTM_LOSING     = C.RTM_LOSING
-       sysRTM_REDIRECT   = C.RTM_REDIRECT
-       sysRTM_MISS       = C.RTM_MISS
-       sysRTM_LOCK       = C.RTM_LOCK
-       sysRTM_RESOLVE    = C.RTM_RESOLVE
-       sysRTM_NEWADDR    = C.RTM_NEWADDR
-       sysRTM_DELADDR    = C.RTM_DELADDR
-       sysRTM_IFINFO     = C.RTM_IFINFO
-       sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE
-       sysRTM_DESYNC     = C.RTM_DESYNC
-       sysRTM_INVALIDATE = C.RTM_INVALIDATE
-       sysRTM_BFD        = C.RTM_BFD
-       sysRTM_PROPOSAL   = C.RTM_PROPOSAL
-
-       sysRTA_DST     = C.RTA_DST
-       sysRTA_GATEWAY = C.RTA_GATEWAY
-       sysRTA_NETMASK = C.RTA_NETMASK
-       sysRTA_GENMASK = C.RTA_GENMASK
-       sysRTA_IFP     = C.RTA_IFP
-       sysRTA_IFA     = C.RTA_IFA
-       sysRTA_AUTHOR  = C.RTA_AUTHOR
-       sysRTA_BRD     = C.RTA_BRD
-       sysRTA_SRC     = C.RTA_SRC
-       sysRTA_SRCMASK = C.RTA_SRCMASK
-       sysRTA_LABEL   = C.RTA_LABEL
-       sysRTA_BFD     = C.RTA_BFD
-       sysRTA_DNS     = C.RTA_DNS
-       sysRTA_STATIC  = C.RTA_STATIC
-       sysRTA_SEARCH  = C.RTA_SEARCH
-
-       sysRTAX_DST     = C.RTAX_DST
-       sysRTAX_GATEWAY = C.RTAX_GATEWAY
-       sysRTAX_NETMASK = C.RTAX_NETMASK
-       sysRTAX_GENMASK = C.RTAX_GENMASK
-       sysRTAX_IFP     = C.RTAX_IFP
-       sysRTAX_IFA     = C.RTAX_IFA
-       sysRTAX_AUTHOR  = C.RTAX_AUTHOR
-       sysRTAX_BRD     = C.RTAX_BRD
-       sysRTAX_SRC     = C.RTAX_SRC
-       sysRTAX_SRCMASK = C.RTAX_SRCMASK
-       sysRTAX_LABEL   = C.RTAX_LABEL
-       sysRTAX_BFD     = C.RTAX_BFD
-       sysRTAX_DNS     = C.RTAX_DNS
-       sysRTAX_STATIC  = C.RTAX_STATIC
-       sysRTAX_SEARCH  = C.RTAX_SEARCH
-       sysRTAX_MAX     = C.RTAX_MAX
-)
-
-const (
-       sizeofRtMsghdr = C.sizeof_struct_rt_msghdr
-
-       sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
-       sizeofSockaddrInet    = C.sizeof_struct_sockaddr_in
-       sizeofSockaddrInet6   = C.sizeof_struct_sockaddr_in6
-)
diff --git a/libgo/go/internal/x/net/route/interface.go b/libgo/go/internal/x/net/route/interface.go
deleted file mode 100644 (file)
index 05ef2a9..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-// An InterfaceMessage represents an interface message.
-type InterfaceMessage struct {
-       Version int    // message version
-       Type    int    // message type
-       Flags   int    // interface flags
-       Index   int    // interface index
-       Name    string // interface name
-       Addrs   []Addr // addresses
-
-       extOff int    // offset of header extension
-       raw    []byte // raw message
-}
-
-// An InterfaceAddrMessage represents an interface address message.
-type InterfaceAddrMessage struct {
-       Version int    // message version
-       Type    int    // message type
-       Flags   int    // interface flags
-       Index   int    // interface index
-       Addrs   []Addr // addresses
-
-       raw []byte // raw message
-}
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceAddrMessage) Sys() []Sys { return nil }
-
-// An InterfaceMulticastAddrMessage represents an interface multicast
-// address message.
-type InterfaceMulticastAddrMessage struct {
-       Version int    // message version
-       Type    int    // message type
-       Flags   int    // interface flags
-       Index   int    // interface index
-       Addrs   []Addr // addresses
-
-       raw []byte // raw message
-}
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMulticastAddrMessage) Sys() []Sys { return nil }
-
-// An InterfaceAnnounceMessage represents an interface announcement
-// message.
-type InterfaceAnnounceMessage struct {
-       Version int    // message version
-       Type    int    // message type
-       Index   int    // interface index
-       Name    string // interface name
-       What    int    // what type of announcement
-
-       raw []byte // raw message
-}
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceAnnounceMessage) Sys() []Sys { return nil }
diff --git a/libgo/go/internal/x/net/route/interface_announce.go b/libgo/go/internal/x/net/route/interface_announce.go
deleted file mode 100644 (file)
index 520d657..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd netbsd
-
-package route
-
-func (w *wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < w.bodyOff {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceAnnounceMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Index:   int(nativeEndian.Uint16(b[4:6])),
-               What:    int(nativeEndian.Uint16(b[22:24])),
-               raw:     b[:l],
-       }
-       for i := 0; i < 16; i++ {
-               if b[6+i] != 0 {
-                       continue
-               }
-               m.Name = string(b[6 : 6+i])
-               break
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/interface_classic.go b/libgo/go/internal/x/net/route/interface_classic.go
deleted file mode 100644 (file)
index ac4e7a6..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly netbsd
-
-package route
-
-import "runtime"
-
-func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < w.bodyOff {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       attrs := uint(nativeEndian.Uint32(b[4:8]))
-       if attrs&sysRTA_IFP == 0 {
-               return nil, nil
-       }
-       m := &InterfaceMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Addrs:   make([]Addr, sysRTAX_MAX),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               Index:   int(nativeEndian.Uint16(b[12:14])),
-               extOff:  w.extOff,
-               raw:     b[:l],
-       }
-       a, err := parseLinkAddr(b[w.bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       m.Addrs[sysRTAX_IFP] = a
-       m.Name = a.(*LinkAddr).Name
-       return m, nil
-}
-
-func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < w.bodyOff {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceAddrMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               raw:     b[:l],
-       }
-       if runtime.GOOS == "netbsd" {
-               m.Index = int(nativeEndian.Uint16(b[16:18]))
-       } else {
-               m.Index = int(nativeEndian.Uint16(b[12:14]))
-       }
-       var err error
-       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/interface_freebsd.go b/libgo/go/internal/x/net/route/interface_freebsd.go
deleted file mode 100644 (file)
index 9f6f50c..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) {
-       var extOff, bodyOff int
-       if typ == sysNET_RT_IFLISTL {
-               if len(b) < 20 {
-                       return nil, errMessageTooShort
-               }
-               extOff = int(nativeEndian.Uint16(b[18:20]))
-               bodyOff = int(nativeEndian.Uint16(b[16:18]))
-       } else {
-               extOff = w.extOff
-               bodyOff = w.bodyOff
-       }
-       if len(b) < extOff || len(b) < bodyOff {
-               return nil, errInvalidMessage
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       attrs := uint(nativeEndian.Uint32(b[4:8]))
-       if attrs&sysRTA_IFP == 0 {
-               return nil, nil
-       }
-       m := &InterfaceMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               Index:   int(nativeEndian.Uint16(b[12:14])),
-               Addrs:   make([]Addr, sysRTAX_MAX),
-               extOff:  extOff,
-               raw:     b[:l],
-       }
-       a, err := parseLinkAddr(b[bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       m.Addrs[sysRTAX_IFP] = a
-       m.Name = a.(*LinkAddr).Name
-       return m, nil
-}
-
-func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) {
-       var bodyOff int
-       if typ == sysNET_RT_IFLISTL {
-               if len(b) < 24 {
-                       return nil, errMessageTooShort
-               }
-               bodyOff = int(nativeEndian.Uint16(b[16:18]))
-       } else {
-               bodyOff = w.bodyOff
-       }
-       if len(b) < bodyOff {
-               return nil, errInvalidMessage
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceAddrMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               Index:   int(nativeEndian.Uint16(b[12:14])),
-               raw:     b[:l],
-       }
-       var err error
-       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/interface_multicast.go b/libgo/go/internal/x/net/route/interface_multicast.go
deleted file mode 100644 (file)
index 1e99a9c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd
-
-package route
-
-func (w *wireFormat) parseInterfaceMulticastAddrMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < w.bodyOff {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceMulticastAddrMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               Index:   int(nativeEndian.Uint16(b[12:14])),
-               raw:     b[:l],
-       }
-       var err error
-       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/interface_openbsd.go b/libgo/go/internal/x/net/route/interface_openbsd.go
deleted file mode 100644 (file)
index e4a143c..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < 32 {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       attrs := uint(nativeEndian.Uint32(b[12:16]))
-       if attrs&sysRTA_IFP == 0 {
-               return nil, nil
-       }
-       m := &InterfaceMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[16:20])),
-               Index:   int(nativeEndian.Uint16(b[6:8])),
-               Addrs:   make([]Addr, sysRTAX_MAX),
-               raw:     b[:l],
-       }
-       ll := int(nativeEndian.Uint16(b[4:6]))
-       if len(b) < ll {
-               return nil, errInvalidMessage
-       }
-       a, err := parseLinkAddr(b[ll:])
-       if err != nil {
-               return nil, err
-       }
-       m.Addrs[sysRTAX_IFP] = a
-       m.Name = a.(*LinkAddr).Name
-       return m, nil
-}
-
-func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < 24 {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       bodyOff := int(nativeEndian.Uint16(b[4:6]))
-       if len(b) < bodyOff {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceAddrMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[12:16])),
-               Index:   int(nativeEndian.Uint16(b[6:8])),
-               raw:     b[:l],
-       }
-       var err error
-       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       return m, nil
-}
-
-func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < 26 {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &InterfaceAnnounceMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Index:   int(nativeEndian.Uint16(b[6:8])),
-               What:    int(nativeEndian.Uint16(b[8:10])),
-               raw:     b[:l],
-       }
-       for i := 0; i < 16; i++ {
-               if b[10+i] != 0 {
-                       continue
-               }
-               m.Name = string(b[10 : 10+i])
-               break
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/message.go b/libgo/go/internal/x/net/route/message.go
deleted file mode 100644 (file)
index 0fa7e09..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-// A Message represents a routing message.
-type Message interface {
-       // Sys returns operating system-specific information.
-       Sys() []Sys
-}
-
-// A Sys reprensents operating system-specific information.
-type Sys interface {
-       // SysType returns a type of operating system-specific
-       // information.
-       SysType() SysType
-}
-
-// A SysType represents a type of operating system-specific
-// information.
-type SysType int
-
-const (
-       SysMetrics SysType = iota
-       SysStats
-)
-
-// ParseRIB parses b as a routing information base and returns a list
-// of routing messages.
-func ParseRIB(typ RIBType, b []byte) ([]Message, error) {
-       if !typ.parseable() {
-               return nil, errUnsupportedMessage
-       }
-       var msgs []Message
-       nmsgs, nskips := 0, 0
-       for len(b) > 4 {
-               nmsgs++
-               l := int(nativeEndian.Uint16(b[:2]))
-               if l == 0 {
-                       return nil, errInvalidMessage
-               }
-               if len(b) < l {
-                       return nil, errMessageTooShort
-               }
-               if b[2] != sysRTM_VERSION {
-                       b = b[l:]
-                       continue
-               }
-               if w, ok := wireFormats[int(b[3])]; !ok {
-                       nskips++
-               } else {
-                       m, err := w.parse(typ, b)
-                       if err != nil {
-                               return nil, err
-                       }
-                       if m == nil {
-                               nskips++
-                       } else {
-                               msgs = append(msgs, m)
-                       }
-               }
-               b = b[l:]
-       }
-       // We failed to parse any of the messages - version mismatch?
-       if nmsgs != len(msgs)+nskips {
-               return nil, errMessageMismatch
-       }
-       return msgs, nil
-}
diff --git a/libgo/go/internal/x/net/route/message_darwin_test.go b/libgo/go/internal/x/net/route/message_darwin_test.go
deleted file mode 100644 (file)
index 316aa75..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import "testing"
-
-func TestFetchAndParseRIBOnDarwin(t *testing.T) {
-       for _, typ := range []RIBType{sysNET_RT_FLAGS, sysNET_RT_DUMP2, sysNET_RT_IFLIST2} {
-               var lastErr error
-               var ms []Message
-               for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-                       rs, err := fetchAndParseRIB(af, typ)
-                       if err != nil {
-                               lastErr = err
-                               continue
-                       }
-                       ms = append(ms, rs...)
-               }
-               if len(ms) == 0 && lastErr != nil {
-                       t.Error(typ, lastErr)
-                       continue
-               }
-               ss, err := msgs(ms).validate()
-               if err != nil {
-                       t.Error(typ, err)
-                       continue
-               }
-               for _, s := range ss {
-                       t.Log(s)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/route/message_freebsd_test.go b/libgo/go/internal/x/net/route/message_freebsd_test.go
deleted file mode 100644 (file)
index c6d8a5f..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import "testing"
-
-func TestFetchAndParseRIBOnFreeBSD(t *testing.T) {
-       for _, typ := range []RIBType{sysNET_RT_IFMALIST} {
-               var lastErr error
-               var ms []Message
-               for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-                       rs, err := fetchAndParseRIB(af, typ)
-                       if err != nil {
-                               lastErr = err
-                               continue
-                       }
-                       ms = append(ms, rs...)
-               }
-               if len(ms) == 0 && lastErr != nil {
-                       t.Error(typ, lastErr)
-                       continue
-               }
-               ss, err := msgs(ms).validate()
-               if err != nil {
-                       t.Error(typ, err)
-                       continue
-               }
-               for _, s := range ss {
-                       t.Log(s)
-               }
-       }
-}
-
-func TestFetchAndParseRIBOnFreeBSD10AndAbove(t *testing.T) {
-       if _, err := FetchRIB(sysAF_UNSPEC, sysNET_RT_IFLISTL, 0); err != nil {
-               t.Skip("NET_RT_IFLISTL not supported")
-       }
-       if compatFreeBSD32 {
-               t.Skip("NET_RT_IFLIST vs. NET_RT_IFLISTL doesn't work for 386 emulation on amd64")
-       }
-
-       var tests = [2]struct {
-               typ  RIBType
-               b    []byte
-               msgs []Message
-               ss   []string
-       }{
-               {typ: sysNET_RT_IFLIST},
-               {typ: sysNET_RT_IFLISTL},
-       }
-       for i := range tests {
-               var lastErr error
-               for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-                       rs, err := fetchAndParseRIB(af, tests[i].typ)
-                       if err != nil {
-                               lastErr = err
-                               continue
-                       }
-                       tests[i].msgs = append(tests[i].msgs, rs...)
-               }
-               if len(tests[i].msgs) == 0 && lastErr != nil {
-                       t.Error(tests[i].typ, lastErr)
-                       continue
-               }
-               tests[i].ss, lastErr = msgs(tests[i].msgs).validate()
-               if lastErr != nil {
-                       t.Error(tests[i].typ, lastErr)
-                       continue
-               }
-               for _, s := range tests[i].ss {
-                       t.Log(s)
-               }
-       }
-       for i := len(tests) - 1; i > 0; i-- {
-               if len(tests[i].ss) != len(tests[i-1].ss) {
-                       t.Errorf("got %v; want %v", tests[i].ss, tests[i-1].ss)
-                       continue
-               }
-               for j, s1 := range tests[i].ss {
-                       s0 := tests[i-1].ss[j]
-                       if s1 != s0 {
-                               t.Errorf("got %s; want %s", s1, s0)
-                       }
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/route/message_test.go b/libgo/go/internal/x/net/route/message_test.go
deleted file mode 100644 (file)
index e848dab..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-import (
-       "os"
-       "syscall"
-       "testing"
-       "time"
-)
-
-func TestFetchAndParseRIB(t *testing.T) {
-       for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} {
-               var lastErr error
-               var ms []Message
-               for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
-                       rs, err := fetchAndParseRIB(af, typ)
-                       if err != nil {
-                               lastErr = err
-                               continue
-                       }
-                       ms = append(ms, rs...)
-               }
-               if len(ms) == 0 && lastErr != nil {
-                       t.Error(typ, lastErr)
-                       continue
-               }
-               ss, err := msgs(ms).validate()
-               if err != nil {
-                       t.Error(typ, err)
-                       continue
-               }
-               for _, s := range ss {
-                       t.Log(typ, s)
-               }
-       }
-}
-
-var (
-       rtmonSock int
-       rtmonErr  error
-)
-
-func init() {
-       // We need to keep rtmonSock alive to avoid treading on
-       // recycled socket descriptors.
-       rtmonSock, rtmonErr = syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC)
-}
-
-// TestMonitorAndParseRIB leaks a worker goroutine and a socket
-// descriptor but that's intentional.
-func TestMonitorAndParseRIB(t *testing.T) {
-       if testing.Short() || os.Getuid() != 0 {
-               t.Skip("must be root")
-       }
-
-       if rtmonErr != nil {
-               t.Fatal(rtmonErr)
-       }
-
-       // We suppose that using an IPv4 link-local address and the
-       // dot1Q ID for Token Ring and FDDI doesn't harm anyone.
-       pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"}
-       if err := pv.configure(1002); err != nil {
-               t.Skip(err)
-       }
-       if err := pv.setup(); err != nil {
-               t.Skip(err)
-       }
-       pv.teardown()
-
-       go func() {
-               b := make([]byte, os.Getpagesize())
-               for {
-                       // There's no easy way to unblock this read
-                       // call because the routing message exchange
-                       // over routing socket is a connectionless
-                       // message-oriented protocol, no control plane
-                       // for signaling connectivity, and we cannot
-                       // use the net package of standard library due
-                       // to the lack of support for routing socket
-                       // and circular dependency.
-                       n, err := syscall.Read(rtmonSock, b)
-                       if err != nil {
-                               return
-                       }
-                       ms, err := ParseRIB(0, b[:n])
-                       if err != nil {
-                               t.Error(err)
-                               return
-                       }
-                       ss, err := msgs(ms).validate()
-                       if err != nil {
-                               t.Error(err)
-                               return
-                       }
-                       for _, s := range ss {
-                               t.Log(s)
-                       }
-               }
-       }()
-
-       for _, vid := range []int{1002, 1003, 1004, 1005} {
-               pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"}
-               if err := pv.configure(vid); err != nil {
-                       t.Fatal(err)
-               }
-               if err := pv.setup(); err != nil {
-                       t.Fatal(err)
-               }
-               time.Sleep(200 * time.Millisecond)
-               if err := pv.teardown(); err != nil {
-                       t.Fatal(err)
-               }
-               time.Sleep(200 * time.Millisecond)
-       }
-}
-
-func TestParseRIBWithFuzz(t *testing.T) {
-       for _, fuzz := range []string{
-               "0\x00\x05\x050000000000000000" +
-                       "00000000000000000000" +
-                       "00000000000000000000" +
-                       "00000000000000000000" +
-                       "0000000000000\x02000000" +
-                       "00000000",
-               "\x02\x00\x05\f0000000000000000" +
-                       "0\x0200000000000000",
-               "\x02\x00\x05\x100000000000000\x1200" +
-                       "0\x00\xff\x00",
-               "\x02\x00\x05\f0000000000000000" +
-                       "0\x12000\x00\x02\x0000",
-               "\x00\x00\x00\x01\x00",
-               "00000",
-       } {
-               for typ := RIBType(0); typ < 256; typ++ {
-                       ParseRIB(typ, []byte(fuzz))
-               }
-       }
-}
-
-func TestRouteMessage(t *testing.T) {
-       s, err := syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC)
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer syscall.Close(s)
-
-       var ms []RouteMessage
-       for _, af := range []int{sysAF_INET, sysAF_INET6} {
-               if _, err := fetchAndParseRIB(af, sysNET_RT_DUMP); err != nil {
-                       t.Log(err)
-                       continue
-               }
-               switch af {
-               case sysAF_INET:
-                       ms = append(ms, []RouteMessage{
-                               {
-                                       Type: sysRTM_GET,
-                                       Addrs: []Addr{
-                                               &Inet4Addr{IP: [4]byte{127, 0, 0, 1}},
-                                               nil,
-                                               nil,
-                                               nil,
-                                               &LinkAddr{},
-                                               &Inet4Addr{},
-                                               nil,
-                                               &Inet4Addr{},
-                                       },
-                               },
-                               {
-                                       Type: sysRTM_GET,
-                                       Addrs: []Addr{
-                                               &Inet4Addr{IP: [4]byte{127, 0, 0, 1}},
-                                       },
-                               },
-                       }...)
-               case sysAF_INET6:
-                       ms = append(ms, []RouteMessage{
-                               {
-                                       Type: sysRTM_GET,
-                                       Addrs: []Addr{
-                                               &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}},
-                                               nil,
-                                               nil,
-                                               nil,
-                                               &LinkAddr{},
-                                               &Inet6Addr{},
-                                               nil,
-                                               &Inet6Addr{},
-                                       },
-                               },
-                               {
-                                       Type: sysRTM_GET,
-                                       Addrs: []Addr{
-                                               &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}},
-                                       },
-                               },
-                       }...)
-               }
-       }
-       for i, m := range ms {
-               m.ID = uintptr(os.Getpid())
-               m.Seq = i + 1
-               wb, err := m.Marshal()
-               if err != nil {
-                       t.Fatalf("%v: %v", m, err)
-               }
-               if _, err := syscall.Write(s, wb); err != nil {
-                       t.Fatalf("%v: %v", m, err)
-               }
-               rb := make([]byte, os.Getpagesize())
-               n, err := syscall.Read(s, rb)
-               if err != nil {
-                       t.Fatalf("%v: %v", m, err)
-               }
-               rms, err := ParseRIB(0, rb[:n])
-               if err != nil {
-                       t.Fatalf("%v: %v", m, err)
-               }
-               for _, rm := range rms {
-                       err := rm.(*RouteMessage).Err
-                       if err != nil {
-                               t.Errorf("%v: %v", m, err)
-                       }
-               }
-               ss, err := msgs(rms).validate()
-               if err != nil {
-                       t.Fatalf("%v: %v", m, err)
-               }
-               for _, s := range ss {
-                       t.Log(s)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/net/route/route.go b/libgo/go/internal/x/net/route/route.go
deleted file mode 100644 (file)
index 081da0d..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-// Package route provides basic functions for the manipulation of
-// packet routing facilities on BSD variants.
-//
-// The package supports any version of Darwin, any version of
-// DragonFly BSD, FreeBSD 7 through 11, NetBSD 6 and above, and
-// OpenBSD 5.6 and above.
-package route
-
-import (
-       "errors"
-       "os"
-       "syscall"
-)
-
-var (
-       errUnsupportedMessage = errors.New("unsupported message")
-       errMessageMismatch    = errors.New("message mismatch")
-       errMessageTooShort    = errors.New("message too short")
-       errInvalidMessage     = errors.New("invalid message")
-       errInvalidAddr        = errors.New("invalid address")
-       errShortBuffer        = errors.New("short buffer")
-)
-
-// A RouteMessage represents a message conveying an address prefix, a
-// nexthop address and an output interface.
-//
-// Unlike other messages, this message can be used to query adjacency
-// information for the given address prefix, to add a new route, and
-// to delete or modify the existing route from the routing information
-// base inside the kernel by writing and reading route messages on a
-// routing socket.
-//
-// For the manipulation of routing information, the route message must
-// contain appropriate fields that include:
-//
-//     Version       = <must be specified>
-//     Type          = <must be specified>
-//     Flags         = <must be specified>
-//     Index         = <must be specified if necessary>
-//     ID            = <must be specified>
-//     Seq           = <must be specified>
-//     Addrs         = <must be specified>
-//
-// The Type field specifies a type of manipulation, the Flags field
-// specifies a class of target information and the Addrs field
-// specifies target information like the following:
-//
-//     route.RouteMessage{
-//             Version: RTM_VERSION,
-//             Type: RTM_GET,
-//             Flags: RTF_UP | RTF_HOST,
-//             ID: uintptr(os.Getpid()),
-//             Seq: 1,
-//             Addrs: []route.Addrs{
-//                     RTAX_DST: &route.Inet4Addr{ ... },
-//                     RTAX_IFP: &route.LinkAddr{ ... },
-//                     RTAX_BRD: &route.Inet4Addr{ ... },
-//             },
-//     }
-//
-// The values for the above fields depend on the implementation of
-// each operating system.
-//
-// The Err field on a response message contains an error value on the
-// requested operation. If non-nil, the requested operation is failed.
-type RouteMessage struct {
-       Version int     // message version
-       Type    int     // message type
-       Flags   int     // route flags
-       Index   int     // interface index when atatched
-       ID      uintptr // sender's identifier; usually process ID
-       Seq     int     // sequence number
-       Err     error   // error on requested operation
-       Addrs   []Addr  // addresses
-
-       extOff int    // offset of header extension
-       raw    []byte // raw message
-}
-
-// Marshal returns the binary encoding of m.
-func (m *RouteMessage) Marshal() ([]byte, error) {
-       return m.marshal()
-}
-
-// A RIBType reprensents a type of routing information base.
-type RIBType int
-
-const (
-       RIBTypeRoute     RIBType = syscall.NET_RT_DUMP
-       RIBTypeInterface RIBType = syscall.NET_RT_IFLIST
-)
-
-// FetchRIB fetches a routing information base from the operating
-// system.
-//
-// The provided af must be an address family.
-//
-// The provided arg must be a RIBType-specific argument.
-// When RIBType is related to routes, arg might be a set of route
-// flags. When RIBType is related to network interfaces, arg might be
-// an interface index or a set of interface flags. In most cases, zero
-// means a wildcard.
-func FetchRIB(af int, typ RIBType, arg int) ([]byte, error) {
-       mib := [6]int32{sysCTL_NET, sysAF_ROUTE, 0, int32(af), int32(typ), int32(arg)}
-       n := uintptr(0)
-       if err := sysctl(mib[:], nil, &n, nil, 0); err != nil {
-               return nil, os.NewSyscallError("sysctl", err)
-       }
-       if n == 0 {
-               return nil, nil
-       }
-       b := make([]byte, n)
-       if err := sysctl(mib[:], &b[0], &n, nil, 0); err != nil {
-               return nil, os.NewSyscallError("sysctl", err)
-       }
-       return b[:n], nil
-}
diff --git a/libgo/go/internal/x/net/route/route_classic.go b/libgo/go/internal/x/net/route/route_classic.go
deleted file mode 100644 (file)
index 02fa688..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd
-
-package route
-
-import (
-       "runtime"
-       "syscall"
-)
-
-func (m *RouteMessage) marshal() ([]byte, error) {
-       w, ok := wireFormats[m.Type]
-       if !ok {
-               return nil, errUnsupportedMessage
-       }
-       l := w.bodyOff + addrsSpace(m.Addrs)
-       if runtime.GOOS == "darwin" {
-               // Fix stray pointer writes on macOS.
-               // See golang.org/issue/22456.
-               l += 1024
-       }
-       b := make([]byte, l)
-       nativeEndian.PutUint16(b[:2], uint16(l))
-       if m.Version == 0 {
-               b[2] = sysRTM_VERSION
-       } else {
-               b[2] = byte(m.Version)
-       }
-       b[3] = byte(m.Type)
-       nativeEndian.PutUint32(b[8:12], uint32(m.Flags))
-       nativeEndian.PutUint16(b[4:6], uint16(m.Index))
-       nativeEndian.PutUint32(b[16:20], uint32(m.ID))
-       nativeEndian.PutUint32(b[20:24], uint32(m.Seq))
-       attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs)
-       if err != nil {
-               return nil, err
-       }
-       if attrs > 0 {
-               nativeEndian.PutUint32(b[12:16], uint32(attrs))
-       }
-       return b, nil
-}
-
-func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) {
-       if len(b) < w.bodyOff {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &RouteMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[8:12])),
-               Index:   int(nativeEndian.Uint16(b[4:6])),
-               ID:      uintptr(nativeEndian.Uint32(b[16:20])),
-               Seq:     int(nativeEndian.Uint32(b[20:24])),
-               extOff:  w.extOff,
-               raw:     b[:l],
-       }
-       errno := syscall.Errno(nativeEndian.Uint32(b[28:32]))
-       if errno != 0 {
-               m.Err = errno
-       }
-       var err error
-       m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:])
-       if err != nil {
-               return nil, err
-       }
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/route_openbsd.go b/libgo/go/internal/x/net/route/route_openbsd.go
deleted file mode 100644 (file)
index daf2e90..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import "syscall"
-
-func (m *RouteMessage) marshal() ([]byte, error) {
-       l := sizeofRtMsghdr + addrsSpace(m.Addrs)
-       b := make([]byte, l)
-       nativeEndian.PutUint16(b[:2], uint16(l))
-       if m.Version == 0 {
-               b[2] = sysRTM_VERSION
-       } else {
-               b[2] = byte(m.Version)
-       }
-       b[3] = byte(m.Type)
-       nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr))
-       nativeEndian.PutUint32(b[16:20], uint32(m.Flags))
-       nativeEndian.PutUint16(b[6:8], uint16(m.Index))
-       nativeEndian.PutUint32(b[24:28], uint32(m.ID))
-       nativeEndian.PutUint32(b[28:32], uint32(m.Seq))
-       attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs)
-       if err != nil {
-               return nil, err
-       }
-       if attrs > 0 {
-               nativeEndian.PutUint32(b[12:16], uint32(attrs))
-       }
-       return b, nil
-}
-
-func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) {
-       if len(b) < sizeofRtMsghdr {
-               return nil, errMessageTooShort
-       }
-       l := int(nativeEndian.Uint16(b[:2]))
-       if len(b) < l {
-               return nil, errInvalidMessage
-       }
-       m := &RouteMessage{
-               Version: int(b[2]),
-               Type:    int(b[3]),
-               Flags:   int(nativeEndian.Uint32(b[16:20])),
-               Index:   int(nativeEndian.Uint16(b[6:8])),
-               ID:      uintptr(nativeEndian.Uint32(b[24:28])),
-               Seq:     int(nativeEndian.Uint32(b[28:32])),
-               raw:     b[:l],
-       }
-       ll := int(nativeEndian.Uint16(b[4:6]))
-       if len(b) < ll {
-               return nil, errInvalidMessage
-       }
-       errno := syscall.Errno(nativeEndian.Uint32(b[32:36]))
-       if errno != 0 {
-               m.Err = errno
-       }
-       as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:])
-       if err != nil {
-               return nil, err
-       }
-       m.Addrs = as
-       return m, nil
-}
diff --git a/libgo/go/internal/x/net/route/route_test.go b/libgo/go/internal/x/net/route/route_test.go
deleted file mode 100644 (file)
index 61bd174..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-import (
-       "fmt"
-       "os/exec"
-       "runtime"
-       "time"
-)
-
-func (m *RouteMessage) String() string {
-       return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[12:16])))
-}
-
-func (m *InterfaceMessage) String() string {
-       var attrs addrAttrs
-       if runtime.GOOS == "openbsd" {
-               attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16]))
-       } else {
-               attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8]))
-       }
-       return fmt.Sprintf("%s", attrs)
-}
-
-func (m *InterfaceAddrMessage) String() string {
-       var attrs addrAttrs
-       if runtime.GOOS == "openbsd" {
-               attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16]))
-       } else {
-               attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8]))
-       }
-       return fmt.Sprintf("%s", attrs)
-}
-
-func (m *InterfaceMulticastAddrMessage) String() string {
-       return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[4:8])))
-}
-
-func (m *InterfaceAnnounceMessage) String() string {
-       what := "<nil>"
-       switch m.What {
-       case 0:
-               what = "arrival"
-       case 1:
-               what = "departure"
-       }
-       return fmt.Sprintf("(%d %s %s)", m.Index, m.Name, what)
-}
-
-func (m *InterfaceMetrics) String() string {
-       return fmt.Sprintf("(type=%d mtu=%d)", m.Type, m.MTU)
-}
-
-func (m *RouteMetrics) String() string {
-       return fmt.Sprintf("(pmtu=%d)", m.PathMTU)
-}
-
-type addrAttrs uint
-
-var addrAttrNames = [...]string{
-       "dst",
-       "gateway",
-       "netmask",
-       "genmask",
-       "ifp",
-       "ifa",
-       "author",
-       "brd",
-       "df:mpls1-n:tag-o:src", // mpls1 for dragonfly, tag for netbsd, src for openbsd
-       "df:mpls2-o:srcmask",   // mpls2 for dragonfly, srcmask for openbsd
-       "df:mpls3-o:label",     // mpls3 for dragonfly, label for openbsd
-       "o:bfd",                // bfd for openbsd
-       "o:dns",                // dns for openbsd
-       "o:static",             // static for openbsd
-       "o:search",             // search for openbsd
-}
-
-func (attrs addrAttrs) String() string {
-       var s string
-       for i, name := range addrAttrNames {
-               if attrs&(1<<uint(i)) != 0 {
-                       if s != "" {
-                               s += "|"
-                       }
-                       s += name
-               }
-       }
-       if s == "" {
-               return "<nil>"
-       }
-       return s
-}
-
-type msgs []Message
-
-func (ms msgs) validate() ([]string, error) {
-       var ss []string
-       for _, m := range ms {
-               switch m := m.(type) {
-               case *RouteMessage:
-                       if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[12:16]))); err != nil {
-                               return nil, err
-                       }
-                       sys := m.Sys()
-                       if sys == nil {
-                               return nil, fmt.Errorf("no sys for %s", m.String())
-                       }
-                       ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String())
-               case *InterfaceMessage:
-                       var attrs addrAttrs
-                       if runtime.GOOS == "openbsd" {
-                               attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16]))
-                       } else {
-                               attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8]))
-                       }
-                       if err := addrs(m.Addrs).match(attrs); err != nil {
-                               return nil, err
-                       }
-                       sys := m.Sys()
-                       if sys == nil {
-                               return nil, fmt.Errorf("no sys for %s", m.String())
-                       }
-                       ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String())
-               case *InterfaceAddrMessage:
-                       var attrs addrAttrs
-                       if runtime.GOOS == "openbsd" {
-                               attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16]))
-                       } else {
-                               attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8]))
-                       }
-                       if err := addrs(m.Addrs).match(attrs); err != nil {
-                               return nil, err
-                       }
-                       ss = append(ss, m.String()+" "+addrs(m.Addrs).String())
-               case *InterfaceMulticastAddrMessage:
-                       if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[4:8]))); err != nil {
-                               return nil, err
-                       }
-                       ss = append(ss, m.String()+" "+addrs(m.Addrs).String())
-               case *InterfaceAnnounceMessage:
-                       ss = append(ss, m.String())
-               default:
-                       ss = append(ss, fmt.Sprintf("%+v", m))
-               }
-       }
-       return ss, nil
-}
-
-type syss []Sys
-
-func (sys syss) String() string {
-       var s string
-       for _, sy := range sys {
-               switch sy := sy.(type) {
-               case *InterfaceMetrics:
-                       if len(s) > 0 {
-                               s += " "
-                       }
-                       s += sy.String()
-               case *RouteMetrics:
-                       if len(s) > 0 {
-                               s += " "
-                       }
-                       s += sy.String()
-               }
-       }
-       return s
-}
-
-type addrFamily int
-
-func (af addrFamily) String() string {
-       switch af {
-       case sysAF_UNSPEC:
-               return "unspec"
-       case sysAF_LINK:
-               return "link"
-       case sysAF_INET:
-               return "inet4"
-       case sysAF_INET6:
-               return "inet6"
-       default:
-               return fmt.Sprintf("%d", af)
-       }
-}
-
-const hexDigit = "0123456789abcdef"
-
-type llAddr []byte
-
-func (a llAddr) String() string {
-       if len(a) == 0 {
-               return ""
-       }
-       buf := make([]byte, 0, len(a)*3-1)
-       for i, b := range a {
-               if i > 0 {
-                       buf = append(buf, ':')
-               }
-               buf = append(buf, hexDigit[b>>4])
-               buf = append(buf, hexDigit[b&0xF])
-       }
-       return string(buf)
-}
-
-type ipAddr []byte
-
-func (a ipAddr) String() string {
-       if len(a) == 0 {
-               return "<nil>"
-       }
-       if len(a) == 4 {
-               return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3])
-       }
-       if len(a) == 16 {
-               return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15])
-       }
-       s := make([]byte, len(a)*2)
-       for i, tn := range a {
-               s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf]
-       }
-       return string(s)
-}
-
-func (a *LinkAddr) String() string {
-       name := a.Name
-       if name == "" {
-               name = "<nil>"
-       }
-       lla := llAddr(a.Addr).String()
-       if lla == "" {
-               lla = "<nil>"
-       }
-       return fmt.Sprintf("(%v %d %s %s)", addrFamily(a.Family()), a.Index, name, lla)
-}
-
-func (a *Inet4Addr) String() string {
-       return fmt.Sprintf("(%v %v)", addrFamily(a.Family()), ipAddr(a.IP[:]))
-}
-
-func (a *Inet6Addr) String() string {
-       return fmt.Sprintf("(%v %v %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.ZoneID)
-}
-
-func (a *DefaultAddr) String() string {
-       return fmt.Sprintf("(%v %s)", addrFamily(a.Family()), ipAddr(a.Raw[2:]).String())
-}
-
-type addrs []Addr
-
-func (as addrs) String() string {
-       var s string
-       for _, a := range as {
-               if a == nil {
-                       continue
-               }
-               if len(s) > 0 {
-                       s += " "
-               }
-               switch a := a.(type) {
-               case *LinkAddr:
-                       s += a.String()
-               case *Inet4Addr:
-                       s += a.String()
-               case *Inet6Addr:
-                       s += a.String()
-               case *DefaultAddr:
-                       s += a.String()
-               }
-       }
-       if s == "" {
-               return "<nil>"
-       }
-       return s
-}
-
-func (as addrs) match(attrs addrAttrs) error {
-       var ts addrAttrs
-       af := sysAF_UNSPEC
-       for i := range as {
-               if as[i] != nil {
-                       ts |= 1 << uint(i)
-               }
-               switch as[i].(type) {
-               case *Inet4Addr:
-                       if af == sysAF_UNSPEC {
-                               af = sysAF_INET
-                       }
-                       if af != sysAF_INET {
-                               return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af))
-                       }
-               case *Inet6Addr:
-                       if af == sysAF_UNSPEC {
-                               af = sysAF_INET6
-                       }
-                       if af != sysAF_INET6 {
-                               return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af))
-                       }
-               }
-       }
-       if ts != attrs && ts > attrs {
-               return fmt.Errorf("%v not included in %v", ts, attrs)
-       }
-       return nil
-}
-
-func fetchAndParseRIB(af int, typ RIBType) ([]Message, error) {
-       var err error
-       var b []byte
-       for i := 0; i < 3; i++ {
-               if b, err = FetchRIB(af, typ, 0); err != nil {
-                       time.Sleep(10 * time.Millisecond)
-                       continue
-               }
-               break
-       }
-       if err != nil {
-               return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err)
-       }
-       ms, err := ParseRIB(typ, b)
-       if err != nil {
-               return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err)
-       }
-       return ms, nil
-}
-
-// propVirtual is a proprietary virtual network interface.
-type propVirtual struct {
-       name         string
-       addr, mask   string
-       setupCmds    []*exec.Cmd
-       teardownCmds []*exec.Cmd
-}
-
-func (pv *propVirtual) setup() error {
-       for _, cmd := range pv.setupCmds {
-               if err := cmd.Run(); err != nil {
-                       pv.teardown()
-                       return err
-               }
-       }
-       return nil
-}
-
-func (pv *propVirtual) teardown() error {
-       for _, cmd := range pv.teardownCmds {
-               if err := cmd.Run(); err != nil {
-                       return err
-               }
-       }
-       return nil
-}
-
-func (pv *propVirtual) configure(suffix int) error {
-       if runtime.GOOS == "openbsd" {
-               pv.name = fmt.Sprintf("vether%d", suffix)
-       } else {
-               pv.name = fmt.Sprintf("vlan%d", suffix)
-       }
-       xname, err := exec.LookPath("ifconfig")
-       if err != nil {
-               return err
-       }
-       pv.setupCmds = append(pv.setupCmds, &exec.Cmd{
-               Path: xname,
-               Args: []string{"ifconfig", pv.name, "create"},
-       })
-       if runtime.GOOS == "netbsd" {
-               // NetBSD requires an underlying dot1Q-capable network
-               // interface.
-               pv.setupCmds = append(pv.setupCmds, &exec.Cmd{
-                       Path: xname,
-                       Args: []string{"ifconfig", pv.name, "vlan", fmt.Sprintf("%d", suffix&0xfff), "vlanif", "wm0"},
-               })
-       }
-       pv.setupCmds = append(pv.setupCmds, &exec.Cmd{
-               Path: xname,
-               Args: []string{"ifconfig", pv.name, "inet", pv.addr, "netmask", pv.mask},
-       })
-       pv.teardownCmds = append(pv.teardownCmds, &exec.Cmd{
-               Path: xname,
-               Args: []string{"ifconfig", pv.name, "destroy"},
-       })
-       return nil
-}
diff --git a/libgo/go/internal/x/net/route/sys.go b/libgo/go/internal/x/net/route/sys.go
deleted file mode 100644 (file)
index 3d0ee9b..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package route
-
-import "unsafe"
-
-var (
-       nativeEndian binaryByteOrder
-       kernelAlign  int
-       wireFormats  map[int]*wireFormat
-)
-
-func init() {
-       i := uint32(1)
-       b := (*[4]byte)(unsafe.Pointer(&i))
-       if b[0] == 1 {
-               nativeEndian = littleEndian
-       } else {
-               nativeEndian = bigEndian
-       }
-       kernelAlign, wireFormats = probeRoutingStack()
-}
-
-func roundup(l int) int {
-       if l == 0 {
-               return kernelAlign
-       }
-       return (l + kernelAlign - 1) & ^(kernelAlign - 1)
-}
-
-type wireFormat struct {
-       extOff  int // offset of header extension
-       bodyOff int // offset of message body
-       parse   func(RIBType, []byte) (Message, error)
-}
diff --git a/libgo/go/internal/x/net/route/sys_darwin.go b/libgo/go/internal/x/net/route/sys_darwin.go
deleted file mode 100644 (file)
index d2daf5c..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-func (typ RIBType) parseable() bool {
-       switch typ {
-       case sysNET_RT_STAT, sysNET_RT_TRASH:
-               return false
-       default:
-               return true
-       }
-}
-
-// RouteMetrics represents route metrics.
-type RouteMetrics struct {
-       PathMTU int // path maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *RouteMessage) Sys() []Sys {
-       return []Sys{
-               &RouteMetrics{
-                       PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])),
-               },
-       }
-}
-
-// InterfaceMetrics represents interface metrics.
-type InterfaceMetrics struct {
-       Type int // interface type
-       MTU  int // maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMessage) Sys() []Sys {
-       return []Sys{
-               &InterfaceMetrics{
-                       Type: int(m.raw[m.extOff]),
-                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
-               },
-       }
-}
-
-func probeRoutingStack() (int, map[int]*wireFormat) {
-       rtm := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdrDarwin15}
-       rtm.parse = rtm.parseRouteMessage
-       rtm2 := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdr2Darwin15}
-       rtm2.parse = rtm2.parseRouteMessage
-       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDarwin15}
-       ifm.parse = ifm.parseInterfaceMessage
-       ifm2 := &wireFormat{extOff: 32, bodyOff: sizeofIfMsghdr2Darwin15}
-       ifm2.parse = ifm2.parseInterfaceMessage
-       ifam := &wireFormat{extOff: sizeofIfaMsghdrDarwin15, bodyOff: sizeofIfaMsghdrDarwin15}
-       ifam.parse = ifam.parseInterfaceAddrMessage
-       ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDarwin15, bodyOff: sizeofIfmaMsghdrDarwin15}
-       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
-       ifmam2 := &wireFormat{extOff: sizeofIfmaMsghdr2Darwin15, bodyOff: sizeofIfmaMsghdr2Darwin15}
-       ifmam2.parse = ifmam2.parseInterfaceMulticastAddrMessage
-       // Darwin kernels require 32-bit aligned access to routing facilities.
-       return 4, map[int]*wireFormat{
-               sysRTM_ADD:       rtm,
-               sysRTM_DELETE:    rtm,
-               sysRTM_CHANGE:    rtm,
-               sysRTM_GET:       rtm,
-               sysRTM_LOSING:    rtm,
-               sysRTM_REDIRECT:  rtm,
-               sysRTM_MISS:      rtm,
-               sysRTM_LOCK:      rtm,
-               sysRTM_RESOLVE:   rtm,
-               sysRTM_NEWADDR:   ifam,
-               sysRTM_DELADDR:   ifam,
-               sysRTM_IFINFO:    ifm,
-               sysRTM_NEWMADDR:  ifmam,
-               sysRTM_DELMADDR:  ifmam,
-               sysRTM_IFINFO2:   ifm2,
-               sysRTM_NEWMADDR2: ifmam2,
-               sysRTM_GET2:      rtm2,
-       }
-}
diff --git a/libgo/go/internal/x/net/route/sys_dragonfly.go b/libgo/go/internal/x/net/route/sys_dragonfly.go
deleted file mode 100644 (file)
index 0c14bc2..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import "unsafe"
-
-func (typ RIBType) parseable() bool { return true }
-
-// RouteMetrics represents route metrics.
-type RouteMetrics struct {
-       PathMTU int // path maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *RouteMessage) Sys() []Sys {
-       return []Sys{
-               &RouteMetrics{
-                       PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
-               },
-       }
-}
-
-// InterfaceMetrics represents interface metrics.
-type InterfaceMetrics struct {
-       Type int // interface type
-       MTU  int // maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMessage) Sys() []Sys {
-       return []Sys{
-               &InterfaceMetrics{
-                       Type: int(m.raw[m.extOff]),
-                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
-               },
-       }
-}
-
-func probeRoutingStack() (int, map[int]*wireFormat) {
-       var p uintptr
-       rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4}
-       rtm.parse = rtm.parseRouteMessage
-       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4}
-       ifm.parse = ifm.parseInterfaceMessage
-       ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4}
-       ifam.parse = ifam.parseInterfaceAddrMessage
-       ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4}
-       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
-       ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4}
-       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
-       return int(unsafe.Sizeof(p)), map[int]*wireFormat{
-               sysRTM_ADD:        rtm,
-               sysRTM_DELETE:     rtm,
-               sysRTM_CHANGE:     rtm,
-               sysRTM_GET:        rtm,
-               sysRTM_LOSING:     rtm,
-               sysRTM_REDIRECT:   rtm,
-               sysRTM_MISS:       rtm,
-               sysRTM_LOCK:       rtm,
-               sysRTM_RESOLVE:    rtm,
-               sysRTM_NEWADDR:    ifam,
-               sysRTM_DELADDR:    ifam,
-               sysRTM_IFINFO:     ifm,
-               sysRTM_NEWMADDR:   ifmam,
-               sysRTM_DELMADDR:   ifmam,
-               sysRTM_IFANNOUNCE: ifanm,
-       }
-}
diff --git a/libgo/go/internal/x/net/route/sys_freebsd.go b/libgo/go/internal/x/net/route/sys_freebsd.go
deleted file mode 100644 (file)
index fe91be1..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import (
-       "syscall"
-       "unsafe"
-)
-
-func (typ RIBType) parseable() bool { return true }
-
-// RouteMetrics represents route metrics.
-type RouteMetrics struct {
-       PathMTU int // path maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *RouteMessage) Sys() []Sys {
-       if kernelAlign == 8 {
-               return []Sys{
-                       &RouteMetrics{
-                               PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
-                       },
-               }
-       }
-       return []Sys{
-               &RouteMetrics{
-                       PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])),
-               },
-       }
-}
-
-// InterfaceMetrics represents interface metrics.
-type InterfaceMetrics struct {
-       Type int // interface type
-       MTU  int // maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMessage) Sys() []Sys {
-       return []Sys{
-               &InterfaceMetrics{
-                       Type: int(m.raw[m.extOff]),
-                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
-               },
-       }
-}
-
-var compatFreeBSD32 bool // 386 emulation on amd64
-
-func probeRoutingStack() (int, map[int]*wireFormat) {
-       var p uintptr
-       wordSize := int(unsafe.Sizeof(p))
-       align := wordSize
-       // In the case of kern.supported_archs="amd64 i386", we need
-       // to know the underlying kernel's architecture because the
-       // alignment for routing facilities are set at the build time
-       // of the kernel.
-       conf, _ := syscall.Sysctl("kern.conftxt")
-       for i, j := 0, 0; j < len(conf); j++ {
-               if conf[j] != '\n' {
-                       continue
-               }
-               s := conf[i:j]
-               i = j + 1
-               if len(s) > len("machine") && s[:len("machine")] == "machine" {
-                       s = s[len("machine"):]
-                       for k := 0; k < len(s); k++ {
-                               if s[k] == ' ' || s[k] == '\t' {
-                                       s = s[1:]
-                               }
-                               break
-                       }
-                       if s == "amd64" {
-                               align = 8
-                       }
-                       break
-               }
-       }
-       if align != wordSize {
-               compatFreeBSD32 = true // 386 emulation on amd64
-       }
-       var rtm, ifm, ifam, ifmam, ifanm *wireFormat
-       if compatFreeBSD32 {
-               rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10Emu - sizeofRtMetricsFreeBSD10Emu, bodyOff: sizeofRtMsghdrFreeBSD10Emu}
-               ifm = &wireFormat{extOff: 16}
-               ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10Emu, bodyOff: sizeofIfaMsghdrFreeBSD10Emu}
-               ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10Emu, bodyOff: sizeofIfmaMsghdrFreeBSD10Emu}
-               ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10Emu, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10Emu}
-       } else {
-               rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10 - sizeofRtMetricsFreeBSD10, bodyOff: sizeofRtMsghdrFreeBSD10}
-               ifm = &wireFormat{extOff: 16}
-               ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10, bodyOff: sizeofIfaMsghdrFreeBSD10}
-               ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10, bodyOff: sizeofIfmaMsghdrFreeBSD10}
-               ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10}
-       }
-       rel, _ := syscall.SysctlUint32("kern.osreldate")
-       switch {
-       case rel < 800000:
-               if compatFreeBSD32 {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD7Emu
-               } else {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD7
-               }
-       case 800000 <= rel && rel < 900000:
-               if compatFreeBSD32 {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD8Emu
-               } else {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD8
-               }
-       case 900000 <= rel && rel < 1000000:
-               if compatFreeBSD32 {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD9Emu
-               } else {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD9
-               }
-       case 1000000 <= rel && rel < 1100000:
-               if compatFreeBSD32 {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD10Emu
-               } else {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD10
-               }
-       default:
-               if compatFreeBSD32 {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD11Emu
-               } else {
-                       ifm.bodyOff = sizeofIfMsghdrFreeBSD11
-               }
-               if rel >= 1102000 { // see https://github.com/freebsd/freebsd/commit/027c7f4d66ff8d8c4a46c3665a5ee7d6d8462034#diff-ad4e5b7f1449ea3fc87bc97280de145b
-                       align = wordSize
-               }
-       }
-       rtm.parse = rtm.parseRouteMessage
-       ifm.parse = ifm.parseInterfaceMessage
-       ifam.parse = ifam.parseInterfaceAddrMessage
-       ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
-       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
-       return align, map[int]*wireFormat{
-               sysRTM_ADD:        rtm,
-               sysRTM_DELETE:     rtm,
-               sysRTM_CHANGE:     rtm,
-               sysRTM_GET:        rtm,
-               sysRTM_LOSING:     rtm,
-               sysRTM_REDIRECT:   rtm,
-               sysRTM_MISS:       rtm,
-               sysRTM_LOCK:       rtm,
-               sysRTM_RESOLVE:    rtm,
-               sysRTM_NEWADDR:    ifam,
-               sysRTM_DELADDR:    ifam,
-               sysRTM_IFINFO:     ifm,
-               sysRTM_NEWMADDR:   ifmam,
-               sysRTM_DELMADDR:   ifmam,
-               sysRTM_IFANNOUNCE: ifanm,
-       }
-}
diff --git a/libgo/go/internal/x/net/route/sys_netbsd.go b/libgo/go/internal/x/net/route/sys_netbsd.go
deleted file mode 100644 (file)
index 02f71d5..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-func (typ RIBType) parseable() bool { return true }
-
-// RouteMetrics represents route metrics.
-type RouteMetrics struct {
-       PathMTU int // path maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *RouteMessage) Sys() []Sys {
-       return []Sys{
-               &RouteMetrics{
-                       PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
-               },
-       }
-}
-
-// RouteMetrics represents route metrics.
-type InterfaceMetrics struct {
-       Type int // interface type
-       MTU  int // maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMessage) Sys() []Sys {
-       return []Sys{
-               &InterfaceMetrics{
-                       Type: int(m.raw[m.extOff]),
-                       MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
-               },
-       }
-}
-
-func probeRoutingStack() (int, map[int]*wireFormat) {
-       rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrNetBSD7}
-       rtm.parse = rtm.parseRouteMessage
-       ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrNetBSD7}
-       ifm.parse = ifm.parseInterfaceMessage
-       ifam := &wireFormat{extOff: sizeofIfaMsghdrNetBSD7, bodyOff: sizeofIfaMsghdrNetBSD7}
-       ifam.parse = ifam.parseInterfaceAddrMessage
-       ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrNetBSD7, bodyOff: sizeofIfAnnouncemsghdrNetBSD7}
-       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
-       // NetBSD 6 and above kernels require 64-bit aligned access to
-       // routing facilities.
-       return 8, map[int]*wireFormat{
-               sysRTM_ADD:        rtm,
-               sysRTM_DELETE:     rtm,
-               sysRTM_CHANGE:     rtm,
-               sysRTM_GET:        rtm,
-               sysRTM_LOSING:     rtm,
-               sysRTM_REDIRECT:   rtm,
-               sysRTM_MISS:       rtm,
-               sysRTM_LOCK:       rtm,
-               sysRTM_RESOLVE:    rtm,
-               sysRTM_NEWADDR:    ifam,
-               sysRTM_DELADDR:    ifam,
-               sysRTM_IFANNOUNCE: ifanm,
-               sysRTM_IFINFO:     ifm,
-       }
-}
diff --git a/libgo/go/internal/x/net/route/sys_openbsd.go b/libgo/go/internal/x/net/route/sys_openbsd.go
deleted file mode 100644 (file)
index c5674e8..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package route
-
-import "unsafe"
-
-func (typ RIBType) parseable() bool {
-       switch typ {
-       case sysNET_RT_STATS, sysNET_RT_TABLE:
-               return false
-       default:
-               return true
-       }
-}
-
-// RouteMetrics represents route metrics.
-type RouteMetrics struct {
-       PathMTU int // path maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *RouteMessage) Sys() []Sys {
-       return []Sys{
-               &RouteMetrics{
-                       PathMTU: int(nativeEndian.Uint32(m.raw[60:64])),
-               },
-       }
-}
-
-// InterfaceMetrics represents interface metrics.
-type InterfaceMetrics struct {
-       Type int // interface type
-       MTU  int // maximum transmission unit
-}
-
-// SysType implements the SysType method of Sys interface.
-func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
-
-// Sys implements the Sys method of Message interface.
-func (m *InterfaceMessage) Sys() []Sys {
-       return []Sys{
-               &InterfaceMetrics{
-                       Type: int(m.raw[24]),
-                       MTU:  int(nativeEndian.Uint32(m.raw[28:32])),
-               },
-       }
-}
-
-func probeRoutingStack() (int, map[int]*wireFormat) {
-       var p uintptr
-       rtm := &wireFormat{extOff: -1, bodyOff: -1}
-       rtm.parse = rtm.parseRouteMessage
-       ifm := &wireFormat{extOff: -1, bodyOff: -1}
-       ifm.parse = ifm.parseInterfaceMessage
-       ifam := &wireFormat{extOff: -1, bodyOff: -1}
-       ifam.parse = ifam.parseInterfaceAddrMessage
-       ifanm := &wireFormat{extOff: -1, bodyOff: -1}
-       ifanm.parse = ifanm.parseInterfaceAnnounceMessage
-       return int(unsafe.Sizeof(p)), map[int]*wireFormat{
-               sysRTM_ADD:        rtm,
-               sysRTM_DELETE:     rtm,
-               sysRTM_CHANGE:     rtm,
-               sysRTM_GET:        rtm,
-               sysRTM_LOSING:     rtm,
-               sysRTM_REDIRECT:   rtm,
-               sysRTM_MISS:       rtm,
-               sysRTM_LOCK:       rtm,
-               sysRTM_RESOLVE:    rtm,
-               sysRTM_NEWADDR:    ifam,
-               sysRTM_DELADDR:    ifam,
-               sysRTM_IFINFO:     ifm,
-               sysRTM_IFANNOUNCE: ifanm,
-               sysRTM_DESYNC:     rtm,
-       }
-}
diff --git a/libgo/go/internal/x/net/route/syscall.go b/libgo/go/internal/x/net/route/syscall.go
deleted file mode 100644 (file)
index 72431b0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd netbsd openbsd
-
-package route
-
-import (
-       "syscall"
-       "unsafe"
-)
-
-var zero uintptr
-
-func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error {
-       var p unsafe.Pointer
-       if len(mib) > 0 {
-               p = unsafe.Pointer(&mib[0])
-       } else {
-               p = unsafe.Pointer(&zero)
-       }
-       _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), newlen)
-       if errno != 0 {
-               return error(errno)
-       }
-       return nil
-}
diff --git a/libgo/go/internal/x/net/route/syscall_go1_11_darwin.go b/libgo/go/internal/x/net/route/syscall_go1_11_darwin.go
deleted file mode 100644 (file)
index 7228e44..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.12
-
-package route
-
-import (
-       "syscall"
-       "unsafe"
-)
-
-var zero uintptr
-
-func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error {
-       var p unsafe.Pointer
-       if len(mib) > 0 {
-               p = unsafe.Pointer(&mib[0])
-       } else {
-               p = unsafe.Pointer(&zero)
-       }
-       _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), newlen)
-       if errno != 0 {
-               return error(errno)
-       }
-       return nil
-}
diff --git a/libgo/go/internal/x/net/route/syscall_go1_12_darwin.go b/libgo/go/internal/x/net/route/syscall_go1_12_darwin.go
deleted file mode 100644 (file)
index 7922a68..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.12
-
-package route
-
-import _ "unsafe" // for linkname
-
-//go:linkname sysctl syscall.sysctl
-func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error
diff --git a/libgo/go/internal/x/net/route/zsys_darwin.go b/libgo/go/internal/x/net/route/zsys_darwin.go
deleted file mode 100644 (file)
index 4e2e1ab..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_darwin.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x1e
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP    = 0x1
-       sysNET_RT_FLAGS   = 0x2
-       sysNET_RT_IFLIST  = 0x3
-       sysNET_RT_STAT    = 0x4
-       sysNET_RT_TRASH   = 0x5
-       sysNET_RT_IFLIST2 = 0x6
-       sysNET_RT_DUMP2   = 0x7
-       sysNET_RT_MAXID   = 0xa
-)
-
-const (
-       sysCTL_MAXNAME = 0xc
-
-       sysCTL_UNSPEC  = 0x0
-       sysCTL_KERN    = 0x1
-       sysCTL_VM      = 0x2
-       sysCTL_VFS     = 0x3
-       sysCTL_NET     = 0x4
-       sysCTL_DEBUG   = 0x5
-       sysCTL_HW      = 0x6
-       sysCTL_MACHDEP = 0x7
-       sysCTL_USER    = 0x8
-       sysCTL_MAXID   = 0x9
-)
-
-const (
-       sysRTM_VERSION = 0x5
-
-       sysRTM_ADD       = 0x1
-       sysRTM_DELETE    = 0x2
-       sysRTM_CHANGE    = 0x3
-       sysRTM_GET       = 0x4
-       sysRTM_LOSING    = 0x5
-       sysRTM_REDIRECT  = 0x6
-       sysRTM_MISS      = 0x7
-       sysRTM_LOCK      = 0x8
-       sysRTM_OLDADD    = 0x9
-       sysRTM_OLDDEL    = 0xa
-       sysRTM_RESOLVE   = 0xb
-       sysRTM_NEWADDR   = 0xc
-       sysRTM_DELADDR   = 0xd
-       sysRTM_IFINFO    = 0xe
-       sysRTM_NEWMADDR  = 0xf
-       sysRTM_DELMADDR  = 0x10
-       sysRTM_IFINFO2   = 0x12
-       sysRTM_NEWMADDR2 = 0x13
-       sysRTM_GET2      = 0x14
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_MAX     = 0x8
-)
-
-const (
-       sizeofIfMsghdrDarwin15    = 0x70
-       sizeofIfaMsghdrDarwin15   = 0x14
-       sizeofIfmaMsghdrDarwin15  = 0x10
-       sizeofIfMsghdr2Darwin15   = 0xa0
-       sizeofIfmaMsghdr2Darwin15 = 0x14
-       sizeofIfDataDarwin15      = 0x60
-       sizeofIfData64Darwin15    = 0x80
-
-       sizeofRtMsghdrDarwin15  = 0x5c
-       sizeofRtMsghdr2Darwin15 = 0x5c
-       sizeofRtMetricsDarwin15 = 0x38
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_dragonfly.go b/libgo/go/internal/x/net/route/zsys_dragonfly.go
deleted file mode 100644 (file)
index 719c88d..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_dragonfly.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x1c
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP   = 0x1
-       sysNET_RT_FLAGS  = 0x2
-       sysNET_RT_IFLIST = 0x3
-       sysNET_RT_MAXID  = 0x4
-)
-
-const (
-       sysCTL_MAXNAME = 0xc
-
-       sysCTL_UNSPEC   = 0x0
-       sysCTL_KERN     = 0x1
-       sysCTL_VM       = 0x2
-       sysCTL_VFS      = 0x3
-       sysCTL_NET      = 0x4
-       sysCTL_DEBUG    = 0x5
-       sysCTL_HW       = 0x6
-       sysCTL_MACHDEP  = 0x7
-       sysCTL_USER     = 0x8
-       sysCTL_P1003_1B = 0x9
-       sysCTL_LWKT     = 0xa
-       sysCTL_MAXID    = 0xb
-)
-
-const (
-       sysRTM_VERSION = 0x6
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_OLDADD     = 0x9
-       sysRTM_OLDDEL     = 0xa
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFINFO     = 0xe
-       sysRTM_NEWMADDR   = 0xf
-       sysRTM_DELMADDR   = 0x10
-       sysRTM_IFANNOUNCE = 0x11
-       sysRTM_IEEE80211  = 0x12
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-       sysRTA_MPLS1   = 0x100
-       sysRTA_MPLS2   = 0x200
-       sysRTA_MPLS3   = 0x400
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_MPLS1   = 0x8
-       sysRTAX_MPLS2   = 0x9
-       sysRTAX_MPLS3   = 0xa
-       sysRTAX_MAX     = 0xb
-)
-
-const (
-       sizeofIfMsghdrDragonFlyBSD4         = 0xb0
-       sizeofIfaMsghdrDragonFlyBSD4        = 0x14
-       sizeofIfmaMsghdrDragonFlyBSD4       = 0x10
-       sizeofIfAnnouncemsghdrDragonFlyBSD4 = 0x18
-
-       sizeofRtMsghdrDragonFlyBSD4  = 0x98
-       sizeofRtMetricsDragonFlyBSD4 = 0x70
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_freebsd_386.go b/libgo/go/internal/x/net/route/zsys_freebsd_386.go
deleted file mode 100644 (file)
index b03bc01..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_freebsd.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x1c
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP     = 0x1
-       sysNET_RT_FLAGS    = 0x2
-       sysNET_RT_IFLIST   = 0x3
-       sysNET_RT_IFMALIST = 0x4
-       sysNET_RT_IFLISTL  = 0x5
-)
-
-const (
-       sysCTL_MAXNAME = 0x18
-
-       sysCTL_UNSPEC   = 0x0
-       sysCTL_KERN     = 0x1
-       sysCTL_VM       = 0x2
-       sysCTL_VFS      = 0x3
-       sysCTL_NET      = 0x4
-       sysCTL_DEBUG    = 0x5
-       sysCTL_HW       = 0x6
-       sysCTL_MACHDEP  = 0x7
-       sysCTL_USER     = 0x8
-       sysCTL_P1003_1B = 0x9
-)
-
-const (
-       sysRTM_VERSION = 0x5
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFINFO     = 0xe
-       sysRTM_NEWMADDR   = 0xf
-       sysRTM_DELMADDR   = 0x10
-       sysRTM_IFANNOUNCE = 0x11
-       sysRTM_IEEE80211  = 0x12
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_MAX     = 0x8
-)
-
-const (
-       sizeofIfMsghdrlFreeBSD10        = 0x68
-       sizeofIfaMsghdrFreeBSD10        = 0x14
-       sizeofIfaMsghdrlFreeBSD10       = 0x6c
-       sizeofIfmaMsghdrFreeBSD10       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
-
-       sizeofRtMsghdrFreeBSD10  = 0x5c
-       sizeofRtMetricsFreeBSD10 = 0x38
-
-       sizeofIfMsghdrFreeBSD7  = 0x60
-       sizeofIfMsghdrFreeBSD8  = 0x60
-       sizeofIfMsghdrFreeBSD9  = 0x60
-       sizeofIfMsghdrFreeBSD10 = 0x64
-       sizeofIfMsghdrFreeBSD11 = 0xa8
-
-       sizeofIfDataFreeBSD7  = 0x50
-       sizeofIfDataFreeBSD8  = 0x50
-       sizeofIfDataFreeBSD9  = 0x50
-       sizeofIfDataFreeBSD10 = 0x54
-       sizeofIfDataFreeBSD11 = 0x98
-
-       // MODIFIED BY HAND FOR 386 EMULATION ON AMD64
-       // 386 EMULATION USES THE UNDERLYING RAW DATA LAYOUT
-
-       sizeofIfMsghdrlFreeBSD10Emu        = 0xb0
-       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
-       sizeofIfaMsghdrlFreeBSD10Emu       = 0xb0
-       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
-
-       sizeofRtMsghdrFreeBSD10Emu  = 0x98
-       sizeofRtMetricsFreeBSD10Emu = 0x70
-
-       sizeofIfMsghdrFreeBSD7Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD8Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD9Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD10Emu = 0xa8
-       sizeofIfMsghdrFreeBSD11Emu = 0xa8
-
-       sizeofIfDataFreeBSD7Emu  = 0x98
-       sizeofIfDataFreeBSD8Emu  = 0x98
-       sizeofIfDataFreeBSD9Emu  = 0x98
-       sizeofIfDataFreeBSD10Emu = 0x98
-       sizeofIfDataFreeBSD11Emu = 0x98
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_freebsd_amd64.go b/libgo/go/internal/x/net/route/zsys_freebsd_amd64.go
deleted file mode 100644 (file)
index 0b675b3..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_freebsd.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x1c
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP     = 0x1
-       sysNET_RT_FLAGS    = 0x2
-       sysNET_RT_IFLIST   = 0x3
-       sysNET_RT_IFMALIST = 0x4
-       sysNET_RT_IFLISTL  = 0x5
-)
-
-const (
-       sysCTL_MAXNAME = 0x18
-
-       sysCTL_UNSPEC   = 0x0
-       sysCTL_KERN     = 0x1
-       sysCTL_VM       = 0x2
-       sysCTL_VFS      = 0x3
-       sysCTL_NET      = 0x4
-       sysCTL_DEBUG    = 0x5
-       sysCTL_HW       = 0x6
-       sysCTL_MACHDEP  = 0x7
-       sysCTL_USER     = 0x8
-       sysCTL_P1003_1B = 0x9
-)
-
-const (
-       sysRTM_VERSION = 0x5
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFINFO     = 0xe
-       sysRTM_NEWMADDR   = 0xf
-       sysRTM_DELMADDR   = 0x10
-       sysRTM_IFANNOUNCE = 0x11
-       sysRTM_IEEE80211  = 0x12
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_MAX     = 0x8
-)
-
-const (
-       sizeofIfMsghdrlFreeBSD10        = 0xb0
-       sizeofIfaMsghdrFreeBSD10        = 0x14
-       sizeofIfaMsghdrlFreeBSD10       = 0xb0
-       sizeofIfmaMsghdrFreeBSD10       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
-
-       sizeofRtMsghdrFreeBSD10  = 0x98
-       sizeofRtMetricsFreeBSD10 = 0x70
-
-       sizeofIfMsghdrFreeBSD7  = 0xa8
-       sizeofIfMsghdrFreeBSD8  = 0xa8
-       sizeofIfMsghdrFreeBSD9  = 0xa8
-       sizeofIfMsghdrFreeBSD10 = 0xa8
-       sizeofIfMsghdrFreeBSD11 = 0xa8
-
-       sizeofIfDataFreeBSD7  = 0x98
-       sizeofIfDataFreeBSD8  = 0x98
-       sizeofIfDataFreeBSD9  = 0x98
-       sizeofIfDataFreeBSD10 = 0x98
-       sizeofIfDataFreeBSD11 = 0x98
-
-       sizeofIfMsghdrlFreeBSD10Emu        = 0xb0
-       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
-       sizeofIfaMsghdrlFreeBSD10Emu       = 0xb0
-       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
-
-       sizeofRtMsghdrFreeBSD10Emu  = 0x98
-       sizeofRtMetricsFreeBSD10Emu = 0x70
-
-       sizeofIfMsghdrFreeBSD7Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD8Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD9Emu  = 0xa8
-       sizeofIfMsghdrFreeBSD10Emu = 0xa8
-       sizeofIfMsghdrFreeBSD11Emu = 0xa8
-
-       sizeofIfDataFreeBSD7Emu  = 0x98
-       sizeofIfDataFreeBSD8Emu  = 0x98
-       sizeofIfDataFreeBSD9Emu  = 0x98
-       sizeofIfDataFreeBSD10Emu = 0x98
-       sizeofIfDataFreeBSD11Emu = 0x98
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_freebsd_arm.go b/libgo/go/internal/x/net/route/zsys_freebsd_arm.go
deleted file mode 100644 (file)
index 58f8ea1..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_freebsd.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x1c
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP     = 0x1
-       sysNET_RT_FLAGS    = 0x2
-       sysNET_RT_IFLIST   = 0x3
-       sysNET_RT_IFMALIST = 0x4
-       sysNET_RT_IFLISTL  = 0x5
-)
-
-const (
-       sysCTL_MAXNAME = 0x18
-
-       sysCTL_UNSPEC   = 0x0
-       sysCTL_KERN     = 0x1
-       sysCTL_VM       = 0x2
-       sysCTL_VFS      = 0x3
-       sysCTL_NET      = 0x4
-       sysCTL_DEBUG    = 0x5
-       sysCTL_HW       = 0x6
-       sysCTL_MACHDEP  = 0x7
-       sysCTL_USER     = 0x8
-       sysCTL_P1003_1B = 0x9
-)
-
-const (
-       sysRTM_VERSION = 0x5
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFINFO     = 0xe
-       sysRTM_NEWMADDR   = 0xf
-       sysRTM_DELMADDR   = 0x10
-       sysRTM_IFANNOUNCE = 0x11
-       sysRTM_IEEE80211  = 0x12
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_MAX     = 0x8
-)
-
-const (
-       sizeofIfMsghdrlFreeBSD10        = 0x68
-       sizeofIfaMsghdrFreeBSD10        = 0x14
-       sizeofIfaMsghdrlFreeBSD10       = 0x6c
-       sizeofIfmaMsghdrFreeBSD10       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10 = 0x18
-
-       sizeofRtMsghdrFreeBSD10  = 0x5c
-       sizeofRtMetricsFreeBSD10 = 0x38
-
-       sizeofIfMsghdrFreeBSD7  = 0x70
-       sizeofIfMsghdrFreeBSD8  = 0x70
-       sizeofIfMsghdrFreeBSD9  = 0x70
-       sizeofIfMsghdrFreeBSD10 = 0x70
-       sizeofIfMsghdrFreeBSD11 = 0xa8
-
-       sizeofIfDataFreeBSD7  = 0x60
-       sizeofIfDataFreeBSD8  = 0x60
-       sizeofIfDataFreeBSD9  = 0x60
-       sizeofIfDataFreeBSD10 = 0x60
-       sizeofIfDataFreeBSD11 = 0x98
-
-       sizeofIfMsghdrlFreeBSD10Emu        = 0x68
-       sizeofIfaMsghdrFreeBSD10Emu        = 0x14
-       sizeofIfaMsghdrlFreeBSD10Emu       = 0x6c
-       sizeofIfmaMsghdrFreeBSD10Emu       = 0x10
-       sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18
-
-       sizeofRtMsghdrFreeBSD10Emu  = 0x5c
-       sizeofRtMetricsFreeBSD10Emu = 0x38
-
-       sizeofIfMsghdrFreeBSD7Emu  = 0x70
-       sizeofIfMsghdrFreeBSD8Emu  = 0x70
-       sizeofIfMsghdrFreeBSD9Emu  = 0x70
-       sizeofIfMsghdrFreeBSD10Emu = 0x70
-       sizeofIfMsghdrFreeBSD11Emu = 0xa8
-
-       sizeofIfDataFreeBSD7Emu  = 0x60
-       sizeofIfDataFreeBSD8Emu  = 0x60
-       sizeofIfDataFreeBSD9Emu  = 0x60
-       sizeofIfDataFreeBSD10Emu = 0x60
-       sizeofIfDataFreeBSD11Emu = 0x98
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_netbsd.go b/libgo/go/internal/x/net/route/zsys_netbsd.go
deleted file mode 100644 (file)
index e0df45e..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_netbsd.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x22
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x18
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP   = 0x1
-       sysNET_RT_FLAGS  = 0x2
-       sysNET_RT_IFLIST = 0x5
-       sysNET_RT_MAXID  = 0x6
-)
-
-const (
-       sysCTL_MAXNAME = 0xc
-
-       sysCTL_UNSPEC   = 0x0
-       sysCTL_KERN     = 0x1
-       sysCTL_VM       = 0x2
-       sysCTL_VFS      = 0x3
-       sysCTL_NET      = 0x4
-       sysCTL_DEBUG    = 0x5
-       sysCTL_HW       = 0x6
-       sysCTL_MACHDEP  = 0x7
-       sysCTL_USER     = 0x8
-       sysCTL_DDB      = 0x9
-       sysCTL_PROC     = 0xa
-       sysCTL_VENDOR   = 0xb
-       sysCTL_EMUL     = 0xc
-       sysCTL_SECURITY = 0xd
-       sysCTL_MAXID    = 0xe
-)
-
-const (
-       sysRTM_VERSION = 0x4
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_OLDADD     = 0x9
-       sysRTM_OLDDEL     = 0xa
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFANNOUNCE = 0x10
-       sysRTM_IEEE80211  = 0x11
-       sysRTM_SETGATE    = 0x12
-       sysRTM_LLINFO_UPD = 0x13
-       sysRTM_IFINFO     = 0x14
-       sysRTM_CHGADDR    = 0x15
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-       sysRTA_TAG     = 0x100
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_TAG     = 0x8
-       sysRTAX_MAX     = 0x9
-)
-
-const (
-       sizeofIfMsghdrNetBSD7         = 0x98
-       sizeofIfaMsghdrNetBSD7        = 0x18
-       sizeofIfAnnouncemsghdrNetBSD7 = 0x18
-
-       sizeofRtMsghdrNetBSD7  = 0x78
-       sizeofRtMetricsNetBSD7 = 0x50
-
-       sizeofSockaddrStorage = 0x80
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/net/route/zsys_openbsd.go b/libgo/go/internal/x/net/route/zsys_openbsd.go
deleted file mode 100644 (file)
index db8c8ef..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs defs_openbsd.go
-
-package route
-
-const (
-       sysAF_UNSPEC = 0x0
-       sysAF_INET   = 0x2
-       sysAF_ROUTE  = 0x11
-       sysAF_LINK   = 0x12
-       sysAF_INET6  = 0x18
-
-       sysSOCK_RAW = 0x3
-
-       sysNET_RT_DUMP    = 0x1
-       sysNET_RT_FLAGS   = 0x2
-       sysNET_RT_IFLIST  = 0x3
-       sysNET_RT_STATS   = 0x4
-       sysNET_RT_TABLE   = 0x5
-       sysNET_RT_IFNAMES = 0x6
-       sysNET_RT_MAXID   = 0x7
-)
-
-const (
-       sysCTL_MAXNAME = 0xc
-
-       sysCTL_UNSPEC  = 0x0
-       sysCTL_KERN    = 0x1
-       sysCTL_VM      = 0x2
-       sysCTL_FS      = 0x3
-       sysCTL_NET     = 0x4
-       sysCTL_DEBUG   = 0x5
-       sysCTL_HW      = 0x6
-       sysCTL_MACHDEP = 0x7
-       sysCTL_DDB     = 0x9
-       sysCTL_VFS     = 0xa
-       sysCTL_MAXID   = 0xb
-)
-
-const (
-       sysRTM_VERSION = 0x5
-
-       sysRTM_ADD        = 0x1
-       sysRTM_DELETE     = 0x2
-       sysRTM_CHANGE     = 0x3
-       sysRTM_GET        = 0x4
-       sysRTM_LOSING     = 0x5
-       sysRTM_REDIRECT   = 0x6
-       sysRTM_MISS       = 0x7
-       sysRTM_LOCK       = 0x8
-       sysRTM_RESOLVE    = 0xb
-       sysRTM_NEWADDR    = 0xc
-       sysRTM_DELADDR    = 0xd
-       sysRTM_IFINFO     = 0xe
-       sysRTM_IFANNOUNCE = 0xf
-       sysRTM_DESYNC     = 0x10
-       sysRTM_INVALIDATE = 0x11
-       sysRTM_BFD        = 0x12
-       sysRTM_PROPOSAL   = 0x13
-
-       sysRTA_DST     = 0x1
-       sysRTA_GATEWAY = 0x2
-       sysRTA_NETMASK = 0x4
-       sysRTA_GENMASK = 0x8
-       sysRTA_IFP     = 0x10
-       sysRTA_IFA     = 0x20
-       sysRTA_AUTHOR  = 0x40
-       sysRTA_BRD     = 0x80
-       sysRTA_SRC     = 0x100
-       sysRTA_SRCMASK = 0x200
-       sysRTA_LABEL   = 0x400
-       sysRTA_BFD     = 0x800
-       sysRTA_DNS     = 0x1000
-       sysRTA_STATIC  = 0x2000
-       sysRTA_SEARCH  = 0x4000
-
-       sysRTAX_DST     = 0x0
-       sysRTAX_GATEWAY = 0x1
-       sysRTAX_NETMASK = 0x2
-       sysRTAX_GENMASK = 0x3
-       sysRTAX_IFP     = 0x4
-       sysRTAX_IFA     = 0x5
-       sysRTAX_AUTHOR  = 0x6
-       sysRTAX_BRD     = 0x7
-       sysRTAX_SRC     = 0x8
-       sysRTAX_SRCMASK = 0x9
-       sysRTAX_LABEL   = 0xa
-       sysRTAX_BFD     = 0xb
-       sysRTAX_DNS     = 0xc
-       sysRTAX_STATIC  = 0xd
-       sysRTAX_SEARCH  = 0xe
-       sysRTAX_MAX     = 0xf
-)
-
-const (
-       sizeofRtMsghdr = 0x60
-
-       sizeofSockaddrStorage = 0x100
-       sizeofSockaddrInet    = 0x10
-       sizeofSockaddrInet6   = 0x1c
-)
diff --git a/libgo/go/internal/x/text/secure/bidirule/bidirule.go b/libgo/go/internal/x/text/secure/bidirule/bidirule.go
deleted file mode 100644 (file)
index 87e656a..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bidirule implements the Bidi Rule defined by RFC 5893.
-//
-// This package is under development. The API may change without notice and
-// without preserving backward compatibility.
-package bidirule
-
-import (
-       "errors"
-       "unicode/utf8"
-
-       "internal/x/text/transform"
-       "internal/x/text/unicode/bidi"
-)
-
-// This file contains an implementation of RFC 5893: Right-to-Left Scripts for
-// Internationalized Domain Names for Applications (IDNA)
-//
-// A label is an individual component of a domain name.  Labels are usually
-// shown separated by dots; for example, the domain name "www.example.com" is
-// composed of three labels: "www", "example", and "com".
-//
-// An RTL label is a label that contains at least one character of class R, AL,
-// or AN. An LTR label is any label that is not an RTL label.
-//
-// A "Bidi domain name" is a domain name that contains at least one RTL label.
-//
-//  The following guarantees can be made based on the above:
-//
-//  o  In a domain name consisting of only labels that satisfy the rule,
-//     the requirements of Section 3 are satisfied.  Note that even LTR
-//     labels and pure ASCII labels have to be tested.
-//
-//  o  In a domain name consisting of only LDH labels (as defined in the
-//     Definitions document [RFC5890]) and labels that satisfy the rule,
-//     the requirements of Section 3 are satisfied as long as a label
-//     that starts with an ASCII digit does not come after a
-//     right-to-left label.
-//
-//  No guarantee is given for other combinations.
-
-// ErrInvalid indicates a label is invalid according to the Bidi Rule.
-var ErrInvalid = errors.New("bidirule: failed Bidi Rule")
-
-type ruleState uint8
-
-const (
-       ruleInitial ruleState = iota
-       ruleLTR
-       ruleLTRFinal
-       ruleRTL
-       ruleRTLFinal
-       ruleInvalid
-)
-
-type ruleTransition struct {
-       next ruleState
-       mask uint16
-}
-
-var transitions = [...][2]ruleTransition{
-       // [2.1] The first character must be a character with Bidi property L, R, or
-       // AL. If it has the R or AL property, it is an RTL label; if it has the L
-       // property, it is an LTR label.
-       ruleInitial: {
-               {ruleLTRFinal, 1 << bidi.L},
-               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL},
-       },
-       ruleRTL: {
-               // [2.3] In an RTL label, the end of the label must be a character with
-               // Bidi property R, AL, EN, or AN, followed by zero or more characters
-               // with Bidi property NSM.
-               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN},
-
-               // [2.2] In an RTL label, only characters with the Bidi properties R,
-               // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
-               // We exclude the entries from [2.3]
-               {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
-       },
-       ruleRTLFinal: {
-               // [2.3] In an RTL label, the end of the label must be a character with
-               // Bidi property R, AL, EN, or AN, followed by zero or more characters
-               // with Bidi property NSM.
-               {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM},
-
-               // [2.2] In an RTL label, only characters with the Bidi properties R,
-               // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
-               // We exclude the entries from [2.3] and NSM.
-               {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
-       },
-       ruleLTR: {
-               // [2.6] In an LTR label, the end of the label must be a character with
-               // Bidi property L or EN, followed by zero or more characters with Bidi
-               // property NSM.
-               {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN},
-
-               // [2.5] In an LTR label, only characters with the Bidi properties L,
-               // EN, ES, CS, ET, ON, BN, or NSM are allowed.
-               // We exclude the entries from [2.6].
-               {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
-       },
-       ruleLTRFinal: {
-               // [2.6] In an LTR label, the end of the label must be a character with
-               // Bidi property L or EN, followed by zero or more characters with Bidi
-               // property NSM.
-               {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM},
-
-               // [2.5] In an LTR label, only characters with the Bidi properties L,
-               // EN, ES, CS, ET, ON, BN, or NSM are allowed.
-               // We exclude the entries from [2.6].
-               {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
-       },
-       ruleInvalid: {
-               {ruleInvalid, 0},
-               {ruleInvalid, 0},
-       },
-}
-
-// [2.4] In an RTL label, if an EN is present, no AN may be present, and
-// vice versa.
-const exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN)
-
-// From RFC 5893
-// An RTL label is a label that contains at least one character of type
-// R, AL, or AN.
-//
-// An LTR label is any label that is not an RTL label.
-
-// Direction reports the direction of the given label as defined by RFC 5893.
-// The Bidi Rule does not have to be applied to labels of the category
-// LeftToRight.
-func Direction(b []byte) bidi.Direction {
-       for i := 0; i < len(b); {
-               e, sz := bidi.Lookup(b[i:])
-               if sz == 0 {
-                       i++
-               }
-               c := e.Class()
-               if c == bidi.R || c == bidi.AL || c == bidi.AN {
-                       return bidi.RightToLeft
-               }
-               i += sz
-       }
-       return bidi.LeftToRight
-}
-
-// DirectionString reports the direction of the given label as defined by RFC
-// 5893. The Bidi Rule does not have to be applied to labels of the category
-// LeftToRight.
-func DirectionString(s string) bidi.Direction {
-       for i := 0; i < len(s); {
-               e, sz := bidi.LookupString(s[i:])
-               if sz == 0 {
-                       i++
-                       continue
-               }
-               c := e.Class()
-               if c == bidi.R || c == bidi.AL || c == bidi.AN {
-                       return bidi.RightToLeft
-               }
-               i += sz
-       }
-       return bidi.LeftToRight
-}
-
-// Valid reports whether b conforms to the BiDi rule.
-func Valid(b []byte) bool {
-       var t Transformer
-       if n, ok := t.advance(b); !ok || n < len(b) {
-               return false
-       }
-       return t.isFinal()
-}
-
-// ValidString reports whether s conforms to the BiDi rule.
-func ValidString(s string) bool {
-       var t Transformer
-       if n, ok := t.advanceString(s); !ok || n < len(s) {
-               return false
-       }
-       return t.isFinal()
-}
-
-// New returns a Transformer that verifies that input adheres to the Bidi Rule.
-func New() *Transformer {
-       return &Transformer{}
-}
-
-// Transformer implements transform.Transform.
-type Transformer struct {
-       state  ruleState
-       hasRTL bool
-       seen   uint16
-}
-
-// A rule can only be violated for "Bidi Domain names", meaning if one of the
-// following categories has been observed.
-func (t *Transformer) isRTL() bool {
-       const isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN
-       return t.seen&isRTL != 0
-}
-
-func (t *Transformer) isFinal() bool {
-       return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
-}
-
-// Reset implements transform.Transformer.
-func (t *Transformer) Reset() { *t = Transformer{} }
-
-// Transform implements transform.Transformer. This Transformer has state and
-// needs to be reset between uses.
-func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       if len(dst) < len(src) {
-               src = src[:len(dst)]
-               atEOF = false
-               err = transform.ErrShortDst
-       }
-       n, err1 := t.Span(src, atEOF)
-       copy(dst, src[:n])
-       if err == nil || err1 != nil && err1 != transform.ErrShortSrc {
-               err = err1
-       }
-       return n, n, err
-}
-
-// Span returns the first n bytes of src that conform to the Bidi rule.
-func (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) {
-       if t.state == ruleInvalid && t.isRTL() {
-               return 0, ErrInvalid
-       }
-       n, ok := t.advance(src)
-       switch {
-       case !ok:
-               err = ErrInvalid
-       case n < len(src):
-               if !atEOF {
-                       err = transform.ErrShortSrc
-                       break
-               }
-               err = ErrInvalid
-       case !t.isFinal():
-               err = ErrInvalid
-       }
-       return n, err
-}
-
-// Precomputing the ASCII values decreases running time for the ASCII fast path
-// by about 30%.
-var asciiTable [128]bidi.Properties
-
-func init() {
-       for i := range asciiTable {
-               p, _ := bidi.LookupRune(rune(i))
-               asciiTable[i] = p
-       }
-}
-
-func (t *Transformer) advance(s []byte) (n int, ok bool) {
-       var e bidi.Properties
-       var sz int
-       for n < len(s) {
-               if s[n] < utf8.RuneSelf {
-                       e, sz = asciiTable[s[n]], 1
-               } else {
-                       e, sz = bidi.Lookup(s[n:])
-                       if sz <= 1 {
-                               if sz == 1 {
-                                       // We always consider invalid UTF-8 to be invalid, even if
-                                       // the string has not yet been determined to be RTL.
-                                       // TODO: is this correct?
-                                       return n, false
-                               }
-                               return n, true // incomplete UTF-8 encoding
-                       }
-               }
-               // TODO: using CompactClass would result in noticeable speedup.
-               // See unicode/bidi/prop.go:Properties.CompactClass.
-               c := uint16(1 << e.Class())
-               t.seen |= c
-               if t.seen&exclusiveRTL == exclusiveRTL {
-                       t.state = ruleInvalid
-                       return n, false
-               }
-               switch tr := transitions[t.state]; {
-               case tr[0].mask&c != 0:
-                       t.state = tr[0].next
-               case tr[1].mask&c != 0:
-                       t.state = tr[1].next
-               default:
-                       t.state = ruleInvalid
-                       if t.isRTL() {
-                               return n, false
-                       }
-               }
-               n += sz
-       }
-       return n, true
-}
-
-func (t *Transformer) advanceString(s string) (n int, ok bool) {
-       var e bidi.Properties
-       var sz int
-       for n < len(s) {
-               if s[n] < utf8.RuneSelf {
-                       e, sz = asciiTable[s[n]], 1
-               } else {
-                       e, sz = bidi.LookupString(s[n:])
-                       if sz <= 1 {
-                               if sz == 1 {
-                                       return n, false // invalid UTF-8
-                               }
-                               return n, true // incomplete UTF-8 encoding
-                       }
-               }
-               // TODO: using CompactClass results in noticeable speedup.
-               // See unicode/bidi/prop.go:Properties.CompactClass.
-               c := uint16(1 << e.Class())
-               t.seen |= c
-               if t.seen&exclusiveRTL == exclusiveRTL {
-                       t.state = ruleInvalid
-                       return n, false
-               }
-               switch tr := transitions[t.state]; {
-               case tr[0].mask&c != 0:
-                       t.state = tr[0].next
-               case tr[1].mask&c != 0:
-                       t.state = tr[1].next
-               default:
-                       t.state = ruleInvalid
-                       if t.isRTL() {
-                               return n, false
-                       }
-               }
-               n += sz
-       }
-       return n, true
-}
diff --git a/libgo/go/internal/x/text/secure/doc.go b/libgo/go/internal/x/text/secure/doc.go
deleted file mode 100644 (file)
index 6151b79..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// secure is a repository of text security related packages.
-package secure
diff --git a/libgo/go/internal/x/text/transform/examples_test.go b/libgo/go/internal/x/text/transform/examples_test.go
deleted file mode 100644 (file)
index 8d2fbb2..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package transform_test
-
-import (
-       "fmt"
-       "unicode"
-
-       "internal/x/text/transform"
-       "internal/x/text/unicode/norm"
-)
-
-func ExampleRemoveFunc() {
-       input := []byte(`tschüß; до свидания`)
-
-       b := make([]byte, len(input))
-
-       t := transform.RemoveFunc(unicode.IsSpace)
-       n, _, _ := t.Transform(b, input, true)
-       fmt.Println(string(b[:n]))
-
-       t = transform.RemoveFunc(func(r rune) bool {
-               return !unicode.Is(unicode.Latin, r)
-       })
-       n, _, _ = t.Transform(b, input, true)
-       fmt.Println(string(b[:n]))
-
-       n, _, _ = t.Transform(b, norm.NFD.Bytes(input), true)
-       fmt.Println(string(b[:n]))
-
-       // Output:
-       // tschüß;досвидания
-       // tschüß
-       // tschuß
-}
diff --git a/libgo/go/internal/x/text/transform/transform.go b/libgo/go/internal/x/text/transform/transform.go
deleted file mode 100644 (file)
index 7b6b55e..0000000
+++ /dev/null
@@ -1,707 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package transform provides reader and writer wrappers that transform the
-// bytes passing through as well as various transformations. Example
-// transformations provided by other packages include normalization and
-// conversion between character sets.
-package transform
-
-import (
-       "bytes"
-       "errors"
-       "io"
-       "unicode/utf8"
-)
-
-var (
-       // ErrShortDst means that the destination buffer was too short to
-       // receive all of the transformed bytes.
-       ErrShortDst = errors.New("transform: short destination buffer")
-
-       // ErrShortSrc means that the source buffer has insufficient data to
-       // complete the transformation.
-       ErrShortSrc = errors.New("transform: short source buffer")
-
-       // ErrEndOfSpan means that the input and output (the transformed input)
-       // are not identical.
-       ErrEndOfSpan = errors.New("transform: input and output are not identical")
-
-       // errInconsistentByteCount means that Transform returned success (nil
-       // error) but also returned nSrc inconsistent with the src argument.
-       errInconsistentByteCount = errors.New("transform: inconsistent byte count returned")
-
-       // errShortInternal means that an internal buffer is not large enough
-       // to make progress and the Transform operation must be aborted.
-       errShortInternal = errors.New("transform: short internal buffer")
-)
-
-// Transformer transforms bytes.
-type Transformer interface {
-       // Transform writes to dst the transformed bytes read from src, and
-       // returns the number of dst bytes written and src bytes read. The
-       // atEOF argument tells whether src represents the last bytes of the
-       // input.
-       //
-       // Callers should always process the nDst bytes produced and account
-       // for the nSrc bytes consumed before considering the error err.
-       //
-       // A nil error means that all of the transformed bytes (whether freshly
-       // transformed from src or left over from previous Transform calls)
-       // were written to dst. A nil error can be returned regardless of
-       // whether atEOF is true. If err is nil then nSrc must equal len(src);
-       // the converse is not necessarily true.
-       //
-       // ErrShortDst means that dst was too short to receive all of the
-       // transformed bytes. ErrShortSrc means that src had insufficient data
-       // to complete the transformation. If both conditions apply, then
-       // either error may be returned. Other than the error conditions listed
-       // here, implementations are free to report other errors that arise.
-       Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
-
-       // Reset resets the state and allows a Transformer to be reused.
-       Reset()
-}
-
-// SpanningTransformer extends the Transformer interface with a Span method
-// that determines how much of the input already conforms to the Transformer.
-type SpanningTransformer interface {
-       Transformer
-
-       // Span returns a position in src such that transforming src[:n] results in
-       // identical output src[:n] for these bytes. It does not necessarily return
-       // the largest such n. The atEOF argument tells whether src represents the
-       // last bytes of the input.
-       //
-       // Callers should always account for the n bytes consumed before
-       // considering the error err.
-       //
-       // A nil error means that all input bytes are known to be identical to the
-       // output produced by the Transformer. A nil error can be be returned
-       // regardless of whether atEOF is true. If err is nil, then then n must
-       // equal len(src); the converse is not necessarily true.
-       //
-       // ErrEndOfSpan means that the Transformer output may differ from the
-       // input after n bytes. Note that n may be len(src), meaning that the output
-       // would contain additional bytes after otherwise identical output.
-       // ErrShortSrc means that src had insufficient data to determine whether the
-       // remaining bytes would change. Other than the error conditions listed
-       // here, implementations are free to report other errors that arise.
-       //
-       // Calling Span can modify the Transformer state as a side effect. In
-       // effect, it does the transformation just as calling Transform would, only
-       // without copying to a destination buffer and only up to a point it can
-       // determine the input and output bytes are the same. This is obviously more
-       // limited than calling Transform, but can be more efficient in terms of
-       // copying and allocating buffers. Calls to Span and Transform may be
-       // interleaved.
-       Span(src []byte, atEOF bool) (n int, err error)
-}
-
-// NopResetter can be embedded by implementations of Transformer to add a nop
-// Reset method.
-type NopResetter struct{}
-
-// Reset implements the Reset method of the Transformer interface.
-func (NopResetter) Reset() {}
-
-// Reader wraps another io.Reader by transforming the bytes read.
-type Reader struct {
-       r   io.Reader
-       t   Transformer
-       err error
-
-       // dst[dst0:dst1] contains bytes that have been transformed by t but
-       // not yet copied out via Read.
-       dst        []byte
-       dst0, dst1 int
-
-       // src[src0:src1] contains bytes that have been read from r but not
-       // yet transformed through t.
-       src        []byte
-       src0, src1 int
-
-       // transformComplete is whether the transformation is complete,
-       // regardless of whether or not it was successful.
-       transformComplete bool
-}
-
-const defaultBufSize = 4096
-
-// NewReader returns a new Reader that wraps r by transforming the bytes read
-// via t. It calls Reset on t.
-func NewReader(r io.Reader, t Transformer) *Reader {
-       t.Reset()
-       return &Reader{
-               r:   r,
-               t:   t,
-               dst: make([]byte, defaultBufSize),
-               src: make([]byte, defaultBufSize),
-       }
-}
-
-// Read implements the io.Reader interface.
-func (r *Reader) Read(p []byte) (int, error) {
-       n, err := 0, error(nil)
-       for {
-               // Copy out any transformed bytes and return the final error if we are done.
-               if r.dst0 != r.dst1 {
-                       n = copy(p, r.dst[r.dst0:r.dst1])
-                       r.dst0 += n
-                       if r.dst0 == r.dst1 && r.transformComplete {
-                               return n, r.err
-                       }
-                       return n, nil
-               } else if r.transformComplete {
-                       return 0, r.err
-               }
-
-               // Try to transform some source bytes, or to flush the transformer if we
-               // are out of source bytes. We do this even if r.r.Read returned an error.
-               // As the io.Reader documentation says, "process the n > 0 bytes returned
-               // before considering the error".
-               if r.src0 != r.src1 || r.err != nil {
-                       r.dst0 = 0
-                       r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF)
-                       r.src0 += n
-
-                       switch {
-                       case err == nil:
-                               if r.src0 != r.src1 {
-                                       r.err = errInconsistentByteCount
-                               }
-                               // The Transform call was successful; we are complete if we
-                               // cannot read more bytes into src.
-                               r.transformComplete = r.err != nil
-                               continue
-                       case err == ErrShortDst && (r.dst1 != 0 || n != 0):
-                               // Make room in dst by copying out, and try again.
-                               continue
-                       case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil:
-                               // Read more bytes into src via the code below, and try again.
-                       default:
-                               r.transformComplete = true
-                               // The reader error (r.err) takes precedence over the
-                               // transformer error (err) unless r.err is nil or io.EOF.
-                               if r.err == nil || r.err == io.EOF {
-                                       r.err = err
-                               }
-                               continue
-                       }
-               }
-
-               // Move any untransformed source bytes to the start of the buffer
-               // and read more bytes.
-               if r.src0 != 0 {
-                       r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1])
-               }
-               n, r.err = r.r.Read(r.src[r.src1:])
-               r.src1 += n
-       }
-}
-
-// TODO: implement ReadByte (and ReadRune??).
-
-// Writer wraps another io.Writer by transforming the bytes read.
-// The user needs to call Close to flush unwritten bytes that may
-// be buffered.
-type Writer struct {
-       w   io.Writer
-       t   Transformer
-       dst []byte
-
-       // src[:n] contains bytes that have not yet passed through t.
-       src []byte
-       n   int
-}
-
-// NewWriter returns a new Writer that wraps w by transforming the bytes written
-// via t. It calls Reset on t.
-func NewWriter(w io.Writer, t Transformer) *Writer {
-       t.Reset()
-       return &Writer{
-               w:   w,
-               t:   t,
-               dst: make([]byte, defaultBufSize),
-               src: make([]byte, defaultBufSize),
-       }
-}
-
-// Write implements the io.Writer interface. If there are not enough
-// bytes available to complete a Transform, the bytes will be buffered
-// for the next write. Call Close to convert the remaining bytes.
-func (w *Writer) Write(data []byte) (n int, err error) {
-       src := data
-       if w.n > 0 {
-               // Append bytes from data to the last remainder.
-               // TODO: limit the amount copied on first try.
-               n = copy(w.src[w.n:], data)
-               w.n += n
-               src = w.src[:w.n]
-       }
-       for {
-               nDst, nSrc, err := w.t.Transform(w.dst, src, false)
-               if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
-                       return n, werr
-               }
-               src = src[nSrc:]
-               if w.n == 0 {
-                       n += nSrc
-               } else if len(src) <= n {
-                       // Enough bytes from w.src have been consumed. We make src point
-                       // to data instead to reduce the copying.
-                       w.n = 0
-                       n -= len(src)
-                       src = data[n:]
-                       if n < len(data) && (err == nil || err == ErrShortSrc) {
-                               continue
-                       }
-               }
-               switch err {
-               case ErrShortDst:
-                       // This error is okay as long as we are making progress.
-                       if nDst > 0 || nSrc > 0 {
-                               continue
-                       }
-               case ErrShortSrc:
-                       if len(src) < len(w.src) {
-                               m := copy(w.src, src)
-                               // If w.n > 0, bytes from data were already copied to w.src and n
-                               // was already set to the number of bytes consumed.
-                               if w.n == 0 {
-                                       n += m
-                               }
-                               w.n = m
-                               err = nil
-                       } else if nDst > 0 || nSrc > 0 {
-                               // Not enough buffer to store the remainder. Keep processing as
-                               // long as there is progress. Without this case, transforms that
-                               // require a lookahead larger than the buffer may result in an
-                               // error. This is not something one may expect to be common in
-                               // practice, but it may occur when buffers are set to small
-                               // sizes during testing.
-                               continue
-                       }
-               case nil:
-                       if w.n > 0 {
-                               err = errInconsistentByteCount
-                       }
-               }
-               return n, err
-       }
-}
-
-// Close implements the io.Closer interface.
-func (w *Writer) Close() error {
-       src := w.src[:w.n]
-       for {
-               nDst, nSrc, err := w.t.Transform(w.dst, src, true)
-               if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
-                       return werr
-               }
-               if err != ErrShortDst {
-                       return err
-               }
-               src = src[nSrc:]
-       }
-}
-
-type nop struct{ NopResetter }
-
-func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       n := copy(dst, src)
-       if n < len(src) {
-               err = ErrShortDst
-       }
-       return n, n, err
-}
-
-func (nop) Span(src []byte, atEOF bool) (n int, err error) {
-       return len(src), nil
-}
-
-type discard struct{ NopResetter }
-
-func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       return 0, len(src), nil
-}
-
-var (
-       // Discard is a Transformer for which all Transform calls succeed
-       // by consuming all bytes and writing nothing.
-       Discard Transformer = discard{}
-
-       // Nop is a SpanningTransformer that copies src to dst.
-       Nop SpanningTransformer = nop{}
-)
-
-// chain is a sequence of links. A chain with N Transformers has N+1 links and
-// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst
-// buffers given to chain.Transform and the middle N-1 buffers are intermediate
-// buffers owned by the chain. The i'th link transforms bytes from the i'th
-// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer
-// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N).
-type chain struct {
-       link []link
-       err  error
-       // errStart is the index at which the error occurred plus 1. Processing
-       // errStart at this level at the next call to Transform. As long as
-       // errStart > 0, chain will not consume any more source bytes.
-       errStart int
-}
-
-func (c *chain) fatalError(errIndex int, err error) {
-       if i := errIndex + 1; i > c.errStart {
-               c.errStart = i
-               c.err = err
-       }
-}
-
-type link struct {
-       t Transformer
-       // b[p:n] holds the bytes to be transformed by t.
-       b []byte
-       p int
-       n int
-}
-
-func (l *link) src() []byte {
-       return l.b[l.p:l.n]
-}
-
-func (l *link) dst() []byte {
-       return l.b[l.n:]
-}
-
-// Chain returns a Transformer that applies t in sequence.
-func Chain(t ...Transformer) Transformer {
-       if len(t) == 0 {
-               return nop{}
-       }
-       c := &chain{link: make([]link, len(t)+1)}
-       for i, tt := range t {
-               c.link[i].t = tt
-       }
-       // Allocate intermediate buffers.
-       b := make([][defaultBufSize]byte, len(t)-1)
-       for i := range b {
-               c.link[i+1].b = b[i][:]
-       }
-       return c
-}
-
-// Reset resets the state of Chain. It calls Reset on all the Transformers.
-func (c *chain) Reset() {
-       for i, l := range c.link {
-               if l.t != nil {
-                       l.t.Reset()
-               }
-               c.link[i].p, c.link[i].n = 0, 0
-       }
-}
-
-// TODO: make chain use Span (is going to be fun to implement!)
-
-// Transform applies the transformers of c in sequence.
-func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       // Set up src and dst in the chain.
-       srcL := &c.link[0]
-       dstL := &c.link[len(c.link)-1]
-       srcL.b, srcL.p, srcL.n = src, 0, len(src)
-       dstL.b, dstL.n = dst, 0
-       var lastFull, needProgress bool // for detecting progress
-
-       // i is the index of the next Transformer to apply, for i in [low, high].
-       // low is the lowest index for which c.link[low] may still produce bytes.
-       // high is the highest index for which c.link[high] has a Transformer.
-       // The error returned by Transform determines whether to increase or
-       // decrease i. We try to completely fill a buffer before converting it.
-       for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; {
-               in, out := &c.link[i], &c.link[i+1]
-               nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i)
-               out.n += nDst
-               in.p += nSrc
-               if i > 0 && in.p == in.n {
-                       in.p, in.n = 0, 0
-               }
-               needProgress, lastFull = lastFull, false
-               switch err0 {
-               case ErrShortDst:
-                       // Process the destination buffer next. Return if we are already
-                       // at the high index.
-                       if i == high {
-                               return dstL.n, srcL.p, ErrShortDst
-                       }
-                       if out.n != 0 {
-                               i++
-                               // If the Transformer at the next index is not able to process any
-                               // source bytes there is nothing that can be done to make progress
-                               // and the bytes will remain unprocessed. lastFull is used to
-                               // detect this and break out of the loop with a fatal error.
-                               lastFull = true
-                               continue
-                       }
-                       // The destination buffer was too small, but is completely empty.
-                       // Return a fatal error as this transformation can never complete.
-                       c.fatalError(i, errShortInternal)
-               case ErrShortSrc:
-                       if i == 0 {
-                               // Save ErrShortSrc in err. All other errors take precedence.
-                               err = ErrShortSrc
-                               break
-                       }
-                       // Source bytes were depleted before filling up the destination buffer.
-                       // Verify we made some progress, move the remaining bytes to the errStart
-                       // and try to get more source bytes.
-                       if needProgress && nSrc == 0 || in.n-in.p == len(in.b) {
-                               // There were not enough source bytes to proceed while the source
-                               // buffer cannot hold any more bytes. Return a fatal error as this
-                               // transformation can never complete.
-                               c.fatalError(i, errShortInternal)
-                               break
-                       }
-                       // in.b is an internal buffer and we can make progress.
-                       in.p, in.n = 0, copy(in.b, in.src())
-                       fallthrough
-               case nil:
-                       // if i == low, we have depleted the bytes at index i or any lower levels.
-                       // In that case we increase low and i. In all other cases we decrease i to
-                       // fetch more bytes before proceeding to the next index.
-                       if i > low {
-                               i--
-                               continue
-                       }
-               default:
-                       c.fatalError(i, err0)
-               }
-               // Exhausted level low or fatal error: increase low and continue
-               // to process the bytes accepted so far.
-               i++
-               low = i
-       }
-
-       // If c.errStart > 0, this means we found a fatal error.  We will clear
-       // all upstream buffers. At this point, no more progress can be made
-       // downstream, as Transform would have bailed while handling ErrShortDst.
-       if c.errStart > 0 {
-               for i := 1; i < c.errStart; i++ {
-                       c.link[i].p, c.link[i].n = 0, 0
-               }
-               err, c.errStart, c.err = c.err, 0, nil
-       }
-       return dstL.n, srcL.p, err
-}
-
-// Deprecated: use runes.Remove instead.
-func RemoveFunc(f func(r rune) bool) Transformer {
-       return removeF(f)
-}
-
-type removeF func(r rune) bool
-
-func (removeF) Reset() {}
-
-// Transform implements the Transformer interface.
-func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] {
-
-               if r = rune(src[0]); r < utf8.RuneSelf {
-                       sz = 1
-               } else {
-                       r, sz = utf8.DecodeRune(src)
-
-                       if sz == 1 {
-                               // Invalid rune.
-                               if !atEOF && !utf8.FullRune(src) {
-                                       err = ErrShortSrc
-                                       break
-                               }
-                               // We replace illegal bytes with RuneError. Not doing so might
-                               // otherwise turn a sequence of invalid UTF-8 into valid UTF-8.
-                               // The resulting byte sequence may subsequently contain runes
-                               // for which t(r) is true that were passed unnoticed.
-                               if !t(r) {
-                                       if nDst+3 > len(dst) {
-                                               err = ErrShortDst
-                                               break
-                                       }
-                                       nDst += copy(dst[nDst:], "\uFFFD")
-                               }
-                               nSrc++
-                               continue
-                       }
-               }
-
-               if !t(r) {
-                       if nDst+sz > len(dst) {
-                               err = ErrShortDst
-                               break
-                       }
-                       nDst += copy(dst[nDst:], src[:sz])
-               }
-               nSrc += sz
-       }
-       return
-}
-
-// grow returns a new []byte that is longer than b, and copies the first n bytes
-// of b to the start of the new slice.
-func grow(b []byte, n int) []byte {
-       m := len(b)
-       if m <= 32 {
-               m = 64
-       } else if m <= 256 {
-               m *= 2
-       } else {
-               m += m >> 1
-       }
-       buf := make([]byte, m)
-       copy(buf, b[:n])
-       return buf
-}
-
-const initialBufSize = 128
-
-// String returns a string with the result of converting s[:n] using t, where
-// n <= len(s). If err == nil, n will be len(s). It calls Reset on t.
-func String(t Transformer, s string) (result string, n int, err error) {
-       t.Reset()
-       if s == "" {
-               // Fast path for the common case for empty input. Results in about a
-               // 86% reduction of running time for BenchmarkStringLowerEmpty.
-               if _, _, err := t.Transform(nil, nil, true); err == nil {
-                       return "", 0, nil
-               }
-       }
-
-       // Allocate only once. Note that both dst and src escape when passed to
-       // Transform.
-       buf := [2 * initialBufSize]byte{}
-       dst := buf[:initialBufSize:initialBufSize]
-       src := buf[initialBufSize : 2*initialBufSize]
-
-       // The input string s is transformed in multiple chunks (starting with a
-       // chunk size of initialBufSize). nDst and nSrc are per-chunk (or
-       // per-Transform-call) indexes, pDst and pSrc are overall indexes.
-       nDst, nSrc := 0, 0
-       pDst, pSrc := 0, 0
-
-       // pPrefix is the length of a common prefix: the first pPrefix bytes of the
-       // result will equal the first pPrefix bytes of s. It is not guaranteed to
-       // be the largest such value, but if pPrefix, len(result) and len(s) are
-       // all equal after the final transform (i.e. calling Transform with atEOF
-       // being true returned nil error) then we don't need to allocate a new
-       // result string.
-       pPrefix := 0
-       for {
-               // Invariant: pDst == pPrefix && pSrc == pPrefix.
-
-               n := copy(src, s[pSrc:])
-               nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s))
-               pDst += nDst
-               pSrc += nSrc
-
-               // TODO:  let transformers implement an optional Spanner interface, akin
-               // to norm's QuickSpan. This would even allow us to avoid any allocation.
-               if !bytes.Equal(dst[:nDst], src[:nSrc]) {
-                       break
-               }
-               pPrefix = pSrc
-               if err == ErrShortDst {
-                       // A buffer can only be short if a transformer modifies its input.
-                       break
-               } else if err == ErrShortSrc {
-                       if nSrc == 0 {
-                               // No progress was made.
-                               break
-                       }
-                       // Equal so far and !atEOF, so continue checking.
-               } else if err != nil || pPrefix == len(s) {
-                       return string(s[:pPrefix]), pPrefix, err
-               }
-       }
-       // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc.
-
-       // We have transformed the first pSrc bytes of the input s to become pDst
-       // transformed bytes. Those transformed bytes are discontiguous: the first
-       // pPrefix of them equal s[:pPrefix] and the last nDst of them equal
-       // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so
-       // that they become one contiguous slice: dst[:pDst].
-       if pPrefix != 0 {
-               newDst := dst
-               if pDst > len(newDst) {
-                       newDst = make([]byte, len(s)+nDst-nSrc)
-               }
-               copy(newDst[pPrefix:pDst], dst[:nDst])
-               copy(newDst[:pPrefix], s[:pPrefix])
-               dst = newDst
-       }
-
-       // Prevent duplicate Transform calls with atEOF being true at the end of
-       // the input. Also return if we have an unrecoverable error.
-       if (err == nil && pSrc == len(s)) ||
-               (err != nil && err != ErrShortDst && err != ErrShortSrc) {
-               return string(dst[:pDst]), pSrc, err
-       }
-
-       // Transform the remaining input, growing dst and src buffers as necessary.
-       for {
-               n := copy(src, s[pSrc:])
-               nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s))
-               pDst += nDst
-               pSrc += nSrc
-
-               // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can
-               // make progress. This may avoid excessive allocations.
-               if err == ErrShortDst {
-                       if nDst == 0 {
-                               dst = grow(dst, pDst)
-                       }
-               } else if err == ErrShortSrc {
-                       if nSrc == 0 {
-                               src = grow(src, 0)
-                       }
-               } else if err != nil || pSrc == len(s) {
-                       return string(dst[:pDst]), pSrc, err
-               }
-       }
-}
-
-// Bytes returns a new byte slice with the result of converting b[:n] using t,
-// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t.
-func Bytes(t Transformer, b []byte) (result []byte, n int, err error) {
-       return doAppend(t, 0, make([]byte, len(b)), b)
-}
-
-// Append appends the result of converting src[:n] using t to dst, where
-// n <= len(src), If err == nil, n will be len(src). It calls Reset on t.
-func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) {
-       if len(dst) == cap(dst) {
-               n := len(src) + len(dst) // It is okay for this to be 0.
-               b := make([]byte, n)
-               dst = b[:copy(b, dst)]
-       }
-       return doAppend(t, len(dst), dst[:cap(dst)], src)
-}
-
-func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) {
-       t.Reset()
-       pSrc := 0
-       for {
-               nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true)
-               pDst += nDst
-               pSrc += nSrc
-               if err != ErrShortDst {
-                       return dst[:pDst], pSrc, err
-               }
-
-               // Grow the destination buffer, but do not grow as long as we can make
-               // progress. This may avoid excessive allocations.
-               if nDst == 0 {
-                       dst = grow(dst, pDst)
-               }
-       }
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/bidi.go b/libgo/go/internal/x/text/unicode/bidi/bidi.go
deleted file mode 100644 (file)
index 4542171..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bidi contains functionality for bidirectional text support.
-//
-// See http://www.unicode.org/reports/tr9.
-//
-// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways
-// and without notice.
-package bidi
-
-// TODO:
-// The following functionality would not be hard to implement, but hinges on
-// the definition of a Segmenter interface. For now this is up to the user.
-// - Iterate over paragraphs
-// - Segmenter to iterate over runs directly from a given text.
-// Also:
-// - Transformer for reordering?
-// - Transformer (validator, really) for Bidi Rule.
-
-// This API tries to avoid dealing with embedding levels for now. Under the hood
-// these will be computed, but the question is to which extent the user should
-// know they exist. We should at some point allow the user to specify an
-// embedding hierarchy, though.
-
-// A Direction indicates the overall flow of text.
-type Direction int
-
-const (
-       // LeftToRight indicates the text contains no right-to-left characters and
-       // that either there are some left-to-right characters or the option
-       // DefaultDirection(LeftToRight) was passed.
-       LeftToRight Direction = iota
-
-       // RightToLeft indicates the text contains no left-to-right characters and
-       // that either there are some right-to-left characters or the option
-       // DefaultDirection(RightToLeft) was passed.
-       RightToLeft
-
-       // Mixed indicates text contains both left-to-right and right-to-left
-       // characters.
-       Mixed
-
-       // Neutral means that text contains no left-to-right and right-to-left
-       // characters and that no default direction has been set.
-       Neutral
-)
-
-type options struct{}
-
-// An Option is an option for Bidi processing.
-type Option func(*options)
-
-// ICU allows the user to define embedding levels. This may be used, for example,
-// to use hierarchical structure of markup languages to define embeddings.
-// The following option may be a way to expose this functionality in this API.
-// // LevelFunc sets a function that associates nesting levels with the given text.
-// // The levels function will be called with monotonically increasing values for p.
-// func LevelFunc(levels func(p int) int) Option {
-//     panic("unimplemented")
-// }
-
-// DefaultDirection sets the default direction for a Paragraph. The direction is
-// overridden if the text contains directional characters.
-func DefaultDirection(d Direction) Option {
-       panic("unimplemented")
-}
-
-// A Paragraph holds a single Paragraph for Bidi processing.
-type Paragraph struct {
-       // buffers
-}
-
-// SetBytes configures p for the given paragraph text. It replaces text
-// previously set by SetBytes or SetString. If b contains a paragraph separator
-// it will only process the first paragraph and report the number of bytes
-// consumed from b including this separator. Error may be non-nil if options are
-// given.
-func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) {
-       panic("unimplemented")
-}
-
-// SetString configures p for the given paragraph text. It replaces text
-// previously set by SetBytes or SetString. If b contains a paragraph separator
-// it will only process the first paragraph and report the number of bytes
-// consumed from b including this separator. Error may be non-nil if options are
-// given.
-func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) {
-       panic("unimplemented")
-}
-
-// IsLeftToRight reports whether the principle direction of rendering for this
-// paragraphs is left-to-right. If this returns false, the principle direction
-// of rendering is right-to-left.
-func (p *Paragraph) IsLeftToRight() bool {
-       panic("unimplemented")
-}
-
-// Direction returns the direction of the text of this paragraph.
-//
-// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
-func (p *Paragraph) Direction() Direction {
-       panic("unimplemented")
-}
-
-// RunAt reports the Run at the given position of the input text.
-//
-// This method can be used for computing line breaks on paragraphs.
-func (p *Paragraph) RunAt(pos int) Run {
-       panic("unimplemented")
-}
-
-// Order computes the visual ordering of all the runs in a Paragraph.
-func (p *Paragraph) Order() (Ordering, error) {
-       panic("unimplemented")
-}
-
-// Line computes the visual ordering of runs for a single line starting and
-// ending at the given positions in the original text.
-func (p *Paragraph) Line(start, end int) (Ordering, error) {
-       panic("unimplemented")
-}
-
-// An Ordering holds the computed visual order of runs of a Paragraph. Calling
-// SetBytes or SetString on the originating Paragraph invalidates an Ordering.
-// The methods of an Ordering should only be called by one goroutine at a time.
-type Ordering struct{}
-
-// Direction reports the directionality of the runs.
-//
-// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
-func (o *Ordering) Direction() Direction {
-       panic("unimplemented")
-}
-
-// NumRuns returns the number of runs.
-func (o *Ordering) NumRuns() int {
-       panic("unimplemented")
-}
-
-// Run returns the ith run within the ordering.
-func (o *Ordering) Run(i int) Run {
-       panic("unimplemented")
-}
-
-// TODO: perhaps with options.
-// // Reorder creates a reader that reads the runes in visual order per character.
-// // Modifiers remain after the runes they modify.
-// func (l *Runs) Reorder() io.Reader {
-//     panic("unimplemented")
-// }
-
-// A Run is a continuous sequence of characters of a single direction.
-type Run struct {
-}
-
-// String returns the text of the run in its original order.
-func (r *Run) String() string {
-       panic("unimplemented")
-}
-
-// Bytes returns the text of the run in its original order.
-func (r *Run) Bytes() []byte {
-       panic("unimplemented")
-}
-
-// TODO: methods for
-// - Display order
-// - headers and footers
-// - bracket replacement.
-
-// Direction reports the direction of the run.
-func (r *Run) Direction() Direction {
-       panic("unimplemented")
-}
-
-// Position of the Run within the text passed to SetBytes or SetString of the
-// originating Paragraph value.
-func (r *Run) Pos() (start, end int) {
-       panic("unimplemented")
-}
-
-// AppendReverse reverses the order of characters of in, appends them to out,
-// and returns the result. Modifiers will still follow the runes they modify.
-// Brackets are replaced with their counterparts.
-func AppendReverse(out, in []byte) []byte {
-       panic("unimplemented")
-}
-
-// ReverseString reverses the order of characters in s and returns a new string.
-// Modifiers will still follow the runes they modify. Brackets are replaced with
-// their counterparts.
-func ReverseString(s string) string {
-       panic("unimplemented")
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/bracket.go b/libgo/go/internal/x/text/unicode/bidi/bracket.go
deleted file mode 100644 (file)
index 0784e79..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bidi
-
-import (
-       "container/list"
-       "fmt"
-       "sort"
-)
-
-// This file contains a port of the reference implementation of the
-// Bidi Parentheses Algorithm:
-// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java
-//
-// The implementation in this file covers definitions BD14-BD16 and rule N0
-// of UAX#9.
-//
-// Some preprocessing is done for each rune before data is passed to this
-// algorithm:
-//  - opening and closing brackets are identified
-//  - a bracket pair type, like '(' and ')' is assigned a unique identifier that
-//    is identical for the opening and closing bracket. It is left to do these
-//    mappings.
-//  - The BPA algorithm requires that bracket characters that are canonical
-//    equivalents of each other be able to be substituted for each other.
-//    It is the responsibility of the caller to do this canonicalization.
-//
-// In implementing BD16, this implementation departs slightly from the "logical"
-// algorithm defined in UAX#9. In particular, the stack referenced there
-// supports operations that go beyond a "basic" stack. An equivalent
-// implementation based on a linked list is used here.
-
-// Bidi_Paired_Bracket_Type
-// BD14. An opening paired bracket is a character whose
-// Bidi_Paired_Bracket_Type property value is Open.
-//
-// BD15. A closing paired bracket is a character whose
-// Bidi_Paired_Bracket_Type property value is Close.
-type bracketType byte
-
-const (
-       bpNone bracketType = iota
-       bpOpen
-       bpClose
-)
-
-// bracketPair holds a pair of index values for opening and closing bracket
-// location of a bracket pair.
-type bracketPair struct {
-       opener int
-       closer int
-}
-
-func (b *bracketPair) String() string {
-       return fmt.Sprintf("(%v, %v)", b.opener, b.closer)
-}
-
-// bracketPairs is a slice of bracketPairs with a sort.Interface implementation.
-type bracketPairs []bracketPair
-
-func (b bracketPairs) Len() int           { return len(b) }
-func (b bracketPairs) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }
-func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener }
-
-// resolvePairedBrackets runs the paired bracket part of the UBA algorithm.
-//
-// For each rune, it takes the indexes into the original string, the class the
-// bracket type (in pairTypes) and the bracket identifier (pairValues). It also
-// takes the direction type for the start-of-sentence and the embedding level.
-//
-// The identifiers for bracket types are the rune of the canonicalized opening
-// bracket for brackets (open or close) or 0 for runes that are not brackets.
-func resolvePairedBrackets(s *isolatingRunSequence) {
-       p := bracketPairer{
-               sos:              s.sos,
-               openers:          list.New(),
-               codesIsolatedRun: s.types,
-               indexes:          s.indexes,
-       }
-       dirEmbed := L
-       if s.level&1 != 0 {
-               dirEmbed = R
-       }
-       p.locateBrackets(s.p.pairTypes, s.p.pairValues)
-       p.resolveBrackets(dirEmbed, s.p.initialTypes)
-}
-
-type bracketPairer struct {
-       sos Class // direction corresponding to start of sequence
-
-       // The following is a restatement of BD 16 using non-algorithmic language.
-       //
-       // A bracket pair is a pair of characters consisting of an opening
-       // paired bracket and a closing paired bracket such that the
-       // Bidi_Paired_Bracket property value of the former equals the latter,
-       // subject to the following constraints.
-       // - both characters of a pair occur in the same isolating run sequence
-       // - the closing character of a pair follows the opening character
-       // - any bracket character can belong at most to one pair, the earliest possible one
-       // - any bracket character not part of a pair is treated like an ordinary character
-       // - pairs may nest properly, but their spans may not overlap otherwise
-
-       // Bracket characters with canonical decompositions are supposed to be
-       // treated as if they had been normalized, to allow normalized and non-
-       // normalized text to give the same result. In this implementation that step
-       // is pushed out to the caller. The caller has to ensure that the pairValue
-       // slices contain the rune of the opening bracket after normalization for
-       // any opening or closing bracket.
-
-       openers *list.List // list of positions for opening brackets
-
-       // bracket pair positions sorted by location of opening bracket
-       pairPositions bracketPairs
-
-       codesIsolatedRun []Class // directional bidi codes for an isolated run
-       indexes          []int   // array of index values into the original string
-
-}
-
-// matchOpener reports whether characters at given positions form a matching
-// bracket pair.
-func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool {
-       return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]]
-}
-
-const maxPairingDepth = 63
-
-// locateBrackets locates matching bracket pairs according to BD16.
-//
-// This implementation uses a linked list instead of a stack, because, while
-// elements are added at the front (like a push) they are not generally removed
-// in atomic 'pop' operations, reducing the benefit of the stack archetype.
-func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) {
-       // traverse the run
-       // do that explicitly (not in a for-each) so we can record position
-       for i, index := range p.indexes {
-
-               // look at the bracket type for each character
-               if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON {
-                       // continue scanning
-                       continue
-               }
-               switch pairTypes[index] {
-               case bpOpen:
-                       // check if maximum pairing depth reached
-                       if p.openers.Len() == maxPairingDepth {
-                               p.openers.Init()
-                               return
-                       }
-                       // remember opener location, most recent first
-                       p.openers.PushFront(i)
-
-               case bpClose:
-                       // see if there is a match
-                       count := 0
-                       for elem := p.openers.Front(); elem != nil; elem = elem.Next() {
-                               count++
-                               opener := elem.Value.(int)
-                               if p.matchOpener(pairValues, opener, i) {
-                                       // if the opener matches, add nested pair to the ordered list
-                                       p.pairPositions = append(p.pairPositions, bracketPair{opener, i})
-                                       // remove up to and including matched opener
-                                       for ; count > 0; count-- {
-                                               p.openers.Remove(p.openers.Front())
-                                       }
-                                       break
-                               }
-                       }
-                       sort.Sort(p.pairPositions)
-                       // if we get here, the closing bracket matched no openers
-                       // and gets ignored
-               }
-       }
-}
-
-// Bracket pairs within an isolating run sequence are processed as units so
-// that both the opening and the closing paired bracket in a pair resolve to
-// the same direction.
-//
-// N0. Process bracket pairs in an isolating run sequence sequentially in
-// the logical order of the text positions of the opening paired brackets
-// using the logic given below. Within this scope, bidirectional types EN
-// and AN are treated as R.
-//
-// Identify the bracket pairs in the current isolating run sequence
-// according to BD16. For each bracket-pair element in the list of pairs of
-// text positions:
-//
-// a Inspect the bidirectional types of the characters enclosed within the
-// bracket pair.
-//
-// b If any strong type (either L or R) matching the embedding direction is
-// found, set the type for both brackets in the pair to match the embedding
-// direction.
-//
-// o [ e ] o -> o e e e o
-//
-// o [ o e ] -> o e o e e
-//
-// o [ NI e ] -> o e NI e e
-//
-// c Otherwise, if a strong type (opposite the embedding direction) is
-// found, test for adjacent strong types as follows: 1 First, check
-// backwards before the opening paired bracket until the first strong type
-// (L, R, or sos) is found. If that first preceding strong type is opposite
-// the embedding direction, then set the type for both brackets in the pair
-// to that type. 2 Otherwise, set the type for both brackets in the pair to
-// the embedding direction.
-//
-// o [ o ] e -> o o o o e
-//
-// o [ o NI ] o -> o o o NI o o
-//
-// e [ o ] o -> e e o e o
-//
-// e [ o ] e -> e e o e e
-//
-// e ( o [ o ] NI ) e -> e e o o o o NI e e
-//
-// d Otherwise, do not set the type for the current bracket pair. Note that
-// if the enclosed text contains no strong types the paired brackets will
-// both resolve to the same level when resolved individually using rules N1
-// and N2.
-//
-// e ( NI ) o -> e ( NI ) o
-
-// getStrongTypeN0 maps character's directional code to strong type as required
-// by rule N0.
-//
-// TODO: have separate type for "strong" directionality.
-func (p *bracketPairer) getStrongTypeN0(index int) Class {
-       switch p.codesIsolatedRun[index] {
-       // in the scope of N0, number types are treated as R
-       case EN, AN, AL, R:
-               return R
-       case L:
-               return L
-       default:
-               return ON
-       }
-}
-
-// classifyPairContent reports the strong types contained inside a Bracket Pair,
-// assuming the given embedding direction.
-//
-// It returns ON if no strong type is found. If a single strong type is found,
-// it returns this this type. Otherwise it returns the embedding direction.
-//
-// TODO: use separate type for "strong" directionality.
-func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class {
-       dirOpposite := ON
-       for i := loc.opener + 1; i < loc.closer; i++ {
-               dir := p.getStrongTypeN0(i)
-               if dir == ON {
-                       continue
-               }
-               if dir == dirEmbed {
-                       return dir // type matching embedding direction found
-               }
-               dirOpposite = dir
-       }
-       // return ON if no strong type found, or class opposite to dirEmbed
-       return dirOpposite
-}
-
-// classBeforePair determines which strong types are present before a Bracket
-// Pair. Return R or L if strong type found, otherwise ON.
-func (p *bracketPairer) classBeforePair(loc bracketPair) Class {
-       for i := loc.opener - 1; i >= 0; i-- {
-               if dir := p.getStrongTypeN0(i); dir != ON {
-                       return dir
-               }
-       }
-       // no strong types found, return sos
-       return p.sos
-}
-
-// assignBracketType implements rule N0 for a single bracket pair.
-func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) {
-       // rule "N0, a", inspect contents of pair
-       dirPair := p.classifyPairContent(loc, dirEmbed)
-
-       // dirPair is now L, R, or N (no strong type found)
-
-       // the following logical tests are performed out of order compared to
-       // the statement of the rules but yield the same results
-       if dirPair == ON {
-               return // case "d" - nothing to do
-       }
-
-       if dirPair != dirEmbed {
-               // case "c": strong type found, opposite - check before (c.1)
-               dirPair = p.classBeforePair(loc)
-               if dirPair == dirEmbed || dirPair == ON {
-                       // no strong opposite type found before - use embedding (c.2)
-                       dirPair = dirEmbed
-               }
-       }
-       // else: case "b", strong type found matching embedding,
-       // no explicit action needed, as dirPair is already set to embedding
-       // direction
-
-       // set the bracket types to the type found
-       p.setBracketsToType(loc, dirPair, initialTypes)
-}
-
-func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) {
-       p.codesIsolatedRun[loc.opener] = dirPair
-       p.codesIsolatedRun[loc.closer] = dirPair
-
-       for i := loc.opener + 1; i < loc.closer; i++ {
-               index := p.indexes[i]
-               if initialTypes[index] != NSM {
-                       break
-               }
-               p.codesIsolatedRun[i] = dirPair
-       }
-
-       for i := loc.closer + 1; i < len(p.indexes); i++ {
-               index := p.indexes[i]
-               if initialTypes[index] != NSM {
-                       break
-               }
-               p.codesIsolatedRun[i] = dirPair
-       }
-}
-
-// resolveBrackets implements rule N0 for a list of pairs.
-func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) {
-       for _, loc := range p.pairPositions {
-               p.assignBracketType(loc, dirEmbed, initialTypes)
-       }
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/core.go b/libgo/go/internal/x/text/unicode/bidi/core.go
deleted file mode 100644 (file)
index 9a934b8..0000000
+++ /dev/null
@@ -1,1060 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bidi
-
-import "log"
-
-// This implementation is a port based on the reference implementation found at:
-// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/
-//
-// described in Unicode Bidirectional Algorithm (UAX #9).
-//
-// Input:
-// There are two levels of input to the algorithm, since clients may prefer to
-// supply some information from out-of-band sources rather than relying on the
-// default behavior.
-//
-// - Bidi class array
-// - Bidi class array, with externally supplied base line direction
-//
-// Output:
-// Output is separated into several stages:
-//
-//  - levels array over entire paragraph
-//  - reordering array over entire paragraph
-//  - levels array over line
-//  - reordering array over line
-//
-// Note that for conformance to the Unicode Bidirectional Algorithm,
-// implementations are only required to generate correct reordering and
-// character directionality (odd or even levels) over a line. Generating
-// identical level arrays over a line is not required. Bidi explicit format
-// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and
-// positions as long as the rest of the input is properly reordered.
-//
-// As the algorithm is defined to operate on a single paragraph at a time, this
-// implementation is written to handle single paragraphs. Thus rule P1 is
-// presumed by this implementation-- the data provided to the implementation is
-// assumed to be a single paragraph, and either contains no 'B' codes, or a
-// single 'B' code at the end of the input. 'B' is allowed as input to
-// illustrate how the algorithm assigns it a level.
-//
-// Also note that rules L3 and L4 depend on the rendering engine that uses the
-// result of the bidi algorithm. This implementation assumes that the rendering
-// engine expects combining marks in visual order (e.g. to the left of their
-// base character in RTL runs) and that it adjusts the glyphs used to render
-// mirrored characters that are in RTL runs so that they render appropriately.
-
-// level is the embedding level of a character. Even embedding levels indicate
-// left-to-right order and odd levels indicate right-to-left order. The special
-// level of -1 is reserved for undefined order.
-type level int8
-
-const implicitLevel level = -1
-
-// in returns if x is equal to any of the values in set.
-func (c Class) in(set ...Class) bool {
-       for _, s := range set {
-               if c == s {
-                       return true
-               }
-       }
-       return false
-}
-
-// A paragraph contains the state of a paragraph.
-type paragraph struct {
-       initialTypes []Class
-
-       // Arrays of properties needed for paired bracket evaluation in N0
-       pairTypes  []bracketType // paired Bracket types for paragraph
-       pairValues []rune        // rune for opening bracket or pbOpen and pbClose; 0 for pbNone
-
-       embeddingLevel level // default: = implicitLevel;
-
-       // at the paragraph levels
-       resultTypes  []Class
-       resultLevels []level
-
-       // Index of matching PDI for isolate initiator characters. For other
-       // characters, the value of matchingPDI will be set to -1. For isolate
-       // initiators with no matching PDI, matchingPDI will be set to the length of
-       // the input string.
-       matchingPDI []int
-
-       // Index of matching isolate initiator for PDI characters. For other
-       // characters, and for PDIs with no matching isolate initiator, the value of
-       // matchingIsolateInitiator will be set to -1.
-       matchingIsolateInitiator []int
-}
-
-// newParagraph initializes a paragraph. The user needs to supply a few arrays
-// corresponding to the preprocessed text input. The types correspond to the
-// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for
-// each rune. pairValues provides a unique bracket class identifier for each
-// rune (suggested is the rune of the open bracket for opening and matching
-// close brackets, after normalization). The embedding levels are optional, but
-// may be supplied to encode embedding levels of styled text.
-//
-// TODO: return an error.
-func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph {
-       validateTypes(types)
-       validatePbTypes(pairTypes)
-       validatePbValues(pairValues, pairTypes)
-       validateParagraphEmbeddingLevel(levels)
-
-       p := &paragraph{
-               initialTypes:   append([]Class(nil), types...),
-               embeddingLevel: levels,
-
-               pairTypes:  pairTypes,
-               pairValues: pairValues,
-
-               resultTypes: append([]Class(nil), types...),
-       }
-       p.run()
-       return p
-}
-
-func (p *paragraph) Len() int { return len(p.initialTypes) }
-
-// The algorithm. Does not include line-based processing (Rules L1, L2).
-// These are applied later in the line-based phase of the algorithm.
-func (p *paragraph) run() {
-       p.determineMatchingIsolates()
-
-       // 1) determining the paragraph level
-       // Rule P1 is the requirement for entering this algorithm.
-       // Rules P2, P3.
-       // If no externally supplied paragraph embedding level, use default.
-       if p.embeddingLevel == implicitLevel {
-               p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len())
-       }
-
-       // Initialize result levels to paragraph embedding level.
-       p.resultLevels = make([]level, p.Len())
-       setLevels(p.resultLevels, p.embeddingLevel)
-
-       // 2) Explicit levels and directions
-       // Rules X1-X8.
-       p.determineExplicitEmbeddingLevels()
-
-       // Rule X9.
-       // We do not remove the embeddings, the overrides, the PDFs, and the BNs
-       // from the string explicitly. But they are not copied into isolating run
-       // sequences when they are created, so they are removed for all
-       // practical purposes.
-
-       // Rule X10.
-       // Run remainder of algorithm one isolating run sequence at a time
-       for _, seq := range p.determineIsolatingRunSequences() {
-               // 3) resolving weak types
-               // Rules W1-W7.
-               seq.resolveWeakTypes()
-
-               // 4a) resolving paired brackets
-               // Rule N0
-               resolvePairedBrackets(seq)
-
-               // 4b) resolving neutral types
-               // Rules N1-N3.
-               seq.resolveNeutralTypes()
-
-               // 5) resolving implicit embedding levels
-               // Rules I1, I2.
-               seq.resolveImplicitLevels()
-
-               // Apply the computed levels and types
-               seq.applyLevelsAndTypes()
-       }
-
-       // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and
-       // BNs. This is for convenience, so the resulting level array will have
-       // a value for every character.
-       p.assignLevelsToCharactersRemovedByX9()
-}
-
-// determineMatchingIsolates determines the matching PDI for each isolate
-// initiator and vice versa.
-//
-// Definition BD9.
-//
-// At the end of this function:
-//
-//  - The member variable matchingPDI is set to point to the index of the
-//    matching PDI character for each isolate initiator character. If there is
-//    no matching PDI, it is set to the length of the input text. For other
-//    characters, it is set to -1.
-//  - The member variable matchingIsolateInitiator is set to point to the
-//    index of the matching isolate initiator character for each PDI character.
-//    If there is no matching isolate initiator, or the character is not a PDI,
-//    it is set to -1.
-func (p *paragraph) determineMatchingIsolates() {
-       p.matchingPDI = make([]int, p.Len())
-       p.matchingIsolateInitiator = make([]int, p.Len())
-
-       for i := range p.matchingIsolateInitiator {
-               p.matchingIsolateInitiator[i] = -1
-       }
-
-       for i := range p.matchingPDI {
-               p.matchingPDI[i] = -1
-
-               if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) {
-                       depthCounter := 1
-                       for j := i + 1; j < p.Len(); j++ {
-                               if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) {
-                                       depthCounter++
-                               } else if u == PDI {
-                                       if depthCounter--; depthCounter == 0 {
-                                               p.matchingPDI[i] = j
-                                               p.matchingIsolateInitiator[j] = i
-                                               break
-                                       }
-                               }
-                       }
-                       if p.matchingPDI[i] == -1 {
-                               p.matchingPDI[i] = p.Len()
-                       }
-               }
-       }
-}
-
-// determineParagraphEmbeddingLevel reports the resolved paragraph direction of
-// the substring limited by the given range [start, end).
-//
-// Determines the paragraph level based on rules P2, P3. This is also used
-// in rule X5c to find if an FSI should resolve to LRI or RLI.
-func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level {
-       var strongType Class = unknownClass
-
-       // Rule P2.
-       for i := start; i < end; i++ {
-               if t := p.resultTypes[i]; t.in(L, AL, R) {
-                       strongType = t
-                       break
-               } else if t.in(FSI, LRI, RLI) {
-                       i = p.matchingPDI[i] // skip over to the matching PDI
-                       if i > end {
-                               log.Panic("assert (i <= end)")
-                       }
-               }
-       }
-       // Rule P3.
-       switch strongType {
-       case unknownClass: // none found
-               // default embedding level when no strong types found is 0.
-               return 0
-       case L:
-               return 0
-       default: // AL, R
-               return 1
-       }
-}
-
-const maxDepth = 125
-
-// This stack will store the embedding levels and override and isolated
-// statuses
-type directionalStatusStack struct {
-       stackCounter        int
-       embeddingLevelStack [maxDepth + 1]level
-       overrideStatusStack [maxDepth + 1]Class
-       isolateStatusStack  [maxDepth + 1]bool
-}
-
-func (s *directionalStatusStack) empty()     { s.stackCounter = 0 }
-func (s *directionalStatusStack) pop()       { s.stackCounter-- }
-func (s *directionalStatusStack) depth() int { return s.stackCounter }
-
-func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) {
-       s.embeddingLevelStack[s.stackCounter] = level
-       s.overrideStatusStack[s.stackCounter] = overrideStatus
-       s.isolateStatusStack[s.stackCounter] = isolateStatus
-       s.stackCounter++
-}
-
-func (s *directionalStatusStack) lastEmbeddingLevel() level {
-       return s.embeddingLevelStack[s.stackCounter-1]
-}
-
-func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class {
-       return s.overrideStatusStack[s.stackCounter-1]
-}
-
-func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool {
-       return s.isolateStatusStack[s.stackCounter-1]
-}
-
-// Determine explicit levels using rules X1 - X8
-func (p *paragraph) determineExplicitEmbeddingLevels() {
-       var stack directionalStatusStack
-       var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int
-
-       // Rule X1.
-       stack.push(p.embeddingLevel, ON, false)
-
-       for i, t := range p.resultTypes {
-               // Rules X2, X3, X4, X5, X5a, X5b, X5c
-               switch t {
-               case RLE, LRE, RLO, LRO, RLI, LRI, FSI:
-                       isIsolate := t.in(RLI, LRI, FSI)
-                       isRTL := t.in(RLE, RLO, RLI)
-
-                       // override if this is an FSI that resolves to RLI
-                       if t == FSI {
-                               isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1)
-                       }
-                       if isIsolate {
-                               p.resultLevels[i] = stack.lastEmbeddingLevel()
-                               if stack.lastDirectionalOverrideStatus() != ON {
-                                       p.resultTypes[i] = stack.lastDirectionalOverrideStatus()
-                               }
-                       }
-
-                       var newLevel level
-                       if isRTL {
-                               // least greater odd
-                               newLevel = (stack.lastEmbeddingLevel() + 1) | 1
-                       } else {
-                               // least greater even
-                               newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1
-                       }
-
-                       if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 {
-                               if isIsolate {
-                                       validIsolateCount++
-                               }
-                               // Push new embedding level, override status, and isolated
-                               // status.
-                               // No check for valid stack counter, since the level check
-                               // suffices.
-                               switch t {
-                               case LRO:
-                                       stack.push(newLevel, L, isIsolate)
-                               case RLO:
-                                       stack.push(newLevel, R, isIsolate)
-                               default:
-                                       stack.push(newLevel, ON, isIsolate)
-                               }
-                               // Not really part of the spec
-                               if !isIsolate {
-                                       p.resultLevels[i] = newLevel
-                               }
-                       } else {
-                               // This is an invalid explicit formatting character,
-                               // so apply the "Otherwise" part of rules X2-X5b.
-                               if isIsolate {
-                                       overflowIsolateCount++
-                               } else { // !isIsolate
-                                       if overflowIsolateCount == 0 {
-                                               overflowEmbeddingCount++
-                                       }
-                               }
-                       }
-
-               // Rule X6a
-               case PDI:
-                       if overflowIsolateCount > 0 {
-                               overflowIsolateCount--
-                       } else if validIsolateCount == 0 {
-                               // do nothing
-                       } else {
-                               overflowEmbeddingCount = 0
-                               for !stack.lastDirectionalIsolateStatus() {
-                                       stack.pop()
-                               }
-                               stack.pop()
-                               validIsolateCount--
-                       }
-                       p.resultLevels[i] = stack.lastEmbeddingLevel()
-
-               // Rule X7
-               case PDF:
-                       // Not really part of the spec
-                       p.resultLevels[i] = stack.lastEmbeddingLevel()
-
-                       if overflowIsolateCount > 0 {
-                               // do nothing
-                       } else if overflowEmbeddingCount > 0 {
-                               overflowEmbeddingCount--
-                       } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 {
-                               stack.pop()
-                       }
-
-               case B: // paragraph separator.
-                       // Rule X8.
-
-                       // These values are reset for clarity, in this implementation B
-                       // can only occur as the last code in the array.
-                       stack.empty()
-                       overflowIsolateCount = 0
-                       overflowEmbeddingCount = 0
-                       validIsolateCount = 0
-                       p.resultLevels[i] = p.embeddingLevel
-
-               default:
-                       p.resultLevels[i] = stack.lastEmbeddingLevel()
-                       if stack.lastDirectionalOverrideStatus() != ON {
-                               p.resultTypes[i] = stack.lastDirectionalOverrideStatus()
-                       }
-               }
-       }
-}
-
-type isolatingRunSequence struct {
-       p *paragraph
-
-       indexes []int // indexes to the original string
-
-       types          []Class // type of each character using the index
-       resolvedLevels []level // resolved levels after application of rules
-       level          level
-       sos, eos       Class
-}
-
-func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
-
-func maxLevel(a, b level) level {
-       if a > b {
-               return a
-       }
-       return b
-}
-
-// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
-//                      either L or R, for each isolating run sequence.
-func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
-       length := len(indexes)
-       types := make([]Class, length)
-       for i, x := range indexes {
-               types[i] = p.resultTypes[x]
-       }
-
-       // assign level, sos and eos
-       prevChar := indexes[0] - 1
-       for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) {
-               prevChar--
-       }
-       prevLevel := p.embeddingLevel
-       if prevChar >= 0 {
-               prevLevel = p.resultLevels[prevChar]
-       }
-
-       var succLevel level
-       lastType := types[length-1]
-       if lastType.in(LRI, RLI, FSI) {
-               succLevel = p.embeddingLevel
-       } else {
-               // the first character after the end of run sequence
-               limit := indexes[length-1] + 1
-               for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ {
-
-               }
-               succLevel = p.embeddingLevel
-               if limit < p.Len() {
-                       succLevel = p.resultLevels[limit]
-               }
-       }
-       level := p.resultLevels[indexes[0]]
-       return &isolatingRunSequence{
-               p:       p,
-               indexes: indexes,
-               types:   types,
-               level:   level,
-               sos:     typeForLevel(maxLevel(prevLevel, level)),
-               eos:     typeForLevel(maxLevel(succLevel, level)),
-       }
-}
-
-// Resolving weak types Rules W1-W7.
-//
-// Note that some weak types (EN, AN) remain after this processing is
-// complete.
-func (s *isolatingRunSequence) resolveWeakTypes() {
-
-       // on entry, only these types remain
-       s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI)
-
-       // Rule W1.
-       // Changes all NSMs.
-       preceedingCharacterType := s.sos
-       for i, t := range s.types {
-               if t == NSM {
-                       s.types[i] = preceedingCharacterType
-               } else {
-                       if t.in(LRI, RLI, FSI, PDI) {
-                               preceedingCharacterType = ON
-                       }
-                       preceedingCharacterType = t
-               }
-       }
-
-       // Rule W2.
-       // EN does not change at the start of the run, because sos != AL.
-       for i, t := range s.types {
-               if t == EN {
-                       for j := i - 1; j >= 0; j-- {
-                               if t := s.types[j]; t.in(L, R, AL) {
-                                       if t == AL {
-                                               s.types[i] = AN
-                                       }
-                                       break
-                               }
-                       }
-               }
-       }
-
-       // Rule W3.
-       for i, t := range s.types {
-               if t == AL {
-                       s.types[i] = R
-               }
-       }
-
-       // Rule W4.
-       // Since there must be values on both sides for this rule to have an
-       // effect, the scan skips the first and last value.
-       //
-       // Although the scan proceeds left to right, and changes the type
-       // values in a way that would appear to affect the computations
-       // later in the scan, there is actually no problem. A change in the
-       // current value can only affect the value to its immediate right,
-       // and only affect it if it is ES or CS. But the current value can
-       // only change if the value to its right is not ES or CS. Thus
-       // either the current value will not change, or its change will have
-       // no effect on the remainder of the analysis.
-
-       for i := 1; i < s.Len()-1; i++ {
-               t := s.types[i]
-               if t == ES || t == CS {
-                       prevSepType := s.types[i-1]
-                       succSepType := s.types[i+1]
-                       if prevSepType == EN && succSepType == EN {
-                               s.types[i] = EN
-                       } else if s.types[i] == CS && prevSepType == AN && succSepType == AN {
-                               s.types[i] = AN
-                       }
-               }
-       }
-
-       // Rule W5.
-       for i, t := range s.types {
-               if t == ET {
-                       // locate end of sequence
-                       runStart := i
-                       runEnd := s.findRunLimit(runStart, ET)
-
-                       // check values at ends of sequence
-                       t := s.sos
-                       if runStart > 0 {
-                               t = s.types[runStart-1]
-                       }
-                       if t != EN {
-                               t = s.eos
-                               if runEnd < len(s.types) {
-                                       t = s.types[runEnd]
-                               }
-                       }
-                       if t == EN {
-                               setTypes(s.types[runStart:runEnd], EN)
-                       }
-                       // continue at end of sequence
-                       i = runEnd
-               }
-       }
-
-       // Rule W6.
-       for i, t := range s.types {
-               if t.in(ES, ET, CS) {
-                       s.types[i] = ON
-               }
-       }
-
-       // Rule W7.
-       for i, t := range s.types {
-               if t == EN {
-                       // set default if we reach start of run
-                       prevStrongType := s.sos
-                       for j := i - 1; j >= 0; j-- {
-                               t = s.types[j]
-                               if t == L || t == R { // AL's have been changed to R
-                                       prevStrongType = t
-                                       break
-                               }
-                       }
-                       if prevStrongType == L {
-                               s.types[i] = L
-                       }
-               }
-       }
-}
-
-// 6) resolving neutral types Rules N1-N2.
-func (s *isolatingRunSequence) resolveNeutralTypes() {
-
-       // on entry, only these types can be in resultTypes
-       s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI)
-
-       for i, t := range s.types {
-               switch t {
-               case WS, ON, B, S, RLI, LRI, FSI, PDI:
-                       // find bounds of run of neutrals
-                       runStart := i
-                       runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI)
-
-                       // determine effective types at ends of run
-                       var leadType, trailType Class
-
-                       // Note that the character found can only be L, R, AN, or
-                       // EN.
-                       if runStart == 0 {
-                               leadType = s.sos
-                       } else {
-                               leadType = s.types[runStart-1]
-                               if leadType.in(AN, EN) {
-                                       leadType = R
-                               }
-                       }
-                       if runEnd == len(s.types) {
-                               trailType = s.eos
-                       } else {
-                               trailType = s.types[runEnd]
-                               if trailType.in(AN, EN) {
-                                       trailType = R
-                               }
-                       }
-
-                       var resolvedType Class
-                       if leadType == trailType {
-                               // Rule N1.
-                               resolvedType = leadType
-                       } else {
-                               // Rule N2.
-                               // Notice the embedding level of the run is used, not
-                               // the paragraph embedding level.
-                               resolvedType = typeForLevel(s.level)
-                       }
-
-                       setTypes(s.types[runStart:runEnd], resolvedType)
-
-                       // skip over run of (former) neutrals
-                       i = runEnd
-               }
-       }
-}
-
-func setLevels(levels []level, newLevel level) {
-       for i := range levels {
-               levels[i] = newLevel
-       }
-}
-
-func setTypes(types []Class, newType Class) {
-       for i := range types {
-               types[i] = newType
-       }
-}
-
-// 7) resolving implicit embedding levels Rules I1, I2.
-func (s *isolatingRunSequence) resolveImplicitLevels() {
-
-       // on entry, only these types can be in resultTypes
-       s.assertOnly(L, R, EN, AN)
-
-       s.resolvedLevels = make([]level, len(s.types))
-       setLevels(s.resolvedLevels, s.level)
-
-       if (s.level & 1) == 0 { // even level
-               for i, t := range s.types {
-                       // Rule I1.
-                       if t == L {
-                               // no change
-                       } else if t == R {
-                               s.resolvedLevels[i] += 1
-                       } else { // t == AN || t == EN
-                               s.resolvedLevels[i] += 2
-                       }
-               }
-       } else { // odd level
-               for i, t := range s.types {
-                       // Rule I2.
-                       if t == R {
-                               // no change
-                       } else { // t == L || t == AN || t == EN
-                               s.resolvedLevels[i] += 1
-                       }
-               }
-       }
-}
-
-// Applies the levels and types resolved in rules W1-I2 to the
-// resultLevels array.
-func (s *isolatingRunSequence) applyLevelsAndTypes() {
-       for i, x := range s.indexes {
-               s.p.resultTypes[x] = s.types[i]
-               s.p.resultLevels[x] = s.resolvedLevels[i]
-       }
-}
-
-// Return the limit of the run consisting only of the types in validSet
-// starting at index. This checks the value at index, and will return
-// index if that value is not in validSet.
-func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int {
-loop:
-       for ; index < len(s.types); index++ {
-               t := s.types[index]
-               for _, valid := range validSet {
-                       if t == valid {
-                               continue loop
-                       }
-               }
-               return index // didn't find a match in validSet
-       }
-       return len(s.types)
-}
-
-// Algorithm validation. Assert that all values in types are in the
-// provided set.
-func (s *isolatingRunSequence) assertOnly(codes ...Class) {
-loop:
-       for i, t := range s.types {
-               for _, c := range codes {
-                       if t == c {
-                               continue loop
-                       }
-               }
-               log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i])
-       }
-}
-
-// determineLevelRuns returns an array of level runs. Each level run is
-// described as an array of indexes into the input string.
-//
-// Determines the level runs. Rule X9 will be applied in determining the
-// runs, in the way that makes sure the characters that are supposed to be
-// removed are not included in the runs.
-func (p *paragraph) determineLevelRuns() [][]int {
-       run := []int{}
-       allRuns := [][]int{}
-       currentLevel := implicitLevel
-
-       for i := range p.initialTypes {
-               if !isRemovedByX9(p.initialTypes[i]) {
-                       if p.resultLevels[i] != currentLevel {
-                               // we just encountered a new run; wrap up last run
-                               if currentLevel >= 0 { // only wrap it up if there was a run
-                                       allRuns = append(allRuns, run)
-                                       run = nil
-                               }
-                               // Start new run
-                               currentLevel = p.resultLevels[i]
-                       }
-                       run = append(run, i)
-               }
-       }
-       // Wrap up the final run, if any
-       if len(run) > 0 {
-               allRuns = append(allRuns, run)
-       }
-       return allRuns
-}
-
-// Definition BD13. Determine isolating run sequences.
-func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence {
-       levelRuns := p.determineLevelRuns()
-
-       // Compute the run that each character belongs to
-       runForCharacter := make([]int, p.Len())
-       for i, run := range levelRuns {
-               for _, index := range run {
-                       runForCharacter[index] = i
-               }
-       }
-
-       sequences := []*isolatingRunSequence{}
-
-       var currentRunSequence []int
-
-       for _, run := range levelRuns {
-               first := run[0]
-               if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 {
-                       currentRunSequence = nil
-                       // int run = i;
-                       for {
-                               // Copy this level run into currentRunSequence
-                               currentRunSequence = append(currentRunSequence, run...)
-
-                               last := currentRunSequence[len(currentRunSequence)-1]
-                               lastT := p.initialTypes[last]
-                               if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() {
-                                       run = levelRuns[runForCharacter[p.matchingPDI[last]]]
-                               } else {
-                                       break
-                               }
-                       }
-                       sequences = append(sequences, p.isolatingRunSequence(currentRunSequence))
-               }
-       }
-       return sequences
-}
-
-// Assign level information to characters removed by rule X9. This is for
-// ease of relating the level information to the original input data. Note
-// that the levels assigned to these codes are arbitrary, they're chosen so
-// as to avoid breaking level runs.
-func (p *paragraph) assignLevelsToCharactersRemovedByX9() {
-       for i, t := range p.initialTypes {
-               if t.in(LRE, RLE, LRO, RLO, PDF, BN) {
-                       p.resultTypes[i] = t
-                       p.resultLevels[i] = -1
-               }
-       }
-       // now propagate forward the levels information (could have
-       // propagated backward, the main thing is not to introduce a level
-       // break where one doesn't already exist).
-
-       if p.resultLevels[0] == -1 {
-               p.resultLevels[0] = p.embeddingLevel
-       }
-       for i := 1; i < len(p.initialTypes); i++ {
-               if p.resultLevels[i] == -1 {
-                       p.resultLevels[i] = p.resultLevels[i-1]
-               }
-       }
-       // Embedding information is for informational purposes only so need not be
-       // adjusted.
-}
-
-//
-// Output
-//
-
-// getLevels computes levels array breaking lines at offsets in linebreaks.
-// Rule L1.
-//
-// The linebreaks array must include at least one value. The values must be
-// in strictly increasing order (no duplicates) between 1 and the length of
-// the text, inclusive. The last value must be the length of the text.
-func (p *paragraph) getLevels(linebreaks []int) []level {
-       // Note that since the previous processing has removed all
-       // P, S, and WS values from resultTypes, the values referred to
-       // in these rules are the initial types, before any processing
-       // has been applied (including processing of overrides).
-       //
-       // This example implementation has reinserted explicit format codes
-       // and BN, in order that the levels array correspond to the
-       // initial text. Their final placement is not normative.
-       // These codes are treated like WS in this implementation,
-       // so they don't interrupt sequences of WS.
-
-       validateLineBreaks(linebreaks, p.Len())
-
-       result := append([]level(nil), p.resultLevels...)
-
-       // don't worry about linebreaks since if there is a break within
-       // a series of WS values preceding S, the linebreak itself
-       // causes the reset.
-       for i, t := range p.initialTypes {
-               if t.in(B, S) {
-                       // Rule L1, clauses one and two.
-                       result[i] = p.embeddingLevel
-
-                       // Rule L1, clause three.
-                       for j := i - 1; j >= 0; j-- {
-                               if isWhitespace(p.initialTypes[j]) { // including format codes
-                                       result[j] = p.embeddingLevel
-                               } else {
-                                       break
-                               }
-                       }
-               }
-       }
-
-       // Rule L1, clause four.
-       start := 0
-       for _, limit := range linebreaks {
-               for j := limit - 1; j >= start; j-- {
-                       if isWhitespace(p.initialTypes[j]) { // including format codes
-                               result[j] = p.embeddingLevel
-                       } else {
-                               break
-                       }
-               }
-               start = limit
-       }
-
-       return result
-}
-
-// getReordering returns the reordering of lines from a visual index to a
-// logical index for line breaks at the given offsets.
-//
-// Lines are concatenated from left to right. So for example, the fifth
-// character from the left on the third line is
-//
-//             getReordering(linebreaks)[linebreaks[1] + 4]
-//
-// (linebreaks[1] is the position after the last character of the second
-// line, which is also the index of the first character on the third line,
-// and adding four gets the fifth character from the left).
-//
-// The linebreaks array must include at least one value. The values must be
-// in strictly increasing order (no duplicates) between 1 and the length of
-// the text, inclusive. The last value must be the length of the text.
-func (p *paragraph) getReordering(linebreaks []int) []int {
-       validateLineBreaks(linebreaks, p.Len())
-
-       return computeMultilineReordering(p.getLevels(linebreaks), linebreaks)
-}
-
-// Return multiline reordering array for a given level array. Reordering
-// does not occur across a line break.
-func computeMultilineReordering(levels []level, linebreaks []int) []int {
-       result := make([]int, len(levels))
-
-       start := 0
-       for _, limit := range linebreaks {
-               tempLevels := make([]level, limit-start)
-               copy(tempLevels, levels[start:])
-
-               for j, order := range computeReordering(tempLevels) {
-                       result[start+j] = order + start
-               }
-               start = limit
-       }
-       return result
-}
-
-// Return reordering array for a given level array. This reorders a single
-// line. The reordering is a visual to logical map. For example, the
-// leftmost char is string.charAt(order[0]). Rule L2.
-func computeReordering(levels []level) []int {
-       result := make([]int, len(levels))
-       // initialize order
-       for i := range result {
-               result[i] = i
-       }
-
-       // locate highest level found on line.
-       // Note the rules say text, but no reordering across line bounds is
-       // performed, so this is sufficient.
-       highestLevel := level(0)
-       lowestOddLevel := level(maxDepth + 2)
-       for _, level := range levels {
-               if level > highestLevel {
-                       highestLevel = level
-               }
-               if level&1 != 0 && level < lowestOddLevel {
-                       lowestOddLevel = level
-               }
-       }
-
-       for level := highestLevel; level >= lowestOddLevel; level-- {
-               for i := 0; i < len(levels); i++ {
-                       if levels[i] >= level {
-                               // find range of text at or above this level
-                               start := i
-                               limit := i + 1
-                               for limit < len(levels) && levels[limit] >= level {
-                                       limit++
-                               }
-
-                               for j, k := start, limit-1; j < k; j, k = j+1, k-1 {
-                                       result[j], result[k] = result[k], result[j]
-                               }
-                               // skip to end of level run
-                               i = limit
-                       }
-               }
-       }
-
-       return result
-}
-
-// isWhitespace reports whether the type is considered a whitespace type for the
-// line break rules.
-func isWhitespace(c Class) bool {
-       switch c {
-       case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS:
-               return true
-       }
-       return false
-}
-
-// isRemovedByX9 reports whether the type is one of the types removed in X9.
-func isRemovedByX9(c Class) bool {
-       switch c {
-       case LRE, RLE, LRO, RLO, PDF, BN:
-               return true
-       }
-       return false
-}
-
-// typeForLevel reports the strong type (L or R) corresponding to the level.
-func typeForLevel(level level) Class {
-       if (level & 0x1) == 0 {
-               return L
-       }
-       return R
-}
-
-// TODO: change validation to not panic
-
-func validateTypes(types []Class) {
-       if len(types) == 0 {
-               log.Panic("types is null")
-       }
-       for i, t := range types[:len(types)-1] {
-               if t == B {
-                       log.Panicf("B type before end of paragraph at index: %d", i)
-               }
-       }
-}
-
-func validateParagraphEmbeddingLevel(embeddingLevel level) {
-       if embeddingLevel != implicitLevel &&
-               embeddingLevel != 0 &&
-               embeddingLevel != 1 {
-               log.Panicf("illegal paragraph embedding level: %d", embeddingLevel)
-       }
-}
-
-func validateLineBreaks(linebreaks []int, textLength int) {
-       prev := 0
-       for i, next := range linebreaks {
-               if next <= prev {
-                       log.Panicf("bad linebreak: %d at index: %d", next, i)
-               }
-               prev = next
-       }
-       if prev != textLength {
-               log.Panicf("last linebreak was %d, want %d", prev, textLength)
-       }
-}
-
-func validatePbTypes(pairTypes []bracketType) {
-       if len(pairTypes) == 0 {
-               log.Panic("pairTypes is null")
-       }
-       for i, pt := range pairTypes {
-               switch pt {
-               case bpNone, bpOpen, bpClose:
-               default:
-                       log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i])
-               }
-       }
-}
-
-func validatePbValues(pairValues []rune, pairTypes []bracketType) {
-       if pairValues == nil {
-               log.Panic("pairValues is null")
-       }
-       if len(pairTypes) != len(pairValues) {
-               log.Panic("pairTypes is different length from pairValues")
-       }
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/example_test.go b/libgo/go/internal/x/text/unicode/bidi/example_test.go
deleted file mode 100644 (file)
index 56c5c4a..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT.
-
-// +build ignore
-
-package bidi_test
-
-import (
-       "fmt"
-       "log"
-
-       "internal/x/text/bidi"
-)
-
-func foo() {
-       var sa StringAttributes
-       var p Paragraph
-       n, _ := p.SetString(s)
-       for i, o := 0, p.Ordering(); i < o.NumRuns(); i++ {
-               b := o.Run(i).Bytes()
-
-               start, end := o.Run(i).Pos()
-               for p := start; p < end; {
-                       style, n := sa.StyleAt(start)
-                       render()
-                       p += n
-               }
-
-       }
-}
-
-type style int
-
-const (
-       styleNormal   = 0
-       styleSelected = 1 << (iota - 1)
-       styleBold
-       styleItalics
-)
-
-type styleRun struct {
-       end   int
-       style style
-}
-
-func getTextWidth(text string, styleRuns []styleRun) int {
-       // simplistic way to compute the width
-       return len([]rune(text))
-}
-
-// set limit and StyleRun limit for a line
-// from text[start] and from styleRuns[styleRunStart]
-// using Bidi.getLogicalRun(...)
-// returns line width
-func getLineBreak(p *bidi.Paragraph, start int, styles []styleRun) (n int) {
-       // dummy return
-       return 0
-}
-
-// render runs on a line sequentially, always from left to right
-
-// prepare rendering a new line
-func startLine(d bidi.Direction, lineWidth int) {
-       fmt.Println()
-}
-
-// render a run of text and advance to the right by the run width
-// the text[start..limit-1] is always in logical order
-func renderRun(text string, d bidi.Direction, styl style) {
-}
-
-// We could compute a cross-product
-// from the style runs with the directional runs
-// and then reorder it.
-// Instead, here we iterate over each run type
-// and render the intersections -
-// with shortcuts in simple (and common) cases.
-// renderParagraph() is the main function.
-
-// render a directional run with
-// (possibly) multiple style runs intersecting with it
-func renderDirectionalRun(text string, offset int, d bidi.Direction, styles []styleRun) {
-       start, end := offset, len(text)+offset
-       // iterate over style runs
-       if run.Direction() == bidi.LeftToRight {
-               styleEnd := 0
-               for _, sr := range styles {
-                       styleEnd = styleRuns[i].end
-                       if start < styleEnd {
-                               if styleEnd > end {
-                                       styleEnd = end
-                               }
-                               renderRun(text[start-offset:styleEnd-offset], run.Direction(), styles[i].style)
-                               if styleEnd == end {
-                                       break
-                               }
-                               start = styleEnd
-                       }
-               }
-       } else {
-               styleStart := 0
-               for i := len(styles) - 1; i >= 0; i-- {
-                       if i > 0 {
-                               styleStart = styles[i-1].end
-                       } else {
-                               styleStart = 0
-                       }
-                       if end >= styleStart {
-                               if styleStart < start {
-                                       styleStart = start
-                               }
-                               renderRun(text[styleStart-offset:end-offset], run.Direction(), styles[i].style)
-                               if styleStart == start {
-                                       break
-                               }
-                               end = styleStart
-                       }
-               }
-       }
-}
-
-// the line object represents text[start..limit-1]
-func renderLine(line *bidi.Runs, text string, offset int, styles []styleRun) {
-       if dir := line.Direction(); dir != bidi.Mixed {
-               if len(styles) == 1 {
-                       renderRun(text, dir, styles[0].style)
-               } else {
-                       for i := 0; i < line.NumRuns(); i++ {
-                               renderDirectionalRun(text, offset, dir, styles)
-                       }
-               }
-       } else {
-               // iterate over both directional and style runs
-               for i := 0; i < line.Len(); i++ {
-                       run := line.Run(i)
-                       start, _ := run.Pos()
-                       renderDirectionalRun(text[start-offset:], start, run.Direction(), styles)
-               }
-       }
-}
-
-func renderParagraph(text string, d bidi.Direction, styles []styleRun, int lineWidth) {
-       var p bidi.Paragraph
-       if err := p.SetString(text, bidi.DefaultDirection(d)); err != nil {
-               log.Fatal(err)
-       }
-
-       if len(styles) == 0 {
-               styles = append(styles, []styleRun{len(text), styleNormal})
-       }
-
-       if width := getTextWidth(text, styles); width <= lineWidth {
-               // everything fits onto one line
-
-               runs, err := p.Runs()
-               if err != nil {
-                       log.Fatal(err)
-               }
-
-               // prepare rendering a new line from either left or right
-               startLine(p.Direction(), width)
-               renderLine(&runs, text, styles)
-       } else {
-               // we need to render several lines
-
-               for start, end := 0, 0; start < len(text); start = end {
-                       for start >= styles[0].end {
-                               styles = styles[1:]
-                       }
-                       end = getLineBreak(p, start, styles[startStyles:])
-
-                       runs, err := p.Line(start, end)
-                       if err != nil {
-                               log.Fatal(err)
-                       }
-
-                       startLine(p.Direction(), end-start)
-                       renderLine(&runs, text[start:end], styles[startStyles:])
-               }
-       }
-}
-
-func main() {
-       renderParagraph("Some Latin text...", bidi.LeftToRight, nil, 80)
-       renderParagraph("Some Hebrew text...", bidi.RightToLeft, nil, 60)
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/prop.go b/libgo/go/internal/x/text/unicode/bidi/prop.go
deleted file mode 100644 (file)
index 878b8c4..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bidi
-
-import "unicode/utf8"
-
-// Properties provides access to BiDi properties of runes.
-type Properties struct {
-       entry uint8
-       last  uint8
-}
-
-var trie = newBidiTrie(0)
-
-// TODO: using this for bidirule reduces the running time by about 5%. Consider
-// if this is worth exposing or if we can find a way to speed up the Class
-// method.
-//
-// // CompactClass is like Class, but maps all of the BiDi control classes
-// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control.
-// func (p Properties) CompactClass() Class {
-//     return Class(p.entry & 0x0F)
-// }
-
-// Class returns the Bidi class for p.
-func (p Properties) Class() Class {
-       c := Class(p.entry & 0x0F)
-       if c == Control {
-               c = controlByteToClass[p.last&0xF]
-       }
-       return c
-}
-
-// IsBracket reports whether the rune is a bracket.
-func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 }
-
-// IsOpeningBracket reports whether the rune is an opening bracket.
-// IsBracket must return true.
-func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 }
-
-// TODO: find a better API and expose.
-func (p Properties) reverseBracket(r rune) rune {
-       return xorMasks[p.entry>>xorMaskShift] ^ r
-}
-
-var controlByteToClass = [16]Class{
-       0xD: LRO, // U+202D LeftToRightOverride,
-       0xE: RLO, // U+202E RightToLeftOverride,
-       0xA: LRE, // U+202A LeftToRightEmbedding,
-       0xB: RLE, // U+202B RightToLeftEmbedding,
-       0xC: PDF, // U+202C PopDirectionalFormat,
-       0x6: LRI, // U+2066 LeftToRightIsolate,
-       0x7: RLI, // U+2067 RightToLeftIsolate,
-       0x8: FSI, // U+2068 FirstStrongIsolate,
-       0x9: PDI, // U+2069 PopDirectionalIsolate,
-}
-
-// LookupRune returns properties for r.
-func LookupRune(r rune) (p Properties, size int) {
-       var buf [4]byte
-       n := utf8.EncodeRune(buf[:], r)
-       return Lookup(buf[:n])
-}
-
-// TODO: these lookup methods are based on the generated trie code. The returned
-// sizes have slightly different semantics from the generated code, in that it
-// always returns size==1 for an illegal UTF-8 byte (instead of the length
-// of the maximum invalid subsequence). Most Transformers, like unicode/norm,
-// leave invalid UTF-8 untouched, in which case it has performance benefits to
-// do so (without changing the semantics). Bidi requires the semantics used here
-// for the bidirule implementation to be compatible with the Go semantics.
-//  They ultimately should perhaps be adopted by all trie implementations, for
-// convenience sake.
-// This unrolled code also boosts performance of the secure/bidirule package by
-// about 30%.
-// So, to remove this code:
-//   - add option to trie generator to define return type.
-//   - always return 1 byte size for ill-formed UTF-8 runes.
-
-// Lookup returns properties for the first rune in s and the width in bytes of
-// its encoding. The size will be 0 if s does not hold enough bytes to complete
-// the encoding.
-func Lookup(s []byte) (p Properties, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return Properties{entry: bidiValues[c0]}, 1
-       case c0 < 0xC2:
-               return Properties{}, 1
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return Properties{}, 1
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = bidiIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4
-       }
-       // Illegal rune
-       return Properties{}, 1
-}
-
-// LookupString returns properties for the first rune in s and the width in
-// bytes of its encoding. The size will be 0 if s does not hold enough bytes to
-// complete the encoding.
-func LookupString(s string) (p Properties, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return Properties{entry: bidiValues[c0]}, 1
-       case c0 < 0xC2:
-               return Properties{}, 1
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return Properties{}, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return Properties{}, 1
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return Properties{}, 1
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = bidiIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return Properties{}, 1
-               }
-               return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4
-       }
-       // Illegal rune
-       return Properties{}, 1
-}
diff --git a/libgo/go/internal/x/text/unicode/bidi/tables.go b/libgo/go/internal/x/text/unicode/bidi/tables.go
deleted file mode 100644 (file)
index c9c45c6..0000000
+++ /dev/null
@@ -1,1815 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Code generated by running "go generate" in internal/x/text. DO NOT EDIT.
-
-package bidi
-
-// UnicodeVersion is the Unicode version from which the tables in this package are derived.
-const UnicodeVersion = "10.0.0"
-
-// xorMasks contains masks to be xor-ed with brackets to get the reverse
-// version.
-var xorMasks = []int32{ // 8 elements
-       0, 1, 6, 7, 3, 15, 29, 63,
-} // Size: 56 bytes
-
-// lookup returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return bidiValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = bidiIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return bidiValues[c0]
-       }
-       i := bidiIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// lookupString returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return bidiValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := bidiIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = bidiIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = bidiIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return bidiValues[c0]
-       }
-       i := bidiIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = bidiIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = bidiIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// bidiTrie. Total size: 16128 bytes (15.75 KiB). Checksum: 8122d83e461996f.
-type bidiTrie struct{}
-
-func newBidiTrie(i int) *bidiTrie {
-       return &bidiTrie{}
-}
-
-// lookupValue determines the type of block n and looks up the value for b.
-func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
-       switch {
-       default:
-               return uint8(bidiValues[n<<6+uint32(b)])
-       }
-}
-
-// bidiValues: 228 blocks, 14592 entries, 14592 bytes
-// The third block is the zero block.
-var bidiValues = [14592]uint8{
-       // Block 0x0, offset 0x0
-       0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
-       0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
-       0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
-       0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
-       0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
-       0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
-       0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
-       0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
-       0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
-       0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
-       0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
-       // Block 0x1, offset 0x40
-       0x40: 0x000a,
-       0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
-       0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
-       0x7b: 0x005a,
-       0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
-       0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
-       0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
-       0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
-       0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
-       0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
-       0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
-       0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
-       0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
-       0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
-       0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
-       // Block 0x4, offset 0x100
-       0x117: 0x000a,
-       0x137: 0x000a,
-       // Block 0x5, offset 0x140
-       0x179: 0x000a, 0x17a: 0x000a,
-       // Block 0x6, offset 0x180
-       0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
-       0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
-       0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
-       0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
-       0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
-       0x19e: 0x000a, 0x19f: 0x000a,
-       0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
-       0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
-       0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
-       0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
-       0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
-       0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
-       0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
-       0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
-       0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
-       0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
-       0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
-       0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
-       0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
-       0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
-       0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
-       // Block 0x8, offset 0x200
-       0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
-       0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
-       0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
-       0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
-       0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
-       0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
-       0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
-       0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
-       0x234: 0x000a, 0x235: 0x000a,
-       0x23e: 0x000a,
-       // Block 0x9, offset 0x240
-       0x244: 0x000a, 0x245: 0x000a,
-       0x247: 0x000a,
-       // Block 0xa, offset 0x280
-       0x2b6: 0x000a,
-       // Block 0xb, offset 0x2c0
-       0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
-       0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
-       // Block 0xc, offset 0x300
-       0x30a: 0x000a,
-       0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
-       0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
-       0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
-       0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
-       0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
-       0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
-       0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
-       0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
-       0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
-       // Block 0xd, offset 0x340
-       0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
-       0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
-       0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
-       0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
-       0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
-       0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
-       0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
-       0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
-       0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
-       0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
-       0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
-       // Block 0xe, offset 0x380
-       0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
-       0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
-       0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
-       0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
-       0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
-       0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
-       0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
-       0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
-       0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
-       0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
-       0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
-       // Block 0xf, offset 0x3c0
-       0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
-       0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
-       0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
-       0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
-       0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
-       0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
-       0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
-       0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
-       0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
-       0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
-       0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
-       // Block 0x10, offset 0x400
-       0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
-       0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
-       0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
-       0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
-       0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
-       0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
-       0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
-       0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
-       0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
-       0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
-       0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
-       // Block 0x11, offset 0x440
-       0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
-       0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
-       0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
-       0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
-       0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
-       0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
-       0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
-       0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
-       0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
-       0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
-       0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
-       // Block 0x12, offset 0x480
-       0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
-       0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
-       0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
-       0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
-       0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
-       0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
-       0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
-       0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
-       0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
-       0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
-       0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
-       // Block 0x13, offset 0x4c0
-       0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
-       0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
-       0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
-       0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
-       0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
-       0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
-       0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
-       0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
-       0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
-       0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
-       0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
-       // Block 0x14, offset 0x500
-       0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
-       0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
-       0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
-       0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
-       0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
-       0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
-       0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
-       0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
-       0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
-       0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
-       0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
-       // Block 0x15, offset 0x540
-       0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
-       0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
-       0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
-       0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
-       0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
-       0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
-       0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
-       0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
-       0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
-       0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
-       0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,
-       // Block 0x16, offset 0x580
-       0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
-       0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
-       0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
-       0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
-       0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
-       0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
-       0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
-       0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
-       0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
-       0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
-       0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
-       // Block 0x17, offset 0x5c0
-       0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
-       0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
-       0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
-       0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
-       0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
-       0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d,
-       0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d,
-       0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d,
-       0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,
-       0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,
-       0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,
-       // Block 0x18, offset 0x600
-       0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,
-       0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,
-       0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,
-       0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
-       0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,
-       0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
-       0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
-       0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
-       0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
-       0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
-       0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
-       // Block 0x19, offset 0x640
-       0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
-       0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,
-       0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,
-       0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
-       0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
-       0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
-       0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
-       0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
-       0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
-       0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
-       0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
-       // Block 0x1a, offset 0x680
-       0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
-       0x6ba: 0x000c,
-       0x6bc: 0x000c,
-       // Block 0x1b, offset 0x6c0
-       0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
-       0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
-       0x6cd: 0x000c, 0x6d1: 0x000c,
-       0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
-       0x6e2: 0x000c, 0x6e3: 0x000c,
-       // Block 0x1c, offset 0x700
-       0x701: 0x000c,
-       0x73c: 0x000c,
-       // Block 0x1d, offset 0x740
-       0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
-       0x74d: 0x000c,
-       0x762: 0x000c, 0x763: 0x000c,
-       0x772: 0x0004, 0x773: 0x0004,
-       0x77b: 0x0004,
-       // Block 0x1e, offset 0x780
-       0x781: 0x000c, 0x782: 0x000c,
-       0x7bc: 0x000c,
-       // Block 0x1f, offset 0x7c0
-       0x7c1: 0x000c, 0x7c2: 0x000c,
-       0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
-       0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
-       0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
-       // Block 0x20, offset 0x800
-       0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
-       0x807: 0x000c, 0x808: 0x000c,
-       0x80d: 0x000c,
-       0x822: 0x000c, 0x823: 0x000c,
-       0x831: 0x0004,
-       0x83a: 0x000c, 0x83b: 0x000c,
-       0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c,
-       // Block 0x21, offset 0x840
-       0x841: 0x000c,
-       0x87c: 0x000c, 0x87f: 0x000c,
-       // Block 0x22, offset 0x880
-       0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
-       0x88d: 0x000c,
-       0x896: 0x000c,
-       0x8a2: 0x000c, 0x8a3: 0x000c,
-       // Block 0x23, offset 0x8c0
-       0x8c2: 0x000c,
-       // Block 0x24, offset 0x900
-       0x900: 0x000c,
-       0x90d: 0x000c,
-       0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
-       0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
-       // Block 0x25, offset 0x940
-       0x940: 0x000c,
-       0x97e: 0x000c, 0x97f: 0x000c,
-       // Block 0x26, offset 0x980
-       0x980: 0x000c,
-       0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
-       0x98c: 0x000c, 0x98d: 0x000c,
-       0x995: 0x000c, 0x996: 0x000c,
-       0x9a2: 0x000c, 0x9a3: 0x000c,
-       0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
-       0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
-       // Block 0x27, offset 0x9c0
-       0x9cc: 0x000c, 0x9cd: 0x000c,
-       0x9e2: 0x000c, 0x9e3: 0x000c,
-       // Block 0x28, offset 0xa00
-       0xa00: 0x000c, 0xa01: 0x000c,
-       0xa3b: 0x000c,
-       0xa3c: 0x000c,
-       // Block 0x29, offset 0xa40
-       0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
-       0xa4d: 0x000c,
-       0xa62: 0x000c, 0xa63: 0x000c,
-       // Block 0x2a, offset 0xa80
-       0xa8a: 0x000c,
-       0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,
-       // Block 0x2b, offset 0xac0
-       0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,
-       0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,
-       0xaff: 0x0004,
-       // Block 0x2c, offset 0xb00
-       0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,
-       0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,
-       // Block 0x2d, offset 0xb40
-       0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,
-       0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,
-       0xb7c: 0x000c,
-       // Block 0x2e, offset 0xb80
-       0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,
-       0xb8c: 0x000c, 0xb8d: 0x000c,
-       // Block 0x2f, offset 0xbc0
-       0xbd8: 0x000c, 0xbd9: 0x000c,
-       0xbf5: 0x000c,
-       0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,
-       0xbfc: 0x003a, 0xbfd: 0x002a,
-       // Block 0x30, offset 0xc00
-       0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,
-       0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,
-       0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,
-       // Block 0x31, offset 0xc40
-       0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,
-       0xc46: 0x000c, 0xc47: 0x000c,
-       0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,
-       0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,
-       0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,
-       0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,
-       0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,
-       0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,
-       0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
-       0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
-       0xc7c: 0x000c,
-       // Block 0x32, offset 0xc80
-       0xc86: 0x000c,
-       // Block 0x33, offset 0xcc0
-       0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,
-       0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,
-       0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,
-       0xcfd: 0x000c, 0xcfe: 0x000c,
-       // Block 0x34, offset 0xd00
-       0xd18: 0x000c, 0xd19: 0x000c,
-       0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,
-       0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,
-       // Block 0x35, offset 0xd40
-       0xd42: 0x000c, 0xd45: 0x000c,
-       0xd46: 0x000c,
-       0xd4d: 0x000c,
-       0xd5d: 0x000c,
-       // Block 0x36, offset 0xd80
-       0xd9d: 0x000c,
-       0xd9e: 0x000c, 0xd9f: 0x000c,
-       // Block 0x37, offset 0xdc0
-       0xdd0: 0x000a, 0xdd1: 0x000a,
-       0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,
-       0xdd8: 0x000a, 0xdd9: 0x000a,
-       // Block 0x38, offset 0xe00
-       0xe00: 0x000a,
-       // Block 0x39, offset 0xe40
-       0xe40: 0x0009,
-       0xe5b: 0x007a, 0xe5c: 0x006a,
-       // Block 0x3a, offset 0xe80
-       0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,
-       0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,
-       // Block 0x3b, offset 0xec0
-       0xed2: 0x000c, 0xed3: 0x000c,
-       0xef2: 0x000c, 0xef3: 0x000c,
-       // Block 0x3c, offset 0xf00
-       0xf34: 0x000c, 0xf35: 0x000c,
-       0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,
-       0xf3c: 0x000c, 0xf3d: 0x000c,
-       // Block 0x3d, offset 0xf40
-       0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,
-       0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,
-       0xf52: 0x000c, 0xf53: 0x000c,
-       0xf5b: 0x0004, 0xf5d: 0x000c,
-       0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,
-       0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,
-       // Block 0x3e, offset 0xf80
-       0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,
-       0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,
-       0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,
-       // Block 0x3f, offset 0xfc0
-       0xfc5: 0x000c,
-       0xfc6: 0x000c,
-       0xfe9: 0x000c,
-       // Block 0x40, offset 0x1000
-       0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,
-       0x1027: 0x000c, 0x1028: 0x000c,
-       0x1032: 0x000c,
-       0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,
-       // Block 0x41, offset 0x1040
-       0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,
-       // Block 0x42, offset 0x1080
-       0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,
-       0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,
-       0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,
-       0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,
-       0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,
-       0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,
-       // Block 0x43, offset 0x10c0
-       0x10d7: 0x000c,
-       0x10d8: 0x000c, 0x10db: 0x000c,
-       // Block 0x44, offset 0x1100
-       0x1116: 0x000c,
-       0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,
-       0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,
-       0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,
-       0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,
-       0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,
-       0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,
-       0x113c: 0x000c, 0x113f: 0x000c,
-       // Block 0x45, offset 0x1140
-       0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
-       0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
-       0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,
-       // Block 0x46, offset 0x1180
-       0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,
-       0x11b4: 0x000c,
-       0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,
-       0x11bc: 0x000c,
-       // Block 0x47, offset 0x11c0
-       0x11c2: 0x000c,
-       0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,
-       0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,
-       // Block 0x48, offset 0x1200
-       0x1200: 0x000c, 0x1201: 0x000c,
-       0x1222: 0x000c, 0x1223: 0x000c,
-       0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,
-       0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,
-       // Block 0x49, offset 0x1240
-       0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,
-       0x126d: 0x000c, 0x126f: 0x000c,
-       0x1270: 0x000c, 0x1271: 0x000c,
-       // Block 0x4a, offset 0x1280
-       0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,
-       0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,
-       0x12b6: 0x000c, 0x12b7: 0x000c,
-       // Block 0x4b, offset 0x12c0
-       0x12d0: 0x000c, 0x12d1: 0x000c,
-       0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,
-       0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,
-       0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,
-       0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,
-       0x12ed: 0x000c,
-       0x12f4: 0x000c,
-       0x12f8: 0x000c, 0x12f9: 0x000c,
-       // Block 0x4c, offset 0x1300
-       0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,
-       0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,
-       0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,
-       0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,
-       0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,
-       0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,
-       0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,
-       0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
-       0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,
-       0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c,
-       0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,
-       // Block 0x4d, offset 0x1340
-       0x137d: 0x000a, 0x137f: 0x000a,
-       // Block 0x4e, offset 0x1380
-       0x1380: 0x000a, 0x1381: 0x000a,
-       0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,
-       0x139d: 0x000a,
-       0x139e: 0x000a, 0x139f: 0x000a,
-       0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,
-       0x13bd: 0x000a, 0x13be: 0x000a,
-       // Block 0x4f, offset 0x13c0
-       0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,
-       0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,
-       0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,
-       0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,
-       0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,
-       0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,
-       0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,
-       0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,
-       0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,
-       0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,
-       0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,
-       // Block 0x50, offset 0x1400
-       0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,
-       0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,
-       0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,
-       0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
-       0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
-       0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,
-       0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,
-       0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,
-       0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,
-       0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,
-       0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,
-       // Block 0x51, offset 0x1440
-       0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,
-       0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,
-       0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,
-       0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,
-       0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,
-       0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,
-       0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,
-       0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,
-       0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,
-       // Block 0x52, offset 0x1480
-       0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,
-       0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,
-       0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,
-       0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,
-       0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,
-       0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,
-       0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,
-       0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,
-       0x14b0: 0x000c,
-       // Block 0x53, offset 0x14c0
-       0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,
-       0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,
-       0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,
-       0x14d8: 0x000a,
-       0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,
-       0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,
-       0x14ee: 0x0004,
-       0x14fa: 0x000a, 0x14fb: 0x000a,
-       // Block 0x54, offset 0x1500
-       0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,
-       0x150a: 0x000a, 0x150b: 0x000a,
-       0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,
-       0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
-       0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,
-       0x151e: 0x000a, 0x151f: 0x000a,
-       // Block 0x55, offset 0x1540
-       0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,
-       0x1550: 0x000a, 0x1551: 0x000a,
-       0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
-       0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
-       0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,
-       0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,
-       0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,
-       0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,
-       0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,
-       0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,
-       // Block 0x56, offset 0x1580
-       0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,
-       0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
-       0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,
-       0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
-       0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
-       0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
-       0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
-       0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
-       0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
-       0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
-       0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
-       // Block 0x57, offset 0x15c0
-       0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
-       0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
-       0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
-       0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
-       0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
-       0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
-       0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
-       0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
-       0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
-       0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
-       0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
-       // Block 0x58, offset 0x1600
-       0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
-       0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,
-       0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
-       0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
-       0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
-       0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
-       0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,
-       0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
-       0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
-       // Block 0x59, offset 0x1640
-       0x167b: 0x000a,
-       0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,
-       // Block 0x5a, offset 0x1680
-       0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,
-       0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,
-       0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,
-       0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,
-       0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,
-       0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,
-       0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,
-       0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,
-       0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,
-       0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,
-       0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
-       // Block 0x5b, offset 0x16c0
-       0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
-       0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
-       0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
-       0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
-       0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
-       0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
-       0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a,
-       // Block 0x5c, offset 0x1700
-       0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
-       0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a,
-       0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
-       0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a,
-       0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a,
-       0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a,
-       0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a,
-       0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a,
-       // Block 0x5d, offset 0x1740
-       0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
-       0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002,
-       0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002,
-       0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002,
-       0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002,
-       // Block 0x5e, offset 0x1780
-       0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a,
-       0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a,
-       0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a,
-       0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a,
-       // Block 0x5f, offset 0x17c0
-       0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a,
-       0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a,
-       0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a,
-       0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a,
-       0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a,
-       0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a,
-       0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a,
-       0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
-       0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
-       0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
-       0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
-       // Block 0x60, offset 0x1800
-       0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
-       0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
-       0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
-       0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
-       0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
-       0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
-       0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a,
-       0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a,
-       0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a,
-       0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
-       0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
-       // Block 0x61, offset 0x1840
-       0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a,
-       0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
-       0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
-       0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
-       0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
-       0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
-       0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a,
-       0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
-       0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a,
-       0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
-       0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
-       // Block 0x62, offset 0x1880
-       0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a,
-       0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a,
-       0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a,
-       0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba,
-       0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
-       0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
-       0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a,
-       0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a,
-       0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
-       0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
-       0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
-       // Block 0x63, offset 0x18c0
-       0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a,
-       0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a,
-       0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a,
-       0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a,
-       0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a,
-       0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
-       0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
-       0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
-       0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
-       0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
-       0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a,
-       // Block 0x64, offset 0x1900
-       0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
-       0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
-       0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
-       0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
-       0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a,
-       0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
-       0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
-       0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
-       0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a,
-       0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
-       0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a,
-       // Block 0x65, offset 0x1940
-       0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
-       0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
-       0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
-       0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a,
-       0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
-       0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
-       0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
-       0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
-       0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a,
-       0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a,
-       0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
-       // Block 0x66, offset 0x1980
-       0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
-       0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
-       0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
-       0x1992: 0x000a,
-       0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
-       // Block 0x67, offset 0x19c0
-       0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a,
-       0x19ea: 0x000a, 0x19ef: 0x000c,
-       0x19f0: 0x000c, 0x19f1: 0x000c,
-       0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a,
-       0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a,
-       // Block 0x68, offset 0x1a00
-       0x1a3f: 0x000c,
-       // Block 0x69, offset 0x1a40
-       0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c,
-       0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c,
-       0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c,
-       0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c,
-       0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c,
-       0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c,
-       // Block 0x6a, offset 0x1a80
-       0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a,
-       0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a,
-       0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a,
-       0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a,
-       0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a,
-       0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a,
-       0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a,
-       0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a,
-       0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a,
-       0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a,
-       0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a,
-       // Block 0x6b, offset 0x1ac0
-       0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
-       0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a,
-       // Block 0x6c, offset 0x1b00
-       0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a,
-       0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a,
-       0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a,
-       0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a,
-       0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a,
-       0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a,
-       0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a,
-       0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a,
-       0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a,
-       0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a,
-       0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a,
-       // Block 0x6d, offset 0x1b40
-       0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
-       0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
-       0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
-       0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
-       0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
-       0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
-       0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
-       0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
-       0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a,
-       // Block 0x6e, offset 0x1b80
-       0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
-       0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
-       0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
-       0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a,
-       0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a,
-       0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a,
-       // Block 0x6f, offset 0x1bc0
-       0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a,
-       0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a,
-       0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a,
-       0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a,
-       0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a,
-       0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a,
-       0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c,
-       0x1bf0: 0x000a,
-       0x1bf6: 0x000a, 0x1bf7: 0x000a,
-       0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a,
-       // Block 0x70, offset 0x1c00
-       0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a,
-       0x1c20: 0x000a,
-       // Block 0x71, offset 0x1c40
-       0x1c7b: 0x000a,
-       // Block 0x72, offset 0x1c80
-       0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a,
-       0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a,
-       0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a,
-       0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a,
-       0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a,
-       0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a,
-       // Block 0x73, offset 0x1cc0
-       0x1cdd: 0x000a,
-       0x1cde: 0x000a,
-       // Block 0x74, offset 0x1d00
-       0x1d10: 0x000a, 0x1d11: 0x000a,
-       0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a,
-       0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a,
-       0x1d1e: 0x000a, 0x1d1f: 0x000a,
-       0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a,
-       // Block 0x75, offset 0x1d40
-       0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a,
-       0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a,
-       0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a,
-       // Block 0x76, offset 0x1d80
-       0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a,
-       // Block 0x77, offset 0x1dc0
-       0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a,
-       // Block 0x78, offset 0x1e00
-       0x1e1e: 0x000a, 0x1e1f: 0x000a,
-       0x1e3f: 0x000a,
-       // Block 0x79, offset 0x1e40
-       0x1e50: 0x000a, 0x1e51: 0x000a,
-       0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a,
-       0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a,
-       0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a,
-       0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a,
-       0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a,
-       0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a,
-       0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a,
-       0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a,
-       // Block 0x7a, offset 0x1e80
-       0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a,
-       0x1e86: 0x000a,
-       // Block 0x7b, offset 0x1ec0
-       0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a,
-       // Block 0x7c, offset 0x1f00
-       0x1f2f: 0x000c,
-       0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c,
-       0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c,
-       0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a,
-       // Block 0x7d, offset 0x1f40
-       0x1f5e: 0x000c, 0x1f5f: 0x000c,
-       // Block 0x7e, offset 0x1f80
-       0x1fb0: 0x000c, 0x1fb1: 0x000c,
-       // Block 0x7f, offset 0x1fc0
-       0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a,
-       0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a,
-       0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a,
-       0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a,
-       0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a,
-       0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a,
-       // Block 0x80, offset 0x2000
-       0x2008: 0x000a,
-       // Block 0x81, offset 0x2040
-       0x2042: 0x000c,
-       0x2046: 0x000c, 0x204b: 0x000c,
-       0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a,
-       0x206a: 0x000a, 0x206b: 0x000a,
-       0x2078: 0x0004, 0x2079: 0x0004,
-       // Block 0x82, offset 0x2080
-       0x20b4: 0x000a, 0x20b5: 0x000a,
-       0x20b6: 0x000a, 0x20b7: 0x000a,
-       // Block 0x83, offset 0x20c0
-       0x20c4: 0x000c, 0x20c5: 0x000c,
-       0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c,
-       0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c,
-       0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c,
-       0x20f0: 0x000c, 0x20f1: 0x000c,
-       // Block 0x84, offset 0x2100
-       0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
-       0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c,
-       // Block 0x85, offset 0x2140
-       0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c,
-       0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c,
-       // Block 0x86, offset 0x2180
-       0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c,
-       0x21b3: 0x000c,
-       0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c,
-       0x21bc: 0x000c,
-       // Block 0x87, offset 0x21c0
-       0x21e5: 0x000c,
-       // Block 0x88, offset 0x2200
-       0x2229: 0x000c,
-       0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c,
-       0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c,
-       0x2236: 0x000c,
-       // Block 0x89, offset 0x2240
-       0x2243: 0x000c,
-       0x224c: 0x000c,
-       0x227c: 0x000c,
-       // Block 0x8a, offset 0x2280
-       0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c,
-       0x22b7: 0x000c, 0x22b8: 0x000c,
-       0x22be: 0x000c, 0x22bf: 0x000c,
-       // Block 0x8b, offset 0x22c0
-       0x22c1: 0x000c,
-       0x22ec: 0x000c, 0x22ed: 0x000c,
-       0x22f6: 0x000c,
-       // Block 0x8c, offset 0x2300
-       0x2325: 0x000c, 0x2328: 0x000c,
-       0x232d: 0x000c,
-       // Block 0x8d, offset 0x2340
-       0x235d: 0x0001,
-       0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001,
-       0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003,
-       0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001,
-       0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001,
-       0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001,
-       0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001,
-       // Block 0x8e, offset 0x2380
-       0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001,
-       0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001,
-       0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d,
-       0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d,
-       0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d,
-       0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d,
-       0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d,
-       0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d,
-       0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d,
-       0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d,
-       0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d,
-       // Block 0x8f, offset 0x23c0
-       0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d,
-       0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d,
-       0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d,
-       0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
-       0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
-       0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
-       0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
-       0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
-       0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
-       0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
-       0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a,
-       // Block 0x90, offset 0x2400
-       0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
-       0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
-       0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b,
-       0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b,
-       0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b,
-       0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b,
-       0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b,
-       0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b,
-       0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
-       0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
-       0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d,
-       // Block 0x91, offset 0x2440
-       0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c,
-       0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c,
-       0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a,
-       0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a,
-       0x2458: 0x000a, 0x2459: 0x000a,
-       0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c,
-       0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c,
-       0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c,
-       0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a,
-       0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a,
-       0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a,
-       // Block 0x92, offset 0x2480
-       0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a,
-       0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a,
-       0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a,
-       0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a,
-       0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a,
-       0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003,
-       0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004,
-       0x24aa: 0x0004, 0x24ab: 0x000a,
-       0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d,
-       0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d,
-       0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d,
-       // Block 0x93, offset 0x24c0
-       0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d,
-       0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d,
-       0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d,
-       0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d,
-       0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d,
-       0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d,
-       0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d,
-       0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d,
-       0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,
-       0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,
-       0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b,
-       // Block 0x94, offset 0x2500
-       0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004,
-       0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003,
-       0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002,
-       0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002,
-       0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a,
-       0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a,
-       0x253b: 0x005a,
-       0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a,
-       // Block 0x95, offset 0x2540
-       0x2540: 0x000a,
-       0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a,
-       0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a,
-       0x2564: 0x000a, 0x2565: 0x000a,
-       // Block 0x96, offset 0x2580
-       0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a,
-       0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a,
-       0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a,
-       0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b,
-       0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a,
-       0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b,
-       // Block 0x97, offset 0x25c0
-       0x25c1: 0x000a,
-       // Block 0x98, offset 0x2600
-       0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a,
-       0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a,
-       0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a,
-       0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a,
-       0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a,
-       0x2620: 0x000a,
-       // Block 0x99, offset 0x2640
-       0x267d: 0x000c,
-       // Block 0x9a, offset 0x2680
-       0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002,
-       0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002,
-       0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002,
-       0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002,
-       0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002,
-       // Block 0x9b, offset 0x26c0
-       0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c,
-       // Block 0x9c, offset 0x2700
-       0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001,
-       0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001,
-       0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001,
-       0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001,
-       0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001,
-       0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001,
-       0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001,
-       0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001,
-       0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001,
-       0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001,
-       0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001,
-       // Block 0x9d, offset 0x2740
-       0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,
-       0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,
-       0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,
-       0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,
-       0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,
-       0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,
-       0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,
-       0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,
-       0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,
-       0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,
-       0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,
-       // Block 0x9e, offset 0x2780
-       0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c,
-       0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
-       0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001,
-       0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
-       0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
-       0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
-       0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
-       0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
-       0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
-       0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001,
-       0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c,
-       // Block 0x9f, offset 0x27c0
-       0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001,
-       0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
-       0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001,
-       0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
-       0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
-       0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
-       0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
-       0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
-       0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
-       0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001,
-       0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001,
-       // Block 0xa0, offset 0x2800
-       0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,
-       0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
-       0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,
-       0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
-       0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
-       0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
-       0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
-       0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
-       0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
-       0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a,
-       0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a,
-       // Block 0xa1, offset 0x2840
-       0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,
-       0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,
-       0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,
-       0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,
-       0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,
-       0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005,
-       0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005,
-       0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005,
-       0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005,
-       0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005,
-       0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001,
-       // Block 0xa2, offset 0x2880
-       0x2881: 0x000c,
-       0x28b8: 0x000c, 0x28b9: 0x000c, 0x28ba: 0x000c, 0x28bb: 0x000c,
-       0x28bc: 0x000c, 0x28bd: 0x000c, 0x28be: 0x000c, 0x28bf: 0x000c,
-       // Block 0xa3, offset 0x28c0
-       0x28c0: 0x000c, 0x28c1: 0x000c, 0x28c2: 0x000c, 0x28c3: 0x000c, 0x28c4: 0x000c, 0x28c5: 0x000c,
-       0x28c6: 0x000c,
-       0x28d2: 0x000a, 0x28d3: 0x000a, 0x28d4: 0x000a, 0x28d5: 0x000a, 0x28d6: 0x000a, 0x28d7: 0x000a,
-       0x28d8: 0x000a, 0x28d9: 0x000a, 0x28da: 0x000a, 0x28db: 0x000a, 0x28dc: 0x000a, 0x28dd: 0x000a,
-       0x28de: 0x000a, 0x28df: 0x000a, 0x28e0: 0x000a, 0x28e1: 0x000a, 0x28e2: 0x000a, 0x28e3: 0x000a,
-       0x28e4: 0x000a, 0x28e5: 0x000a,
-       0x28ff: 0x000c,
-       // Block 0xa4, offset 0x2900
-       0x2900: 0x000c, 0x2901: 0x000c,
-       0x2933: 0x000c, 0x2934: 0x000c, 0x2935: 0x000c,
-       0x2936: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c,
-       // Block 0xa5, offset 0x2940
-       0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c,
-       0x2967: 0x000c, 0x2968: 0x000c, 0x2969: 0x000c,
-       0x296a: 0x000c, 0x296b: 0x000c, 0x296d: 0x000c, 0x296e: 0x000c, 0x296f: 0x000c,
-       0x2970: 0x000c, 0x2971: 0x000c, 0x2972: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c,
-       // Block 0xa6, offset 0x2980
-       0x29b3: 0x000c,
-       // Block 0xa7, offset 0x29c0
-       0x29c0: 0x000c, 0x29c1: 0x000c,
-       0x29f6: 0x000c, 0x29f7: 0x000c, 0x29f8: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, 0x29fb: 0x000c,
-       0x29fc: 0x000c, 0x29fd: 0x000c, 0x29fe: 0x000c,
-       // Block 0xa8, offset 0x2a00
-       0x2a0a: 0x000c, 0x2a0b: 0x000c,
-       0x2a0c: 0x000c,
-       // Block 0xa9, offset 0x2a40
-       0x2a6f: 0x000c,
-       0x2a70: 0x000c, 0x2a71: 0x000c, 0x2a74: 0x000c,
-       0x2a76: 0x000c, 0x2a77: 0x000c,
-       0x2a7e: 0x000c,
-       // Block 0xaa, offset 0x2a80
-       0x2a9f: 0x000c, 0x2aa3: 0x000c,
-       0x2aa4: 0x000c, 0x2aa5: 0x000c, 0x2aa6: 0x000c, 0x2aa7: 0x000c, 0x2aa8: 0x000c, 0x2aa9: 0x000c,
-       0x2aaa: 0x000c,
-       // Block 0xab, offset 0x2ac0
-       0x2ac0: 0x000c, 0x2ac1: 0x000c,
-       0x2afc: 0x000c,
-       // Block 0xac, offset 0x2b00
-       0x2b00: 0x000c,
-       0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c,
-       0x2b2a: 0x000c, 0x2b2b: 0x000c, 0x2b2c: 0x000c,
-       0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b32: 0x000c, 0x2b33: 0x000c, 0x2b34: 0x000c,
-       // Block 0xad, offset 0x2b40
-       0x2b78: 0x000c, 0x2b79: 0x000c, 0x2b7a: 0x000c, 0x2b7b: 0x000c,
-       0x2b7c: 0x000c, 0x2b7d: 0x000c, 0x2b7e: 0x000c, 0x2b7f: 0x000c,
-       // Block 0xae, offset 0x2b80
-       0x2b82: 0x000c, 0x2b83: 0x000c, 0x2b84: 0x000c,
-       0x2b86: 0x000c,
-       // Block 0xaf, offset 0x2bc0
-       0x2bf3: 0x000c, 0x2bf4: 0x000c, 0x2bf5: 0x000c,
-       0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bfa: 0x000c,
-       0x2bff: 0x000c,
-       // Block 0xb0, offset 0x2c00
-       0x2c00: 0x000c, 0x2c02: 0x000c, 0x2c03: 0x000c,
-       // Block 0xb1, offset 0x2c40
-       0x2c72: 0x000c, 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c,
-       0x2c7c: 0x000c, 0x2c7d: 0x000c, 0x2c7f: 0x000c,
-       // Block 0xb2, offset 0x2c80
-       0x2c80: 0x000c,
-       0x2c9c: 0x000c, 0x2c9d: 0x000c,
-       // Block 0xb3, offset 0x2cc0
-       0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c,
-       0x2cf6: 0x000c, 0x2cf7: 0x000c, 0x2cf8: 0x000c, 0x2cf9: 0x000c, 0x2cfa: 0x000c,
-       0x2cfd: 0x000c, 0x2cff: 0x000c,
-       // Block 0xb4, offset 0x2d00
-       0x2d00: 0x000c,
-       0x2d20: 0x000a, 0x2d21: 0x000a, 0x2d22: 0x000a, 0x2d23: 0x000a,
-       0x2d24: 0x000a, 0x2d25: 0x000a, 0x2d26: 0x000a, 0x2d27: 0x000a, 0x2d28: 0x000a, 0x2d29: 0x000a,
-       0x2d2a: 0x000a, 0x2d2b: 0x000a, 0x2d2c: 0x000a,
-       // Block 0xb5, offset 0x2d40
-       0x2d6b: 0x000c, 0x2d6d: 0x000c,
-       0x2d70: 0x000c, 0x2d71: 0x000c, 0x2d72: 0x000c, 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c,
-       0x2d77: 0x000c,
-       // Block 0xb6, offset 0x2d80
-       0x2d9d: 0x000c,
-       0x2d9e: 0x000c, 0x2d9f: 0x000c, 0x2da2: 0x000c, 0x2da3: 0x000c,
-       0x2da4: 0x000c, 0x2da5: 0x000c, 0x2da7: 0x000c, 0x2da8: 0x000c, 0x2da9: 0x000c,
-       0x2daa: 0x000c, 0x2dab: 0x000c,
-       // Block 0xb7, offset 0x2dc0
-       0x2dc1: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, 0x2dc4: 0x000c, 0x2dc5: 0x000c,
-       0x2dc6: 0x000c, 0x2dc9: 0x000c, 0x2dca: 0x000c,
-       0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c,
-       0x2df6: 0x000c, 0x2df7: 0x000c, 0x2df8: 0x000c, 0x2dfb: 0x000c,
-       0x2dfc: 0x000c, 0x2dfd: 0x000c, 0x2dfe: 0x000c,
-       // Block 0xb8, offset 0x2e00
-       0x2e07: 0x000c,
-       0x2e11: 0x000c,
-       0x2e12: 0x000c, 0x2e13: 0x000c, 0x2e14: 0x000c, 0x2e15: 0x000c, 0x2e16: 0x000c,
-       0x2e19: 0x000c, 0x2e1a: 0x000c, 0x2e1b: 0x000c,
-       // Block 0xb9, offset 0x2e40
-       0x2e4a: 0x000c, 0x2e4b: 0x000c,
-       0x2e4c: 0x000c, 0x2e4d: 0x000c, 0x2e4e: 0x000c, 0x2e4f: 0x000c, 0x2e50: 0x000c, 0x2e51: 0x000c,
-       0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c,
-       0x2e58: 0x000c, 0x2e59: 0x000c,
-       // Block 0xba, offset 0x2e80
-       0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c,
-       0x2eb6: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, 0x2ebb: 0x000c,
-       0x2ebc: 0x000c, 0x2ebd: 0x000c,
-       // Block 0xbb, offset 0x2ec0
-       0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, 0x2ed7: 0x000c,
-       0x2ed8: 0x000c, 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, 0x2edc: 0x000c, 0x2edd: 0x000c,
-       0x2ede: 0x000c, 0x2edf: 0x000c, 0x2ee0: 0x000c, 0x2ee1: 0x000c, 0x2ee2: 0x000c, 0x2ee3: 0x000c,
-       0x2ee4: 0x000c, 0x2ee5: 0x000c, 0x2ee6: 0x000c, 0x2ee7: 0x000c,
-       0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, 0x2eee: 0x000c, 0x2eef: 0x000c,
-       0x2ef0: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef5: 0x000c,
-       0x2ef6: 0x000c,
-       // Block 0xbc, offset 0x2f00
-       0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c,
-       0x2f36: 0x000c, 0x2f3a: 0x000c,
-       0x2f3c: 0x000c, 0x2f3d: 0x000c, 0x2f3f: 0x000c,
-       // Block 0xbd, offset 0x2f40
-       0x2f40: 0x000c, 0x2f41: 0x000c, 0x2f42: 0x000c, 0x2f43: 0x000c, 0x2f44: 0x000c, 0x2f45: 0x000c,
-       0x2f47: 0x000c,
-       // Block 0xbe, offset 0x2f80
-       0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c,
-       // Block 0xbf, offset 0x2fc0
-       0x2ff0: 0x000c, 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c,
-       0x2ff6: 0x000c,
-       // Block 0xc0, offset 0x3000
-       0x300f: 0x000c, 0x3010: 0x000c, 0x3011: 0x000c,
-       0x3012: 0x000c,
-       // Block 0xc1, offset 0x3040
-       0x305d: 0x000c,
-       0x305e: 0x000c, 0x3060: 0x000b, 0x3061: 0x000b, 0x3062: 0x000b, 0x3063: 0x000b,
-       // Block 0xc2, offset 0x3080
-       0x30a7: 0x000c, 0x30a8: 0x000c, 0x30a9: 0x000c,
-       0x30b3: 0x000b, 0x30b4: 0x000b, 0x30b5: 0x000b,
-       0x30b6: 0x000b, 0x30b7: 0x000b, 0x30b8: 0x000b, 0x30b9: 0x000b, 0x30ba: 0x000b, 0x30bb: 0x000c,
-       0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, 0x30bf: 0x000c,
-       // Block 0xc3, offset 0x30c0
-       0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c5: 0x000c,
-       0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c,
-       0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c,
-       // Block 0xc4, offset 0x3100
-       0x3100: 0x000a, 0x3101: 0x000a, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000a,
-       // Block 0xc5, offset 0x3140
-       0x3140: 0x000a, 0x3141: 0x000a, 0x3142: 0x000a, 0x3143: 0x000a, 0x3144: 0x000a, 0x3145: 0x000a,
-       0x3146: 0x000a, 0x3147: 0x000a, 0x3148: 0x000a, 0x3149: 0x000a, 0x314a: 0x000a, 0x314b: 0x000a,
-       0x314c: 0x000a, 0x314d: 0x000a, 0x314e: 0x000a, 0x314f: 0x000a, 0x3150: 0x000a, 0x3151: 0x000a,
-       0x3152: 0x000a, 0x3153: 0x000a, 0x3154: 0x000a, 0x3155: 0x000a, 0x3156: 0x000a,
-       // Block 0xc6, offset 0x3180
-       0x319b: 0x000a,
-       // Block 0xc7, offset 0x31c0
-       0x31d5: 0x000a,
-       // Block 0xc8, offset 0x3200
-       0x320f: 0x000a,
-       // Block 0xc9, offset 0x3240
-       0x3249: 0x000a,
-       // Block 0xca, offset 0x3280
-       0x3283: 0x000a,
-       0x328e: 0x0002, 0x328f: 0x0002, 0x3290: 0x0002, 0x3291: 0x0002,
-       0x3292: 0x0002, 0x3293: 0x0002, 0x3294: 0x0002, 0x3295: 0x0002, 0x3296: 0x0002, 0x3297: 0x0002,
-       0x3298: 0x0002, 0x3299: 0x0002, 0x329a: 0x0002, 0x329b: 0x0002, 0x329c: 0x0002, 0x329d: 0x0002,
-       0x329e: 0x0002, 0x329f: 0x0002, 0x32a0: 0x0002, 0x32a1: 0x0002, 0x32a2: 0x0002, 0x32a3: 0x0002,
-       0x32a4: 0x0002, 0x32a5: 0x0002, 0x32a6: 0x0002, 0x32a7: 0x0002, 0x32a8: 0x0002, 0x32a9: 0x0002,
-       0x32aa: 0x0002, 0x32ab: 0x0002, 0x32ac: 0x0002, 0x32ad: 0x0002, 0x32ae: 0x0002, 0x32af: 0x0002,
-       0x32b0: 0x0002, 0x32b1: 0x0002, 0x32b2: 0x0002, 0x32b3: 0x0002, 0x32b4: 0x0002, 0x32b5: 0x0002,
-       0x32b6: 0x0002, 0x32b7: 0x0002, 0x32b8: 0x0002, 0x32b9: 0x0002, 0x32ba: 0x0002, 0x32bb: 0x0002,
-       0x32bc: 0x0002, 0x32bd: 0x0002, 0x32be: 0x0002, 0x32bf: 0x0002,
-       // Block 0xcb, offset 0x32c0
-       0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c3: 0x000c, 0x32c4: 0x000c, 0x32c5: 0x000c,
-       0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c,
-       0x32cc: 0x000c, 0x32cd: 0x000c, 0x32ce: 0x000c, 0x32cf: 0x000c, 0x32d0: 0x000c, 0x32d1: 0x000c,
-       0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x000c,
-       0x32d8: 0x000c, 0x32d9: 0x000c, 0x32da: 0x000c, 0x32db: 0x000c, 0x32dc: 0x000c, 0x32dd: 0x000c,
-       0x32de: 0x000c, 0x32df: 0x000c, 0x32e0: 0x000c, 0x32e1: 0x000c, 0x32e2: 0x000c, 0x32e3: 0x000c,
-       0x32e4: 0x000c, 0x32e5: 0x000c, 0x32e6: 0x000c, 0x32e7: 0x000c, 0x32e8: 0x000c, 0x32e9: 0x000c,
-       0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, 0x32ee: 0x000c, 0x32ef: 0x000c,
-       0x32f0: 0x000c, 0x32f1: 0x000c, 0x32f2: 0x000c, 0x32f3: 0x000c, 0x32f4: 0x000c, 0x32f5: 0x000c,
-       0x32f6: 0x000c, 0x32fb: 0x000c,
-       0x32fc: 0x000c, 0x32fd: 0x000c, 0x32fe: 0x000c, 0x32ff: 0x000c,
-       // Block 0xcc, offset 0x3300
-       0x3300: 0x000c, 0x3301: 0x000c, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000c,
-       0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x000c,
-       0x330c: 0x000c, 0x330d: 0x000c, 0x330e: 0x000c, 0x330f: 0x000c, 0x3310: 0x000c, 0x3311: 0x000c,
-       0x3312: 0x000c, 0x3313: 0x000c, 0x3314: 0x000c, 0x3315: 0x000c, 0x3316: 0x000c, 0x3317: 0x000c,
-       0x3318: 0x000c, 0x3319: 0x000c, 0x331a: 0x000c, 0x331b: 0x000c, 0x331c: 0x000c, 0x331d: 0x000c,
-       0x331e: 0x000c, 0x331f: 0x000c, 0x3320: 0x000c, 0x3321: 0x000c, 0x3322: 0x000c, 0x3323: 0x000c,
-       0x3324: 0x000c, 0x3325: 0x000c, 0x3326: 0x000c, 0x3327: 0x000c, 0x3328: 0x000c, 0x3329: 0x000c,
-       0x332a: 0x000c, 0x332b: 0x000c, 0x332c: 0x000c,
-       0x3335: 0x000c,
-       // Block 0xcd, offset 0x3340
-       0x3344: 0x000c,
-       0x335b: 0x000c, 0x335c: 0x000c, 0x335d: 0x000c,
-       0x335e: 0x000c, 0x335f: 0x000c, 0x3361: 0x000c, 0x3362: 0x000c, 0x3363: 0x000c,
-       0x3364: 0x000c, 0x3365: 0x000c, 0x3366: 0x000c, 0x3367: 0x000c, 0x3368: 0x000c, 0x3369: 0x000c,
-       0x336a: 0x000c, 0x336b: 0x000c, 0x336c: 0x000c, 0x336d: 0x000c, 0x336e: 0x000c, 0x336f: 0x000c,
-       // Block 0xce, offset 0x3380
-       0x3380: 0x000c, 0x3381: 0x000c, 0x3382: 0x000c, 0x3383: 0x000c, 0x3384: 0x000c, 0x3385: 0x000c,
-       0x3386: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c,
-       0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c,
-       0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, 0x3396: 0x000c, 0x3397: 0x000c,
-       0x3398: 0x000c, 0x339b: 0x000c, 0x339c: 0x000c, 0x339d: 0x000c,
-       0x339e: 0x000c, 0x339f: 0x000c, 0x33a0: 0x000c, 0x33a1: 0x000c, 0x33a3: 0x000c,
-       0x33a4: 0x000c, 0x33a6: 0x000c, 0x33a7: 0x000c, 0x33a8: 0x000c, 0x33a9: 0x000c,
-       0x33aa: 0x000c,
-       // Block 0xcf, offset 0x33c0
-       0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001,
-       0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001,
-       0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x000c, 0x33d1: 0x000c,
-       0x33d2: 0x000c, 0x33d3: 0x000c, 0x33d4: 0x000c, 0x33d5: 0x000c, 0x33d6: 0x000c, 0x33d7: 0x0001,
-       0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001,
-       0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001,
-       0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001,
-       0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001,
-       0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001,
-       0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0001, 0x33f9: 0x0001, 0x33fa: 0x0001, 0x33fb: 0x0001,
-       0x33fc: 0x0001, 0x33fd: 0x0001, 0x33fe: 0x0001, 0x33ff: 0x0001,
-       // Block 0xd0, offset 0x3400
-       0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x000c, 0x3405: 0x000c,
-       0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x0001,
-       0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001,
-       0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0001, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001,
-       0x3418: 0x0001, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001,
-       0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001,
-       0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001,
-       0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001,
-       0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0001, 0x3435: 0x0001,
-       0x3436: 0x0001, 0x3437: 0x0001, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0001,
-       0x343c: 0x0001, 0x343d: 0x0001, 0x343e: 0x0001, 0x343f: 0x0001,
-       // Block 0xd1, offset 0x3440
-       0x3440: 0x000d, 0x3441: 0x000d, 0x3442: 0x000d, 0x3443: 0x000d, 0x3444: 0x000d, 0x3445: 0x000d,
-       0x3446: 0x000d, 0x3447: 0x000d, 0x3448: 0x000d, 0x3449: 0x000d, 0x344a: 0x000d, 0x344b: 0x000d,
-       0x344c: 0x000d, 0x344d: 0x000d, 0x344e: 0x000d, 0x344f: 0x000d, 0x3450: 0x000d, 0x3451: 0x000d,
-       0x3452: 0x000d, 0x3453: 0x000d, 0x3454: 0x000d, 0x3455: 0x000d, 0x3456: 0x000d, 0x3457: 0x000d,
-       0x3458: 0x000d, 0x3459: 0x000d, 0x345a: 0x000d, 0x345b: 0x000d, 0x345c: 0x000d, 0x345d: 0x000d,
-       0x345e: 0x000d, 0x345f: 0x000d, 0x3460: 0x000d, 0x3461: 0x000d, 0x3462: 0x000d, 0x3463: 0x000d,
-       0x3464: 0x000d, 0x3465: 0x000d, 0x3466: 0x000d, 0x3467: 0x000d, 0x3468: 0x000d, 0x3469: 0x000d,
-       0x346a: 0x000d, 0x346b: 0x000d, 0x346c: 0x000d, 0x346d: 0x000d, 0x346e: 0x000d, 0x346f: 0x000d,
-       0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000d, 0x3473: 0x000d, 0x3474: 0x000d, 0x3475: 0x000d,
-       0x3476: 0x000d, 0x3477: 0x000d, 0x3478: 0x000d, 0x3479: 0x000d, 0x347a: 0x000d, 0x347b: 0x000d,
-       0x347c: 0x000d, 0x347d: 0x000d, 0x347e: 0x000d, 0x347f: 0x000d,
-       // Block 0xd2, offset 0x3480
-       0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a,
-       0x3486: 0x000a, 0x3487: 0x000a, 0x3488: 0x000a, 0x3489: 0x000a, 0x348a: 0x000a, 0x348b: 0x000a,
-       0x348c: 0x000a, 0x348d: 0x000a, 0x348e: 0x000a, 0x348f: 0x000a, 0x3490: 0x000a, 0x3491: 0x000a,
-       0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a,
-       0x3498: 0x000a, 0x3499: 0x000a, 0x349a: 0x000a, 0x349b: 0x000a, 0x349c: 0x000a, 0x349d: 0x000a,
-       0x349e: 0x000a, 0x349f: 0x000a, 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a,
-       0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a,
-       0x34aa: 0x000a, 0x34ab: 0x000a,
-       0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a,
-       0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a,
-       0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a,
-       // Block 0xd3, offset 0x34c0
-       0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,
-       0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,
-       0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,
-       0x34d2: 0x000a, 0x34d3: 0x000a,
-       0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,
-       0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,
-       0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, 0x34ee: 0x000a,
-       0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,
-       0x34f6: 0x000a, 0x34f7: 0x000a, 0x34f8: 0x000a, 0x34f9: 0x000a, 0x34fa: 0x000a, 0x34fb: 0x000a,
-       0x34fc: 0x000a, 0x34fd: 0x000a, 0x34fe: 0x000a, 0x34ff: 0x000a,
-       // Block 0xd4, offset 0x3500
-       0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,
-       0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,
-       0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3511: 0x000a,
-       0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a,
-       0x3518: 0x000a, 0x3519: 0x000a, 0x351a: 0x000a, 0x351b: 0x000a, 0x351c: 0x000a, 0x351d: 0x000a,
-       0x351e: 0x000a, 0x351f: 0x000a, 0x3520: 0x000a, 0x3521: 0x000a, 0x3522: 0x000a, 0x3523: 0x000a,
-       0x3524: 0x000a, 0x3525: 0x000a, 0x3526: 0x000a, 0x3527: 0x000a, 0x3528: 0x000a, 0x3529: 0x000a,
-       0x352a: 0x000a, 0x352b: 0x000a, 0x352c: 0x000a, 0x352d: 0x000a, 0x352e: 0x000a, 0x352f: 0x000a,
-       0x3530: 0x000a, 0x3531: 0x000a, 0x3532: 0x000a, 0x3533: 0x000a, 0x3534: 0x000a, 0x3535: 0x000a,
-       // Block 0xd5, offset 0x3540
-       0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002,
-       0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x000a,
-       0x354c: 0x000a,
-       // Block 0xd6, offset 0x3580
-       0x35aa: 0x000a, 0x35ab: 0x000a,
-       // Block 0xd7, offset 0x35c0
-       0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,
-       0x35e4: 0x000a, 0x35e5: 0x000a,
-       // Block 0xd8, offset 0x3600
-       0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a,
-       0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a,
-       0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a,
-       0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a,
-       0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,
-       0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a,
-       0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a,
-       0x3630: 0x000a, 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,
-       0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a,
-       // Block 0xd9, offset 0x3640
-       0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,
-       0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,
-       0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a,
-       0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a,
-       // Block 0xda, offset 0x3680
-       0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,
-       0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,
-       0x3690: 0x000a, 0x3691: 0x000a,
-       0x3692: 0x000a, 0x3693: 0x000a, 0x3694: 0x000a, 0x3695: 0x000a, 0x3696: 0x000a, 0x3697: 0x000a,
-       0x3698: 0x000a, 0x3699: 0x000a, 0x369a: 0x000a, 0x369b: 0x000a, 0x369c: 0x000a, 0x369d: 0x000a,
-       0x369e: 0x000a, 0x369f: 0x000a, 0x36a0: 0x000a, 0x36a1: 0x000a, 0x36a2: 0x000a, 0x36a3: 0x000a,
-       0x36a4: 0x000a, 0x36a5: 0x000a, 0x36a6: 0x000a, 0x36a7: 0x000a, 0x36a8: 0x000a, 0x36a9: 0x000a,
-       0x36aa: 0x000a, 0x36ab: 0x000a, 0x36ac: 0x000a, 0x36ad: 0x000a, 0x36ae: 0x000a, 0x36af: 0x000a,
-       0x36b0: 0x000a, 0x36b1: 0x000a, 0x36b2: 0x000a, 0x36b3: 0x000a, 0x36b4: 0x000a, 0x36b5: 0x000a,
-       0x36b6: 0x000a, 0x36b7: 0x000a, 0x36b8: 0x000a, 0x36b9: 0x000a, 0x36ba: 0x000a, 0x36bb: 0x000a,
-       0x36bc: 0x000a, 0x36bd: 0x000a, 0x36be: 0x000a, 0x36bf: 0x000a,
-       // Block 0xdb, offset 0x36c0
-       0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a,
-       0x36c6: 0x000a, 0x36c7: 0x000a,
-       0x36d0: 0x000a, 0x36d1: 0x000a,
-       0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, 0x36d7: 0x000a,
-       0x36d8: 0x000a, 0x36d9: 0x000a,
-       0x36e0: 0x000a, 0x36e1: 0x000a, 0x36e2: 0x000a, 0x36e3: 0x000a,
-       0x36e4: 0x000a, 0x36e5: 0x000a, 0x36e6: 0x000a, 0x36e7: 0x000a, 0x36e8: 0x000a, 0x36e9: 0x000a,
-       0x36ea: 0x000a, 0x36eb: 0x000a, 0x36ec: 0x000a, 0x36ed: 0x000a, 0x36ee: 0x000a, 0x36ef: 0x000a,
-       0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000a, 0x36f3: 0x000a, 0x36f4: 0x000a, 0x36f5: 0x000a,
-       0x36f6: 0x000a, 0x36f7: 0x000a, 0x36f8: 0x000a, 0x36f9: 0x000a, 0x36fa: 0x000a, 0x36fb: 0x000a,
-       0x36fc: 0x000a, 0x36fd: 0x000a, 0x36fe: 0x000a, 0x36ff: 0x000a,
-       // Block 0xdc, offset 0x3700
-       0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a,
-       0x3706: 0x000a, 0x3707: 0x000a,
-       0x3710: 0x000a, 0x3711: 0x000a,
-       0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a,
-       0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a,
-       0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a,
-       0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a,
-       0x372a: 0x000a, 0x372b: 0x000a, 0x372c: 0x000a, 0x372d: 0x000a,
-       // Block 0xdd, offset 0x3740
-       0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a,
-       0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a,
-       0x3750: 0x000a, 0x3751: 0x000a,
-       0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, 0x3755: 0x000a, 0x3756: 0x000a, 0x3757: 0x000a,
-       0x3758: 0x000a, 0x3759: 0x000a, 0x375a: 0x000a, 0x375b: 0x000a, 0x375c: 0x000a, 0x375d: 0x000a,
-       0x375e: 0x000a, 0x375f: 0x000a, 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a,
-       0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a,
-       0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, 0x376f: 0x000a,
-       0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a,
-       0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a,
-       0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a,
-       // Block 0xde, offset 0x3780
-       0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a,
-       0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a,
-       0x378c: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a,
-       0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a,
-       0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a,
-       0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a,
-       0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a,
-       0x37aa: 0x000a, 0x37ab: 0x000a,
-       // Block 0xdf, offset 0x37c0
-       0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a,
-       0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a,
-       0x37cc: 0x000a, 0x37cd: 0x000a, 0x37ce: 0x000a, 0x37cf: 0x000a, 0x37d0: 0x000a, 0x37d1: 0x000a,
-       0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a,
-       // Block 0xe0, offset 0x3800
-       0x3800: 0x000a,
-       0x3810: 0x000a, 0x3811: 0x000a,
-       0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a,
-       0x3818: 0x000a, 0x3819: 0x000a, 0x381a: 0x000a, 0x381b: 0x000a, 0x381c: 0x000a, 0x381d: 0x000a,
-       0x381e: 0x000a, 0x381f: 0x000a, 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a,
-       0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a,
-       // Block 0xe1, offset 0x3840
-       0x387e: 0x000b, 0x387f: 0x000b,
-       // Block 0xe2, offset 0x3880
-       0x3880: 0x000b, 0x3881: 0x000b, 0x3882: 0x000b, 0x3883: 0x000b, 0x3884: 0x000b, 0x3885: 0x000b,
-       0x3886: 0x000b, 0x3887: 0x000b, 0x3888: 0x000b, 0x3889: 0x000b, 0x388a: 0x000b, 0x388b: 0x000b,
-       0x388c: 0x000b, 0x388d: 0x000b, 0x388e: 0x000b, 0x388f: 0x000b, 0x3890: 0x000b, 0x3891: 0x000b,
-       0x3892: 0x000b, 0x3893: 0x000b, 0x3894: 0x000b, 0x3895: 0x000b, 0x3896: 0x000b, 0x3897: 0x000b,
-       0x3898: 0x000b, 0x3899: 0x000b, 0x389a: 0x000b, 0x389b: 0x000b, 0x389c: 0x000b, 0x389d: 0x000b,
-       0x389e: 0x000b, 0x389f: 0x000b, 0x38a0: 0x000b, 0x38a1: 0x000b, 0x38a2: 0x000b, 0x38a3: 0x000b,
-       0x38a4: 0x000b, 0x38a5: 0x000b, 0x38a6: 0x000b, 0x38a7: 0x000b, 0x38a8: 0x000b, 0x38a9: 0x000b,
-       0x38aa: 0x000b, 0x38ab: 0x000b, 0x38ac: 0x000b, 0x38ad: 0x000b, 0x38ae: 0x000b, 0x38af: 0x000b,
-       0x38b0: 0x000b, 0x38b1: 0x000b, 0x38b2: 0x000b, 0x38b3: 0x000b, 0x38b4: 0x000b, 0x38b5: 0x000b,
-       0x38b6: 0x000b, 0x38b7: 0x000b, 0x38b8: 0x000b, 0x38b9: 0x000b, 0x38ba: 0x000b, 0x38bb: 0x000b,
-       0x38bc: 0x000b, 0x38bd: 0x000b, 0x38be: 0x000b, 0x38bf: 0x000b,
-       // Block 0xe3, offset 0x38c0
-       0x38c0: 0x000c, 0x38c1: 0x000c, 0x38c2: 0x000c, 0x38c3: 0x000c, 0x38c4: 0x000c, 0x38c5: 0x000c,
-       0x38c6: 0x000c, 0x38c7: 0x000c, 0x38c8: 0x000c, 0x38c9: 0x000c, 0x38ca: 0x000c, 0x38cb: 0x000c,
-       0x38cc: 0x000c, 0x38cd: 0x000c, 0x38ce: 0x000c, 0x38cf: 0x000c, 0x38d0: 0x000c, 0x38d1: 0x000c,
-       0x38d2: 0x000c, 0x38d3: 0x000c, 0x38d4: 0x000c, 0x38d5: 0x000c, 0x38d6: 0x000c, 0x38d7: 0x000c,
-       0x38d8: 0x000c, 0x38d9: 0x000c, 0x38da: 0x000c, 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c,
-       0x38de: 0x000c, 0x38df: 0x000c, 0x38e0: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c,
-       0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c,
-       0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c,
-       0x38f0: 0x000b, 0x38f1: 0x000b, 0x38f2: 0x000b, 0x38f3: 0x000b, 0x38f4: 0x000b, 0x38f5: 0x000b,
-       0x38f6: 0x000b, 0x38f7: 0x000b, 0x38f8: 0x000b, 0x38f9: 0x000b, 0x38fa: 0x000b, 0x38fb: 0x000b,
-       0x38fc: 0x000b, 0x38fd: 0x000b, 0x38fe: 0x000b, 0x38ff: 0x000b,
-}
-
-// bidiIndex: 24 blocks, 1536 entries, 1536 bytes
-// Block 0 is the zero block.
-var bidiIndex = [1536]uint8{
-       // Block 0x0, offset 0x0
-       // Block 0x1, offset 0x40
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc2: 0x01, 0xc3: 0x02,
-       0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
-       0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
-       0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
-       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
-       0xea: 0x07, 0xef: 0x08,
-       0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,
-       // Block 0x4, offset 0x100
-       0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
-       0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
-       0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,
-       0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,
-       // Block 0x5, offset 0x140
-       0x140: 0x31, 0x141: 0x32, 0x142: 0x33,
-       0x14d: 0x34, 0x14e: 0x35,
-       0x150: 0x36,
-       0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,
-       0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,
-       0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,
-       0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,
-       0x17e: 0x4b, 0x17f: 0x4c,
-       // Block 0x6, offset 0x180
-       0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,
-       0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54,
-       0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,
-       0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f,
-       0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61,
-       0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64,
-       0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67,
-       0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70,
-       0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76,
-       // Block 0x8, offset 0x200
-       0x237: 0x54,
-       // Block 0x9, offset 0x240
-       0x252: 0x77, 0x253: 0x78,
-       0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e,
-       0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85,
-       0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a,
-       // Block 0xa, offset 0x280
-       0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e,
-       0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e,
-       0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94,
-       // Block 0xb, offset 0x2c0
-       0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97,
-       0x2cb: 0x98, 0x2cd: 0x99,
-       0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a,
-       0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a,
-       0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9a, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a,
-       0x2f8: 0x9a, 0x2f9: 0x9f, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0x9a, 0x2fd: 0x9a, 0x2fe: 0x9a, 0x2ff: 0x9a,
-       // Block 0xc, offset 0x300
-       0x300: 0xa0, 0x301: 0xa1, 0x302: 0xa2, 0x304: 0xa3, 0x305: 0xa4, 0x306: 0xa5, 0x307: 0xa6,
-       0x308: 0xa7, 0x30b: 0xa8, 0x30c: 0xa9, 0x30d: 0xaa,
-       0x310: 0xab, 0x311: 0xac, 0x312: 0xad, 0x313: 0xae, 0x316: 0xaf, 0x317: 0xb0,
-       0x318: 0xb1, 0x319: 0xb2, 0x31a: 0xb3, 0x31c: 0xb4,
-       0x328: 0xb5, 0x329: 0xb6, 0x32a: 0xb7,
-       0x330: 0xb8, 0x332: 0xb9, 0x334: 0xba, 0x335: 0xbb,
-       // Block 0xd, offset 0x340
-       0x36b: 0xbc, 0x36c: 0xbd,
-       0x37e: 0xbe,
-       // Block 0xe, offset 0x380
-       0x3b2: 0xbf,
-       // Block 0xf, offset 0x3c0
-       0x3c5: 0xc0, 0x3c6: 0xc1,
-       0x3c8: 0x54, 0x3c9: 0xc2, 0x3cc: 0x54, 0x3cd: 0xc3,
-       0x3db: 0xc4, 0x3dc: 0xc5, 0x3dd: 0xc6, 0x3de: 0xc7, 0x3df: 0xc8,
-       0x3e8: 0xc9, 0x3e9: 0xca, 0x3ea: 0xcb,
-       // Block 0x10, offset 0x400
-       0x400: 0xcc,
-       0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xcd, 0x424: 0x9a, 0x425: 0xce, 0x426: 0x9a, 0x427: 0x9a,
-       0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a,
-       0x430: 0x9a, 0x431: 0x9a, 0x432: 0x9a, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a,
-       0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcf, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a,
-       // Block 0x11, offset 0x440
-       0x440: 0xd0, 0x441: 0x54, 0x442: 0xd1, 0x443: 0xd2, 0x444: 0xd3, 0x445: 0xd4,
-       0x449: 0xd5, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,
-       0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,
-       0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd6, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xd7,
-       0x460: 0xd8, 0x461: 0xd9, 0x462: 0xda, 0x464: 0xdb, 0x465: 0xdc, 0x466: 0xdd, 0x467: 0xde,
-       0x47f: 0xdf,
-       // Block 0x12, offset 0x480
-       0x4bf: 0xdf,
-       // Block 0x13, offset 0x4c0
-       0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,
-       0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,
-       0x4ef: 0x10,
-       0x4ff: 0x10,
-       // Block 0x14, offset 0x500
-       0x50f: 0x10,
-       0x51f: 0x10,
-       0x52f: 0x10,
-       0x53f: 0x10,
-       // Block 0x15, offset 0x540
-       0x540: 0xe0, 0x541: 0xe0, 0x542: 0xe0, 0x543: 0xe0, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe1,
-       0x548: 0xe0, 0x549: 0xe0, 0x54a: 0xe0, 0x54b: 0xe0, 0x54c: 0xe0, 0x54d: 0xe0, 0x54e: 0xe0, 0x54f: 0xe0,
-       0x550: 0xe0, 0x551: 0xe0, 0x552: 0xe0, 0x553: 0xe0, 0x554: 0xe0, 0x555: 0xe0, 0x556: 0xe0, 0x557: 0xe0,
-       0x558: 0xe0, 0x559: 0xe0, 0x55a: 0xe0, 0x55b: 0xe0, 0x55c: 0xe0, 0x55d: 0xe0, 0x55e: 0xe0, 0x55f: 0xe0,
-       0x560: 0xe0, 0x561: 0xe0, 0x562: 0xe0, 0x563: 0xe0, 0x564: 0xe0, 0x565: 0xe0, 0x566: 0xe0, 0x567: 0xe0,
-       0x568: 0xe0, 0x569: 0xe0, 0x56a: 0xe0, 0x56b: 0xe0, 0x56c: 0xe0, 0x56d: 0xe0, 0x56e: 0xe0, 0x56f: 0xe0,
-       0x570: 0xe0, 0x571: 0xe0, 0x572: 0xe0, 0x573: 0xe0, 0x574: 0xe0, 0x575: 0xe0, 0x576: 0xe0, 0x577: 0xe0,
-       0x578: 0xe0, 0x579: 0xe0, 0x57a: 0xe0, 0x57b: 0xe0, 0x57c: 0xe0, 0x57d: 0xe0, 0x57e: 0xe0, 0x57f: 0xe0,
-       // Block 0x16, offset 0x580
-       0x58f: 0x10,
-       0x59f: 0x10,
-       0x5a0: 0x13,
-       0x5af: 0x10,
-       0x5bf: 0x10,
-       // Block 0x17, offset 0x5c0
-       0x5cf: 0x10,
-}
-
-// Total table size 16184 bytes (15KiB); checksum: F50EF68C
diff --git a/libgo/go/internal/x/text/unicode/bidi/trieval.go b/libgo/go/internal/x/text/unicode/bidi/trieval.go
deleted file mode 100644 (file)
index e59d249..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Code generated by running "go generate" in internal/x/text. DO NOT EDIT.
-
-package bidi
-
-// Class is the Unicode BiDi class. Each rune has a single class.
-type Class uint
-
-const (
-       L       Class = iota // LeftToRight
-       R                    // RightToLeft
-       EN                   // EuropeanNumber
-       ES                   // EuropeanSeparator
-       ET                   // EuropeanTerminator
-       AN                   // ArabicNumber
-       CS                   // CommonSeparator
-       B                    // ParagraphSeparator
-       S                    // SegmentSeparator
-       WS                   // WhiteSpace
-       ON                   // OtherNeutral
-       BN                   // BoundaryNeutral
-       NSM                  // NonspacingMark
-       AL                   // ArabicLetter
-       Control              // Control LRO - PDI
-
-       numClass
-
-       LRO // LeftToRightOverride
-       RLO // RightToLeftOverride
-       LRE // LeftToRightEmbedding
-       RLE // RightToLeftEmbedding
-       PDF // PopDirectionalFormat
-       LRI // LeftToRightIsolate
-       RLI // RightToLeftIsolate
-       FSI // FirstStrongIsolate
-       PDI // PopDirectionalIsolate
-
-       unknownClass = ^Class(0)
-)
-
-var controlToClass = map[rune]Class{
-       0x202D: LRO, // LeftToRightOverride,
-       0x202E: RLO, // RightToLeftOverride,
-       0x202A: LRE, // LeftToRightEmbedding,
-       0x202B: RLE, // RightToLeftEmbedding,
-       0x202C: PDF, // PopDirectionalFormat,
-       0x2066: LRI, // LeftToRightIsolate,
-       0x2067: RLI, // RightToLeftIsolate,
-       0x2068: FSI, // FirstStrongIsolate,
-       0x2069: PDI, // PopDirectionalIsolate,
-}
-
-// A trie entry has the following bits:
-// 7..5  XOR mask for brackets
-// 4     1: Bracket open, 0: Bracket close
-// 3..0  Class type
-
-const (
-       openMask     = 0x10
-       xorMaskShift = 5
-)
diff --git a/libgo/go/internal/x/text/unicode/doc.go b/libgo/go/internal/x/text/unicode/doc.go
deleted file mode 100644 (file)
index 4f7e9f5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// unicode holds packages with implementations of Unicode standards that are
-// mostly used as building blocks for other packages in internal/x/text,
-// layout engines, or are otherwise more low-level in nature.
-package unicode
diff --git a/libgo/go/internal/x/text/unicode/norm/composition.go b/libgo/go/internal/x/text/unicode/norm/composition.go
deleted file mode 100644 (file)
index 80287d2..0000000
+++ /dev/null
@@ -1,510 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-import "unicode/utf8"
-
-const (
-       maxNonStarters = 30
-       // The maximum number of characters needed for a buffer is
-       // maxNonStarters + 1 for the starter + 1 for the GCJ
-       maxBufferSize    = maxNonStarters + 2
-       maxNFCExpansion  = 3  // NFC(0x1D160)
-       maxNFKCExpansion = 18 // NFKC(0xFDFA)
-
-       maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128
-)
-
-// ssState is used for reporting the segment state after inserting a rune.
-// It is returned by streamSafe.next.
-type ssState int
-
-const (
-       // Indicates a rune was successfully added to the segment.
-       ssSuccess ssState = iota
-       // Indicates a rune starts a new segment and should not be added.
-       ssStarter
-       // Indicates a rune caused a segment overflow and a CGJ should be inserted.
-       ssOverflow
-)
-
-// streamSafe implements the policy of when a CGJ should be inserted.
-type streamSafe uint8
-
-// first inserts the first rune of a segment. It is a faster version of next if
-// it is known p represents the first rune in a segment.
-func (ss *streamSafe) first(p Properties) {
-       *ss = streamSafe(p.nTrailingNonStarters())
-}
-
-// insert returns a ssState value to indicate whether a rune represented by p
-// can be inserted.
-func (ss *streamSafe) next(p Properties) ssState {
-       if *ss > maxNonStarters {
-               panic("streamSafe was not reset")
-       }
-       n := p.nLeadingNonStarters()
-       if *ss += streamSafe(n); *ss > maxNonStarters {
-               *ss = 0
-               return ssOverflow
-       }
-       // The Stream-Safe Text Processing prescribes that the counting can stop
-       // as soon as a starter is encountered. However, there are some starters,
-       // like Jamo V and T, that can combine with other runes, leaving their
-       // successive non-starters appended to the previous, possibly causing an
-       // overflow. We will therefore consider any rune with a non-zero nLead to
-       // be a non-starter. Note that it always hold that if nLead > 0 then
-       // nLead == nTrail.
-       if n == 0 {
-               *ss = streamSafe(p.nTrailingNonStarters())
-               return ssStarter
-       }
-       return ssSuccess
-}
-
-// backwards is used for checking for overflow and segment starts
-// when traversing a string backwards. Users do not need to call first
-// for the first rune. The state of the streamSafe retains the count of
-// the non-starters loaded.
-func (ss *streamSafe) backwards(p Properties) ssState {
-       if *ss > maxNonStarters {
-               panic("streamSafe was not reset")
-       }
-       c := *ss + streamSafe(p.nTrailingNonStarters())
-       if c > maxNonStarters {
-               return ssOverflow
-       }
-       *ss = c
-       if p.nLeadingNonStarters() == 0 {
-               return ssStarter
-       }
-       return ssSuccess
-}
-
-func (ss streamSafe) isMax() bool {
-       return ss == maxNonStarters
-}
-
-// GraphemeJoiner is inserted after maxNonStarters non-starter runes.
-const GraphemeJoiner = "\u034F"
-
-// reorderBuffer is used to normalize a single segment.  Characters inserted with
-// insert are decomposed and reordered based on CCC. The compose method can
-// be used to recombine characters.  Note that the byte buffer does not hold
-// the UTF-8 characters in order.  Only the rune array is maintained in sorted
-// order. flush writes the resulting segment to a byte array.
-type reorderBuffer struct {
-       rune  [maxBufferSize]Properties // Per character info.
-       byte  [maxByteBufferSize]byte   // UTF-8 buffer. Referenced by runeInfo.pos.
-       nbyte uint8                     // Number or bytes.
-       ss    streamSafe                // For limiting length of non-starter sequence.
-       nrune int                       // Number of runeInfos.
-       f     formInfo
-
-       src      input
-       nsrc     int
-       tmpBytes input
-
-       out    []byte
-       flushF func(*reorderBuffer) bool
-}
-
-func (rb *reorderBuffer) init(f Form, src []byte) {
-       rb.f = *formTable[f]
-       rb.src.setBytes(src)
-       rb.nsrc = len(src)
-       rb.ss = 0
-}
-
-func (rb *reorderBuffer) initString(f Form, src string) {
-       rb.f = *formTable[f]
-       rb.src.setString(src)
-       rb.nsrc = len(src)
-       rb.ss = 0
-}
-
-func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) {
-       rb.out = out
-       rb.flushF = f
-}
-
-// reset discards all characters from the buffer.
-func (rb *reorderBuffer) reset() {
-       rb.nrune = 0
-       rb.nbyte = 0
-}
-
-func (rb *reorderBuffer) doFlush() bool {
-       if rb.f.composing {
-               rb.compose()
-       }
-       res := rb.flushF(rb)
-       rb.reset()
-       return res
-}
-
-// appendFlush appends the normalized segment to rb.out.
-func appendFlush(rb *reorderBuffer) bool {
-       for i := 0; i < rb.nrune; i++ {
-               start := rb.rune[i].pos
-               end := start + rb.rune[i].size
-               rb.out = append(rb.out, rb.byte[start:end]...)
-       }
-       return true
-}
-
-// flush appends the normalized segment to out and resets rb.
-func (rb *reorderBuffer) flush(out []byte) []byte {
-       for i := 0; i < rb.nrune; i++ {
-               start := rb.rune[i].pos
-               end := start + rb.rune[i].size
-               out = append(out, rb.byte[start:end]...)
-       }
-       rb.reset()
-       return out
-}
-
-// flushCopy copies the normalized segment to buf and resets rb.
-// It returns the number of bytes written to buf.
-func (rb *reorderBuffer) flushCopy(buf []byte) int {
-       p := 0
-       for i := 0; i < rb.nrune; i++ {
-               runep := rb.rune[i]
-               p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size])
-       }
-       rb.reset()
-       return p
-}
-
-// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class.
-// It returns false if the buffer is not large enough to hold the rune.
-// It is used internally by insert and insertString only.
-func (rb *reorderBuffer) insertOrdered(info Properties) {
-       n := rb.nrune
-       b := rb.rune[:]
-       cc := info.ccc
-       if cc > 0 {
-               // Find insertion position + move elements to make room.
-               for ; n > 0; n-- {
-                       if b[n-1].ccc <= cc {
-                               break
-                       }
-                       b[n] = b[n-1]
-               }
-       }
-       rb.nrune += 1
-       pos := uint8(rb.nbyte)
-       rb.nbyte += utf8.UTFMax
-       info.pos = pos
-       b[n] = info
-}
-
-// insertErr is an error code returned by insert. Using this type instead
-// of error improves performance up to 20% for many of the benchmarks.
-type insertErr int
-
-const (
-       iSuccess insertErr = -iota
-       iShortDst
-       iShortSrc
-)
-
-// insertFlush inserts the given rune in the buffer ordered by CCC.
-// If a decomposition with multiple segments are encountered, they leading
-// ones are flushed.
-// It returns a non-zero error code if the rune was not inserted.
-func (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr {
-       if rune := src.hangul(i); rune != 0 {
-               rb.decomposeHangul(rune)
-               return iSuccess
-       }
-       if info.hasDecomposition() {
-               return rb.insertDecomposed(info.Decomposition())
-       }
-       rb.insertSingle(src, i, info)
-       return iSuccess
-}
-
-// insertUnsafe inserts the given rune in the buffer ordered by CCC.
-// It is assumed there is sufficient space to hold the runes. It is the
-// responsibility of the caller to ensure this. This can be done by checking
-// the state returned by the streamSafe type.
-func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) {
-       if rune := src.hangul(i); rune != 0 {
-               rb.decomposeHangul(rune)
-       }
-       if info.hasDecomposition() {
-               // TODO: inline.
-               rb.insertDecomposed(info.Decomposition())
-       } else {
-               rb.insertSingle(src, i, info)
-       }
-}
-
-// insertDecomposed inserts an entry in to the reorderBuffer for each rune
-// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes.
-// It flushes the buffer on each new segment start.
-func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr {
-       rb.tmpBytes.setBytes(dcomp)
-       // As the streamSafe accounting already handles the counting for modifiers,
-       // we don't have to call next. However, we do need to keep the accounting
-       // intact when flushing the buffer.
-       for i := 0; i < len(dcomp); {
-               info := rb.f.info(rb.tmpBytes, i)
-               if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() {
-                       return iShortDst
-               }
-               i += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)])
-               rb.insertOrdered(info)
-       }
-       return iSuccess
-}
-
-// insertSingle inserts an entry in the reorderBuffer for the rune at
-// position i. info is the runeInfo for the rune at position i.
-func (rb *reorderBuffer) insertSingle(src input, i int, info Properties) {
-       src.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size))
-       rb.insertOrdered(info)
-}
-
-// insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb.
-func (rb *reorderBuffer) insertCGJ() {
-       rb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))})
-}
-
-// appendRune inserts a rune at the end of the buffer. It is used for Hangul.
-func (rb *reorderBuffer) appendRune(r rune) {
-       bn := rb.nbyte
-       sz := utf8.EncodeRune(rb.byte[bn:], rune(r))
-       rb.nbyte += utf8.UTFMax
-       rb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)}
-       rb.nrune++
-}
-
-// assignRune sets a rune at position pos. It is used for Hangul and recomposition.
-func (rb *reorderBuffer) assignRune(pos int, r rune) {
-       bn := rb.rune[pos].pos
-       sz := utf8.EncodeRune(rb.byte[bn:], rune(r))
-       rb.rune[pos] = Properties{pos: bn, size: uint8(sz)}
-}
-
-// runeAt returns the rune at position n. It is used for Hangul and recomposition.
-func (rb *reorderBuffer) runeAt(n int) rune {
-       inf := rb.rune[n]
-       r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size])
-       return r
-}
-
-// bytesAt returns the UTF-8 encoding of the rune at position n.
-// It is used for Hangul and recomposition.
-func (rb *reorderBuffer) bytesAt(n int) []byte {
-       inf := rb.rune[n]
-       return rb.byte[inf.pos : int(inf.pos)+int(inf.size)]
-}
-
-// For Hangul we combine algorithmically, instead of using tables.
-const (
-       hangulBase  = 0xAC00 // UTF-8(hangulBase) -> EA B0 80
-       hangulBase0 = 0xEA
-       hangulBase1 = 0xB0
-       hangulBase2 = 0x80
-
-       hangulEnd  = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4
-       hangulEnd0 = 0xED
-       hangulEnd1 = 0x9E
-       hangulEnd2 = 0xA4
-
-       jamoLBase  = 0x1100 // UTF-8(jamoLBase) -> E1 84 00
-       jamoLBase0 = 0xE1
-       jamoLBase1 = 0x84
-       jamoLEnd   = 0x1113
-       jamoVBase  = 0x1161
-       jamoVEnd   = 0x1176
-       jamoTBase  = 0x11A7
-       jamoTEnd   = 0x11C3
-
-       jamoTCount   = 28
-       jamoVCount   = 21
-       jamoVTCount  = 21 * 28
-       jamoLVTCount = 19 * 21 * 28
-)
-
-const hangulUTF8Size = 3
-
-func isHangul(b []byte) bool {
-       if len(b) < hangulUTF8Size {
-               return false
-       }
-       b0 := b[0]
-       if b0 < hangulBase0 {
-               return false
-       }
-       b1 := b[1]
-       switch {
-       case b0 == hangulBase0:
-               return b1 >= hangulBase1
-       case b0 < hangulEnd0:
-               return true
-       case b0 > hangulEnd0:
-               return false
-       case b1 < hangulEnd1:
-               return true
-       }
-       return b1 == hangulEnd1 && b[2] < hangulEnd2
-}
-
-func isHangulString(b string) bool {
-       if len(b) < hangulUTF8Size {
-               return false
-       }
-       b0 := b[0]
-       if b0 < hangulBase0 {
-               return false
-       }
-       b1 := b[1]
-       switch {
-       case b0 == hangulBase0:
-               return b1 >= hangulBase1
-       case b0 < hangulEnd0:
-               return true
-       case b0 > hangulEnd0:
-               return false
-       case b1 < hangulEnd1:
-               return true
-       }
-       return b1 == hangulEnd1 && b[2] < hangulEnd2
-}
-
-// Caller must ensure len(b) >= 2.
-func isJamoVT(b []byte) bool {
-       // True if (rune & 0xff00) == jamoLBase
-       return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1
-}
-
-func isHangulWithoutJamoT(b []byte) bool {
-       c, _ := utf8.DecodeRune(b)
-       c -= hangulBase
-       return c < jamoLVTCount && c%jamoTCount == 0
-}
-
-// decomposeHangul writes the decomposed Hangul to buf and returns the number
-// of bytes written.  len(buf) should be at least 9.
-func decomposeHangul(buf []byte, r rune) int {
-       const JamoUTF8Len = 3
-       r -= hangulBase
-       x := r % jamoTCount
-       r /= jamoTCount
-       utf8.EncodeRune(buf, jamoLBase+r/jamoVCount)
-       utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount)
-       if x != 0 {
-               utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x)
-               return 3 * JamoUTF8Len
-       }
-       return 2 * JamoUTF8Len
-}
-
-// decomposeHangul algorithmically decomposes a Hangul rune into
-// its Jamo components.
-// See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul.
-func (rb *reorderBuffer) decomposeHangul(r rune) {
-       r -= hangulBase
-       x := r % jamoTCount
-       r /= jamoTCount
-       rb.appendRune(jamoLBase + r/jamoVCount)
-       rb.appendRune(jamoVBase + r%jamoVCount)
-       if x != 0 {
-               rb.appendRune(jamoTBase + x)
-       }
-}
-
-// combineHangul algorithmically combines Jamo character components into Hangul.
-// See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul.
-func (rb *reorderBuffer) combineHangul(s, i, k int) {
-       b := rb.rune[:]
-       bn := rb.nrune
-       for ; i < bn; i++ {
-               cccB := b[k-1].ccc
-               cccC := b[i].ccc
-               if cccB == 0 {
-                       s = k - 1
-               }
-               if s != k-1 && cccB >= cccC {
-                       // b[i] is blocked by greater-equal cccX below it
-                       b[k] = b[i]
-                       k++
-               } else {
-                       l := rb.runeAt(s) // also used to compare to hangulBase
-                       v := rb.runeAt(i) // also used to compare to jamoT
-                       switch {
-                       case jamoLBase <= l && l < jamoLEnd &&
-                               jamoVBase <= v && v < jamoVEnd:
-                               // 11xx plus 116x to LV
-                               rb.assignRune(s, hangulBase+
-                                       (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount)
-                       case hangulBase <= l && l < hangulEnd &&
-                               jamoTBase < v && v < jamoTEnd &&
-                               ((l-hangulBase)%jamoTCount) == 0:
-                               // ACxx plus 11Ax to LVT
-                               rb.assignRune(s, l+v-jamoTBase)
-                       default:
-                               b[k] = b[i]
-                               k++
-                       }
-               }
-       }
-       rb.nrune = k
-}
-
-// compose recombines the runes in the buffer.
-// It should only be used to recompose a single segment, as it will not
-// handle alternations between Hangul and non-Hangul characters correctly.
-func (rb *reorderBuffer) compose() {
-       // UAX #15, section X5 , including Corrigendum #5
-       // "In any character sequence beginning with starter S, a character C is
-       //  blocked from S if and only if there is some character B between S
-       //  and C, and either B is a starter or it has the same or higher
-       //  combining class as C."
-       bn := rb.nrune
-       if bn == 0 {
-               return
-       }
-       k := 1
-       b := rb.rune[:]
-       for s, i := 0, 1; i < bn; i++ {
-               if isJamoVT(rb.bytesAt(i)) {
-                       // Redo from start in Hangul mode. Necessary to support
-                       // U+320E..U+321E in NFKC mode.
-                       rb.combineHangul(s, i, k)
-                       return
-               }
-               ii := b[i]
-               // We can only use combineForward as a filter if we later
-               // get the info for the combined character. This is more
-               // expensive than using the filter. Using combinesBackward()
-               // is safe.
-               if ii.combinesBackward() {
-                       cccB := b[k-1].ccc
-                       cccC := ii.ccc
-                       blocked := false // b[i] blocked by starter or greater or equal CCC?
-                       if cccB == 0 {
-                               s = k - 1
-                       } else {
-                               blocked = s != k-1 && cccB >= cccC
-                       }
-                       if !blocked {
-                               combined := combine(rb.runeAt(s), rb.runeAt(i))
-                               if combined != 0 {
-                                       rb.assignRune(s, combined)
-                                       continue
-                               }
-                       }
-               }
-               b[k] = b[i]
-               k++
-       }
-       rb.nrune = k
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/example_iter_test.go b/libgo/go/internal/x/text/unicode/norm/example_iter_test.go
deleted file mode 100644 (file)
index fb0e524..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm_test
-
-import (
-       "bytes"
-       "fmt"
-       "unicode/utf8"
-
-       "internal/x/text/unicode/norm"
-)
-
-// EqualSimple uses a norm.Iter to compare two non-normalized
-// strings for equivalence.
-func EqualSimple(a, b string) bool {
-       var ia, ib norm.Iter
-       ia.InitString(norm.NFKD, a)
-       ib.InitString(norm.NFKD, b)
-       for !ia.Done() && !ib.Done() {
-               if !bytes.Equal(ia.Next(), ib.Next()) {
-                       return false
-               }
-       }
-       return ia.Done() && ib.Done()
-}
-
-// FindPrefix finds the longest common prefix of ASCII characters
-// of a and b.
-func FindPrefix(a, b string) int {
-       i := 0
-       for ; i < len(a) && i < len(b) && a[i] < utf8.RuneSelf && a[i] == b[i]; i++ {
-       }
-       return i
-}
-
-// EqualOpt is like EqualSimple, but optimizes the special
-// case for ASCII characters.
-func EqualOpt(a, b string) bool {
-       n := FindPrefix(a, b)
-       a, b = a[n:], b[n:]
-       var ia, ib norm.Iter
-       ia.InitString(norm.NFKD, a)
-       ib.InitString(norm.NFKD, b)
-       for !ia.Done() && !ib.Done() {
-               if !bytes.Equal(ia.Next(), ib.Next()) {
-                       return false
-               }
-               if n := int64(FindPrefix(a[ia.Pos():], b[ib.Pos():])); n != 0 {
-                       ia.Seek(n, 1)
-                       ib.Seek(n, 1)
-               }
-       }
-       return ia.Done() && ib.Done()
-}
-
-var compareTests = []struct{ a, b string }{
-       {"aaa", "aaa"},
-       {"aaa", "aab"},
-       {"a\u0300a", "\u00E0a"},
-       {"a\u0300\u0320b", "a\u0320\u0300b"},
-       {"\u1E0A\u0323", "\x44\u0323\u0307"},
-       // A character that decomposes into multiple segments
-       // spans several iterations.
-       {"\u3304", "\u30A4\u30CB\u30F3\u30AF\u3099"},
-}
-
-func ExampleIter() {
-       for i, t := range compareTests {
-               r0 := EqualSimple(t.a, t.b)
-               r1 := EqualOpt(t.a, t.b)
-               fmt.Printf("%d: %v %v\n", i, r0, r1)
-       }
-       // Output:
-       // 0: true true
-       // 1: false false
-       // 2: true true
-       // 3: true true
-       // 4: true true
-       // 5: true true
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/example_test.go b/libgo/go/internal/x/text/unicode/norm/example_test.go
deleted file mode 100644 (file)
index a990440..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm_test
-
-import (
-       "fmt"
-
-       "internal/x/text/unicode/norm"
-)
-
-func ExampleForm_NextBoundary() {
-       s := norm.NFD.String("Mêlée")
-
-       for i := 0; i < len(s); {
-               d := norm.NFC.NextBoundaryInString(s[i:], true)
-               fmt.Printf("%[1]s: %+[1]q\n", s[i:i+d])
-               i += d
-       }
-       // Output:
-       // M: "M"
-       // ê: "e\u0302"
-       // l: "l"
-       // é: "e\u0301"
-       // e: "e"
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/forminfo.go b/libgo/go/internal/x/text/unicode/norm/forminfo.go
deleted file mode 100644 (file)
index 6455840..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-// This file contains Form-specific logic and wrappers for data in tables.go.
-
-// Rune info is stored in a separate trie per composing form. A composing form
-// and its corresponding decomposing form share the same trie.  Each trie maps
-// a rune to a uint16. The values take two forms.  For v >= 0x8000:
-//   bits
-//   15:    1 (inverse of NFD_QC bit of qcInfo)
-//   13..7: qcInfo (see below). isYesD is always true (no decompostion).
-//    6..0: ccc (compressed CCC value).
-// For v < 0x8000, the respective rune has a decomposition and v is an index
-// into a byte array of UTF-8 decomposition sequences and additional info and
-// has the form:
-//    <header> <decomp_byte>* [<tccc> [<lccc>]]
-// The header contains the number of bytes in the decomposition (excluding this
-// length byte). The two most significant bits of this length byte correspond
-// to bit 5 and 4 of qcInfo (see below).  The byte sequence itself starts at v+1.
-// The byte sequence is followed by a trailing and leading CCC if the values
-// for these are not zero.  The value of v determines which ccc are appended
-// to the sequences.  For v < firstCCC, there are none, for v >= firstCCC,
-// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC
-// there is an additional leading ccc. The value of tccc itself is the
-// trailing CCC shifted left 2 bits. The two least-significant bits of tccc
-// are the number of trailing non-starters.
-
-const (
-       qcInfoMask      = 0x3F // to clear all but the relevant bits in a qcInfo
-       headerLenMask   = 0x3F // extract the length value from the header byte
-       headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte
-)
-
-// Properties provides access to normalization properties of a rune.
-type Properties struct {
-       pos   uint8  // start position in reorderBuffer; used in composition.go
-       size  uint8  // length of UTF-8 encoding of this rune
-       ccc   uint8  // leading canonical combining class (ccc if not decomposition)
-       tccc  uint8  // trailing canonical combining class (ccc if not decomposition)
-       nLead uint8  // number of leading non-starters.
-       flags qcInfo // quick check flags
-       index uint16
-}
-
-// functions dispatchable per form
-type lookupFunc func(b input, i int) Properties
-
-// formInfo holds Form-specific functions and tables.
-type formInfo struct {
-       form                     Form
-       composing, compatibility bool // form type
-       info                     lookupFunc
-       nextMain                 iterFunc
-}
-
-var formTable = []*formInfo{{
-       form:          NFC,
-       composing:     true,
-       compatibility: false,
-       info:          lookupInfoNFC,
-       nextMain:      nextComposed,
-}, {
-       form:          NFD,
-       composing:     false,
-       compatibility: false,
-       info:          lookupInfoNFC,
-       nextMain:      nextDecomposed,
-}, {
-       form:          NFKC,
-       composing:     true,
-       compatibility: true,
-       info:          lookupInfoNFKC,
-       nextMain:      nextComposed,
-}, {
-       form:          NFKD,
-       composing:     false,
-       compatibility: true,
-       info:          lookupInfoNFKC,
-       nextMain:      nextDecomposed,
-}}
-
-// We do not distinguish between boundaries for NFC, NFD, etc. to avoid
-// unexpected behavior for the user.  For example, in NFD, there is a boundary
-// after 'a'.  However, 'a' might combine with modifiers, so from the application's
-// perspective it is not a good boundary. We will therefore always use the
-// boundaries for the combining variants.
-
-// BoundaryBefore returns true if this rune starts a new segment and
-// cannot combine with any rune on the left.
-func (p Properties) BoundaryBefore() bool {
-       if p.ccc == 0 && !p.combinesBackward() {
-               return true
-       }
-       // We assume that the CCC of the first character in a decomposition
-       // is always non-zero if different from info.ccc and that we can return
-       // false at this point. This is verified by maketables.
-       return false
-}
-
-// BoundaryAfter returns true if runes cannot combine with or otherwise
-// interact with this or previous runes.
-func (p Properties) BoundaryAfter() bool {
-       // TODO: loosen these conditions.
-       return p.isInert()
-}
-
-// We pack quick check data in 4 bits:
-//   5:    Combines forward  (0 == false, 1 == true)
-//   4..3: NFC_QC Yes(00), No (10), or Maybe (11)
-//   2:    NFD_QC Yes (0) or No (1). No also means there is a decomposition.
-//   1..0: Number of trailing non-starters.
-//
-// When all 4 bits are zero, the character is inert, meaning it is never
-// influenced by normalization.
-type qcInfo uint8
-
-func (p Properties) isYesC() bool { return p.flags&0x10 == 0 }
-func (p Properties) isYesD() bool { return p.flags&0x4 == 0 }
-
-func (p Properties) combinesForward() bool  { return p.flags&0x20 != 0 }
-func (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe
-func (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD
-
-func (p Properties) isInert() bool {
-       return p.flags&qcInfoMask == 0 && p.ccc == 0
-}
-
-func (p Properties) multiSegment() bool {
-       return p.index >= firstMulti && p.index < endMulti
-}
-
-func (p Properties) nLeadingNonStarters() uint8 {
-       return p.nLead
-}
-
-func (p Properties) nTrailingNonStarters() uint8 {
-       return uint8(p.flags & 0x03)
-}
-
-// Decomposition returns the decomposition for the underlying rune
-// or nil if there is none.
-func (p Properties) Decomposition() []byte {
-       // TODO: create the decomposition for Hangul?
-       if p.index == 0 {
-               return nil
-       }
-       i := p.index
-       n := decomps[i] & headerLenMask
-       i++
-       return decomps[i : i+uint16(n)]
-}
-
-// Size returns the length of UTF-8 encoding of the rune.
-func (p Properties) Size() int {
-       return int(p.size)
-}
-
-// CCC returns the canonical combining class of the underlying rune.
-func (p Properties) CCC() uint8 {
-       if p.index >= firstCCCZeroExcept {
-               return 0
-       }
-       return ccc[p.ccc]
-}
-
-// LeadCCC returns the CCC of the first rune in the decomposition.
-// If there is no decomposition, LeadCCC equals CCC.
-func (p Properties) LeadCCC() uint8 {
-       return ccc[p.ccc]
-}
-
-// TrailCCC returns the CCC of the last rune in the decomposition.
-// If there is no decomposition, TrailCCC equals CCC.
-func (p Properties) TrailCCC() uint8 {
-       return ccc[p.tccc]
-}
-
-// Recomposition
-// We use 32-bit keys instead of 64-bit for the two codepoint keys.
-// This clips off the bits of three entries, but we know this will not
-// result in a collision. In the unlikely event that changes to
-// UnicodeData.txt introduce collisions, the compiler will catch it.
-// Note that the recomposition map for NFC and NFKC are identical.
-
-// combine returns the combined rune or 0 if it doesn't exist.
-func combine(a, b rune) rune {
-       key := uint32(uint16(a))<<16 + uint32(uint16(b))
-       return recompMap[key]
-}
-
-func lookupInfoNFC(b input, i int) Properties {
-       v, sz := b.charinfoNFC(i)
-       return compInfo(v, sz)
-}
-
-func lookupInfoNFKC(b input, i int) Properties {
-       v, sz := b.charinfoNFKC(i)
-       return compInfo(v, sz)
-}
-
-// Properties returns properties for the first rune in s.
-func (f Form) Properties(s []byte) Properties {
-       if f == NFC || f == NFD {
-               return compInfo(nfcData.lookup(s))
-       }
-       return compInfo(nfkcData.lookup(s))
-}
-
-// PropertiesString returns properties for the first rune in s.
-func (f Form) PropertiesString(s string) Properties {
-       if f == NFC || f == NFD {
-               return compInfo(nfcData.lookupString(s))
-       }
-       return compInfo(nfkcData.lookupString(s))
-}
-
-// compInfo converts the information contained in v and sz
-// to a Properties.  See the comment at the top of the file
-// for more information on the format.
-func compInfo(v uint16, sz int) Properties {
-       if v == 0 {
-               return Properties{size: uint8(sz)}
-       } else if v >= 0x8000 {
-               p := Properties{
-                       size:  uint8(sz),
-                       ccc:   uint8(v),
-                       tccc:  uint8(v),
-                       flags: qcInfo(v >> 8),
-               }
-               if p.ccc > 0 || p.combinesBackward() {
-                       p.nLead = uint8(p.flags & 0x3)
-               }
-               return p
-       }
-       // has decomposition
-       h := decomps[v]
-       f := (qcInfo(h&headerFlagsMask) >> 2) | 0x4
-       p := Properties{size: uint8(sz), flags: f, index: v}
-       if v >= firstCCC {
-               v += uint16(h&headerLenMask) + 1
-               c := decomps[v]
-               p.tccc = c >> 2
-               p.flags |= qcInfo(c & 0x3)
-               if v >= firstLeadingCCC {
-                       p.nLead = c & 0x3
-                       if v >= firstStarterWithNLead {
-                               // We were tricked. Remove the decomposition.
-                               p.flags &= 0x03
-                               p.index = 0
-                               return p
-                       }
-                       p.ccc = decomps[v+1]
-               }
-       }
-       return p
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/input.go b/libgo/go/internal/x/text/unicode/norm/input.go
deleted file mode 100644 (file)
index 315f6fc..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-import "unicode/utf8"
-
-type input struct {
-       str   string
-       bytes []byte
-}
-
-func inputBytes(str []byte) input {
-       return input{bytes: str}
-}
-
-func inputString(str string) input {
-       return input{str: str}
-}
-
-func (in *input) setBytes(str []byte) {
-       in.str = ""
-       in.bytes = str
-}
-
-func (in *input) setString(str string) {
-       in.str = str
-       in.bytes = nil
-}
-
-func (in *input) _byte(p int) byte {
-       if in.bytes == nil {
-               return in.str[p]
-       }
-       return in.bytes[p]
-}
-
-func (in *input) skipASCII(p, max int) int {
-       if in.bytes == nil {
-               for ; p < max && in.str[p] < utf8.RuneSelf; p++ {
-               }
-       } else {
-               for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ {
-               }
-       }
-       return p
-}
-
-func (in *input) skipContinuationBytes(p int) int {
-       if in.bytes == nil {
-               for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ {
-               }
-       } else {
-               for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ {
-               }
-       }
-       return p
-}
-
-func (in *input) appendSlice(buf []byte, b, e int) []byte {
-       if in.bytes != nil {
-               return append(buf, in.bytes[b:e]...)
-       }
-       for i := b; i < e; i++ {
-               buf = append(buf, in.str[i])
-       }
-       return buf
-}
-
-func (in *input) copySlice(buf []byte, b, e int) int {
-       if in.bytes == nil {
-               return copy(buf, in.str[b:e])
-       }
-       return copy(buf, in.bytes[b:e])
-}
-
-func (in *input) charinfoNFC(p int) (uint16, int) {
-       if in.bytes == nil {
-               return nfcData.lookupString(in.str[p:])
-       }
-       return nfcData.lookup(in.bytes[p:])
-}
-
-func (in *input) charinfoNFKC(p int) (uint16, int) {
-       if in.bytes == nil {
-               return nfkcData.lookupString(in.str[p:])
-       }
-       return nfkcData.lookup(in.bytes[p:])
-}
-
-func (in *input) hangul(p int) (r rune) {
-       var size int
-       if in.bytes == nil {
-               if !isHangulString(in.str[p:]) {
-                       return 0
-               }
-               r, size = utf8.DecodeRuneInString(in.str[p:])
-       } else {
-               if !isHangul(in.bytes[p:]) {
-                       return 0
-               }
-               r, size = utf8.DecodeRune(in.bytes[p:])
-       }
-       if size != hangulUTF8Size {
-               return 0
-       }
-       return r
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/iter.go b/libgo/go/internal/x/text/unicode/norm/iter.go
deleted file mode 100644 (file)
index d0ae6cb..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-import (
-       "fmt"
-       "unicode/utf8"
-)
-
-// MaxSegmentSize is the maximum size of a byte buffer needed to consider any
-// sequence of starter and non-starter runes for the purpose of normalization.
-const MaxSegmentSize = maxByteBufferSize
-
-// An Iter iterates over a string or byte slice, while normalizing it
-// to a given Form.
-type Iter struct {
-       rb     reorderBuffer
-       buf    [maxByteBufferSize]byte
-       info   Properties // first character saved from previous iteration
-       next   iterFunc   // implementation of next depends on form
-       asciiF iterFunc
-
-       p        int    // current position in input source
-       multiSeg []byte // remainder of multi-segment decomposition
-}
-
-type iterFunc func(*Iter) []byte
-
-// Init initializes i to iterate over src after normalizing it to Form f.
-func (i *Iter) Init(f Form, src []byte) {
-       i.p = 0
-       if len(src) == 0 {
-               i.setDone()
-               i.rb.nsrc = 0
-               return
-       }
-       i.multiSeg = nil
-       i.rb.init(f, src)
-       i.next = i.rb.f.nextMain
-       i.asciiF = nextASCIIBytes
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.rb.ss.first(i.info)
-}
-
-// InitString initializes i to iterate over src after normalizing it to Form f.
-func (i *Iter) InitString(f Form, src string) {
-       i.p = 0
-       if len(src) == 0 {
-               i.setDone()
-               i.rb.nsrc = 0
-               return
-       }
-       i.multiSeg = nil
-       i.rb.initString(f, src)
-       i.next = i.rb.f.nextMain
-       i.asciiF = nextASCIIString
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.rb.ss.first(i.info)
-}
-
-// Seek sets the segment to be returned by the next call to Next to start
-// at position p.  It is the responsibility of the caller to set p to the
-// start of a segment.
-func (i *Iter) Seek(offset int64, whence int) (int64, error) {
-       var abs int64
-       switch whence {
-       case 0:
-               abs = offset
-       case 1:
-               abs = int64(i.p) + offset
-       case 2:
-               abs = int64(i.rb.nsrc) + offset
-       default:
-               return 0, fmt.Errorf("norm: invalid whence")
-       }
-       if abs < 0 {
-               return 0, fmt.Errorf("norm: negative position")
-       }
-       if int(abs) >= i.rb.nsrc {
-               i.setDone()
-               return int64(i.p), nil
-       }
-       i.p = int(abs)
-       i.multiSeg = nil
-       i.next = i.rb.f.nextMain
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.rb.ss.first(i.info)
-       return abs, nil
-}
-
-// returnSlice returns a slice of the underlying input type as a byte slice.
-// If the underlying is of type []byte, it will simply return a slice.
-// If the underlying is of type string, it will copy the slice to the buffer
-// and return that.
-func (i *Iter) returnSlice(a, b int) []byte {
-       if i.rb.src.bytes == nil {
-               return i.buf[:copy(i.buf[:], i.rb.src.str[a:b])]
-       }
-       return i.rb.src.bytes[a:b]
-}
-
-// Pos returns the byte position at which the next call to Next will commence processing.
-func (i *Iter) Pos() int {
-       return i.p
-}
-
-func (i *Iter) setDone() {
-       i.next = nextDone
-       i.p = i.rb.nsrc
-}
-
-// Done returns true if there is no more input to process.
-func (i *Iter) Done() bool {
-       return i.p >= i.rb.nsrc
-}
-
-// Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input.
-// For any input a and b for which f(a) == f(b), subsequent calls
-// to Next will return the same segments.
-// Modifying runes are grouped together with the preceding starter, if such a starter exists.
-// Although not guaranteed, n will typically be the smallest possible n.
-func (i *Iter) Next() []byte {
-       return i.next(i)
-}
-
-func nextASCIIBytes(i *Iter) []byte {
-       p := i.p + 1
-       if p >= i.rb.nsrc {
-               i.setDone()
-               return i.rb.src.bytes[i.p:p]
-       }
-       if i.rb.src.bytes[p] < utf8.RuneSelf {
-               p0 := i.p
-               i.p = p
-               return i.rb.src.bytes[p0:p]
-       }
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.next = i.rb.f.nextMain
-       return i.next(i)
-}
-
-func nextASCIIString(i *Iter) []byte {
-       p := i.p + 1
-       if p >= i.rb.nsrc {
-               i.buf[0] = i.rb.src.str[i.p]
-               i.setDone()
-               return i.buf[:1]
-       }
-       if i.rb.src.str[p] < utf8.RuneSelf {
-               i.buf[0] = i.rb.src.str[i.p]
-               i.p = p
-               return i.buf[:1]
-       }
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.next = i.rb.f.nextMain
-       return i.next(i)
-}
-
-func nextHangul(i *Iter) []byte {
-       p := i.p
-       next := p + hangulUTF8Size
-       if next >= i.rb.nsrc {
-               i.setDone()
-       } else if i.rb.src.hangul(next) == 0 {
-               i.rb.ss.next(i.info)
-               i.info = i.rb.f.info(i.rb.src, i.p)
-               i.next = i.rb.f.nextMain
-               return i.next(i)
-       }
-       i.p = next
-       return i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))]
-}
-
-func nextDone(i *Iter) []byte {
-       return nil
-}
-
-// nextMulti is used for iterating over multi-segment decompositions
-// for decomposing normal forms.
-func nextMulti(i *Iter) []byte {
-       j := 0
-       d := i.multiSeg
-       // skip first rune
-       for j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ {
-       }
-       for j < len(d) {
-               info := i.rb.f.info(input{bytes: d}, j)
-               if info.BoundaryBefore() {
-                       i.multiSeg = d[j:]
-                       return d[:j]
-               }
-               j += int(info.size)
-       }
-       // treat last segment as normal decomposition
-       i.next = i.rb.f.nextMain
-       return i.next(i)
-}
-
-// nextMultiNorm is used for iterating over multi-segment decompositions
-// for composing normal forms.
-func nextMultiNorm(i *Iter) []byte {
-       j := 0
-       d := i.multiSeg
-       for j < len(d) {
-               info := i.rb.f.info(input{bytes: d}, j)
-               if info.BoundaryBefore() {
-                       i.rb.compose()
-                       seg := i.buf[:i.rb.flushCopy(i.buf[:])]
-                       i.rb.insertUnsafe(input{bytes: d}, j, info)
-                       i.multiSeg = d[j+int(info.size):]
-                       return seg
-               }
-               i.rb.insertUnsafe(input{bytes: d}, j, info)
-               j += int(info.size)
-       }
-       i.multiSeg = nil
-       i.next = nextComposed
-       return doNormComposed(i)
-}
-
-// nextDecomposed is the implementation of Next for forms NFD and NFKD.
-func nextDecomposed(i *Iter) (next []byte) {
-       outp := 0
-       inCopyStart, outCopyStart := i.p, 0
-       for {
-               if sz := int(i.info.size); sz <= 1 {
-                       i.rb.ss = 0
-                       p := i.p
-                       i.p++ // ASCII or illegal byte.  Either way, advance by 1.
-                       if i.p >= i.rb.nsrc {
-                               i.setDone()
-                               return i.returnSlice(p, i.p)
-                       } else if i.rb.src._byte(i.p) < utf8.RuneSelf {
-                               i.next = i.asciiF
-                               return i.returnSlice(p, i.p)
-                       }
-                       outp++
-               } else if d := i.info.Decomposition(); d != nil {
-                       // Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero.
-                       // Case 1: there is a leftover to copy.  In this case the decomposition
-                       // must begin with a modifier and should always be appended.
-                       // Case 2: no leftover. Simply return d if followed by a ccc == 0 value.
-                       p := outp + len(d)
-                       if outp > 0 {
-                               i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
-                               // TODO: this condition should not be possible, but we leave it
-                               // in for defensive purposes.
-                               if p > len(i.buf) {
-                                       return i.buf[:outp]
-                               }
-                       } else if i.info.multiSegment() {
-                               // outp must be 0 as multi-segment decompositions always
-                               // start a new segment.
-                               if i.multiSeg == nil {
-                                       i.multiSeg = d
-                                       i.next = nextMulti
-                                       return nextMulti(i)
-                               }
-                               // We are in the last segment.  Treat as normal decomposition.
-                               d = i.multiSeg
-                               i.multiSeg = nil
-                               p = len(d)
-                       }
-                       prevCC := i.info.tccc
-                       if i.p += sz; i.p >= i.rb.nsrc {
-                               i.setDone()
-                               i.info = Properties{} // Force BoundaryBefore to succeed.
-                       } else {
-                               i.info = i.rb.f.info(i.rb.src, i.p)
-                       }
-                       switch i.rb.ss.next(i.info) {
-                       case ssOverflow:
-                               i.next = nextCGJDecompose
-                               fallthrough
-                       case ssStarter:
-                               if outp > 0 {
-                                       copy(i.buf[outp:], d)
-                                       return i.buf[:p]
-                               }
-                               return d
-                       }
-                       copy(i.buf[outp:], d)
-                       outp = p
-                       inCopyStart, outCopyStart = i.p, outp
-                       if i.info.ccc < prevCC {
-                               goto doNorm
-                       }
-                       continue
-               } else if r := i.rb.src.hangul(i.p); r != 0 {
-                       outp = decomposeHangul(i.buf[:], r)
-                       i.p += hangulUTF8Size
-                       inCopyStart, outCopyStart = i.p, outp
-                       if i.p >= i.rb.nsrc {
-                               i.setDone()
-                               break
-                       } else if i.rb.src.hangul(i.p) != 0 {
-                               i.next = nextHangul
-                               return i.buf[:outp]
-                       }
-               } else {
-                       p := outp + sz
-                       if p > len(i.buf) {
-                               break
-                       }
-                       outp = p
-                       i.p += sz
-               }
-               if i.p >= i.rb.nsrc {
-                       i.setDone()
-                       break
-               }
-               prevCC := i.info.tccc
-               i.info = i.rb.f.info(i.rb.src, i.p)
-               if v := i.rb.ss.next(i.info); v == ssStarter {
-                       break
-               } else if v == ssOverflow {
-                       i.next = nextCGJDecompose
-                       break
-               }
-               if i.info.ccc < prevCC {
-                       goto doNorm
-               }
-       }
-       if outCopyStart == 0 {
-               return i.returnSlice(inCopyStart, i.p)
-       } else if inCopyStart < i.p {
-               i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
-       }
-       return i.buf[:outp]
-doNorm:
-       // Insert what we have decomposed so far in the reorderBuffer.
-       // As we will only reorder, there will always be enough room.
-       i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)
-       i.rb.insertDecomposed(i.buf[0:outp])
-       return doNormDecomposed(i)
-}
-
-func doNormDecomposed(i *Iter) []byte {
-       for {
-               i.rb.insertUnsafe(i.rb.src, i.p, i.info)
-               if i.p += int(i.info.size); i.p >= i.rb.nsrc {
-                       i.setDone()
-                       break
-               }
-               i.info = i.rb.f.info(i.rb.src, i.p)
-               if i.info.ccc == 0 {
-                       break
-               }
-               if s := i.rb.ss.next(i.info); s == ssOverflow {
-                       i.next = nextCGJDecompose
-                       break
-               }
-       }
-       // new segment or too many combining characters: exit normalization
-       return i.buf[:i.rb.flushCopy(i.buf[:])]
-}
-
-func nextCGJDecompose(i *Iter) []byte {
-       i.rb.ss = 0
-       i.rb.insertCGJ()
-       i.next = nextDecomposed
-       i.rb.ss.first(i.info)
-       buf := doNormDecomposed(i)
-       return buf
-}
-
-// nextComposed is the implementation of Next for forms NFC and NFKC.
-func nextComposed(i *Iter) []byte {
-       outp, startp := 0, i.p
-       var prevCC uint8
-       for {
-               if !i.info.isYesC() {
-                       goto doNorm
-               }
-               prevCC = i.info.tccc
-               sz := int(i.info.size)
-               if sz == 0 {
-                       sz = 1 // illegal rune: copy byte-by-byte
-               }
-               p := outp + sz
-               if p > len(i.buf) {
-                       break
-               }
-               outp = p
-               i.p += sz
-               if i.p >= i.rb.nsrc {
-                       i.setDone()
-                       break
-               } else if i.rb.src._byte(i.p) < utf8.RuneSelf {
-                       i.rb.ss = 0
-                       i.next = i.asciiF
-                       break
-               }
-               i.info = i.rb.f.info(i.rb.src, i.p)
-               if v := i.rb.ss.next(i.info); v == ssStarter {
-                       break
-               } else if v == ssOverflow {
-                       i.next = nextCGJCompose
-                       break
-               }
-               if i.info.ccc < prevCC {
-                       goto doNorm
-               }
-       }
-       return i.returnSlice(startp, i.p)
-doNorm:
-       // reset to start position
-       i.p = startp
-       i.info = i.rb.f.info(i.rb.src, i.p)
-       i.rb.ss.first(i.info)
-       if i.info.multiSegment() {
-               d := i.info.Decomposition()
-               info := i.rb.f.info(input{bytes: d}, 0)
-               i.rb.insertUnsafe(input{bytes: d}, 0, info)
-               i.multiSeg = d[int(info.size):]
-               i.next = nextMultiNorm
-               return nextMultiNorm(i)
-       }
-       i.rb.ss.first(i.info)
-       i.rb.insertUnsafe(i.rb.src, i.p, i.info)
-       return doNormComposed(i)
-}
-
-func doNormComposed(i *Iter) []byte {
-       // First rune should already be inserted.
-       for {
-               if i.p += int(i.info.size); i.p >= i.rb.nsrc {
-                       i.setDone()
-                       break
-               }
-               i.info = i.rb.f.info(i.rb.src, i.p)
-               if s := i.rb.ss.next(i.info); s == ssStarter {
-                       break
-               } else if s == ssOverflow {
-                       i.next = nextCGJCompose
-                       break
-               }
-               i.rb.insertUnsafe(i.rb.src, i.p, i.info)
-       }
-       i.rb.compose()
-       seg := i.buf[:i.rb.flushCopy(i.buf[:])]
-       return seg
-}
-
-func nextCGJCompose(i *Iter) []byte {
-       i.rb.ss = 0 // instead of first
-       i.rb.insertCGJ()
-       i.next = nextComposed
-       // Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter,
-       // even if they are not. This is particularly dubious for U+FF9E and UFF9A.
-       // If we ever change that, insert a check here.
-       i.rb.ss.first(i.info)
-       i.rb.insertUnsafe(i.rb.src, i.p, i.info)
-       return doNormComposed(i)
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/normalize.go b/libgo/go/internal/x/text/unicode/norm/normalize.go
deleted file mode 100644 (file)
index 791c39b..0000000
+++ /dev/null
@@ -1,609 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Note: the file data_test.go that is generated should not be checked in.
-
-// Package norm contains types and functions for normalizing Unicode strings.
-package norm
-
-import (
-       "unicode/utf8"
-
-       "internal/x/text/transform"
-)
-
-// A Form denotes a canonical representation of Unicode code points.
-// The Unicode-defined normalization and equivalence forms are:
-//
-//   NFC   Unicode Normalization Form C
-//   NFD   Unicode Normalization Form D
-//   NFKC  Unicode Normalization Form KC
-//   NFKD  Unicode Normalization Form KD
-//
-// For a Form f, this documentation uses the notation f(x) to mean
-// the bytes or string x converted to the given form.
-// A position n in x is called a boundary if conversion to the form can
-// proceed independently on both sides:
-//   f(x) == append(f(x[0:n]), f(x[n:])...)
-//
-// References: http://unicode.org/reports/tr15/ and
-// http://unicode.org/notes/tn5/.
-type Form int
-
-const (
-       NFC Form = iota
-       NFD
-       NFKC
-       NFKD
-)
-
-// Bytes returns f(b). May return b if f(b) = b.
-func (f Form) Bytes(b []byte) []byte {
-       src := inputBytes(b)
-       ft := formTable[f]
-       n, ok := ft.quickSpan(src, 0, len(b), true)
-       if ok {
-               return b
-       }
-       out := make([]byte, n, len(b))
-       copy(out, b[0:n])
-       rb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush}
-       return doAppendInner(&rb, n)
-}
-
-// String returns f(s).
-func (f Form) String(s string) string {
-       src := inputString(s)
-       ft := formTable[f]
-       n, ok := ft.quickSpan(src, 0, len(s), true)
-       if ok {
-               return s
-       }
-       out := make([]byte, n, len(s))
-       copy(out, s[0:n])
-       rb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush}
-       return string(doAppendInner(&rb, n))
-}
-
-// IsNormal returns true if b == f(b).
-func (f Form) IsNormal(b []byte) bool {
-       src := inputBytes(b)
-       ft := formTable[f]
-       bp, ok := ft.quickSpan(src, 0, len(b), true)
-       if ok {
-               return true
-       }
-       rb := reorderBuffer{f: *ft, src: src, nsrc: len(b)}
-       rb.setFlusher(nil, cmpNormalBytes)
-       for bp < len(b) {
-               rb.out = b[bp:]
-               if bp = decomposeSegment(&rb, bp, true); bp < 0 {
-                       return false
-               }
-               bp, _ = rb.f.quickSpan(rb.src, bp, len(b), true)
-       }
-       return true
-}
-
-func cmpNormalBytes(rb *reorderBuffer) bool {
-       b := rb.out
-       for i := 0; i < rb.nrune; i++ {
-               info := rb.rune[i]
-               if int(info.size) > len(b) {
-                       return false
-               }
-               p := info.pos
-               pe := p + info.size
-               for ; p < pe; p++ {
-                       if b[0] != rb.byte[p] {
-                               return false
-                       }
-                       b = b[1:]
-               }
-       }
-       return true
-}
-
-// IsNormalString returns true if s == f(s).
-func (f Form) IsNormalString(s string) bool {
-       src := inputString(s)
-       ft := formTable[f]
-       bp, ok := ft.quickSpan(src, 0, len(s), true)
-       if ok {
-               return true
-       }
-       rb := reorderBuffer{f: *ft, src: src, nsrc: len(s)}
-       rb.setFlusher(nil, func(rb *reorderBuffer) bool {
-               for i := 0; i < rb.nrune; i++ {
-                       info := rb.rune[i]
-                       if bp+int(info.size) > len(s) {
-                               return false
-                       }
-                       p := info.pos
-                       pe := p + info.size
-                       for ; p < pe; p++ {
-                               if s[bp] != rb.byte[p] {
-                                       return false
-                               }
-                               bp++
-                       }
-               }
-               return true
-       })
-       for bp < len(s) {
-               if bp = decomposeSegment(&rb, bp, true); bp < 0 {
-                       return false
-               }
-               bp, _ = rb.f.quickSpan(rb.src, bp, len(s), true)
-       }
-       return true
-}
-
-// patchTail fixes a case where a rune may be incorrectly normalized
-// if it is followed by illegal continuation bytes. It returns the
-// patched buffer and whether the decomposition is still in progress.
-func patchTail(rb *reorderBuffer) bool {
-       info, p := lastRuneStart(&rb.f, rb.out)
-       if p == -1 || info.size == 0 {
-               return true
-       }
-       end := p + int(info.size)
-       extra := len(rb.out) - end
-       if extra > 0 {
-               // Potentially allocating memory. However, this only
-               // happens with ill-formed UTF-8.
-               x := make([]byte, 0)
-               x = append(x, rb.out[len(rb.out)-extra:]...)
-               rb.out = rb.out[:end]
-               decomposeToLastBoundary(rb)
-               rb.doFlush()
-               rb.out = append(rb.out, x...)
-               return false
-       }
-       buf := rb.out[p:]
-       rb.out = rb.out[:p]
-       decomposeToLastBoundary(rb)
-       if s := rb.ss.next(info); s == ssStarter {
-               rb.doFlush()
-               rb.ss.first(info)
-       } else if s == ssOverflow {
-               rb.doFlush()
-               rb.insertCGJ()
-               rb.ss = 0
-       }
-       rb.insertUnsafe(inputBytes(buf), 0, info)
-       return true
-}
-
-func appendQuick(rb *reorderBuffer, i int) int {
-       if rb.nsrc == i {
-               return i
-       }
-       end, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true)
-       rb.out = rb.src.appendSlice(rb.out, i, end)
-       return end
-}
-
-// Append returns f(append(out, b...)).
-// The buffer out must be nil, empty, or equal to f(out).
-func (f Form) Append(out []byte, src ...byte) []byte {
-       return f.doAppend(out, inputBytes(src), len(src))
-}
-
-func (f Form) doAppend(out []byte, src input, n int) []byte {
-       if n == 0 {
-               return out
-       }
-       ft := formTable[f]
-       // Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer.
-       if len(out) == 0 {
-               p, _ := ft.quickSpan(src, 0, n, true)
-               out = src.appendSlice(out, 0, p)
-               if p == n {
-                       return out
-               }
-               rb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush}
-               return doAppendInner(&rb, p)
-       }
-       rb := reorderBuffer{f: *ft, src: src, nsrc: n}
-       return doAppend(&rb, out, 0)
-}
-
-func doAppend(rb *reorderBuffer, out []byte, p int) []byte {
-       rb.setFlusher(out, appendFlush)
-       src, n := rb.src, rb.nsrc
-       doMerge := len(out) > 0
-       if q := src.skipContinuationBytes(p); q > p {
-               // Move leading non-starters to destination.
-               rb.out = src.appendSlice(rb.out, p, q)
-               p = q
-               doMerge = patchTail(rb)
-       }
-       fd := &rb.f
-       if doMerge {
-               var info Properties
-               if p < n {
-                       info = fd.info(src, p)
-                       if !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 {
-                               if p == 0 {
-                                       decomposeToLastBoundary(rb)
-                               }
-                               p = decomposeSegment(rb, p, true)
-                       }
-               }
-               if info.size == 0 {
-                       rb.doFlush()
-                       // Append incomplete UTF-8 encoding.
-                       return src.appendSlice(rb.out, p, n)
-               }
-               if rb.nrune > 0 {
-                       return doAppendInner(rb, p)
-               }
-       }
-       p = appendQuick(rb, p)
-       return doAppendInner(rb, p)
-}
-
-func doAppendInner(rb *reorderBuffer, p int) []byte {
-       for n := rb.nsrc; p < n; {
-               p = decomposeSegment(rb, p, true)
-               p = appendQuick(rb, p)
-       }
-       return rb.out
-}
-
-// AppendString returns f(append(out, []byte(s))).
-// The buffer out must be nil, empty, or equal to f(out).
-func (f Form) AppendString(out []byte, src string) []byte {
-       return f.doAppend(out, inputString(src), len(src))
-}
-
-// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]).
-// It is not guaranteed to return the largest such n.
-func (f Form) QuickSpan(b []byte) int {
-       n, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true)
-       return n
-}
-
-// Span implements transform.SpanningTransformer. It returns a boundary n such
-// that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n.
-func (f Form) Span(b []byte, atEOF bool) (n int, err error) {
-       n, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF)
-       if n < len(b) {
-               if !ok {
-                       err = transform.ErrEndOfSpan
-               } else {
-                       err = transform.ErrShortSrc
-               }
-       }
-       return n, err
-}
-
-// SpanString returns a boundary n such that s[0:n] == f(s[0:n]).
-// It is not guaranteed to return the largest such n.
-func (f Form) SpanString(s string, atEOF bool) (n int, err error) {
-       n, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF)
-       if n < len(s) {
-               if !ok {
-                       err = transform.ErrEndOfSpan
-               } else {
-                       err = transform.ErrShortSrc
-               }
-       }
-       return n, err
-}
-
-// quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and
-// whether any non-normalized parts were found. If atEOF is false, n will
-// not point past the last segment if this segment might be become
-// non-normalized by appending other runes.
-func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) {
-       var lastCC uint8
-       ss := streamSafe(0)
-       lastSegStart := i
-       for n = end; i < n; {
-               if j := src.skipASCII(i, n); i != j {
-                       i = j
-                       lastSegStart = i - 1
-                       lastCC = 0
-                       ss = 0
-                       continue
-               }
-               info := f.info(src, i)
-               if info.size == 0 {
-                       if atEOF {
-                               // include incomplete runes
-                               return n, true
-                       }
-                       return lastSegStart, true
-               }
-               // This block needs to be before the next, because it is possible to
-               // have an overflow for runes that are starters (e.g. with U+FF9E).
-               switch ss.next(info) {
-               case ssStarter:
-                       lastSegStart = i
-               case ssOverflow:
-                       return lastSegStart, false
-               case ssSuccess:
-                       if lastCC > info.ccc {
-                               return lastSegStart, false
-                       }
-               }
-               if f.composing {
-                       if !info.isYesC() {
-                               break
-                       }
-               } else {
-                       if !info.isYesD() {
-                               break
-                       }
-               }
-               lastCC = info.ccc
-               i += int(info.size)
-       }
-       if i == n {
-               if !atEOF {
-                       n = lastSegStart
-               }
-               return n, true
-       }
-       return lastSegStart, false
-}
-
-// QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]).
-// It is not guaranteed to return the largest such n.
-func (f Form) QuickSpanString(s string) int {
-       n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true)
-       return n
-}
-
-// FirstBoundary returns the position i of the first boundary in b
-// or -1 if b contains no boundary.
-func (f Form) FirstBoundary(b []byte) int {
-       return f.firstBoundary(inputBytes(b), len(b))
-}
-
-func (f Form) firstBoundary(src input, nsrc int) int {
-       i := src.skipContinuationBytes(0)
-       if i >= nsrc {
-               return -1
-       }
-       fd := formTable[f]
-       ss := streamSafe(0)
-       // We should call ss.first here, but we can't as the first rune is
-       // skipped already. This means FirstBoundary can't really determine
-       // CGJ insertion points correctly. Luckily it doesn't have to.
-       for {
-               info := fd.info(src, i)
-               if info.size == 0 {
-                       return -1
-               }
-               if s := ss.next(info); s != ssSuccess {
-                       return i
-               }
-               i += int(info.size)
-               if i >= nsrc {
-                       if !info.BoundaryAfter() && !ss.isMax() {
-                               return -1
-                       }
-                       return nsrc
-               }
-       }
-}
-
-// FirstBoundaryInString returns the position i of the first boundary in s
-// or -1 if s contains no boundary.
-func (f Form) FirstBoundaryInString(s string) int {
-       return f.firstBoundary(inputString(s), len(s))
-}
-
-// NextBoundary reports the index of the boundary between the first and next
-// segment in b or -1 if atEOF is false and there are not enough bytes to
-// determine this boundary.
-func (f Form) NextBoundary(b []byte, atEOF bool) int {
-       return f.nextBoundary(inputBytes(b), len(b), atEOF)
-}
-
-// NextBoundaryInString reports the index of the boundary between the first and
-// next segment in b or -1 if atEOF is false and there are not enough bytes to
-// determine this boundary.
-func (f Form) NextBoundaryInString(s string, atEOF bool) int {
-       return f.nextBoundary(inputString(s), len(s), atEOF)
-}
-
-func (f Form) nextBoundary(src input, nsrc int, atEOF bool) int {
-       if nsrc == 0 {
-               if atEOF {
-                       return 0
-               }
-               return -1
-       }
-       fd := formTable[f]
-       info := fd.info(src, 0)
-       if info.size == 0 {
-               if atEOF {
-                       return 1
-               }
-               return -1
-       }
-       ss := streamSafe(0)
-       ss.first(info)
-
-       for i := int(info.size); i < nsrc; i += int(info.size) {
-               info = fd.info(src, i)
-               if info.size == 0 {
-                       if atEOF {
-                               return i
-                       }
-                       return -1
-               }
-               // TODO: Using streamSafe to determine the boundary isn't the same as
-               // using BoundaryBefore. Determine which should be used.
-               if s := ss.next(info); s != ssSuccess {
-                       return i
-               }
-       }
-       if !atEOF && !info.BoundaryAfter() && !ss.isMax() {
-               return -1
-       }
-       return nsrc
-}
-
-// LastBoundary returns the position i of the last boundary in b
-// or -1 if b contains no boundary.
-func (f Form) LastBoundary(b []byte) int {
-       return lastBoundary(formTable[f], b)
-}
-
-func lastBoundary(fd *formInfo, b []byte) int {
-       i := len(b)
-       info, p := lastRuneStart(fd, b)
-       if p == -1 {
-               return -1
-       }
-       if info.size == 0 { // ends with incomplete rune
-               if p == 0 { // starts with incomplete rune
-                       return -1
-               }
-               i = p
-               info, p = lastRuneStart(fd, b[:i])
-               if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter
-                       return i
-               }
-       }
-       if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8
-               return i
-       }
-       if info.BoundaryAfter() {
-               return i
-       }
-       ss := streamSafe(0)
-       v := ss.backwards(info)
-       for i = p; i >= 0 && v != ssStarter; i = p {
-               info, p = lastRuneStart(fd, b[:i])
-               if v = ss.backwards(info); v == ssOverflow {
-                       break
-               }
-               if p+int(info.size) != i {
-                       if p == -1 { // no boundary found
-                               return -1
-                       }
-                       return i // boundary after an illegal UTF-8 encoding
-               }
-       }
-       return i
-}
-
-// decomposeSegment scans the first segment in src into rb. It inserts 0x034f
-// (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters
-// and returns the number of bytes consumed from src or iShortDst or iShortSrc.
-func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int {
-       // Force one character to be consumed.
-       info := rb.f.info(rb.src, sp)
-       if info.size == 0 {
-               return 0
-       }
-       if s := rb.ss.next(info); s == ssStarter {
-               // TODO: this could be removed if we don't support merging.
-               if rb.nrune > 0 {
-                       goto end
-               }
-       } else if s == ssOverflow {
-               rb.insertCGJ()
-               goto end
-       }
-       if err := rb.insertFlush(rb.src, sp, info); err != iSuccess {
-               return int(err)
-       }
-       for {
-               sp += int(info.size)
-               if sp >= rb.nsrc {
-                       if !atEOF && !info.BoundaryAfter() {
-                               return int(iShortSrc)
-                       }
-                       break
-               }
-               info = rb.f.info(rb.src, sp)
-               if info.size == 0 {
-                       if !atEOF {
-                               return int(iShortSrc)
-                       }
-                       break
-               }
-               if s := rb.ss.next(info); s == ssStarter {
-                       break
-               } else if s == ssOverflow {
-                       rb.insertCGJ()
-                       break
-               }
-               if err := rb.insertFlush(rb.src, sp, info); err != iSuccess {
-                       return int(err)
-               }
-       }
-end:
-       if !rb.doFlush() {
-               return int(iShortDst)
-       }
-       return sp
-}
-
-// lastRuneStart returns the runeInfo and position of the last
-// rune in buf or the zero runeInfo and -1 if no rune was found.
-func lastRuneStart(fd *formInfo, buf []byte) (Properties, int) {
-       p := len(buf) - 1
-       for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- {
-       }
-       if p < 0 {
-               return Properties{}, -1
-       }
-       return fd.info(inputBytes(buf), p), p
-}
-
-// decomposeToLastBoundary finds an open segment at the end of the buffer
-// and scans it into rb. Returns the buffer minus the last segment.
-func decomposeToLastBoundary(rb *reorderBuffer) {
-       fd := &rb.f
-       info, i := lastRuneStart(fd, rb.out)
-       if int(info.size) != len(rb.out)-i {
-               // illegal trailing continuation bytes
-               return
-       }
-       if info.BoundaryAfter() {
-               return
-       }
-       var add [maxNonStarters + 1]Properties // stores runeInfo in reverse order
-       padd := 0
-       ss := streamSafe(0)
-       p := len(rb.out)
-       for {
-               add[padd] = info
-               v := ss.backwards(info)
-               if v == ssOverflow {
-                       // Note that if we have an overflow, it the string we are appending to
-                       // is not correctly normalized. In this case the behavior is undefined.
-                       break
-               }
-               padd++
-               p -= int(info.size)
-               if v == ssStarter || p < 0 {
-                       break
-               }
-               info, i = lastRuneStart(fd, rb.out[:p])
-               if int(info.size) != p-i {
-                       break
-               }
-       }
-       rb.ss = ss
-       // Copy bytes for insertion as we may need to overwrite rb.out.
-       var buf [maxBufferSize * utf8.UTFMax]byte
-       cp := buf[:copy(buf[:], rb.out[p:])]
-       rb.out = rb.out[:p]
-       for padd--; padd >= 0; padd-- {
-               info = add[padd]
-               rb.insertUnsafe(inputBytes(cp), 0, info)
-               cp = cp[info.size:]
-       }
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/readwriter.go b/libgo/go/internal/x/text/unicode/norm/readwriter.go
deleted file mode 100644 (file)
index 068ab57..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-import "io"
-
-type normWriter struct {
-       rb  reorderBuffer
-       w   io.Writer
-       buf []byte
-}
-
-// Write implements the standard write interface.  If the last characters are
-// not at a normalization boundary, the bytes will be buffered for the next
-// write. The remaining bytes will be written on close.
-func (w *normWriter) Write(data []byte) (n int, err error) {
-       // Process data in pieces to keep w.buf size bounded.
-       const chunk = 4000
-
-       for len(data) > 0 {
-               // Normalize into w.buf.
-               m := len(data)
-               if m > chunk {
-                       m = chunk
-               }
-               w.rb.src = inputBytes(data[:m])
-               w.rb.nsrc = m
-               w.buf = doAppend(&w.rb, w.buf, 0)
-               data = data[m:]
-               n += m
-
-               // Write out complete prefix, save remainder.
-               // Note that lastBoundary looks back at most 31 runes.
-               i := lastBoundary(&w.rb.f, w.buf)
-               if i == -1 {
-                       i = 0
-               }
-               if i > 0 {
-                       if _, err = w.w.Write(w.buf[:i]); err != nil {
-                               break
-                       }
-                       bn := copy(w.buf, w.buf[i:])
-                       w.buf = w.buf[:bn]
-               }
-       }
-       return n, err
-}
-
-// Close forces data that remains in the buffer to be written.
-func (w *normWriter) Close() error {
-       if len(w.buf) > 0 {
-               _, err := w.w.Write(w.buf)
-               if err != nil {
-                       return err
-               }
-       }
-       return nil
-}
-
-// Writer returns a new writer that implements Write(b)
-// by writing f(b) to w.  The returned writer may use an
-// an internal buffer to maintain state across Write calls.
-// Calling its Close method writes any buffered data to w.
-func (f Form) Writer(w io.Writer) io.WriteCloser {
-       wr := &normWriter{rb: reorderBuffer{}, w: w}
-       wr.rb.init(f, nil)
-       return wr
-}
-
-type normReader struct {
-       rb           reorderBuffer
-       r            io.Reader
-       inbuf        []byte
-       outbuf       []byte
-       bufStart     int
-       lastBoundary int
-       err          error
-}
-
-// Read implements the standard read interface.
-func (r *normReader) Read(p []byte) (int, error) {
-       for {
-               if r.lastBoundary-r.bufStart > 0 {
-                       n := copy(p, r.outbuf[r.bufStart:r.lastBoundary])
-                       r.bufStart += n
-                       if r.lastBoundary-r.bufStart > 0 {
-                               return n, nil
-                       }
-                       return n, r.err
-               }
-               if r.err != nil {
-                       return 0, r.err
-               }
-               outn := copy(r.outbuf, r.outbuf[r.lastBoundary:])
-               r.outbuf = r.outbuf[0:outn]
-               r.bufStart = 0
-
-               n, err := r.r.Read(r.inbuf)
-               r.rb.src = inputBytes(r.inbuf[0:n])
-               r.rb.nsrc, r.err = n, err
-               if n > 0 {
-                       r.outbuf = doAppend(&r.rb, r.outbuf, 0)
-               }
-               if err == io.EOF {
-                       r.lastBoundary = len(r.outbuf)
-               } else {
-                       r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf)
-                       if r.lastBoundary == -1 {
-                               r.lastBoundary = 0
-                       }
-               }
-       }
-}
-
-// Reader returns a new reader that implements Read
-// by reading data from r and returning f(data).
-func (f Form) Reader(r io.Reader) io.Reader {
-       const chunk = 4000
-       buf := make([]byte, chunk)
-       rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf}
-       rr.rb.init(f, buf)
-       return rr
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/tables.go b/libgo/go/internal/x/text/unicode/norm/tables.go
deleted file mode 100644 (file)
index 2dd61ad..0000000
+++ /dev/null
@@ -1,7653 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Code generated by running "go generate" in internal/x/text. DO NOT EDIT.
-
-package norm
-
-const (
-       // Version is the Unicode edition from which the tables are derived.
-       Version = "10.0.0"
-
-       // MaxTransformChunkSize indicates the maximum number of bytes that Transform
-       // may need to write atomically for any Form. Making a destination buffer at
-       // least this size ensures that Transform can always make progress and that
-       // the user does not need to grow the buffer on an ErrShortDst.
-       MaxTransformChunkSize = 35 + maxNonStarters*4
-)
-
-var ccc = [55]uint8{
-       0, 1, 7, 8, 9, 10, 11, 12,
-       13, 14, 15, 16, 17, 18, 19, 20,
-       21, 22, 23, 24, 25, 26, 27, 28,
-       29, 30, 31, 32, 33, 34, 35, 36,
-       84, 91, 103, 107, 118, 122, 129, 130,
-       132, 202, 214, 216, 218, 220, 222, 224,
-       226, 228, 230, 232, 233, 234, 240,
-}
-
-const (
-       firstMulti            = 0x186D
-       firstCCC              = 0x2C9E
-       endMulti              = 0x2F60
-       firstLeadingCCC       = 0x49AE
-       firstCCCZeroExcept    = 0x4A78
-       firstStarterWithNLead = 0x4A9F
-       lastDecomp            = 0x4AA1
-       maxDecomp             = 0x8000
-)
-
-// decomps: 19105 bytes
-var decomps = [...]byte{
-       // Bytes 0 - 3f
-       0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
-       0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
-       0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
-       0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
-       0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
-       0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
-       0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
-       0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
-       // Bytes 40 - 7f
-       0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
-       0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
-       0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
-       0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
-       0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
-       0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
-       0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
-       0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
-       // Bytes 80 - bf
-       0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
-       0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
-       0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
-       0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
-       0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
-       0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
-       0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
-       0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
-       // Bytes c0 - ff
-       0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
-       0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
-       0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,
-       0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,
-       0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,
-       0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,
-       0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,
-       0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,
-       // Bytes 100 - 13f
-       0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,
-       0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,
-       0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,
-       0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,
-       0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,
-       0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
-       0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
-       0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
-       // Bytes 140 - 17f
-       0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,
-       0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,
-       0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
-       0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
-       0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,
-       0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,
-       0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,
-       0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,
-       // Bytes 180 - 1bf
-       0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,
-       0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,
-       0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,
-       0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,
-       0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,
-       0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,
-       0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,
-       0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,
-       // Bytes 1c0 - 1ff
-       0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,
-       0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,
-       0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,
-       0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,
-       0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,
-       0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,
-       0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,
-       0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,
-       // Bytes 200 - 23f
-       0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,
-       0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,
-       0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,
-       0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,
-       0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,
-       0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,
-       0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,
-       0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,
-       // Bytes 240 - 27f
-       0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,
-       0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,
-       0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,
-       0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,
-       0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,
-       0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,
-       0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,
-       0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,
-       // Bytes 280 - 2bf
-       0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,
-       0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,
-       0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,
-       0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,
-       0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,
-       0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,
-       0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,
-       0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,
-       // Bytes 2c0 - 2ff
-       0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,
-       0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,
-       0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,
-       0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,
-       0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,
-       0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,
-       0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,
-       0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,
-       // Bytes 300 - 33f
-       0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,
-       0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,
-       0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,
-       0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,
-       0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,
-       0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,
-       0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,
-       0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,
-       // Bytes 340 - 37f
-       0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,
-       0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,
-       0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,
-       0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,
-       0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,
-       0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,
-       0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,
-       0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,
-       // Bytes 380 - 3bf
-       0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,
-       0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,
-       0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,
-       0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,
-       0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,
-       0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,
-       0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,
-       0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,
-       // Bytes 3c0 - 3ff
-       0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,
-       0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,
-       0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,
-       0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,
-       0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,
-       0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,
-       0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,
-       0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,
-       // Bytes 400 - 43f
-       0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,
-       0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,
-       0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,
-       0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,
-       0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,
-       0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,
-       0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,
-       0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,
-       // Bytes 440 - 47f
-       0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,
-       0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,
-       0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,
-       0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,
-       0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,
-       0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,
-       0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,
-       0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,
-       // Bytes 480 - 4bf
-       0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,
-       0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,
-       0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,
-       0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,
-       0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,
-       0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,
-       0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,
-       0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,
-       // Bytes 4c0 - 4ff
-       0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,
-       0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,
-       0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,
-       0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,
-       0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,
-       0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,
-       0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,
-       0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,
-       // Bytes 500 - 53f
-       0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,
-       0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,
-       0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,
-       0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,
-       0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,
-       0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,
-       0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,
-       0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,
-       // Bytes 540 - 57f
-       0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,
-       0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,
-       0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,
-       0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,
-       0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,
-       0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,
-       0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,
-       0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,
-       // Bytes 580 - 5bf
-       0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,
-       0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,
-       0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,
-       0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,
-       0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,
-       0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,
-       0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,
-       0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,
-       // Bytes 5c0 - 5ff
-       0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,
-       0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,
-       0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,
-       0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,
-       0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,
-       0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,
-       0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,
-       0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,
-       // Bytes 600 - 63f
-       0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,
-       0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,
-       0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,
-       0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,
-       0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,
-       0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,
-       0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,
-       0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,
-       // Bytes 640 - 67f
-       0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,
-       0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,
-       0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,
-       0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,
-       0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,
-       0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,
-       0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,
-       0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,
-       // Bytes 680 - 6bf
-       0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,
-       0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,
-       0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,
-       0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,
-       0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,
-       0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,
-       0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,
-       0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,
-       // Bytes 6c0 - 6ff
-       0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,
-       0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,
-       0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,
-       0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,
-       0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,
-       0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,
-       0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,
-       0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,
-       // Bytes 700 - 73f
-       0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,
-       0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,
-       0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,
-       0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,
-       0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,
-       0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,
-       0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,
-       0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,
-       // Bytes 740 - 77f
-       0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,
-       0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,
-       0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,
-       0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,
-       0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,
-       0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,
-       0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,
-       0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,
-       // Bytes 780 - 7bf
-       0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,
-       0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,
-       0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,
-       0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,
-       0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,
-       0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,
-       0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,
-       0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,
-       // Bytes 7c0 - 7ff
-       0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,
-       0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,
-       0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,
-       0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,
-       0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,
-       0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,
-       0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,
-       0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,
-       // Bytes 800 - 83f
-       0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,
-       0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,
-       0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,
-       0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,
-       0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,
-       0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,
-       0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,
-       0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,
-       // Bytes 840 - 87f
-       0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,
-       0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,
-       0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,
-       0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,
-       0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,
-       0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,
-       0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,
-       0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,
-       // Bytes 880 - 8bf
-       0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,
-       0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,
-       0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,
-       0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,
-       0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,
-       0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,
-       0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,
-       0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,
-       // Bytes 8c0 - 8ff
-       0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,
-       0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,
-       0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,
-       0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,
-       0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,
-       0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,
-       0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,
-       0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,
-       // Bytes 900 - 93f
-       0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,
-       0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,
-       0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,
-       0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,
-       0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,
-       0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,
-       0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,
-       0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,
-       // Bytes 940 - 97f
-       0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,
-       0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,
-       0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,
-       0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,
-       0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,
-       0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,
-       0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,
-       0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,
-       // Bytes 980 - 9bf
-       0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,
-       0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,
-       0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,
-       0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,
-       0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,
-       0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,
-       0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,
-       0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,
-       // Bytes 9c0 - 9ff
-       0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,
-       0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,
-       0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,
-       0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,
-       0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,
-       0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,
-       0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,
-       0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,
-       // Bytes a00 - a3f
-       0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,
-       0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,
-       0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,
-       0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,
-       0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,
-       0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,
-       0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,
-       0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,
-       // Bytes a40 - a7f
-       0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,
-       0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,
-       0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,
-       0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,
-       0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,
-       0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,
-       0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,
-       0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,
-       // Bytes a80 - abf
-       0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,
-       0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,
-       0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,
-       0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,
-       0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,
-       0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,
-       0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,
-       0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,
-       // Bytes ac0 - aff
-       0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,
-       0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,
-       0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,
-       0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,
-       0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,
-       0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,
-       0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,
-       0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,
-       // Bytes b00 - b3f
-       0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,
-       0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,
-       0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,
-       0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,
-       0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,
-       0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,
-       0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,
-       0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,
-       // Bytes b40 - b7f
-       0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,
-       0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,
-       0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,
-       0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,
-       0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,
-       0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,
-       0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,
-       0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,
-       // Bytes b80 - bbf
-       0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,
-       0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,
-       0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,
-       0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,
-       0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,
-       0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,
-       0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,
-       0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,
-       // Bytes bc0 - bff
-       0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,
-       0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,
-       0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,
-       0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,
-       0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,
-       0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,
-       0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,
-       0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,
-       // Bytes c00 - c3f
-       0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,
-       0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,
-       0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,
-       0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,
-       0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,
-       0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,
-       0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,
-       0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,
-       // Bytes c40 - c7f
-       0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,
-       0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,
-       0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,
-       0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,
-       0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,
-       0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,
-       0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,
-       0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,
-       // Bytes c80 - cbf
-       0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,
-       0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,
-       0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,
-       0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,
-       0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,
-       0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,
-       0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,
-       0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,
-       // Bytes cc0 - cff
-       0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,
-       0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,
-       0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,
-       0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,
-       0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,
-       0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,
-       0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,
-       0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,
-       // Bytes d00 - d3f
-       0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,
-       0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,
-       0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,
-       0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,
-       0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,
-       0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,
-       0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,
-       0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,
-       // Bytes d40 - d7f
-       0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,
-       0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,
-       0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,
-       0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,
-       0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,
-       0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,
-       0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,
-       0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,
-       // Bytes d80 - dbf
-       0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,
-       0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,
-       0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,
-       0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,
-       0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,
-       0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,
-       0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,
-       0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,
-       // Bytes dc0 - dff
-       0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,
-       0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,
-       0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,
-       0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,
-       0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,
-       0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,
-       0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,
-       0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,
-       // Bytes e00 - e3f
-       0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,
-       0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,
-       0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,
-       0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,
-       0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,
-       0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,
-       0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,
-       0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,
-       // Bytes e40 - e7f
-       0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,
-       0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,
-       0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,
-       0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,
-       0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,
-       0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,
-       0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,
-       0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,
-       // Bytes e80 - ebf
-       0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,
-       0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,
-       0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,
-       0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,
-       0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,
-       0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,
-       0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,
-       0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,
-       // Bytes ec0 - eff
-       0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,
-       0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,
-       0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,
-       0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,
-       0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,
-       0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,
-       0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,
-       0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,
-       // Bytes f00 - f3f
-       0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,
-       0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,
-       0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,
-       0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,
-       0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,
-       0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,
-       0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,
-       0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,
-       // Bytes f40 - f7f
-       0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,
-       0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,
-       0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,
-       0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,
-       0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,
-       0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,
-       0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,
-       0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,
-       // Bytes f80 - fbf
-       0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,
-       0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,
-       0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,
-       0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,
-       0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,
-       0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,
-       0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,
-       0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,
-       // Bytes fc0 - fff
-       0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,
-       0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,
-       0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,
-       0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,
-       0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,
-       0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,
-       0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,
-       0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,
-       // Bytes 1000 - 103f
-       0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,
-       0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,
-       0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,
-       0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,
-       0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,
-       0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,
-       0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,
-       0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,
-       // Bytes 1040 - 107f
-       0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,
-       0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,
-       0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,
-       0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,
-       0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,
-       0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,
-       0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,
-       0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,
-       // Bytes 1080 - 10bf
-       0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,
-       0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,
-       0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,
-       0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,
-       0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,
-       0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,
-       0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,
-       0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,
-       // Bytes 10c0 - 10ff
-       0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,
-       0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,
-       0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,
-       0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,
-       0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,
-       0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,
-       0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,
-       0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,
-       // Bytes 1100 - 113f
-       0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,
-       0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,
-       0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,
-       0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,
-       0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,
-       0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,
-       0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,
-       0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,
-       // Bytes 1140 - 117f
-       0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,
-       0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,
-       0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,
-       0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,
-       0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,
-       0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,
-       0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,
-       0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,
-       // Bytes 1180 - 11bf
-       0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,
-       0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,
-       0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,
-       0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,
-       0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,
-       0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,
-       0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,
-       0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,
-       // Bytes 11c0 - 11ff
-       0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,
-       0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,
-       0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,
-       0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,
-       0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,
-       0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,
-       0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,
-       0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,
-       // Bytes 1200 - 123f
-       0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,
-       0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,
-       0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,
-       0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,
-       0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,
-       0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,
-       0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,
-       0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,
-       // Bytes 1240 - 127f
-       0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,
-       0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,
-       0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,
-       0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,
-       0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,
-       0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,
-       0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,
-       0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,
-       // Bytes 1280 - 12bf
-       0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,
-       0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,
-       0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,
-       0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,
-       0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,
-       0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,
-       0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,
-       0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,
-       // Bytes 12c0 - 12ff
-       0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,
-       0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,
-       0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,
-       0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,
-       0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,
-       0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,
-       0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,
-       0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,
-       // Bytes 1300 - 133f
-       0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,
-       0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,
-       0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,
-       0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,
-       0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,
-       0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,
-       0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,
-       0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,
-       // Bytes 1340 - 137f
-       0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,
-       0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,
-       0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,
-       0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,
-       0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,
-       0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,
-       0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,
-       0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,
-       // Bytes 1380 - 13bf
-       0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,
-       0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,
-       0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,
-       0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,
-       0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,
-       0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,
-       0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,
-       0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,
-       // Bytes 13c0 - 13ff
-       0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,
-       0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,
-       0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,
-       0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,
-       0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,
-       0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,
-       0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,
-       0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,
-       // Bytes 1400 - 143f
-       0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,
-       0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,
-       0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,
-       0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,
-       0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,
-       0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,
-       0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,
-       0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,
-       // Bytes 1440 - 147f
-       0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,
-       0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,
-       0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,
-       0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,
-       0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,
-       0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,
-       0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,
-       0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,
-       // Bytes 1480 - 14bf
-       0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,
-       0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,
-       0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,
-       0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,
-       0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,
-       0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,
-       0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,
-       0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,
-       // Bytes 14c0 - 14ff
-       0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,
-       0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,
-       0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,
-       0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,
-       0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,
-       0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,
-       0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,
-       0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,
-       // Bytes 1500 - 153f
-       0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,
-       0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,
-       0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,
-       0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,
-       0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,
-       0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,
-       0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,
-       0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,
-       // Bytes 1540 - 157f
-       0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,
-       0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,
-       0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,
-       0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,
-       0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,
-       0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,
-       0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,
-       0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,
-       // Bytes 1580 - 15bf
-       0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,
-       0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,
-       0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,
-       0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,
-       0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,
-       0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,
-       0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,
-       0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,
-       // Bytes 15c0 - 15ff
-       0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,
-       0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,
-       0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,
-       0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,
-       0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,
-       0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,
-       0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,
-       0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,
-       // Bytes 1600 - 163f
-       0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,
-       0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,
-       0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,
-       0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,
-       0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,
-       0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,
-       0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,
-       0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,
-       // Bytes 1640 - 167f
-       0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,
-       0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,
-       0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,
-       0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,
-       0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,
-       0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,
-       0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,
-       0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,
-       // Bytes 1680 - 16bf
-       0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,
-       0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,
-       0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,
-       0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,
-       0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,
-       0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,
-       0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,
-       0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,
-       // Bytes 16c0 - 16ff
-       0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,
-       0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,
-       0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,
-       0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,
-       0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,
-       0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,
-       0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,
-       0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,
-       // Bytes 1700 - 173f
-       0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,
-       0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,
-       0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,
-       0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,
-       0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,
-       0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,
-       0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,
-       0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,
-       // Bytes 1740 - 177f
-       0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,
-       0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,
-       0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,
-       0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,
-       0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,
-       0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,
-       0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,
-       0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,
-       // Bytes 1780 - 17bf
-       0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,
-       0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,
-       0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,
-       0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,
-       0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,
-       0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,
-       0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,
-       0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,
-       // Bytes 17c0 - 17ff
-       0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,
-       0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,
-       0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,
-       0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,
-       0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,
-       0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,
-       0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,
-       0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,
-       // Bytes 1800 - 183f
-       0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,
-       0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,
-       0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,
-       0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,
-       0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,
-       0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,
-       0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,
-       0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,
-       // Bytes 1840 - 187f
-       0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,
-       0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,
-       0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,
-       0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,
-       0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,
-       0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,
-       0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,
-       0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,
-       // Bytes 1880 - 18bf
-       0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,
-       0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,
-       0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,
-       0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,
-       0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,
-       0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,
-       0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,
-       0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,
-       // Bytes 18c0 - 18ff
-       0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,
-       0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,
-       0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,
-       0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,
-       0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,
-       0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,
-       0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,
-       0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,
-       // Bytes 1900 - 193f
-       0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,
-       0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,
-       0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,
-       0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,
-       0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,
-       0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,
-       0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,
-       0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,
-       // Bytes 1940 - 197f
-       0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,
-       0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,
-       0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,
-       0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,
-       0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,
-       0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,
-       0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,
-       0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,
-       // Bytes 1980 - 19bf
-       0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
-       0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
-       0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
-       0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
-       0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
-       0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
-       0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
-       0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
-       // Bytes 19c0 - 19ff
-       0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
-       0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
-       0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
-       0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
-       0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
-       0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
-       0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
-       0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
-       // Bytes 1a00 - 1a3f
-       0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
-       0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
-       0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
-       0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
-       0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
-       0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
-       0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
-       0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
-       // Bytes 1a40 - 1a7f
-       0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
-       0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
-       0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
-       0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
-       0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
-       0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
-       0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
-       0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
-       // Bytes 1a80 - 1abf
-       0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
-       0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
-       0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
-       0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
-       0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
-       0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
-       0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
-       0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
-       // Bytes 1ac0 - 1aff
-       0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
-       0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
-       0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
-       0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
-       0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
-       0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
-       0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
-       0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
-       // Bytes 1b00 - 1b3f
-       0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
-       0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
-       0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
-       0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
-       0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
-       0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
-       0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
-       0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
-       // Bytes 1b40 - 1b7f
-       0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
-       0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
-       0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
-       0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
-       0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
-       0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
-       0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
-       0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
-       // Bytes 1b80 - 1bbf
-       0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
-       0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
-       0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
-       0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
-       0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
-       0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
-       0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
-       0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
-       // Bytes 1bc0 - 1bff
-       0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
-       0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
-       0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
-       0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
-       0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
-       0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
-       0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
-       0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
-       // Bytes 1c00 - 1c3f
-       0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
-       0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
-       0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
-       0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
-       0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
-       0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
-       0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
-       0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
-       // Bytes 1c40 - 1c7f
-       0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
-       0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
-       0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
-       0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
-       0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
-       0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
-       0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
-       0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
-       // Bytes 1c80 - 1cbf
-       0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
-       0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
-       0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
-       0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
-       0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
-       0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
-       0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
-       0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
-       // Bytes 1cc0 - 1cff
-       0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
-       0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
-       0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
-       0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
-       0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
-       0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
-       0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
-       0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
-       // Bytes 1d00 - 1d3f
-       0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
-       0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
-       0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
-       0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
-       0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
-       0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
-       0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
-       0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
-       // Bytes 1d40 - 1d7f
-       0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
-       0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
-       0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
-       0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
-       0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
-       0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
-       0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
-       0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
-       // Bytes 1d80 - 1dbf
-       0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
-       0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
-       0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
-       0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
-       0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
-       0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
-       0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
-       0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
-       // Bytes 1dc0 - 1dff
-       0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
-       0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
-       0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
-       0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
-       0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
-       0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
-       0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
-       0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
-       // Bytes 1e00 - 1e3f
-       0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
-       0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
-       0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
-       0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
-       0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
-       0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
-       0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
-       0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
-       // Bytes 1e40 - 1e7f
-       0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
-       0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
-       0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
-       0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
-       0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
-       0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
-       0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
-       0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
-       // Bytes 1e80 - 1ebf
-       0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
-       0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
-       0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
-       0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
-       0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
-       0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
-       0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
-       0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
-       // Bytes 1ec0 - 1eff
-       0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
-       0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
-       0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
-       0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
-       0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
-       0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
-       0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
-       0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
-       // Bytes 1f00 - 1f3f
-       0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
-       0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
-       0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
-       0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
-       0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
-       0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
-       0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
-       0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
-       // Bytes 1f40 - 1f7f
-       0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
-       0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
-       0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
-       0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
-       0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
-       0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
-       0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
-       0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
-       // Bytes 1f80 - 1fbf
-       0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
-       0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
-       0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
-       0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
-       0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
-       0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
-       0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
-       0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
-       // Bytes 1fc0 - 1fff
-       0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
-       0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
-       0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
-       0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
-       0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
-       0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
-       0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
-       0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
-       // Bytes 2000 - 203f
-       0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
-       0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
-       0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
-       0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
-       0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
-       0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
-       0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
-       0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
-       // Bytes 2040 - 207f
-       0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
-       0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
-       0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
-       0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
-       0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
-       0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
-       0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
-       0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
-       // Bytes 2080 - 20bf
-       0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
-       0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
-       0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
-       0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
-       0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
-       0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
-       0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
-       0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
-       // Bytes 20c0 - 20ff
-       0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
-       0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
-       0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
-       0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
-       0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
-       0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
-       0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
-       0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
-       // Bytes 2100 - 213f
-       0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
-       0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
-       0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
-       0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
-       0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
-       0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
-       0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
-       0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
-       // Bytes 2140 - 217f
-       0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
-       0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
-       0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
-       0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
-       0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
-       0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
-       0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
-       0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
-       // Bytes 2180 - 21bf
-       0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
-       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
-       0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
-       0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
-       0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
-       0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
-       0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
-       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
-       // Bytes 21c0 - 21ff
-       0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
-       0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
-       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
-       0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
-       0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
-       0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
-       0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
-       0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
-       // Bytes 2200 - 223f
-       0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
-       0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
-       0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
-       0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
-       0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
-       0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
-       0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
-       0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
-       // Bytes 2240 - 227f
-       0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
-       0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
-       0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
-       0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
-       0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
-       0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
-       0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
-       0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
-       // Bytes 2280 - 22bf
-       0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
-       0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
-       0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
-       0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
-       0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
-       0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
-       0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
-       0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
-       // Bytes 22c0 - 22ff
-       0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
-       0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
-       0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
-       0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
-       0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
-       0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
-       0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
-       0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
-       // Bytes 2300 - 233f
-       0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
-       0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
-       0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
-       0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
-       0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
-       0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
-       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
-       0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
-       // Bytes 2340 - 237f
-       0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
-       0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
-       0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
-       0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
-       0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
-       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
-       0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
-       0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
-       // Bytes 2380 - 23bf
-       0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
-       0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
-       0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
-       0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
-       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
-       0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
-       0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
-       0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
-       // Bytes 23c0 - 23ff
-       0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
-       0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
-       0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
-       0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
-       0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
-       0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
-       0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
-       0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
-       // Bytes 2400 - 243f
-       0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
-       0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
-       0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
-       0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
-       0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
-       0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
-       0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
-       0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
-       // Bytes 2440 - 247f
-       0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
-       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
-       0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
-       0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
-       0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
-       0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
-       0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
-       0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
-       // Bytes 2480 - 24bf
-       0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
-       0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
-       0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
-       0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
-       0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
-       0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
-       0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
-       0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
-       // Bytes 24c0 - 24ff
-       0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
-       0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
-       0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
-       0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
-       0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
-       0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
-       0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
-       0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
-       // Bytes 2500 - 253f
-       0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
-       0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
-       0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
-       0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
-       0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
-       0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
-       0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
-       0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
-       // Bytes 2540 - 257f
-       0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
-       0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
-       0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
-       0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
-       0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
-       0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
-       0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
-       0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
-       // Bytes 2580 - 25bf
-       0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
-       0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
-       0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
-       0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
-       0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
-       0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
-       0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
-       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
-       // Bytes 25c0 - 25ff
-       0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
-       0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
-       0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
-       0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
-       0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
-       0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
-       0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
-       0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
-       // Bytes 2600 - 263f
-       0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
-       0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
-       0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
-       0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
-       0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
-       0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
-       0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
-       0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
-       // Bytes 2640 - 267f
-       0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
-       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
-       0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
-       0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
-       0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
-       0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
-       0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
-       0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
-       // Bytes 2680 - 26bf
-       0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
-       0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
-       0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
-       0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
-       0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
-       0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
-       0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
-       0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
-       // Bytes 26c0 - 26ff
-       0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
-       0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
-       0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
-       0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
-       0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
-       0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
-       0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
-       0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,
-       // Bytes 2700 - 273f
-       0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,
-       0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,
-       0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,
-       0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,
-       0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,
-       0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,
-       0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,
-       0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
-       // Bytes 2740 - 277f
-       0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,
-       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,
-       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,
-       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
-       0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
-       0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
-       0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,
-       0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,
-       // Bytes 2780 - 27bf
-       0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
-       0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,
-       0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,
-       0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,
-       0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
-       0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,
-       0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,
-       0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,
-       // Bytes 27c0 - 27ff
-       0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,
-       0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,
-       0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,
-       0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,
-       0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,
-       0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,
-       0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,
-       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,
-       // Bytes 2800 - 283f
-       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
-       0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,
-       0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
-       0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,
-       0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,
-       0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,
-       0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,
-       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,
-       // Bytes 2840 - 287f
-       0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
-       0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,
-       0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,
-       0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,
-       0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,
-       0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
-       0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,
-       0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,
-       // Bytes 2880 - 28bf
-       0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,
-       0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
-       0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,
-       0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,
-       0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,
-       0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,
-       0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
-       0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,
-       // Bytes 28c0 - 28ff
-       0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,
-       0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,
-       0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,
-       0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,
-       0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,
-       0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,
-       0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
-       0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,
-       // Bytes 2900 - 293f
-       0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,
-       0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,
-       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,
-       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,
-       0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,
-       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,
-       0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,
-       0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,
-       // Bytes 2940 - 297f
-       0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
-       0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,
-       0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,
-       0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,
-       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,
-       0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,
-       0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,
-       0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,
-       // Bytes 2980 - 29bf
-       0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,
-       0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,
-       0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
-       0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,
-       0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
-       0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,
-       0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,
-       0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,
-       // Bytes 29c0 - 29ff
-       0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
-       0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,
-       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,
-       0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,
-       0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,
-       0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,
-       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,
-       // Bytes 2a00 - 2a3f
-       0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,
-       0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,
-       0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,
-       0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,
-       0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,
-       0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,
-       0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,
-       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       // Bytes 2a40 - 2a7f
-       0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,
-       0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
-       0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
-       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
-       0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,
-       0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,
-       0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,
-       0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,
-       // Bytes 2a80 - 2abf
-       0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,
-       0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,
-       0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,
-       0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,
-       0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,
-       0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,
-       0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,
-       0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
-       // Bytes 2ac0 - 2aff
-       0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
-       0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
-       0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,
-       0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
-       0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,
-       0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,
-       0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,
-       0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,
-       // Bytes 2b00 - 2b3f
-       0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,
-       0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,
-       0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
-       0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,
-       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,
-       0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,
-       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,
-       0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,
-       // Bytes 2b40 - 2b7f
-       0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,
-       0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,
-       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
-       0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,
-       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,
-       0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,
-       0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
-       0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,
-       // Bytes 2b80 - 2bbf
-       0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,
-       0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,
-       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,
-       0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,
-       0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,
-       0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,
-       0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,
-       // Bytes 2bc0 - 2bff
-       0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
-       0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,
-       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,
-       0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,
-       0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,
-       0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
-       // Bytes 2c00 - 2c3f
-       0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,
-       0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,
-       0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,
-       0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,
-       0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,
-       0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,
-       0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
-       0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,
-       // Bytes 2c40 - 2c7f
-       0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,
-       0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,
-       0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
-       0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,
-       0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
-       0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,
-       0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,
-       0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,
-       // Bytes 2c80 - 2cbf
-       0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,
-       0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,
-       0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,
-       0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,
-       0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,
-       0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,
-       0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,
-       0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,
-       // Bytes 2cc0 - 2cff
-       0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,
-       0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
-       0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
-       0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
-       0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
-       0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
-       0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
-       0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,
-       // Bytes 2d00 - 2d3f
-       0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
-       0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,
-       0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
-       0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,
-       0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,
-       0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       // Bytes 2d40 - 2d7f
-       0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
-       0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,
-       // Bytes 2d80 - 2dbf
-       0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,
-       0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,
-       0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,
-       0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,
-       0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,
-       0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,
-       0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,
-       0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,
-       // Bytes 2dc0 - 2dff
-       0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,
-       0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,
-       0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,
-       0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,
-       0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,
-       0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,
-       0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,
-       0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,
-       // Bytes 2e00 - 2e3f
-       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,
-       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,
-       0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
-       0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,
-       // Bytes 2e40 - 2e7f
-       0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,
-       0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,
-       // Bytes 2e80 - 2ebf
-       0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,
-       0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,
-       0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,
-       0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,
-       0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,
-       0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
-       0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,
-       0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
-       // Bytes 2ec0 - 2eff
-       0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,
-       0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,
-       0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,
-       0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,
-       0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,
-       0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
-       0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,
-       0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,
-       // Bytes 2f00 - 2f3f
-       0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,
-       0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
-       0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,
-       0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
-       0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
-       0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,
-       0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
-       0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,
-       // Bytes 2f40 - 2f7f
-       0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
-       0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
-       0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,
-       0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,
-       0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,
-       0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,
-       0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,
-       0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,
-       // Bytes 2f80 - 2fbf
-       0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,
-       0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,
-       0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,
-       0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,
-       0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,
-       0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,
-       0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,
-       0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,
-       // Bytes 2fc0 - 2fff
-       0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,
-       0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,
-       0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,
-       0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,
-       0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,
-       0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,
-       0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,
-       0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,
-       // Bytes 3000 - 303f
-       0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,
-       0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,
-       0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,
-       0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,
-       0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,
-       0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,
-       0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,
-       0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,
-       // Bytes 3040 - 307f
-       0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,
-       0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,
-       0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,
-       0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,
-       0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,
-       0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,
-       0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,
-       0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,
-       // Bytes 3080 - 30bf
-       0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,
-       0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,
-       0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,
-       0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,
-       0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,
-       0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,
-       0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,
-       0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,
-       // Bytes 30c0 - 30ff
-       0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,
-       0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,
-       0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,
-       0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,
-       0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,
-       0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,
-       0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,
-       0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,
-       // Bytes 3100 - 313f
-       0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,
-       0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,
-       0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,
-       0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,
-       0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,
-       0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,
-       0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,
-       0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,
-       // Bytes 3140 - 317f
-       0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,
-       0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,
-       0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,
-       0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,
-       0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,
-       0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,
-       0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,
-       0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,
-       // Bytes 3180 - 31bf
-       0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,
-       0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,
-       0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,
-       0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,
-       0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,
-       0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,
-       0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,
-       0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,
-       // Bytes 31c0 - 31ff
-       0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,
-       0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,
-       0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,
-       0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,
-       0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,
-       0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,
-       0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,
-       0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,
-       // Bytes 3200 - 323f
-       0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,
-       0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,
-       0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,
-       0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,
-       0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,
-       0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,
-       0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,
-       0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,
-       // Bytes 3240 - 327f
-       0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,
-       0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,
-       0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,
-       0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,
-       0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,
-       0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,
-       0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,
-       0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,
-       // Bytes 3280 - 32bf
-       0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,
-       0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,
-       0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,
-       0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,
-       0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,
-       0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,
-       0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,
-       0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,
-       // Bytes 32c0 - 32ff
-       0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,
-       0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,
-       0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,
-       0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,
-       0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,
-       0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,
-       0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,
-       0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,
-       // Bytes 3300 - 333f
-       0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,
-       0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,
-       0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,
-       0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,
-       0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,
-       0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,
-       0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,
-       0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,
-       // Bytes 3340 - 337f
-       0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,
-       0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,
-       0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,
-       0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,
-       0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,
-       0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,
-       0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,
-       0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,
-       // Bytes 3380 - 33bf
-       0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,
-       0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,
-       0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,
-       0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,
-       0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,
-       0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,
-       0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,
-       0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,
-       // Bytes 33c0 - 33ff
-       0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,
-       0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,
-       0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,
-       0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,
-       0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,
-       0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,
-       0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,
-       0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,
-       // Bytes 3400 - 343f
-       0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,
-       0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,
-       0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,
-       0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,
-       0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,
-       0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,
-       0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,
-       0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,
-       // Bytes 3440 - 347f
-       0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,
-       0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,
-       0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,
-       0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,
-       0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,
-       0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,
-       0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,
-       0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,
-       // Bytes 3480 - 34bf
-       0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,
-       0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,
-       0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,
-       0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,
-       0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,
-       0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,
-       0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,
-       0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,
-       // Bytes 34c0 - 34ff
-       0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,
-       0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,
-       0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,
-       0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,
-       0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,
-       0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,
-       0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,
-       0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,
-       // Bytes 3500 - 353f
-       0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,
-       0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,
-       0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,
-       0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,
-       0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,
-       0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,
-       0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,
-       0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,
-       // Bytes 3540 - 357f
-       0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,
-       0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,
-       0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,
-       0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,
-       0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,
-       0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,
-       0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,
-       0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,
-       // Bytes 3580 - 35bf
-       0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,
-       0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,
-       0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,
-       0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,
-       0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,
-       0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,
-       0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,
-       0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,
-       // Bytes 35c0 - 35ff
-       0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,
-       0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,
-       0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,
-       0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,
-       0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,
-       0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,
-       0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,
-       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,
-       // Bytes 3600 - 363f
-       0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,
-       0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,
-       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,
-       0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,
-       0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,
-       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,
-       0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,
-       0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,
-       // Bytes 3640 - 367f
-       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,
-       0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,
-       0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,
-       0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,
-       0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,
-       0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,
-       0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,
-       0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,
-       // Bytes 3680 - 36bf
-       0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,
-       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,
-       0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,
-       0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,
-       0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,
-       0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,
-       0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,
-       0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,
-       // Bytes 36c0 - 36ff
-       0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,
-       0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,
-       0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,
-       0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,
-       0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,
-       0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,
-       0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,
-       0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,
-       // Bytes 3700 - 373f
-       0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,
-       0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,
-       0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,
-       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,
-       0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,
-       0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,
-       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,
-       0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,
-       // Bytes 3740 - 377f
-       0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,
-       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,
-       0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,
-       0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,
-       0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,
-       0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,
-       0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,
-       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,
-       // Bytes 3780 - 37bf
-       0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,
-       0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,
-       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,
-       0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,
-       0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,
-       0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,
-       0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,
-       0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,
-       // Bytes 37c0 - 37ff
-       0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,
-       0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,
-       0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,
-       0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,
-       0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,
-       0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,
-       0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,
-       0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,
-       // Bytes 3800 - 383f
-       0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,
-       0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,
-       0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,
-       0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,
-       0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,
-       0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,
-       0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,
-       0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,
-       // Bytes 3840 - 387f
-       0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,
-       0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,
-       0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,
-       0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,
-       0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,
-       0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,
-       0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
-       0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
-       // Bytes 3880 - 38bf
-       0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,
-       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,
-       0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,
-       0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,
-       0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,
-       0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,
-       0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,
-       0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,
-       // Bytes 38c0 - 38ff
-       0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,
-       0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,
-       0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,
-       0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,
-       0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,
-       0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,
-       0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,
-       0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,
-       // Bytes 3900 - 393f
-       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,
-       0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,
-       0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,
-       0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
-       0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
-       0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,
-       0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,
-       0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,
-       // Bytes 3940 - 397f
-       0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,
-       0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,
-       0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,
-       0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
-       0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,
-       0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,
-       0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,
-       0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
-       // Bytes 3980 - 39bf
-       0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,
-       0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,
-       0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,
-       0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,
-       0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,
-       0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,
-       0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,
-       0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,
-       // Bytes 39c0 - 39ff
-       0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
-       0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,
-       0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,
-       0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,
-       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,
-       0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
-       0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,
-       0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
-       // Bytes 3a00 - 3a3f
-       0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
-       0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,
-       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,
-       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,
-       0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,
-       0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,
-       0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,
-       0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
-       // Bytes 3a40 - 3a7f
-       0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,
-       0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,
-       0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,
-       0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,
-       0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,
-       0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,
-       0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,
-       0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,
-       // Bytes 3a80 - 3abf
-       0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,
-       0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,
-       0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,
-       0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,
-       0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,
-       0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
-       0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,
-       0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,
-       // Bytes 3ac0 - 3aff
-       0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,
-       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
-       0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,
-       0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,
-       0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,
-       0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,
-       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,
-       0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,
-       // Bytes 3b00 - 3b3f
-       0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
-       0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,
-       0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
-       0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,
-       0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,
-       0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,
-       0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,
-       0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,
-       // Bytes 3b40 - 3b7f
-       0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,
-       0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,
-       0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,
-       0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,
-       0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,
-       0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,
-       0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
-       0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,
-       // Bytes 3b80 - 3bbf
-       0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,
-       0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,
-       0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,
-       0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,
-       0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,
-       0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,
-       0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,
-       0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,
-       // Bytes 3bc0 - 3bff
-       0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,
-       0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
-       0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
-       0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,
-       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,
-       0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,
-       0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,
-       0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,
-       // Bytes 3c00 - 3c3f
-       0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
-       0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
-       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,
-       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,
-       0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,
-       0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,
-       0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,
-       0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
-       // Bytes 3c40 - 3c7f
-       0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
-       0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,
-       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,
-       0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,
-       0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,
-       0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,
-       0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
-       0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
-       // Bytes 3c80 - 3cbf
-       0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,
-       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,
-       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,
-       0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,
-       0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,
-       0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
-       0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
-       0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,
-       // Bytes 3cc0 - 3cff
-       0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,
-       0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,
-       0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,
-       0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       // Bytes 3d00 - 3d3f
-       0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
-       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       // Bytes 3d40 - 3d7f
-       0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
-       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
-       // Bytes 3d80 - 3dbf
-       0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       // Bytes 3dc0 - 3dff
-       0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
-       // Bytes 3e00 - 3e3f
-       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       // Bytes 3e40 - 3e7f
-       0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
-       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
-       // Bytes 3e80 - 3ebf
-       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
-       0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
-       0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
-       0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
-       // Bytes 3ec0 - 3eff
-       0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
-       0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
-       0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
-       0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,
-       0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,
-       0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,
-       0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,
-       0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,
-       // Bytes 3f00 - 3f3f
-       0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 3f40 - 3f7f
-       0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 3f80 - 3fbf
-       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,
-       // Bytes 3fc0 - 3fff
-       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 4000 - 403f
-       0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 4040 - 407f
-       0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 4080 - 40bf
-       0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,
-       0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
-       // Bytes 40c0 - 40ff
-       0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
-       0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
-       0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,
-       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,
-       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
-       // Bytes 4100 - 413f
-       0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,
-       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
-       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,
-       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
-       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       // Bytes 4140 - 417f
-       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,
-       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,
-       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,
-       // Bytes 4180 - 41bf
-       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
-       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,
-       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
-       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
-       // Bytes 41c0 - 41ff
-       0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,
-       0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,
-       0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
-       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
-       0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
-       0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,
-       0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
-       // Bytes 4200 - 423f
-       0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
-       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
-       0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
-       0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,
-       0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
-       0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
-       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
-       0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,
-       // Bytes 4240 - 427f
-       0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,
-       0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,
-       0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,
-       0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,
-       0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,
-       0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,
-       0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,
-       0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,
-       // Bytes 4280 - 42bf
-       0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,
-       0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,
-       0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,
-       0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,
-       0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,
-       0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,
-       0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,
-       0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,
-       // Bytes 42c0 - 42ff
-       0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,
-       0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,
-       0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,
-       0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,
-       0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,
-       0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,
-       0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,
-       0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,
-       // Bytes 4300 - 433f
-       0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
-       0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,
-       0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,
-       0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
-       0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,
-       0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,
-       0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
-       0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,
-       // Bytes 4340 - 437f
-       0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,
-       0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,
-       0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,
-       0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
-       0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,
-       0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,
-       // Bytes 4380 - 43bf
-       0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,
-       0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,
-       0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,
-       0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
-       0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,
-       // Bytes 43c0 - 43ff
-       0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
-       0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,
-       0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
-       0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,
-       0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,
-       0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,
-       0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,
-       // Bytes 4400 - 443f
-       0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,
-       0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,
-       0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,
-       0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
-       0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,
-       0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,
-       0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,
-       0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,
-       // Bytes 4440 - 447f
-       0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,
-       0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,
-       0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,
-       0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,
-       0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,
-       0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,
-       0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,
-       0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,
-       // Bytes 4480 - 44bf
-       0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,
-       0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
-       0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,
-       0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,
-       0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,
-       0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,
-       0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,
-       0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,
-       // Bytes 44c0 - 44ff
-       0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,
-       0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,
-       0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,
-       0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,
-       0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,
-       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,
-       0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,
-       0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,
-       // Bytes 4500 - 453f
-       0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,
-       0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
-       0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
-       0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,
-       // Bytes 4540 - 457f
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,
-       0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,
-       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,
-       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,
-       0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,
-       // Bytes 4580 - 45bf
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,
-       0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,
-       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,
-       0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,
-       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,
-       // Bytes 45c0 - 45ff
-       0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,
-       0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,
-       0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,
-       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,
-       0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
-       0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
-       0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,
-       0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,
-       // Bytes 4600 - 463f
-       0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,
-       0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
-       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,
-       0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,
-       0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,
-       0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
-       0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,
-       0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
-       // Bytes 4640 - 467f
-       0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
-       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,
-       0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
-       0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,
-       0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
-       0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,
-       0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
-       0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
-       // Bytes 4680 - 46bf
-       0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,
-       0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,
-       0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,
-       0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,
-       0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,
-       0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,
-       0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,
-       0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,
-       // Bytes 46c0 - 46ff
-       0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,
-       0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,
-       0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,
-       0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,
-       0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,
-       0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,
-       0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,
-       0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,
-       // Bytes 4700 - 473f
-       0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,
-       0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,
-       0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,
-       0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,
-       0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,
-       0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,
-       0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,
-       0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,
-       // Bytes 4740 - 477f
-       0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,
-       0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,
-       0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,
-       0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,
-       0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,
-       0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,
-       0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,
-       0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,
-       // Bytes 4780 - 47bf
-       0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,
-       0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,
-       0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,
-       0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,
-       0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,
-       0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,
-       0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
-       0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,
-       // Bytes 47c0 - 47ff
-       0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,
-       0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
-       0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,
-       0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,
-       0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
-       0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,
-       0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,
-       0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,
-       // Bytes 4800 - 483f
-       0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,
-       0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,
-       0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,
-       0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,
-       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,
-       0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,
-       0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,
-       0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,
-       // Bytes 4840 - 487f
-       0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,
-       0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,
-       0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,
-       0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,
-       0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,
-       0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,
-       0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,
-       0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,
-       // Bytes 4880 - 48bf
-       0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,
-       0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,
-       0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       // Bytes 48c0 - 48ff
-       0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       // Bytes 4900 - 493f
-       0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       // Bytes 4940 - 497f
-       0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
-       0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
-       // Bytes 4980 - 49bf
-       0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
-       0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
-       0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
-       0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
-       0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
-       0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,
-       0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,
-       0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,
-       // Bytes 49c0 - 49ff
-       0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,
-       0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,
-       0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,
-       0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,
-       0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,
-       0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,
-       0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,
-       0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,
-       // Bytes 4a00 - 4a3f
-       0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,
-       0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,
-       0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,
-       0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,
-       0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,
-       0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,
-       0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,
-       0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,
-       // Bytes 4a40 - 4a7f
-       0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,
-       0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,
-       0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,
-       0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,
-       0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,
-       0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,
-       0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,
-       0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,
-       // Bytes 4a80 - 4abf
-       0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,
-       0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,
-       0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,
-       0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,
-       0x01,
-}
-
-// lookup returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return nfcValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = nfcIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return nfcValues[c0]
-       }
-       i := nfcIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// lookupString returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return nfcValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := nfcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = nfcIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return nfcValues[c0]
-       }
-       i := nfcIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = nfcIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = nfcIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// nfcTrie. Total size: 10442 bytes (10.20 KiB). Checksum: 4ba400a9d8208e03.
-type nfcTrie struct{}
-
-func newNfcTrie(i int) *nfcTrie {
-       return &nfcTrie{}
-}
-
-// lookupValue determines the type of block n and looks up the value for b.
-func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
-       switch {
-       case n < 45:
-               return uint16(nfcValues[n<<6+uint32(b)])
-       default:
-               n -= 45
-               return uint16(nfcSparse.lookup(n, b))
-       }
-}
-
-// nfcValues: 47 blocks, 3008 entries, 6016 bytes
-// The third block is the zero block.
-var nfcValues = [3008]uint16{
-       // Block 0x0, offset 0x0
-       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
-       // Block 0x1, offset 0x40
-       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
-       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
-       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
-       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
-       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
-       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
-       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
-       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
-       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
-       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
-       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
-       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
-       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
-       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
-       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
-       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
-       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
-       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
-       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
-       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
-       // Block 0x4, offset 0x100
-       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
-       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
-       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
-       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
-       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
-       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
-       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
-       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
-       0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,
-       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
-       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,
-       // Block 0x5, offset 0x140
-       0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
-       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,
-       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
-       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
-       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
-       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
-       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
-       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
-       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
-       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
-       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,
-       // Block 0x6, offset 0x180
-       0x184: 0x8100, 0x185: 0x8100,
-       0x186: 0x8100,
-       0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
-       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
-       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
-       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
-       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
-       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
-       0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,
-       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
-       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
-       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
-       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
-       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
-       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
-       0x1de: 0x305a, 0x1df: 0x3366,
-       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
-       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
-       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
-       // Block 0x8, offset 0x200
-       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
-       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
-       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
-       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
-       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
-       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
-       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
-       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
-       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
-       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
-       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
-       // Block 0x9, offset 0x240
-       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
-       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
-       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
-       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
-       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
-       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
-       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
-       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
-       0x274: 0x0170,
-       0x27a: 0x8100,
-       0x27e: 0x0037,
-       // Block 0xa, offset 0x280
-       0x284: 0x8100, 0x285: 0x35a1,
-       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
-       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
-       0x295: 0xa000, 0x297: 0xa000,
-       0x299: 0xa000,
-       0x29f: 0xa000, 0x2a1: 0xa000,
-       0x2a5: 0xa000, 0x2a9: 0xa000,
-       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
-       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
-       0x2b7: 0xa000, 0x2b9: 0xa000,
-       0x2bf: 0xa000,
-       // Block 0xb, offset 0x2c0
-       0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,
-       0x2c6: 0xa000, 0x2c7: 0x3709,
-       0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,
-       0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
-       0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,
-       0x2de: 0xa000, 0x2e3: 0xa000,
-       0x2e7: 0xa000,
-       0x2eb: 0xa000, 0x2ed: 0xa000,
-       0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
-       0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,
-       0x2fe: 0xa000,
-       // Block 0xc, offset 0x300
-       0x301: 0x3733, 0x302: 0x37b7,
-       0x310: 0x370f, 0x311: 0x3793,
-       0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,
-       0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,
-       0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,
-       0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,
-       0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,
-       0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,
-       0x338: 0x3787, 0x339: 0x380b,
-       // Block 0xd, offset 0x340
-       0x351: 0x812d,
-       0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,
-       0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,
-       0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,
-       0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,
-       0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,
-       0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,
-       0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,
-       0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,
-       // Block 0xe, offset 0x380
-       0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,
-       0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,
-       0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,
-       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,
-       0x39e: 0x8132, 0x39f: 0x812d,
-       0x3b0: 0x811e,
-       // Block 0xf, offset 0x3c0
-       0x3c5: 0xa000,
-       0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,
-       0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,
-       0x3d2: 0x2d4e,
-       0x3f4: 0x8102, 0x3f5: 0x9900,
-       0x3fa: 0xa000, 0x3fb: 0x2d56,
-       0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,
-       // Block 0x10, offset 0x400
-       0x400: 0x8132, 0x401: 0x8132, 0x402: 0x812d, 0x403: 0x8132, 0x404: 0x8132, 0x405: 0x8132,
-       0x406: 0x8132, 0x407: 0x8132, 0x408: 0x8132, 0x409: 0x8132, 0x40a: 0x812d, 0x40b: 0x8132,
-       0x40c: 0x8132, 0x40d: 0x8135, 0x40e: 0x812a, 0x40f: 0x812d, 0x410: 0x8129, 0x411: 0x8132,
-       0x412: 0x8132, 0x413: 0x8132, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132,
-       0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132,
-       0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x422: 0x8132, 0x423: 0x8132,
-       0x424: 0x8132, 0x425: 0x8132, 0x426: 0x8132, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x8132,
-       0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x8132, 0x42e: 0x8132, 0x42f: 0x8132,
-       0x430: 0x8132, 0x431: 0x8132, 0x432: 0x8132, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132,
-       0x436: 0x8133, 0x437: 0x8131, 0x438: 0x8131, 0x439: 0x812d, 0x43b: 0x8132,
-       0x43c: 0x8134, 0x43d: 0x812d, 0x43e: 0x8132, 0x43f: 0x812d,
-       // Block 0x11, offset 0x440
-       0x440: 0x2f97, 0x441: 0x32a3, 0x442: 0x2fa1, 0x443: 0x32ad, 0x444: 0x2fa6, 0x445: 0x32b2,
-       0x446: 0x2fab, 0x447: 0x32b7, 0x448: 0x38cc, 0x449: 0x3a5b, 0x44a: 0x2fc4, 0x44b: 0x32d0,
-       0x44c: 0x2fce, 0x44d: 0x32da, 0x44e: 0x2fdd, 0x44f: 0x32e9, 0x450: 0x2fd3, 0x451: 0x32df,
-       0x452: 0x2fd8, 0x453: 0x32e4, 0x454: 0x38ef, 0x455: 0x3a7e, 0x456: 0x38f6, 0x457: 0x3a85,
-       0x458: 0x3019, 0x459: 0x3325, 0x45a: 0x301e, 0x45b: 0x332a, 0x45c: 0x3904, 0x45d: 0x3a93,
-       0x45e: 0x3023, 0x45f: 0x332f, 0x460: 0x3032, 0x461: 0x333e, 0x462: 0x3050, 0x463: 0x335c,
-       0x464: 0x305f, 0x465: 0x336b, 0x466: 0x3055, 0x467: 0x3361, 0x468: 0x3064, 0x469: 0x3370,
-       0x46a: 0x3069, 0x46b: 0x3375, 0x46c: 0x30af, 0x46d: 0x33bb, 0x46e: 0x390b, 0x46f: 0x3a9a,
-       0x470: 0x30b9, 0x471: 0x33ca, 0x472: 0x30c3, 0x473: 0x33d4, 0x474: 0x30cd, 0x475: 0x33de,
-       0x476: 0x46c4, 0x477: 0x4755, 0x478: 0x3912, 0x479: 0x3aa1, 0x47a: 0x30e6, 0x47b: 0x33f7,
-       0x47c: 0x30e1, 0x47d: 0x33f2, 0x47e: 0x30eb, 0x47f: 0x33fc,
-       // Block 0x12, offset 0x480
-       0x480: 0x30f0, 0x481: 0x3401, 0x482: 0x30f5, 0x483: 0x3406, 0x484: 0x3109, 0x485: 0x341a,
-       0x486: 0x3113, 0x487: 0x3424, 0x488: 0x3122, 0x489: 0x3433, 0x48a: 0x311d, 0x48b: 0x342e,
-       0x48c: 0x3935, 0x48d: 0x3ac4, 0x48e: 0x3943, 0x48f: 0x3ad2, 0x490: 0x394a, 0x491: 0x3ad9,
-       0x492: 0x3951, 0x493: 0x3ae0, 0x494: 0x314f, 0x495: 0x3460, 0x496: 0x3154, 0x497: 0x3465,
-       0x498: 0x315e, 0x499: 0x346f, 0x49a: 0x46f1, 0x49b: 0x4782, 0x49c: 0x3997, 0x49d: 0x3b26,
-       0x49e: 0x3177, 0x49f: 0x3488, 0x4a0: 0x3181, 0x4a1: 0x3492, 0x4a2: 0x4700, 0x4a3: 0x4791,
-       0x4a4: 0x399e, 0x4a5: 0x3b2d, 0x4a6: 0x39a5, 0x4a7: 0x3b34, 0x4a8: 0x39ac, 0x4a9: 0x3b3b,
-       0x4aa: 0x3190, 0x4ab: 0x34a1, 0x4ac: 0x319a, 0x4ad: 0x34b0, 0x4ae: 0x31ae, 0x4af: 0x34c4,
-       0x4b0: 0x31a9, 0x4b1: 0x34bf, 0x4b2: 0x31ea, 0x4b3: 0x3500, 0x4b4: 0x31f9, 0x4b5: 0x350f,
-       0x4b6: 0x31f4, 0x4b7: 0x350a, 0x4b8: 0x39b3, 0x4b9: 0x3b42, 0x4ba: 0x39ba, 0x4bb: 0x3b49,
-       0x4bc: 0x31fe, 0x4bd: 0x3514, 0x4be: 0x3203, 0x4bf: 0x3519,
-       // Block 0x13, offset 0x4c0
-       0x4c0: 0x3208, 0x4c1: 0x351e, 0x4c2: 0x320d, 0x4c3: 0x3523, 0x4c4: 0x321c, 0x4c5: 0x3532,
-       0x4c6: 0x3217, 0x4c7: 0x352d, 0x4c8: 0x3221, 0x4c9: 0x353c, 0x4ca: 0x3226, 0x4cb: 0x3541,
-       0x4cc: 0x322b, 0x4cd: 0x3546, 0x4ce: 0x3249, 0x4cf: 0x3564, 0x4d0: 0x3262, 0x4d1: 0x3582,
-       0x4d2: 0x3271, 0x4d3: 0x3591, 0x4d4: 0x3276, 0x4d5: 0x3596, 0x4d6: 0x337a, 0x4d7: 0x34a6,
-       0x4d8: 0x3537, 0x4d9: 0x3573, 0x4db: 0x35d1,
-       0x4e0: 0x46a1, 0x4e1: 0x4732, 0x4e2: 0x2f83, 0x4e3: 0x328f,
-       0x4e4: 0x3878, 0x4e5: 0x3a07, 0x4e6: 0x3871, 0x4e7: 0x3a00, 0x4e8: 0x3886, 0x4e9: 0x3a15,
-       0x4ea: 0x387f, 0x4eb: 0x3a0e, 0x4ec: 0x38be, 0x4ed: 0x3a4d, 0x4ee: 0x3894, 0x4ef: 0x3a23,
-       0x4f0: 0x388d, 0x4f1: 0x3a1c, 0x4f2: 0x38a2, 0x4f3: 0x3a31, 0x4f4: 0x389b, 0x4f5: 0x3a2a,
-       0x4f6: 0x38c5, 0x4f7: 0x3a54, 0x4f8: 0x46b5, 0x4f9: 0x4746, 0x4fa: 0x3000, 0x4fb: 0x330c,
-       0x4fc: 0x2fec, 0x4fd: 0x32f8, 0x4fe: 0x38da, 0x4ff: 0x3a69,
-       // Block 0x14, offset 0x500
-       0x500: 0x38d3, 0x501: 0x3a62, 0x502: 0x38e8, 0x503: 0x3a77, 0x504: 0x38e1, 0x505: 0x3a70,
-       0x506: 0x38fd, 0x507: 0x3a8c, 0x508: 0x3091, 0x509: 0x339d, 0x50a: 0x30a5, 0x50b: 0x33b1,
-       0x50c: 0x46e7, 0x50d: 0x4778, 0x50e: 0x3136, 0x50f: 0x3447, 0x510: 0x3920, 0x511: 0x3aaf,
-       0x512: 0x3919, 0x513: 0x3aa8, 0x514: 0x392e, 0x515: 0x3abd, 0x516: 0x3927, 0x517: 0x3ab6,
-       0x518: 0x3989, 0x519: 0x3b18, 0x51a: 0x396d, 0x51b: 0x3afc, 0x51c: 0x3966, 0x51d: 0x3af5,
-       0x51e: 0x397b, 0x51f: 0x3b0a, 0x520: 0x3974, 0x521: 0x3b03, 0x522: 0x3982, 0x523: 0x3b11,
-       0x524: 0x31e5, 0x525: 0x34fb, 0x526: 0x31c7, 0x527: 0x34dd, 0x528: 0x39e4, 0x529: 0x3b73,
-       0x52a: 0x39dd, 0x52b: 0x3b6c, 0x52c: 0x39f2, 0x52d: 0x3b81, 0x52e: 0x39eb, 0x52f: 0x3b7a,
-       0x530: 0x39f9, 0x531: 0x3b88, 0x532: 0x3230, 0x533: 0x354b, 0x534: 0x3258, 0x535: 0x3578,
-       0x536: 0x3253, 0x537: 0x356e, 0x538: 0x323f, 0x539: 0x355a,
-       // Block 0x15, offset 0x540
-       0x540: 0x4804, 0x541: 0x480a, 0x542: 0x491e, 0x543: 0x4936, 0x544: 0x4926, 0x545: 0x493e,
-       0x546: 0x492e, 0x547: 0x4946, 0x548: 0x47aa, 0x549: 0x47b0, 0x54a: 0x488e, 0x54b: 0x48a6,
-       0x54c: 0x4896, 0x54d: 0x48ae, 0x54e: 0x489e, 0x54f: 0x48b6, 0x550: 0x4816, 0x551: 0x481c,
-       0x552: 0x3db8, 0x553: 0x3dc8, 0x554: 0x3dc0, 0x555: 0x3dd0,
-       0x558: 0x47b6, 0x559: 0x47bc, 0x55a: 0x3ce8, 0x55b: 0x3cf8, 0x55c: 0x3cf0, 0x55d: 0x3d00,
-       0x560: 0x482e, 0x561: 0x4834, 0x562: 0x494e, 0x563: 0x4966,
-       0x564: 0x4956, 0x565: 0x496e, 0x566: 0x495e, 0x567: 0x4976, 0x568: 0x47c2, 0x569: 0x47c8,
-       0x56a: 0x48be, 0x56b: 0x48d6, 0x56c: 0x48c6, 0x56d: 0x48de, 0x56e: 0x48ce, 0x56f: 0x48e6,
-       0x570: 0x4846, 0x571: 0x484c, 0x572: 0x3e18, 0x573: 0x3e30, 0x574: 0x3e20, 0x575: 0x3e38,
-       0x576: 0x3e28, 0x577: 0x3e40, 0x578: 0x47ce, 0x579: 0x47d4, 0x57a: 0x3d18, 0x57b: 0x3d30,
-       0x57c: 0x3d20, 0x57d: 0x3d38, 0x57e: 0x3d28, 0x57f: 0x3d40,
-       // Block 0x16, offset 0x580
-       0x580: 0x4852, 0x581: 0x4858, 0x582: 0x3e48, 0x583: 0x3e58, 0x584: 0x3e50, 0x585: 0x3e60,
-       0x588: 0x47da, 0x589: 0x47e0, 0x58a: 0x3d48, 0x58b: 0x3d58,
-       0x58c: 0x3d50, 0x58d: 0x3d60, 0x590: 0x4864, 0x591: 0x486a,
-       0x592: 0x3e80, 0x593: 0x3e98, 0x594: 0x3e88, 0x595: 0x3ea0, 0x596: 0x3e90, 0x597: 0x3ea8,
-       0x599: 0x47e6, 0x59b: 0x3d68, 0x59d: 0x3d70,
-       0x59f: 0x3d78, 0x5a0: 0x487c, 0x5a1: 0x4882, 0x5a2: 0x497e, 0x5a3: 0x4996,
-       0x5a4: 0x4986, 0x5a5: 0x499e, 0x5a6: 0x498e, 0x5a7: 0x49a6, 0x5a8: 0x47ec, 0x5a9: 0x47f2,
-       0x5aa: 0x48ee, 0x5ab: 0x4906, 0x5ac: 0x48f6, 0x5ad: 0x490e, 0x5ae: 0x48fe, 0x5af: 0x4916,
-       0x5b0: 0x47f8, 0x5b1: 0x431e, 0x5b2: 0x3691, 0x5b3: 0x4324, 0x5b4: 0x4822, 0x5b5: 0x432a,
-       0x5b6: 0x36a3, 0x5b7: 0x4330, 0x5b8: 0x36c1, 0x5b9: 0x4336, 0x5ba: 0x36d9, 0x5bb: 0x433c,
-       0x5bc: 0x4870, 0x5bd: 0x4342,
-       // Block 0x17, offset 0x5c0
-       0x5c0: 0x3da0, 0x5c1: 0x3da8, 0x5c2: 0x4184, 0x5c3: 0x41a2, 0x5c4: 0x418e, 0x5c5: 0x41ac,
-       0x5c6: 0x4198, 0x5c7: 0x41b6, 0x5c8: 0x3cd8, 0x5c9: 0x3ce0, 0x5ca: 0x40d0, 0x5cb: 0x40ee,
-       0x5cc: 0x40da, 0x5cd: 0x40f8, 0x5ce: 0x40e4, 0x5cf: 0x4102, 0x5d0: 0x3de8, 0x5d1: 0x3df0,
-       0x5d2: 0x41c0, 0x5d3: 0x41de, 0x5d4: 0x41ca, 0x5d5: 0x41e8, 0x5d6: 0x41d4, 0x5d7: 0x41f2,
-       0x5d8: 0x3d08, 0x5d9: 0x3d10, 0x5da: 0x410c, 0x5db: 0x412a, 0x5dc: 0x4116, 0x5dd: 0x4134,
-       0x5de: 0x4120, 0x5df: 0x413e, 0x5e0: 0x3ec0, 0x5e1: 0x3ec8, 0x5e2: 0x41fc, 0x5e3: 0x421a,
-       0x5e4: 0x4206, 0x5e5: 0x4224, 0x5e6: 0x4210, 0x5e7: 0x422e, 0x5e8: 0x3d80, 0x5e9: 0x3d88,
-       0x5ea: 0x4148, 0x5eb: 0x4166, 0x5ec: 0x4152, 0x5ed: 0x4170, 0x5ee: 0x415c, 0x5ef: 0x417a,
-       0x5f0: 0x3685, 0x5f1: 0x367f, 0x5f2: 0x3d90, 0x5f3: 0x368b, 0x5f4: 0x3d98,
-       0x5f6: 0x4810, 0x5f7: 0x3db0, 0x5f8: 0x35f5, 0x5f9: 0x35ef, 0x5fa: 0x35e3, 0x5fb: 0x42ee,
-       0x5fc: 0x35fb, 0x5fd: 0x8100, 0x5fe: 0x01d3, 0x5ff: 0xa100,
-       // Block 0x18, offset 0x600
-       0x600: 0x8100, 0x601: 0x35a7, 0x602: 0x3dd8, 0x603: 0x369d, 0x604: 0x3de0,
-       0x606: 0x483a, 0x607: 0x3df8, 0x608: 0x3601, 0x609: 0x42f4, 0x60a: 0x360d, 0x60b: 0x42fa,
-       0x60c: 0x3619, 0x60d: 0x3b8f, 0x60e: 0x3b96, 0x60f: 0x3b9d, 0x610: 0x36b5, 0x611: 0x36af,
-       0x612: 0x3e00, 0x613: 0x44e4, 0x616: 0x36bb, 0x617: 0x3e10,
-       0x618: 0x3631, 0x619: 0x362b, 0x61a: 0x361f, 0x61b: 0x4300, 0x61d: 0x3ba4,
-       0x61e: 0x3bab, 0x61f: 0x3bb2, 0x620: 0x36eb, 0x621: 0x36e5, 0x622: 0x3e68, 0x623: 0x44ec,
-       0x624: 0x36cd, 0x625: 0x36d3, 0x626: 0x36f1, 0x627: 0x3e78, 0x628: 0x3661, 0x629: 0x365b,
-       0x62a: 0x364f, 0x62b: 0x430c, 0x62c: 0x3649, 0x62d: 0x359b, 0x62e: 0x42e8, 0x62f: 0x0081,
-       0x632: 0x3eb0, 0x633: 0x36f7, 0x634: 0x3eb8,
-       0x636: 0x4888, 0x637: 0x3ed0, 0x638: 0x363d, 0x639: 0x4306, 0x63a: 0x366d, 0x63b: 0x4318,
-       0x63c: 0x3679, 0x63d: 0x4256, 0x63e: 0xa100,
-       // Block 0x19, offset 0x640
-       0x641: 0x3c06, 0x643: 0xa000, 0x644: 0x3c0d, 0x645: 0xa000,
-       0x647: 0x3c14, 0x648: 0xa000, 0x649: 0x3c1b,
-       0x64d: 0xa000,
-       0x660: 0x2f65, 0x661: 0xa000, 0x662: 0x3c29,
-       0x664: 0xa000, 0x665: 0xa000,
-       0x66d: 0x3c22, 0x66e: 0x2f60, 0x66f: 0x2f6a,
-       0x670: 0x3c30, 0x671: 0x3c37, 0x672: 0xa000, 0x673: 0xa000, 0x674: 0x3c3e, 0x675: 0x3c45,
-       0x676: 0xa000, 0x677: 0xa000, 0x678: 0x3c4c, 0x679: 0x3c53, 0x67a: 0xa000, 0x67b: 0xa000,
-       0x67c: 0xa000, 0x67d: 0xa000,
-       // Block 0x1a, offset 0x680
-       0x680: 0x3c5a, 0x681: 0x3c61, 0x682: 0xa000, 0x683: 0xa000, 0x684: 0x3c76, 0x685: 0x3c7d,
-       0x686: 0xa000, 0x687: 0xa000, 0x688: 0x3c84, 0x689: 0x3c8b,
-       0x691: 0xa000,
-       0x692: 0xa000,
-       0x6a2: 0xa000,
-       0x6a8: 0xa000, 0x6a9: 0xa000,
-       0x6ab: 0xa000, 0x6ac: 0x3ca0, 0x6ad: 0x3ca7, 0x6ae: 0x3cae, 0x6af: 0x3cb5,
-       0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0xa000, 0x6b5: 0xa000,
-       // Block 0x1b, offset 0x6c0
-       0x6c6: 0xa000, 0x6cb: 0xa000,
-       0x6cc: 0x3f08, 0x6cd: 0xa000, 0x6ce: 0x3f10, 0x6cf: 0xa000, 0x6d0: 0x3f18, 0x6d1: 0xa000,
-       0x6d2: 0x3f20, 0x6d3: 0xa000, 0x6d4: 0x3f28, 0x6d5: 0xa000, 0x6d6: 0x3f30, 0x6d7: 0xa000,
-       0x6d8: 0x3f38, 0x6d9: 0xa000, 0x6da: 0x3f40, 0x6db: 0xa000, 0x6dc: 0x3f48, 0x6dd: 0xa000,
-       0x6de: 0x3f50, 0x6df: 0xa000, 0x6e0: 0x3f58, 0x6e1: 0xa000, 0x6e2: 0x3f60,
-       0x6e4: 0xa000, 0x6e5: 0x3f68, 0x6e6: 0xa000, 0x6e7: 0x3f70, 0x6e8: 0xa000, 0x6e9: 0x3f78,
-       0x6ef: 0xa000,
-       0x6f0: 0x3f80, 0x6f1: 0x3f88, 0x6f2: 0xa000, 0x6f3: 0x3f90, 0x6f4: 0x3f98, 0x6f5: 0xa000,
-       0x6f6: 0x3fa0, 0x6f7: 0x3fa8, 0x6f8: 0xa000, 0x6f9: 0x3fb0, 0x6fa: 0x3fb8, 0x6fb: 0xa000,
-       0x6fc: 0x3fc0, 0x6fd: 0x3fc8,
-       // Block 0x1c, offset 0x700
-       0x714: 0x3f00,
-       0x719: 0x9903, 0x71a: 0x9903, 0x71b: 0x8100, 0x71c: 0x8100, 0x71d: 0xa000,
-       0x71e: 0x3fd0,
-       0x726: 0xa000,
-       0x72b: 0xa000, 0x72c: 0x3fe0, 0x72d: 0xa000, 0x72e: 0x3fe8, 0x72f: 0xa000,
-       0x730: 0x3ff0, 0x731: 0xa000, 0x732: 0x3ff8, 0x733: 0xa000, 0x734: 0x4000, 0x735: 0xa000,
-       0x736: 0x4008, 0x737: 0xa000, 0x738: 0x4010, 0x739: 0xa000, 0x73a: 0x4018, 0x73b: 0xa000,
-       0x73c: 0x4020, 0x73d: 0xa000, 0x73e: 0x4028, 0x73f: 0xa000,
-       // Block 0x1d, offset 0x740
-       0x740: 0x4030, 0x741: 0xa000, 0x742: 0x4038, 0x744: 0xa000, 0x745: 0x4040,
-       0x746: 0xa000, 0x747: 0x4048, 0x748: 0xa000, 0x749: 0x4050,
-       0x74f: 0xa000, 0x750: 0x4058, 0x751: 0x4060,
-       0x752: 0xa000, 0x753: 0x4068, 0x754: 0x4070, 0x755: 0xa000, 0x756: 0x4078, 0x757: 0x4080,
-       0x758: 0xa000, 0x759: 0x4088, 0x75a: 0x4090, 0x75b: 0xa000, 0x75c: 0x4098, 0x75d: 0x40a0,
-       0x76f: 0xa000,
-       0x770: 0xa000, 0x771: 0xa000, 0x772: 0xa000, 0x774: 0x3fd8,
-       0x777: 0x40a8, 0x778: 0x40b0, 0x779: 0x40b8, 0x77a: 0x40c0,
-       0x77d: 0xa000, 0x77e: 0x40c8,
-       // Block 0x1e, offset 0x780
-       0x780: 0x1377, 0x781: 0x0cfb, 0x782: 0x13d3, 0x783: 0x139f, 0x784: 0x0e57, 0x785: 0x06eb,
-       0x786: 0x08df, 0x787: 0x162b, 0x788: 0x162b, 0x789: 0x0a0b, 0x78a: 0x145f, 0x78b: 0x0943,
-       0x78c: 0x0a07, 0x78d: 0x0bef, 0x78e: 0x0fcf, 0x78f: 0x115f, 0x790: 0x1297, 0x791: 0x12d3,
-       0x792: 0x1307, 0x793: 0x141b, 0x794: 0x0d73, 0x795: 0x0dff, 0x796: 0x0eab, 0x797: 0x0f43,
-       0x798: 0x125f, 0x799: 0x1447, 0x79a: 0x1573, 0x79b: 0x070f, 0x79c: 0x08b3, 0x79d: 0x0d87,
-       0x79e: 0x0ecf, 0x79f: 0x1293, 0x7a0: 0x15c3, 0x7a1: 0x0ab3, 0x7a2: 0x0e77, 0x7a3: 0x1283,
-       0x7a4: 0x1317, 0x7a5: 0x0c23, 0x7a6: 0x11bb, 0x7a7: 0x12df, 0x7a8: 0x0b1f, 0x7a9: 0x0d0f,
-       0x7aa: 0x0e17, 0x7ab: 0x0f1b, 0x7ac: 0x1427, 0x7ad: 0x074f, 0x7ae: 0x07e7, 0x7af: 0x0853,
-       0x7b0: 0x0c8b, 0x7b1: 0x0d7f, 0x7b2: 0x0ecb, 0x7b3: 0x0fef, 0x7b4: 0x1177, 0x7b5: 0x128b,
-       0x7b6: 0x12a3, 0x7b7: 0x13c7, 0x7b8: 0x14ef, 0x7b9: 0x15a3, 0x7ba: 0x15bf, 0x7bb: 0x102b,
-       0x7bc: 0x106b, 0x7bd: 0x1123, 0x7be: 0x1243, 0x7bf: 0x147b,
-       // Block 0x1f, offset 0x7c0
-       0x7c0: 0x15cb, 0x7c1: 0x134b, 0x7c2: 0x09c7, 0x7c3: 0x0b3b, 0x7c4: 0x10db, 0x7c5: 0x119b,
-       0x7c6: 0x0eff, 0x7c7: 0x1033, 0x7c8: 0x1397, 0x7c9: 0x14e7, 0x7ca: 0x09c3, 0x7cb: 0x0a8f,
-       0x7cc: 0x0d77, 0x7cd: 0x0e2b, 0x7ce: 0x0e5f, 0x7cf: 0x1113, 0x7d0: 0x113b, 0x7d1: 0x14a7,
-       0x7d2: 0x084f, 0x7d3: 0x11a7, 0x7d4: 0x07f3, 0x7d5: 0x07ef, 0x7d6: 0x1097, 0x7d7: 0x1127,
-       0x7d8: 0x125b, 0x7d9: 0x14af, 0x7da: 0x1367, 0x7db: 0x0c27, 0x7dc: 0x0d73, 0x7dd: 0x1357,
-       0x7de: 0x06f7, 0x7df: 0x0a63, 0x7e0: 0x0b93, 0x7e1: 0x0f2f, 0x7e2: 0x0faf, 0x7e3: 0x0873,
-       0x7e4: 0x103b, 0x7e5: 0x075f, 0x7e6: 0x0b77, 0x7e7: 0x06d7, 0x7e8: 0x0deb, 0x7e9: 0x0ca3,
-       0x7ea: 0x110f, 0x7eb: 0x08c7, 0x7ec: 0x09b3, 0x7ed: 0x0ffb, 0x7ee: 0x1263, 0x7ef: 0x133b,
-       0x7f0: 0x0db7, 0x7f1: 0x13f7, 0x7f2: 0x0de3, 0x7f3: 0x0c37, 0x7f4: 0x121b, 0x7f5: 0x0c57,
-       0x7f6: 0x0fab, 0x7f7: 0x072b, 0x7f8: 0x07a7, 0x7f9: 0x07eb, 0x7fa: 0x0d53, 0x7fb: 0x10fb,
-       0x7fc: 0x11f3, 0x7fd: 0x1347, 0x7fe: 0x145b, 0x7ff: 0x085b,
-       // Block 0x20, offset 0x800
-       0x800: 0x090f, 0x801: 0x0a17, 0x802: 0x0b2f, 0x803: 0x0cbf, 0x804: 0x0e7b, 0x805: 0x103f,
-       0x806: 0x1497, 0x807: 0x157b, 0x808: 0x15cf, 0x809: 0x15e7, 0x80a: 0x0837, 0x80b: 0x0cf3,
-       0x80c: 0x0da3, 0x80d: 0x13eb, 0x80e: 0x0afb, 0x80f: 0x0bd7, 0x810: 0x0bf3, 0x811: 0x0c83,
-       0x812: 0x0e6b, 0x813: 0x0eb7, 0x814: 0x0f67, 0x815: 0x108b, 0x816: 0x112f, 0x817: 0x1193,
-       0x818: 0x13db, 0x819: 0x126b, 0x81a: 0x1403, 0x81b: 0x147f, 0x81c: 0x080f, 0x81d: 0x083b,
-       0x81e: 0x0923, 0x81f: 0x0ea7, 0x820: 0x12f3, 0x821: 0x133b, 0x822: 0x0b1b, 0x823: 0x0b8b,
-       0x824: 0x0c4f, 0x825: 0x0daf, 0x826: 0x10d7, 0x827: 0x0f23, 0x828: 0x073b, 0x829: 0x097f,
-       0x82a: 0x0a63, 0x82b: 0x0ac7, 0x82c: 0x0b97, 0x82d: 0x0f3f, 0x82e: 0x0f5b, 0x82f: 0x116b,
-       0x830: 0x118b, 0x831: 0x1463, 0x832: 0x14e3, 0x833: 0x14f3, 0x834: 0x152f, 0x835: 0x0753,
-       0x836: 0x107f, 0x837: 0x144f, 0x838: 0x14cb, 0x839: 0x0baf, 0x83a: 0x0717, 0x83b: 0x0777,
-       0x83c: 0x0a67, 0x83d: 0x0a87, 0x83e: 0x0caf, 0x83f: 0x0d73,
-       // Block 0x21, offset 0x840
-       0x840: 0x0ec3, 0x841: 0x0fcb, 0x842: 0x1277, 0x843: 0x1417, 0x844: 0x1623, 0x845: 0x0ce3,
-       0x846: 0x14a3, 0x847: 0x0833, 0x848: 0x0d2f, 0x849: 0x0d3b, 0x84a: 0x0e0f, 0x84b: 0x0e47,
-       0x84c: 0x0f4b, 0x84d: 0x0fa7, 0x84e: 0x1027, 0x84f: 0x110b, 0x850: 0x153b, 0x851: 0x07af,
-       0x852: 0x0c03, 0x853: 0x14b3, 0x854: 0x0767, 0x855: 0x0aab, 0x856: 0x0e2f, 0x857: 0x13df,
-       0x858: 0x0b67, 0x859: 0x0bb7, 0x85a: 0x0d43, 0x85b: 0x0f2f, 0x85c: 0x14bb, 0x85d: 0x0817,
-       0x85e: 0x08ff, 0x85f: 0x0a97, 0x860: 0x0cd3, 0x861: 0x0d1f, 0x862: 0x0d5f, 0x863: 0x0df3,
-       0x864: 0x0f47, 0x865: 0x0fbb, 0x866: 0x1157, 0x867: 0x12f7, 0x868: 0x1303, 0x869: 0x1457,
-       0x86a: 0x14d7, 0x86b: 0x0883, 0x86c: 0x0e4b, 0x86d: 0x0903, 0x86e: 0x0ec7, 0x86f: 0x0f6b,
-       0x870: 0x1287, 0x871: 0x14bf, 0x872: 0x15ab, 0x873: 0x15d3, 0x874: 0x0d37, 0x875: 0x0e27,
-       0x876: 0x11c3, 0x877: 0x10b7, 0x878: 0x10c3, 0x879: 0x10e7, 0x87a: 0x0f17, 0x87b: 0x0e9f,
-       0x87c: 0x1363, 0x87d: 0x0733, 0x87e: 0x122b, 0x87f: 0x081b,
-       // Block 0x22, offset 0x880
-       0x880: 0x080b, 0x881: 0x0b0b, 0x882: 0x0c2b, 0x883: 0x10f3, 0x884: 0x0a53, 0x885: 0x0e03,
-       0x886: 0x0cef, 0x887: 0x13e7, 0x888: 0x12e7, 0x889: 0x14ab, 0x88a: 0x1323, 0x88b: 0x0b27,
-       0x88c: 0x0787, 0x88d: 0x095b, 0x890: 0x09af,
-       0x892: 0x0cdf, 0x895: 0x07f7, 0x896: 0x0f1f, 0x897: 0x0fe3,
-       0x898: 0x1047, 0x899: 0x1063, 0x89a: 0x1067, 0x89b: 0x107b, 0x89c: 0x14fb, 0x89d: 0x10eb,
-       0x89e: 0x116f, 0x8a0: 0x128f, 0x8a2: 0x1353,
-       0x8a5: 0x1407, 0x8a6: 0x1433,
-       0x8aa: 0x154f, 0x8ab: 0x1553, 0x8ac: 0x1557, 0x8ad: 0x15bb, 0x8ae: 0x142b, 0x8af: 0x14c7,
-       0x8b0: 0x0757, 0x8b1: 0x077b, 0x8b2: 0x078f, 0x8b3: 0x084b, 0x8b4: 0x0857, 0x8b5: 0x0897,
-       0x8b6: 0x094b, 0x8b7: 0x0967, 0x8b8: 0x096f, 0x8b9: 0x09ab, 0x8ba: 0x09b7, 0x8bb: 0x0a93,
-       0x8bc: 0x0a9b, 0x8bd: 0x0ba3, 0x8be: 0x0bcb, 0x8bf: 0x0bd3,
-       // Block 0x23, offset 0x8c0
-       0x8c0: 0x0beb, 0x8c1: 0x0c97, 0x8c2: 0x0cc7, 0x8c3: 0x0ce7, 0x8c4: 0x0d57, 0x8c5: 0x0e1b,
-       0x8c6: 0x0e37, 0x8c7: 0x0e67, 0x8c8: 0x0ebb, 0x8c9: 0x0edb, 0x8ca: 0x0f4f, 0x8cb: 0x102f,
-       0x8cc: 0x104b, 0x8cd: 0x1053, 0x8ce: 0x104f, 0x8cf: 0x1057, 0x8d0: 0x105b, 0x8d1: 0x105f,
-       0x8d2: 0x1073, 0x8d3: 0x1077, 0x8d4: 0x109b, 0x8d5: 0x10af, 0x8d6: 0x10cb, 0x8d7: 0x112f,
-       0x8d8: 0x1137, 0x8d9: 0x113f, 0x8da: 0x1153, 0x8db: 0x117b, 0x8dc: 0x11cb, 0x8dd: 0x11ff,
-       0x8de: 0x11ff, 0x8df: 0x1267, 0x8e0: 0x130f, 0x8e1: 0x1327, 0x8e2: 0x135b, 0x8e3: 0x135f,
-       0x8e4: 0x13a3, 0x8e5: 0x13a7, 0x8e6: 0x13ff, 0x8e7: 0x1407, 0x8e8: 0x14db, 0x8e9: 0x151f,
-       0x8ea: 0x1537, 0x8eb: 0x0b9b, 0x8ec: 0x171e, 0x8ed: 0x11e3,
-       0x8f0: 0x06df, 0x8f1: 0x07e3, 0x8f2: 0x07a3, 0x8f3: 0x074b, 0x8f4: 0x078b, 0x8f5: 0x07b7,
-       0x8f6: 0x0847, 0x8f7: 0x0863, 0x8f8: 0x094b, 0x8f9: 0x0937, 0x8fa: 0x0947, 0x8fb: 0x0963,
-       0x8fc: 0x09af, 0x8fd: 0x09bf, 0x8fe: 0x0a03, 0x8ff: 0x0a0f,
-       // Block 0x24, offset 0x900
-       0x900: 0x0a2b, 0x901: 0x0a3b, 0x902: 0x0b23, 0x903: 0x0b2b, 0x904: 0x0b5b, 0x905: 0x0b7b,
-       0x906: 0x0bab, 0x907: 0x0bc3, 0x908: 0x0bb3, 0x909: 0x0bd3, 0x90a: 0x0bc7, 0x90b: 0x0beb,
-       0x90c: 0x0c07, 0x90d: 0x0c5f, 0x90e: 0x0c6b, 0x90f: 0x0c73, 0x910: 0x0c9b, 0x911: 0x0cdf,
-       0x912: 0x0d0f, 0x913: 0x0d13, 0x914: 0x0d27, 0x915: 0x0da7, 0x916: 0x0db7, 0x917: 0x0e0f,
-       0x918: 0x0e5b, 0x919: 0x0e53, 0x91a: 0x0e67, 0x91b: 0x0e83, 0x91c: 0x0ebb, 0x91d: 0x1013,
-       0x91e: 0x0edf, 0x91f: 0x0f13, 0x920: 0x0f1f, 0x921: 0x0f5f, 0x922: 0x0f7b, 0x923: 0x0f9f,
-       0x924: 0x0fc3, 0x925: 0x0fc7, 0x926: 0x0fe3, 0x927: 0x0fe7, 0x928: 0x0ff7, 0x929: 0x100b,
-       0x92a: 0x1007, 0x92b: 0x1037, 0x92c: 0x10b3, 0x92d: 0x10cb, 0x92e: 0x10e3, 0x92f: 0x111b,
-       0x930: 0x112f, 0x931: 0x114b, 0x932: 0x117b, 0x933: 0x122f, 0x934: 0x1257, 0x935: 0x12cb,
-       0x936: 0x1313, 0x937: 0x131f, 0x938: 0x1327, 0x939: 0x133f, 0x93a: 0x1353, 0x93b: 0x1343,
-       0x93c: 0x135b, 0x93d: 0x1357, 0x93e: 0x134f, 0x93f: 0x135f,
-       // Block 0x25, offset 0x940
-       0x940: 0x136b, 0x941: 0x13a7, 0x942: 0x13e3, 0x943: 0x1413, 0x944: 0x144b, 0x945: 0x146b,
-       0x946: 0x14b7, 0x947: 0x14db, 0x948: 0x14fb, 0x949: 0x150f, 0x94a: 0x151f, 0x94b: 0x152b,
-       0x94c: 0x1537, 0x94d: 0x158b, 0x94e: 0x162b, 0x94f: 0x16b5, 0x950: 0x16b0, 0x951: 0x16e2,
-       0x952: 0x0607, 0x953: 0x062f, 0x954: 0x0633, 0x955: 0x1764, 0x956: 0x1791, 0x957: 0x1809,
-       0x958: 0x1617, 0x959: 0x1627,
-       // Block 0x26, offset 0x980
-       0x980: 0x06fb, 0x981: 0x06f3, 0x982: 0x0703, 0x983: 0x1647, 0x984: 0x0747, 0x985: 0x0757,
-       0x986: 0x075b, 0x987: 0x0763, 0x988: 0x076b, 0x989: 0x076f, 0x98a: 0x077b, 0x98b: 0x0773,
-       0x98c: 0x05b3, 0x98d: 0x165b, 0x98e: 0x078f, 0x98f: 0x0793, 0x990: 0x0797, 0x991: 0x07b3,
-       0x992: 0x164c, 0x993: 0x05b7, 0x994: 0x079f, 0x995: 0x07bf, 0x996: 0x1656, 0x997: 0x07cf,
-       0x998: 0x07d7, 0x999: 0x0737, 0x99a: 0x07df, 0x99b: 0x07e3, 0x99c: 0x1831, 0x99d: 0x07ff,
-       0x99e: 0x0807, 0x99f: 0x05bf, 0x9a0: 0x081f, 0x9a1: 0x0823, 0x9a2: 0x082b, 0x9a3: 0x082f,
-       0x9a4: 0x05c3, 0x9a5: 0x0847, 0x9a6: 0x084b, 0x9a7: 0x0857, 0x9a8: 0x0863, 0x9a9: 0x0867,
-       0x9aa: 0x086b, 0x9ab: 0x0873, 0x9ac: 0x0893, 0x9ad: 0x0897, 0x9ae: 0x089f, 0x9af: 0x08af,
-       0x9b0: 0x08b7, 0x9b1: 0x08bb, 0x9b2: 0x08bb, 0x9b3: 0x08bb, 0x9b4: 0x166a, 0x9b5: 0x0e93,
-       0x9b6: 0x08cf, 0x9b7: 0x08d7, 0x9b8: 0x166f, 0x9b9: 0x08e3, 0x9ba: 0x08eb, 0x9bb: 0x08f3,
-       0x9bc: 0x091b, 0x9bd: 0x0907, 0x9be: 0x0913, 0x9bf: 0x0917,
-       // Block 0x27, offset 0x9c0
-       0x9c0: 0x091f, 0x9c1: 0x0927, 0x9c2: 0x092b, 0x9c3: 0x0933, 0x9c4: 0x093b, 0x9c5: 0x093f,
-       0x9c6: 0x093f, 0x9c7: 0x0947, 0x9c8: 0x094f, 0x9c9: 0x0953, 0x9ca: 0x095f, 0x9cb: 0x0983,
-       0x9cc: 0x0967, 0x9cd: 0x0987, 0x9ce: 0x096b, 0x9cf: 0x0973, 0x9d0: 0x080b, 0x9d1: 0x09cf,
-       0x9d2: 0x0997, 0x9d3: 0x099b, 0x9d4: 0x099f, 0x9d5: 0x0993, 0x9d6: 0x09a7, 0x9d7: 0x09a3,
-       0x9d8: 0x09bb, 0x9d9: 0x1674, 0x9da: 0x09d7, 0x9db: 0x09db, 0x9dc: 0x09e3, 0x9dd: 0x09ef,
-       0x9de: 0x09f7, 0x9df: 0x0a13, 0x9e0: 0x1679, 0x9e1: 0x167e, 0x9e2: 0x0a1f, 0x9e3: 0x0a23,
-       0x9e4: 0x0a27, 0x9e5: 0x0a1b, 0x9e6: 0x0a2f, 0x9e7: 0x05c7, 0x9e8: 0x05cb, 0x9e9: 0x0a37,
-       0x9ea: 0x0a3f, 0x9eb: 0x0a3f, 0x9ec: 0x1683, 0x9ed: 0x0a5b, 0x9ee: 0x0a5f, 0x9ef: 0x0a63,
-       0x9f0: 0x0a6b, 0x9f1: 0x1688, 0x9f2: 0x0a73, 0x9f3: 0x0a77, 0x9f4: 0x0b4f, 0x9f5: 0x0a7f,
-       0x9f6: 0x05cf, 0x9f7: 0x0a8b, 0x9f8: 0x0a9b, 0x9f9: 0x0aa7, 0x9fa: 0x0aa3, 0x9fb: 0x1692,
-       0x9fc: 0x0aaf, 0x9fd: 0x1697, 0x9fe: 0x0abb, 0x9ff: 0x0ab7,
-       // Block 0x28, offset 0xa00
-       0xa00: 0x0abf, 0xa01: 0x0acf, 0xa02: 0x0ad3, 0xa03: 0x05d3, 0xa04: 0x0ae3, 0xa05: 0x0aeb,
-       0xa06: 0x0aef, 0xa07: 0x0af3, 0xa08: 0x05d7, 0xa09: 0x169c, 0xa0a: 0x05db, 0xa0b: 0x0b0f,
-       0xa0c: 0x0b13, 0xa0d: 0x0b17, 0xa0e: 0x0b1f, 0xa0f: 0x1863, 0xa10: 0x0b37, 0xa11: 0x16a6,
-       0xa12: 0x16a6, 0xa13: 0x11d7, 0xa14: 0x0b47, 0xa15: 0x0b47, 0xa16: 0x05df, 0xa17: 0x16c9,
-       0xa18: 0x179b, 0xa19: 0x0b57, 0xa1a: 0x0b5f, 0xa1b: 0x05e3, 0xa1c: 0x0b73, 0xa1d: 0x0b83,
-       0xa1e: 0x0b87, 0xa1f: 0x0b8f, 0xa20: 0x0b9f, 0xa21: 0x05eb, 0xa22: 0x05e7, 0xa23: 0x0ba3,
-       0xa24: 0x16ab, 0xa25: 0x0ba7, 0xa26: 0x0bbb, 0xa27: 0x0bbf, 0xa28: 0x0bc3, 0xa29: 0x0bbf,
-       0xa2a: 0x0bcf, 0xa2b: 0x0bd3, 0xa2c: 0x0be3, 0xa2d: 0x0bdb, 0xa2e: 0x0bdf, 0xa2f: 0x0be7,
-       0xa30: 0x0beb, 0xa31: 0x0bef, 0xa32: 0x0bfb, 0xa33: 0x0bff, 0xa34: 0x0c17, 0xa35: 0x0c1f,
-       0xa36: 0x0c2f, 0xa37: 0x0c43, 0xa38: 0x16ba, 0xa39: 0x0c3f, 0xa3a: 0x0c33, 0xa3b: 0x0c4b,
-       0xa3c: 0x0c53, 0xa3d: 0x0c67, 0xa3e: 0x16bf, 0xa3f: 0x0c6f,
-       // Block 0x29, offset 0xa40
-       0xa40: 0x0c63, 0xa41: 0x0c5b, 0xa42: 0x05ef, 0xa43: 0x0c77, 0xa44: 0x0c7f, 0xa45: 0x0c87,
-       0xa46: 0x0c7b, 0xa47: 0x05f3, 0xa48: 0x0c97, 0xa49: 0x0c9f, 0xa4a: 0x16c4, 0xa4b: 0x0ccb,
-       0xa4c: 0x0cff, 0xa4d: 0x0cdb, 0xa4e: 0x05ff, 0xa4f: 0x0ce7, 0xa50: 0x05fb, 0xa51: 0x05f7,
-       0xa52: 0x07c3, 0xa53: 0x07c7, 0xa54: 0x0d03, 0xa55: 0x0ceb, 0xa56: 0x11ab, 0xa57: 0x0663,
-       0xa58: 0x0d0f, 0xa59: 0x0d13, 0xa5a: 0x0d17, 0xa5b: 0x0d2b, 0xa5c: 0x0d23, 0xa5d: 0x16dd,
-       0xa5e: 0x0603, 0xa5f: 0x0d3f, 0xa60: 0x0d33, 0xa61: 0x0d4f, 0xa62: 0x0d57, 0xa63: 0x16e7,
-       0xa64: 0x0d5b, 0xa65: 0x0d47, 0xa66: 0x0d63, 0xa67: 0x0607, 0xa68: 0x0d67, 0xa69: 0x0d6b,
-       0xa6a: 0x0d6f, 0xa6b: 0x0d7b, 0xa6c: 0x16ec, 0xa6d: 0x0d83, 0xa6e: 0x060b, 0xa6f: 0x0d8f,
-       0xa70: 0x16f1, 0xa71: 0x0d93, 0xa72: 0x060f, 0xa73: 0x0d9f, 0xa74: 0x0dab, 0xa75: 0x0db7,
-       0xa76: 0x0dbb, 0xa77: 0x16f6, 0xa78: 0x168d, 0xa79: 0x16fb, 0xa7a: 0x0ddb, 0xa7b: 0x1700,
-       0xa7c: 0x0de7, 0xa7d: 0x0def, 0xa7e: 0x0ddf, 0xa7f: 0x0dfb,
-       // Block 0x2a, offset 0xa80
-       0xa80: 0x0e0b, 0xa81: 0x0e1b, 0xa82: 0x0e0f, 0xa83: 0x0e13, 0xa84: 0x0e1f, 0xa85: 0x0e23,
-       0xa86: 0x1705, 0xa87: 0x0e07, 0xa88: 0x0e3b, 0xa89: 0x0e3f, 0xa8a: 0x0613, 0xa8b: 0x0e53,
-       0xa8c: 0x0e4f, 0xa8d: 0x170a, 0xa8e: 0x0e33, 0xa8f: 0x0e6f, 0xa90: 0x170f, 0xa91: 0x1714,
-       0xa92: 0x0e73, 0xa93: 0x0e87, 0xa94: 0x0e83, 0xa95: 0x0e7f, 0xa96: 0x0617, 0xa97: 0x0e8b,
-       0xa98: 0x0e9b, 0xa99: 0x0e97, 0xa9a: 0x0ea3, 0xa9b: 0x1651, 0xa9c: 0x0eb3, 0xa9d: 0x1719,
-       0xa9e: 0x0ebf, 0xa9f: 0x1723, 0xaa0: 0x0ed3, 0xaa1: 0x0edf, 0xaa2: 0x0ef3, 0xaa3: 0x1728,
-       0xaa4: 0x0f07, 0xaa5: 0x0f0b, 0xaa6: 0x172d, 0xaa7: 0x1732, 0xaa8: 0x0f27, 0xaa9: 0x0f37,
-       0xaaa: 0x061b, 0xaab: 0x0f3b, 0xaac: 0x061f, 0xaad: 0x061f, 0xaae: 0x0f53, 0xaaf: 0x0f57,
-       0xab0: 0x0f5f, 0xab1: 0x0f63, 0xab2: 0x0f6f, 0xab3: 0x0623, 0xab4: 0x0f87, 0xab5: 0x1737,
-       0xab6: 0x0fa3, 0xab7: 0x173c, 0xab8: 0x0faf, 0xab9: 0x16a1, 0xaba: 0x0fbf, 0xabb: 0x1741,
-       0xabc: 0x1746, 0xabd: 0x174b, 0xabe: 0x0627, 0xabf: 0x062b,
-       // Block 0x2b, offset 0xac0
-       0xac0: 0x0ff7, 0xac1: 0x1755, 0xac2: 0x1750, 0xac3: 0x175a, 0xac4: 0x175f, 0xac5: 0x0fff,
-       0xac6: 0x1003, 0xac7: 0x1003, 0xac8: 0x100b, 0xac9: 0x0633, 0xaca: 0x100f, 0xacb: 0x0637,
-       0xacc: 0x063b, 0xacd: 0x1769, 0xace: 0x1023, 0xacf: 0x102b, 0xad0: 0x1037, 0xad1: 0x063f,
-       0xad2: 0x176e, 0xad3: 0x105b, 0xad4: 0x1773, 0xad5: 0x1778, 0xad6: 0x107b, 0xad7: 0x1093,
-       0xad8: 0x0643, 0xad9: 0x109b, 0xada: 0x109f, 0xadb: 0x10a3, 0xadc: 0x177d, 0xadd: 0x1782,
-       0xade: 0x1782, 0xadf: 0x10bb, 0xae0: 0x0647, 0xae1: 0x1787, 0xae2: 0x10cf, 0xae3: 0x10d3,
-       0xae4: 0x064b, 0xae5: 0x178c, 0xae6: 0x10ef, 0xae7: 0x064f, 0xae8: 0x10ff, 0xae9: 0x10f7,
-       0xaea: 0x1107, 0xaeb: 0x1796, 0xaec: 0x111f, 0xaed: 0x0653, 0xaee: 0x112b, 0xaef: 0x1133,
-       0xaf0: 0x1143, 0xaf1: 0x0657, 0xaf2: 0x17a0, 0xaf3: 0x17a5, 0xaf4: 0x065b, 0xaf5: 0x17aa,
-       0xaf6: 0x115b, 0xaf7: 0x17af, 0xaf8: 0x1167, 0xaf9: 0x1173, 0xafa: 0x117b, 0xafb: 0x17b4,
-       0xafc: 0x17b9, 0xafd: 0x118f, 0xafe: 0x17be, 0xaff: 0x1197,
-       // Block 0x2c, offset 0xb00
-       0xb00: 0x16ce, 0xb01: 0x065f, 0xb02: 0x11af, 0xb03: 0x11b3, 0xb04: 0x0667, 0xb05: 0x11b7,
-       0xb06: 0x0a33, 0xb07: 0x17c3, 0xb08: 0x17c8, 0xb09: 0x16d3, 0xb0a: 0x16d8, 0xb0b: 0x11d7,
-       0xb0c: 0x11db, 0xb0d: 0x13f3, 0xb0e: 0x066b, 0xb0f: 0x1207, 0xb10: 0x1203, 0xb11: 0x120b,
-       0xb12: 0x083f, 0xb13: 0x120f, 0xb14: 0x1213, 0xb15: 0x1217, 0xb16: 0x121f, 0xb17: 0x17cd,
-       0xb18: 0x121b, 0xb19: 0x1223, 0xb1a: 0x1237, 0xb1b: 0x123b, 0xb1c: 0x1227, 0xb1d: 0x123f,
-       0xb1e: 0x1253, 0xb1f: 0x1267, 0xb20: 0x1233, 0xb21: 0x1247, 0xb22: 0x124b, 0xb23: 0x124f,
-       0xb24: 0x17d2, 0xb25: 0x17dc, 0xb26: 0x17d7, 0xb27: 0x066f, 0xb28: 0x126f, 0xb29: 0x1273,
-       0xb2a: 0x127b, 0xb2b: 0x17f0, 0xb2c: 0x127f, 0xb2d: 0x17e1, 0xb2e: 0x0673, 0xb2f: 0x0677,
-       0xb30: 0x17e6, 0xb31: 0x17eb, 0xb32: 0x067b, 0xb33: 0x129f, 0xb34: 0x12a3, 0xb35: 0x12a7,
-       0xb36: 0x12ab, 0xb37: 0x12b7, 0xb38: 0x12b3, 0xb39: 0x12bf, 0xb3a: 0x12bb, 0xb3b: 0x12cb,
-       0xb3c: 0x12c3, 0xb3d: 0x12c7, 0xb3e: 0x12cf, 0xb3f: 0x067f,
-       // Block 0x2d, offset 0xb40
-       0xb40: 0x12d7, 0xb41: 0x12db, 0xb42: 0x0683, 0xb43: 0x12eb, 0xb44: 0x12ef, 0xb45: 0x17f5,
-       0xb46: 0x12fb, 0xb47: 0x12ff, 0xb48: 0x0687, 0xb49: 0x130b, 0xb4a: 0x05bb, 0xb4b: 0x17fa,
-       0xb4c: 0x17ff, 0xb4d: 0x068b, 0xb4e: 0x068f, 0xb4f: 0x1337, 0xb50: 0x134f, 0xb51: 0x136b,
-       0xb52: 0x137b, 0xb53: 0x1804, 0xb54: 0x138f, 0xb55: 0x1393, 0xb56: 0x13ab, 0xb57: 0x13b7,
-       0xb58: 0x180e, 0xb59: 0x1660, 0xb5a: 0x13c3, 0xb5b: 0x13bf, 0xb5c: 0x13cb, 0xb5d: 0x1665,
-       0xb5e: 0x13d7, 0xb5f: 0x13e3, 0xb60: 0x1813, 0xb61: 0x1818, 0xb62: 0x1423, 0xb63: 0x142f,
-       0xb64: 0x1437, 0xb65: 0x181d, 0xb66: 0x143b, 0xb67: 0x1467, 0xb68: 0x1473, 0xb69: 0x1477,
-       0xb6a: 0x146f, 0xb6b: 0x1483, 0xb6c: 0x1487, 0xb6d: 0x1822, 0xb6e: 0x1493, 0xb6f: 0x0693,
-       0xb70: 0x149b, 0xb71: 0x1827, 0xb72: 0x0697, 0xb73: 0x14d3, 0xb74: 0x0ac3, 0xb75: 0x14eb,
-       0xb76: 0x182c, 0xb77: 0x1836, 0xb78: 0x069b, 0xb79: 0x069f, 0xb7a: 0x1513, 0xb7b: 0x183b,
-       0xb7c: 0x06a3, 0xb7d: 0x1840, 0xb7e: 0x152b, 0xb7f: 0x152b,
-       // Block 0x2e, offset 0xb80
-       0xb80: 0x1533, 0xb81: 0x1845, 0xb82: 0x154b, 0xb83: 0x06a7, 0xb84: 0x155b, 0xb85: 0x1567,
-       0xb86: 0x156f, 0xb87: 0x1577, 0xb88: 0x06ab, 0xb89: 0x184a, 0xb8a: 0x158b, 0xb8b: 0x15a7,
-       0xb8c: 0x15b3, 0xb8d: 0x06af, 0xb8e: 0x06b3, 0xb8f: 0x15b7, 0xb90: 0x184f, 0xb91: 0x06b7,
-       0xb92: 0x1854, 0xb93: 0x1859, 0xb94: 0x185e, 0xb95: 0x15db, 0xb96: 0x06bb, 0xb97: 0x15ef,
-       0xb98: 0x15f7, 0xb99: 0x15fb, 0xb9a: 0x1603, 0xb9b: 0x160b, 0xb9c: 0x1613, 0xb9d: 0x1868,
-}
-
-// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
-// Block 0 is the zero block.
-var nfcIndex = [1408]uint8{
-       // Block 0x0, offset 0x0
-       // Block 0x1, offset 0x40
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc2: 0x2d, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2e, 0xc7: 0x04,
-       0xc8: 0x05, 0xca: 0x2f, 0xcb: 0x30, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x31,
-       0xd0: 0x09, 0xd1: 0x32, 0xd2: 0x33, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x34,
-       0xd8: 0x35, 0xd9: 0x0c, 0xdb: 0x36, 0xdc: 0x37, 0xdd: 0x38, 0xdf: 0x39,
-       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
-       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
-       0xf0: 0x13,
-       // Block 0x4, offset 0x100
-       0x120: 0x3a, 0x121: 0x3b, 0x123: 0x3c, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40,
-       0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47,
-       0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d,
-       0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55,
-       // Block 0x5, offset 0x140
-       0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b,
-       0x14d: 0x5c,
-       0x15c: 0x5d, 0x15f: 0x5e,
-       0x162: 0x5f, 0x164: 0x60,
-       0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0d, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66,
-       0x170: 0x67, 0x173: 0x68, 0x177: 0x0e,
-       0x178: 0x0f, 0x179: 0x10, 0x17a: 0x11, 0x17b: 0x12, 0x17c: 0x13, 0x17d: 0x14, 0x17e: 0x15, 0x17f: 0x16,
-       // Block 0x6, offset 0x180
-       0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,
-       0x188: 0x6e, 0x189: 0x17, 0x18a: 0x18, 0x18b: 0x6f, 0x18c: 0x70,
-       0x1ab: 0x71,
-       0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x75, 0x1c1: 0x19, 0x1c2: 0x1a, 0x1c3: 0x1b, 0x1c4: 0x76, 0x1c5: 0x77,
-       0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,
-       // Block 0x8, offset 0x200
-       0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,
-       0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,
-       0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,
-       0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,
-       0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,
-       // Block 0x9, offset 0x240
-       0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,
-       0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,
-       0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,
-       0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,
-       0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,
-       0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,
-       0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,
-       0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,
-       // Block 0xa, offset 0x280
-       0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,
-       0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,
-       0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,
-       0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,
-       0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,
-       0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,
-       0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,
-       0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,
-       // Block 0xb, offset 0x2c0
-       0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,
-       0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,
-       0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,
-       0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,
-       // Block 0xc, offset 0x300
-       0x324: 0x1c, 0x325: 0x1d, 0x326: 0x1e, 0x327: 0x1f,
-       0x328: 0x20, 0x329: 0x21, 0x32a: 0x22, 0x32b: 0x23, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,
-       0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,
-       0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,
-       // Block 0xd, offset 0x340
-       0x347: 0x9c,
-       0x34b: 0x9d, 0x34d: 0x9e,
-       0x368: 0x9f, 0x36b: 0xa0,
-       // Block 0xe, offset 0x380
-       0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,
-       0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3f, 0x38d: 0xa7,
-       0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,
-       0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,
-       0x3a8: 0xaf, 0x3a9: 0xb0, 0x3aa: 0xb1,
-       0x3b0: 0x73, 0x3b5: 0xb2,
-       // Block 0xf, offset 0x3c0
-       0x3eb: 0xb3, 0x3ec: 0xb4,
-       // Block 0x10, offset 0x400
-       0x432: 0xb5,
-       // Block 0x11, offset 0x440
-       0x445: 0xb6, 0x446: 0xb7, 0x447: 0xb8,
-       0x449: 0xb9,
-       // Block 0x12, offset 0x480
-       0x480: 0xba,
-       0x4a3: 0xbb, 0x4a5: 0xbc,
-       // Block 0x13, offset 0x4c0
-       0x4c8: 0xbd,
-       // Block 0x14, offset 0x500
-       0x520: 0x24, 0x521: 0x25, 0x522: 0x26, 0x523: 0x27, 0x524: 0x28, 0x525: 0x29, 0x526: 0x2a, 0x527: 0x2b,
-       0x528: 0x2c,
-       // Block 0x15, offset 0x540
-       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
-       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
-       0x56f: 0x12,
-}
-
-// nfcSparseOffset: 145 entries, 290 bytes
-var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc8, 0xcf, 0xd7, 0xda, 0xdc, 0xde, 0xe0, 0xe5, 0xf6, 0x102, 0x104, 0x10a, 0x10c, 0x10e, 0x110, 0x112, 0x114, 0x116, 0x119, 0x11c, 0x11e, 0x121, 0x124, 0x128, 0x12d, 0x136, 0x138, 0x13b, 0x13d, 0x148, 0x14c, 0x15a, 0x15d, 0x163, 0x169, 0x174, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x182, 0x188, 0x18c, 0x18e, 0x190, 0x198, 0x19c, 0x19f, 0x1a1, 0x1a3, 0x1a5, 0x1a8, 0x1aa, 0x1ac, 0x1ae, 0x1b0, 0x1b6, 0x1b9, 0x1bb, 0x1c2, 0x1c8, 0x1ce, 0x1d6, 0x1dc, 0x1e2, 0x1e8, 0x1ec, 0x1fa, 0x203, 0x206, 0x209, 0x20b, 0x20e, 0x210, 0x214, 0x219, 0x21b, 0x21d, 0x222, 0x228, 0x22a, 0x22c, 0x22e, 0x234, 0x237, 0x23a, 0x242, 0x249, 0x24c, 0x24f, 0x251, 0x259, 0x25c, 0x263, 0x266, 0x26c, 0x26e, 0x271, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x28f, 0x299, 0x29b, 0x29d, 0x2a3, 0x2a5, 0x2a8}
-
-// nfcSparseValues: 682 entries, 2728 bytes
-var nfcSparseValues = [682]valueRange{
-       // Block 0x0, offset 0x0
-       {value: 0x0000, lo: 0x04},
-       {value: 0xa100, lo: 0xa8, hi: 0xa8},
-       {value: 0x8100, lo: 0xaf, hi: 0xaf},
-       {value: 0x8100, lo: 0xb4, hi: 0xb4},
-       {value: 0x8100, lo: 0xb8, hi: 0xb8},
-       // Block 0x1, offset 0x5
-       {value: 0x0091, lo: 0x03},
-       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
-       {value: 0x4714, lo: 0xaf, hi: 0xb0},
-       {value: 0xa000, lo: 0xb7, hi: 0xb7},
-       // Block 0x2, offset 0x9
-       {value: 0x0000, lo: 0x01},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       // Block 0x3, offset 0xb
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0x98, hi: 0x9d},
-       // Block 0x4, offset 0xd
-       {value: 0x0006, lo: 0x0a},
-       {value: 0xa000, lo: 0x81, hi: 0x81},
-       {value: 0xa000, lo: 0x85, hi: 0x85},
-       {value: 0xa000, lo: 0x89, hi: 0x89},
-       {value: 0x4840, lo: 0x8a, hi: 0x8a},
-       {value: 0x485e, lo: 0x8b, hi: 0x8b},
-       {value: 0x36c7, lo: 0x8c, hi: 0x8c},
-       {value: 0x36df, lo: 0x8d, hi: 0x8d},
-       {value: 0x4876, lo: 0x8e, hi: 0x8e},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x36fd, lo: 0x93, hi: 0x94},
-       // Block 0x5, offset 0x18
-       {value: 0x0000, lo: 0x0f},
-       {value: 0xa000, lo: 0x83, hi: 0x83},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0xa000, lo: 0x8b, hi: 0x8b},
-       {value: 0xa000, lo: 0x8d, hi: 0x8d},
-       {value: 0x37a5, lo: 0x90, hi: 0x90},
-       {value: 0x37b1, lo: 0x91, hi: 0x91},
-       {value: 0x379f, lo: 0x93, hi: 0x93},
-       {value: 0xa000, lo: 0x96, hi: 0x96},
-       {value: 0x3817, lo: 0x97, hi: 0x97},
-       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
-       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
-       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
-       {value: 0xa000, lo: 0xb4, hi: 0xb5},
-       {value: 0x381d, lo: 0xb6, hi: 0xb6},
-       {value: 0x3823, lo: 0xb7, hi: 0xb7},
-       // Block 0x6, offset 0x28
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x83, hi: 0x87},
-       // Block 0x7, offset 0x2a
-       {value: 0x0001, lo: 0x04},
-       {value: 0x8113, lo: 0x81, hi: 0x82},
-       {value: 0x8132, lo: 0x84, hi: 0x84},
-       {value: 0x812d, lo: 0x85, hi: 0x85},
-       {value: 0x810d, lo: 0x87, hi: 0x87},
-       // Block 0x8, offset 0x2f
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x8132, lo: 0x90, hi: 0x97},
-       {value: 0x8119, lo: 0x98, hi: 0x98},
-       {value: 0x811a, lo: 0x99, hi: 0x99},
-       {value: 0x811b, lo: 0x9a, hi: 0x9a},
-       {value: 0x3841, lo: 0xa2, hi: 0xa2},
-       {value: 0x3847, lo: 0xa3, hi: 0xa3},
-       {value: 0x3853, lo: 0xa4, hi: 0xa4},
-       {value: 0x384d, lo: 0xa5, hi: 0xa5},
-       {value: 0x3859, lo: 0xa6, hi: 0xa6},
-       {value: 0xa000, lo: 0xa7, hi: 0xa7},
-       // Block 0x9, offset 0x3a
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x386b, lo: 0x80, hi: 0x80},
-       {value: 0xa000, lo: 0x81, hi: 0x81},
-       {value: 0x385f, lo: 0x82, hi: 0x82},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x3865, lo: 0x93, hi: 0x93},
-       {value: 0xa000, lo: 0x95, hi: 0x95},
-       {value: 0x8132, lo: 0x96, hi: 0x9c},
-       {value: 0x8132, lo: 0x9f, hi: 0xa2},
-       {value: 0x812d, lo: 0xa3, hi: 0xa3},
-       {value: 0x8132, lo: 0xa4, hi: 0xa4},
-       {value: 0x8132, lo: 0xa7, hi: 0xa8},
-       {value: 0x812d, lo: 0xaa, hi: 0xaa},
-       {value: 0x8132, lo: 0xab, hi: 0xac},
-       {value: 0x812d, lo: 0xad, hi: 0xad},
-       // Block 0xa, offset 0x49
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x811f, lo: 0x91, hi: 0x91},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       {value: 0x812d, lo: 0xb1, hi: 0xb1},
-       {value: 0x8132, lo: 0xb2, hi: 0xb3},
-       {value: 0x812d, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb5, hi: 0xb6},
-       {value: 0x812d, lo: 0xb7, hi: 0xb9},
-       {value: 0x8132, lo: 0xba, hi: 0xba},
-       {value: 0x812d, lo: 0xbb, hi: 0xbc},
-       {value: 0x8132, lo: 0xbd, hi: 0xbd},
-       {value: 0x812d, lo: 0xbe, hi: 0xbe},
-       {value: 0x8132, lo: 0xbf, hi: 0xbf},
-       // Block 0xb, offset 0x56
-       {value: 0x0005, lo: 0x07},
-       {value: 0x8132, lo: 0x80, hi: 0x80},
-       {value: 0x8132, lo: 0x81, hi: 0x81},
-       {value: 0x812d, lo: 0x82, hi: 0x83},
-       {value: 0x812d, lo: 0x84, hi: 0x85},
-       {value: 0x812d, lo: 0x86, hi: 0x87},
-       {value: 0x812d, lo: 0x88, hi: 0x89},
-       {value: 0x8132, lo: 0x8a, hi: 0x8a},
-       // Block 0xc, offset 0x5e
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8132, lo: 0xab, hi: 0xb1},
-       {value: 0x812d, lo: 0xb2, hi: 0xb2},
-       {value: 0x8132, lo: 0xb3, hi: 0xb3},
-       // Block 0xd, offset 0x62
-       {value: 0x0000, lo: 0x04},
-       {value: 0x8132, lo: 0x96, hi: 0x99},
-       {value: 0x8132, lo: 0x9b, hi: 0xa3},
-       {value: 0x8132, lo: 0xa5, hi: 0xa7},
-       {value: 0x8132, lo: 0xa9, hi: 0xad},
-       // Block 0xe, offset 0x67
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x99, hi: 0x9b},
-       // Block 0xf, offset 0x69
-       {value: 0x0000, lo: 0x10},
-       {value: 0x8132, lo: 0x94, hi: 0xa1},
-       {value: 0x812d, lo: 0xa3, hi: 0xa3},
-       {value: 0x8132, lo: 0xa4, hi: 0xa5},
-       {value: 0x812d, lo: 0xa6, hi: 0xa6},
-       {value: 0x8132, lo: 0xa7, hi: 0xa8},
-       {value: 0x812d, lo: 0xa9, hi: 0xa9},
-       {value: 0x8132, lo: 0xaa, hi: 0xac},
-       {value: 0x812d, lo: 0xad, hi: 0xaf},
-       {value: 0x8116, lo: 0xb0, hi: 0xb0},
-       {value: 0x8117, lo: 0xb1, hi: 0xb1},
-       {value: 0x8118, lo: 0xb2, hi: 0xb2},
-       {value: 0x8132, lo: 0xb3, hi: 0xb5},
-       {value: 0x812d, lo: 0xb6, hi: 0xb6},
-       {value: 0x8132, lo: 0xb7, hi: 0xb8},
-       {value: 0x812d, lo: 0xb9, hi: 0xba},
-       {value: 0x8132, lo: 0xbb, hi: 0xbf},
-       // Block 0x10, offset 0x7a
-       {value: 0x0000, lo: 0x07},
-       {value: 0xa000, lo: 0xa8, hi: 0xa8},
-       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
-       {value: 0xa000, lo: 0xb0, hi: 0xb0},
-       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
-       {value: 0xa000, lo: 0xb3, hi: 0xb3},
-       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
-       {value: 0x9902, lo: 0xbc, hi: 0xbc},
-       // Block 0x11, offset 0x82
-       {value: 0x0008, lo: 0x06},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x8132, lo: 0x91, hi: 0x91},
-       {value: 0x812d, lo: 0x92, hi: 0x92},
-       {value: 0x8132, lo: 0x93, hi: 0x93},
-       {value: 0x8132, lo: 0x94, hi: 0x94},
-       {value: 0x451c, lo: 0x98, hi: 0x9f},
-       // Block 0x12, offset 0x89
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x13, offset 0x8c
-       {value: 0x0008, lo: 0x06},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       {value: 0x455c, lo: 0x9c, hi: 0x9d},
-       {value: 0x456c, lo: 0x9f, hi: 0x9f},
-       // Block 0x14, offset 0x93
-       {value: 0x0000, lo: 0x03},
-       {value: 0x4594, lo: 0xb3, hi: 0xb3},
-       {value: 0x459c, lo: 0xb6, hi: 0xb6},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       // Block 0x15, offset 0x97
-       {value: 0x0008, lo: 0x03},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x4574, lo: 0x99, hi: 0x9b},
-       {value: 0x458c, lo: 0x9e, hi: 0x9e},
-       // Block 0x16, offset 0x9b
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       // Block 0x17, offset 0x9d
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       // Block 0x18, offset 0x9f
-       {value: 0x0000, lo: 0x08},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2cb6, lo: 0x88, hi: 0x88},
-       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
-       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x96, hi: 0x97},
-       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
-       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
-       // Block 0x19, offset 0xa8
-       {value: 0x0000, lo: 0x03},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x2cc6, lo: 0x94, hi: 0x94},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x1a, offset 0xac
-       {value: 0x0000, lo: 0x06},
-       {value: 0xa000, lo: 0x86, hi: 0x87},
-       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
-       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
-       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       // Block 0x1b, offset 0xb3
-       {value: 0x1801, lo: 0x04},
-       {value: 0xa000, lo: 0x86, hi: 0x86},
-       {value: 0x3ef0, lo: 0x88, hi: 0x88},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x8120, lo: 0x95, hi: 0x96},
-       // Block 0x1c, offset 0xb8
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       {value: 0xa000, lo: 0xbf, hi: 0xbf},
-       // Block 0x1d, offset 0xbb
-       {value: 0x0000, lo: 0x09},
-       {value: 0x2ce6, lo: 0x80, hi: 0x80},
-       {value: 0x9900, lo: 0x82, hi: 0x82},
-       {value: 0xa000, lo: 0x86, hi: 0x86},
-       {value: 0x2cee, lo: 0x87, hi: 0x87},
-       {value: 0x2cf6, lo: 0x88, hi: 0x88},
-       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
-       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x95, hi: 0x96},
-       // Block 0x1e, offset 0xc5
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xbb, hi: 0xbc},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x1f, offset 0xc8
-       {value: 0x0000, lo: 0x06},
-       {value: 0xa000, lo: 0x86, hi: 0x87},
-       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
-       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
-       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       // Block 0x20, offset 0xcf
-       {value: 0x6bea, lo: 0x07},
-       {value: 0x9904, lo: 0x8a, hi: 0x8a},
-       {value: 0x9900, lo: 0x8f, hi: 0x8f},
-       {value: 0xa000, lo: 0x99, hi: 0x99},
-       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
-       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
-       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
-       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
-       // Block 0x21, offset 0xd7
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8122, lo: 0xb8, hi: 0xb9},
-       {value: 0x8104, lo: 0xba, hi: 0xba},
-       // Block 0x22, offset 0xda
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8123, lo: 0x88, hi: 0x8b},
-       // Block 0x23, offset 0xdc
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8124, lo: 0xb8, hi: 0xb9},
-       // Block 0x24, offset 0xde
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8125, lo: 0x88, hi: 0x8b},
-       // Block 0x25, offset 0xe0
-       {value: 0x0000, lo: 0x04},
-       {value: 0x812d, lo: 0x98, hi: 0x99},
-       {value: 0x812d, lo: 0xb5, hi: 0xb5},
-       {value: 0x812d, lo: 0xb7, hi: 0xb7},
-       {value: 0x812b, lo: 0xb9, hi: 0xb9},
-       // Block 0x26, offset 0xe5
-       {value: 0x0000, lo: 0x10},
-       {value: 0x2644, lo: 0x83, hi: 0x83},
-       {value: 0x264b, lo: 0x8d, hi: 0x8d},
-       {value: 0x2652, lo: 0x92, hi: 0x92},
-       {value: 0x2659, lo: 0x97, hi: 0x97},
-       {value: 0x2660, lo: 0x9c, hi: 0x9c},
-       {value: 0x263d, lo: 0xa9, hi: 0xa9},
-       {value: 0x8126, lo: 0xb1, hi: 0xb1},
-       {value: 0x8127, lo: 0xb2, hi: 0xb2},
-       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
-       {value: 0x8128, lo: 0xb4, hi: 0xb4},
-       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
-       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
-       {value: 0x8200, lo: 0xb7, hi: 0xb7},
-       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
-       {value: 0x8200, lo: 0xb9, hi: 0xb9},
-       {value: 0x8127, lo: 0xba, hi: 0xbd},
-       // Block 0x27, offset 0xf6
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x8127, lo: 0x80, hi: 0x80},
-       {value: 0x4a96, lo: 0x81, hi: 0x81},
-       {value: 0x8132, lo: 0x82, hi: 0x83},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0x86, hi: 0x87},
-       {value: 0x266e, lo: 0x93, hi: 0x93},
-       {value: 0x2675, lo: 0x9d, hi: 0x9d},
-       {value: 0x267c, lo: 0xa2, hi: 0xa2},
-       {value: 0x2683, lo: 0xa7, hi: 0xa7},
-       {value: 0x268a, lo: 0xac, hi: 0xac},
-       {value: 0x2667, lo: 0xb9, hi: 0xb9},
-       // Block 0x28, offset 0x102
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x86, hi: 0x86},
-       // Block 0x29, offset 0x104
-       {value: 0x0000, lo: 0x05},
-       {value: 0xa000, lo: 0xa5, hi: 0xa5},
-       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
-       {value: 0x9900, lo: 0xae, hi: 0xae},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       {value: 0x8104, lo: 0xb9, hi: 0xba},
-       // Block 0x2a, offset 0x10a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x8d, hi: 0x8d},
-       // Block 0x2b, offset 0x10c
-       {value: 0x0000, lo: 0x01},
-       {value: 0xa000, lo: 0x80, hi: 0x92},
-       // Block 0x2c, offset 0x10e
-       {value: 0x0000, lo: 0x01},
-       {value: 0xb900, lo: 0xa1, hi: 0xb5},
-       // Block 0x2d, offset 0x110
-       {value: 0x0000, lo: 0x01},
-       {value: 0x9900, lo: 0xa8, hi: 0xbf},
-       // Block 0x2e, offset 0x112
-       {value: 0x0000, lo: 0x01},
-       {value: 0x9900, lo: 0x80, hi: 0x82},
-       // Block 0x2f, offset 0x114
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x9d, hi: 0x9f},
-       // Block 0x30, offset 0x116
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x94, hi: 0x94},
-       {value: 0x8104, lo: 0xb4, hi: 0xb4},
-       // Block 0x31, offset 0x119
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x92, hi: 0x92},
-       {value: 0x8132, lo: 0x9d, hi: 0x9d},
-       // Block 0x32, offset 0x11c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8131, lo: 0xa9, hi: 0xa9},
-       // Block 0x33, offset 0x11e
-       {value: 0x0004, lo: 0x02},
-       {value: 0x812e, lo: 0xb9, hi: 0xba},
-       {value: 0x812d, lo: 0xbb, hi: 0xbb},
-       // Block 0x34, offset 0x121
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x97, hi: 0x97},
-       {value: 0x812d, lo: 0x98, hi: 0x98},
-       // Block 0x35, offset 0x124
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8104, lo: 0xa0, hi: 0xa0},
-       {value: 0x8132, lo: 0xb5, hi: 0xbc},
-       {value: 0x812d, lo: 0xbf, hi: 0xbf},
-       // Block 0x36, offset 0x128
-       {value: 0x0000, lo: 0x04},
-       {value: 0x8132, lo: 0xb0, hi: 0xb4},
-       {value: 0x812d, lo: 0xb5, hi: 0xba},
-       {value: 0x8132, lo: 0xbb, hi: 0xbc},
-       {value: 0x812d, lo: 0xbd, hi: 0xbd},
-       // Block 0x37, offset 0x12d
-       {value: 0x0000, lo: 0x08},
-       {value: 0x2d66, lo: 0x80, hi: 0x80},
-       {value: 0x2d6e, lo: 0x81, hi: 0x81},
-       {value: 0xa000, lo: 0x82, hi: 0x82},
-       {value: 0x2d76, lo: 0x83, hi: 0x83},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0xab, hi: 0xab},
-       {value: 0x812d, lo: 0xac, hi: 0xac},
-       {value: 0x8132, lo: 0xad, hi: 0xb3},
-       // Block 0x38, offset 0x136
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xaa, hi: 0xab},
-       // Block 0x39, offset 0x138
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xa6, hi: 0xa6},
-       {value: 0x8104, lo: 0xb2, hi: 0xb3},
-       // Block 0x3a, offset 0x13b
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       // Block 0x3b, offset 0x13d
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x8132, lo: 0x90, hi: 0x92},
-       {value: 0x8101, lo: 0x94, hi: 0x94},
-       {value: 0x812d, lo: 0x95, hi: 0x99},
-       {value: 0x8132, lo: 0x9a, hi: 0x9b},
-       {value: 0x812d, lo: 0x9c, hi: 0x9f},
-       {value: 0x8132, lo: 0xa0, hi: 0xa0},
-       {value: 0x8101, lo: 0xa2, hi: 0xa8},
-       {value: 0x812d, lo: 0xad, hi: 0xad},
-       {value: 0x8132, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb8, hi: 0xb9},
-       // Block 0x3c, offset 0x148
-       {value: 0x0004, lo: 0x03},
-       {value: 0x0433, lo: 0x80, hi: 0x81},
-       {value: 0x8100, lo: 0x97, hi: 0x97},
-       {value: 0x8100, lo: 0xbe, hi: 0xbe},
-       // Block 0x3d, offset 0x14c
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x8132, lo: 0x90, hi: 0x91},
-       {value: 0x8101, lo: 0x92, hi: 0x93},
-       {value: 0x8132, lo: 0x94, hi: 0x97},
-       {value: 0x8101, lo: 0x98, hi: 0x9a},
-       {value: 0x8132, lo: 0x9b, hi: 0x9c},
-       {value: 0x8132, lo: 0xa1, hi: 0xa1},
-       {value: 0x8101, lo: 0xa5, hi: 0xa6},
-       {value: 0x8132, lo: 0xa7, hi: 0xa7},
-       {value: 0x812d, lo: 0xa8, hi: 0xa8},
-       {value: 0x8132, lo: 0xa9, hi: 0xa9},
-       {value: 0x8101, lo: 0xaa, hi: 0xab},
-       {value: 0x812d, lo: 0xac, hi: 0xaf},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       // Block 0x3e, offset 0x15a
-       {value: 0x427b, lo: 0x02},
-       {value: 0x01b8, lo: 0xa6, hi: 0xa6},
-       {value: 0x0057, lo: 0xaa, hi: 0xab},
-       // Block 0x3f, offset 0x15d
-       {value: 0x0007, lo: 0x05},
-       {value: 0xa000, lo: 0x90, hi: 0x90},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0xa000, lo: 0x94, hi: 0x94},
-       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
-       {value: 0x3bc7, lo: 0xae, hi: 0xae},
-       // Block 0x40, offset 0x163
-       {value: 0x000e, lo: 0x05},
-       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
-       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
-       {value: 0xa000, lo: 0x90, hi: 0x90},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0xa000, lo: 0x94, hi: 0x94},
-       // Block 0x41, offset 0x169
-       {value: 0x6408, lo: 0x0a},
-       {value: 0xa000, lo: 0x83, hi: 0x83},
-       {value: 0x3be3, lo: 0x84, hi: 0x84},
-       {value: 0xa000, lo: 0x88, hi: 0x88},
-       {value: 0x3bea, lo: 0x89, hi: 0x89},
-       {value: 0xa000, lo: 0x8b, hi: 0x8b},
-       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
-       {value: 0xa000, lo: 0xa3, hi: 0xa3},
-       {value: 0x3bf8, lo: 0xa4, hi: 0xa5},
-       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
-       {value: 0xa000, lo: 0xbc, hi: 0xbc},
-       // Block 0x42, offset 0x174
-       {value: 0x0007, lo: 0x03},
-       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
-       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
-       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
-       // Block 0x43, offset 0x178
-       {value: 0x0004, lo: 0x01},
-       {value: 0x048b, lo: 0xa9, hi: 0xaa},
-       // Block 0x44, offset 0x17a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
-       // Block 0x45, offset 0x17c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xaf, hi: 0xb1},
-       // Block 0x46, offset 0x17e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x47, offset 0x180
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xa0, hi: 0xbf},
-       // Block 0x48, offset 0x182
-       {value: 0x0000, lo: 0x05},
-       {value: 0x812c, lo: 0xaa, hi: 0xaa},
-       {value: 0x8131, lo: 0xab, hi: 0xab},
-       {value: 0x8133, lo: 0xac, hi: 0xac},
-       {value: 0x812e, lo: 0xad, hi: 0xad},
-       {value: 0x812f, lo: 0xae, hi: 0xaf},
-       // Block 0x49, offset 0x188
-       {value: 0x0000, lo: 0x03},
-       {value: 0x4a9f, lo: 0xb3, hi: 0xb3},
-       {value: 0x4a9f, lo: 0xb5, hi: 0xb6},
-       {value: 0x4a9f, lo: 0xba, hi: 0xbf},
-       // Block 0x4a, offset 0x18c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x4a9f, lo: 0x8f, hi: 0xa3},
-       // Block 0x4b, offset 0x18e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0xae, hi: 0xbe},
-       // Block 0x4c, offset 0x190
-       {value: 0x0000, lo: 0x07},
-       {value: 0x8100, lo: 0x84, hi: 0x84},
-       {value: 0x8100, lo: 0x87, hi: 0x87},
-       {value: 0x8100, lo: 0x90, hi: 0x90},
-       {value: 0x8100, lo: 0x9e, hi: 0x9e},
-       {value: 0x8100, lo: 0xa1, hi: 0xa1},
-       {value: 0x8100, lo: 0xb2, hi: 0xb2},
-       {value: 0x8100, lo: 0xbb, hi: 0xbb},
-       // Block 0x4d, offset 0x198
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8100, lo: 0x80, hi: 0x80},
-       {value: 0x8100, lo: 0x8b, hi: 0x8b},
-       {value: 0x8100, lo: 0x8e, hi: 0x8e},
-       // Block 0x4e, offset 0x19c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0xaf, hi: 0xaf},
-       {value: 0x8132, lo: 0xb4, hi: 0xbd},
-       // Block 0x4f, offset 0x19f
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x9e, hi: 0x9f},
-       // Block 0x50, offset 0x1a1
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb0, hi: 0xb1},
-       // Block 0x51, offset 0x1a3
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x86, hi: 0x86},
-       // Block 0x52, offset 0x1a5
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0xa0, hi: 0xb1},
-       // Block 0x53, offset 0x1a8
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xab, hi: 0xad},
-       // Block 0x54, offset 0x1aa
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x93, hi: 0x93},
-       // Block 0x55, offset 0x1ac
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xb3, hi: 0xb3},
-       // Block 0x56, offset 0x1ae
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x80, hi: 0x80},
-       // Block 0x57, offset 0x1b0
-       {value: 0x0000, lo: 0x05},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       {value: 0x8132, lo: 0xb2, hi: 0xb3},
-       {value: 0x812d, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb7, hi: 0xb8},
-       {value: 0x8132, lo: 0xbe, hi: 0xbf},
-       // Block 0x58, offset 0x1b6
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x81, hi: 0x81},
-       {value: 0x8104, lo: 0xb6, hi: 0xb6},
-       // Block 0x59, offset 0x1b9
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xad, hi: 0xad},
-       // Block 0x5a, offset 0x1bb
-       {value: 0x0000, lo: 0x06},
-       {value: 0xe500, lo: 0x80, hi: 0x80},
-       {value: 0xc600, lo: 0x81, hi: 0x9b},
-       {value: 0xe500, lo: 0x9c, hi: 0x9c},
-       {value: 0xc600, lo: 0x9d, hi: 0xb7},
-       {value: 0xe500, lo: 0xb8, hi: 0xb8},
-       {value: 0xc600, lo: 0xb9, hi: 0xbf},
-       // Block 0x5b, offset 0x1c2
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x93},
-       {value: 0xe500, lo: 0x94, hi: 0x94},
-       {value: 0xc600, lo: 0x95, hi: 0xaf},
-       {value: 0xe500, lo: 0xb0, hi: 0xb0},
-       {value: 0xc600, lo: 0xb1, hi: 0xbf},
-       // Block 0x5c, offset 0x1c8
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x8b},
-       {value: 0xe500, lo: 0x8c, hi: 0x8c},
-       {value: 0xc600, lo: 0x8d, hi: 0xa7},
-       {value: 0xe500, lo: 0xa8, hi: 0xa8},
-       {value: 0xc600, lo: 0xa9, hi: 0xbf},
-       // Block 0x5d, offset 0x1ce
-       {value: 0x0000, lo: 0x07},
-       {value: 0xc600, lo: 0x80, hi: 0x83},
-       {value: 0xe500, lo: 0x84, hi: 0x84},
-       {value: 0xc600, lo: 0x85, hi: 0x9f},
-       {value: 0xe500, lo: 0xa0, hi: 0xa0},
-       {value: 0xc600, lo: 0xa1, hi: 0xbb},
-       {value: 0xe500, lo: 0xbc, hi: 0xbc},
-       {value: 0xc600, lo: 0xbd, hi: 0xbf},
-       // Block 0x5e, offset 0x1d6
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x97},
-       {value: 0xe500, lo: 0x98, hi: 0x98},
-       {value: 0xc600, lo: 0x99, hi: 0xb3},
-       {value: 0xe500, lo: 0xb4, hi: 0xb4},
-       {value: 0xc600, lo: 0xb5, hi: 0xbf},
-       // Block 0x5f, offset 0x1dc
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x8f},
-       {value: 0xe500, lo: 0x90, hi: 0x90},
-       {value: 0xc600, lo: 0x91, hi: 0xab},
-       {value: 0xe500, lo: 0xac, hi: 0xac},
-       {value: 0xc600, lo: 0xad, hi: 0xbf},
-       // Block 0x60, offset 0x1e2
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x87},
-       {value: 0xe500, lo: 0x88, hi: 0x88},
-       {value: 0xc600, lo: 0x89, hi: 0xa3},
-       {value: 0xe500, lo: 0xa4, hi: 0xa4},
-       {value: 0xc600, lo: 0xa5, hi: 0xbf},
-       // Block 0x61, offset 0x1e8
-       {value: 0x0000, lo: 0x03},
-       {value: 0xc600, lo: 0x80, hi: 0x87},
-       {value: 0xe500, lo: 0x88, hi: 0x88},
-       {value: 0xc600, lo: 0x89, hi: 0xa3},
-       // Block 0x62, offset 0x1ec
-       {value: 0x0006, lo: 0x0d},
-       {value: 0x4390, lo: 0x9d, hi: 0x9d},
-       {value: 0x8115, lo: 0x9e, hi: 0x9e},
-       {value: 0x4402, lo: 0x9f, hi: 0x9f},
-       {value: 0x43f0, lo: 0xaa, hi: 0xab},
-       {value: 0x44f4, lo: 0xac, hi: 0xac},
-       {value: 0x44fc, lo: 0xad, hi: 0xad},
-       {value: 0x4348, lo: 0xae, hi: 0xb1},
-       {value: 0x4366, lo: 0xb2, hi: 0xb4},
-       {value: 0x437e, lo: 0xb5, hi: 0xb6},
-       {value: 0x438a, lo: 0xb8, hi: 0xb8},
-       {value: 0x4396, lo: 0xb9, hi: 0xbb},
-       {value: 0x43ae, lo: 0xbc, hi: 0xbc},
-       {value: 0x43b4, lo: 0xbe, hi: 0xbe},
-       // Block 0x63, offset 0x1fa
-       {value: 0x0006, lo: 0x08},
-       {value: 0x43ba, lo: 0x80, hi: 0x81},
-       {value: 0x43c6, lo: 0x83, hi: 0x84},
-       {value: 0x43d8, lo: 0x86, hi: 0x89},
-       {value: 0x43fc, lo: 0x8a, hi: 0x8a},
-       {value: 0x4378, lo: 0x8b, hi: 0x8b},
-       {value: 0x4360, lo: 0x8c, hi: 0x8c},
-       {value: 0x43a8, lo: 0x8d, hi: 0x8d},
-       {value: 0x43d2, lo: 0x8e, hi: 0x8e},
-       // Block 0x64, offset 0x203
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8100, lo: 0xa4, hi: 0xa5},
-       {value: 0x8100, lo: 0xb0, hi: 0xb1},
-       // Block 0x65, offset 0x206
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8100, lo: 0x9b, hi: 0x9d},
-       {value: 0x8200, lo: 0x9e, hi: 0xa3},
-       // Block 0x66, offset 0x209
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0x90, hi: 0x90},
-       // Block 0x67, offset 0x20b
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8100, lo: 0x99, hi: 0x99},
-       {value: 0x8200, lo: 0xb2, hi: 0xb4},
-       // Block 0x68, offset 0x20e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0xbc, hi: 0xbd},
-       // Block 0x69, offset 0x210
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8132, lo: 0xa0, hi: 0xa6},
-       {value: 0x812d, lo: 0xa7, hi: 0xad},
-       {value: 0x8132, lo: 0xae, hi: 0xaf},
-       // Block 0x6a, offset 0x214
-       {value: 0x0000, lo: 0x04},
-       {value: 0x8100, lo: 0x89, hi: 0x8c},
-       {value: 0x8100, lo: 0xb0, hi: 0xb2},
-       {value: 0x8100, lo: 0xb4, hi: 0xb4},
-       {value: 0x8100, lo: 0xb6, hi: 0xbf},
-       // Block 0x6b, offset 0x219
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0x81, hi: 0x8c},
-       // Block 0x6c, offset 0x21b
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0xb5, hi: 0xba},
-       // Block 0x6d, offset 0x21d
-       {value: 0x0000, lo: 0x04},
-       {value: 0x4a9f, lo: 0x9e, hi: 0x9f},
-       {value: 0x4a9f, lo: 0xa3, hi: 0xa3},
-       {value: 0x4a9f, lo: 0xa5, hi: 0xa6},
-       {value: 0x4a9f, lo: 0xaa, hi: 0xaf},
-       // Block 0x6e, offset 0x222
-       {value: 0x0000, lo: 0x05},
-       {value: 0x4a9f, lo: 0x82, hi: 0x87},
-       {value: 0x4a9f, lo: 0x8a, hi: 0x8f},
-       {value: 0x4a9f, lo: 0x92, hi: 0x97},
-       {value: 0x4a9f, lo: 0x9a, hi: 0x9c},
-       {value: 0x8100, lo: 0xa3, hi: 0xa3},
-       // Block 0x6f, offset 0x228
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xbd, hi: 0xbd},
-       // Block 0x70, offset 0x22a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xa0, hi: 0xa0},
-       // Block 0x71, offset 0x22c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb6, hi: 0xba},
-       // Block 0x72, offset 0x22e
-       {value: 0x002c, lo: 0x05},
-       {value: 0x812d, lo: 0x8d, hi: 0x8d},
-       {value: 0x8132, lo: 0x8f, hi: 0x8f},
-       {value: 0x8132, lo: 0xb8, hi: 0xb8},
-       {value: 0x8101, lo: 0xb9, hi: 0xba},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x73, offset 0x234
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0xa5, hi: 0xa5},
-       {value: 0x812d, lo: 0xa6, hi: 0xa6},
-       // Block 0x74, offset 0x237
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x86, hi: 0x86},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x75, offset 0x23a
-       {value: 0x17fe, lo: 0x07},
-       {value: 0xa000, lo: 0x99, hi: 0x99},
-       {value: 0x4238, lo: 0x9a, hi: 0x9a},
-       {value: 0xa000, lo: 0x9b, hi: 0x9b},
-       {value: 0x4242, lo: 0x9c, hi: 0x9c},
-       {value: 0xa000, lo: 0xa5, hi: 0xa5},
-       {value: 0x424c, lo: 0xab, hi: 0xab},
-       {value: 0x8104, lo: 0xb9, hi: 0xba},
-       // Block 0x76, offset 0x242
-       {value: 0x0000, lo: 0x06},
-       {value: 0x8132, lo: 0x80, hi: 0x82},
-       {value: 0x9900, lo: 0xa7, hi: 0xa7},
-       {value: 0x2d7e, lo: 0xae, hi: 0xae},
-       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
-       {value: 0xa000, lo: 0xb1, hi: 0xb2},
-       {value: 0x8104, lo: 0xb3, hi: 0xb4},
-       // Block 0x77, offset 0x249
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x80, hi: 0x80},
-       {value: 0x8102, lo: 0x8a, hi: 0x8a},
-       // Block 0x78, offset 0x24c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xb5, hi: 0xb5},
-       {value: 0x8102, lo: 0xb6, hi: 0xb6},
-       // Block 0x79, offset 0x24f
-       {value: 0x0002, lo: 0x01},
-       {value: 0x8102, lo: 0xa9, hi: 0xaa},
-       // Block 0x7a, offset 0x251
-       {value: 0x0000, lo: 0x07},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
-       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       {value: 0x8132, lo: 0xa6, hi: 0xac},
-       {value: 0x8132, lo: 0xb0, hi: 0xb4},
-       // Block 0x7b, offset 0x259
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x82, hi: 0x82},
-       {value: 0x8102, lo: 0x86, hi: 0x86},
-       // Block 0x7c, offset 0x25c
-       {value: 0x6b5a, lo: 0x06},
-       {value: 0x9900, lo: 0xb0, hi: 0xb0},
-       {value: 0xa000, lo: 0xb9, hi: 0xb9},
-       {value: 0x9900, lo: 0xba, hi: 0xba},
-       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
-       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
-       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
-       // Block 0x7d, offset 0x263
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x82, hi: 0x82},
-       {value: 0x8102, lo: 0x83, hi: 0x83},
-       // Block 0x7e, offset 0x266
-       {value: 0x0000, lo: 0x05},
-       {value: 0x9900, lo: 0xaf, hi: 0xaf},
-       {value: 0xa000, lo: 0xb8, hi: 0xb9},
-       {value: 0x2dc4, lo: 0xba, hi: 0xba},
-       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x7f, offset 0x26c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0x80, hi: 0x80},
-       // Block 0x80, offset 0x26e
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xb6, hi: 0xb6},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       // Block 0x81, offset 0x271
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xab, hi: 0xab},
-       // Block 0x82, offset 0x273
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xb4, hi: 0xb4},
-       // Block 0x83, offset 0x275
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x87, hi: 0x87},
-       // Block 0x84, offset 0x277
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x99, hi: 0x99},
-       // Block 0x85, offset 0x279
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0x82, hi: 0x82},
-       {value: 0x8104, lo: 0x84, hi: 0x85},
-       // Block 0x86, offset 0x27c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8101, lo: 0xb0, hi: 0xb4},
-       // Block 0x87, offset 0x27e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb0, hi: 0xb6},
-       // Block 0x88, offset 0x280
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8101, lo: 0x9e, hi: 0x9e},
-       // Block 0x89, offset 0x282
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
-       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
-       {value: 0x460a, lo: 0xa0, hi: 0xa0},
-       {value: 0x4618, lo: 0xa1, hi: 0xa1},
-       {value: 0x4626, lo: 0xa2, hi: 0xa2},
-       {value: 0x4634, lo: 0xa3, hi: 0xa3},
-       {value: 0x4642, lo: 0xa4, hi: 0xa4},
-       {value: 0x812b, lo: 0xa5, hi: 0xa6},
-       {value: 0x8101, lo: 0xa7, hi: 0xa9},
-       {value: 0x8130, lo: 0xad, hi: 0xad},
-       {value: 0x812b, lo: 0xae, hi: 0xb2},
-       {value: 0x812d, lo: 0xbb, hi: 0xbf},
-       // Block 0x8a, offset 0x28f
-       {value: 0x0000, lo: 0x09},
-       {value: 0x812d, lo: 0x80, hi: 0x82},
-       {value: 0x8132, lo: 0x85, hi: 0x89},
-       {value: 0x812d, lo: 0x8a, hi: 0x8b},
-       {value: 0x8132, lo: 0xaa, hi: 0xad},
-       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
-       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
-       {value: 0x4650, lo: 0xbd, hi: 0xbd},
-       {value: 0x466c, lo: 0xbe, hi: 0xbe},
-       {value: 0x465e, lo: 0xbf, hi: 0xbf},
-       // Block 0x8b, offset 0x299
-       {value: 0x0000, lo: 0x01},
-       {value: 0x467a, lo: 0x80, hi: 0x80},
-       // Block 0x8c, offset 0x29b
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x82, hi: 0x84},
-       // Block 0x8d, offset 0x29d
-       {value: 0x0000, lo: 0x05},
-       {value: 0x8132, lo: 0x80, hi: 0x86},
-       {value: 0x8132, lo: 0x88, hi: 0x98},
-       {value: 0x8132, lo: 0x9b, hi: 0xa1},
-       {value: 0x8132, lo: 0xa3, hi: 0xa4},
-       {value: 0x8132, lo: 0xa6, hi: 0xaa},
-       // Block 0x8e, offset 0x2a3
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x90, hi: 0x96},
-       // Block 0x8f, offset 0x2a5
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x84, hi: 0x89},
-       {value: 0x8102, lo: 0x8a, hi: 0x8a},
-       // Block 0x90, offset 0x2a8
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8100, lo: 0x93, hi: 0x93},
-}
-
-// lookup returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return nfkcValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfkcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfkcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = nfkcIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return nfkcValues[c0]
-       }
-       i := nfkcIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// lookupString returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
-       c0 := s[0]
-       switch {
-       case c0 < 0x80: // is ASCII
-               return nfkcValues[c0], 1
-       case c0 < 0xC2:
-               return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
-       case c0 < 0xE0: // 2-byte UTF-8
-               if len(s) < 2 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c1), 2
-       case c0 < 0xF0: // 3-byte UTF-8
-               if len(s) < 3 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfkcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c2), 3
-       case c0 < 0xF8: // 4-byte UTF-8
-               if len(s) < 4 {
-                       return 0, 0
-               }
-               i := nfkcIndex[c0]
-               c1 := s[1]
-               if c1 < 0x80 || 0xC0 <= c1 {
-                       return 0, 1 // Illegal UTF-8: not a continuation byte.
-               }
-               o := uint32(i)<<6 + uint32(c1)
-               i = nfkcIndex[o]
-               c2 := s[2]
-               if c2 < 0x80 || 0xC0 <= c2 {
-                       return 0, 2 // Illegal UTF-8: not a continuation byte.
-               }
-               o = uint32(i)<<6 + uint32(c2)
-               i = nfkcIndex[o]
-               c3 := s[3]
-               if c3 < 0x80 || 0xC0 <= c3 {
-                       return 0, 3 // Illegal UTF-8: not a continuation byte.
-               }
-               return t.lookupValue(uint32(i), c3), 4
-       }
-       // Illegal rune
-       return 0, 1
-}
-
-// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
-       c0 := s[0]
-       if c0 < 0x80 { // is ASCII
-               return nfkcValues[c0]
-       }
-       i := nfkcIndex[c0]
-       if c0 < 0xE0 { // 2-byte UTF-8
-               return t.lookupValue(uint32(i), s[1])
-       }
-       i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
-       if c0 < 0xF0 { // 3-byte UTF-8
-               return t.lookupValue(uint32(i), s[2])
-       }
-       i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
-       if c0 < 0xF8 { // 4-byte UTF-8
-               return t.lookupValue(uint32(i), s[3])
-       }
-       return 0
-}
-
-// nfkcTrie. Total size: 17104 bytes (16.70 KiB). Checksum: d985061cf5307b35.
-type nfkcTrie struct{}
-
-func newNfkcTrie(i int) *nfkcTrie {
-       return &nfkcTrie{}
-}
-
-// lookupValue determines the type of block n and looks up the value for b.
-func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
-       switch {
-       case n < 91:
-               return uint16(nfkcValues[n<<6+uint32(b)])
-       default:
-               n -= 91
-               return uint16(nfkcSparse.lookup(n, b))
-       }
-}
-
-// nfkcValues: 93 blocks, 5952 entries, 11904 bytes
-// The third block is the zero block.
-var nfkcValues = [5952]uint16{
-       // Block 0x0, offset 0x0
-       0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
-       // Block 0x1, offset 0x40
-       0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
-       0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
-       0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
-       0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
-       0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
-       0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
-       0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
-       0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
-       0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
-       0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
-       0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
-       0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
-       0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
-       0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
-       0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
-       0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
-       0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
-       0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
-       0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
-       0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
-       // Block 0x4, offset 0x100
-       0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
-       0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
-       0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
-       0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
-       0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
-       0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
-       0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
-       0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
-       0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,
-       0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
-       0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,
-       // Block 0x5, offset 0x140
-       0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
-       0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,
-       0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
-       0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
-       0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
-       0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
-       0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
-       0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
-       0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
-       0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
-       0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,
-       // Block 0x6, offset 0x180
-       0x184: 0x2dee, 0x185: 0x2df4,
-       0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,
-       0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
-       0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
-       0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
-       0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
-       0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
-       0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
-       0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,
-       0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
-       0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
-       0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
-       0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
-       0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
-       0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
-       0x1de: 0x305a, 0x1df: 0x3366,
-       0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
-       0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
-       0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
-       // Block 0x8, offset 0x200
-       0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
-       0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
-       0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
-       0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
-       0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
-       0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
-       0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
-       0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
-       0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
-       0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
-       0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
-       // Block 0x9, offset 0x240
-       0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
-       0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
-       0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
-       0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
-       0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
-       0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
-       0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
-       0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
-       0x274: 0x0170,
-       0x27a: 0x42a5,
-       0x27e: 0x0037,
-       // Block 0xa, offset 0x280
-       0x284: 0x425a, 0x285: 0x447b,
-       0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
-       0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
-       0x295: 0xa000, 0x297: 0xa000,
-       0x299: 0xa000,
-       0x29f: 0xa000, 0x2a1: 0xa000,
-       0x2a5: 0xa000, 0x2a9: 0xa000,
-       0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
-       0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
-       0x2b7: 0xa000, 0x2b9: 0xa000,
-       0x2bf: 0xa000,
-       // Block 0xb, offset 0x2c0
-       0x2c1: 0xa000, 0x2c5: 0xa000,
-       0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,
-       0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,
-       0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,
-       0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,
-       0x2f9: 0x01a6,
-       // Block 0xc, offset 0x300
-       0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,
-       0x306: 0xa000, 0x307: 0x3709,
-       0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,
-       0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
-       0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,
-       0x31e: 0xa000, 0x323: 0xa000,
-       0x327: 0xa000,
-       0x32b: 0xa000, 0x32d: 0xa000,
-       0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
-       0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,
-       0x33e: 0xa000,
-       // Block 0xd, offset 0x340
-       0x341: 0x3733, 0x342: 0x37b7,
-       0x350: 0x370f, 0x351: 0x3793,
-       0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,
-       0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,
-       0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,
-       0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,
-       0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,
-       0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,
-       0x378: 0x3787, 0x379: 0x380b,
-       // Block 0xe, offset 0x380
-       0x387: 0x1d61,
-       0x391: 0x812d,
-       0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,
-       0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,
-       0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,
-       0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,
-       0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,
-       0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,
-       0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,
-       0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,
-       // Block 0xf, offset 0x3c0
-       0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,
-       0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,
-       0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,
-       0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,
-       0x3de: 0x8132, 0x3df: 0x812d,
-       0x3f0: 0x811e, 0x3f5: 0x1d84,
-       0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,
-       // Block 0x10, offset 0x400
-       0x405: 0xa000,
-       0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,
-       0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,
-       0x412: 0x2d4e,
-       0x434: 0x8102, 0x435: 0x9900,
-       0x43a: 0xa000, 0x43b: 0x2d56,
-       0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,
-       // Block 0x11, offset 0x440
-       0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,
-       0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,
-       0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,
-       0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,
-       0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,
-       0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,
-       0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,
-       0x46a: 0x01fd,
-       0x478: 0x020c,
-       // Block 0x12, offset 0x480
-       0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,
-       0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,
-       0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,
-       0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,
-       0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,
-       0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,
-       0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,
-       // Block 0x13, offset 0x4c0
-       0x4c0: 0x8132, 0x4c1: 0x8132, 0x4c2: 0x812d, 0x4c3: 0x8132, 0x4c4: 0x8132, 0x4c5: 0x8132,
-       0x4c6: 0x8132, 0x4c7: 0x8132, 0x4c8: 0x8132, 0x4c9: 0x8132, 0x4ca: 0x812d, 0x4cb: 0x8132,
-       0x4cc: 0x8132, 0x4cd: 0x8135, 0x4ce: 0x812a, 0x4cf: 0x812d, 0x4d0: 0x8129, 0x4d1: 0x8132,
-       0x4d2: 0x8132, 0x4d3: 0x8132, 0x4d4: 0x8132, 0x4d5: 0x8132, 0x4d6: 0x8132, 0x4d7: 0x8132,
-       0x4d8: 0x8132, 0x4d9: 0x8132, 0x4da: 0x8132, 0x4db: 0x8132, 0x4dc: 0x8132, 0x4dd: 0x8132,
-       0x4de: 0x8132, 0x4df: 0x8132, 0x4e0: 0x8132, 0x4e1: 0x8132, 0x4e2: 0x8132, 0x4e3: 0x8132,
-       0x4e4: 0x8132, 0x4e5: 0x8132, 0x4e6: 0x8132, 0x4e7: 0x8132, 0x4e8: 0x8132, 0x4e9: 0x8132,
-       0x4ea: 0x8132, 0x4eb: 0x8132, 0x4ec: 0x8132, 0x4ed: 0x8132, 0x4ee: 0x8132, 0x4ef: 0x8132,
-       0x4f0: 0x8132, 0x4f1: 0x8132, 0x4f2: 0x8132, 0x4f3: 0x8132, 0x4f4: 0x8132, 0x4f5: 0x8132,
-       0x4f6: 0x8133, 0x4f7: 0x8131, 0x4f8: 0x8131, 0x4f9: 0x812d, 0x4fb: 0x8132,
-       0x4fc: 0x8134, 0x4fd: 0x812d, 0x4fe: 0x8132, 0x4ff: 0x812d,
-       // Block 0x14, offset 0x500
-       0x500: 0x2f97, 0x501: 0x32a3, 0x502: 0x2fa1, 0x503: 0x32ad, 0x504: 0x2fa6, 0x505: 0x32b2,
-       0x506: 0x2fab, 0x507: 0x32b7, 0x508: 0x38cc, 0x509: 0x3a5b, 0x50a: 0x2fc4, 0x50b: 0x32d0,
-       0x50c: 0x2fce, 0x50d: 0x32da, 0x50e: 0x2fdd, 0x50f: 0x32e9, 0x510: 0x2fd3, 0x511: 0x32df,
-       0x512: 0x2fd8, 0x513: 0x32e4, 0x514: 0x38ef, 0x515: 0x3a7e, 0x516: 0x38f6, 0x517: 0x3a85,
-       0x518: 0x3019, 0x519: 0x3325, 0x51a: 0x301e, 0x51b: 0x332a, 0x51c: 0x3904, 0x51d: 0x3a93,
-       0x51e: 0x3023, 0x51f: 0x332f, 0x520: 0x3032, 0x521: 0x333e, 0x522: 0x3050, 0x523: 0x335c,
-       0x524: 0x305f, 0x525: 0x336b, 0x526: 0x3055, 0x527: 0x3361, 0x528: 0x3064, 0x529: 0x3370,
-       0x52a: 0x3069, 0x52b: 0x3375, 0x52c: 0x30af, 0x52d: 0x33bb, 0x52e: 0x390b, 0x52f: 0x3a9a,
-       0x530: 0x30b9, 0x531: 0x33ca, 0x532: 0x30c3, 0x533: 0x33d4, 0x534: 0x30cd, 0x535: 0x33de,
-       0x536: 0x46c4, 0x537: 0x4755, 0x538: 0x3912, 0x539: 0x3aa1, 0x53a: 0x30e6, 0x53b: 0x33f7,
-       0x53c: 0x30e1, 0x53d: 0x33f2, 0x53e: 0x30eb, 0x53f: 0x33fc,
-       // Block 0x15, offset 0x540
-       0x540: 0x30f0, 0x541: 0x3401, 0x542: 0x30f5, 0x543: 0x3406, 0x544: 0x3109, 0x545: 0x341a,
-       0x546: 0x3113, 0x547: 0x3424, 0x548: 0x3122, 0x549: 0x3433, 0x54a: 0x311d, 0x54b: 0x342e,
-       0x54c: 0x3935, 0x54d: 0x3ac4, 0x54e: 0x3943, 0x54f: 0x3ad2, 0x550: 0x394a, 0x551: 0x3ad9,
-       0x552: 0x3951, 0x553: 0x3ae0, 0x554: 0x314f, 0x555: 0x3460, 0x556: 0x3154, 0x557: 0x3465,
-       0x558: 0x315e, 0x559: 0x346f, 0x55a: 0x46f1, 0x55b: 0x4782, 0x55c: 0x3997, 0x55d: 0x3b26,
-       0x55e: 0x3177, 0x55f: 0x3488, 0x560: 0x3181, 0x561: 0x3492, 0x562: 0x4700, 0x563: 0x4791,
-       0x564: 0x399e, 0x565: 0x3b2d, 0x566: 0x39a5, 0x567: 0x3b34, 0x568: 0x39ac, 0x569: 0x3b3b,
-       0x56a: 0x3190, 0x56b: 0x34a1, 0x56c: 0x319a, 0x56d: 0x34b0, 0x56e: 0x31ae, 0x56f: 0x34c4,
-       0x570: 0x31a9, 0x571: 0x34bf, 0x572: 0x31ea, 0x573: 0x3500, 0x574: 0x31f9, 0x575: 0x350f,
-       0x576: 0x31f4, 0x577: 0x350a, 0x578: 0x39b3, 0x579: 0x3b42, 0x57a: 0x39ba, 0x57b: 0x3b49,
-       0x57c: 0x31fe, 0x57d: 0x3514, 0x57e: 0x3203, 0x57f: 0x3519,
-       // Block 0x16, offset 0x580
-       0x580: 0x3208, 0x581: 0x351e, 0x582: 0x320d, 0x583: 0x3523, 0x584: 0x321c, 0x585: 0x3532,
-       0x586: 0x3217, 0x587: 0x352d, 0x588: 0x3221, 0x589: 0x353c, 0x58a: 0x3226, 0x58b: 0x3541,
-       0x58c: 0x322b, 0x58d: 0x3546, 0x58e: 0x3249, 0x58f: 0x3564, 0x590: 0x3262, 0x591: 0x3582,
-       0x592: 0x3271, 0x593: 0x3591, 0x594: 0x3276, 0x595: 0x3596, 0x596: 0x337a, 0x597: 0x34a6,
-       0x598: 0x3537, 0x599: 0x3573, 0x59a: 0x1be0, 0x59b: 0x42d7,
-       0x5a0: 0x46a1, 0x5a1: 0x4732, 0x5a2: 0x2f83, 0x5a3: 0x328f,
-       0x5a4: 0x3878, 0x5a5: 0x3a07, 0x5a6: 0x3871, 0x5a7: 0x3a00, 0x5a8: 0x3886, 0x5a9: 0x3a15,
-       0x5aa: 0x387f, 0x5ab: 0x3a0e, 0x5ac: 0x38be, 0x5ad: 0x3a4d, 0x5ae: 0x3894, 0x5af: 0x3a23,
-       0x5b0: 0x388d, 0x5b1: 0x3a1c, 0x5b2: 0x38a2, 0x5b3: 0x3a31, 0x5b4: 0x389b, 0x5b5: 0x3a2a,
-       0x5b6: 0x38c5, 0x5b7: 0x3a54, 0x5b8: 0x46b5, 0x5b9: 0x4746, 0x5ba: 0x3000, 0x5bb: 0x330c,
-       0x5bc: 0x2fec, 0x5bd: 0x32f8, 0x5be: 0x38da, 0x5bf: 0x3a69,
-       // Block 0x17, offset 0x5c0
-       0x5c0: 0x38d3, 0x5c1: 0x3a62, 0x5c2: 0x38e8, 0x5c3: 0x3a77, 0x5c4: 0x38e1, 0x5c5: 0x3a70,
-       0x5c6: 0x38fd, 0x5c7: 0x3a8c, 0x5c8: 0x3091, 0x5c9: 0x339d, 0x5ca: 0x30a5, 0x5cb: 0x33b1,
-       0x5cc: 0x46e7, 0x5cd: 0x4778, 0x5ce: 0x3136, 0x5cf: 0x3447, 0x5d0: 0x3920, 0x5d1: 0x3aaf,
-       0x5d2: 0x3919, 0x5d3: 0x3aa8, 0x5d4: 0x392e, 0x5d5: 0x3abd, 0x5d6: 0x3927, 0x5d7: 0x3ab6,
-       0x5d8: 0x3989, 0x5d9: 0x3b18, 0x5da: 0x396d, 0x5db: 0x3afc, 0x5dc: 0x3966, 0x5dd: 0x3af5,
-       0x5de: 0x397b, 0x5df: 0x3b0a, 0x5e0: 0x3974, 0x5e1: 0x3b03, 0x5e2: 0x3982, 0x5e3: 0x3b11,
-       0x5e4: 0x31e5, 0x5e5: 0x34fb, 0x5e6: 0x31c7, 0x5e7: 0x34dd, 0x5e8: 0x39e4, 0x5e9: 0x3b73,
-       0x5ea: 0x39dd, 0x5eb: 0x3b6c, 0x5ec: 0x39f2, 0x5ed: 0x3b81, 0x5ee: 0x39eb, 0x5ef: 0x3b7a,
-       0x5f0: 0x39f9, 0x5f1: 0x3b88, 0x5f2: 0x3230, 0x5f3: 0x354b, 0x5f4: 0x3258, 0x5f5: 0x3578,
-       0x5f6: 0x3253, 0x5f7: 0x356e, 0x5f8: 0x323f, 0x5f9: 0x355a,
-       // Block 0x18, offset 0x600
-       0x600: 0x4804, 0x601: 0x480a, 0x602: 0x491e, 0x603: 0x4936, 0x604: 0x4926, 0x605: 0x493e,
-       0x606: 0x492e, 0x607: 0x4946, 0x608: 0x47aa, 0x609: 0x47b0, 0x60a: 0x488e, 0x60b: 0x48a6,
-       0x60c: 0x4896, 0x60d: 0x48ae, 0x60e: 0x489e, 0x60f: 0x48b6, 0x610: 0x4816, 0x611: 0x481c,
-       0x612: 0x3db8, 0x613: 0x3dc8, 0x614: 0x3dc0, 0x615: 0x3dd0,
-       0x618: 0x47b6, 0x619: 0x47bc, 0x61a: 0x3ce8, 0x61b: 0x3cf8, 0x61c: 0x3cf0, 0x61d: 0x3d00,
-       0x620: 0x482e, 0x621: 0x4834, 0x622: 0x494e, 0x623: 0x4966,
-       0x624: 0x4956, 0x625: 0x496e, 0x626: 0x495e, 0x627: 0x4976, 0x628: 0x47c2, 0x629: 0x47c8,
-       0x62a: 0x48be, 0x62b: 0x48d6, 0x62c: 0x48c6, 0x62d: 0x48de, 0x62e: 0x48ce, 0x62f: 0x48e6,
-       0x630: 0x4846, 0x631: 0x484c, 0x632: 0x3e18, 0x633: 0x3e30, 0x634: 0x3e20, 0x635: 0x3e38,
-       0x636: 0x3e28, 0x637: 0x3e40, 0x638: 0x47ce, 0x639: 0x47d4, 0x63a: 0x3d18, 0x63b: 0x3d30,
-       0x63c: 0x3d20, 0x63d: 0x3d38, 0x63e: 0x3d28, 0x63f: 0x3d40,
-       // Block 0x19, offset 0x640
-       0x640: 0x4852, 0x641: 0x4858, 0x642: 0x3e48, 0x643: 0x3e58, 0x644: 0x3e50, 0x645: 0x3e60,
-       0x648: 0x47da, 0x649: 0x47e0, 0x64a: 0x3d48, 0x64b: 0x3d58,
-       0x64c: 0x3d50, 0x64d: 0x3d60, 0x650: 0x4864, 0x651: 0x486a,
-       0x652: 0x3e80, 0x653: 0x3e98, 0x654: 0x3e88, 0x655: 0x3ea0, 0x656: 0x3e90, 0x657: 0x3ea8,
-       0x659: 0x47e6, 0x65b: 0x3d68, 0x65d: 0x3d70,
-       0x65f: 0x3d78, 0x660: 0x487c, 0x661: 0x4882, 0x662: 0x497e, 0x663: 0x4996,
-       0x664: 0x4986, 0x665: 0x499e, 0x666: 0x498e, 0x667: 0x49a6, 0x668: 0x47ec, 0x669: 0x47f2,
-       0x66a: 0x48ee, 0x66b: 0x4906, 0x66c: 0x48f6, 0x66d: 0x490e, 0x66e: 0x48fe, 0x66f: 0x4916,
-       0x670: 0x47f8, 0x671: 0x431e, 0x672: 0x3691, 0x673: 0x4324, 0x674: 0x4822, 0x675: 0x432a,
-       0x676: 0x36a3, 0x677: 0x4330, 0x678: 0x36c1, 0x679: 0x4336, 0x67a: 0x36d9, 0x67b: 0x433c,
-       0x67c: 0x4870, 0x67d: 0x4342,
-       // Block 0x1a, offset 0x680
-       0x680: 0x3da0, 0x681: 0x3da8, 0x682: 0x4184, 0x683: 0x41a2, 0x684: 0x418e, 0x685: 0x41ac,
-       0x686: 0x4198, 0x687: 0x41b6, 0x688: 0x3cd8, 0x689: 0x3ce0, 0x68a: 0x40d0, 0x68b: 0x40ee,
-       0x68c: 0x40da, 0x68d: 0x40f8, 0x68e: 0x40e4, 0x68f: 0x4102, 0x690: 0x3de8, 0x691: 0x3df0,
-       0x692: 0x41c0, 0x693: 0x41de, 0x694: 0x41ca, 0x695: 0x41e8, 0x696: 0x41d4, 0x697: 0x41f2,
-       0x698: 0x3d08, 0x699: 0x3d10, 0x69a: 0x410c, 0x69b: 0x412a, 0x69c: 0x4116, 0x69d: 0x4134,
-       0x69e: 0x4120, 0x69f: 0x413e, 0x6a0: 0x3ec0, 0x6a1: 0x3ec8, 0x6a2: 0x41fc, 0x6a3: 0x421a,
-       0x6a4: 0x4206, 0x6a5: 0x4224, 0x6a6: 0x4210, 0x6a7: 0x422e, 0x6a8: 0x3d80, 0x6a9: 0x3d88,
-       0x6aa: 0x4148, 0x6ab: 0x4166, 0x6ac: 0x4152, 0x6ad: 0x4170, 0x6ae: 0x415c, 0x6af: 0x417a,
-       0x6b0: 0x3685, 0x6b1: 0x367f, 0x6b2: 0x3d90, 0x6b3: 0x368b, 0x6b4: 0x3d98,
-       0x6b6: 0x4810, 0x6b7: 0x3db0, 0x6b8: 0x35f5, 0x6b9: 0x35ef, 0x6ba: 0x35e3, 0x6bb: 0x42ee,
-       0x6bc: 0x35fb, 0x6bd: 0x4287, 0x6be: 0x01d3, 0x6bf: 0x4287,
-       // Block 0x1b, offset 0x6c0
-       0x6c0: 0x42a0, 0x6c1: 0x4482, 0x6c2: 0x3dd8, 0x6c3: 0x369d, 0x6c4: 0x3de0,
-       0x6c6: 0x483a, 0x6c7: 0x3df8, 0x6c8: 0x3601, 0x6c9: 0x42f4, 0x6ca: 0x360d, 0x6cb: 0x42fa,
-       0x6cc: 0x3619, 0x6cd: 0x4489, 0x6ce: 0x4490, 0x6cf: 0x4497, 0x6d0: 0x36b5, 0x6d1: 0x36af,
-       0x6d2: 0x3e00, 0x6d3: 0x44e4, 0x6d6: 0x36bb, 0x6d7: 0x3e10,
-       0x6d8: 0x3631, 0x6d9: 0x362b, 0x6da: 0x361f, 0x6db: 0x4300, 0x6dd: 0x449e,
-       0x6de: 0x44a5, 0x6df: 0x44ac, 0x6e0: 0x36eb, 0x6e1: 0x36e5, 0x6e2: 0x3e68, 0x6e3: 0x44ec,
-       0x6e4: 0x36cd, 0x6e5: 0x36d3, 0x6e6: 0x36f1, 0x6e7: 0x3e78, 0x6e8: 0x3661, 0x6e9: 0x365b,
-       0x6ea: 0x364f, 0x6eb: 0x430c, 0x6ec: 0x3649, 0x6ed: 0x4474, 0x6ee: 0x447b, 0x6ef: 0x0081,
-       0x6f2: 0x3eb0, 0x6f3: 0x36f7, 0x6f4: 0x3eb8,
-       0x6f6: 0x4888, 0x6f7: 0x3ed0, 0x6f8: 0x363d, 0x6f9: 0x4306, 0x6fa: 0x366d, 0x6fb: 0x4318,
-       0x6fc: 0x3679, 0x6fd: 0x425a, 0x6fe: 0x428c,
-       // Block 0x1c, offset 0x700
-       0x700: 0x1bd8, 0x701: 0x1bdc, 0x702: 0x0047, 0x703: 0x1c54, 0x705: 0x1be8,
-       0x706: 0x1bec, 0x707: 0x00e9, 0x709: 0x1c58, 0x70a: 0x008f, 0x70b: 0x0051,
-       0x70c: 0x0051, 0x70d: 0x0051, 0x70e: 0x0091, 0x70f: 0x00da, 0x710: 0x0053, 0x711: 0x0053,
-       0x712: 0x0059, 0x713: 0x0099, 0x715: 0x005d, 0x716: 0x198d,
-       0x719: 0x0061, 0x71a: 0x0063, 0x71b: 0x0065, 0x71c: 0x0065, 0x71d: 0x0065,
-       0x720: 0x199f, 0x721: 0x1bc8, 0x722: 0x19a8,
-       0x724: 0x0075, 0x726: 0x01b8, 0x728: 0x0075,
-       0x72a: 0x0057, 0x72b: 0x42d2, 0x72c: 0x0045, 0x72d: 0x0047, 0x72f: 0x008b,
-       0x730: 0x004b, 0x731: 0x004d, 0x733: 0x005b, 0x734: 0x009f, 0x735: 0x0215,
-       0x736: 0x0218, 0x737: 0x021b, 0x738: 0x021e, 0x739: 0x0093, 0x73b: 0x1b98,
-       0x73c: 0x01e8, 0x73d: 0x01c1, 0x73e: 0x0179, 0x73f: 0x01a0,
-       // Block 0x1d, offset 0x740
-       0x740: 0x0463, 0x745: 0x0049,
-       0x746: 0x0089, 0x747: 0x008b, 0x748: 0x0093, 0x749: 0x0095,
-       0x750: 0x222e, 0x751: 0x223a,
-       0x752: 0x22ee, 0x753: 0x2216, 0x754: 0x229a, 0x755: 0x2222, 0x756: 0x22a0, 0x757: 0x22b8,
-       0x758: 0x22c4, 0x759: 0x2228, 0x75a: 0x22ca, 0x75b: 0x2234, 0x75c: 0x22be, 0x75d: 0x22d0,
-       0x75e: 0x22d6, 0x75f: 0x1cbc, 0x760: 0x0053, 0x761: 0x195a, 0x762: 0x1ba4, 0x763: 0x1963,
-       0x764: 0x006d, 0x765: 0x19ab, 0x766: 0x1bd0, 0x767: 0x1d48, 0x768: 0x1966, 0x769: 0x0071,
-       0x76a: 0x19b7, 0x76b: 0x1bd4, 0x76c: 0x0059, 0x76d: 0x0047, 0x76e: 0x0049, 0x76f: 0x005b,
-       0x770: 0x0093, 0x771: 0x19e4, 0x772: 0x1c18, 0x773: 0x19ed, 0x774: 0x00ad, 0x775: 0x1a62,
-       0x776: 0x1c4c, 0x777: 0x1d5c, 0x778: 0x19f0, 0x779: 0x00b1, 0x77a: 0x1a65, 0x77b: 0x1c50,
-       0x77c: 0x0099, 0x77d: 0x0087, 0x77e: 0x0089, 0x77f: 0x009b,
-       // Block 0x1e, offset 0x780
-       0x781: 0x3c06, 0x783: 0xa000, 0x784: 0x3c0d, 0x785: 0xa000,
-       0x787: 0x3c14, 0x788: 0xa000, 0x789: 0x3c1b,
-       0x78d: 0xa000,
-       0x7a0: 0x2f65, 0x7a1: 0xa000, 0x7a2: 0x3c29,
-       0x7a4: 0xa000, 0x7a5: 0xa000,
-       0x7ad: 0x3c22, 0x7ae: 0x2f60, 0x7af: 0x2f6a,
-       0x7b0: 0x3c30, 0x7b1: 0x3c37, 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0x3c3e, 0x7b5: 0x3c45,
-       0x7b6: 0xa000, 0x7b7: 0xa000, 0x7b8: 0x3c4c, 0x7b9: 0x3c53, 0x7ba: 0xa000, 0x7bb: 0xa000,
-       0x7bc: 0xa000, 0x7bd: 0xa000,
-       // Block 0x1f, offset 0x7c0
-       0x7c0: 0x3c5a, 0x7c1: 0x3c61, 0x7c2: 0xa000, 0x7c3: 0xa000, 0x7c4: 0x3c76, 0x7c5: 0x3c7d,
-       0x7c6: 0xa000, 0x7c7: 0xa000, 0x7c8: 0x3c84, 0x7c9: 0x3c8b,
-       0x7d1: 0xa000,
-       0x7d2: 0xa000,
-       0x7e2: 0xa000,
-       0x7e8: 0xa000, 0x7e9: 0xa000,
-       0x7eb: 0xa000, 0x7ec: 0x3ca0, 0x7ed: 0x3ca7, 0x7ee: 0x3cae, 0x7ef: 0x3cb5,
-       0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0xa000, 0x7f5: 0xa000,
-       // Block 0x20, offset 0x800
-       0x820: 0x0023, 0x821: 0x0025, 0x822: 0x0027, 0x823: 0x0029,
-       0x824: 0x002b, 0x825: 0x002d, 0x826: 0x002f, 0x827: 0x0031, 0x828: 0x0033, 0x829: 0x1882,
-       0x82a: 0x1885, 0x82b: 0x1888, 0x82c: 0x188b, 0x82d: 0x188e, 0x82e: 0x1891, 0x82f: 0x1894,
-       0x830: 0x1897, 0x831: 0x189a, 0x832: 0x189d, 0x833: 0x18a6, 0x834: 0x1a68, 0x835: 0x1a6c,
-       0x836: 0x1a70, 0x837: 0x1a74, 0x838: 0x1a78, 0x839: 0x1a7c, 0x83a: 0x1a80, 0x83b: 0x1a84,
-       0x83c: 0x1a88, 0x83d: 0x1c80, 0x83e: 0x1c85, 0x83f: 0x1c8a,
-       // Block 0x21, offset 0x840
-       0x840: 0x1c8f, 0x841: 0x1c94, 0x842: 0x1c99, 0x843: 0x1c9e, 0x844: 0x1ca3, 0x845: 0x1ca8,
-       0x846: 0x1cad, 0x847: 0x1cb2, 0x848: 0x187f, 0x849: 0x18a3, 0x84a: 0x18c7, 0x84b: 0x18eb,
-       0x84c: 0x190f, 0x84d: 0x1918, 0x84e: 0x191e, 0x84f: 0x1924, 0x850: 0x192a, 0x851: 0x1b60,
-       0x852: 0x1b64, 0x853: 0x1b68, 0x854: 0x1b6c, 0x855: 0x1b70, 0x856: 0x1b74, 0x857: 0x1b78,
-       0x858: 0x1b7c, 0x859: 0x1b80, 0x85a: 0x1b84, 0x85b: 0x1b88, 0x85c: 0x1af4, 0x85d: 0x1af8,
-       0x85e: 0x1afc, 0x85f: 0x1b00, 0x860: 0x1b04, 0x861: 0x1b08, 0x862: 0x1b0c, 0x863: 0x1b10,
-       0x864: 0x1b14, 0x865: 0x1b18, 0x866: 0x1b1c, 0x867: 0x1b20, 0x868: 0x1b24, 0x869: 0x1b28,
-       0x86a: 0x1b2c, 0x86b: 0x1b30, 0x86c: 0x1b34, 0x86d: 0x1b38, 0x86e: 0x1b3c, 0x86f: 0x1b40,
-       0x870: 0x1b44, 0x871: 0x1b48, 0x872: 0x1b4c, 0x873: 0x1b50, 0x874: 0x1b54, 0x875: 0x1b58,
-       0x876: 0x0043, 0x877: 0x0045, 0x878: 0x0047, 0x879: 0x0049, 0x87a: 0x004b, 0x87b: 0x004d,
-       0x87c: 0x004f, 0x87d: 0x0051, 0x87e: 0x0053, 0x87f: 0x0055,
-       // Block 0x22, offset 0x880
-       0x880: 0x06bf, 0x881: 0x06e3, 0x882: 0x06ef, 0x883: 0x06ff, 0x884: 0x0707, 0x885: 0x0713,
-       0x886: 0x071b, 0x887: 0x0723, 0x888: 0x072f, 0x889: 0x0783, 0x88a: 0x079b, 0x88b: 0x07ab,
-       0x88c: 0x07bb, 0x88d: 0x07cb, 0x88e: 0x07db, 0x88f: 0x07fb, 0x890: 0x07ff, 0x891: 0x0803,
-       0x892: 0x0837, 0x893: 0x085f, 0x894: 0x086f, 0x895: 0x0877, 0x896: 0x087b, 0x897: 0x0887,
-       0x898: 0x08a3, 0x899: 0x08a7, 0x89a: 0x08bf, 0x89b: 0x08c3, 0x89c: 0x08cb, 0x89d: 0x08db,
-       0x89e: 0x0977, 0x89f: 0x098b, 0x8a0: 0x09cb, 0x8a1: 0x09df, 0x8a2: 0x09e7, 0x8a3: 0x09eb,
-       0x8a4: 0x09fb, 0x8a5: 0x0a17, 0x8a6: 0x0a43, 0x8a7: 0x0a4f, 0x8a8: 0x0a6f, 0x8a9: 0x0a7b,
-       0x8aa: 0x0a7f, 0x8ab: 0x0a83, 0x8ac: 0x0a9b, 0x8ad: 0x0a9f, 0x8ae: 0x0acb, 0x8af: 0x0ad7,
-       0x8b0: 0x0adf, 0x8b1: 0x0ae7, 0x8b2: 0x0af7, 0x8b3: 0x0aff, 0x8b4: 0x0b07, 0x8b5: 0x0b33,
-       0x8b6: 0x0b37, 0x8b7: 0x0b3f, 0x8b8: 0x0b43, 0x8b9: 0x0b4b, 0x8ba: 0x0b53, 0x8bb: 0x0b63,
-       0x8bc: 0x0b7f, 0x8bd: 0x0bf7, 0x8be: 0x0c0b, 0x8bf: 0x0c0f,
-       // Block 0x23, offset 0x8c0
-       0x8c0: 0x0c8f, 0x8c1: 0x0c93, 0x8c2: 0x0ca7, 0x8c3: 0x0cab, 0x8c4: 0x0cb3, 0x8c5: 0x0cbb,
-       0x8c6: 0x0cc3, 0x8c7: 0x0ccf, 0x8c8: 0x0cf7, 0x8c9: 0x0d07, 0x8ca: 0x0d1b, 0x8cb: 0x0d8b,
-       0x8cc: 0x0d97, 0x8cd: 0x0da7, 0x8ce: 0x0db3, 0x8cf: 0x0dbf, 0x8d0: 0x0dc7, 0x8d1: 0x0dcb,
-       0x8d2: 0x0dcf, 0x8d3: 0x0dd3, 0x8d4: 0x0dd7, 0x8d5: 0x0e8f, 0x8d6: 0x0ed7, 0x8d7: 0x0ee3,
-       0x8d8: 0x0ee7, 0x8d9: 0x0eeb, 0x8da: 0x0eef, 0x8db: 0x0ef7, 0x8dc: 0x0efb, 0x8dd: 0x0f0f,
-       0x8de: 0x0f2b, 0x8df: 0x0f33, 0x8e0: 0x0f73, 0x8e1: 0x0f77, 0x8e2: 0x0f7f, 0x8e3: 0x0f83,
-       0x8e4: 0x0f8b, 0x8e5: 0x0f8f, 0x8e6: 0x0fb3, 0x8e7: 0x0fb7, 0x8e8: 0x0fd3, 0x8e9: 0x0fd7,
-       0x8ea: 0x0fdb, 0x8eb: 0x0fdf, 0x8ec: 0x0ff3, 0x8ed: 0x1017, 0x8ee: 0x101b, 0x8ef: 0x101f,
-       0x8f0: 0x1043, 0x8f1: 0x1083, 0x8f2: 0x1087, 0x8f3: 0x10a7, 0x8f4: 0x10b7, 0x8f5: 0x10bf,
-       0x8f6: 0x10df, 0x8f7: 0x1103, 0x8f8: 0x1147, 0x8f9: 0x114f, 0x8fa: 0x1163, 0x8fb: 0x116f,
-       0x8fc: 0x1177, 0x8fd: 0x117f, 0x8fe: 0x1183, 0x8ff: 0x1187,
-       // Block 0x24, offset 0x900
-       0x900: 0x119f, 0x901: 0x11a3, 0x902: 0x11bf, 0x903: 0x11c7, 0x904: 0x11cf, 0x905: 0x11d3,
-       0x906: 0x11df, 0x907: 0x11e7, 0x908: 0x11eb, 0x909: 0x11ef, 0x90a: 0x11f7, 0x90b: 0x11fb,
-       0x90c: 0x129b, 0x90d: 0x12af, 0x90e: 0x12e3, 0x90f: 0x12e7, 0x910: 0x12ef, 0x911: 0x131b,
-       0x912: 0x1323, 0x913: 0x132b, 0x914: 0x1333, 0x915: 0x136f, 0x916: 0x1373, 0x917: 0x137b,
-       0x918: 0x137f, 0x919: 0x1383, 0x91a: 0x13af, 0x91b: 0x13b3, 0x91c: 0x13bb, 0x91d: 0x13cf,
-       0x91e: 0x13d3, 0x91f: 0x13ef, 0x920: 0x13f7, 0x921: 0x13fb, 0x922: 0x141f, 0x923: 0x143f,
-       0x924: 0x1453, 0x925: 0x1457, 0x926: 0x145f, 0x927: 0x148b, 0x928: 0x148f, 0x929: 0x149f,
-       0x92a: 0x14c3, 0x92b: 0x14cf, 0x92c: 0x14df, 0x92d: 0x14f7, 0x92e: 0x14ff, 0x92f: 0x1503,
-       0x930: 0x1507, 0x931: 0x150b, 0x932: 0x1517, 0x933: 0x151b, 0x934: 0x1523, 0x935: 0x153f,
-       0x936: 0x1543, 0x937: 0x1547, 0x938: 0x155f, 0x939: 0x1563, 0x93a: 0x156b, 0x93b: 0x157f,
-       0x93c: 0x1583, 0x93d: 0x1587, 0x93e: 0x158f, 0x93f: 0x1593,
-       // Block 0x25, offset 0x940
-       0x946: 0xa000, 0x94b: 0xa000,
-       0x94c: 0x3f08, 0x94d: 0xa000, 0x94e: 0x3f10, 0x94f: 0xa000, 0x950: 0x3f18, 0x951: 0xa000,
-       0x952: 0x3f20, 0x953: 0xa000, 0x954: 0x3f28, 0x955: 0xa000, 0x956: 0x3f30, 0x957: 0xa000,
-       0x958: 0x3f38, 0x959: 0xa000, 0x95a: 0x3f40, 0x95b: 0xa000, 0x95c: 0x3f48, 0x95d: 0xa000,
-       0x95e: 0x3f50, 0x95f: 0xa000, 0x960: 0x3f58, 0x961: 0xa000, 0x962: 0x3f60,
-       0x964: 0xa000, 0x965: 0x3f68, 0x966: 0xa000, 0x967: 0x3f70, 0x968: 0xa000, 0x969: 0x3f78,
-       0x96f: 0xa000,
-       0x970: 0x3f80, 0x971: 0x3f88, 0x972: 0xa000, 0x973: 0x3f90, 0x974: 0x3f98, 0x975: 0xa000,
-       0x976: 0x3fa0, 0x977: 0x3fa8, 0x978: 0xa000, 0x979: 0x3fb0, 0x97a: 0x3fb8, 0x97b: 0xa000,
-       0x97c: 0x3fc0, 0x97d: 0x3fc8,
-       // Block 0x26, offset 0x980
-       0x994: 0x3f00,
-       0x999: 0x9903, 0x99a: 0x9903, 0x99b: 0x42dc, 0x99c: 0x42e2, 0x99d: 0xa000,
-       0x99e: 0x3fd0, 0x99f: 0x26b4,
-       0x9a6: 0xa000,
-       0x9ab: 0xa000, 0x9ac: 0x3fe0, 0x9ad: 0xa000, 0x9ae: 0x3fe8, 0x9af: 0xa000,
-       0x9b0: 0x3ff0, 0x9b1: 0xa000, 0x9b2: 0x3ff8, 0x9b3: 0xa000, 0x9b4: 0x4000, 0x9b5: 0xa000,
-       0x9b6: 0x4008, 0x9b7: 0xa000, 0x9b8: 0x4010, 0x9b9: 0xa000, 0x9ba: 0x4018, 0x9bb: 0xa000,
-       0x9bc: 0x4020, 0x9bd: 0xa000, 0x9be: 0x4028, 0x9bf: 0xa000,
-       // Block 0x27, offset 0x9c0
-       0x9c0: 0x4030, 0x9c1: 0xa000, 0x9c2: 0x4038, 0x9c4: 0xa000, 0x9c5: 0x4040,
-       0x9c6: 0xa000, 0x9c7: 0x4048, 0x9c8: 0xa000, 0x9c9: 0x4050,
-       0x9cf: 0xa000, 0x9d0: 0x4058, 0x9d1: 0x4060,
-       0x9d2: 0xa000, 0x9d3: 0x4068, 0x9d4: 0x4070, 0x9d5: 0xa000, 0x9d6: 0x4078, 0x9d7: 0x4080,
-       0x9d8: 0xa000, 0x9d9: 0x4088, 0x9da: 0x4090, 0x9db: 0xa000, 0x9dc: 0x4098, 0x9dd: 0x40a0,
-       0x9ef: 0xa000,
-       0x9f0: 0xa000, 0x9f1: 0xa000, 0x9f2: 0xa000, 0x9f4: 0x3fd8,
-       0x9f7: 0x40a8, 0x9f8: 0x40b0, 0x9f9: 0x40b8, 0x9fa: 0x40c0,
-       0x9fd: 0xa000, 0x9fe: 0x40c8, 0x9ff: 0x26c9,
-       // Block 0x28, offset 0xa00
-       0xa00: 0x0367, 0xa01: 0x032b, 0xa02: 0x032f, 0xa03: 0x0333, 0xa04: 0x037b, 0xa05: 0x0337,
-       0xa06: 0x033b, 0xa07: 0x033f, 0xa08: 0x0343, 0xa09: 0x0347, 0xa0a: 0x034b, 0xa0b: 0x034f,
-       0xa0c: 0x0353, 0xa0d: 0x0357, 0xa0e: 0x035b, 0xa0f: 0x49bd, 0xa10: 0x49c3, 0xa11: 0x49c9,
-       0xa12: 0x49cf, 0xa13: 0x49d5, 0xa14: 0x49db, 0xa15: 0x49e1, 0xa16: 0x49e7, 0xa17: 0x49ed,
-       0xa18: 0x49f3, 0xa19: 0x49f9, 0xa1a: 0x49ff, 0xa1b: 0x4a05, 0xa1c: 0x4a0b, 0xa1d: 0x4a11,
-       0xa1e: 0x4a17, 0xa1f: 0x4a1d, 0xa20: 0x4a23, 0xa21: 0x4a29, 0xa22: 0x4a2f, 0xa23: 0x4a35,
-       0xa24: 0x03c3, 0xa25: 0x035f, 0xa26: 0x0363, 0xa27: 0x03e7, 0xa28: 0x03eb, 0xa29: 0x03ef,
-       0xa2a: 0x03f3, 0xa2b: 0x03f7, 0xa2c: 0x03fb, 0xa2d: 0x03ff, 0xa2e: 0x036b, 0xa2f: 0x0403,
-       0xa30: 0x0407, 0xa31: 0x036f, 0xa32: 0x0373, 0xa33: 0x0377, 0xa34: 0x037f, 0xa35: 0x0383,
-       0xa36: 0x0387, 0xa37: 0x038b, 0xa38: 0x038f, 0xa39: 0x0393, 0xa3a: 0x0397, 0xa3b: 0x039b,
-       0xa3c: 0x039f, 0xa3d: 0x03a3, 0xa3e: 0x03a7, 0xa3f: 0x03ab,
-       // Block 0x29, offset 0xa40
-       0xa40: 0x03af, 0xa41: 0x03b3, 0xa42: 0x040b, 0xa43: 0x040f, 0xa44: 0x03b7, 0xa45: 0x03bb,
-       0xa46: 0x03bf, 0xa47: 0x03c7, 0xa48: 0x03cb, 0xa49: 0x03cf, 0xa4a: 0x03d3, 0xa4b: 0x03d7,
-       0xa4c: 0x03db, 0xa4d: 0x03df, 0xa4e: 0x03e3,
-       0xa52: 0x06bf, 0xa53: 0x071b, 0xa54: 0x06cb, 0xa55: 0x097b, 0xa56: 0x06cf, 0xa57: 0x06e7,
-       0xa58: 0x06d3, 0xa59: 0x0f93, 0xa5a: 0x0707, 0xa5b: 0x06db, 0xa5c: 0x06c3, 0xa5d: 0x09ff,
-       0xa5e: 0x098f, 0xa5f: 0x072f,
-       // Block 0x2a, offset 0xa80
-       0xa80: 0x2054, 0xa81: 0x205a, 0xa82: 0x2060, 0xa83: 0x2066, 0xa84: 0x206c, 0xa85: 0x2072,
-       0xa86: 0x2078, 0xa87: 0x207e, 0xa88: 0x2084, 0xa89: 0x208a, 0xa8a: 0x2090, 0xa8b: 0x2096,
-       0xa8c: 0x209c, 0xa8d: 0x20a2, 0xa8e: 0x2726, 0xa8f: 0x272f, 0xa90: 0x2738, 0xa91: 0x2741,
-       0xa92: 0x274a, 0xa93: 0x2753, 0xa94: 0x275c, 0xa95: 0x2765, 0xa96: 0x276e, 0xa97: 0x2780,
-       0xa98: 0x2789, 0xa99: 0x2792, 0xa9a: 0x279b, 0xa9b: 0x27a4, 0xa9c: 0x2777, 0xa9d: 0x2bac,
-       0xa9e: 0x2aed, 0xaa0: 0x20a8, 0xaa1: 0x20c0, 0xaa2: 0x20b4, 0xaa3: 0x2108,
-       0xaa4: 0x20c6, 0xaa5: 0x20e4, 0xaa6: 0x20ae, 0xaa7: 0x20de, 0xaa8: 0x20ba, 0xaa9: 0x20f0,
-       0xaaa: 0x2120, 0xaab: 0x213e, 0xaac: 0x2138, 0xaad: 0x212c, 0xaae: 0x217a, 0xaaf: 0x210e,
-       0xab0: 0x211a, 0xab1: 0x2132, 0xab2: 0x2126, 0xab3: 0x2150, 0xab4: 0x20fc, 0xab5: 0x2144,
-       0xab6: 0x216e, 0xab7: 0x2156, 0xab8: 0x20ea, 0xab9: 0x20cc, 0xaba: 0x2102, 0xabb: 0x2114,
-       0xabc: 0x214a, 0xabd: 0x20d2, 0xabe: 0x2174, 0xabf: 0x20f6,
-       // Block 0x2b, offset 0xac0
-       0xac0: 0x215c, 0xac1: 0x20d8, 0xac2: 0x2162, 0xac3: 0x2168, 0xac4: 0x092f, 0xac5: 0x0b03,
-       0xac6: 0x0ca7, 0xac7: 0x10c7,
-       0xad0: 0x1bc4, 0xad1: 0x18a9,
-       0xad2: 0x18ac, 0xad3: 0x18af, 0xad4: 0x18b2, 0xad5: 0x18b5, 0xad6: 0x18b8, 0xad7: 0x18bb,
-       0xad8: 0x18be, 0xad9: 0x18c1, 0xada: 0x18ca, 0xadb: 0x18cd, 0xadc: 0x18d0, 0xadd: 0x18d3,
-       0xade: 0x18d6, 0xadf: 0x18d9, 0xae0: 0x0313, 0xae1: 0x031b, 0xae2: 0x031f, 0xae3: 0x0327,
-       0xae4: 0x032b, 0xae5: 0x032f, 0xae6: 0x0337, 0xae7: 0x033f, 0xae8: 0x0343, 0xae9: 0x034b,
-       0xaea: 0x034f, 0xaeb: 0x0353, 0xaec: 0x0357, 0xaed: 0x035b, 0xaee: 0x2e18, 0xaef: 0x2e20,
-       0xaf0: 0x2e28, 0xaf1: 0x2e30, 0xaf2: 0x2e38, 0xaf3: 0x2e40, 0xaf4: 0x2e48, 0xaf5: 0x2e50,
-       0xaf6: 0x2e60, 0xaf7: 0x2e68, 0xaf8: 0x2e70, 0xaf9: 0x2e78, 0xafa: 0x2e80, 0xafb: 0x2e88,
-       0xafc: 0x2ed3, 0xafd: 0x2e9b, 0xafe: 0x2e58,
-       // Block 0x2c, offset 0xb00
-       0xb00: 0x06bf, 0xb01: 0x071b, 0xb02: 0x06cb, 0xb03: 0x097b, 0xb04: 0x071f, 0xb05: 0x07af,
-       0xb06: 0x06c7, 0xb07: 0x07ab, 0xb08: 0x070b, 0xb09: 0x0887, 0xb0a: 0x0d07, 0xb0b: 0x0e8f,
-       0xb0c: 0x0dd7, 0xb0d: 0x0d1b, 0xb0e: 0x145f, 0xb0f: 0x098b, 0xb10: 0x0ccf, 0xb11: 0x0d4b,
-       0xb12: 0x0d0b, 0xb13: 0x104b, 0xb14: 0x08fb, 0xb15: 0x0f03, 0xb16: 0x1387, 0xb17: 0x105f,
-       0xb18: 0x0843, 0xb19: 0x108f, 0xb1a: 0x0f9b, 0xb1b: 0x0a17, 0xb1c: 0x140f, 0xb1d: 0x077f,
-       0xb1e: 0x08ab, 0xb1f: 0x0df7, 0xb20: 0x1527, 0xb21: 0x0743, 0xb22: 0x07d3, 0xb23: 0x0d9b,
-       0xb24: 0x06cf, 0xb25: 0x06e7, 0xb26: 0x06d3, 0xb27: 0x0adb, 0xb28: 0x08ef, 0xb29: 0x087f,
-       0xb2a: 0x0a57, 0xb2b: 0x0a4b, 0xb2c: 0x0feb, 0xb2d: 0x073f, 0xb2e: 0x139b, 0xb2f: 0x089b,
-       0xb30: 0x09f3, 0xb31: 0x18dc, 0xb32: 0x18df, 0xb33: 0x18e2, 0xb34: 0x18e5, 0xb35: 0x18ee,
-       0xb36: 0x18f1, 0xb37: 0x18f4, 0xb38: 0x18f7, 0xb39: 0x18fa, 0xb3a: 0x18fd, 0xb3b: 0x1900,
-       0xb3c: 0x1903, 0xb3d: 0x1906, 0xb3e: 0x1909, 0xb3f: 0x1912,
-       // Block 0x2d, offset 0xb40
-       0xb40: 0x1cc6, 0xb41: 0x1cd5, 0xb42: 0x1ce4, 0xb43: 0x1cf3, 0xb44: 0x1d02, 0xb45: 0x1d11,
-       0xb46: 0x1d20, 0xb47: 0x1d2f, 0xb48: 0x1d3e, 0xb49: 0x218c, 0xb4a: 0x219e, 0xb4b: 0x21b0,
-       0xb4c: 0x1954, 0xb4d: 0x1c04, 0xb4e: 0x19d2, 0xb4f: 0x1ba8, 0xb50: 0x04cb, 0xb51: 0x04d3,
-       0xb52: 0x04db, 0xb53: 0x04e3, 0xb54: 0x04eb, 0xb55: 0x04ef, 0xb56: 0x04f3, 0xb57: 0x04f7,
-       0xb58: 0x04fb, 0xb59: 0x04ff, 0xb5a: 0x0503, 0xb5b: 0x0507, 0xb5c: 0x050b, 0xb5d: 0x050f,
-       0xb5e: 0x0513, 0xb5f: 0x0517, 0xb60: 0x051b, 0xb61: 0x0523, 0xb62: 0x0527, 0xb63: 0x052b,
-       0xb64: 0x052f, 0xb65: 0x0533, 0xb66: 0x0537, 0xb67: 0x053b, 0xb68: 0x053f, 0xb69: 0x0543,
-       0xb6a: 0x0547, 0xb6b: 0x054b, 0xb6c: 0x054f, 0xb6d: 0x0553, 0xb6e: 0x0557, 0xb6f: 0x055b,
-       0xb70: 0x055f, 0xb71: 0x0563, 0xb72: 0x0567, 0xb73: 0x056f, 0xb74: 0x0577, 0xb75: 0x057f,
-       0xb76: 0x0583, 0xb77: 0x0587, 0xb78: 0x058b, 0xb79: 0x058f, 0xb7a: 0x0593, 0xb7b: 0x0597,
-       0xb7c: 0x059b, 0xb7d: 0x059f, 0xb7e: 0x05a3,
-       // Block 0x2e, offset 0xb80
-       0xb80: 0x2b0c, 0xb81: 0x29a8, 0xb82: 0x2b1c, 0xb83: 0x2880, 0xb84: 0x2ee4, 0xb85: 0x288a,
-       0xb86: 0x2894, 0xb87: 0x2f28, 0xb88: 0x29b5, 0xb89: 0x289e, 0xb8a: 0x28a8, 0xb8b: 0x28b2,
-       0xb8c: 0x29dc, 0xb8d: 0x29e9, 0xb8e: 0x29c2, 0xb8f: 0x29cf, 0xb90: 0x2ea9, 0xb91: 0x29f6,
-       0xb92: 0x2a03, 0xb93: 0x2bbe, 0xb94: 0x26bb, 0xb95: 0x2bd1, 0xb96: 0x2be4, 0xb97: 0x2b2c,
-       0xb98: 0x2a10, 0xb99: 0x2bf7, 0xb9a: 0x2c0a, 0xb9b: 0x2a1d, 0xb9c: 0x28bc, 0xb9d: 0x28c6,
-       0xb9e: 0x2eb7, 0xb9f: 0x2a2a, 0xba0: 0x2b3c, 0xba1: 0x2ef5, 0xba2: 0x28d0, 0xba3: 0x28da,
-       0xba4: 0x2a37, 0xba5: 0x28e4, 0xba6: 0x28ee, 0xba7: 0x26d0, 0xba8: 0x26d7, 0xba9: 0x28f8,
-       0xbaa: 0x2902, 0xbab: 0x2c1d, 0xbac: 0x2a44, 0xbad: 0x2b4c, 0xbae: 0x2c30, 0xbaf: 0x2a51,
-       0xbb0: 0x2916, 0xbb1: 0x290c, 0xbb2: 0x2f3c, 0xbb3: 0x2a5e, 0xbb4: 0x2c43, 0xbb5: 0x2920,
-       0xbb6: 0x2b5c, 0xbb7: 0x292a, 0xbb8: 0x2a78, 0xbb9: 0x2934, 0xbba: 0x2a85, 0xbbb: 0x2f06,
-       0xbbc: 0x2a6b, 0xbbd: 0x2b6c, 0xbbe: 0x2a92, 0xbbf: 0x26de,
-       // Block 0x2f, offset 0xbc0
-       0xbc0: 0x2f17, 0xbc1: 0x293e, 0xbc2: 0x2948, 0xbc3: 0x2a9f, 0xbc4: 0x2952, 0xbc5: 0x295c,
-       0xbc6: 0x2966, 0xbc7: 0x2b7c, 0xbc8: 0x2aac, 0xbc9: 0x26e5, 0xbca: 0x2c56, 0xbcb: 0x2e90,
-       0xbcc: 0x2b8c, 0xbcd: 0x2ab9, 0xbce: 0x2ec5, 0xbcf: 0x2970, 0xbd0: 0x297a, 0xbd1: 0x2ac6,
-       0xbd2: 0x26ec, 0xbd3: 0x2ad3, 0xbd4: 0x2b9c, 0xbd5: 0x26f3, 0xbd6: 0x2c69, 0xbd7: 0x2984,
-       0xbd8: 0x1cb7, 0xbd9: 0x1ccb, 0xbda: 0x1cda, 0xbdb: 0x1ce9, 0xbdc: 0x1cf8, 0xbdd: 0x1d07,
-       0xbde: 0x1d16, 0xbdf: 0x1d25, 0xbe0: 0x1d34, 0xbe1: 0x1d43, 0xbe2: 0x2192, 0xbe3: 0x21a4,
-       0xbe4: 0x21b6, 0xbe5: 0x21c2, 0xbe6: 0x21ce, 0xbe7: 0x21da, 0xbe8: 0x21e6, 0xbe9: 0x21f2,
-       0xbea: 0x21fe, 0xbeb: 0x220a, 0xbec: 0x2246, 0xbed: 0x2252, 0xbee: 0x225e, 0xbef: 0x226a,
-       0xbf0: 0x2276, 0xbf1: 0x1c14, 0xbf2: 0x19c6, 0xbf3: 0x1936, 0xbf4: 0x1be4, 0xbf5: 0x1a47,
-       0xbf6: 0x1a56, 0xbf7: 0x19cc, 0xbf8: 0x1bfc, 0xbf9: 0x1c00, 0xbfa: 0x1960, 0xbfb: 0x2701,
-       0xbfc: 0x270f, 0xbfd: 0x26fa, 0xbfe: 0x2708, 0xbff: 0x2ae0,
-       // Block 0x30, offset 0xc00
-       0xc00: 0x1a4a, 0xc01: 0x1a32, 0xc02: 0x1c60, 0xc03: 0x1a1a, 0xc04: 0x19f3, 0xc05: 0x1969,
-       0xc06: 0x1978, 0xc07: 0x1948, 0xc08: 0x1bf0, 0xc09: 0x1d52, 0xc0a: 0x1a4d, 0xc0b: 0x1a35,
-       0xc0c: 0x1c64, 0xc0d: 0x1c70, 0xc0e: 0x1a26, 0xc0f: 0x19fc, 0xc10: 0x1957, 0xc11: 0x1c1c,
-       0xc12: 0x1bb0, 0xc13: 0x1b9c, 0xc14: 0x1bcc, 0xc15: 0x1c74, 0xc16: 0x1a29, 0xc17: 0x19c9,
-       0xc18: 0x19ff, 0xc19: 0x19de, 0xc1a: 0x1a41, 0xc1b: 0x1c78, 0xc1c: 0x1a2c, 0xc1d: 0x19c0,
-       0xc1e: 0x1a02, 0xc1f: 0x1c3c, 0xc20: 0x1bf4, 0xc21: 0x1a14, 0xc22: 0x1c24, 0xc23: 0x1c40,
-       0xc24: 0x1bf8, 0xc25: 0x1a17, 0xc26: 0x1c28, 0xc27: 0x22e8, 0xc28: 0x22fc, 0xc29: 0x1996,
-       0xc2a: 0x1c20, 0xc2b: 0x1bb4, 0xc2c: 0x1ba0, 0xc2d: 0x1c48, 0xc2e: 0x2716, 0xc2f: 0x27ad,
-       0xc30: 0x1a59, 0xc31: 0x1a44, 0xc32: 0x1c7c, 0xc33: 0x1a2f, 0xc34: 0x1a50, 0xc35: 0x1a38,
-       0xc36: 0x1c68, 0xc37: 0x1a1d, 0xc38: 0x19f6, 0xc39: 0x1981, 0xc3a: 0x1a53, 0xc3b: 0x1a3b,
-       0xc3c: 0x1c6c, 0xc3d: 0x1a20, 0xc3e: 0x19f9, 0xc3f: 0x1984,
-       // Block 0x31, offset 0xc40
-       0xc40: 0x1c2c, 0xc41: 0x1bb8, 0xc42: 0x1d4d, 0xc43: 0x1939, 0xc44: 0x19ba, 0xc45: 0x19bd,
-       0xc46: 0x22f5, 0xc47: 0x1b94, 0xc48: 0x19c3, 0xc49: 0x194b, 0xc4a: 0x19e1, 0xc4b: 0x194e,
-       0xc4c: 0x19ea, 0xc4d: 0x196c, 0xc4e: 0x196f, 0xc4f: 0x1a05, 0xc50: 0x1a0b, 0xc51: 0x1a0e,
-       0xc52: 0x1c30, 0xc53: 0x1a11, 0xc54: 0x1a23, 0xc55: 0x1c38, 0xc56: 0x1c44, 0xc57: 0x1990,
-       0xc58: 0x1d57, 0xc59: 0x1bbc, 0xc5a: 0x1993, 0xc5b: 0x1a5c, 0xc5c: 0x19a5, 0xc5d: 0x19b4,
-       0xc5e: 0x22e2, 0xc5f: 0x22dc, 0xc60: 0x1cc1, 0xc61: 0x1cd0, 0xc62: 0x1cdf, 0xc63: 0x1cee,
-       0xc64: 0x1cfd, 0xc65: 0x1d0c, 0xc66: 0x1d1b, 0xc67: 0x1d2a, 0xc68: 0x1d39, 0xc69: 0x2186,
-       0xc6a: 0x2198, 0xc6b: 0x21aa, 0xc6c: 0x21bc, 0xc6d: 0x21c8, 0xc6e: 0x21d4, 0xc6f: 0x21e0,
-       0xc70: 0x21ec, 0xc71: 0x21f8, 0xc72: 0x2204, 0xc73: 0x2240, 0xc74: 0x224c, 0xc75: 0x2258,
-       0xc76: 0x2264, 0xc77: 0x2270, 0xc78: 0x227c, 0xc79: 0x2282, 0xc7a: 0x2288, 0xc7b: 0x228e,
-       0xc7c: 0x2294, 0xc7d: 0x22a6, 0xc7e: 0x22ac, 0xc7f: 0x1c10,
-       // Block 0x32, offset 0xc80
-       0xc80: 0x1377, 0xc81: 0x0cfb, 0xc82: 0x13d3, 0xc83: 0x139f, 0xc84: 0x0e57, 0xc85: 0x06eb,
-       0xc86: 0x08df, 0xc87: 0x162b, 0xc88: 0x162b, 0xc89: 0x0a0b, 0xc8a: 0x145f, 0xc8b: 0x0943,
-       0xc8c: 0x0a07, 0xc8d: 0x0bef, 0xc8e: 0x0fcf, 0xc8f: 0x115f, 0xc90: 0x1297, 0xc91: 0x12d3,
-       0xc92: 0x1307, 0xc93: 0x141b, 0xc94: 0x0d73, 0xc95: 0x0dff, 0xc96: 0x0eab, 0xc97: 0x0f43,
-       0xc98: 0x125f, 0xc99: 0x1447, 0xc9a: 0x1573, 0xc9b: 0x070f, 0xc9c: 0x08b3, 0xc9d: 0x0d87,
-       0xc9e: 0x0ecf, 0xc9f: 0x1293, 0xca0: 0x15c3, 0xca1: 0x0ab3, 0xca2: 0x0e77, 0xca3: 0x1283,
-       0xca4: 0x1317, 0xca5: 0x0c23, 0xca6: 0x11bb, 0xca7: 0x12df, 0xca8: 0x0b1f, 0xca9: 0x0d0f,
-       0xcaa: 0x0e17, 0xcab: 0x0f1b, 0xcac: 0x1427, 0xcad: 0x074f, 0xcae: 0x07e7, 0xcaf: 0x0853,
-       0xcb0: 0x0c8b, 0xcb1: 0x0d7f, 0xcb2: 0x0ecb, 0xcb3: 0x0fef, 0xcb4: 0x1177, 0xcb5: 0x128b,
-       0xcb6: 0x12a3, 0xcb7: 0x13c7, 0xcb8: 0x14ef, 0xcb9: 0x15a3, 0xcba: 0x15bf, 0xcbb: 0x102b,
-       0xcbc: 0x106b, 0xcbd: 0x1123, 0xcbe: 0x1243, 0xcbf: 0x147b,
-       // Block 0x33, offset 0xcc0
-       0xcc0: 0x15cb, 0xcc1: 0x134b, 0xcc2: 0x09c7, 0xcc3: 0x0b3b, 0xcc4: 0x10db, 0xcc5: 0x119b,
-       0xcc6: 0x0eff, 0xcc7: 0x1033, 0xcc8: 0x1397, 0xcc9: 0x14e7, 0xcca: 0x09c3, 0xccb: 0x0a8f,
-       0xccc: 0x0d77, 0xccd: 0x0e2b, 0xcce: 0x0e5f, 0xccf: 0x1113, 0xcd0: 0x113b, 0xcd1: 0x14a7,
-       0xcd2: 0x084f, 0xcd3: 0x11a7, 0xcd4: 0x07f3, 0xcd5: 0x07ef, 0xcd6: 0x1097, 0xcd7: 0x1127,
-       0xcd8: 0x125b, 0xcd9: 0x14af, 0xcda: 0x1367, 0xcdb: 0x0c27, 0xcdc: 0x0d73, 0xcdd: 0x1357,
-       0xcde: 0x06f7, 0xcdf: 0x0a63, 0xce0: 0x0b93, 0xce1: 0x0f2f, 0xce2: 0x0faf, 0xce3: 0x0873,
-       0xce4: 0x103b, 0xce5: 0x075f, 0xce6: 0x0b77, 0xce7: 0x06d7, 0xce8: 0x0deb, 0xce9: 0x0ca3,
-       0xcea: 0x110f, 0xceb: 0x08c7, 0xcec: 0x09b3, 0xced: 0x0ffb, 0xcee: 0x1263, 0xcef: 0x133b,
-       0xcf0: 0x0db7, 0xcf1: 0x13f7, 0xcf2: 0x0de3, 0xcf3: 0x0c37, 0xcf4: 0x121b, 0xcf5: 0x0c57,
-       0xcf6: 0x0fab, 0xcf7: 0x072b, 0xcf8: 0x07a7, 0xcf9: 0x07eb, 0xcfa: 0x0d53, 0xcfb: 0x10fb,
-       0xcfc: 0x11f3, 0xcfd: 0x1347, 0xcfe: 0x145b, 0xcff: 0x085b,
-       // Block 0x34, offset 0xd00
-       0xd00: 0x090f, 0xd01: 0x0a17, 0xd02: 0x0b2f, 0xd03: 0x0cbf, 0xd04: 0x0e7b, 0xd05: 0x103f,
-       0xd06: 0x1497, 0xd07: 0x157b, 0xd08: 0x15cf, 0xd09: 0x15e7, 0xd0a: 0x0837, 0xd0b: 0x0cf3,
-       0xd0c: 0x0da3, 0xd0d: 0x13eb, 0xd0e: 0x0afb, 0xd0f: 0x0bd7, 0xd10: 0x0bf3, 0xd11: 0x0c83,
-       0xd12: 0x0e6b, 0xd13: 0x0eb7, 0xd14: 0x0f67, 0xd15: 0x108b, 0xd16: 0x112f, 0xd17: 0x1193,
-       0xd18: 0x13db, 0xd19: 0x126b, 0xd1a: 0x1403, 0xd1b: 0x147f, 0xd1c: 0x080f, 0xd1d: 0x083b,
-       0xd1e: 0x0923, 0xd1f: 0x0ea7, 0xd20: 0x12f3, 0xd21: 0x133b, 0xd22: 0x0b1b, 0xd23: 0x0b8b,
-       0xd24: 0x0c4f, 0xd25: 0x0daf, 0xd26: 0x10d7, 0xd27: 0x0f23, 0xd28: 0x073b, 0xd29: 0x097f,
-       0xd2a: 0x0a63, 0xd2b: 0x0ac7, 0xd2c: 0x0b97, 0xd2d: 0x0f3f, 0xd2e: 0x0f5b, 0xd2f: 0x116b,
-       0xd30: 0x118b, 0xd31: 0x1463, 0xd32: 0x14e3, 0xd33: 0x14f3, 0xd34: 0x152f, 0xd35: 0x0753,
-       0xd36: 0x107f, 0xd37: 0x144f, 0xd38: 0x14cb, 0xd39: 0x0baf, 0xd3a: 0x0717, 0xd3b: 0x0777,
-       0xd3c: 0x0a67, 0xd3d: 0x0a87, 0xd3e: 0x0caf, 0xd3f: 0x0d73,
-       // Block 0x35, offset 0xd40
-       0xd40: 0x0ec3, 0xd41: 0x0fcb, 0xd42: 0x1277, 0xd43: 0x1417, 0xd44: 0x1623, 0xd45: 0x0ce3,
-       0xd46: 0x14a3, 0xd47: 0x0833, 0xd48: 0x0d2f, 0xd49: 0x0d3b, 0xd4a: 0x0e0f, 0xd4b: 0x0e47,
-       0xd4c: 0x0f4b, 0xd4d: 0x0fa7, 0xd4e: 0x1027, 0xd4f: 0x110b, 0xd50: 0x153b, 0xd51: 0x07af,
-       0xd52: 0x0c03, 0xd53: 0x14b3, 0xd54: 0x0767, 0xd55: 0x0aab, 0xd56: 0x0e2f, 0xd57: 0x13df,
-       0xd58: 0x0b67, 0xd59: 0x0bb7, 0xd5a: 0x0d43, 0xd5b: 0x0f2f, 0xd5c: 0x14bb, 0xd5d: 0x0817,
-       0xd5e: 0x08ff, 0xd5f: 0x0a97, 0xd60: 0x0cd3, 0xd61: 0x0d1f, 0xd62: 0x0d5f, 0xd63: 0x0df3,
-       0xd64: 0x0f47, 0xd65: 0x0fbb, 0xd66: 0x1157, 0xd67: 0x12f7, 0xd68: 0x1303, 0xd69: 0x1457,
-       0xd6a: 0x14d7, 0xd6b: 0x0883, 0xd6c: 0x0e4b, 0xd6d: 0x0903, 0xd6e: 0x0ec7, 0xd6f: 0x0f6b,
-       0xd70: 0x1287, 0xd71: 0x14bf, 0xd72: 0x15ab, 0xd73: 0x15d3, 0xd74: 0x0d37, 0xd75: 0x0e27,
-       0xd76: 0x11c3, 0xd77: 0x10b7, 0xd78: 0x10c3, 0xd79: 0x10e7, 0xd7a: 0x0f17, 0xd7b: 0x0e9f,
-       0xd7c: 0x1363, 0xd7d: 0x0733, 0xd7e: 0x122b, 0xd7f: 0x081b,
-       // Block 0x36, offset 0xd80
-       0xd80: 0x080b, 0xd81: 0x0b0b, 0xd82: 0x0c2b, 0xd83: 0x10f3, 0xd84: 0x0a53, 0xd85: 0x0e03,
-       0xd86: 0x0cef, 0xd87: 0x13e7, 0xd88: 0x12e7, 0xd89: 0x14ab, 0xd8a: 0x1323, 0xd8b: 0x0b27,
-       0xd8c: 0x0787, 0xd8d: 0x095b, 0xd90: 0x09af,
-       0xd92: 0x0cdf, 0xd95: 0x07f7, 0xd96: 0x0f1f, 0xd97: 0x0fe3,
-       0xd98: 0x1047, 0xd99: 0x1063, 0xd9a: 0x1067, 0xd9b: 0x107b, 0xd9c: 0x14fb, 0xd9d: 0x10eb,
-       0xd9e: 0x116f, 0xda0: 0x128f, 0xda2: 0x1353,
-       0xda5: 0x1407, 0xda6: 0x1433,
-       0xdaa: 0x154f, 0xdab: 0x1553, 0xdac: 0x1557, 0xdad: 0x15bb, 0xdae: 0x142b, 0xdaf: 0x14c7,
-       0xdb0: 0x0757, 0xdb1: 0x077b, 0xdb2: 0x078f, 0xdb3: 0x084b, 0xdb4: 0x0857, 0xdb5: 0x0897,
-       0xdb6: 0x094b, 0xdb7: 0x0967, 0xdb8: 0x096f, 0xdb9: 0x09ab, 0xdba: 0x09b7, 0xdbb: 0x0a93,
-       0xdbc: 0x0a9b, 0xdbd: 0x0ba3, 0xdbe: 0x0bcb, 0xdbf: 0x0bd3,
-       // Block 0x37, offset 0xdc0
-       0xdc0: 0x0beb, 0xdc1: 0x0c97, 0xdc2: 0x0cc7, 0xdc3: 0x0ce7, 0xdc4: 0x0d57, 0xdc5: 0x0e1b,
-       0xdc6: 0x0e37, 0xdc7: 0x0e67, 0xdc8: 0x0ebb, 0xdc9: 0x0edb, 0xdca: 0x0f4f, 0xdcb: 0x102f,
-       0xdcc: 0x104b, 0xdcd: 0x1053, 0xdce: 0x104f, 0xdcf: 0x1057, 0xdd0: 0x105b, 0xdd1: 0x105f,
-       0xdd2: 0x1073, 0xdd3: 0x1077, 0xdd4: 0x109b, 0xdd5: 0x10af, 0xdd6: 0x10cb, 0xdd7: 0x112f,
-       0xdd8: 0x1137, 0xdd9: 0x113f, 0xdda: 0x1153, 0xddb: 0x117b, 0xddc: 0x11cb, 0xddd: 0x11ff,
-       0xdde: 0x11ff, 0xddf: 0x1267, 0xde0: 0x130f, 0xde1: 0x1327, 0xde2: 0x135b, 0xde3: 0x135f,
-       0xde4: 0x13a3, 0xde5: 0x13a7, 0xde6: 0x13ff, 0xde7: 0x1407, 0xde8: 0x14db, 0xde9: 0x151f,
-       0xdea: 0x1537, 0xdeb: 0x0b9b, 0xdec: 0x171e, 0xded: 0x11e3,
-       0xdf0: 0x06df, 0xdf1: 0x07e3, 0xdf2: 0x07a3, 0xdf3: 0x074b, 0xdf4: 0x078b, 0xdf5: 0x07b7,
-       0xdf6: 0x0847, 0xdf7: 0x0863, 0xdf8: 0x094b, 0xdf9: 0x0937, 0xdfa: 0x0947, 0xdfb: 0x0963,
-       0xdfc: 0x09af, 0xdfd: 0x09bf, 0xdfe: 0x0a03, 0xdff: 0x0a0f,
-       // Block 0x38, offset 0xe00
-       0xe00: 0x0a2b, 0xe01: 0x0a3b, 0xe02: 0x0b23, 0xe03: 0x0b2b, 0xe04: 0x0b5b, 0xe05: 0x0b7b,
-       0xe06: 0x0bab, 0xe07: 0x0bc3, 0xe08: 0x0bb3, 0xe09: 0x0bd3, 0xe0a: 0x0bc7, 0xe0b: 0x0beb,
-       0xe0c: 0x0c07, 0xe0d: 0x0c5f, 0xe0e: 0x0c6b, 0xe0f: 0x0c73, 0xe10: 0x0c9b, 0xe11: 0x0cdf,
-       0xe12: 0x0d0f, 0xe13: 0x0d13, 0xe14: 0x0d27, 0xe15: 0x0da7, 0xe16: 0x0db7, 0xe17: 0x0e0f,
-       0xe18: 0x0e5b, 0xe19: 0x0e53, 0xe1a: 0x0e67, 0xe1b: 0x0e83, 0xe1c: 0x0ebb, 0xe1d: 0x1013,
-       0xe1e: 0x0edf, 0xe1f: 0x0f13, 0xe20: 0x0f1f, 0xe21: 0x0f5f, 0xe22: 0x0f7b, 0xe23: 0x0f9f,
-       0xe24: 0x0fc3, 0xe25: 0x0fc7, 0xe26: 0x0fe3, 0xe27: 0x0fe7, 0xe28: 0x0ff7, 0xe29: 0x100b,
-       0xe2a: 0x1007, 0xe2b: 0x1037, 0xe2c: 0x10b3, 0xe2d: 0x10cb, 0xe2e: 0x10e3, 0xe2f: 0x111b,
-       0xe30: 0x112f, 0xe31: 0x114b, 0xe32: 0x117b, 0xe33: 0x122f, 0xe34: 0x1257, 0xe35: 0x12cb,
-       0xe36: 0x1313, 0xe37: 0x131f, 0xe38: 0x1327, 0xe39: 0x133f, 0xe3a: 0x1353, 0xe3b: 0x1343,
-       0xe3c: 0x135b, 0xe3d: 0x1357, 0xe3e: 0x134f, 0xe3f: 0x135f,
-       // Block 0x39, offset 0xe40
-       0xe40: 0x136b, 0xe41: 0x13a7, 0xe42: 0x13e3, 0xe43: 0x1413, 0xe44: 0x144b, 0xe45: 0x146b,
-       0xe46: 0x14b7, 0xe47: 0x14db, 0xe48: 0x14fb, 0xe49: 0x150f, 0xe4a: 0x151f, 0xe4b: 0x152b,
-       0xe4c: 0x1537, 0xe4d: 0x158b, 0xe4e: 0x162b, 0xe4f: 0x16b5, 0xe50: 0x16b0, 0xe51: 0x16e2,
-       0xe52: 0x0607, 0xe53: 0x062f, 0xe54: 0x0633, 0xe55: 0x1764, 0xe56: 0x1791, 0xe57: 0x1809,
-       0xe58: 0x1617, 0xe59: 0x1627,
-       // Block 0x3a, offset 0xe80
-       0xe80: 0x19d5, 0xe81: 0x19d8, 0xe82: 0x19db, 0xe83: 0x1c08, 0xe84: 0x1c0c, 0xe85: 0x1a5f,
-       0xe86: 0x1a5f,
-       0xe93: 0x1d75, 0xe94: 0x1d66, 0xe95: 0x1d6b, 0xe96: 0x1d7a, 0xe97: 0x1d70,
-       0xe9d: 0x4390,
-       0xe9e: 0x8115, 0xe9f: 0x4402, 0xea0: 0x022d, 0xea1: 0x0215, 0xea2: 0x021e, 0xea3: 0x0221,
-       0xea4: 0x0224, 0xea5: 0x0227, 0xea6: 0x022a, 0xea7: 0x0230, 0xea8: 0x0233, 0xea9: 0x0017,
-       0xeaa: 0x43f0, 0xeab: 0x43f6, 0xeac: 0x44f4, 0xead: 0x44fc, 0xeae: 0x4348, 0xeaf: 0x434e,
-       0xeb0: 0x4354, 0xeb1: 0x435a, 0xeb2: 0x4366, 0xeb3: 0x436c, 0xeb4: 0x4372, 0xeb5: 0x437e,
-       0xeb6: 0x4384, 0xeb8: 0x438a, 0xeb9: 0x4396, 0xeba: 0x439c, 0xebb: 0x43a2,
-       0xebc: 0x43ae, 0xebe: 0x43b4,
-       // Block 0x3b, offset 0xec0
-       0xec0: 0x43ba, 0xec1: 0x43c0, 0xec3: 0x43c6, 0xec4: 0x43cc,
-       0xec6: 0x43d8, 0xec7: 0x43de, 0xec8: 0x43e4, 0xec9: 0x43ea, 0xeca: 0x43fc, 0xecb: 0x4378,
-       0xecc: 0x4360, 0xecd: 0x43a8, 0xece: 0x43d2, 0xecf: 0x1d7f, 0xed0: 0x0299, 0xed1: 0x0299,
-       0xed2: 0x02a2, 0xed3: 0x02a2, 0xed4: 0x02a2, 0xed5: 0x02a2, 0xed6: 0x02a5, 0xed7: 0x02a5,
-       0xed8: 0x02a5, 0xed9: 0x02a5, 0xeda: 0x02ab, 0xedb: 0x02ab, 0xedc: 0x02ab, 0xedd: 0x02ab,
-       0xede: 0x029f, 0xedf: 0x029f, 0xee0: 0x029f, 0xee1: 0x029f, 0xee2: 0x02a8, 0xee3: 0x02a8,
-       0xee4: 0x02a8, 0xee5: 0x02a8, 0xee6: 0x029c, 0xee7: 0x029c, 0xee8: 0x029c, 0xee9: 0x029c,
-       0xeea: 0x02cf, 0xeeb: 0x02cf, 0xeec: 0x02cf, 0xeed: 0x02cf, 0xeee: 0x02d2, 0xeef: 0x02d2,
-       0xef0: 0x02d2, 0xef1: 0x02d2, 0xef2: 0x02b1, 0xef3: 0x02b1, 0xef4: 0x02b1, 0xef5: 0x02b1,
-       0xef6: 0x02ae, 0xef7: 0x02ae, 0xef8: 0x02ae, 0xef9: 0x02ae, 0xefa: 0x02b4, 0xefb: 0x02b4,
-       0xefc: 0x02b4, 0xefd: 0x02b4, 0xefe: 0x02b7, 0xeff: 0x02b7,
-       // Block 0x3c, offset 0xf00
-       0xf00: 0x02b7, 0xf01: 0x02b7, 0xf02: 0x02c0, 0xf03: 0x02c0, 0xf04: 0x02bd, 0xf05: 0x02bd,
-       0xf06: 0x02c3, 0xf07: 0x02c3, 0xf08: 0x02ba, 0xf09: 0x02ba, 0xf0a: 0x02c9, 0xf0b: 0x02c9,
-       0xf0c: 0x02c6, 0xf0d: 0x02c6, 0xf0e: 0x02d5, 0xf0f: 0x02d5, 0xf10: 0x02d5, 0xf11: 0x02d5,
-       0xf12: 0x02db, 0xf13: 0x02db, 0xf14: 0x02db, 0xf15: 0x02db, 0xf16: 0x02e1, 0xf17: 0x02e1,
-       0xf18: 0x02e1, 0xf19: 0x02e1, 0xf1a: 0x02de, 0xf1b: 0x02de, 0xf1c: 0x02de, 0xf1d: 0x02de,
-       0xf1e: 0x02e4, 0xf1f: 0x02e4, 0xf20: 0x02e7, 0xf21: 0x02e7, 0xf22: 0x02e7, 0xf23: 0x02e7,
-       0xf24: 0x446e, 0xf25: 0x446e, 0xf26: 0x02ed, 0xf27: 0x02ed, 0xf28: 0x02ed, 0xf29: 0x02ed,
-       0xf2a: 0x02ea, 0xf2b: 0x02ea, 0xf2c: 0x02ea, 0xf2d: 0x02ea, 0xf2e: 0x0308, 0xf2f: 0x0308,
-       0xf30: 0x4468, 0xf31: 0x4468,
-       // Block 0x3d, offset 0xf40
-       0xf53: 0x02d8, 0xf54: 0x02d8, 0xf55: 0x02d8, 0xf56: 0x02d8, 0xf57: 0x02f6,
-       0xf58: 0x02f6, 0xf59: 0x02f3, 0xf5a: 0x02f3, 0xf5b: 0x02f9, 0xf5c: 0x02f9, 0xf5d: 0x204f,
-       0xf5e: 0x02ff, 0xf5f: 0x02ff, 0xf60: 0x02f0, 0xf61: 0x02f0, 0xf62: 0x02fc, 0xf63: 0x02fc,
-       0xf64: 0x0305, 0xf65: 0x0305, 0xf66: 0x0305, 0xf67: 0x0305, 0xf68: 0x028d, 0xf69: 0x028d,
-       0xf6a: 0x25aa, 0xf6b: 0x25aa, 0xf6c: 0x261a, 0xf6d: 0x261a, 0xf6e: 0x25e9, 0xf6f: 0x25e9,
-       0xf70: 0x2605, 0xf71: 0x2605, 0xf72: 0x25fe, 0xf73: 0x25fe, 0xf74: 0x260c, 0xf75: 0x260c,
-       0xf76: 0x2613, 0xf77: 0x2613, 0xf78: 0x2613, 0xf79: 0x25f0, 0xf7a: 0x25f0, 0xf7b: 0x25f0,
-       0xf7c: 0x0302, 0xf7d: 0x0302, 0xf7e: 0x0302, 0xf7f: 0x0302,
-       // Block 0x3e, offset 0xf80
-       0xf80: 0x25b1, 0xf81: 0x25b8, 0xf82: 0x25d4, 0xf83: 0x25f0, 0xf84: 0x25f7, 0xf85: 0x1d89,
-       0xf86: 0x1d8e, 0xf87: 0x1d93, 0xf88: 0x1da2, 0xf89: 0x1db1, 0xf8a: 0x1db6, 0xf8b: 0x1dbb,
-       0xf8c: 0x1dc0, 0xf8d: 0x1dc5, 0xf8e: 0x1dd4, 0xf8f: 0x1de3, 0xf90: 0x1de8, 0xf91: 0x1ded,
-       0xf92: 0x1dfc, 0xf93: 0x1e0b, 0xf94: 0x1e10, 0xf95: 0x1e15, 0xf96: 0x1e1a, 0xf97: 0x1e29,
-       0xf98: 0x1e2e, 0xf99: 0x1e3d, 0xf9a: 0x1e42, 0xf9b: 0x1e47, 0xf9c: 0x1e56, 0xf9d: 0x1e5b,
-       0xf9e: 0x1e60, 0xf9f: 0x1e6a, 0xfa0: 0x1ea6, 0xfa1: 0x1eb5, 0xfa2: 0x1ec4, 0xfa3: 0x1ec9,
-       0xfa4: 0x1ece, 0xfa5: 0x1ed8, 0xfa6: 0x1ee7, 0xfa7: 0x1eec, 0xfa8: 0x1efb, 0xfa9: 0x1f00,
-       0xfaa: 0x1f05, 0xfab: 0x1f14, 0xfac: 0x1f19, 0xfad: 0x1f28, 0xfae: 0x1f2d, 0xfaf: 0x1f32,
-       0xfb0: 0x1f37, 0xfb1: 0x1f3c, 0xfb2: 0x1f41, 0xfb3: 0x1f46, 0xfb4: 0x1f4b, 0xfb5: 0x1f50,
-       0xfb6: 0x1f55, 0xfb7: 0x1f5a, 0xfb8: 0x1f5f, 0xfb9: 0x1f64, 0xfba: 0x1f69, 0xfbb: 0x1f6e,
-       0xfbc: 0x1f73, 0xfbd: 0x1f78, 0xfbe: 0x1f7d, 0xfbf: 0x1f87,
-       // Block 0x3f, offset 0xfc0
-       0xfc0: 0x1f8c, 0xfc1: 0x1f91, 0xfc2: 0x1f96, 0xfc3: 0x1fa0, 0xfc4: 0x1fa5, 0xfc5: 0x1faf,
-       0xfc6: 0x1fb4, 0xfc7: 0x1fb9, 0xfc8: 0x1fbe, 0xfc9: 0x1fc3, 0xfca: 0x1fc8, 0xfcb: 0x1fcd,
-       0xfcc: 0x1fd2, 0xfcd: 0x1fd7, 0xfce: 0x1fe6, 0xfcf: 0x1ff5, 0xfd0: 0x1ffa, 0xfd1: 0x1fff,
-       0xfd2: 0x2004, 0xfd3: 0x2009, 0xfd4: 0x200e, 0xfd5: 0x2018, 0xfd6: 0x201d, 0xfd7: 0x2022,
-       0xfd8: 0x2031, 0xfd9: 0x2040, 0xfda: 0x2045, 0xfdb: 0x4420, 0xfdc: 0x4426, 0xfdd: 0x445c,
-       0xfde: 0x44b3, 0xfdf: 0x44ba, 0xfe0: 0x44c1, 0xfe1: 0x44c8, 0xfe2: 0x44cf, 0xfe3: 0x44d6,
-       0xfe4: 0x25c6, 0xfe5: 0x25cd, 0xfe6: 0x25d4, 0xfe7: 0x25db, 0xfe8: 0x25f0, 0xfe9: 0x25f7,
-       0xfea: 0x1d98, 0xfeb: 0x1d9d, 0xfec: 0x1da2, 0xfed: 0x1da7, 0xfee: 0x1db1, 0xfef: 0x1db6,
-       0xff0: 0x1dca, 0xff1: 0x1dcf, 0xff2: 0x1dd4, 0xff3: 0x1dd9, 0xff4: 0x1de3, 0xff5: 0x1de8,
-       0xff6: 0x1df2, 0xff7: 0x1df7, 0xff8: 0x1dfc, 0xff9: 0x1e01, 0xffa: 0x1e0b, 0xffb: 0x1e10,
-       0xffc: 0x1f3c, 0xffd: 0x1f41, 0xffe: 0x1f50, 0xfff: 0x1f55,
-       // Block 0x40, offset 0x1000
-       0x1000: 0x1f5a, 0x1001: 0x1f6e, 0x1002: 0x1f73, 0x1003: 0x1f78, 0x1004: 0x1f7d, 0x1005: 0x1f96,
-       0x1006: 0x1fa0, 0x1007: 0x1fa5, 0x1008: 0x1faa, 0x1009: 0x1fbe, 0x100a: 0x1fdc, 0x100b: 0x1fe1,
-       0x100c: 0x1fe6, 0x100d: 0x1feb, 0x100e: 0x1ff5, 0x100f: 0x1ffa, 0x1010: 0x445c, 0x1011: 0x2027,
-       0x1012: 0x202c, 0x1013: 0x2031, 0x1014: 0x2036, 0x1015: 0x2040, 0x1016: 0x2045, 0x1017: 0x25b1,
-       0x1018: 0x25b8, 0x1019: 0x25bf, 0x101a: 0x25d4, 0x101b: 0x25e2, 0x101c: 0x1d89, 0x101d: 0x1d8e,
-       0x101e: 0x1d93, 0x101f: 0x1da2, 0x1020: 0x1dac, 0x1021: 0x1dbb, 0x1022: 0x1dc0, 0x1023: 0x1dc5,
-       0x1024: 0x1dd4, 0x1025: 0x1dde, 0x1026: 0x1dfc, 0x1027: 0x1e15, 0x1028: 0x1e1a, 0x1029: 0x1e29,
-       0x102a: 0x1e2e, 0x102b: 0x1e3d, 0x102c: 0x1e47, 0x102d: 0x1e56, 0x102e: 0x1e5b, 0x102f: 0x1e60,
-       0x1030: 0x1e6a, 0x1031: 0x1ea6, 0x1032: 0x1eab, 0x1033: 0x1eb5, 0x1034: 0x1ec4, 0x1035: 0x1ec9,
-       0x1036: 0x1ece, 0x1037: 0x1ed8, 0x1038: 0x1ee7, 0x1039: 0x1efb, 0x103a: 0x1f00, 0x103b: 0x1f05,
-       0x103c: 0x1f14, 0x103d: 0x1f19, 0x103e: 0x1f28, 0x103f: 0x1f2d,
-       // Block 0x41, offset 0x1040
-       0x1040: 0x1f32, 0x1041: 0x1f37, 0x1042: 0x1f46, 0x1043: 0x1f4b, 0x1044: 0x1f5f, 0x1045: 0x1f64,
-       0x1046: 0x1f69, 0x1047: 0x1f6e, 0x1048: 0x1f73, 0x1049: 0x1f87, 0x104a: 0x1f8c, 0x104b: 0x1f91,
-       0x104c: 0x1f96, 0x104d: 0x1f9b, 0x104e: 0x1faf, 0x104f: 0x1fb4, 0x1050: 0x1fb9, 0x1051: 0x1fbe,
-       0x1052: 0x1fcd, 0x1053: 0x1fd2, 0x1054: 0x1fd7, 0x1055: 0x1fe6, 0x1056: 0x1ff0, 0x1057: 0x1fff,
-       0x1058: 0x2004, 0x1059: 0x4450, 0x105a: 0x2018, 0x105b: 0x201d, 0x105c: 0x2022, 0x105d: 0x2031,
-       0x105e: 0x203b, 0x105f: 0x25d4, 0x1060: 0x25e2, 0x1061: 0x1da2, 0x1062: 0x1dac, 0x1063: 0x1dd4,
-       0x1064: 0x1dde, 0x1065: 0x1dfc, 0x1066: 0x1e06, 0x1067: 0x1e6a, 0x1068: 0x1e6f, 0x1069: 0x1e92,
-       0x106a: 0x1e97, 0x106b: 0x1f6e, 0x106c: 0x1f73, 0x106d: 0x1f96, 0x106e: 0x1fe6, 0x106f: 0x1ff0,
-       0x1070: 0x2031, 0x1071: 0x203b, 0x1072: 0x4504, 0x1073: 0x450c, 0x1074: 0x4514, 0x1075: 0x1ef1,
-       0x1076: 0x1ef6, 0x1077: 0x1f0a, 0x1078: 0x1f0f, 0x1079: 0x1f1e, 0x107a: 0x1f23, 0x107b: 0x1e74,
-       0x107c: 0x1e79, 0x107d: 0x1e9c, 0x107e: 0x1ea1, 0x107f: 0x1e33,
-       // Block 0x42, offset 0x1080
-       0x1080: 0x1e38, 0x1081: 0x1e1f, 0x1082: 0x1e24, 0x1083: 0x1e4c, 0x1084: 0x1e51, 0x1085: 0x1eba,
-       0x1086: 0x1ebf, 0x1087: 0x1edd, 0x1088: 0x1ee2, 0x1089: 0x1e7e, 0x108a: 0x1e83, 0x108b: 0x1e88,
-       0x108c: 0x1e92, 0x108d: 0x1e8d, 0x108e: 0x1e65, 0x108f: 0x1eb0, 0x1090: 0x1ed3, 0x1091: 0x1ef1,
-       0x1092: 0x1ef6, 0x1093: 0x1f0a, 0x1094: 0x1f0f, 0x1095: 0x1f1e, 0x1096: 0x1f23, 0x1097: 0x1e74,
-       0x1098: 0x1e79, 0x1099: 0x1e9c, 0x109a: 0x1ea1, 0x109b: 0x1e33, 0x109c: 0x1e38, 0x109d: 0x1e1f,
-       0x109e: 0x1e24, 0x109f: 0x1e4c, 0x10a0: 0x1e51, 0x10a1: 0x1eba, 0x10a2: 0x1ebf, 0x10a3: 0x1edd,
-       0x10a4: 0x1ee2, 0x10a5: 0x1e7e, 0x10a6: 0x1e83, 0x10a7: 0x1e88, 0x10a8: 0x1e92, 0x10a9: 0x1e8d,
-       0x10aa: 0x1e65, 0x10ab: 0x1eb0, 0x10ac: 0x1ed3, 0x10ad: 0x1e7e, 0x10ae: 0x1e83, 0x10af: 0x1e88,
-       0x10b0: 0x1e92, 0x10b1: 0x1e6f, 0x10b2: 0x1e97, 0x10b3: 0x1eec, 0x10b4: 0x1e56, 0x10b5: 0x1e5b,
-       0x10b6: 0x1e60, 0x10b7: 0x1e7e, 0x10b8: 0x1e83, 0x10b9: 0x1e88, 0x10ba: 0x1eec, 0x10bb: 0x1efb,
-       0x10bc: 0x4408, 0x10bd: 0x4408,
-       // Block 0x43, offset 0x10c0
-       0x10d0: 0x2311, 0x10d1: 0x2326,
-       0x10d2: 0x2326, 0x10d3: 0x232d, 0x10d4: 0x2334, 0x10d5: 0x2349, 0x10d6: 0x2350, 0x10d7: 0x2357,
-       0x10d8: 0x237a, 0x10d9: 0x237a, 0x10da: 0x239d, 0x10db: 0x2396, 0x10dc: 0x23b2, 0x10dd: 0x23a4,
-       0x10de: 0x23ab, 0x10df: 0x23ce, 0x10e0: 0x23ce, 0x10e1: 0x23c7, 0x10e2: 0x23d5, 0x10e3: 0x23d5,
-       0x10e4: 0x23ff, 0x10e5: 0x23ff, 0x10e6: 0x241b, 0x10e7: 0x23e3, 0x10e8: 0x23e3, 0x10e9: 0x23dc,
-       0x10ea: 0x23f1, 0x10eb: 0x23f1, 0x10ec: 0x23f8, 0x10ed: 0x23f8, 0x10ee: 0x2422, 0x10ef: 0x2430,
-       0x10f0: 0x2430, 0x10f1: 0x2437, 0x10f2: 0x2437, 0x10f3: 0x243e, 0x10f4: 0x2445, 0x10f5: 0x244c,
-       0x10f6: 0x2453, 0x10f7: 0x2453, 0x10f8: 0x245a, 0x10f9: 0x2468, 0x10fa: 0x2476, 0x10fb: 0x246f,
-       0x10fc: 0x247d, 0x10fd: 0x247d, 0x10fe: 0x2492, 0x10ff: 0x2499,
-       // Block 0x44, offset 0x1100
-       0x1100: 0x24ca, 0x1101: 0x24d8, 0x1102: 0x24d1, 0x1103: 0x24b5, 0x1104: 0x24b5, 0x1105: 0x24df,
-       0x1106: 0x24df, 0x1107: 0x24e6, 0x1108: 0x24e6, 0x1109: 0x2510, 0x110a: 0x2517, 0x110b: 0x251e,
-       0x110c: 0x24f4, 0x110d: 0x2502, 0x110e: 0x2525, 0x110f: 0x252c,
-       0x1112: 0x24fb, 0x1113: 0x2580, 0x1114: 0x2587, 0x1115: 0x255d, 0x1116: 0x2564, 0x1117: 0x2548,
-       0x1118: 0x2548, 0x1119: 0x254f, 0x111a: 0x2579, 0x111b: 0x2572, 0x111c: 0x259c, 0x111d: 0x259c,
-       0x111e: 0x230a, 0x111f: 0x231f, 0x1120: 0x2318, 0x1121: 0x2342, 0x1122: 0x233b, 0x1123: 0x2365,
-       0x1124: 0x235e, 0x1125: 0x2388, 0x1126: 0x236c, 0x1127: 0x2381, 0x1128: 0x23b9, 0x1129: 0x2406,
-       0x112a: 0x23ea, 0x112b: 0x2429, 0x112c: 0x24c3, 0x112d: 0x24ed, 0x112e: 0x2595, 0x112f: 0x258e,
-       0x1130: 0x25a3, 0x1131: 0x253a, 0x1132: 0x24a0, 0x1133: 0x256b, 0x1134: 0x2492, 0x1135: 0x24ca,
-       0x1136: 0x2461, 0x1137: 0x24ae, 0x1138: 0x2541, 0x1139: 0x2533, 0x113a: 0x24bc, 0x113b: 0x24a7,
-       0x113c: 0x24bc, 0x113d: 0x2541, 0x113e: 0x2373, 0x113f: 0x238f,
-       // Block 0x45, offset 0x1140
-       0x1140: 0x2509, 0x1141: 0x2484, 0x1142: 0x2303, 0x1143: 0x24a7, 0x1144: 0x244c, 0x1145: 0x241b,
-       0x1146: 0x23c0, 0x1147: 0x2556,
-       0x1170: 0x2414, 0x1171: 0x248b, 0x1172: 0x27bf, 0x1173: 0x27b6, 0x1174: 0x27ec, 0x1175: 0x27da,
-       0x1176: 0x27c8, 0x1177: 0x27e3, 0x1178: 0x27f5, 0x1179: 0x240d, 0x117a: 0x2c7c, 0x117b: 0x2afc,
-       0x117c: 0x27d1,
-       // Block 0x46, offset 0x1180
-       0x1190: 0x0019, 0x1191: 0x0483,
-       0x1192: 0x0487, 0x1193: 0x0035, 0x1194: 0x0037, 0x1195: 0x0003, 0x1196: 0x003f, 0x1197: 0x04bf,
-       0x1198: 0x04c3, 0x1199: 0x1b5c,
-       0x11a0: 0x8132, 0x11a1: 0x8132, 0x11a2: 0x8132, 0x11a3: 0x8132,
-       0x11a4: 0x8132, 0x11a5: 0x8132, 0x11a6: 0x8132, 0x11a7: 0x812d, 0x11a8: 0x812d, 0x11a9: 0x812d,
-       0x11aa: 0x812d, 0x11ab: 0x812d, 0x11ac: 0x812d, 0x11ad: 0x812d, 0x11ae: 0x8132, 0x11af: 0x8132,
-       0x11b0: 0x1873, 0x11b1: 0x0443, 0x11b2: 0x043f, 0x11b3: 0x007f, 0x11b4: 0x007f, 0x11b5: 0x0011,
-       0x11b6: 0x0013, 0x11b7: 0x00b7, 0x11b8: 0x00bb, 0x11b9: 0x04b7, 0x11ba: 0x04bb, 0x11bb: 0x04ab,
-       0x11bc: 0x04af, 0x11bd: 0x0493, 0x11be: 0x0497, 0x11bf: 0x048b,
-       // Block 0x47, offset 0x11c0
-       0x11c0: 0x048f, 0x11c1: 0x049b, 0x11c2: 0x049f, 0x11c3: 0x04a3, 0x11c4: 0x04a7,
-       0x11c7: 0x0077, 0x11c8: 0x007b, 0x11c9: 0x4269, 0x11ca: 0x4269, 0x11cb: 0x4269,
-       0x11cc: 0x4269, 0x11cd: 0x007f, 0x11ce: 0x007f, 0x11cf: 0x007f, 0x11d0: 0x0019, 0x11d1: 0x0483,
-       0x11d2: 0x001d, 0x11d4: 0x0037, 0x11d5: 0x0035, 0x11d6: 0x003f, 0x11d7: 0x0003,
-       0x11d8: 0x0443, 0x11d9: 0x0011, 0x11da: 0x0013, 0x11db: 0x00b7, 0x11dc: 0x00bb, 0x11dd: 0x04b7,
-       0x11de: 0x04bb, 0x11df: 0x0007, 0x11e0: 0x000d, 0x11e1: 0x0015, 0x11e2: 0x0017, 0x11e3: 0x001b,
-       0x11e4: 0x0039, 0x11e5: 0x003d, 0x11e6: 0x003b, 0x11e8: 0x0079, 0x11e9: 0x0009,
-       0x11ea: 0x000b, 0x11eb: 0x0041,
-       0x11f0: 0x42aa, 0x11f1: 0x442c, 0x11f2: 0x42af, 0x11f4: 0x42b4,
-       0x11f6: 0x42b9, 0x11f7: 0x4432, 0x11f8: 0x42be, 0x11f9: 0x4438, 0x11fa: 0x42c3, 0x11fb: 0x443e,
-       0x11fc: 0x42c8, 0x11fd: 0x4444, 0x11fe: 0x42cd, 0x11ff: 0x444a,
-       // Block 0x48, offset 0x1200
-       0x1200: 0x0236, 0x1201: 0x440e, 0x1202: 0x440e, 0x1203: 0x4414, 0x1204: 0x4414, 0x1205: 0x4456,
-       0x1206: 0x4456, 0x1207: 0x441a, 0x1208: 0x441a, 0x1209: 0x4462, 0x120a: 0x4462, 0x120b: 0x4462,
-       0x120c: 0x4462, 0x120d: 0x0239, 0x120e: 0x0239, 0x120f: 0x023c, 0x1210: 0x023c, 0x1211: 0x023c,
-       0x1212: 0x023c, 0x1213: 0x023f, 0x1214: 0x023f, 0x1215: 0x0242, 0x1216: 0x0242, 0x1217: 0x0242,
-       0x1218: 0x0242, 0x1219: 0x0245, 0x121a: 0x0245, 0x121b: 0x0245, 0x121c: 0x0245, 0x121d: 0x0248,
-       0x121e: 0x0248, 0x121f: 0x0248, 0x1220: 0x0248, 0x1221: 0x024b, 0x1222: 0x024b, 0x1223: 0x024b,
-       0x1224: 0x024b, 0x1225: 0x024e, 0x1226: 0x024e, 0x1227: 0x024e, 0x1228: 0x024e, 0x1229: 0x0251,
-       0x122a: 0x0251, 0x122b: 0x0254, 0x122c: 0x0254, 0x122d: 0x0257, 0x122e: 0x0257, 0x122f: 0x025a,
-       0x1230: 0x025a, 0x1231: 0x025d, 0x1232: 0x025d, 0x1233: 0x025d, 0x1234: 0x025d, 0x1235: 0x0260,
-       0x1236: 0x0260, 0x1237: 0x0260, 0x1238: 0x0260, 0x1239: 0x0263, 0x123a: 0x0263, 0x123b: 0x0263,
-       0x123c: 0x0263, 0x123d: 0x0266, 0x123e: 0x0266, 0x123f: 0x0266,
-       // Block 0x49, offset 0x1240
-       0x1240: 0x0266, 0x1241: 0x0269, 0x1242: 0x0269, 0x1243: 0x0269, 0x1244: 0x0269, 0x1245: 0x026c,
-       0x1246: 0x026c, 0x1247: 0x026c, 0x1248: 0x026c, 0x1249: 0x026f, 0x124a: 0x026f, 0x124b: 0x026f,
-       0x124c: 0x026f, 0x124d: 0x0272, 0x124e: 0x0272, 0x124f: 0x0272, 0x1250: 0x0272, 0x1251: 0x0275,
-       0x1252: 0x0275, 0x1253: 0x0275, 0x1254: 0x0275, 0x1255: 0x0278, 0x1256: 0x0278, 0x1257: 0x0278,
-       0x1258: 0x0278, 0x1259: 0x027b, 0x125a: 0x027b, 0x125b: 0x027b, 0x125c: 0x027b, 0x125d: 0x027e,
-       0x125e: 0x027e, 0x125f: 0x027e, 0x1260: 0x027e, 0x1261: 0x0281, 0x1262: 0x0281, 0x1263: 0x0281,
-       0x1264: 0x0281, 0x1265: 0x0284, 0x1266: 0x0284, 0x1267: 0x0284, 0x1268: 0x0284, 0x1269: 0x0287,
-       0x126a: 0x0287, 0x126b: 0x0287, 0x126c: 0x0287, 0x126d: 0x028a, 0x126e: 0x028a, 0x126f: 0x028d,
-       0x1270: 0x028d, 0x1271: 0x0290, 0x1272: 0x0290, 0x1273: 0x0290, 0x1274: 0x0290, 0x1275: 0x2e00,
-       0x1276: 0x2e00, 0x1277: 0x2e08, 0x1278: 0x2e08, 0x1279: 0x2e10, 0x127a: 0x2e10, 0x127b: 0x1f82,
-       0x127c: 0x1f82,
-       // Block 0x4a, offset 0x1280
-       0x1280: 0x0081, 0x1281: 0x0083, 0x1282: 0x0085, 0x1283: 0x0087, 0x1284: 0x0089, 0x1285: 0x008b,
-       0x1286: 0x008d, 0x1287: 0x008f, 0x1288: 0x0091, 0x1289: 0x0093, 0x128a: 0x0095, 0x128b: 0x0097,
-       0x128c: 0x0099, 0x128d: 0x009b, 0x128e: 0x009d, 0x128f: 0x009f, 0x1290: 0x00a1, 0x1291: 0x00a3,
-       0x1292: 0x00a5, 0x1293: 0x00a7, 0x1294: 0x00a9, 0x1295: 0x00ab, 0x1296: 0x00ad, 0x1297: 0x00af,
-       0x1298: 0x00b1, 0x1299: 0x00b3, 0x129a: 0x00b5, 0x129b: 0x00b7, 0x129c: 0x00b9, 0x129d: 0x00bb,
-       0x129e: 0x00bd, 0x129f: 0x0477, 0x12a0: 0x047b, 0x12a1: 0x0487, 0x12a2: 0x049b, 0x12a3: 0x049f,
-       0x12a4: 0x0483, 0x12a5: 0x05ab, 0x12a6: 0x05a3, 0x12a7: 0x04c7, 0x12a8: 0x04cf, 0x12a9: 0x04d7,
-       0x12aa: 0x04df, 0x12ab: 0x04e7, 0x12ac: 0x056b, 0x12ad: 0x0573, 0x12ae: 0x057b, 0x12af: 0x051f,
-       0x12b0: 0x05af, 0x12b1: 0x04cb, 0x12b2: 0x04d3, 0x12b3: 0x04db, 0x12b4: 0x04e3, 0x12b5: 0x04eb,
-       0x12b6: 0x04ef, 0x12b7: 0x04f3, 0x12b8: 0x04f7, 0x12b9: 0x04fb, 0x12ba: 0x04ff, 0x12bb: 0x0503,
-       0x12bc: 0x0507, 0x12bd: 0x050b, 0x12be: 0x050f, 0x12bf: 0x0513,
-       // Block 0x4b, offset 0x12c0
-       0x12c0: 0x0517, 0x12c1: 0x051b, 0x12c2: 0x0523, 0x12c3: 0x0527, 0x12c4: 0x052b, 0x12c5: 0x052f,
-       0x12c6: 0x0533, 0x12c7: 0x0537, 0x12c8: 0x053b, 0x12c9: 0x053f, 0x12ca: 0x0543, 0x12cb: 0x0547,
-       0x12cc: 0x054b, 0x12cd: 0x054f, 0x12ce: 0x0553, 0x12cf: 0x0557, 0x12d0: 0x055b, 0x12d1: 0x055f,
-       0x12d2: 0x0563, 0x12d3: 0x0567, 0x12d4: 0x056f, 0x12d5: 0x0577, 0x12d6: 0x057f, 0x12d7: 0x0583,
-       0x12d8: 0x0587, 0x12d9: 0x058b, 0x12da: 0x058f, 0x12db: 0x0593, 0x12dc: 0x0597, 0x12dd: 0x05a7,
-       0x12de: 0x4a78, 0x12df: 0x4a7e, 0x12e0: 0x03c3, 0x12e1: 0x0313, 0x12e2: 0x0317, 0x12e3: 0x4a3b,
-       0x12e4: 0x031b, 0x12e5: 0x4a41, 0x12e6: 0x4a47, 0x12e7: 0x031f, 0x12e8: 0x0323, 0x12e9: 0x0327,
-       0x12ea: 0x4a4d, 0x12eb: 0x4a53, 0x12ec: 0x4a59, 0x12ed: 0x4a5f, 0x12ee: 0x4a65, 0x12ef: 0x4a6b,
-       0x12f0: 0x0367, 0x12f1: 0x032b, 0x12f2: 0x032f, 0x12f3: 0x0333, 0x12f4: 0x037b, 0x12f5: 0x0337,
-       0x12f6: 0x033b, 0x12f7: 0x033f, 0x12f8: 0x0343, 0x12f9: 0x0347, 0x12fa: 0x034b, 0x12fb: 0x034f,
-       0x12fc: 0x0353, 0x12fd: 0x0357, 0x12fe: 0x035b,
-       // Block 0x4c, offset 0x1300
-       0x1302: 0x49bd, 0x1303: 0x49c3, 0x1304: 0x49c9, 0x1305: 0x49cf,
-       0x1306: 0x49d5, 0x1307: 0x49db, 0x130a: 0x49e1, 0x130b: 0x49e7,
-       0x130c: 0x49ed, 0x130d: 0x49f3, 0x130e: 0x49f9, 0x130f: 0x49ff,
-       0x1312: 0x4a05, 0x1313: 0x4a0b, 0x1314: 0x4a11, 0x1315: 0x4a17, 0x1316: 0x4a1d, 0x1317: 0x4a23,
-       0x131a: 0x4a29, 0x131b: 0x4a2f, 0x131c: 0x4a35,
-       0x1320: 0x00bf, 0x1321: 0x00c2, 0x1322: 0x00cb, 0x1323: 0x4264,
-       0x1324: 0x00c8, 0x1325: 0x00c5, 0x1326: 0x0447, 0x1328: 0x046b, 0x1329: 0x044b,
-       0x132a: 0x044f, 0x132b: 0x0453, 0x132c: 0x0457, 0x132d: 0x046f, 0x132e: 0x0473,
-       // Block 0x4d, offset 0x1340
-       0x1340: 0x0063, 0x1341: 0x0065, 0x1342: 0x0067, 0x1343: 0x0069, 0x1344: 0x006b, 0x1345: 0x006d,
-       0x1346: 0x006f, 0x1347: 0x0071, 0x1348: 0x0073, 0x1349: 0x0075, 0x134a: 0x0083, 0x134b: 0x0085,
-       0x134c: 0x0087, 0x134d: 0x0089, 0x134e: 0x008b, 0x134f: 0x008d, 0x1350: 0x008f, 0x1351: 0x0091,
-       0x1352: 0x0093, 0x1353: 0x0095, 0x1354: 0x0097, 0x1355: 0x0099, 0x1356: 0x009b, 0x1357: 0x009d,
-       0x1358: 0x009f, 0x1359: 0x00a1, 0x135a: 0x00a3, 0x135b: 0x00a5, 0x135c: 0x00a7, 0x135d: 0x00a9,
-       0x135e: 0x00ab, 0x135f: 0x00ad, 0x1360: 0x00af, 0x1361: 0x00b1, 0x1362: 0x00b3, 0x1363: 0x00b5,
-       0x1364: 0x00dd, 0x1365: 0x00f2, 0x1368: 0x0173, 0x1369: 0x0176,
-       0x136a: 0x0179, 0x136b: 0x017c, 0x136c: 0x017f, 0x136d: 0x0182, 0x136e: 0x0185, 0x136f: 0x0188,
-       0x1370: 0x018b, 0x1371: 0x018e, 0x1372: 0x0191, 0x1373: 0x0194, 0x1374: 0x0197, 0x1375: 0x019a,
-       0x1376: 0x019d, 0x1377: 0x01a0, 0x1378: 0x01a3, 0x1379: 0x0188, 0x137a: 0x01a6, 0x137b: 0x01a9,
-       0x137c: 0x01ac, 0x137d: 0x01af, 0x137e: 0x01b2, 0x137f: 0x01b5,
-       // Block 0x4e, offset 0x1380
-       0x1380: 0x01fd, 0x1381: 0x0200, 0x1382: 0x0203, 0x1383: 0x045b, 0x1384: 0x01c7, 0x1385: 0x01d0,
-       0x1386: 0x01d6, 0x1387: 0x01fa, 0x1388: 0x01eb, 0x1389: 0x01e8, 0x138a: 0x0206, 0x138b: 0x0209,
-       0x138e: 0x0021, 0x138f: 0x0023, 0x1390: 0x0025, 0x1391: 0x0027,
-       0x1392: 0x0029, 0x1393: 0x002b, 0x1394: 0x002d, 0x1395: 0x002f, 0x1396: 0x0031, 0x1397: 0x0033,
-       0x1398: 0x0021, 0x1399: 0x0023, 0x139a: 0x0025, 0x139b: 0x0027, 0x139c: 0x0029, 0x139d: 0x002b,
-       0x139e: 0x002d, 0x139f: 0x002f, 0x13a0: 0x0031, 0x13a1: 0x0033, 0x13a2: 0x0021, 0x13a3: 0x0023,
-       0x13a4: 0x0025, 0x13a5: 0x0027, 0x13a6: 0x0029, 0x13a7: 0x002b, 0x13a8: 0x002d, 0x13a9: 0x002f,
-       0x13aa: 0x0031, 0x13ab: 0x0033, 0x13ac: 0x0021, 0x13ad: 0x0023, 0x13ae: 0x0025, 0x13af: 0x0027,
-       0x13b0: 0x0029, 0x13b1: 0x002b, 0x13b2: 0x002d, 0x13b3: 0x002f, 0x13b4: 0x0031, 0x13b5: 0x0033,
-       0x13b6: 0x0021, 0x13b7: 0x0023, 0x13b8: 0x0025, 0x13b9: 0x0027, 0x13ba: 0x0029, 0x13bb: 0x002b,
-       0x13bc: 0x002d, 0x13bd: 0x002f, 0x13be: 0x0031, 0x13bf: 0x0033,
-       // Block 0x4f, offset 0x13c0
-       0x13c0: 0x0239, 0x13c1: 0x023c, 0x13c2: 0x0248, 0x13c3: 0x0251, 0x13c5: 0x028a,
-       0x13c6: 0x025a, 0x13c7: 0x024b, 0x13c8: 0x0269, 0x13c9: 0x0290, 0x13ca: 0x027b, 0x13cb: 0x027e,
-       0x13cc: 0x0281, 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d0: 0x0275, 0x13d1: 0x0263,
-       0x13d2: 0x0278, 0x13d3: 0x0257, 0x13d4: 0x0260, 0x13d5: 0x0242, 0x13d6: 0x0245, 0x13d7: 0x024e,
-       0x13d8: 0x0254, 0x13d9: 0x0266, 0x13da: 0x026c, 0x13db: 0x0272, 0x13dc: 0x0293, 0x13dd: 0x02e4,
-       0x13de: 0x02cc, 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,
-       0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e9: 0x0290,
-       0x13ea: 0x027b, 0x13eb: 0x027e, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,
-       0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,
-       0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fb: 0x0272,
-       // Block 0x50, offset 0x1400
-       0x1402: 0x0248,
-       0x1407: 0x024b, 0x1409: 0x0290, 0x140b: 0x027e,
-       0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1411: 0x0263,
-       0x1412: 0x0278, 0x1414: 0x0260, 0x1417: 0x024e,
-       0x1419: 0x0266, 0x141b: 0x0272, 0x141d: 0x02e4,
-       0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248,
-       0x1424: 0x0287, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,
-       0x142a: 0x027b, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,
-       0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242,
-       0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,
-       0x143c: 0x0293, 0x143e: 0x02cc,
-       // Block 0x51, offset 0x1440
-       0x1440: 0x0239, 0x1441: 0x023c, 0x1442: 0x0248, 0x1443: 0x0251, 0x1444: 0x0287, 0x1445: 0x028a,
-       0x1446: 0x025a, 0x1447: 0x024b, 0x1448: 0x0269, 0x1449: 0x0290, 0x144b: 0x027e,
-       0x144c: 0x0281, 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1450: 0x0275, 0x1451: 0x0263,
-       0x1452: 0x0278, 0x1453: 0x0257, 0x1454: 0x0260, 0x1455: 0x0242, 0x1456: 0x0245, 0x1457: 0x024e,
-       0x1458: 0x0254, 0x1459: 0x0266, 0x145a: 0x026c, 0x145b: 0x0272,
-       0x1461: 0x023c, 0x1462: 0x0248, 0x1463: 0x0251,
-       0x1465: 0x028a, 0x1466: 0x025a, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290,
-       0x146b: 0x027e, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f,
-       0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1473: 0x0257, 0x1474: 0x0260, 0x1475: 0x0242,
-       0x1476: 0x0245, 0x1477: 0x024e, 0x1478: 0x0254, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272,
-       // Block 0x52, offset 0x1480
-       0x1480: 0x1879, 0x1481: 0x1876, 0x1482: 0x187c, 0x1483: 0x18a0, 0x1484: 0x18c4, 0x1485: 0x18e8,
-       0x1486: 0x190c, 0x1487: 0x1915, 0x1488: 0x191b, 0x1489: 0x1921, 0x148a: 0x1927,
-       0x1490: 0x1a8c, 0x1491: 0x1a90,
-       0x1492: 0x1a94, 0x1493: 0x1a98, 0x1494: 0x1a9c, 0x1495: 0x1aa0, 0x1496: 0x1aa4, 0x1497: 0x1aa8,
-       0x1498: 0x1aac, 0x1499: 0x1ab0, 0x149a: 0x1ab4, 0x149b: 0x1ab8, 0x149c: 0x1abc, 0x149d: 0x1ac0,
-       0x149e: 0x1ac4, 0x149f: 0x1ac8, 0x14a0: 0x1acc, 0x14a1: 0x1ad0, 0x14a2: 0x1ad4, 0x14a3: 0x1ad8,
-       0x14a4: 0x1adc, 0x14a5: 0x1ae0, 0x14a6: 0x1ae4, 0x14a7: 0x1ae8, 0x14a8: 0x1aec, 0x14a9: 0x1af0,
-       0x14aa: 0x271e, 0x14ab: 0x0047, 0x14ac: 0x0065, 0x14ad: 0x193c, 0x14ae: 0x19b1,
-       0x14b0: 0x0043, 0x14b1: 0x0045, 0x14b2: 0x0047, 0x14b3: 0x0049, 0x14b4: 0x004b, 0x14b5: 0x004d,
-       0x14b6: 0x004f, 0x14b7: 0x0051, 0x14b8: 0x0053, 0x14b9: 0x0055, 0x14ba: 0x0057, 0x14bb: 0x0059,
-       0x14bc: 0x005b, 0x14bd: 0x005d, 0x14be: 0x005f, 0x14bf: 0x0061,
-       // Block 0x53, offset 0x14c0
-       0x14c0: 0x26ad, 0x14c1: 0x26c2, 0x14c2: 0x0503,
-       0x14d0: 0x0c0f, 0x14d1: 0x0a47,
-       0x14d2: 0x08d3, 0x14d3: 0x45c4, 0x14d4: 0x071b, 0x14d5: 0x09ef, 0x14d6: 0x132f, 0x14d7: 0x09ff,
-       0x14d8: 0x0727, 0x14d9: 0x0cd7, 0x14da: 0x0eaf, 0x14db: 0x0caf, 0x14dc: 0x0827, 0x14dd: 0x0b6b,
-       0x14de: 0x07bf, 0x14df: 0x0cb7, 0x14e0: 0x0813, 0x14e1: 0x1117, 0x14e2: 0x0f83, 0x14e3: 0x138b,
-       0x14e4: 0x09d3, 0x14e5: 0x090b, 0x14e6: 0x0e63, 0x14e7: 0x0c1b, 0x14e8: 0x0c47, 0x14e9: 0x06bf,
-       0x14ea: 0x06cb, 0x14eb: 0x140b, 0x14ec: 0x0adb, 0x14ed: 0x06e7, 0x14ee: 0x08ef, 0x14ef: 0x0c3b,
-       0x14f0: 0x13b3, 0x14f1: 0x0c13, 0x14f2: 0x106f, 0x14f3: 0x10ab, 0x14f4: 0x08f7, 0x14f5: 0x0e43,
-       0x14f6: 0x0d0b, 0x14f7: 0x0d07, 0x14f8: 0x0f97, 0x14f9: 0x082b, 0x14fa: 0x0957, 0x14fb: 0x1443,
-       // Block 0x54, offset 0x1500
-       0x1500: 0x06fb, 0x1501: 0x06f3, 0x1502: 0x0703, 0x1503: 0x1647, 0x1504: 0x0747, 0x1505: 0x0757,
-       0x1506: 0x075b, 0x1507: 0x0763, 0x1508: 0x076b, 0x1509: 0x076f, 0x150a: 0x077b, 0x150b: 0x0773,
-       0x150c: 0x05b3, 0x150d: 0x165b, 0x150e: 0x078f, 0x150f: 0x0793, 0x1510: 0x0797, 0x1511: 0x07b3,
-       0x1512: 0x164c, 0x1513: 0x05b7, 0x1514: 0x079f, 0x1515: 0x07bf, 0x1516: 0x1656, 0x1517: 0x07cf,
-       0x1518: 0x07d7, 0x1519: 0x0737, 0x151a: 0x07df, 0x151b: 0x07e3, 0x151c: 0x1831, 0x151d: 0x07ff,
-       0x151e: 0x0807, 0x151f: 0x05bf, 0x1520: 0x081f, 0x1521: 0x0823, 0x1522: 0x082b, 0x1523: 0x082f,
-       0x1524: 0x05c3, 0x1525: 0x0847, 0x1526: 0x084b, 0x1527: 0x0857, 0x1528: 0x0863, 0x1529: 0x0867,
-       0x152a: 0x086b, 0x152b: 0x0873, 0x152c: 0x0893, 0x152d: 0x0897, 0x152e: 0x089f, 0x152f: 0x08af,
-       0x1530: 0x08b7, 0x1531: 0x08bb, 0x1532: 0x08bb, 0x1533: 0x08bb, 0x1534: 0x166a, 0x1535: 0x0e93,
-       0x1536: 0x08cf, 0x1537: 0x08d7, 0x1538: 0x166f, 0x1539: 0x08e3, 0x153a: 0x08eb, 0x153b: 0x08f3,
-       0x153c: 0x091b, 0x153d: 0x0907, 0x153e: 0x0913, 0x153f: 0x0917,
-       // Block 0x55, offset 0x1540
-       0x1540: 0x091f, 0x1541: 0x0927, 0x1542: 0x092b, 0x1543: 0x0933, 0x1544: 0x093b, 0x1545: 0x093f,
-       0x1546: 0x093f, 0x1547: 0x0947, 0x1548: 0x094f, 0x1549: 0x0953, 0x154a: 0x095f, 0x154b: 0x0983,
-       0x154c: 0x0967, 0x154d: 0x0987, 0x154e: 0x096b, 0x154f: 0x0973, 0x1550: 0x080b, 0x1551: 0x09cf,
-       0x1552: 0x0997, 0x1553: 0x099b, 0x1554: 0x099f, 0x1555: 0x0993, 0x1556: 0x09a7, 0x1557: 0x09a3,
-       0x1558: 0x09bb, 0x1559: 0x1674, 0x155a: 0x09d7, 0x155b: 0x09db, 0x155c: 0x09e3, 0x155d: 0x09ef,
-       0x155e: 0x09f7, 0x155f: 0x0a13, 0x1560: 0x1679, 0x1561: 0x167e, 0x1562: 0x0a1f, 0x1563: 0x0a23,
-       0x1564: 0x0a27, 0x1565: 0x0a1b, 0x1566: 0x0a2f, 0x1567: 0x05c7, 0x1568: 0x05cb, 0x1569: 0x0a37,
-       0x156a: 0x0a3f, 0x156b: 0x0a3f, 0x156c: 0x1683, 0x156d: 0x0a5b, 0x156e: 0x0a5f, 0x156f: 0x0a63,
-       0x1570: 0x0a6b, 0x1571: 0x1688, 0x1572: 0x0a73, 0x1573: 0x0a77, 0x1574: 0x0b4f, 0x1575: 0x0a7f,
-       0x1576: 0x05cf, 0x1577: 0x0a8b, 0x1578: 0x0a9b, 0x1579: 0x0aa7, 0x157a: 0x0aa3, 0x157b: 0x1692,
-       0x157c: 0x0aaf, 0x157d: 0x1697, 0x157e: 0x0abb, 0x157f: 0x0ab7,
-       // Block 0x56, offset 0x1580
-       0x1580: 0x0abf, 0x1581: 0x0acf, 0x1582: 0x0ad3, 0x1583: 0x05d3, 0x1584: 0x0ae3, 0x1585: 0x0aeb,
-       0x1586: 0x0aef, 0x1587: 0x0af3, 0x1588: 0x05d7, 0x1589: 0x169c, 0x158a: 0x05db, 0x158b: 0x0b0f,
-       0x158c: 0x0b13, 0x158d: 0x0b17, 0x158e: 0x0b1f, 0x158f: 0x1863, 0x1590: 0x0b37, 0x1591: 0x16a6,
-       0x1592: 0x16a6, 0x1593: 0x11d7, 0x1594: 0x0b47, 0x1595: 0x0b47, 0x1596: 0x05df, 0x1597: 0x16c9,
-       0x1598: 0x179b, 0x1599: 0x0b57, 0x159a: 0x0b5f, 0x159b: 0x05e3, 0x159c: 0x0b73, 0x159d: 0x0b83,
-       0x159e: 0x0b87, 0x159f: 0x0b8f, 0x15a0: 0x0b9f, 0x15a1: 0x05eb, 0x15a2: 0x05e7, 0x15a3: 0x0ba3,
-       0x15a4: 0x16ab, 0x15a5: 0x0ba7, 0x15a6: 0x0bbb, 0x15a7: 0x0bbf, 0x15a8: 0x0bc3, 0x15a9: 0x0bbf,
-       0x15aa: 0x0bcf, 0x15ab: 0x0bd3, 0x15ac: 0x0be3, 0x15ad: 0x0bdb, 0x15ae: 0x0bdf, 0x15af: 0x0be7,
-       0x15b0: 0x0beb, 0x15b1: 0x0bef, 0x15b2: 0x0bfb, 0x15b3: 0x0bff, 0x15b4: 0x0c17, 0x15b5: 0x0c1f,
-       0x15b6: 0x0c2f, 0x15b7: 0x0c43, 0x15b8: 0x16ba, 0x15b9: 0x0c3f, 0x15ba: 0x0c33, 0x15bb: 0x0c4b,
-       0x15bc: 0x0c53, 0x15bd: 0x0c67, 0x15be: 0x16bf, 0x15bf: 0x0c6f,
-       // Block 0x57, offset 0x15c0
-       0x15c0: 0x0c63, 0x15c1: 0x0c5b, 0x15c2: 0x05ef, 0x15c3: 0x0c77, 0x15c4: 0x0c7f, 0x15c5: 0x0c87,
-       0x15c6: 0x0c7b, 0x15c7: 0x05f3, 0x15c8: 0x0c97, 0x15c9: 0x0c9f, 0x15ca: 0x16c4, 0x15cb: 0x0ccb,
-       0x15cc: 0x0cff, 0x15cd: 0x0cdb, 0x15ce: 0x05ff, 0x15cf: 0x0ce7, 0x15d0: 0x05fb, 0x15d1: 0x05f7,
-       0x15d2: 0x07c3, 0x15d3: 0x07c7, 0x15d4: 0x0d03, 0x15d5: 0x0ceb, 0x15d6: 0x11ab, 0x15d7: 0x0663,
-       0x15d8: 0x0d0f, 0x15d9: 0x0d13, 0x15da: 0x0d17, 0x15db: 0x0d2b, 0x15dc: 0x0d23, 0x15dd: 0x16dd,
-       0x15de: 0x0603, 0x15df: 0x0d3f, 0x15e0: 0x0d33, 0x15e1: 0x0d4f, 0x15e2: 0x0d57, 0x15e3: 0x16e7,
-       0x15e4: 0x0d5b, 0x15e5: 0x0d47, 0x15e6: 0x0d63, 0x15e7: 0x0607, 0x15e8: 0x0d67, 0x15e9: 0x0d6b,
-       0x15ea: 0x0d6f, 0x15eb: 0x0d7b, 0x15ec: 0x16ec, 0x15ed: 0x0d83, 0x15ee: 0x060b, 0x15ef: 0x0d8f,
-       0x15f0: 0x16f1, 0x15f1: 0x0d93, 0x15f2: 0x060f, 0x15f3: 0x0d9f, 0x15f4: 0x0dab, 0x15f5: 0x0db7,
-       0x15f6: 0x0dbb, 0x15f7: 0x16f6, 0x15f8: 0x168d, 0x15f9: 0x16fb, 0x15fa: 0x0ddb, 0x15fb: 0x1700,
-       0x15fc: 0x0de7, 0x15fd: 0x0def, 0x15fe: 0x0ddf, 0x15ff: 0x0dfb,
-       // Block 0x58, offset 0x1600
-       0x1600: 0x0e0b, 0x1601: 0x0e1b, 0x1602: 0x0e0f, 0x1603: 0x0e13, 0x1604: 0x0e1f, 0x1605: 0x0e23,
-       0x1606: 0x1705, 0x1607: 0x0e07, 0x1608: 0x0e3b, 0x1609: 0x0e3f, 0x160a: 0x0613, 0x160b: 0x0e53,
-       0x160c: 0x0e4f, 0x160d: 0x170a, 0x160e: 0x0e33, 0x160f: 0x0e6f, 0x1610: 0x170f, 0x1611: 0x1714,
-       0x1612: 0x0e73, 0x1613: 0x0e87, 0x1614: 0x0e83, 0x1615: 0x0e7f, 0x1616: 0x0617, 0x1617: 0x0e8b,
-       0x1618: 0x0e9b, 0x1619: 0x0e97, 0x161a: 0x0ea3, 0x161b: 0x1651, 0x161c: 0x0eb3, 0x161d: 0x1719,
-       0x161e: 0x0ebf, 0x161f: 0x1723, 0x1620: 0x0ed3, 0x1621: 0x0edf, 0x1622: 0x0ef3, 0x1623: 0x1728,
-       0x1624: 0x0f07, 0x1625: 0x0f0b, 0x1626: 0x172d, 0x1627: 0x1732, 0x1628: 0x0f27, 0x1629: 0x0f37,
-       0x162a: 0x061b, 0x162b: 0x0f3b, 0x162c: 0x061f, 0x162d: 0x061f, 0x162e: 0x0f53, 0x162f: 0x0f57,
-       0x1630: 0x0f5f, 0x1631: 0x0f63, 0x1632: 0x0f6f, 0x1633: 0x0623, 0x1634: 0x0f87, 0x1635: 0x1737,
-       0x1636: 0x0fa3, 0x1637: 0x173c, 0x1638: 0x0faf, 0x1639: 0x16a1, 0x163a: 0x0fbf, 0x163b: 0x1741,
-       0x163c: 0x1746, 0x163d: 0x174b, 0x163e: 0x0627, 0x163f: 0x062b,
-       // Block 0x59, offset 0x1640
-       0x1640: 0x0ff7, 0x1641: 0x1755, 0x1642: 0x1750, 0x1643: 0x175a, 0x1644: 0x175f, 0x1645: 0x0fff,
-       0x1646: 0x1003, 0x1647: 0x1003, 0x1648: 0x100b, 0x1649: 0x0633, 0x164a: 0x100f, 0x164b: 0x0637,
-       0x164c: 0x063b, 0x164d: 0x1769, 0x164e: 0x1023, 0x164f: 0x102b, 0x1650: 0x1037, 0x1651: 0x063f,
-       0x1652: 0x176e, 0x1653: 0x105b, 0x1654: 0x1773, 0x1655: 0x1778, 0x1656: 0x107b, 0x1657: 0x1093,
-       0x1658: 0x0643, 0x1659: 0x109b, 0x165a: 0x109f, 0x165b: 0x10a3, 0x165c: 0x177d, 0x165d: 0x1782,
-       0x165e: 0x1782, 0x165f: 0x10bb, 0x1660: 0x0647, 0x1661: 0x1787, 0x1662: 0x10cf, 0x1663: 0x10d3,
-       0x1664: 0x064b, 0x1665: 0x178c, 0x1666: 0x10ef, 0x1667: 0x064f, 0x1668: 0x10ff, 0x1669: 0x10f7,
-       0x166a: 0x1107, 0x166b: 0x1796, 0x166c: 0x111f, 0x166d: 0x0653, 0x166e: 0x112b, 0x166f: 0x1133,
-       0x1670: 0x1143, 0x1671: 0x0657, 0x1672: 0x17a0, 0x1673: 0x17a5, 0x1674: 0x065b, 0x1675: 0x17aa,
-       0x1676: 0x115b, 0x1677: 0x17af, 0x1678: 0x1167, 0x1679: 0x1173, 0x167a: 0x117b, 0x167b: 0x17b4,
-       0x167c: 0x17b9, 0x167d: 0x118f, 0x167e: 0x17be, 0x167f: 0x1197,
-       // Block 0x5a, offset 0x1680
-       0x1680: 0x16ce, 0x1681: 0x065f, 0x1682: 0x11af, 0x1683: 0x11b3, 0x1684: 0x0667, 0x1685: 0x11b7,
-       0x1686: 0x0a33, 0x1687: 0x17c3, 0x1688: 0x17c8, 0x1689: 0x16d3, 0x168a: 0x16d8, 0x168b: 0x11d7,
-       0x168c: 0x11db, 0x168d: 0x13f3, 0x168e: 0x066b, 0x168f: 0x1207, 0x1690: 0x1203, 0x1691: 0x120b,
-       0x1692: 0x083f, 0x1693: 0x120f, 0x1694: 0x1213, 0x1695: 0x1217, 0x1696: 0x121f, 0x1697: 0x17cd,
-       0x1698: 0x121b, 0x1699: 0x1223, 0x169a: 0x1237, 0x169b: 0x123b, 0x169c: 0x1227, 0x169d: 0x123f,
-       0x169e: 0x1253, 0x169f: 0x1267, 0x16a0: 0x1233, 0x16a1: 0x1247, 0x16a2: 0x124b, 0x16a3: 0x124f,
-       0x16a4: 0x17d2, 0x16a5: 0x17dc, 0x16a6: 0x17d7, 0x16a7: 0x066f, 0x16a8: 0x126f, 0x16a9: 0x1273,
-       0x16aa: 0x127b, 0x16ab: 0x17f0, 0x16ac: 0x127f, 0x16ad: 0x17e1, 0x16ae: 0x0673, 0x16af: 0x0677,
-       0x16b0: 0x17e6, 0x16b1: 0x17eb, 0x16b2: 0x067b, 0x16b3: 0x129f, 0x16b4: 0x12a3, 0x16b5: 0x12a7,
-       0x16b6: 0x12ab, 0x16b7: 0x12b7, 0x16b8: 0x12b3, 0x16b9: 0x12bf, 0x16ba: 0x12bb, 0x16bb: 0x12cb,
-       0x16bc: 0x12c3, 0x16bd: 0x12c7, 0x16be: 0x12cf, 0x16bf: 0x067f,
-       // Block 0x5b, offset 0x16c0
-       0x16c0: 0x12d7, 0x16c1: 0x12db, 0x16c2: 0x0683, 0x16c3: 0x12eb, 0x16c4: 0x12ef, 0x16c5: 0x17f5,
-       0x16c6: 0x12fb, 0x16c7: 0x12ff, 0x16c8: 0x0687, 0x16c9: 0x130b, 0x16ca: 0x05bb, 0x16cb: 0x17fa,
-       0x16cc: 0x17ff, 0x16cd: 0x068b, 0x16ce: 0x068f, 0x16cf: 0x1337, 0x16d0: 0x134f, 0x16d1: 0x136b,
-       0x16d2: 0x137b, 0x16d3: 0x1804, 0x16d4: 0x138f, 0x16d5: 0x1393, 0x16d6: 0x13ab, 0x16d7: 0x13b7,
-       0x16d8: 0x180e, 0x16d9: 0x1660, 0x16da: 0x13c3, 0x16db: 0x13bf, 0x16dc: 0x13cb, 0x16dd: 0x1665,
-       0x16de: 0x13d7, 0x16df: 0x13e3, 0x16e0: 0x1813, 0x16e1: 0x1818, 0x16e2: 0x1423, 0x16e3: 0x142f,
-       0x16e4: 0x1437, 0x16e5: 0x181d, 0x16e6: 0x143b, 0x16e7: 0x1467, 0x16e8: 0x1473, 0x16e9: 0x1477,
-       0x16ea: 0x146f, 0x16eb: 0x1483, 0x16ec: 0x1487, 0x16ed: 0x1822, 0x16ee: 0x1493, 0x16ef: 0x0693,
-       0x16f0: 0x149b, 0x16f1: 0x1827, 0x16f2: 0x0697, 0x16f3: 0x14d3, 0x16f4: 0x0ac3, 0x16f5: 0x14eb,
-       0x16f6: 0x182c, 0x16f7: 0x1836, 0x16f8: 0x069b, 0x16f9: 0x069f, 0x16fa: 0x1513, 0x16fb: 0x183b,
-       0x16fc: 0x06a3, 0x16fd: 0x1840, 0x16fe: 0x152b, 0x16ff: 0x152b,
-       // Block 0x5c, offset 0x1700
-       0x1700: 0x1533, 0x1701: 0x1845, 0x1702: 0x154b, 0x1703: 0x06a7, 0x1704: 0x155b, 0x1705: 0x1567,
-       0x1706: 0x156f, 0x1707: 0x1577, 0x1708: 0x06ab, 0x1709: 0x184a, 0x170a: 0x158b, 0x170b: 0x15a7,
-       0x170c: 0x15b3, 0x170d: 0x06af, 0x170e: 0x06b3, 0x170f: 0x15b7, 0x1710: 0x184f, 0x1711: 0x06b7,
-       0x1712: 0x1854, 0x1713: 0x1859, 0x1714: 0x185e, 0x1715: 0x15db, 0x1716: 0x06bb, 0x1717: 0x15ef,
-       0x1718: 0x15f7, 0x1719: 0x15fb, 0x171a: 0x1603, 0x171b: 0x160b, 0x171c: 0x1613, 0x171d: 0x1868,
-}
-
-// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes
-// Block 0 is the zero block.
-var nfkcIndex = [1408]uint8{
-       // Block 0x0, offset 0x0
-       // Block 0x1, offset 0x40
-       // Block 0x2, offset 0x80
-       // Block 0x3, offset 0xc0
-       0xc2: 0x5b, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5c, 0xc7: 0x04,
-       0xc8: 0x05, 0xca: 0x5d, 0xcb: 0x5e, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
-       0xd0: 0x0a, 0xd1: 0x5f, 0xd2: 0x60, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x61,
-       0xd8: 0x62, 0xd9: 0x0d, 0xdb: 0x63, 0xdc: 0x64, 0xdd: 0x65, 0xdf: 0x66,
-       0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
-       0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
-       0xf0: 0x13,
-       // Block 0x4, offset 0x100
-       0x120: 0x67, 0x121: 0x68, 0x123: 0x69, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d,
-       0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74,
-       0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a,
-       0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82,
-       // Block 0x5, offset 0x140
-       0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89,
-       0x14d: 0x8a,
-       0x15c: 0x8b, 0x15f: 0x8c,
-       0x162: 0x8d, 0x164: 0x8e,
-       0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0e, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94,
-       0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x11,
-       0x178: 0x12, 0x179: 0x13, 0x17a: 0x14, 0x17b: 0x15, 0x17c: 0x16, 0x17d: 0x17, 0x17e: 0x18, 0x17f: 0x19,
-       // Block 0x6, offset 0x180
-       0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1a, 0x185: 0x1b, 0x186: 0x9c, 0x187: 0x9d,
-       0x188: 0x9e, 0x189: 0x1c, 0x18a: 0x1d, 0x18b: 0x9f, 0x18c: 0xa0,
-       0x191: 0x1e, 0x192: 0x1f, 0x193: 0xa1,
-       0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,
-       0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,
-       0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x20, 0x1bd: 0x21, 0x1be: 0x22, 0x1bf: 0xab,
-       // Block 0x7, offset 0x1c0
-       0x1c0: 0xac, 0x1c1: 0x23, 0x1c2: 0x24, 0x1c3: 0x25, 0x1c4: 0xad, 0x1c5: 0x26, 0x1c6: 0x27,
-       0x1c8: 0x28, 0x1c9: 0x29, 0x1ca: 0x2a, 0x1cb: 0x2b, 0x1cc: 0x2c, 0x1cd: 0x2d, 0x1ce: 0x2e, 0x1cf: 0x2f,
-       // Block 0x8, offset 0x200
-       0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,
-       0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,
-       0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,
-       0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,
-       0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,
-       // Block 0x9, offset 0x240
-       0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,
-       0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,
-       0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,
-       0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,
-       0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,
-       0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,
-       0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,
-       0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,
-       // Block 0xa, offset 0x280
-       0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,
-       0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,
-       0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,
-       0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,
-       0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,
-       0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,
-       0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,
-       0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,
-       // Block 0xb, offset 0x2c0
-       0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,
-       0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,
-       0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,
-       0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,
-       // Block 0xc, offset 0x300
-       0x324: 0x30, 0x325: 0x31, 0x326: 0x32, 0x327: 0x33,
-       0x328: 0x34, 0x329: 0x35, 0x32a: 0x36, 0x32b: 0x37, 0x32c: 0x38, 0x32d: 0x39, 0x32e: 0x3a, 0x32f: 0x3b,
-       0x330: 0x3c, 0x331: 0x3d, 0x332: 0x3e, 0x333: 0x3f, 0x334: 0x40, 0x335: 0x41, 0x336: 0x42, 0x337: 0x43,
-       0x338: 0x44, 0x339: 0x45, 0x33a: 0x46, 0x33b: 0x47, 0x33c: 0xc5, 0x33d: 0x48, 0x33e: 0x49, 0x33f: 0x4a,
-       // Block 0xd, offset 0x340
-       0x347: 0xc6,
-       0x34b: 0xc7, 0x34d: 0xc8,
-       0x368: 0xc9, 0x36b: 0xca,
-       // Block 0xe, offset 0x380
-       0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,
-       0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6c, 0x38d: 0xd1,
-       0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,
-       0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,
-       0x3a8: 0xda, 0x3a9: 0xdb, 0x3aa: 0xdc,
-       0x3b0: 0xd7, 0x3b5: 0xdd,
-       // Block 0xf, offset 0x3c0
-       0x3eb: 0xde, 0x3ec: 0xdf,
-       // Block 0x10, offset 0x400
-       0x432: 0xe0,
-       // Block 0x11, offset 0x440
-       0x445: 0xe1, 0x446: 0xe2, 0x447: 0xe3,
-       0x449: 0xe4,
-       0x450: 0xe5, 0x451: 0xe6, 0x452: 0xe7, 0x453: 0xe8, 0x454: 0xe9, 0x455: 0xea, 0x456: 0xeb, 0x457: 0xec,
-       0x458: 0xed, 0x459: 0xee, 0x45a: 0x4b, 0x45b: 0xef, 0x45c: 0xf0, 0x45d: 0xf1, 0x45e: 0xf2, 0x45f: 0x4c,
-       // Block 0x12, offset 0x480
-       0x480: 0xf3,
-       0x4a3: 0xf4, 0x4a5: 0xf5,
-       0x4b8: 0x4d, 0x4b9: 0x4e, 0x4ba: 0x4f,
-       // Block 0x13, offset 0x4c0
-       0x4c4: 0x50, 0x4c5: 0xf6, 0x4c6: 0xf7,
-       0x4c8: 0x51, 0x4c9: 0xf8,
-       // Block 0x14, offset 0x500
-       0x520: 0x52, 0x521: 0x53, 0x522: 0x54, 0x523: 0x55, 0x524: 0x56, 0x525: 0x57, 0x526: 0x58, 0x527: 0x59,
-       0x528: 0x5a,
-       // Block 0x15, offset 0x540
-       0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
-       0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
-       0x56f: 0x12,
-}
-
-// nfkcSparseOffset: 158 entries, 316 bytes
-var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd5, 0xdc, 0xe4, 0xe8, 0xea, 0xed, 0xf1, 0xf7, 0x108, 0x114, 0x116, 0x11c, 0x11e, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12a, 0x12d, 0x130, 0x132, 0x135, 0x138, 0x13c, 0x141, 0x14a, 0x14c, 0x14f, 0x151, 0x15c, 0x167, 0x175, 0x183, 0x193, 0x1a1, 0x1a8, 0x1ae, 0x1bd, 0x1c1, 0x1c3, 0x1c7, 0x1c9, 0x1cc, 0x1ce, 0x1d1, 0x1d3, 0x1d6, 0x1d8, 0x1da, 0x1dc, 0x1e8, 0x1f2, 0x1fc, 0x1ff, 0x203, 0x205, 0x207, 0x209, 0x20b, 0x20e, 0x210, 0x212, 0x214, 0x216, 0x21c, 0x21f, 0x223, 0x225, 0x22c, 0x232, 0x238, 0x240, 0x246, 0x24c, 0x252, 0x256, 0x258, 0x25a, 0x25c, 0x25e, 0x264, 0x267, 0x26a, 0x272, 0x279, 0x27c, 0x27f, 0x281, 0x289, 0x28c, 0x293, 0x296, 0x29c, 0x29e, 0x2a0, 0x2a3, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2c1, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d8, 0x2e4, 0x2e9, 0x2f2, 0x2f8, 0x2fd, 0x301, 0x306, 0x30a, 0x31a, 0x328, 0x336, 0x344, 0x34a, 0x34c, 0x34f, 0x359, 0x35b}
-
-// nfkcSparseValues: 869 entries, 3476 bytes
-var nfkcSparseValues = [869]valueRange{
-       // Block 0x0, offset 0x0
-       {value: 0x0002, lo: 0x0d},
-       {value: 0x0001, lo: 0xa0, hi: 0xa0},
-       {value: 0x4278, lo: 0xa8, hi: 0xa8},
-       {value: 0x0083, lo: 0xaa, hi: 0xaa},
-       {value: 0x4264, lo: 0xaf, hi: 0xaf},
-       {value: 0x0025, lo: 0xb2, hi: 0xb3},
-       {value: 0x425a, lo: 0xb4, hi: 0xb4},
-       {value: 0x01dc, lo: 0xb5, hi: 0xb5},
-       {value: 0x4291, lo: 0xb8, hi: 0xb8},
-       {value: 0x0023, lo: 0xb9, hi: 0xb9},
-       {value: 0x009f, lo: 0xba, hi: 0xba},
-       {value: 0x221c, lo: 0xbc, hi: 0xbc},
-       {value: 0x2210, lo: 0xbd, hi: 0xbd},
-       {value: 0x22b2, lo: 0xbe, hi: 0xbe},
-       // Block 0x1, offset 0xe
-       {value: 0x0091, lo: 0x03},
-       {value: 0x46e2, lo: 0xa0, hi: 0xa1},
-       {value: 0x4714, lo: 0xaf, hi: 0xb0},
-       {value: 0xa000, lo: 0xb7, hi: 0xb7},
-       // Block 0x2, offset 0x12
-       {value: 0x0003, lo: 0x08},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x0091, lo: 0xb0, hi: 0xb0},
-       {value: 0x0119, lo: 0xb1, hi: 0xb1},
-       {value: 0x0095, lo: 0xb2, hi: 0xb2},
-       {value: 0x00a5, lo: 0xb3, hi: 0xb3},
-       {value: 0x0143, lo: 0xb4, hi: 0xb6},
-       {value: 0x00af, lo: 0xb7, hi: 0xb7},
-       {value: 0x00b3, lo: 0xb8, hi: 0xb8},
-       // Block 0x3, offset 0x1b
-       {value: 0x000a, lo: 0x09},
-       {value: 0x426e, lo: 0x98, hi: 0x98},
-       {value: 0x4273, lo: 0x99, hi: 0x9a},
-       {value: 0x4296, lo: 0x9b, hi: 0x9b},
-       {value: 0x425f, lo: 0x9c, hi: 0x9c},
-       {value: 0x4282, lo: 0x9d, hi: 0x9d},
-       {value: 0x0113, lo: 0xa0, hi: 0xa0},
-       {value: 0x0099, lo: 0xa1, hi: 0xa1},
-       {value: 0x00a7, lo: 0xa2, hi: 0xa3},
-       {value: 0x0167, lo: 0xa4, hi: 0xa4},
-       // Block 0x4, offset 0x25
-       {value: 0x0000, lo: 0x0f},
-       {value: 0xa000, lo: 0x83, hi: 0x83},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0xa000, lo: 0x8b, hi: 0x8b},
-       {value: 0xa000, lo: 0x8d, hi: 0x8d},
-       {value: 0x37a5, lo: 0x90, hi: 0x90},
-       {value: 0x37b1, lo: 0x91, hi: 0x91},
-       {value: 0x379f, lo: 0x93, hi: 0x93},
-       {value: 0xa000, lo: 0x96, hi: 0x96},
-       {value: 0x3817, lo: 0x97, hi: 0x97},
-       {value: 0x37e1, lo: 0x9c, hi: 0x9c},
-       {value: 0x37c9, lo: 0x9d, hi: 0x9d},
-       {value: 0x37f3, lo: 0x9e, hi: 0x9e},
-       {value: 0xa000, lo: 0xb4, hi: 0xb5},
-       {value: 0x381d, lo: 0xb6, hi: 0xb6},
-       {value: 0x3823, lo: 0xb7, hi: 0xb7},
-       // Block 0x5, offset 0x35
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x83, hi: 0x87},
-       // Block 0x6, offset 0x37
-       {value: 0x0001, lo: 0x04},
-       {value: 0x8113, lo: 0x81, hi: 0x82},
-       {value: 0x8132, lo: 0x84, hi: 0x84},
-       {value: 0x812d, lo: 0x85, hi: 0x85},
-       {value: 0x810d, lo: 0x87, hi: 0x87},
-       // Block 0x7, offset 0x3c
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x8132, lo: 0x90, hi: 0x97},
-       {value: 0x8119, lo: 0x98, hi: 0x98},
-       {value: 0x811a, lo: 0x99, hi: 0x99},
-       {value: 0x811b, lo: 0x9a, hi: 0x9a},
-       {value: 0x3841, lo: 0xa2, hi: 0xa2},
-       {value: 0x3847, lo: 0xa3, hi: 0xa3},
-       {value: 0x3853, lo: 0xa4, hi: 0xa4},
-       {value: 0x384d, lo: 0xa5, hi: 0xa5},
-       {value: 0x3859, lo: 0xa6, hi: 0xa6},
-       {value: 0xa000, lo: 0xa7, hi: 0xa7},
-       // Block 0x8, offset 0x47
-       {value: 0x0000, lo: 0x0e},
-       {value: 0x386b, lo: 0x80, hi: 0x80},
-       {value: 0xa000, lo: 0x81, hi: 0x81},
-       {value: 0x385f, lo: 0x82, hi: 0x82},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x3865, lo: 0x93, hi: 0x93},
-       {value: 0xa000, lo: 0x95, hi: 0x95},
-       {value: 0x8132, lo: 0x96, hi: 0x9c},
-       {value: 0x8132, lo: 0x9f, hi: 0xa2},
-       {value: 0x812d, lo: 0xa3, hi: 0xa3},
-       {value: 0x8132, lo: 0xa4, hi: 0xa4},
-       {value: 0x8132, lo: 0xa7, hi: 0xa8},
-       {value: 0x812d, lo: 0xaa, hi: 0xaa},
-       {value: 0x8132, lo: 0xab, hi: 0xac},
-       {value: 0x812d, lo: 0xad, hi: 0xad},
-       // Block 0x9, offset 0x56
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x811f, lo: 0x91, hi: 0x91},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       {value: 0x812d, lo: 0xb1, hi: 0xb1},
-       {value: 0x8132, lo: 0xb2, hi: 0xb3},
-       {value: 0x812d, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb5, hi: 0xb6},
-       {value: 0x812d, lo: 0xb7, hi: 0xb9},
-       {value: 0x8132, lo: 0xba, hi: 0xba},
-       {value: 0x812d, lo: 0xbb, hi: 0xbc},
-       {value: 0x8132, lo: 0xbd, hi: 0xbd},
-       {value: 0x812d, lo: 0xbe, hi: 0xbe},
-       {value: 0x8132, lo: 0xbf, hi: 0xbf},
-       // Block 0xa, offset 0x63
-       {value: 0x0005, lo: 0x07},
-       {value: 0x8132, lo: 0x80, hi: 0x80},
-       {value: 0x8132, lo: 0x81, hi: 0x81},
-       {value: 0x812d, lo: 0x82, hi: 0x83},
-       {value: 0x812d, lo: 0x84, hi: 0x85},
-       {value: 0x812d, lo: 0x86, hi: 0x87},
-       {value: 0x812d, lo: 0x88, hi: 0x89},
-       {value: 0x8132, lo: 0x8a, hi: 0x8a},
-       // Block 0xb, offset 0x6b
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8132, lo: 0xab, hi: 0xb1},
-       {value: 0x812d, lo: 0xb2, hi: 0xb2},
-       {value: 0x8132, lo: 0xb3, hi: 0xb3},
-       // Block 0xc, offset 0x6f
-       {value: 0x0000, lo: 0x04},
-       {value: 0x8132, lo: 0x96, hi: 0x99},
-       {value: 0x8132, lo: 0x9b, hi: 0xa3},
-       {value: 0x8132, lo: 0xa5, hi: 0xa7},
-       {value: 0x8132, lo: 0xa9, hi: 0xad},
-       // Block 0xd, offset 0x74
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x99, hi: 0x9b},
-       // Block 0xe, offset 0x76
-       {value: 0x0000, lo: 0x10},
-       {value: 0x8132, lo: 0x94, hi: 0xa1},
-       {value: 0x812d, lo: 0xa3, hi: 0xa3},
-       {value: 0x8132, lo: 0xa4, hi: 0xa5},
-       {value: 0x812d, lo: 0xa6, hi: 0xa6},
-       {value: 0x8132, lo: 0xa7, hi: 0xa8},
-       {value: 0x812d, lo: 0xa9, hi: 0xa9},
-       {value: 0x8132, lo: 0xaa, hi: 0xac},
-       {value: 0x812d, lo: 0xad, hi: 0xaf},
-       {value: 0x8116, lo: 0xb0, hi: 0xb0},
-       {value: 0x8117, lo: 0xb1, hi: 0xb1},
-       {value: 0x8118, lo: 0xb2, hi: 0xb2},
-       {value: 0x8132, lo: 0xb3, hi: 0xb5},
-       {value: 0x812d, lo: 0xb6, hi: 0xb6},
-       {value: 0x8132, lo: 0xb7, hi: 0xb8},
-       {value: 0x812d, lo: 0xb9, hi: 0xba},
-       {value: 0x8132, lo: 0xbb, hi: 0xbf},
-       // Block 0xf, offset 0x87
-       {value: 0x0000, lo: 0x07},
-       {value: 0xa000, lo: 0xa8, hi: 0xa8},
-       {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
-       {value: 0xa000, lo: 0xb0, hi: 0xb0},
-       {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
-       {value: 0xa000, lo: 0xb3, hi: 0xb3},
-       {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
-       {value: 0x9902, lo: 0xbc, hi: 0xbc},
-       // Block 0x10, offset 0x8f
-       {value: 0x0008, lo: 0x06},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x8132, lo: 0x91, hi: 0x91},
-       {value: 0x812d, lo: 0x92, hi: 0x92},
-       {value: 0x8132, lo: 0x93, hi: 0x93},
-       {value: 0x8132, lo: 0x94, hi: 0x94},
-       {value: 0x451c, lo: 0x98, hi: 0x9f},
-       // Block 0x11, offset 0x96
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x12, offset 0x99
-       {value: 0x0008, lo: 0x06},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       {value: 0x455c, lo: 0x9c, hi: 0x9d},
-       {value: 0x456c, lo: 0x9f, hi: 0x9f},
-       // Block 0x13, offset 0xa0
-       {value: 0x0000, lo: 0x03},
-       {value: 0x4594, lo: 0xb3, hi: 0xb3},
-       {value: 0x459c, lo: 0xb6, hi: 0xb6},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       // Block 0x14, offset 0xa4
-       {value: 0x0008, lo: 0x03},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x4574, lo: 0x99, hi: 0x9b},
-       {value: 0x458c, lo: 0x9e, hi: 0x9e},
-       // Block 0x15, offset 0xa8
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       // Block 0x16, offset 0xaa
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       // Block 0x17, offset 0xac
-       {value: 0x0000, lo: 0x08},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2cb6, lo: 0x88, hi: 0x88},
-       {value: 0x2cae, lo: 0x8b, hi: 0x8b},
-       {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x96, hi: 0x97},
-       {value: 0x45a4, lo: 0x9c, hi: 0x9c},
-       {value: 0x45ac, lo: 0x9d, hi: 0x9d},
-       // Block 0x18, offset 0xb5
-       {value: 0x0000, lo: 0x03},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0x2cc6, lo: 0x94, hi: 0x94},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x19, offset 0xb9
-       {value: 0x0000, lo: 0x06},
-       {value: 0xa000, lo: 0x86, hi: 0x87},
-       {value: 0x2cce, lo: 0x8a, hi: 0x8a},
-       {value: 0x2cde, lo: 0x8b, hi: 0x8b},
-       {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       // Block 0x1a, offset 0xc0
-       {value: 0x1801, lo: 0x04},
-       {value: 0xa000, lo: 0x86, hi: 0x86},
-       {value: 0x3ef0, lo: 0x88, hi: 0x88},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x8120, lo: 0x95, hi: 0x96},
-       // Block 0x1b, offset 0xc5
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xbc, hi: 0xbc},
-       {value: 0xa000, lo: 0xbf, hi: 0xbf},
-       // Block 0x1c, offset 0xc8
-       {value: 0x0000, lo: 0x09},
-       {value: 0x2ce6, lo: 0x80, hi: 0x80},
-       {value: 0x9900, lo: 0x82, hi: 0x82},
-       {value: 0xa000, lo: 0x86, hi: 0x86},
-       {value: 0x2cee, lo: 0x87, hi: 0x87},
-       {value: 0x2cf6, lo: 0x88, hi: 0x88},
-       {value: 0x2f50, lo: 0x8a, hi: 0x8a},
-       {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x95, hi: 0x96},
-       // Block 0x1d, offset 0xd2
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xbb, hi: 0xbc},
-       {value: 0x9900, lo: 0xbe, hi: 0xbe},
-       // Block 0x1e, offset 0xd5
-       {value: 0x0000, lo: 0x06},
-       {value: 0xa000, lo: 0x86, hi: 0x87},
-       {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
-       {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
-       {value: 0x2d06, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       // Block 0x1f, offset 0xdc
-       {value: 0x6bea, lo: 0x07},
-       {value: 0x9904, lo: 0x8a, hi: 0x8a},
-       {value: 0x9900, lo: 0x8f, hi: 0x8f},
-       {value: 0xa000, lo: 0x99, hi: 0x99},
-       {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
-       {value: 0x2f58, lo: 0x9c, hi: 0x9c},
-       {value: 0x2de3, lo: 0x9d, hi: 0x9d},
-       {value: 0x2d16, lo: 0x9e, hi: 0x9f},
-       // Block 0x20, offset 0xe4
-       {value: 0x0000, lo: 0x03},
-       {value: 0x2621, lo: 0xb3, hi: 0xb3},
-       {value: 0x8122, lo: 0xb8, hi: 0xb9},
-       {value: 0x8104, lo: 0xba, hi: 0xba},
-       // Block 0x21, offset 0xe8
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8123, lo: 0x88, hi: 0x8b},
-       // Block 0x22, offset 0xea
-       {value: 0x0000, lo: 0x02},
-       {value: 0x2636, lo: 0xb3, hi: 0xb3},
-       {value: 0x8124, lo: 0xb8, hi: 0xb9},
-       // Block 0x23, offset 0xed
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8125, lo: 0x88, hi: 0x8b},
-       {value: 0x2628, lo: 0x9c, hi: 0x9c},
-       {value: 0x262f, lo: 0x9d, hi: 0x9d},
-       // Block 0x24, offset 0xf1
-       {value: 0x0000, lo: 0x05},
-       {value: 0x030b, lo: 0x8c, hi: 0x8c},
-       {value: 0x812d, lo: 0x98, hi: 0x99},
-       {value: 0x812d, lo: 0xb5, hi: 0xb5},
-       {value: 0x812d, lo: 0xb7, hi: 0xb7},
-       {value: 0x812b, lo: 0xb9, hi: 0xb9},
-       // Block 0x25, offset 0xf7
-       {value: 0x0000, lo: 0x10},
-       {value: 0x2644, lo: 0x83, hi: 0x83},
-       {value: 0x264b, lo: 0x8d, hi: 0x8d},
-       {value: 0x2652, lo: 0x92, hi: 0x92},
-       {value: 0x2659, lo: 0x97, hi: 0x97},
-       {value: 0x2660, lo: 0x9c, hi: 0x9c},
-       {value: 0x263d, lo: 0xa9, hi: 0xa9},
-       {value: 0x8126, lo: 0xb1, hi: 0xb1},
-       {value: 0x8127, lo: 0xb2, hi: 0xb2},
-       {value: 0x4a84, lo: 0xb3, hi: 0xb3},
-       {value: 0x8128, lo: 0xb4, hi: 0xb4},
-       {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
-       {value: 0x45b4, lo: 0xb6, hi: 0xb6},
-       {value: 0x45f4, lo: 0xb7, hi: 0xb7},
-       {value: 0x45bc, lo: 0xb8, hi: 0xb8},
-       {value: 0x45ff, lo: 0xb9, hi: 0xb9},
-       {value: 0x8127, lo: 0xba, hi: 0xbd},
-       // Block 0x26, offset 0x108
-       {value: 0x0000, lo: 0x0b},
-       {value: 0x8127, lo: 0x80, hi: 0x80},
-       {value: 0x4a96, lo: 0x81, hi: 0x81},
-       {value: 0x8132, lo: 0x82, hi: 0x83},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0x86, hi: 0x87},
-       {value: 0x266e, lo: 0x93, hi: 0x93},
-       {value: 0x2675, lo: 0x9d, hi: 0x9d},
-       {value: 0x267c, lo: 0xa2, hi: 0xa2},
-       {value: 0x2683, lo: 0xa7, hi: 0xa7},
-       {value: 0x268a, lo: 0xac, hi: 0xac},
-       {value: 0x2667, lo: 0xb9, hi: 0xb9},
-       // Block 0x27, offset 0x114
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x86, hi: 0x86},
-       // Block 0x28, offset 0x116
-       {value: 0x0000, lo: 0x05},
-       {value: 0xa000, lo: 0xa5, hi: 0xa5},
-       {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
-       {value: 0x9900, lo: 0xae, hi: 0xae},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       {value: 0x8104, lo: 0xb9, hi: 0xba},
-       // Block 0x29, offset 0x11c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x8d, hi: 0x8d},
-       // Block 0x2a, offset 0x11e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x030f, lo: 0xbc, hi: 0xbc},
-       // Block 0x2b, offset 0x120
-       {value: 0x0000, lo: 0x01},
-       {value: 0xa000, lo: 0x80, hi: 0x92},
-       // Block 0x2c, offset 0x122
-       {value: 0x0000, lo: 0x01},
-       {value: 0xb900, lo: 0xa1, hi: 0xb5},
-       // Block 0x2d, offset 0x124
-       {value: 0x0000, lo: 0x01},
-       {value: 0x9900, lo: 0xa8, hi: 0xbf},
-       // Block 0x2e, offset 0x126
-       {value: 0x0000, lo: 0x01},
-       {value: 0x9900, lo: 0x80, hi: 0x82},
-       // Block 0x2f, offset 0x128
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x9d, hi: 0x9f},
-       // Block 0x30, offset 0x12a
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x94, hi: 0x94},
-       {value: 0x8104, lo: 0xb4, hi: 0xb4},
-       // Block 0x31, offset 0x12d
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x92, hi: 0x92},
-       {value: 0x8132, lo: 0x9d, hi: 0x9d},
-       // Block 0x32, offset 0x130
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8131, lo: 0xa9, hi: 0xa9},
-       // Block 0x33, offset 0x132
-       {value: 0x0004, lo: 0x02},
-       {value: 0x812e, lo: 0xb9, hi: 0xba},
-       {value: 0x812d, lo: 0xbb, hi: 0xbb},
-       // Block 0x34, offset 0x135
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x97, hi: 0x97},
-       {value: 0x812d, lo: 0x98, hi: 0x98},
-       // Block 0x35, offset 0x138
-       {value: 0x0000, lo: 0x03},
-       {value: 0x8104, lo: 0xa0, hi: 0xa0},
-       {value: 0x8132, lo: 0xb5, hi: 0xbc},
-       {value: 0x812d, lo: 0xbf, hi: 0xbf},
-       // Block 0x36, offset 0x13c
-       {value: 0x0000, lo: 0x04},
-       {value: 0x8132, lo: 0xb0, hi: 0xb4},
-       {value: 0x812d, lo: 0xb5, hi: 0xba},
-       {value: 0x8132, lo: 0xbb, hi: 0xbc},
-       {value: 0x812d, lo: 0xbd, hi: 0xbd},
-       // Block 0x37, offset 0x141
-       {value: 0x0000, lo: 0x08},
-       {value: 0x2d66, lo: 0x80, hi: 0x80},
-       {value: 0x2d6e, lo: 0x81, hi: 0x81},
-       {value: 0xa000, lo: 0x82, hi: 0x82},
-       {value: 0x2d76, lo: 0x83, hi: 0x83},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0xab, hi: 0xab},
-       {value: 0x812d, lo: 0xac, hi: 0xac},
-       {value: 0x8132, lo: 0xad, hi: 0xb3},
-       // Block 0x38, offset 0x14a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xaa, hi: 0xab},
-       // Block 0x39, offset 0x14c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0xa6, hi: 0xa6},
-       {value: 0x8104, lo: 0xb2, hi: 0xb3},
-       // Block 0x3a, offset 0x14f
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       // Block 0x3b, offset 0x151
-       {value: 0x0000, lo: 0x0a},
-       {value: 0x8132, lo: 0x90, hi: 0x92},
-       {value: 0x8101, lo: 0x94, hi: 0x94},
-       {value: 0x812d, lo: 0x95, hi: 0x99},
-       {value: 0x8132, lo: 0x9a, hi: 0x9b},
-       {value: 0x812d, lo: 0x9c, hi: 0x9f},
-       {value: 0x8132, lo: 0xa0, hi: 0xa0},
-       {value: 0x8101, lo: 0xa2, hi: 0xa8},
-       {value: 0x812d, lo: 0xad, hi: 0xad},
-       {value: 0x8132, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb8, hi: 0xb9},
-       // Block 0x3c, offset 0x15c
-       {value: 0x0002, lo: 0x0a},
-       {value: 0x0043, lo: 0xac, hi: 0xac},
-       {value: 0x00d1, lo: 0xad, hi: 0xad},
-       {value: 0x0045, lo: 0xae, hi: 0xae},
-       {value: 0x0049, lo: 0xb0, hi: 0xb1},
-       {value: 0x00e6, lo: 0xb2, hi: 0xb2},
-       {value: 0x004f, lo: 0xb3, hi: 0xba},
-       {value: 0x005f, lo: 0xbc, hi: 0xbc},
-       {value: 0x00ef, lo: 0xbd, hi: 0xbd},
-       {value: 0x0061, lo: 0xbe, hi: 0xbe},
-       {value: 0x0065, lo: 0xbf, hi: 0xbf},
-       // Block 0x3d, offset 0x167
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x0001, lo: 0x80, hi: 0x8a},
-       {value: 0x043b, lo: 0x91, hi: 0x91},
-       {value: 0x429b, lo: 0x97, hi: 0x97},
-       {value: 0x001d, lo: 0xa4, hi: 0xa4},
-       {value: 0x1873, lo: 0xa5, hi: 0xa5},
-       {value: 0x1b5c, lo: 0xa6, hi: 0xa6},
-       {value: 0x0001, lo: 0xaf, hi: 0xaf},
-       {value: 0x2691, lo: 0xb3, hi: 0xb3},
-       {value: 0x27fe, lo: 0xb4, hi: 0xb4},
-       {value: 0x2698, lo: 0xb6, hi: 0xb6},
-       {value: 0x2808, lo: 0xb7, hi: 0xb7},
-       {value: 0x186d, lo: 0xbc, hi: 0xbc},
-       {value: 0x4269, lo: 0xbe, hi: 0xbe},
-       // Block 0x3e, offset 0x175
-       {value: 0x0002, lo: 0x0d},
-       {value: 0x1933, lo: 0x87, hi: 0x87},
-       {value: 0x1930, lo: 0x88, hi: 0x88},
-       {value: 0x1870, lo: 0x89, hi: 0x89},
-       {value: 0x298e, lo: 0x97, hi: 0x97},
-       {value: 0x0001, lo: 0x9f, hi: 0x9f},
-       {value: 0x0021, lo: 0xb0, hi: 0xb0},
-       {value: 0x0093, lo: 0xb1, hi: 0xb1},
-       {value: 0x0029, lo: 0xb4, hi: 0xb9},
-       {value: 0x0017, lo: 0xba, hi: 0xba},
-       {value: 0x0467, lo: 0xbb, hi: 0xbb},
-       {value: 0x003b, lo: 0xbc, hi: 0xbc},
-       {value: 0x0011, lo: 0xbd, hi: 0xbe},
-       {value: 0x009d, lo: 0xbf, hi: 0xbf},
-       // Block 0x3f, offset 0x183
-       {value: 0x0002, lo: 0x0f},
-       {value: 0x0021, lo: 0x80, hi: 0x89},
-       {value: 0x0017, lo: 0x8a, hi: 0x8a},
-       {value: 0x0467, lo: 0x8b, hi: 0x8b},
-       {value: 0x003b, lo: 0x8c, hi: 0x8c},
-       {value: 0x0011, lo: 0x8d, hi: 0x8e},
-       {value: 0x0083, lo: 0x90, hi: 0x90},
-       {value: 0x008b, lo: 0x91, hi: 0x91},
-       {value: 0x009f, lo: 0x92, hi: 0x92},
-       {value: 0x00b1, lo: 0x93, hi: 0x93},
-       {value: 0x0104, lo: 0x94, hi: 0x94},
-       {value: 0x0091, lo: 0x95, hi: 0x95},
-       {value: 0x0097, lo: 0x96, hi: 0x99},
-       {value: 0x00a1, lo: 0x9a, hi: 0x9a},
-       {value: 0x00a7, lo: 0x9b, hi: 0x9c},
-       {value: 0x1999, lo: 0xa8, hi: 0xa8},
-       // Block 0x40, offset 0x193
-       {value: 0x0000, lo: 0x0d},
-       {value: 0x8132, lo: 0x90, hi: 0x91},
-       {value: 0x8101, lo: 0x92, hi: 0x93},
-       {value: 0x8132, lo: 0x94, hi: 0x97},
-       {value: 0x8101, lo: 0x98, hi: 0x9a},
-       {value: 0x8132, lo: 0x9b, hi: 0x9c},
-       {value: 0x8132, lo: 0xa1, hi: 0xa1},
-       {value: 0x8101, lo: 0xa5, hi: 0xa6},
-       {value: 0x8132, lo: 0xa7, hi: 0xa7},
-       {value: 0x812d, lo: 0xa8, hi: 0xa8},
-       {value: 0x8132, lo: 0xa9, hi: 0xa9},
-       {value: 0x8101, lo: 0xaa, hi: 0xab},
-       {value: 0x812d, lo: 0xac, hi: 0xaf},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       // Block 0x41, offset 0x1a1
-       {value: 0x0007, lo: 0x06},
-       {value: 0x2180, lo: 0x89, hi: 0x89},
-       {value: 0xa000, lo: 0x90, hi: 0x90},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0xa000, lo: 0x94, hi: 0x94},
-       {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
-       {value: 0x3bc7, lo: 0xae, hi: 0xae},
-       // Block 0x42, offset 0x1a8
-       {value: 0x000e, lo: 0x05},
-       {value: 0x3bce, lo: 0x8d, hi: 0x8e},
-       {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
-       {value: 0xa000, lo: 0x90, hi: 0x90},
-       {value: 0xa000, lo: 0x92, hi: 0x92},
-       {value: 0xa000, lo: 0x94, hi: 0x94},
-       // Block 0x43, offset 0x1ae
-       {value: 0x0173, lo: 0x0e},
-       {value: 0xa000, lo: 0x83, hi: 0x83},
-       {value: 0x3be3, lo: 0x84, hi: 0x84},
-       {value: 0xa000, lo: 0x88, hi: 0x88},
-       {value: 0x3bea, lo: 0x89, hi: 0x89},
-       {value: 0xa000, lo: 0x8b, hi: 0x8b},
-       {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
-       {value: 0xa000, lo: 0xa3, hi: 0xa3},
-       {value: 0x3bf8, lo: 0xa4, hi: 0xa4},
-       {value: 0xa000, lo: 0xa5, hi: 0xa5},
-       {value: 0x3bff, lo: 0xa6, hi: 0xa6},
-       {value: 0x269f, lo: 0xac, hi: 0xad},
-       {value: 0x26a6, lo: 0xaf, hi: 0xaf},
-       {value: 0x281c, lo: 0xb0, hi: 0xb0},
-       {value: 0xa000, lo: 0xbc, hi: 0xbc},
-       // Block 0x44, offset 0x1bd
-       {value: 0x0007, lo: 0x03},
-       {value: 0x3c68, lo: 0xa0, hi: 0xa1},
-       {value: 0x3c92, lo: 0xa2, hi: 0xa3},
-       {value: 0x3cbc, lo: 0xaa, hi: 0xad},
-       // Block 0x45, offset 0x1c1
-       {value: 0x0004, lo: 0x01},
-       {value: 0x048b, lo: 0xa9, hi: 0xaa},
-       // Block 0x46, offset 0x1c3
-       {value: 0x0002, lo: 0x03},
-       {value: 0x0057, lo: 0x80, hi: 0x8f},
-       {value: 0x0083, lo: 0x90, hi: 0xa9},
-       {value: 0x0021, lo: 0xaa, hi: 0xaa},
-       // Block 0x47, offset 0x1c7
-       {value: 0x0000, lo: 0x01},
-       {value: 0x299b, lo: 0x8c, hi: 0x8c},
-       // Block 0x48, offset 0x1c9
-       {value: 0x0263, lo: 0x02},
-       {value: 0x1b8c, lo: 0xb4, hi: 0xb4},
-       {value: 0x192d, lo: 0xb5, hi: 0xb6},
-       // Block 0x49, offset 0x1cc
-       {value: 0x0000, lo: 0x01},
-       {value: 0x44dd, lo: 0x9c, hi: 0x9c},
-       // Block 0x4a, offset 0x1ce
-       {value: 0x0000, lo: 0x02},
-       {value: 0x0095, lo: 0xbc, hi: 0xbc},
-       {value: 0x006d, lo: 0xbd, hi: 0xbd},
-       // Block 0x4b, offset 0x1d1
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xaf, hi: 0xb1},
-       // Block 0x4c, offset 0x1d3
-       {value: 0x0000, lo: 0x02},
-       {value: 0x047f, lo: 0xaf, hi: 0xaf},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x4d, offset 0x1d6
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xa0, hi: 0xbf},
-       // Block 0x4e, offset 0x1d8
-       {value: 0x0000, lo: 0x01},
-       {value: 0x0dc3, lo: 0x9f, hi: 0x9f},
-       // Block 0x4f, offset 0x1da
-       {value: 0x0000, lo: 0x01},
-       {value: 0x162f, lo: 0xb3, hi: 0xb3},
-       // Block 0x50, offset 0x1dc
-       {value: 0x0004, lo: 0x0b},
-       {value: 0x1597, lo: 0x80, hi: 0x82},
-       {value: 0x15af, lo: 0x83, hi: 0x83},
-       {value: 0x15c7, lo: 0x84, hi: 0x85},
-       {value: 0x15d7, lo: 0x86, hi: 0x89},
-       {value: 0x15eb, lo: 0x8a, hi: 0x8c},
-       {value: 0x15ff, lo: 0x8d, hi: 0x8d},
-       {value: 0x1607, lo: 0x8e, hi: 0x8e},
-       {value: 0x160f, lo: 0x8f, hi: 0x90},
-       {value: 0x161b, lo: 0x91, hi: 0x93},
-       {value: 0x162b, lo: 0x94, hi: 0x94},
-       {value: 0x1633, lo: 0x95, hi: 0x95},
-       // Block 0x51, offset 0x1e8
-       {value: 0x0004, lo: 0x09},
-       {value: 0x0001, lo: 0x80, hi: 0x80},
-       {value: 0x812c, lo: 0xaa, hi: 0xaa},
-       {value: 0x8131, lo: 0xab, hi: 0xab},
-       {value: 0x8133, lo: 0xac, hi: 0xac},
-       {value: 0x812e, lo: 0xad, hi: 0xad},
-       {value: 0x812f, lo: 0xae, hi: 0xae},
-       {value: 0x812f, lo: 0xaf, hi: 0xaf},
-       {value: 0x04b3, lo: 0xb6, hi: 0xb6},
-       {value: 0x0887, lo: 0xb8, hi: 0xba},
-       // Block 0x52, offset 0x1f2
-       {value: 0x0006, lo: 0x09},
-       {value: 0x0313, lo: 0xb1, hi: 0xb1},
-       {value: 0x0317, lo: 0xb2, hi: 0xb2},
-       {value: 0x4a3b, lo: 0xb3, hi: 0xb3},
-       {value: 0x031b, lo: 0xb4, hi: 0xb4},
-       {value: 0x4a41, lo: 0xb5, hi: 0xb6},
-       {value: 0x031f, lo: 0xb7, hi: 0xb7},
-       {value: 0x0323, lo: 0xb8, hi: 0xb8},
-       {value: 0x0327, lo: 0xb9, hi: 0xb9},
-       {value: 0x4a4d, lo: 0xba, hi: 0xbf},
-       // Block 0x53, offset 0x1fc
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0xaf, hi: 0xaf},
-       {value: 0x8132, lo: 0xb4, hi: 0xbd},
-       // Block 0x54, offset 0x1ff
-       {value: 0x0000, lo: 0x03},
-       {value: 0x020f, lo: 0x9c, hi: 0x9c},
-       {value: 0x0212, lo: 0x9d, hi: 0x9d},
-       {value: 0x8132, lo: 0x9e, hi: 0x9f},
-       // Block 0x55, offset 0x203
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb0, hi: 0xb1},
-       // Block 0x56, offset 0x205
-       {value: 0x0000, lo: 0x01},
-       {value: 0x163b, lo: 0xb0, hi: 0xb0},
-       // Block 0x57, offset 0x207
-       {value: 0x000c, lo: 0x01},
-       {value: 0x00d7, lo: 0xb8, hi: 0xb9},
-       // Block 0x58, offset 0x209
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x86, hi: 0x86},
-       // Block 0x59, offset 0x20b
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x84, hi: 0x84},
-       {value: 0x8132, lo: 0xa0, hi: 0xb1},
-       // Block 0x5a, offset 0x20e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xab, hi: 0xad},
-       // Block 0x5b, offset 0x210
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x93, hi: 0x93},
-       // Block 0x5c, offset 0x212
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0xb3, hi: 0xb3},
-       // Block 0x5d, offset 0x214
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x80, hi: 0x80},
-       // Block 0x5e, offset 0x216
-       {value: 0x0000, lo: 0x05},
-       {value: 0x8132, lo: 0xb0, hi: 0xb0},
-       {value: 0x8132, lo: 0xb2, hi: 0xb3},
-       {value: 0x812d, lo: 0xb4, hi: 0xb4},
-       {value: 0x8132, lo: 0xb7, hi: 0xb8},
-       {value: 0x8132, lo: 0xbe, hi: 0xbf},
-       // Block 0x5f, offset 0x21c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x81, hi: 0x81},
-       {value: 0x8104, lo: 0xb6, hi: 0xb6},
-       // Block 0x60, offset 0x21f
-       {value: 0x0008, lo: 0x03},
-       {value: 0x1637, lo: 0x9c, hi: 0x9d},
-       {value: 0x0125, lo: 0x9e, hi: 0x9e},
-       {value: 0x1643, lo: 0x9f, hi: 0x9f},
-       // Block 0x61, offset 0x223
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xad, hi: 0xad},
-       // Block 0x62, offset 0x225
-       {value: 0x0000, lo: 0x06},
-       {value: 0xe500, lo: 0x80, hi: 0x80},
-       {value: 0xc600, lo: 0x81, hi: 0x9b},
-       {value: 0xe500, lo: 0x9c, hi: 0x9c},
-       {value: 0xc600, lo: 0x9d, hi: 0xb7},
-       {value: 0xe500, lo: 0xb8, hi: 0xb8},
-       {value: 0xc600, lo: 0xb9, hi: 0xbf},
-       // Block 0x63, offset 0x22c
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x93},
-       {value: 0xe500, lo: 0x94, hi: 0x94},
-       {value: 0xc600, lo: 0x95, hi: 0xaf},
-       {value: 0xe500, lo: 0xb0, hi: 0xb0},
-       {value: 0xc600, lo: 0xb1, hi: 0xbf},
-       // Block 0x64, offset 0x232
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x8b},
-       {value: 0xe500, lo: 0x8c, hi: 0x8c},
-       {value: 0xc600, lo: 0x8d, hi: 0xa7},
-       {value: 0xe500, lo: 0xa8, hi: 0xa8},
-       {value: 0xc600, lo: 0xa9, hi: 0xbf},
-       // Block 0x65, offset 0x238
-       {value: 0x0000, lo: 0x07},
-       {value: 0xc600, lo: 0x80, hi: 0x83},
-       {value: 0xe500, lo: 0x84, hi: 0x84},
-       {value: 0xc600, lo: 0x85, hi: 0x9f},
-       {value: 0xe500, lo: 0xa0, hi: 0xa0},
-       {value: 0xc600, lo: 0xa1, hi: 0xbb},
-       {value: 0xe500, lo: 0xbc, hi: 0xbc},
-       {value: 0xc600, lo: 0xbd, hi: 0xbf},
-       // Block 0x66, offset 0x240
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x97},
-       {value: 0xe500, lo: 0x98, hi: 0x98},
-       {value: 0xc600, lo: 0x99, hi: 0xb3},
-       {value: 0xe500, lo: 0xb4, hi: 0xb4},
-       {value: 0xc600, lo: 0xb5, hi: 0xbf},
-       // Block 0x67, offset 0x246
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x8f},
-       {value: 0xe500, lo: 0x90, hi: 0x90},
-       {value: 0xc600, lo: 0x91, hi: 0xab},
-       {value: 0xe500, lo: 0xac, hi: 0xac},
-       {value: 0xc600, lo: 0xad, hi: 0xbf},
-       // Block 0x68, offset 0x24c
-       {value: 0x0000, lo: 0x05},
-       {value: 0xc600, lo: 0x80, hi: 0x87},
-       {value: 0xe500, lo: 0x88, hi: 0x88},
-       {value: 0xc600, lo: 0x89, hi: 0xa3},
-       {value: 0xe500, lo: 0xa4, hi: 0xa4},
-       {value: 0xc600, lo: 0xa5, hi: 0xbf},
-       // Block 0x69, offset 0x252
-       {value: 0x0000, lo: 0x03},
-       {value: 0xc600, lo: 0x80, hi: 0x87},
-       {value: 0xe500, lo: 0x88, hi: 0x88},
-       {value: 0xc600, lo: 0x89, hi: 0xa3},
-       // Block 0x6a, offset 0x256
-       {value: 0x0002, lo: 0x01},
-       {value: 0x0003, lo: 0x81, hi: 0xbf},
-       // Block 0x6b, offset 0x258
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xbd, hi: 0xbd},
-       // Block 0x6c, offset 0x25a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0xa0, hi: 0xa0},
-       // Block 0x6d, offset 0x25c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb6, hi: 0xba},
-       // Block 0x6e, offset 0x25e
-       {value: 0x002c, lo: 0x05},
-       {value: 0x812d, lo: 0x8d, hi: 0x8d},
-       {value: 0x8132, lo: 0x8f, hi: 0x8f},
-       {value: 0x8132, lo: 0xb8, hi: 0xb8},
-       {value: 0x8101, lo: 0xb9, hi: 0xba},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x6f, offset 0x264
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0xa5, hi: 0xa5},
-       {value: 0x812d, lo: 0xa6, hi: 0xa6},
-       // Block 0x70, offset 0x267
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x86, hi: 0x86},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x71, offset 0x26a
-       {value: 0x17fe, lo: 0x07},
-       {value: 0xa000, lo: 0x99, hi: 0x99},
-       {value: 0x4238, lo: 0x9a, hi: 0x9a},
-       {value: 0xa000, lo: 0x9b, hi: 0x9b},
-       {value: 0x4242, lo: 0x9c, hi: 0x9c},
-       {value: 0xa000, lo: 0xa5, hi: 0xa5},
-       {value: 0x424c, lo: 0xab, hi: 0xab},
-       {value: 0x8104, lo: 0xb9, hi: 0xba},
-       // Block 0x72, offset 0x272
-       {value: 0x0000, lo: 0x06},
-       {value: 0x8132, lo: 0x80, hi: 0x82},
-       {value: 0x9900, lo: 0xa7, hi: 0xa7},
-       {value: 0x2d7e, lo: 0xae, hi: 0xae},
-       {value: 0x2d88, lo: 0xaf, hi: 0xaf},
-       {value: 0xa000, lo: 0xb1, hi: 0xb2},
-       {value: 0x8104, lo: 0xb3, hi: 0xb4},
-       // Block 0x73, offset 0x279
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x80, hi: 0x80},
-       {value: 0x8102, lo: 0x8a, hi: 0x8a},
-       // Block 0x74, offset 0x27c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xb5, hi: 0xb5},
-       {value: 0x8102, lo: 0xb6, hi: 0xb6},
-       // Block 0x75, offset 0x27f
-       {value: 0x0002, lo: 0x01},
-       {value: 0x8102, lo: 0xa9, hi: 0xaa},
-       // Block 0x76, offset 0x281
-       {value: 0x0000, lo: 0x07},
-       {value: 0xa000, lo: 0x87, hi: 0x87},
-       {value: 0x2d92, lo: 0x8b, hi: 0x8b},
-       {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
-       {value: 0x8104, lo: 0x8d, hi: 0x8d},
-       {value: 0x9900, lo: 0x97, hi: 0x97},
-       {value: 0x8132, lo: 0xa6, hi: 0xac},
-       {value: 0x8132, lo: 0xb0, hi: 0xb4},
-       // Block 0x77, offset 0x289
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x82, hi: 0x82},
-       {value: 0x8102, lo: 0x86, hi: 0x86},
-       // Block 0x78, offset 0x28c
-       {value: 0x6b5a, lo: 0x06},
-       {value: 0x9900, lo: 0xb0, hi: 0xb0},
-       {value: 0xa000, lo: 0xb9, hi: 0xb9},
-       {value: 0x9900, lo: 0xba, hi: 0xba},
-       {value: 0x2db0, lo: 0xbb, hi: 0xbb},
-       {value: 0x2da6, lo: 0xbc, hi: 0xbd},
-       {value: 0x2dba, lo: 0xbe, hi: 0xbe},
-       // Block 0x79, offset 0x293
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0x82, hi: 0x82},
-       {value: 0x8102, lo: 0x83, hi: 0x83},
-       // Block 0x7a, offset 0x296
-       {value: 0x0000, lo: 0x05},
-       {value: 0x9900, lo: 0xaf, hi: 0xaf},
-       {value: 0xa000, lo: 0xb8, hi: 0xb9},
-       {value: 0x2dc4, lo: 0xba, hi: 0xba},
-       {value: 0x2dce, lo: 0xbb, hi: 0xbb},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x7b, offset 0x29c
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8102, lo: 0x80, hi: 0x80},
-       // Block 0x7c, offset 0x29e
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xbf, hi: 0xbf},
-       // Block 0x7d, offset 0x2a0
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8104, lo: 0xb6, hi: 0xb6},
-       {value: 0x8102, lo: 0xb7, hi: 0xb7},
-       // Block 0x7e, offset 0x2a3
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xab, hi: 0xab},
-       // Block 0x7f, offset 0x2a5
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0xb4, hi: 0xb4},
-       // Block 0x80, offset 0x2a7
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x87, hi: 0x87},
-       // Block 0x81, offset 0x2a9
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8104, lo: 0x99, hi: 0x99},
-       // Block 0x82, offset 0x2ab
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8102, lo: 0x82, hi: 0x82},
-       {value: 0x8104, lo: 0x84, hi: 0x85},
-       // Block 0x83, offset 0x2ae
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8101, lo: 0xb0, hi: 0xb4},
-       // Block 0x84, offset 0x2b0
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0xb0, hi: 0xb6},
-       // Block 0x85, offset 0x2b2
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8101, lo: 0x9e, hi: 0x9e},
-       // Block 0x86, offset 0x2b4
-       {value: 0x0000, lo: 0x0c},
-       {value: 0x45cc, lo: 0x9e, hi: 0x9e},
-       {value: 0x45d6, lo: 0x9f, hi: 0x9f},
-       {value: 0x460a, lo: 0xa0, hi: 0xa0},
-       {value: 0x4618, lo: 0xa1, hi: 0xa1},
-       {value: 0x4626, lo: 0xa2, hi: 0xa2},
-       {value: 0x4634, lo: 0xa3, hi: 0xa3},
-       {value: 0x4642, lo: 0xa4, hi: 0xa4},
-       {value: 0x812b, lo: 0xa5, hi: 0xa6},
-       {value: 0x8101, lo: 0xa7, hi: 0xa9},
-       {value: 0x8130, lo: 0xad, hi: 0xad},
-       {value: 0x812b, lo: 0xae, hi: 0xb2},
-       {value: 0x812d, lo: 0xbb, hi: 0xbf},
-       // Block 0x87, offset 0x2c1
-       {value: 0x0000, lo: 0x09},
-       {value: 0x812d, lo: 0x80, hi: 0x82},
-       {value: 0x8132, lo: 0x85, hi: 0x89},
-       {value: 0x812d, lo: 0x8a, hi: 0x8b},
-       {value: 0x8132, lo: 0xaa, hi: 0xad},
-       {value: 0x45e0, lo: 0xbb, hi: 0xbb},
-       {value: 0x45ea, lo: 0xbc, hi: 0xbc},
-       {value: 0x4650, lo: 0xbd, hi: 0xbd},
-       {value: 0x466c, lo: 0xbe, hi: 0xbe},
-       {value: 0x465e, lo: 0xbf, hi: 0xbf},
-       // Block 0x88, offset 0x2cb
-       {value: 0x0000, lo: 0x01},
-       {value: 0x467a, lo: 0x80, hi: 0x80},
-       // Block 0x89, offset 0x2cd
-       {value: 0x0000, lo: 0x01},
-       {value: 0x8132, lo: 0x82, hi: 0x84},
-       // Block 0x8a, offset 0x2cf
-       {value: 0x0002, lo: 0x03},
-       {value: 0x0043, lo: 0x80, hi: 0x99},
-       {value: 0x0083, lo: 0x9a, hi: 0xb3},
-       {value: 0x0043, lo: 0xb4, hi: 0xbf},
-       // Block 0x8b, offset 0x2d3
-       {value: 0x0002, lo: 0x04},
-       {value: 0x005b, lo: 0x80, hi: 0x8d},
-       {value: 0x0083, lo: 0x8e, hi: 0x94},
-       {value: 0x0093, lo: 0x96, hi: 0xa7},
-       {value: 0x0043, lo: 0xa8, hi: 0xbf},
-       // Block 0x8c, offset 0x2d8
-       {value: 0x0002, lo: 0x0b},
-       {value: 0x0073, lo: 0x80, hi: 0x81},
-       {value: 0x0083, lo: 0x82, hi: 0x9b},
-       {value: 0x0043, lo: 0x9c, hi: 0x9c},
-       {value: 0x0047, lo: 0x9e, hi: 0x9f},
-       {value: 0x004f, lo: 0xa2, hi: 0xa2},
-       {value: 0x0055, lo: 0xa5, hi: 0xa6},
-       {value: 0x005d, lo: 0xa9, hi: 0xac},
-       {value: 0x0067, lo: 0xae, hi: 0xb5},
-       {value: 0x0083, lo: 0xb6, hi: 0xb9},
-       {value: 0x008d, lo: 0xbb, hi: 0xbb},
-       {value: 0x0091, lo: 0xbd, hi: 0xbf},
-       // Block 0x8d, offset 0x2e4
-       {value: 0x0002, lo: 0x04},
-       {value: 0x0097, lo: 0x80, hi: 0x83},
-       {value: 0x00a1, lo: 0x85, hi: 0x8f},
-       {value: 0x0043, lo: 0x90, hi: 0xa9},
-       {value: 0x0083, lo: 0xaa, hi: 0xbf},
-       // Block 0x8e, offset 0x2e9
-       {value: 0x0002, lo: 0x08},
-       {value: 0x00af, lo: 0x80, hi: 0x83},
-       {value: 0x0043, lo: 0x84, hi: 0x85},
-       {value: 0x0049, lo: 0x87, hi: 0x8a},
-       {value: 0x0055, lo: 0x8d, hi: 0x94},
-       {value: 0x0067, lo: 0x96, hi: 0x9c},
-       {value: 0x0083, lo: 0x9e, hi: 0xb7},
-       {value: 0x0043, lo: 0xb8, hi: 0xb9},
-       {value: 0x0049, lo: 0xbb, hi: 0xbe},
-       // Block 0x8f, offset 0x2f2
-       {value: 0x0002, lo: 0x05},
-       {value: 0x0053, lo: 0x80, hi: 0x84},
-       {value: 0x005f, lo: 0x86, hi: 0x86},
-       {value: 0x0067, lo: 0x8a, hi: 0x90},
-       {value: 0x0083, lo: 0x92, hi: 0xab},
-       {value: 0x0043, lo: 0xac, hi: 0xbf},
-       // Block 0x90, offset 0x2f8
-       {value: 0x0002, lo: 0x04},
-       {value: 0x006b, lo: 0x80, hi: 0x85},
-       {value: 0x0083, lo: 0x86, hi: 0x9f},
-       {value: 0x0043, lo: 0xa0, hi: 0xb9},
-       {value: 0x0083, lo: 0xba, hi: 0xbf},
-       // Block 0x91, offset 0x2fd
-       {value: 0x0002, lo: 0x03},
-       {value: 0x008f, lo: 0x80, hi: 0x93},
-       {value: 0x0043, lo: 0x94, hi: 0xad},
-       {value: 0x0083, lo: 0xae, hi: 0xbf},
-       // Block 0x92, offset 0x301
-       {value: 0x0002, lo: 0x04},
-       {value: 0x00a7, lo: 0x80, hi: 0x87},
-       {value: 0x0043, lo: 0x88, hi: 0xa1},
-       {value: 0x0083, lo: 0xa2, hi: 0xbb},
-       {value: 0x0043, lo: 0xbc, hi: 0xbf},
-       // Block 0x93, offset 0x306
-       {value: 0x0002, lo: 0x03},
-       {value: 0x004b, lo: 0x80, hi: 0x95},
-       {value: 0x0083, lo: 0x96, hi: 0xaf},
-       {value: 0x0043, lo: 0xb0, hi: 0xbf},
-       // Block 0x94, offset 0x30a
-       {value: 0x0003, lo: 0x0f},
-       {value: 0x01b8, lo: 0x80, hi: 0x80},
-       {value: 0x045f, lo: 0x81, hi: 0x81},
-       {value: 0x01bb, lo: 0x82, hi: 0x9a},
-       {value: 0x045b, lo: 0x9b, hi: 0x9b},
-       {value: 0x01c7, lo: 0x9c, hi: 0x9c},
-       {value: 0x01d0, lo: 0x9d, hi: 0x9d},
-       {value: 0x01d6, lo: 0x9e, hi: 0x9e},
-       {value: 0x01fa, lo: 0x9f, hi: 0x9f},
-       {value: 0x01eb, lo: 0xa0, hi: 0xa0},
-       {value: 0x01e8, lo: 0xa1, hi: 0xa1},
-       {value: 0x0173, lo: 0xa2, hi: 0xb2},
-       {value: 0x0188, lo: 0xb3, hi: 0xb3},
-       {value: 0x01a6, lo: 0xb4, hi: 0xba},
-       {value: 0x045f, lo: 0xbb, hi: 0xbb},
-       {value: 0x01bb, lo: 0xbc, hi: 0xbf},
-       // Block 0x95, offset 0x31a
-       {value: 0x0003, lo: 0x0d},
-       {value: 0x01c7, lo: 0x80, hi: 0x94},
-       {value: 0x045b, lo: 0x95, hi: 0x95},
-       {value: 0x01c7, lo: 0x96, hi: 0x96},
-       {value: 0x01d0, lo: 0x97, hi: 0x97},
-       {value: 0x01d6, lo: 0x98, hi: 0x98},
-       {value: 0x01fa, lo: 0x99, hi: 0x99},
-       {value: 0x01eb, lo: 0x9a, hi: 0x9a},
-       {value: 0x01e8, lo: 0x9b, hi: 0x9b},
-       {value: 0x0173, lo: 0x9c, hi: 0xac},
-       {value: 0x0188, lo: 0xad, hi: 0xad},
-       {value: 0x01a6, lo: 0xae, hi: 0xb4},
-       {value: 0x045f, lo: 0xb5, hi: 0xb5},
-       {value: 0x01bb, lo: 0xb6, hi: 0xbf},
-       // Block 0x96, offset 0x328
-       {value: 0x0003, lo: 0x0d},
-       {value: 0x01d9, lo: 0x80, hi: 0x8e},
-       {value: 0x045b, lo: 0x8f, hi: 0x8f},
-       {value: 0x01c7, lo: 0x90, hi: 0x90},
-       {value: 0x01d0, lo: 0x91, hi: 0x91},
-       {value: 0x01d6, lo: 0x92, hi: 0x92},
-       {value: 0x01fa, lo: 0x93, hi: 0x93},
-       {value: 0x01eb, lo: 0x94, hi: 0x94},
-       {value: 0x01e8, lo: 0x95, hi: 0x95},
-       {value: 0x0173, lo: 0x96, hi: 0xa6},
-       {value: 0x0188, lo: 0xa7, hi: 0xa7},
-       {value: 0x01a6, lo: 0xa8, hi: 0xae},
-       {value: 0x045f, lo: 0xaf, hi: 0xaf},
-       {value: 0x01bb, lo: 0xb0, hi: 0xbf},
-       // Block 0x97, offset 0x336
-       {value: 0x0003, lo: 0x0d},
-       {value: 0x01eb, lo: 0x80, hi: 0x88},
-       {value: 0x045b, lo: 0x89, hi: 0x89},
-       {value: 0x01c7, lo: 0x8a, hi: 0x8a},
-       {value: 0x01d0, lo: 0x8b, hi: 0x8b},
-       {value: 0x01d6, lo: 0x8c, hi: 0x8c},
-       {value: 0x01fa, lo: 0x8d, hi: 0x8d},
-       {value: 0x01eb, lo: 0x8e, hi: 0x8e},
-       {value: 0x01e8, lo: 0x8f, hi: 0x8f},
-       {value: 0x0173, lo: 0x90, hi: 0xa0},
-       {value: 0x0188, lo: 0xa1, hi: 0xa1},
-       {value: 0x01a6, lo: 0xa2, hi: 0xa8},
-       {value: 0x045f, lo: 0xa9, hi: 0xa9},
-       {value: 0x01bb, lo: 0xaa, hi: 0xbf},
-       // Block 0x98, offset 0x344
-       {value: 0x0000, lo: 0x05},
-       {value: 0x8132, lo: 0x80, hi: 0x86},
-       {value: 0x8132, lo: 0x88, hi: 0x98},
-       {value: 0x8132, lo: 0x9b, hi: 0xa1},
-       {value: 0x8132, lo: 0xa3, hi: 0xa4},
-       {value: 0x8132, lo: 0xa6, hi: 0xaa},
-       // Block 0x99, offset 0x34a
-       {value: 0x0000, lo: 0x01},
-       {value: 0x812d, lo: 0x90, hi: 0x96},
-       // Block 0x9a, offset 0x34c
-       {value: 0x0000, lo: 0x02},
-       {value: 0x8132, lo: 0x84, hi: 0x89},
-       {value: 0x8102, lo: 0x8a, hi: 0x8a},
-       // Block 0x9b, offset 0x34f
-       {value: 0x0002, lo: 0x09},
-       {value: 0x0063, lo: 0x80, hi: 0x89},
-       {value: 0x1951, lo: 0x8a, hi: 0x8a},
-       {value: 0x1981, lo: 0x8b, hi: 0x8b},
-       {value: 0x199c, lo: 0x8c, hi: 0x8c},
-       {value: 0x19a2, lo: 0x8d, hi: 0x8d},
-       {value: 0x1bc0, lo: 0x8e, hi: 0x8e},
-       {value: 0x19ae, lo: 0x8f, hi: 0x8f},
-       {value: 0x197b, lo: 0xaa, hi: 0xaa},
-       {value: 0x197e, lo: 0xab, hi: 0xab},
-       // Block 0x9c, offset 0x359
-       {value: 0x0000, lo: 0x01},
-       {value: 0x193f, lo: 0x90, hi: 0x90},
-       // Block 0x9d, offset 0x35b
-       {value: 0x0028, lo: 0x09},
-       {value: 0x2862, lo: 0x80, hi: 0x80},
-       {value: 0x2826, lo: 0x81, hi: 0x81},
-       {value: 0x2830, lo: 0x82, hi: 0x82},
-       {value: 0x2844, lo: 0x83, hi: 0x84},
-       {value: 0x284e, lo: 0x85, hi: 0x86},
-       {value: 0x283a, lo: 0x87, hi: 0x87},
-       {value: 0x2858, lo: 0x88, hi: 0x88},
-       {value: 0x0b6f, lo: 0x90, hi: 0x90},
-       {value: 0x08e7, lo: 0x91, hi: 0x91},
-}
-
-// recompMap: 7520 bytes (entries only)
-var recompMap = map[uint32]rune{
-       0x00410300: 0x00C0,
-       0x00410301: 0x00C1,
-       0x00410302: 0x00C2,
-       0x00410303: 0x00C3,
-       0x00410308: 0x00C4,
-       0x0041030A: 0x00C5,
-       0x00430327: 0x00C7,
-       0x00450300: 0x00C8,
-       0x00450301: 0x00C9,
-       0x00450302: 0x00CA,
-       0x00450308: 0x00CB,
-       0x00490300: 0x00CC,
-       0x00490301: 0x00CD,
-       0x00490302: 0x00CE,
-       0x00490308: 0x00CF,
-       0x004E0303: 0x00D1,
-       0x004F0300: 0x00D2,
-       0x004F0301: 0x00D3,
-       0x004F0302: 0x00D4,
-       0x004F0303: 0x00D5,
-       0x004F0308: 0x00D6,
-       0x00550300: 0x00D9,
-       0x00550301: 0x00DA,
-       0x00550302: 0x00DB,
-       0x00550308: 0x00DC,
-       0x00590301: 0x00DD,
-       0x00610300: 0x00E0,
-       0x00610301: 0x00E1,
-       0x00610302: 0x00E2,
-       0x00610303: 0x00E3,
-       0x00610308: 0x00E4,
-       0x0061030A: 0x00E5,
-       0x00630327: 0x00E7,
-       0x00650300: 0x00E8,
-       0x00650301: 0x00E9,
-       0x00650302: 0x00EA,
-       0x00650308: 0x00EB,
-       0x00690300: 0x00EC,
-       0x00690301: 0x00ED,
-       0x00690302: 0x00EE,
-       0x00690308: 0x00EF,
-       0x006E0303: 0x00F1,
-       0x006F0300: 0x00F2,
-       0x006F0301: 0x00F3,
-       0x006F0302: 0x00F4,
-       0x006F0303: 0x00F5,
-       0x006F0308: 0x00F6,
-       0x00750300: 0x00F9,
-       0x00750301: 0x00FA,
-       0x00750302: 0x00FB,
-       0x00750308: 0x00FC,
-       0x00790301: 0x00FD,
-       0x00790308: 0x00FF,
-       0x00410304: 0x0100,
-       0x00610304: 0x0101,
-       0x00410306: 0x0102,
-       0x00610306: 0x0103,
-       0x00410328: 0x0104,
-       0x00610328: 0x0105,
-       0x00430301: 0x0106,
-       0x00630301: 0x0107,
-       0x00430302: 0x0108,
-       0x00630302: 0x0109,
-       0x00430307: 0x010A,
-       0x00630307: 0x010B,
-       0x0043030C: 0x010C,
-       0x0063030C: 0x010D,
-       0x0044030C: 0x010E,
-       0x0064030C: 0x010F,
-       0x00450304: 0x0112,
-       0x00650304: 0x0113,
-       0x00450306: 0x0114,
-       0x00650306: 0x0115,
-       0x00450307: 0x0116,
-       0x00650307: 0x0117,
-       0x00450328: 0x0118,
-       0x00650328: 0x0119,
-       0x0045030C: 0x011A,
-       0x0065030C: 0x011B,
-       0x00470302: 0x011C,
-       0x00670302: 0x011D,
-       0x00470306: 0x011E,
-       0x00670306: 0x011F,
-       0x00470307: 0x0120,
-       0x00670307: 0x0121,
-       0x00470327: 0x0122,
-       0x00670327: 0x0123,
-       0x00480302: 0x0124,
-       0x00680302: 0x0125,
-       0x00490303: 0x0128,
-       0x00690303: 0x0129,
-       0x00490304: 0x012A,
-       0x00690304: 0x012B,
-       0x00490306: 0x012C,
-       0x00690306: 0x012D,
-       0x00490328: 0x012E,
-       0x00690328: 0x012F,
-       0x00490307: 0x0130,
-       0x004A0302: 0x0134,
-       0x006A0302: 0x0135,
-       0x004B0327: 0x0136,
-       0x006B0327: 0x0137,
-       0x004C0301: 0x0139,
-       0x006C0301: 0x013A,
-       0x004C0327: 0x013B,
-       0x006C0327: 0x013C,
-       0x004C030C: 0x013D,
-       0x006C030C: 0x013E,
-       0x004E0301: 0x0143,
-       0x006E0301: 0x0144,
-       0x004E0327: 0x0145,
-       0x006E0327: 0x0146,
-       0x004E030C: 0x0147,
-       0x006E030C: 0x0148,
-       0x004F0304: 0x014C,
-       0x006F0304: 0x014D,
-       0x004F0306: 0x014E,
-       0x006F0306: 0x014F,
-       0x004F030B: 0x0150,
-       0x006F030B: 0x0151,
-       0x00520301: 0x0154,
-       0x00720301: 0x0155,
-       0x00520327: 0x0156,
-       0x00720327: 0x0157,
-       0x0052030C: 0x0158,
-       0x0072030C: 0x0159,
-       0x00530301: 0x015A,
-       0x00730301: 0x015B,
-       0x00530302: 0x015C,
-       0x00730302: 0x015D,
-       0x00530327: 0x015E,
-       0x00730327: 0x015F,
-       0x0053030C: 0x0160,
-       0x0073030C: 0x0161,
-       0x00540327: 0x0162,
-       0x00740327: 0x0163,
-       0x0054030C: 0x0164,
-       0x0074030C: 0x0165,
-       0x00550303: 0x0168,
-       0x00750303: 0x0169,
-       0x00550304: 0x016A,
-       0x00750304: 0x016B,
-       0x00550306: 0x016C,
-       0x00750306: 0x016D,
-       0x0055030A: 0x016E,
-       0x0075030A: 0x016F,
-       0x0055030B: 0x0170,
-       0x0075030B: 0x0171,
-       0x00550328: 0x0172,
-       0x00750328: 0x0173,
-       0x00570302: 0x0174,
-       0x00770302: 0x0175,
-       0x00590302: 0x0176,
-       0x00790302: 0x0177,
-       0x00590308: 0x0178,
-       0x005A0301: 0x0179,
-       0x007A0301: 0x017A,
-       0x005A0307: 0x017B,
-       0x007A0307: 0x017C,
-       0x005A030C: 0x017D,
-       0x007A030C: 0x017E,
-       0x004F031B: 0x01A0,
-       0x006F031B: 0x01A1,
-       0x0055031B: 0x01AF,
-       0x0075031B: 0x01B0,
-       0x0041030C: 0x01CD,
-       0x0061030C: 0x01CE,
-       0x0049030C: 0x01CF,
-       0x0069030C: 0x01D0,
-       0x004F030C: 0x01D1,
-       0x006F030C: 0x01D2,
-       0x0055030C: 0x01D3,
-       0x0075030C: 0x01D4,
-       0x00DC0304: 0x01D5,
-       0x00FC0304: 0x01D6,
-       0x00DC0301: 0x01D7,
-       0x00FC0301: 0x01D8,
-       0x00DC030C: 0x01D9,
-       0x00FC030C: 0x01DA,
-       0x00DC0300: 0x01DB,
-       0x00FC0300: 0x01DC,
-       0x00C40304: 0x01DE,
-       0x00E40304: 0x01DF,
-       0x02260304: 0x01E0,
-       0x02270304: 0x01E1,
-       0x00C60304: 0x01E2,
-       0x00E60304: 0x01E3,
-       0x0047030C: 0x01E6,
-       0x0067030C: 0x01E7,
-       0x004B030C: 0x01E8,
-       0x006B030C: 0x01E9,
-       0x004F0328: 0x01EA,
-       0x006F0328: 0x01EB,
-       0x01EA0304: 0x01EC,
-       0x01EB0304: 0x01ED,
-       0x01B7030C: 0x01EE,
-       0x0292030C: 0x01EF,
-       0x006A030C: 0x01F0,
-       0x00470301: 0x01F4,
-       0x00670301: 0x01F5,
-       0x004E0300: 0x01F8,
-       0x006E0300: 0x01F9,
-       0x00C50301: 0x01FA,
-       0x00E50301: 0x01FB,
-       0x00C60301: 0x01FC,
-       0x00E60301: 0x01FD,
-       0x00D80301: 0x01FE,
-       0x00F80301: 0x01FF,
-       0x0041030F: 0x0200,
-       0x0061030F: 0x0201,
-       0x00410311: 0x0202,
-       0x00610311: 0x0203,
-       0x0045030F: 0x0204,
-       0x0065030F: 0x0205,
-       0x00450311: 0x0206,
-       0x00650311: 0x0207,
-       0x0049030F: 0x0208,
-       0x0069030F: 0x0209,
-       0x00490311: 0x020A,
-       0x00690311: 0x020B,
-       0x004F030F: 0x020C,
-       0x006F030F: 0x020D,
-       0x004F0311: 0x020E,
-       0x006F0311: 0x020F,
-       0x0052030F: 0x0210,
-       0x0072030F: 0x0211,
-       0x00520311: 0x0212,
-       0x00720311: 0x0213,
-       0x0055030F: 0x0214,
-       0x0075030F: 0x0215,
-       0x00550311: 0x0216,
-       0x00750311: 0x0217,
-       0x00530326: 0x0218,
-       0x00730326: 0x0219,
-       0x00540326: 0x021A,
-       0x00740326: 0x021B,
-       0x0048030C: 0x021E,
-       0x0068030C: 0x021F,
-       0x00410307: 0x0226,
-       0x00610307: 0x0227,
-       0x00450327: 0x0228,
-       0x00650327: 0x0229,
-       0x00D60304: 0x022A,
-       0x00F60304: 0x022B,
-       0x00D50304: 0x022C,
-       0x00F50304: 0x022D,
-       0x004F0307: 0x022E,
-       0x006F0307: 0x022F,
-       0x022E0304: 0x0230,
-       0x022F0304: 0x0231,
-       0x00590304: 0x0232,
-       0x00790304: 0x0233,
-       0x00A80301: 0x0385,
-       0x03910301: 0x0386,
-       0x03950301: 0x0388,
-       0x03970301: 0x0389,
-       0x03990301: 0x038A,
-       0x039F0301: 0x038C,
-       0x03A50301: 0x038E,
-       0x03A90301: 0x038F,
-       0x03CA0301: 0x0390,
-       0x03990308: 0x03AA,
-       0x03A50308: 0x03AB,
-       0x03B10301: 0x03AC,
-       0x03B50301: 0x03AD,
-       0x03B70301: 0x03AE,
-       0x03B90301: 0x03AF,
-       0x03CB0301: 0x03B0,
-       0x03B90308: 0x03CA,
-       0x03C50308: 0x03CB,
-       0x03BF0301: 0x03CC,
-       0x03C50301: 0x03CD,
-       0x03C90301: 0x03CE,
-       0x03D20301: 0x03D3,
-       0x03D20308: 0x03D4,
-       0x04150300: 0x0400,
-       0x04150308: 0x0401,
-       0x04130301: 0x0403,
-       0x04060308: 0x0407,
-       0x041A0301: 0x040C,
-       0x04180300: 0x040D,
-       0x04230306: 0x040E,
-       0x04180306: 0x0419,
-       0x04380306: 0x0439,
-       0x04350300: 0x0450,
-       0x04350308: 0x0451,
-       0x04330301: 0x0453,
-       0x04560308: 0x0457,
-       0x043A0301: 0x045C,
-       0x04380300: 0x045D,
-       0x04430306: 0x045E,
-       0x0474030F: 0x0476,
-       0x0475030F: 0x0477,
-       0x04160306: 0x04C1,
-       0x04360306: 0x04C2,
-       0x04100306: 0x04D0,
-       0x04300306: 0x04D1,
-       0x04100308: 0x04D2,
-       0x04300308: 0x04D3,
-       0x04150306: 0x04D6,
-       0x04350306: 0x04D7,
-       0x04D80308: 0x04DA,
-       0x04D90308: 0x04DB,
-       0x04160308: 0x04DC,
-       0x04360308: 0x04DD,
-       0x04170308: 0x04DE,
-       0x04370308: 0x04DF,
-       0x04180304: 0x04E2,
-       0x04380304: 0x04E3,
-       0x04180308: 0x04E4,
-       0x04380308: 0x04E5,
-       0x041E0308: 0x04E6,
-       0x043E0308: 0x04E7,
-       0x04E80308: 0x04EA,
-       0x04E90308: 0x04EB,
-       0x042D0308: 0x04EC,
-       0x044D0308: 0x04ED,
-       0x04230304: 0x04EE,
-       0x04430304: 0x04EF,
-       0x04230308: 0x04F0,
-       0x04430308: 0x04F1,
-       0x0423030B: 0x04F2,
-       0x0443030B: 0x04F3,
-       0x04270308: 0x04F4,
-       0x04470308: 0x04F5,
-       0x042B0308: 0x04F8,
-       0x044B0308: 0x04F9,
-       0x06270653: 0x0622,
-       0x06270654: 0x0623,
-       0x06480654: 0x0624,
-       0x06270655: 0x0625,
-       0x064A0654: 0x0626,
-       0x06D50654: 0x06C0,
-       0x06C10654: 0x06C2,
-       0x06D20654: 0x06D3,
-       0x0928093C: 0x0929,
-       0x0930093C: 0x0931,
-       0x0933093C: 0x0934,
-       0x09C709BE: 0x09CB,
-       0x09C709D7: 0x09CC,
-       0x0B470B56: 0x0B48,
-       0x0B470B3E: 0x0B4B,
-       0x0B470B57: 0x0B4C,
-       0x0B920BD7: 0x0B94,
-       0x0BC60BBE: 0x0BCA,
-       0x0BC70BBE: 0x0BCB,
-       0x0BC60BD7: 0x0BCC,
-       0x0C460C56: 0x0C48,
-       0x0CBF0CD5: 0x0CC0,
-       0x0CC60CD5: 0x0CC7,
-       0x0CC60CD6: 0x0CC8,
-       0x0CC60CC2: 0x0CCA,
-       0x0CCA0CD5: 0x0CCB,
-       0x0D460D3E: 0x0D4A,
-       0x0D470D3E: 0x0D4B,
-       0x0D460D57: 0x0D4C,
-       0x0DD90DCA: 0x0DDA,
-       0x0DD90DCF: 0x0DDC,
-       0x0DDC0DCA: 0x0DDD,
-       0x0DD90DDF: 0x0DDE,
-       0x1025102E: 0x1026,
-       0x1B051B35: 0x1B06,
-       0x1B071B35: 0x1B08,
-       0x1B091B35: 0x1B0A,
-       0x1B0B1B35: 0x1B0C,
-       0x1B0D1B35: 0x1B0E,
-       0x1B111B35: 0x1B12,
-       0x1B3A1B35: 0x1B3B,
-       0x1B3C1B35: 0x1B3D,
-       0x1B3E1B35: 0x1B40,
-       0x1B3F1B35: 0x1B41,
-       0x1B421B35: 0x1B43,
-       0x00410325: 0x1E00,
-       0x00610325: 0x1E01,
-       0x00420307: 0x1E02,
-       0x00620307: 0x1E03,
-       0x00420323: 0x1E04,
-       0x00620323: 0x1E05,
-       0x00420331: 0x1E06,
-       0x00620331: 0x1E07,
-       0x00C70301: 0x1E08,
-       0x00E70301: 0x1E09,
-       0x00440307: 0x1E0A,
-       0x00640307: 0x1E0B,
-       0x00440323: 0x1E0C,
-       0x00640323: 0x1E0D,
-       0x00440331: 0x1E0E,
-       0x00640331: 0x1E0F,
-       0x00440327: 0x1E10,
-       0x00640327: 0x1E11,
-       0x0044032D: 0x1E12,
-       0x0064032D: 0x1E13,
-       0x01120300: 0x1E14,
-       0x01130300: 0x1E15,
-       0x01120301: 0x1E16,
-       0x01130301: 0x1E17,
-       0x0045032D: 0x1E18,
-       0x0065032D: 0x1E19,
-       0x00450330: 0x1E1A,
-       0x00650330: 0x1E1B,
-       0x02280306: 0x1E1C,
-       0x02290306: 0x1E1D,
-       0x00460307: 0x1E1E,
-       0x00660307: 0x1E1F,
-       0x00470304: 0x1E20,
-       0x00670304: 0x1E21,
-       0x00480307: 0x1E22,
-       0x00680307: 0x1E23,
-       0x00480323: 0x1E24,
-       0x00680323: 0x1E25,
-       0x00480308: 0x1E26,
-       0x00680308: 0x1E27,
-       0x00480327: 0x1E28,
-       0x00680327: 0x1E29,
-       0x0048032E: 0x1E2A,
-       0x0068032E: 0x1E2B,
-       0x00490330: 0x1E2C,
-       0x00690330: 0x1E2D,
-       0x00CF0301: 0x1E2E,
-       0x00EF0301: 0x1E2F,
-       0x004B0301: 0x1E30,
-       0x006B0301: 0x1E31,
-       0x004B0323: 0x1E32,
-       0x006B0323: 0x1E33,
-       0x004B0331: 0x1E34,
-       0x006B0331: 0x1E35,
-       0x004C0323: 0x1E36,
-       0x006C0323: 0x1E37,
-       0x1E360304: 0x1E38,
-       0x1E370304: 0x1E39,
-       0x004C0331: 0x1E3A,
-       0x006C0331: 0x1E3B,
-       0x004C032D: 0x1E3C,
-       0x006C032D: 0x1E3D,
-       0x004D0301: 0x1E3E,
-       0x006D0301: 0x1E3F,
-       0x004D0307: 0x1E40,
-       0x006D0307: 0x1E41,
-       0x004D0323: 0x1E42,
-       0x006D0323: 0x1E43,
-       0x004E0307: 0x1E44,
-       0x006E0307: 0x1E45,
-       0x004E0323: 0x1E46,
-       0x006E0323: 0x1E47,
-       0x004E0331: 0x1E48,
-       0x006E0331: 0x1E49,
-       0x004E032D: 0x1E4A,
-       0x006E032D: 0x1E4B,
-       0x00D50301: 0x1E4C,
-       0x00F50301: 0x1E4D,
-       0x00D50308: 0x1E4E,
-       0x00F50308: 0x1E4F,
-       0x014C0300: 0x1E50,
-       0x014D0300: 0x1E51,
-       0x014C0301: 0x1E52,
-       0x014D0301: 0x1E53,
-       0x00500301: 0x1E54,
-       0x00700301: 0x1E55,
-       0x00500307: 0x1E56,
-       0x00700307: 0x1E57,
-       0x00520307: 0x1E58,
-       0x00720307: 0x1E59,
-       0x00520323: 0x1E5A,
-       0x00720323: 0x1E5B,
-       0x1E5A0304: 0x1E5C,
-       0x1E5B0304: 0x1E5D,
-       0x00520331: 0x1E5E,
-       0x00720331: 0x1E5F,
-       0x00530307: 0x1E60,
-       0x00730307: 0x1E61,
-       0x00530323: 0x1E62,
-       0x00730323: 0x1E63,
-       0x015A0307: 0x1E64,
-       0x015B0307: 0x1E65,
-       0x01600307: 0x1E66,
-       0x01610307: 0x1E67,
-       0x1E620307: 0x1E68,
-       0x1E630307: 0x1E69,
-       0x00540307: 0x1E6A,
-       0x00740307: 0x1E6B,
-       0x00540323: 0x1E6C,
-       0x00740323: 0x1E6D,
-       0x00540331: 0x1E6E,
-       0x00740331: 0x1E6F,
-       0x0054032D: 0x1E70,
-       0x0074032D: 0x1E71,
-       0x00550324: 0x1E72,
-       0x00750324: 0x1E73,
-       0x00550330: 0x1E74,
-       0x00750330: 0x1E75,
-       0x0055032D: 0x1E76,
-       0x0075032D: 0x1E77,
-       0x01680301: 0x1E78,
-       0x01690301: 0x1E79,
-       0x016A0308: 0x1E7A,
-       0x016B0308: 0x1E7B,
-       0x00560303: 0x1E7C,
-       0x00760303: 0x1E7D,
-       0x00560323: 0x1E7E,
-       0x00760323: 0x1E7F,
-       0x00570300: 0x1E80,
-       0x00770300: 0x1E81,
-       0x00570301: 0x1E82,
-       0x00770301: 0x1E83,
-       0x00570308: 0x1E84,
-       0x00770308: 0x1E85,
-       0x00570307: 0x1E86,
-       0x00770307: 0x1E87,
-       0x00570323: 0x1E88,
-       0x00770323: 0x1E89,
-       0x00580307: 0x1E8A,
-       0x00780307: 0x1E8B,
-       0x00580308: 0x1E8C,
-       0x00780308: 0x1E8D,
-       0x00590307: 0x1E8E,
-       0x00790307: 0x1E8F,
-       0x005A0302: 0x1E90,
-       0x007A0302: 0x1E91,
-       0x005A0323: 0x1E92,
-       0x007A0323: 0x1E93,
-       0x005A0331: 0x1E94,
-       0x007A0331: 0x1E95,
-       0x00680331: 0x1E96,
-       0x00740308: 0x1E97,
-       0x0077030A: 0x1E98,
-       0x0079030A: 0x1E99,
-       0x017F0307: 0x1E9B,
-       0x00410323: 0x1EA0,
-       0x00610323: 0x1EA1,
-       0x00410309: 0x1EA2,
-       0x00610309: 0x1EA3,
-       0x00C20301: 0x1EA4,
-       0x00E20301: 0x1EA5,
-       0x00C20300: 0x1EA6,
-       0x00E20300: 0x1EA7,
-       0x00C20309: 0x1EA8,
-       0x00E20309: 0x1EA9,
-       0x00C20303: 0x1EAA,
-       0x00E20303: 0x1EAB,
-       0x1EA00302: 0x1EAC,
-       0x1EA10302: 0x1EAD,
-       0x01020301: 0x1EAE,
-       0x01030301: 0x1EAF,
-       0x01020300: 0x1EB0,
-       0x01030300: 0x1EB1,
-       0x01020309: 0x1EB2,
-       0x01030309: 0x1EB3,
-       0x01020303: 0x1EB4,
-       0x01030303: 0x1EB5,
-       0x1EA00306: 0x1EB6,
-       0x1EA10306: 0x1EB7,
-       0x00450323: 0x1EB8,
-       0x00650323: 0x1EB9,
-       0x00450309: 0x1EBA,
-       0x00650309: 0x1EBB,
-       0x00450303: 0x1EBC,
-       0x00650303: 0x1EBD,
-       0x00CA0301: 0x1EBE,
-       0x00EA0301: 0x1EBF,
-       0x00CA0300: 0x1EC0,
-       0x00EA0300: 0x1EC1,
-       0x00CA0309: 0x1EC2,
-       0x00EA0309: 0x1EC3,
-       0x00CA0303: 0x1EC4,
-       0x00EA0303: 0x1EC5,
-       0x1EB80302: 0x1EC6,
-       0x1EB90302: 0x1EC7,
-       0x00490309: 0x1EC8,
-       0x00690309: 0x1EC9,
-       0x00490323: 0x1ECA,
-       0x00690323: 0x1ECB,
-       0x004F0323: 0x1ECC,
-       0x006F0323: 0x1ECD,
-       0x004F0309: 0x1ECE,
-       0x006F0309: 0x1ECF,
-       0x00D40301: 0x1ED0,
-       0x00F40301: 0x1ED1,
-       0x00D40300: 0x1ED2,
-       0x00F40300: 0x1ED3,
-       0x00D40309: 0x1ED4,
-       0x00F40309: 0x1ED5,
-       0x00D40303: 0x1ED6,
-       0x00F40303: 0x1ED7,
-       0x1ECC0302: 0x1ED8,
-       0x1ECD0302: 0x1ED9,
-       0x01A00301: 0x1EDA,
-       0x01A10301: 0x1EDB,
-       0x01A00300: 0x1EDC,
-       0x01A10300: 0x1EDD,
-       0x01A00309: 0x1EDE,
-       0x01A10309: 0x1EDF,
-       0x01A00303: 0x1EE0,
-       0x01A10303: 0x1EE1,
-       0x01A00323: 0x1EE2,
-       0x01A10323: 0x1EE3,
-       0x00550323: 0x1EE4,
-       0x00750323: 0x1EE5,
-       0x00550309: 0x1EE6,
-       0x00750309: 0x1EE7,
-       0x01AF0301: 0x1EE8,
-       0x01B00301: 0x1EE9,
-       0x01AF0300: 0x1EEA,
-       0x01B00300: 0x1EEB,
-       0x01AF0309: 0x1EEC,
-       0x01B00309: 0x1EED,
-       0x01AF0303: 0x1EEE,
-       0x01B00303: 0x1EEF,
-       0x01AF0323: 0x1EF0,
-       0x01B00323: 0x1EF1,
-       0x00590300: 0x1EF2,
-       0x00790300: 0x1EF3,
-       0x00590323: 0x1EF4,
-       0x00790323: 0x1EF5,
-       0x00590309: 0x1EF6,
-       0x00790309: 0x1EF7,
-       0x00590303: 0x1EF8,
-       0x00790303: 0x1EF9,
-       0x03B10313: 0x1F00,
-       0x03B10314: 0x1F01,
-       0x1F000300: 0x1F02,
-       0x1F010300: 0x1F03,
-       0x1F000301: 0x1F04,
-       0x1F010301: 0x1F05,
-       0x1F000342: 0x1F06,
-       0x1F010342: 0x1F07,
-       0x03910313: 0x1F08,
-       0x03910314: 0x1F09,
-       0x1F080300: 0x1F0A,
-       0x1F090300: 0x1F0B,
-       0x1F080301: 0x1F0C,
-       0x1F090301: 0x1F0D,
-       0x1F080342: 0x1F0E,
-       0x1F090342: 0x1F0F,
-       0x03B50313: 0x1F10,
-       0x03B50314: 0x1F11,
-       0x1F100300: 0x1F12,
-       0x1F110300: 0x1F13,
-       0x1F100301: 0x1F14,
-       0x1F110301: 0x1F15,
-       0x03950313: 0x1F18,
-       0x03950314: 0x1F19,
-       0x1F180300: 0x1F1A,
-       0x1F190300: 0x1F1B,
-       0x1F180301: 0x1F1C,
-       0x1F190301: 0x1F1D,
-       0x03B70313: 0x1F20,
-       0x03B70314: 0x1F21,
-       0x1F200300: 0x1F22,
-       0x1F210300: 0x1F23,
-       0x1F200301: 0x1F24,
-       0x1F210301: 0x1F25,
-       0x1F200342: 0x1F26,
-       0x1F210342: 0x1F27,
-       0x03970313: 0x1F28,
-       0x03970314: 0x1F29,
-       0x1F280300: 0x1F2A,
-       0x1F290300: 0x1F2B,
-       0x1F280301: 0x1F2C,
-       0x1F290301: 0x1F2D,
-       0x1F280342: 0x1F2E,
-       0x1F290342: 0x1F2F,
-       0x03B90313: 0x1F30,
-       0x03B90314: 0x1F31,
-       0x1F300300: 0x1F32,
-       0x1F310300: 0x1F33,
-       0x1F300301: 0x1F34,
-       0x1F310301: 0x1F35,
-       0x1F300342: 0x1F36,
-       0x1F310342: 0x1F37,
-       0x03990313: 0x1F38,
-       0x03990314: 0x1F39,
-       0x1F380300: 0x1F3A,
-       0x1F390300: 0x1F3B,
-       0x1F380301: 0x1F3C,
-       0x1F390301: 0x1F3D,
-       0x1F380342: 0x1F3E,
-       0x1F390342: 0x1F3F,
-       0x03BF0313: 0x1F40,
-       0x03BF0314: 0x1F41,
-       0x1F400300: 0x1F42,
-       0x1F410300: 0x1F43,
-       0x1F400301: 0x1F44,
-       0x1F410301: 0x1F45,
-       0x039F0313: 0x1F48,
-       0x039F0314: 0x1F49,
-       0x1F480300: 0x1F4A,
-       0x1F490300: 0x1F4B,
-       0x1F480301: 0x1F4C,
-       0x1F490301: 0x1F4D,
-       0x03C50313: 0x1F50,
-       0x03C50314: 0x1F51,
-       0x1F500300: 0x1F52,
-       0x1F510300: 0x1F53,
-       0x1F500301: 0x1F54,
-       0x1F510301: 0x1F55,
-       0x1F500342: 0x1F56,
-       0x1F510342: 0x1F57,
-       0x03A50314: 0x1F59,
-       0x1F590300: 0x1F5B,
-       0x1F590301: 0x1F5D,
-       0x1F590342: 0x1F5F,
-       0x03C90313: 0x1F60,
-       0x03C90314: 0x1F61,
-       0x1F600300: 0x1F62,
-       0x1F610300: 0x1F63,
-       0x1F600301: 0x1F64,
-       0x1F610301: 0x1F65,
-       0x1F600342: 0x1F66,
-       0x1F610342: 0x1F67,
-       0x03A90313: 0x1F68,
-       0x03A90314: 0x1F69,
-       0x1F680300: 0x1F6A,
-       0x1F690300: 0x1F6B,
-       0x1F680301: 0x1F6C,
-       0x1F690301: 0x1F6D,
-       0x1F680342: 0x1F6E,
-       0x1F690342: 0x1F6F,
-       0x03B10300: 0x1F70,
-       0x03B50300: 0x1F72,
-       0x03B70300: 0x1F74,
-       0x03B90300: 0x1F76,
-       0x03BF0300: 0x1F78,
-       0x03C50300: 0x1F7A,
-       0x03C90300: 0x1F7C,
-       0x1F000345: 0x1F80,
-       0x1F010345: 0x1F81,
-       0x1F020345: 0x1F82,
-       0x1F030345: 0x1F83,
-       0x1F040345: 0x1F84,
-       0x1F050345: 0x1F85,
-       0x1F060345: 0x1F86,
-       0x1F070345: 0x1F87,
-       0x1F080345: 0x1F88,
-       0x1F090345: 0x1F89,
-       0x1F0A0345: 0x1F8A,
-       0x1F0B0345: 0x1F8B,
-       0x1F0C0345: 0x1F8C,
-       0x1F0D0345: 0x1F8D,
-       0x1F0E0345: 0x1F8E,
-       0x1F0F0345: 0x1F8F,
-       0x1F200345: 0x1F90,
-       0x1F210345: 0x1F91,
-       0x1F220345: 0x1F92,
-       0x1F230345: 0x1F93,
-       0x1F240345: 0x1F94,
-       0x1F250345: 0x1F95,
-       0x1F260345: 0x1F96,
-       0x1F270345: 0x1F97,
-       0x1F280345: 0x1F98,
-       0x1F290345: 0x1F99,
-       0x1F2A0345: 0x1F9A,
-       0x1F2B0345: 0x1F9B,
-       0x1F2C0345: 0x1F9C,
-       0x1F2D0345: 0x1F9D,
-       0x1F2E0345: 0x1F9E,
-       0x1F2F0345: 0x1F9F,
-       0x1F600345: 0x1FA0,
-       0x1F610345: 0x1FA1,
-       0x1F620345: 0x1FA2,
-       0x1F630345: 0x1FA3,
-       0x1F640345: 0x1FA4,
-       0x1F650345: 0x1FA5,
-       0x1F660345: 0x1FA6,
-       0x1F670345: 0x1FA7,
-       0x1F680345: 0x1FA8,
-       0x1F690345: 0x1FA9,
-       0x1F6A0345: 0x1FAA,
-       0x1F6B0345: 0x1FAB,
-       0x1F6C0345: 0x1FAC,
-       0x1F6D0345: 0x1FAD,
-       0x1F6E0345: 0x1FAE,
-       0x1F6F0345: 0x1FAF,
-       0x03B10306: 0x1FB0,
-       0x03B10304: 0x1FB1,
-       0x1F700345: 0x1FB2,
-       0x03B10345: 0x1FB3,
-       0x03AC0345: 0x1FB4,
-       0x03B10342: 0x1FB6,
-       0x1FB60345: 0x1FB7,
-       0x03910306: 0x1FB8,
-       0x03910304: 0x1FB9,
-       0x03910300: 0x1FBA,
-       0x03910345: 0x1FBC,
-       0x00A80342: 0x1FC1,
-       0x1F740345: 0x1FC2,
-       0x03B70345: 0x1FC3,
-       0x03AE0345: 0x1FC4,
-       0x03B70342: 0x1FC6,
-       0x1FC60345: 0x1FC7,
-       0x03950300: 0x1FC8,
-       0x03970300: 0x1FCA,
-       0x03970345: 0x1FCC,
-       0x1FBF0300: 0x1FCD,
-       0x1FBF0301: 0x1FCE,
-       0x1FBF0342: 0x1FCF,
-       0x03B90306: 0x1FD0,
-       0x03B90304: 0x1FD1,
-       0x03CA0300: 0x1FD2,
-       0x03B90342: 0x1FD6,
-       0x03CA0342: 0x1FD7,
-       0x03990306: 0x1FD8,
-       0x03990304: 0x1FD9,
-       0x03990300: 0x1FDA,
-       0x1FFE0300: 0x1FDD,
-       0x1FFE0301: 0x1FDE,
-       0x1FFE0342: 0x1FDF,
-       0x03C50306: 0x1FE0,
-       0x03C50304: 0x1FE1,
-       0x03CB0300: 0x1FE2,
-       0x03C10313: 0x1FE4,
-       0x03C10314: 0x1FE5,
-       0x03C50342: 0x1FE6,
-       0x03CB0342: 0x1FE7,
-       0x03A50306: 0x1FE8,
-       0x03A50304: 0x1FE9,
-       0x03A50300: 0x1FEA,
-       0x03A10314: 0x1FEC,
-       0x00A80300: 0x1FED,
-       0x1F7C0345: 0x1FF2,
-       0x03C90345: 0x1FF3,
-       0x03CE0345: 0x1FF4,
-       0x03C90342: 0x1FF6,
-       0x1FF60345: 0x1FF7,
-       0x039F0300: 0x1FF8,
-       0x03A90300: 0x1FFA,
-       0x03A90345: 0x1FFC,
-       0x21900338: 0x219A,
-       0x21920338: 0x219B,
-       0x21940338: 0x21AE,
-       0x21D00338: 0x21CD,
-       0x21D40338: 0x21CE,
-       0x21D20338: 0x21CF,
-       0x22030338: 0x2204,
-       0x22080338: 0x2209,
-       0x220B0338: 0x220C,
-       0x22230338: 0x2224,
-       0x22250338: 0x2226,
-       0x223C0338: 0x2241,
-       0x22430338: 0x2244,
-       0x22450338: 0x2247,
-       0x22480338: 0x2249,
-       0x003D0338: 0x2260,
-       0x22610338: 0x2262,
-       0x224D0338: 0x226D,
-       0x003C0338: 0x226E,
-       0x003E0338: 0x226F,
-       0x22640338: 0x2270,
-       0x22650338: 0x2271,
-       0x22720338: 0x2274,
-       0x22730338: 0x2275,
-       0x22760338: 0x2278,
-       0x22770338: 0x2279,
-       0x227A0338: 0x2280,
-       0x227B0338: 0x2281,
-       0x22820338: 0x2284,
-       0x22830338: 0x2285,
-       0x22860338: 0x2288,
-       0x22870338: 0x2289,
-       0x22A20338: 0x22AC,
-       0x22A80338: 0x22AD,
-       0x22A90338: 0x22AE,
-       0x22AB0338: 0x22AF,
-       0x227C0338: 0x22E0,
-       0x227D0338: 0x22E1,
-       0x22910338: 0x22E2,
-       0x22920338: 0x22E3,
-       0x22B20338: 0x22EA,
-       0x22B30338: 0x22EB,
-       0x22B40338: 0x22EC,
-       0x22B50338: 0x22ED,
-       0x304B3099: 0x304C,
-       0x304D3099: 0x304E,
-       0x304F3099: 0x3050,
-       0x30513099: 0x3052,
-       0x30533099: 0x3054,
-       0x30553099: 0x3056,
-       0x30573099: 0x3058,
-       0x30593099: 0x305A,
-       0x305B3099: 0x305C,
-       0x305D3099: 0x305E,
-       0x305F3099: 0x3060,
-       0x30613099: 0x3062,
-       0x30643099: 0x3065,
-       0x30663099: 0x3067,
-       0x30683099: 0x3069,
-       0x306F3099: 0x3070,
-       0x306F309A: 0x3071,
-       0x30723099: 0x3073,
-       0x3072309A: 0x3074,
-       0x30753099: 0x3076,
-       0x3075309A: 0x3077,
-       0x30783099: 0x3079,
-       0x3078309A: 0x307A,
-       0x307B3099: 0x307C,
-       0x307B309A: 0x307D,
-       0x30463099: 0x3094,
-       0x309D3099: 0x309E,
-       0x30AB3099: 0x30AC,
-       0x30AD3099: 0x30AE,
-       0x30AF3099: 0x30B0,
-       0x30B13099: 0x30B2,
-       0x30B33099: 0x30B4,
-       0x30B53099: 0x30B6,
-       0x30B73099: 0x30B8,
-       0x30B93099: 0x30BA,
-       0x30BB3099: 0x30BC,
-       0x30BD3099: 0x30BE,
-       0x30BF3099: 0x30C0,
-       0x30C13099: 0x30C2,
-       0x30C43099: 0x30C5,
-       0x30C63099: 0x30C7,
-       0x30C83099: 0x30C9,
-       0x30CF3099: 0x30D0,
-       0x30CF309A: 0x30D1,
-       0x30D23099: 0x30D3,
-       0x30D2309A: 0x30D4,
-       0x30D53099: 0x30D6,
-       0x30D5309A: 0x30D7,
-       0x30D83099: 0x30D9,
-       0x30D8309A: 0x30DA,
-       0x30DB3099: 0x30DC,
-       0x30DB309A: 0x30DD,
-       0x30A63099: 0x30F4,
-       0x30EF3099: 0x30F7,
-       0x30F03099: 0x30F8,
-       0x30F13099: 0x30F9,
-       0x30F23099: 0x30FA,
-       0x30FD3099: 0x30FE,
-       0x109910BA: 0x1109A,
-       0x109B10BA: 0x1109C,
-       0x10A510BA: 0x110AB,
-       0x11311127: 0x1112E,
-       0x11321127: 0x1112F,
-       0x1347133E: 0x1134B,
-       0x13471357: 0x1134C,
-       0x14B914BA: 0x114BB,
-       0x14B914B0: 0x114BC,
-       0x14B914BD: 0x114BE,
-       0x15B815AF: 0x115BA,
-       0x15B915AF: 0x115BB,
-}
-
-// Total size of tables: 53KB (54226 bytes)
diff --git a/libgo/go/internal/x/text/unicode/norm/transform.go b/libgo/go/internal/x/text/unicode/norm/transform.go
deleted file mode 100644 (file)
index 7837cb9..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-import (
-       "unicode/utf8"
-
-       "internal/x/text/transform"
-)
-
-// Reset implements the Reset method of the transform.Transformer interface.
-func (Form) Reset() {}
-
-// Transform implements the Transform method of the transform.Transformer
-// interface. It may need to write segments of up to MaxSegmentSize at once.
-// Users should either catch ErrShortDst and allow dst to grow or have dst be at
-// least of size MaxTransformChunkSize to be guaranteed of progress.
-func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       n := 0
-       // Cap the maximum number of src bytes to check.
-       b := src
-       eof := atEOF
-       if ns := len(dst); ns < len(b) {
-               err = transform.ErrShortDst
-               eof = false
-               b = b[:ns]
-       }
-       i, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof)
-       n += copy(dst[n:], b[n:i])
-       if !ok {
-               nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF)
-               return nDst + n, nSrc + n, err
-       }
-       if n < len(src) && !atEOF {
-               err = transform.ErrShortSrc
-       }
-       return n, n, err
-}
-
-func flushTransform(rb *reorderBuffer) bool {
-       // Write out (must fully fit in dst, or else it is an ErrShortDst).
-       if len(rb.out) < rb.nrune*utf8.UTFMax {
-               return false
-       }
-       rb.out = rb.out[rb.flushCopy(rb.out):]
-       return true
-}
-
-var errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc}
-
-// transform implements the transform.Transformer interface. It is only called
-// when quickSpan does not pass for a given string.
-func (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
-       // TODO: get rid of reorderBuffer. See CL 23460044.
-       rb := reorderBuffer{}
-       rb.init(f, src)
-       for {
-               // Load segment into reorder buffer.
-               rb.setFlusher(dst[nDst:], flushTransform)
-               end := decomposeSegment(&rb, nSrc, atEOF)
-               if end < 0 {
-                       return nDst, nSrc, errs[-end]
-               }
-               nDst = len(dst) - len(rb.out)
-               nSrc = end
-
-               // Next quickSpan.
-               end = rb.nsrc
-               eof := atEOF
-               if n := nSrc + len(dst) - nDst; n < end {
-                       err = transform.ErrShortDst
-                       end = n
-                       eof = false
-               }
-               end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof)
-               n := copy(dst[nDst:], rb.src.bytes[nSrc:end])
-               nSrc += n
-               nDst += n
-               if ok {
-                       if n < rb.nsrc && !atEOF {
-                               err = transform.ErrShortSrc
-                       }
-                       return nDst, nSrc, err
-               }
-       }
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/trie.go b/libgo/go/internal/x/text/unicode/norm/trie.go
deleted file mode 100644 (file)
index 761439c..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package norm
-
-type valueRange struct {
-       value  uint16 // header: value:stride
-       lo, hi byte   // header: lo:n
-}
-
-type sparseBlocks struct {
-       values []valueRange
-       offset []uint16
-}
-
-var nfcSparse = sparseBlocks{
-       values: nfcSparseValues[:],
-       offset: nfcSparseOffset[:],
-}
-
-var nfkcSparse = sparseBlocks{
-       values: nfkcSparseValues[:],
-       offset: nfkcSparseOffset[:],
-}
-
-var (
-       nfcData  = newNfcTrie(0)
-       nfkcData = newNfkcTrie(0)
-)
-
-// lookupValue determines the type of block n and looks up the value for b.
-// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
-// is a list of ranges with an accompanying value. Given a matching range r,
-// the value for b is by r.value + (b - r.lo) * stride.
-func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
-       offset := t.offset[n]
-       header := t.values[offset]
-       lo := offset + 1
-       hi := lo + uint16(header.lo)
-       for lo < hi {
-               m := lo + (hi-lo)/2
-               r := t.values[m]
-               if r.lo <= b && b <= r.hi {
-                       return r.value + uint16(b-r.lo)*header.value
-               }
-               if b < r.lo {
-                       hi = m
-               } else {
-                       lo = m + 1
-               }
-       }
-       return 0
-}
diff --git a/libgo/go/internal/x/text/unicode/norm/triegen.go b/libgo/go/internal/x/text/unicode/norm/triegen.go
deleted file mode 100644 (file)
index 45d7119..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// Trie table generator.
-// Used by make*tables tools to generate a go file with trie data structures
-// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte
-// sequence are used to lookup offsets in the index table to be used for the
-// next byte. The last byte is used to index into a table with 16-bit values.
-
-package main
-
-import (
-       "fmt"
-       "io"
-)
-
-const maxSparseEntries = 16
-
-type normCompacter struct {
-       sparseBlocks [][]uint64
-       sparseOffset []uint16
-       sparseCount  int
-       name         string
-}
-
-func mostFrequentStride(a []uint64) int {
-       counts := make(map[int]int)
-       var v int
-       for _, x := range a {
-               if stride := int(x) - v; v != 0 && stride >= 0 {
-                       counts[stride]++
-               }
-               v = int(x)
-       }
-       var maxs, maxc int
-       for stride, cnt := range counts {
-               if cnt > maxc || (cnt == maxc && stride < maxs) {
-                       maxs, maxc = stride, cnt
-               }
-       }
-       return maxs
-}
-
-func countSparseEntries(a []uint64) int {
-       stride := mostFrequentStride(a)
-       var v, count int
-       for _, tv := range a {
-               if int(tv)-v != stride {
-                       if tv != 0 {
-                               count++
-                       }
-               }
-               v = int(tv)
-       }
-       return count
-}
-
-func (c *normCompacter) Size(v []uint64) (sz int, ok bool) {
-       if n := countSparseEntries(v); n <= maxSparseEntries {
-               return (n+1)*4 + 2, true
-       }
-       return 0, false
-}
-
-func (c *normCompacter) Store(v []uint64) uint32 {
-       h := uint32(len(c.sparseOffset))
-       c.sparseBlocks = append(c.sparseBlocks, v)
-       c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount))
-       c.sparseCount += countSparseEntries(v) + 1
-       return h
-}
-
-func (c *normCompacter) Handler() string {
-       return c.name + "Sparse.lookup"
-}
-
-func (c *normCompacter) Print(w io.Writer) (retErr error) {
-       p := func(f string, x ...interface{}) {
-               if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil {
-                       retErr = err
-               }
-       }
-
-       ls := len(c.sparseBlocks)
-       p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2)
-       p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset)
-
-       ns := c.sparseCount
-       p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4)
-       p("var %sSparseValues = [%d]valueRange {", c.name, ns)
-       for i, b := range c.sparseBlocks {
-               p("\n// Block %#x, offset %#x", i, c.sparseOffset[i])
-               var v int
-               stride := mostFrequentStride(b)
-               n := countSparseEntries(b)
-               p("\n{value:%#04x,lo:%#02x},", stride, uint8(n))
-               for i, nv := range b {
-                       if int(nv)-v != stride {
-                               if v != 0 {
-                                       p(",hi:%#02x},", 0x80+i-1)
-                               }
-                               if nv != 0 {
-                                       p("\n{value:%#04x,lo:%#02x", nv, 0x80+i)
-                               }
-                       }
-                       v = int(nv)
-               }
-               if v != 0 {
-                       p(",hi:%#02x},", 0x80+len(b)-1)
-               }
-       }
-       p("\n}\n\n")
-       return
-}
index 03c2fd1c5a21a9274ea4e0b5c0257a45184fadd0..83333d6d0e523d4f66abc0c796d52280562793d8 100644 (file)
@@ -25,8 +25,8 @@ var archTest = []archiveTest{
                        {"printhello.o", 860},
                },
                []FileHeader{
-                       FileHeader{U64_TOCMAGIC},
-                       FileHeader{U64_TOCMAGIC},
+                       {U64_TOCMAGIC},
+                       {U64_TOCMAGIC},
                },
        },
        {
index 0923b9fcf3a59a85d8f038499029411201974610..66b5391d58359822b0779495ebe04a08ff991b79 100644 (file)
@@ -334,8 +334,8 @@ func NewFile(r io.ReaderAt) (*File, error) {
 
                // If this symbol is a function, it must retrieve its size from
                // its AUX_FCN entry.
-               // It can happend that a function symbol doesn't have any AUX_FCN.
-               // In this case, needAuxFcn is false and their size will be set to 0
+               // It can happen that a function symbol doesn't have any AUX_FCN.
+               // In this case, needAuxFcn is false and their size will be set to 0.
                if needAuxFcn {
                        switch f.TargetMachine {
                        case U802TOCMAGIC:
index 4acc51abea2750273263a86af15ca83f6b672075..9aad95454c6184c18b33f8ee48e6ad2e97c7ec7b 100644 (file)
@@ -77,7 +77,7 @@ func TestMultiWriter_String(t *testing.T) {
        testMultiWriter(t, new(bytes.Buffer))
 }
 
-// test that a multiWriter.WriteString calls results in at most 1 allocation,
+// Test that a multiWriter.WriteString calls results in at most 1 allocation,
 // even if multiple targets don't support WriteString.
 func TestMultiWriter_WriteStringSingleAlloc(t *testing.T) {
        t.Skip("skipping on gccgo until we have escape analysis")
@@ -150,7 +150,7 @@ func (f writerFunc) Write(p []byte) (int, error) {
        return f(p)
 }
 
-// Test that MultiWriter properly flattens chained multiWriters,
+// Test that MultiWriter properly flattens chained multiWriters.
 func TestMultiWriterSingleChainFlatten(t *testing.T) {
        pc := make([]uintptr, 1000) // 1000 should fit the full stack
        n := runtime.Callers(0, pc)
index 527f853438f08a10bad688b12f7afeddcb0738f1..12a9e7b8ce2b9bda839908ccb0e57f6128c63060 100644 (file)
@@ -288,6 +288,11 @@ func SetPrefix(prefix string) {
        std.SetPrefix(prefix)
 }
 
+// Writer returns the output destination for the standard logger.
+func Writer() io.Writer {
+       return std.Writer()
+}
+
 // These functions write to the standard logger.
 
 // Print calls Output to print to the standard logger.
index adc15e7e8ed7240b58a67847c0c010626e8beb89..b79251877e934240760dcc6def9242c6ac8907bd 100644 (file)
@@ -61,9 +61,9 @@ func testPrint(t *testing.T, flag int, prefix string, pattern string, useFormat
        line := buf.String()
        line = line[0 : len(line)-1]
        pattern = "^" + pattern + "hello 23 world$"
-       matched, err4 := regexp.MatchString(pattern, line)
-       if err4 != nil {
-               t.Fatal("pattern did not compile:", err4)
+       matched, err := regexp.MatchString(pattern, line)
+       if err != nil {
+               t.Fatal("pattern did not compile:", err)
        }
        if !matched {
                t.Errorf("log output should match %q is %q", pattern, line)
index ed42941780973a27b2f747757809c02fcada849f..208c8233e0d22e50b8f9a64be69e1fad0f09a6d1 100644 (file)
@@ -2795,6 +2795,20 @@ func TestRemainder(t *testing.T) {
        if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f {
                t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f)
        }
+       // verify that sign is correct when r == 0.
+       test := func(x, y float64) {
+               if r := Remainder(x, y); r == 0 && Signbit(r) != Signbit(x) {
+                       t.Errorf("Remainder(x=%f, y=%f) = %f, sign of (zero) result should agree with sign of x", x, y, r)
+               }
+       }
+       for x := 0.0; x <= 3.0; x += 1 {
+               for y := 1.0; y <= 3.0; y += 1 {
+                       test(x, y)
+                       test(x, -y)
+                       test(-x, y)
+                       test(-x, -y)
+               }
+       }
 }
 
 func TestRound(t *testing.T) {
index f9db9118eb254e18a19e30a87ed0c55eca03e056..b0885f261fe9bad8e35290b94200a98a2048505b 100644 (file)
@@ -3,8 +3,10 @@
 // license that can be found in the LICENSE file.
 
 // This file provides Go implementations of elementary multi-precision
-// arithmetic operations on word vectors. Needed for platforms without
-// assembly implementations of these routines.
+// arithmetic operations on word vectors. These have the suffix _g.
+// These are needed for platforms without assembly implementations of these routines.
+// This file also contains elementary operations that can be implemented
+// sufficiently efficiently in Go.
 
 package big
 
@@ -19,61 +21,37 @@ const (
        _W = bits.UintSize // word size in bits
        _B = 1 << _W       // digit base
        _M = _B - 1        // digit mask
-
-       _W2 = _W / 2   // half word size in bits
-       _B2 = 1 << _W2 // half digit base
-       _M2 = _B2 - 1  // half digit mask
 )
 
+// Many of the loops in this file are of the form
+//   for i := 0; i < len(z) && i < len(x) && i < len(y); i++
+// i < len(z) is the real condition.
+// However, checking i < len(x) && i < len(y) as well is faster than
+// having the compiler do a bounds check in the body of the loop;
+// remarkably it is even faster than hoisting the bounds check
+// out of the loop, by doing something like
+//   _, _ = x[len(z)-1], y[len(z)-1]
+// There are other ways to hoist the bounds check out of the loop,
+// but the compiler's BCE isn't powerful enough for them (yet?).
+// See the discussion in CL 164966.
+
 // ----------------------------------------------------------------------------
 // Elementary operations on words
 //
 // These operations are used by the vector operations below.
 
-// z1<<_W + z0 = x+y+c, with c == 0 or 1
-func addWW_g(x, y, c Word) (z1, z0 Word) {
-       yc := y + c
-       z0 = x + yc
-       if z0 < x || yc < y {
-               z1 = 1
-       }
-       return
-}
-
-// z1<<_W + z0 = x-y-c, with c == 0 or 1
-func subWW_g(x, y, c Word) (z1, z0 Word) {
-       yc := y + c
-       z0 = x - yc
-       if z0 > x || yc < y {
-               z1 = 1
-       }
-       return
-}
-
 // z1<<_W + z0 = x*y
-// Adapted from Warren, Hacker's Delight, p. 132.
 func mulWW_g(x, y Word) (z1, z0 Word) {
-       x0 := x & _M2
-       x1 := x >> _W2
-       y0 := y & _M2
-       y1 := y >> _W2
-       w0 := x0 * y0
-       t := x1*y0 + w0>>_W2
-       w1 := t & _M2
-       w2 := t >> _W2
-       w1 += x0 * y1
-       z1 = x1*y1 + w2 + w1>>_W2
-       z0 = x * y
-       return
+       hi, lo := bits.Mul(uint(x), uint(y))
+       return Word(hi), Word(lo)
 }
 
 // z1<<_W + z0 = x*y + c
 func mulAddWWW_g(x, y, c Word) (z1, z0 Word) {
-       z1, zz0 := mulWW_g(x, y)
-       if z0 = zz0 + c; z0 < zz0 {
-               z1++
-       }
-       return
+       hi, lo := bits.Mul(uint(x), uint(y))
+       var cc uint
+       lo, cc = bits.Add(lo, uint(c), 0)
+       return Word(hi + cc), Word(lo)
 }
 
 // nlz returns the number of leading zeros in x.
@@ -83,169 +61,147 @@ func nlz(x Word) uint {
 }
 
 // q = (u1<<_W + u0 - r)/v
-// Adapted from Warren, Hacker's Delight, p. 152.
 func divWW_g(u1, u0, v Word) (q, r Word) {
-       if u1 >= v {
-               return 1<<_W - 1, 1<<_W - 1
-       }
-
-       s := nlz(v)
-       v <<= s
-
-       vn1 := v >> _W2
-       vn0 := v & _M2
-       un32 := u1<<s | u0>>(_W-s)
-       un10 := u0 << s
-       un1 := un10 >> _W2
-       un0 := un10 & _M2
-       q1 := un32 / vn1
-       rhat := un32 - q1*vn1
-
-       for q1 >= _B2 || q1*vn0 > _B2*rhat+un1 {
-               q1--
-               rhat += vn1
-               if rhat >= _B2 {
-                       break
-               }
-       }
-
-       un21 := un32*_B2 + un1 - q1*v
-       q0 := un21 / vn1
-       rhat = un21 - q0*vn1
-
-       for q0 >= _B2 || q0*vn0 > _B2*rhat+un0 {
-               q0--
-               rhat += vn1
-               if rhat >= _B2 {
-                       break
-               }
-       }
-
-       return q1*_B2 + q0, (un21*_B2 + un0 - q0*v) >> s
+       qq, rr := bits.Div(uint(u1), uint(u0), uint(v))
+       return Word(qq), Word(rr)
 }
 
-// Keep for performance debugging.
-// Using addWW_g is likely slower.
-const use_addWW_g = false
-
 // The resulting carry c is either 0 or 1.
 func addVV_g(z, x, y []Word) (c Word) {
-       if use_addWW_g {
-               for i := range z {
-                       c, z[i] = addWW_g(x[i], y[i], c)
-               }
-               return
-       }
-
-       for i, xi := range x[:len(z)] {
-               yi := y[i]
-               zi := xi + yi + c
-               z[i] = zi
-               // see "Hacker's Delight", section 2-12 (overflow detection)
-               c = (xi&yi | (xi|yi)&^zi) >> (_W - 1)
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x) && i < len(y); i++ {
+               zi, cc := bits.Add(uint(x[i]), uint(y[i]), uint(c))
+               z[i] = Word(zi)
+               c = Word(cc)
        }
        return
 }
 
 // The resulting carry c is either 0 or 1.
 func subVV_g(z, x, y []Word) (c Word) {
-       if use_addWW_g {
-               for i := range z {
-                       c, z[i] = subWW_g(x[i], y[i], c)
-               }
-               return
-       }
-
-       for i, xi := range x[:len(z)] {
-               yi := y[i]
-               zi := xi - yi - c
-               z[i] = zi
-               // see "Hacker's Delight", section 2-12 (overflow detection)
-               c = (yi&^xi | (yi|^xi)&zi) >> (_W - 1)
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x) && i < len(y); i++ {
+               zi, cc := bits.Sub(uint(x[i]), uint(y[i]), uint(c))
+               z[i] = Word(zi)
+               c = Word(cc)
        }
        return
 }
 
 // The resulting carry c is either 0 or 1.
 func addVW_g(z, x []Word, y Word) (c Word) {
-       if use_addWW_g {
-               c = y
-               for i := range z {
-                       c, z[i] = addWW_g(x[i], c, 0)
-               }
-               return
+       c = y
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
+               zi, cc := bits.Add(uint(x[i]), uint(c), 0)
+               z[i] = Word(zi)
+               c = Word(cc)
        }
+       return
+}
 
+// addVWlarge is addVW, but intended for large z.
+// The only difference is that we check on every iteration
+// whether we are done with carries,
+// and if so, switch to a much faster copy instead.
+// This is only a good idea for large z,
+// because the overhead of the check and the function call
+// outweigh the benefits when z is small.
+func addVWlarge(z, x []Word, y Word) (c Word) {
        c = y
-       for i, xi := range x[:len(z)] {
-               zi := xi + c
-               z[i] = zi
-               c = xi &^ zi >> (_W - 1)
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
+               if c == 0 {
+                       copy(z[i:], x[i:])
+                       return
+               }
+               zi, cc := bits.Add(uint(x[i]), uint(c), 0)
+               z[i] = Word(zi)
+               c = Word(cc)
        }
        return
 }
 
 func subVW_g(z, x []Word, y Word) (c Word) {
-       if use_addWW_g {
-               c = y
-               for i := range z {
-                       c, z[i] = subWW_g(x[i], c, 0)
-               }
-               return
+       c = y
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
+               zi, cc := bits.Sub(uint(x[i]), uint(c), 0)
+               z[i] = Word(zi)
+               c = Word(cc)
        }
+       return
+}
 
+// subVWlarge is to subVW as addVWlarge is to addVW.
+func subVWlarge(z, x []Word, y Word) (c Word) {
        c = y
-       for i, xi := range x[:len(z)] {
-               zi := xi - c
-               z[i] = zi
-               c = (zi &^ xi) >> (_W - 1)
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
+               if c == 0 {
+                       copy(z[i:], x[i:])
+                       return
+               }
+               zi, cc := bits.Sub(uint(x[i]), uint(c), 0)
+               z[i] = Word(zi)
+               c = Word(cc)
        }
        return
 }
 
 func shlVU_g(z, x []Word, s uint) (c Word) {
-       if n := len(z); n > 0 {
-               ŝ := _W - s
-               w1 := x[n-1]
-               c = w1 >> ŝ
-               for i := n - 1; i > 0; i-- {
-                       w := w1
-                       w1 = x[i-1]
-                       z[i] = w<<s | w1>>ŝ
-               }
-               z[0] = w1 << s
+       if s == 0 {
+               copy(z, x)
+               return
+       }
+       if len(z) == 0 {
+               return
        }
+       s &= _W - 1 // hint to the compiler that shifts by s don't need guard code
+       ŝ := _W - s
+       ŝ &= _W - 1 // ditto
+       c = x[len(z)-1] >> ŝ
+       for i := len(z) - 1; i > 0; i-- {
+               z[i] = x[i]<<s | x[i-1]>>ŝ
+       }
+       z[0] = x[0] << s
        return
 }
 
 func shrVU_g(z, x []Word, s uint) (c Word) {
-       if n := len(z); n > 0 {
-               ŝ := _W - s
-               w1 := x[0]
-               c = w1 << ŝ
-               for i := 0; i < n-1; i++ {
-                       w := w1
-                       w1 = x[i+1]
-                       z[i] = w>>s | w1<<ŝ
-               }
-               z[n-1] = w1 >> s
+       if s == 0 {
+               copy(z, x)
+               return
+       }
+       if len(z) == 0 {
+               return
+       }
+       s &= _W - 1 // hint to the compiler that shifts by s don't need guard code
+       ŝ := _W - s
+       ŝ &= _W - 1 // ditto
+       c = x[0] << ŝ
+       for i := 0; i < len(z)-1; i++ {
+               z[i] = x[i]>>s | x[i+1]<<ŝ
        }
+       z[len(z)-1] = x[len(z)-1] >> s
        return
 }
 
 func mulAddVWW_g(z, x []Word, y, r Word) (c Word) {
        c = r
-       for i := range z {
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
                c, z[i] = mulAddWWW_g(x[i], y, c)
        }
        return
 }
 
-// TODO(gri) Remove use of addWW_g here and then we can remove addWW_g and subWW_g.
 func addMulVVW_g(z, x []Word, y Word) (c Word) {
-       for i := range z {
+       // The comment near the top of this file discusses this for loop condition.
+       for i := 0; i < len(z) && i < len(x); i++ {
                z1, z0 := mulAddWWW_g(x[i], y, z[i])
-               c, z[i] = addWW_g(z0, c, 0)
+               lo, cc := bits.Add(uint(z0), uint(c), 0)
+               c, z[i] = Word(cc), Word(lo)
                c += z1
        }
        return
index 09884197cd744be12d3374e29a7de7688461deaf..ee8f92211e81264723ed1490bfde920887765cb5 100644 (file)
@@ -23,11 +23,21 @@ func subVV(z, x, y []Word) (c Word) {
 }
 
 func addVW(z, x []Word, y Word) (c Word) {
-       return addVW_g(z, x, y)
+       // TODO: remove indirect function call when golang.org/issue/30548 is fixed
+       fn := addVW_g
+       if len(z) > 32 {
+               fn = addVWlarge
+       }
+       return fn(z, x, y)
 }
 
 func subVW(z, x []Word, y Word) (c Word) {
-       return subVW_g(z, x, y)
+       // TODO: remove indirect function call when golang.org/issue/30548 is fixed
+       fn := subVW_g
+       if len(z) > 32 {
+               fn = subVWlarge
+       }
+       return fn(z, x, y)
 }
 
 func shlVU(z, x []Word, s uint) (c Word) {
index cf386b3b388376fd19a007441af9b7373659a0b3..05136f1895f2b3c652fed4c35630b65c72ad9d45 100644 (file)
@@ -14,48 +14,6 @@ import (
 
 var isRaceBuilder = strings.HasSuffix(testenv.Builder(), "-race")
 
-type funWW func(x, y, c Word) (z1, z0 Word)
-type argWW struct {
-       x, y, c, z1, z0 Word
-}
-
-var sumWW = []argWW{
-       {0, 0, 0, 0, 0},
-       {0, 1, 0, 0, 1},
-       {0, 0, 1, 0, 1},
-       {0, 1, 1, 0, 2},
-       {12345, 67890, 0, 0, 80235},
-       {12345, 67890, 1, 0, 80236},
-       {_M, 1, 0, 1, 0},
-       {_M, 0, 1, 1, 0},
-       {_M, 1, 1, 1, 1},
-       {_M, _M, 0, 1, _M - 1},
-       {_M, _M, 1, 1, _M},
-}
-
-func testFunWW(t *testing.T, msg string, f funWW, a argWW) {
-       z1, z0 := f(a.x, a.y, a.c)
-       if z1 != a.z1 || z0 != a.z0 {
-               t.Errorf("%s%+v\n\tgot z1:z0 = %#x:%#x; want %#x:%#x", msg, a, z1, z0, a.z1, a.z0)
-       }
-}
-
-func TestFunWW(t *testing.T) {
-       for _, a := range sumWW {
-               arg := a
-               testFunWW(t, "addWW_g", addWW_g, arg)
-
-               arg = argWW{a.y, a.x, a.c, a.z1, a.z0}
-               testFunWW(t, "addWW_g symmetric", addWW_g, arg)
-
-               arg = argWW{a.z0, a.x, a.c, a.z1, a.y}
-               testFunWW(t, "subWW_g", subWW_g, arg)
-
-               arg = argWW{a.z0, a.y, a.c, a.z1, a.x}
-               testFunWW(t, "subWW_g symmetric", subWW_g, arg)
-       }
-}
-
 type funVV func(z, x, y []Word) (c Word)
 type argVV struct {
        z, x, y nat
@@ -255,6 +213,75 @@ func TestFunVW(t *testing.T) {
        }
 }
 
+type argVU struct {
+       d  []Word // d is a Word slice, the input parameters x and z come from this array.
+       l  uint   // l is the length of the input parameters x and z.
+       xp uint   // xp is the starting position of the input parameter x, x := d[xp:xp+l].
+       zp uint   // zp is the starting position of the input parameter z, z := d[zp:zp+l].
+       s  uint   // s is the shift number.
+       r  []Word // r is the expected output result z.
+       c  Word   // c is the expected return value.
+       m  string // message.
+}
+
+var argshlVU = []argVU{
+       // test cases for shlVU
+       {[]Word{1, _M, _M, _M, _M, _M, 3 << (_W - 2), 0}, 7, 0, 0, 1, []Word{2, _M - 1, _M, _M, _M, _M, 1<<(_W-1) + 1}, 1, "complete overlap of shlVU"},
+       {[]Word{1, _M, _M, _M, _M, _M, 3 << (_W - 2), 0, 0, 0, 0}, 7, 0, 3, 1, []Word{2, _M - 1, _M, _M, _M, _M, 1<<(_W-1) + 1}, 1, "partial overlap by half of shlVU"},
+       {[]Word{1, _M, _M, _M, _M, _M, 3 << (_W - 2), 0, 0, 0, 0, 0, 0, 0}, 7, 0, 6, 1, []Word{2, _M - 1, _M, _M, _M, _M, 1<<(_W-1) + 1}, 1, "partial overlap by 1 Word of shlVU"},
+       {[]Word{1, _M, _M, _M, _M, _M, 3 << (_W - 2), 0, 0, 0, 0, 0, 0, 0, 0}, 7, 0, 7, 1, []Word{2, _M - 1, _M, _M, _M, _M, 1<<(_W-1) + 1}, 1, "no overlap of shlVU"},
+}
+
+var argshrVU = []argVU{
+       // test cases for shrVU
+       {[]Word{0, 3, _M, _M, _M, _M, _M, 1 << (_W - 1)}, 7, 1, 1, 1, []Word{1<<(_W-1) + 1, _M, _M, _M, _M, _M >> 1, 1 << (_W - 2)}, 1 << (_W - 1), "complete overlap of shrVU"},
+       {[]Word{0, 0, 0, 0, 3, _M, _M, _M, _M, _M, 1 << (_W - 1)}, 7, 4, 1, 1, []Word{1<<(_W-1) + 1, _M, _M, _M, _M, _M >> 1, 1 << (_W - 2)}, 1 << (_W - 1), "partial overlap by half of shrVU"},
+       {[]Word{0, 0, 0, 0, 0, 0, 0, 3, _M, _M, _M, _M, _M, 1 << (_W - 1)}, 7, 7, 1, 1, []Word{1<<(_W-1) + 1, _M, _M, _M, _M, _M >> 1, 1 << (_W - 2)}, 1 << (_W - 1), "partial overlap by 1 Word of shrVU"},
+       {[]Word{0, 0, 0, 0, 0, 0, 0, 0, 3, _M, _M, _M, _M, _M, 1 << (_W - 1)}, 7, 8, 1, 1, []Word{1<<(_W-1) + 1, _M, _M, _M, _M, _M >> 1, 1 << (_W - 2)}, 1 << (_W - 1), "no overlap of shrVU"},
+}
+
+func testShiftFunc(t *testing.T, f func(z, x []Word, s uint) Word, a argVU) {
+       // save a.d for error message, or it will be overwritten.
+       b := make([]Word, len(a.d))
+       copy(b, a.d)
+       z := a.d[a.zp : a.zp+a.l]
+       x := a.d[a.xp : a.xp+a.l]
+       c := f(z, x, a.s)
+       for i, zi := range z {
+               if zi != a.r[i] {
+                       t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot z[%d] = %#x; want %#x", b, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, i, zi, a.r[i])
+                       break
+               }
+       }
+       if c != a.c {
+               t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot c = %#x; want %#x", b, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, c, a.c)
+       }
+}
+
+func TestShiftOverlap(t *testing.T) {
+       for _, a := range argshlVU {
+               arg := a
+               testShiftFunc(t, shlVU, arg)
+       }
+
+       for _, a := range argshrVU {
+               arg := a
+               testShiftFunc(t, shrVU, arg)
+       }
+}
+
+func TestIssue31084(t *testing.T) {
+       // compute 10^n via 5^n << n.
+       const n = 165
+       p := nat(nil).expNN(nat{5}, nat{n}, nil)
+       p = p.shl(p, uint(n))
+       got := string(p.utoa(10))
+       want := "1" + strings.Repeat("0", n)
+       if got != want {
+               t.Errorf("shl(%v, %v)\n\tgot %s; want %s\n", p, uint(n), got, want)
+       }
+}
+
 func BenchmarkAddVW(b *testing.B) {
        for _, n := range benchSizes {
                if isRaceBuilder && n > 1e3 {
@@ -413,6 +440,24 @@ func TestMulAddWWW(t *testing.T) {
        }
 }
 
+func BenchmarkMulAddVWW(b *testing.B) {
+       for _, n := range benchSizes {
+               if isRaceBuilder && n > 1e3 {
+                       continue
+               }
+               z := make([]Word, n+1)
+               x := rndV(n)
+               y := rndW()
+               r := rndW()
+               b.Run(fmt.Sprint(n), func(b *testing.B) {
+                       b.SetBytes(int64(n * _W))
+                       for i := 0; i < b.N; i++ {
+                               mulAddVWW(z, x, y, r)
+                       }
+               })
+       }
+}
+
 func BenchmarkAddMulVVW(b *testing.B) {
        for _, n := range benchSizes {
                if isRaceBuilder && n > 1e3 {
index 95d1bf84e2436361c4efb06d7b0326d27cc251cc..95e32d3319ce77ff230ad59345fb12c290b2ff38 100644 (file)
@@ -55,7 +55,7 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
        // exponent
        var exp int64
        var ebase int
-       exp, ebase, err = scanExponent(r, true)
+       exp, ebase, err = scanExponent(r, true, base == 0)
        if err != nil {
                return
        }
@@ -70,8 +70,8 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
        }
        // len(z.mant) > 0
 
-       // The mantissa may have a decimal point (fcount <= 0) and there
-       // may be a nonzero exponent exp. The decimal point amounts to a
+       // The mantissa may have a radix point (fcount <= 0) and there
+       // may be a nonzero exponent exp. The radix point amounts to a
        // division by b**(-fcount). An exponent means multiplication by
        // ebase**exp. Finally, mantissa normalization (shift left) requires
        // a correcting multiplication by 2**(-shiftcount). Multiplications
@@ -85,11 +85,11 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
        exp2 := int64(len(z.mant))*_W - fnorm(z.mant)
        exp5 := int64(0)
 
-       // determine binary or decimal exponent contribution of decimal point
+       // determine binary or decimal exponent contribution of radix point
        if fcount < 0 {
-               // The mantissa has a "decimal" point ddd.dddd; and
-               // -fcount is the number of digits to the right of '.'.
-               // Adjust relevant exponent accordingly.
+               // The mantissa has a radix point ddd.dddd; and
+               // -fcount is the number of digits to the right
+               // of '.'. Adjust relevant exponent accordingly.
                d := int64(fcount)
                switch b {
                case 10:
@@ -97,6 +97,8 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
                        fallthrough // 10**e == 5**e * 2**e
                case 2:
                        exp2 += d
+               case 8:
+                       exp2 += d * 3 // octal digits are 3 bits each
                case 16:
                        exp2 += d * 4 // hexadecimal digits are 4 bits each
                default:
@@ -109,7 +111,7 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
        switch ebase {
        case 10:
                exp5 += exp
-               fallthrough
+               fallthrough // see fallthrough above
        case 2:
                exp2 += exp
        default:
@@ -214,35 +216,44 @@ func (z *Float) pow5(n uint64) *Float {
 // point number with a mantissa in the given conversion base (the exponent
 // is always a decimal number), or a string representing an infinite value.
 //
+// For base 0, an underscore character ``_'' may appear between a base
+// prefix and an adjacent digit, and between successive digits; such
+// underscores do not change the value of the number, or the returned
+// digit count. Incorrect placement of underscores is reported as an
+// error if there are no other errors. If base != 0, underscores are
+// not recognized and thus terminate scanning like any other character
+// that is not a valid radix point or digit.
+//
 // It sets z to the (possibly rounded) value of the corresponding floating-
 // point value, and returns z, the actual base b, and an error err, if any.
 // The entire string (not just a prefix) must be consumed for success.
 // If z's precision is 0, it is changed to 64 before rounding takes effect.
 // The number must be of the form:
 //
-//     number   = [ sign ] [ prefix ] mantissa [ exponent ] | infinity .
-//     sign     = "+" | "-" .
-//     prefix   = "0" ( "x" | "X" | "b" | "B" ) .
-//     mantissa = digits | digits "." [ digits ] | "." digits .
-//     exponent = ( "E" | "e" | "p" ) [ sign ] digits .
-//     digits   = digit { digit } .
-//     digit    = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
-//     infinity = [ sign ] ( "inf" | "Inf" ) .
+//     number    = [ sign ] ( float | "inf" | "Inf" ) .
+//     sign      = "+" | "-" .
+//     float     = ( mantissa | prefix pmantissa ) [ exponent ] .
+//     prefix    = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] .
+//     mantissa  = digits "." [ digits ] | digits | "." digits .
+//     pmantissa = [ "_" ] digits "." [ digits ] | [ "_" ] digits | "." digits .
+//     exponent  = ( "e" | "E" | "p" | "P" ) [ sign ] digits .
+//     digits    = digit { [ "_" ] digit } .
+//     digit     = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
 //
-// The base argument must be 0, 2, 10, or 16. Providing an invalid base
+// The base argument must be 0, 2, 8, 10, or 16. Providing an invalid base
 // argument will lead to a run-time panic.
 //
 // For base 0, the number prefix determines the actual base: A prefix of
-// "0x" or "0X" selects base 16, and a "0b" or "0B" prefix selects
-// base 2; otherwise, the actual base is 10 and no prefix is accepted.
-// The octal prefix "0" is not supported (a leading "0" is simply
-// considered a "0").
+// ``0b'' or ``0B'' selects base 2, ``0o'' or ``0O'' selects base 8, and
+// ``0x'' or ``0X'' selects base 16. Otherwise, the actual base is 10 and
+// no prefix is accepted. The octal prefix "0" is not supported (a leading
+// "0" is simply considered a "0").
 //
-// A "p" exponent indicates a binary (rather then decimal) exponent;
-// for instance "0x1.fffffffffffffp1023" (using base 0) represents the
-// maximum float64 value. For hexadecimal mantissae, the exponent must
-// be binary, if present (an "e" or "E" exponent indicator cannot be
-// distinguished from a mantissa digit).
+// A "p" or "P" exponent indicates a base 2 (rather then base 10) exponent;
+// for instance, "0x1.fffffffffffffp1023" (using base 0) represents the
+// maximum float64 value. For hexadecimal mantissae, the exponent character
+// must be one of 'p' or 'P', if present (an "e" or "E" exponent indicator
+// cannot be distinguished from a mantissa digit).
 //
 // The returned *Float f is nil and the value of z is valid but not
 // defined if an error is reported.
index 269e2652e89b032ad814c578d76835ee5a7dac7b..c6c6ba63e58cdf4446ddd9c3125561fd04032328 100644 (file)
@@ -72,6 +72,21 @@ func TestFloatSetFloat64String(t *testing.T) {
                {"infinity", nan},
                {"foobar", nan},
 
+               // invalid underscores
+               {"_", nan},
+               {"0_", nan},
+               {"1__0", nan},
+               {"123_.", nan},
+               {"123._", nan},
+               {"123._4", nan},
+               {"1_2.3_4_", nan},
+               {"_.123", nan},
+               {"_123.456", nan},
+               {"10._0", nan},
+               {"10.0e_0", nan},
+               {"10.0e0_", nan},
+               {"0P-0__0", nan},
+
                // misc decimal values
                {"3.14159265", 3.14159265},
                {"-687436.79457e-245", -687436.79457e-245},
@@ -108,6 +123,28 @@ func TestFloatSetFloat64String(t *testing.T) {
                {"0b001p-3", 0.125},
                {"0b.001p3", 1},
                {"0b0.01p2", 1},
+               {"0b0.01P+2", 1},
+
+               // octal mantissa, decimal exponent
+               {"0o0", 0},
+               {"-0o0", -zero_},
+               {"0o0e+10", 0},
+               {"-0o0e-10", -zero_},
+               {"0o12", 10},
+               {"0O12E2", 1000},
+               {"0o.4", 0.5},
+               {"0o.01", 0.015625},
+               {"0o.01e3", 15.625},
+
+               // octal mantissa, binary exponent
+               {"0o0p+10", 0},
+               {"-0o0p-10", -zero_},
+               {"0o.12p6", 10},
+               {"0o4p-3", 0.5},
+               {"0o0014p-6", 0.1875},
+               {"0o.001p9", 1},
+               {"0o0.01p7", 2},
+               {"0O0.01P+2", 0.0625},
 
                // hexadecimal mantissa and exponent
                {"0x0", 0},
@@ -117,8 +154,19 @@ func TestFloatSetFloat64String(t *testing.T) {
                {"0xff", 255},
                {"0X.8p1", 1},
                {"-0X0.00008p16", -0.5},
+               {"-0X0.00008P+16", -0.5},
                {"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64},
                {"0x1.fffffffffffffp1023", math.MaxFloat64},
+
+               // underscores
+               {"0_0", 0},
+               {"1_000.", 1000},
+               {"1_2_3.4_5_6", 123.456},
+               {"1.0e0_0", 1},
+               {"1p+1_0", 1024},
+               {"0b_1000", 0x8},
+               {"0b_1011_1101", 0xbd},
+               {"0x_f0_0d_1eP+0_8", 0xf00d1e00},
        } {
                var x Float
                x.SetPrec(53)
@@ -266,7 +314,7 @@ func TestFloat64Text(t *testing.T) {
                {32, 'g', -1, "32"},
                {32, 'g', 0, "3e+01"},
 
-               {100, 'x', -1, "%x"},
+               {100, 'x', -1, "0x1.9p+06"},
 
                // {math.NaN(), 'g', -1, "NaN"},  // Float doesn't support NaNs
                // {-math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs
@@ -337,115 +385,166 @@ func actualPrec(x float64) uint {
 }
 
 func TestFloatText(t *testing.T) {
+       const defaultRound = ^RoundingMode(0)
+
        for _, test := range []struct {
                x      string
+               round  RoundingMode
                prec   uint
                format byte
                digits int
                want   string
        }{
-               {"0", 10, 'f', 0, "0"},
-               {"-0", 10, 'f', 0, "-0"},
-               {"1", 10, 'f', 0, "1"},
-               {"-1", 10, 'f', 0, "-1"},
-
-               {"1.459", 100, 'e', 0, "1e+00"},
-               {"2.459", 100, 'e', 1, "2.5e+00"},
-               {"3.459", 100, 'e', 2, "3.46e+00"},
-               {"4.459", 100, 'e', 3, "4.459e+00"},
-               {"5.459", 100, 'e', 4, "5.4590e+00"},
-
-               {"1.459", 100, 'E', 0, "1E+00"},
-               {"2.459", 100, 'E', 1, "2.5E+00"},
-               {"3.459", 100, 'E', 2, "3.46E+00"},
-               {"4.459", 100, 'E', 3, "4.459E+00"},
-               {"5.459", 100, 'E', 4, "5.4590E+00"},
-
-               {"1.459", 100, 'f', 0, "1"},
-               {"2.459", 100, 'f', 1, "2.5"},
-               {"3.459", 100, 'f', 2, "3.46"},
-               {"4.459", 100, 'f', 3, "4.459"},
-               {"5.459", 100, 'f', 4, "5.4590"},
-
-               {"1.459", 100, 'g', 0, "1"},
-               {"2.459", 100, 'g', 1, "2"},
-               {"3.459", 100, 'g', 2, "3.5"},
-               {"4.459", 100, 'g', 3, "4.46"},
-               {"5.459", 100, 'g', 4, "5.459"},
-
-               {"1459", 53, 'g', 0, "1e+03"},
-               {"2459", 53, 'g', 1, "2e+03"},
-               {"3459", 53, 'g', 2, "3.5e+03"},
-               {"4459", 53, 'g', 3, "4.46e+03"},
-               {"5459", 53, 'g', 4, "5459"},
-
-               {"1459", 53, 'G', 0, "1E+03"},
-               {"2459", 53, 'G', 1, "2E+03"},
-               {"3459", 53, 'G', 2, "3.5E+03"},
-               {"4459", 53, 'G', 3, "4.46E+03"},
-               {"5459", 53, 'G', 4, "5459"},
-
-               {"3", 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"},
-               {"3", 10, 'f', 40, "3.0000000000000000000000000000000000000000"},
-               {"3", 10, 'g', 40, "3"},
-
-               {"3e40", 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"},
-               {"3e40", 100, 'f', 4, "30000000000000000000000000000000000000000.0000"},
-               {"3e40", 100, 'g', 40, "3e+40"},
+               {"0", defaultRound, 10, 'f', 0, "0"},
+               {"-0", defaultRound, 10, 'f', 0, "-0"},
+               {"1", defaultRound, 10, 'f', 0, "1"},
+               {"-1", defaultRound, 10, 'f', 0, "-1"},
+
+               {"1.459", defaultRound, 100, 'e', 0, "1e+00"},
+               {"2.459", defaultRound, 100, 'e', 1, "2.5e+00"},
+               {"3.459", defaultRound, 100, 'e', 2, "3.46e+00"},
+               {"4.459", defaultRound, 100, 'e', 3, "4.459e+00"},
+               {"5.459", defaultRound, 100, 'e', 4, "5.4590e+00"},
+
+               {"1.459", defaultRound, 100, 'E', 0, "1E+00"},
+               {"2.459", defaultRound, 100, 'E', 1, "2.5E+00"},
+               {"3.459", defaultRound, 100, 'E', 2, "3.46E+00"},
+               {"4.459", defaultRound, 100, 'E', 3, "4.459E+00"},
+               {"5.459", defaultRound, 100, 'E', 4, "5.4590E+00"},
+
+               {"1.459", defaultRound, 100, 'f', 0, "1"},
+               {"2.459", defaultRound, 100, 'f', 1, "2.5"},
+               {"3.459", defaultRound, 100, 'f', 2, "3.46"},
+               {"4.459", defaultRound, 100, 'f', 3, "4.459"},
+               {"5.459", defaultRound, 100, 'f', 4, "5.4590"},
+
+               {"1.459", defaultRound, 100, 'g', 0, "1"},
+               {"2.459", defaultRound, 100, 'g', 1, "2"},
+               {"3.459", defaultRound, 100, 'g', 2, "3.5"},
+               {"4.459", defaultRound, 100, 'g', 3, "4.46"},
+               {"5.459", defaultRound, 100, 'g', 4, "5.459"},
+
+               {"1459", defaultRound, 53, 'g', 0, "1e+03"},
+               {"2459", defaultRound, 53, 'g', 1, "2e+03"},
+               {"3459", defaultRound, 53, 'g', 2, "3.5e+03"},
+               {"4459", defaultRound, 53, 'g', 3, "4.46e+03"},
+               {"5459", defaultRound, 53, 'g', 4, "5459"},
+
+               {"1459", defaultRound, 53, 'G', 0, "1E+03"},
+               {"2459", defaultRound, 53, 'G', 1, "2E+03"},
+               {"3459", defaultRound, 53, 'G', 2, "3.5E+03"},
+               {"4459", defaultRound, 53, 'G', 3, "4.46E+03"},
+               {"5459", defaultRound, 53, 'G', 4, "5459"},
+
+               {"3", defaultRound, 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"},
+               {"3", defaultRound, 10, 'f', 40, "3.0000000000000000000000000000000000000000"},
+               {"3", defaultRound, 10, 'g', 40, "3"},
+
+               {"3e40", defaultRound, 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"},
+               {"3e40", defaultRound, 100, 'f', 4, "30000000000000000000000000000000000000000.0000"},
+               {"3e40", defaultRound, 100, 'g', 40, "3e+40"},
 
                // make sure "stupid" exponents don't stall the machine
-               {"1e1000000", 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"},
-               {"1e646456992", 64, 'p', 0, "0x.e883a0c5c8c7c42ap+2147483644"},
-               {"1e646456993", 64, 'p', 0, "+Inf"},
-               {"1e1000000000", 64, 'p', 0, "+Inf"},
-               {"1e-1000000", 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"},
-               {"1e-646456993", 64, 'p', 0, "0x.e17c8956983d9d59p-2147483647"},
-               {"1e-646456994", 64, 'p', 0, "0"},
-               {"1e-1000000000", 64, 'p', 0, "0"},
+               {"1e1000000", defaultRound, 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"},
+               {"1e646456992", defaultRound, 64, 'p', 0, "0x.e883a0c5c8c7c42ap+2147483644"},
+               {"1e646456993", defaultRound, 64, 'p', 0, "+Inf"},
+               {"1e1000000000", defaultRound, 64, 'p', 0, "+Inf"},
+               {"1e-1000000", defaultRound, 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"},
+               {"1e-646456993", defaultRound, 64, 'p', 0, "0x.e17c8956983d9d59p-2147483647"},
+               {"1e-646456994", defaultRound, 64, 'p', 0, "0"},
+               {"1e-1000000000", defaultRound, 64, 'p', 0, "0"},
 
                // minimum and maximum values
-               {"1p2147483646", 64, 'p', 0, "0x.8p+2147483647"},
-               {"0x.8p2147483647", 64, 'p', 0, "0x.8p+2147483647"},
-               {"0x.8p-2147483647", 64, 'p', 0, "0x.8p-2147483647"},
-               {"1p-2147483649", 64, 'p', 0, "0x.8p-2147483648"},
+               {"1p2147483646", defaultRound, 64, 'p', 0, "0x.8p+2147483647"},
+               {"0x.8p2147483647", defaultRound, 64, 'p', 0, "0x.8p+2147483647"},
+               {"0x.8p-2147483647", defaultRound, 64, 'p', 0, "0x.8p-2147483647"},
+               {"1p-2147483649", defaultRound, 64, 'p', 0, "0x.8p-2147483648"},
 
                // TODO(gri) need tests for actual large Floats
 
-               {"0", 53, 'b', 0, "0"},
-               {"-0", 53, 'b', 0, "-0"},
-               {"1.0", 53, 'b', 0, "4503599627370496p-52"},
-               {"-1.0", 53, 'b', 0, "-4503599627370496p-52"},
-               {"4503599627370496", 53, 'b', 0, "4503599627370496p+0"},
+               {"0", defaultRound, 53, 'b', 0, "0"},
+               {"-0", defaultRound, 53, 'b', 0, "-0"},
+               {"1.0", defaultRound, 53, 'b', 0, "4503599627370496p-52"},
+               {"-1.0", defaultRound, 53, 'b', 0, "-4503599627370496p-52"},
+               {"4503599627370496", defaultRound, 53, 'b', 0, "4503599627370496p+0"},
 
                // issue 9939
-               {"3", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-               {"03", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-               {"3.", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-               {"3.0", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-               {"3.00", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-               {"3.000", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-
-               {"3", 350, 'p', 0, "0x.cp+2"},
-               {"03", 350, 'p', 0, "0x.cp+2"},
-               {"3.", 350, 'p', 0, "0x.cp+2"},
-               {"3.0", 350, 'p', 0, "0x.cp+2"},
-               {"3.00", 350, 'p', 0, "0x.cp+2"},
-               {"3.000", 350, 'p', 0, "0x.cp+2"},
-
-               {"0", 64, 'p', 0, "0"},
-               {"-0", 64, 'p', 0, "-0"},
-               {"1024.0", 64, 'p', 0, "0x.8p+11"},
-               {"-1024.0", 64, 'p', 0, "-0x.8p+11"},
-
-               // unsupported format
-               {"3.14", 64, 'x', 0, "%x"},
-               {"-3.14", 64, 'x', 0, "%x"},
+               {"3", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+               {"03", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+               {"3.", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+               {"3.0", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+               {"3.00", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+               {"3.000", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
+
+               {"3", defaultRound, 350, 'p', 0, "0x.cp+2"},
+               {"03", defaultRound, 350, 'p', 0, "0x.cp+2"},
+               {"3.", defaultRound, 350, 'p', 0, "0x.cp+2"},
+               {"3.0", defaultRound, 350, 'p', 0, "0x.cp+2"},
+               {"3.00", defaultRound, 350, 'p', 0, "0x.cp+2"},
+               {"3.000", defaultRound, 350, 'p', 0, "0x.cp+2"},
+
+               {"0", defaultRound, 64, 'p', 0, "0"},
+               {"-0", defaultRound, 64, 'p', 0, "-0"},
+               {"1024.0", defaultRound, 64, 'p', 0, "0x.8p+11"},
+               {"-1024.0", defaultRound, 64, 'p', 0, "-0x.8p+11"},
+
+               {"0", defaultRound, 64, 'x', -1, "0x0p+00"},
+               {"0", defaultRound, 64, 'x', 0, "0x0p+00"},
+               {"0", defaultRound, 64, 'x', 1, "0x0.0p+00"},
+               {"0", defaultRound, 64, 'x', 5, "0x0.00000p+00"},
+               {"3.25", defaultRound, 64, 'x', 0, "0x1p+02"},
+               {"-3.25", defaultRound, 64, 'x', 0, "-0x1p+02"},
+               {"3.25", defaultRound, 64, 'x', 1, "0x1.ap+01"},
+               {"-3.25", defaultRound, 64, 'x', 1, "-0x1.ap+01"},
+               {"3.25", defaultRound, 64, 'x', -1, "0x1.ap+01"},
+               {"-3.25", defaultRound, 64, 'x', -1, "-0x1.ap+01"},
+               {"1024.0", defaultRound, 64, 'x', 0, "0x1p+10"},
+               {"-1024.0", defaultRound, 64, 'x', 0, "-0x1p+10"},
+               {"1024.0", defaultRound, 64, 'x', 5, "0x1.00000p+10"},
+               {"8191.0", defaultRound, 53, 'x', -1, "0x1.fffp+12"},
+               {"8191.5", defaultRound, 53, 'x', -1, "0x1.fff8p+12"},
+               {"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"},
+               {"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"},
+               {"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"},
+               {"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"},
+               {"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"},
+               {"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"},
+
+               {"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"},
+               {"8191.53125", ToNearestEven, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.53125", ToNearestAway, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.53125", ToZero, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.53125", AwayFromZero, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.53125", ToNegativeInf, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.53125", ToPositiveInf, 53, 'x', 5, "0x1.fff88p+12"},
+
+               {"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"},
+               {"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"},
+               {"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"},
+               {"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"},
+               {"8191.533203125", defaultRound, 53, 'x', 6, "0x1.fff888p+12"},
+               {"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"},
+               {"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"},
+
+               {"8191.53125", ToNearestEven, 53, 'x', 4, "0x1.fff8p+12"},
+               {"8191.53125", ToNearestAway, 53, 'x', 4, "0x1.fff9p+12"},
+               {"8191.53125", ToZero, 53, 'x', 4, "0x1.fff8p+12"},
+               {"8191.53125", ToZero, 53, 'x', 2, "0x1.ffp+12"},
+               {"8191.53125", AwayFromZero, 53, 'x', 4, "0x1.fff9p+12"},
+               {"8191.53125", ToNegativeInf, 53, 'x', 4, "0x1.fff8p+12"},
+               {"-8191.53125", ToNegativeInf, 53, 'x', 4, "-0x1.fff9p+12"},
+               {"8191.53125", ToPositiveInf, 53, 'x', 4, "0x1.fff9p+12"},
+               {"-8191.53125", ToPositiveInf, 53, 'x', 4, "-0x1.fff8p+12"},
        } {
                f, _, err := ParseFloat(test.x, 0, test.prec, ToNearestEven)
                if err != nil {
                        t.Errorf("%v: %s", test, err)
                        continue
                }
+               if test.round != defaultRound {
+                       f.SetMode(test.round)
+               }
 
                got := f.Text(test.format, test.digits)
                if got != test.want {
@@ -456,7 +555,7 @@ func TestFloatText(t *testing.T) {
                // ('p' format is not supported by strconv.FormatFloat,
                // and its output for 0.0 prints a biased exponent value
                // as in 0p-1074 which makes no sense to emulate here)
-               if test.prec == 53 && test.format != 'p' && f.Sign() != 0 {
+               if test.prec == 53 && test.format != 'p' && f.Sign() != 0 && (test.round == ToNearestEven || test.round == defaultRound) {
                        f64, acc := f.Float64()
                        if acc != Exact {
                                t.Errorf("%v: expected exact conversion to float64", test)
index 5bd906ddae40b9dcef52b8b816268bd743355c74..c056d78b8008cd338f72241a168bfe7d866d4fd7 100644 (file)
@@ -109,6 +109,9 @@ func TestFloatJSONEncoding(t *testing.T) {
        for _, test := range floatVals {
                for _, sign := range []string{"", "+", "-"} {
                        for _, prec := range []uint{0, 1, 2, 10, 53, 64, 100, 1000} {
+                               if prec > 53 && testing.Short() {
+                                       continue
+                               }
                                x := sign + test
                                var tx Float
                                _, _, err := tx.SetPrec(prec).Parse(x, 0)
index d2a85886c72d6d3f9cd7fc47641c57aae044b99f..6cae63ed0978eb63aa69b0fbf38c67757de22f7d 100644 (file)
@@ -22,24 +22,28 @@ import (
 //     'f'     -ddddd.dddd, no exponent
 //     'g'     like 'e' for large exponents, like 'f' otherwise
 //     'G'     like 'E' for large exponents, like 'f' otherwise
-//     'b'     -ddddddp±dd, binary exponent
-//     'p'     -0x.dddp±dd, binary exponent, hexadecimal mantissa
+//     'x'     -0xd.dddddp±dd, hexadecimal mantissa, decimal power of two exponent
+//     'p'     -0x.dddp±dd, hexadecimal mantissa, decimal power of two exponent (non-standard)
+//     'b'     -ddddddp±dd, decimal mantissa, decimal power of two exponent (non-standard)
 //
-// For the binary exponent formats, the mantissa is printed in normalized form:
+// For the power-of-two exponent formats, the mantissa is printed in normalized form:
 //
-//     'b'     decimal integer mantissa using x.Prec() bits, or -0
-//     'p'     hexadecimal fraction with 0.5 <= 0.mantissa < 1.0, or -0
+//     'x'     hexadecimal mantissa in [1, 2), or 0
+//     'p'     hexadecimal mantissa in [½, 1), or 0
+//     'b'     decimal integer mantissa using x.Prec() bits, or 0
+//
+// Note that the 'x' form is the one used by most other languages and libraries.
 //
 // If format is a different character, Text returns a "%" followed by the
 // unrecognized format character.
 //
 // The precision prec controls the number of digits (excluding the exponent)
-// printed by the 'e', 'E', 'f', 'g', and 'G' formats. For 'e', 'E', and 'f'
-// it is the number of digits after the decimal point. For 'g' and 'G' it is
-// the total number of digits. A negative precision selects the smallest
-// number of decimal digits necessary to identify the value x uniquely using
-// x.Prec() mantissa bits.
-// The prec value is ignored for the 'b' or 'p' format.
+// printed by the 'e', 'E', 'f', 'g', 'G', and 'x' formats.
+// For 'e', 'E', 'f', and 'x', it is the number of digits after the decimal point.
+// For 'g' and 'G' it is the total number of digits. A negative precision selects
+// the smallest number of decimal digits necessary to identify the value x uniquely
+// using x.Prec() mantissa bits.
+// The prec value is ignored for the 'b' and 'p' formats.
 func (x *Float) Text(format byte, prec int) string {
        cap := 10 // TODO(gri) determine a good/better value here
        if prec > 0 {
@@ -76,6 +80,8 @@ func (x *Float) Append(buf []byte, fmt byte, prec int) []byte {
                return x.fmtB(buf)
        case 'p':
                return x.fmtP(buf)
+       case 'x':
+               return x.fmtX(buf, prec)
        }
 
        // Algorithm:
@@ -308,6 +314,7 @@ func fmtF(buf []byte, prec int, d decimal) []byte {
 // The mantissa is normalized such that is uses x.Prec() bits in binary
 // representation.
 // The sign of x is ignored, and x must not be an Inf.
+// (The caller handles Inf before invoking fmtB.)
 func (x *Float) fmtB(buf []byte) []byte {
        if x.form == zero {
                return append(buf, '0')
@@ -336,11 +343,80 @@ func (x *Float) fmtB(buf []byte) []byte {
        return strconv.AppendInt(buf, e, 10)
 }
 
+// fmtX appends the string of x in the format "0x1." mantissa "p" exponent
+// with a hexadecimal mantissa and a binary exponent, or "0x0p0" if x is zero,
+// and returns the extended buffer.
+// A non-zero mantissa is normalized such that 1.0 <= mantissa < 2.0.
+// The sign of x is ignored, and x must not be an Inf.
+// (The caller handles Inf before invoking fmtX.)
+func (x *Float) fmtX(buf []byte, prec int) []byte {
+       if x.form == zero {
+               buf = append(buf, "0x0"...)
+               if prec > 0 {
+                       buf = append(buf, '.')
+                       for i := 0; i < prec; i++ {
+                               buf = append(buf, '0')
+                       }
+               }
+               buf = append(buf, "p+00"...)
+               return buf
+       }
+
+       if debugFloat && x.form != finite {
+               panic("non-finite float")
+       }
+
+       // round mantissa to n bits
+       var n uint
+       if prec < 0 {
+               n = 1 + (x.MinPrec()-1+3)/4*4 // round MinPrec up to 1 mod 4
+       } else {
+               n = 1 + 4*uint(prec)
+       }
+       // n%4 == 1
+       x = new(Float).SetPrec(n).SetMode(x.mode).Set(x)
+
+       // adjust mantissa to use exactly n bits
+       m := x.mant
+       switch w := uint(len(x.mant)) * _W; {
+       case w < n:
+               m = nat(nil).shl(m, n-w)
+       case w > n:
+               m = nat(nil).shr(m, w-n)
+       }
+       exp := x.exp - 1
+
+       hm := m.utoa(16)
+       if debugFloat && hm[0] != '1' {
+               panic("incorrect mantissa: " + string(hm))
+       }
+       buf = append(buf, "0x1"...)
+       if len(hm) > 1 {
+               buf = append(buf, '.')
+               buf = append(buf, hm[1:]...)
+       }
+
+       buf = append(buf, 'p')
+       exp64 := int64(exp)
+       if exp64 >= 0 {
+               buf = append(buf, '+')
+       } else {
+               exp64 = -exp64
+               buf = append(buf, '-')
+       }
+       // Force at least two exponent digits, to match fmt.
+       if exp64 < 10 {
+               buf = append(buf, '0')
+       }
+       return strconv.AppendInt(buf, exp64, 10)
+}
+
 // fmtP appends the string of x in the format "0x." mantissa "p" exponent
 // with a hexadecimal mantissa and a binary exponent, or "0" if x is zero,
 // and returns the extended buffer.
 // The mantissa is normalized such that 0.5 <= 0.mantissa < 1.0.
 // The sign of x is ignored, and x must not be an Inf.
+// (The caller handles Inf before invoking fmtP.)
 func (x *Float) fmtP(buf []byte) []byte {
        if x.form == zero {
                return append(buf, '0')
@@ -380,7 +456,7 @@ var _ fmt.Formatter = &floatZero // *Float must implement fmt.Formatter
 
 // Format implements fmt.Formatter. It accepts all the regular
 // formats for floating-point numbers ('b', 'e', 'E', 'f', 'F',
-// 'g', 'G') as well as 'p' and 'v'. See (*Float).Text for the
+// 'g', 'G', 'x') as well as 'p' and 'v'. See (*Float).Text for the
 // interpretation of 'p'. The 'v' format is handled like 'g'.
 // Format also supports specification of the minimum precision
 // in digits, the output field width, as well as the format flags
@@ -394,7 +470,7 @@ func (x *Float) Format(s fmt.State, format rune) {
        }
 
        switch format {
-       case 'e', 'E', 'f', 'b', 'p':
+       case 'e', 'E', 'f', 'b', 'p', 'x':
                // nothing to do
        case 'F':
                // (*Float).Text doesn't support 'F'; handle like 'f'
index dab9a5cc0f7e689c6c75ebf0814268d3f8493ed2..8e52f0ab27b0aa3ef7cb63e432ef4f46f14dcd7c 100644 (file)
@@ -401,16 +401,24 @@ func (x *Int) IsUint64() bool {
 // (not just a prefix) must be valid for success. If SetString fails,
 // the value of z is undefined but the returned value is nil.
 //
-// The base argument must be 0 or a value between 2 and MaxBase. If the base
-// is 0, the string prefix determines the actual conversion base. A prefix of
-// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a
-// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10.
+// The base argument must be 0 or a value between 2 and MaxBase.
+// For base 0, the number prefix determines the actual base: A prefix of
+// ``0b'' or ``0B'' selects base 2, ``0'', ``0o'' or ``0O'' selects base 8,
+// and ``0x'' or ``0X'' selects base 16. Otherwise, the selected base is 10
+// and no prefix is accepted.
 //
 // For bases <= 36, lower and upper case letters are considered the same:
 // The letters 'a' to 'z' and 'A' to 'Z' represent digit values 10 to 35.
 // For bases > 36, the upper case letters 'A' to 'Z' represent the digit
 // values 36 to 61.
 //
+// For base 0, an underscore character ``_'' may appear between a base
+// prefix and an adjacent digit, and between successive digits; such
+// underscores do not change the value of the number.
+// Incorrect placement of underscores is reported as an error if there
+// are no other errors. If base != 0, underscores are not recognized
+// and act like any other character that is not a valid digit.
+//
 func (z *Int) SetString(s string, base int) (*Int, bool) {
        return z.setFromScanner(strings.NewReader(s), base)
 }
@@ -448,8 +456,15 @@ func (x *Int) BitLen() int {
        return x.abs.bitLen()
 }
 
+// TrailingZeroBits returns the number of consecutive least significant zero
+// bits of |x|.
+func (x *Int) TrailingZeroBits() uint {
+       return x.abs.trailingZeroBits()
+}
+
 // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z.
-// If m == nil or m == 0, z = x**y unless y <= 0 then z = 1.
+// If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. If m > 0, y < 0,
+// and x and n are not relatively prime, z is unchanged and nil is returned.
 //
 // Modular exponentation of inputs of a particular size is not a
 // cryptographically constant-time operation.
@@ -461,7 +476,11 @@ func (z *Int) Exp(x, y, m *Int) *Int {
                        return z.SetInt64(1)
                }
                // for y < 0: x**y mod m == (x**(-1))**|y| mod m
-               xWords = new(Int).ModInverse(x, m).abs
+               inverse := new(Int).ModInverse(x, m)
+               if inverse == nil {
+                       return nil
+               }
+               xWords = inverse.abs
        }
        yWords := y.abs
 
@@ -700,15 +719,21 @@ func (z *Int) lehmerGCD(x, y, a, b *Int) *Int {
                }
        }
 
-       if x != nil {
-               *x = *Ua
-       }
-
        if y != nil {
+               // avoid aliasing b needed in the division below
+               if y == b {
+                       B.Set(b)
+               } else {
+                       B = b
+               }
                // y = (z - a*x)/b
-               y.Mul(a, Ua)
+               y.Mul(a, Ua) // y can safely alias a
                y.Sub(A, y)
-               y.Div(y, b)
+               y.Div(y, B)
+       }
+
+       if x != nil {
+               *x = *Ua
        }
 
        *z = *A
index 7ef2b3907f75afd216c40c4a7cd252c6bd36e934..ade973b20743543b0ef1a4d60db23d84ff294542 100644 (file)
@@ -533,6 +533,9 @@ var expTests = []struct {
        {"1", "0", "", "1"},
        {"-10", "0", "", "1"},
        {"1234", "-1", "", "1"},
+       {"1234", "-1", "0", "1"},
+       {"17", "-100", "1234", "865"},
+       {"2", "-100", "1234", ""},
 
        // m == 1
        {"0", "0", "1", "0"},
@@ -605,10 +608,15 @@ func TestExp(t *testing.T) {
        for i, test := range expTests {
                x, ok1 := new(Int).SetString(test.x, 0)
                y, ok2 := new(Int).SetString(test.y, 0)
-               out, ok3 := new(Int).SetString(test.out, 0)
 
-               var ok4 bool
-               var m *Int
+               var ok3, ok4 bool
+               var out, m *Int
+
+               if len(test.out) == 0 {
+                       out, ok3 = nil, true
+               } else {
+                       out, ok3 = new(Int).SetString(test.out, 0)
+               }
 
                if len(test.m) == 0 {
                        m, ok4 = nil, true
@@ -622,10 +630,10 @@ func TestExp(t *testing.T) {
                }
 
                z1 := new(Int).Exp(x, y, m)
-               if !isNormalized(z1) {
+               if z1 != nil && !isNormalized(z1) {
                        t.Errorf("#%d: %v is not normalized", i, *z1)
                }
-               if z1.Cmp(out) != 0 {
+               if !(z1 == nil && out == nil || z1.Cmp(out) == 0) {
                        t.Errorf("#%d: got %x want %x", i, z1, out)
                }
 
@@ -760,9 +768,6 @@ var gcdTests = []struct {
        {"935", "-3", "8", "64515", "24310"},
        {"935000000000000000", "-3", "8", "64515000000000000000", "24310000000000000000"},
        {"1", "-221", "22059940471369027483332068679400581064239780177629666810348940098015901108344", "98920366548084643601728869055592650835572950932266967461790948584315647051443", "991"},
-
-       // test early exit (after one Euclidean iteration) in binaryGCD
-       {"1", "", "", "1", "98920366548084643601728869055592650835572950932266967461790948584315647051443"},
 }
 
 func testGcd(t *testing.T, d, x, y, a, b *Int) {
@@ -793,6 +798,12 @@ func testGcd(t *testing.T, d, x, y, a, b *Int) {
        if a2.Cmp(d) != 0 {
                t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, a2, d)
        }
+       if x != nil && X.Cmp(x) != 0 {
+               t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, X, x)
+       }
+       if y != nil && Y.Cmp(y) != 0 {
+               t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, Y, y)
+       }
 
        a2 = new(Int).Set(a)
        b2 = new(Int).Set(b)
@@ -800,6 +811,38 @@ func testGcd(t *testing.T, d, x, y, a, b *Int) {
        if b2.Cmp(d) != 0 {
                t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, b2, d)
        }
+       if x != nil && X.Cmp(x) != 0 {
+               t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, X, x)
+       }
+       if y != nil && Y.Cmp(y) != 0 {
+               t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, Y, y)
+       }
+
+       a2 = new(Int).Set(a)
+       b2 = new(Int).Set(b)
+       D = new(Int).GCD(a2, b2, a2, b2) // x = a, y = b
+       if D.Cmp(d) != 0 {
+               t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, D, d)
+       }
+       if x != nil && a2.Cmp(x) != 0 {
+               t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, a2, x)
+       }
+       if y != nil && b2.Cmp(y) != 0 {
+               t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, b2, y)
+       }
+
+       a2 = new(Int).Set(a)
+       b2 = new(Int).Set(b)
+       D = new(Int).GCD(b2, a2, a2, b2) // x = b, y = a
+       if D.Cmp(d) != 0 {
+               t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, D, d)
+       }
+       if x != nil && b2.Cmp(x) != 0 {
+               t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, b2, x)
+       }
+       if y != nil && a2.Cmp(y) != 0 {
+               t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, a2, y)
+       }
 }
 
 func TestGcd(t *testing.T) {
@@ -1300,6 +1343,31 @@ func TestBitSet(t *testing.T) {
        }
 }
 
+var tzbTests = []struct {
+       in  string
+       out uint
+}{
+       {"0", 0},
+       {"1", 0},
+       {"-1", 0},
+       {"4", 2},
+       {"-8", 3},
+       {"0x4000000000000000000", 74},
+       {"-0x8000000000000000000", 75},
+}
+
+func TestTrailingZeroBits(t *testing.T) {
+       for i, test := range tzbTests {
+               in, _ := new(Int).SetString(test.in, 0)
+               want := test.out
+               got := in.TrailingZeroBits()
+
+               if got != want {
+                       t.Errorf("#%d: got %v want %v", i, got, want)
+               }
+       }
+}
+
 func BenchmarkBitset(b *testing.B) {
        z := new(Int)
        z.SetBit(z, 512, 1)
index 6cca827c8e3412640a7b070faa6fe9d324e8f48b..05672841056ddbe2aef939b31a10424e9fcc9500 100644 (file)
@@ -16,7 +16,8 @@ import (
 // Base must be between 2 and 62, inclusive. The result uses the
 // lower-case letters 'a' to 'z' for digit values 10 to 35, and
 // the upper-case letters 'A' to 'Z' for digit values 36 to 61.
-// No prefix (such as "0x") is added to the string.
+// No prefix (such as "0x") is added to the string. If x is a nil
+// pointer it returns "<nil>".
 func (x *Int) Text(base int) string {
        if x == nil {
                return "<nil>"
@@ -33,6 +34,8 @@ func (x *Int) Append(buf []byte, base int) []byte {
        return append(buf, x.abs.itoa(x.neg, base)...)
 }
 
+// String returns the decimal representation of x as generated by
+// x.Text(10).
 func (x *Int) String() string {
        return x.Text(10)
 }
@@ -50,8 +53,9 @@ func writeMultiple(s fmt.State, text string, count int) {
 var _ fmt.Formatter = intOne // *Int must implement fmt.Formatter
 
 // Format implements fmt.Formatter. It accepts the formats
-// 'b' (binary), 'o' (octal), 'd' (decimal), 'x' (lowercase
-// hexadecimal), and 'X' (uppercase hexadecimal).
+// 'b' (binary), 'o' (octal with 0 prefix), 'O' (octal with 0o prefix),
+// 'd' (decimal), 'x' (lowercase hexadecimal), and
+// 'X' (uppercase hexadecimal).
 // Also supported are the full suite of package fmt's format
 // flags for integral types, including '+' and ' ' for sign
 // control, '#' for leading zero in octal and for hexadecimal,
@@ -66,7 +70,7 @@ func (x *Int) Format(s fmt.State, ch rune) {
        switch ch {
        case 'b':
                base = 2
-       case 'o':
+       case 'o', 'O':
                base = 8
        case 'd', 's', 'v':
                base = 10
@@ -98,6 +102,8 @@ func (x *Int) Format(s fmt.State, ch rune) {
        prefix := ""
        if s.Flag('#') {
                switch ch {
+               case 'b': // binary
+                       prefix = "0b"
                case 'o': // octal
                        prefix = "0"
                case 'x': // hexadecimal
@@ -106,6 +112,9 @@ func (x *Int) Format(s fmt.State, ch rune) {
                        prefix = "0X"
                }
        }
+       if ch == 'O' {
+               prefix = "0o"
+       }
 
        digits := x.abs.utoa(base)
        if ch == 'X' {
@@ -166,8 +175,9 @@ func (x *Int) Format(s fmt.State, ch rune) {
 //
 // The base argument must be 0 or a value from 2 through MaxBase. If the base
 // is 0, the string prefix determines the actual conversion base. A prefix of
-// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a
-// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10.
+// ``0b'' or ``0B'' selects base 2; a ``0'', ``0o'', or ``0O'' prefix selects
+// base 8, and a ``0x'' or ``0X'' prefix selects base 16. Otherwise the selected
+// base is 10.
 //
 func (z *Int) scan(r io.ByteScanner, base int) (*Int, int, error) {
        // determine sign
index 2e01ee327dd8a9f6a0dd0292f9e65cf116e04ec6..5ba29263a6e0a9b6ab39e712c30800fb14b38011 100644 (file)
@@ -17,19 +17,34 @@ var stringTests = []struct {
        val  int64
        ok   bool
 }{
+       // invalid inputs
        {in: ""},
        {in: "a"},
        {in: "z"},
        {in: "+"},
        {in: "-"},
        {in: "0b"},
+       {in: "0o"},
        {in: "0x"},
+       {in: "0y"},
        {in: "2", base: 2},
        {in: "0b2", base: 0},
        {in: "08"},
        {in: "8", base: 8},
        {in: "0xg", base: 0},
        {in: "g", base: 16},
+
+       // invalid inputs with separators
+       // (smoke tests only - a comprehensive set of tests is in natconv_test.go)
+       {in: "_"},
+       {in: "0_"},
+       {in: "_0"},
+       {in: "-1__0"},
+       {in: "0x10_"},
+       {in: "1_000", base: 10}, // separators are not permitted for bases != 0
+       {in: "d_e_a_d", base: 16},
+
+       // valid inputs
        {"0", "0", 0, 0, true},
        {"0", "0", 10, 0, true},
        {"0", "0", 16, 0, true},
@@ -40,6 +55,8 @@ var stringTests = []struct {
        {"10", "10", 16, 16, true},
        {"-10", "-10", 16, -16, true},
        {"+10", "10", 16, 16, true},
+       {"0b10", "2", 0, 2, true},
+       {"0o10", "8", 0, 8, true},
        {"0x10", "16", 0, 16, true},
        {in: "0x10", base: 16},
        {"-0x10", "-16", 0, -16, true},
@@ -60,6 +77,13 @@ var stringTests = []struct {
        {"A", "A", 37, 36, true},
        {"ABCXYZ", "abcxyz", 36, 623741435, true},
        {"ABCXYZ", "ABCXYZ", 62, 33536793425, true},
+
+       // valid input with separators
+       // (smoke tests only - a comprehensive set of tests is in natconv_test.go)
+       {"1_000", "1000", 0, 1000, true},
+       {"0b_1010", "10", 0, 10, true},
+       {"+0o_660", "432", 0, 0660, true},
+       {"-0xF00D_1E", "-15731998", 0, -0xf00d1e, true},
 }
 
 func TestIntText(t *testing.T) {
@@ -214,8 +238,12 @@ var formatTests = []struct {
        {"10", "%y", "%!y(big.Int=10)"},
        {"-10", "%y", "%!y(big.Int=-10)"},
 
-       {"10", "%#b", "1010"},
+       {"10", "%#b", "0b1010"},
        {"10", "%#o", "012"},
+       {"10", "%O", "0o12"},
+       {"-10", "%#b", "-0b1010"},
+       {"-10", "%#o", "-012"},
+       {"-10", "%O", "-0o12"},
        {"10", "%#d", "10"},
        {"10", "%#v", "10"},
        {"10", "%#x", "0xa"},
index 1e4a3b09cf77166ad69260d585e4c492c99a490a..22d7a6cac0648cf15267f40d074712e4f15aab26 100644 (file)
@@ -35,9 +35,10 @@ import (
 type nat []Word
 
 var (
-       natOne = nat{1}
-       natTwo = nat{2}
-       natTen = nat{10}
+       natOne  = nat{1}
+       natTwo  = nat{2}
+       natFive = nat{5}
+       natTen  = nat{10}
 )
 
 func (z nat) clear() {
@@ -1345,7 +1346,7 @@ func (z nat) sqrt(x nat) nat {
        var z1, z2 nat
        z1 = z
        z1 = z1.setUint64(1)
-       z1 = z1.shl(z1, uint(x.bitLen()/2+1)) // must be ≥ √x
+       z1 = z1.shl(z1, uint(x.bitLen()+1)/2) // must be ≥ √x
        for n := 0; ; n++ {
                z2, _ = z2.div(nil, x, z1)
                z2 = z2.add(z2, z1)
index 21ccbd6cfafcb42c1fe215bd32289c609d0b52e6..42d1cccf6f8cf009eefc5b38ac4ed8eafb52428d 100644 (file)
@@ -55,31 +55,46 @@ func pow(x Word, n int) (p Word) {
        return
 }
 
+// scan errors
+var (
+       errNoDigits = errors.New("number has no digits")
+       errInvalSep = errors.New("'_' must separate successive digits")
+)
+
 // scan scans the number corresponding to the longest possible prefix
 // from r representing an unsigned number in a given conversion base.
-// It returns the corresponding natural number res, the actual base b,
+// scan returns the corresponding natural number res, the actual base b,
 // a digit count, and a read or syntax error err, if any.
 //
-//     number   = [ prefix ] mantissa .
-//     prefix   = "0" [ "x" | "X" | "b" | "B" ] .
-//     mantissa = digits | digits "." [ digits ] | "." digits .
-//     digits   = digit { digit } .
-//     digit    = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
+// For base 0, an underscore character ``_'' may appear between a base
+// prefix and an adjacent digit, and between successive digits; such
+// underscores do not change the value of the number, or the returned
+// digit count. Incorrect placement of underscores is reported as an
+// error if there are no other errors. If base != 0, underscores are
+// not recognized and thus terminate scanning like any other character
+// that is not a valid radix point or digit.
+//
+//     number    = mantissa | prefix pmantissa .
+//     prefix    = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] .
+//     mantissa  = digits "." [ digits ] | digits | "." digits .
+//     pmantissa = [ "_" ] digits "." [ digits ] | [ "_" ] digits | "." digits .
+//     digits    = digit { [ "_" ] digit } .
+//     digit     = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
 //
 // Unless fracOk is set, the base argument must be 0 or a value between
 // 2 and MaxBase. If fracOk is set, the base argument must be one of
-// 0, 2, 10, or 16. Providing an invalid base argument leads to a run-
+// 0, 2, 8, 10, or 16. Providing an invalid base argument leads to a run-
 // time panic.
 //
 // For base 0, the number prefix determines the actual base: A prefix of
-// ``0x'' or ``0X'' selects base 16; if fracOk is not set, the ``0'' prefix
-// selects base 8, and a ``0b'' or ``0B'' prefix selects base 2. Otherwise
+// ``0b'' or ``0B'' selects base 2, ``0o'' or ``0O'' selects base 8, and
+// ``0x'' or ``0X'' selects base 16. If fracOk is false, a ``0'' prefix
+// (immediately followed by digits) selects base 8 as well. Otherwise,
 // the selected base is 10 and no prefix is accepted.
 //
-// If fracOk is set, an octal prefix is ignored (a leading ``0'' simply
-// stands for a zero digit), and a period followed by a fractional part
-// is permitted. The result value is computed as if there were no period
-// present; and the count value is used to determine the fractional part.
+// If fracOk is set, a period followed by a fractional part is permitted.
+// The result value is computed as if there were no period present; and
+// the count value is used to determine the fractional part.
 //
 // For bases <= 36, lower and upper case letters are considered the same:
 // The letters 'a' to 'z' and 'A' to 'Z' represent digit values 10 to 35.
@@ -92,57 +107,53 @@ func pow(x Word, n int) (p Word) {
 // In this case, the actual value of the scanned number is res * b**count.
 //
 func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count int, err error) {
-       // reject illegal bases
+       // reject invalid bases
        baseOk := base == 0 ||
                !fracOk && 2 <= base && base <= MaxBase ||
-               fracOk && (base == 2 || base == 10 || base == 16)
+               fracOk && (base == 2 || base == 8 || base == 10 || base == 16)
        if !baseOk {
-               panic(fmt.Sprintf("illegal number base %d", base))
+               panic(fmt.Sprintf("invalid number base %d", base))
        }
 
+       // prev encodes the previously seen char: it is one
+       // of '_', '0' (a digit), or '.' (anything else). A
+       // valid separator '_' may only occur after a digit
+       // and if base == 0.
+       prev := '.'
+       invalSep := false
+
        // one char look-ahead
        ch, err := r.ReadByte()
-       if err != nil {
-               return
-       }
 
        // determine actual base
-       b = base
+       b, prefix := base, 0
        if base == 0 {
                // actual base is 10 unless there's a base prefix
                b = 10
-               if ch == '0' {
+               if err == nil && ch == '0' {
+                       prev = '0'
                        count = 1
-                       switch ch, err = r.ReadByte(); err {
-                       case nil:
-                               // possibly one of 0x, 0X, 0b, 0B
-                               if !fracOk {
-                                       b = 8
-                               }
+                       ch, err = r.ReadByte()
+                       if err == nil {
+                               // possibly one of 0b, 0B, 0o, 0O, 0x, 0X
                                switch ch {
-                               case 'x', 'X':
-                                       b = 16
                                case 'b', 'B':
-                                       b = 2
+                                       b, prefix = 2, 'b'
+                               case 'o', 'O':
+                                       b, prefix = 8, 'o'
+                               case 'x', 'X':
+                                       b, prefix = 16, 'x'
+                               default:
+                                       if !fracOk {
+                                               b, prefix = 8, '0'
+                                       }
                                }
-                               switch b {
-                               case 16, 2:
+                               if prefix != 0 {
                                        count = 0 // prefix is not counted
-                                       if ch, err = r.ReadByte(); err != nil {
-                                               // io.EOF is also an error in this case
-                                               return
+                                       if prefix != '0' {
+                                               ch, err = r.ReadByte()
                                        }
-                               case 8:
-                                       count = 0 // prefix is not counted
                                }
-                       case io.EOF:
-                               // input is "0"
-                               res = z[:0]
-                               err = nil
-                               return
-                       default:
-                               // read error
-                               return
                        }
                }
        }
@@ -157,78 +168,76 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in
        di := Word(0)       // 0 <= di < b1**i < bn
        i := 0              // 0 <= i < n
        dp := -1            // position of decimal point
-       for {
-               if fracOk && ch == '.' {
+       for err == nil {
+               if ch == '.' && fracOk {
                        fracOk = false
+                       if prev == '_' {
+                               invalSep = true
+                       }
+                       prev = '.'
                        dp = count
-                       // advance
-                       if ch, err = r.ReadByte(); err != nil {
-                               if err == io.EOF {
-                                       err = nil
-                                       break
+               } else if ch == '_' && base == 0 {
+                       if prev != '0' {
+                               invalSep = true
+                       }
+                       prev = '_'
+               } else {
+                       // convert rune into digit value d1
+                       var d1 Word
+                       switch {
+                       case '0' <= ch && ch <= '9':
+                               d1 = Word(ch - '0')
+                       case 'a' <= ch && ch <= 'z':
+                               d1 = Word(ch - 'a' + 10)
+                       case 'A' <= ch && ch <= 'Z':
+                               if b <= maxBaseSmall {
+                                       d1 = Word(ch - 'A' + 10)
+                               } else {
+                                       d1 = Word(ch - 'A' + maxBaseSmall)
                                }
-                               return
+                       default:
+                               d1 = MaxBase + 1
                        }
-               }
+                       if d1 >= b1 {
+                               r.UnreadByte() // ch does not belong to number anymore
+                               break
+                       }
+                       prev = '0'
+                       count++
 
-               // convert rune into digit value d1
-               var d1 Word
-               switch {
-               case '0' <= ch && ch <= '9':
-                       d1 = Word(ch - '0')
-               case 'a' <= ch && ch <= 'z':
-                       d1 = Word(ch - 'a' + 10)
-               case 'A' <= ch && ch <= 'Z':
-                       if b <= maxBaseSmall {
-                               d1 = Word(ch - 'A' + 10)
-                       } else {
-                               d1 = Word(ch - 'A' + maxBaseSmall)
+                       // collect d1 in di
+                       di = di*b1 + d1
+                       i++
+
+                       // if di is "full", add it to the result
+                       if i == n {
+                               z = z.mulAddWW(z, bn, di)
+                               di = 0
+                               i = 0
                        }
-               default:
-                       d1 = MaxBase + 1
                }
-               if d1 >= b1 {
-                       r.UnreadByte() // ch does not belong to number anymore
-                       break
-               }
-               count++
 
-               // collect d1 in di
-               di = di*b1 + d1
-               i++
+               ch, err = r.ReadByte()
+       }
 
-               // if di is "full", add it to the result
-               if i == n {
-                       z = z.mulAddWW(z, bn, di)
-                       di = 0
-                       i = 0
-               }
+       if err == io.EOF {
+               err = nil
+       }
 
-               // advance
-               if ch, err = r.ReadByte(); err != nil {
-                       if err == io.EOF {
-                               err = nil
-                               break
-                       }
-                       return
-               }
+       // other errors take precedence over invalid separators
+       if err == nil && (invalSep || prev == '_') {
+               err = errInvalSep
        }
 
        if count == 0 {
                // no digits found
-               switch {
-               case base == 0 && b == 8:
-                       // there was only the octal prefix 0 (possibly followed by digits > 7);
-                       // count as one digit and return base 10, not 8
-                       count = 1
-                       b = 10
-               case base != 0 || b != 8:
-                       // there was neither a mantissa digit nor the octal prefix 0
-                       err = errors.New("syntax error scanning number")
+               if prefix == '0' {
+                       // there was only the octal prefix 0 (possibly followed by separators and digits > 7);
+                       // interpret as decimal 0
+                       return z[:0], 10, 1, err
                }
-               return
+               err = errNoDigits // fall through; result will be 0
        }
-       // count > 0
 
        // add remaining digits to result
        if i > 0 {
@@ -236,9 +245,9 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in
        }
        res = z.norm()
 
-       // adjust for fraction, if any
+       // adjust count for fraction, if any
        if dp >= 0 {
-               // 0 <= dp <= count > 0
+               // 0 <= dp <= count
                count = dp - count
        }
 
index 9f38bd94bbab985743f49cd2cd4b35def051956b..d39027210851529a124f9dcc1b827124243693b8 100644 (file)
@@ -109,71 +109,126 @@ var natScanTests = []struct {
        x     nat    // expected nat
        b     int    // expected base
        count int    // expected digit count
-       ok    bool   // expected success
+       err   error  // expected error
        next  rune   // next character (or 0, if at EOF)
 }{
-       // error: no mantissa
-       {},
-       {s: "?"},
-       {base: 10},
-       {base: 36},
-       {base: 62},
-       {s: "?", base: 10},
-       {s: "0x"},
-       {s: "345", base: 2},
-
-       // error: incorrect use of decimal point
-       {s: ".0"},
-       {s: ".0", base: 10},
-       {s: ".", base: 0},
-       {s: "0x.0"},
-
-       // no errors
-       {"0", 0, false, nil, 10, 1, true, 0},
-       {"0", 10, false, nil, 10, 1, true, 0},
-       {"0", 36, false, nil, 36, 1, true, 0},
-       {"0", 62, false, nil, 62, 1, true, 0},
-       {"1", 0, false, nat{1}, 10, 1, true, 0},
-       {"1", 10, false, nat{1}, 10, 1, true, 0},
-       {"0 ", 0, false, nil, 10, 1, true, ' '},
-       {"08", 0, false, nil, 10, 1, true, '8'},
-       {"08", 10, false, nat{8}, 10, 2, true, 0},
-       {"018", 0, false, nat{1}, 8, 1, true, '8'},
-       {"0b1", 0, false, nat{1}, 2, 1, true, 0},
-       {"0b11000101", 0, false, nat{0xc5}, 2, 8, true, 0},
-       {"03271", 0, false, nat{03271}, 8, 4, true, 0},
-       {"10ab", 0, false, nat{10}, 10, 2, true, 'a'},
-       {"1234567890", 0, false, nat{1234567890}, 10, 10, true, 0},
-       {"A", 36, false, nat{10}, 36, 1, true, 0},
-       {"A", 37, false, nat{36}, 37, 1, true, 0},
-       {"xyz", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, 0},
-       {"XYZ?", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, '?'},
-       {"XYZ?", 62, false, nat{(59*62+60)*62 + 61}, 62, 3, true, '?'},
-       {"0x", 16, false, nil, 16, 1, true, 'x'},
-       {"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, true, 0},
-       {"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, true, 0},
-
-       // no errors, decimal point
-       {"0.", 0, false, nil, 10, 1, true, '.'},
-       {"0.", 10, true, nil, 10, 0, true, 0},
-       {"0.1.2", 10, true, nat{1}, 10, -1, true, '.'},
-       {".000", 10, true, nil, 10, -3, true, 0},
-       {"12.3", 10, true, nat{123}, 10, -1, true, 0},
-       {"012.345", 10, true, nat{12345}, 10, -3, true, 0},
+       // invalid: no digits
+       {"", 0, false, nil, 10, 0, errNoDigits, 0},
+       {"_", 0, false, nil, 10, 0, errNoDigits, 0},
+       {"?", 0, false, nil, 10, 0, errNoDigits, '?'},
+       {"?", 10, false, nil, 10, 0, errNoDigits, '?'},
+       {"", 10, false, nil, 10, 0, errNoDigits, 0},
+       {"", 36, false, nil, 36, 0, errNoDigits, 0},
+       {"", 62, false, nil, 62, 0, errNoDigits, 0},
+       {"0b", 0, false, nil, 2, 0, errNoDigits, 0},
+       {"0o", 0, false, nil, 8, 0, errNoDigits, 0},
+       {"0x", 0, false, nil, 16, 0, errNoDigits, 0},
+       {"0x_", 0, false, nil, 16, 0, errNoDigits, 0},
+       {"0b2", 0, false, nil, 2, 0, errNoDigits, '2'},
+       {"0B2", 0, false, nil, 2, 0, errNoDigits, '2'},
+       {"0o8", 0, false, nil, 8, 0, errNoDigits, '8'},
+       {"0O8", 0, false, nil, 8, 0, errNoDigits, '8'},
+       {"0xg", 0, false, nil, 16, 0, errNoDigits, 'g'},
+       {"0Xg", 0, false, nil, 16, 0, errNoDigits, 'g'},
+       {"345", 2, false, nil, 2, 0, errNoDigits, '3'},
+
+       // invalid: incorrect use of decimal point
+       {"._", 0, true, nil, 10, 0, errNoDigits, 0},
+       {".0", 0, false, nil, 10, 0, errNoDigits, '.'},
+       {".0", 10, false, nil, 10, 0, errNoDigits, '.'},
+       {".", 0, true, nil, 10, 0, errNoDigits, 0},
+       {"0x.", 0, true, nil, 16, 0, errNoDigits, 0},
+       {"0x.g", 0, true, nil, 16, 0, errNoDigits, 'g'},
+       {"0x.0", 0, false, nil, 16, 0, errNoDigits, '.'},
+
+       // invalid: incorrect use of separators
+       {"_0", 0, false, nil, 10, 1, errInvalSep, 0},
+       {"0_", 0, false, nil, 10, 1, errInvalSep, 0},
+       {"0__0", 0, false, nil, 8, 1, errInvalSep, 0},
+       {"0x___0", 0, false, nil, 16, 1, errInvalSep, 0},
+       {"0_x", 0, false, nil, 10, 1, errInvalSep, 'x'},
+       {"0_8", 0, false, nil, 10, 1, errInvalSep, '8'},
+       {"123_.", 0, true, nat{123}, 10, 0, errInvalSep, 0},
+       {"._123", 0, true, nat{123}, 10, -3, errInvalSep, 0},
+       {"0b__1000", 0, false, nat{0x8}, 2, 4, errInvalSep, 0},
+       {"0o60___0", 0, false, nat{0600}, 8, 3, errInvalSep, 0},
+       {"0466_", 0, false, nat{0466}, 8, 3, errInvalSep, 0},
+       {"01234567_8", 0, false, nat{01234567}, 8, 7, errInvalSep, '8'},
+       {"1_.", 0, true, nat{1}, 10, 0, errInvalSep, 0},
+       {"0._1", 0, true, nat{1}, 10, -1, errInvalSep, 0},
+       {"2.7_", 0, true, nat{27}, 10, -1, errInvalSep, 0},
+       {"0x1.0_", 0, true, nat{0x10}, 16, -1, errInvalSep, 0},
+
+       // valid: separators are not accepted for base != 0
+       {"0_", 10, false, nil, 10, 1, nil, '_'},
+       {"1__0", 10, false, nat{1}, 10, 1, nil, '_'},
+       {"0__8", 10, false, nil, 10, 1, nil, '_'},
+       {"xy_z_", 36, false, nat{33*36 + 34}, 36, 2, nil, '_'},
+
+       // valid, no decimal point
+       {"0", 0, false, nil, 10, 1, nil, 0},
+       {"0", 36, false, nil, 36, 1, nil, 0},
+       {"0", 62, false, nil, 62, 1, nil, 0},
+       {"1", 0, false, nat{1}, 10, 1, nil, 0},
+       {"1", 10, false, nat{1}, 10, 1, nil, 0},
+       {"0 ", 0, false, nil, 10, 1, nil, ' '},
+       {"00 ", 0, false, nil, 8, 1, nil, ' '}, // octal 0
+       {"0b1", 0, false, nat{1}, 2, 1, nil, 0},
+       {"0B11000101", 0, false, nat{0xc5}, 2, 8, nil, 0},
+       {"0B110001012", 0, false, nat{0xc5}, 2, 8, nil, '2'},
+       {"07", 0, false, nat{7}, 8, 1, nil, 0},
+       {"08", 0, false, nil, 10, 1, nil, '8'},
+       {"08", 10, false, nat{8}, 10, 2, nil, 0},
+       {"018", 0, false, nat{1}, 8, 1, nil, '8'},
+       {"0o7", 0, false, nat{7}, 8, 1, nil, 0},
+       {"0o18", 0, false, nat{1}, 8, 1, nil, '8'},
+       {"0O17", 0, false, nat{017}, 8, 2, nil, 0},
+       {"03271", 0, false, nat{03271}, 8, 4, nil, 0},
+       {"10ab", 0, false, nat{10}, 10, 2, nil, 'a'},
+       {"1234567890", 0, false, nat{1234567890}, 10, 10, nil, 0},
+       {"A", 36, false, nat{10}, 36, 1, nil, 0},
+       {"A", 37, false, nat{36}, 37, 1, nil, 0},
+       {"xyz", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, nil, 0},
+       {"XYZ?", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, nil, '?'},
+       {"XYZ?", 62, false, nat{(59*62+60)*62 + 61}, 62, 3, nil, '?'},
+       {"0x", 16, false, nil, 16, 1, nil, 'x'},
+       {"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, nil, 0},
+       {"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, nil, 0},
+
+       // valid, with decimal point
+       {"0.", 0, false, nil, 10, 1, nil, '.'},
+       {"0.", 10, true, nil, 10, 0, nil, 0},
+       {"0.1.2", 10, true, nat{1}, 10, -1, nil, '.'},
+       {".000", 10, true, nil, 10, -3, nil, 0},
+       {"12.3", 10, true, nat{123}, 10, -1, nil, 0},
+       {"012.345", 10, true, nat{12345}, 10, -3, nil, 0},
+       {"0.1", 0, true, nat{1}, 10, -1, nil, 0},
+       {"0.1", 2, true, nat{1}, 2, -1, nil, 0},
+       {"0.12", 2, true, nat{1}, 2, -1, nil, '2'},
+       {"0b0.1", 0, true, nat{1}, 2, -1, nil, 0},
+       {"0B0.12", 0, true, nat{1}, 2, -1, nil, '2'},
+       {"0o0.7", 0, true, nat{7}, 8, -1, nil, 0},
+       {"0O0.78", 0, true, nat{7}, 8, -1, nil, '8'},
+       {"0xdead.beef", 0, true, nat{0xdeadbeef}, 16, -4, nil, 0},
+
+       // valid, with separators
+       {"1_000", 0, false, nat{1000}, 10, 4, nil, 0},
+       {"0_466", 0, false, nat{0466}, 8, 3, nil, 0},
+       {"0o_600", 0, false, nat{0600}, 8, 3, nil, 0},
+       {"0x_f0_0d", 0, false, nat{0xf00d}, 16, 4, nil, 0},
+       {"0b1000_0001", 0, false, nat{0x81}, 2, 8, nil, 0},
+       {"1_000.000_1", 0, true, nat{10000001}, 10, -4, nil, 0},
+       {"0x_f00d.1e", 0, true, nat{0xf00d1e}, 16, -2, nil, 0},
+       {"0x_f00d.1E2", 0, true, nat{0xf00d1e2}, 16, -3, nil, 0},
+       {"0x_f00d.1eg", 0, true, nat{0xf00d1e}, 16, -2, nil, 'g'},
 }
 
 func TestScanBase(t *testing.T) {
        for _, a := range natScanTests {
                r := strings.NewReader(a.s)
                x, b, count, err := nat(nil).scan(r, a.base, a.frac)
-               if err == nil && !a.ok {
-                       t.Errorf("scan%+v\n\texpected error", a)
-               }
-               if err != nil {
-                       if a.ok {
-                               t.Errorf("scan%+v\n\tgot error = %s", a, err)
-                       }
-                       continue
+               if err != a.err {
+                       t.Errorf("scan%+v\n\tgot error = %v; want %v", a, err, a.err)
                }
                if x.cmp(a.x) != 0 {
                        t.Errorf("scan%+v\n\tgot z = %v; want %v", a, x, a.x)
@@ -391,6 +446,9 @@ func TestStringPowers(t *testing.T) {
        var p Word
        for b := 2; b <= 16; b++ {
                for p = 0; p <= 512; p++ {
+                       if testing.Short() && p > 10 {
+                               break
+                       }
                        x := nat(nil).expWW(Word(b), p)
                        xs := x.utoa(b)
                        xs2 := itoa(x, b)
index bf50f344192079a265e874527938ec0499c5339c..8596e33a13b86480df855ec7626a7891edb8b76b 100644 (file)
@@ -125,11 +125,11 @@ func cutSpace(r rune) rune {
 func TestProbablyPrime(t *testing.T) {
        nreps := 20
        if testing.Short() {
-               nreps = 3
+               nreps = 1
        }
        for i, s := range primes {
                p, _ := new(Int).SetString(s, 10)
-               if !p.ProbablyPrime(nreps) || !p.ProbablyPrime(1) || !p.ProbablyPrime(0) {
+               if !p.ProbablyPrime(nreps) || nreps != 1 && !p.ProbablyPrime(1) || !p.ProbablyPrime(0) {
                        t.Errorf("#%d prime found to be non-prime (%s)", i, s)
                }
        }
@@ -137,7 +137,7 @@ func TestProbablyPrime(t *testing.T) {
        for i, s := range composites {
                s = strings.Map(cutSpace, s)
                c, _ := new(Int).SetString(s, 10)
-               if c.ProbablyPrime(nreps) || c.ProbablyPrime(1) || c.ProbablyPrime(0) {
+               if c.ProbablyPrime(nreps) || nreps != 1 && c.ProbablyPrime(1) || c.ProbablyPrime(0) {
                        t.Errorf("#%d composite found to be prime (%s)", i, s)
                }
        }
@@ -197,6 +197,14 @@ func TestLucasPseudoprimes(t *testing.T) {
 func testPseudoprimes(t *testing.T, name string, cond func(nat) bool, want []int) {
        n := nat{1}
        for i := 3; i < 100000; i += 2 {
+               if testing.Short() {
+                       if len(want) == 0 {
+                               break
+                       }
+                       if i < want[0]-2 {
+                               i = want[0] - 2
+                       }
+               }
                n[0] = Word(i)
                pseudo := cond(n)
                if pseudo && (len(want) == 0 || i != want[0]) {
index 5d0800ca936b2952016f60b90bcd760a674d6c6a..c8bf698b184970a82a934e7566385be759865f3d 100644 (file)
@@ -339,6 +339,13 @@ func (z *Rat) SetInt64(x int64) *Rat {
        return z
 }
 
+// SetUint64 sets z to x and returns z.
+func (z *Rat) SetUint64(x uint64) *Rat {
+       z.a.SetUint64(x)
+       z.b.abs = z.b.abs[:0]
+       return z
+}
+
 // Set sets z to x (by making a copy of x) and returns z.
 func (z *Rat) Set(x *Rat) *Rat {
        if z != x {
@@ -455,16 +462,15 @@ func mulDenom(z, x, y nat) nat {
        return z.mul(x, y)
 }
 
-// scaleDenom computes x*f.
-// If f == 0 (zero value of denominator), the result is (a copy of) x.
-func scaleDenom(x *Int, f nat) *Int {
-       var z Int
+// scaleDenom sets z to the product x*f.
+// If f == 0 (zero value of denominator), z is set to (a copy of) x.
+func (z *Int) scaleDenom(x *Int, f nat) {
        if len(f) == 0 {
-               return z.Set(x)
+               z.Set(x)
+               return
        }
        z.abs = z.abs.mul(x.abs, f)
        z.neg = x.neg
-       return &z
 }
 
 // Cmp compares x and y and returns:
@@ -474,23 +480,28 @@ func scaleDenom(x *Int, f nat) *Int {
 //   +1 if x >  y
 //
 func (x *Rat) Cmp(y *Rat) int {
-       return scaleDenom(&x.a, y.b.abs).Cmp(scaleDenom(&y.a, x.b.abs))
+       var a, b Int
+       a.scaleDenom(&x.a, y.b.abs)
+       b.scaleDenom(&y.a, x.b.abs)
+       return a.Cmp(&b)
 }
 
 // Add sets z to the sum x+y and returns z.
 func (z *Rat) Add(x, y *Rat) *Rat {
-       a1 := scaleDenom(&x.a, y.b.abs)
-       a2 := scaleDenom(&y.a, x.b.abs)
-       z.a.Add(a1, a2)
+       var a1, a2 Int
+       a1.scaleDenom(&x.a, y.b.abs)
+       a2.scaleDenom(&y.a, x.b.abs)
+       z.a.Add(&a1, &a2)
        z.b.abs = mulDenom(z.b.abs, x.b.abs, y.b.abs)
        return z.norm()
 }
 
 // Sub sets z to the difference x-y and returns z.
 func (z *Rat) Sub(x, y *Rat) *Rat {
-       a1 := scaleDenom(&x.a, y.b.abs)
-       a2 := scaleDenom(&y.a, x.b.abs)
-       z.a.Sub(a1, a2)
+       var a1, a2 Int
+       a1.scaleDenom(&x.a, y.b.abs)
+       a2.scaleDenom(&y.a, x.b.abs)
+       z.a.Sub(&a1, &a2)
        z.b.abs = mulDenom(z.b.abs, x.b.abs, y.b.abs)
        return z.norm()
 }
@@ -515,8 +526,9 @@ func (z *Rat) Quo(x, y *Rat) *Rat {
        if len(y.a.abs) == 0 {
                panic("division by zero")
        }
-       a := scaleDenom(&x.a, y.b.abs)
-       b := scaleDenom(&y.a, x.b.abs)
+       var a, b Int
+       a.scaleDenom(&x.a, y.b.abs)
+       b.scaleDenom(&y.a, x.b.abs)
        z.a.abs = a.abs
        z.b.abs = b.abs
        z.a.neg = a.neg != b.neg
index afda68658f7c17e36c3357c57d8673429d686cf0..83c5d5cfea163e3655860cb9eeb65d406da56bb3 100644 (file)
@@ -620,3 +620,61 @@ func TestIsFinite(t *testing.T) {
                }
        }
 }
+
+func TestRatSetInt64(t *testing.T) {
+       var testCases = []int64{
+               0,
+               1,
+               -1,
+               12345,
+               -98765,
+               math.MaxInt64,
+               math.MinInt64,
+       }
+       var r = new(Rat)
+       for i, want := range testCases {
+               r.SetInt64(want)
+               if !r.IsInt() {
+                       t.Errorf("#%d: Rat.SetInt64(%d) is not an integer", i, want)
+               }
+               num := r.Num()
+               if !num.IsInt64() {
+                       t.Errorf("#%d: Rat.SetInt64(%d) numerator is not an int64", i, want)
+               }
+               got := num.Int64()
+               if got != want {
+                       t.Errorf("#%d: Rat.SetInt64(%d) = %d, but expected %d", i, want, got, want)
+               }
+       }
+}
+
+func TestRatSetUint64(t *testing.T) {
+       var testCases = []uint64{
+               0,
+               1,
+               12345,
+               ^uint64(0),
+       }
+       var r = new(Rat)
+       for i, want := range testCases {
+               r.SetUint64(want)
+               if !r.IsInt() {
+                       t.Errorf("#%d: Rat.SetUint64(%d) is not an integer", i, want)
+               }
+               num := r.Num()
+               if !num.IsUint64() {
+                       t.Errorf("#%d: Rat.SetUint64(%d) numerator is not a uint64", i, want)
+               }
+               got := num.Uint64()
+               if got != want {
+                       t.Errorf("#%d: Rat.SetUint64(%d) = %d, but expected %d", i, want, got, want)
+               }
+       }
+}
+
+func BenchmarkRatCmp(b *testing.B) {
+       x, y := NewRat(4, 1), NewRat(7, 2)
+       for i := 0; i < b.N; i++ {
+               x.Cmp(y)
+       }
+}
index 5656280e84dabcfb0b7f4754c91ed8fc236692c7..f29ec98cdcb54a6b14b2d0aafa52e50710d76bab 100644 (file)
@@ -38,10 +38,22 @@ func (z *Rat) Scan(s fmt.ScanState, ch rune) error {
 }
 
 // SetString sets z to the value of s and returns z and a boolean indicating
-// success. s can be given as a fraction "a/b" or as a decimal floating-point
-// number optionally followed by an exponent. The entire string (not just a prefix)
-// must be valid for success. If the operation failed, the value of z is
-// undefined but the returned value is nil.
+// success. s can be given as a (possibly signed) fraction "a/b", or as a
+// floating-point number optionally followed by an exponent.
+// If a fraction is provided, both the dividend and the divisor may be a
+// decimal integer or independently use a prefix of ``0b'', ``0'' or ``0o'',
+// or ``0x'' (or their upper-case variants) to denote a binary, octal, or
+// hexadecimal integer, respectively. The divisor may not be signed.
+// If a floating-point number is provided, it may be in decimal form or
+// use any of the same prefixes as above but for ``0'' to denote a non-decimal
+// mantissa. A leading ``0'' is considered a decimal leading 0; it does not
+// indicate octal representation in this case.
+// An optional base-10 ``e'' or base-2 ``p'' (or their upper-case variants)
+// exponent may be provided as well, except for hexadecimal floats which
+// only accept an (optional) ``p'' exponent (because an ``e'' or ``E'' cannot
+// be distinguished from a mantissa digit).
+// The entire string, not just a prefix, must be valid for success. If the
+// operation failed, the value of z is undefined but the returned value is nil.
 func (z *Rat) SetString(s string) (*Rat, bool) {
        if len(s) == 0 {
                return nil, false
@@ -78,16 +90,17 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
        }
 
        // mantissa
-       // TODO(gri) allow other bases besides 10 for mantissa and exponent? (issue #29799)
-       var ecorr int
-       z.a.abs, _, ecorr, err = z.a.abs.scan(r, 10, true)
+       var base int
+       var fcount int // fractional digit count; valid if <= 0
+       z.a.abs, base, fcount, err = z.a.abs.scan(r, 0, true)
        if err != nil {
                return nil, false
        }
 
        // exponent
        var exp int64
-       exp, _, err = scanExponent(r, false)
+       var ebase int
+       exp, ebase, err = scanExponent(r, true, true)
        if err != nil {
                return nil, false
        }
@@ -103,101 +116,178 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
        }
        // len(z.a.abs) > 0
 
-       // correct exponent
-       if ecorr < 0 {
-               exp += int64(ecorr)
+       // The mantissa may have a radix point (fcount <= 0) and there
+       // may be a nonzero exponent exp. The radix point amounts to a
+       // division by base**(-fcount), which equals a multiplication by
+       // base**fcount. An exponent means multiplication by ebase**exp.
+       // Multiplications are commutative, so we can apply them in any
+       // order. We only have powers of 2 and 10, and we split powers
+       // of 10 into the product of the same powers of 2 and 5. This
+       // may reduce the the size of shift/multiplication factors or
+       // divisors required to create the final fraction, depending
+       // on the actual floating-point value.
+
+       // determine binary or decimal exponent contribution of radix point
+       var exp2, exp5 int64
+       if fcount < 0 {
+               // The mantissa has a radix point ddd.dddd; and
+               // -fcount is the number of digits to the right
+               // of '.'. Adjust relevant exponent accordingly.
+               d := int64(fcount)
+               switch base {
+               case 10:
+                       exp5 = d
+                       fallthrough // 10**e == 5**e * 2**e
+               case 2:
+                       exp2 = d
+               case 8:
+                       exp2 = d * 3 // octal digits are 3 bits each
+               case 16:
+                       exp2 = d * 4 // hexadecimal digits are 4 bits each
+               default:
+                       panic("unexpected mantissa base")
+               }
+               // fcount consumed - not needed anymore
        }
 
-       // compute exponent power
-       expabs := exp
-       if expabs < 0 {
-               expabs = -expabs
+       // take actual exponent into account
+       switch ebase {
+       case 10:
+               exp5 += exp
+               fallthrough // see fallthrough above
+       case 2:
+               exp2 += exp
+       default:
+               panic("unexpected exponent base")
        }
-       powTen := nat(nil).expNN(natTen, nat(nil).setWord(Word(expabs)), nil)
-
-       // complete fraction
-       if exp < 0 {
-               z.b.abs = powTen
-               z.norm()
+       // exp consumed - not needed anymore
+
+       // apply exp5 contributions
+       // (start with exp5 so the numbers to multiply are smaller)
+       if exp5 != 0 {
+               n := exp5
+               if n < 0 {
+                       n = -n
+               }
+               pow5 := z.b.abs.expNN(natFive, nat(nil).setWord(Word(n)), nil) // use underlying array of z.b.abs
+               if exp5 > 0 {
+                       z.a.abs = z.a.abs.mul(z.a.abs, pow5)
+                       z.b.abs = z.b.abs.setWord(1)
+               } else {
+                       z.b.abs = pow5
+               }
        } else {
-               z.a.abs = z.a.abs.mul(z.a.abs, powTen)
-               z.b.abs = z.b.abs[:0]
+               z.b.abs = z.b.abs.setWord(1)
+       }
+
+       // apply exp2 contributions
+       if exp2 > 0 {
+               if int64(uint(exp2)) != exp2 {
+                       panic("exponent too large")
+               }
+               z.a.abs = z.a.abs.shl(z.a.abs, uint(exp2))
+       } else if exp2 < 0 {
+               if int64(uint(-exp2)) != -exp2 {
+                       panic("exponent too large")
+               }
+               z.b.abs = z.b.abs.shl(z.b.abs, uint(-exp2))
        }
 
        z.a.neg = neg && len(z.a.abs) > 0 // 0 has no sign
 
-       return z, true
+       return z.norm(), true
 }
 
-// scanExponent scans the longest possible prefix of r representing a decimal
-// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the
-// exponent base (10 or 2), or a read or syntax error, if any.
+// scanExponent scans the longest possible prefix of r representing a base 10
+// (``e'', ``E'') or a base 2 (``p'', ``P'') exponent, if any. It returns the
+// exponent, the exponent base (10 or 2), or a read or syntax error, if any.
+//
+// If sepOk is set, an underscore character ``_'' may appear between successive
+// exponent digits; such underscores do not change the value of the exponent.
+// Incorrect placement of underscores is reported as an error if there are no
+// other errors. If sepOk is not set, underscores are not recognized and thus
+// terminate scanning like any other character that is not a valid digit.
 //
-//     exponent = ( "E" | "e" | "p" ) [ sign ] digits .
+//     exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits .
 //     sign     = "+" | "-" .
-//     digits   = digit { digit } .
+//     digits   = digit { [ '_' ] digit } .
 //     digit    = "0" ... "9" .
 //
-// A binary exponent is only permitted if binExpOk is set.
-func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err error) {
-       base = 10
-
-       var ch byte
-       if ch, err = r.ReadByte(); err != nil {
+// A base 2 exponent is only permitted if base2ok is set.
+func scanExponent(r io.ByteScanner, base2ok, sepOk bool) (exp int64, base int, err error) {
+       // one char look-ahead
+       ch, err := r.ReadByte()
+       if err != nil {
                if err == io.EOF {
-                       err = nil // no exponent; same as e0
+                       err = nil
                }
-               return
+               return 0, 10, err
        }
 
+       // exponent char
        switch ch {
        case 'e', 'E':
-               // ok
-       case 'p':
-               if binExpOk {
+               base = 10
+       case 'p', 'P':
+               if base2ok {
                        base = 2
                        break // ok
                }
                fallthrough // binary exponent not permitted
        default:
-               r.UnreadByte()
-               return // no exponent; same as e0
-       }
-
-       var neg bool
-       if neg, err = scanSign(r); err != nil {
-               return
+               r.UnreadByte() // ch does not belong to exponent anymore
+               return 0, 10, nil
        }
 
+       // sign
        var digits []byte
-       if neg {
-               digits = append(digits, '-')
+       ch, err = r.ReadByte()
+       if err == nil && (ch == '+' || ch == '-') {
+               if ch == '-' {
+                       digits = append(digits, '-')
+               }
+               ch, err = r.ReadByte()
        }
 
-       // no need to use nat.scan for exponent digits
-       // since we only care about int64 values - the
-       // from-scratch scan is easy enough and faster
-       for i := 0; ; i++ {
-               if ch, err = r.ReadByte(); err != nil {
-                       if err != io.EOF || i == 0 {
-                               return
-                       }
-                       err = nil
-                       break // i > 0
-               }
-               if ch < '0' || '9' < ch {
-                       if i == 0 {
-                               r.UnreadByte()
-                               err = fmt.Errorf("invalid exponent (missing digits)")
-                               return
+       // prev encodes the previously seen char: it is one
+       // of '_', '0' (a digit), or '.' (anything else). A
+       // valid separator '_' may only occur after a digit.
+       prev := '.'
+       invalSep := false
+
+       // exponent value
+       hasDigits := false
+       for err == nil {
+               if '0' <= ch && ch <= '9' {
+                       digits = append(digits, ch)
+                       prev = '0'
+                       hasDigits = true
+               } else if ch == '_' && sepOk {
+                       if prev != '0' {
+                               invalSep = true
                        }
-                       break // i > 0
+                       prev = '_'
+               } else {
+                       r.UnreadByte() // ch does not belong to number anymore
+                       break
                }
-               digits = append(digits, ch)
+               ch, err = r.ReadByte()
+       }
+
+       if err == io.EOF {
+               err = nil
+       }
+       if err == nil && !hasDigits {
+               err = errNoDigits
+       }
+       if err == nil {
+               exp, err = strconv.ParseInt(string(digits), 10, 64)
+       }
+       // other errors take precedence over invalid separators
+       if err == nil && (invalSep || prev == '_') {
+               err = errInvalSep
        }
-       // i > 0 => we have at least one digit
 
-       exp, err = strconv.ParseInt(string(digits), 10, 64)
        return
 }
 
@@ -229,7 +319,7 @@ func (x *Rat) RatString() string {
 }
 
 // FloatString returns a string representation of x in decimal form with prec
-// digits of precision after the decimal point. The last digit is rounded to
+// digits of precision after the radix point. The last digit is rounded to
 // nearest, with halves rounded away from zero.
 func (x *Rat) FloatString(prec int) string {
        var buf []byte
index fe8b8b60af608e4743299618f48e935ba78a3763..ba0d1ba9e11580d0cd340f40bc17d7a61a20fb36 100644 (file)
@@ -7,25 +7,91 @@ package big
 import (
        "bytes"
        "fmt"
+       "io"
        "math"
        "strconv"
        "strings"
        "testing"
 )
 
+var exponentTests = []struct {
+       s       string // string to be scanned
+       base2ok bool   // true if 'p'/'P' exponents are accepted
+       sepOk   bool   // true if '_' separators are accepted
+       x       int64  // expected exponent
+       b       int    // expected exponent base
+       err     error  // expected error
+       next    rune   // next character (or 0, if at EOF)
+}{
+       // valid, without separators
+       {"", false, false, 0, 10, nil, 0},
+       {"1", false, false, 0, 10, nil, '1'},
+       {"e0", false, false, 0, 10, nil, 0},
+       {"E1", false, false, 1, 10, nil, 0},
+       {"e+10", false, false, 10, 10, nil, 0},
+       {"e-10", false, false, -10, 10, nil, 0},
+       {"e123456789a", false, false, 123456789, 10, nil, 'a'},
+       {"p", false, false, 0, 10, nil, 'p'},
+       {"P+100", false, false, 0, 10, nil, 'P'},
+       {"p0", true, false, 0, 2, nil, 0},
+       {"P-123", true, false, -123, 2, nil, 0},
+       {"p+0a", true, false, 0, 2, nil, 'a'},
+       {"p+123__", true, false, 123, 2, nil, '_'}, // '_' is not part of the number anymore
+
+       // valid, with separators
+       {"e+1_0", false, true, 10, 10, nil, 0},
+       {"e-1_0", false, true, -10, 10, nil, 0},
+       {"e123_456_789a", false, true, 123456789, 10, nil, 'a'},
+       {"P+1_00", false, true, 0, 10, nil, 'P'},
+       {"p-1_2_3", true, true, -123, 2, nil, 0},
+
+       // invalid: no digits
+       {"e", false, false, 0, 10, errNoDigits, 0},
+       {"ef", false, false, 0, 10, errNoDigits, 'f'},
+       {"e+", false, false, 0, 10, errNoDigits, 0},
+       {"E-x", false, false, 0, 10, errNoDigits, 'x'},
+       {"p", true, false, 0, 2, errNoDigits, 0},
+       {"P-", true, false, 0, 2, errNoDigits, 0},
+       {"p+e", true, false, 0, 2, errNoDigits, 'e'},
+       {"e+_x", false, true, 0, 10, errNoDigits, 'x'},
+
+       // invalid: incorrect use of separator
+       {"e0_", false, true, 0, 10, errInvalSep, 0},
+       {"e_0", false, true, 0, 10, errInvalSep, 0},
+       {"e-1_2__3", false, true, -123, 10, errInvalSep, 0},
+}
+
+func TestScanExponent(t *testing.T) {
+       for _, a := range exponentTests {
+               r := strings.NewReader(a.s)
+               x, b, err := scanExponent(r, a.base2ok, a.sepOk)
+               if err != a.err {
+                       t.Errorf("scanExponent%+v\n\tgot error = %v; want %v", a, err, a.err)
+               }
+               if x != a.x {
+                       t.Errorf("scanExponent%+v\n\tgot z = %v; want %v", a, x, a.x)
+               }
+               if b != a.b {
+                       t.Errorf("scanExponent%+v\n\tgot b = %d; want %d", a, b, a.b)
+               }
+               next, _, err := r.ReadRune()
+               if err == io.EOF {
+                       next = 0
+                       err = nil
+               }
+               if err == nil && next != a.next {
+                       t.Errorf("scanExponent%+v\n\tgot next = %q; want %q", a, next, a.next)
+               }
+       }
+}
+
 type StringTest struct {
        in, out string
        ok      bool
 }
 
 var setStringTests = []StringTest{
-       {"0", "0", true},
-       {"-0", "0", true},
-       {"1", "1", true},
-       {"-1", "-1", true},
-       {"1.", "1", true},
-       {"1e0", "1", true},
-       {"1.e1", "10", true},
+       // invalid
        {in: "1e"},
        {in: "1.e"},
        {in: "1e+14e-5"},
@@ -33,6 +99,20 @@ var setStringTests = []StringTest{
        {in: "r"},
        {in: "a/b"},
        {in: "a.b"},
+       {in: "1/0"},
+       {in: "4/3/2"}, // issue 17001
+       {in: "4/3/"},
+       {in: "4/3."},
+       {in: "4/"},
+
+       // valid
+       {"0", "0", true},
+       {"-0", "0", true},
+       {"1", "1", true},
+       {"-1", "-1", true},
+       {"1.", "1", true},
+       {"1e0", "1", true},
+       {"1.e1", "10", true},
        {"-0.1", "-1/10", true},
        {"-.1", "-1/10", true},
        {"2/4", "1/2", true},
@@ -49,22 +129,55 @@ var setStringTests = []StringTest{
        {"106/141787961317645621392", "53/70893980658822810696", true},
        {"204211327800791583.81095", "4084226556015831676219/20000", true},
        {"0e9999999999", "0", true}, // issue #16176
-       {in: "1/0"},
-       {in: "4/3/2"}, // issue 17001
-       {in: "4/3/"},
-       {in: "4/3."},
-       {in: "4/"},
 }
 
 // These are not supported by fmt.Fscanf.
 var setStringTests2 = []StringTest{
-       {"0x10", "16", true},
-       {"-010/1", "-8", true}, // TODO(gri) should we even permit octal here?
-       {"-010.", "-10", true},
-       {"0x10/0x20", "1/2", true},
-       {"0b1000/3", "8/3", true},
+       // invalid
        {in: "4/3x"},
-       // TODO(gri) add more tests
+       {in: "0/-1"},
+       {in: "-1/-1"},
+
+       // invalid with separators
+       // (smoke tests only - a comprehensive set of tests is in natconv_test.go)
+       {in: "10_/1"},
+       {in: "_10/1"},
+       {in: "1/1__0"},
+
+       // valid
+       {"0b1000/3", "8/3", true},
+       {"0B1000/0x8", "1", true},
+       {"-010/1", "-8", true}, // 0-prefix indicates octal in this case
+       {"-010.0", "-10", true},
+       {"-0o10/1", "-8", true},
+       {"0x10/1", "16", true},
+       {"0x10/0x20", "1/2", true},
+
+       {"0010", "10", true}, // 0-prefix is ignored in this case (not a fraction)
+       {"0x10.0", "16", true},
+       {"0x1.8", "3/2", true},
+       {"0X1.8p4", "24", true},
+       {"0x1.1E2", "2289/2048", true}, // E is part of hex mantissa, not exponent
+       {"0b1.1E2", "150", true},
+       {"0B1.1P3", "12", true},
+       {"0o10e-2", "2/25", true},
+       {"0O10p-3", "1", true},
+
+       // valid with separators
+       // (smoke tests only - a comprehensive set of tests is in natconv_test.go)
+       {"0b_1000/3", "8/3", true},
+       {"0B_10_00/0x8", "1", true},
+       {"0xdead/0B1101_1110_1010_1101", "1", true},
+       {"0B1101_1110_1010_1101/0XD_E_A_D", "1", true},
+       {"1_000.0", "1000", true},
+
+       {"0x_10.0", "16", true},
+       {"0x1_0.0", "16", true},
+       {"0x1.8_0", "3/2", true},
+       {"0X1.8p0_4", "24", true},
+       {"0b1.1_0E2", "150", true},
+       {"0o1_0e-2", "2/25", true},
+       {"0O_10p-3", "1", true},
 }
 
 func TestRatSetString(t *testing.T) {
@@ -81,8 +194,12 @@ func TestRatSetString(t *testing.T) {
                        } else if x.RatString() != test.out {
                                t.Errorf("#%d SetString(%q) got %s want %s", i, test.in, x.RatString(), test.out)
                        }
-               } else if x != nil {
-                       t.Errorf("#%d SetString(%q) got %p want nil", i, test.in, x)
+               } else {
+                       if test.ok {
+                               t.Errorf("#%d SetString(%q) expected success", i, test.in)
+                       } else if x != nil {
+                               t.Errorf("#%d SetString(%q) got %p want nil", i, test.in, x)
+                       }
                }
        }
 }
@@ -457,3 +574,18 @@ func TestFloat64SpecialCases(t *testing.T) {
                }
        }
 }
+
+func TestIssue31184(t *testing.T) {
+       var x Rat
+       for _, want := range []string{
+               "-213.090",
+               "8.192",
+               "16.000",
+       } {
+               x.SetString(want)
+               got := x.FloatString(3)
+               if got != want {
+                       t.Errorf("got %s, want %s", got, want)
+               }
+       }
+}
index 86595a5f1e9b0156231b026c3038ef3f1744aefe..59d1a4b8134f6b7822062f3cdbe0c3d9df35fe85 100644 (file)
@@ -23,6 +23,9 @@ func TestFloatSqrt64(t *testing.T) {
        }
 
        for i := 0; i < 1e5; i++ {
+               if i == 1e2 && testing.Short() {
+                       break
+               }
                r := rand.Float64()
 
                got := new(Float).SetPrec(53)
index 306fa76e5e1f87d5c5377a4cbc66271eab7756e0..3114c14030bd8c2886801611ecbac55f64e1c8d1 100644 (file)
@@ -8,8 +8,6 @@
 // functions for the predeclared unsigned integer types.
 package bits
 
-import _ "unsafe" // for go:linkname
-
 const uintSize = 32 << (^uint(0) >> 32 & 1) // 32 or 64
 
 // UintSize is the size of a uint in bits.
@@ -167,6 +165,8 @@ func OnesCount64(x uint64) int {
 
 // RotateLeft returns the value of x rotated left by (k mod UintSize) bits.
 // To rotate x right by k bits, call RotateLeft(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft(x uint, k int) uint {
        if UintSize == 32 {
                return uint(RotateLeft32(uint32(x), k))
@@ -176,6 +176,8 @@ func RotateLeft(x uint, k int) uint {
 
 // RotateLeft8 returns the value of x rotated left by (k mod 8) bits.
 // To rotate x right by k bits, call RotateLeft8(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft8(x uint8, k int) uint8 {
        const n = 8
        s := uint(k) & (n - 1)
@@ -184,6 +186,8 @@ func RotateLeft8(x uint8, k int) uint8 {
 
 // RotateLeft16 returns the value of x rotated left by (k mod 16) bits.
 // To rotate x right by k bits, call RotateLeft16(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft16(x uint16, k int) uint16 {
        const n = 16
        s := uint(k) & (n - 1)
@@ -192,6 +196,8 @@ func RotateLeft16(x uint16, k int) uint16 {
 
 // RotateLeft32 returns the value of x rotated left by (k mod 32) bits.
 // To rotate x right by k bits, call RotateLeft32(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft32(x uint32, k int) uint32 {
        const n = 32
        s := uint(k) & (n - 1)
@@ -200,6 +206,8 @@ func RotateLeft32(x uint32, k int) uint32 {
 
 // RotateLeft64 returns the value of x rotated left by (k mod 64) bits.
 // To rotate x right by k bits, call RotateLeft64(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft64(x uint64, k int) uint64 {
        const n = 64
        s := uint(k) & (n - 1)
@@ -232,8 +240,7 @@ func Reverse32(x uint32) uint32 {
        x = x>>1&(m0&m) | x&(m0&m)<<1
        x = x>>2&(m1&m) | x&(m1&m)<<2
        x = x>>4&(m2&m) | x&(m2&m)<<4
-       x = x>>8&(m3&m) | x&(m3&m)<<8
-       return x>>16 | x<<16
+       return ReverseBytes32(x)
 }
 
 // Reverse64 returns the value of x with its bits in reversed order.
@@ -242,14 +249,14 @@ func Reverse64(x uint64) uint64 {
        x = x>>1&(m0&m) | x&(m0&m)<<1
        x = x>>2&(m1&m) | x&(m1&m)<<2
        x = x>>4&(m2&m) | x&(m2&m)<<4
-       x = x>>8&(m3&m) | x&(m3&m)<<8
-       x = x>>16&(m4&m) | x&(m4&m)<<16
-       return x>>32 | x<<32
+       return ReverseBytes64(x)
 }
 
 // --- ReverseBytes ---
 
 // ReverseBytes returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes(x uint) uint {
        if UintSize == 32 {
                return uint(ReverseBytes32(uint32(x)))
@@ -258,11 +265,15 @@ func ReverseBytes(x uint) uint {
 }
 
 // ReverseBytes16 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes16(x uint16) uint16 {
        return x>>8 | x<<8
 }
 
 // ReverseBytes32 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes32(x uint32) uint32 {
        const m = 1<<32 - 1
        x = x>>8&(m3&m) | x&(m3&m)<<8
@@ -270,6 +281,8 @@ func ReverseBytes32(x uint32) uint32 {
 }
 
 // ReverseBytes64 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes64(x uint64) uint64 {
        const m = 1<<64 - 1
        x = x>>8&(m3&m) | x&(m3&m)<<8
@@ -336,36 +349,40 @@ func Len64(x uint64) (n int) {
 // Add returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add(x, y, carry uint) (sum, carryOut uint) {
-       yc := y + carry
-       sum = x + yc
-       if sum < x || yc < y {
-               carryOut = 1
+       if UintSize == 32 {
+               s32, c32 := Add32(uint32(x), uint32(y), uint32(carry))
+               return uint(s32), uint(c32)
        }
-       return
+       s64, c64 := Add64(uint64(x), uint64(y), uint64(carry))
+       return uint(s64), uint(c64)
 }
 
 // Add32 returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add32(x, y, carry uint32) (sum, carryOut uint32) {
-       yc := y + carry
-       sum = x + yc
-       if sum < x || yc < y {
-               carryOut = 1
-       }
+       sum64 := uint64(x) + uint64(y) + uint64(carry)
+       sum = uint32(sum64)
+       carryOut = uint32(sum64 >> 32)
        return
 }
 
 // Add64 returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add64(x, y, carry uint64) (sum, carryOut uint64) {
-       yc := y + carry
-       sum = x + yc
-       if sum < x || yc < y {
-               carryOut = 1
-       }
+       sum = x + y + carry
+       // The sum will overflow if both top bits are set (x & y) or if one of them
+       // is (x | y), and a carry from the lower place happened. If such a carry
+       // happens, the top bit will be 1 + 0 + 1 = 0 (&^ sum).
+       carryOut = ((x & y) | ((x | y) &^ sum)) >> 63
        return
 }
 
@@ -374,36 +391,41 @@ func Add64(x, y, carry uint64) (sum, carryOut uint64) {
 // Sub returns the difference of x, y and borrow: diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub(x, y, borrow uint) (diff, borrowOut uint) {
-       yb := y + borrow
-       diff = x - yb
-       if diff > x || yb < y {
-               borrowOut = 1
+       if UintSize == 32 {
+               d32, b32 := Sub32(uint32(x), uint32(y), uint32(borrow))
+               return uint(d32), uint(b32)
        }
-       return
+       d64, b64 := Sub64(uint64(x), uint64(y), uint64(borrow))
+       return uint(d64), uint(b64)
 }
 
 // Sub32 returns the difference of x, y and borrow, diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub32(x, y, borrow uint32) (diff, borrowOut uint32) {
-       yb := y + borrow
-       diff = x - yb
-       if diff > x || yb < y {
-               borrowOut = 1
-       }
+       diff = x - y - borrow
+       // The difference will underflow if the top bit of x is not set and the top
+       // bit of y is set (^x & y) or if they are the same (^(x ^ y)) and a borrow
+       // from the lower place happens. If that borrow happens, the result will be
+       // 1 - 1 - 1 = 0 - 0 - 1 = 1 (& diff).
+       borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 31
        return
 }
 
 // Sub64 returns the difference of x, y and borrow: diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub64(x, y, borrow uint64) (diff, borrowOut uint64) {
-       yb := y + borrow
-       diff = x - yb
-       if diff > x || yb < y {
-               borrowOut = 1
-       }
+       diff = x - y - borrow
+       // See Sub32 for the bit logic.
+       borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63
        return
 }
 
@@ -412,6 +434,8 @@ func Sub64(x, y, borrow uint64) (diff, borrowOut uint64) {
 // Mul returns the full-width product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul(x, y uint) (hi, lo uint) {
        if UintSize == 32 {
                h, l := Mul32(uint32(x), uint32(y))
@@ -424,6 +448,8 @@ func Mul(x, y uint) (hi, lo uint) {
 // Mul32 returns the 64-bit product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul32(x, y uint32) (hi, lo uint32) {
        tmp := uint64(x) * uint64(y)
        hi, lo = uint32(tmp>>32), uint32(tmp)
@@ -433,6 +459,8 @@ func Mul32(x, y uint32) (hi, lo uint32) {
 // Mul64 returns the 128-bit product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul64(x, y uint64) (hi, lo uint64) {
        const mask32 = 1<<32 - 1
        x0 := x & mask32
@@ -527,9 +555,3 @@ func Div64(hi, lo, y uint64) (quo, rem uint64) {
 
        return q1*two32 + q0, (un21*two32 + un0 - q0*y) >> s
 }
-
-//go:linkname getOverflowError runtime.getOverflowError
-func getOverflowError() error
-
-//go:linkname getDivideError runtime.getDivideError
-func getDivideError() error
diff --git a/libgo/go/math/bits/bits_errors.go b/libgo/go/math/bits/bits_errors.go
new file mode 100644 (file)
index 0000000..f174bd1
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !compiler_bootstrap
+
+package bits
+
+import _ "unsafe"
+
+//go:linkname getOverflowError runtime.getOverflowError
+func getOverflowError() error
+
+//go:linkname getDivideError runtime.getDivideError
+func getDivideError() error
diff --git a/libgo/go/math/bits/bits_errors_bootstrap.go b/libgo/go/math/bits/bits_errors_bootstrap.go
new file mode 100644 (file)
index 0000000..5df5738
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build compiler_bootstrap
+
+// This version used only for bootstrap (on this path we want
+// to avoid use of go:linkname as applied to variables).
+
+package bits
+
+type errorString string
+
+func (e errorString) RuntimeError() {}
+
+func (e errorString) Error() string {
+       return "runtime error: " + string(e)
+}
+
+var overflowError = error(errorString("integer overflow"))
+
+var divideError = error(errorString("integer divide by zero"))
index 1ec5107ae1294191d32cf68d2b15ca9d0ee18035..afdfd393bb38b8ca8efe1f0f9407e9a5fff8098d 100644 (file)
@@ -736,6 +736,13 @@ func TestAddSubUint(t *testing.T) {
                test("Add symmetric", Add, a.y, a.x, a.c, a.z, a.cout)
                test("Sub", Sub, a.z, a.x, a.c, a.y, a.cout)
                test("Sub symmetric", Sub, a.z, a.y, a.c, a.x, a.cout)
+               // The above code can't test intrinsic implementation, because the passed function is not called directly.
+               // The following code uses a closure to test the intrinsic version in case the function is intrinsified.
+               test("Add intrinsic", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.x, a.y, a.c, a.z, a.cout)
+               test("Add intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.y, a.x, a.c, a.z, a.cout)
+               test("Sub intrinsic", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.x, a.c, a.y, a.cout)
+               test("Sub intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.y, a.c, a.x, a.cout)
+
        }
 }
 
@@ -790,6 +797,12 @@ func TestAddSubUint64(t *testing.T) {
                test("Add64 symmetric", Add64, a.y, a.x, a.c, a.z, a.cout)
                test("Sub64", Sub64, a.z, a.x, a.c, a.y, a.cout)
                test("Sub64 symmetric", Sub64, a.z, a.y, a.c, a.x, a.cout)
+               // The above code can't test intrinsic implementation, because the passed function is not called directly.
+               // The following code uses a closure to test the intrinsic version in case the function is intrinsified.
+               test("Add64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.x, a.y, a.c, a.z, a.cout)
+               test("Add64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.y, a.x, a.c, a.z, a.cout)
+               test("Sub64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.x, a.c, a.y, a.cout)
+               test("Sub64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.y, a.c, a.x, a.cout)
        }
 }
 
@@ -817,6 +830,12 @@ func TestMulDiv(t *testing.T) {
                testMul("Mul symmetric", Mul, a.y, a.x, a.hi, a.lo)
                testDiv("Div", Div, a.hi, a.lo+a.r, a.y, a.x, a.r)
                testDiv("Div symmetric", Div, a.hi, a.lo+a.r, a.x, a.y, a.r)
+               // The above code can't test intrinsic implementation, because the passed function is not called directly.
+               // The following code uses a closure to test the intrinsic version in case the function is intrinsified.
+               testMul("Mul intrinsic", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.x, a.y, a.hi, a.lo)
+               testMul("Mul intrinsic symmetric", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.y, a.x, a.hi, a.lo)
+               testDiv("Div intrinsic", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r)
+               testDiv("Div intrinsic symmetric", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r)
        }
 }
 
@@ -873,6 +892,12 @@ func TestMulDiv64(t *testing.T) {
                testMul("Mul64 symmetric", Mul64, a.y, a.x, a.hi, a.lo)
                testDiv("Div64", Div64, a.hi, a.lo+a.r, a.y, a.x, a.r)
                testDiv("Div64 symmetric", Div64, a.hi, a.lo+a.r, a.x, a.y, a.r)
+               // The above code can't test intrinsic implementation, because the passed function is not called directly.
+               // The following code uses a closure to test the intrinsic version in case the function is intrinsified.
+               testMul("Mul64 intrinsic", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.x, a.y, a.hi, a.lo)
+               testMul("Mul64 intrinsic symmetric", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.y, a.x, a.hi, a.lo)
+               testDiv("Div64 intrinsic", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r)
+               testDiv("Div64 intrinsic symmetric", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r)
        }
 }
 
index dfe7ece6ff7e25829851abef4d0792dd11a3ab8a..14cea6f700e9ff834619a1326432ec52dfeefe25 100644 (file)
@@ -61,6 +61,12 @@ func ExampleTrailingZeros64() {
        // TrailingZeros64(0000000000000000000000000000000000000000000000000000000000001110) = 1
 }
 
+func ExampleOnesCount() {
+       fmt.Printf("OnesCount(%b) = %d\n", 14, bits.OnesCount(14))
+       // Output:
+       // OnesCount(1110) = 3
+}
+
 func ExampleOnesCount8() {
        fmt.Printf("OnesCount8(%08b) = %d\n", 14, bits.OnesCount8(14))
        // Output:
index 80c3b33937e2aa5045bf8879ec528fbba04ce141..57ba76a76711934b1fe8507738bcb3ffe37600b7 100644 (file)
@@ -222,7 +222,7 @@ var pow = []complex128{
        (-2.499956739197529585028819e+00 + 1.759751724335650228957144e+00i),
        (7.357094338218116311191939e+04 - 5.089973412479151648145882e+04i),
        (1.320777296067768517259592e+01 - 3.165621914333901498921986e+01i),
-       (-3.123287828297300934072149e-07 - 1.9849567521490553032502223E-7i),
+       (-3.123287828297300934072149e-07 - 1.9849567521490553032502223e-7i),
        (8.0622651468477229614813e+04 - 7.80028727944573092944363e+04i),
        (-1.0268824572103165858577141e+00 - 4.716844738244989776610672e-01i),
        (-4.35953819012244175753187e+01 + 2.2036445974645306917648585e+02i),
@@ -400,9 +400,11 @@ var polarSC = []ff{
 }
 var vcPowSC = [][2]complex128{
        {NaN(), NaN()},
+       {0, NaN()},
 }
 var powSC = []complex128{
        NaN(),
+       NaN(),
 }
 var vcSinSC = []complex128{
        NaN(),
@@ -734,8 +736,8 @@ func TestPow(t *testing.T) {
                }
        }
        for i := 0; i < len(vcPowSC); i++ {
-               if f := Pow(vcPowSC[i][0], vcPowSC[i][0]); !cAlike(powSC[i], f) {
-                       t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][0], f, powSC[i])
+               if f := Pow(vcPowSC[i][0], vcPowSC[i][1]); !cAlike(powSC[i], f) {
+                       t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][1], f, powSC[i])
                }
        }
        for _, pt := range branchPoints {
index 1630b879b88b0dbc97c4d5ef16a1815f40c66953..5a405f8e9607f0961da2c62669ec9af3b813254b 100644 (file)
@@ -48,6 +48,9 @@ import "math"
 //     Pow(0, c) for real(c)<0 returns Inf+0i if imag(c) is zero, otherwise Inf+Inf i.
 func Pow(x, y complex128) complex128 {
        if x == 0 { // Guaranteed also true for x == -0.
+               if IsNaN(y) {
+                       return NaN()
+               }
                r, i := real(y), imag(y)
                switch {
                case r == 0:
index 299055215595c7bac76eec5ae6bfc5487298eed1..0243ea0417fbea54cf5c870b5ef62796941901d6 100644 (file)
@@ -92,9 +92,9 @@ func Tanh(x complex128) complex128 {
 func reducePi(x float64) float64 {
        const (
                // extended precision value of PI:
-               DP1 = 3.14159265160560607910E0   // ?? 0x400921fb54000000
-               DP2 = 1.98418714791870343106E-9  // ?? 0x3e210b4610000000
-               DP3 = 1.14423774522196636802E-17 // ?? 0x3c6a62633145c06e
+               DP1 = 3.14159265160560607910e0   // ?? 0x400921fb54000000
+               DP2 = 1.98418714791870343106e-9  // ?? 0x3e210b4610000000
+               DP3 = 1.14423774522196636802e-17 // ?? 0x3c6a62633145c06e
        )
        t := x / math.Pi
        if t >= 0 {
index 25d6975903bcbbf9c25f75e59e811452a4029345..364891324a01bcac9b5fc0bbef3a93b323688566 100644 (file)
@@ -135,3 +135,41 @@ func ExampleRoundToEven() {
        // 12.0
        // 12.0
 }
+
+func ExampleLog() {
+       x := math.Log(1)
+       fmt.Printf("%.1f\n", x)
+
+       y := math.Log(2.7183)
+       fmt.Printf("%.1f\n", y)
+       // Output:
+       // 0.0
+       // 1.0
+}
+
+func ExampleLog2() {
+       fmt.Printf("%.1f", math.Log2(256))
+       // Output: 8.0
+}
+
+func ExampleLog10() {
+       fmt.Printf("%.1f", math.Log10(100))
+       // Output: 2.0
+}
+
+func ExampleMod() {
+       c := math.Mod(7, 4)
+       fmt.Printf("%.1f", c)
+       // Output: 3.0
+}
+
+func ExampleAbs() {
+       x := math.Abs(-2)
+       fmt.Printf("%.1f\n", x)
+
+       y := math.Abs(2)
+       fmt.Printf("%.1f\n", y)
+       // Output:
+       // 2.0
+       // 2.0
+}
index 5523fc34a001f1543f2b1fd47d61bb61dd79a7d8..cb5f07bca63f542715f92448c1faaf11cca5b5a1 100644 (file)
@@ -38,7 +38,7 @@ package math
 //                      = 1/sqrt(2) * (cos(x) + sin(x))
 //              sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
 //                      = 1/sqrt(2) * (sin(x) - cos(x))
-//         (To avoid cancelation, use
+//         (To avoid cancellation, use
 //              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 //         to compute the worse one.)
 //
@@ -186,7 +186,7 @@ func Y0(x float64) float64 {
                //             =  1/sqrt(2) * (sin(x) + cos(x))
                //     sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
                //             =  1/sqrt(2) * (sin(x) - cos(x))
-               // To avoid cancelation, use
+               // To avoid cancellation, use
                //     sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
                // to compute the worse one.
 
index f1adcb6f41670f627572007fc24fd8b882d460ce..7c7d279730dc634dc4d91b7d4c78f39b0c795936 100644 (file)
@@ -39,7 +39,7 @@ package math
 //                      =  1/sqrt(2) * (sin(x) - cos(x))
 //              sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
 //                      = -1/sqrt(2) * (sin(x) + cos(x))
-//         (To avoid cancelation, use
+//         (To avoid cancellation, use
 //              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 //         to compute the worse one.)
 //
@@ -197,7 +197,7 @@ func Y1(x float64) float64 {
                //                 =  1/sqrt(2) * (sin(x) - cos(x))
                //         sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
                //                 = -1/sqrt(2) * (cos(x) + sin(x))
-               // To avoid cancelation, use
+               // To avoid cancellation, use
                //     sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
                // to compute the worse one.
 
index 4a8ddfad9bd80a7055cb9d86ee430b09b50c22d5..b1aca8ff6be74722ea1e76349f6f2470626c307f 100644 (file)
@@ -103,15 +103,15 @@ func Jn(n int, x float64) float64 {
                        //                 3     s+c             c-s
 
                        var temp float64
-                       switch n & 3 {
+                       switch s, c := Sincos(x); n & 3 {
                        case 0:
-                               temp = Cos(x) + Sin(x)
+                               temp = c + s
                        case 1:
-                               temp = -Cos(x) + Sin(x)
+                               temp = -c + s
                        case 2:
-                               temp = -Cos(x) - Sin(x)
+                               temp = -c - s
                        case 3:
-                               temp = Cos(x) - Sin(x)
+                               temp = c - s
                        }
                        b = (1 / SqrtPi) * temp / Sqrt(x)
                } else {
@@ -278,15 +278,15 @@ func Yn(n int, x float64) float64 {
                //                 3     s+c             c-s
 
                var temp float64
-               switch n & 3 {
+               switch s, c := Sincos(x); n & 3 {
                case 0:
-                       temp = Sin(x) - Cos(x)
+                       temp = s - c
                case 1:
-                       temp = -Sin(x) - Cos(x)
+                       temp = -s - c
                case 2:
-                       temp = -Sin(x) + Cos(x)
+                       temp = -s + c
                case 3:
-                       temp = Sin(x) + Cos(x)
+                       temp = s + c
                }
                b = (1 / SqrtPi) * temp / Sqrt(x)
        } else {
index e663b84f9fc3daeadb3db26678c3a9ba48b13f34..ee9c8f8e84b33e68961c7b2193fa49da94a8fcd2 100644 (file)
@@ -486,7 +486,7 @@ func TestUniformFactorial(t *testing.T) {
        r := New(NewSource(testSeeds[0]))
        top := 6
        if testing.Short() {
-               top = 4
+               top = 3
        }
        for n := 3; n <= top; n++ {
                t.Run(fmt.Sprintf("n=%d", n), func(t *testing.T) {
index c6a4c7d741da2ab731d11862d438d123d873ade8..0e2903e109b55f98e6eac335e9035f65b0807d12 100644 (file)
@@ -59,6 +59,10 @@ func remainder(x, y float64) float64 {
                y = -y
        }
        if x == y {
+               if sign {
+                       zero := 0.0
+                       return -zero
+               }
                return 0
        }
        if y <= HalfMax {
index 871e8c6185f70581a6d51f3590bf4ad17c2b5e98..03fd14c8b27bfced5ae4930ad721820ba70763d4 100644 (file)
@@ -91,22 +91,22 @@ package math
 
 // sin coefficients
 var _sin = [...]float64{
-       1.58962301576546568060E-10, // 0x3de5d8fd1fd19ccd
-       -2.50507477628578072866E-8, // 0xbe5ae5e5a9291f5d
-       2.75573136213857245213E-6,  // 0x3ec71de3567d48a1
-       -1.98412698295895385996E-4, // 0xbf2a01a019bfdf03
-       8.33333333332211858878E-3,  // 0x3f8111111110f7d0
-       -1.66666666666666307295E-1, // 0xbfc5555555555548
+       1.58962301576546568060e-10, // 0x3de5d8fd1fd19ccd
+       -2.50507477628578072866e-8, // 0xbe5ae5e5a9291f5d
+       2.75573136213857245213e-6,  // 0x3ec71de3567d48a1
+       -1.98412698295895385996e-4, // 0xbf2a01a019bfdf03
+       8.33333333332211858878e-3,  // 0x3f8111111110f7d0
+       -1.66666666666666307295e-1, // 0xbfc5555555555548
 }
 
 // cos coefficients
 var _cos = [...]float64{
-       -1.13585365213876817300E-11, // 0xbda8fa49a0861a9b
-       2.08757008419747316778E-9,   // 0x3e21ee9d7b4e3f05
-       -2.75573141792967388112E-7,  // 0xbe927e4f7eac4bc6
-       2.48015872888517045348E-5,   // 0x3efa01a019c844f5
-       -1.38888888888730564116E-3,  // 0xbf56c16c16c14f91
-       4.16666666666665929218E-2,   // 0x3fa555555555554b
+       -1.13585365213876817300e-11, // 0xbda8fa49a0861a9b
+       2.08757008419747316778e-9,   // 0x3e21ee9d7b4e3f05
+       -2.75573141792967388112e-7,  // 0xbe927e4f7eac4bc6
+       2.48015872888517045348e-5,   // 0x3efa01a019c844f5
+       -1.38888888888730564116e-3,  // 0xbf56c16c16c14f91
+       4.16666666666665929218e-2,   // 0x3fa555555555554b
 }
 
 // Cos returns the cosine of the radian argument x.
@@ -124,9 +124,9 @@ func Cos(x float64) float64 {
 
 func cos(x float64) float64 {
        const (
-               PI4A = 7.85398125648498535156E-1  // 0x3fe921fb40000000, Pi/4 split into three parts
-               PI4B = 3.77489470793079817668E-8  // 0x3e64442d00000000,
-               PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170,
+               PI4A = 7.85398125648498535156e-1  // 0x3fe921fb40000000, Pi/4 split into three parts
+               PI4B = 3.77489470793079817668e-8  // 0x3e64442d00000000,
+               PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170,
        )
        // special cases
        switch {
@@ -191,9 +191,9 @@ func Sin(x float64) float64 {
 
 func sin(x float64) float64 {
        const (
-               PI4A = 7.85398125648498535156E-1  // 0x3fe921fb40000000, Pi/4 split into three parts
-               PI4B = 3.77489470793079817668E-8  // 0x3e64442d00000000,
-               PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170,
+               PI4A = 7.85398125648498535156e-1  // 0x3fe921fb40000000, Pi/4 split into three parts
+               PI4B = 3.77489470793079817668e-8  // 0x3e64442d00000000,
+               PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170,
        )
        // special cases
        switch {
index c002db6b3cd169bd5fc36c4b61399a2605099629..5c5726f6898a73c209a6ecb471719d97f4e29da1 100644 (file)
@@ -14,9 +14,9 @@ package math
 //     Sincos(NaN) = NaN, NaN
 func Sincos(x float64) (sin, cos float64) {
        const (
-               PI4A = 7.85398125648498535156E-1  // 0x3fe921fb40000000, Pi/4 split into three parts
-               PI4B = 3.77489470793079817668E-8  // 0x3e64442d00000000,
-               PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170,
+               PI4A = 7.85398125648498535156e-1  // 0x3fe921fb40000000, Pi/4 split into three parts
+               PI4B = 3.77489470793079817668e-8  // 0x3e64442d00000000,
+               PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170,
        )
        // special cases
        switch {
index 929a0a9fa4400ab882685941284a214c501a86d0..ca91d7149b520836e5cca809fc8f4683060d9e6f 100644 (file)
@@ -61,16 +61,16 @@ package math
 
 // tan coefficients
 var _tanP = [...]float64{
-       -1.30936939181383777646E4, // 0xc0c992d8d24f3f38
-       1.15351664838587416140E6,  // 0x413199eca5fc9ddd
-       -1.79565251976484877988E7, // 0xc1711fead3299176
+       -1.30936939181383777646e4, // 0xc0c992d8d24f3f38
+       1.15351664838587416140e6,  // 0x413199eca5fc9ddd
+       -1.79565251976484877988e7, // 0xc1711fead3299176
 }
 var _tanQ = [...]float64{
-       1.00000000000000000000E0,
-       1.36812963470692954678E4,  //0x40cab8a5eeb36572
-       -1.32089234440210967447E6, //0xc13427bc582abc96
-       2.50083801823357915839E7,  //0x4177d98fc2ead8ef
-       -5.38695755929454629881E7, //0xc189afe03cbe5a31
+       1.00000000000000000000e0,
+       1.36812963470692954678e4,  //0x40cab8a5eeb36572
+       -1.32089234440210967447e6, //0xc13427bc582abc96
+       2.50083801823357915839e7,  //0x4177d98fc2ead8ef
+       -5.38695755929454629881e7, //0xc189afe03cbe5a31
 }
 
 // Tan returns the tangent of the radian argument x.
@@ -89,9 +89,9 @@ func Tan(x float64) float64 {
 
 func tan(x float64) float64 {
        const (
-               PI4A = 7.85398125648498535156E-1  // 0x3fe921fb40000000, Pi/4 split into three parts
-               PI4B = 3.77489470793079817668E-8  // 0x3e64442d00000000,
-               PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170,
+               PI4A = 7.85398125648498535156e-1  // 0x3fe921fb40000000, Pi/4 split into three parts
+               PI4B = 3.77489470793079817668e-8  // 0x3e64442d00000000,
+               PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170,
        )
        // special cases
        switch {
index cf0ffa1923f9d805dd8c6e8ad3caafe4ef845a6a..009a206d3721ce768f58f89670d067fd16b7a905 100644 (file)
@@ -55,14 +55,14 @@ package math
 //
 
 var tanhP = [...]float64{
-       -9.64399179425052238628E-1,
-       -9.92877231001918586564E1,
-       -1.61468768441708447952E3,
+       -9.64399179425052238628e-1,
+       -9.92877231001918586564e1,
+       -1.61468768441708447952e3,
 }
 var tanhQ = [...]float64{
-       1.12811678491632931402E2,
-       2.23548839060100448583E3,
-       4.84406305325125486048E3,
+       1.12811678491632931402e2,
+       2.23548839060100448583e3,
+       4.84406305325125486048e3,
 }
 
 // Tanh returns the hyperbolic tangent of x.
index 05390773a8afa98272c7e2ca55d582248deb08ce..56ceb488533fc9b94063b68c6250c2e4e0f4fea6 100644 (file)
@@ -19,7 +19,7 @@ import (
 // FormatMediaType returns the empty string.
 func FormatMediaType(t string, param map[string]string) string {
        var b strings.Builder
-       if slash := strings.Index(t, "/"); slash == -1 {
+       if slash := strings.IndexByte(t, '/'); slash == -1 {
                if !isToken(t) {
                        return ""
                }
@@ -48,7 +48,38 @@ func FormatMediaType(t string, param map[string]string) string {
                        return ""
                }
                b.WriteString(strings.ToLower(attribute))
+
+               needEnc := needsEncoding(value)
+               if needEnc {
+                       // RFC 2231 section 4
+                       b.WriteByte('*')
+               }
                b.WriteByte('=')
+
+               if needEnc {
+                       b.WriteString("utf-8''")
+
+                       offset := 0
+                       for index := 0; index < len(value); index++ {
+                               ch := value[index]
+                               // {RFC 2231 section 7}
+                               // attribute-char := <any (US-ASCII) CHAR except SPACE, CTLs, "*", "'", "%", or tspecials>
+                               if ch <= ' ' || ch >= 0x7F ||
+                                       ch == '*' || ch == '\'' || ch == '%' ||
+                                       isTSpecial(rune(ch)) {
+
+                                       b.WriteString(value[offset:index])
+                                       offset = index + 1
+
+                                       b.WriteByte('%')
+                                       b.WriteByte(upperhex[ch>>4])
+                                       b.WriteByte(upperhex[ch&0x0F])
+                               }
+                       }
+                       b.WriteString(value[offset:])
+                       continue
+               }
+
                if isToken(value) {
                        b.WriteString(value)
                        continue
@@ -63,9 +94,6 @@ func FormatMediaType(t string, param map[string]string) string {
                                offset = index
                                b.WriteByte('\\')
                        }
-                       if character&0x80 != 0 {
-                               return ""
-                       }
                }
                b.WriteString(value[offset:])
                b.WriteByte('"')
index 945a8189e171c944ed58997368d396adc0bf98bb..e91ff38d68b4892d8ff1b8f1836db51ac0920c6e 100644 (file)
@@ -6,6 +6,7 @@ package mime
 
 import (
        "reflect"
+       "strings"
        "testing"
 )
 
@@ -481,8 +482,9 @@ var formatTests = []formatTest{
        {"noslash", map[string]string{"X": "Y"}, "noslash; x=Y"}, // e.g. Content-Disposition values (RFC 2183); issue 11289
        {"foo bar/baz", nil, ""},
        {"foo/bar baz", nil, ""},
-       {"attachment", map[string]string{"filename": "ĄĄŽŽČČŠŠ"}, ""},
-       {"attachment", map[string]string{"filename": "ÁÁÊÊÇÇÎÎ"}, ""},
+       {"attachment", map[string]string{"filename": "ĄĄŽŽČČŠŠ"}, "attachment; filename*=utf-8''%C4%84%C4%84%C5%BD%C5%BD%C4%8C%C4%8C%C5%A0%C5%A0"},
+       {"attachment", map[string]string{"filename": "ÁÁÊÊÇÇÎÎ"}, "attachment; filename*=utf-8''%C3%81%C3%81%C3%8A%C3%8A%C3%87%C3%87%C3%8E%C3%8E"},
+       {"attachment", map[string]string{"filename": "数据统计.png"}, "attachment; filename*=utf-8''%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1.png"},
        {"foo/BAR", nil, "foo/bar"},
        {"foo/BAR", map[string]string{"X": "Y"}, "foo/bar; x=Y"},
        {"foo/BAR", map[string]string{"space": "With space"}, `foo/bar; space="With space"`},
@@ -491,7 +493,8 @@ var formatTests = []formatTest{
        {"foo/BAR", map[string]string{"both": `With \backslash and "quote`}, `foo/bar; both="With \\backslash and \"quote"`},
        {"foo/BAR", map[string]string{"": "empty attribute"}, ""},
        {"foo/BAR", map[string]string{"bad attribute": "baz"}, ""},
-       {"foo/BAR", map[string]string{"nonascii": "not an ascii character: ä"}, ""},
+       {"foo/BAR", map[string]string{"nonascii": "not an ascii character: ä"}, "foo/bar; nonascii*=utf-8''not%20an%20ascii%20character%3A%20%C3%A4"},
+       {"foo/BAR", map[string]string{"ctl": "newline: \n nil: \000"}, "foo/bar; ctl*=utf-8''newline%3A%20%0A%20nil%3A%20%00"},
        {"foo/bar", map[string]string{"a": "av", "b": "bv", "c": "cv"}, "foo/bar; a=av; b=bv; c=cv"},
        {"foo/bar", map[string]string{"0": "'", "9": "'"}, "foo/bar; 0='; 9='"},
        {"foo", map[string]string{"bar": ""}, `foo; bar=""`},
@@ -503,5 +506,21 @@ func TestFormatMediaType(t *testing.T) {
                if got != tt.want {
                        t.Errorf("%d. FormatMediaType(%q, %v) = %q; want %q", i, tt.typ, tt.params, got, tt.want)
                }
+               if got == "" {
+                       continue
+               }
+               typ, params, err := ParseMediaType(got)
+               if err != nil {
+                       t.Errorf("%d. ParseMediaType(%q) err: %v", i, got, err)
+               }
+               if typ != strings.ToLower(tt.typ) {
+                       t.Errorf("%d. ParseMediaType(%q) typ = %q; want %q", i, got, typ, tt.typ)
+               }
+               for k, v := range tt.params {
+                       k = strings.ToLower(k)
+                       if params[k] != v {
+                               t.Errorf("%d. ParseMediaType(%q) params[%s] = %q; want %q", i, got, k, params[k], v)
+                       }
+               }
        }
 }
index 105a82c417063c997293579d4c72f5e1b50ea189..7d756c8c244a0742f368ce97ae34e047dcc986c0 100644 (file)
@@ -176,7 +176,11 @@ func (r *failOnReadAfterErrorReader) Read(p []byte) (n int, err error) {
 // TestReadForm_NonFileMaxMemory asserts that the ReadForm maxMemory limit is applied
 // while processing non-file form data as well as file form data.
 func TestReadForm_NonFileMaxMemory(t *testing.T) {
-       largeTextValue := strings.Repeat("1", (10<<20)+25)
+       n := 10<<20 + 25
+       if testing.Short() {
+               n = 10<<10 + 25
+       }
+       largeTextValue := strings.Repeat("1", n)
        message := `--MyBoundary
 Content-Disposition: form-data; name="largetext"
 
@@ -196,6 +200,9 @@ Content-Disposition: form-data; name="largetext"
        }
        for _, tc := range testCases {
                t.Run(tc.name, func(t *testing.T) {
+                       if tc.maxMemory == 0 && testing.Short() {
+                               t.Skip("skipping in -short mode")
+                       }
                        b := strings.NewReader(testBody)
                        r := NewReader(b, boundary)
                        f, err := r.ReadForm(tc.maxMemory)
index 5a8102b82236c75da43e938297ce06da1d4f171c..5dc74b5ffe130d8f17e680df6b53392983ee9291 100644 (file)
@@ -832,7 +832,10 @@ func partsFromReader(r *Reader) ([]headerBody, error) {
 
 func TestParseAllSizes(t *testing.T) {
        t.Parallel()
-       const maxSize = 5 << 10
+       maxSize := 5 << 10
+       if testing.Short() {
+               maxSize = 512
+       }
        var buf bytes.Buffer
        body := strings.Repeat("a", maxSize)
        bodyb := []byte(body)
index f870bdaa8dfcbdfe5f8534b372b4edb09abb3bfe..48a7ff64953be95be43ec2c365921927db7ea1b7 100644 (file)
@@ -116,7 +116,11 @@ func TestExhaustive(t *testing.T) {
 
        var buf bytes.Buffer
        res := make(map[string]int)
-       everySequence("", "0A \r\n=", 6, func(s string) {
+       n := 6
+       if testing.Short() {
+               n = 4
+       }
+       everySequence("", "0A \r\n=", n, func(s string) {
                if strings.HasSuffix(s, "=") || strings.Contains(s, "==") {
                        return
                }
@@ -200,6 +204,13 @@ func TestExhaustive(t *testing.T) {
 invalid bytes after =: 3949
 quotedprintable: invalid hex byte 0x0d: 2048
 unexpected EOF: 194`
+       if testing.Short() {
+               want = `OK: 896
+invalid bytes after =: 100
+quotedprintable: invalid hex byte 0x0d: 26
+unexpected EOF: 3`
+       }
+
        if got != want {
                t.Errorf("Got:\n%s\nWant:\n%s", got, want)
        }
index 64e26ffb7cc900f9d68d4badb8c170e996051c3e..ad763133e69c0632ad77ce48a3f687bad030459e 100644 (file)
@@ -61,12 +61,15 @@ var builtinTypesLower = map[string]string{
        ".gif":  "image/gif",
        ".htm":  "text/html; charset=utf-8",
        ".html": "text/html; charset=utf-8",
+       ".jpeg": "image/jpeg",
        ".jpg":  "image/jpeg",
        ".js":   "application/javascript",
-       ".wasm": "application/wasm",
+       ".mjs":  "application/javascript",
        ".pdf":  "application/pdf",
        ".png":  "image/png",
        ".svg":  "image/svg+xml",
+       ".wasm": "application/wasm",
+       ".webp": "image/webp",
        ".xml":  "text/xml; charset=utf-8",
 }
 
index 342ed9e0281109246ec41196ed63bb8b0b45122b..b887165096613729c29b3a5c77d4be1f72a7e1c1 100644 (file)
@@ -14,10 +14,16 @@ package net
 #include <netdb.h>
 #include <unistd.h>
 #include <string.h>
+
+// If nothing else defined EAI_OVERFLOW, make sure it has a value.
+#ifndef EAI_OVERFLOW
+#define EAI_OVERFLOW -12
+#endif
 */
 
 import (
        "context"
+       "os"
        "syscall"
        "unsafe"
 )
@@ -51,6 +57,16 @@ func (eai addrinfoErrno) Error() string   { return bytePtrToString(libc_gai_stre
 func (eai addrinfoErrno) Temporary() bool { return eai == syscall.EAI_AGAIN }
 func (eai addrinfoErrno) Timeout() bool   { return false }
 
+func (eai addrinfoErrno) Is(target error) bool {
+       switch target {
+       case os.ErrTemporary:
+               return eai.Temporary()
+       case os.ErrTimeout:
+               return eai.Timeout()
+       }
+       return false
+}
+
 type portLookupResult struct {
        port int
        err  error
@@ -125,6 +141,7 @@ func cgoLookupServicePort(hints *syscall.Addrinfo, network, service string) (por
        gerrno := libc_getaddrinfo(nil, s, hints, &res)
        syscall.Exitsyscall()
        if gerrno != 0 {
+               isTemporary := false
                switch gerrno {
                case syscall.EAI_SYSTEM:
                        errno := syscall.GetErrno()
@@ -134,8 +151,9 @@ func cgoLookupServicePort(hints *syscall.Addrinfo, network, service string) (por
                        err = errno
                default:
                        err = addrinfoErrno(gerrno)
+                       isTemporary = addrinfoErrno(gerrno).Temporary()
                }
-               return 0, &DNSError{Err: err.Error(), Name: network + "/" + service}
+               return 0, &DNSError{Err: err.Error(), Name: network + "/" + service, IsTemporary: isTemporary}
        }
        defer libc_freeaddrinfo(res)
 
@@ -180,6 +198,8 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e
        gerrno := libc_getaddrinfo(h, nil, &hints, &res)
        syscall.Exitsyscall()
        if gerrno != 0 {
+               isErrorNoSuchHost := false
+               isTemporary := false
                switch gerrno {
                case syscall.EAI_SYSTEM:
                        errno := syscall.GetErrno()
@@ -196,10 +216,13 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e
                        err = errno
                case syscall.EAI_NONAME:
                        err = errNoSuchHost
+                       isErrorNoSuchHost = true
                default:
                        err = addrinfoErrno(gerrno)
+                       isTemporary = addrinfoErrno(gerrno).Temporary()
                }
-               return nil, "", &DNSError{Err: err.Error(), Name: name}
+
+               return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost, IsTemporary: isTemporary}
        }
        defer libc_freeaddrinfo(res)
 
@@ -320,6 +343,7 @@ func cgoLookupAddrPTR(addr string, sa *syscall.RawSockaddr, salen syscall.Sockle
                }
        }
        if gerrno != 0 {
+               isTemporary := false
                switch gerrno {
                case syscall.EAI_SYSTEM:
                        if err == nil { // see golang.org/issue/6232
@@ -327,8 +351,9 @@ func cgoLookupAddrPTR(addr string, sa *syscall.RawSockaddr, salen syscall.Sockle
                        }
                default:
                        err = addrinfoErrno(gerrno)
+                       isTemporary = addrinfoErrno(gerrno).Temporary()
                }
-               return nil, &DNSError{Err: err.Error(), Name: addr}
+               return nil, &DNSError{Err: err.Error(), Name: addr, IsTemporary: isTemporary}
        }
        for i := 0; i < len(b); i++ {
                if b[i] == 0 {
index 1dd8690739ef64a79c31d5bf58557c1e3c764800..4d55a95ddf6b9b6359b5544cad5af842dd88b213 100644 (file)
@@ -12,6 +12,12 @@ import (
        "time"
 )
 
+// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
+// See golang.org/issue/31510
+const (
+       defaultTCPKeepAlive = 15 * time.Second
+)
+
 // A Dialer contains options for connecting to an address.
 //
 // The zero value for each field is equivalent to dialing
@@ -63,12 +69,13 @@ type Dialer struct {
        // A negative value disables Fast Fallback support.
        FallbackDelay time.Duration
 
-       // KeepAlive specifies the keep-alive period for an active
-       // network connection.
-       // If zero, keep-alives are enabled if supported by the protocol
-       // and operating system. Network protocols or operating systems
-       // that do not support keep-alives ignore this field.
-       // If negative, keep-alives are disabled.
+       // KeepAlive specifies the interval between keep-alive
+       // probes for an active network connection.
+       // If zero, keep-alive probes are sent with a default value
+       // (currently 15 seconds), if supported by the protocol and operating
+       // system. Network protocols or operating systems that do
+       // not support keep-alives ignore this field.
+       // If negative, keep-alive probes are disabled.
        KeepAlive time.Duration
 
        // Resolver optionally specifies an alternate resolver to use.
@@ -76,7 +83,7 @@ type Dialer struct {
 
        // Cancel is an optional channel whose closure indicates that
        // the dial should be canceled. Not all types of dials support
-       // cancelation.
+       // cancellation.
        //
        // Deprecated: Use DialContext instead.
        Cancel <-chan struct{}
@@ -424,7 +431,7 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn
                setKeepAlive(tc.fd, true)
                ka := d.KeepAlive
                if d.KeepAlive == 0 {
-                       ka = 15 * time.Second
+                       ka = defaultTCPKeepAlive
                }
                setKeepAlivePeriod(tc.fd, ka)
                testHookSetKeepAlive(ka)
@@ -596,6 +603,14 @@ type ListenConfig struct {
        // necessarily the ones passed to Listen. For example, passing "tcp" to
        // Listen will cause the Control function to be called with "tcp4" or "tcp6".
        Control func(network, address string, c syscall.RawConn) error
+
+       // KeepAlive specifies the keep-alive period for network
+       // connections accepted by this listener.
+       // If zero, keep-alives are enabled if supported by the protocol
+       // and operating system. Network protocols or operating systems
+       // that do not support keep-alives ignore this field.
+       // If negative, keep-alives are disabled.
+       KeepAlive time.Duration
 }
 
 // Listen announces on the local network address.
index 3a2c59a2d1d6be90dba1db1eaa15f7080860097e..1bf96fd3ce33aa1a9235d61734697655f94a5230 100644 (file)
@@ -463,7 +463,7 @@ func TestDialParallelSpuriousConnection(t *testing.T) {
        origTestHookDialTCP := testHookDialTCP
        defer func() { testHookDialTCP = origTestHookDialTCP }()
        testHookDialTCP = func(ctx context.Context, net string, laddr, raddr *TCPAddr) (*TCPConn, error) {
-               // Sleep long enough for Happy Eyeballs to kick in, and inhibit cancelation.
+               // Sleep long enough for Happy Eyeballs to kick in, and inhibit cancellation.
                // This forces dialParallel to juggle two successful connections.
                time.Sleep(fallbackDelay * 2)
 
@@ -865,7 +865,7 @@ func TestCancelAfterDial(t *testing.T) {
                d := &Dialer{Cancel: cancel}
                c, err := d.Dial("tcp", ln.Addr().String())
 
-               // Immediately after dialing, request cancelation and sleep.
+               // Immediately after dialing, request cancellation and sleep.
                // Before Issue 15078 was fixed, this would cause subsequent operations
                // to fail with an i/o timeout roughly 50% of the time.
                close(cancel)
@@ -973,11 +973,11 @@ func TestDialerControl(t *testing.T) {
 }
 
 // mustHaveExternalNetwork is like testenv.MustHaveExternalNetwork
-// except that it won't skip testing on non-iOS builders.
+// except that it won't skip testing on non-mobile builders.
 func mustHaveExternalNetwork(t *testing.T) {
        t.Helper()
-       ios := runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")
-       if testenv.Builder() == "" || ios {
+       mobile := runtime.GOOS == "android" || runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")
+       if testenv.Builder() == "" || mobile {
                testenv.MustHaveExternalNetwork(t)
        }
 }
index 4fdf60ff4e35a183c4d3ea3828339bd8cf971cc3..b5bb3a4d11dee557fea2aece3c99ad8e631f1769 100644 (file)
@@ -8,7 +8,7 @@ import (
        "math/rand"
        "sort"
 
-       "internal/x/net/dns/dnsmessage"
+       "golang.org/x/net/dns/dnsmessage"
 )
 
 // reverseaddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP
index 94dbe95afa379f4609b05bb1f82b35e0de668897..b3284b8cd760d17172c86ef40fc61806c8504c7d 100644 (file)
@@ -23,7 +23,13 @@ import (
        "sync"
        "time"
 
-       "internal/x/net/dns/dnsmessage"
+       "golang.org/x/net/dns/dnsmessage"
+)
+
+const (
+       // to be used as a useTCP parameter to exchange
+       useTCPOnly  = true
+       useUDPOrTCP = false
 )
 
 var (
@@ -131,13 +137,19 @@ func dnsStreamRoundTrip(c Conn, id uint16, query dnsmessage.Question, b []byte)
 }
 
 // exchange sends a query on the connection and hopes for a response.
-func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Question, timeout time.Duration) (dnsmessage.Parser, dnsmessage.Header, error) {
+func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Question, timeout time.Duration, useTCP bool) (dnsmessage.Parser, dnsmessage.Header, error) {
        q.Class = dnsmessage.ClassINET
        id, udpReq, tcpReq, err := newRequest(q)
        if err != nil {
                return dnsmessage.Parser{}, dnsmessage.Header{}, errCannotMarshalDNSMessage
        }
-       for _, network := range []string{"udp", "tcp"} {
+       var networks []string
+       if useTCP {
+               networks = []string{"tcp"}
+       } else {
+               networks = []string{"udp", "tcp"}
+       }
+       for _, network := range networks {
                ctx, cancel := context.WithDeadline(ctx, time.Now().Add(timeout))
                defer cancel()
 
@@ -171,7 +183,7 @@ func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Que
 }
 
 // checkHeader performs basic sanity checks on the header.
-func checkHeader(p *dnsmessage.Parser, h dnsmessage.Header, name, server string) error {
+func checkHeader(p *dnsmessage.Parser, h dnsmessage.Header) error {
        if h.RCode == dnsmessage.RCodeNameError {
                return errNoSuchHost
        }
@@ -202,7 +214,7 @@ func checkHeader(p *dnsmessage.Parser, h dnsmessage.Header, name, server string)
        return nil
 }
 
-func skipToAnswer(p *dnsmessage.Parser, qtype dnsmessage.Type, name, server string) error {
+func skipToAnswer(p *dnsmessage.Parser, qtype dnsmessage.Type) error {
        for {
                h, err := p.AnswerHeader()
                if err == dnsmessage.ErrSectionDone {
@@ -241,7 +253,7 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string,
                for j := uint32(0); j < sLen; j++ {
                        server := cfg.servers[(serverOffset+j)%sLen]
 
-                       p, h, err := r.exchange(ctx, server, q, cfg.timeout)
+                       p, h, err := r.exchange(ctx, server, q, cfg.timeout, cfg.useTCP)
                        if err != nil {
                                dnsErr := &DNSError{
                                        Err:    err.Error(),
@@ -260,7 +272,7 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string,
                                continue
                        }
 
-                       if err := checkHeader(&p, h, name, server); err != nil {
+                       if err := checkHeader(&p, h); err != nil {
                                dnsErr := &DNSError{
                                        Err:    err.Error(),
                                        Name:   name,
@@ -272,17 +284,15 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string,
                                if err == errNoSuchHost {
                                        // The name does not exist, so trying
                                        // another server won't help.
-                                       //
-                                       // TODO: indicate this in a more
-                                       // obvious way, such as a field on
-                                       // DNSError?
+
+                                       dnsErr.IsNotFound = true
                                        return p, server, dnsErr
                                }
                                lastErr = dnsErr
                                continue
                        }
 
-                       err = skipToAnswer(&p, qtype, name, server)
+                       err = skipToAnswer(&p, qtype)
                        if err == nil {
                                return p, server, nil
                        }
@@ -294,9 +304,8 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string,
                        if err == errNoSuchHost {
                                // The name does not exist, so trying another
                                // server won't help.
-                               //
-                               // TODO: indicate this in a more obvious way,
-                               // such as a field on DNSError?
+
+                               lastErr.(*DNSError).IsNotFound = true
                                return p, server, lastErr
                        }
                }
@@ -386,7 +395,7 @@ func (r *Resolver) lookup(ctx context.Context, name string, qtype dnsmessage.Typ
                // Other lookups might allow broader name syntax
                // (for example Multicast DNS allows UTF-8; see RFC 6762).
                // For consistency with libc resolvers, report no such host.
-               return dnsmessage.Parser{}, "", &DNSError{Err: errNoSuchHost.Error(), Name: name}
+               return dnsmessage.Parser{}, "", &DNSError{Err: errNoSuchHost.Error(), Name: name, IsNotFound: true}
        }
        resolvConf.tryUpdate("/etc/resolv.conf")
        resolvConf.mu.RLock()
@@ -563,40 +572,58 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order
        }
        if !isDomainName(name) {
                // See comment in func lookup above about use of errNoSuchHost.
-               return nil, dnsmessage.Name{}, &DNSError{Err: errNoSuchHost.Error(), Name: name}
+               return nil, dnsmessage.Name{}, &DNSError{Err: errNoSuchHost.Error(), Name: name, IsNotFound: true}
        }
        resolvConf.tryUpdate("/etc/resolv.conf")
        resolvConf.mu.RLock()
        conf := resolvConf.dnsConfig
        resolvConf.mu.RUnlock()
-       type racer struct {
+       type result struct {
                p      dnsmessage.Parser
                server string
                error
        }
-       lane := make(chan racer, 1)
+       lane := make(chan result, 1)
        qtypes := [...]dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA}
-       var lastErr error
-       for _, fqdn := range conf.nameList(name) {
-               for _, qtype := range qtypes {
+       var queryFn func(fqdn string, qtype dnsmessage.Type)
+       var responseFn func(fqdn string, qtype dnsmessage.Type) result
+       if conf.singleRequest {
+               queryFn = func(fqdn string, qtype dnsmessage.Type) {}
+               responseFn = func(fqdn string, qtype dnsmessage.Type) result {
+                       dnsWaitGroup.Add(1)
+                       defer dnsWaitGroup.Done()
+                       p, server, err := r.tryOneName(ctx, conf, fqdn, qtype)
+                       return result{p, server, err}
+               }
+       } else {
+               queryFn = func(fqdn string, qtype dnsmessage.Type) {
                        dnsWaitGroup.Add(1)
                        go func(qtype dnsmessage.Type) {
                                p, server, err := r.tryOneName(ctx, conf, fqdn, qtype)
-                               lane <- racer{p, server, err}
+                               lane <- result{p, server, err}
                                dnsWaitGroup.Done()
                        }(qtype)
                }
+               responseFn = func(fqdn string, qtype dnsmessage.Type) result {
+                       return <-lane
+               }
+       }
+       var lastErr error
+       for _, fqdn := range conf.nameList(name) {
+               for _, qtype := range qtypes {
+                       queryFn(fqdn, qtype)
+               }
                hitStrictError := false
-               for range qtypes {
-                       racer := <-lane
-                       if racer.error != nil {
-                               if nerr, ok := racer.error.(Error); ok && nerr.Temporary() && r.strictErrors() {
+               for _, qtype := range qtypes {
+                       result := responseFn(fqdn, qtype)
+                       if result.error != nil {
+                               if nerr, ok := result.error.(Error); ok && nerr.Temporary() && r.strictErrors() {
                                        // This error will abort the nameList loop.
                                        hitStrictError = true
-                                       lastErr = racer.error
+                                       lastErr = result.error
                                } else if lastErr == nil || fqdn == name+"." {
                                        // Prefer error for original name.
-                                       lastErr = racer.error
+                                       lastErr = result.error
                                }
                                continue
                        }
@@ -618,12 +645,12 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order
 
                loop:
                        for {
-                               h, err := racer.p.AnswerHeader()
+                               h, err := result.p.AnswerHeader()
                                if err != nil && err != dnsmessage.ErrSectionDone {
                                        lastErr = &DNSError{
                                                Err:    "cannot marshal DNS message",
                                                Name:   name,
-                                               Server: racer.server,
+                                               Server: result.server,
                                        }
                                }
                                if err != nil {
@@ -631,35 +658,35 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order
                                }
                                switch h.Type {
                                case dnsmessage.TypeA:
-                                       a, err := racer.p.AResource()
+                                       a, err := result.p.AResource()
                                        if err != nil {
                                                lastErr = &DNSError{
                                                        Err:    "cannot marshal DNS message",
                                                        Name:   name,
-                                                       Server: racer.server,
+                                                       Server: result.server,
                                                }
                                                break loop
                                        }
                                        addrs = append(addrs, IPAddr{IP: IP(a.A[:])})
 
                                case dnsmessage.TypeAAAA:
-                                       aaaa, err := racer.p.AAAAResource()
+                                       aaaa, err := result.p.AAAAResource()
                                        if err != nil {
                                                lastErr = &DNSError{
                                                        Err:    "cannot marshal DNS message",
                                                        Name:   name,
-                                                       Server: racer.server,
+                                                       Server: result.server,
                                                }
                                                break loop
                                        }
                                        addrs = append(addrs, IPAddr{IP: IP(aaaa.AAAA[:])})
 
                                default:
-                                       if err := racer.p.SkipAnswer(); err != nil {
+                                       if err := result.p.SkipAnswer(); err != nil {
                                                lastErr = &DNSError{
                                                        Err:    "cannot marshal DNS message",
                                                        Name:   name,
-                                                       Server: racer.server,
+                                                       Server: result.server,
                                                }
                                                break loop
                                        }
index 93ecc6cf69cb7b81a4abb573d08c71b3bff6e9da..b51d60861f8e07ce959a408986d60002f6189d06 100644 (file)
@@ -17,10 +17,11 @@ import (
        "reflect"
        "strings"
        "sync"
+       "sync/atomic"
        "testing"
        "time"
 
-       "internal/x/net/dns/dnsmessage"
+       "golang.org/x/net/dns/dnsmessage"
 )
 
 var goResolver = Resolver{PreferGo: true}
@@ -29,7 +30,7 @@ var goResolver = Resolver{PreferGo: true}
 var TestAddr = [4]byte{0xc0, 0x00, 0x02, 0x01}
 
 // Test address from 2001:db8::/32 block, reserved by RFC 3849 for documentation.
-var VarTestAddr6 = [16]byte{0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
+var TestAddr6 = [16]byte{0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
 
 func mustNewName(name string) dnsmessage.Name {
        nn, err := dnsmessage.NewName(name)
@@ -80,7 +81,7 @@ func TestDNSTransportFallback(t *testing.T) {
        for _, tt := range dnsTransportFallbackTests {
                ctx, cancel := context.WithCancel(context.Background())
                defer cancel()
-               _, h, err := r.exchange(ctx, tt.server, tt.question, time.Second)
+               _, h, err := r.exchange(ctx, tt.server, tt.question, time.Second, useUDPOrTCP)
                if err != nil {
                        t.Error(err)
                        continue
@@ -136,7 +137,7 @@ func TestSpecialDomainName(t *testing.T) {
        for _, tt := range specialDomainNameTests {
                ctx, cancel := context.WithCancel(context.Background())
                defer cancel()
-               _, h, err := r.exchange(ctx, server, tt.question, 3*time.Second)
+               _, h, err := r.exchange(ctx, server, tt.question, 3*time.Second, useUDPOrTCP)
                if err != nil {
                        t.Error(err)
                        continue
@@ -522,7 +523,7 @@ func TestGoLookupIPWithResolverConfig(t *testing.T) {
                                                        Length: 16,
                                                },
                                                Body: &dnsmessage.AAAAResource{
-                                                       AAAA: VarTestAddr6,
+                                                       AAAA: TestAddr6,
                                                },
                                        })
                                }
@@ -588,6 +589,8 @@ func TestGoLookupIPOrderFallbackToFile(t *testing.T) {
        if err != nil {
                t.Fatal(err)
        }
+       defer conf.teardown()
+
        if err := conf.writeAndUpdate([]string{}); err != nil {
                t.Fatal(err)
        }
@@ -619,7 +622,6 @@ func TestGoLookupIPOrderFallbackToFile(t *testing.T) {
                        t.Errorf("%s: address doesn't match expectation. got %v, want %v", name, got, want)
                }
        }
-       defer conf.teardown()
 }
 
 // Issue 12712.
@@ -665,7 +667,7 @@ func TestErrorForOriginalNameWhenSearching(t *testing.T) {
                wantErr      *DNSError
        }{
                {true, &DNSError{Name: fqdn, Err: "server misbehaving", IsTemporary: true}},
-               {false, &DNSError{Name: fqdn, Err: errNoSuchHost.Error()}},
+               {false, &DNSError{Name: fqdn, Err: errNoSuchHost.Error(), IsNotFound: true}},
        }
        for _, tt := range cases {
                r := Resolver{PreferGo: true, StrictErrors: tt.strictErrors, Dial: fake.DialContext}
@@ -1137,9 +1139,10 @@ func TestStrictErrorsLookupIP(t *testing.T) {
        }
        makeNxDomain := func() error {
                return &DNSError{
-                       Err:    errNoSuchHost.Error(),
-                       Name:   name,
-                       Server: server,
+                       Err:        errNoSuchHost.Error(),
+                       Name:       name,
+                       Server:     server,
+                       IsNotFound: true,
                }
        }
 
@@ -1298,7 +1301,7 @@ func TestStrictErrorsLookupIP(t *testing.T) {
                                                        Length: 16,
                                                },
                                                Body: &dnsmessage.AAAAResource{
-                                                       AAAA: VarTestAddr6,
+                                                       AAAA: TestAddr6,
                                                },
                                        },
                                }
@@ -1471,6 +1474,32 @@ func TestIssue8434(t *testing.T) {
        }
 }
 
+func TestIssueNoSuchHostExists(t *testing.T) {
+       err := lookupWithFake(fakeDNSServer{
+               rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
+                       return dnsmessage.Message{
+                               Header: dnsmessage.Header{
+                                       ID:       q.ID,
+                                       Response: true,
+                                       RCode:    dnsmessage.RCodeNameError,
+                               },
+                               Questions: q.Questions,
+                       }, nil
+               },
+       }, "golang.org.", dnsmessage.TypeALL)
+       if err == nil {
+               t.Fatal("expected an error")
+       }
+       if _, ok := err.(Error); !ok {
+               t.Fatalf("err = %#v; wanted something supporting net.Error", err)
+       }
+       if de, ok := err.(*DNSError); !ok {
+               t.Fatalf("err = %#v; wanted a *net.DNSError", err)
+       } else if !de.IsNotFound {
+               t.Fatalf("IsNotFound = false for err = %#v; want IsNotFound == true", err)
+       }
+}
+
 // TestNoSuchHost verifies that tryOneName works correctly when the domain does
 // not exist.
 //
@@ -1540,6 +1569,9 @@ func TestNoSuchHost(t *testing.T) {
                        if de.Err != errNoSuchHost.Error() {
                                t.Fatalf("Err = %#v; wanted %q", de.Err, errNoSuchHost.Error())
                        }
+                       if !de.IsNotFound {
+                               t.Fatalf("IsNotFound = %v wanted true", de.IsNotFound)
+                       }
                })
        }
 }
@@ -1563,7 +1595,7 @@ func TestDNSDialTCP(t *testing.T) {
        }
        r := Resolver{PreferGo: true, Dial: fake.DialContext}
        ctx := context.Background()
-       _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second)
+       _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second, useUDPOrTCP)
        if err != nil {
                t.Fatal("exhange failed:", err)
        }
@@ -1621,3 +1653,103 @@ func TestTXTRecordTwoStrings(t *testing.T) {
                t.Errorf("txt[1], got %q, want %q", txt[1], want)
        }
 }
+
+// Issue 29644: support single-request resolv.conf option in pure Go resolver.
+// The A and AAAA queries will be sent sequentially, not in parallel.
+func TestSingleRequestLookup(t *testing.T) {
+       defer dnsWaitGroup.Wait()
+       var (
+               firstcalled int32
+               ipv4        int32 = 1
+               ipv6        int32 = 2
+       )
+       fake := fakeDNSServer{rh: func(n, s string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
+               r := dnsmessage.Message{
+                       Header: dnsmessage.Header{
+                               ID:       q.ID,
+                               Response: true,
+                       },
+                       Questions: q.Questions,
+               }
+               for _, question := range q.Questions {
+                       switch question.Type {
+                       case dnsmessage.TypeA:
+                               if question.Name.String() == "slowipv4.example.net." {
+                                       time.Sleep(10 * time.Millisecond)
+                               }
+                               if !atomic.CompareAndSwapInt32(&firstcalled, 0, ipv4) {
+                                       t.Errorf("the A query was received after the AAAA query !")
+                               }
+                               r.Answers = append(r.Answers, dnsmessage.Resource{
+                                       Header: dnsmessage.ResourceHeader{
+                                               Name:   q.Questions[0].Name,
+                                               Type:   dnsmessage.TypeA,
+                                               Class:  dnsmessage.ClassINET,
+                                               Length: 4,
+                                       },
+                                       Body: &dnsmessage.AResource{
+                                               A: TestAddr,
+                                       },
+                               })
+                       case dnsmessage.TypeAAAA:
+                               atomic.CompareAndSwapInt32(&firstcalled, 0, ipv6)
+                               r.Answers = append(r.Answers, dnsmessage.Resource{
+                                       Header: dnsmessage.ResourceHeader{
+                                               Name:   q.Questions[0].Name,
+                                               Type:   dnsmessage.TypeAAAA,
+                                               Class:  dnsmessage.ClassINET,
+                                               Length: 16,
+                                       },
+                                       Body: &dnsmessage.AAAAResource{
+                                               AAAA: TestAddr6,
+                                       },
+                               })
+                       }
+               }
+               return r, nil
+       }}
+       r := Resolver{PreferGo: true, Dial: fake.DialContext}
+
+       conf, err := newResolvConfTest()
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer conf.teardown()
+       if err := conf.writeAndUpdate([]string{"options single-request"}); err != nil {
+               t.Fatal(err)
+       }
+       for _, name := range []string{"hostname.example.net", "slowipv4.example.net"} {
+               firstcalled = 0
+               _, err := r.LookupIPAddr(context.Background(), name)
+               if err != nil {
+                       t.Error(err)
+               }
+       }
+}
+
+// Issue 29358. Add configuration knob to force TCP-only DNS requests in the pure Go resolver.
+func TestDNSUseTCP(t *testing.T) {
+       fake := fakeDNSServer{
+               rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
+                       r := dnsmessage.Message{
+                               Header: dnsmessage.Header{
+                                       ID:       q.Header.ID,
+                                       Response: true,
+                                       RCode:    dnsmessage.RCodeSuccess,
+                               },
+                               Questions: q.Questions,
+                       }
+                       if n == "udp" {
+                               t.Fatal("udp protocol was used instead of tcp")
+                       }
+                       return r, nil
+               },
+       }
+       r := Resolver{PreferGo: true, Dial: fake.DialContext}
+       ctx, cancel := context.WithCancel(context.Background())
+       defer cancel()
+       _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second, useTCPOnly)
+       if err != nil {
+               t.Fatal("exchange failed:", err)
+       }
+}
index 58ae4a35b75650137aad0a1724105a945dcea149..b76b32fb253ac99f4649f93db4e59a3cb7adf395 100644 (file)
@@ -21,17 +21,19 @@ var (
 )
 
 type dnsConfig struct {
-       servers    []string      // server addresses (in host:port form) to use
-       search     []string      // rooted suffixes to append to local name
-       ndots      int           // number of dots in name to trigger absolute lookup
-       timeout    time.Duration // wait before giving up on a query, including retries
-       attempts   int           // lost packets before giving up on server
-       rotate     bool          // round robin among servers
-       unknownOpt bool          // anything unknown was encountered
-       lookup     []string      // OpenBSD top-level database "lookup" order
-       err        error         // any error that occurs during open of resolv.conf
-       mtime      time.Time     // time of resolv.conf modification
-       soffset    uint32        // used by serverOffset
+       servers       []string      // server addresses (in host:port form) to use
+       search        []string      // rooted suffixes to append to local name
+       ndots         int           // number of dots in name to trigger absolute lookup
+       timeout       time.Duration // wait before giving up on a query, including retries
+       attempts      int           // lost packets before giving up on server
+       rotate        bool          // round robin among servers
+       unknownOpt    bool          // anything unknown was encountered
+       lookup        []string      // OpenBSD top-level database "lookup" order
+       err           error         // any error that occurs during open of resolv.conf
+       mtime         time.Time     // time of resolv.conf modification
+       soffset       uint32        // used by serverOffset
+       singleRequest bool          // use sequential A and AAAA queries instead of parallel queries
+       useTCP        bool          // force usage of TCP for DNS resolutions
 }
 
 // See resolv.conf(5) on a Linux machine.
@@ -115,6 +117,21 @@ func dnsReadConfig(filename string) *dnsConfig {
                                        conf.attempts = n
                                case s == "rotate":
                                        conf.rotate = true
+                               case s == "single-request" || s == "single-request-reopen":
+                                       // Linux option:
+                                       // http://man7.org/linux/man-pages/man5/resolv.conf.5.html
+                                       // "By default, glibc performs IPv4 and IPv6 lookups in parallel [...]
+                                       //  This option disables the behavior and makes glibc
+                                       //  perform the IPv6 and IPv4 requests sequentially."
+                                       conf.singleRequest = true
+                               case s == "use-vc" || s == "usevc" || s == "tcp":
+                                       // Linux (use-vc), FreeBSD (usevc) and OpenBSD (tcp) option:
+                                       // http://man7.org/linux/man-pages/man5/resolv.conf.5.html
+                                       // "Sets RES_USEVC in _res.options.
+                                       //  This option forces the use of TCP for DNS resolutions."
+                                       // https://www.freebsd.org/cgi/man.cgi?query=resolv.conf&sektion=5&manpath=freebsd-release-ports
+                                       // https://man.openbsd.org/resolv.conf.5
+                                       conf.useTCP = true
                                default:
                                        conf.unknownOpt = true
                                }
index 4a41b48e574942ac7c5e3f8dd28fff41cc61a8e4..2fca329350129a47770b217095088771c461c010 100644 (file)
@@ -102,6 +102,61 @@ var dnsReadConfigTests = []struct {
                        search:   []string{"c.symbolic-datum-552.internal."},
                },
        },
+       {
+               name: "testdata/single-request-resolv.conf",
+               want: &dnsConfig{
+                       servers:       defaultNS,
+                       ndots:         1,
+                       singleRequest: true,
+                       timeout:       5 * time.Second,
+                       attempts:      2,
+                       search:        []string{"domain.local."},
+               },
+       },
+       {
+               name: "testdata/single-request-reopen-resolv.conf",
+               want: &dnsConfig{
+                       servers:       defaultNS,
+                       ndots:         1,
+                       singleRequest: true,
+                       timeout:       5 * time.Second,
+                       attempts:      2,
+                       search:        []string{"domain.local."},
+               },
+       },
+       {
+               name: "testdata/linux-use-vc-resolv.conf",
+               want: &dnsConfig{
+                       servers:  defaultNS,
+                       ndots:    1,
+                       useTCP:   true,
+                       timeout:  5 * time.Second,
+                       attempts: 2,
+                       search:   []string{"domain.local."},
+               },
+       },
+       {
+               name: "testdata/freebsd-usevc-resolv.conf",
+               want: &dnsConfig{
+                       servers:  defaultNS,
+                       ndots:    1,
+                       useTCP:   true,
+                       timeout:  5 * time.Second,
+                       attempts: 2,
+                       search:   []string{"domain.local."},
+               },
+       },
+       {
+               name: "testdata/openbsd-tcp-resolv.conf",
+               want: &dnsConfig{
+                       servers:  defaultNS,
+                       ndots:    1,
+                       useTCP:   true,
+                       timeout:  5 * time.Second,
+                       attempts: 2,
+                       search:   []string{"domain.local."},
+               },
+       },
 }
 
 func TestDNSReadConfig(t *testing.T) {
index 2819986c0cd7cefb20a759050afb57666370a771..c4fee5aa5e54ae5ced3cdd2d59f0db97b0ad393a 100644 (file)
@@ -185,7 +185,7 @@ func TestDialError(t *testing.T) {
 
 func TestProtocolDialError(t *testing.T) {
        switch runtime.GOOS {
-       case "nacl", "solaris":
+       case "nacl", "solaris", "illumos":
                t.Skipf("not supported on %s", runtime.GOOS)
        }
 
@@ -436,7 +436,7 @@ second:
                goto third
        }
        switch nestedErr {
-       case poll.ErrNetClosing, poll.ErrTimeout:
+       case poll.ErrNetClosing, poll.ErrTimeout, poll.ErrNotPollable:
                return nil
        }
        return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
@@ -627,7 +627,7 @@ second:
                goto third
        }
        switch nestedErr {
-       case poll.ErrNetClosing, poll.ErrTimeout:
+       case poll.ErrNetClosing, poll.ErrTimeout, poll.ErrNotPollable:
                return nil
        }
        return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
index 42fe8804e5a59343e426a5722d5e6928deb1a6eb..286d3f1c92a7b638e89d72947ed6fe74dc38b873 100644 (file)
@@ -81,12 +81,12 @@ func (fd *netFD) connect(ctx context.Context, la, ra syscall.Sockaddr) (rsa sysc
                runtime.KeepAlive(fd)
                return nil, nil
        case syscall.EINVAL:
-               // On Solaris we can see EINVAL if the socket has
-               // already been accepted and closed by the server.
-               // Treat this as a successful connection--writes to
-               // the socket will see EOF.  For details and a test
-               // case in C see https://golang.org/issue/6828.
-               if runtime.GOOS == "solaris" {
+               // On Solaris and illumos we can see EINVAL if the socket has
+               // already been accepted and closed by the server.  Treat this
+               // as a successful connection--writes to the socket will see
+               // EOF.  For details and a test case in C see
+               // https://golang.org/issue/6828.
+               if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" {
                        return nil, nil
                }
                fallthrough
index d16e5a166c356635f2fa2e084d30dbcb44339e57..dfb23d2e8424d0fe5213a4fb65e9cbbd6cefb52f 100644 (file)
@@ -127,7 +127,7 @@ func fileListener(f *os.File) (Listener, error) {
                return nil, errors.New("file does not represent a listener")
        }
 
-       return &TCPListener{fd}, nil
+       return &TCPListener{fd: fd}, nil
 }
 
 func filePacketConn(f *os.File) (PacketConn, error) {
index 46ea8e25d84a921050bc7e04d8801fd3d78b5d21..25caafb9fa82288ca9c57dde1358a4029f3f9ba2 100644 (file)
@@ -93,7 +93,7 @@ func fileListener(f *os.File) (Listener, error) {
        }
        switch laddr := fd.laddr.(type) {
        case *TCPAddr:
-               return &TCPListener{fd}, nil
+               return &TCPListener{fd: fd}, nil
        case *UnixAddr:
                return &UnixListener{fd: fd, path: laddr.Name, unlink: false}, nil
        }
index 10325c2eb5ae023d7a511c1abfb85408f1c0777a..cb140f8f2f643e43b9b47a36bec57ecbac916abe 100644 (file)
@@ -102,7 +102,7 @@ func RequestFromMap(params map[string]string) (*http.Request, error) {
        }
 
        // There's apparently a de-facto standard for this.
-       // https://docstore.mik.ua/orelly/linux/cgi/ch03_02.htm#ch03-35636
+       // https://web.archive.org/web/20170105004655/http://docstore.mik.ua/orelly/linux/cgi/ch03_02.htm#ch03-35636
        if s := params["HTTPS"]; s == "on" || s == "ON" || s == "1" {
                r.TLS = &tls.ConnectionState{HandshakeComplete: true}
        }
index 921f86bd92dc742e18891837544787a034e11bb3..65a9d51cc6b179b944b78690db2e4fb3900476d2 100644 (file)
@@ -100,7 +100,7 @@ type Client struct {
        // For compatibility, the Client will also use the deprecated
        // CancelRequest method on Transport if found. New
        // RoundTripper implementations should use the Request's Context
-       // for cancelation instead of implementing CancelRequest.
+       // for cancellation instead of implementing CancelRequest.
        Timeout time.Duration
 }
 
@@ -238,7 +238,7 @@ func send(ireq *Request, rt RoundTripper, deadline time.Time) (resp *Response, d
                username := u.Username()
                password, _ := u.Password()
                forkReq()
-               req.Header = ireq.Header.clone()
+               req.Header = ireq.Header.Clone()
                req.Header.Set("Authorization", "Basic "+basicAuth(username, password))
        }
 
@@ -643,7 +643,7 @@ func (c *Client) do(req *Request) (retres *Response, reterr error) {
                        reqBodyClosed = true
                        if !deadline.IsZero() && didTimeout() {
                                err = &httpError{
-                                       // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancelation/
+                                       // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancellation/
                                        err:     err.Error() + " (Client.Timeout exceeded while awaiting headers)",
                                        timeout: true,
                                }
@@ -668,7 +668,7 @@ func (c *Client) makeHeadersCopier(ireq *Request) func(*Request) {
        // The headers to copy are from the very initial request.
        // We use a closured callback to keep a reference to these original headers.
        var (
-               ireqhdr  = ireq.Header.clone()
+               ireqhdr  = ireq.Header.Clone()
                icookies map[string][]*Cookie
        )
        if c.Jar != nil && ireq.Header.Get("Cookie") != "" {
@@ -870,7 +870,7 @@ func (b *cancelTimerBody) Read(p []byte) (n int, err error) {
        }
        if b.reqDidTimeout() {
                err = &httpError{
-                       // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancelation/
+                       // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancellation/
                        err:     err.Error() + " (Client.Timeout exceeded while reading body)",
                        timeout: true,
                }
@@ -926,10 +926,9 @@ func isDomainOrSubdomain(sub, parent string) bool {
 }
 
 func stripPassword(u *url.URL) string {
-       pass, passSet := u.User.Password()
+       _, passSet := u.User.Password()
        if passSet {
-               return strings.Replace(u.String(), pass+"@", "***@", 1)
+               return strings.Replace(u.String(), u.User.String()+"@", u.User.Username()+":***@", 1)
        }
-
        return u.String()
 }
index 1c59ce74352167edd60ca2c73f0fc62da07b4334..de490bc607493eda248e5040b40016e75888e696 100644 (file)
@@ -317,8 +317,7 @@ func TestClientRedirectContext(t *testing.T) {
                        return errors.New("redirected request's context never expired after root request canceled")
                }
        }
-       req, _ := NewRequest("GET", ts.URL, nil)
-       req = req.WithContext(ctx)
+       req, _ := NewRequestWithContext(ctx, "GET", ts.URL, nil)
        _, err := c.Do(req)
        ue, ok := err.(*url.Error)
        if !ok {
@@ -1185,6 +1184,11 @@ func TestStripPasswordFromError(t *testing.T) {
                        in:   "http://user:password@dummy.faketld/password",
                        out:  "Get http://user:***@dummy.faketld/password: dummy impl",
                },
+               {
+                       desc: "Strip escaped password",
+                       in:   "http://user:pa%2Fssword@dummy.faketld/",
+                       out:  "Get http://user:***@dummy.faketld/: dummy impl",
+               },
        }
        for _, tC := range testCases {
                t.Run(tC.desc, func(t *testing.T) {
@@ -1288,7 +1292,7 @@ func testClientTimeout_Headers(t *testing.T, h2 bool) {
        donec := make(chan bool, 1)
        cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
                <-donec
-       }))
+       }), optQuietLog)
        defer cst.close()
        // Note that we use a channel send here and not a close.
        // The race detector doesn't know that we're waiting for a timeout
index 4da218b25685b836ffa21b22c6cf10cfaf7a284b..ee48fb05ccd91feba8de3d872a312aa5441299a3 100644 (file)
@@ -560,7 +560,7 @@ func testCancelRequestMidBody(t *testing.T, h2 bool) {
        if all != "Hello" {
                t.Errorf("Read %q (%q + %q); want Hello", all, firstRead, rest)
        }
-       if !reflect.DeepEqual(err, ExportErrRequestCanceled) {
+       if err != ExportErrRequestCanceled {
                t.Errorf("ReadAll error = %v; want %v", err, ExportErrRequestCanceled)
        }
 }
diff --git a/libgo/go/net/http/clone.go b/libgo/go/net/http/clone.go
new file mode 100644 (file)
index 0000000..5f2784d
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package http
+
+import (
+       "mime/multipart"
+       "net/textproto"
+       "net/url"
+)
+
+func cloneURLValues(v url.Values) url.Values {
+       if v == nil {
+               return nil
+       }
+       // http.Header and url.Values have the same representation, so temporarily
+       // treat it like http.Header, which does have a clone:
+       return url.Values(Header(v).Clone())
+}
+
+func cloneURL(u *url.URL) *url.URL {
+       if u == nil {
+               return nil
+       }
+       u2 := new(url.URL)
+       *u2 = *u
+       if u.User != nil {
+               u2.User = new(url.Userinfo)
+               *u2.User = *u.User
+       }
+       return u2
+}
+
+func cloneMultipartForm(f *multipart.Form) *multipart.Form {
+       if f == nil {
+               return nil
+       }
+       f2 := &multipart.Form{
+               Value: (map[string][]string)(Header(f.Value).Clone()),
+       }
+       if f.File != nil {
+               m := make(map[string][]*multipart.FileHeader)
+               for k, vv := range f.File {
+                       vv2 := make([]*multipart.FileHeader, len(vv))
+                       for i, v := range vv {
+                               vv2[i] = cloneMultipartFileHeader(v)
+                       }
+                       m[k] = vv2
+               }
+               f2.File = m
+       }
+       return f2
+}
+
+func cloneMultipartFileHeader(fh *multipart.FileHeader) *multipart.FileHeader {
+       if fh == nil {
+               return nil
+       }
+       fh2 := new(multipart.FileHeader)
+       *fh2 = *fh
+       fh2.Header = textproto.MIMEHeader(Header(fh.Header).Clone())
+       return fh2
+}
index 63f62214db825d787b9a10bacb940ff31b0ced4b..91ff544e79f2b558ef952362c6dc01476df469b3 100644 (file)
@@ -48,6 +48,7 @@ const (
        SameSiteDefaultMode SameSite = iota + 1
        SameSiteLaxMode
        SameSiteStrictMode
+       SameSiteNoneMode
 )
 
 // readSetCookies parses all "Set-Cookie" values from
@@ -105,6 +106,8 @@ func readSetCookies(h Header) []*Cookie {
                                        c.SameSite = SameSiteLaxMode
                                case "strict":
                                        c.SameSite = SameSiteStrictMode
+                               case "none":
+                                       c.SameSite = SameSiteNoneMode
                                default:
                                        c.SameSite = SameSiteDefaultMode
                                }
@@ -168,8 +171,12 @@ func (c *Cookie) String() string {
        if c == nil || !isCookieNameValid(c.Name) {
                return ""
        }
+       // extraCookieLength derived from typical length of cookie attributes
+       // see RFC 6265 Sec 4.1.
+       const extraCookieLength = 110
        var b strings.Builder
-       b.WriteString(sanitizeCookieName(c.Name))
+       b.Grow(len(c.Name) + len(c.Value) + len(c.Domain) + len(c.Path) + extraCookieLength)
+       b.WriteString(c.Name)
        b.WriteRune('=')
        b.WriteString(sanitizeCookieValue(c.Value))
 
@@ -213,6 +220,8 @@ func (c *Cookie) String() string {
        switch c.SameSite {
        case SameSiteDefaultMode:
                b.WriteString("; SameSite")
+       case SameSiteNoneMode:
+               b.WriteString("; SameSite=None")
        case SameSiteLaxMode:
                b.WriteString("; SameSite=Lax")
        case SameSiteStrictMode:
@@ -226,25 +235,28 @@ func (c *Cookie) String() string {
 //
 // if filter isn't empty, only cookies of that name are returned
 func readCookies(h Header, filter string) []*Cookie {
-       lines, ok := h["Cookie"]
-       if !ok {
+       lines := h["Cookie"]
+       if len(lines) == 0 {
                return []*Cookie{}
        }
 
-       cookies := []*Cookie{}
+       cookies := make([]*Cookie, 0, len(lines)+strings.Count(lines[0], ";"))
        for _, line := range lines {
-               parts := strings.Split(strings.TrimSpace(line), ";")
-               if len(parts) == 1 && parts[0] == "" {
-                       continue
-               }
-               // Per-line attributes
-               for i := 0; i < len(parts); i++ {
-                       parts[i] = strings.TrimSpace(parts[i])
-                       if len(parts[i]) == 0 {
+               line = strings.TrimSpace(line)
+
+               var part string
+               for len(line) > 0 { // continue since we have rest
+                       if splitIndex := strings.Index(line, ";"); splitIndex > 0 {
+                               part, line = line[:splitIndex], line[splitIndex+1:]
+                       } else {
+                               part, line = line, ""
+                       }
+                       part = strings.TrimSpace(part)
+                       if len(part) == 0 {
                                continue
                        }
-                       name, val := parts[i], ""
-                       if j := strings.Index(name, "="); j >= 0 {
+                       name, val := part, ""
+                       if j := strings.Index(part, "="); j >= 0 {
                                name, val = name[:j], name[j+1:]
                        }
                        if !isCookieNameValid(name) {
index 022adaa90def4fa608b62b2d48c0da1906cadb2c..9e8196ebce0f517883e26e4bbfea1e81f08b2606 100644 (file)
@@ -77,6 +77,10 @@ var writeSetCookiesTests = []struct {
                &Cookie{Name: "cookie-14", Value: "samesite-strict", SameSite: SameSiteStrictMode},
                "cookie-14=samesite-strict; SameSite=Strict",
        },
+       {
+               &Cookie{Name: "cookie-15", Value: "samesite-none", SameSite: SameSiteNoneMode},
+               "cookie-15=samesite-none; SameSite=None",
+       },
        // The "special" cookies have values containing commas or spaces which
        // are disallowed by RFC 6265 but are common in the wild.
        {
@@ -127,6 +131,22 @@ var writeSetCookiesTests = []struct {
                &Cookie{Name: "\t"},
                ``,
        },
+       {
+               &Cookie{Name: "\r"},
+               ``,
+       },
+       {
+               &Cookie{Name: "a\nb", Value: "v"},
+               ``,
+       },
+       {
+               &Cookie{Name: "a\nb", Value: "v"},
+               ``,
+       },
+       {
+               &Cookie{Name: "a\rb", Value: "v"},
+               ``,
+       },
 }
 
 func TestWriteSetCookies(t *testing.T) {
@@ -280,6 +300,15 @@ var readSetCookiesTests = []struct {
                        Raw:      "samesitestrict=foo; SameSite=Strict",
                }},
        },
+       {
+               Header{"Set-Cookie": {"samesitenone=foo; SameSite=None"}},
+               []*Cookie{{
+                       Name:     "samesitenone",
+                       Value:    "foo",
+                       SameSite: SameSiteNoneMode,
+                       Raw:      "samesitenone=foo; SameSite=None",
+               }},
+       },
        // Make sure we can properly read back the Set-Cookie headers we create
        // for values containing spaces or commas:
        {
@@ -385,6 +414,19 @@ var readCookiesTests = []struct {
                        {Name: "c2", Value: "v2"},
                },
        },
+       {
+               Header{"Cookie": {`Cookie-1="v$1"; c2=v2;`}},
+               "",
+               []*Cookie{
+                       {Name: "Cookie-1", Value: "v$1"},
+                       {Name: "c2", Value: "v2"},
+               },
+       },
+       {
+               Header{"Cookie": {``}},
+               "",
+               []*Cookie{},
+       },
 }
 
 func TestReadCookies(t *testing.T) {
index b6965c239e95ecbdcf000d0f53dd7744a55546fa..f0dfa8cd336c7a4efdf745bc625f984a4db9b3ff 100644 (file)
@@ -33,6 +33,7 @@ var (
        ExportHttp2ConfigureServer        = http2ConfigureServer
        Export_shouldCopyHeaderOnRedirect = shouldCopyHeaderOnRedirect
        Export_writeStatusLine            = writeStatusLine
+       Export_is408Message               = is408Message
 )
 
 const MaxWriteWaitBeforeConnReuse = maxWriteWaitBeforeConnReuse
@@ -244,3 +245,18 @@ func ExportSetH2GoawayTimeout(d time.Duration) (restore func()) {
 }
 
 func (r *Request) ExportIsReplayable() bool { return r.isReplayable() }
+
+// ExportCloseTransportConnsAbruptly closes all idle connections from
+// tr in an abrupt way, just reaching into the underlying Conns and
+// closing them, without telling the Transport or its persistConns
+// that it's doing so. This is to simulate the server closing connections
+// on the Transport.
+func ExportCloseTransportConnsAbruptly(tr *Transport) {
+       tr.idleMu.Lock()
+       for _, pcs := range tr.idleConn {
+               for _, pc := range pcs {
+                       pc.conn.Close()
+               }
+       }
+       tr.idleMu.Unlock()
+}
index db44d6b0296eb0e76095f6ad712cfc353a53935e..41d46dced2a96d803ed66b797bf44778ba613f3b 100644 (file)
@@ -63,6 +63,8 @@ func mapDirOpenError(originalErr error, name string) error {
        return originalErr
 }
 
+// Open implements FileSystem using os.Open, opening files for reading rooted
+// and relative to the directory d.
 func (d Dir) Open(name string) (File, error) {
        if filepath.Separator != '/' && strings.ContainsRune(name, filepath.Separator) {
                return nil, errors.New("http: invalid character in file path")
index a848d68fd9c39a461983c89fab5e03c1bc71f301..2efa0ef125b5599184122b7facd42399d1784f2a 100644 (file)
@@ -1,5 +1,5 @@
 // Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.
-//go:generate bundle -o h2_bundle.go -prefix http2 -underscore golang.org/x/net/http2
+//go:generate bundle -o h2_bundle.go -prefix http2 golang.org/x/net/http2
 
 // Package http2 implements the HTTP/2 protocol.
 //
@@ -42,11 +42,12 @@ import (
        "strconv"
        "strings"
        "sync"
+       "sync/atomic"
        "time"
 
-       "internal/x/net/http/httpguts"
-       "internal/x/net/http2/hpack"
-       "internal/x/net/idna"
+       "golang.org/x/net/http/httpguts"
+       "golang.org/x/net/http2/hpack"
+       "golang.org/x/net/idna"
 )
 
 // A list of the possible cipher suite ids. Taken from
@@ -1885,7 +1886,7 @@ func (f *http2Framer) WriteData(streamID uint32, endStream bool, data []byte) er
        return f.WriteDataPadded(streamID, endStream, data, nil)
 }
 
-// WriteData writes a DATA frame with optional padding.
+// WriteDataPadded writes a DATA frame with optional padding.
 //
 // If pad is nil, the padding bit is not sent.
 // The length of pad must not exceed 255 bytes.
@@ -3831,7 +3832,20 @@ func http2ConfigureServer(s *Server, conf *http2Server) error {
                if http2testHookOnConn != nil {
                        http2testHookOnConn()
                }
+               // The TLSNextProto interface predates contexts, so
+               // the net/http package passes down its per-connection
+               // base context via an exported but unadvertised
+               // method on the Handler. This is for internal
+               // net/http<=>http2 use only.
+               var ctx context.Context
+               type baseContexter interface {
+                       BaseContext() context.Context
+               }
+               if bc, ok := h.(baseContexter); ok {
+                       ctx = bc.BaseContext()
+               }
                conf.ServeConn(c, &http2ServeConnOpts{
+                       Context:    ctx,
                        Handler:    h,
                        BaseConfig: hs,
                })
@@ -3842,6 +3856,10 @@ func http2ConfigureServer(s *Server, conf *http2Server) error {
 
 // ServeConnOpts are options for the Server.ServeConn method.
 type http2ServeConnOpts struct {
+       // Context is the base context to use.
+       // If nil, context.Background is used.
+       Context context.Context
+
        // BaseConfig optionally sets the base configuration
        // for values. If nil, defaults are used.
        BaseConfig *Server
@@ -3852,6 +3870,13 @@ type http2ServeConnOpts struct {
        Handler Handler
 }
 
+func (o *http2ServeConnOpts) context() context.Context {
+       if o.Context != nil {
+               return o.Context
+       }
+       return context.Background()
+}
+
 func (o *http2ServeConnOpts) baseConfig() *Server {
        if o != nil && o.BaseConfig != nil {
                return o.BaseConfig
@@ -3997,7 +4022,7 @@ func (s *http2Server) ServeConn(c net.Conn, opts *http2ServeConnOpts) {
 }
 
 func http2serverConnBaseContext(c net.Conn, opts *http2ServeConnOpts) (ctx context.Context, cancel func()) {
-       ctx, cancel = context.WithCancel(context.Background())
+       ctx, cancel = context.WithCancel(opts.context())
        ctx = context.WithValue(ctx, LocalAddrContextKey, c.LocalAddr())
        if hs := opts.baseConfig(); hs != nil {
                ctx = context.WithValue(ctx, ServerContextKey, hs)
@@ -5870,7 +5895,16 @@ type http2chunkWriter struct{ rws *http2responseWriterState }
 
 func (cw http2chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
 
-func (rws *http2responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 }
+func (rws *http2responseWriterState) hasTrailers() bool { return len(rws.trailers) > 0 }
+
+func (rws *http2responseWriterState) hasNonemptyTrailers() bool {
+       for _, trailer := range rws.trailers {
+               if _, ok := rws.handlerHeader[trailer]; ok {
+                       return true
+               }
+       }
+       return false
+}
 
 // declareTrailer is called for each Trailer header when the
 // response header is written. It notes that a header will need to be
@@ -5970,7 +6004,10 @@ func (rws *http2responseWriterState) writeChunk(p []byte) (n int, err error) {
                rws.promoteUndeclaredTrailers()
        }
 
-       endStream := rws.handlerDone && !rws.hasTrailers()
+       // only send trailers if they have actually been defined by the
+       // server handler.
+       hasNonemptyTrailers := rws.hasNonemptyTrailers()
+       endStream := rws.handlerDone && !hasNonemptyTrailers
        if len(p) > 0 || endStream {
                // only send a 0 byte DATA frame if we're ending the stream.
                if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
@@ -5979,7 +6016,7 @@ func (rws *http2responseWriterState) writeChunk(p []byte) (n int, err error) {
                }
        }
 
-       if rws.handlerDone && rws.hasTrailers() {
+       if rws.handlerDone && hasNonemptyTrailers {
                err = rws.conn.writeHeaders(rws.stream, &http2writeResHeaders{
                        streamID:  rws.stream.id,
                        h:         rws.handlerHeader,
@@ -6621,6 +6658,7 @@ type http2ClientConn struct {
        t         *http2Transport
        tconn     net.Conn             // usually *tls.Conn, except specialized impls
        tlsState  *tls.ConnectionState // nil only for specialized impls
+       reused    uint32               // whether conn is being reused; atomic
        singleUse bool                 // whether being used for a single http.Request
 
        // readLoop goroutine fields:
@@ -6863,7 +6901,8 @@ func (t *http2Transport) RoundTripOpt(req *Request, opt http2RoundTripOpt) (*Res
                        t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
                        return nil, err
                }
-               http2traceGotConn(req, cc)
+               reused := !atomic.CompareAndSwapUint32(&cc.reused, 0, 1)
+               http2traceGotConn(req, cc, reused)
                res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req)
                if err != nil && retry <= 6 {
                        if req, err = http2shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil {
@@ -7849,7 +7888,11 @@ func (cc *http2ClientConn) encodeHeaders(req *Request, addGzipHeader bool, trail
                // followed by the query production (see Sections 3.3 and 3.4 of
                // [RFC3986]).
                f(":authority", host)
-               f(":method", req.Method)
+               m := req.Method
+               if m == "" {
+                       m = MethodGet
+               }
+               f(":method", m)
                if req.Method != "CONNECT" {
                        f(":path", path)
                        f(":scheme", req.URL.Scheme)
@@ -8993,15 +9036,15 @@ func http2traceGetConn(req *Request, hostPort string) {
        trace.GetConn(hostPort)
 }
 
-func http2traceGotConn(req *Request, cc *http2ClientConn) {
+func http2traceGotConn(req *Request, cc *http2ClientConn, reused bool) {
        trace := httptrace.ContextClientTrace(req.Context())
        if trace == nil || trace.GotConn == nil {
                return
        }
        ci := httptrace.GotConnInfo{Conn: cc.tconn}
+       ci.Reused = reused
        cc.mu.Lock()
-       ci.Reused = cc.nextStreamID > 1
-       ci.WasIdle = len(cc.streams) == 0 && ci.Reused
+       ci.WasIdle = len(cc.streams) == 0 && reused
        if ci.WasIdle && !cc.lastActive.IsZero() {
                ci.IdleTime = time.Now().Sub(cc.lastActive)
        }
index b699e7ef8ffb13515d87665d1ea19ac875c9bdbd..1e1ed981ecc1961b626e2c0441f38ebbfdde07ca 100644 (file)
@@ -78,12 +78,19 @@ func (h Header) write(w io.Writer, trace *httptrace.ClientTrace) error {
        return h.writeSubset(w, nil, trace)
 }
 
-func (h Header) clone() Header {
+// Clone returns a copy of h.
+func (h Header) Clone() Header {
+       // Find total number of values.
+       nv := 0
+       for _, vv := range h {
+               nv += len(vv)
+       }
+       sv := make([]string, nv) // shared backing array for headers' values
        h2 := make(Header, len(h))
        for k, vv := range h {
-               vv2 := make([]string, len(vv))
-               copy(vv2, vv)
-               h2[k] = vv2
+               n := copy(sv, vv)
+               h2[k] = sv[:n:n]
+               sv = sv[n:]
        }
        return h2
 }
index e5d59e14120baa18eeea51f2c8ea76072124aa26..3510fe604d091a220004df33d5f8e27dd5c39105 100644 (file)
@@ -11,7 +11,7 @@ import (
        "time"
        "unicode/utf8"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // maxInt64 is the effective "infinite" value for the Server and
@@ -19,7 +19,7 @@ import (
 const maxInt64 = 1<<63 - 1
 
 // aLongTimeAgo is a non-zero time, far in the past, used for
-// immediate cancelation of network operations.
+// immediate cancellation of network operations.
 var aLongTimeAgo = time.Unix(1, 0)
 
 // TODO(bradfitz): move common stuff here. The other files have accumulated
index f2c3c0757bacf4f3bb99a91e54fd81faa5a5eb2e..d0bc0fade98d91abe87e05d328b4414e49c707b7 100644 (file)
@@ -12,7 +12,7 @@ import (
        "strconv"
        "strings"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // ResponseRecorder is an implementation of http.ResponseWriter that
@@ -59,7 +59,10 @@ func NewRecorder() *ResponseRecorder {
 // an explicit DefaultRemoteAddr isn't set on ResponseRecorder.
 const DefaultRemoteAddr = "1.2.3.4"
 
-// Header returns the response headers.
+// Header implements http.ResponseWriter. It returns the response
+// headers to mutate within a handler. To test the headers that were
+// written after a handler completes, use the Result method and see
+// the returned Response value's Header.
 func (rw *ResponseRecorder) Header() http.Header {
        m := rw.HeaderMap
        if m == nil {
@@ -98,7 +101,8 @@ func (rw *ResponseRecorder) writeHeader(b []byte, str string) {
        rw.WriteHeader(200)
 }
 
-// Write always succeeds and writes to rw.Body, if not nil.
+// Write implements http.ResponseWriter. The data in buf is written to
+// rw.Body, if not nil.
 func (rw *ResponseRecorder) Write(buf []byte) (int, error) {
        rw.writeHeader(buf, "")
        if rw.Body != nil {
@@ -107,7 +111,8 @@ func (rw *ResponseRecorder) Write(buf []byte) (int, error) {
        return len(buf), nil
 }
 
-// WriteString always succeeds and writes to rw.Body, if not nil.
+// WriteString implements io.StringWriter. The data in str is written
+// to rw.Body, if not nil.
 func (rw *ResponseRecorder) WriteString(str string) (int, error) {
        rw.writeHeader(nil, str)
        if rw.Body != nil {
@@ -116,8 +121,7 @@ func (rw *ResponseRecorder) WriteString(str string) (int, error) {
        return len(str), nil
 }
 
-// WriteHeader sets rw.Code. After it is called, changing rw.Header
-// will not affect rw.HeaderMap.
+// WriteHeader implements http.ResponseWriter.
 func (rw *ResponseRecorder) WriteHeader(code int) {
        if rw.wroteHeader {
                return
@@ -127,20 +131,11 @@ func (rw *ResponseRecorder) WriteHeader(code int) {
        if rw.HeaderMap == nil {
                rw.HeaderMap = make(http.Header)
        }
-       rw.snapHeader = cloneHeader(rw.HeaderMap)
+       rw.snapHeader = rw.HeaderMap.Clone()
 }
 
-func cloneHeader(h http.Header) http.Header {
-       h2 := make(http.Header, len(h))
-       for k, vv := range h {
-               vv2 := make([]string, len(vv))
-               copy(vv2, vv)
-               h2[k] = vv2
-       }
-       return h2
-}
-
-// Flush sets rw.Flushed to true.
+// Flush implements http.Flusher. To test whether Flush was
+// called, see rw.Flushed.
 func (rw *ResponseRecorder) Flush() {
        if !rw.wroteHeader {
                rw.WriteHeader(200)
@@ -168,7 +163,7 @@ func (rw *ResponseRecorder) Result() *http.Response {
                return rw.result
        }
        if rw.snapHeader == nil {
-               rw.snapHeader = cloneHeader(rw.HeaderMap)
+               rw.snapHeader = rw.HeaderMap.Clone()
        }
        res := &http.Response{
                Proto:      "HTTP/1.1",
index 63312dd885690ce6a66569dfe3cc166d23c35876..97954ca88d0d1f0f9c1e4f8b95a1222beec22104 100644 (file)
@@ -18,7 +18,10 @@ import (
 )
 
 type dumpTest struct {
-       Req  http.Request
+       // Either Req or GetReq can be set/nil but not both.
+       Req    *http.Request
+       GetReq func() *http.Request
+
        Body interface{} // optional []byte or func() io.ReadCloser to populate Req.Body
 
        WantDump    string
@@ -29,7 +32,7 @@ type dumpTest struct {
 var dumpTests = []dumpTest{
        // HTTP/1.1 => chunked coding; body; empty trailer
        {
-               Req: http.Request{
+               Req: &http.Request{
                        Method: "GET",
                        URL: &url.URL{
                                Scheme: "http",
@@ -52,7 +55,7 @@ var dumpTests = []dumpTest{
        // Verify that DumpRequest preserves the HTTP version number, doesn't add a Host,
        // and doesn't add a User-Agent.
        {
-               Req: http.Request{
+               Req: &http.Request{
                        Method:     "GET",
                        URL:        mustParseURL("/foo"),
                        ProtoMajor: 1,
@@ -67,7 +70,7 @@ var dumpTests = []dumpTest{
        },
 
        {
-               Req: *mustNewRequest("GET", "http://example.com/foo", nil),
+               Req: mustNewRequest("GET", "http://example.com/foo", nil),
 
                WantDumpOut: "GET /foo HTTP/1.1\r\n" +
                        "Host: example.com\r\n" +
@@ -79,8 +82,7 @@ var dumpTests = []dumpTest{
        // with a bytes.Buffer and hang with all goroutines not
        // runnable.
        {
-               Req: *mustNewRequest("GET", "https://example.com/foo", nil),
-
+               Req: mustNewRequest("GET", "https://example.com/foo", nil),
                WantDumpOut: "GET /foo HTTP/1.1\r\n" +
                        "Host: example.com\r\n" +
                        "User-Agent: Go-http-client/1.1\r\n" +
@@ -89,7 +91,7 @@ var dumpTests = []dumpTest{
 
        // Request with Body, but Dump requested without it.
        {
-               Req: http.Request{
+               Req: &http.Request{
                        Method: "POST",
                        URL: &url.URL{
                                Scheme: "http",
@@ -114,7 +116,7 @@ var dumpTests = []dumpTest{
 
        // Request with Body > 8196 (default buffer size)
        {
-               Req: http.Request{
+               Req: &http.Request{
                        Method: "POST",
                        URL: &url.URL{
                                Scheme: "http",
@@ -145,8 +147,10 @@ var dumpTests = []dumpTest{
        },
 
        {
-               Req: *mustReadRequest("GET http://foo.com/ HTTP/1.1\r\n" +
-                       "User-Agent: blah\r\n\r\n"),
+               GetReq: func() *http.Request {
+                       return mustReadRequest("GET http://foo.com/ HTTP/1.1\r\n" +
+                               "User-Agent: blah\r\n\r\n")
+               },
                NoBody: true,
                WantDump: "GET http://foo.com/ HTTP/1.1\r\n" +
                        "User-Agent: blah\r\n\r\n",
@@ -154,22 +158,25 @@ var dumpTests = []dumpTest{
 
        // Issue #7215. DumpRequest should return the "Content-Length" when set
        {
-               Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
-                       "Host: passport.myhost.com\r\n" +
-                       "Content-Length: 3\r\n" +
-                       "\r\nkey1=name1&key2=name2"),
+               GetReq: func() *http.Request {
+                       return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
+                               "Host: passport.myhost.com\r\n" +
+                               "Content-Length: 3\r\n" +
+                               "\r\nkey1=name1&key2=name2")
+               },
                WantDump: "POST /v2/api/?login HTTP/1.1\r\n" +
                        "Host: passport.myhost.com\r\n" +
                        "Content-Length: 3\r\n" +
                        "\r\nkey",
        },
-
        // Issue #7215. DumpRequest should return the "Content-Length" in ReadRequest
        {
-               Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
-                       "Host: passport.myhost.com\r\n" +
-                       "Content-Length: 0\r\n" +
-                       "\r\nkey1=name1&key2=name2"),
+               GetReq: func() *http.Request {
+                       return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
+                               "Host: passport.myhost.com\r\n" +
+                               "Content-Length: 0\r\n" +
+                               "\r\nkey1=name1&key2=name2")
+               },
                WantDump: "POST /v2/api/?login HTTP/1.1\r\n" +
                        "Host: passport.myhost.com\r\n" +
                        "Content-Length: 0\r\n\r\n",
@@ -177,9 +184,11 @@ var dumpTests = []dumpTest{
 
        // Issue #7215. DumpRequest should not return the "Content-Length" if unset
        {
-               Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
-                       "Host: passport.myhost.com\r\n" +
-                       "\r\nkey1=name1&key2=name2"),
+               GetReq: func() *http.Request {
+                       return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" +
+                               "Host: passport.myhost.com\r\n" +
+                               "\r\nkey1=name1&key2=name2")
+               },
                WantDump: "POST /v2/api/?login HTTP/1.1\r\n" +
                        "Host: passport.myhost.com\r\n\r\n",
        },
@@ -187,8 +196,7 @@ var dumpTests = []dumpTest{
        // Issue 18506: make drainBody recognize NoBody. Otherwise
        // this was turning into a chunked request.
        {
-               Req: *mustNewRequest("POST", "http://example.com/foo", http.NoBody),
-
+               Req: mustNewRequest("POST", "http://example.com/foo", http.NoBody),
                WantDumpOut: "POST /foo HTTP/1.1\r\n" +
                        "Host: example.com\r\n" +
                        "User-Agent: Go-http-client/1.1\r\n" +
@@ -200,28 +208,40 @@ var dumpTests = []dumpTest{
 func TestDumpRequest(t *testing.T) {
        numg0 := runtime.NumGoroutine()
        for i, tt := range dumpTests {
-               setBody := func() {
-                       if tt.Body == nil {
-                               return
+               if tt.Req != nil && tt.GetReq != nil || tt.Req == nil && tt.GetReq == nil {
+                       t.Errorf("#%d: either .Req(%p) or .GetReq(%p) can be set/nil but not both", i, tt.Req, tt.GetReq)
+                       continue
+               }
+
+               freshReq := func(ti dumpTest) *http.Request {
+                       req := ti.Req
+                       if req == nil {
+                               req = ti.GetReq()
                        }
-                       switch b := tt.Body.(type) {
+
+                       if req.Header == nil {
+                               req.Header = make(http.Header)
+                       }
+
+                       if ti.Body == nil {
+                               return req
+                       }
+                       switch b := ti.Body.(type) {
                        case []byte:
-                               tt.Req.Body = ioutil.NopCloser(bytes.NewReader(b))
+                               req.Body = ioutil.NopCloser(bytes.NewReader(b))
                        case func() io.ReadCloser:
-                               tt.Req.Body = b()
+                               req.Body = b()
                        default:
-                               t.Fatalf("Test %d: unsupported Body of %T", i, tt.Body)
+                               t.Fatalf("Test %d: unsupported Body of %T", i, ti.Body)
                        }
-               }
-               if tt.Req.Header == nil {
-                       tt.Req.Header = make(http.Header)
+                       return req
                }
 
                if tt.WantDump != "" {
-                       setBody()
-                       dump, err := DumpRequest(&tt.Req, !tt.NoBody)
+                       req := freshReq(tt)
+                       dump, err := DumpRequest(req, !tt.NoBody)
                        if err != nil {
-                               t.Errorf("DumpRequest #%d: %s", i, err)
+                               t.Errorf("DumpRequest #%d: %s\nWantDump:\n%s", i, err, tt.WantDump)
                                continue
                        }
                        if string(dump) != tt.WantDump {
@@ -231,8 +251,8 @@ func TestDumpRequest(t *testing.T) {
                }
 
                if tt.WantDumpOut != "" {
-                       setBody()
-                       dump, err := DumpRequestOut(&tt.Req, !tt.NoBody)
+                       req := freshReq(tt)
+                       dump, err := DumpRequestOut(req, !tt.NoBody)
                        if err != nil {
                                t.Errorf("DumpRequestOut #%d: %s", i, err)
                                continue
index cbedf25ad1be5c5bc03ee10a31ed7ac9da885045..84b116df8cf8bfbcd63639ea4acf576e8f7cacf6 100644 (file)
@@ -292,8 +292,8 @@ func (cc *ClientConn) Close() error {
 }
 
 // Write writes a request. An ErrPersistEOF error is returned if the connection
-// has been closed in an HTTP keepalive sense. If req.Close equals true, the
-// keepalive connection is logically closed after this request and the opposing
+// has been closed in an HTTP keep-alive sense. If req.Close equals true, the
+// keep-alive connection is logically closed after this request and the opposing
 // server is informed. An ErrUnexpectedEOF indicates the remote closed the
 // underlying TCP connection, which is usually considered as graceful close.
 func (cc *ClientConn) Write(req *http.Request) error {
index 4b165d65a6aff44f352d9852bd64dd69421fd2b2..1d7b0efa11b91ff7cc463497dc3270c33534569e 100644 (file)
@@ -18,7 +18,7 @@ import (
        "sync"
        "time"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // ReverseProxy is an HTTP Handler that takes an incoming request and
@@ -51,8 +51,7 @@ type ReverseProxy struct {
 
        // ErrorLog specifies an optional logger for errors
        // that occur when attempting to proxy the request.
-       // If nil, logging goes to os.Stderr via the log package's
-       // standard logger.
+       // If nil, logging is done via the log package's standard logger.
        ErrorLog *log.Logger
 
        // BufferPool optionally specifies a buffer pool to
@@ -132,16 +131,6 @@ func copyHeader(dst, src http.Header) {
        }
 }
 
-func cloneHeader(h http.Header) http.Header {
-       h2 := make(http.Header, len(h))
-       for k, vv := range h {
-               vv2 := make([]string, len(vv))
-               copy(vv2, vv)
-               h2[k] = vv2
-       }
-       return h2
-}
-
 // Hop-by-hop headers. These are removed when sent to the backend.
 // As of RFC 7230, hop-by-hop headers are required to appear in the
 // Connection header field. These are the headers defined by the
@@ -206,13 +195,11 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
                }()
        }
 
-       outreq := req.WithContext(ctx) // includes shallow copies of maps, but okay
+       outreq := req.Clone(ctx)
        if req.ContentLength == 0 {
                outreq.Body = nil // Issue 16036: nil Body for http.Transport retries
        }
 
-       outreq.Header = cloneHeader(req.Header)
-
        p.Director(outreq)
        outreq.Close = false
 
@@ -357,10 +344,10 @@ func shouldPanicOnCopyError(req *http.Request) bool {
 // removeConnectionHeaders removes hop-by-hop headers listed in the "Connection" header of h.
 // See RFC 7230, section 6.1
 func removeConnectionHeaders(h http.Header) {
-       if c := h.Get("Connection"); c != "" {
-               for _, f := range strings.Split(c, ",") {
-                       if f = strings.TrimSpace(f); f != "" {
-                               h.Del(f)
+       for _, f := range h["Connection"] {
+               for _, sf := range strings.Split(f, ",") {
+                       if sf = strings.TrimSpace(sf); sf != "" {
+                               h.Del(sf)
                        }
                }
        }
index 367ba73ae2497919748186a3ec886a0f17b8eef7..e8cb8149387a453cdff5626be3753d4b20daec10 100644 (file)
@@ -20,6 +20,7 @@ import (
        "net/url"
        "os"
        "reflect"
+       "sort"
        "strconv"
        "strings"
        "sync"
@@ -160,13 +161,17 @@ func TestReverseProxyStripHeadersPresentInConnection(t *testing.T) {
        const someConnHeader = "X-Some-Conn-Header"
 
        backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               if c := r.Header.Get("Connection"); c != "" {
+                       t.Errorf("handler got header %q = %q; want empty", "Connection", c)
+               }
                if c := r.Header.Get(fakeConnectionToken); c != "" {
                        t.Errorf("handler got header %q = %q; want empty", fakeConnectionToken, c)
                }
                if c := r.Header.Get(someConnHeader); c != "" {
                        t.Errorf("handler got header %q = %q; want empty", someConnHeader, c)
                }
-               w.Header().Set("Connection", someConnHeader+", "+fakeConnectionToken)
+               w.Header().Add("Connection", "Upgrade, "+fakeConnectionToken)
+               w.Header().Add("Connection", someConnHeader)
                w.Header().Set(someConnHeader, "should be deleted")
                w.Header().Set(fakeConnectionToken, "should be deleted")
                io.WriteString(w, backendResponse)
@@ -179,15 +184,34 @@ func TestReverseProxyStripHeadersPresentInConnection(t *testing.T) {
        proxyHandler := NewSingleHostReverseProxy(backendURL)
        frontend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                proxyHandler.ServeHTTP(w, r)
-               if c := r.Header.Get(someConnHeader); c != "original value" {
-                       t.Errorf("handler modified header %q = %q; want %q", someConnHeader, c, "original value")
+               if c := r.Header.Get(someConnHeader); c != "should be deleted" {
+                       t.Errorf("handler modified header %q = %q; want %q", someConnHeader, c, "should be deleted")
+               }
+               if c := r.Header.Get(fakeConnectionToken); c != "should be deleted" {
+                       t.Errorf("handler modified header %q = %q; want %q", fakeConnectionToken, c, "should be deleted")
+               }
+               c := r.Header["Connection"]
+               var cf []string
+               for _, f := range c {
+                       for _, sf := range strings.Split(f, ",") {
+                               if sf = strings.TrimSpace(sf); sf != "" {
+                                       cf = append(cf, sf)
+                               }
+                       }
+               }
+               sort.Strings(cf)
+               expectedValues := []string{"Upgrade", someConnHeader, fakeConnectionToken}
+               sort.Strings(expectedValues)
+               if !reflect.DeepEqual(cf, expectedValues) {
+                       t.Errorf("handler modified header %q = %q; want %q", "Connection", cf, expectedValues)
                }
        }))
        defer frontend.Close()
 
        getReq, _ := http.NewRequest("GET", frontend.URL, nil)
-       getReq.Header.Set("Connection", someConnHeader+", "+fakeConnectionToken)
-       getReq.Header.Set(someConnHeader, "original value")
+       getReq.Header.Add("Connection", "Upgrade, "+fakeConnectionToken)
+       getReq.Header.Add("Connection", someConnHeader)
+       getReq.Header.Set(someConnHeader, "should be deleted")
        getReq.Header.Set(fakeConnectionToken, "should be deleted")
        res, err := frontend.Client().Do(getReq)
        if err != nil {
@@ -201,6 +225,9 @@ func TestReverseProxyStripHeadersPresentInConnection(t *testing.T) {
        if got, want := string(bodyBytes), backendResponse; got != want {
                t.Errorf("got body %q; want %q", got, want)
        }
+       if c := res.Header.Get("Connection"); c != "" {
+               t.Errorf("handler got header %q = %q; want empty", "Connection", c)
+       }
        if c := res.Header.Get(someConnHeader); c != "" {
                t.Errorf("handler got header %q = %q; want empty", someConnHeader, c)
        }
index 407890920fa8c1921dd8321e5b312882b58c8cf7..2284a836fb7015d2a41f43cc555c2259e82a93ba 100644 (file)
@@ -4,6 +4,8 @@
 
 package internal
 
+import "strings"
+
 // LocalhostCert is a PEM-encoded TLS cert with SAN IPs
 // "127.0.0.1" and "[::1]", expiring at Jan 29 16:00:00 2084 GMT.
 // generated from src/crypto/tls:
@@ -24,7 +26,7 @@ fblo6RBxUQ==
 -----END CERTIFICATE-----`)
 
 // LocalhostKey is the private key for localhostCert.
-var LocalhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
+var LocalhostKey = []byte(testingKey(`-----BEGIN RSA TESTING KEY-----
 MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9
 SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB
 l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB
@@ -38,4 +40,6 @@ fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU
 y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX
 qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo
 f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA==
------END RSA PRIVATE KEY-----`)
+-----END RSA TESTING KEY-----`))
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
index dcad2b6fab366dd631a656a9957f0cc29c947474..fa63175c20c7a91541395b1eacb3ea12ade3566e 100644 (file)
@@ -26,7 +26,7 @@ import (
        "strings"
        "sync"
 
-       "internal/x/net/idna"
+       "golang.org/x/net/idna"
 )
 
 const (
@@ -304,7 +304,7 @@ type Request struct {
        //
        // For server requests, this field is not applicable.
        //
-       // Deprecated: Use the Context and WithContext methods
+       // Deprecated: Set the Request's context with NewRequestWithContext
        // instead. If a Request's Cancel field and context are both
        // set, it is undefined whether Cancel is respected.
        Cancel <-chan struct{}
@@ -327,7 +327,7 @@ type Request struct {
 // The returned context is always non-nil; it defaults to the
 // background context.
 //
-// For outgoing client requests, the context controls cancelation.
+// For outgoing client requests, the context controls cancellation.
 //
 // For incoming server requests, the context is canceled when the
 // client's connection closes, the request is canceled (with HTTP/2),
@@ -345,6 +345,11 @@ func (r *Request) Context() context.Context {
 // For outgoing client request, the context controls the entire
 // lifetime of a request and its response: obtaining a connection,
 // sending the request, and reading the response headers and body.
+//
+// To create a new request with a context, use NewRequestWithContext.
+// To change the context of a request (such as an incoming) you then
+// also want to modify to send back out, use Request.Clone. Between
+// those two uses, it's rare to need WithContext.
 func (r *Request) WithContext(ctx context.Context) *Request {
        if ctx == nil {
                panic("nil context")
@@ -352,16 +357,38 @@ func (r *Request) WithContext(ctx context.Context) *Request {
        r2 := new(Request)
        *r2 = *r
        r2.ctx = ctx
+       r2.URL = cloneURL(r.URL) // legacy behavior; TODO: try to remove. Issue 23544
+       return r2
+}
 
-       // Deep copy the URL because it isn't
-       // a map and the URL is mutable by users
-       // of WithContext.
-       if r.URL != nil {
-               r2URL := new(url.URL)
-               *r2URL = *r.URL
-               r2.URL = r2URL
+// Clone returns a deep copy of r with its context changed to ctx.
+// The provided ctx must be non-nil.
+//
+// For an outgoing client request, the context controls the entire
+// lifetime of a request and its response: obtaining a connection,
+// sending the request, and reading the response headers and body.
+func (r *Request) Clone(ctx context.Context) *Request {
+       if ctx == nil {
+               panic("nil context")
        }
-
+       r2 := new(Request)
+       *r2 = *r
+       r2.ctx = ctx
+       r2.URL = cloneURL(r.URL)
+       if r.Header != nil {
+               r2.Header = r.Header.Clone()
+       }
+       if r.Trailer != nil {
+               r2.Trailer = r.Trailer.Clone()
+       }
+       if s := r.TransferEncoding; s != nil {
+               s2 := make([]string, len(s))
+               copy(s2, s)
+               r2.TransferEncoding = s
+       }
+       r2.Form = cloneURLValues(r.Form)
+       r2.PostForm = cloneURLValues(r.PostForm)
+       r2.MultipartForm = cloneMultipartForm(r.MultipartForm)
        return r2
 }
 
@@ -781,25 +808,34 @@ func validMethod(method string) bool {
        return len(method) > 0 && strings.IndexFunc(method, isNotToken) == -1
 }
 
-// NewRequest returns a new Request given a method, URL, and optional body.
+// NewRequest wraps NewRequestWithContext using the background context.
+func NewRequest(method, url string, body io.Reader) (*Request, error) {
+       return NewRequestWithContext(context.Background(), method, url, body)
+}
+
+// NewRequestWithContext returns a new Request given a method, URL, and
+// optional body.
 //
 // If the provided body is also an io.Closer, the returned
 // Request.Body is set to body and will be closed by the Client
 // methods Do, Post, and PostForm, and Transport.RoundTrip.
 //
-// NewRequest returns a Request suitable for use with Client.Do or
-// Transport.RoundTrip. To create a request for use with testing a
-// Server Handler, either use the NewRequest function in the
+// NewRequestWithContext returns a Request suitable for use with
+// Client.Do or Transport.RoundTrip. To create a request for use with
+// testing a Server Handler, either use the NewRequest function in the
 // net/http/httptest package, use ReadRequest, or manually update the
-// Request fields. See the Request type's documentation for the
-// difference between inbound and outbound request fields.
+// Request fields. For an outgoing client request, the context
+// controls the entire lifetime of a request and its response:
+// obtaining a connection, sending the request, and reading the
+// response headers and body. See the Request type's documentation for
+// the difference between inbound and outbound request fields.
 //
 // If body is of type *bytes.Buffer, *bytes.Reader, or
 // *strings.Reader, the returned request's ContentLength is set to its
 // exact value (instead of -1), GetBody is populated (so 307 and 308
 // redirects can replay the body), and Body is set to NoBody if the
 // ContentLength is 0.
-func NewRequest(method, url string, body io.Reader) (*Request, error) {
+func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) {
        if method == "" {
                // We document that "" means "GET" for Request.Method, and people have
                // relied on that from NewRequest, so keep that working.
@@ -809,6 +845,9 @@ func NewRequest(method, url string, body io.Reader) (*Request, error) {
        if !validMethod(method) {
                return nil, fmt.Errorf("net/http: invalid method %q", method)
        }
+       if ctx == nil {
+               return nil, errors.New("net/http: nil Context")
+       }
        u, err := parseURL(url) // Just url.Parse (url is shadowed for godoc).
        if err != nil {
                return nil, err
@@ -820,6 +859,7 @@ func NewRequest(method, url string, body io.Reader) (*Request, error) {
        // The host's colon:port should be normalized. See Issue 14836.
        u.Host = removeEmptyPort(u.Host)
        req := &Request{
+               ctx:        ctx,
                Method:     method,
                URL:        u,
                Proto:      "HTTP/1.1",
@@ -912,6 +952,10 @@ func parseBasicAuth(auth string) (username, password string, ok bool) {
 //
 // With HTTP Basic Authentication the provided username and password
 // are not encrypted.
+//
+// Some protocols may impose additional requirements on pre-escaping the
+// username and password. For instance, when used with OAuth2, both arguments
+// must be URL encoded first with url.QueryEscape.
 func (r *Request) SetBasicAuth(username, password string) {
        r.Header.Set("Authorization", "Basic "+basicAuth(username, password))
 }
index e8005571df9757dec7e32cc723bd28752dd6e216..b072f958024b903f79f052a8fc471f092d415cc8 100644 (file)
@@ -8,12 +8,14 @@ import (
        "bufio"
        "bytes"
        "context"
+       "crypto/rand"
        "encoding/base64"
        "fmt"
        "io"
        "io/ioutil"
        "mime/multipart"
        . "net/http"
+       "net/http/httptest"
        "net/url"
        "os"
        "reflect"
@@ -133,30 +135,31 @@ func TestParseFormInitializeOnError(t *testing.T) {
 }
 
 func TestMultipartReader(t *testing.T) {
-       req := &Request{
-               Method: "POST",
-               Header: Header{"Content-Type": {`multipart/form-data; boundary="foo123"`}},
-               Body:   ioutil.NopCloser(new(bytes.Buffer)),
-       }
-       multipart, err := req.MultipartReader()
-       if multipart == nil {
-               t.Errorf("expected multipart; error: %v", err)
-       }
-
-       req = &Request{
-               Method: "POST",
-               Header: Header{"Content-Type": {`multipart/mixed; boundary="foo123"`}},
-               Body:   ioutil.NopCloser(new(bytes.Buffer)),
-       }
-       multipart, err = req.MultipartReader()
-       if multipart == nil {
-               t.Errorf("expected multipart; error: %v", err)
+       tests := []struct {
+               shouldError bool
+               contentType string
+       }{
+               {false, `multipart/form-data; boundary="foo123"`},
+               {false, `multipart/mixed; boundary="foo123"`},
+               {true, `text/plain`},
        }
 
-       req.Header = Header{"Content-Type": {"text/plain"}}
-       multipart, err = req.MultipartReader()
-       if multipart != nil {
-               t.Error("unexpected multipart for text/plain")
+       for i, test := range tests {
+               req := &Request{
+                       Method: "POST",
+                       Header: Header{"Content-Type": {test.contentType}},
+                       Body:   ioutil.NopCloser(new(bytes.Buffer)),
+               }
+               multipart, err := req.MultipartReader()
+               if test.shouldError {
+                       if err == nil || multipart != nil {
+                               t.Errorf("test %d: unexpectedly got nil-error (%v) or non-nil-multipart (%v)", i, err, multipart)
+                       }
+                       continue
+               }
+               if err != nil || multipart == nil {
+                       t.Errorf("test %d: unexpectedly got error (%v) or nil-multipart (%v)", i, err, multipart)
+               }
        }
 }
 
@@ -1046,3 +1049,92 @@ func BenchmarkReadRequestWrk(b *testing.B) {
 Host: localhost:8080
 `)
 }
+
+const (
+       withTLS = true
+       noTLS   = false
+)
+
+func BenchmarkFileAndServer_1KB(b *testing.B) {
+       benchmarkFileAndServer(b, 1<<10)
+}
+
+func BenchmarkFileAndServer_16MB(b *testing.B) {
+       benchmarkFileAndServer(b, 1<<24)
+}
+
+func BenchmarkFileAndServer_64MB(b *testing.B) {
+       benchmarkFileAndServer(b, 1<<26)
+}
+
+func benchmarkFileAndServer(b *testing.B, n int64) {
+       f, err := ioutil.TempFile(os.TempDir(), "go-bench-http-file-and-server")
+       if err != nil {
+               b.Fatalf("Failed to create temp file: %v", err)
+       }
+
+       defer func() {
+               f.Close()
+               os.RemoveAll(f.Name())
+       }()
+
+       if _, err := io.CopyN(f, rand.Reader, n); err != nil {
+               b.Fatalf("Failed to copy %d bytes: %v", n, err)
+       }
+
+       b.Run("NoTLS", func(b *testing.B) {
+               runFileAndServerBenchmarks(b, noTLS, f, n)
+       })
+
+       b.Run("TLS", func(b *testing.B) {
+               runFileAndServerBenchmarks(b, withTLS, f, n)
+       })
+}
+
+func runFileAndServerBenchmarks(b *testing.B, tlsOption bool, f *os.File, n int64) {
+       handler := HandlerFunc(func(rw ResponseWriter, req *Request) {
+               defer req.Body.Close()
+               nc, err := io.Copy(ioutil.Discard, req.Body)
+               if err != nil {
+                       panic(err)
+               }
+
+               if nc != n {
+                       panic(fmt.Errorf("Copied %d Wanted %d bytes", nc, n))
+               }
+       })
+
+       var cst *httptest.Server
+       if tlsOption == withTLS {
+               cst = httptest.NewTLSServer(handler)
+       } else {
+               cst = httptest.NewServer(handler)
+       }
+
+       defer cst.Close()
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               // Perform some setup.
+               b.StopTimer()
+               if _, err := f.Seek(0, 0); err != nil {
+                       b.Fatalf("Failed to seek back to file: %v", err)
+               }
+
+               b.StartTimer()
+               req, err := NewRequest("PUT", cst.URL, ioutil.NopCloser(f))
+               if err != nil {
+                       b.Fatal(err)
+               }
+
+               req.ContentLength = n
+               // Prevent mime sniffing by setting the Content-Type.
+               req.Header.Set("Content-Type", "application/octet-stream")
+               res, err := cst.Client().Do(req)
+               if err != nil {
+                       b.Fatalf("Failed to make request to backend: %v", err)
+               }
+
+               res.Body.Close()
+               b.SetBytes(n)
+       }
+}
index f906ce829b4aaffb4c2cfdb936674f308b5f4fad..2065a250156ba270a8d659d629105473d8a90a02 100644 (file)
@@ -12,12 +12,13 @@ import (
        "crypto/tls"
        "errors"
        "fmt"
-       "internal/x/net/http/httpguts"
        "io"
        "net/textproto"
        "net/url"
        "strconv"
        "strings"
+
+       "golang.org/x/net/http/httpguts"
 )
 
 var respExcludeHeader = map[string]bool{
@@ -66,7 +67,7 @@ type Response struct {
        // with a "chunked" Transfer-Encoding.
        //
        // As of Go 1.12, the Body will be also implement io.Writer
-       // on a successful "101 Switching Protocols" responses,
+       // on a successful "101 Switching Protocols" response,
        // as used by WebSockets and HTTP/2's "h2c" mode.
        Body io.ReadCloser
 
index c46f13f7988334e7697c9bcc13d6cf815693aee1..ee7f0d0b708ffc6233a740b289f15fe4fbeb7a9d 100644 (file)
@@ -10,7 +10,7 @@ import (
        "compress/gzip"
        "crypto/rand"
        "fmt"
-       "go/ast"
+       "go/token"
        "io"
        "io/ioutil"
        "net/http/internal"
@@ -736,7 +736,7 @@ func diff(t *testing.T, prefix string, have, want interface{}) {
        }
        for i := 0; i < hv.NumField(); i++ {
                name := hv.Type().Field(i).Name
-               if !ast.IsExported(name) {
+               if !token.IsExported(name) {
                        continue
                }
                hf := hv.Field(i).Interface()
index 1e38b908d387e7e6b5d26d6e9724f6c6feac2496..6331351a8387a4a89bd587ee96f616a8f8a410b9 100644 (file)
@@ -11,12 +11,12 @@ import (
        "fmt"
        "io"
        "io/ioutil"
-       "os"
        "strconv"
-       "strings"
        "syscall/js"
 )
 
+var uint8Array = js.Global().Get("Uint8Array")
+
 // jsFetchMode is a Request.Header map key that, if present,
 // signals that the map entry is actually an option to the Fetch API mode setting.
 // Valid values are: "cors", "no-cors", "same-origin", "navigate"
@@ -33,9 +33,19 @@ const jsFetchMode = "js.fetch:mode"
 // Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters
 const jsFetchCreds = "js.fetch:credentials"
 
+// jsFetchRedirect is a Request.Header map key that, if present,
+// signals that the map entry is actually an option to the Fetch API redirect setting.
+// Valid values are: "follow", "error", "manual"
+// The default is "follow".
+//
+// Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters
+const jsFetchRedirect = "js.fetch:redirect"
+
+var useFakeNetwork = js.Global().Get("fetch") == js.Undefined()
+
 // RoundTrip implements the RoundTripper interface using the WHATWG Fetch API.
 func (t *Transport) RoundTrip(req *Request) (*Response, error) {
-       if useFakeNetwork() {
+       if useFakeNetwork {
                return t.roundTrip(req)
        }
 
@@ -60,6 +70,10 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
                opt.Set("mode", h)
                req.Header.Del(jsFetchMode)
        }
+       if h := req.Header.Get(jsFetchRedirect); h != "" {
+               opt.Set("redirect", h)
+               req.Header.Del(jsFetchRedirect)
+       }
        if ac != js.Undefined() {
                opt.Set("signal", ac.Get("signal"))
        }
@@ -84,9 +98,9 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
                        return nil, err
                }
                req.Body.Close()
-               a := js.TypedArrayOf(body)
-               defer a.Release()
-               opt.Set("body", a)
+               buf := uint8Array.New(len(body))
+               js.CopyBytesToJS(buf, body)
+               opt.Set("body", buf)
        }
        respPromise := js.Global().Call("fetch", req.URL.String(), opt)
        var (
@@ -126,10 +140,11 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
                        body = &arrayReader{arrayPromise: result.Call("arrayBuffer")}
                }
 
+               code := result.Get("status").Int()
                select {
                case respCh <- &Response{
-                       Status:        result.Get("status").String() + " " + StatusText(result.Get("status").Int()),
-                       StatusCode:    result.Get("status").Int(),
+                       Status:        fmt.Sprintf("%d %s", code, StatusText(code)),
+                       StatusCode:    code,
                        Header:        header,
                        ContentLength: contentLength,
                        Body:          body,
@@ -167,12 +182,6 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 
 var errClosed = errors.New("net/http: reader is closed")
 
-// useFakeNetwork is used to determine whether the request is made
-// by a test and should be made to use the fake in-memory network.
-func useFakeNetwork() bool {
-       return len(os.Args) > 0 && strings.HasSuffix(os.Args[0], ".test")
-}
-
 // streamReader implements an io.ReadCloser wrapper for ReadableStream.
 // See https://fetch.spec.whatwg.org/#readablestream for more information.
 type streamReader struct {
@@ -197,9 +206,7 @@ func (r *streamReader) Read(p []byte) (n int, err error) {
                                return nil
                        }
                        value := make([]byte, result.Get("value").Get("byteLength").Int())
-                       a := js.TypedArrayOf(value)
-                       a.Call("set", result.Get("value"))
-                       a.Release()
+                       js.CopyBytesToGo(value, result.Get("value"))
                        bCh <- value
                        return nil
                })
@@ -260,11 +267,9 @@ func (r *arrayReader) Read(p []byte) (n int, err error) {
                )
                success := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
                        // Wrap the input ArrayBuffer with a Uint8Array
-                       uint8arrayWrapper := js.Global().Get("Uint8Array").New(args[0])
+                       uint8arrayWrapper := uint8Array.New(args[0])
                        value := make([]byte, uint8arrayWrapper.Get("byteLength").Int())
-                       a := js.TypedArrayOf(value)
-                       a.Call("set", uint8arrayWrapper)
-                       a.Release()
+                       js.CopyBytesToGo(value, uint8arrayWrapper)
                        bCh <- value
                        return nil
                })
index 6eb0088a96375f80f1e4a5edc61d4d580e1cabfa..e7ed15c3aa49613682cf6762249b31bba335818d 100644 (file)
@@ -4273,7 +4273,7 @@ func testServerEmptyBodyRace(t *testing.T, h2 bool) {
        var n int32
        cst := newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, req *Request) {
                atomic.AddInt32(&n, 1)
-       }))
+       }), optQuietLog)
        defer cst.close()
        var wg sync.WaitGroup
        const reqs = 20
@@ -4697,6 +4697,10 @@ func TestServerHandlersCanHandleH2PRI(t *testing.T) {
        defer afterTest(t)
        ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
                conn, br, err := w.(Hijacker).Hijack()
+               if err != nil {
+                       t.Error(err)
+                       return
+               }
                defer conn.Close()
                if r.Method != "PRI" || r.RequestURI != "*" {
                        t.Errorf("Got method/target %q %q; want PRI *", r.Method, r.RequestURI)
@@ -5745,8 +5749,12 @@ func TestServerDuplicateBackgroundRead(t *testing.T) {
        setParallel(t)
        defer afterTest(t)
 
-       const goroutines = 5
-       const requests = 2000
+       goroutines := 5
+       requests := 2000
+       if testing.Short() {
+               goroutines = 3
+               requests = 100
+       }
 
        hts := httptest.NewServer(HandlerFunc(NotFound))
        defer hts.Close()
@@ -6021,6 +6029,143 @@ func TestStripPortFromHost(t *testing.T) {
        }
 }
 
+func TestServerContexts(t *testing.T) {
+       setParallel(t)
+       defer afterTest(t)
+       type baseKey struct{}
+       type connKey struct{}
+       ch := make(chan context.Context, 1)
+       ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
+               ch <- r.Context()
+       }))
+       ts.Config.BaseContext = func(ln net.Listener) context.Context {
+               if strings.Contains(reflect.TypeOf(ln).String(), "onceClose") {
+                       t.Errorf("unexpected onceClose listener type %T", ln)
+               }
+               return context.WithValue(context.Background(), baseKey{}, "base")
+       }
+       ts.Config.ConnContext = func(ctx context.Context, c net.Conn) context.Context {
+               if got, want := ctx.Value(baseKey{}), "base"; got != want {
+                       t.Errorf("in ConnContext, base context key = %#v; want %q", got, want)
+               }
+               return context.WithValue(ctx, connKey{}, "conn")
+       }
+       ts.Start()
+       defer ts.Close()
+       res, err := ts.Client().Get(ts.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+       res.Body.Close()
+       ctx := <-ch
+       if got, want := ctx.Value(baseKey{}), "base"; got != want {
+               t.Errorf("base context key = %#v; want %q", got, want)
+       }
+       if got, want := ctx.Value(connKey{}), "conn"; got != want {
+               t.Errorf("conn context key = %#v; want %q", got, want)
+       }
+}
+
+func TestServerContextsHTTP2(t *testing.T) {
+       setParallel(t)
+       defer afterTest(t)
+       type baseKey struct{}
+       type connKey struct{}
+       ch := make(chan context.Context, 1)
+       ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
+               if r.ProtoMajor != 2 {
+                       t.Errorf("unexpected HTTP/1.x request")
+               }
+               ch <- r.Context()
+       }))
+       ts.Config.BaseContext = func(ln net.Listener) context.Context {
+               if strings.Contains(reflect.TypeOf(ln).String(), "onceClose") {
+                       t.Errorf("unexpected onceClose listener type %T", ln)
+               }
+               return context.WithValue(context.Background(), baseKey{}, "base")
+       }
+       ts.Config.ConnContext = func(ctx context.Context, c net.Conn) context.Context {
+               if got, want := ctx.Value(baseKey{}), "base"; got != want {
+                       t.Errorf("in ConnContext, base context key = %#v; want %q", got, want)
+               }
+               return context.WithValue(ctx, connKey{}, "conn")
+       }
+       ts.TLS = &tls.Config{
+               NextProtos: []string{"h2", "http/1.1"},
+       }
+       ts.StartTLS()
+       defer ts.Close()
+       ts.Client().Transport.(*Transport).ForceAttemptHTTP2 = true
+       res, err := ts.Client().Get(ts.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+       res.Body.Close()
+       ctx := <-ch
+       if got, want := ctx.Value(baseKey{}), "base"; got != want {
+               t.Errorf("base context key = %#v; want %q", got, want)
+       }
+       if got, want := ctx.Value(connKey{}), "conn"; got != want {
+               t.Errorf("conn context key = %#v; want %q", got, want)
+       }
+}
+
+// Issue 30710: ensure that as per the spec, a server responds
+// with 501 Not Implemented for unsupported transfer-encodings.
+func TestUnsupportedTransferEncodingsReturn501(t *testing.T) {
+       cst := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
+               w.Write([]byte("Hello, World!"))
+       }))
+       defer cst.Close()
+
+       serverURL, err := url.Parse(cst.URL)
+       if err != nil {
+               t.Fatalf("Failed to parse server URL: %v", err)
+       }
+
+       unsupportedTEs := []string{
+               "fugazi",
+               "foo-bar",
+               "unknown",
+       }
+
+       for _, badTE := range unsupportedTEs {
+               http1ReqBody := fmt.Sprintf(""+
+                       "POST / HTTP/1.1\r\nConnection: close\r\n"+
+                       "Host: localhost\r\nTransfer-Encoding: %s\r\n\r\n", badTE)
+
+               gotBody, err := fetchWireResponse(serverURL.Host, []byte(http1ReqBody))
+               if err != nil {
+                       t.Errorf("%q. unexpected error: %v", badTE, err)
+                       continue
+               }
+
+               wantBody := fmt.Sprintf("" +
+                       "HTTP/1.1 501 Not Implemented\r\nContent-Type: text/plain; charset=utf-8\r\n" +
+                       "Connection: close\r\n\r\nUnsupported transfer encoding")
+
+               if string(gotBody) != wantBody {
+                       t.Errorf("%q. body\ngot\n%q\nwant\n%q", badTE, gotBody, wantBody)
+               }
+       }
+}
+
+// fetchWireResponse is a helper for dialing to host,
+// sending http1ReqBody as the payload and retrieving
+// the response as it was sent on the wire.
+func fetchWireResponse(host string, http1ReqBody []byte) ([]byte, error) {
+       conn, err := net.Dial("tcp", host)
+       if err != nil {
+               return nil, err
+       }
+       defer conn.Close()
+
+       if _, err := conn.Write(http1ReqBody); err != nil {
+               return nil, err
+       }
+       return ioutil.ReadAll(conn)
+}
+
 func BenchmarkResponseStatusLine(b *testing.B) {
        b.ReportAllocs()
        b.RunParallel(func(pb *testing.PB) {
index cbf5673ee6bd70bb28de9c224f9c4c5042d819d4..74569bf7b0760e69d051e3cfd51872366ad0e18a 100644 (file)
@@ -29,7 +29,7 @@ import (
        "sync/atomic"
        "time"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // Errors used by the HTTP server.
@@ -749,10 +749,8 @@ func (cr *connReader) handleReadError(_ error) {
 // may be called from multiple goroutines.
 func (cr *connReader) closeNotify() {
        res, _ := cr.conn.curReq.Load().(*response)
-       if res != nil {
-               if atomic.CompareAndSwapInt32(&res.didCloseNotify, 0, 1) {
-                       res.closeNotifyCh <- true
-               }
+       if res != nil && atomic.CompareAndSwapInt32(&res.didCloseNotify, 0, 1) {
+               res.closeNotifyCh <- true
        }
 }
 
@@ -1060,7 +1058,7 @@ func (w *response) Header() Header {
                // Accessing the header between logically writing it
                // and physically writing it means we need to allocate
                // a clone to snapshot the logically written state.
-               w.cw.header = w.handlerHeader.clone()
+               w.cw.header = w.handlerHeader.Clone()
        }
        w.calledHeader = true
        return w.handlerHeader
@@ -1134,7 +1132,7 @@ func (w *response) WriteHeader(code int) {
        w.status = code
 
        if w.calledHeader && w.cw.header == nil {
-               w.cw.header = w.handlerHeader.clone()
+               w.cw.header = w.handlerHeader.Clone()
        }
 
        if cl := w.handlerHeader.get("Content-Length"); cl != "" {
@@ -1803,7 +1801,7 @@ func (c *conn) serve(ctx context.Context) {
                *c.tlsState = tlsConn.ConnectionState()
                if proto := c.tlsState.NegotiatedProtocol; validNPN(proto) {
                        if fn := c.server.TLSNextProto[proto]; fn != nil {
-                               h := initNPNRequest{tlsConn, serverHandler{c.server}}
+                               h := initNPNRequest{ctx, tlsConn, serverHandler{c.server}}
                                fn(c.server, tlsConn, h)
                        }
                        return
@@ -1829,7 +1827,8 @@ func (c *conn) serve(ctx context.Context) {
                if err != nil {
                        const errorHeaders = "\r\nContent-Type: text/plain; charset=utf-8\r\nConnection: close\r\n\r\n"
 
-                       if err == errTooLarge {
+                       switch {
+                       case err == errTooLarge:
                                // Their HTTP client may or may not be
                                // able to read this if we're
                                // responding to them and hanging up
@@ -1839,18 +1838,31 @@ func (c *conn) serve(ctx context.Context) {
                                fmt.Fprintf(c.rwc, "HTTP/1.1 "+publicErr+errorHeaders+publicErr)
                                c.closeWriteAndWait()
                                return
-                       }
-                       if isCommonNetReadError(err) {
+
+                       case isUnsupportedTEError(err):
+                               // Respond as per RFC 7230 Section 3.3.1 which says,
+                               //      A server that receives a request message with a
+                               //      transfer coding it does not understand SHOULD
+                               //      respond with 501 (Unimplemented).
+                               code := StatusNotImplemented
+
+                               // We purposefully aren't echoing back the transfer-encoding's value,
+                               // so as to mitigate the risk of cross side scripting by an attacker.
+                               fmt.Fprintf(c.rwc, "HTTP/1.1 %d %s%sUnsupported transfer encoding", code, StatusText(code), errorHeaders)
+                               return
+
+                       case isCommonNetReadError(err):
                                return // don't reply
-                       }
 
-                       publicErr := "400 Bad Request"
-                       if v, ok := err.(badRequestError); ok {
-                               publicErr = publicErr + ": " + string(v)
-                       }
+                       default:
+                               publicErr := "400 Bad Request"
+                               if v, ok := err.(badRequestError); ok {
+                                       publicErr = publicErr + ": " + string(v)
+                               }
 
-                       fmt.Fprintf(c.rwc, "HTTP/1.1 "+publicErr+errorHeaders+publicErr)
-                       return
+                               fmt.Fprintf(c.rwc, "HTTP/1.1 "+publicErr+errorHeaders+publicErr)
+                               return
+                       }
                }
 
                // Expect 100 Continue support
@@ -2505,7 +2517,9 @@ type Server struct {
        // ReadHeaderTimeout is the amount of time allowed to read
        // request headers. The connection's read deadline is reset
        // after reading the headers and the Handler can decide what
-       // is considered too slow for the body.
+       // is considered too slow for the body. If ReadHeaderTimeout
+       // is zero, the value of ReadTimeout is used. If both are
+       // zero, there is no timeout.
        ReadHeaderTimeout time.Duration
 
        // WriteTimeout is the maximum duration before timing out
@@ -2517,7 +2531,7 @@ type Server struct {
        // IdleTimeout is the maximum amount of time to wait for the
        // next request when keep-alives are enabled. If IdleTimeout
        // is zero, the value of ReadTimeout is used. If both are
-       // zero, ReadHeaderTimeout is used.
+       // zero, there is no timeout.
        IdleTimeout time.Duration
 
        // MaxHeaderBytes controls the maximum number of bytes the
@@ -2549,6 +2563,20 @@ type Server struct {
        // If nil, logging is done via the log package's standard logger.
        ErrorLog *log.Logger
 
+       // BaseContext optionally specifies a function that returns
+       // the base context for incoming requests on this server.
+       // The provided Listener is the specific Listener that's
+       // about to start accepting requests.
+       // If BaseContext is nil, the default is context.Background().
+       // If non-nil, it must return a non-nil context.
+       BaseContext func(net.Listener) context.Context
+
+       // ConnContext optionally specifies a function that modifies
+       // the context used for a new connection c. The provided ctx
+       // is derived from the base context and has a ServerContextKey
+       // value.
+       ConnContext func(ctx context.Context, c net.Conn) context.Context
+
        disableKeepAlives int32     // accessed atomically.
        inShutdown        int32     // accessed atomically (non-zero means we're in Shutdown)
        nextProtoOnce     sync.Once // guards setupHTTP2_* init
@@ -2799,7 +2827,7 @@ func (srv *Server) ListenAndServe() error {
        if err != nil {
                return err
        }
-       return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
+       return srv.Serve(ln)
 }
 
 var testHookServerServe func(*Server, net.Listener) // used if non-nil
@@ -2845,6 +2873,7 @@ func (srv *Server) Serve(l net.Listener) error {
                fn(srv, l) // call hook with unwrapped listener
        }
 
+       origListener := l
        l = &onceCloseListener{Listener: l}
        defer l.Close()
 
@@ -2857,8 +2886,16 @@ func (srv *Server) Serve(l net.Listener) error {
        }
        defer srv.trackListener(&l, false)
 
-       var tempDelay time.Duration     // how long to sleep on accept failure
-       baseCtx := context.Background() // base is always background, per Issue 16220
+       var tempDelay time.Duration // how long to sleep on accept failure
+
+       baseCtx := context.Background()
+       if srv.BaseContext != nil {
+               baseCtx = srv.BaseContext(origListener)
+               if baseCtx == nil {
+                       panic("BaseContext returned a nil context")
+               }
+       }
+
        ctx := context.WithValue(baseCtx, ServerContextKey, srv)
        for {
                rw, e := l.Accept()
@@ -2883,6 +2920,12 @@ func (srv *Server) Serve(l net.Listener) error {
                        }
                        return e
                }
+               if cc := srv.ConnContext; cc != nil {
+                       ctx = cc(ctx, rw)
+                       if ctx == nil {
+                               panic("ConnContext returned nil")
+                       }
+               }
                tempDelay = 0
                c := srv.newConn(rw)
                c.setState(c.rwc, StateNew) // before Serve can return
@@ -3083,7 +3126,7 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
 
        defer ln.Close()
 
-       return srv.ServeTLS(tcpKeepAliveListener{ln.(*net.TCPListener)}, certFile, keyFile)
+       return srv.ServeTLS(ln, certFile, keyFile)
 }
 
 // setupHTTP2_ServeTLS conditionally configures HTTP/2 on
@@ -3228,6 +3271,25 @@ type timeoutWriter struct {
        code        int
 }
 
+var _ Pusher = (*timeoutWriter)(nil)
+var _ Flusher = (*timeoutWriter)(nil)
+
+// Push implements the Pusher interface.
+func (tw *timeoutWriter) Push(target string, opts *PushOptions) error {
+       if pusher, ok := tw.w.(Pusher); ok {
+               return pusher.Push(target, opts)
+       }
+       return ErrNotSupported
+}
+
+// Flush implements the Flusher interface.
+func (tw *timeoutWriter) Flush() {
+       f, ok := tw.w.(Flusher)
+       if ok {
+               f.Flush()
+       }
+}
+
 func (tw *timeoutWriter) Header() Header { return tw.h }
 
 func (tw *timeoutWriter) Write(p []byte) (int, error) {
@@ -3257,24 +3319,6 @@ func (tw *timeoutWriter) writeHeader(code int) {
        tw.code = code
 }
 
-// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted
-// connections. It's used by ListenAndServe and ListenAndServeTLS so
-// dead TCP connections (e.g. closing laptop mid-download) eventually
-// go away.
-type tcpKeepAliveListener struct {
-       *net.TCPListener
-}
-
-func (ln tcpKeepAliveListener) Accept() (net.Conn, error) {
-       tc, err := ln.AcceptTCP()
-       if err != nil {
-               return nil, err
-       }
-       tc.SetKeepAlive(true)
-       tc.SetKeepAlivePeriod(3 * time.Minute)
-       return tc, nil
-}
-
 // onceCloseListener wraps a net.Listener, protecting it from
 // multiple Close calls.
 type onceCloseListener struct {
@@ -3310,10 +3354,17 @@ func (globalOptionsHandler) ServeHTTP(w ResponseWriter, r *Request) {
 // uninitialized fields in its *Request. Such partially-initialized
 // Requests come from NPN protocol handlers.
 type initNPNRequest struct {
-       c *tls.Conn
-       h serverHandler
+       ctx context.Context
+       c   *tls.Conn
+       h   serverHandler
 }
 
+// BaseContext is an exported but unadvertised http.Handler method
+// recognized by x/net/http2 to pass down a context; the TLSNextProto
+// API predates context support so we shoehorn through the only
+// interface we have available.
+func (h initNPNRequest) BaseContext() context.Context { return h.ctx }
+
 func (h initNPNRequest) ServeHTTP(rw ResponseWriter, req *Request) {
        if req.TLS == nil {
                req.TLS = &tls.ConnectionState{}
index c1494abb4c837930dc94831ac1a00671e81f0964..67a7151b0cc1fb615fa8ce30fe529e1b6e0ee42f 100644 (file)
@@ -37,6 +37,8 @@ func DetectContentType(data []byte) string {
        return "application/octet-stream" // fallback
 }
 
+// isWS reports whether the provided byte is a whitespace byte (0xWS)
+// as defined in https://mimesniff.spec.whatwg.org/#terminology.
 func isWS(b byte) bool {
        switch b {
        case '\t', '\n', '\x0c', '\r', ' ':
@@ -45,6 +47,16 @@ func isWS(b byte) bool {
        return false
 }
 
+// isTT reports whether the provided byte is a tag-terminating byte (0xTT)
+// as defined in https://mimesniff.spec.whatwg.org/#terminology.
+func isTT(b byte) bool {
+       switch b {
+       case ' ', '>':
+               return true
+       }
+       return false
+}
+
 type sniffSig interface {
        // match returns the MIME type of the data, or "" if unknown.
        match(data []byte, firstNonWS int) string
@@ -69,33 +81,57 @@ var sniffSignatures = []sniffSig{
        htmlSig("<BR"),
        htmlSig("<P"),
        htmlSig("<!--"),
-
-       &maskedSig{mask: []byte("\xFF\xFF\xFF\xFF\xFF"), pat: []byte("<?xml"), skipWS: true, ct: "text/xml; charset=utf-8"},
-
+       &maskedSig{
+               mask:   []byte("\xFF\xFF\xFF\xFF\xFF"),
+               pat:    []byte("<?xml"),
+               skipWS: true,
+               ct:     "text/xml; charset=utf-8"},
        &exactSig{[]byte("%PDF-"), "application/pdf"},
        &exactSig{[]byte("%!PS-Adobe-"), "application/postscript"},
 
        // UTF BOMs.
-       &maskedSig{mask: []byte("\xFF\xFF\x00\x00"), pat: []byte("\xFE\xFF\x00\x00"), ct: "text/plain; charset=utf-16be"},
-       &maskedSig{mask: []byte("\xFF\xFF\x00\x00"), pat: []byte("\xFF\xFE\x00\x00"), ct: "text/plain; charset=utf-16le"},
-       &maskedSig{mask: []byte("\xFF\xFF\xFF\x00"), pat: []byte("\xEF\xBB\xBF\x00"), ct: "text/plain; charset=utf-8"},
+       &maskedSig{
+               mask: []byte("\xFF\xFF\x00\x00"),
+               pat:  []byte("\xFE\xFF\x00\x00"),
+               ct:   "text/plain; charset=utf-16be",
+       },
+       &maskedSig{
+               mask: []byte("\xFF\xFF\x00\x00"),
+               pat:  []byte("\xFF\xFE\x00\x00"),
+               ct:   "text/plain; charset=utf-16le",
+       },
+       &maskedSig{
+               mask: []byte("\xFF\xFF\xFF\x00"),
+               pat:  []byte("\xEF\xBB\xBF\x00"),
+               ct:   "text/plain; charset=utf-8",
+       },
 
+       // Image types
+       // For posterity, we originally returned "image/vnd.microsoft.icon" from
+       // https://tools.ietf.org/html/draft-ietf-websec-mime-sniff-03#section-7
+       // https://codereview.appspot.com/4746042
+       // but that has since been replaced with "image/x-icon" in Section 6.2
+       // of https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern
+       &exactSig{[]byte("\x00\x00\x01\x00"), "image/x-icon"},
+       &exactSig{[]byte("\x00\x00\x02\x00"), "image/x-icon"},
+       &exactSig{[]byte("BM"), "image/bmp"},
        &exactSig{[]byte("GIF87a"), "image/gif"},
        &exactSig{[]byte("GIF89a"), "image/gif"},
-       &exactSig{[]byte("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"), "image/png"},
-       &exactSig{[]byte("\xFF\xD8\xFF"), "image/jpeg"},
-       &exactSig{[]byte("BM"), "image/bmp"},
        &maskedSig{
                mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"),
                pat:  []byte("RIFF\x00\x00\x00\x00WEBPVP"),
                ct:   "image/webp",
        },
-       &exactSig{[]byte("\x00\x00\x01\x00"), "image/vnd.microsoft.icon"},
+       &exactSig{[]byte("\x89PNG\x0D\x0A\x1A\x0A"), "image/png"},
+       &exactSig{[]byte("\xFF\xD8\xFF"), "image/jpeg"},
 
+       // Audio and Video types
+       // Enforce the pattern match ordering as prescribed in
+       // https://mimesniff.spec.whatwg.org/#matching-an-audio-or-video-type-pattern
        &maskedSig{
-               mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"),
-               pat:  []byte("RIFF\x00\x00\x00\x00WAVE"),
-               ct:   "audio/wave",
+               mask: []byte("\xFF\xFF\xFF\xFF"),
+               pat:  []byte(".snd"),
+               ct:   "audio/basic",
        },
        &maskedSig{
                mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"),
@@ -103,9 +139,9 @@ var sniffSignatures = []sniffSig{
                ct:   "audio/aiff",
        },
        &maskedSig{
-               mask: []byte("\xFF\xFF\xFF\xFF"),
-               pat:  []byte(".snd"),
-               ct:   "audio/basic",
+               mask: []byte("\xFF\xFF\xFF"),
+               pat:  []byte("ID3"),
+               ct:   "audio/mpeg",
        },
        &maskedSig{
                mask: []byte("\xFF\xFF\xFF\xFF\xFF"),
@@ -117,21 +153,25 @@ var sniffSignatures = []sniffSig{
                pat:  []byte("MThd\x00\x00\x00\x06"),
                ct:   "audio/midi",
        },
-       &maskedSig{
-               mask: []byte("\xFF\xFF\xFF"),
-               pat:  []byte("ID3"),
-               ct:   "audio/mpeg",
-       },
        &maskedSig{
                mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"),
                pat:  []byte("RIFF\x00\x00\x00\x00AVI "),
                ct:   "video/avi",
        },
+       &maskedSig{
+               mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"),
+               pat:  []byte("RIFF\x00\x00\x00\x00WAVE"),
+               ct:   "audio/wave",
+       },
+       // 6.2.0.2. video/mp4
+       mp4Sig{},
+       // 6.2.0.3. video/webm
+       &exactSig{[]byte("\x1A\x45\xDF\xA3"), "video/webm"},
 
-       // Fonts
+       // Font types
        &maskedSig{
                // 34 NULL bytes followed by the string "LP"
-               pat: []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4C\x50"),
+               pat: []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LP"),
                // 34 NULL bytes followed by \xF\xF
                mask: []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"),
                ct:   "application/vnd.ms-fontobject",
@@ -142,15 +182,20 @@ var sniffSignatures = []sniffSig{
        &exactSig{[]byte("wOFF"), "font/woff"},
        &exactSig{[]byte("wOF2"), "font/woff2"},
 
-       &exactSig{[]byte("\x1A\x45\xDF\xA3"), "video/webm"},
-       &exactSig{[]byte("\x52\x61\x72\x20\x1A\x07\x00"), "application/x-rar-compressed"},
-       &exactSig{[]byte("\x50\x4B\x03\x04"), "application/zip"},
+       // Archive types
        &exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"},
+       &exactSig{[]byte("PK\x03\x04"), "application/zip"},
+       // RAR's signatures are incorrectly defined by the MIME spec as per
+       //    https://github.com/whatwg/mimesniff/issues/63
+       // However, RAR Labs correctly defines it at:
+       //    https://www.rarlab.com/technote.htm#rarsign
+       // so we use the definition from RAR Labs.
+       // TODO: do whatever the spec ends up doing.
+       &exactSig{[]byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"},     // RAR v1.5-v4.0
+       &exactSig{[]byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+
 
        &exactSig{[]byte("\x00\x61\x73\x6D"), "application/wasm"},
 
-       mp4Sig{},
-
        textSig{}, // should be last
 }
 
@@ -182,12 +227,12 @@ func (m *maskedSig) match(data []byte, firstNonWS int) string {
        if len(m.pat) != len(m.mask) {
                return ""
        }
-       if len(data) < len(m.mask) {
+       if len(data) < len(m.pat) {
                return ""
        }
-       for i, mask := range m.mask {
-               db := data[i] & mask
-               if db != m.pat[i] {
+       for i, pb := range m.pat {
+               maskedData := data[i] & m.mask[i]
+               if maskedData != pb {
                        return ""
                }
        }
@@ -210,8 +255,8 @@ func (h htmlSig) match(data []byte, firstNonWS int) string {
                        return ""
                }
        }
-       // Next byte must be space or right angle bracket.
-       if db := data[len(h)]; db != ' ' && db != '>' {
+       // Next byte must be a tag-terminating byte(0xTT).
+       if !isTT(data[len(h)]) {
                return ""
        }
        return "text/html; charset=utf-8"
@@ -229,7 +274,7 @@ func (mp4Sig) match(data []byte, firstNonWS int) string {
                return ""
        }
        boxSize := int(binary.BigEndian.Uint32(data[:4]))
-       if boxSize%4 != 0 || len(data) < boxSize {
+       if len(data) < boxSize || boxSize%4 != 0 {
                return ""
        }
        if !bytes.Equal(data[4:8], mp4ftype) {
@@ -237,7 +282,7 @@ func (mp4Sig) match(data []byte, firstNonWS int) string {
        }
        for st := 8; st < boxSize; st += 4 {
                if st == 12 {
-                       // minor version number
+                       // Ignores the four bytes that correspond to the version number of the "major brand".
                        continue
                }
                if bytes.Equal(data[st:st+3], mp4) {
index b4d3c9f0cc84a594c08ce9059f9b78f2c4584054..a1157a0823e5e658068eab93284c6fa068ce944f 100644 (file)
@@ -36,8 +36,14 @@ var sniffTests = []struct {
        {"XML", []byte("\n<?xml!"), "text/xml; charset=utf-8"},
 
        // Image types.
+       {"Windows icon", []byte("\x00\x00\x01\x00"), "image/x-icon"},
+       {"Windows cursor", []byte("\x00\x00\x02\x00"), "image/x-icon"},
+       {"BMP image", []byte("BM..."), "image/bmp"},
        {"GIF 87a", []byte(`GIF87a`), "image/gif"},
        {"GIF 89a", []byte(`GIF89a...`), "image/gif"},
+       {"WEBP image", []byte("RIFF\x00\x00\x00\x00WEBPVP"), "image/webp"},
+       {"PNG image", []byte("\x89PNG\x0D\x0A\x1A\x0A"), "image/png"},
+       {"JPEG image", []byte("\xFF\xD8\xFF"), "image/jpeg"},
 
        // Audio types.
        {"MIDI audio", []byte("MThd\x00\x00\x00\x06\x00\x01"), "audio/midi"},
@@ -66,6 +72,12 @@ var sniffTests = []struct {
        {"woff sample  I", []byte("\x77\x4f\x46\x46\x00\x01\x00\x00\x00\x00\x30\x54\x00\x0d\x00\x00"), "font/woff"},
        {"woff2 sample", []byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00"), "font/woff2"},
        {"wasm sample", []byte("\x00\x61\x73\x6d\x01\x00"), "application/wasm"},
+
+       // Archive types
+       {"RAR v1.5-v4.0", []byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"},
+       {"RAR v5+", []byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"},
+       {"Incorrect RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/octet-stream"},
+       {"Incorrect RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/octet-stream"},
 }
 
 func TestDetectContentType(t *testing.T) {
index 086f3d1a71ed56bcd93e5a66fb62a26429968f4d..286315f6395a8e5c89f6b2d835beea5543d80219 100644 (file)
@@ -10,6 +10,7 @@ const (
        StatusContinue           = 100 // RFC 7231, 6.2.1
        StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
        StatusProcessing         = 102 // RFC 2518, 10.1
+       StatusEarlyHints         = 103 // RFC 8297
 
        StatusOK                   = 200 // RFC 7231, 6.3.1
        StatusCreated              = 201 // RFC 7231, 6.3.2
@@ -79,6 +80,7 @@ var statusText = map[int]string{
        StatusContinue:           "Continue",
        StatusSwitchingProtocols: "Switching Protocols",
        StatusProcessing:         "Processing",
+       StatusEarlyHints:         "Early Hints",
 
        StatusOK:                   "OK",
        StatusCreated:              "Created",
index e8a93e9137eb8a97d3840d018296462a3dee6d54..2e01a07f84fccdbf8ded4873f31ee151a8d2b414 100644 (file)
@@ -21,7 +21,7 @@ import (
        "sync"
        "time"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // ErrLineTooLong is returned when reading request or response bodies
@@ -53,19 +53,6 @@ func (br *byteReader) Read(p []byte) (n int, err error) {
        return 1, io.EOF
 }
 
-// transferBodyReader is an io.Reader that reads from tw.Body
-// and records any non-EOF error in tw.bodyReadError.
-// It is exactly 1 pointer wide to avoid allocations into interfaces.
-type transferBodyReader struct{ tw *transferWriter }
-
-func (br transferBodyReader) Read(p []byte) (n int, err error) {
-       n, err = br.tw.Body.Read(p)
-       if err != nil && err != io.EOF {
-               br.tw.bodyReadError = err
-       }
-       return
-}
-
 // transferWriter inspects the fields of a user-supplied Request or Response,
 // sanitizes them without changing the user object and provides methods for
 // writing the respective header, body and trailer in wire format.
@@ -347,15 +334,18 @@ func (t *transferWriter) writeBody(w io.Writer) error {
        var err error
        var ncopy int64
 
-       // Write body
+       // Write body. We "unwrap" the body first if it was wrapped in a
+       // nopCloser. This is to ensure that we can take advantage of
+       // OS-level optimizations in the event that the body is an
+       // *os.File.
        if t.Body != nil {
-               var body = transferBodyReader{t}
+               var body = t.unwrapBody()
                if chunked(t.TransferEncoding) {
                        if bw, ok := w.(*bufio.Writer); ok && !t.IsResponse {
                                w = &internal.FlushAfterChunkWriter{Writer: bw}
                        }
                        cw := internal.NewChunkedWriter(w)
-                       _, err = io.Copy(cw, body)
+                       _, err = t.doBodyCopy(cw, body)
                        if err == nil {
                                err = cw.Close()
                        }
@@ -364,14 +354,14 @@ func (t *transferWriter) writeBody(w io.Writer) error {
                        if t.Method == "CONNECT" {
                                dst = bufioFlushWriter{dst}
                        }
-                       ncopy, err = io.Copy(dst, body)
+                       ncopy, err = t.doBodyCopy(dst, body)
                } else {
-                       ncopy, err = io.Copy(w, io.LimitReader(body, t.ContentLength))
+                       ncopy, err = t.doBodyCopy(w, io.LimitReader(body, t.ContentLength))
                        if err != nil {
                                return err
                        }
                        var nextra int64
-                       nextra, err = io.Copy(ioutil.Discard, body)
+                       nextra, err = t.doBodyCopy(ioutil.Discard, body)
                        ncopy += nextra
                }
                if err != nil {
@@ -402,6 +392,31 @@ func (t *transferWriter) writeBody(w io.Writer) error {
        return err
 }
 
+// doBodyCopy wraps a copy operation, with any resulting error also
+// being saved in bodyReadError.
+//
+// This function is only intended for use in writeBody.
+func (t *transferWriter) doBodyCopy(dst io.Writer, src io.Reader) (n int64, err error) {
+       n, err = io.Copy(dst, src)
+       if err != nil && err != io.EOF {
+               t.bodyReadError = err
+       }
+       return
+}
+
+// unwrapBodyReader unwraps the body's inner reader if it's a
+// nopCloser. This is to ensure that body writes sourced from local
+// files (*os.File types) are properly optimized.
+//
+// This function is only intended for use in writeBody.
+func (t *transferWriter) unwrapBody() io.Reader {
+       if reflect.TypeOf(t.Body) == nopCloserType {
+               return reflect.ValueOf(t.Body).Field(0).Interface().(io.Reader)
+       }
+
+       return t.Body
+}
+
 type transferReader struct {
        // Input
        Header        Header
@@ -574,6 +589,22 @@ func chunked(te []string) bool { return len(te) > 0 && te[0] == "chunked" }
 // Checks whether the encoding is explicitly "identity".
 func isIdentity(te []string) bool { return len(te) == 1 && te[0] == "identity" }
 
+// unsupportedTEError reports unsupported transfer-encodings.
+type unsupportedTEError struct {
+       err string
+}
+
+func (uste *unsupportedTEError) Error() string {
+       return uste.err
+}
+
+// isUnsupportedTEError checks if the error is of type
+// unsupportedTEError. It is usually invoked with a non-nil err.
+func isUnsupportedTEError(err error) bool {
+       _, ok := err.(*unsupportedTEError)
+       return ok
+}
+
 // fixTransferEncoding sanitizes t.TransferEncoding, if needed.
 func (t *transferReader) fixTransferEncoding() error {
        raw, present := t.Header["Transfer-Encoding"]
@@ -600,7 +631,7 @@ func (t *transferReader) fixTransferEncoding() error {
                        break
                }
                if encoding != "chunked" {
-                       return &badStringError{"unsupported transfer encoding", encoding}
+                       return &unsupportedTEError{fmt.Sprintf("unsupported transfer encoding: %q", encoding)}
                }
                te = te[0 : len(te)+1]
                te[len(te)-1] = encoding
index 993ea4ef18c449a5332736dc09ccec82e93948a8..65009ee8bf7fd5c9cb97a04e393d194ccc964aa0 100644 (file)
@@ -7,8 +7,12 @@ package http
 import (
        "bufio"
        "bytes"
+       "crypto/rand"
+       "fmt"
        "io"
        "io/ioutil"
+       "os"
+       "reflect"
        "strings"
        "testing"
 )
@@ -90,3 +94,219 @@ func TestDetectInMemoryReaders(t *testing.T) {
                }
        }
 }
+
+type mockTransferWriter struct {
+       CalledReader io.Reader
+       WriteCalled  bool
+}
+
+var _ io.ReaderFrom = (*mockTransferWriter)(nil)
+
+func (w *mockTransferWriter) ReadFrom(r io.Reader) (int64, error) {
+       w.CalledReader = r
+       return io.Copy(ioutil.Discard, r)
+}
+
+func (w *mockTransferWriter) Write(p []byte) (int, error) {
+       w.WriteCalled = true
+       return ioutil.Discard.Write(p)
+}
+
+func TestTransferWriterWriteBodyReaderTypes(t *testing.T) {
+       fileType := reflect.TypeOf(&os.File{})
+       bufferType := reflect.TypeOf(&bytes.Buffer{})
+
+       nBytes := int64(1 << 10)
+       newFileFunc := func() (r io.Reader, done func(), err error) {
+               f, err := ioutil.TempFile("", "net-http-newfilefunc")
+               if err != nil {
+                       return nil, nil, err
+               }
+
+               // Write some bytes to the file to enable reading.
+               if _, err := io.CopyN(f, rand.Reader, nBytes); err != nil {
+                       return nil, nil, fmt.Errorf("failed to write data to file: %v", err)
+               }
+               if _, err := f.Seek(0, 0); err != nil {
+                       return nil, nil, fmt.Errorf("failed to seek to front: %v", err)
+               }
+
+               done = func() {
+                       f.Close()
+                       os.Remove(f.Name())
+               }
+
+               return f, done, nil
+       }
+
+       newBufferFunc := func() (io.Reader, func(), error) {
+               return bytes.NewBuffer(make([]byte, nBytes)), func() {}, nil
+       }
+
+       cases := []struct {
+               name             string
+               bodyFunc         func() (io.Reader, func(), error)
+               method           string
+               contentLength    int64
+               transferEncoding []string
+               limitedReader    bool
+               expectedReader   reflect.Type
+               expectedWrite    bool
+       }{
+               {
+                       name:           "file, non-chunked, size set",
+                       bodyFunc:       newFileFunc,
+                       method:         "PUT",
+                       contentLength:  nBytes,
+                       limitedReader:  true,
+                       expectedReader: fileType,
+               },
+               {
+                       name:   "file, non-chunked, size set, nopCloser wrapped",
+                       method: "PUT",
+                       bodyFunc: func() (io.Reader, func(), error) {
+                               r, cleanup, err := newFileFunc()
+                               return ioutil.NopCloser(r), cleanup, err
+                       },
+                       contentLength:  nBytes,
+                       limitedReader:  true,
+                       expectedReader: fileType,
+               },
+               {
+                       name:           "file, non-chunked, negative size",
+                       method:         "PUT",
+                       bodyFunc:       newFileFunc,
+                       contentLength:  -1,
+                       expectedReader: fileType,
+               },
+               {
+                       name:           "file, non-chunked, CONNECT, negative size",
+                       method:         "CONNECT",
+                       bodyFunc:       newFileFunc,
+                       contentLength:  -1,
+                       expectedReader: fileType,
+               },
+               {
+                       name:             "file, chunked",
+                       method:           "PUT",
+                       bodyFunc:         newFileFunc,
+                       transferEncoding: []string{"chunked"},
+                       expectedWrite:    true,
+               },
+               {
+                       name:           "buffer, non-chunked, size set",
+                       bodyFunc:       newBufferFunc,
+                       method:         "PUT",
+                       contentLength:  nBytes,
+                       limitedReader:  true,
+                       expectedReader: bufferType,
+               },
+               {
+                       name:   "buffer, non-chunked, size set, nopCloser wrapped",
+                       method: "PUT",
+                       bodyFunc: func() (io.Reader, func(), error) {
+                               r, cleanup, err := newBufferFunc()
+                               return ioutil.NopCloser(r), cleanup, err
+                       },
+                       contentLength:  nBytes,
+                       limitedReader:  true,
+                       expectedReader: bufferType,
+               },
+               {
+                       name:          "buffer, non-chunked, negative size",
+                       method:        "PUT",
+                       bodyFunc:      newBufferFunc,
+                       contentLength: -1,
+                       expectedWrite: true,
+               },
+               {
+                       name:          "buffer, non-chunked, CONNECT, negative size",
+                       method:        "CONNECT",
+                       bodyFunc:      newBufferFunc,
+                       contentLength: -1,
+                       expectedWrite: true,
+               },
+               {
+                       name:             "buffer, chunked",
+                       method:           "PUT",
+                       bodyFunc:         newBufferFunc,
+                       transferEncoding: []string{"chunked"},
+                       expectedWrite:    true,
+               },
+       }
+
+       for _, tc := range cases {
+               t.Run(tc.name, func(t *testing.T) {
+                       body, cleanup, err := tc.bodyFunc()
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       defer cleanup()
+
+                       mw := &mockTransferWriter{}
+                       tw := &transferWriter{
+                               Body:             body,
+                               ContentLength:    tc.contentLength,
+                               TransferEncoding: tc.transferEncoding,
+                       }
+
+                       if err := tw.writeBody(mw); err != nil {
+                               t.Fatal(err)
+                       }
+
+                       if tc.expectedReader != nil {
+                               if mw.CalledReader == nil {
+                                       t.Fatal("did not call ReadFrom")
+                               }
+
+                               var actualReader reflect.Type
+                               lr, ok := mw.CalledReader.(*io.LimitedReader)
+                               if ok && tc.limitedReader {
+                                       actualReader = reflect.TypeOf(lr.R)
+                               } else {
+                                       actualReader = reflect.TypeOf(mw.CalledReader)
+                               }
+
+                               if tc.expectedReader != actualReader {
+                                       t.Fatalf("got reader %T want %T", actualReader, tc.expectedReader)
+                               }
+                       }
+
+                       if tc.expectedWrite && !mw.WriteCalled {
+                               t.Fatal("did not invoke Write")
+                       }
+               })
+       }
+}
+
+func TestFixTransferEncoding(t *testing.T) {
+       tests := []struct {
+               hdr     Header
+               wantErr error
+       }{
+               {
+                       hdr:     Header{"Transfer-Encoding": {"fugazi"}},
+                       wantErr: &unsupportedTEError{`unsupported transfer encoding: "fugazi"`},
+               },
+               {
+                       hdr:     Header{"Transfer-Encoding": {"chunked, chunked", "identity", "chunked"}},
+                       wantErr: &badStringError{"too many transfer encodings", "chunked,chunked"},
+               },
+               {
+                       hdr:     Header{"Transfer-Encoding": {"chunked"}},
+                       wantErr: nil,
+               },
+       }
+
+       for i, tt := range tests {
+               tr := &transferReader{
+                       Header:     tt.hdr,
+                       ProtoMajor: 1,
+                       ProtoMinor: 1,
+               }
+               gotErr := tr.fixTransferEncoding()
+               if !reflect.DeepEqual(gotErr, tt.wantErr) {
+                       t.Errorf("%d.\ngot error:\n%v\nwant error:\n%v\n\n", i, gotErr, tt.wantErr)
+               }
+       }
+}
index a8c5efe6aaff2918498b0aa2f43d9c5adb91bd64..26f642aa7a02b9f40c1dc2afa6feca0368ee8ec8 100644 (file)
@@ -30,8 +30,8 @@ import (
        "sync/atomic"
        "time"
 
-       "internal/x/net/http/httpguts"
-       "internal/x/net/http/httpproxy"
+       "golang.org/x/net/http/httpguts"
+       "golang.org/x/net/http/httpproxy"
 )
 
 // DefaultTransport is the default implementation of Transport and is
@@ -46,6 +46,7 @@ var DefaultTransport RoundTripper = &Transport{
                KeepAlive: 30 * time.Second,
                DualStack: true,
        }).DialContext,
+       ForceAttemptHTTP2:     true,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
@@ -253,10 +254,76 @@ type Transport struct {
        // Zero means to use a default limit.
        MaxResponseHeaderBytes int64
 
+       // WriteBufferSize specifies the size of the write buffer used
+       // when writing to the transport.
+       // If zero, a default (currently 4KB) is used.
+       WriteBufferSize int
+
+       // ReadBufferSize specifies the size of the read buffer used
+       // when reading from the transport.
+       // If zero, a default (currently 4KB) is used.
+       ReadBufferSize int
+
        // nextProtoOnce guards initialization of TLSNextProto and
        // h2transport (via onceSetNextProtoDefaults)
-       nextProtoOnce sync.Once
-       h2transport   h2Transport // non-nil if http2 wired up
+       nextProtoOnce      sync.Once
+       h2transport        h2Transport // non-nil if http2 wired up
+       tlsNextProtoWasNil bool        // whether TLSNextProto was nil when the Once fired
+
+       // ForceAttemptHTTP2 controls whether HTTP/2 is enabled when a non-zero
+       // Dial, DialTLS, or DialContext func or TLSClientConfig is provided.
+       // By default, use of any those fields conservatively disables HTTP/2.
+       // To use a custom dialer or TLS config and still attempt HTTP/2
+       // upgrades, set this to true.
+       ForceAttemptHTTP2 bool
+}
+
+func (t *Transport) writeBufferSize() int {
+       if t.WriteBufferSize > 0 {
+               return t.WriteBufferSize
+       }
+       return 4 << 10
+}
+
+func (t *Transport) readBufferSize() int {
+       if t.ReadBufferSize > 0 {
+               return t.ReadBufferSize
+       }
+       return 4 << 10
+}
+
+// Clone returns a deep copy of t's exported fields.
+func (t *Transport) Clone() *Transport {
+       t.nextProtoOnce.Do(t.onceSetNextProtoDefaults)
+       t2 := &Transport{
+               Proxy:                  t.Proxy,
+               DialContext:            t.DialContext,
+               Dial:                   t.Dial,
+               DialTLS:                t.DialTLS,
+               TLSClientConfig:        t.TLSClientConfig.Clone(),
+               TLSHandshakeTimeout:    t.TLSHandshakeTimeout,
+               DisableKeepAlives:      t.DisableKeepAlives,
+               DisableCompression:     t.DisableCompression,
+               MaxIdleConns:           t.MaxIdleConns,
+               MaxIdleConnsPerHost:    t.MaxIdleConnsPerHost,
+               MaxConnsPerHost:        t.MaxConnsPerHost,
+               IdleConnTimeout:        t.IdleConnTimeout,
+               ResponseHeaderTimeout:  t.ResponseHeaderTimeout,
+               ExpectContinueTimeout:  t.ExpectContinueTimeout,
+               ProxyConnectHeader:     t.ProxyConnectHeader.Clone(),
+               MaxResponseHeaderBytes: t.MaxResponseHeaderBytes,
+               ForceAttemptHTTP2:      t.ForceAttemptHTTP2,
+               WriteBufferSize:        t.WriteBufferSize,
+               ReadBufferSize:         t.ReadBufferSize,
+       }
+       if !t.tlsNextProtoWasNil {
+               npm := map[string]func(authority string, c *tls.Conn) RoundTripper{}
+               for k, v := range t.TLSNextProto {
+                       npm[k] = v
+               }
+               t2.TLSNextProto = npm
+       }
+       return t2
 }
 
 // h2Transport is the interface we expect to be able to call from
@@ -272,6 +339,7 @@ type h2Transport interface {
 // onceSetNextProtoDefaults initializes TLSNextProto.
 // It must be called via t.nextProtoOnce.Do.
 func (t *Transport) onceSetNextProtoDefaults() {
+       t.tlsNextProtoWasNil = (t.TLSNextProto == nil)
        if strings.Contains(os.Getenv("GODEBUG"), "http2client=0") {
                return
        }
@@ -296,12 +364,13 @@ func (t *Transport) onceSetNextProtoDefaults() {
                // Transport.
                return
        }
-       if t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil {
+       if !t.ForceAttemptHTTP2 && (t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil || t.DialContext != nil) {
                // Be conservative and don't automatically enable
                // http2 if they've specified a custom TLS config or
                // custom dialers. Let them opt-in themselves via
                // http2.ConfigureTransport so we don't surprise them
                // by modifying their tls.Config. Issue 14275.
+               // However, if ForceAttemptHTTP2 is true, it overrides the above checks.
                return
        }
        t2, err := http2configureTransport(t)
@@ -474,8 +543,8 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) {
                var resp *Response
                if pconn.alt != nil {
                        // HTTP/2 path.
-                       t.decHostConnCount(cm.key()) // don't count cached http2 conns toward conns per host
-                       t.setReqCanceler(req, nil)   // not cancelable with CancelRequest
+                       t.putOrCloseIdleConn(pconn)
+                       t.setReqCanceler(req, nil) // not cancelable with CancelRequest
                        resp, err = pconn.alt.RoundTrip(req)
                } else {
                        resp, err = pconn.roundTrip(treq)
@@ -483,7 +552,10 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) {
                if err == nil {
                        return resp, nil
                }
-               if !pconn.shouldRetryRequest(req, err) {
+               if http2isNoCachedConnError(err) {
+                       t.removeIdleConn(pconn)
+                       t.decHostConnCount(cm.key()) // clean up the persistent connection
+               } else if !pconn.shouldRetryRequest(req, err) {
                        // Issue 16465: return underlying net.Conn.Read error from peek,
                        // as we've historically done.
                        if e, ok := err.(transportReadFromServerError); ok {
@@ -717,6 +789,8 @@ type transportReadFromServerError struct {
        err error
 }
 
+func (e transportReadFromServerError) Unwrap() error { return e.err }
+
 func (e transportReadFromServerError) Error() string {
        return fmt.Sprintf("net/http: Transport failed to read from server: %v", e.err)
 }
@@ -746,9 +820,6 @@ func (t *Transport) tryPutIdleConn(pconn *persistConn) error {
        if pconn.isBroken() {
                return errConnBroken
        }
-       if pconn.alt != nil {
-               return errNotCachingH2Conn
-       }
        pconn.markReused()
        key := pconn.cacheKey
 
@@ -797,7 +868,10 @@ func (t *Transport) tryPutIdleConn(pconn *persistConn) error {
                if pconn.idleTimer != nil {
                        pconn.idleTimer.Reset(t.IdleConnTimeout)
                } else {
-                       pconn.idleTimer = time.AfterFunc(t.IdleConnTimeout, pconn.closeConnIfStillIdle)
+                       // idleTimer does not apply to HTTP/2
+                       if pconn.alt == nil {
+                               pconn.idleTimer = time.AfterFunc(t.IdleConnTimeout, pconn.closeConnIfStillIdle)
+                       }
                }
        }
        pconn.idleAt = time.Now()
@@ -1031,7 +1105,7 @@ func (t *Transport) getConn(treq *transportRequest, cm connectMethod) (*persistC
                t.decHostConnCount(cmKey)
                select {
                case <-req.Cancel:
-                       // It was an error due to cancelation, so prioritize that
+                       // It was an error due to cancellation, so prioritize that
                        // error value. (Issue 16049)
                        return nil, errRequestCanceledConn
                case <-req.Context().Done():
@@ -1042,7 +1116,7 @@ func (t *Transport) getConn(treq *transportRequest, cm connectMethod) (*persistC
                        }
                        return nil, err
                default:
-                       // It wasn't an error due to cancelation, so
+                       // It wasn't an error due to cancellation, so
                        // return the original error message:
                        return nil, v.err
                }
@@ -1345,15 +1419,16 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (*persistCon
 
        if s := pconn.tlsState; s != nil && s.NegotiatedProtocolIsMutual && s.NegotiatedProtocol != "" {
                if next, ok := t.TLSNextProto[s.NegotiatedProtocol]; ok {
-                       return &persistConn{alt: next(cm.targetAddr, pconn.conn.(*tls.Conn))}, nil
+                       return &persistConn{t: t, cacheKey: pconn.cacheKey, alt: next(cm.targetAddr, pconn.conn.(*tls.Conn))}, nil
                }
        }
 
        if t.MaxConnsPerHost > 0 {
                pconn.conn = &connCloseListener{Conn: pconn.conn, t: t, cmKey: pconn.cacheKey}
        }
-       pconn.br = bufio.NewReader(pconn)
-       pconn.bw = bufio.NewWriter(persistConnWriter{pconn})
+       pconn.br = bufio.NewReaderSize(pconn, t.readBufferSize())
+       pconn.bw = bufio.NewWriterSize(persistConnWriter{pconn}, t.writeBufferSize())
+
        go pconn.readLoop()
        go pconn.writeLoop()
        return pconn, nil
@@ -1375,6 +1450,17 @@ func (w persistConnWriter) Write(p []byte) (n int, err error) {
        return
 }
 
+// ReadFrom exposes persistConnWriter's underlying Conn to io.Copy and if
+// the Conn implements io.ReaderFrom, it can take advantage of optimizations
+// such as sendfile.
+func (w persistConnWriter) ReadFrom(r io.Reader) (n int64, err error) {
+       n, err = io.Copy(w.pc.conn, r)
+       w.pc.nwrite += n
+       return
+}
+
+var _ io.ReaderFrom = (*persistConnWriter)(nil)
+
 // connectMethod is the map key (in its String form) for keeping persistent
 // TCP connections alive for subsequent HTTP requests.
 //
@@ -1538,7 +1624,7 @@ func (pc *persistConn) isBroken() bool {
 }
 
 // canceled returns non-nil if the connection was closed due to
-// CancelRequest or due to context cancelation.
+// CancelRequest or due to context cancellation.
 func (pc *persistConn) canceled() error {
        pc.mu.Lock()
        defer pc.mu.Unlock()
@@ -1794,7 +1880,7 @@ func (pc *persistConn) readLoop() {
 
                // Before looping back to the top of this function and peeking on
                // the bufio.Reader, wait for the caller goroutine to finish
-               // reading the response body. (or for cancelation or death)
+               // reading the response body. (or for cancellation or death)
                select {
                case bodyEOF := <-waitForBodyRead:
                        pc.t.setReqCanceler(rc.req, nil) // before pc might return to idle pool
@@ -1826,7 +1912,12 @@ func (pc *persistConn) readLoopPeekFailLocked(peekErr error) {
        }
        if n := pc.br.Buffered(); n > 0 {
                buf, _ := pc.br.Peek(n)
-               log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v", buf, peekErr)
+               if is408Message(buf) {
+                       pc.closeLocked(errServerClosedIdle)
+                       return
+               } else {
+                       log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v", buf, peekErr)
+               }
        }
        if peekErr == io.EOF {
                // common case.
@@ -1836,6 +1927,19 @@ func (pc *persistConn) readLoopPeekFailLocked(peekErr error) {
        }
 }
 
+// is408Message reports whether buf has the prefix of an
+// HTTP 408 Request Timeout response.
+// See golang.org/issue/32310.
+func is408Message(buf []byte) bool {
+       if len(buf) < len("HTTP/1.x 408") {
+               return false
+       }
+       if string(buf[:7]) != "HTTP/1." {
+               return false
+       }
+       return string(buf[8:12]) == " 408"
+}
+
 // readResponse reads an HTTP response (or two, in the case of "Expect:
 // 100-continue") from the server. It returns the final non-100 one.
 // trace is optional.
@@ -2072,8 +2176,21 @@ func (e *httpError) Error() string   { return e.err }
 func (e *httpError) Timeout() bool   { return e.timeout }
 func (e *httpError) Temporary() bool { return true }
 
+func (e *httpError) Is(target error) bool {
+       switch target {
+       case os.ErrTimeout:
+               return e.timeout
+       case os.ErrTemporary:
+               return true
+       }
+       return false
+}
+
 var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true}
-var errRequestCanceled = errors.New("net/http: request canceled")
+
+// errRequestCanceled is set to be identical to the one from h2 to facilitate
+// testing.
+var errRequestCanceled = http2errRequestCanceled
 var errRequestCanceledConn = errors.New("net/http: request canceled while waiting for connection") // TODO: unify?
 
 func nop() {}
@@ -2258,13 +2375,8 @@ func (pc *persistConn) closeLocked(err error) {
        if pc.closed == nil {
                pc.closed = err
                if pc.alt != nil {
-                       // Do nothing; can only get here via getConn's
-                       // handlePendingDial's putOrCloseIdleConn when
-                       // it turns out the abandoned connection in
-                       // flight ended up negotiating an alternate
-                       // protocol. We don't use the connection
-                       // freelist for http2. That's done by the
-                       // alternate protocol's RoundTripper.
+                       // Clean up any host connection counting.
+                       pc.t.decHostConnCount(pc.cacheKey)
                } else {
                        if err != errCallerOwnsConn {
                                pc.conn.Close()
@@ -2408,6 +2520,10 @@ func (tlsHandshakeTimeoutError) Timeout() bool   { return true }
 func (tlsHandshakeTimeoutError) Temporary() bool { return true }
 func (tlsHandshakeTimeoutError) Error() string   { return "net/http: TLS handshake timeout" }
 
+func (tlsHandshakeTimeoutError) Is(target error) bool {
+       return target == os.ErrTimeout || target == os.ErrTemporary
+}
+
 // fakeLocker is a sync.Locker which does nothing. It's used to guard
 // test-only fields when not under test, to avoid runtime atomic
 // overhead.
index 6e075847ddeeadd2802c46b29e182637be4ed4df..2b58e1daecb844691bcef42185118ee8bbf3e5a2 100644 (file)
@@ -20,6 +20,7 @@ import (
        "encoding/binary"
        "errors"
        "fmt"
+       "go/token"
        "internal/nettrace"
        "io"
        "io/ioutil"
@@ -42,7 +43,7 @@ import (
        "testing"
        "time"
 
-       "internal/x/net/http/httpguts"
+       "golang.org/x/net/http/httpguts"
 )
 
 // TODO: test 5 pipelined requests with responses: 1) OK, 2) OK, Connection: Close
@@ -588,6 +589,106 @@ func TestTransportMaxConnsPerHostIncludeDialInProgress(t *testing.T) {
        <-reqComplete
 }
 
+func TestTransportMaxConnsPerHost(t *testing.T) {
+       defer afterTest(t)
+
+       h := HandlerFunc(func(w ResponseWriter, r *Request) {
+               _, err := w.Write([]byte("foo"))
+               if err != nil {
+                       t.Fatalf("Write: %v", err)
+               }
+       })
+
+       testMaxConns := func(scheme string, ts *httptest.Server) {
+               defer ts.Close()
+
+               c := ts.Client()
+               tr := c.Transport.(*Transport)
+               tr.MaxConnsPerHost = 1
+               if err := ExportHttp2ConfigureTransport(tr); err != nil {
+                       t.Fatalf("ExportHttp2ConfigureTransport: %v", err)
+               }
+
+               connCh := make(chan net.Conn, 1)
+               var dialCnt, gotConnCnt, tlsHandshakeCnt int32
+               tr.Dial = func(network, addr string) (net.Conn, error) {
+                       atomic.AddInt32(&dialCnt, 1)
+                       c, err := net.Dial(network, addr)
+                       connCh <- c
+                       return c, err
+               }
+
+               doReq := func() {
+                       trace := &httptrace.ClientTrace{
+                               GotConn: func(connInfo httptrace.GotConnInfo) {
+                                       if !connInfo.Reused {
+                                               atomic.AddInt32(&gotConnCnt, 1)
+                                       }
+                               },
+                               TLSHandshakeStart: func() {
+                                       atomic.AddInt32(&tlsHandshakeCnt, 1)
+                               },
+                       }
+                       req, _ := NewRequest("GET", ts.URL, nil)
+                       req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
+
+                       resp, err := c.Do(req)
+                       if err != nil {
+                               t.Fatalf("request failed: %v", err)
+                       }
+                       defer resp.Body.Close()
+                       _, err = ioutil.ReadAll(resp.Body)
+                       if err != nil {
+                               t.Fatalf("read body failed: %v", err)
+                       }
+               }
+
+               wg := sync.WaitGroup{}
+               for i := 0; i < 10; i++ {
+                       wg.Add(1)
+                       go func() {
+                               defer wg.Done()
+                               doReq()
+                       }()
+               }
+               wg.Wait()
+
+               expected := int32(tr.MaxConnsPerHost)
+               if dialCnt != expected {
+                       t.Errorf("Too many dials (%s): %d", scheme, dialCnt)
+               }
+               if gotConnCnt != expected {
+                       t.Errorf("Too many get connections (%s): %d", scheme, gotConnCnt)
+               }
+               if ts.TLS != nil && tlsHandshakeCnt != expected {
+                       t.Errorf("Too many tls handshakes (%s): %d", scheme, tlsHandshakeCnt)
+               }
+
+               (<-connCh).Close()
+               tr.CloseIdleConnections()
+
+               doReq()
+               expected++
+               if dialCnt != expected {
+                       t.Errorf("Too many dials (%s): %d", scheme, dialCnt)
+               }
+               if gotConnCnt != expected {
+                       t.Errorf("Too many get connections (%s): %d", scheme, gotConnCnt)
+               }
+               if ts.TLS != nil && tlsHandshakeCnt != expected {
+                       t.Errorf("Too many tls handshakes (%s): %d", scheme, tlsHandshakeCnt)
+               }
+       }
+
+       testMaxConns("http", httptest.NewServer(h))
+       testMaxConns("https", httptest.NewTLSServer(h))
+
+       ts := httptest.NewUnstartedServer(h)
+       ts.TLS = &tls.Config{NextProtos: []string{"h2"}}
+       ts.StartTLS()
+       testMaxConns("http2", ts)
+}
+
 func TestTransportRemovesDeadIdleConnections(t *testing.T) {
        setParallel(t)
        defer afterTest(t)
@@ -636,6 +737,8 @@ func TestTransportRemovesDeadIdleConnections(t *testing.T) {
        }
 }
 
+// Test that the Transport notices when a server hangs up on its
+// unexpectedly (a keep-alive connection is closed).
 func TestTransportServerClosingUnexpectedly(t *testing.T) {
        setParallel(t)
        defer afterTest(t)
@@ -672,13 +775,14 @@ func TestTransportServerClosingUnexpectedly(t *testing.T) {
        body1 := fetch(1, 0)
        body2 := fetch(2, 0)
 
-       ts.CloseClientConnections() // surprise!
-
-       // This test has an expected race. Sleeping for 25 ms prevents
-       // it on most fast machines, causing the next fetch() call to
-       // succeed quickly. But if we do get errors, fetch() will retry 5
-       // times with some delays between.
-       time.Sleep(25 * time.Millisecond)
+       // Close all the idle connections in a way that's similar to
+       // the server hanging up on us. We don't use
+       // httptest.Server.CloseClientConnections because it's
+       // best-effort and stops blocking after 5 seconds. On a loaded
+       // machine running many tests concurrently it's possible for
+       // that method to be async and cause the body3 fetch below to
+       // run on an old connection. This function is synchronous.
+       ExportCloseTransportConnsAbruptly(c.Transport.(*Transport))
 
        body3 := fetch(3, 5)
 
@@ -865,6 +969,10 @@ func TestRoundTripGzip(t *testing.T) {
                        req.Header.Set("Accept-Encoding", test.accept)
                }
                res, err := tr.RoundTrip(req)
+               if err != nil {
+                       t.Errorf("%d. RoundTrip: %v", i, err)
+                       continue
+               }
                var body []byte
                if test.compressed {
                        var r *gzip.Reader
@@ -2110,7 +2218,7 @@ func testCancelRequestWithChannelBeforeDo(t *testing.T, withCtx bool) {
                }
        } else {
                if err == nil || !strings.Contains(err.Error(), "canceled") {
-                       t.Errorf("Do error = %v; want cancelation", err)
+                       t.Errorf("Do error = %v; want cancellation", err)
                }
        }
 }
@@ -3589,6 +3697,13 @@ func TestTransportAutomaticHTTP2(t *testing.T) {
        testTransportAutoHTTP(t, &Transport{}, true)
 }
 
+func TestTransportAutomaticHTTP2_DialerAndTLSConfigSupportsHTTP2AndTLSConfig(t *testing.T) {
+       testTransportAutoHTTP(t, &Transport{
+               ForceAttemptHTTP2: true,
+               TLSClientConfig:   new(tls.Config),
+       }, true)
+}
+
 // golang.org/issue/14391: also check DefaultTransport
 func TestTransportAutomaticHTTP2_DefaultTransport(t *testing.T) {
        testTransportAutoHTTP(t, DefaultTransport.(*Transport), true)
@@ -3619,6 +3734,13 @@ func TestTransportAutomaticHTTP2_Dial(t *testing.T) {
        }, false)
 }
 
+func TestTransportAutomaticHTTP2_DialContext(t *testing.T) {
+       var d net.Dialer
+       testTransportAutoHTTP(t, &Transport{
+               DialContext: d.DialContext,
+       }, false)
+}
+
 func TestTransportAutomaticHTTP2_DialTLS(t *testing.T) {
        testTransportAutoHTTP(t, &Transport{
                DialTLS: func(network, addr string) (net.Conn, error) {
@@ -5059,3 +5181,270 @@ func TestTransportRequestReplayable(t *testing.T) {
                })
        }
 }
+
+// testMockTCPConn is a mock TCP connection used to test that
+// ReadFrom is called when sending the request body.
+type testMockTCPConn struct {
+       *net.TCPConn
+
+       ReadFromCalled bool
+}
+
+func (c *testMockTCPConn) ReadFrom(r io.Reader) (int64, error) {
+       c.ReadFromCalled = true
+       return c.TCPConn.ReadFrom(r)
+}
+
+func TestTransportRequestWriteRoundTrip(t *testing.T) {
+       nBytes := int64(1 << 10)
+       newFileFunc := func() (r io.Reader, done func(), err error) {
+               f, err := ioutil.TempFile("", "net-http-newfilefunc")
+               if err != nil {
+                       return nil, nil, err
+               }
+
+               // Write some bytes to the file to enable reading.
+               if _, err := io.CopyN(f, rand.Reader, nBytes); err != nil {
+                       return nil, nil, fmt.Errorf("failed to write data to file: %v", err)
+               }
+               if _, err := f.Seek(0, 0); err != nil {
+                       return nil, nil, fmt.Errorf("failed to seek to front: %v", err)
+               }
+
+               done = func() {
+                       f.Close()
+                       os.Remove(f.Name())
+               }
+
+               return f, done, nil
+       }
+
+       newBufferFunc := func() (io.Reader, func(), error) {
+               return bytes.NewBuffer(make([]byte, nBytes)), func() {}, nil
+       }
+
+       cases := []struct {
+               name             string
+               readerFunc       func() (io.Reader, func(), error)
+               contentLength    int64
+               expectedReadFrom bool
+       }{
+               {
+                       name:             "file, length",
+                       readerFunc:       newFileFunc,
+                       contentLength:    nBytes,
+                       expectedReadFrom: true,
+               },
+               {
+                       name:       "file, no length",
+                       readerFunc: newFileFunc,
+               },
+               {
+                       name:          "file, negative length",
+                       readerFunc:    newFileFunc,
+                       contentLength: -1,
+               },
+               {
+                       name:          "buffer",
+                       contentLength: nBytes,
+                       readerFunc:    newBufferFunc,
+               },
+               {
+                       name:       "buffer, no length",
+                       readerFunc: newBufferFunc,
+               },
+               {
+                       name:          "buffer, length -1",
+                       contentLength: -1,
+                       readerFunc:    newBufferFunc,
+               },
+       }
+
+       for _, tc := range cases {
+               t.Run(tc.name, func(t *testing.T) {
+                       r, cleanup, err := tc.readerFunc()
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       defer cleanup()
+
+                       tConn := &testMockTCPConn{}
+                       trFunc := func(tr *Transport) {
+                               tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
+                                       var d net.Dialer
+                                       conn, err := d.DialContext(ctx, network, addr)
+                                       if err != nil {
+                                               return nil, err
+                                       }
+
+                                       tcpConn, ok := conn.(*net.TCPConn)
+                                       if !ok {
+                                               return nil, fmt.Errorf("%s/%s does not provide a *net.TCPConn", network, addr)
+                                       }
+
+                                       tConn.TCPConn = tcpConn
+                                       return tConn, nil
+                               }
+                       }
+
+                       cst := newClientServerTest(
+                               t,
+                               h1Mode,
+                               HandlerFunc(func(w ResponseWriter, r *Request) {
+                                       io.Copy(ioutil.Discard, r.Body)
+                                       r.Body.Close()
+                                       w.WriteHeader(200)
+                               }),
+                               trFunc,
+                       )
+                       defer cst.close()
+
+                       req, err := NewRequest("PUT", cst.ts.URL, r)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       req.ContentLength = tc.contentLength
+                       req.Header.Set("Content-Type", "application/octet-stream")
+                       resp, err := cst.c.Do(req)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       defer resp.Body.Close()
+                       if resp.StatusCode != 200 {
+                               t.Fatalf("status code = %d; want 200", resp.StatusCode)
+                       }
+
+                       if !tConn.ReadFromCalled && tc.expectedReadFrom {
+                               t.Fatalf("did not call ReadFrom")
+                       }
+
+                       if tConn.ReadFromCalled && !tc.expectedReadFrom {
+                               t.Fatalf("ReadFrom was unexpectedly invoked")
+                       }
+               })
+       }
+}
+
+func TestTransportClone(t *testing.T) {
+       tr := &Transport{
+               Proxy:                  func(*Request) (*url.URL, error) { panic("") },
+               DialContext:            func(ctx context.Context, network, addr string) (net.Conn, error) { panic("") },
+               Dial:                   func(network, addr string) (net.Conn, error) { panic("") },
+               DialTLS:                func(network, addr string) (net.Conn, error) { panic("") },
+               TLSClientConfig:        new(tls.Config),
+               TLSHandshakeTimeout:    time.Second,
+               DisableKeepAlives:      true,
+               DisableCompression:     true,
+               MaxIdleConns:           1,
+               MaxIdleConnsPerHost:    1,
+               MaxConnsPerHost:        1,
+               IdleConnTimeout:        time.Second,
+               ResponseHeaderTimeout:  time.Second,
+               ExpectContinueTimeout:  time.Second,
+               ProxyConnectHeader:     Header{},
+               MaxResponseHeaderBytes: 1,
+               ForceAttemptHTTP2:      true,
+               TLSNextProto: map[string]func(authority string, c *tls.Conn) RoundTripper{
+                       "foo": func(authority string, c *tls.Conn) RoundTripper { panic("") },
+               },
+               ReadBufferSize:  1,
+               WriteBufferSize: 1,
+       }
+       tr2 := tr.Clone()
+       rv := reflect.ValueOf(tr2).Elem()
+       rt := rv.Type()
+       for i := 0; i < rt.NumField(); i++ {
+               sf := rt.Field(i)
+               if !token.IsExported(sf.Name) {
+                       continue
+               }
+               if rv.Field(i).IsZero() {
+                       t.Errorf("cloned field t2.%s is zero", sf.Name)
+               }
+       }
+
+       if _, ok := tr2.TLSNextProto["foo"]; !ok {
+               t.Errorf("cloned Transport lacked TLSNextProto 'foo' key")
+       }
+
+       // But test that a nil TLSNextProto is kept nil:
+       tr = new(Transport)
+       tr2 = tr.Clone()
+       if tr2.TLSNextProto != nil {
+               t.Errorf("Transport.TLSNextProto unexpected non-nil")
+       }
+}
+
+func TestIs408(t *testing.T) {
+       tests := []struct {
+               in   string
+               want bool
+       }{
+               {"HTTP/1.0 408", true},
+               {"HTTP/1.1 408", true},
+               {"HTTP/1.8 408", true},
+               {"HTTP/2.0 408", false}, // maybe h2c would do this? but false for now.
+               {"HTTP/1.1 408 ", true},
+               {"HTTP/1.1 40", false},
+               {"http/1.0 408", false},
+               {"HTTP/1-1 408", false},
+       }
+       for _, tt := range tests {
+               if got := Export_is408Message([]byte(tt.in)); got != tt.want {
+                       t.Errorf("is408Message(%q) = %v; want %v", tt.in, got, tt.want)
+               }
+       }
+}
+
+func TestTransportIgnores408(t *testing.T) {
+       // Not parallel. Relies on mutating the log package's global Output.
+       defer log.SetOutput(log.Writer())
+
+       var logout bytes.Buffer
+       log.SetOutput(&logout)
+
+       defer afterTest(t)
+       const target = "backend:443"
+
+       cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+               nc, _, err := w.(Hijacker).Hijack()
+               if err != nil {
+                       t.Error(err)
+                       return
+               }
+               defer nc.Close()
+               nc.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nok"))
+               nc.Write([]byte("HTTP/1.1 408 bye\r\n")) // changing 408 to 409 makes test fail
+       }))
+       defer cst.close()
+       req, err := NewRequest("GET", cst.ts.URL, nil)
+       if err != nil {
+               t.Fatal(err)
+       }
+       res, err := cst.c.Do(req)
+       if err != nil {
+               t.Fatal(err)
+       }
+       slurp, err := ioutil.ReadAll(res.Body)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if err != nil {
+               t.Fatal(err)
+       }
+       if string(slurp) != "ok" {
+               t.Fatalf("got %q; want ok", slurp)
+       }
+
+       t0 := time.Now()
+       for i := 0; i < 50; i++ {
+               time.Sleep(time.Duration(i) * 5 * time.Millisecond)
+               if cst.tr.IdleConnKeyCountForTesting() == 0 {
+                       if got := logout.String(); got != "" {
+                               t.Fatalf("expected no log output; got: %s", got)
+                       }
+                       return
+               }
+       }
+       t.Fatalf("timeout after %v waiting for Transport connections to die off", time.Since(t0))
+}
index 1fe9bbaf69638c97bd90eccfd84923a7157d94b1..f57c5ff6622c6350aec03408f460b9f5fa21f3b5 100644 (file)
@@ -5,6 +5,7 @@
 package net
 
 import (
+       "internal/poll"
        "internal/syscall/unix"
        "syscall"
        "unsafe"
@@ -56,6 +57,12 @@ func interfaceTable(ifindex int) ([]Interface, error) {
                return nil, err
        }
 
+       sock, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
+       if err != nil {
+               return nil, err
+       }
+       defer poll.CloseFunc(sock)
+
        var ift []Interface
        for len(tab) > 0 {
                ifm := (*syscall.IfMsgHdr)(unsafe.Pointer(&tab[0]))
@@ -73,11 +80,7 @@ func interfaceTable(ifindex int) ([]Interface, error) {
                                // Retrieve MTU
                                ifr := &ifreq{}
                                copy(ifr.Name[:], ifi.Name)
-                               sock, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
-                               if err != nil {
-                                       return nil, err
-                               }
-                               err = unix.Ioctl(sock, _SIOCGIFMTU, uintptr(unsafe.Pointer(ifr)))
+                               err = unix.Ioctl(sock, syscall.SIOCGIFMTU, uintptr(unsafe.Pointer(ifr)))
                                if err != nil {
                                        return nil, err
                                }
index 77372964b104ca5342efd99afcdcaa5a14f75673..d791cb30167943cc9355cb08635ad9a99efd58fe 100644 (file)
@@ -9,7 +9,7 @@ package net
 import (
        "syscall"
 
-       "internal/x/net/route"
+       "golang.org/x/net/route"
 )
 
 // If the ifindex is zero, interfaceTable returns mappings of all
index 818fafe9708a52251d145336e0cf82013c862731..a809b5f5ce49e6cf31e07cea02ab3fe34e6b7736 100644 (file)
@@ -9,7 +9,7 @@ package net
 import (
        "syscall"
 
-       "internal/x/net/route"
+       "golang.org/x/net/route"
 )
 
 func interfaceMessages(ifindex int) ([]route.Message, error) {
index 6a6b3a58187dc1d1386403e3e92afa9e78ced17f..bb4fd73a987670bca842c0783d84c03324c3e41d 100644 (file)
@@ -7,7 +7,7 @@ package net
 import (
        "syscall"
 
-       "internal/x/net/route"
+       "golang.org/x/net/route"
 )
 
 func interfaceMessages(ifindex int) ([]route.Message, error) {
index 8eee2aa03159a9c6f3b8841f42181c5c7330d696..45badd64954a17d087eab9a9540b94acd2d938e4 100644 (file)
@@ -7,7 +7,7 @@ package net
 import (
        "syscall"
 
-       "internal/x/net/route"
+       "golang.org/x/net/route"
 )
 
 func interfaceMessages(ifindex int) ([]route.Message, error) {
index e5d77390f86319b79588534551fae5fa803c0cc9..8fe913840649df038936e1b37f148b37ab6e20a0 100644 (file)
@@ -152,10 +152,14 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
                }
                defer statusf.close()
 
+               // Read but ignore first line as it only contains the table header.
+               // See https://9p.io/magic/man2html/3/ip
+               if _, ok := statusf.readLine(); !ok {
+                       return nil, errors.New("cannot read header line for interface: " + status)
+               }
                line, ok := statusf.readLine()
-               line, ok = statusf.readLine()
                if !ok {
-                       return nil, errors.New("cannot parse IP address for interface: " + status)
+                       return nil, errors.New("cannot read IP address for interface: " + status)
                }
 
                // This assumes only a single address for the interface.
index 868d4174ed38d99bb2ed82116397cff3ccc98cdd..5f9367f996ff64efa3679dec493aed5fa0d1f2df 100644 (file)
@@ -7,7 +7,7 @@ package net
 import (
        "syscall"
 
-       "internal/x/net/lif"
+       "golang.org/x/net/lif"
 )
 
 // If the ifindex is zero, interfaceTable returns mappings of all
index c6b514abcec7987309d758d8be901455c74ffd03..fb6032fbc069a9f921c8aa344ddf927d823de564 100644 (file)
@@ -61,7 +61,7 @@ func TestInterfaces(t *testing.T) {
                        t.Fatal(err)
                }
                switch runtime.GOOS {
-               case "solaris":
+               case "solaris", "illumos":
                        if ifxi.Index != ifi.Index {
                                t.Errorf("got %v; want %v", ifxi, ifi)
                        }
@@ -278,7 +278,7 @@ func checkUnicastStats(ifStats *ifStats, uniStats *routeStats) error {
 
 func checkMulticastStats(ifStats *ifStats, uniStats, multiStats *routeStats) error {
        switch runtime.GOOS {
-       case "aix", "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris":
+       case "aix", "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris", "illumos":
        default:
                // Test the existence of connected multicast route
                // clones for IPv4. Unlike IPv6, IPv4 multicast
index 9a6fda00e84b61f2f9f2a0a21b80d8df2028aa7b..cf90c0cd546c513b2fe52820e87955180d9dcea5 100644 (file)
@@ -565,7 +565,7 @@ func parseIPv6Zone(s string) (IP, string) {
        return parseIPv6(s), zone
 }
 
-// parseIPv6Zone parses s as a literal IPv6 address described in RFC 4291
+// parseIPv6 parses s as a literal IPv6 address described in RFC 4291
 // and RFC 5952.
 func parseIPv6(s string) (ip IP) {
        ip = make(IP, IPv6len)
index 6c9b92a9fc5d30f49f2b4350781bb2445ce9fa49..fef2b6405fa33e82ac5976cfadb28bf02d10a85d 100644 (file)
@@ -534,8 +534,8 @@ func TestIPv4MulticastListener(t *testing.T) {
        switch runtime.GOOS {
        case "android", "nacl", "plan9":
                t.Skipf("not supported on %s", runtime.GOOS)
-       case "solaris":
-               t.Skipf("not supported on solaris, see golang.org/issue/7399")
+       case "solaris", "illumos":
+               t.Skipf("not supported on solaris or illumos, see golang.org/issue/7399")
        }
        if !supportsIPv4() {
                t.Skip("IPv4 is not supported")
@@ -609,8 +609,8 @@ func TestIPv6MulticastListener(t *testing.T) {
        switch runtime.GOOS {
        case "plan9":
                t.Skipf("not supported on %s", runtime.GOOS)
-       case "solaris":
-               t.Skipf("not supported on solaris, see issue 7399")
+       case "solaris", "illumos":
+               t.Skipf("not supported on solaris or illumos, see issue 7399")
        }
        if !supportsIPv6() {
                t.Skip("IPv6 is not supported")
@@ -674,7 +674,7 @@ func checkMulticastListener(c *UDPConn, ip IP) error {
 
 func multicastRIBContains(ip IP) (bool, error) {
        switch runtime.GOOS {
-       case "aix", "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "windows":
+       case "aix", "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "illumos", "windows":
                return true, nil // not implemented yet
        case "linux":
                if runtime.GOARCH == "arm" || runtime.GOARCH == "alpha" {
index 08e8d013855f4f9123544508be2fe2042a1cadf3..24d0d25c3a28a46b2046b714e526d88b86840ab3 100644 (file)
@@ -177,7 +177,7 @@ func (r *Resolver) LookupHost(ctx context.Context, host string) (addrs []string,
        // Make sure that no matter what we do later, host=="" is rejected.
        // parseIP, for example, does accept empty strings.
        if host == "" {
-               return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
+               return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host, IsNotFound: true}
        }
        if ip, _ := parseIPZone(host); ip != nil {
                return []string{host}, nil
@@ -238,7 +238,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP
        // Make sure that no matter what we do later, host=="" is rejected.
        // parseIP, for example, does accept empty strings.
        if host == "" {
-               return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
+               return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host, IsNotFound: true}
        }
        if ip, zone := parseIPZone(host); ip != nil {
                return []IPAddr{{IP: ip, Zone: zone}}, nil
@@ -255,7 +255,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP
                resolverFunc = alt
        }
 
-       // We don't want a cancelation of ctx to affect the
+       // We don't want a cancellation of ctx to affect the
        // lookupGroup operation. Otherwise if our context gets
        // canceled it might cause an error to be returned to a lookup
        // using a completely different context. However we need to preserve
index 70805ddf4cd05a2db388532ea2022b86fce3318c..6a2d48eedace46d23e2a40c4f10ab38466a39900 100644 (file)
@@ -147,10 +147,12 @@ func (*Resolver) lookupHost(ctx context.Context, host string) (addrs []string, e
        // host names in local network (e.g. from /lib/ndb/local)
        lines, err := queryCS(ctx, "net", host, "1")
        if err != nil {
+               dnsError := &DNSError{Err: err.Error(), Name: host}
                if stringsHasSuffix(err.Error(), "dns failure") {
-                       err = errNoSuchHost
+                       dnsError.Err = errNoSuchHost.Error()
+                       dnsError.IsNotFound = true
                }
-               return
+               return nil, dnsError
        }
 loop:
        for _, line := range lines {
index 28a895e15d13c03cf11d0cfd335f6ad5f8ef8546..dd599c7c1c21baf6530e280b5d0c98ee744edcda 100644 (file)
@@ -877,6 +877,9 @@ func TestLookupNonLDH(t *testing.T) {
        if !strings.HasSuffix(err.Error(), errNoSuchHost.Error()) {
                t.Fatalf("lookup error = %v, want %v", err, errNoSuchHost)
        }
+       if !err.(*DNSError).IsNotFound {
+               t.Fatalf("lookup error = %v, want true", err.(*DNSError).IsNotFound)
+       }
 }
 
 func TestLookupContextCancel(t *testing.T) {
@@ -1181,3 +1184,13 @@ func TestWithUnexpiredValuesPreserved(t *testing.T) {
                t.Errorf("Lookup after expiry: Got %v want nil", g)
        }
 }
+
+// Issue 31586: don't crash on null byte in name
+func TestLookupNullByte(t *testing.T) {
+       testenv.MustHaveExternalNetwork(t)
+       testenv.SkipFlakyNet(t)
+       _, err := LookupHost("foo\x00bar") // used to crash on Windows
+       if err == nil {
+               t.Errorf("unexpected success")
+       }
+}
index 0199a87ee384800296007f2d54d164b8b91aac3c..c27b1a0a195149cff6ff0ea3a65f0bb631735b6e 100644 (file)
@@ -12,7 +12,7 @@ import (
        "sync"
        "syscall"
 
-       "internal/x/net/dns/dnsmessage"
+       "golang.org/x/net/dns/dnsmessage"
 )
 
 var onceReadProtocols sync.Once
index 8a68d18a674b3ff8f6fc611431b89e2c5ac1e8f7..d7b28f5e18571ff0a436112afdda13d0556536d4 100644 (file)
@@ -56,7 +56,12 @@ func lookupProtocol(ctx context.Context, name string) (int, error) {
                        if proto, err := lookupProtocolMap(name); err == nil {
                                return proto, nil
                        }
-                       r.err = &DNSError{Err: r.err.Error(), Name: name}
+
+                       dnsError := &DNSError{Err: r.err.Error(), Name: name}
+                       if r.err == errNoSuchHost {
+                               dnsError.IsNotFound = true
+                       }
+                       r.err = dnsError
                }
                return r.proto, r.err
        case <-ctx.Done():
@@ -96,9 +101,18 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr
                        Protocol: syscall.IPPROTO_IP,
                }
                var result *syscall.AddrinfoW
-               e := syscall.GetAddrInfoW(syscall.StringToUTF16Ptr(name), nil, &hints, &result)
+               name16p, err := syscall.UTF16PtrFromString(name)
+               if err != nil {
+                       return nil, &DNSError{Name: name, Err: err.Error()}
+               }
+               e := syscall.GetAddrInfoW(name16p, nil, &hints, &result)
                if e != nil {
-                       return nil, &DNSError{Err: winError("getaddrinfow", e).Error(), Name: name}
+                       err := winError("getaddrinfow", e)
+                       dnsError := &DNSError{Err: err.Error(), Name: name}
+                       if err == errNoSuchHost {
+                               dnsError.IsNotFound = true
+                       }
+                       return nil, dnsError
                }
                defer syscall.FreeAddrInfoW(result)
                addrs := make([]IPAddr, 0, 5)
@@ -124,11 +138,14 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr
                err   error
        }
 
-       ch := make(chan ret, 1)
-       go func() {
-               addr, err := getaddr()
-               ch <- ret{addrs: addr, err: err}
-       }()
+       var ch chan ret
+       if ctx.Err() == nil {
+               ch = make(chan ret, 1)
+               go func() {
+                       addr, err := getaddr()
+                       ch <- ret{addrs: addr, err: err}
+               }()
+       }
 
        select {
        case r := <-ch:
@@ -176,7 +193,12 @@ func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int
                if port, err := lookupPortMap(network, service); err == nil {
                        return port, nil
                }
-               return 0, &DNSError{Err: winError("getaddrinfow", e).Error(), Name: network + "/" + service}
+               err := winError("getaddrinfow", e)
+               dnsError := &DNSError{Err: err.Error(), Name: network + "/" + service}
+               if err == errNoSuchHost {
+                       dnsError.IsNotFound = true
+               }
+               return 0, dnsError
        }
        defer syscall.FreeAddrInfoW(result)
        if result == nil {
index f3b1694735c2ed289d0e56e0c72934f048d27b2b..373ac3d7e2018e66abdad93e9ff08c0275ee63fe 100644 (file)
@@ -26,15 +26,15 @@ func (a HardwareAddr) String() string {
 
 // ParseMAC parses s as an IEEE 802 MAC-48, EUI-48, EUI-64, or a 20-octet
 // IP over InfiniBand link-layer address using one of the following formats:
-//   01:23:45:67:89:ab
-//   01:23:45:67:89:ab:cd:ef
-//   01:23:45:67:89:ab:cd:ef:00:00:01:23:45:67:89:ab:cd:ef:00:00
-//   01-23-45-67-89-ab
-//   01-23-45-67-89-ab-cd-ef
-//   01-23-45-67-89-ab-cd-ef-00-00-01-23-45-67-89-ab-cd-ef-00-00
-//   0123.4567.89ab
-//   0123.4567.89ab.cdef
-//   0123.4567.89ab.cdef.0000.0123.4567.89ab.cdef.0000
+//     00:00:5e:00:53:01
+//     02:00:5e:10:00:00:00:01
+//     00:00:00:00:fe:80:00:00:00:00:00:00:02:00:5e:10:00:00:00:01
+//     00-00-5e-00-53-01
+//     02-00-5e-10-00-00-00-01
+//     00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01
+//     0000.5e00.5301
+//     0200.5e10.0000.0001
+//     0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001
 func ParseMAC(s string) (hw HardwareAddr, err error) {
        if len(s) < 14 {
                goto error
index 2630d190479148969010bb204ba54e29e5f11964..cad884fcf5d42df96fefd720e63f4823ae86c388 100644 (file)
@@ -15,49 +15,69 @@ var parseMACTests = []struct {
        out HardwareAddr
        err string
 }{
-       {"01:23:45:67:89:AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-       {"01-23-45-67-89-AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-       {"0123.4567.89AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-       {"ab:cd:ef:AB:CD:EF", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef}, ""},
-       {"01.02.03.04.05.06", nil, "invalid MAC address"},
-       {"01:02:03:04:05:06:", nil, "invalid MAC address"},
-       {"x1:02:03:04:05:06", nil, "invalid MAC address"},
-       {"01002:03:04:05:06", nil, "invalid MAC address"},
-       {"01:02003:04:05:06", nil, "invalid MAC address"},
-       {"01:02:03004:05:06", nil, "invalid MAC address"},
-       {"01:02:03:04005:06", nil, "invalid MAC address"},
-       {"01:02:03:04:05006", nil, "invalid MAC address"},
-       {"01-02:03:04:05:06", nil, "invalid MAC address"},
-       {"01:02-03-04-05-06", nil, "invalid MAC address"},
-       {"0123:4567:89AF", nil, "invalid MAC address"},
-       {"0123-4567-89AF", nil, "invalid MAC address"},
-       {"01:23:45:67:89:AB:CD:EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
-       {"01-23-45-67-89-AB-CD-EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
-       {"0123.4567.89AB.CDEF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
+       // See RFC 7042, Section 2.1.1.
+       {"00:00:5e:00:53:01", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""},
+       {"00-00-5e-00-53-01", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""},
+       {"0000.5e00.5301", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""},
+
+       // See RFC 7042, Section 2.2.2.
+       {"02:00:5e:10:00:00:00:01", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""},
+       {"02-00-5e-10-00-00-00-01", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""},
+       {"0200.5e10.0000.0001", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""},
+
+       // See RFC 4391, Section 9.1.1.
        {
-               "01:23:45:67:89:ab:cd:ef:00:00:01:23:45:67:89:ab:cd:ef:00:00",
+               "00:00:00:00:fe:80:00:00:00:00:00:00:02:00:5e:10:00:00:00:01",
                HardwareAddr{
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00,
+                       0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01,
                },
                "",
        },
        {
-               "01-23-45-67-89-ab-cd-ef-00-00-01-23-45-67-89-ab-cd-ef-00-00",
+               "00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01",
                HardwareAddr{
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00,
+                       0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01,
                },
                "",
        },
        {
-               "0123.4567.89ab.cdef.0000.0123.4567.89ab.cdef.0000",
+               "0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001",
                HardwareAddr{
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
-                       0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00,
+                       0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01,
                },
                "",
        },
+
+       {"ab:cd:ef:AB:CD:EF", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef}, ""},
+       {"ab:cd:ef:AB:CD:EF:ab:cd", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd}, ""},
+       {
+               "ab:cd:ef:AB:CD:EF:ab:cd:ef:AB:CD:EF:ab:cd:ef:AB:CD:EF:ab:cd",
+               HardwareAddr{
+                       0xab, 0xcd, 0xef, 0xab,
+                       0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef,
+                       0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd,
+               },
+               "",
+       },
+
+       {"01.02.03.04.05.06", nil, "invalid MAC address"},
+       {"01:02:03:04:05:06:", nil, "invalid MAC address"},
+       {"x1:02:03:04:05:06", nil, "invalid MAC address"},
+       {"01002:03:04:05:06", nil, "invalid MAC address"},
+       {"01:02003:04:05:06", nil, "invalid MAC address"},
+       {"01:02:03004:05:06", nil, "invalid MAC address"},
+       {"01:02:03:04005:06", nil, "invalid MAC address"},
+       {"01:02:03:04:05006", nil, "invalid MAC address"},
+       {"01-02:03:04:05:06", nil, "invalid MAC address"},
+       {"01:02-03-04-05-06", nil, "invalid MAC address"},
+       {"0123:4567:89AF", nil, "invalid MAC address"},
+       {"0123-4567-89AF", nil, "invalid MAC address"},
 }
 
 func TestParseMAC(t *testing.T) {
index 554377aa1da989a06eaee5070db4a79bfaf50971..e0907806ca6e337465753e38cb33d4c7f4ca36c5 100644 (file)
@@ -342,6 +342,21 @@ func (p *addrParser) parseAddress(handleGroup bool) ([]*Address, error) {
        }
        // angle-addr = "<" addr-spec ">"
        if !p.consume('<') {
+               atext := true
+               for _, r := range displayName {
+                       if !isAtext(r, true, false) {
+                               atext = false
+                               break
+                       }
+               }
+               if atext {
+                       // The input is like "foo.bar"; it's possible the input
+                       // meant to be "foo.bar@domain", or "foo.bar <...>".
+                       return nil, errors.New("mail: missing '@' or angle-addr")
+               }
+               // The input is like "Full Name", which couldn't possibly be a
+               // valid email address if followed by "@domain"; the input
+               // likely meant to be "Full Name <...>".
                return nil, errors.New("mail: no angle-addr")
        }
        spec, err = p.consumeAddrSpec()
index 14ac9192a4af0569e3ff3b5ce3c1a2e248dc9bd2..2950bc4de92b82a13f0708b84a69e7f539770286 100644 (file)
@@ -144,6 +144,9 @@ func TestAddressParsingError(t *testing.T) {
                12: {"root group: embed group: null@example.com;", "no angle-addr"},
                13: {"group not closed: null@example.com", "expected comma"},
                14: {"group: first@example.com, second@example.com;", "group with multiple addresses"},
+               15: {"john.doe", "missing '@' or angle-addr"},
+               16: {"john.doe@", "no angle-addr"},
+               17: {"John Doe@foo.bar", "no angle-addr"},
        }
 
        for i, tc := range mustErrTestCases {
index 77b8f69074e39c4f3f13e39a4027ed7d10253f77..b3f9b8ba07f04bd3c098af33a1ae70047c967d8b 100644 (file)
@@ -282,7 +282,7 @@ func (c *conn) SetWriteBuffer(bytes int) error {
        return nil
 }
 
-// File returns a copy of the underlying os.File
+// File returns a copy of the underlying os.File.
 // It is the caller's responsibility to close f when finished.
 // Closing c does not affect f, and closing f does not affect c.
 //
@@ -448,6 +448,8 @@ type OpError struct {
        Err error
 }
 
+func (e *OpError) Unwrap() error { return e.Err }
+
 func (e *OpError) Error() string {
        if e == nil {
                return "<nil>"
@@ -473,7 +475,7 @@ func (e *OpError) Error() string {
 
 var (
        // aLongTimeAgo is a non-zero time, far in the past, used for
-       // immediate cancelation of dials.
+       // immediate cancellation of dials.
        aLongTimeAgo = time.Unix(1, 0)
 
        // nonDeadline and noCancel are just zero values for
@@ -514,6 +516,16 @@ func (e *OpError) Temporary() bool {
        return ok && t.Temporary()
 }
 
+func (e *OpError) Is(target error) bool {
+       switch target {
+       case os.ErrTemporary:
+               return e.Temporary()
+       case os.ErrTimeout:
+               return e.Timeout()
+       }
+       return false
+}
+
 // A ParseError is the error type of literal network address parsers.
 type ParseError struct {
        // Type is the type of string that was expected, such as
@@ -563,6 +575,7 @@ type DNSConfigError struct {
        Err error
 }
 
+func (e *DNSConfigError) Unwrap() error   { return e.Err }
 func (e *DNSConfigError) Error() string   { return "error reading DNS config: " + e.Err.Error() }
 func (e *DNSConfigError) Timeout() bool   { return false }
 func (e *DNSConfigError) Temporary() bool { return false }
@@ -579,6 +592,7 @@ type DNSError struct {
        Server      string // server used
        IsTimeout   bool   // if true, timed out; not all timeouts set this
        IsTemporary bool   // if true, error is temporary; not all errors set this
+       IsNotFound  bool   // if true, host could not be found
 }
 
 func (e *DNSError) Error() string {
@@ -603,6 +617,16 @@ func (e *DNSError) Timeout() bool { return e.IsTimeout }
 // error and return a DNSError for which Temporary returns false.
 func (e *DNSError) Temporary() bool { return e.IsTimeout || e.IsTemporary }
 
+func (e *DNSError) Is(target error) bool {
+       switch target {
+       case os.ErrTemporary:
+               return e.Temporary()
+       case os.ErrTimeout:
+               return e.Timeout()
+       }
+       return false
+}
+
 type writerOnly struct {
        io.Writer
 }
index 9177fc403643e3b9de936811a9c1873efa5a34cf..8cc127464b1e8ef7cdd31b3b5a3df1a21d9b0e95 100644 (file)
@@ -6,6 +6,7 @@ package net
 
 import (
        "io"
+       "os"
        "sync"
        "time"
 )
@@ -84,6 +85,10 @@ func (timeoutError) Error() string   { return "deadline exceeded" }
 func (timeoutError) Timeout() bool   { return true }
 func (timeoutError) Temporary() bool { return true }
 
+func (timeoutError) Is(target error) bool {
+       return target == os.ErrTemporary || target == os.ErrTimeout
+}
+
 type pipeAddr struct{}
 
 func (pipeAddr) Network() string { return "pipe" }
index 53ddc16313d97446e1ccfebc19589a6da8ef3f46..9cc24148ca26fe0173412ae378b38c51fa47b1a8 100644 (file)
@@ -10,7 +10,7 @@ import (
        "testing"
        "time"
 
-       "internal/x/net/nettest"
+       "golang.org/x/net/nettest"
 )
 
 func TestPipe(t *testing.T) {
index 7e9ad70d19b28943d81952d289caa06f09c62daa..10f55c971df198f87b7e7ff36d4092a8bd4a874d 100644 (file)
@@ -14,6 +14,23 @@ import (
        "testing"
 )
 
+var unixEnabledOnAIX bool
+
+func init() {
+       if runtime.GOOS == "aix" {
+               // Unix network isn't properly working on AIX 7.2 with
+               // Technical Level < 2.
+               // The information is retrieved only once in this init()
+               // instead of everytime testableNetwork is called.
+               out, _ := exec.Command("oslevel", "-s").Output()
+               if len(out) >= len("7200-XX-ZZ-YYMM") { // AIX 7.2, Tech Level XX, Service Pack ZZ, date YYMM
+                       aixVer := string(out[:4])
+                       tl, _ := strconv.Atoi(string(out[5:7]))
+                       unixEnabledOnAIX = aixVer > "7200" || (aixVer == "7200" && tl >= 2)
+               }
+       }
+}
+
 // testableNetwork reports whether network is testable on the current
 // platform configuration.
 func testableNetwork(network string) bool {
@@ -38,15 +55,7 @@ func testableNetwork(network string) bool {
                case "android", "nacl", "plan9", "windows":
                        return false
                case "aix":
-                       // Unix network isn't properly working on AIX 7.2 with Technical Level < 2
-                       out, err := exec.Command("oslevel", "-s").Output()
-                       if err != nil {
-                               return false
-                       }
-                       if tl, err := strconv.Atoi(string(out[5:7])); err != nil || tl < 2 {
-                               return false
-                       }
-                       return true
+                       return unixEnabledOnAIX
                }
                // iOS does not support unix, unixgram.
                if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
index d116d2acc9aa29ec74a93ba15201c2cf31d6c379..03225e3d0104b5277d8a0af2fea98be725676c02 100644 (file)
@@ -57,7 +57,7 @@ func TestGobError(t *testing.T) {
                if err == nil {
                        t.Fatal("no error")
                }
-               if !strings.Contains("reading body EOF", err.(error).Error()) {
+               if !strings.Contains(err.(error).Error(), "reading body EOF") {
                        t.Fatal("expected `reading body EOF', got", err)
                }
        }()
index 7bb6476ffab596c6c297281912a6dafb40c3856e..9cb928240f1c4de331eee28f3b82953ccaf68b47 100644 (file)
@@ -130,6 +130,7 @@ import (
        "bufio"
        "encoding/gob"
        "errors"
+       "go/token"
        "io"
        "log"
        "net"
@@ -137,8 +138,6 @@ import (
        "reflect"
        "strings"
        "sync"
-       "unicode"
-       "unicode/utf8"
 )
 
 const (
@@ -202,12 +201,6 @@ func NewServer() *Server {
 // DefaultServer is the default instance of *Server.
 var DefaultServer = NewServer()
 
-// Is this an exported - upper case - name?
-func isExported(name string) bool {
-       rune, _ := utf8.DecodeRuneInString(name)
-       return unicode.IsUpper(rune)
-}
-
 // Is this type exported or a builtin?
 func isExportedOrBuiltinType(t reflect.Type) bool {
        for t.Kind() == reflect.Ptr {
@@ -215,7 +208,7 @@ func isExportedOrBuiltinType(t reflect.Type) bool {
        }
        // PkgPath will be non-empty even for an exported type,
        // so we need to check the type name as well.
-       return isExported(t.Name()) || t.PkgPath() == ""
+       return token.IsExported(t.Name()) || t.PkgPath() == ""
 }
 
 // Register publishes in the server the set of methods of the
@@ -251,7 +244,7 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro
                log.Print(s)
                return errors.New(s)
        }
-       if !isExported(sname) && !useName {
+       if !token.IsExported(sname) && !useName {
                s := "rpc.Register: type " + sname + " is not exported"
                log.Print(s)
                return errors.New(s)
index 43df3bfd15eff08ba1a39b2f62febc7917191462..8cededce58d7fea97274bac397277f52c4f93b20 100644 (file)
@@ -68,8 +68,8 @@ func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
                written, werr = poll.SendFile(&c.pfd, int(fd), pos, remain)
                return true
        })
-       if werr == nil {
-               werr = err
+       if err == nil {
+               err = werr
        }
 
        if lr != nil {
index e366ef8015878d6e78d40b5b418a3e5ec10de64f..8195f91419e33f8b46a0776aeb1b2eae5d8ce101 100644 (file)
@@ -900,8 +900,8 @@ tN8URjVmyEo=
 -----END CERTIFICATE-----`)
 
 // localhostKey is the private key for localhostCert.
-var localhostKey = []byte(`
------BEGIN RSA PRIVATE KEY-----
+var localhostKey = []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 MIICXgIBAAKBgQDScVtBC45ayNsa16NylbPXnc6XOJkzhtWMn2Niu43DmfZHLq5h
 AB9+Gpok4icKaZxV7ayImCWzIf1pGHq8qKhsFshRddRTUAF3np5sDOW3QuhsuXHu
 lkQzLfQuoiL0TrOYvdi90bOliWQVGdGurAS1ZhsYF/fOc7bnRLnoIJYfZQIDAQAB
@@ -915,4 +915,6 @@ vNjJu3yvoEZeIeuzouX9TJE21/33FaeDdsXbRhQEj23cqR38qFHsF1qAYNMCQQDP
 QXLEiJoClkR2orAmqjPLVhR3t2oB3INcnEjLNSq8LHyQEfXyaFfu4U9l5+fRPL2i
 jiC0k/9L5dHUsF0XZothAkEA23ddgRs+Id/HxtojqqUT27B8MT/IGNrYsp4DvS/c
 qgkeluku4GjxRlDMBuXk94xOBEinUs+p/hwP1Alll80Tpg==
------END RSA PRIVATE KEY-----`)
+-----END RSA TESTING KEY-----`))
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
index 324103edf8b6f6c510743ce5434adb36f0ca9823..b14ab9f7edca22fd063685cb5335fcb989b02e7c 100644 (file)
@@ -369,6 +369,7 @@ func startSpliceClient(conn Conn, op string, chunkSize, totalSize int) (func(),
                "GO_NET_TEST_SPLICE_OP=" + op,
                "GO_NET_TEST_SPLICE_CHUNK_SIZE=" + strconv.Itoa(chunkSize),
                "GO_NET_TEST_SPLICE_TOTAL_SIZE=" + strconv.Itoa(totalSize),
+               "TMPDIR=" + os.Getenv("TMPDIR"),
        }...)
        cmd.ExtraFiles = append(cmd.ExtraFiles, f)
        cmd.Stdout = os.Stdout
index db5d1f8482efe9e54dff3e65ae142d6350a46ec4..0daa2f6487a51571388c560ff9182edb06db194c 100644 (file)
@@ -154,7 +154,7 @@ func (c *TCPConn) SetLinger(sec int) error {
 }
 
 // SetKeepAlive sets whether the operating system should send
-// keepalive messages on the connection.
+// keep-alive messages on the connection.
 func (c *TCPConn) SetKeepAlive(keepalive bool) error {
        if !c.ok() {
                return syscall.EINVAL
@@ -165,7 +165,7 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) error {
        return nil
 }
 
-// SetKeepAlivePeriod sets period between keep alives.
+// SetKeepAlivePeriod sets period between keep-alives.
 func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
        if !c.ok() {
                return syscall.EINVAL
@@ -224,6 +224,7 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) {
 // use variables of type Listener instead of assuming TCP.
 type TCPListener struct {
        fd *netFD
+       lc ListenConfig
 }
 
 // SyscallConn returns a raw network connection.
index f70ef6f43abb90707185d62a43c0b0688c3b35b6..e2e835957c0396dec4225134417a382552b59c49 100644 (file)
@@ -44,7 +44,16 @@ func (ln *TCPListener) accept() (*TCPConn, error) {
        if err != nil {
                return nil, err
        }
-       return newTCPConn(fd), nil
+       tc := newTCPConn(fd)
+       if ln.lc.KeepAlive >= 0 {
+               setKeepAlive(fd, true)
+               ka := ln.lc.KeepAlive
+               if ln.lc.KeepAlive == 0 {
+                       ka = defaultTCPKeepAlive
+               }
+               setKeepAlivePeriod(fd, ka)
+       }
+       return tc, nil
 }
 
 func (ln *TCPListener) close() error {
@@ -74,5 +83,5 @@ func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListe
        if err != nil {
                return nil, err
        }
-       return &TCPListener{fd}, nil
+       return &TCPListener{fd: fd, lc: sl.ListenConfig}, nil
 }
index 3d4579cf702c87d05881d856d875fef75b5e4bf3..1ff0ec046169920b17bd086fa9102a34c6bca616 100644 (file)
@@ -140,7 +140,16 @@ func (ln *TCPListener) accept() (*TCPConn, error) {
        if err != nil {
                return nil, err
        }
-       return newTCPConn(fd), nil
+       tc := newTCPConn(fd)
+       if ln.lc.KeepAlive >= 0 {
+               setKeepAlive(fd, true)
+               ka := ln.lc.KeepAlive
+               if ln.lc.KeepAlive == 0 {
+                       ka = defaultTCPKeepAlive
+               }
+               setKeepAlivePeriod(fd, ka)
+       }
+       return tc, nil
 }
 
 func (ln *TCPListener) close() error {
@@ -160,5 +169,5 @@ func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListe
        if err != nil {
                return nil, err
        }
-       return &TCPListener{fd}, nil
+       return &TCPListener{fd: fd, lc: sl.ListenConfig}, nil
 }
index 65a6ee579ea84f4ef3fbc68cf5ebddb4370ba59a..a89f62171962095b4bd2269fd433c836ceedaa75 100644 (file)
@@ -656,7 +656,7 @@ func TestTCPSelfConnect(t *testing.T) {
                n = 1000
        }
        switch runtime.GOOS {
-       case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "solaris", "windows":
+       case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "illumos", "solaris", "windows":
                // Non-Linux systems take a long time to figure
                // out that there is nothing listening on localhost.
                n = 100
index 5b738d23e6d7f9fa7eb75a1df6aadba52dc8065d..da0d173453e0c9331d155f75afbced4932b4ebb4 100644 (file)
@@ -10,6 +10,7 @@ import (
        "time"
 )
 
+// syscall.TCP_KEEPINTVL is missing on some darwin architectures.
 const sysTCP_KEEPINTVL = 0x101
 
 func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
diff --git a/libgo/go/net/testdata/freebsd-usevc-resolv.conf b/libgo/go/net/testdata/freebsd-usevc-resolv.conf
new file mode 100644 (file)
index 0000000..4afb281
--- /dev/null
@@ -0,0 +1 @@
+options usevc
\ No newline at end of file
diff --git a/libgo/go/net/testdata/linux-use-vc-resolv.conf b/libgo/go/net/testdata/linux-use-vc-resolv.conf
new file mode 100644 (file)
index 0000000..4e4a58b
--- /dev/null
@@ -0,0 +1 @@
+options use-vc
\ No newline at end of file
diff --git a/libgo/go/net/testdata/openbsd-tcp-resolv.conf b/libgo/go/net/testdata/openbsd-tcp-resolv.conf
new file mode 100644 (file)
index 0000000..7929e50
--- /dev/null
@@ -0,0 +1 @@
+options tcp
\ No newline at end of file
diff --git a/libgo/go/net/testdata/single-request-reopen-resolv.conf b/libgo/go/net/testdata/single-request-reopen-resolv.conf
new file mode 100644 (file)
index 0000000..9bddeb3
--- /dev/null
@@ -0,0 +1 @@
+options single-request-reopen
\ No newline at end of file
diff --git a/libgo/go/net/testdata/single-request-resolv.conf b/libgo/go/net/testdata/single-request-resolv.conf
new file mode 100644 (file)
index 0000000..5595d29
--- /dev/null
@@ -0,0 +1 @@
+options single-request
\ No newline at end of file
index 2c4f25d5ae693103662f5a43c8c4d8ba679d08f5..a5cab993b298bfa21a12d0a577da7ab46a0c2ec0 100644 (file)
@@ -11,6 +11,7 @@ import (
        "io/ioutil"
        "strconv"
        "strings"
+       "sync"
 )
 
 // A Reader implements convenience methods for reading requests
@@ -27,6 +28,7 @@ type Reader struct {
 // should be reading from an io.LimitReader or similar Reader to bound
 // the size of responses.
 func NewReader(r *bufio.Reader) *Reader {
+       commonHeaderOnce.Do(initCommonHeader)
        return &Reader{R: r}
 }
 
@@ -571,6 +573,8 @@ func (r *Reader) upcomingHeaderNewlines() (n int) {
 // If s contains a space or invalid header field bytes, it is
 // returned without modifications.
 func CanonicalMIMEHeaderKey(s string) string {
+       commonHeaderOnce.Do(initCommonHeader)
+
        // Quick check for canonical encoding.
        upper := true
        for i := 0; i < len(s); i++ {
@@ -642,9 +646,12 @@ func canonicalMIMEHeaderKey(a []byte) string {
 }
 
 // commonHeader interns common header strings.
-var commonHeader = make(map[string]string)
+var commonHeader map[string]string
+
+var commonHeaderOnce sync.Once
 
-func init() {
+func initCommonHeader() {
+       commonHeader = make(map[string]string)
        for _, v := range []string{
                "Accept",
                "Accept-Charset",
index aec193a7cbd8d5ae5d123483d4a10323328ed4f2..e9ae04d37de544a357d86db527f009bc82a7be19 100644 (file)
@@ -332,12 +332,13 @@ func TestReadMultiLineError(t *testing.T) {
        if msg != wantMsg {
                t.Errorf("ReadResponse: msg=%q, want %q", msg, wantMsg)
        }
-       if err.Error() != "550 "+wantMsg {
+       if err != nil && err.Error() != "550 "+wantMsg {
                t.Errorf("ReadResponse: error=%q, want %q", err.Error(), "550 "+wantMsg)
        }
 }
 
 func TestCommonHeaders(t *testing.T) {
+       commonHeaderOnce.Do(initCommonHeader)
        for h := range commonHeader {
                if h != CanonicalMIMEHeaderKey(h) {
                        t.Errorf("Non-canonical header %q in commonHeader", h)
index 1bc5974c6c2f3df3d266d890e3eb505d1307edf8..33c146c02204042402c964e0b9f8d2fe38d513d8 100644 (file)
@@ -58,7 +58,8 @@ type dotWriter struct {
 }
 
 const (
-       wstateBeginLine = iota // beginning of line; initial state; must be zero
+       wstateBegin     = iota // initial state; must be zero
+       wstateBeginLine        // beginning of line
        wstateCR               // wrote \r (possibly at end of line)
        wstateData             // writing data in middle of line
 )
@@ -68,7 +69,7 @@ func (d *dotWriter) Write(b []byte) (n int, err error) {
        for n < len(b) {
                c := b[n]
                switch d.state {
-               case wstateBeginLine:
+               case wstateBegin, wstateBeginLine:
                        d.state = wstateData
                        if c == '.' {
                                // escape leading dot
index ac03669fa2d9fe64308938c16db155778def996f..2afef11b5eeaea35f4a2eb373f40648ed1d2527c 100644 (file)
@@ -33,3 +33,29 @@ func TestDotWriter(t *testing.T) {
                t.Fatalf("wrote %q", s)
        }
 }
+
+func TestDotWriterCloseEmptyWrite(t *testing.T) {
+       var buf bytes.Buffer
+       w := NewWriter(bufio.NewWriter(&buf))
+       d := w.DotWriter()
+       n, err := d.Write([]byte{})
+       if n != 0 || err != nil {
+               t.Fatalf("Write: %d, %s", n, err)
+       }
+       d.Close()
+       want := "\r\n.\r\n"
+       if s := buf.String(); s != want {
+               t.Fatalf("wrote %q; want %q", s, want)
+       }
+}
+
+func TestDotWriterCloseNoWrite(t *testing.T) {
+       var buf bytes.Buffer
+       w := NewWriter(bufio.NewWriter(&buf))
+       d := w.DotWriter()
+       d.Close()
+       want := "\r\n.\r\n"
+       if s := buf.String(); s != want {
+               t.Fatalf("wrote %q; want %q", s, want)
+       }
+}
index 9599fa1d3e88660ff3ba58943c0924c3b149da2b..4b9fe7eba97c267f98c0c3a5e77d0be429dec5ad 100644 (file)
@@ -7,7 +7,9 @@
 package net
 
 import (
+       "errors"
        "fmt"
+       "internal/oserror"
        "internal/poll"
        "internal/testenv"
        "io"
@@ -88,6 +90,9 @@ func TestDialTimeout(t *testing.T) {
                        if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
                                t.Fatalf("#%d: %v", i, err)
                        }
+                       if !errors.Is(err, oserror.ErrTimeout) {
+                               t.Fatalf("#%d: Dial error is not os.ErrTimeout: %v", i, err)
+                       }
                }
        }
 }
index 64274a0a364d0c2ae3ec60bc41c1c9d3c8f3a390..7f6ff93ce4657a18a7ac6cf8332f80c458809c6c 100644 (file)
@@ -13,6 +13,7 @@ package url
 import (
        "errors"
        "fmt"
+       "internal/oserror"
        "sort"
        "strconv"
        "strings"
@@ -25,25 +26,10 @@ type Error struct {
        Err error
 }
 
-func (e *Error) Error() string { return e.Op + " " + e.URL + ": " + e.Err.Error() }
-
-type timeout interface {
-       Timeout() bool
-}
-
-func (e *Error) Timeout() bool {
-       t, ok := e.Err.(timeout)
-       return ok && t.Timeout()
-}
-
-type temporary interface {
-       Temporary() bool
-}
-
-func (e *Error) Temporary() bool {
-       t, ok := e.Err.(temporary)
-       return ok && t.Temporary()
-}
+func (e *Error) Unwrap() error   { return e.Err }
+func (e *Error) Error() string   { return e.Op + " " + e.URL + ": " + e.Err.Error() }
+func (e *Error) Timeout() bool   { return oserror.IsTimeout(e.Err) }
+func (e *Error) Temporary() bool { return oserror.IsTemporary(e.Err) }
 
 func ishex(c byte) bool {
        switch {
@@ -100,7 +86,7 @@ func (e InvalidHostError) Error() string {
 // reserved characters correctly. See golang.org/issue/5684.
 func shouldEscape(c byte, mode encoding) bool {
        // §2.3 Unreserved characters (alphanum)
-       if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
+       if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {
                return false
        }
 
@@ -250,29 +236,24 @@ func unescape(s string, mode encoding) (string, error) {
                return s, nil
        }
 
-       t := make([]byte, len(s)-2*n)
-       j := 0
-       for i := 0; i < len(s); {
+       var t strings.Builder
+       t.Grow(len(s) - 2*n)
+       for i := 0; i < len(s); i++ {
                switch s[i] {
                case '%':
-                       t[j] = unhex(s[i+1])<<4 | unhex(s[i+2])
-                       j++
-                       i += 3
+                       t.WriteByte(unhex(s[i+1])<<4 | unhex(s[i+2]))
+                       i += 2
                case '+':
                        if mode == encodeQueryComponent {
-                               t[j] = ' '
+                               t.WriteByte(' ')
                        } else {
-                               t[j] = '+'
+                               t.WriteByte('+')
                        }
-                       j++
-                       i++
                default:
-                       t[j] = s[i]
-                       j++
-                       i++
+                       t.WriteByte(s[i])
                }
        }
-       return string(t), nil
+       return t.String(), nil
 }
 
 // QueryEscape escapes the string so it can be safely placed
@@ -281,8 +262,8 @@ func QueryEscape(s string) string {
        return escape(s, encodeQueryComponent)
 }
 
-// PathEscape escapes the string so it can be safely placed
-// inside a URL path segment.
+// PathEscape escapes the string so it can be safely placed inside a URL path segment,
+// replacing special characters (including /) with %XX sequences as needed.
 func PathEscape(s string) string {
        return escape(s, encodePathSegment)
 }
@@ -356,10 +337,11 @@ func escape(s string, mode encoding) string {
 // Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/.
 // A consequence is that it is impossible to tell which slashes in the Path were
 // slashes in the raw URL and which were %2f. This distinction is rarely important,
-// but when it is, code must not use Path directly.
-// The Parse function sets both Path and RawPath in the URL it returns,
-// and URL's String method uses RawPath if it is a valid encoding of Path,
-// by calling the EscapedPath method.
+// but when it is, the code should use RawPath, an optional field which only gets
+// set if the default encoding is different from Path.
+//
+// URL's String method uses the EscapedPath method to obtain the path. See the
+// EscapedPath method for more details.
 type URL struct {
        Scheme     string
        Opaque     string    // encoded opaque data
index c5fc90d5156fd9f0a73b1dc3066abf9355ffddb6..e6d6ef8a838afcb55b6a42b688cceabd74b6b1e7 100644 (file)
@@ -929,6 +929,11 @@ var pathEscapeTests = []EscapeTest{
                "abc+def",
                nil,
        },
+       {
+               "a/b",
+               "a%2Fb",
+               nil,
+       },
        {
                "one two",
                "one%20two",
@@ -1629,6 +1634,12 @@ func TestURLHostname(t *testing.T) {
                {"[1:2:3:4]", "1:2:3:4"},
                {"[1:2:3:4]:80", "1:2:3:4"},
                {"[::1]:80", "::1"},
+               {"[::1]", "::1"},
+               {"localhost", "localhost"},
+               {"localhost:443", "localhost"},
+               {"some.super.long.domain.example.org:8080", "some.super.long.domain.example.org"},
+               {"[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:17000", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"},
+               {"[2001:0db8:85a3:0000:0000:8a2e:0370:7334]", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"},
        }
        for _, tt := range tests {
                u := &URL{Host: tt.host}
diff --git a/libgo/go/os/dir_ios.go b/libgo/go/os/dir_ios.go
deleted file mode 100644 (file)
index 8c14d89..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-// +build arm arm64
-
-package os
-
-import (
-       "io"
-       "runtime"
-       "syscall"
-       "unsafe"
-)
-
-// Auxiliary information if the File describes a directory
-type dirInfo struct {
-       dir uintptr // Pointer to DIR structure from dirent.h
-}
-
-func (d *dirInfo) close() {
-       if d.dir == 0 {
-               return
-       }
-       closedir(d.dir)
-       d.dir = 0
-}
-
-func (f *File) readdirnames(n int) (names []string, err error) {
-       if f.dirinfo == nil {
-               dir, call, errno := f.pfd.OpenDir()
-               if errno != nil {
-                       return nil, wrapSyscallError(call, errno)
-               }
-               f.dirinfo = &dirInfo{
-                       dir: dir,
-               }
-       }
-       d := f.dirinfo
-
-       size := n
-       if size <= 0 {
-               size = 100
-               n = -1
-       }
-
-       names = make([]string, 0, size)
-       var dirent syscall.Dirent
-       var entptr uintptr
-       for len(names) < size {
-               if res := readdir_r(d.dir, uintptr(unsafe.Pointer(&dirent)), uintptr(unsafe.Pointer(&entptr))); res != 0 {
-                       return names, wrapSyscallError("readdir", syscall.Errno(res))
-               }
-               if entptr == 0 { // EOF
-                       break
-               }
-               if dirent.Ino == 0 {
-                       continue
-               }
-               name := (*[len(syscall.Dirent{}.Name)]byte)(unsafe.Pointer(&dirent.Name))[:]
-               for i, c := range name {
-                       if c == 0 {
-                               name = name[:i]
-                               break
-                       }
-               }
-               // Check for useless names before allocating a string.
-               if string(name) == "." || string(name) == ".." {
-                       continue
-               }
-               names = append(names, string(name))
-               runtime.KeepAlive(f)
-       }
-       if n >= 0 && len(names) == 0 {
-               return names, io.EOF
-       }
-       return names, nil
-}
-
-// Implemented in syscall/syscall_darwin.go.
-
-//go:linkname closedir syscall.closedir
-func closedir(dir uintptr) (err error)
-
-//go:linkname readdir_r syscall.readdir_r
-func readdir_r(dir, entry, result uintptr) (res int)
diff --git a/libgo/go/os/env_default.go b/libgo/go/os/env_default.go
new file mode 100644 (file)
index 0000000..c11ccce
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !windows
+
+package os
+
+import "syscall"
+
+func environForSysProcAttr(sys *syscall.SysProcAttr) ([]string, error) {
+       return Environ(), nil
+}
diff --git a/libgo/go/os/env_windows.go b/libgo/go/os/env_windows.go
new file mode 100644 (file)
index 0000000..e8f647e
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package os
+
+import (
+       "internal/syscall/windows"
+       "syscall"
+       "unicode/utf16"
+       "unsafe"
+)
+
+func environForSysProcAttr(sys *syscall.SysProcAttr) (env []string, err error) {
+       if sys == nil || sys.Token == 0 {
+               return Environ(), nil
+       }
+       var block *uint16
+       err = windows.CreateEnvironmentBlock(&block, sys.Token, false)
+       if err != nil {
+               return nil, err
+       }
+       defer windows.DestroyEnvironmentBlock(block)
+       blockp := uintptr(unsafe.Pointer(block))
+       for {
+               entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:]
+               for i, v := range entry {
+                       if v == 0 {
+                               entry = entry[:i]
+                               break
+                       }
+               }
+               if len(entry) == 0 {
+                       break
+               }
+               env = append(env, string(utf16.Decode(entry)))
+               blockp += 2 * (uintptr(len(entry)) + 1)
+       }
+       return
+}
index b4242a4829c32180e7957c267c74593ba07626ea..0c2e6a73220a729dd10da1b17efe3b70281f64b0 100644 (file)
@@ -5,20 +5,37 @@
 package os
 
 import (
-       "errors"
+       "internal/oserror"
        "internal/poll"
 )
 
 // Portable analogs of some common system call errors.
+//
+// Errors returned from this package may be tested against these errors
+// with errors.Is.
 var (
-       ErrInvalid    = errors.New("invalid argument") // methods on File will return this error when the receiver is nil
-       ErrPermission = errors.New("permission denied")
-       ErrExist      = errors.New("file already exists")
-       ErrNotExist   = errors.New("file does not exist")
-       ErrClosed     = errors.New("file already closed")
-       ErrNoDeadline = poll.ErrNoDeadline
+       // ErrInvalid indicates an invalid argument.
+       // Methods on File will return this error when the receiver is nil.
+       ErrInvalid = errInvalid() // "invalid argument"
+
+       ErrPermission = errPermission() // "permission denied"
+       ErrExist      = errExist()      // "file already exists"
+       ErrNotExist   = errNotExist()   // "file does not exist"
+       ErrClosed     = errClosed()     // "file already closed"
+       ErrTimeout    = errTimeout()    // "deadline exceeded"
+       ErrTemporary  = errTemporary()  // "temporary error"
+       ErrNoDeadline = errNoDeadline() // "file type does not support deadline"
 )
 
+func errInvalid() error    { return oserror.ErrInvalid }
+func errPermission() error { return oserror.ErrPermission }
+func errExist() error      { return oserror.ErrExist }
+func errNotExist() error   { return oserror.ErrNotExist }
+func errClosed() error     { return oserror.ErrClosed }
+func errTimeout() error    { return oserror.ErrTimeout }
+func errTemporary() error  { return oserror.ErrTemporary }
+func errNoDeadline() error { return poll.ErrNoDeadline }
+
 type timeout interface {
        Timeout() bool
 }
@@ -32,6 +49,8 @@ type PathError struct {
 
 func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
 
+func (e *PathError) Unwrap() error { return e.Err }
+
 // Timeout reports whether this error represents a timeout.
 func (e *PathError) Timeout() bool {
        t, ok := e.Err.(timeout)
@@ -46,6 +65,8 @@ type SyscallError struct {
 
 func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }
 
+func (e *SyscallError) Unwrap() error { return e.Err }
+
 // Timeout reports whether this error represents a timeout.
 func (e *SyscallError) Timeout() bool {
        t, ok := e.Err.(timeout)
@@ -66,21 +87,21 @@ func NewSyscallError(syscall string, err error) error {
 // that a file or directory already exists. It is satisfied by ErrExist as
 // well as some syscall errors.
 func IsExist(err error) bool {
-       return isExist(err)
+       return underlyingErrorIs(err, ErrExist)
 }
 
 // IsNotExist returns a boolean indicating whether the error is known to
 // report that a file or directory does not exist. It is satisfied by
 // ErrNotExist as well as some syscall errors.
 func IsNotExist(err error) bool {
-       return isNotExist(err)
+       return underlyingErrorIs(err, ErrNotExist)
 }
 
 // IsPermission returns a boolean indicating whether the error is known to
 // report that permission is denied. It is satisfied by ErrPermission as well
 // as some syscall errors.
 func IsPermission(err error) bool {
-       return isPermission(err)
+       return underlyingErrorIs(err, ErrPermission)
 }
 
 // IsTimeout returns a boolean indicating whether the error is known
@@ -90,6 +111,18 @@ func IsTimeout(err error) bool {
        return ok && terr.Timeout()
 }
 
+func underlyingErrorIs(err, target error) bool {
+       // Note that this function is not errors.Is:
+       // underlyingError only unwraps the specific error-wrapping types
+       // that it historically did, not all errors.Wrapper implementations.
+       err = underlyingError(err)
+       if err == target {
+               return true
+       }
+       e, ok := err.(interface{ Is(error) bool })
+       return ok && e.Is(target)
+}
+
 // underlyingError returns the underlying error for known os error types.
 func underlyingError(err error) error {
        switch err := err.(type) {
diff --git a/libgo/go/os/error_plan9.go b/libgo/go/os/error_plan9.go
deleted file mode 100644 (file)
index b82bf0d..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-func isExist(err error) bool {
-       return checkErrMessageContent(err, "exists", "is a directory")
-}
-
-func isNotExist(err error) bool {
-       return checkErrMessageContent(err, "does not exist", "not found",
-               "has been removed", "no parent")
-}
-
-func isPermission(err error) bool {
-       return checkErrMessageContent(err, "permission denied")
-}
-
-// checkErrMessageContent checks if err message contains one of msgs.
-func checkErrMessageContent(err error, msgs ...string) bool {
-       if err == nil {
-               return false
-       }
-       err = underlyingError(err)
-       for _, msg := range msgs {
-               if contains(err.Error(), msg) {
-                       return true
-               }
-       }
-       return false
-}
-
-// contains is a local version of strings.Contains. It knows len(sep) > 1.
-func contains(s, sep string) bool {
-       n := len(sep)
-       c := sep[0]
-       for i := 0; i+n <= len(s); i++ {
-               if s[i] == c && s[i:i+n] == sep {
-                       return true
-               }
-       }
-       return false
-}
index 3499ceec959e5d6ac99a9ed5dd9e07b813f7df78..a03bd28b9ae908277bd88e50deb6e890fc6a8e6b 100644 (file)
@@ -5,6 +5,7 @@
 package os_test
 
 import (
+       "errors"
        "fmt"
        "io/ioutil"
        "os"
@@ -26,7 +27,7 @@ func TestErrIsExist(t *testing.T) {
                t.Fatal("Open should have failed")
                return
        }
-       if s := checkErrorPredicate("os.IsExist", os.IsExist, err); s != "" {
+       if s := checkErrorPredicate("os.IsExist", os.IsExist, err, os.ErrExist); s != "" {
                t.Fatal(s)
                return
        }
@@ -38,7 +39,7 @@ func testErrNotExist(name string) string {
                f.Close()
                return "Open should have failed"
        }
-       if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
+       if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err, os.ErrNotExist); s != "" {
                return s
        }
 
@@ -46,7 +47,7 @@ func testErrNotExist(name string) string {
        if err == nil {
                return "Chdir should have failed"
        }
-       if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
+       if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err, os.ErrNotExist); s != "" {
                return s
        }
        return ""
@@ -73,10 +74,13 @@ func TestErrIsNotExist(t *testing.T) {
        }
 }
 
-func checkErrorPredicate(predName string, pred func(error) bool, err error) string {
+func checkErrorPredicate(predName string, pred func(error) bool, err, target error) string {
        if !pred(err) {
                return fmt.Sprintf("%s does not work as expected for %#v", predName, err)
        }
+       if !errors.Is(err, target) {
+               return fmt.Sprintf("errors.Is(%#v, %#v) = false, want true", err, target)
+       }
        return ""
 }
 
@@ -107,9 +111,15 @@ func TestIsExist(t *testing.T) {
                if is := os.IsExist(tt.err); is != tt.is {
                        t.Errorf("os.IsExist(%T %v) = %v, want %v", tt.err, tt.err, is, tt.is)
                }
+               if is := errors.Is(tt.err, os.ErrExist); is != tt.is {
+                       t.Errorf("errors.Is(%T %v, os.ErrExist) = %v, want %v", tt.err, tt.err, is, tt.is)
+               }
                if isnot := os.IsNotExist(tt.err); isnot != tt.isnot {
                        t.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt.err, tt.err, isnot, tt.isnot)
                }
+               if isnot := errors.Is(tt.err, os.ErrNotExist); isnot != tt.isnot {
+                       t.Errorf("errors.Is(%T %v, os.ErrNotExist) = %v, want %v", tt.err, tt.err, isnot, tt.isnot)
+               }
        }
 }
 
@@ -129,6 +139,9 @@ func TestIsPermission(t *testing.T) {
                if got := os.IsPermission(tt.err); got != tt.want {
                        t.Errorf("os.IsPermission(%#v) = %v; want %v", tt.err, got, tt.want)
                }
+               if got := errors.Is(tt.err, os.ErrPermission); got != tt.want {
+                       t.Errorf("errors.Is(%#v, os.ErrPermission) = %v; want %v", tt.err, got, tt.want)
+               }
        }
 }
 
@@ -155,3 +168,10 @@ func TestErrPathNUL(t *testing.T) {
                t.Fatal("Open should have failed")
        }
 }
+
+func TestPathErrorUnwrap(t *testing.T) {
+       pe := &os.PathError{Err: os.ErrInvalid}
+       if !errors.Is(pe, os.ErrInvalid) {
+               t.Error("errors.Is failed, wanted success")
+       }
+}
diff --git a/libgo/go/os/error_unix.go b/libgo/go/os/error_unix.go
deleted file mode 100644 (file)
index 7801057..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build aix darwin dragonfly freebsd hurd js,wasm linux nacl netbsd openbsd solaris
-
-package os
-
-import "syscall"
-
-func isExist(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.EEXIST || err == syscall.ENOTEMPTY || err == ErrExist
-}
-
-func isNotExist(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.ENOENT || err == ErrNotExist
-}
-
-func isPermission(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.EACCES || err == syscall.EPERM || err == ErrPermission
-}
diff --git a/libgo/go/os/error_windows.go b/libgo/go/os/error_windows.go
deleted file mode 100644 (file)
index 02593b5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-func isExist(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.ERROR_ALREADY_EXISTS ||
-               err == syscall.ERROR_DIR_NOT_EMPTY ||
-               err == syscall.ERROR_FILE_EXISTS || err == ErrExist
-}
-
-const _ERROR_BAD_NETPATH = syscall.Errno(53)
-
-func isNotExist(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.ERROR_FILE_NOT_FOUND ||
-               err == _ERROR_BAD_NETPATH ||
-               err == syscall.ERROR_PATH_NOT_FOUND || err == ErrNotExist
-}
-
-func isPermission(err error) bool {
-       err = underlyingError(err)
-       return err == syscall.ERROR_ACCESS_DENIED || err == ErrPermission
-}
index 8b6566e1496edceb36bfcca6269cd0e999e33fe5..822886f70c644474689002b97defddf7b3c6118f 100644 (file)
@@ -28,6 +28,7 @@ func ExampleOpenFile_append() {
                log.Fatal(err)
        }
        if _, err := f.Write([]byte("appended some data\n")); err != nil {
+               f.Close() // ignore error; Write error takes precedence
                log.Fatal(err)
        }
        if err := f.Close(); err != nil {
diff --git a/libgo/go/os/exec/bench_test.go b/libgo/go/os/exec/bench_test.go
new file mode 100644 (file)
index 0000000..9a94001
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package exec
+
+import (
+       "testing"
+)
+
+func BenchmarkExecHostname(b *testing.B) {
+       b.ReportAllocs()
+       path, err := LookPath("hostname")
+       if err != nil {
+               b.Fatalf("could not find hostname: %v", err)
+       }
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               if err := Command(path).Run(); err != nil {
+                       b.Fatalf("hostname: %v", err)
+               }
+       }
+}
index 1aa3ab93dcc126d8803ded05ae6a843ee4fa80a8..17ef003eca02b435019b7d9ce5cfbd8028e76c9c 100644 (file)
@@ -47,6 +47,8 @@ func (e *Error) Error() string {
        return "exec: " + strconv.Quote(e.Name) + ": " + e.Err.Error()
 }
 
+func (e *Error) Unwrap() error { return e.Err }
+
 // Cmd represents an external command being prepared or run.
 //
 // A Cmd cannot be reused after calling its Run, Output or CombinedOutput
@@ -71,6 +73,8 @@ type Cmd struct {
        // environment.
        // If Env contains duplicate environment keys, only the last
        // value in the slice for each duplicate key is used.
+       // As a special case on Windows, SYSTEMROOT is always added if
+       // missing and not explicitly set to the empty string.
        Env []string
 
        // Dir specifies the working directory of the command.
@@ -190,6 +194,25 @@ func CommandContext(ctx context.Context, name string, arg ...string) *Cmd {
        return cmd
 }
 
+// String returns a human-readable description of c.
+// It is intended only for debugging.
+// In particular, it is not suitable for use as input to a shell.
+// The output of String may vary across Go releases.
+func (c *Cmd) String() string {
+       if c.lookPathErr != nil {
+               // failed to resolve path; report the original requested path (plus args)
+               return strings.Join(c.Args, " ")
+       }
+       // report the exact executable path (plus args)
+       b := new(strings.Builder)
+       b.WriteString(c.Path)
+       for _, a := range c.Args[1:] {
+               b.WriteByte(' ')
+               b.WriteString(a)
+       }
+       return b.String()
+}
+
 // interfaceEqual protects against panics from doing equality tests on
 // two interfaces with non-comparable underlying types.
 func interfaceEqual(a, b interface{}) bool {
@@ -376,6 +399,7 @@ func (c *Cmd) Start() error {
                }
        }
 
+       c.childFiles = make([]*os.File, 0, 3+len(c.ExtraFiles))
        type F func(*Cmd) (*os.File, error)
        for _, setupFd := range []F{(*Cmd).stdin, (*Cmd).stdout, (*Cmd).stderr} {
                fd, err := setupFd(c)
@@ -392,7 +416,7 @@ func (c *Cmd) Start() error {
        c.Process, err = os.StartProcess(c.Path, c.argv(), &os.ProcAttr{
                Dir:   c.Dir,
                Files: c.childFiles,
-               Env:   dedupEnv(c.envv()),
+               Env:   addCriticalEnv(dedupEnv(c.envv())),
                Sys:   c.SysProcAttr,
        })
        if err != nil {
@@ -403,11 +427,14 @@ func (c *Cmd) Start() error {
 
        c.closeDescriptors(c.closeAfterStart)
 
-       c.errch = make(chan error, len(c.goroutine))
-       for _, fn := range c.goroutine {
-               go func(fn func() error) {
-                       c.errch <- fn()
-               }(fn)
+       // Don't allocate the channel unless there are goroutines to fire.
+       if len(c.goroutine) > 0 {
+               c.errch = make(chan error, len(c.goroutine))
+               for _, fn := range c.goroutine {
+                       go func(fn func() error) {
+                               c.errch <- fn()
+                       }(fn)
+               }
        }
 
        if c.ctx != nil {
@@ -713,7 +740,7 @@ func dedupEnv(env []string) []string {
 // If caseInsensitive is true, the case of keys is ignored.
 func dedupEnvCase(caseInsensitive bool, env []string) []string {
        out := make([]string, 0, len(env))
-       saw := map[string]int{} // key => index into out
+       saw := make(map[string]int, len(env)) // key => index into out
        for _, kv := range env {
                eq := strings.Index(kv, "=")
                if eq < 0 {
@@ -733,3 +760,24 @@ func dedupEnvCase(caseInsensitive bool, env []string) []string {
        }
        return out
 }
+
+// addCriticalEnv adds any critical environment variables that are required
+// (or at least almost always required) on the operating system.
+// Currently this is only used for Windows.
+func addCriticalEnv(env []string) []string {
+       if runtime.GOOS != "windows" {
+               return env
+       }
+       for _, kv := range env {
+               eq := strings.Index(kv, "=")
+               if eq < 0 {
+                       continue
+               }
+               k := kv[:eq]
+               if strings.EqualFold(k, "SYSTEMROOT") {
+                       // We already have it.
+                       return env
+               }
+       }
+       return append(env, "SYSTEMROOT="+os.Getenv("SYSTEMROOT"))
+}
index 46799cdbdb67a943c6864e1c6ead41caef10af95..d4d67ac9336825ac2588dea9aec47cb870483051 100644 (file)
@@ -8,6 +8,7 @@ package exec_test
 
 import (
        "os/user"
+       "runtime"
        "strconv"
        "syscall"
        "testing"
@@ -15,6 +16,10 @@ import (
 )
 
 func TestCredentialNoSetGroups(t *testing.T) {
+       if runtime.GOOS == "android" {
+               t.Skip("unsupported on Android")
+       }
+
        u, err := user.Current()
        if err != nil {
                t.Fatalf("error getting current user: %v", err)
index b7cc9da134dbe4cb251d2fce8a0f3f7f3779ca75..cfbb87a68f3a9177b3a9c1a376355192fa1e365b 100644 (file)
@@ -695,6 +695,9 @@ func TestExtraFilesRace(t *testing.T) {
        }
 
        for i := 0; i < 10; i++ {
+               if testing.Short() && i >= 3 {
+                       break
+               }
                la := listen()
                ca := helperCommand(t, "describefiles")
                ca.ExtraFiles = []*os.File{listenerFile(la)}
@@ -835,7 +838,7 @@ func TestHelperProcess(*testing.T) {
                        // the cloned file descriptors that result from opening
                        // /dev/urandom.
                        // https://golang.org/issue/3955
-               case "solaris":
+               case "illumos", "solaris":
                        // TODO(aram): This fails on Solaris because libc opens
                        // its own files, as it sees fit. Darwin does the same,
                        // see: https://golang.org/issue/2603
@@ -1154,3 +1157,56 @@ func TestDedupEnvEcho(t *testing.T) {
                t.Errorf("output = %q; want %q", got, want)
        }
 }
+
+func TestString(t *testing.T) {
+       echoPath, err := exec.LookPath("echo")
+       if err != nil {
+               t.Skip(err)
+       }
+       tests := [...]struct {
+               path string
+               args []string
+               want string
+       }{
+               {"echo", nil, echoPath},
+               {"echo", []string{"a"}, echoPath + " a"},
+               {"echo", []string{"a", "b"}, echoPath + " a b"},
+       }
+       for _, test := range tests {
+               cmd := exec.Command(test.path, test.args...)
+               if got := cmd.String(); got != test.want {
+                       t.Errorf("String(%q, %q) = %q, want %q", test.path, test.args, got, test.want)
+               }
+       }
+}
+
+func TestStringPathNotResolved(t *testing.T) {
+       _, err := exec.LookPath("makemeasandwich")
+       if err == nil {
+               t.Skip("wow, thanks")
+       }
+       cmd := exec.Command("makemeasandwich", "-lettuce")
+       want := "makemeasandwich -lettuce"
+       if got := cmd.String(); got != want {
+               t.Errorf("String(%q, %q) = %q, want %q", "makemeasandwich", "-lettuce", got, want)
+       }
+}
+
+// start a child process without the user code explicitly starting
+// with a copy of the parent's. (The Windows SYSTEMROOT issue: Issue
+// 25210)
+func TestChildCriticalEnv(t *testing.T) {
+       testenv.MustHaveExec(t)
+       if runtime.GOOS != "windows" {
+               t.Skip("only testing on Windows")
+       }
+       cmd := helperCommand(t, "echoenv", "SYSTEMROOT")
+       cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
+       out, err := cmd.CombinedOutput()
+       if err != nil {
+               t.Fatal(err)
+       }
+       if strings.TrimSpace(string(out)) == "" {
+               t.Error("no SYSTEMROOT found")
+       }
+}
index bab16ccad34ccf3f18bf1c1e0a63775928c6c144..b0abf743ddb90f5b59607326ee3cba70807728ed 100644 (file)
@@ -27,6 +27,7 @@ func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err e
                Sys: attr.Sys,
        }
 
+       sysattr.Files = make([]uintptr, 0, len(attr.Files))
        for _, f := range attr.Files {
                sysattr.Files = append(sysattr.Files, f.Fd())
        }
index 4b1902f309979e3e081356f734107e2cf1791dd1..bb47e8330c730467e40aa551176019998697fa4d 100644 (file)
@@ -38,8 +38,12 @@ func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err e
                Sys: attr.Sys,
        }
        if sysattr.Env == nil {
-               sysattr.Env = Environ()
+               sysattr.Env, err = environForSysProcAttr(sysattr.Sys)
+               if err != nil {
+                       return nil, err
+               }
        }
+       sysattr.Files = make([]uintptr, 0, len(attr.Files))
        for _, f := range attr.Files {
                sysattr.Files = append(sysattr.Files, f.Fd())
        }
index d735aeea6117b75a1adbf0b0b28f44cbe9ce1ee7..d17d5e62308a7ba36b05290421e9567421a1fb67 100644 (file)
@@ -8,3 +8,5 @@ package os
 
 var Atime = atime
 var LstatP = &lstat
+var ErrWriteAtInAppendMode = errWriteAtInAppendMode
+var RemoveAllTestHook = &removeAllTestHook
diff --git a/libgo/go/os/export_unix_test.go b/libgo/go/os/export_unix_test.go
new file mode 100644 (file)
index 0000000..032b1a9
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris
+
+package os
+
+var SplitPath = splitPath
index fdead63bfc4cc5f52b20411716e754a24e719925..96df3fb5e90fb24a3db90659fb3d585f29834a5a 100644 (file)
@@ -98,6 +98,10 @@ func (e *LinkError) Error() string {
        return e.Op + " " + e.Old + " " + e.New + ": " + e.Err.Error()
 }
 
+func (e *LinkError) Unwrap() error {
+       return e.Err
+}
+
 // Read reads up to len(b) bytes from the File.
 // It returns the number of bytes read and any error encountered.
 // At end of file, Read returns 0, io.EOF.
@@ -159,13 +163,20 @@ func (f *File) Write(b []byte) (n int, err error) {
        return n, err
 }
 
+var errWriteAtInAppendMode = errors.New("os: invalid use of WriteAt on file opened with O_APPEND")
+
 // WriteAt writes len(b) bytes to the File starting at byte offset off.
 // It returns the number of bytes written and an error, if any.
 // WriteAt returns a non-nil error when n != len(b).
+//
+// If file was opened with the O_APPEND flag, WriteAt returns an error.
 func (f *File) WriteAt(b []byte, off int64) (n int, err error) {
        if err := f.checkValid("write"); err != nil {
                return 0, err
        }
+       if f.appendMode {
+               return 0, errWriteAtInAppendMode
+       }
 
        if off < 0 {
                return 0, &PathError{"writeat", f.name, errors.New("negative offset")}
@@ -265,10 +276,10 @@ func Open(name string) (*File, error) {
        return OpenFile(name, O_RDONLY, 0)
 }
 
-// Create creates the named file with mode 0666 (before umask), truncating
-// it if it already exists. If successful, methods on the returned
-// File can be used for I/O; the associated file descriptor has mode
-// O_RDWR.
+// Create creates or truncates the named file. If the file already exists,
+// it is truncated. If the file does not exist, it is created with mode 0666
+// (before umask). If successful, methods on the returned File can
+// be used for I/O; the associated file descriptor has mode O_RDWR.
 // If there is an error, it will be of type *PathError.
 func Create(name string) (*File, error) {
        return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
@@ -276,12 +287,19 @@ func Create(name string) (*File, error) {
 
 // OpenFile is the generalized open call; most users will use Open
 // or Create instead. It opens the named file with specified flag
-// (O_RDONLY etc.) and perm (before umask), if applicable. If successful,
+// (O_RDONLY etc.). If the file does not exist, and the O_CREATE flag
+// is passed, it is created with mode perm (before umask). If successful,
 // methods on the returned File can be used for I/O.
 // If there is an error, it will be of type *PathError.
 func OpenFile(name string, flag int, perm FileMode) (*File, error) {
        testlog.Open(name)
-       return openFileNolog(name, flag, perm)
+       f, err := openFileNolog(name, flag, perm)
+       if err != nil {
+               return nil, err
+       }
+       f.appendMode = flag&O_APPEND != 0
+
+       return f, nil
 }
 
 // lstat is overridden in tests.
@@ -381,6 +399,57 @@ func UserCacheDir() (string, error) {
        return dir, nil
 }
 
+// UserConfigDir returns the default root directory to use for user-specific
+// configuration data. Users should create their own application-specific
+// subdirectory within this one and use that.
+//
+// On Unix systems, it returns $XDG_CONFIG_HOME as specified by
+// https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html if
+// non-empty, else $HOME/.config.
+// On Darwin, it returns $HOME/Library/Application Support.
+// On Windows, it returns %AppData%.
+// On Plan 9, it returns $home/lib.
+//
+// If the location cannot be determined (for example, $HOME is not defined),
+// then it will return an error.
+func UserConfigDir() (string, error) {
+       var dir string
+
+       switch runtime.GOOS {
+       case "windows":
+               dir = Getenv("AppData")
+               if dir == "" {
+                       return "", errors.New("%AppData% is not defined")
+               }
+
+       case "darwin":
+               dir = Getenv("HOME")
+               if dir == "" {
+                       return "", errors.New("$HOME is not defined")
+               }
+               dir += "/Library/Application Support"
+
+       case "plan9":
+               dir = Getenv("home")
+               if dir == "" {
+                       return "", errors.New("$home is not defined")
+               }
+               dir += "/lib"
+
+       default: // Unix
+               dir = Getenv("XDG_CONFIG_HOME")
+               if dir == "" {
+                       dir = Getenv("HOME")
+                       if dir == "" {
+                               return "", errors.New("neither $XDG_CONFIG_HOME nor $HOME are defined")
+                       }
+                       dir += "/.config"
+               }
+       }
+
+       return dir, nil
+}
+
 // UserHomeDir returns the current user's home directory.
 //
 // On Unix, including macOS, it returns the $HOME environment variable.
@@ -393,16 +462,21 @@ func UserHomeDir() (string, error) {
                env, enverr = "USERPROFILE", "%userprofile%"
        case "plan9":
                env, enverr = "home", "$home"
-       case "nacl", "android":
+       }
+       if v := Getenv(env); v != "" {
+               return v, nil
+       }
+       // On some geese the home directory is not always defined.
+       switch runtime.GOOS {
+       case "nacl":
                return "/", nil
+       case "android":
+               return "/sdcard", nil
        case "darwin":
                if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
                        return "/", nil
                }
        }
-       if v := Getenv(env); v != "" {
-               return v, nil
-       }
        return "", errors.New(enverr + " is not defined")
 }
 
@@ -416,11 +490,11 @@ func UserHomeDir() (string, error) {
 // On Unix, the mode's permission bits, ModeSetuid, ModeSetgid, and
 // ModeSticky are used.
 //
-// On Windows, the mode must be non-zero but otherwise only the 0200
-// bit (owner writable) of mode is used; it controls whether the
-// file's read-only attribute is set or cleared. attribute. The other
-// bits are currently unused. Use mode 0400 for a read-only file and
-// 0600 for a readable+writable file.
+// On Windows, only the 0200 bit (owner writable) of mode is used; it
+// controls whether the file's read-only attribute is set or cleared.
+// The other bits are currently unused. For compatibility with Go 1.12
+// and earlier, use a non-zero mode. Use mode 0400 for a read-only
+// file and 0600 for a readable+writable file.
 //
 // On Plan 9, the mode's permission bits, ModeAppend, ModeExclusive,
 // and ModeTemporary are used.
index 3fa12e681667c92d451cfde146987fd894f75871..e0a3826a34cb7b4f4a330b3a0f1230e250c7d1a4 100644 (file)
@@ -22,9 +22,10 @@ func fixLongPath(path string) string {
 // can overwrite this data, which could cause the finalizer
 // to close the wrong file descriptor.
 type file struct {
-       fd      int
-       name    string
-       dirinfo *dirInfo // nil unless directory being read
+       fd         int
+       name       string
+       dirinfo    *dirInfo // nil unless directory being read
+       appendMode bool     // whether file is opened for appending
 }
 
 // Fd returns the integer Plan 9 file descriptor referencing the open file.
@@ -135,6 +136,7 @@ func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
 // Close closes the File, rendering it unusable for I/O.
 // On files that support SetDeadline, any pending I/O operations will
 // be canceled and return immediately with an error.
+// Close will return an error if it has already been called.
 func (f *File) Close() error {
        if err := f.checkValid("close"); err != nil {
                return err
index 85395d6e8600f9f2c155efd6055f2554fb13432e..2220a442f0d0e4504b4547a784f28b94460c466a 100644 (file)
@@ -7,32 +7,12 @@
 package os
 
 import (
-       "runtime"
        "syscall"
        "time"
 )
 
 func sigpipe() // implemented in package runtime
 
-// Readlink returns the destination of the named symbolic link.
-// If there is an error, it will be of type *PathError.
-func Readlink(name string) (string, error) {
-       for len := 128; ; len *= 2 {
-               b := make([]byte, len)
-               n, e := fixCount(syscall.Readlink(fixLongPath(name), b))
-               // buffer too small
-               if runtime.GOOS == "aix" && e == syscall.ERANGE {
-                       continue
-               }
-               if e != nil {
-                       return "", &PathError{"readlink", name, e}
-               }
-               if n < len {
-                       return string(b[0:n]), nil
-               }
-       }
-}
-
 // syscallMode returns the syscall-specific mode bits from Go's portable mode bits.
 func syscallMode(i FileMode) (o uint32) {
        o |= uint32(i.Perm())
index 912ba5affea5c14219c78876f9051a67d871b3f5..750771fa47a3869dec6a2e32651c54815dc87ee9 100644 (file)
@@ -52,6 +52,7 @@ type file struct {
        dirinfo     *dirInfo // nil unless directory being read
        nonblock    bool     // whether we set nonblocking mode
        stdoutOrErr bool     // whether this is stdout or stderr
+       appendMode  bool     // whether file is opened for appending
 }
 
 // Fd returns the integer Unix file descriptor referencing the open file.
@@ -121,33 +122,27 @@ func newFile(fd uintptr, name string, kind newFileKind) *File {
        // we assume they know what they are doing so we allow it to be
        // used with kqueue.
        if kind == kindOpenFile {
-               var st syscall.Stat_t
                switch runtime.GOOS {
-               case "freebsd":
-                       // On FreeBSD before 10.4 it used to crash the
-                       // system unpredictably while running all.bash.
-                       // When we stop supporting FreeBSD 10 we can merge
-                       // this into the dragonfly/netbsd/openbsd case.
-                       // Issue 27619.
-                       pollable = false
-
-               case "dragonfly", "netbsd", "openbsd":
+               case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
+                       var st syscall.Stat_t
+                       err := syscall.Fstat(fdi, &st)
+                       typ := st.Mode & syscall.S_IFMT
                        // Don't try to use kqueue with regular files on *BSDs.
                        // On FreeBSD a regular file is always
                        // reported as ready for writing.
                        // On Dragonfly, NetBSD and OpenBSD the fd is signaled
                        // only once as ready (both read and write).
                        // Issue 19093.
-                       if err := syscall.Fstat(fdi, &st); err == nil && st.Mode&syscall.S_IFMT == syscall.S_IFREG {
+                       // Also don't add directories to the netpoller.
+                       if err == nil && (typ == syscall.S_IFREG || typ == syscall.S_IFDIR) {
                                pollable = false
                        }
 
-               case "darwin":
                        // In addition to the behavior described above for regular files,
                        // on Darwin, kqueue does not work properly with fifos:
                        // closing the last writer does not cause a kqueue event
                        // for any readers. See issue #24164.
-                       if err := syscall.Fstat(fdi, &st); err == nil && (st.Mode&syscall.S_IFMT == syscall.S_IFIFO || st.Mode&syscall.S_IFMT == syscall.S_IFREG) {
+                       if runtime.GOOS == "darwin" && typ == syscall.S_IFIFO {
                                pollable = false
                        }
                }
@@ -236,6 +231,7 @@ func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
 // Close closes the File, rendering it unusable for I/O.
 // On files that support SetDeadline, any pending I/O operations will
 // be canceled and return immediately with an error.
+// Close will return an error if it has already been called.
 func (f *File) Close() error {
        if f == nil {
                return ErrInvalid
@@ -413,3 +409,22 @@ func (f *File) readdir(n int) (fi []FileInfo, err error) {
        }
        return fi, err
 }
+
+// Readlink returns the destination of the named symbolic link.
+// If there is an error, it will be of type *PathError.
+func Readlink(name string) (string, error) {
+       for len := 128; ; len *= 2 {
+               b := make([]byte, len)
+               n, e := fixCount(syscall.Readlink(name, b))
+               // buffer too small
+               if runtime.GOOS == "aix" && e == syscall.ERANGE {
+                       continue
+               }
+               if e != nil {
+                       return "", &PathError{"readlink", name, e}
+               }
+               if n < len {
+                       return string(b[0:n]), nil
+               }
+       }
+}
index cf68cae6cec3398a684fca82e56ff6a993bcd84b..b6430d36aebfbfff49f803db6a2b02b71bfe27fe 100644 (file)
@@ -57,13 +57,26 @@ var sysdir = func() *sysDir {
                        if err != nil {
                                wd = err.Error()
                        }
-                       return &sysDir{
+                       sd := &sysDir{
                                filepath.Join(wd, "..", ".."),
                                []string{
                                        "ResourceRules.plist",
                                        "Info.plist",
                                },
                        }
+                       found := true
+                       for _, f := range sd.files {
+                               path := filepath.Join(sd.name, f)
+                               if _, err := Stat(path); err != nil {
+                                       found = false
+                                       break
+                               }
+                       }
+                       if found {
+                               return sd
+                       }
+                       // In a self-hosted iOS build the above files might
+                       // not exist. Look for system files instead below.
                }
        case "windows":
                return &sysDir{
@@ -1183,21 +1196,25 @@ func TestChdirAndGetwd(t *testing.T) {
        // /usr/bin does not usually exist on Plan 9 or Android.
        switch runtime.GOOS {
        case "android":
-               dirs = []string{"/", "/system/bin"}
+               dirs = []string{"/system/bin"}
        case "plan9":
                dirs = []string{"/", "/usr"}
        case "darwin":
                switch runtime.GOARCH {
                case "arm", "arm64":
-                       d1, err := ioutil.TempDir("", "d1")
-                       if err != nil {
-                               t.Fatalf("TempDir: %v", err)
-                       }
-                       d2, err := ioutil.TempDir("", "d2")
-                       if err != nil {
-                               t.Fatalf("TempDir: %v", err)
+                       dirs = nil
+                       for _, d := range []string{"d1", "d2"} {
+                               dir, err := ioutil.TempDir("", d)
+                               if err != nil {
+                                       t.Fatalf("TempDir: %v", err)
+                               }
+                               // Expand symlinks so path equality tests work.
+                               dir, err = filepath.EvalSymlinks(dir)
+                               if err != nil {
+                                       t.Fatalf("EvalSymlinks: %v", err)
+                               }
+                               dirs = append(dirs, dir)
                        }
-                       dirs = []string{d1, d2}
                }
        }
        oldwd := Getenv("PWD")
@@ -1648,6 +1665,21 @@ func TestWriteAtNegativeOffset(t *testing.T) {
        }
 }
 
+// Verify that WriteAt doesn't work in append mode.
+func TestWriteAtInAppendMode(t *testing.T) {
+       defer chtmpdir(t)()
+       f, err := OpenFile("write_at_in_append_mode.txt", O_APPEND|O_CREATE, 0666)
+       if err != nil {
+               t.Fatalf("OpenFile: %v", err)
+       }
+       defer f.Close()
+
+       _, err = f.WriteAt([]byte(""), 1)
+       if err != ErrWriteAtInAppendMode {
+               t.Fatalf("f.WriteAt returned %v, expected %v", err, ErrWriteAtInAppendMode)
+       }
+}
+
 func writeFile(t *testing.T, fname string, flag int, text string) string {
        f, err := OpenFile(fname, flag, 0666)
        if err != nil {
@@ -2213,8 +2245,8 @@ func TestPipeThreads(t *testing.T) {
        switch runtime.GOOS {
        case "freebsd":
                t.Skip("skipping on FreeBSD; issue 19093")
-       case "solaris":
-               t.Skip("skipping on Solaris; issue 19111")
+       case "illumos", "solaris":
+               t.Skip("skipping on Solaris and illumos; issue 19111")
        case "windows":
                t.Skip("skipping on Windows; issue 19098")
        case "plan9":
@@ -2281,8 +2313,7 @@ func TestPipeThreads(t *testing.T) {
        }
 }
 
-func TestDoubleCloseError(t *testing.T) {
-       path := sfdir + "/" + sfname
+func testDoubleCloseError(t *testing.T, path string) {
        file, err := Open(path)
        if err != nil {
                t.Fatal(err)
@@ -2301,6 +2332,11 @@ func TestDoubleCloseError(t *testing.T) {
        }
 }
 
+func TestDoubleCloseError(t *testing.T) {
+       testDoubleCloseError(t, filepath.Join(sfdir, sfname))
+       testDoubleCloseError(t, sfdir)
+}
+
 func TestUserHomeDir(t *testing.T) {
        dir, err := UserHomeDir()
        if dir == "" && err == nil {
index f609660f01f17cf6938fdb70be556b928327f76c..7af20d79f141693d71b8733f9f0b50e6b577d0f8 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd hurd js,wasm linux netbsd openbsd solaris
 
 package os_test
 
@@ -152,6 +152,9 @@ func TestLchown(t *testing.T) {
        gid := Getgid()
        t.Log("gid:", gid)
        if err = Lchown(linkname, -1, gid); err != nil {
+               if err, ok := err.(*PathError); ok && err.Err == syscall.ENOSYS {
+                       t.Skip("lchown is unavailable")
+               }
                t.Fatalf("lchown %s -1 %d: %s", linkname, gid, err)
        }
        sys := dir.Sys().(*syscall.Stat_t)
@@ -231,6 +234,10 @@ func TestMkdirStickyUmask(t *testing.T) {
 
 // See also issues: 22939, 24331
 func newFileTest(t *testing.T, blocking bool) {
+       if runtime.GOOS == "js" {
+               t.Skipf("syscall.Pipe is not available on %s.", runtime.GOOS)
+       }
+
        p := make([]int, 2)
        if err := syscall.Pipe(p); err != nil {
                t.Fatalf("pipe: %v", err)
@@ -252,12 +259,19 @@ func newFileTest(t *testing.T, blocking bool) {
        }
        defer file.Close()
 
+       timeToWrite := 100 * time.Millisecond
+       timeToDeadline := 1 * time.Millisecond
+       if !blocking {
+               // Use a longer time to avoid flakes.
+               // We won't be waiting this long anyhow.
+               timeToWrite = 1 * time.Second
+       }
+
        // Try to read with deadline (but don't block forever).
        b := make([]byte, 1)
-       // Send something after 100ms.
-       timer := time.AfterFunc(100*time.Millisecond, func() { syscall.Write(p[1], []byte("a")) })
+       timer := time.AfterFunc(timeToWrite, func() { syscall.Write(p[1], []byte("a")) })
        defer timer.Stop()
-       file.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
+       file.SetReadDeadline(time.Now().Add(timeToDeadline))
        _, err := file.Read(b)
        if !blocking {
                // We want it to fail with a timeout.
@@ -281,3 +295,28 @@ func TestNewFileNonBlock(t *testing.T) {
        t.Parallel()
        newFileTest(t, false)
 }
+
+func TestSplitPath(t *testing.T) {
+       t.Parallel()
+       for _, tt := range []struct{ path, wantDir, wantBase string }{
+               {"a", ".", "a"},
+               {"a/", ".", "a"},
+               {"a//", ".", "a"},
+               {"a/b", "a", "b"},
+               {"a/b/", "a", "b"},
+               {"a/b/c", "a/b", "c"},
+               {"/a", "/", "a"},
+               {"/a/", "/", "a"},
+               {"/a/b", "/a", "b"},
+               {"/a/b/", "/a", "b"},
+               {"/a/b/c", "/a/b", "c"},
+               {"//a", "/", "a"},
+               {"//a/", "/", "a"},
+               {"///a", "/", "a"},
+               {"///a/", "/", "a"},
+       } {
+               if dir, base := SplitPath(tt.path); dir != tt.wantDir || base != tt.wantBase {
+                       t.Errorf("splitPath(%q) = %q, %q, want %q, %q", tt.path, dir, base, tt.wantDir, tt.wantBase)
+               }
+       }
+}
index ba43ea352547b9e4018df73c55b2b8d9a6f9bc90..9d7ecad79298ad06f57b4876d3b76280fee01f03 100644 (file)
@@ -58,6 +58,9 @@ func MkdirAll(path string, perm FileMode) error {
        return nil
 }
 
+// removeAllTestHook is a hook for testing.
+var removeAllTestHook = func(err error) error { return err }
+
 // RemoveAll removes path and any children it contains.
 // It removes everything it can but returns the first error
 // it encounters. If the path does not exist, RemoveAll
index 4864989fb5b5f70c1f5ebbd36dda3d18b31e5a3b..4c97f39c9602df1e06c3211995651d64c58f2eb9 100644 (file)
@@ -38,20 +38,30 @@ func basename(name string) string {
 func splitPath(path string) (string, string) {
        // if no better parent is found, the path is relative from "here"
        dirname := "."
-       // if no slashes in path, base is path
-       basename := path
+
+       // Remove all but one leading slash.
+       for len(path) > 1 && path[0] == '/' && path[1] == '/' {
+               path = path[1:]
+       }
 
        i := len(path) - 1
 
-       // Remove trailing slashes
+       // Remove trailing slashes.
        for ; i > 0 && path[i] == '/'; i-- {
                path = path[:i]
        }
 
+       // if no slashes in path, base is path
+       basename := path
+
        // Remove leading directory path
        for i--; i >= 0; i-- {
                if path[i] == '/' {
-                       dirname = path[:i]
+                       if i == 0 {
+                               dirname = path[:1]
+                       } else {
+                               dirname = path[:i]
+                       }
                        basename = path[i+1:]
                        break
                }
index 779b2bdf85b3b2d34b1232cad45f0425e6cea90d..4c53bc985d2de4ced6cdeb636b768c3829bbbc82 100644 (file)
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Test broken pipes on Unix systems.
-// +build !windows,!plan9,!nacl,!js
+// +build !plan9,!nacl,!js
 
 package os_test
 
@@ -35,6 +35,11 @@ func TestEPIPE(t *testing.T) {
                t.Fatal(err)
        }
 
+       expect := syscall.EPIPE
+       if runtime.GOOS == "windows" {
+               // 232 is Windows error code ERROR_NO_DATA, "The pipe is being closed".
+               expect = syscall.Errno(232)
+       }
        // Every time we write to the pipe we should get an EPIPE.
        for i := 0; i < 20; i++ {
                _, err = w.Write([]byte("hi"))
@@ -47,13 +52,17 @@ func TestEPIPE(t *testing.T) {
                if se, ok := err.(*os.SyscallError); ok {
                        err = se.Err
                }
-               if err != syscall.EPIPE {
-                       t.Errorf("iteration %d: got %v, expected EPIPE", i, err)
+               if err != expect {
+                       t.Errorf("iteration %d: got %v, expected %v", i, err, expect)
                }
        }
 }
 
 func TestStdPipe(t *testing.T) {
+       switch runtime.GOOS {
+       case "windows":
+               t.Skip("Windows doesn't support SIGPIPE")
+       }
        testenv.MustHaveExec(t)
        r, w, err := os.Pipe()
        if err != nil {
@@ -195,8 +204,12 @@ func TestClosedPipeRaceWrite(t *testing.T) {
 // for unsupported file type." Currently it returns EAGAIN; it is
 // possible that in the future it will simply wait for data.
 func TestReadNonblockingFd(t *testing.T) {
+       switch runtime.GOOS {
+       case "windows":
+               t.Skip("Windows doesn't support SetNonblock")
+       }
        if os.Getenv("GO_WANT_READ_NONBLOCKING_FD") == "1" {
-               fd := int(os.Stdin.Fd())
+               fd := syscallDescriptor(os.Stdin.Fd())
                syscall.SetNonblock(fd, true)
                defer syscall.SetNonblock(fd, false)
                _, err := os.Stdin.Read(make([]byte, 1))
@@ -226,7 +239,7 @@ func TestReadNonblockingFd(t *testing.T) {
 }
 
 func TestCloseWithBlockingReadByNewFile(t *testing.T) {
-       var p [2]int
+       var p [2]syscallDescriptor
        err := syscall.Pipe(p[:])
        if err != nil {
                t.Fatal(err)
@@ -276,8 +289,11 @@ func testCloseWithBlockingRead(t *testing.T, r, w *os.File) {
                if err == nil {
                        t.Error("I/O on closed pipe unexpectedly succeeded")
                }
-               if err != io.EOF {
-                       t.Errorf("got %v, expected io.EOF", err)
+               if pe, ok := err.(*os.PathError); ok {
+                       err = pe.Err
+               }
+               if err != io.EOF && err != os.ErrClosed {
+                       t.Errorf("got %v, expected EOF or closed", err)
                }
        }(c2)
 
index 804128a1da4bf5ae2932f26bbd36671fa12be098..7364d631f213bb0cda11cf1557eb67f70503ad8a 100644 (file)
@@ -56,6 +56,8 @@ func Getgroups() ([]int, error) {
 // Exit causes the current program to exit with the given status code.
 // Conventionally, code zero indicates success, non-zero an error.
 // The program terminates immediately; deferred functions are not run.
+//
+// For portability, the status code should be in the range [0, 125].
 func Exit(code int) {
        if code == 0 {
                // Give race detector a chance to fail the program.
index 6fdd7e828d6b8d7859c7a6bbef8549fc7b31b861..f3ecf57cb7c2e5988abc818b6d60d399055a9932 100644 (file)
@@ -91,7 +91,8 @@ func removeAllFrom(parent *File, base string) error {
        // Remove the directory's entries.
        var recurseErr error
        for {
-               const request = 1024
+               const reqSize = 1024
+               var respSize int
 
                // Open the directory to recurse into
                file, err := openFdAt(parentFd, base)
@@ -103,23 +104,37 @@ func removeAllFrom(parent *File, base string) error {
                        break
                }
 
-               names, readErr := file.Readdirnames(request)
-               // Errors other than EOF should stop us from continuing.
-               if readErr != nil && readErr != io.EOF {
-                       file.Close()
-                       if IsNotExist(readErr) {
-                               return nil
+               for {
+                       numErr := 0
+
+                       names, readErr := file.Readdirnames(reqSize)
+                       // Errors other than EOF should stop us from continuing.
+                       if readErr != nil && readErr != io.EOF {
+                               file.Close()
+                               if IsNotExist(readErr) {
+                                       return nil
+                               }
+                               return &PathError{"readdirnames", base, readErr}
                        }
-                       return &PathError{"readdirnames", base, readErr}
-               }
 
-               for _, name := range names {
-                       err := removeAllFrom(file, name)
-                       if err != nil {
-                               if pathErr, ok := err.(*PathError); ok {
-                                       pathErr.Path = base + string(PathSeparator) + pathErr.Path
+                       respSize = len(names)
+                       for _, name := range names {
+                               err := removeAllFrom(file, name)
+                               if err != nil {
+                                       if pathErr, ok := err.(*PathError); ok {
+                                               pathErr.Path = base + string(PathSeparator) + pathErr.Path
+                                       }
+                                       numErr++
+                                       if recurseErr == nil {
+                                               recurseErr = err
+                                       }
                                }
-                               recurseErr = err
+                       }
+
+                       // If we can delete any entry, break to start new iteration.
+                       // Otherwise, we discard current names, get next entries and try deleting them.
+                       if numErr != reqSize {
+                               break
                        }
                }
 
@@ -131,13 +146,14 @@ func removeAllFrom(parent *File, base string) error {
                file.Close()
 
                // Finish when the end of the directory is reached
-               if len(names) < request {
+               if respSize < reqSize {
                        break
                }
        }
 
        // Remove the directory itself.
        unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+       unlinkError = removeAllTestHook(unlinkError)
        if unlinkError == nil || IsNotExist(unlinkError) {
                return nil
        }
index 7d9f73e71239b24dd38624576eb87a3b203240c4..cf26bdb21616e96ed670e56b877bf83525e78bde 100644 (file)
@@ -56,8 +56,30 @@ func removeAll(path string) error {
                        return err
                }
 
-               const request = 1024
-               names, err1 := fd.Readdirnames(request)
+               const reqSize = 1024
+               var names []string
+               var readErr error
+
+               for {
+                       numErr := 0
+                       names, readErr = fd.Readdirnames(reqSize)
+
+                       for _, name := range names {
+                               err1 := RemoveAll(path + string(PathSeparator) + name)
+                               if err == nil {
+                                       err = err1
+                               }
+                               if err1 != nil {
+                                       numErr++
+                               }
+                       }
+
+                       // If we can delete any entry, break to start new iteration.
+                       // Otherwise, we discard current names, get next entries and try deleting them.
+                       if numErr != reqSize {
+                               break
+                       }
+               }
 
                // Removing files from the directory may have caused
                // the OS to reshuffle it. Simply calling Readdirnames
@@ -66,19 +88,12 @@ func removeAll(path string) error {
                // directory. See issue 20841.
                fd.Close()
 
-               for _, name := range names {
-                       err1 := RemoveAll(path + string(PathSeparator) + name)
-                       if err == nil {
-                               err = err1
-                       }
-               }
-
-               if err1 == io.EOF {
+               if readErr == io.EOF {
                        break
                }
                // If Readdirnames returned an error, use it.
                if err == nil {
-                       err = err1
+                       err = readErr
                }
                if len(names) == 0 {
                        break
@@ -88,7 +103,7 @@ func removeAll(path string) error {
                // got fewer than request names from Readdirnames, try
                // simply removing the directory now. If that
                // succeeds, we are done.
-               if len(names) < request {
+               if len(names) < reqSize {
                        err1 := Remove(path)
                        if err1 == nil || IsNotExist(err1) {
                                return nil
@@ -109,6 +124,7 @@ func removeAll(path string) error {
 
        // Remove directory.
        err1 := Remove(path)
+       err1 = removeAllTestHook(err1)
        if err1 == nil || IsNotExist(err1) {
                return nil
        }
index 945a38e8e06df37e1dc3bb5071fc75a071e2a6ac..4d556f977e4239b9024348651a743b732fb79b96 100644 (file)
@@ -5,6 +5,7 @@
 package os_test
 
 import (
+       "errors"
        "fmt"
        "io/ioutil"
        . "os"
@@ -80,16 +81,8 @@ func TestRemoveAll(t *testing.T) {
                t.Fatalf("Lstat %q succeeded after RemoveAll (third)", path)
        }
 
-       // Determine if we should run the following test.
-       testit := true
-       if runtime.GOOS == "windows" {
-               // Chmod is not supported under windows.
-               testit = false
-       } else {
-               // Test fails as root.
-               testit = Getuid() != 0
-       }
-       if testit {
+       // Chmod is not supported under Windows and test fails as root.
+       if runtime.GOOS != "windows" && Getuid() != 0 {
                // Make directory with file and subdirectory and trigger error.
                if err = MkdirAll(dpath, 0777); err != nil {
                        t.Fatalf("MkdirAll %q: %s", dpath, err)
@@ -166,7 +159,7 @@ func TestRemoveAllLarge(t *testing.T) {
 
 func TestRemoveAllLongPath(t *testing.T) {
        switch runtime.GOOS {
-       case "aix", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+       case "aix", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "illumos", "solaris":
                break
        default:
                t.Skip("skipping for not implemented platforms")
@@ -413,3 +406,49 @@ func TestRemoveUnreadableDir(t *testing.T) {
                t.Fatal(err)
        }
 }
+
+// Issue 29921
+func TestRemoveAllWithMoreErrorThanReqSize(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in short mode")
+       }
+
+       defer func(oldHook func(error) error) {
+               *RemoveAllTestHook = oldHook
+       }(*RemoveAllTestHook)
+
+       *RemoveAllTestHook = func(err error) error {
+               return errors.New("error from RemoveAllTestHook")
+       }
+
+       tmpDir, err := ioutil.TempDir("", "TestRemoveAll-")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer RemoveAll(tmpDir)
+
+       path := filepath.Join(tmpDir, "_TestRemoveAllWithMoreErrorThanReqSize_")
+
+       // Make directory with 1025 files and remove.
+       if err := MkdirAll(path, 0777); err != nil {
+               t.Fatalf("MkdirAll %q: %s", path, err)
+       }
+       for i := 0; i < 1025; i++ {
+               fpath := filepath.Join(path, fmt.Sprintf("file%d", i))
+               fd, err := Create(fpath)
+               if err != nil {
+                       t.Fatalf("create %q: %s", fpath, err)
+               }
+               fd.Close()
+       }
+
+       // This call should not hang
+       if err := RemoveAll(path); err == nil {
+               t.Fatal("Want error from RemoveAllTestHook, got nil")
+       }
+
+       // We hook to inject error, but the actual files must be deleted
+       if _, err := Lstat(path); err == nil {
+               t.Fatal("directory must be deleted even with removeAllTetHook run")
+       }
+}
index 4f65ad8a462dd4c7565287593f5f093b20a908de..f7d61f9de592afb01d775d6220809dbbc2381043 100644 (file)
@@ -48,6 +48,8 @@ func (e *PtyError) Error() string {
        return fmt.Sprintf("%s: %s", e.FuncName, e.ErrorString)
 }
 
+func (e *PtyError) Unwrap() error { return e.Errno }
+
 // Open returns a master pty and the name of the linked slave tty.
 func Open() (master *os.File, slave string, err error) {
        m := posix_openpt(_O_RDWR)
index 3c23090489f953dd89260208eccf12a864a1e9cc..075e8c11cb3f664f8e2e4f16512c0cedea26a71d 100644 (file)
@@ -101,6 +101,17 @@ func TestTerminalSignal(t *testing.T) {
                Ctty:    int(slave.Fd()),
        }
 
+       // Test ctty management by sending enough child fd to overlap the
+       // parent's fd intended for child's ctty.
+       for 2+len(cmd.ExtraFiles) < cmd.SysProcAttr.Ctty {
+               dummy, err := os.Open(os.DevNull)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               defer dummy.Close()
+               cmd.ExtraFiles = append(cmd.ExtraFiles, dummy)
+       }
+
        if err := cmd.Start(); err != nil {
                t.Fatal(err)
        }
index ae2744f81756bed1d41cd0556afa426739c65ca8..c09b1ac202889a2f86416dcee0b9f92165faf9a2 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix darwin dragonfly freebsd netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd js,wasm netbsd openbsd solaris
 
 package os
 
index edb5f69bf0580ce8409eb9430d2261feddf092c9..c15850692cd75470888bde254afbe5268e674617 100644 (file)
@@ -6,6 +6,7 @@
 // +build !darwin
 // +build !dragonfly
 // +build !freebsd
+// +build !js !wasm
 // +build !netbsd
 // +build !openbsd
 // +build !solaris
index 4720738d247878f01680e2fbaf991108a24f0964..5d7ea7ea29cb8083a64cdf8e44b3edcaf3460e36 100644 (file)
@@ -514,7 +514,7 @@ func TestReadWriteDeadlineRace(t *testing.T) {
 }
 
 // TestRacyRead tests that it is safe to mutate the input Read buffer
-// immediately after cancelation has occurred.
+// immediately after cancellation has occurred.
 func TestRacyRead(t *testing.T) {
        t.Parallel()
 
@@ -553,7 +553,7 @@ func TestRacyRead(t *testing.T) {
 }
 
 // TestRacyWrite tests that it is safe to mutate the input Write buffer
-// immediately after cancelation has occurred.
+// immediately after cancellation has occurred.
 func TestRacyWrite(t *testing.T) {
        t.Parallel()
 
index 5e33292bec68197771b515c695eafec4386630cb..3d1a6674b145881014d1b7a07cb41fe9935a3ea7 100644 (file)
@@ -189,6 +189,21 @@ func (fs *fileStat) loadFileId() error {
        return nil
 }
 
+// saveInfoFromPath saves full path of the file to be used by os.SameFile later,
+// and set name from path.
+func (fs *fileStat) saveInfoFromPath(path string) error {
+       fs.path = path
+       if !isAbs(fs.path) {
+               var err error
+               fs.path, err = syscall.FullPath(fs.path)
+               if err != nil {
+                       return &PathError{"FullPath", path, err}
+               }
+       }
+       fs.name = basename(path)
+       return nil
+}
+
 // devNullStat is fileStat structure describing DevNull file ("NUL").
 var devNullStat = fileStat{
        name: DevNull,
index 61bf1dc7a6f7704f1f746843ec4c38e8ceb7685f..d3acbddd18019e9a469cca395bf015145468a313 100644 (file)
@@ -26,12 +26,14 @@ func current() (*User, error) {
        if err == nil {
                return u, nil
        }
+
+       homeDir, _ := os.UserHomeDir()
        u = &User{
                Uid:      uid,
                Gid:      currentGID(),
                Username: os.Getenv("USER"),
                Name:     "", // ignored
-               HomeDir:  os.Getenv("HOME"),
+               HomeDir:  homeDir,
        }
        // On NaCL and Android, return a dummy user instead of failing.
        switch runtime.GOOS {
@@ -42,9 +44,6 @@ func current() (*User, error) {
                if u.Username == "" {
                        u.Username = "nacl"
                }
-               if u.HomeDir == "" {
-                       u.HomeDir = "/"
-               }
        case "android":
                if u.Uid == "" {
                        u.Uid = "1"
@@ -52,16 +51,23 @@ func current() (*User, error) {
                if u.Username == "" {
                        u.Username = "android"
                }
-               if u.HomeDir == "" {
-                       u.HomeDir = "/sdcard"
-               }
        }
        // cgo isn't available, but if we found the minimum information
        // without it, use it:
        if u.Uid != "" && u.Username != "" && u.HomeDir != "" {
                return u, nil
        }
-       return u, fmt.Errorf("user: Current not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+       var missing string
+       if u.Username == "" {
+               missing = "$USER"
+       }
+       if u.HomeDir == "" {
+               if missing != "" {
+                       missing += ", "
+               }
+               missing += "$HOME"
+       }
+       return u, fmt.Errorf("user: Current requires cgo or %s set in environment", missing)
 }
 
 func listGroups(*User) ([]string, error) {
index eeb24dd0e00d2cc4332f525274b63b280692bf28..8c4c817c2b63cd1a0d798b4d3cb91f7274423ec7 100644 (file)
@@ -132,7 +132,7 @@ func TestGroupIds(t *testing.T) {
        if runtime.GOOS == "aix" {
                t.Skip("skipping GroupIds, see golang.org/issue/30563")
        }
-       if runtime.GOOS == "solaris" {
+       if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" {
                t.Skip("skipping GroupIds, see golang.org/issue/14709")
        }
        user, err := Current()
index 20ec8927b4692b304672b19162ba85306b7ec21e..23f21380d01cb2fcf60e849f7fc425666541c87d 100644 (file)
@@ -94,3 +94,74 @@ func ExampleMatch() {
        // true <nil>
        // true <nil>
 }
+
+func ExampleBase() {
+       fmt.Println("On Unix:")
+       fmt.Println(filepath.Base("/foo/bar/baz.js"))
+       fmt.Println(filepath.Base("/foo/bar/baz"))
+       fmt.Println(filepath.Base("/foo/bar/baz/"))
+       fmt.Println(filepath.Base("dev.txt"))
+       fmt.Println(filepath.Base("../todo.txt"))
+       fmt.Println(filepath.Base(".."))
+       fmt.Println(filepath.Base("."))
+       fmt.Println(filepath.Base("/"))
+       fmt.Println(filepath.Base(""))
+
+       // Output:
+       // On Unix:
+       // baz.js
+       // baz
+       // baz
+       // dev.txt
+       // todo.txt
+       // ..
+       // .
+       // /
+       // .
+}
+
+func ExampleDir() {
+       fmt.Println("On Unix:")
+       fmt.Println(filepath.Dir("/foo/bar/baz.js"))
+       fmt.Println(filepath.Dir("/foo/bar/baz"))
+       fmt.Println(filepath.Dir("/foo/bar/baz/"))
+       fmt.Println(filepath.Dir("/dirty//path///"))
+       fmt.Println(filepath.Dir("dev.txt"))
+       fmt.Println(filepath.Dir("../todo.txt"))
+       fmt.Println(filepath.Dir(".."))
+       fmt.Println(filepath.Dir("."))
+       fmt.Println(filepath.Dir("/"))
+       fmt.Println(filepath.Dir(""))
+
+       // Output:
+       // On Unix:
+       // /foo/bar
+       // /foo/bar
+       // /foo/bar/baz
+       // /dirty/path
+       // .
+       // ..
+       // .
+       // .
+       // /
+       // .
+}
+
+func ExampleIsAbs() {
+       fmt.Println("On Unix:")
+       fmt.Println(filepath.IsAbs("/home/gopher"))
+       fmt.Println(filepath.IsAbs(".bashrc"))
+       fmt.Println(filepath.IsAbs(".."))
+       fmt.Println(filepath.IsAbs("."))
+       fmt.Println(filepath.IsAbs("/"))
+       fmt.Println(filepath.IsAbs(""))
+
+       // Output:
+       // On Unix:
+       // true
+       // false
+       // false
+       // false
+       // true
+       // false
+}
index 22632a0b63a90db85eb250e0739c73d4f508ee5d..d3f43a692fef18ced1ac33ce6f8e9df2f1a11c26 100644 (file)
@@ -1381,16 +1381,6 @@ func TestIssue29372(t *testing.T) {
        }
        defer os.RemoveAll(tmpDir)
 
-       if runtime.GOOS == "windows" {
-               // This test is broken on windows, if temporary directory
-               // is a symlink. See issue 29746.
-               // TODO(brainman): Remove this hack once issue #29746 is fixed.
-               tmpDir, err = filepath.EvalSymlinks(tmpDir)
-               if err != nil {
-                       t.Fatal(err)
-               }
-       }
-
        path := filepath.Join(tmpDir, "file.txt")
        err = ioutil.WriteFile(path, nil, 0644)
        if err != nil {
index de043c1677ba492a57659bfc1b94f3a4d3c8bdcd..335b315a202104fb5d11c0d172a2ee5587e22a26 100644 (file)
@@ -8,6 +8,7 @@ import (
        "errors"
        "os"
        "runtime"
+       "syscall"
 )
 
 func walkSymlinks(path string) (string, error) {
@@ -86,7 +87,7 @@ func walkSymlinks(path string) (string, error) {
 
                if fi.Mode()&os.ModeSymlink == 0 {
                        if !fi.Mode().IsDir() && end < len(path) {
-                               return "", slashAfterFilePathError
+                               return "", syscall.ENOTDIR
                        }
                        continue
                }
index b57e7f2277e3e9915f90022439cdfe64e38c2fb1..d20e63a987e9ad7a9986c5ecc05b4db5f92beb74 100644 (file)
@@ -2,15 +2,6 @@
 
 package filepath
 
-import (
-       "syscall"
-)
-
-// walkSymlinks returns slashAfterFilePathError error for paths like
-// //path/to/existing_file/ and /path/to/existing_file/. and /path/to/existing_file/..
-
-var slashAfterFilePathError = syscall.ENOTDIR
-
 func evalSymlinks(path string) (string, error) {
        return walkSymlinks(path)
 }
index 531dc26fc0e4f2366026acc66ab1479d226b314e..a799488c1824019363d64c0bbd87a11244157be8 100644 (file)
@@ -5,9 +5,6 @@
 package filepath
 
 import (
-       "errors"
-       "internal/syscall/windows"
-       "os"
        "strings"
        "syscall"
 )
@@ -109,108 +106,14 @@ func toNorm(path string, normBase func(string) (string, error)) (string, error)
        return volume + normPath, nil
 }
 
-// evalSymlinksUsingGetFinalPathNameByHandle uses Windows
-// GetFinalPathNameByHandle API to retrieve the final
-// path for the specified file.
-func evalSymlinksUsingGetFinalPathNameByHandle(path string) (string, error) {
-       err := windows.LoadGetFinalPathNameByHandle()
-       if err != nil {
-               // we must be using old version of Windows
-               return "", err
-       }
-
-       if path == "" {
-               return path, nil
-       }
-
-       // Use Windows I/O manager to dereference the symbolic link, as per
-       // https://blogs.msdn.microsoft.com/oldnewthing/20100212-00/?p=14963/
-       p, err := syscall.UTF16PtrFromString(path)
-       if err != nil {
-               return "", err
-       }
-       h, err := syscall.CreateFile(p, 0, 0, nil,
-               syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
-       if err != nil {
-               return "", err
-       }
-       defer syscall.CloseHandle(h)
-
-       buf := make([]uint16, 100)
-       for {
-               n, err := windows.GetFinalPathNameByHandle(h, &buf[0], uint32(len(buf)), windows.VOLUME_NAME_DOS)
-               if err != nil {
-                       return "", err
-               }
-               if n < uint32(len(buf)) {
-                       break
-               }
-               buf = make([]uint16, n)
-       }
-       s := syscall.UTF16ToString(buf)
-       if len(s) > 4 && s[:4] == `\\?\` {
-               s = s[4:]
-               if len(s) > 3 && s[:3] == `UNC` {
-                       // return path like \\server\share\...
-                       return `\` + s[3:], nil
-               }
-               return s, nil
-       }
-       return "", errors.New("GetFinalPathNameByHandle returned unexpected path=" + s)
-}
-
-func samefile(path1, path2 string) bool {
-       fi1, err := os.Lstat(path1)
-       if err != nil {
-               return false
-       }
-       fi2, err := os.Lstat(path2)
-       if err != nil {
-               return false
-       }
-       return os.SameFile(fi1, fi2)
-}
-
-// walkSymlinks returns slashAfterFilePathError error for paths like
-// //path/to/existing_file/ and /path/to/existing_file/. and /path/to/existing_file/..
-
-var slashAfterFilePathError = errors.New("attempting to walk past file path.")
-
 func evalSymlinks(path string) (string, error) {
        newpath, err := walkSymlinks(path)
-       if err == slashAfterFilePathError {
-               return "", syscall.ENOTDIR
-       }
        if err != nil {
-               newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path)
-               if err2 == nil {
-                       return toNorm(newpath2, normBase)
-               }
                return "", err
        }
        newpath, err = toNorm(newpath, normBase)
        if err != nil {
-               newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path)
-               if err2 == nil {
-                       return toNorm(newpath2, normBase)
-               }
                return "", err
        }
-       if strings.ToUpper(newpath) == strings.ToUpper(path) {
-               // walkSymlinks did not actually walk any symlinks,
-               // so we don't need to try GetFinalPathNameByHandle.
-               return newpath, nil
-       }
-       newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path)
-       if err2 != nil {
-               return newpath, nil
-       }
-       newpath2, err2 = toNorm(newpath2, normBase)
-       if err2 != nil {
-               return newpath, nil
-       }
-       if samefile(newpath, newpath2) {
-               return newpath, nil
-       }
-       return newpath2, nil
+       return newpath, nil
 }
index 78f85c6ea9c7e90061a4e4d3cdfef8db45a64620..3abfb6074937cacff7d4d8a5bec16af430ff3888 100644 (file)
@@ -92,15 +92,13 @@ func open(name string) (*Plugin, error) {
        plugins[filepath] = p
        pluginsMu.Unlock()
 
-       initStr := make([]byte, len(pluginpath)+6)
+       initStr := make([]byte, len(pluginpath)+len("..inittask")+1) // +1 for terminating NUL
        copy(initStr, pluginpath)
-       copy(initStr[len(pluginpath):], ".init")
+       copy(initStr[len(pluginpath):], "..inittask")
 
-       initFuncPC := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr)
-       if initFuncPC != nil {
-               initFuncP := &initFuncPC
-               initFunc := *(*func())(unsafe.Pointer(&initFuncP))
-               initFunc()
+       initTask := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr)
+       if initTask != nil {
+               doInit(initTask)
        }
 
        // Fill out the value of each plugin symbol.
@@ -150,3 +148,7 @@ var (
 
 // lastmoduleinit is defined in package runtime
 func lastmoduleinit() (pluginpath string, syms map[string]interface{}, errstr string)
+
+// doInit is defined in package runtime
+//go:linkname doInit runtime.doInit
+func doInit(t unsafe.Pointer) // t should be a *runtime.initTask
index 9452255f9a63445ff0636fc883011cf99c67ca84..823d43c6e88184396a31d8c2a186bb806d959353 100644 (file)
@@ -9,6 +9,7 @@ import (
        "encoding/base64"
        "flag"
        "fmt"
+       "go/token"
        "io"
        "math"
        "math/rand"
@@ -22,8 +23,6 @@ import (
        "sync/atomic"
        "testing"
        "time"
-       "unicode"
-       "unicode/utf8"
        "unsafe"
 )
 
@@ -1061,6 +1060,113 @@ func TestIsNil(t *testing.T) {
        NotNil(fi, t)
 }
 
+func TestIsZero(t *testing.T) {
+       for i, tt := range []struct {
+               x    interface{}
+               want bool
+       }{
+               // Booleans
+               {true, false},
+               {false, true},
+               // Numeric types
+               {int(0), true},
+               {int(1), false},
+               {int8(0), true},
+               {int8(1), false},
+               {int16(0), true},
+               {int16(1), false},
+               {int32(0), true},
+               {int32(1), false},
+               {int64(0), true},
+               {int64(1), false},
+               {uint(0), true},
+               {uint(1), false},
+               {uint8(0), true},
+               {uint8(1), false},
+               {uint16(0), true},
+               {uint16(1), false},
+               {uint32(0), true},
+               {uint32(1), false},
+               {uint64(0), true},
+               {uint64(1), false},
+               {float32(0), true},
+               {float32(1.2), false},
+               {float64(0), true},
+               {float64(1.2), false},
+               {math.Copysign(0, -1), false},
+               {complex64(0), true},
+               {complex64(1.2), false},
+               {complex128(0), true},
+               {complex128(1.2), false},
+               {complex(math.Copysign(0, -1), 0), false},
+               {complex(0, math.Copysign(0, -1)), false},
+               {complex(math.Copysign(0, -1), math.Copysign(0, -1)), false},
+               {uintptr(0), true},
+               {uintptr(128), false},
+               // Array
+               {Zero(TypeOf([5]string{})).Interface(), true},
+               {[5]string{"", "", "", "", ""}, true},
+               {[5]string{}, true},
+               {[5]string{"", "", "", "a", ""}, false},
+               // Chan
+               {(chan string)(nil), true},
+               {make(chan string), false},
+               {time.After(1), false},
+               // Func
+               {(func())(nil), true},
+               {New, false},
+               // Interface
+               {New(TypeOf(new(error)).Elem()).Elem(), true},
+               {(io.Reader)(strings.NewReader("")), false},
+               // Map
+               {(map[string]string)(nil), true},
+               {map[string]string{}, false},
+               {make(map[string]string), false},
+               // Ptr
+               {(*func())(nil), true},
+               {(*int)(nil), true},
+               {new(int), false},
+               // Slice
+               {[]string{}, false},
+               {([]string)(nil), true},
+               {make([]string, 0), false},
+               // Strings
+               {"", true},
+               {"not-zero", false},
+               // Structs
+               {T{}, true},
+               {T{123, 456.75, "hello", &_i}, false},
+               // UnsafePointer
+               {(unsafe.Pointer)(nil), true},
+               {(unsafe.Pointer)(new(int)), false},
+       } {
+               var x Value
+               if v, ok := tt.x.(Value); ok {
+                       x = v
+               } else {
+                       x = ValueOf(tt.x)
+               }
+
+               b := x.IsZero()
+               if b != tt.want {
+                       t.Errorf("%d: IsZero((%s)(%+v)) = %t, want %t", i, x.Kind(), tt.x, b, tt.want)
+               }
+
+               if !Zero(TypeOf(tt.x)).IsZero() {
+                       t.Errorf("%d: IsZero(Zero(TypeOf((%s)(%+v)))) is false", i, x.Kind(), tt.x)
+               }
+       }
+
+       func() {
+               defer func() {
+                       if r := recover(); r == nil {
+                               t.Error("should panic for invalid value")
+                       }
+               }()
+               (Value{}).IsZero()
+       }()
+}
+
 func TestInterfaceExtraction(t *testing.T) {
        var s struct {
                W io.Writer
@@ -1831,6 +1937,91 @@ func TestMakeFuncVariadic(t *testing.T) {
        }
 }
 
+// Dummy type that implements io.WriteCloser
+type WC struct {
+}
+
+func (w *WC) Write(p []byte) (n int, err error) {
+       return 0, nil
+}
+func (w *WC) Close() error {
+       return nil
+}
+
+func TestMakeFuncValidReturnAssignments(t *testing.T) {
+       // reflect.Values returned from the wrapped function should be assignment-converted
+       // to the types returned by the result of MakeFunc.
+
+       // Concrete types should be promotable to interfaces they implement.
+       var f func() error
+       f = MakeFunc(TypeOf(f), func([]Value) []Value {
+               return []Value{ValueOf(io.EOF)}
+       }).Interface().(func() error)
+       f()
+
+       // Super-interfaces should be promotable to simpler interfaces.
+       var g func() io.Writer
+       g = MakeFunc(TypeOf(g), func([]Value) []Value {
+               var w io.WriteCloser = &WC{}
+               return []Value{ValueOf(&w).Elem()}
+       }).Interface().(func() io.Writer)
+       g()
+
+       // Channels should be promotable to directional channels.
+       var h func() <-chan int
+       h = MakeFunc(TypeOf(h), func([]Value) []Value {
+               return []Value{ValueOf(make(chan int))}
+       }).Interface().(func() <-chan int)
+       h()
+
+       // Unnamed types should be promotable to named types.
+       type T struct{ a, b, c int }
+       var i func() T
+       i = MakeFunc(TypeOf(i), func([]Value) []Value {
+               return []Value{ValueOf(struct{ a, b, c int }{a: 1, b: 2, c: 3})}
+       }).Interface().(func() T)
+       i()
+}
+
+func TestMakeFuncInvalidReturnAssignments(t *testing.T) {
+       // Type doesn't implement the required interface.
+       shouldPanic(func() {
+               var f func() error
+               f = MakeFunc(TypeOf(f), func([]Value) []Value {
+                       return []Value{ValueOf(int(7))}
+               }).Interface().(func() error)
+               f()
+       })
+       // Assigning to an interface with additional methods.
+       shouldPanic(func() {
+               var f func() io.ReadWriteCloser
+               f = MakeFunc(TypeOf(f), func([]Value) []Value {
+                       var w io.WriteCloser = &WC{}
+                       return []Value{ValueOf(&w).Elem()}
+               }).Interface().(func() io.ReadWriteCloser)
+               f()
+       })
+       // Directional channels can't be assigned to bidirectional ones.
+       shouldPanic(func() {
+               var f func() chan int
+               f = MakeFunc(TypeOf(f), func([]Value) []Value {
+                       var c <-chan int = make(chan int)
+                       return []Value{ValueOf(c)}
+               }).Interface().(func() chan int)
+               f()
+       })
+       // Two named types which are otherwise identical.
+       shouldPanic(func() {
+               type T struct{ a, b, c int }
+               type U struct{ a, b, c int }
+               var f func() T
+               f = MakeFunc(TypeOf(f), func([]Value) []Value {
+                       return []Value{ValueOf(U{a: 1, b: 2, c: 3})}
+               }).Interface().(func() T)
+               f()
+       })
+}
+
 type Point struct {
        x, y int
 }
@@ -2110,6 +2301,39 @@ func TestVariadicMethodValue(t *testing.T) {
        }
 }
 
+type DirectIfaceT struct {
+       p *int
+}
+
+func (d DirectIfaceT) M() int { return *d.p }
+
+func TestDirectIfaceMethod(t *testing.T) {
+       x := 42
+       v := DirectIfaceT{&x}
+       typ := TypeOf(v)
+       m, ok := typ.MethodByName("M")
+       if !ok {
+               t.Fatalf("cannot find method M")
+       }
+       in := []Value{ValueOf(v)}
+       out := m.Func.Call(in)
+       if got := out[0].Int(); got != 42 {
+               t.Errorf("Call with value receiver got %d, want 42", got)
+       }
+
+       pv := &v
+       typ = TypeOf(pv)
+       m, ok = typ.MethodByName("M")
+       if !ok {
+               t.Fatalf("cannot find method M")
+       }
+       in = []Value{ValueOf(pv)}
+       out = m.Func.Call(in)
+       if got := out[0].Int(); got != 42 {
+               t.Errorf("Call with pointer receiver got %d, want 42", got)
+       }
+}
+
 // Reflect version of $GOROOT/test/method5.go
 
 // Concrete types implementing M method.
@@ -4249,37 +4473,37 @@ func TestStructOfFieldName(t *testing.T) {
        // invalid field name "1nvalid"
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Name: "valid", Type: TypeOf("")},
-                       StructField{Name: "1nvalid", Type: TypeOf("")},
+                       {Name: "valid", Type: TypeOf("")},
+                       {Name: "1nvalid", Type: TypeOf("")},
                })
        })
 
        // invalid field name "+"
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Name: "val1d", Type: TypeOf("")},
-                       StructField{Name: "+", Type: TypeOf("")},
+                       {Name: "val1d", Type: TypeOf("")},
+                       {Name: "+", Type: TypeOf("")},
                })
        })
 
        // no field name
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Name: "", Type: TypeOf("")},
+                       {Name: "", Type: TypeOf("")},
                })
        })
 
        // verify creation of a struct with valid struct fields
        validFields := []StructField{
-               StructField{
+               {
                        Name: "φ",
                        Type: TypeOf(""),
                },
-               StructField{
+               {
                        Name: "ValidName",
                        Type: TypeOf(""),
                },
-               StructField{
+               {
                        Name: "Val1dNam5",
                        Type: TypeOf(""),
                },
@@ -4296,21 +4520,21 @@ func TestStructOfFieldName(t *testing.T) {
 func TestStructOf(t *testing.T) {
        // check construction and use of type not in binary
        fields := []StructField{
-               StructField{
+               {
                        Name: "S",
                        Tag:  "s",
                        Type: TypeOf(""),
                },
-               StructField{
+               {
                        Name: "X",
                        Tag:  "x",
                        Type: TypeOf(byte(0)),
                },
-               StructField{
+               {
                        Name: "Y",
                        Type: TypeOf(uint64(0)),
                },
-               StructField{
+               {
                        Name: "Z",
                        Type: TypeOf([3]uint16{}),
                },
@@ -4393,20 +4617,20 @@ func TestStructOf(t *testing.T) {
        // check duplicate names
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Name: "string", Type: TypeOf("")},
-                       StructField{Name: "string", Type: TypeOf("")},
+                       {Name: "string", Type: TypeOf("")},
+                       {Name: "string", Type: TypeOf("")},
                })
        })
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Type: TypeOf("")},
-                       StructField{Name: "string", Type: TypeOf("")},
+                       {Type: TypeOf("")},
+                       {Name: "string", Type: TypeOf("")},
                })
        })
        shouldPanic(func() {
                StructOf([]StructField{
-                       StructField{Type: TypeOf("")},
-                       StructField{Type: TypeOf("")},
+                       {Type: TypeOf("")},
+                       {Type: TypeOf("")},
                })
        })
        // check that type already in binary is found
@@ -4416,7 +4640,7 @@ func TestStructOf(t *testing.T) {
        type structFieldType interface{}
        checkSameType(t,
                StructOf([]StructField{
-                       StructField{
+                       {
                                Name: "F",
                                Type: TypeOf((*structFieldType)(nil)).Elem(),
                        },
@@ -4575,7 +4799,7 @@ func TestStructOfExportRules(t *testing.T) {
                        if n == "" {
                                panic("field.Name must not be empty")
                        }
-                       exported := isExported(n)
+                       exported := token.IsExported(n)
                        if exported != test.exported {
                                t.Errorf("test-%d: got exported=%v want exported=%v", i, exported, test.exported)
                        }
@@ -4583,14 +4807,6 @@ func TestStructOfExportRules(t *testing.T) {
        }
 }
 
-// isExported reports whether name is an exported Go symbol
-// (that is, whether it begins with an upper-case letter).
-//
-func isExported(name string) bool {
-       ch, _ := utf8.DecodeRuneInString(name)
-       return unicode.IsUpper(ch)
-}
-
 func TestStructOfGC(t *testing.T) {
        type T *uintptr
        tt := TypeOf(T(nil))
index 9d9cbdec25ddf210d0eefb5d84df7fecfcb28d23..4564736bc9972c9cc814762f565ef6fcbfee60b7 100644 (file)
@@ -44,11 +44,6 @@ func FFICallbackGo(results unsafe.Pointer, params unsafe.Pointer, impl *makeFunc
        off := uintptr(0)
        for i, typ := range ftyp.out {
                v := out[i]
-               if v.typ != typ {
-                       panic("reflect: function created by MakeFunc using " + funcName(impl.fn) +
-                               " returned wrong type: have " +
-                               out[i].typ.String() + " for " + typ.String())
-               }
                if v.flag&flagRO != 0 {
                        panic("reflect: function created by MakeFunc using " + funcName(impl.fn) +
                                " returned value obtained from unexported field")
@@ -56,6 +51,12 @@ func FFICallbackGo(results unsafe.Pointer, params unsafe.Pointer, impl *makeFunc
 
                off = align(off, uintptr(typ.fieldAlign))
                addr := unsafe.Pointer(uintptr(results) + off)
+
+               // Convert v to type typ if v is assignable to a variable
+               // of type t in the language spec.
+               // See issue 28761.
+               v = v.assignTo("reflect.MakeFunc", typ, addr)
+
                if v.flag&flagIndir == 0 && (v.kind() == Ptr || v.kind() == UnsafePointer) {
                        *(*unsafe.Pointer)(addr) = v.ptr
                } else {
index bf77b682c4d86b3d6ceafe9e71d0b2b7ad06efbd..016f95d7b01afd7353c62b7423090d095e7ab793 100644 (file)
@@ -29,7 +29,7 @@ func Swapper(slice interface{}) func(i, j int) {
 
        typ := v.Type().Elem().(*rtype)
        size := typ.Size()
-       hasPtr := typ.kind&kindNoPointers == 0
+       hasPtr := typ.ptrdata != 0
 
        // Some common & small cases, without using memmove:
        if hasPtr {
index 8493d87f802336ba00a0128bdb45cb9738c0b32d..f82f5eb112160f7adc3d24af1b9da410518c12bb 100644 (file)
@@ -53,6 +53,9 @@ type Type interface {
        //
        // For an interface type, the returned Method's Type field gives the
        // method signature, without a receiver, and the Func field is nil.
+       //
+       // Only exported methods are accessible and they are sorted in
+       // lexicographic order.
        Method(int) Method
 
        // MethodByName returns the method with that name in the type's
@@ -415,7 +418,6 @@ type Method struct {
 const (
        kindDirectIface = 1 << 5
        kindGCProg      = 1 << 6 // Type.gc points to GC program
-       kindNoPointers  = 1 << 7
        kindMask        = (1 << 5) - 1
 )
 
@@ -546,7 +548,7 @@ func (t *rtype) FieldAlign() int { return int(t.fieldAlign) }
 
 func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }
 
-func (t *rtype) pointers() bool { return t.kind&kindNoPointers == 0 }
+func (t *rtype) pointers() bool { return t.ptrdata != 0 }
 
 func (t *rtype) common() *rtype { return t }
 
@@ -1761,13 +1763,6 @@ const (
 )
 
 func bucketOf(ktyp, etyp *rtype) *rtype {
-       // See comment on hmap.overflow in ../runtime/map.go.
-       var kind uint8
-       if ktyp.kind&kindNoPointers != 0 && etyp.kind&kindNoPointers != 0 &&
-               ktyp.size <= maxKeySize && etyp.size <= maxValSize {
-               kind = kindNoPointers
-       }
-
        if ktyp.size > maxKeySize {
                ktyp = PtrTo(ktyp).(*rtype)
        }
@@ -1804,14 +1799,14 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
        ovoff := size
        size += ptrSize
 
-       if kind != kindNoPointers {
+       if ktyp.ptrdata != 0 || etyp.ptrdata != 0 {
                nptr := size / ptrSize
                mask := make([]byte, (nptr+7)/8)
                psize := bucketSize
                psize = align(psize, uintptr(ktyp.fieldAlign))
                base := psize / ptrSize
 
-               if ktyp.kind&kindNoPointers == 0 {
+               if ktyp.ptrdata != 0 {
                        if ktyp.kind&kindGCProg != 0 {
                                panic("reflect: unexpected GC program in MapOf")
                        }
@@ -1829,7 +1824,7 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
                psize = align(psize, uintptr(etyp.fieldAlign))
                base = psize / ptrSize
 
-               if etyp.kind&kindNoPointers == 0 {
+               if etyp.ptrdata != 0 {
                        if etyp.kind&kindGCProg != 0 {
                                panic("reflect: unexpected GC program in MapOf")
                        }
@@ -1859,7 +1854,7 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
                align:      int8(maxAlign),
                fieldAlign: uint8(maxAlign),
                size:       size,
-               kind:       kind,
+               kind:       uint8(Struct),
                ptrdata:    ptrdata,
                gcdata:     gcdata,
        }
@@ -1962,7 +1957,6 @@ func StructOf(fields []StructField) Type {
                repr = make([]byte, 0, 64)
                fset = map[string]struct{}{} // fields' names
 
-               hasPtr    = false // records whether at least one struct-field is a pointer
                hasGCProg = false // records whether a struct-field type has a GCProg
        )
 
@@ -1983,9 +1977,6 @@ func StructOf(fields []StructField) Type {
                if ft.kind&kindGCProg != 0 {
                        hasGCProg = true
                }
-               if ft.pointers() {
-                       hasPtr = true
-               }
 
                // Update string and hash
                name := *f.name
@@ -2129,13 +2120,9 @@ func StructOf(fields []StructField) Type {
        typ.string = &str
        typ.hash = hash
        typ.size = size
+       typ.ptrdata = typeptrdata(typ.common())
        typ.align = typalign
        typ.fieldAlign = uint8(typalign)
-       if !hasPtr {
-               typ.kind |= kindNoPointers
-       } else {
-               typ.kind &^= kindNoPointers
-       }
 
        if hasGCProg {
                lastPtrField := 0
@@ -2145,44 +2132,50 @@ func StructOf(fields []StructField) Type {
                        }
                }
                prog := []byte{0, 0, 0, 0} // will be length of prog
+               var off uintptr
                for i, ft := range fs {
                        if i > lastPtrField {
                                // gcprog should not include anything for any field after
                                // the last field that contains pointer data
                                break
                        }
-                       // FIXME(sbinet) handle padding, fields smaller than a word
+                       if !ft.typ.pointers() {
+                               // Ignore pointerless fields.
+                               continue
+                       }
+                       // Pad to start of this field with zeros.
+                       if ft.offset() > off {
+                               n := (ft.offset() - off) / ptrSize
+                               prog = append(prog, 0x01, 0x00) // emit a 0 bit
+                               if n > 1 {
+                                       prog = append(prog, 0x81)      // repeat previous bit
+                                       prog = appendVarint(prog, n-1) // n-1 times
+                               }
+                               off = ft.offset()
+                       }
+
                        elemGC := (*[1 << 30]byte)(unsafe.Pointer(ft.typ.gcdata))[:]
                        elemPtrs := ft.typ.ptrdata / ptrSize
-                       switch {
-                       case ft.typ.kind&kindGCProg == 0 && ft.typ.ptrdata != 0:
+                       if ft.typ.kind&kindGCProg == 0 {
                                // Element is small with pointer mask; use as literal bits.
                                mask := elemGC
                                // Emit 120-bit chunks of full bytes (max is 127 but we avoid using partial bytes).
                                var n uintptr
-                               for n := elemPtrs; n > 120; n -= 120 {
+                               for n = elemPtrs; n > 120; n -= 120 {
                                        prog = append(prog, 120)
                                        prog = append(prog, mask[:15]...)
                                        mask = mask[15:]
                                }
                                prog = append(prog, byte(n))
                                prog = append(prog, mask[:(n+7)/8]...)
-                       case ft.typ.kind&kindGCProg != 0:
+                       } else {
                                // Element has GC program; emit one element.
                                elemProg := elemGC[4 : 4+*(*uint32)(unsafe.Pointer(&elemGC[0]))-1]
                                prog = append(prog, elemProg...)
                        }
-                       // Pad from ptrdata to size.
-                       elemWords := ft.typ.size / ptrSize
-                       if elemPtrs < elemWords {
-                               // Emit literal 0 bit, then repeat as needed.
-                               prog = append(prog, 0x01, 0x00)
-                               if elemPtrs+1 < elemWords {
-                                       prog = append(prog, 0x81)
-                                       prog = appendVarint(prog, elemWords-elemPtrs-1)
-                               }
-                       }
+                       off += ft.typ.ptrdata
                }
+               prog = append(prog, 0)
                *(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4)
                typ.kind |= kindGCProg
                typ.gcdata = &prog[0]
@@ -2276,20 +2269,20 @@ func runtimeStructField(field StructField) structField {
 // containing pointer data. Anything after this offset is scalar data.
 // keep in sync with ../cmd/compile/internal/gc/reflect.go
 func typeptrdata(t *rtype) uintptr {
-       if !t.pointers() {
-               return 0
-       }
        switch t.Kind() {
        case Struct:
                st := (*structType)(unsafe.Pointer(t))
                // find the last field that has pointers.
-               field := 0
+               field := -1
                for i := range st.fields {
                        ft := st.fields[i].typ
                        if ft.pointers() {
                                field = i
                        }
                }
+               if field == -1 {
+                       return 0
+               }
                f := st.fields[field]
                return f.offset() + f.typ.ptrdata
 
@@ -2357,11 +2350,9 @@ func ArrayOf(count int, elem Type) Type {
        array.len = uintptr(count)
        array.slice = SliceOf(elem).(*rtype)
 
-       array.kind &^= kindNoPointers
        switch {
-       case typ.kind&kindNoPointers != 0 || array.size == 0:
+       case typ.ptrdata == 0 || array.size == 0:
                // No pointers.
-               array.kind |= kindNoPointers
                array.gcdata = nil
                array.ptrdata = 0
 
@@ -2522,7 +2513,7 @@ func (bv *bitVector) append(bit uint8) {
 }
 
 func addTypeBits(bv *bitVector, offset uintptr, t *rtype) {
-       if t.kind&kindNoPointers != 0 {
+       if t.ptrdata == 0 {
                return
        }
 
index 298fbacf364bae48fd35411030ec83d2cfeb0fb8..c4a62c34b83b37aaa2eb66e188fd74f3fe52983f 100644 (file)
@@ -201,7 +201,8 @@ type nonEmptyInterface struct {
 // v.flag.mustBe(Bool), which will only bother to copy the
 // single important word for the receiver.
 func (f flag) mustBe(expected Kind) {
-       if f.kind() != expected {
+       // TODO(mvdan): use f.kind() again once mid-stack inlining gets better
+       if Kind(f&flagKindMask) != expected {
                panic(&ValueError{methodName(), f.kind()})
        }
 }
@@ -209,8 +210,14 @@ func (f flag) mustBe(expected Kind) {
 // mustBeExported panics if f records that the value was obtained using
 // an unexported field.
 func (f flag) mustBeExported() {
+       if f == 0 || f&flagRO != 0 {
+               f.mustBeExportedSlow()
+       }
+}
+
+func (f flag) mustBeExportedSlow() {
        if f == 0 {
-               panic(&ValueError{methodName(), 0})
+               panic(&ValueError{methodName(), Invalid})
        }
        if f&flagRO != 0 {
                panic("reflect: " + methodName() + " using value obtained using unexported field")
@@ -221,6 +228,12 @@ func (f flag) mustBeExported() {
 // which is to say that either it was obtained using an unexported field
 // or it is not addressable.
 func (f flag) mustBeAssignable() {
+       if f&flagRO != 0 || f&flagAddr == 0 {
+               f.mustBeAssignableSlow()
+       }
+}
+
+func (f flag) mustBeAssignableSlow() {
        if f == 0 {
                panic(&ValueError{methodName(), Invalid})
        }
@@ -790,7 +803,7 @@ func (v Value) Interface() (i interface{}) {
 
 func valueInterface(v Value, safe bool) interface{} {
        if v.flag == 0 {
-               panic(&ValueError{"reflect.Value.Interface", 0})
+               panic(&ValueError{"reflect.Value.Interface", Invalid})
        }
        if safe && v.flag&flagRO != 0 {
                // Do not allow access to unexported values via Interface,
@@ -877,6 +890,46 @@ func (v Value) IsValid() bool {
        return v.flag != 0
 }
 
+// IsZero reports whether v is the zero value for its type.
+// It panics if the argument is invalid.
+func (v Value) IsZero() bool {
+       switch v.kind() {
+       case Bool:
+               return !v.Bool()
+       case Int, Int8, Int16, Int32, Int64:
+               return v.Int() == 0
+       case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
+               return v.Uint() == 0
+       case Float32, Float64:
+               return math.Float64bits(v.Float()) == 0
+       case Complex64, Complex128:
+               c := v.Complex()
+               return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
+       case Array:
+               for i := 0; i < v.Len(); i++ {
+                       if !v.Index(i).IsZero() {
+                               return false
+                       }
+               }
+               return true
+       case Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer:
+               return v.IsNil()
+       case String:
+               return v.Len() == 0
+       case Struct:
+               for i := 0; i < v.NumField(); i++ {
+                       if !v.Field(i).IsZero() {
+                               return false
+                       }
+               }
+               return true
+       default:
+               // This should never happens, but will act as a safeguard for
+               // later, as a default value doesn't makes sense here.
+               panic(&ValueError{"reflect.Value.IsZero", v.Kind()})
+       }
+}
+
 // Kind returns v's Kind.
 // If v is the zero Value (IsValid returns false), Kind returns Invalid.
 func (v Value) Kind() Kind {
@@ -1003,7 +1056,7 @@ func (it *MapIter) Value() Value {
 
        t := (*mapType)(unsafe.Pointer(it.m.typ))
        vtype := t.elem
-       return copyVal(vtype, it.m.flag.ro()|flag(vtype.Kind()), mapitervalue(it.it))
+       return copyVal(vtype, it.m.flag.ro()|flag(vtype.Kind()), mapiterelem(it.it))
 }
 
 // Next advances the map iterator and reports whether there is another
@@ -1391,13 +1444,13 @@ func (v Value) SetCap(n int) {
        s.Cap = n
 }
 
-// SetMapIndex sets the value associated with key in the map v to val.
+// SetMapIndex sets the element associated with key in the map v to elem.
 // It panics if v's Kind is not Map.
-// If val is the zero Value, SetMapIndex deletes the key from the map.
+// If elem is the zero Value, SetMapIndex deletes the key from the map.
 // Otherwise if v holds a nil map, SetMapIndex will panic.
-// As in Go, key's value must be assignable to the map's key type,
-// and val's value must be assignable to the map's value type.
-func (v Value) SetMapIndex(key, val Value) {
+// As in Go, key's elem must be assignable to the map's key type,
+// and elem's value must be assignable to the map's elem type.
+func (v Value) SetMapIndex(key, elem Value) {
        v.mustBe(Map)
        v.mustBeExported()
        key.mustBeExported()
@@ -1409,17 +1462,17 @@ func (v Value) SetMapIndex(key, val Value) {
        } else {
                k = unsafe.Pointer(&key.ptr)
        }
-       if val.typ == nil {
+       if elem.typ == nil {
                mapdelete(v.typ, v.pointer(), k)
                return
        }
-       val.mustBeExported()
-       val = val.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
+       elem.mustBeExported()
+       elem = elem.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
        var e unsafe.Pointer
-       if val.flag&flagIndir != 0 {
-               e = val.ptr
+       if elem.flag&flagIndir != 0 {
+               e = elem.ptr
        } else {
-               e = unsafe.Pointer(&val.ptr)
+               e = unsafe.Pointer(&elem.ptr)
        }
        mapassign(v.typ, v.pointer(), k, e)
 }
@@ -2464,7 +2517,7 @@ func mapiterinit(t *rtype, m unsafe.Pointer) unsafe.Pointer
 func mapiterkey(it unsafe.Pointer) (key unsafe.Pointer)
 
 //go:noescape
-func mapitervalue(it unsafe.Pointer) (value unsafe.Pointer)
+func mapiterelem(it unsafe.Pointer) (elem unsafe.Pointer)
 
 //go:noescape
 func mapiternext(it unsafe.Pointer)
index 623f82df72d3ad44023d36f90679891d27f04944..626a69142f5925825c983e108a4e46eecfe54938 100644 (file)
@@ -860,6 +860,25 @@ func BenchmarkQuoteMetaNone(b *testing.B) {
        }
 }
 
+var compileBenchData = []struct{ name, re string }{
+       {"Onepass", `^a.[l-nA-Cg-j]?e$`},
+       {"Medium", `^((a|b|[d-z0-9])*(日){4,5}.)+$`},
+       {"Hard", strings.Repeat(`((abc)*|`, 50) + strings.Repeat(`)`, 50)},
+}
+
+func BenchmarkCompile(b *testing.B) {
+       for _, data := range compileBenchData {
+               b.Run(data.name, func(b *testing.B) {
+                       b.ReportAllocs()
+                       for i := 0; i < b.N; i++ {
+                               if _, err := Compile(data.re); err != nil {
+                                       b.Fatal(err)
+                               }
+                       }
+               })
+       }
+}
+
 func TestDeepEqual(t *testing.T) {
        re1 := MustCompile("a.*b.*c.*d")
        re2 := MustCompile("a.*b.*c.*d")
@@ -882,3 +901,31 @@ func TestDeepEqual(t *testing.T) {
                t.Errorf("DeepEqual(re1, re2) = false, want true")
        }
 }
+
+var minInputLenTests = []struct {
+       Regexp string
+       min    int
+}{
+       {``, 0},
+       {`a`, 1},
+       {`aa`, 2},
+       {`(aa)a`, 3},
+       {`(?:aa)a`, 3},
+       {`a?a`, 1},
+       {`(aaa)|(aa)`, 2},
+       {`(aa)+a`, 3},
+       {`(aa)*a`, 1},
+       {`(aa){3,5}`, 6},
+       {`[a-z]`, 1},
+       {`日`, 3},
+}
+
+func TestMinInputLen(t *testing.T) {
+       for _, tt := range minInputLenTests {
+               re, _ := syntax.Parse(tt.Regexp, syntax.Perl)
+               m := minInputLen(re)
+               if m != tt.min {
+                       t.Errorf("regexp %#q has minInputLen %d, should be %d", tt.Regexp, m, tt.min)
+               }
+       }
+}
index efe764e2dcad9d008d0a9d983b1fd5efb324f447..4411e4c3e61188d1345c599c7ac2c5fad561b4ca 100644 (file)
@@ -524,6 +524,10 @@ func (re *Regexp) doExecute(r io.RuneReader, b []byte, s string, pos int, ncap i
                dstCap = arrayNoInts[:0:0]
        }
 
+       if r == nil && len(b)+len(s) < re.minInputLen {
+               return nil
+       }
+
        if re.onepass != nil {
                return re.doOnePass(r, b, s, pos, ncap, dstCap)
        }
index 148921932899baec227938044bdaebdb4ba3b5e6..1e8795525d048c3c9dbdc7325c8590457eb8ac4b 100644 (file)
@@ -717,6 +717,7 @@ var benchSizes = []struct {
        name string
        n    int
 }{
+       {"16", 16},
        {"32", 32},
        {"1K", 1 << 10},
        {"32K", 32 << 10},
index e07eb7d5c05059c3ba0ee74477a3179ebccdf416..87c49b074fa48655b3510cc31443bd645436cb6d 100644 (file)
@@ -161,6 +161,9 @@ func TestFind(t *testing.T) {
                        t.Errorf("expected match; got none: %s", test)
                case test.matches != nil && result != nil:
                        expect := test.text[test.matches[0][0]:test.matches[0][1]]
+                       if len(result) != cap(result) {
+                               t.Errorf("expected capacity %d got %d: %s", len(result), cap(result), test)
+                       }
                        if expect != string(result) {
                                t.Errorf("expected %q got %q: %s", expect, result, test)
                        }
@@ -242,9 +245,13 @@ func TestFindAll(t *testing.T) {
                                continue
                        }
                        for k, e := range test.matches {
+                               got := result[k]
+                               if len(got) != cap(got) {
+                                       t.Errorf("match %d: expected capacity %d got %d: %s", k, len(got), cap(got), test)
+                               }
                                expect := test.text[e[0]:e[1]]
-                               if expect != string(result[k]) {
-                                       t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test)
+                               if expect != string(got) {
+                                       t.Errorf("match %d: expected %q got %q: %s", k, expect, got, test)
                                }
                        }
                }
@@ -323,9 +330,14 @@ func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte,
                        }
                        continue
                }
+               got := result[k/2]
+               if len(got) != cap(got) {
+                       t.Errorf("match %d: expected capacity %d got %d: %s", n, len(got), cap(got), test)
+                       return
+               }
                expect := test.text[submatches[k]:submatches[k+1]]
-               if expect != string(result[k/2]) {
-                       t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test)
+               if expect != string(got) {
+                       t.Errorf("match %d: expected %q got %q: %s", n, expect, got, test)
                        return
                }
        }
index a0f2e390489389622b5ae5f54cf76cfaa029c279..32264d5f1ef41bda4eb4ae76b1b0dcf96871a6aa 100644 (file)
@@ -223,13 +223,3 @@ func TestRunOnePass(t *testing.T) {
                }
        }
 }
-
-func BenchmarkCompileOnepass(b *testing.B) {
-       b.ReportAllocs()
-       const re = `^a.[l-nA-Cg-j]?e$`
-       for i := 0; i < b.N; i++ {
-               if _, err := Compile(re); err != nil {
-                       b.Fatal(err)
-               }
-       }
-}
index 38b3c86d9f683a3a1e6803ff8c94a17dc24493a4..19ca6f2223f77cf018b9ddd447dfec537a28e42c 100644 (file)
 // If 'Index' is present, matches and submatches are identified by byte index
 // pairs within the input string: result[2*n:2*n+1] identifies the indexes of
 // the nth submatch. The pair for n==0 identifies the match of the entire
-// expression. If 'Index' is not present, the match is identified by the
-// text of the match/submatch. If an index is negative, it means that
-// subexpression did not match any string in the input.
+// expression. If 'Index' is not present, the match is identified by the text
+// of the match/submatch. If an index is negative or text is nil, it means that
+// subexpression did not match any string in the input. For 'String' versions
+// an empty string means either no match or an empty match.
 //
 // There is also a subset of the methods that can be applied to text read
 // from a RuneReader:
@@ -93,6 +94,7 @@ type Regexp struct {
        matchcap       int            // size of recorded match lengths
        prefixComplete bool           // prefix is the entire regexp
        cond           syntax.EmptyOp // empty-width conditions required at start of match
+       minInputLen    int            // minimum length of the input in bytes
 
        // This field can be modified by the Longest method,
        // but it is otherwise read-only.
@@ -190,6 +192,7 @@ func compile(expr string, mode syntax.Flags, longest bool) (*Regexp, error) {
                cond:        prog.StartCond(),
                longest:     longest,
                matchcap:    matchcap,
+               minInputLen: minInputLen(re),
        }
        if regexp.onepass == nil {
                regexp.prefix, regexp.prefixComplete = prog.Prefix()
@@ -263,6 +266,42 @@ func (re *Regexp) put(m *machine) {
        matchPool[re.mpool].Put(m)
 }
 
+// minInputLen walks the regexp to find the minimum length of any matchable input
+func minInputLen(re *syntax.Regexp) int {
+       switch re.Op {
+       default:
+               return 0
+       case syntax.OpAnyChar, syntax.OpAnyCharNotNL, syntax.OpCharClass:
+               return 1
+       case syntax.OpLiteral:
+               l := 0
+               for _, r := range re.Rune {
+                       l += utf8.RuneLen(r)
+               }
+               return l
+       case syntax.OpCapture, syntax.OpPlus:
+               return minInputLen(re.Sub[0])
+       case syntax.OpRepeat:
+               return re.Min * minInputLen(re.Sub[0])
+       case syntax.OpConcat:
+               l := 0
+               for _, sub := range re.Sub {
+                       l += minInputLen(sub)
+               }
+               return l
+       case syntax.OpAlternate:
+               l := minInputLen(re.Sub[0])
+               var lnext int
+               for _, sub := range re.Sub[1:] {
+                       lnext = minInputLen(sub)
+                       if lnext < l {
+                               l = lnext
+                       }
+               }
+               return l
+       }
+}
+
 // MustCompile is like Compile but panics if the expression cannot be parsed.
 // It simplifies safe initialization of global variables holding compiled regular
 // expressions.
@@ -761,7 +800,7 @@ func (re *Regexp) Find(b []byte) []byte {
        if a == nil {
                return nil
        }
-       return b[a[0]:a[1]]
+       return b[a[0]:a[1]:a[1]]
 }
 
 // FindIndex returns a two-element slice of integers defining the location of
@@ -829,7 +868,7 @@ func (re *Regexp) FindSubmatch(b []byte) [][]byte {
        ret := make([][]byte, 1+re.numSubexp)
        for i := range ret {
                if 2*i < len(a) && a[2*i] >= 0 {
-                       ret[i] = b[a[2*i]:a[2*i+1]]
+                       ret[i] = b[a[2*i]:a[2*i+1]:a[2*i+1]]
                }
        }
        return ret
@@ -1025,7 +1064,7 @@ func (re *Regexp) FindAll(b []byte, n int) [][]byte {
                if result == nil {
                        result = make([][]byte, 0, startSize)
                }
-               result = append(result, b[match[0]:match[1]])
+               result = append(result, b[match[0]:match[1]:match[1]])
        })
        return result
 }
@@ -1100,7 +1139,7 @@ func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
                slice := make([][]byte, len(match)/2)
                for j := range slice {
                        if match[2*j] >= 0 {
-                               slice[j] = b[match[2*j]:match[2*j+1]]
+                               slice[j] = b[match[2*j]:match[2*j+1]:match[2*j+1]]
                        }
                }
                result = append(result, slice)
index fe3d2517615089095a16b577321bbcae4834672f..5581ba1ca5ee29bad6fb6c2ae314b513a01931ff 100644 (file)
@@ -185,6 +185,7 @@ var parseTests = []parseTest{
        {`(?-s).`, `dnl{}`},
        {`(?:(?:^).)`, `cat{bol{}dot{}}`},
        {`(?-s)(?:(?:^).)`, `cat{bol{}dnl{}}`},
+       {`[\s\S]a`, `cat{cc{0x0-0x10ffff}lit{a}}`},
 
        // RE2 prefix_tests
        {`abc|abd`, `cat{str{ab}cc{0x63-0x64}}`},
index ae5fa053f985fec026abe8f25aefa03af22766e9..3a4d2d201cd418b1a111bf6e905490d0797a6fc7 100644 (file)
@@ -139,7 +139,7 @@ func writeRegexp(b *strings.Builder, re *Regexp) {
                b.WriteRune('[')
                if len(re.Rune) == 0 {
                        b.WriteString(`^\x00-\x{10FFFF}`)
-               } else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune {
+               } else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune && len(re.Rune) > 2 {
                        // Contains 0 and MaxRune. Probably a negated class.
                        // Print the gaps.
                        b.WriteRune('^')
index 0daddf10e11a5f20d0314e2aa9f16d3c3a80aa6a..f96a75d1d99f6910208697b3e20d2484341d2bf1 100644 (file)
@@ -235,6 +235,9 @@ func ifaceeq(x, y iface) bool {
                panic(errorString("comparing uncomparable type " + t.string()))
        }
        if isDirectIface(t) {
+               // Direct interface types are ptr, chan, map, func, and single-element structs/arrays thereof.
+               // Maps and funcs are not comparable, so they can't reach here.
+               // Ptrs, chans, and single-element items can be compared directly using ==.
                return x.data == y.data
        }
        return eq(x.data, y.data)
@@ -291,6 +294,7 @@ func efacevaleq(x eface, t *_type, p unsafe.Pointer) bool {
                panic(errorString("comparing uncomparable type " + t.string()))
        }
        if isDirectIface(t) {
+               // See comment in efaceeq.
                return x.data == p
        }
        return eq(x.data, p)
@@ -420,3 +424,21 @@ func initAlgAES() {
        // Initialize with random data so hash collisions will be hard to engineer.
        getRandomData(aeskeysched[:])
 }
+
+// Note: These routines perform the read with an native endianness.
+func readUnaligned32(p unsafe.Pointer) uint32 {
+       q := (*[4]byte)(p)
+       if sys.BigEndian {
+               return uint32(q[3]) | uint32(q[2])<<8 | uint32(q[1])<<16 | uint32(q[0])<<24
+       }
+       return uint32(q[0]) | uint32(q[1])<<8 | uint32(q[2])<<16 | uint32(q[3])<<24
+}
+
+func readUnaligned64(p unsafe.Pointer) uint64 {
+       q := (*[8]byte)(p)
+       if sys.BigEndian {
+               return uint64(q[7]) | uint64(q[6])<<8 | uint64(q[5])<<16 | uint64(q[4])<<24 |
+                       uint64(q[3])<<32 | uint64(q[2])<<40 | uint64(q[1])<<48 | uint64(q[0])<<56
+       }
+       return uint64(q[0]) | uint64(q[1])<<8 | uint64(q[2])<<16 | uint64(q[3])<<24 | uint64(q[4])<<32 | uint64(q[5])<<40 | uint64(q[6])<<48 | uint64(q[7])<<56
+}
index 3ca617b21eb00dfc0b701f8d993186c7035b67b3..3a560a17937fc0304ef20c67b56574aa77555b98 100644 (file)
@@ -7,6 +7,7 @@
 // +build !dragonfly
 // +build !freebsd
 // +build !netbsd
+// +build !openbsd !arm64
 // +build !solaris
 
 package runtime
index 69c3e44313784f9d314b7d3b0a4f715992cb0fec..587001cb977e3ae5d42d54756134ea321de79320 100644 (file)
@@ -101,7 +101,7 @@ const cgoResultFail = "cgo result has Go pointer"
 // depending on indir. The top parameter is whether we are at the top
 // level, where Go pointers are allowed.
 func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
-       if t.kind&kindNoPointers != 0 {
+       if t.ptrdata == 0 {
                // If the type has no pointers there is nothing to do.
                return
        }
@@ -164,7 +164,7 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
                if !top {
                        panic(errorString(msg))
                }
-               if st.elem.kind&kindNoPointers != 0 {
+               if st.elem.ptrdata == 0 {
                        return
                }
                for i := 0; i < s.cap; i++ {
index c9e40473771bddbc755585deb4f1eb03a2970b34..130db295acfd254bb7666dbe24c8ea36e49b5642 100644 (file)
@@ -64,7 +64,7 @@ func cgoCheckWriteBarrier(dst *uintptr, src uintptr) {
 //go:nosplit
 //go:nowritebarrier
 func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
-       if typ.kind&kindNoPointers != 0 {
+       if typ.ptrdata == 0 {
                return
        }
        if !cgoIsGoPointer(src) {
@@ -83,7 +83,7 @@ func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
 //go:nosplit
 //go:nowritebarrier
 func cgoCheckSliceCopy(typ *_type, dst, src slice, n int) {
-       if typ.kind&kindNoPointers != 0 {
+       if typ.ptrdata == 0 {
                return
        }
        if !cgoIsGoPointer(src.array) {
@@ -204,7 +204,7 @@ func cgoCheckBits(src unsafe.Pointer, gcbits *byte, off, size uintptr) {
 //go:nowritebarrier
 //go:systemstack
 func cgoCheckUsingType(typ *_type, src unsafe.Pointer, off, size uintptr) {
-       if typ.kind&kindNoPointers != 0 {
+       if typ.ptrdata == 0 {
                return
        }
 
index a1216cf322392d3c5dca1d27aeae1d3952fbbce9..291fe0013d198c533242cfd889ddc7bdeca4f92a 100644 (file)
@@ -107,7 +107,7 @@ func makechan(t *chantype, size int) *hchan {
                c = (*hchan)(mallocgc(hchanSize, nil, true))
                // Race detector uses this location for synchronization.
                c.buf = c.raceaddr()
-       case elem.kind&kindNoPointers != 0:
+       case elem.ptrdata == 0:
                // Elements do not contain pointers.
                // Allocate hchan and buf in one call.
                c = (*hchan)(mallocgc(hchanSize+mem, nil, true))
@@ -700,6 +700,14 @@ func reflect_chanlen(c *hchan) int {
        return int(c.qcount)
 }
 
+//go:linkname reflectlite_chanlen internal..z2freflectlite.chanlen
+func reflectlite_chanlen(c *hchan) int {
+       if c == nil {
+               return 0
+       }
+       return int(c.qcount)
+}
+
 //go:linkname reflect_chancap reflect.chancap
 func reflect_chancap(c *hchan) int {
        if c == nil {
@@ -751,10 +759,8 @@ func (q *waitq) dequeue() *sudog {
                // We use a flag in the G struct to tell us when someone
                // else has won the race to signal this goroutine but the goroutine
                // hasn't removed itself from the queue yet.
-               if sgp.isSelect {
-                       if !atomic.Cas(&sgp.g.selectDone, 0, 1) {
-                               continue
-                       }
+               if sgp.isSelect && !atomic.Cas(&sgp.g.selectDone, 0, 1) {
+                       continue
                }
 
                return sgp
index e7cf1b4102d254dbc60d4a83134fd2a5f78bcff1..e49625b46e669682c845e5a821a8a4c011952679 100644 (file)
@@ -179,7 +179,7 @@ func (p *cpuProfile) addLostAtomic64(count uint64) {
 // The details of generating that format have changed,
 // so this functionality has been removed.
 //
-// Deprecated: use the runtime/pprof package,
+// Deprecated: Use the runtime/pprof package,
 // or the handlers in the net/http/pprof package,
 // or the testing package's -test.cpuprofile flag instead.
 func CPUProfile() []byte {
index f437b9a7e0fe480d82d59a2f328085f8544c93da..2b7d274f95341d1887f57e817a57dbf5bb25d237 100644 (file)
@@ -90,9 +90,9 @@ func TestCgoExternalThreadSIGPROF(t *testing.T) {
        case "plan9", "windows":
                t.Skipf("no pthreads on %s", runtime.GOOS)
        }
-       if runtime.GOARCH == "ppc64" {
+       if runtime.GOARCH == "ppc64" && runtime.GOOS == "linux" {
                // TODO(austin) External linking not implemented on
-               // ppc64 (issue #8912)
+               // linux/ppc64 (issue #8912)
                t.Skipf("no external linking on ppc64")
        }
 
@@ -290,7 +290,7 @@ func testCgoPprof(t *testing.T, buildArg, runArg, top, bottom string) {
                        // See Issue 18243 and Issue 19938.
                        t.Skipf("Skipping failing test on Alpine (golang.org/issue/18243). Ignoring error: %v", err)
                }
-               t.Fatal(err)
+               t.Fatalf("%s\n\n%v", got, err)
        }
        fn := strings.TrimSpace(string(got))
        defer os.Remove(fn)
index cb5acb13de94cf9e97f367309429ec8e7f34092b..b4b015e09de68e0ff4c6a22961ed275465e876e7 100644 (file)
@@ -34,8 +34,12 @@ func init() {
 }
 
 func TestCrashDumpsAllThreads(t *testing.T) {
+       if *flagQuick {
+               t.Skip("-quick")
+       }
+
        switch runtime.GOOS {
-       case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+       case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "illumos", "solaris":
        default:
                t.Skipf("skipping; not supported on %v", runtime.GOOS)
        }
@@ -63,7 +67,7 @@ func TestCrashDumpsAllThreads(t *testing.T) {
                t.Fatalf("failed to create Go file: %v", err)
        }
 
-       cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe")
+       cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go")
        cmd.Dir = dir
        out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
        if err != nil {
index 5be2ec42bc919cc26cbcda247a12ced6b5598bbe..e480466b4d571dbd9f0d62ec9087b261e6603ceb 100644 (file)
@@ -65,3 +65,14 @@ func NumGoroutine() int {
 // PkgPath.Name.FieldName.  The value will be true for each field
 // added.
 func Fieldtrack(map[string]bool)
+
+//go:linkname debug_modinfo runtime..z2fdebug.modinfo
+func debug_modinfo() string {
+       return modinfo
+}
+
+// setmodinfo is visible to code generated by cmd/go/internal/modload.ModInfoProg.
+//go:linkname setmodinfo runtime.setmodinfo
+func setmodinfo(s string) {
+       modinfo = s
+}
index f2948c65cbd4b72cf5f4611aa59a7a98ba4f4c40..58c6ae019afc2e3067d6d551a788dcc2af463d60 100644 (file)
@@ -9,20 +9,14 @@ import (
        _ "unsafe" // for go:linkname
 )
 
-// set using cmd/go/internal/modload.ModInfoProg
-var modinfo string
-
-// setmodinfo is visible to code generated by cmd/go/internal/modload.ModInfoProg.
-//go:linkname setmodinfo runtime..z2fdebug.setmodinfo
-func setmodinfo(s string) {
-       modinfo = s
-}
+// exported from runtime
+func modinfo() string
 
 // ReadBuildInfo returns the build information embedded
 // in the running binary. The information is available only
 // in binaries built with module support.
 func ReadBuildInfo() (info *BuildInfo, ok bool) {
-       return readBuildInfo(modinfo)
+       return readBuildInfo(modinfo())
 }
 
 // BuildInfo represents the build information read from
diff --git a/libgo/go/runtime/debuglog.go b/libgo/go/runtime/debuglog.go
new file mode 100644 (file)
index 0000000..4f4109f
--- /dev/null
@@ -0,0 +1,813 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file provides an internal debug logging facility. The debug
+// log is a lightweight, in-memory, per-M ring buffer. By default, the
+// runtime prints the debug log on panic.
+//
+// To print something to the debug log, call dlog to obtain a dlogger
+// and use the methods on that to add values. The values will be
+// space-separated in the output (much like println).
+//
+// This facility can be enabled by passing -tags debuglog when
+// building. Without this tag, dlog calls compile to nothing.
+
+package runtime
+
+import (
+       "runtime/internal/atomic"
+       "unsafe"
+)
+
+// debugLogBytes is the size of each per-M ring buffer. This is
+// allocated off-heap to avoid blowing up the M and hence the GC'd
+// heap size.
+const debugLogBytes = 16 << 10
+
+// debugLogStringLimit is the maximum number of bytes in a string.
+// Above this, the string will be truncated with "..(n more bytes).."
+const debugLogStringLimit = debugLogBytes / 8
+
+// dlog returns a debug logger. The caller can use methods on the
+// returned logger to add values, which will be space-separated in the
+// final output, much like println. The caller must call end() to
+// finish the message.
+//
+// dlog can be used from highly-constrained corners of the runtime: it
+// is safe to use in the signal handler, from within the write
+// barrier, from within the stack implementation, and in places that
+// must be recursively nosplit.
+//
+// This will be compiled away if built without the debuglog build tag.
+// However, argument construction may not be. If any of the arguments
+// are not literals or trivial expressions, consider protecting the
+// call with "if dlogEnabled".
+//
+//go:nosplit
+//go:nowritebarrierrec
+func dlog() *dlogger {
+       if !dlogEnabled {
+               return nil
+       }
+
+       // Get the time.
+       tick, nano := uint64(cputicks()), uint64(nanotime())
+
+       // Try to get a cached logger.
+       l := getCachedDlogger()
+
+       // If we couldn't get a cached logger, try to get one from the
+       // global pool.
+       if l == nil {
+               allp := (*uintptr)(unsafe.Pointer(&allDloggers))
+               all := (*dlogger)(unsafe.Pointer(atomic.Loaduintptr(allp)))
+               for l1 := all; l1 != nil; l1 = l1.allLink {
+                       if atomic.Load(&l1.owned) == 0 && atomic.Cas(&l1.owned, 0, 1) {
+                               l = l1
+                               break
+                       }
+               }
+       }
+
+       // If that failed, allocate a new logger.
+       if l == nil {
+               l = (*dlogger)(sysAlloc(unsafe.Sizeof(dlogger{}), nil))
+               if l == nil {
+                       throw("failed to allocate debug log")
+               }
+               l.w.r.data = &l.w.data
+               l.owned = 1
+
+               // Prepend to allDloggers list.
+               headp := (*uintptr)(unsafe.Pointer(&allDloggers))
+               for {
+                       head := atomic.Loaduintptr(headp)
+                       l.allLink = (*dlogger)(unsafe.Pointer(head))
+                       if atomic.Casuintptr(headp, head, uintptr(unsafe.Pointer(l))) {
+                               break
+                       }
+               }
+       }
+
+       // If the time delta is getting too high, write a new sync
+       // packet. We set the limit so we don't write more than 6
+       // bytes of delta in the record header.
+       const deltaLimit = 1<<(3*7) - 1 // ~2ms between sync packets
+       if tick-l.w.tick > deltaLimit || nano-l.w.nano > deltaLimit {
+               l.w.writeSync(tick, nano)
+       }
+
+       // Reserve space for framing header.
+       l.w.ensure(debugLogHeaderSize)
+       l.w.write += debugLogHeaderSize
+
+       // Write record header.
+       l.w.uvarint(tick - l.w.tick)
+       l.w.uvarint(nano - l.w.nano)
+       gp := getg()
+       if gp != nil && gp.m != nil && gp.m.p != 0 {
+               l.w.varint(int64(gp.m.p.ptr().id))
+       } else {
+               l.w.varint(-1)
+       }
+
+       return l
+}
+
+// A dlogger writes to the debug log.
+//
+// To obtain a dlogger, call dlog(). When done with the dlogger, call
+// end().
+//
+//go:notinheap
+type dlogger struct {
+       w debugLogWriter
+
+       // allLink is the next dlogger in the allDloggers list.
+       allLink *dlogger
+
+       // owned indicates that this dlogger is owned by an M. This is
+       // accessed atomically.
+       owned uint32
+}
+
+// allDloggers is a list of all dloggers, linked through
+// dlogger.allLink. This is accessed atomically. This is prepend only,
+// so it doesn't need to protect against ABA races.
+var allDloggers *dlogger
+
+//go:nosplit
+func (l *dlogger) end() {
+       if !dlogEnabled {
+               return
+       }
+
+       // Fill in framing header.
+       size := l.w.write - l.w.r.end
+       if !l.w.writeFrameAt(l.w.r.end, size) {
+               throw("record too large")
+       }
+
+       // Commit the record.
+       l.w.r.end = l.w.write
+
+       // Attempt to return this logger to the cache.
+       if putCachedDlogger(l) {
+               return
+       }
+
+       // Return the logger to the global pool.
+       atomic.Store(&l.owned, 0)
+}
+
+const (
+       debugLogUnknown = 1 + iota
+       debugLogBoolTrue
+       debugLogBoolFalse
+       debugLogInt
+       debugLogUint
+       debugLogHex
+       debugLogPtr
+       debugLogString
+       debugLogConstString
+       debugLogStringOverflow
+
+       debugLogPC
+       debugLogTraceback
+)
+
+//go:nosplit
+func (l *dlogger) b(x bool) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       if x {
+               l.w.byte(debugLogBoolTrue)
+       } else {
+               l.w.byte(debugLogBoolFalse)
+       }
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) i(x int) *dlogger {
+       return l.i64(int64(x))
+}
+
+//go:nosplit
+func (l *dlogger) i8(x int8) *dlogger {
+       return l.i64(int64(x))
+}
+
+//go:nosplit
+func (l *dlogger) i16(x int16) *dlogger {
+       return l.i64(int64(x))
+}
+
+//go:nosplit
+func (l *dlogger) i32(x int32) *dlogger {
+       return l.i64(int64(x))
+}
+
+//go:nosplit
+func (l *dlogger) i64(x int64) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogInt)
+       l.w.varint(x)
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) u(x uint) *dlogger {
+       return l.u64(uint64(x))
+}
+
+//go:nosplit
+func (l *dlogger) uptr(x uintptr) *dlogger {
+       return l.u64(uint64(x))
+}
+
+//go:nosplit
+func (l *dlogger) u8(x uint8) *dlogger {
+       return l.u64(uint64(x))
+}
+
+//go:nosplit
+func (l *dlogger) u16(x uint16) *dlogger {
+       return l.u64(uint64(x))
+}
+
+//go:nosplit
+func (l *dlogger) u32(x uint32) *dlogger {
+       return l.u64(uint64(x))
+}
+
+//go:nosplit
+func (l *dlogger) u64(x uint64) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogUint)
+       l.w.uvarint(x)
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) hex(x uint64) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogHex)
+       l.w.uvarint(x)
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) p(x interface{}) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogPtr)
+       if x == nil {
+               l.w.uvarint(0)
+       } else {
+               v := efaceOf(&x)
+               switch v._type.kind & kindMask {
+               case kindChan, kindFunc, kindMap, kindPtr, kindUnsafePointer:
+                       l.w.uvarint(uint64(uintptr(v.data)))
+               default:
+                       throw("not a pointer type")
+               }
+       }
+       return l
+}
+
+// C function to get an address before the read-only data segment.
+func getText() uintptr
+
+// C function to get an address after the read-only data segment.
+func getEtext() uintptr
+
+//go:nosplit
+func (l *dlogger) s(x string) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       str := stringStructOf(&x)
+       text := getText()
+       etext := getEtext()
+       if len(x) > 4 && text != 0 && etext != 0 && text <= uintptr(str.str) && uintptr(str.str) < etext {
+               // String constants are in the rodata section, which
+               // isn't recorded in moduledata. But it has to be
+               // somewhere between etext and end.
+               l.w.byte(debugLogConstString)
+               l.w.uvarint(uint64(str.len))
+               l.w.uvarint(uint64(uintptr(str.str) - text))
+       } else {
+               l.w.byte(debugLogString)
+               var b []byte
+               bb := (*slice)(unsafe.Pointer(&b))
+               bb.array = str.str
+               bb.len, bb.cap = str.len, str.len
+               if len(b) > debugLogStringLimit {
+                       b = b[:debugLogStringLimit]
+               }
+               l.w.uvarint(uint64(len(b)))
+               l.w.bytes(b)
+               if len(b) != len(x) {
+                       l.w.byte(debugLogStringOverflow)
+                       l.w.uvarint(uint64(len(x) - len(b)))
+               }
+       }
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) pc(x uintptr) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogPC)
+       l.w.uvarint(uint64(x))
+       return l
+}
+
+//go:nosplit
+func (l *dlogger) traceback(x []uintptr) *dlogger {
+       if !dlogEnabled {
+               return l
+       }
+       l.w.byte(debugLogTraceback)
+       l.w.uvarint(uint64(len(x)))
+       for _, pc := range x {
+               l.w.uvarint(uint64(pc))
+       }
+       return l
+}
+
+// A debugLogWriter is a ring buffer of binary debug log records.
+//
+// A log record consists of a 2-byte framing header and a sequence of
+// fields. The framing header gives the size of the record as a little
+// endian 16-bit value. Each field starts with a byte indicating its
+// type, followed by type-specific data. If the size in the framing
+// header is 0, it's a sync record consisting of two little endian
+// 64-bit values giving a new time base.
+//
+// Because this is a ring buffer, new records will eventually
+// overwrite old records. Hence, it maintains a reader that consumes
+// the log as it gets overwritten. That reader state is where an
+// actual log reader would start.
+//
+//go:notinheap
+type debugLogWriter struct {
+       write uint64
+       data  debugLogBuf
+
+       // tick and nano are the time bases from the most recently
+       // written sync record.
+       tick, nano uint64
+
+       // r is a reader that consumes records as they get overwritten
+       // by the writer. It also acts as the initial reader state
+       // when printing the log.
+       r debugLogReader
+
+       // buf is a scratch buffer for encoding. This is here to
+       // reduce stack usage.
+       buf [10]byte
+}
+
+//go:notinheap
+type debugLogBuf [debugLogBytes]byte
+
+const (
+       // debugLogHeaderSize is the number of bytes in the framing
+       // header of every dlog record.
+       debugLogHeaderSize = 2
+
+       // debugLogSyncSize is the number of bytes in a sync record.
+       debugLogSyncSize = debugLogHeaderSize + 2*8
+)
+
+//go:nosplit
+func (l *debugLogWriter) ensure(n uint64) {
+       for l.write+n >= l.r.begin+uint64(len(l.data)) {
+               // Consume record at begin.
+               if l.r.skip() == ^uint64(0) {
+                       // Wrapped around within a record.
+                       //
+                       // TODO(austin): It would be better to just
+                       // eat the whole buffer at this point, but we
+                       // have to communicate that to the reader
+                       // somehow.
+                       throw("record wrapped around")
+               }
+       }
+}
+
+//go:nosplit
+func (l *debugLogWriter) writeFrameAt(pos, size uint64) bool {
+       l.data[pos%uint64(len(l.data))] = uint8(size)
+       l.data[(pos+1)%uint64(len(l.data))] = uint8(size >> 8)
+       return size <= 0xFFFF
+}
+
+//go:nosplit
+func (l *debugLogWriter) writeSync(tick, nano uint64) {
+       l.tick, l.nano = tick, nano
+       l.ensure(debugLogHeaderSize)
+       l.writeFrameAt(l.write, 0)
+       l.write += debugLogHeaderSize
+       l.writeUint64LE(tick)
+       l.writeUint64LE(nano)
+       l.r.end = l.write
+}
+
+//go:nosplit
+func (l *debugLogWriter) writeUint64LE(x uint64) {
+       var b [8]byte
+       b[0] = byte(x)
+       b[1] = byte(x >> 8)
+       b[2] = byte(x >> 16)
+       b[3] = byte(x >> 24)
+       b[4] = byte(x >> 32)
+       b[5] = byte(x >> 40)
+       b[6] = byte(x >> 48)
+       b[7] = byte(x >> 56)
+       l.bytes(b[:])
+}
+
+//go:nosplit
+func (l *debugLogWriter) byte(x byte) {
+       l.ensure(1)
+       pos := l.write
+       l.write++
+       l.data[pos%uint64(len(l.data))] = x
+}
+
+//go:nosplit
+func (l *debugLogWriter) bytes(x []byte) {
+       l.ensure(uint64(len(x)))
+       pos := l.write
+       l.write += uint64(len(x))
+       for len(x) > 0 {
+               n := copy(l.data[pos%uint64(len(l.data)):], x)
+               pos += uint64(n)
+               x = x[n:]
+       }
+}
+
+//go:nosplit
+func (l *debugLogWriter) varint(x int64) {
+       var u uint64
+       if x < 0 {
+               u = (^uint64(x) << 1) | 1 // complement i, bit 0 is 1
+       } else {
+               u = (uint64(x) << 1) // do not complement i, bit 0 is 0
+       }
+       l.uvarint(u)
+}
+
+//go:nosplit
+func (l *debugLogWriter) uvarint(u uint64) {
+       i := 0
+       for u >= 0x80 {
+               l.buf[i] = byte(u) | 0x80
+               u >>= 7
+               i++
+       }
+       l.buf[i] = byte(u)
+       i++
+       l.bytes(l.buf[:i])
+}
+
+type debugLogReader struct {
+       data *debugLogBuf
+
+       // begin and end are the positions in the log of the beginning
+       // and end of the log data, modulo len(data).
+       begin, end uint64
+
+       // tick and nano are the current time base at begin.
+       tick, nano uint64
+}
+
+//go:nosplit
+func (r *debugLogReader) skip() uint64 {
+       // Read size at pos.
+       if r.begin+debugLogHeaderSize > r.end {
+               return ^uint64(0)
+       }
+       size := uint64(r.readUint16LEAt(r.begin))
+       if size == 0 {
+               // Sync packet.
+               r.tick = r.readUint64LEAt(r.begin + debugLogHeaderSize)
+               r.nano = r.readUint64LEAt(r.begin + debugLogHeaderSize + 8)
+               size = debugLogSyncSize
+       }
+       if r.begin+size > r.end {
+               return ^uint64(0)
+       }
+       r.begin += size
+       return size
+}
+
+//go:nosplit
+func (r *debugLogReader) readUint16LEAt(pos uint64) uint16 {
+       return uint16(r.data[pos%uint64(len(r.data))]) |
+               uint16(r.data[(pos+1)%uint64(len(r.data))])<<8
+}
+
+//go:nosplit
+func (r *debugLogReader) readUint64LEAt(pos uint64) uint64 {
+       var b [8]byte
+       for i := range b {
+               b[i] = r.data[pos%uint64(len(r.data))]
+               pos++
+       }
+       return uint64(b[0]) | uint64(b[1])<<8 |
+               uint64(b[2])<<16 | uint64(b[3])<<24 |
+               uint64(b[4])<<32 | uint64(b[5])<<40 |
+               uint64(b[6])<<48 | uint64(b[7])<<56
+}
+
+func (r *debugLogReader) peek() (tick uint64) {
+       // Consume any sync records.
+       size := uint64(0)
+       for size == 0 {
+               if r.begin+debugLogHeaderSize > r.end {
+                       return ^uint64(0)
+               }
+               size = uint64(r.readUint16LEAt(r.begin))
+               if size != 0 {
+                       break
+               }
+               if r.begin+debugLogSyncSize > r.end {
+                       return ^uint64(0)
+               }
+               // Sync packet.
+               r.tick = r.readUint64LEAt(r.begin + debugLogHeaderSize)
+               r.nano = r.readUint64LEAt(r.begin + debugLogHeaderSize + 8)
+               r.begin += debugLogSyncSize
+       }
+
+       // Peek tick delta.
+       if r.begin+size > r.end {
+               return ^uint64(0)
+       }
+       pos := r.begin + debugLogHeaderSize
+       var u uint64
+       for i := uint(0); ; i += 7 {
+               b := r.data[pos%uint64(len(r.data))]
+               pos++
+               u |= uint64(b&^0x80) << i
+               if b&0x80 == 0 {
+                       break
+               }
+       }
+       if pos > r.begin+size {
+               return ^uint64(0)
+       }
+       return r.tick + u
+}
+
+func (r *debugLogReader) header() (end, tick, nano uint64, p int) {
+       // Read size. We've already skipped sync packets and checked
+       // bounds in peek.
+       size := uint64(r.readUint16LEAt(r.begin))
+       end = r.begin + size
+       r.begin += debugLogHeaderSize
+
+       // Read tick, nano, and p.
+       tick = r.uvarint() + r.tick
+       nano = r.uvarint() + r.nano
+       p = int(r.varint())
+
+       return
+}
+
+func (r *debugLogReader) uvarint() uint64 {
+       var u uint64
+       for i := uint(0); ; i += 7 {
+               b := r.data[r.begin%uint64(len(r.data))]
+               r.begin++
+               u |= uint64(b&^0x80) << i
+               if b&0x80 == 0 {
+                       break
+               }
+       }
+       return u
+}
+
+func (r *debugLogReader) varint() int64 {
+       u := r.uvarint()
+       var v int64
+       if u&1 == 0 {
+               v = int64(u >> 1)
+       } else {
+               v = ^int64(u >> 1)
+       }
+       return v
+}
+
+func (r *debugLogReader) printVal() bool {
+       typ := r.data[r.begin%uint64(len(r.data))]
+       r.begin++
+
+       switch typ {
+       default:
+               print("<unknown field type ", hex(typ), " pos ", r.begin-1, " end ", r.end, ">\n")
+               return false
+
+       case debugLogUnknown:
+               print("<unknown kind>")
+
+       case debugLogBoolTrue:
+               print(true)
+
+       case debugLogBoolFalse:
+               print(false)
+
+       case debugLogInt:
+               print(r.varint())
+
+       case debugLogUint:
+               print(r.uvarint())
+
+       case debugLogHex, debugLogPtr:
+               print(hex(r.uvarint()))
+
+       case debugLogString:
+               sl := r.uvarint()
+               if r.begin+sl > r.end {
+                       r.begin = r.end
+                       print("<string length corrupted>")
+                       break
+               }
+               for sl > 0 {
+                       b := r.data[r.begin%uint64(len(r.data)):]
+                       if uint64(len(b)) > sl {
+                               b = b[:sl]
+                       }
+                       r.begin += uint64(len(b))
+                       sl -= uint64(len(b))
+                       gwrite(b)
+               }
+
+       case debugLogConstString:
+               len, ptr := int(r.uvarint()), uintptr(r.uvarint())
+               ptr += getText()
+               str := stringStruct{
+                       str: unsafe.Pointer(ptr),
+                       len: len,
+               }
+               s := *(*string)(unsafe.Pointer(&str))
+               print(s)
+
+       case debugLogStringOverflow:
+               print("..(", r.uvarint(), " more bytes)..")
+
+       case debugLogPC:
+               printDebugLogPC(uintptr(r.uvarint()))
+
+       case debugLogTraceback:
+               n := int(r.uvarint())
+               for i := 0; i < n; i++ {
+                       print("\n\t")
+                       printDebugLogPC(uintptr(r.uvarint()))
+               }
+       }
+
+       return true
+}
+
+// printDebugLog prints the debug log.
+func printDebugLog() {
+       if !dlogEnabled {
+               return
+       }
+
+       // This function should not panic or throw since it is used in
+       // the fatal panic path and this may deadlock.
+
+       printlock()
+
+       // Get the list of all debug logs.
+       allp := (*uintptr)(unsafe.Pointer(&allDloggers))
+       all := (*dlogger)(unsafe.Pointer(atomic.Loaduintptr(allp)))
+
+       // Count the logs.
+       n := 0
+       for l := all; l != nil; l = l.allLink {
+               n++
+       }
+       if n == 0 {
+               printunlock()
+               return
+       }
+
+       // Prepare read state for all logs.
+       type readState struct {
+               debugLogReader
+               first    bool
+               lost     uint64
+               nextTick uint64
+       }
+       state1 := sysAlloc(unsafe.Sizeof(readState{})*uintptr(n), nil)
+       if state1 == nil {
+               println("failed to allocate read state for", n, "logs")
+               printunlock()
+               return
+       }
+       state := (*[1 << 20]readState)(state1)[:n]
+       {
+               l := all
+               for i := range state {
+                       s := &state[i]
+                       s.debugLogReader = l.w.r
+                       s.first = true
+                       s.lost = l.w.r.begin
+                       s.nextTick = s.peek()
+                       l = l.allLink
+               }
+       }
+
+       // Print records.
+       for {
+               // Find the next record.
+               var best struct {
+                       tick uint64
+                       i    int
+               }
+               best.tick = ^uint64(0)
+               for i := range state {
+                       if state[i].nextTick < best.tick {
+                               best.tick = state[i].nextTick
+                               best.i = i
+                       }
+               }
+               if best.tick == ^uint64(0) {
+                       break
+               }
+
+               // Print record.
+               s := &state[best.i]
+               if s.first {
+                       print(">> begin log ", best.i)
+                       if s.lost != 0 {
+                               print("; lost first ", s.lost>>10, "KB")
+                       }
+                       print(" <<\n")
+                       s.first = false
+               }
+
+               end, _, nano, p := s.header()
+               oldEnd := s.end
+               s.end = end
+
+               print("[")
+               var tmpbuf [21]byte
+               pnano := int64(nano) - runtimeInitTime
+               if pnano < 0 {
+                       // Logged before runtimeInitTime was set.
+                       pnano = 0
+               }
+               print(string(itoaDiv(tmpbuf[:], uint64(pnano), 9)))
+               print(" P ", p, "] ")
+
+               for i := 0; s.begin < s.end; i++ {
+                       if i > 0 {
+                               print(" ")
+                       }
+                       if !s.printVal() {
+                               // Abort this P log.
+                               print("<aborting P log>")
+                               end = oldEnd
+                               break
+                       }
+               }
+               println()
+
+               // Move on to the next record.
+               s.begin = end
+               s.end = oldEnd
+               s.nextTick = s.peek()
+       }
+
+       printunlock()
+}
+
+func printDebugLogPC(pc uintptr) {
+       print(hex(pc))
+       name, file, line, _ := funcfileline(pc, -1)
+       if name == "" {
+               print(" [unknown PC]")
+       } else {
+               print(" [", name, "+", hex(pc-funcentry(pc)),
+                       " ", file, ":", line, "]")
+       }
+}
diff --git a/libgo/go/runtime/debuglog_off.go b/libgo/go/runtime/debuglog_off.go
new file mode 100644 (file)
index 0000000..bb3e172
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !debuglog
+
+package runtime
+
+const dlogEnabled = false
+
+type dlogPerM struct{}
+
+func getCachedDlogger() *dlogger {
+       return nil
+}
+
+func putCachedDlogger(l *dlogger) bool {
+       return false
+}
diff --git a/libgo/go/runtime/debuglog_on.go b/libgo/go/runtime/debuglog_on.go
new file mode 100644 (file)
index 0000000..3d477e8
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build debuglog
+
+package runtime
+
+const dlogEnabled = true
+
+// dlogPerM is the per-M debug log data. This is embedded in the m
+// struct.
+type dlogPerM struct {
+       dlogCache *dlogger
+}
+
+// getCachedDlogger returns a cached dlogger if it can do so
+// efficiently, or nil otherwise. The returned dlogger will be owned.
+func getCachedDlogger() *dlogger {
+       mp := acquirem()
+       // We don't return a cached dlogger if we're running on the
+       // signal stack in case the signal arrived while in
+       // get/putCachedDlogger. (Too bad we don't have non-atomic
+       // exchange!)
+       var l *dlogger
+       if getg() != mp.gsignal {
+               l = mp.dlogCache
+               mp.dlogCache = nil
+       }
+       releasem(mp)
+       return l
+}
+
+// putCachedDlogger attempts to return l to the local cache. It
+// returns false if this fails.
+func putCachedDlogger(l *dlogger) bool {
+       mp := acquirem()
+       if getg() != mp.gsignal && mp.dlogCache == nil {
+               mp.dlogCache = l
+               releasem(mp)
+               return true
+       }
+       releasem(mp)
+       return false
+}
diff --git a/libgo/go/runtime/debuglog_test.go b/libgo/go/runtime/debuglog_test.go
new file mode 100644 (file)
index 0000000..2570e35
--- /dev/null
@@ -0,0 +1,158 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// TODO(austin): All of these tests are skipped if the debuglog build
+// tag isn't provided. That means we basically never test debuglog.
+// There are two potential ways around this:
+//
+// 1. Make these tests re-build the runtime test with the debuglog
+// build tag and re-invoke themselves.
+//
+// 2. Always build the whole debuglog infrastructure and depend on
+// linker dead-code elimination to drop it. This is easy for dlog()
+// since there won't be any calls to it. For printDebugLog, we can
+// make panic call a wrapper that is call printDebugLog if the
+// debuglog build tag is set, or otherwise do nothing. Then tests
+// could call printDebugLog directly. This is the right answer in
+// principle, but currently our linker reads in all symbols
+// regardless, so this would slow down and bloat all links. If the
+// linker gets more efficient about this, we should revisit this
+// approach.
+
+package runtime_test
+
+import (
+       "bytes"
+       "fmt"
+       "regexp"
+       "runtime"
+       "strings"
+       "sync"
+       "sync/atomic"
+       "testing"
+)
+
+func skipDebugLog(t *testing.T) {
+       if !runtime.DlogEnabled {
+               t.Skip("debug log disabled (rebuild with -tags debuglog)")
+       }
+}
+
+func dlogCanonicalize(x string) string {
+       begin := regexp.MustCompile(`(?m)^>> begin log \d+ <<\n`)
+       x = begin.ReplaceAllString(x, "")
+       prefix := regexp.MustCompile(`(?m)^\[[^]]+\]`)
+       x = prefix.ReplaceAllString(x, "[]")
+       return x
+}
+
+func TestDebugLog(t *testing.T) {
+       skipDebugLog(t)
+       runtime.ResetDebugLog()
+       runtime.Dlog().S("testing").End()
+       got := dlogCanonicalize(runtime.DumpDebugLog())
+       if want := "[] testing\n"; got != want {
+               t.Fatalf("want %q, got %q", want, got)
+       }
+}
+
+func TestDebugLogTypes(t *testing.T) {
+       skipDebugLog(t)
+       runtime.ResetDebugLog()
+       var varString = strings.Repeat("a", 4)
+       runtime.Dlog().B(true).B(false).I(-42).I16(0x7fff).U64(^uint64(0)).Hex(0xfff).P(nil).S(varString).S("const string").End()
+       got := dlogCanonicalize(runtime.DumpDebugLog())
+       if want := "[] true false -42 32767 18446744073709551615 0xfff 0x0 aaaa const string\n"; got != want {
+               t.Fatalf("want %q, got %q", want, got)
+       }
+}
+
+func TestDebugLogSym(t *testing.T) {
+       skipDebugLog(t)
+       runtime.ResetDebugLog()
+       pc, _, _, _ := runtime.Caller(0)
+       runtime.Dlog().PC(pc).End()
+       got := dlogCanonicalize(runtime.DumpDebugLog())
+       want := regexp.MustCompile(`\[\] 0x[0-9a-f]+ \[runtime_test\.TestDebugLogSym\+0x[0-9a-f]+ .*/debuglog_test\.go:[0-9]+\]\n`)
+       if !want.MatchString(got) {
+               t.Fatalf("want matching %s, got %q", want, got)
+       }
+}
+
+func TestDebugLogInterleaving(t *testing.T) {
+       skipDebugLog(t)
+       runtime.ResetDebugLog()
+       var wg sync.WaitGroup
+       done := int32(0)
+       wg.Add(1)
+       go func() {
+               // Encourage main goroutine to move around to
+               // different Ms and Ps.
+               for atomic.LoadInt32(&done) == 0 {
+                       runtime.Gosched()
+               }
+               wg.Done()
+       }()
+       var want bytes.Buffer
+       for i := 0; i < 1000; i++ {
+               runtime.Dlog().I(i).End()
+               fmt.Fprintf(&want, "[] %d\n", i)
+               runtime.Gosched()
+       }
+       atomic.StoreInt32(&done, 1)
+       wg.Wait()
+
+       gotFull := runtime.DumpDebugLog()
+       got := dlogCanonicalize(gotFull)
+       if got != want.String() {
+               // Since the timestamps are useful in understand
+               // failures of this test, we print the uncanonicalized
+               // output.
+               t.Fatalf("want %q, got (uncanonicalized) %q", want.String(), gotFull)
+       }
+}
+
+func TestDebugLogWraparound(t *testing.T) {
+       skipDebugLog(t)
+
+       // Make sure we don't switch logs so it's easier to fill one up.
+       runtime.LockOSThread()
+       defer runtime.UnlockOSThread()
+
+       runtime.ResetDebugLog()
+       var longString = strings.Repeat("a", 128)
+       var want bytes.Buffer
+       for i, j := 0, 0; j < 2*runtime.DebugLogBytes; i, j = i+1, j+len(longString) {
+               runtime.Dlog().I(i).S(longString).End()
+               fmt.Fprintf(&want, "[] %d %s\n", i, longString)
+       }
+       log := runtime.DumpDebugLog()
+
+       // Check for "lost" message.
+       lost := regexp.MustCompile(`^>> begin log \d+; lost first \d+KB <<\n`)
+       if !lost.MatchString(log) {
+               t.Fatalf("want matching %s, got %q", lost, log)
+       }
+       idx := lost.FindStringIndex(log)
+       // Strip lost message.
+       log = dlogCanonicalize(log[idx[1]:])
+
+       // Check log.
+       if !strings.HasSuffix(want.String(), log) {
+               t.Fatalf("wrong suffix:\n%s", log)
+       }
+}
+
+func TestDebugLogLongString(t *testing.T) {
+       skipDebugLog(t)
+
+       runtime.ResetDebugLog()
+       var longString = strings.Repeat("a", runtime.DebugLogStringLimit+1)
+       runtime.Dlog().S(longString).End()
+       got := dlogCanonicalize(runtime.DumpDebugLog())
+       want := "[] " + strings.Repeat("a", runtime.DebugLogStringLimit) + " ..(1 more bytes)..\n"
+       if got != want {
+               t.Fatalf("want %q, got %q", want, got)
+       }
+}
diff --git a/libgo/go/runtime/export_debuglog_test.go b/libgo/go/runtime/export_debuglog_test.go
new file mode 100644 (file)
index 0000000..8cd943b
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Export debuglog guts for testing.
+
+package runtime
+
+const DlogEnabled = dlogEnabled
+
+const DebugLogBytes = debugLogBytes
+
+const DebugLogStringLimit = debugLogStringLimit
+
+var Dlog = dlog
+
+func (l *dlogger) End()                     { l.end() }
+func (l *dlogger) B(x bool) *dlogger        { return l.b(x) }
+func (l *dlogger) I(x int) *dlogger         { return l.i(x) }
+func (l *dlogger) I16(x int16) *dlogger     { return l.i16(x) }
+func (l *dlogger) U64(x uint64) *dlogger    { return l.u64(x) }
+func (l *dlogger) Hex(x uint64) *dlogger    { return l.hex(x) }
+func (l *dlogger) P(x interface{}) *dlogger { return l.p(x) }
+func (l *dlogger) S(x string) *dlogger      { return l.s(x) }
+func (l *dlogger) PC(x uintptr) *dlogger    { return l.pc(x) }
+
+func DumpDebugLog() string {
+       g := getg()
+       g.writebuf = make([]byte, 0, 1<<20)
+       printDebugLog()
+       buf := g.writebuf
+       g.writebuf = nil
+
+       return string(buf)
+}
+
+func ResetDebugLog() {
+       stopTheWorld("ResetDebugLog")
+       for l := allDloggers; l != nil; l = l.allLink {
+               l.w.write = 0
+               l.w.tick, l.w.nano = 0, 0
+               l.w.r.begin, l.w.r.end = 0, 0
+               l.w.r.tick, l.w.r.nano = 0, 0
+       }
+       startTheWorld()
+}
index 6e05bb9fbb766b65e2daeb83b32f74e5defa312f..5f3e99af2ccc0e70ce4369067372319cf33061ff 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build aix darwin dragonfly freebsd hurd linux nacl netbsd openbsd solaris
+
 // Export guts for testing.
 
 package runtime
index d919e0486b2c324c6e41f38877a83001b8f623f4..0db23937926f054de768bccbda19bb68bd0b556c 100644 (file)
@@ -34,6 +34,10 @@ var Fastlog2 = fastlog2
 var Atoi = atoi
 var Atoi32 = atoi32
 
+var Nanotime = nanotime
+
+var PhysHugePageSize = physHugePageSize
+
 type LFNode struct {
        Next    uint64
        Pushcnt uintptr
@@ -332,7 +336,7 @@ func ReadMemStatsSlow() (base, slow MemStats) {
                        slow.BySize[i].Frees = bySize[i].Frees
                }
 
-               for i := mheap_.scav.start(); i.valid(); i = i.next() {
+               for i := mheap_.free.start(0, 0); i.valid(); i = i.next() {
                        slow.HeapReleased += uint64(i.span().released())
                }
 
@@ -402,6 +406,18 @@ func LockOSCounts() (external, internal uint32) {
        return g.m.lockedExt, g.m.lockedInt
 }
 
+//go:noinline
+func TracebackSystemstack(stk []uintptr, i int) int {
+       if i == 0 {
+               return callersRaw(stk)
+       }
+       n := 0
+       systemstack(func() {
+               n = TracebackSystemstack(stk, i-1)
+       })
+       return n
+}
+
 func KeepNArenaHints(n int) {
        hint := mheap_.arenaHints
        for i := 1; i < n; i++ {
@@ -495,3 +511,167 @@ func MapTombstoneCheck(m map[int]int) {
                }
        }
 }
+
+// UnscavHugePagesSlow returns the value of mheap_.freeHugePages
+// and the number of unscavenged huge pages calculated by
+// scanning the heap.
+func UnscavHugePagesSlow() (uintptr, uintptr) {
+       var base, slow uintptr
+       // Run on the system stack to avoid deadlock from stack growth
+       // trying to acquire the heap lock.
+       systemstack(func() {
+               lock(&mheap_.lock)
+               base = mheap_.free.unscavHugePages
+               for _, s := range mheap_.allspans {
+                       if s.state == mSpanFree && !s.scavenged {
+                               slow += s.hugePages()
+                       }
+               }
+               unlock(&mheap_.lock)
+       })
+       return base, slow
+}
+
+// Span is a safe wrapper around an mspan, whose memory
+// is managed manually.
+type Span struct {
+       *mspan
+}
+
+func AllocSpan(base, npages uintptr, scavenged bool) Span {
+       var s *mspan
+       systemstack(func() {
+               lock(&mheap_.lock)
+               s = (*mspan)(mheap_.spanalloc.alloc())
+               unlock(&mheap_.lock)
+       })
+       s.init(base, npages)
+       s.scavenged = scavenged
+       return Span{s}
+}
+
+func (s *Span) Free() {
+       systemstack(func() {
+               lock(&mheap_.lock)
+               mheap_.spanalloc.free(unsafe.Pointer(s.mspan))
+               unlock(&mheap_.lock)
+       })
+       s.mspan = nil
+}
+
+func (s Span) Base() uintptr {
+       return s.mspan.base()
+}
+
+func (s Span) Pages() uintptr {
+       return s.mspan.npages
+}
+
+type TreapIterType treapIterType
+
+const (
+       TreapIterScav TreapIterType = TreapIterType(treapIterScav)
+       TreapIterHuge               = TreapIterType(treapIterHuge)
+       TreapIterBits               = treapIterBits
+)
+
+type TreapIterFilter treapIterFilter
+
+func TreapFilter(mask, match TreapIterType) TreapIterFilter {
+       return TreapIterFilter(treapFilter(treapIterType(mask), treapIterType(match)))
+}
+
+func (s Span) MatchesIter(mask, match TreapIterType) bool {
+       return treapFilter(treapIterType(mask), treapIterType(match)).matches(s.treapFilter())
+}
+
+type TreapIter struct {
+       treapIter
+}
+
+func (t TreapIter) Span() Span {
+       return Span{t.span()}
+}
+
+func (t TreapIter) Valid() bool {
+       return t.valid()
+}
+
+func (t TreapIter) Next() TreapIter {
+       return TreapIter{t.next()}
+}
+
+func (t TreapIter) Prev() TreapIter {
+       return TreapIter{t.prev()}
+}
+
+// Treap is a safe wrapper around mTreap for testing.
+//
+// It must never be heap-allocated because mTreap is
+// notinheap.
+//
+//go:notinheap
+type Treap struct {
+       mTreap
+}
+
+func (t *Treap) Start(mask, match TreapIterType) TreapIter {
+       return TreapIter{t.start(treapIterType(mask), treapIterType(match))}
+}
+
+func (t *Treap) End(mask, match TreapIterType) TreapIter {
+       return TreapIter{t.end(treapIterType(mask), treapIterType(match))}
+}
+
+func (t *Treap) Insert(s Span) {
+       // mTreap uses a fixalloc in mheap_ for treapNode
+       // allocation which requires the mheap_ lock to manipulate.
+       // Locking here is safe because the treap itself never allocs
+       // or otherwise ends up grabbing this lock.
+       systemstack(func() {
+               lock(&mheap_.lock)
+               t.insert(s.mspan)
+               unlock(&mheap_.lock)
+       })
+       t.CheckInvariants()
+}
+
+func (t *Treap) Find(npages uintptr) TreapIter {
+       return TreapIter{t.find(npages)}
+}
+
+func (t *Treap) Erase(i TreapIter) {
+       // mTreap uses a fixalloc in mheap_ for treapNode
+       // freeing which requires the mheap_ lock to manipulate.
+       // Locking here is safe because the treap itself never allocs
+       // or otherwise ends up grabbing this lock.
+       systemstack(func() {
+               lock(&mheap_.lock)
+               t.erase(i.treapIter)
+               unlock(&mheap_.lock)
+       })
+       t.CheckInvariants()
+}
+
+func (t *Treap) RemoveSpan(s Span) {
+       // See Erase about locking.
+       systemstack(func() {
+               lock(&mheap_.lock)
+               t.removeSpan(s.mspan)
+               unlock(&mheap_.lock)
+       })
+       t.CheckInvariants()
+}
+
+func (t *Treap) Size() int {
+       i := 0
+       t.mTreap.treap.walkTreap(func(t *treapNode) {
+               i++
+       })
+       return i
+}
+
+func (t *Treap) CheckInvariants() {
+       t.mTreap.treap.walkTreap(checkTreapNode)
+       t.mTreap.treap.validateInvariants()
+}
index 298eb81c65e41f5f4ee6b41a70ee9c70dedb8e5b..9dbf057b17d4d4328bdb57ef84b5e07c9ae454c2 100644 (file)
@@ -134,6 +134,9 @@ that can be blocked in system calls on behalf of Go code; those do not count aga
 the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes
 the limit.
 
+The GORACE variable configures the race detector, for programs built using -race.
+See https://golang.org/doc/articles/race_detector.html for details.
+
 The GOTRACEBACK variable controls the amount of output generated when a Go
 program fails due to an unrecovered panic or an unexpected runtime condition.
 By default, a failure prints a stack trace for the current goroutine,
index 384b75f2de3d7407943fa2f70555ee1478923ed1..3eb01bf4729dcc86b05492614c630eabb3256ced 100644 (file)
@@ -473,6 +473,25 @@ func TestReadMemStats(t *testing.T) {
        }
 }
 
+func TestUnscavHugePages(t *testing.T) {
+       // Allocate 20 MiB and immediately free it a few times to increase
+       // the chance that unscavHugePages isn't zero and that some kind of
+       // accounting had to happen in the runtime.
+       for j := 0; j < 3; j++ {
+               var large [][]byte
+               for i := 0; i < 5; i++ {
+                       large = append(large, make([]byte, runtime.PhysHugePageSize))
+               }
+               runtime.KeepAlive(large)
+               runtime.GC()
+       }
+       base, slow := runtime.UnscavHugePagesSlow()
+       if base != slow {
+               logDiff(t, "unscavHugePages", reflect.ValueOf(base), reflect.ValueOf(slow))
+               t.Fatal("unscavHugePages mismatch")
+       }
+}
+
 func logDiff(t *testing.T, prefix string, got, want reflect.Value) {
        typ := got.Type()
        switch typ.Kind() {
index b0506a8e47526289360032a2dda97c3bd68aa9f1..c968ab36d9ebdd2e4bdbedc87f0d26aeaf4b66a1 100644 (file)
@@ -195,7 +195,7 @@ func dumptype(t *_type) {
                dwritebyte('.')
                dwrite(name.str, uintptr(name.len))
        }
-       dumpbool(t.kind&kindDirectIface == 0 || t.kind&kindNoPointers == 0)
+       dumpbool(t.kind&kindDirectIface == 0 || t.ptrdata != 0)
 }
 
 // dump an object
index 3fa5dd6deec63b33a42eec59fb1a6102ae244206..74b54f5209c24a25cc4533c06cb97e923dbb0fd0 100644 (file)
@@ -504,6 +504,16 @@ func reflect_ifaceE2I(inter *interfacetype, e eface, dst *iface) {
        dst.data = e.data
 }
 
+//go:linkname reflectlite_ifaceE2I internal..z2freflectlite.ifaceE2I
+func reflectlite_ifaceE2I(inter *interfacetype, e eface, dst *iface) {
+       t := e._type
+       if t == nil {
+               panic(TypeAssertionError{nil, nil, &inter.typ, ""})
+       }
+       dst.tab = requireitab((*_type)(unsafe.Pointer(inter)), t)
+       dst.data = e.data
+}
+
 // staticbytes is used to avoid convT2E for byte-sized values.
 var staticbytes = [...]byte{
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
index 25ece4354eab75959666126819a9ad804ed4caa8..0ba75447e8c4a97af0abd047e0f36f4a785dfeed 100644 (file)
@@ -29,14 +29,18 @@ func runParallel(N, iter int, f func()) {
 }
 
 func TestXadduintptr(t *testing.T) {
-       const N = 20
-       const iter = 100000
+       N := 20
+       iter := 100000
+       if testing.Short() {
+               N = 10
+               iter = 10000
+       }
        inc := uintptr(100)
        total := uintptr(0)
        runParallel(N, iter, func() {
                atomic.Xadduintptr(&total, inc)
        })
-       if want := uintptr(N * iter * inc); want != total {
+       if want := uintptr(N*iter) * inc; want != total {
                t.Fatalf("xadduintpr error, want %d, got %d", want, total)
        }
        total = 0
index f58c915b630a9c8ee0169c6129e4f1f831dbafdb..c038499f2a9d34eef83f43c03e24964db2582c4b 100644 (file)
@@ -11,8 +11,6 @@ import (
 )
 
 // js/wasm has no support for threads yet. There is no preemption.
-// Waiting for a mutex is implemented by allowing other goroutines
-// to run until the mutex gets unlocked.
 
 const (
        mutex_unlocked = 0
@@ -28,9 +26,16 @@ const (
 )
 
 func lock(l *mutex) {
-       for l.key == mutex_locked {
-               mcall(gosched_m)
+       if l.key == mutex_locked {
+               // js/wasm is single-threaded so we should never
+               // observe this.
+               throw("self deadlock")
        }
+       gp := getg()
+       if gp.m.locks < 0 {
+               throw("lock count")
+       }
+       gp.m.locks++
        l.key = mutex_locked
 }
 
@@ -38,6 +43,11 @@ func unlock(l *mutex) {
        if l.key == mutex_unlocked {
                throw("unlock of unlocked lock")
        }
+       gp := getg()
+       gp.m.locks--
+       if gp.m.locks < 0 {
+               throw("lock count")
+       }
        l.key = mutex_unlocked
 }
 
index bf9211a6c3b9a39b173e3a9ca9b772a147d90f9e..5cf24061795901ef0f1b812e29454bd5d15f29ef 100644 (file)
@@ -133,7 +133,13 @@ func unlock(l *mutex) {
 
 // One-time notifications.
 func noteclear(n *note) {
-       n.key = 0
+       if GOOS == "aix" {
+               // On AIX, semaphores might not synchronize the memory in some
+               // rare cases. See issue #30189.
+               atomic.Storeuintptr(&n.key, 0)
+       } else {
+               n.key = 0
+       }
 }
 
 func notewakeup(n *note) {
@@ -273,7 +279,7 @@ func notetsleep_internal(n *note, ns int64, gp *g, deadline int64) bool {
 
 func notetsleep(n *note, ns int64) bool {
        gp := getg()
-       if gp != gp.m.g0 && gp.m.preemptoff != "" {
+       if gp != gp.m.g0 {
                throw("notetsleep not on g0")
        }
        semacreate(gp.m)
index e1e908b2859154d7d5d3bd29c1ea259541b2f844..cee5f6bc4de0dbfe8cca26637a0d8f2b707138f1 100644 (file)
@@ -335,53 +335,81 @@ const (
 var physPageSize uintptr
 
 // physHugePageSize is the size in bytes of the OS's default physical huge
-// page size whose allocation is opaque to the application. It is assumed
-// and verified to be a power of two.
+// page size whose allocation is opaque to the application.
 //
 // If set, this must be set by the OS init code (typically in osinit) before
 // mallocinit. However, setting it at all is optional, and leaving the default
 // value is always safe (though potentially less efficient).
-//
-// Since physHugePageSize is always assumed to be a power of two,
-// physHugePageShift is defined as physHugePageSize == 1 << physHugePageShift.
-// The purpose of physHugePageShift is to avoid doing divisions in
-// performance critical functions.
-var (
-       physHugePageSize  uintptr
-       physHugePageShift uint
-)
+var physHugePageSize uintptr
 
-// OS-defined helpers:
+// OS memory management abstraction layer
 //
-// sysAlloc obtains a large chunk of zeroed memory from the
-// operating system, typically on the order of a hundred kilobytes
-// or a megabyte.
-// NOTE: sysAlloc returns OS-aligned memory, but the heap allocator
-// may use larger alignment, so the caller must be careful to realign the
-// memory obtained by sysAlloc.
+// Regions of the address space managed by the runtime may be in one of four
+// states at any given time:
+// 1) None - Unreserved and unmapped, the default state of any region.
+// 2) Reserved - Owned by the runtime, but accessing it would cause a fault.
+//               Does not count against the process' memory footprint.
+// 3) Prepared - Reserved, intended not to be backed by physical memory (though
+//               an OS may implement this lazily). Can transition efficiently to
+//               Ready. Accessing memory in such a region is undefined (may
+//               fault, may give back unexpected zeroes, etc.).
+// 4) Ready - may be accessed safely.
 //
-// sysUnused notifies the operating system that the contents
-// of the memory region are no longer needed and can be reused
-// for other purposes.
-// sysUsed notifies the operating system that the contents
-// of the memory region are needed again.
+// This set of states is more than is strictly necessary to support all the
+// currently supported platforms. One could get by with just None, Reserved, and
+// Ready. However, the Prepared state gives us flexibility for performance
+// purposes. For example, on POSIX-y operating systems, Reserved is usually a
+// private anonymous mmap'd region with PROT_NONE set, and to transition
+// to Ready would require setting PROT_READ|PROT_WRITE. However the
+// underspecification of Prepared lets us use just MADV_FREE to transition from
+// Ready to Prepared. Thus with the Prepared state we can set the permission
+// bits just once early on, we can efficiently tell the OS that it's free to
+// take pages away from us when we don't strictly need them.
+//
+// For each OS there is a common set of helpers defined that transition
+// memory regions between these states. The helpers are as follows:
+//
+// sysAlloc transitions an OS-chosen region of memory from None to Ready.
+// More specifically, it obtains a large chunk of zeroed memory from the
+// operating system, typically on the order of a hundred kilobytes
+// or a megabyte. This memory is always immediately available for use.
 //
-// sysFree returns it unconditionally; this is only used if
-// an out-of-memory error has been detected midway through
-// an allocation. It is okay if sysFree is a no-op.
+// sysFree transitions a memory region from any state to None. Therefore, it
+// returns memory unconditionally. It is used if an out-of-memory error has been
+// detected midway through an allocation or to carve out an aligned section of
+// the address space. It is okay if sysFree is a no-op only if sysReserve always
+// returns a memory region aligned to the heap allocator's alignment
+// restrictions.
 //
-// sysReserve reserves address space without allocating memory.
+// sysReserve transitions a memory region from None to Reserved. It reserves
+// address space in such a way that it would cause a fatal fault upon access
+// (either via permissions or not committing the memory). Such a reservation is
+// thus never backed by physical memory.
 // If the pointer passed to it is non-nil, the caller wants the
 // reservation there, but sysReserve can still choose another
 // location if that one is unavailable.
 // NOTE: sysReserve returns OS-aligned memory, but the heap allocator
 // may use larger alignment, so the caller must be careful to realign the
-// memory obtained by sysAlloc.
+// memory obtained by sysReserve.
 //
-// sysMap maps previously reserved address space for use.
+// sysMap transitions a memory region from Reserved to Prepared. It ensures the
+// memory region can be efficiently transitioned to Ready.
 //
-// sysFault marks a (already sysAlloc'd) region to fault
-// if accessed. Used only for debugging the runtime.
+// sysUsed transitions a memory region from Prepared to Ready. It notifies the
+// operating system that the memory region is needed and ensures that the region
+// may be safely accessed. This is typically a no-op on systems that don't have
+// an explicit commit step and hard over-commit limits, but is critical on
+// Windows, for example.
+//
+// sysUnused transitions a memory region from Ready to Prepared. It notifies the
+// operating system that the physical pages backing this memory region are no
+// longer needed and can be reused for other purposes. The contents of a
+// sysUnused memory region are considered forfeit and the region must not be
+// accessed again until sysUsed is called.
+//
+// sysFault transitions a memory region from Ready or Prepared to Reserved. It
+// marks a region such that it will always fault if accessed. Used only for
+// debugging the runtime.
 
 func mallocinit() {
        if class_to_size[_TinySizeClass] != _TinySize {
@@ -422,7 +450,7 @@ func mallocinit() {
        _g_.m.mcache = allocmcache()
 
        // Create initial arena growth hints.
-       if sys.PtrSize == 8 && GOARCH != "wasm" {
+       if sys.PtrSize == 8 {
                // On a 64-bit machine, we pick the following hints
                // because:
                //
@@ -559,6 +587,9 @@ func mallocinit() {
 // heapArenaBytes. sysAlloc returns nil on failure.
 // There is no corresponding free function.
 //
+// sysAlloc returns a memory region in the Prepared state. This region must
+// be transitioned to Ready before use.
+//
 // h must be locked.
 func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) {
        n = round(n, heapArenaBytes)
@@ -600,7 +631,7 @@ func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) {
                // TODO: This would be cleaner if sysReserve could be
                // told to only return the requested address. In
                // particular, this is already how Windows behaves, so
-               // it would simply things there.
+               // it would simplify things there.
                if v != nil {
                        sysFree(v, n, nil)
                }
@@ -657,7 +688,7 @@ func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) {
                throw("misrounded allocation in sysAlloc")
        }
 
-       // Back the reservation.
+       // Transition from Reserved to Prepared.
        sysMap(v, size, &memstats.heap_sys)
 
 mapped:
@@ -897,7 +928,7 @@ func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
        dataSize := size
        c := gomcache()
        var x unsafe.Pointer
-       noscan := typ == nil || typ.kind&kindNoPointers != 0
+       noscan := typ == nil || typ.ptrdata == 0
        if size <= maxSmallSize {
                if noscan && size < maxTinySize {
                        // Tiny allocator.
@@ -1115,6 +1146,11 @@ func reflect_unsafe_New(typ *_type) unsafe.Pointer {
        return mallocgc(typ.size, typ, true)
 }
 
+//go:linkname reflectlite_unsafe_New internal..z2freflectlite.unsafe_New
+func reflectlite_unsafe_New(typ *_type) unsafe.Pointer {
+       return mallocgc(typ.size, typ, true)
+}
+
 // newarray allocates an array of n elements of type typ.
 func newarray(typ *_type, n int) unsafe.Pointer {
        if n == 1 {
@@ -1317,8 +1353,8 @@ func inPersistentAlloc(p uintptr) bool {
 }
 
 // linearAlloc is a simple linear allocator that pre-reserves a region
-// of memory and then maps that region as needed. The caller is
-// responsible for locking.
+// of memory and then maps that region into the Ready state as needed. The
+// caller is responsible for locking.
 type linearAlloc struct {
        next   uintptr // next free byte
        mapped uintptr // one byte past end of mapped space
@@ -1337,8 +1373,9 @@ func (l *linearAlloc) alloc(size, align uintptr, sysStat *uint64) unsafe.Pointer
        }
        l.next = p + size
        if pEnd := round(l.next-1, physPageSize); pEnd > l.mapped {
-               // We need to map more of the reserved space.
+               // Transition from Reserved to Prepared to Ready.
                sysMap(unsafe.Pointer(l.mapped), pEnd-l.mapped, sysStat)
+               sysUsed(unsafe.Pointer(l.mapped), pEnd-l.mapped)
                l.mapped = pEnd
        }
        return unsafe.Pointer(p)
index eebb2103bb23d728258d22488135526145b417b5..349577b232add6ba88d6f11a98715cafc5c73d67 100644 (file)
@@ -8,7 +8,7 @@ package runtime
 //
 // A map is just a hash table. The data is arranged
 // into an array of buckets. Each bucket contains up to
-// 8 key/value pairs. The low-order bits of the hash are
+// 8 key/elem pairs. The low-order bits of the hash are
 // used to select a bucket. Each bucket contains a few
 // high-order bits of each hash to distinguish the entries
 // within a single bucket.
@@ -33,7 +33,7 @@ package runtime
 // Picking loadFactor: too large and we have lots of overflow
 // buckets, too small and we waste a lot of space. I wrote
 // a simple program to check some stats for different loads:
-// (64-bit, 8 byte keys and values)
+// (64-bit, 8 byte keys and elems)
 //  loadFactor    %overflow  bytes/entry     hitprobe    missprobe
 //        4.00         2.13        20.77         3.00         4.00
 //        4.50         4.05        17.30         3.25         4.50
@@ -46,7 +46,7 @@ package runtime
 //        8.00        41.10         9.40         5.00         8.00
 //
 // %overflow   = percentage of buckets which have an overflow bucket
-// bytes/entry = overhead bytes used per key/value pair
+// bytes/entry = overhead bytes used per key/elem pair
 // hitprobe    = # of entries to check when looking up a present key
 // missprobe   = # of entries to check when looking up an absent key
 //
@@ -76,7 +76,7 @@ import (
 //go:linkname mapiternext
 
 const (
-       // Maximum number of key/value pairs a bucket can hold.
+       // Maximum number of key/elem pairs a bucket can hold.
        bucketCntBits = 3
        bucketCnt     = 1 << bucketCntBits
 
@@ -85,12 +85,12 @@ const (
        loadFactorNum = 13
        loadFactorDen = 2
 
-       // Maximum key or value size to keep inline (instead of mallocing per element).
+       // Maximum key or elem size to keep inline (instead of mallocing per element).
        // Must fit in a uint8.
-       // Fast versions cannot handle big values - the cutoff size for
-       // fast versions in cmd/compile/internal/gc/walk.go must be at most this value.
-       maxKeySize   = 128
-       maxValueSize = 128
+       // Fast versions cannot handle big elems - the cutoff size for
+       // fast versions in cmd/compile/internal/gc/walk.go must be at most this elem.
+       maxKeySize  = 128
+       maxElemSize = 128
 
        // data offset should be the size of the bmap struct, but needs to be
        // aligned correctly. For amd64p32 this means 64-bit alignment
@@ -106,7 +106,7 @@ const (
        // during map writes and thus no one else can observe the map during that time).
        emptyRest      = 0 // this cell is empty, and there are no more non-empty cells at higher indexes or overflows.
        emptyOne       = 1 // this cell is empty
-       evacuatedX     = 2 // key/value is valid.  Entry has been evacuated to first half of larger table.
+       evacuatedX     = 2 // key/elem is valid.  Entry has been evacuated to first half of larger table.
        evacuatedY     = 3 // same as above, but evacuated to second half of larger table.
        evacuatedEmpty = 4 // cell is empty, bucket is evacuated.
        minTopHash     = 5 // minimum tophash for a normal filled cell.
@@ -145,11 +145,11 @@ type hmap struct {
 
 // mapextra holds fields that are not present on all maps.
 type mapextra struct {
-       // If both key and value do not contain pointers and are inline, then we mark bucket
+       // If both key and elem do not contain pointers and are inline, then we mark bucket
        // type as containing no pointers. This avoids scanning such maps.
        // However, bmap.overflow is a pointer. In order to keep overflow buckets
        // alive, we store pointers to all overflow buckets in hmap.extra.overflow and hmap.extra.oldoverflow.
-       // overflow and oldoverflow are only used if key and value do not contain pointers.
+       // overflow and oldoverflow are only used if key and elem do not contain pointers.
        // overflow contains overflow buckets for hmap.buckets.
        // oldoverflow contains overflow buckets for hmap.oldbuckets.
        // The indirection allows to store a pointer to the slice in hiter.
@@ -166,9 +166,9 @@ type bmap struct {
        // for each key in this bucket. If tophash[0] < minTopHash,
        // tophash[0] is a bucket evacuation state instead.
        tophash [bucketCnt]uint8
-       // Followed by bucketCnt keys and then bucketCnt values.
-       // NOTE: packing all the keys together and then all the values together makes the
-       // code a bit more complicated than alternating key/value/key/value/... but it allows
+       // Followed by bucketCnt keys and then bucketCnt elems.
+       // NOTE: packing all the keys together and then all the elems together makes the
+       // code a bit more complicated than alternating key/elem/key/elem/... but it allows
        // us to eliminate padding which would be needed for, e.g., map[int64]int8.
        // Followed by an overflow pointer.
 }
@@ -178,7 +178,7 @@ type bmap struct {
 // the layout of this structure.
 type hiter struct {
        key         unsafe.Pointer // Must be in first position.  Write nil to indicate iteration end (see cmd/internal/gc/range.go).
-       value       unsafe.Pointer // Must be in second position (see cmd/internal/gc/range.go).
+       elem        unsafe.Pointer // Must be in second position (see cmd/internal/gc/range.go).
        t           *maptype
        h           *hmap
        buckets     unsafe.Pointer // bucket ptr at hash_iter initialization time
@@ -196,10 +196,8 @@ type hiter struct {
 
 // bucketShift returns 1<<b, optimized for code generation.
 func bucketShift(b uint8) uintptr {
-       if sys.GoarchAmd64|sys.GoarchAmd64p32|sys.Goarch386 != 0 {
-               b &= sys.PtrSize*8 - 1 // help x86 archs remove shift overflow checks
-       }
-       return uintptr(1) << b
+       // Masking the shift amount allows overflow checks to be elided.
+       return uintptr(1) << (b & (sys.PtrSize*8 - 1))
 }
 
 // bucketMask returns 1<<b - 1, optimized for code generation.
@@ -279,7 +277,7 @@ func (h *hmap) newoverflow(t *maptype, b *bmap) *bmap {
                ovf = (*bmap)(newobject(t.bucket))
        }
        h.incrnoverflow()
-       if t.bucket.kind&kindNoPointers != 0 {
+       if t.bucket.ptrdata == 0 {
                h.createOverflow()
                *h.extra.overflow = append(*h.extra.overflow, ovf)
        }
@@ -303,7 +301,7 @@ func makemap64(t *maptype, hint int64, h *hmap) *hmap {
        return makemap(t, int(hint), h)
 }
 
-// makehmap_small implements Go map creation for make(map[k]v) and
+// makemap_small implements Go map creation for make(map[k]v) and
 // make(map[k]v, hint) when hint is known to be at most bucketCnt
 // at compile time and the map needs to be allocated on the heap.
 func makemap_small() *hmap {
@@ -383,7 +381,7 @@ func makeBucketArray(t *maptype, b uint8, dirtyalloc unsafe.Pointer) (buckets un
                // but may not be empty.
                buckets = dirtyalloc
                size := t.bucket.size * nbuckets
-               if t.bucket.kind&kindNoPointers == 0 {
+               if t.bucket.ptrdata != 0 {
                        memclrHasPointers(buckets, size)
                } else {
                        memclrNoHeapPointers(buckets, size)
@@ -404,7 +402,7 @@ func makeBucketArray(t *maptype, b uint8, dirtyalloc unsafe.Pointer) (buckets un
 }
 
 // mapaccess1 returns a pointer to h[key].  Never returns nil, instead
-// it will return a reference to the zero object for the value type if
+// it will return a reference to the zero object for the elem type if
 // the key is not in the map.
 // NOTE: The returned pointer may keep the whole map live, so don't
 // hold onto it for very long.
@@ -462,11 +460,11 @@ bucketloop:
                                k = *((*unsafe.Pointer)(k))
                        }
                        if equalfn(key, k) {
-                               v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
-                               if t.indirectvalue() {
-                                       v = *((*unsafe.Pointer)(v))
+                               e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+                               if t.indirectelem() {
+                                       e = *((*unsafe.Pointer)(e))
                                }
-                               return v
+                               return e
                        }
                }
        }
@@ -527,18 +525,18 @@ bucketloop:
                                k = *((*unsafe.Pointer)(k))
                        }
                        if equalfn(key, k) {
-                               v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
-                               if t.indirectvalue() {
-                                       v = *((*unsafe.Pointer)(v))
+                               e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+                               if t.indirectelem() {
+                                       e = *((*unsafe.Pointer)(e))
                                }
-                               return v, true
+                               return e, true
                        }
                }
        }
        return unsafe.Pointer(&zeroVal[0]), false
 }
 
-// returns both key and value. Used by map iterator
+// returns both key and elem. Used by map iterator
 func mapaccessK(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, unsafe.Pointer) {
        // Check preemption, since unlike gc we don't check on every call.
        if getg().preempt {
@@ -578,11 +576,11 @@ bucketloop:
                                k = *((*unsafe.Pointer)(k))
                        }
                        if equalfn(key, k) {
-                               v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
-                               if t.indirectvalue() {
-                                       v = *((*unsafe.Pointer)(v))
+                               e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+                               if t.indirectelem() {
+                                       e = *((*unsafe.Pointer)(e))
                                }
-                               return k, v
+                               return k, e
                        }
                }
        }
@@ -590,19 +588,19 @@ bucketloop:
 }
 
 func mapaccess1_fat(t *maptype, h *hmap, key, zero unsafe.Pointer) unsafe.Pointer {
-       v := mapaccess1(t, h, key)
-       if v == unsafe.Pointer(&zeroVal[0]) {
+       e := mapaccess1(t, h, key)
+       if e == unsafe.Pointer(&zeroVal[0]) {
                return zero
        }
-       return v
+       return e
 }
 
 func mapaccess2_fat(t *maptype, h *hmap, key, zero unsafe.Pointer) (unsafe.Pointer, bool) {
-       v := mapaccess1(t, h, key)
-       if v == unsafe.Pointer(&zeroVal[0]) {
+       e := mapaccess1(t, h, key)
+       if e == unsafe.Pointer(&zeroVal[0]) {
                return zero, false
        }
-       return v, true
+       return e, true
 }
 
 // Like mapaccess, but allocates a slot for the key if it is not present in the map.
@@ -649,7 +647,7 @@ again:
 
        var inserti *uint8
        var insertk unsafe.Pointer
-       var val unsafe.Pointer
+       var elem unsafe.Pointer
 bucketloop:
        for {
                for i := uintptr(0); i < bucketCnt; i++ {
@@ -657,7 +655,7 @@ bucketloop:
                                if isEmpty(b.tophash[i]) && inserti == nil {
                                        inserti = &b.tophash[i]
                                        insertk = add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-                                       val = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
+                                       elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
                                }
                                if b.tophash[i] == emptyRest {
                                        break bucketloop
@@ -675,7 +673,7 @@ bucketloop:
                        if t.needkeyupdate() {
                                typedmemmove(t.key, k, key)
                        }
-                       val = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
+                       elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
                        goto done
                }
                ovf := b.overflow(t)
@@ -699,18 +697,18 @@ bucketloop:
                newb := h.newoverflow(t, b)
                inserti = &newb.tophash[0]
                insertk = add(unsafe.Pointer(newb), dataOffset)
-               val = add(insertk, bucketCnt*uintptr(t.keysize))
+               elem = add(insertk, bucketCnt*uintptr(t.keysize))
        }
 
-       // store new key/value at insert position
+       // store new key/elem at insert position
        if t.indirectkey() {
                kmem := newobject(t.key)
                *(*unsafe.Pointer)(insertk) = kmem
                insertk = kmem
        }
-       if t.indirectvalue() {
+       if t.indirectelem() {
                vmem := newobject(t.elem)
-               *(*unsafe.Pointer)(val) = vmem
+               *(*unsafe.Pointer)(elem) = vmem
        }
        typedmemmove(t.key, insertk, key)
        *inserti = top
@@ -721,10 +719,10 @@ done:
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       if t.indirectvalue() {
-               val = *((*unsafe.Pointer)(val))
+       if t.indirectelem() {
+               elem = *((*unsafe.Pointer)(elem))
        }
-       return val
+       return elem
 }
 
 func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {
@@ -782,16 +780,16 @@ search:
                        // Only clear key if there are pointers in it.
                        if t.indirectkey() {
                                *(*unsafe.Pointer)(k) = nil
-                       } else if t.key.kind&kindNoPointers == 0 {
+                       } else if t.key.ptrdata != 0 {
                                memclrHasPointers(k, t.key.size)
                        }
-                       v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
-                       if t.indirectvalue() {
-                               *(*unsafe.Pointer)(v) = nil
-                       } else if t.elem.kind&kindNoPointers == 0 {
-                               memclrHasPointers(v, t.elem.size)
+                       e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+                       if t.indirectelem() {
+                               *(*unsafe.Pointer)(e) = nil
+                       } else if t.elem.ptrdata != 0 {
+                               memclrHasPointers(e, t.elem.size)
                        } else {
-                               memclrNoHeapPointers(v, t.elem.size)
+                               memclrNoHeapPointers(e, t.elem.size)
                        }
                        b.tophash[i] = emptyOne
                        // If the bucket now ends in a bunch of emptyOne states,
@@ -845,15 +843,19 @@ search:
 //  and it's cheaper to zero it here.
 func mapiterinit(t *maptype, h *hmap, it *hiter) {
        it.key = nil
-       it.value = nil
+       it.elem = nil
        it.t = nil
        it.h = nil
        it.buckets = nil
        it.bptr = nil
        it.overflow = nil
        it.oldoverflow = nil
+       it.startBucket = 0
+       it.offset = 0
        it.wrapped = false
+       it.B = 0
        it.i = 0
+       it.bucket = 0
        it.checkBucket = 0
 
        if raceenabled && h != nil {
@@ -874,7 +876,7 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) {
        // grab snapshot of bucket state
        it.B = h.B
        it.buckets = h.buckets
-       if t.bucket.kind&kindNoPointers != 0 {
+       if t.bucket.ptrdata == 0 {
                // Allocate the current slice and remember pointers to both current and old.
                // This preserves all relevant overflow buckets alive even if
                // the table grows and/or overflow buckets are added to the table
@@ -931,7 +933,7 @@ next:
                if bucket == it.startBucket && it.wrapped {
                        // end of iteration
                        it.key = nil
-                       it.value = nil
+                       it.elem = nil
                        return
                }
                if h.growing() && it.B == h.B {
@@ -969,7 +971,7 @@ next:
                if t.indirectkey() {
                        k = *((*unsafe.Pointer)(k))
                }
-               v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+uintptr(offi)*uintptr(t.valuesize))
+               e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+uintptr(offi)*uintptr(t.elemsize))
                if checkBucket != noCheck && !h.sameSizeGrow() {
                        // Special case: iterator was started during a grow to a larger size
                        // and the grow is not done yet. We're working on a bucket whose
@@ -1005,10 +1007,10 @@ next:
                        // key!=key, so the entry can't be deleted or updated, so we can just return it.
                        // That's lucky for us because when key!=key we can't look it up successfully.
                        it.key = k
-                       if t.indirectvalue() {
-                               v = *((*unsafe.Pointer)(v))
+                       if t.indirectelem() {
+                               e = *((*unsafe.Pointer)(e))
                        }
-                       it.value = v
+                       it.elem = e
                } else {
                        // The hash table has grown since the iterator was started.
                        // The golden data for this key is now somewhere else.
@@ -1017,12 +1019,12 @@ next:
                        // has been deleted, updated, or deleted and reinserted.
                        // NOTE: we need to regrab the key as it has potentially been
                        // updated to an equal() but not identical key (e.g. +0.0 vs -0.0).
-                       rk, rv := mapaccessK(t, h, k)
+                       rk, re := mapaccessK(t, h, k)
                        if rk == nil {
                                continue // key has been deleted
                        }
                        it.key = rk
-                       it.value = rv
+                       it.elem = re
                }
                it.bucket = bucket
                if it.bptr != b { // avoid unnecessary write barrier; see issue 14921
@@ -1188,9 +1190,9 @@ func bucketEvacuated(t *maptype, h *hmap, bucket uintptr) bool {
 // evacDst is an evacuation destination.
 type evacDst struct {
        b *bmap          // current destination bucket
-       i int            // key/val index into b
+       i int            // key/elem index into b
        k unsafe.Pointer // pointer to current key storage
-       v unsafe.Pointer // pointer to current value storage
+       e unsafe.Pointer // pointer to current elem storage
 }
 
 func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
@@ -1205,7 +1207,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                x := &xy[0]
                x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
                x.k = add(unsafe.Pointer(x.b), dataOffset)
-               x.v = add(x.k, bucketCnt*uintptr(t.keysize))
+               x.e = add(x.k, bucketCnt*uintptr(t.keysize))
 
                if !h.sameSizeGrow() {
                        // Only calculate y pointers if we're growing bigger.
@@ -1213,13 +1215,13 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                        y := &xy[1]
                        y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
                        y.k = add(unsafe.Pointer(y.b), dataOffset)
-                       y.v = add(y.k, bucketCnt*uintptr(t.keysize))
+                       y.e = add(y.k, bucketCnt*uintptr(t.keysize))
                }
 
                for ; b != nil; b = b.overflow(t) {
                        k := add(unsafe.Pointer(b), dataOffset)
-                       v := add(k, bucketCnt*uintptr(t.keysize))
-                       for i := 0; i < bucketCnt; i, k, v = i+1, add(k, uintptr(t.keysize)), add(v, uintptr(t.valuesize)) {
+                       e := add(k, bucketCnt*uintptr(t.keysize))
+                       for i := 0; i < bucketCnt; i, k, e = i+1, add(k, uintptr(t.keysize)), add(e, uintptr(t.elemsize)) {
                                top := b.tophash[i]
                                if isEmpty(top) {
                                        b.tophash[i] = evacuatedEmpty
@@ -1235,7 +1237,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                                var useY uint8
                                if !h.sameSizeGrow() {
                                        // Compute hash to make our evacuation decision (whether we need
-                                       // to send this key/value to bucket x or bucket y).
+                                       // to send this key/elem to bucket x or bucket y).
                                        hash := t.key.hashfn(k2, uintptr(h.hash0))
                                        if h.flags&iterator != 0 && !t.reflexivekey() && !t.key.equalfn(k2, k2) {
                                                // If key != key (NaNs), then the hash could be (and probably
@@ -1269,30 +1271,30 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                                        dst.b = h.newoverflow(t, dst.b)
                                        dst.i = 0
                                        dst.k = add(unsafe.Pointer(dst.b), dataOffset)
-                                       dst.v = add(dst.k, bucketCnt*uintptr(t.keysize))
+                                       dst.e = add(dst.k, bucketCnt*uintptr(t.keysize))
                                }
                                dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
                                if t.indirectkey() {
                                        *(*unsafe.Pointer)(dst.k) = k2 // copy pointer
                                } else {
-                                       typedmemmove(t.key, dst.k, k) // copy value
+                                       typedmemmove(t.key, dst.k, k) // copy elem
                                }
-                               if t.indirectvalue() {
-                                       *(*unsafe.Pointer)(dst.v) = *(*unsafe.Pointer)(v)
+                               if t.indirectelem() {
+                                       *(*unsafe.Pointer)(dst.e) = *(*unsafe.Pointer)(e)
                                } else {
-                                       typedmemmove(t.elem, dst.v, v)
+                                       typedmemmove(t.elem, dst.e, e)
                                }
                                dst.i++
                                // These updates might push these pointers past the end of the
-                               // key or value arrays.  That's ok, as we have the overflow pointer
+                               // key or elem arrays.  That's ok, as we have the overflow pointer
                                // at the end of the bucket to protect against pointing past the
                                // end of the bucket.
                                dst.k = add(dst.k, uintptr(t.keysize))
-                               dst.v = add(dst.v, uintptr(t.valuesize))
+                               dst.e = add(dst.e, uintptr(t.elemsize))
                        }
                }
-               // Unlink the overflow buckets & clear key/value to help GC.
-               if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 {
+               // Unlink the overflow buckets & clear key/elem to help GC.
+               if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
                        b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
                        // Preserve b.tophash because the evacuation
                        // state is maintained there.
@@ -1347,21 +1349,21 @@ func reflect_makemap(t *maptype, cap int) *hmap {
                t.key.size <= maxKeySize && (t.indirectkey() || t.keysize != uint8(t.key.size)) {
                throw("key size wrong")
        }
-       if t.elem.size > maxValueSize && (!t.indirectvalue() || t.valuesize != uint8(sys.PtrSize)) ||
-               t.elem.size <= maxValueSize && (t.indirectvalue() || t.valuesize != uint8(t.elem.size)) {
-               throw("value size wrong")
+       if t.elem.size > maxElemSize && (!t.indirectelem() || t.elemsize != uint8(sys.PtrSize)) ||
+               t.elem.size <= maxElemSize && (t.indirectelem() || t.elemsize != uint8(t.elem.size)) {
+               throw("elem size wrong")
        }
        if t.key.align > bucketCnt {
                throw("key align too big")
        }
        if t.elem.align > bucketCnt {
-               throw("value align too big")
+               throw("elem align too big")
        }
        if t.key.size%uintptr(t.key.align) != 0 {
                throw("key size not a multiple of key align")
        }
        if t.elem.size%uintptr(t.elem.align) != 0 {
-               throw("value size not a multiple of value align")
+               throw("elem size not a multiple of elem align")
        }
        if bucketCnt < 8 {
                throw("bucketsize too small for proper alignment")
@@ -1370,7 +1372,7 @@ func reflect_makemap(t *maptype, cap int) *hmap {
                throw("need padding in bucket (key)")
        }
        if dataOffset%uintptr(t.elem.align) != 0 {
-               throw("need padding in bucket (value)")
+               throw("need padding in bucket (elem)")
        }
 
        return makemap(t, cap, nil)
@@ -1378,18 +1380,18 @@ func reflect_makemap(t *maptype, cap int) *hmap {
 
 //go:linkname reflect_mapaccess reflect.mapaccess
 func reflect_mapaccess(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
-       val, ok := mapaccess2(t, h, key)
+       elem, ok := mapaccess2(t, h, key)
        if !ok {
                // reflect wants nil for a missing element
-               val = nil
+               elem = nil
        }
-       return val
+       return elem
 }
 
 //go:linkname reflect_mapassign reflect.mapassign
-func reflect_mapassign(t *maptype, h *hmap, key unsafe.Pointer, val unsafe.Pointer) {
+func reflect_mapassign(t *maptype, h *hmap, key unsafe.Pointer, elem unsafe.Pointer) {
        p := mapassign(t, h, key)
-       typedmemmove(t.elem, p, val)
+       typedmemmove(t.elem, p, elem)
 }
 
 //go:linkname reflect_mapdelete reflect.mapdelete
@@ -1414,9 +1416,9 @@ func reflect_mapiterkey(it *hiter) unsafe.Pointer {
        return it.key
 }
 
-//go:linkname reflect_mapitervalue reflect.mapitervalue
-func reflect_mapitervalue(it *hiter) unsafe.Pointer {
-       return it.value
+//go:linkname reflect_mapiterelem reflect.mapiterelem
+func reflect_mapiterelem(it *hiter) unsafe.Pointer {
+       return it.elem
 }
 
 //go:linkname reflect_maplen reflect.maplen
@@ -1431,6 +1433,18 @@ func reflect_maplen(h *hmap) int {
        return h.count
 }
 
+//go:linkname reflectlite_maplen internal..z2freflectlite.maplen
+func reflectlite_maplen(h *hmap) int {
+       if h == nil {
+               return 0
+       }
+       if raceenabled {
+               callerpc := getcallerpc()
+               racereadpc(unsafe.Pointer(h), callerpc, funcPC(reflect_maplen))
+       }
+       return h.count
+}
+
 //go:linkname reflect_ismapkey reflect.ismapkey
 func reflect_ismapkey(t *_type) bool {
        return ismapkey(t)
index 67d6df8c9a325b2353a6662679ff55a273e80893..57b3c0f1c5084ac8582b7f1f8f961482dcc61451 100644 (file)
@@ -50,7 +50,7 @@ func mapaccess1_fast32(t *maptype, h *hmap, key uint32) unsafe.Pointer {
        for ; b != nil; b = b.overflow(t) {
                for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 4) {
                        if *(*uint32)(k) == key && !isEmpty(b.tophash[i]) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize))
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize))
                        }
                }
        }
@@ -90,7 +90,7 @@ func mapaccess2_fast32(t *maptype, h *hmap, key uint32) (unsafe.Pointer, bool) {
        for ; b != nil; b = b.overflow(t) {
                for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 4) {
                        if *(*uint32)(k) == key && !isEmpty(b.tophash[i]) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)), true
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize)), true
                        }
                }
        }
@@ -179,12 +179,12 @@ bucketloop:
        h.count++
 
 done:
-       val := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.valuesize))
+       elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.elemsize))
        if h.flags&hashWriting == 0 {
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       return val
+       return elem
 }
 
 func mapassign_fast32ptr(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
@@ -269,12 +269,12 @@ bucketloop:
        h.count++
 
 done:
-       val := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.valuesize))
+       elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.elemsize))
        if h.flags&hashWriting == 0 {
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       return val
+       return elem
 }
 
 func mapdelete_fast32(t *maptype, h *hmap, key uint32) {
@@ -307,14 +307,14 @@ search:
                                continue
                        }
                        // Only clear key if there are pointers in it.
-                       if t.key.kind&kindNoPointers == 0 {
+                       if t.key.ptrdata != 0 {
                                memclrHasPointers(k, t.key.size)
                        }
-                       v := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize))
-                       if t.elem.kind&kindNoPointers == 0 {
-                               memclrHasPointers(v, t.elem.size)
+                       e := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize))
+                       if t.elem.ptrdata != 0 {
+                               memclrHasPointers(e, t.elem.size)
                        } else {
-                               memclrNoHeapPointers(v, t.elem.size)
+                               memclrNoHeapPointers(e, t.elem.size)
                        }
                        b.tophash[i] = emptyOne
                        // If the bucket now ends in a bunch of emptyOne states,
@@ -381,7 +381,7 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) {
                x := &xy[0]
                x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
                x.k = add(unsafe.Pointer(x.b), dataOffset)
-               x.v = add(x.k, bucketCnt*4)
+               x.e = add(x.k, bucketCnt*4)
 
                if !h.sameSizeGrow() {
                        // Only calculate y pointers if we're growing bigger.
@@ -389,13 +389,13 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) {
                        y := &xy[1]
                        y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
                        y.k = add(unsafe.Pointer(y.b), dataOffset)
-                       y.v = add(y.k, bucketCnt*4)
+                       y.e = add(y.k, bucketCnt*4)
                }
 
                for ; b != nil; b = b.overflow(t) {
                        k := add(unsafe.Pointer(b), dataOffset)
-                       v := add(k, bucketCnt*4)
-                       for i := 0; i < bucketCnt; i, k, v = i+1, add(k, 4), add(v, uintptr(t.valuesize)) {
+                       e := add(k, bucketCnt*4)
+                       for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 4), add(e, uintptr(t.elemsize)) {
                                top := b.tophash[i]
                                if isEmpty(top) {
                                        b.tophash[i] = evacuatedEmpty
@@ -407,7 +407,7 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) {
                                var useY uint8
                                if !h.sameSizeGrow() {
                                        // Compute hash to make our evacuation decision (whether we need
-                                       // to send this key/value to bucket x or bucket y).
+                                       // to send this key/elem to bucket x or bucket y).
                                        hash := t.key.hashfn(k, uintptr(h.hash0))
                                        if hash&newbit != 0 {
                                                useY = 1
@@ -421,30 +421,30 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) {
                                        dst.b = h.newoverflow(t, dst.b)
                                        dst.i = 0
                                        dst.k = add(unsafe.Pointer(dst.b), dataOffset)
-                                       dst.v = add(dst.k, bucketCnt*4)
+                                       dst.e = add(dst.k, bucketCnt*4)
                                }
                                dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
 
                                // Copy key.
-                               if sys.PtrSize == 4 && t.key.kind&kindNoPointers == 0 && writeBarrier.enabled {
+                               if sys.PtrSize == 4 && t.key.ptrdata != 0 && writeBarrier.enabled {
                                        // Write with a write barrier.
                                        *(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k)
                                } else {
                                        *(*uint32)(dst.k) = *(*uint32)(k)
                                }
 
-                               typedmemmove(t.elem, dst.v, v)
+                               typedmemmove(t.elem, dst.e, e)
                                dst.i++
                                // These updates might push these pointers past the end of the
-                               // key or value arrays.  That's ok, as we have the overflow pointer
+                               // key or elem arrays.  That's ok, as we have the overflow pointer
                                // at the end of the bucket to protect against pointing past the
                                // end of the bucket.
                                dst.k = add(dst.k, 4)
-                               dst.v = add(dst.v, uintptr(t.valuesize))
+                               dst.e = add(dst.e, uintptr(t.elemsize))
                        }
                }
-               // Unlink the overflow buckets & clear key/value to help GC.
-               if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 {
+               // Unlink the overflow buckets & clear key/elem to help GC.
+               if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
                        b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
                        // Preserve b.tophash because the evacuation
                        // state is maintained there.
index b62ecb106cc090941f842ec79cf3eddabb03c52e..af86f747f057ed94ca0a0dafc78664285c056386 100644 (file)
@@ -50,7 +50,7 @@ func mapaccess1_fast64(t *maptype, h *hmap, key uint64) unsafe.Pointer {
        for ; b != nil; b = b.overflow(t) {
                for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 8) {
                        if *(*uint64)(k) == key && !isEmpty(b.tophash[i]) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize))
                        }
                }
        }
@@ -90,7 +90,7 @@ func mapaccess2_fast64(t *maptype, h *hmap, key uint64) (unsafe.Pointer, bool) {
        for ; b != nil; b = b.overflow(t) {
                for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 8) {
                        if *(*uint64)(k) == key && !isEmpty(b.tophash[i]) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize)), true
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize)), true
                        }
                }
        }
@@ -179,12 +179,12 @@ bucketloop:
        h.count++
 
 done:
-       val := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.valuesize))
+       elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.elemsize))
        if h.flags&hashWriting == 0 {
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       return val
+       return elem
 }
 
 func mapassign_fast64ptr(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
@@ -269,12 +269,12 @@ bucketloop:
        h.count++
 
 done:
-       val := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.valuesize))
+       elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.elemsize))
        if h.flags&hashWriting == 0 {
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       return val
+       return elem
 }
 
 func mapdelete_fast64(t *maptype, h *hmap, key uint64) {
@@ -307,14 +307,14 @@ search:
                                continue
                        }
                        // Only clear key if there are pointers in it.
-                       if t.key.kind&kindNoPointers == 0 {
+                       if t.key.ptrdata != 0 {
                                memclrHasPointers(k, t.key.size)
                        }
-                       v := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
-                       if t.elem.kind&kindNoPointers == 0 {
-                               memclrHasPointers(v, t.elem.size)
+                       e := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize))
+                       if t.elem.ptrdata != 0 {
+                               memclrHasPointers(e, t.elem.size)
                        } else {
-                               memclrNoHeapPointers(v, t.elem.size)
+                               memclrNoHeapPointers(e, t.elem.size)
                        }
                        b.tophash[i] = emptyOne
                        // If the bucket now ends in a bunch of emptyOne states,
@@ -381,7 +381,7 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
                x := &xy[0]
                x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
                x.k = add(unsafe.Pointer(x.b), dataOffset)
-               x.v = add(x.k, bucketCnt*8)
+               x.e = add(x.k, bucketCnt*8)
 
                if !h.sameSizeGrow() {
                        // Only calculate y pointers if we're growing bigger.
@@ -389,13 +389,13 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
                        y := &xy[1]
                        y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
                        y.k = add(unsafe.Pointer(y.b), dataOffset)
-                       y.v = add(y.k, bucketCnt*8)
+                       y.e = add(y.k, bucketCnt*8)
                }
 
                for ; b != nil; b = b.overflow(t) {
                        k := add(unsafe.Pointer(b), dataOffset)
-                       v := add(k, bucketCnt*8)
-                       for i := 0; i < bucketCnt; i, k, v = i+1, add(k, 8), add(v, uintptr(t.valuesize)) {
+                       e := add(k, bucketCnt*8)
+                       for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 8), add(e, uintptr(t.elemsize)) {
                                top := b.tophash[i]
                                if isEmpty(top) {
                                        b.tophash[i] = evacuatedEmpty
@@ -407,7 +407,7 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
                                var useY uint8
                                if !h.sameSizeGrow() {
                                        // Compute hash to make our evacuation decision (whether we need
-                                       // to send this key/value to bucket x or bucket y).
+                                       // to send this key/elem to bucket x or bucket y).
                                        hash := t.key.hashfn(k, uintptr(h.hash0))
                                        if hash&newbit != 0 {
                                                useY = 1
@@ -421,12 +421,12 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
                                        dst.b = h.newoverflow(t, dst.b)
                                        dst.i = 0
                                        dst.k = add(unsafe.Pointer(dst.b), dataOffset)
-                                       dst.v = add(dst.k, bucketCnt*8)
+                                       dst.e = add(dst.k, bucketCnt*8)
                                }
                                dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
 
                                // Copy key.
-                               if t.key.kind&kindNoPointers == 0 && writeBarrier.enabled {
+                               if t.key.ptrdata != 0 && writeBarrier.enabled {
                                        if sys.PtrSize == 8 {
                                                // Write with a write barrier.
                                                *(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k)
@@ -439,18 +439,18 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
                                        *(*uint64)(dst.k) = *(*uint64)(k)
                                }
 
-                               typedmemmove(t.elem, dst.v, v)
+                               typedmemmove(t.elem, dst.e, e)
                                dst.i++
                                // These updates might push these pointers past the end of the
-                               // key or value arrays.  That's ok, as we have the overflow pointer
+                               // key or elem arrays.  That's ok, as we have the overflow pointer
                                // at the end of the bucket to protect against pointing past the
                                // end of the bucket.
                                dst.k = add(dst.k, 8)
-                               dst.v = add(dst.v, uintptr(t.valuesize))
+                               dst.e = add(dst.e, uintptr(t.elemsize))
                        }
                }
-               // Unlink the overflow buckets & clear key/value to help GC.
-               if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 {
+               // Unlink the overflow buckets & clear key/elem to help GC.
+               if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
                        b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
                        // Preserve b.tophash because the evacuation
                        // state is maintained there.
index 2202695a45bbd9ba31e767d73f67abdd733f7417..3c5175d96869480df5a5d54e96a801fee78d354d 100644 (file)
@@ -42,7 +42,7 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
                                        continue
                                }
                                if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-                                       return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
+                                       return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize))
                                }
                        }
                        return unsafe.Pointer(&zeroVal[0])
@@ -58,7 +58,7 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
                                continue
                        }
                        if k.str == key.str {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize))
                        }
                        // check first 4 bytes
                        if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
@@ -77,7 +77,7 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
                if keymaybe != bucketCnt {
                        k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*sys.PtrSize))
                        if memequal(k.str, key.str, uintptr(key.len)) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.valuesize))
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.elemsize))
                        }
                }
                return unsafe.Pointer(&zeroVal[0])
@@ -104,7 +104,7 @@ dohash:
                                continue
                        }
                        if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize))
                        }
                }
        }
@@ -137,7 +137,7 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
                                        continue
                                }
                                if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-                                       return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
+                                       return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize)), true
                                }
                        }
                        return unsafe.Pointer(&zeroVal[0]), false
@@ -153,7 +153,7 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
                                continue
                        }
                        if k.str == key.str {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize)), true
                        }
                        // check first 4 bytes
                        if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
@@ -172,7 +172,7 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
                if keymaybe != bucketCnt {
                        k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*sys.PtrSize))
                        if memequal(k.str, key.str, uintptr(key.len)) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.valuesize)), true
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.elemsize)), true
                        }
                }
                return unsafe.Pointer(&zeroVal[0]), false
@@ -199,7 +199,7 @@ dohash:
                                continue
                        }
                        if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
+                               return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize)), true
                        }
                }
        }
@@ -293,12 +293,12 @@ bucketloop:
        h.count++
 
 done:
-       val := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*sys.PtrSize+inserti*uintptr(t.valuesize))
+       elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*sys.PtrSize+inserti*uintptr(t.elemsize))
        if h.flags&hashWriting == 0 {
                throw("concurrent map writes")
        }
        h.flags &^= hashWriting
-       return val
+       return elem
 }
 
 func mapdelete_faststr(t *maptype, h *hmap, ky string) {
@@ -338,11 +338,11 @@ search:
                        }
                        // Clear key's pointer.
                        k.str = nil
-                       v := add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
-                       if t.elem.kind&kindNoPointers == 0 {
-                               memclrHasPointers(v, t.elem.size)
+                       e := add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.elemsize))
+                       if t.elem.ptrdata != 0 {
+                               memclrHasPointers(e, t.elem.size)
                        } else {
-                               memclrNoHeapPointers(v, t.elem.size)
+                               memclrNoHeapPointers(e, t.elem.size)
                        }
                        b.tophash[i] = emptyOne
                        // If the bucket now ends in a bunch of emptyOne states,
@@ -409,7 +409,7 @@ func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) {
                x := &xy[0]
                x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
                x.k = add(unsafe.Pointer(x.b), dataOffset)
-               x.v = add(x.k, bucketCnt*2*sys.PtrSize)
+               x.e = add(x.k, bucketCnt*2*sys.PtrSize)
 
                if !h.sameSizeGrow() {
                        // Only calculate y pointers if we're growing bigger.
@@ -417,13 +417,13 @@ func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) {
                        y := &xy[1]
                        y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
                        y.k = add(unsafe.Pointer(y.b), dataOffset)
-                       y.v = add(y.k, bucketCnt*2*sys.PtrSize)
+                       y.e = add(y.k, bucketCnt*2*sys.PtrSize)
                }
 
                for ; b != nil; b = b.overflow(t) {
                        k := add(unsafe.Pointer(b), dataOffset)
-                       v := add(k, bucketCnt*2*sys.PtrSize)
-                       for i := 0; i < bucketCnt; i, k, v = i+1, add(k, 2*sys.PtrSize), add(v, uintptr(t.valuesize)) {
+                       e := add(k, bucketCnt*2*sys.PtrSize)
+                       for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 2*sys.PtrSize), add(e, uintptr(t.elemsize)) {
                                top := b.tophash[i]
                                if isEmpty(top) {
                                        b.tophash[i] = evacuatedEmpty
@@ -435,7 +435,7 @@ func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) {
                                var useY uint8
                                if !h.sameSizeGrow() {
                                        // Compute hash to make our evacuation decision (whether we need
-                                       // to send this key/value to bucket x or bucket y).
+                                       // to send this key/elem to bucket x or bucket y).
                                        hash := t.key.hashfn(k, uintptr(h.hash0))
                                        if hash&newbit != 0 {
                                                useY = 1
@@ -449,26 +449,25 @@ func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) {
                                        dst.b = h.newoverflow(t, dst.b)
                                        dst.i = 0
                                        dst.k = add(unsafe.Pointer(dst.b), dataOffset)
-                                       dst.v = add(dst.k, bucketCnt*2*sys.PtrSize)
+                                       dst.e = add(dst.k, bucketCnt*2*sys.PtrSize)
                                }
                                dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
 
                                // Copy key.
                                *(*string)(dst.k) = *(*string)(k)
 
-                               typedmemmove(t.elem, dst.v, v)
+                               typedmemmove(t.elem, dst.e, e)
                                dst.i++
                                // These updates might push these pointers past the end of the
-                               // key or value arrays.  That's ok, as we have the overflow pointer
+                               // key or elem arrays.  That's ok, as we have the overflow pointer
                                // at the end of the bucket to protect against pointing past the
                                // end of the bucket.
                                dst.k = add(dst.k, 2*sys.PtrSize)
-                               dst.v = add(dst.v, uintptr(t.valuesize))
+                               dst.e = add(dst.e, uintptr(t.elemsize))
                        }
                }
-               // Unlink the overflow buckets & clear key/value to help GC.
-               // Unlink the overflow buckets & clear key/value to help GC.
-               if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 {
+               // Unlink the overflow buckets & clear key/elem to help GC.
+               if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
                        b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
                        // Preserve b.tophash because the evacuation
                        // state is maintained there.
index 00e5eb8baa525a9eb1e9c72f88f050f188cdd9dc..e66b50d1927e32b786b2a08debe6ff634a0580ae 100644 (file)
@@ -163,7 +163,7 @@ func typedmemmove(typ *_type, dst, src unsafe.Pointer) {
        if dst == src {
                return
        }
-       if typ.kind&kindNoPointers == 0 {
+       if typ.ptrdata != 0 {
                bulkBarrierPreWrite(uintptr(dst), uintptr(src), typ.size)
        }
        // There's a race here: if some other goroutine can write to
@@ -192,11 +192,16 @@ func reflect_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
        typedmemmove(typ, dst, src)
 }
 
+//go:linkname reflectlite_typedmemmove internal..z2freflectlite.typedmemmove
+func reflectlite_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
+       reflect_typedmemmove(typ, dst, src)
+}
+
 // typedmemmovepartial is like typedmemmove but assumes that
 // dst and src point off bytes into the value and only copies size bytes.
 //go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
 func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
-       if writeBarrier.needed && typ.kind&kindNoPointers == 0 && size >= sys.PtrSize {
+       if writeBarrier.needed && typ.ptrdata != 0 && size >= sys.PtrSize {
                // Pointer-align start address for bulk barrier.
                adst, asrc, asize := dst, src, size
                if frag := -off & (sys.PtrSize - 1); frag != 0 {
@@ -248,7 +253,7 @@ func typedslicecopy(typ *_type, dst, src slice) int {
                return n
        }
 
-       // Note: No point in checking typ.kind&kindNoPointers here:
+       // Note: No point in checking typ.ptrdata here:
        // compiler only emits calls to typedslicecopy for types with pointers,
        // and growslice and reflect_typedslicecopy check for pointers
        // before calling typedslicecopy.
@@ -264,7 +269,7 @@ func typedslicecopy(typ *_type, dst, src slice) int {
 
 //go:linkname reflect_typedslicecopy reflect.typedslicecopy
 func reflect_typedslicecopy(elemType *_type, dst, src slice) int {
-       if elemType.kind&kindNoPointers != 0 {
+       if elemType.ptrdata == 0 {
                n := dst.len
                if n > src.len {
                        n = src.len
@@ -301,7 +306,7 @@ func reflect_typedslicecopy(elemType *_type, dst, src slice) int {
 //
 //go:nosplit
 func typedmemclr(typ *_type, ptr unsafe.Pointer) {
-       if typ.kind&kindNoPointers == 0 {
+       if typ.ptrdata != 0 {
                bulkBarrierPreWrite(uintptr(ptr), 0, typ.size)
        }
        memclrNoHeapPointers(ptr, typ.size)
@@ -314,7 +319,7 @@ func reflect_typedmemclr(typ *_type, ptr unsafe.Pointer) {
 
 //go:linkname reflect_typedmemclrpartial reflect.typedmemclrpartial
 func reflect_typedmemclrpartial(typ *_type, ptr unsafe.Pointer, off, size uintptr) {
-       if typ.kind&kindNoPointers == 0 {
+       if typ.ptrdata != 0 {
                bulkBarrierPreWrite(uintptr(ptr), 0, size)
        }
        memclrNoHeapPointers(ptr, size)
@@ -322,7 +327,7 @@ func reflect_typedmemclrpartial(typ *_type, ptr unsafe.Pointer, off, size uintpt
 
 // memclrHasPointers clears n bytes of typed memory starting at ptr.
 // The caller must ensure that the type of the object at ptr has
-// pointers, usually by checking typ.kind&kindNoPointers. However, ptr
+// pointers, usually by checking typ.ptrdata. However, ptr
 // does not have to point to the start of the allocation.
 //
 //go:nosplit
index 9c25a215f35a3701eecc815d48f336f657a1cac1..b84fe0fc6c4986d0734eba2d871d4039115b980f 100644 (file)
@@ -595,7 +595,7 @@ func (h heapBits) setCheckmarked(size uintptr) {
 // The pointer bitmap is not maintained for allocations containing
 // no pointers at all; any caller of bulkBarrierPreWrite must first
 // make sure the underlying allocation contains pointers, usually
-// by checking typ.kind&kindNoPointers.
+// by checking typ.ptrdata.
 //
 // Callers must perform cgo checks if writeBarrier.cgo.
 //
@@ -1687,15 +1687,12 @@ Run:
                        if n == 0 {
                                // Program is over; continue in trailer if present.
                                if trailer != nil {
-                                       //println("trailer")
                                        p = trailer
                                        trailer = nil
                                        continue
                                }
-                               //println("done")
                                break Run
                        }
-                       //println("lit", n, dst)
                        nbyte := n / 8
                        for i := uintptr(0); i < nbyte; i++ {
                                bits |= uintptr(*p) << nbits
index 2045158636a814cf23ae94945dd9f75d6c50fe98..ca926827e1152f10710dacbdc4613a5e3e397b94 100644 (file)
@@ -76,10 +76,13 @@ func (p gclinkptr) ptr() *gclink {
 var emptymspan mspan
 
 func allocmcache() *mcache {
-       lock(&mheap_.lock)
-       c := (*mcache)(mheap_.cachealloc.alloc())
-       c.flushGen = mheap_.sweepgen
-       unlock(&mheap_.lock)
+       var c *mcache
+       systemstack(func() {
+               lock(&mheap_.lock)
+               c = (*mcache)(mheap_.cachealloc.alloc())
+               c.flushGen = mheap_.sweepgen
+               unlock(&mheap_.lock)
+       })
        for i := range c.alloc {
                c.alloc[i] = &emptymspan
        }
index a60eb9fd0ca5bc753f13228edf5c13610caa30b6..cd5901054ae4ea94049dc1c3a861d84ac3f3ffc7 100644 (file)
@@ -251,16 +251,16 @@ func (c *mcentral) freeSpan(s *mspan, preserve bool, wasempty bool) bool {
 func (c *mcentral) grow() *mspan {
        npages := uintptr(class_to_allocnpages[c.spanclass.sizeclass()])
        size := uintptr(class_to_size[c.spanclass.sizeclass()])
-       n := (npages << _PageShift) / size
 
        s := mheap_.alloc(npages, c.spanclass, false, true)
        if s == nil {
                return nil
        }
 
-       p := s.base()
-       s.limit = p + size*n
-
+       // Use division by multiplication and shifts to quickly compute:
+       // n := (npages << _PageShift) / size
+       n := (npages << _PageShift) >> s.divShift * uintptr(s.divMul) >> s.divShift2
+       s.limit = s.base() + size*n
        heapBitsForAddr(s.base()).initSpan(s)
        return s
 }
index 5ce816c323a4df368bef92a36c15f9df6ed77a52..ba38ebaa9ab7c70e371b4cf1ceb3b444c2a6ad10 100644 (file)
@@ -7,7 +7,6 @@
 package runtime
 
 import (
-       "runtime/internal/sys"
        "unsafe"
 )
 
@@ -92,37 +91,35 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
        // gets most of the benefit of huge pages while keeping the
        // number of VMAs under control. With hugePageSize = 2MB, even
        // a pessimal heap can reach 128GB before running out of VMAs.
-       if sys.HugePageSize != 0 && _MADV_NOHUGEPAGE != 0 {
-               var s uintptr = sys.HugePageSize // division by constant 0 is a compile-time error :(
-
+       if physHugePageSize != 0 && _MADV_NOHUGEPAGE != 0 {
                // If it's a large allocation, we want to leave huge
                // pages enabled. Hence, we only adjust the huge page
                // flag on the huge pages containing v and v+n-1, and
                // only if those aren't aligned.
                var head, tail uintptr
-               if uintptr(v)%s != 0 {
+               if uintptr(v)%physHugePageSize != 0 {
                        // Compute huge page containing v.
-                       head = uintptr(v) &^ (s - 1)
+                       head = uintptr(v) &^ (physHugePageSize - 1)
                }
-               if (uintptr(v)+n)%s != 0 {
+               if (uintptr(v)+n)%physHugePageSize != 0 {
                        // Compute huge page containing v+n-1.
-                       tail = (uintptr(v) + n - 1) &^ (s - 1)
+                       tail = (uintptr(v) + n - 1) &^ (physHugePageSize - 1)
                }
 
                // Note that madvise will return EINVAL if the flag is
                // already set, which is quite likely. We ignore
                // errors.
-               if head != 0 && head+sys.HugePageSize == tail {
+               if head != 0 && head+physHugePageSize == tail {
                        // head and tail are different but adjacent,
                        // so do this in one call.
-                       madvise(unsafe.Pointer(head), 2*sys.HugePageSize, _MADV_NOHUGEPAGE)
+                       madvise(unsafe.Pointer(head), 2*physHugePageSize, _MADV_NOHUGEPAGE)
                } else {
                        // Advise the huge pages containing v and v+n-1.
                        if head != 0 {
-                               madvise(unsafe.Pointer(head), sys.HugePageSize, _MADV_NOHUGEPAGE)
+                               madvise(unsafe.Pointer(head), physHugePageSize, _MADV_NOHUGEPAGE)
                        }
                        if tail != 0 && tail != head {
-                               madvise(unsafe.Pointer(tail), sys.HugePageSize, _MADV_NOHUGEPAGE)
+                               madvise(unsafe.Pointer(tail), physHugePageSize, _MADV_NOHUGEPAGE)
                        }
                }
        }
@@ -142,21 +139,23 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
 }
 
 func sysUsed(v unsafe.Pointer, n uintptr) {
-       if sys.HugePageSize != 0 && _MADV_HUGEPAGE != 0 {
-               // Partially undo the NOHUGEPAGE marks from sysUnused
-               // for whole huge pages between v and v+n. This may
-               // leave huge pages off at the end points v and v+n
-               // even though allocations may cover these entire huge
-               // pages. We could detect this and undo NOHUGEPAGE on
-               // the end points as well, but it's probably not worth
-               // the cost because when neighboring allocations are
-               // freed sysUnused will just set NOHUGEPAGE again.
-               var s uintptr = sys.HugePageSize
+       // Partially undo the NOHUGEPAGE marks from sysUnused
+       // for whole huge pages between v and v+n. This may
+       // leave huge pages off at the end points v and v+n
+       // even though allocations may cover these entire huge
+       // pages. We could detect this and undo NOHUGEPAGE on
+       // the end points as well, but it's probably not worth
+       // the cost because when neighboring allocations are
+       // freed sysUnused will just set NOHUGEPAGE again.
+       sysHugePage(v, n)
+}
 
+func sysHugePage(v unsafe.Pointer, n uintptr) {
+       if physHugePageSize != 0 && _MADV_HUGEPAGE != 0 {
                // Round v up to a huge page boundary.
-               beg := (uintptr(v) + (s - 1)) &^ (s - 1)
+               beg := (uintptr(v) + (physHugePageSize - 1)) &^ (physHugePageSize - 1)
                // Round v+n down to a huge page boundary.
-               end := (uintptr(v) + n) &^ (s - 1)
+               end := (uintptr(v) + n) &^ (physHugePageSize - 1)
 
                if beg < end {
                        madvise(unsafe.Pointer(beg), end-beg, _MADV_HUGEPAGE)
index b490cd815f5f91f2e309a24285603ad389c7ac92..0b2e19123d350cd7dac32fb469269f3fb1c93300 100644 (file)
@@ -15,6 +15,9 @@ import (
 )
 
 func TestMemmove(t *testing.T) {
+       if *flagQuick {
+               t.Skip("-quick")
+       }
        t.Parallel()
        size := 256
        if testing.Short() {
@@ -54,6 +57,9 @@ func TestMemmove(t *testing.T) {
 }
 
 func TestMemmoveAlias(t *testing.T) {
+       if *flagQuick {
+               t.Skip("-quick")
+       }
        t.Parallel()
        size := 256
        if testing.Short() {
index caf2e7e1cce4d4be21423d0e8ab076681660e88f..2ca6280da346d027b11e73ca1d904f49260b6d22 100644 (file)
@@ -318,7 +318,7 @@ func SetFinalizer(obj interface{}, finalizer interface{}) {
        if uintptr(e.data) != base {
                // As an implementation detail we allow to set finalizers for an inner byte
                // of an object if it could come from tiny alloc (see mallocgc for details).
-               if ot.elem == nil || ot.elem.kind&kindNoPointers == 0 || ot.elem.size >= maxTinySize {
+               if ot.elem == nil || ot.elem.ptrdata != 0 || ot.elem.size >= maxTinySize {
                        throw("runtime.SetFinalizer: pointer not at beginning of allocated block")
                }
        }
index b8c91ac29a1c240f7bebdaac5ca5e3d15913f7e9..46b7334e910b105edef703373046a40710c4daae 100644 (file)
@@ -141,7 +141,7 @@ const (
 
        // sweepMinHeapDistance is a lower bound on the heap distance
        // (in bytes) reserved for concurrent sweeping between GC
-       // cycles. This will be scaled by gcpercent/100.
+       // cycles.
        sweepMinHeapDistance = 1024 * 1024
 )
 
@@ -202,27 +202,35 @@ func readgogc() int32 {
 
 // gcenable is called after the bulk of the runtime initialization,
 // just before we're about to start letting user code run.
-// It kicks off the background sweeper goroutine and enables GC.
+// It kicks off the background sweeper goroutine, the background
+// scavenger goroutine, and enables GC.
 func gcenable() {
-       c := make(chan int, 1)
+       // Kick off sweeping and scavenging.
+       c := make(chan int, 2)
        expectSystemGoroutine()
        go bgsweep(c)
+       expectSystemGoroutine()
+       go bgscavenge(c)
+       <-c
        <-c
        memstats.enablegc = true // now that runtime is initialized, GC is okay
 }
 
 //go:linkname setGCPercent runtime..z2fdebug.setGCPercent
 func setGCPercent(in int32) (out int32) {
-       lock(&mheap_.lock)
-       out = gcpercent
-       if in < 0 {
-               in = -1
-       }
-       gcpercent = in
-       heapminimum = defaultHeapMinimum * uint64(gcpercent) / 100
-       // Update pacing in response to gcpercent change.
-       gcSetTriggerRatio(memstats.triggerRatio)
-       unlock(&mheap_.lock)
+       // Run on the system stack since we grab the heap lock.
+       systemstack(func() {
+               lock(&mheap_.lock)
+               out = gcpercent
+               if in < 0 {
+                       in = -1
+               }
+               gcpercent = in
+               heapminimum = defaultHeapMinimum * uint64(gcpercent) / 100
+               // Update pacing in response to gcpercent change.
+               gcSetTriggerRatio(memstats.triggerRatio)
+               unlock(&mheap_.lock)
+       })
 
        // If we just disabled GC, wait for any concurrent GC mark to
        // finish so we always return with no GC running.
@@ -405,23 +413,6 @@ func (c *gcControllerState) startCycle() {
        c.fractionalMarkTime = 0
        c.idleMarkTime = 0
 
-       // If this is the first GC cycle or we're operating on a very
-       // small heap, fake heap_marked so it looks like gc_trigger is
-       // the appropriate growth from heap_marked, even though the
-       // real heap_marked may not have a meaningful value (on the
-       // first cycle) or may be much smaller (resulting in a large
-       // error response).
-       if memstats.gc_trigger <= heapminimum {
-               memstats.heap_marked = uint64(float64(memstats.gc_trigger) / (1 + memstats.triggerRatio))
-       }
-
-       // Re-compute the heap goal for this cycle in case something
-       // changed. This is the same calculation we use elsewhere.
-       memstats.next_gc = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100
-       if gcpercent < 0 {
-               memstats.next_gc = ^uint64(0)
-       }
-
        // Ensure that the heap goal is at least a little larger than
        // the current live heap size. This may not be the case if GC
        // start is delayed or if the allocation that pushed heap_live
@@ -586,7 +577,7 @@ func (c *gcControllerState) endCycle() float64 {
        // growth if we had the desired CPU utilization). The
        // difference between this estimate and the GOGC-based goal
        // heap growth is the error.
-       goalGrowthRatio := float64(gcpercent) / 100
+       goalGrowthRatio := gcEffectiveGrowthRatio()
        actualGrowthRatio := float64(memstats.heap_live)/float64(memstats.heap_marked) - 1
        assistDuration := nanotime() - c.markStartTime
 
@@ -766,6 +757,14 @@ func pollFractionalWorkerExit() bool {
 //
 // mheap_.lock must be held or the world must be stopped.
 func gcSetTriggerRatio(triggerRatio float64) {
+       // Compute the next GC goal, which is when the allocated heap
+       // has grown by GOGC/100 over the heap marked by the last
+       // cycle.
+       goal := ^uint64(0)
+       if gcpercent >= 0 {
+               goal = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100
+       }
+
        // Set the trigger ratio, capped to reasonable bounds.
        if triggerRatio < 0 {
                // This can happen if the mutator is allocating very
@@ -796,7 +795,7 @@ func gcSetTriggerRatio(triggerRatio float64) {
                        // that concurrent sweep has some heap growth
                        // in which to perform sweeping before we
                        // start the next GC cycle.
-                       sweepMin := atomic.Load64(&memstats.heap_live) + sweepMinHeapDistance*uint64(gcpercent)/100
+                       sweepMin := atomic.Load64(&memstats.heap_live) + sweepMinHeapDistance
                        if sweepMin > minTrigger {
                                minTrigger = sweepMin
                        }
@@ -808,22 +807,16 @@ func gcSetTriggerRatio(triggerRatio float64) {
                        print("runtime: next_gc=", memstats.next_gc, " heap_marked=", memstats.heap_marked, " heap_live=", memstats.heap_live, " initialHeapLive=", work.initialHeapLive, "triggerRatio=", triggerRatio, " minTrigger=", minTrigger, "\n")
                        throw("gc_trigger underflow")
                }
-       }
-       memstats.gc_trigger = trigger
-
-       // Compute the next GC goal, which is when the allocated heap
-       // has grown by GOGC/100 over the heap marked by the last
-       // cycle.
-       goal := ^uint64(0)
-       if gcpercent >= 0 {
-               goal = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100
-               if goal < trigger {
+               if trigger > goal {
                        // The trigger ratio is always less than GOGC/100, but
                        // other bounds on the trigger may have raised it.
                        // Push up the goal, too.
                        goal = trigger
                }
        }
+
+       // Commit to the trigger and goal.
+       memstats.gc_trigger = trigger
        memstats.next_gc = goal
        if trace.enabled {
                traceNextGC()
@@ -866,6 +859,26 @@ func gcSetTriggerRatio(triggerRatio float64) {
                        atomic.Store64(&mheap_.pagesSweptBasis, pagesSwept)
                }
        }
+
+       gcPaceScavenger()
+}
+
+// gcEffectiveGrowthRatio returns the current effective heap growth
+// ratio (GOGC/100) based on heap_marked from the previous GC and
+// next_gc for the current GC.
+//
+// This may differ from gcpercent/100 because of various upper and
+// lower bounds on gcpercent. For example, if the heap is smaller than
+// heapminimum, this can be higher than gcpercent/100.
+//
+// mheap_.lock must be held or the world must be stopped.
+func gcEffectiveGrowthRatio() float64 {
+       egogc := float64(memstats.next_gc-memstats.heap_marked) / float64(memstats.heap_marked)
+       if egogc < 0 {
+               // Shouldn't happen, but just in case.
+               egogc = 0
+       }
+       return egogc
 }
 
 // gcGoalUtilization is the goal CPU utilization for
@@ -1137,15 +1150,10 @@ type gcTrigger struct {
 type gcTriggerKind int
 
 const (
-       // gcTriggerAlways indicates that a cycle should be started
-       // unconditionally, even if GOGC is off or we're in a cycle
-       // right now. This cannot be consolidated with other cycles.
-       gcTriggerAlways gcTriggerKind = iota
-
        // gcTriggerHeap indicates that a cycle should be started when
        // the heap size reaches the trigger heap size computed by the
        // controller.
-       gcTriggerHeap
+       gcTriggerHeap gcTriggerKind = iota
 
        // gcTriggerTime indicates that a cycle should be started when
        // it's been more than forcegcperiod nanoseconds since the
@@ -1162,13 +1170,7 @@ const (
 // that the exit condition for the _GCoff phase has been met. The exit
 // condition should be tested when allocating.
 func (t gcTrigger) test() bool {
-       if !memstats.enablegc || panicking != 0 {
-               return false
-       }
-       if t.kind == gcTriggerAlways {
-               return true
-       }
-       if gcphase != _GCoff {
+       if !memstats.enablegc || panicking != 0 || gcphase != _GCoff {
                return false
        }
        switch t.kind {
@@ -1234,7 +1236,7 @@ func gcStart(trigger gcTrigger) {
        }
 
        // For stats, check if this GC was forced by the user.
-       work.userForced = trigger.kind == gcTriggerAlways || trigger.kind == gcTriggerCycle
+       work.userForced = trigger.kind == gcTriggerCycle
 
        // In gcstoptheworld debug mode, upgrade the mode accordingly.
        // We do this after re-checking the transition condition so
@@ -1264,7 +1266,7 @@ func gcStart(trigger gcTrigger) {
 
        gcBgMarkStartWorkers()
 
-       gcResetMarkState()
+       systemstack(gcResetMarkState)
 
        work.stwprocs, work.maxprocs = gomaxprocs, gomaxprocs
        if work.stwprocs > ncpu {
@@ -1994,7 +1996,6 @@ func gcMarkWorkAvailable(p *p) bool {
 // gcMark runs the mark (or, for concurrent GC, mark termination)
 // All gcWork caches must be empty.
 // STW is in effect at this point.
-//TODO go:nowritebarrier
 func gcMark(start_time int64) {
        if debug.allocfreetrace > 0 {
                tracegc()
@@ -2082,6 +2083,9 @@ func gcMark(start_time int64) {
        }
 }
 
+// gcSweep must be called on the system stack because it acquires the heap
+// lock. See mheap for details.
+//go:systemstack
 func gcSweep(mode gcMode) {
        if gcphase != _GCoff {
                throw("gcSweep being done but phase is not GCoff")
@@ -2138,6 +2142,11 @@ func gcSweep(mode gcMode) {
 //
 // This is safe to do without the world stopped because any Gs created
 // during or after this will start out in the reset state.
+//
+// gcResetMarkState must be called on the system stack because it acquires
+// the heap lock. See mheap for details.
+//
+//go:systemstack
 func gcResetMarkState() {
        // This may be called during a concurrent phase, so make sure
        // allgs doesn't change.
index 7b01a117808fc4101b4d8d7420c5f9ef76a4de98..414db100192f4ea36bf75601df933ac137b748a4 100644 (file)
@@ -6,24 +6,31 @@
 //
 // See malloc.go for the general overview.
 //
-// Large spans are the subject of this file. Spans consisting of less than
-// _MaxMHeapLists are held in lists of like sized spans. Larger spans
-// are held in a treap. See https://en.wikipedia.org/wiki/Treap or
+// Allocation policy is the subject of this file. All free spans live in
+// a treap for most of their time being free. See
+// https://en.wikipedia.org/wiki/Treap or
 // https://faculty.washington.edu/aragon/pubs/rst89.pdf for an overview.
 // sema.go also holds an implementation of a treap.
 //
-// Each treapNode holds a single span. The treap is sorted by page size
-// and for spans of the same size a secondary sort based on start address
-// is done.
-// Spans are returned based on a best fit algorithm and for spans of the same
-// size the one at the lowest address is selected.
+// Each treapNode holds a single span. The treap is sorted by base address
+// and each span necessarily has a unique base address.
+// Spans are returned based on a first-fit algorithm, acquiring the span
+// with the lowest base address which still satisfies the request.
+//
+// The first-fit algorithm is possible due to an augmentation of each
+// treapNode to maintain the size of the largest span in the subtree rooted
+// at that treapNode. Below we refer to this invariant as the maxPages
+// invariant.
 //
 // The primary routines are
 // insert: adds a span to the treap
 // remove: removes the span from that treap that best fits the required size
 // removeSpan: which removes a specific span from the treap
 //
-// _mheap.lock must be held when manipulating this data structure.
+// Whenever a pointer to a span which is owned by the treap is acquired, that
+// span must not be mutated. To mutate a span in the treap, remove it first.
+//
+// mheap_.lock must be held when manipulating this data structure.
 
 package runtime
 
@@ -33,70 +40,153 @@ import (
 
 //go:notinheap
 type mTreap struct {
-       treap *treapNode
+       treap           *treapNode
+       unscavHugePages uintptr // number of unscavenged huge pages in the treap
 }
 
 //go:notinheap
 type treapNode struct {
-       right     *treapNode // all treapNodes > this treap node
-       left      *treapNode // all treapNodes < this treap node
-       parent    *treapNode // direct parent of this node, nil if root
-       npagesKey uintptr    // number of pages in spanKey, used as primary sort key
-       spanKey   *mspan     // span of size npagesKey, used as secondary sort key
-       priority  uint32     // random number used by treap algorithm to keep tree probabilistically balanced
+       right    *treapNode      // all treapNodes > this treap node
+       left     *treapNode      // all treapNodes < this treap node
+       parent   *treapNode      // direct parent of this node, nil if root
+       key      uintptr         // base address of the span, used as primary sort key
+       span     *mspan          // span at base address key
+       maxPages uintptr         // the maximum size of any span in this subtree, including the root
+       priority uint32          // random number used by treap algorithm to keep tree probabilistically balanced
+       types    treapIterFilter // the types of spans available in this subtree
 }
 
-func (t *treapNode) pred() *treapNode {
+// updateInvariants is a helper method which has a node recompute its own
+// maxPages and types values by looking at its own span as well as the
+// values of its direct children.
+//
+// Returns true if anything changed.
+func (t *treapNode) updateInvariants() bool {
+       m, i := t.maxPages, t.types
+       t.maxPages = t.span.npages
+       t.types = t.span.treapFilter()
        if t.left != nil {
-               // If it has a left child, its predecessor will be
-               // its right most left (grand)child.
-               t = t.left
-               for t.right != nil {
-                       t = t.right
+               t.types |= t.left.types
+               if t.maxPages < t.left.maxPages {
+                       t.maxPages = t.left.maxPages
                }
-               return t
        }
-       // If it has no left child, its predecessor will be
-       // the first grandparent who's right child is its
-       // ancestor.
-       //
-       // We compute this by walking up the treap until the
-       // current node's parent is its parent's right child.
-       //
-       // If we find at any point walking up the treap
-       // that the current node doesn't have a parent,
-       // we've hit the root. This means that t is already
-       // the left-most node in the treap and therefore
-       // has no predecessor.
-       for t.parent != nil && t.parent.right != t {
-               if t.parent.left != t {
-                       println("runtime: predecessor t=", t, "t.spanKey=", t.spanKey)
-                       throw("node is not its parent's child")
+       if t.right != nil {
+               t.types |= t.right.types
+               if t.maxPages < t.right.maxPages {
+                       t.maxPages = t.right.maxPages
                }
-               t = t.parent
        }
-       return t.parent
+       return m != t.maxPages || i != t.types
 }
 
-func (t *treapNode) succ() *treapNode {
-       if t.right != nil {
-               // If it has a right child, its successor will be
-               // its left-most right (grand)child.
-               t = t.right
-               for t.left != nil {
+// findMinimal finds the minimal (lowest base addressed) node in the treap
+// which matches the criteria set out by the filter f and returns nil if
+// none exists.
+//
+// This algorithm is functionally the same as (*mTreap).find, so see that
+// method for more details.
+func (t *treapNode) findMinimal(f treapIterFilter) *treapNode {
+       if t == nil || !f.matches(t.types) {
+               return nil
+       }
+       for t != nil {
+               if t.left != nil && f.matches(t.left.types) {
                        t = t.left
+               } else if f.matches(t.span.treapFilter()) {
+                       break
+               } else if t.right != nil && f.matches(t.right.types) {
+                       t = t.right
+               } else {
+                       println("runtime: f=", f)
+                       throw("failed to find minimal node matching filter")
                }
-               return t
        }
-       // See pred.
-       for t.parent != nil && t.parent.left != t {
-               if t.parent.right != t {
-                       println("runtime: predecessor t=", t, "t.spanKey=", t.spanKey)
-                       throw("node is not its parent's child")
+       return t
+}
+
+// findMaximal finds the maximal (highest base addressed) node in the treap
+// which matches the criteria set out by the filter f and returns nil if
+// none exists.
+//
+// This algorithm is the logical inversion of findMinimal and just changes
+// the order of the left and right tests.
+func (t *treapNode) findMaximal(f treapIterFilter) *treapNode {
+       if t == nil || !f.matches(t.types) {
+               return nil
+       }
+       for t != nil {
+               if t.right != nil && f.matches(t.right.types) {
+                       t = t.right
+               } else if f.matches(t.span.treapFilter()) {
+                       break
+               } else if t.left != nil && f.matches(t.left.types) {
+                       t = t.left
+               } else {
+                       println("runtime: f=", f)
+                       throw("failed to find minimal node matching filter")
                }
+       }
+       return t
+}
+
+// pred returns the predecessor of t in the treap subject to the criteria
+// specified by the filter f. Returns nil if no such predecessor exists.
+func (t *treapNode) pred(f treapIterFilter) *treapNode {
+       if t.left != nil && f.matches(t.left.types) {
+               // The node has a left subtree which contains at least one matching
+               // node, find the maximal matching node in that subtree.
+               return t.left.findMaximal(f)
+       }
+       // Lacking a left subtree, look to the parents.
+       p := t // previous node
+       t = t.parent
+       for t != nil {
+               // Walk up the tree until we find a node that has a left subtree
+               // that we haven't already visited.
+               if t.right == p {
+                       if f.matches(t.span.treapFilter()) {
+                               // If this node matches, then it's guaranteed to be the
+                               // predecessor since everything to its left is strictly
+                               // greater.
+                               return t
+                       } else if t.left != nil && f.matches(t.left.types) {
+                               // Failing the root of this subtree, if its left subtree has
+                               // something, that's where we'll find our predecessor.
+                               return t.left.findMaximal(f)
+                       }
+               }
+               p = t
+               t = t.parent
+       }
+       // If the parent is nil, then we've hit the root without finding
+       // a suitable left subtree containing the node (and the predecessor
+       // wasn't on the path). Thus, there's no predecessor, so just return
+       // nil.
+       return nil
+}
+
+// succ returns the successor of t in the treap subject to the criteria
+// specified by the filter f. Returns nil if no such successor exists.
+func (t *treapNode) succ(f treapIterFilter) *treapNode {
+       // See pred. This method is just the logical inversion of it.
+       if t.right != nil && f.matches(t.right.types) {
+               return t.right.findMinimal(f)
+       }
+       p := t
+       t = t.parent
+       for t != nil {
+               if t.left == p {
+                       if f.matches(t.span.treapFilter()) {
+                               return t
+                       } else if t.right != nil && f.matches(t.right.types) {
+                               return t.right.findMinimal(f)
+                       }
+               }
+               p = t
                t = t.parent
        }
-       return t.parent
+       return nil
 }
 
 // isSpanInTreap is handy for debugging. One should hold the heap lock, usually
@@ -105,10 +195,10 @@ func (t *treapNode) isSpanInTreap(s *mspan) bool {
        if t == nil {
                return false
        }
-       return t.spanKey == s || t.left.isSpanInTreap(s) || t.right.isSpanInTreap(s)
+       return t.span == s || t.left.isSpanInTreap(s) || t.right.isSpanInTreap(s)
 }
 
-// walkTreap is handy for debugging.
+// walkTreap is handy for debugging and testing.
 // Starting at some treapnode t, for example the root, do a depth first preorder walk of
 // the tree executing fn at each treap node. One should hold the heap lock, usually
 // mheap_.lock().
@@ -124,33 +214,116 @@ func (t *treapNode) walkTreap(fn func(tn *treapNode)) {
 // checkTreapNode when used in conjunction with walkTreap can usually detect a
 // poorly formed treap.
 func checkTreapNode(t *treapNode) {
-       // lessThan is used to order the treap.
-       // npagesKey and npages are the primary keys.
-       // spanKey and span are the secondary keys.
-       // span == nil (0) will always be lessThan all
-       // spans of the same size.
-       lessThan := func(npages uintptr, s *mspan) bool {
-               if t.npagesKey != npages {
-                       return t.npagesKey < npages
-               }
-               // t.npagesKey == npages
-               return uintptr(unsafe.Pointer(t.spanKey)) < uintptr(unsafe.Pointer(s))
+       if t == nil {
+               return
+       }
+       if t.span.next != nil || t.span.prev != nil || t.span.list != nil {
+               throw("span may be on an mSpanList while simultaneously in the treap")
        }
+       if t.span.base() != t.key {
+               println("runtime: checkTreapNode treapNode t=", t, "     t.key=", t.key,
+                       "t.span.base()=", t.span.base())
+               throw("why does span.base() and treap.key do not match?")
+       }
+       if t.left != nil && t.key < t.left.key {
+               throw("found out-of-order spans in treap (left child has greater base address)")
+       }
+       if t.right != nil && t.key > t.right.key {
+               throw("found out-of-order spans in treap (right child has lesser base address)")
+       }
+}
 
+// validateInvariants is handy for debugging and testing.
+// It ensures that the various invariants on each treap node are
+// appropriately maintained throughout the treap by walking the
+// treap in a post-order manner.
+func (t *treapNode) validateInvariants() (uintptr, treapIterFilter) {
        if t == nil {
-               return
+               return 0, 0
+       }
+       leftMax, leftTypes := t.left.validateInvariants()
+       rightMax, rightTypes := t.right.validateInvariants()
+       max := t.span.npages
+       if leftMax > max {
+               max = leftMax
        }
-       if t.spanKey.npages != t.npagesKey || t.spanKey.next != nil {
-               println("runtime: checkTreapNode treapNode t=", t, "     t.npagesKey=", t.npagesKey,
-                       "t.spanKey.npages=", t.spanKey.npages)
-               throw("why does span.npages and treap.ngagesKey do not match?")
+       if rightMax > max {
+               max = rightMax
        }
-       if t.left != nil && lessThan(t.left.npagesKey, t.left.spanKey) {
-               throw("t.lessThan(t.left.npagesKey, t.left.spanKey) is not false")
+       if max != t.maxPages {
+               println("runtime: t.maxPages=", t.maxPages, "want=", max)
+               throw("maxPages invariant violated in treap")
        }
-       if t.right != nil && !lessThan(t.right.npagesKey, t.right.spanKey) {
-               throw("!t.lessThan(t.left.npagesKey, t.left.spanKey) is not false")
+       typ := t.span.treapFilter() | leftTypes | rightTypes
+       if typ != t.types {
+               println("runtime: t.types=", t.types, "want=", typ)
+               throw("types invariant violated in treap")
        }
+       return max, typ
+}
+
+// treapIterType represents the type of iteration to perform
+// over the treap. Each different flag is represented by a bit
+// in the type, and types may be combined together by a bitwise
+// or operation.
+//
+// Note that only 5 bits are available for treapIterType, do not
+// use the 3 higher-order bits. This constraint is to allow for
+// expansion into a treapIterFilter, which is a uint32.
+type treapIterType uint8
+
+const (
+       treapIterScav treapIterType = 1 << iota // scavenged spans
+       treapIterHuge                           // spans containing at least one huge page
+       treapIterBits = iota
+)
+
+// treapIterFilter is a bitwise filter of different spans by binary
+// properties. Each bit of a treapIterFilter represents a unique
+// combination of bits set in a treapIterType, in other words, it
+// represents the power set of a treapIterType.
+//
+// The purpose of this representation is to allow the existence of
+// a specific span type to bubble up in the treap (see the types
+// field on treapNode).
+//
+// More specifically, any treapIterType may be transformed into a
+// treapIterFilter for a specific combination of flags via the
+// following operation: 1 << (0x1f&treapIterType).
+type treapIterFilter uint32
+
+// treapFilterAll represents the filter which allows all spans.
+const treapFilterAll = ^treapIterFilter(0)
+
+// treapFilter creates a new treapIterFilter from two treapIterTypes.
+// mask represents a bitmask for which flags we should check against
+// and match for the expected result after applying the mask.
+func treapFilter(mask, match treapIterType) treapIterFilter {
+       allow := treapIterFilter(0)
+       for i := treapIterType(0); i < 1<<treapIterBits; i++ {
+               if mask&i == match {
+                       allow |= 1 << i
+               }
+       }
+       return allow
+}
+
+// matches returns true if m and f intersect.
+func (f treapIterFilter) matches(m treapIterFilter) bool {
+       return f&m != 0
+}
+
+// treapFilter returns the treapIterFilter exactly matching this span,
+// i.e. popcount(result) == 1.
+func (s *mspan) treapFilter() treapIterFilter {
+       have := treapIterType(0)
+       if s.scavenged {
+               have |= treapIterScav
+       }
+       if s.hugePages() > 0 {
+               have |= treapIterHuge
+       }
+       return treapIterFilter(uint32(1) << (0x1f & have))
 }
 
 // treapIter is a bidirectional iterator type which may be used to iterate over a
@@ -160,13 +333,14 @@ func checkTreapNode(t *treapNode) {
 //
 // To create iterators over the treap, call start or end on an mTreap.
 type treapIter struct {
+       f treapIterFilter
        t *treapNode
 }
 
 // span returns the span at the current position in the treap.
 // If the treap is not valid, span will panic.
 func (i *treapIter) span() *mspan {
-       return i.t.spanKey
+       return i.t.span
 }
 
 // valid returns whether the iterator represents a valid position
@@ -178,58 +352,78 @@ func (i *treapIter) valid() bool {
 // next moves the iterator forward by one. Once the iterator
 // ceases to be valid, calling next will panic.
 func (i treapIter) next() treapIter {
-       i.t = i.t.succ()
+       i.t = i.t.succ(i.f)
        return i
 }
 
 // prev moves the iterator backwards by one. Once the iterator
 // ceases to be valid, calling prev will panic.
 func (i treapIter) prev() treapIter {
-       i.t = i.t.pred()
+       i.t = i.t.pred(i.f)
        return i
 }
 
 // start returns an iterator which points to the start of the treap (the
-// left-most node in the treap).
-func (root *mTreap) start() treapIter {
-       t := root.treap
-       if t == nil {
-               return treapIter{}
-       }
-       for t.left != nil {
-               t = t.left
-       }
-       return treapIter{t: t}
+// left-most node in the treap) subject to mask and match constraints.
+func (root *mTreap) start(mask, match treapIterType) treapIter {
+       f := treapFilter(mask, match)
+       return treapIter{f, root.treap.findMinimal(f)}
 }
 
 // end returns an iterator which points to the end of the treap (the
-// right-most node in the treap).
-func (root *mTreap) end() treapIter {
-       t := root.treap
-       if t == nil {
-               return treapIter{}
+// right-most node in the treap) subject to mask and match constraints.
+func (root *mTreap) end(mask, match treapIterType) treapIter {
+       f := treapFilter(mask, match)
+       return treapIter{f, root.treap.findMaximal(f)}
+}
+
+// mutate allows one to mutate the span without removing it from the treap via a
+// callback. The span's base and size are allowed to change as long as the span
+// remains in the same order relative to its predecessor and successor.
+//
+// Note however that any operation that causes a treap rebalancing inside of fn
+// is strictly forbidden, as that may cause treap node metadata to go
+// out-of-sync.
+func (root *mTreap) mutate(i treapIter, fn func(span *mspan)) {
+       s := i.span()
+       // Save some state about the span for later inspection.
+       hpages := s.hugePages()
+       scavenged := s.scavenged
+       // Call the mutator.
+       fn(s)
+       // Update unscavHugePages appropriately.
+       if !scavenged {
+               mheap_.free.unscavHugePages -= hpages
+       }
+       if !s.scavenged {
+               mheap_.free.unscavHugePages += s.hugePages()
        }
-       for t.right != nil {
-               t = t.right
+       // Update the key in case the base changed.
+       i.t.key = s.base()
+       // Updating invariants up the tree needs to happen if
+       // anything changed at all, so just go ahead and do it
+       // unconditionally.
+       //
+       // If it turns out nothing changed, it'll exit quickly.
+       t := i.t
+       for t != nil && t.updateInvariants() {
+               t = t.parent
        }
-       return treapIter{t: t}
 }
 
 // insert adds span to the large span treap.
 func (root *mTreap) insert(span *mspan) {
-       npages := span.npages
+       if !span.scavenged {
+               root.unscavHugePages += span.hugePages()
+       }
+       base := span.base()
        var last *treapNode
        pt := &root.treap
        for t := *pt; t != nil; t = *pt {
                last = t
-               if t.npagesKey < npages {
+               if t.key < base {
                        pt = &t.right
-               } else if t.npagesKey > npages {
-                       pt = &t.left
-               } else if t.spanKey.base() < span.base() {
-                       // t.npagesKey == npages, so sort on span addresses.
-                       pt = &t.right
-               } else if t.spanKey.base() > span.base() {
+               } else if t.key > base {
                        pt = &t.left
                } else {
                        throw("inserting span already in treap")
@@ -238,25 +432,34 @@ func (root *mTreap) insert(span *mspan) {
 
        // Add t as new leaf in tree of span size and unique addrs.
        // The balanced tree is a treap using priority as the random heap priority.
-       // That is, it is a binary tree ordered according to the npagesKey,
+       // That is, it is a binary tree ordered according to the key,
        // but then among the space of possible binary trees respecting those
-       // npagesKeys, it is kept balanced on average by maintaining a heap ordering
+       // keys, it is kept balanced on average by maintaining a heap ordering
        // on the priority: s.priority <= both s.right.priority and s.right.priority.
        // https://en.wikipedia.org/wiki/Treap
        // https://faculty.washington.edu/aragon/pubs/rst89.pdf
 
        t := (*treapNode)(mheap_.treapalloc.alloc())
-       t.npagesKey = span.npages
+       t.key = span.base()
        t.priority = fastrand()
-       t.spanKey = span
+       t.span = span
+       t.maxPages = span.npages
+       t.types = span.treapFilter()
        t.parent = last
        *pt = t // t now at a leaf.
+
+       // Update the tree to maintain the various invariants.
+       i := t
+       for i.parent != nil && i.parent.updateInvariants() {
+               i = i.parent
+       }
+
        // Rotate up into tree according to priority.
        for t.parent != nil && t.parent.priority > t.priority {
-               if t != nil && t.spanKey.npages != t.npagesKey {
-                       println("runtime: insert t=", t, "t.npagesKey=", t.npagesKey)
-                       println("runtime:      t.spanKey=", t.spanKey, "t.spanKey.npages=", t.spanKey.npages)
-                       throw("span and treap sizes do not match?")
+               if t != nil && t.span.base() != t.key {
+                       println("runtime: insert t=", t, "t.key=", t.key)
+                       println("runtime:      t.span=", t.span, "t.span.base()=", t.span.base())
+                       throw("span and treap node base addresses do not match")
                }
                if t.parent.left == t {
                        root.rotateRight(t.parent)
@@ -270,8 +473,11 @@ func (root *mTreap) insert(span *mspan) {
 }
 
 func (root *mTreap) removeNode(t *treapNode) {
-       if t.spanKey.npages != t.npagesKey {
-               throw("span and treap node npages do not match")
+       if !t.span.scavenged {
+               root.unscavHugePages -= t.span.hugePages()
+       }
+       if t.span.base() != t.key {
+               throw("span and treap node base addresses do not match")
        }
        // Rotate t down to be leaf of tree for removal, respecting priorities.
        for t.right != nil || t.left != nil {
@@ -283,10 +489,15 @@ func (root *mTreap) removeNode(t *treapNode) {
        }
        // Remove t, now a leaf.
        if t.parent != nil {
-               if t.parent.left == t {
-                       t.parent.left = nil
+               p := t.parent
+               if p.left == t {
+                       p.left = nil
                } else {
-                       t.parent.right = nil
+                       p.right = nil
+               }
+               // Walk up the tree updating invariants until no updates occur.
+               for p != nil && p.updateInvariants() {
+                       p = p.parent
                }
        } else {
                root.treap = nil
@@ -295,44 +506,64 @@ func (root *mTreap) removeNode(t *treapNode) {
        mheap_.treapalloc.free(unsafe.Pointer(t))
 }
 
-// find searches for, finds, and returns the treap node containing the
-// smallest span that can hold npages. If no span has at least npages
-// it returns nil.
-// This is slightly more complicated than a simple binary tree search
-// since if an exact match is not found the next larger node is
-// returned.
-func (root *mTreap) find(npages uintptr) *treapNode {
+// find searches for, finds, and returns the treap iterator over all spans
+// representing the position of the span with the smallest base address which is
+// at least npages in size. If no span has at least npages it returns an invalid
+// iterator.
+//
+// This algorithm is as follows:
+// * If there's a left child and its subtree can satisfy this allocation,
+//   continue down that subtree.
+// * If there's no such left child, check if the root of this subtree can
+//   satisfy the allocation. If so, we're done.
+// * If the root cannot satisfy the allocation either, continue down the
+//   right subtree if able.
+// * Else, break and report that we cannot satisfy the allocation.
+//
+// The preference for left, then current, then right, results in us getting
+// the left-most node which will contain the span with the lowest base
+// address.
+//
+// Note that if a request cannot be satisfied the fourth case will be
+// reached immediately at the root, since neither the left subtree nor
+// the right subtree will have a sufficient maxPages, whilst the root
+// node is also unable to satisfy it.
+func (root *mTreap) find(npages uintptr) treapIter {
        t := root.treap
        for t != nil {
-               if t.spanKey == nil {
-                       throw("treap node with nil spanKey found")
+               if t.span == nil {
+                       throw("treap node with nil span found")
                }
-               if t.npagesKey < npages {
-                       t = t.right
-               } else if t.left != nil && t.left.npagesKey >= npages {
+               // Iterate over the treap trying to go as far left
+               // as possible while simultaneously ensuring that the
+               // subtrees we choose always have a span which can
+               // satisfy the allocation.
+               if t.left != nil && t.left.maxPages >= npages {
                        t = t.left
+               } else if t.span.npages >= npages {
+                       // Before going right, if this span can satisfy the
+                       // request, stop here.
+                       break
+               } else if t.right != nil && t.right.maxPages >= npages {
+                       t = t.right
                } else {
-                       return t
+                       t = nil
                }
        }
-       return nil
+       return treapIter{treapFilterAll, t}
 }
 
 // removeSpan searches for, finds, deletes span along with
 // the associated treap node. If the span is not in the treap
-// then t will eventually be set to nil and the t.spanKey
+// then t will eventually be set to nil and the t.span
 // will throw.
 func (root *mTreap) removeSpan(span *mspan) {
-       npages := span.npages
+       base := span.base()
        t := root.treap
-       for t.spanKey != span {
-               if t.npagesKey < npages {
-                       t = t.right
-               } else if t.npagesKey > npages {
-                       t = t.left
-               } else if t.spanKey.base() < span.base() {
+       for t.span != span {
+               if t.key < base {
                        t = t.right
-               } else if t.spanKey.base() > span.base() {
+               } else if t.key > base {
                        t = t.left
                }
        }
@@ -381,6 +612,9 @@ func (root *mTreap) rotateLeft(x *treapNode) {
                }
                p.right = y
        }
+
+       x.updateInvariants()
+       y.updateInvariants()
 }
 
 // rotateRight rotates the tree rooted at node y.
@@ -417,4 +651,7 @@ func (root *mTreap) rotateRight(y *treapNode) {
                }
                p.right = x
        }
+
+       y.updateInvariants()
+       x.updateInvariants()
 }
diff --git a/libgo/go/runtime/mgcscavenge.go b/libgo/go/runtime/mgcscavenge.go
new file mode 100644 (file)
index 0000000..910c123
--- /dev/null
@@ -0,0 +1,367 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Scavenging free pages.
+//
+// This file implements scavenging (the release of physical pages backing mapped
+// memory) of free and unused pages in the heap as a way to deal with page-level
+// fragmentation and reduce the RSS of Go applications.
+//
+// Scavenging in Go happens on two fronts: there's the background
+// (asynchronous) scavenger and the heap-growth (synchronous) scavenger.
+//
+// The former happens on a goroutine much like the background sweeper which is
+// soft-capped at using scavengePercent of the mutator's time, based on
+// order-of-magnitude estimates of the costs of scavenging. The background
+// scavenger's primary goal is to bring the estimated heap RSS of the
+// application down to a goal.
+//
+// That goal is defined as (retainExtraPercent+100) / 100 * next_gc.
+//
+// The goal is updated after each GC and the scavenger's pacing parameters
+// (which live in mheap_) are updated to match. The pacing parameters work much
+// like the background sweeping parameters. The parameters define a line whose
+// horizontal axis is time and vertical axis is estimated heap RSS, and the
+// scavenger attempts to stay below that line at all times.
+//
+// The synchronous heap-growth scavenging happens whenever the heap grows in
+// size, for some definition of heap-growth. The intuition behind this is that
+// the application had to grow the heap because existing fragments were
+// not sufficiently large to satisfy a page-level memory allocation, so we
+// scavenge those fragments eagerly to offset the growth in RSS that results.
+
+package runtime
+
+const (
+       // The background scavenger is paced according to these parameters.
+       //
+       // scavengePercent represents the portion of mutator time we're willing
+       // to spend on scavenging in percent.
+       //
+       // scavengePageLatency is a worst-case estimate (order-of-magnitude) of
+       // the time it takes to scavenge one (regular-sized) page of memory.
+       // scavengeHugePageLatency is the same but for huge pages.
+       //
+       // scavengePagePeriod is derived from scavengePercent and scavengePageLatency,
+       // and represents the average time between scavenging one page that we're
+       // aiming for. scavengeHugePagePeriod is the same but for huge pages.
+       // These constants are core to the scavenge pacing algorithm.
+       scavengePercent         = 1    // 1%
+       scavengePageLatency     = 10e3 // 10µs
+       scavengeHugePageLatency = 10e3 // 10µs
+       scavengePagePeriod      = scavengePageLatency / (scavengePercent / 100.0)
+       scavengeHugePagePeriod  = scavengePageLatency / (scavengePercent / 100.0)
+
+       // retainExtraPercent represents the amount of memory over the heap goal
+       // that the scavenger should keep as a buffer space for the allocator.
+       //
+       // The purpose of maintaining this overhead is to have a greater pool of
+       // unscavenged memory available for allocation (since using scavenged memory
+       // incurs an additional cost), to account for heap fragmentation and
+       // the ever-changing layout of the heap.
+       retainExtraPercent = 10
+)
+
+// heapRetained returns an estimate of the current heap RSS.
+//
+// mheap_.lock must be held or the world must be stopped.
+func heapRetained() uint64 {
+       return memstats.heap_sys - memstats.heap_released
+}
+
+// gcPaceScavenger updates the scavenger's pacing, particularly
+// its rate and RSS goal.
+//
+// The RSS goal is based on the current heap goal with a small overhead
+// to accomodate non-determinism in the allocator.
+//
+// The pacing is based on scavengePageRate, which applies to both regular and
+// huge pages. See that constant for more information.
+//
+// mheap_.lock must be held or the world must be stopped.
+func gcPaceScavenger() {
+       // Compute our scavenging goal and align it to a physical page boundary
+       // to make the following calculations more exact.
+       retainedGoal := memstats.next_gc
+       // Add retainExtraPercent overhead to retainedGoal. This calculation
+       // looks strange but the purpose is to arrive at an integer division
+       // (e.g. if retainExtraPercent = 12.5, then we get a divisor of 8)
+       // that also avoids the overflow from a multiplication.
+       retainedGoal += retainedGoal / (1.0 / (retainExtraPercent / 100.0))
+       retainedGoal = (retainedGoal + uint64(physPageSize) - 1) &^ (uint64(physPageSize) - 1)
+
+       // Represents where we are now in the heap's contribution to RSS in bytes.
+       //
+       // Guaranteed to always be a multiple of physPageSize on systems where
+       // physPageSize <= pageSize since we map heap_sys at a rate larger than
+       // any physPageSize and released memory in multiples of the physPageSize.
+       //
+       // However, certain functions recategorize heap_sys as other stats (e.g.
+       // stack_sys) and this happens in multiples of pageSize, so on systems
+       // where physPageSize > pageSize the calculations below will not be exact.
+       // Generally this is OK since we'll be off by at most one regular
+       // physical page.
+       retainedNow := heapRetained()
+
+       // If we're already below our goal, publish the goal in case it changed
+       // then disable the background scavenger.
+       if retainedNow <= retainedGoal {
+               mheap_.scavengeRetainedGoal = retainedGoal
+               mheap_.scavengeBytesPerNS = 0
+               return
+       }
+
+       // Now we start to compute the total amount of work necessary and the total
+       // amount of time we're willing to give the scavenger to complete this work.
+       // This will involve calculating how much of the work consists of huge pages
+       // and how much consists of regular pages since the former can let us scavenge
+       // more memory in the same time.
+       totalWork := retainedNow - retainedGoal
+
+       // On systems without huge page support, all work is regular work.
+       regularWork := totalWork
+       hugeTime := uint64(0)
+
+       // On systems where we have huge pages, we want to do as much of the
+       // scavenging work as possible on huge pages, because the costs are the
+       // same per page, but we can give back more more memory in a shorter
+       // period of time.
+       if physHugePageSize != 0 {
+               // Start by computing the amount of free memory we have in huge pages
+               // in total. Trivially, this is all the huge page work we need to do.
+               hugeWork := uint64(mheap_.free.unscavHugePages * physHugePageSize)
+
+               // ...but it could turn out that there's more huge work to do than
+               // total work, so cap it at total work. This might happen for very large
+               // heaps where the additional factor of retainExtraPercent can make it so
+               // that there are free chunks of memory larger than a huge page that we don't want
+               // to scavenge.
+               if hugeWork >= totalWork {
+                       hugePages := totalWork / uint64(physHugePageSize)
+                       hugeWork = hugePages * uint64(physHugePageSize)
+               }
+               // Everything that's not huge work is regular work. At this point we
+               // know huge work so we can calculate how much time that will take
+               // based on scavengePageRate (which applies to pages of any size).
+               regularWork = totalWork - hugeWork
+               hugeTime = hugeWork / uint64(physHugePageSize) * scavengeHugePagePeriod
+       }
+       // Finally, we can compute how much time it'll take to do the regular work
+       // and the total time to do all the work.
+       regularTime := regularWork / uint64(physPageSize) * scavengePagePeriod
+       totalTime := hugeTime + regularTime
+
+       now := nanotime()
+
+       lock(&scavenge.lock)
+
+       // Update all the pacing parameters in mheap with scavenge.lock held,
+       // so that scavenge.gen is kept in sync with the updated values.
+       mheap_.scavengeRetainedGoal = retainedGoal
+       mheap_.scavengeRetainedBasis = retainedNow
+       mheap_.scavengeTimeBasis = now
+       mheap_.scavengeBytesPerNS = float64(totalWork) / float64(totalTime)
+       scavenge.gen++ // increase scavenge generation
+
+       // Wake up background scavenger if needed, since the pacing was just updated.
+       wakeScavengerLocked()
+
+       unlock(&scavenge.lock)
+}
+
+// State of the background scavenger.
+var scavenge struct {
+       lock   mutex
+       g      *g
+       parked bool
+       timer  *timer
+       gen    uint32 // read with either lock or mheap_.lock, write with both
+}
+
+// wakeScavengerLocked unparks the scavenger if necessary. It must be called
+// after any pacing update.
+//
+// scavenge.lock must be held.
+func wakeScavengerLocked() {
+       if scavenge.parked {
+               // Try to stop the timer but we don't really care if we succeed.
+               // It's possible that either a timer was never started, or that
+               // we're racing with it.
+               // In the case that we're racing with there's the low chance that
+               // we experience a spurious wake-up of the scavenger, but that's
+               // totally safe.
+               stopTimer(scavenge.timer)
+
+               // Unpark the goroutine and tell it that there may have been a pacing
+               // change.
+               scavenge.parked = false
+               ready(scavenge.g, 0, true)
+       }
+}
+
+// scavengeSleep attempts to put the scavenger to sleep for ns.
+// It also checks to see if gen != scavenge.gen before going to sleep,
+// and aborts if true (meaning an update had occurred).
+//
+// Note that this function should only be called by the scavenger.
+//
+// The scavenger may be woken up earlier by a pacing change, and it may not go
+// to sleep at all if there's a pending pacing change.
+//
+// Returns false if awoken early (i.e. true means a complete sleep).
+func scavengeSleep(gen uint32, ns int64) bool {
+       lock(&scavenge.lock)
+
+       // If there was an update, just abort the sleep.
+       if scavenge.gen != gen {
+               unlock(&scavenge.lock)
+               return false
+       }
+
+       // Set the timer.
+       now := nanotime()
+       scavenge.timer.when = now + ns
+       startTimer(scavenge.timer)
+
+       // Park the goroutine. It's fine that we don't publish the
+       // fact that the timer was set; even if the timer wakes up
+       // and fire scavengeReady before we park, it'll block on
+       // scavenge.lock.
+       scavenge.parked = true
+       goparkunlock(&scavenge.lock, waitReasonSleep, traceEvGoSleep, 2)
+
+       // Return true if we completed the full sleep.
+       return (nanotime() - now) >= ns
+}
+
+// Background scavenger.
+//
+// The background scavenger maintains the RSS of the application below
+// the line described by the proportional scavenging statistics in
+// the mheap struct.
+func bgscavenge(c chan int) {
+       setSystemGoroutine()
+
+       scavenge.g = getg()
+
+       lock(&scavenge.lock)
+       scavenge.parked = true
+
+       scavenge.timer = new(timer)
+       scavenge.timer.f = func(_ interface{}, _ uintptr) {
+               lock(&scavenge.lock)
+               wakeScavengerLocked()
+               unlock(&scavenge.lock)
+       }
+
+       c <- 1
+       goparkunlock(&scavenge.lock, waitReasonGCScavengeWait, traceEvGoBlock, 1)
+
+       // Parameters for sleeping.
+       //
+       // If we end up doing more work than we need, we should avoid spinning
+       // until we have more work to do: instead, we know exactly how much time
+       // until more work will need to be done, so we sleep.
+       //
+       // We should avoid sleeping for less than minSleepNS because Gosched()
+       // overheads among other things will work out better in that case.
+       //
+       // There's no reason to set a maximum on sleep time because we'll always
+       // get woken up earlier if there's any kind of update that could change
+       // the scavenger's pacing.
+       //
+       // retryDelayNS tracks how much to sleep next time we fail to do any
+       // useful work.
+       const minSleepNS = int64(100 * 1000) // 100 µs
+
+       retryDelayNS := minSleepNS
+
+       for {
+               released := uintptr(0)
+               park := false
+               ttnext := int64(0)
+               gen := uint32(0)
+
+               // Run on the system stack since we grab the heap lock,
+               // and a stack growth with the heap lock means a deadlock.
+               systemstack(func() {
+                       lock(&mheap_.lock)
+
+                       gen = scavenge.gen
+
+                       // If background scavenging is disabled or if there's no work to do just park.
+                       retained := heapRetained()
+                       if mheap_.scavengeBytesPerNS == 0 || retained <= mheap_.scavengeRetainedGoal {
+                               unlock(&mheap_.lock)
+                               park = true
+                               return
+                       }
+
+                       // Calculate how big we want the retained heap to be
+                       // at this point in time.
+                       //
+                       // The formula is for that of a line, y = b - mx
+                       // We want y (want),
+                       //   m = scavengeBytesPerNS (> 0)
+                       //   x = time between scavengeTimeBasis and now
+                       //   b = scavengeRetainedBasis
+                       rate := mheap_.scavengeBytesPerNS
+                       tdist := nanotime() - mheap_.scavengeTimeBasis
+                       rdist := uint64(rate * float64(tdist))
+                       want := mheap_.scavengeRetainedBasis - rdist
+
+                       // If we're above the line, scavenge to get below the
+                       // line.
+                       if retained > want {
+                               released = mheap_.scavengeLocked(uintptr(retained - want))
+                       }
+                       unlock(&mheap_.lock)
+
+                       // If we over-scavenged a bit, calculate how much time it'll
+                       // take at the current rate for us to make that up. We definitely
+                       // won't have any work to do until at least that amount of time
+                       // passes.
+                       if released > uintptr(retained-want) {
+                               extra := released - uintptr(retained-want)
+                               ttnext = int64(float64(extra) / rate)
+                       }
+               })
+
+               if park {
+                       lock(&scavenge.lock)
+                       scavenge.parked = true
+                       goparkunlock(&scavenge.lock, waitReasonGCScavengeWait, traceEvGoBlock, 1)
+                       continue
+               }
+
+               if debug.gctrace > 0 {
+                       if released > 0 {
+                               print("scvg: ", released>>20, " MB released\n")
+                       }
+                       print("scvg: inuse: ", memstats.heap_inuse>>20, ", idle: ", memstats.heap_idle>>20, ", sys: ", memstats.heap_sys>>20, ", released: ", memstats.heap_released>>20, ", consumed: ", (memstats.heap_sys-memstats.heap_released)>>20, " (MB)\n")
+               }
+
+               if released == 0 {
+                       // If we were unable to release anything this may be because there's
+                       // no free memory available to scavenge. Go to sleep and try again.
+                       if scavengeSleep(gen, retryDelayNS) {
+                               // If we successfully slept through the delay, back off exponentially.
+                               retryDelayNS *= 2
+                       }
+                       continue
+               }
+               retryDelayNS = minSleepNS
+
+               if ttnext > 0 && ttnext > minSleepNS {
+                       // If there's an appreciable amount of time until the next scavenging
+                       // goal, just sleep. We'll get woken up if anything changes and this
+                       // way we avoid spinning.
+                       scavengeSleep(gen, ttnext)
+                       continue
+               }
+
+               // Give something else a chance to run, no locks are held.
+               Gosched()
+       }
+}
index 539a982c39d7e579cfd9ca44f297ee6c1ffb6496..c1c6e654c6e4f85797a05d7c72803df520799976 100644 (file)
@@ -205,7 +205,6 @@ func (s *mspan) ensureSwept() {
 // Returns true if the span was returned to heap.
 // If preserve=true, don't return it to heap nor relink in mcentral lists;
 // caller takes care of it.
-//TODO go:nowritebarrier
 func (s *mspan) sweep(preserve bool) bool {
        // It's critical that we enter this function with preemption disabled,
        // GC must not start while we are in the middle of this function.
index 2332a2e40bf7bd44653e018bddea91315d13fda4..f18bf9beea366aef6ea58fbdef2ab31167a46f1e 100644 (file)
@@ -29,9 +29,10 @@ const minPhysPageSize = 4096
 //
 //go:notinheap
 type mheap struct {
+       // lock must only be acquired on the system stack, otherwise a g
+       // could self-deadlock if its stack grows with the lock held.
        lock      mutex
-       free      mTreap // free and non-scavenged spans
-       scav      mTreap // free and scavenged spans
+       free      mTreap // free spans
        sweepgen  uint32 // sweep generation, see comment in mspan
        sweepdone uint32 // all spans are swept
        sweepers  uint32 // number of active sweepone calls
@@ -88,6 +89,25 @@ type mheap struct {
        // TODO(austin): pagesInUse should be a uintptr, but the 386
        // compiler can't 8-byte align fields.
 
+       // Scavenger pacing parameters
+       //
+       // The two basis parameters and the scavenge ratio parallel the proportional
+       // sweeping implementation, the primary differences being that:
+       //  * Scavenging concerns itself with RSS, estimated as heapRetained()
+       //  * Rather than pacing the scavenger to the GC, it is paced to a
+       //    time-based rate computed in gcPaceScavenger.
+       //
+       // scavengeRetainedGoal represents our goal RSS.
+       //
+       // All fields must be accessed with lock.
+       //
+       // TODO(mknyszek): Consider abstracting the basis fields and the scavenge ratio
+       // into its own type so that this logic may be shared with proportional sweeping.
+       scavengeTimeBasis     int64
+       scavengeRetainedBasis uint64
+       scavengeBytesPerNS    float64
+       scavengeRetainedGoal  uint64
+
        // Page reclaimer state
 
        // reclaimIndex is the page index in allArenas of next page to
@@ -107,14 +127,6 @@ type mheap struct {
        // This is accessed atomically.
        reclaimCredit uintptr
 
-       // scavengeCredit is spare credit for extra bytes scavenged.
-       // Since the scavenging mechanisms operate on spans, it may
-       // scavenge more than requested. Any spare pages released
-       // go to this credit pool.
-       //
-       // This is protected by the mheap lock.
-       scavengeCredit uintptr
-
        // Malloc stats.
        largealloc  uint64                  // bytes allocated for large objects
        nlargealloc uint64                  // number of large object allocations
@@ -173,7 +185,7 @@ type mheap struct {
        // simply blocking GC (by disabling preemption).
        sweepArenas []arenaIdx
 
-       // _ uint32 // ensure 64-bit alignment of central
+       _ uint32 // ensure 64-bit alignment of central
 
        // central free lists for small size classes.
        // the padding makes sure that the mcentrals are
@@ -395,7 +407,6 @@ type mspan struct {
        divShift2   uint8      // for divide by elemsize - divMagic.shift2
        scavenged   bool       // whether this span has had its pages released to the OS
        elemsize    uintptr    // computed from sizeclass or from npages
-       unusedsince int64      // first time spotted by gc in mspanfree state
        limit       uintptr    // end of data in span
        speciallock mutex      // guards specials list
        specials    *special   // linked list of special records sorted by offset.
@@ -428,35 +439,43 @@ func (s *mspan) physPageBounds() (uintptr, uintptr) {
 }
 
 func (h *mheap) coalesce(s *mspan) {
-       // We scavenge s at the end after coalescing if s or anything
-       // it merged with is marked scavenged.
-       needsScavenge := false
-       prescavenged := s.released() // number of bytes already scavenged.
-
        // merge is a helper which merges other into s, deletes references to other
        // in heap metadata, and then discards it. other must be adjacent to s.
-       merge := func(other *mspan) {
+       merge := func(a, b, other *mspan) {
+               // Caller must ensure a.startAddr < b.startAddr and that either a or
+               // b is s. a and b must be adjacent. other is whichever of the two is
+               // not s.
+
+               if pageSize < physPageSize && a.scavenged && b.scavenged {
+                       // If we're merging two scavenged spans on systems where
+                       // pageSize < physPageSize, then their boundary should always be on
+                       // a physical page boundary, due to the realignment that happens
+                       // during coalescing. Throw if this case is no longer true, which
+                       // means the implementation should probably be changed to scavenge
+                       // along the boundary.
+                       _, start := a.physPageBounds()
+                       end, _ := b.physPageBounds()
+                       if start != end {
+                               println("runtime: a.base=", hex(a.base()), "a.npages=", a.npages)
+                               println("runtime: b.base=", hex(b.base()), "b.npages=", b.npages)
+                               println("runtime: physPageSize=", physPageSize, "pageSize=", pageSize)
+                               throw("neighboring scavenged spans boundary is not a physical page boundary")
+                       }
+               }
+
                // Adjust s via base and npages and also in heap metadata.
                s.npages += other.npages
                s.needzero |= other.needzero
-               if other.startAddr < s.startAddr {
+               if a == s {
+                       h.setSpan(s.base()+s.npages*pageSize-1, s)
+               } else {
                        s.startAddr = other.startAddr
                        h.setSpan(s.base(), s)
-               } else {
-                       h.setSpan(s.base()+s.npages*pageSize-1, s)
                }
 
-               // If before or s are scavenged, then we need to scavenge the final coalesced span.
-               needsScavenge = needsScavenge || other.scavenged || s.scavenged
-               prescavenged += other.released()
-
                // The size is potentially changing so the treap needs to delete adjacent nodes and
                // insert back as a combined node.
-               if other.scavenged {
-                       h.scav.removeSpan(other)
-               } else {
-                       h.free.removeSpan(other)
-               }
+               h.free.removeSpan(other)
                other.state = mSpanDead
                h.spanalloc.free(unsafe.Pointer(other))
        }
@@ -468,17 +487,14 @@ func (h *mheap) coalesce(s *mspan) {
                // b is s. a and b must be adjacent. other is whichever of the two is
                // not s.
 
-               // If pageSize <= physPageSize then spans are always aligned
+               // If pageSize >= physPageSize then spans are always aligned
                // to physical page boundaries, so just exit.
-               if pageSize <= physPageSize {
+               if pageSize >= physPageSize {
                        return
                }
                // Since we're resizing other, we must remove it from the treap.
-               if other.scavenged {
-                       h.scav.removeSpan(other)
-               } else {
-                       h.free.removeSpan(other)
-               }
+               h.free.removeSpan(other)
+
                // Round boundary to the nearest physical page size, toward the
                // scavenged span.
                boundary := b.startAddr
@@ -495,17 +511,15 @@ func (h *mheap) coalesce(s *mspan) {
                h.setSpan(boundary, b)
 
                // Re-insert other now that it has a new size.
-               if other.scavenged {
-                       h.scav.insert(other)
-               } else {
-                       h.free.insert(other)
-               }
+               h.free.insert(other)
        }
 
+       hpBefore := s.hugePages()
+
        // Coalesce with earlier, later spans.
        if before := spanOf(s.base() - 1); before != nil && before.state == mSpanFree {
                if s.scavenged == before.scavenged {
-                       merge(before)
+                       merge(before, s, before)
                } else {
                        realign(before, s, before)
                }
@@ -514,28 +528,44 @@ func (h *mheap) coalesce(s *mspan) {
        // Now check to see if next (greater addresses) span is free and can be coalesced.
        if after := spanOf(s.base() + s.npages*pageSize); after != nil && after.state == mSpanFree {
                if s.scavenged == after.scavenged {
-                       merge(after)
+                       merge(s, after, after)
                } else {
                        realign(s, after, after)
                }
        }
 
-       if needsScavenge {
-               // When coalescing spans, some physical pages which
-               // were not returned to the OS previously because
-               // they were only partially covered by the span suddenly
-               // become available for scavenging. We want to make sure
-               // those holes are filled in, and the span is properly
-               // scavenged. Rather than trying to detect those holes
-               // directly, we collect how many bytes were already
-               // scavenged above and subtract that from heap_released
-               // before re-scavenging the entire newly-coalesced span,
-               // which will implicitly bump up heap_released.
-               memstats.heap_released -= uint64(prescavenged)
-               s.scavenge()
+       if !s.scavenged && s.hugePages() > hpBefore {
+               // If s has grown such that it now may contain more huge pages than it
+               // did before, then mark the whole region as huge-page-backable.
+               //
+               // Otherwise, on systems where we break up huge pages (like Linux)
+               // s may not be backed by huge pages because it could be made up of
+               // pieces which are broken up in the underlying VMA. The primary issue
+               // with this is that it can lead to a poor estimate of the amount of
+               // free memory backed by huge pages for determining the scavenging rate.
+               sysHugePage(unsafe.Pointer(s.base()), s.npages*pageSize)
        }
 }
 
+// hugePages returns the number of aligned physical huge pages in the memory
+// regioned owned by this mspan.
+func (s *mspan) hugePages() uintptr {
+       if physHugePageSize == 0 || s.npages < physHugePageSize/pageSize {
+               return 0
+       }
+       start := s.base()
+       end := start + s.npages*pageSize
+       if physHugePageSize > pageSize {
+               // Round start and end in.
+               start = (start + physHugePageSize - 1) &^ (physHugePageSize - 1)
+               end &^= physHugePageSize - 1
+       }
+       if start < end {
+               return (end - start) / physHugePageSize
+       }
+       return 0
+}
+
 func (s *mspan) scavenge() uintptr {
        // start and end must be rounded in, otherwise madvise
        // will round them *out* and release more memory
@@ -1067,9 +1097,8 @@ func (h *mheap) alloc(npage uintptr, spanclass spanClass, large bool, needzero b
 // The memory backing the returned span may not be zeroed if
 // span.needzero is set.
 //
-// allocManual must be called on the system stack to prevent stack
-// growth. Since this is used by the stack allocator, stack growth
-// during allocManual would self-deadlock.
+// allocManual must be called on the system stack because it acquires
+// the heap lock. See mheap for details.
 //
 //go:systemstack
 func (h *mheap) allocManual(npage uintptr, stat *uint64) *mspan {
@@ -1115,80 +1144,65 @@ func (h *mheap) setSpans(base, npage uintptr, s *mspan) {
        }
 }
 
-// pickFreeSpan acquires a free span from internal free list
-// structures if one is available. Otherwise returns nil.
-// h must be locked.
-func (h *mheap) pickFreeSpan(npage uintptr) *mspan {
-       tf := h.free.find(npage)
-       ts := h.scav.find(npage)
-
-       // Check for whichever treap gave us the smaller, non-nil result.
-       // Note that we want the _smaller_ free span, i.e. the free span
-       // closer in size to the amount we requested (npage).
-       var s *mspan
-       if tf != nil && (ts == nil || tf.spanKey.npages <= ts.spanKey.npages) {
-               s = tf.spanKey
-               h.free.removeNode(tf)
-       } else if ts != nil && (tf == nil || tf.spanKey.npages > ts.spanKey.npages) {
-               s = ts.spanKey
-               h.scav.removeNode(ts)
-       }
-       return s
-}
-
 // Allocates a span of the given size.  h must be locked.
 // The returned span has been removed from the
 // free structures, but its state is still mSpanFree.
 func (h *mheap) allocSpanLocked(npage uintptr, stat *uint64) *mspan {
-       var s *mspan
-
-       s = h.pickFreeSpan(npage)
-       if s != nil {
+       t := h.free.find(npage)
+       if t.valid() {
                goto HaveSpan
        }
-       // On failure, grow the heap and try again.
        if !h.grow(npage) {
                return nil
        }
-       s = h.pickFreeSpan(npage)
-       if s != nil {
+       t = h.free.find(npage)
+       if t.valid() {
                goto HaveSpan
        }
        throw("grew heap, but no adequate free span found")
 
 HaveSpan:
-       // Mark span in use.
+       s := t.span()
        if s.state != mSpanFree {
                throw("candidate mspan for allocation is not free")
        }
-       if s.npages < npage {
-               throw("candidate mspan for allocation is too small")
-       }
 
        // First, subtract any memory that was released back to
-       // the OS from s. We will re-scavenge the trimmed section
-       // if necessary.
+       // the OS from s. We will add back what's left if necessary.
        memstats.heap_released -= uint64(s.released())
 
-       if s.npages > npage {
-               // Trim extra and put it back in the heap.
-               t := (*mspan)(h.spanalloc.alloc())
-               t.init(s.base()+npage<<_PageShift, s.npages-npage)
-               s.npages = npage
-               h.setSpan(t.base()-1, s)
-               h.setSpan(t.base(), t)
-               h.setSpan(t.base()+t.npages*pageSize-1, t)
-               t.needzero = s.needzero
-               // If s was scavenged, then t may be scavenged.
-               start, end := t.physPageBounds()
-               if s.scavenged && start < end {
-                       memstats.heap_released += uint64(end - start)
-                       t.scavenged = true
-               }
-               s.state = mSpanManual // prevent coalescing with s
-               t.state = mSpanManual
-               h.freeSpanLocked(t, false, false, s.unusedsince)
-               s.state = mSpanFree
+       if s.npages == npage {
+               h.free.erase(t)
+       } else if s.npages > npage {
+               // Trim off the lower bits and make that our new span.
+               // Do this in-place since this operation does not
+               // affect the original span's location in the treap.
+               n := (*mspan)(h.spanalloc.alloc())
+               h.free.mutate(t, func(s *mspan) {
+                       n.init(s.base(), npage)
+                       s.npages -= npage
+                       s.startAddr = s.base() + npage*pageSize
+                       h.setSpan(s.base()-1, n)
+                       h.setSpan(s.base(), s)
+                       h.setSpan(n.base(), n)
+                       n.needzero = s.needzero
+                       // n may not be big enough to actually be scavenged, but that's fine.
+                       // We still want it to appear to be scavenged so that we can do the
+                       // right bookkeeping later on in this function (i.e. sysUsed).
+                       n.scavenged = s.scavenged
+                       // Check if s is still scavenged.
+                       if s.scavenged {
+                               start, end := s.physPageBounds()
+                               if start < end {
+                                       memstats.heap_released += uint64(end - start)
+                               } else {
+                                       s.scavenged = false
+                               }
+                       }
+               })
+               s = n
+       } else {
+               throw("candidate mspan for allocation is too small")
        }
        // "Unscavenge" s only AFTER splitting so that
        // we only sysUsed whatever we actually need.
@@ -1201,22 +1215,20 @@ HaveSpan:
 
                // Since we allocated out of a scavenged span, we just
                // grew the RSS. Mitigate this by scavenging enough free
-               // space to make up for it.
+               // space to make up for it but only if we need to.
                //
-               // Also, scavengeLargest may cause coalescing, so prevent
+               // scavengeLocked may cause coalescing, so prevent
                // coalescing with s by temporarily changing its state.
                s.state = mSpanManual
-               h.scavengeLargest(s.npages * pageSize)
+               h.scavengeIfNeededLocked(s.npages * pageSize)
                s.state = mSpanFree
        }
-       s.unusedsince = 0
 
        h.setSpans(s.base(), npage, s)
 
        *stat += uint64(npage << _PageShift)
        memstats.heap_idle -= uint64(npage << _PageShift)
 
-       //println("spanalloc", hex(s.start<<_PageShift))
        if s.inList() {
                throw("still in list")
        }
@@ -1235,23 +1247,22 @@ func (h *mheap) grow(npage uintptr) bool {
                return false
        }
 
-       // Scavenge some pages out of the free treap to make up for
-       // the virtual memory space we just allocated. We prefer to
-       // scavenge the largest spans first since the cost of scavenging
-       // is proportional to the number of sysUnused() calls rather than
-       // the number of pages released, so we make fewer of those calls
-       // with larger spans.
-       h.scavengeLargest(size)
-
        // Create a fake "in use" span and free it, so that the
-       // right coalescing happens.
+       // right accounting and coalescing happens.
        s := (*mspan)(h.spanalloc.alloc())
        s.init(uintptr(v), size/pageSize)
        h.setSpans(s.base(), s.npages, s)
-       atomic.Store(&s.sweepgen, h.sweepgen)
-       s.state = mSpanInUse
-       h.pagesInUse += uint64(s.npages)
-       h.freeSpanLocked(s, false, true, 0)
+       s.state = mSpanFree
+       memstats.heap_idle += uint64(size)
+       // (*mheap).sysAlloc returns untouched/uncommitted memory.
+       s.scavenged = true
+       // s is always aligned to the heap arena size which is always > physPageSize,
+       // so its totally safe to just add directly to heap_released. Coalescing,
+       // if possible, will also always be correct in terms of accounting, because
+       // s.base() must be a physical page boundary.
+       memstats.heap_released += uint64(size)
+       h.coalesce(s)
+       h.free.insert(s)
        return true
 }
 
@@ -1281,7 +1292,7 @@ func (h *mheap) freeSpan(s *mspan, large bool) {
                        // heap_scan changed.
                        gcController.revise()
                }
-               h.freeSpanLocked(s, true, true, 0)
+               h.freeSpanLocked(s, true, true)
                unlock(&h.lock)
        })
 }
@@ -1293,8 +1304,8 @@ func (h *mheap) freeSpan(s *mspan, large bool) {
 // This must only be called when gcphase == _GCoff. See mSpanState for
 // an explanation.
 //
-// freeManual must be called on the system stack to prevent stack
-// growth, just like allocManual.
+// freeManual must be called on the system stack because it acquires
+// the heap lock. See mheap for details.
 //
 //go:systemstack
 func (h *mheap) freeManual(s *mspan, stat *uint64) {
@@ -1302,12 +1313,11 @@ func (h *mheap) freeManual(s *mspan, stat *uint64) {
        lock(&h.lock)
        *stat -= uint64(s.npages << _PageShift)
        memstats.heap_sys += uint64(s.npages << _PageShift)
-       h.freeSpanLocked(s, false, true, 0)
+       h.freeSpanLocked(s, false, true)
        unlock(&h.lock)
 }
 
-// s must be on the busy list or unlinked.
-func (h *mheap) freeSpanLocked(s *mspan, acctinuse, acctidle bool, unusedsince int64) {
+func (h *mheap) freeSpanLocked(s *mspan, acctinuse, acctidle bool) {
        switch s.state {
        case mSpanManual:
                if s.allocCount != 0 {
@@ -1335,119 +1345,151 @@ func (h *mheap) freeSpanLocked(s *mspan, acctinuse, acctidle bool, unusedsince i
        }
        s.state = mSpanFree
 
-       // Stamp newly unused spans. The scavenger will use that
-       // info to potentially give back some pages to the OS.
-       s.unusedsince = unusedsince
-       if unusedsince == 0 {
-               s.unusedsince = nanotime()
-       }
-
        // Coalesce span with neighbors.
        h.coalesce(s)
 
-       // Insert s into the appropriate treap.
-       if s.scavenged {
-               h.scav.insert(s)
-       } else {
-               h.free.insert(s)
-       }
+       // Insert s into the treap.
+       h.free.insert(s)
 }
 
-// scavengeLargest scavenges nbytes worth of spans in unscav
-// starting from the largest span and working down. It then takes those spans
-// and places them in scav. h must be locked.
-func (h *mheap) scavengeLargest(nbytes uintptr) {
-       // Use up scavenge credit if there's any available.
-       if nbytes > h.scavengeCredit {
-               nbytes -= h.scavengeCredit
-               h.scavengeCredit = 0
-       } else {
-               h.scavengeCredit -= nbytes
-               return
+// scavengeSplit takes t.span() and attempts to split off a span containing size
+// (in bytes) worth of physical pages from the back.
+//
+// The split point is only approximately defined by size since the split point
+// is aligned to physPageSize and pageSize every time. If physHugePageSize is
+// non-zero and the split point would break apart a huge page in the span, then
+// the split point is also aligned to physHugePageSize.
+//
+// If the desired split point ends up at the base of s, or if size is obviously
+// much larger than s, then a split is not possible and this method returns nil.
+// Otherwise if a split occurred it returns the newly-created span.
+func (h *mheap) scavengeSplit(t treapIter, size uintptr) *mspan {
+       s := t.span()
+       start, end := s.physPageBounds()
+       if end <= start || end-start <= size {
+               // Size covers the whole span.
+               return nil
        }
-       // Iterate over the treap backwards (from largest to smallest) scavenging spans
-       // until we've reached our quota of nbytes.
-       released := uintptr(0)
-       for t := h.free.end(); released < nbytes && t.valid(); {
-               s := t.span()
-               r := s.scavenge()
-               if r == 0 {
-                       // Since we're going in order of largest-to-smallest span, this
-                       // means all other spans are no bigger than s. There's a high
-                       // chance that the other spans don't even cover a full page,
-                       // (though they could) but iterating further just for a handful
-                       // of pages probably isn't worth it, so just stop here.
-                       //
-                       // This check also preserves the invariant that spans that have
-                       // `scavenged` set are only ever in the `scav` treap, and
-                       // those which have it unset are only in the `free` treap.
-                       return
-               }
-               n := t.prev()
-               h.free.erase(t)
-               // Now that s is scavenged, we must eagerly coalesce it
-               // with its neighbors to prevent having two spans with
-               // the same scavenged state adjacent to each other.
-               h.coalesce(s)
-               t = n
-               h.scav.insert(s)
-               released += r
+       // The span is bigger than what we need, so compute the base for the new
+       // span if we decide to split.
+       base := end - size
+       // Round down to the next physical or logical page, whichever is bigger.
+       base &^= (physPageSize - 1) | (pageSize - 1)
+       if base <= start {
+               return nil
        }
-       // If we over-scavenged, turn that extra amount into credit.
-       if released > nbytes {
-               h.scavengeCredit += released - nbytes
+       if physHugePageSize > pageSize && base&^(physHugePageSize-1) >= start {
+               // We're in danger of breaking apart a huge page, so include the entire
+               // huge page in the bound by rounding down to the huge page size.
+               // base should still be aligned to pageSize.
+               base &^= physHugePageSize - 1
        }
+       if base == start {
+               // After all that we rounded base down to s.base(), so no need to split.
+               return nil
+       }
+       if base < start {
+               print("runtime: base=", base, ", s.npages=", s.npages, ", s.base()=", s.base(), ", size=", size, "\n")
+               print("runtime: physPageSize=", physPageSize, ", physHugePageSize=", physHugePageSize, "\n")
+               throw("bad span split base")
+       }
+
+       // Split s in-place, removing from the back.
+       n := (*mspan)(h.spanalloc.alloc())
+       nbytes := s.base() + s.npages*pageSize - base
+       h.free.mutate(t, func(s *mspan) {
+               n.init(base, nbytes/pageSize)
+               s.npages -= nbytes / pageSize
+               h.setSpan(n.base()-1, s)
+               h.setSpan(n.base(), n)
+               h.setSpan(n.base()+nbytes-1, n)
+               n.needzero = s.needzero
+               n.state = s.state
+       })
+       return n
 }
 
-// scavengeAll visits each node in the unscav treap and scavenges the
-// treapNode's span. It then removes the scavenged span from
-// unscav and adds it into scav before continuing. h must be locked.
-func (h *mheap) scavengeAll(now, limit uint64) uintptr {
-       // Iterate over the treap scavenging spans if unused for at least limit time.
+// scavengeLocked scavenges nbytes worth of spans in the free treap by
+// starting from the span with the highest base address and working down.
+// It then takes those spans and places them in scav.
+//
+// Returns the amount of memory scavenged in bytes. h must be locked.
+func (h *mheap) scavengeLocked(nbytes uintptr) uintptr {
        released := uintptr(0)
-       for t := h.free.start(); t.valid(); {
-               s := t.span()
-               n := t.next()
-               if (now - uint64(s.unusedsince)) > limit {
-                       r := s.scavenge()
-                       if r != 0 {
+       // Iterate over spans with huge pages first, then spans without.
+       const mask = treapIterScav | treapIterHuge
+       for _, match := range []treapIterType{treapIterHuge, 0} {
+               // Iterate over the treap backwards (from highest address to lowest address)
+               // scavenging spans until we've reached our quota of nbytes.
+               for t := h.free.end(mask, match); released < nbytes && t.valid(); {
+                       s := t.span()
+                       start, end := s.physPageBounds()
+                       if start >= end {
+                               // This span doesn't cover at least one physical page, so skip it.
+                               t = t.prev()
+                               continue
+                       }
+                       n := t.prev()
+                       if span := h.scavengeSplit(t, nbytes-released); span != nil {
+                               s = span
+                       } else {
                                h.free.erase(t)
-                               // Now that s is scavenged, we must eagerly coalesce it
-                               // with its neighbors to prevent having two spans with
-                               // the same scavenged state adjacent to each other.
-                               h.coalesce(s)
-                               h.scav.insert(s)
-                               released += r
                        }
+                       released += s.scavenge()
+                       // Now that s is scavenged, we must eagerly coalesce it
+                       // with its neighbors to prevent having two spans with
+                       // the same scavenged state adjacent to each other.
+                       h.coalesce(s)
+                       t = n
+                       h.free.insert(s)
                }
-               t = n
        }
        return released
 }
 
-func (h *mheap) scavenge(k int32, now, limit uint64) {
+// scavengeIfNeededLocked calls scavengeLocked if we're currently above the
+// scavenge goal in order to prevent the mutator from out-running the
+// the scavenger.
+//
+// h must be locked.
+func (h *mheap) scavengeIfNeededLocked(size uintptr) {
+       if r := heapRetained(); r+uint64(size) > h.scavengeRetainedGoal {
+               todo := uint64(size)
+               // If we're only going to go a little bit over, just request what
+               // we actually need done.
+               if overage := r + uint64(size) - h.scavengeRetainedGoal; overage < todo {
+                       todo = overage
+               }
+               h.scavengeLocked(uintptr(todo))
+       }
+}
+
+// scavengeAll visits each node in the free treap and scavenges the
+// treapNode's span. It then removes the scavenged span from
+// unscav and adds it into scav before continuing.
+func (h *mheap) scavengeAll() {
        // Disallow malloc or panic while holding the heap lock. We do
        // this here because this is an non-mallocgc entry-point to
        // the mheap API.
        gp := getg()
        gp.m.mallocing++
        lock(&h.lock)
-       released := h.scavengeAll(now, limit)
+       released := h.scavengeLocked(^uintptr(0))
        unlock(&h.lock)
        gp.m.mallocing--
 
        if debug.gctrace > 0 {
                if released > 0 {
-                       print("scvg", k, ": ", released>>20, " MB released\n")
+                       print("forced scvg: ", released>>20, " MB released\n")
                }
-               print("scvg", k, ": inuse: ", memstats.heap_inuse>>20, ", idle: ", memstats.heap_idle>>20, ", sys: ", memstats.heap_sys>>20, ", released: ", memstats.heap_released>>20, ", consumed: ", (memstats.heap_sys-memstats.heap_released)>>20, " (MB)\n")
+               print("forced scvg: inuse: ", memstats.heap_inuse>>20, ", idle: ", memstats.heap_idle>>20, ", sys: ", memstats.heap_sys>>20, ", released: ", memstats.heap_released>>20, ", consumed: ", (memstats.heap_sys-memstats.heap_released)>>20, " (MB)\n")
        }
 }
 
 //go:linkname runtime_debug_freeOSMemory runtime..z2fdebug.freeOSMemory
 func runtime_debug_freeOSMemory() {
        GC()
-       systemstack(func() { mheap_.scavenge(-1, ^uint64(0), 0) })
+       systemstack(func() { mheap_.scavengeAll() })
 }
 
 // Initialize a new span with the given start and npages.
@@ -1462,7 +1504,6 @@ func (span *mspan) init(base uintptr, npages uintptr) {
        span.spanclass = 0
        span.elemsize = 0
        span.state = mSpanDead
-       span.unusedsince = 0
        span.scavenged = false
        span.speciallock.key = 0
        span.specials = nil
index b146dbcd6c936be1c8ecbe79de86a28438d3be13..cacbb64207a0088ac95cfe4850959444f60fece5 100644 (file)
@@ -171,7 +171,7 @@ func makeClasses() []class {
 // computeDivMagic computes some magic constants to implement
 // the division required to compute object number from span offset.
 // n / c.size is implemented as n >> c.shift * c.mul >> c.shift2
-// for all 0 <= n < c.npages * pageSize
+// for all 0 <= n <= c.npages * pageSize
 func computeDivMagic(c *class) {
        // divisor
        d := c.size
@@ -180,7 +180,7 @@ func computeDivMagic(c *class) {
        }
 
        // maximum input value for which the formula needs to work.
-       max := c.npages*pageSize - 1
+       max := c.npages * pageSize
 
        if powerOfTwo(d) {
                // If the size is a power of two, heapBitsForObject can divide even faster by masking.
index cd9da02afdaa84cd924cd75d645e5f36e0653669..cdab2ca7b87b6ec40015e93081e4e3cafb739f60 100644 (file)
@@ -470,6 +470,9 @@ func readGCStats(pauses *[]uint64) {
        })
 }
 
+// readGCStats_m must be called on the system stack because it acquires the heap
+// lock. See mheap for details.
+//go:systemstack
 func readGCStats_m(pauses *[]uint64) {
        p := *pauses
        // Calling code in runtime/debug should make the slice large enough.
index 00c7f52514784b2b82705a6804c3db5a1eedd9ab..1ce98082d1079d71961b33bd30e5f6508f5f85aa 100644 (file)
@@ -52,13 +52,14 @@ type pollDesc struct {
        // The lock protects pollOpen, pollSetDeadline, pollUnblock and deadlineimpl operations.
        // This fully covers seq, rt and wt variables. fd is constant throughout the PollDesc lifetime.
        // pollReset, pollWait, pollWaitCanceled and runtime·netpollready (IO readiness notification)
-       // proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated
+       // proceed w/o taking the lock. So closing, everr, rg, rd, wg and wd are manipulated
        // in a lock-free way by all operations.
        // NOTE(dvyukov): the following code uses uintptr to store *g (rg/wg),
        // that will blow up when GC starts moving objects.
        lock    mutex // protects the following fields
        fd      uintptr
        closing bool
+       everr   bool    // marks event scanning error happened
        user    uint32  // user settable cookie
        rseq    uintptr // protects from stale read timers
        rg      uintptr // pdReady, pdWait, G waiting for read or nil
@@ -123,6 +124,7 @@ func poll_runtime_pollOpen(fd uintptr) (uintptr, int) {
        }
        pd.fd = fd
        pd.closing = false
+       pd.everr = false
        pd.rseq++
        pd.rg = 0
        pd.rd = 0
@@ -181,8 +183,8 @@ func poll_runtime_pollWait(ctx uintptr, mode int) int {
        if err != 0 {
                return err
        }
-       // As for now only Solaris, AIX and Hurd use level-triggered IO.
-       if GOOS == "solaris" || GOOS == "aix" || GOOS == "hurd" {
+       // As for now only Solaris, illumos, and AIX use level-triggered IO.
+       if GOOS == "solaris" || GOOS == "illumos" || GOOS == "aix" || GOOS == "hurd" {
                netpollarm(pd, mode)
        }
        for !netpollblock(pd, int32(mode), false) {
@@ -344,10 +346,16 @@ func netpollready(toRun *gList, pd *pollDesc, mode int32) {
 
 func netpollcheckerr(pd *pollDesc, mode int32) int {
        if pd.closing {
-               return 1 // errClosing
+               return 1 // ErrFileClosing or ErrNetClosing
        }
        if (mode == 'r' && pd.rd < 0) || (mode == 'w' && pd.wd < 0) {
-               return 2 // errTimeout
+               return 2 // ErrTimeout
+       }
+       // Report an event scanning error only on a read event.
+       // An error on a write event will be captured in a subsequent
+       // write call that is able to report a more specific error.
+       if mode == 'r' && pd.everr {
+               return 3 // ErrNotPollable
        }
        return 0
 }
index 70bf9eb876e9da009346ab76394e883d1c5cba9d..39e36c7027487d5847258499f76a4f02ec880883 100644 (file)
@@ -48,8 +48,6 @@ var (
        pendingUpdates int32
 )
 
-const pollVerbose = false
-
 func netpollinit() {
        var p [2]int32
 
@@ -69,13 +67,7 @@ func netpollinit() {
        fcntl(wrwake, _F_SETFD, _FD_CLOEXEC)
 
        // Pre-allocate array of pollfd structures for poll.
-       if pollVerbose {
-               println("*** allocating")
-       }
        pfds = make([]pollfd, 1, 128)
-       if pollVerbose {
-               println("*** allocating done", &pfds[0])
-       }
 
        // Poll the read side of the pipe.
        pfds[0].fd = rdwake
@@ -97,18 +89,12 @@ func netpolldescriptor() uintptr {
 func netpollwakeup() {
        if pendingUpdates == 0 {
                pendingUpdates = 1
-               if pollVerbose {
-                       println("*** writing 1 byte")
-               }
                b := [1]byte{0}
                write(uintptr(wrwake), unsafe.Pointer(&b[0]), 1)
        }
 }
 
 func netpollopen(fd uintptr, pd *pollDesc) int32 {
-       if pollVerbose {
-               println("*** netpollopen", fd)
-       }
        lock(&mtxpoll)
        netpollwakeup()
 
@@ -123,9 +109,6 @@ func netpollopen(fd uintptr, pd *pollDesc) int32 {
 }
 
 func netpollclose(fd uintptr) int32 {
-       if pollVerbose {
-               println("*** netpollclose", fd)
-       }
        lock(&mtxpoll)
        netpollwakeup()
 
@@ -148,9 +131,6 @@ func netpollclose(fd uintptr) int32 {
 }
 
 func netpollarm(pd *pollDesc, mode int) {
-       if pollVerbose {
-               println("*** netpollarm", pd.fd, mode)
-       }
        lock(&mtxpoll)
        netpollwakeup()
 
@@ -173,31 +153,19 @@ func netpoll(block bool) gList {
                timeout = 0
                return gList{}
        }
-       if pollVerbose {
-               println("*** netpoll", block)
-       }
 retry:
        lock(&mtxpoll)
        lock(&mtxset)
        pendingUpdates = 0
        unlock(&mtxpoll)
 
-       if pollVerbose {
-               println("*** netpoll before poll")
-       }
        n := libc_poll(&pfds[0], uintptr(len(pfds)), timeout)
-       if pollVerbose {
-               println("*** netpoll after poll", n)
-       }
        if n < 0 {
                e := errno()
                if e != _EINTR {
                        println("errno=", e, " len(pfds)=", len(pfds))
                        throw("poll failed")
                }
-               if pollVerbose {
-                       println("*** poll failed")
-               }
                unlock(&mtxset)
                goto retry
        }
@@ -205,9 +173,6 @@ retry:
        if n != 0 && pfds[0].revents&(_POLLIN|_POLLHUP|_POLLERR) != 0 {
                var b [1]byte
                for read(rdwake, unsafe.Pointer(&b[0]), 1) == 1 {
-                       if pollVerbose {
-                               println("*** read 1 byte from pipe")
-                       }
                }
                // Do not look at the other fds in this case as the mode may have changed
                // XXX only additions of flags are made, so maybe it is ok
@@ -228,8 +193,9 @@ retry:
                        pfd.events &= ^_POLLOUT
                }
                if mode != 0 {
-                       if pollVerbose {
-                               println("*** netpollready i=", i, "revents=", pfd.revents, "events=", pfd.events, "pd=", pds[i])
+                       pds[i].everr = false
+                       if pfd.revents == _POLLERR {
+                               pds[i].everr = true
                        }
                        netpollready(&toRun, pds[i], mode)
                        n--
@@ -239,8 +205,5 @@ retry:
        if block && toRun.empty() {
                goto retry
        }
-       if pollVerbose {
-               println("*** netpoll returning end")
-       }
        return toRun
 }
index 2004fbc4da86345b9acb5ebac0a8670416244747..885ac1fe1e57ddb5f95eccbc20d88b7958a24a47 100644 (file)
@@ -109,7 +109,10 @@ retry:
                }
                if mode != 0 {
                        pd := *(**pollDesc)(unsafe.Pointer(&ev.data))
-
+                       pd.everr = false
+                       if ev.events == _EPOLLERR {
+                               pd.everr = true
+                       }
                        netpollready(&toRun, pd, mode)
                }
        }
index 4ea3ac9f27e6940a4dd0233ba376a287b87288f2..ce1acdf0cf5d3f0e91f370bb8272f31238f6935b 100644 (file)
@@ -118,7 +118,12 @@ retry:
                        mode += 'w'
                }
                if mode != 0 {
-                       netpollready(&toRun, (*pollDesc)(unsafe.Pointer(ev.udata)), mode)
+                       pd := (*pollDesc)(unsafe.Pointer(ev.udata))
+                       pd.everr = false
+                       if ev.flags == _EV_ERROR {
+                               pd.everr = true
+                       }
+                       netpollready(&toRun, pd, mode)
                }
        }
        if block && toRun.empty() {
index b8baffdfc12eca07241b9bb73c71279afb51e759..222af29b73ef5fc526cb28942ef25b934839e3ac 100644 (file)
@@ -219,6 +219,11 @@ retry:
                }
 
                if mode != 0 {
+                       // TODO(mikio): Consider implementing event
+                       // scanning error reporting once we are sure
+                       // about the event port on SmartOS.
+                       //
+                       // See golang.org/x/issue/30840.
                        netpollready(&toRun, pd, mode)
                }
        }
index deaa9e9d26d77da934f0da458a0bd36deafbe2d2..498bd430e5453bebffc6c7c5be35e51fe4c7739c 100644 (file)
@@ -71,7 +71,7 @@ func semasleep(ns int64) int32 {
                                return -1
                        }
                        var t timespec
-                       t.set_nsec(ns - spent)
+                       t.setNsec(ns - spent)
                        err := pthread_cond_timedwait_relative_np(&mp.cond, &mp.mutex, &t)
                        if err == _ETIMEDOUT {
                                pthread_mutex_unlock(&mp.mutex)
index f8577e4226ec2b706b8c6eed9d50920712389cd2..611a8cd4627f511bda6fdfb78dc32af3959c420b 100644 (file)
@@ -139,7 +139,7 @@ func futexsleep1(addr *uint32, val uint32, ns int64) {
        if ns >= 0 {
                var ut umtx_time
                ut._clockid = _CLOCK_MONOTONIC
-               ut._timeout.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ut._timeout.tv_nsec)))))
+               ut._timeout.setNsec(ns)
                utp = &ut
        }
        ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp)
index 3a545d0768d4ce5e573b5f03b0f490ed6cda768a..5be5a1d9713ce269fabfd9f6acafc72f1607a34a 100644 (file)
@@ -60,8 +60,7 @@ func semasleep(ns int64) int32 {
        _m_ := getg().m
        if ns >= 0 {
                var ts timespec
-               ts.set_sec(ns / 1000000000)
-               ts.set_nsec(int32(ns % 1000000000))
+               ts.setNsec(ns)
 
                if sem_timedwait((*_sem_t)(unsafe.Pointer(_m_.mos.waitsema)), &ts) != 0 {
                        err := errno()
index b72872f182238403bf43e97d88703268dc5f9034..1e86446655743af472f025dc3d19a76b4ec5b934 100644 (file)
@@ -44,8 +44,6 @@ const (
 // Don't sleep longer than ns; ns < 0 means forever.
 //go:nosplit
 func futexsleep(addr *uint32, val uint32, ns int64) {
-       var ts timespec
-
        // Some Linux kernels have a bug where futex of
        // FUTEX_WAIT returns an internal error code
        // as an errno. Libpthread ignores the return value
@@ -56,19 +54,8 @@ func futexsleep(addr *uint32, val uint32, ns int64) {
                return
        }
 
-       // It's difficult to live within the no-split stack limits here.
-       // On ARM and 386, a 64-bit divide invokes a general software routine
-       // that needs more stack than we can afford. So we use timediv instead.
-       // But on real 64-bit systems, where words are larger but the stack limit
-       // is not, even timediv is too heavy, and we really need to use just an
-       // ordinary machine instruction.
-       if sys.PtrSize == 8 {
-               ts.set_sec(ns / 1000000000)
-               ts.set_nsec(int32(ns % 1000000000))
-       } else {
-               ts.tv_nsec = 0
-               ts.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ts.tv_nsec)))))
-       }
+       var ts timespec
+       ts.setNsec(ns)
        futex(unsafe.Pointer(addr), _FUTEX_WAIT_PRIVATE, val, unsafe.Pointer(&ts), nil, 0)
 }
 
index b7aa9535df3f349a36b27fcd2a9d2a6d009c7f1e..7c3d41fb9d1cd25e3073777bbe83ca6c4c235025 100644 (file)
@@ -84,9 +84,7 @@ func semasleep(ns int64) int32 {
                        if wait <= 0 {
                                return -1
                        }
-                       var nsec int32
-                       ts.set_sec(timediv(wait, 1000000000, &nsec))
-                       ts.set_nsec(nsec)
+                       ts.setNsec(wait)
                        tsp = &ts
                }
                ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil)
diff --git a/libgo/go/runtime/os_netbsd_arm64.go b/libgo/go/runtime/os_netbsd_arm64.go
new file mode 100644 (file)
index 0000000..fd81eb7
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package runtime
+
+import "unsafe"
+
+func lwp_mcontext_init(mc *mcontextt, stk unsafe.Pointer, mp *m, gp *g, fn uintptr) {
+       // Machine dependent mcontext initialisation for LWP.
+       mc.__gregs[_REG_ELR] = uint64(funcPC(lwp_tramp))
+       mc.__gregs[_REG_X31] = uint64(uintptr(stk))
+       mc.__gregs[_REG_X0] = uint64(uintptr(unsafe.Pointer(mp)))
+       mc.__gregs[_REG_X1] = uint64(uintptr(unsafe.Pointer(mp.g0)))
+       mc.__gregs[_REG_X2] = uint64(fn)
+}
+
+//go:nosplit
+func cputicks() int64 {
+       // Currently cputicks() is used in blocking profiler and to seed runtime·fastrand().
+       // runtime·nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
+       // TODO: need more entropy to better seed fastrand.
+       return nanotime()
+}
index 4298172b0546f8d10343d820f10f07dee8dfddde..9cfaa94b08642b96112456c3c63557b8c95dff62 100644 (file)
@@ -86,10 +86,7 @@ func semasleep(ns int64) int32 {
        var tsp *timespec
        if ns >= 0 {
                var ts timespec
-               var nsec int32
-               ns += nanotime()
-               ts.set_sec(int64(timediv(ns, 1000000000, &nsec)))
-               ts.set_nsec(nsec)
+               ts.setNsec(ns + nanotime())
                tsp = &ts
        }
 
diff --git a/libgo/go/runtime/os_openbsd_arm64.go b/libgo/go/runtime/os_openbsd_arm64.go
new file mode 100644 (file)
index 0000000..f15a95b
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package runtime
+
+import (
+       "internal/cpu"
+)
+
+//go:nosplit
+func cputicks() int64 {
+       // Currently cputicks() is used in blocking profiler and to seed runtime·fastrand().
+       // runtime·nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
+       // TODO: need more entropy to better seed fastrand.
+       return nanotime()
+}
+
+func sysargs(argc int32, argv **byte) {
+       // OpenBSD does not have auxv, however we still need to initialise cpu.HWCaps.
+       // For now specify the bare minimum until we add some form of capabilities
+       // detection. See issue #31746.
+       cpu.HWCap = 1<<1 | 1<<0 // ASIMD, FP
+}
index cf457680f71db17a737f08ccae20ba44869c6938..ea723936c5c625347a4a41a8322b3bc15d086901 100644 (file)
@@ -52,8 +52,7 @@ func semasleep(ns int64) int32 {
        _m_ := getg().m
        if ns >= 0 {
                var ts timespec
-               ts.set_sec(ns / 1000000000)
-               ts.set_nsec(int32(ns % 1000000000))
+               ts.setNsec(ns)
 
                if sem_reltimedwait_np((*semt)(unsafe.Pointer(_m_.mos.waitsema)), &ts) != 0 {
                        err := errno()
index 8e56bbe8b56b7c58f3215c02ce32bcb7a5e2b39c..21ffb5c2d0de1a47ba9a7bb3393bb91f179cad95 100644 (file)
@@ -61,24 +61,13 @@ func panicCheck1(pc uintptr, msg string) {
 }
 
 // Same as above, but calling from the runtime is allowed.
-//
-// Using this function is necessary for any panic that may be
-// generated by runtime.sigpanic, since those are always called by the
-// runtime.
 func panicCheck2(err string) {
-       // panic allocates, so to avoid recursive malloc, turn panics
-       // during malloc into throws.
        gp := getg()
        if gp != nil && gp.m != nil && gp.m.mallocing != 0 {
                throw(err)
        }
 }
 
-// Many of the following panic entry-points turn into throws when they
-// happen in various runtime contexts. These should never happen in
-// the runtime, and if they do, they indicate a serious issue and
-// should not be caught by user code.
-//
 // The panic{Index,Slice,divide,shift} functions are called by
 // code generated by the compiler for out of bounds index expressions,
 // out of bounds slice expressions, division by zero, and shift by negative.
@@ -208,10 +197,6 @@ func panicmem() {
        panic(memoryError)
 }
 
-func throwinit() {
-       throw("recursive call during initialization - linker skew")
-}
-
 // deferproc creates a new deferred function.
 // The compiler turns a defer statement into a call to this.
 // frame points into the stack frame; it is used to determine which
@@ -1200,6 +1185,8 @@ func dopanic_m(gp *g, pc, sp uintptr) bool {
                lock(&deadlock)
        }
 
+       printDebugLog()
+
        return docrash
 }
 
index a6f8354b1e8ccf4242ec4c1a90faa815591324e2..443accdd6d3f256eda3d73784a1f93088c369819 100644 (file)
@@ -211,9 +211,7 @@ func (p *Profile) setMain() {
                        continue
                }
                // Swap what we guess is main to position 0.
-               tmp := p.Mapping[i]
-               p.Mapping[i] = p.Mapping[0]
-               p.Mapping[0] = tmp
+               p.Mapping[i], p.Mapping[0] = p.Mapping[0], p.Mapping[i]
                break
        }
 }
index 35647ee3ce1f2114a25b9e5014544ab8807ca33a..20f9cdbae6fe0b3b1c2a3bebb39ccdfd654209b9 100644 (file)
@@ -54,6 +54,8 @@ func WithLabels(ctx context.Context, labels LabelSet) context.Context {
 // Labels takes an even number of strings representing key-value pairs
 // and makes a LabelSet containing them.
 // A label overwrites a prior label with the same key.
+// Currently only CPU profile utilizes labels information.
+// See https://golang.org/issue/23458 for details.
 func Labels(args ...string) LabelSet {
        if len(args)%2 != 0 {
                panic("uneven number of arguments to pprof.Labels")
index bf9f5266e29e7399e9c0aef5534ec98b80d3f848..49a555c82c83c8bd3e4897ac3ffb8280dbc90bdc 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build !aix,!nacl,!js
+// +build !nacl,!js
 
 package pprof
 
@@ -159,12 +159,27 @@ func testCPUProfile(t *testing.T, matches matchFunc, need []string, avoid []stri
                t.Skip("skipping on plan9")
        }
 
-       const maxDuration = 5 * time.Second
+       broken := false
+       switch runtime.GOOS {
+       case "darwin", "dragonfly", "netbsd", "illumos", "solaris":
+               broken = true
+       case "openbsd":
+               if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
+                       broken = true
+               }
+       }
+
+       maxDuration := 5 * time.Second
+       if testing.Short() && broken {
+               // If it's expected to be broken, no point waiting around.
+               maxDuration /= 10
+       }
+
        // If we're running a long test, start with a long duration
        // for tests that try to make sure something *doesn't* happen.
        duration := 5 * time.Second
        if testing.Short() {
-               duration = 200 * time.Millisecond
+               duration = 100 * time.Millisecond
        }
 
        // Profiling tests are inherently flaky, especially on a
@@ -190,14 +205,10 @@ func testCPUProfile(t *testing.T, matches matchFunc, need []string, avoid []stri
                }
        }
 
-       switch runtime.GOOS {
-       case "darwin", "dragonfly", "netbsd", "solaris":
-               t.Skipf("ignoring failure on %s; see golang.org/issue/13841", runtime.GOOS)
-       case "openbsd":
-               if runtime.GOARCH == "arm" {
-                       t.Skipf("ignoring failure on %s/%s; see golang.org/issue/13841", runtime.GOOS, runtime.GOARCH)
-               }
+       if broken {
+               t.Skipf("ignoring failure on %s/%s; see golang.org/issue/13841", runtime.GOOS, runtime.GOARCH)
        }
+
        // Ignore the failure if the tests are running in a QEMU-based emulator,
        // QEMU is not perfect at emulating everything.
        // IN_QEMU environmental variable is set by some of the Go builders.
index 5a915fb4c3aaab4a504da59032490ed3c87d8c3f..7e7c7cc6f0afe96f46ddba730f83a29657ab7d20 100644 (file)
@@ -209,11 +209,11 @@ ffffffffff600000-ffffffffff601000 r-xp 00000090 00:00 0                  [vsysca
 7ffc34343000 7ffc34345000 00000000 [vdso]
 ffffffffff600000 ffffffffff601000 00000090 [vsyscall]
 
-00400000-07000000 r-xp 00000000 00:00 0 
+00400000-07000000 r-xp 00000000 00:00 0
 07000000-07093000 r-xp 06c00000 00:2e 536754                             /path/to/gobench_server_main
 07093000-0722d000 rw-p 06c92000 00:2e 536754                             /path/to/gobench_server_main
-0722d000-07b21000 rw-p 00000000 00:00 0 
-c000000000-c000036000 rw-p 00000000 00:00 0 
+0722d000-07b21000 rw-p 00000000 00:00 0
+c000000000-c000036000 rw-p 00000000 00:00 0
 ->
 07000000 07093000 06c00000 /path/to/gobench_server_main
 `
@@ -303,7 +303,7 @@ func TestProcSelfMaps(t *testing.T) {
        })
 }
 
-// TestMapping checkes the mapping section of CPU profiles
+// TestMapping checks the mapping section of CPU profiles
 // has the HasFunctions field set correctly. If all PCs included
 // in the samples are successfully symbolized, the corresponding
 // mapping entry (in this test case, only one entry) should have
index 7850faab0de11dec49dbabbba935bb77a5aef4e4..476b9e88a3297f3a06f652cdfcf280fedb66b87a 100644 (file)
@@ -69,7 +69,7 @@ func main() {
        if err := pprof.StartCPUProfile(os.Stdout); err != nil {
                log.Fatal("can't start CPU profile: ", err)
        }
-       time.Sleep(1 * time.Second)
+       time.Sleep(200 * time.Millisecond)
        pprof.StopCPUProfile()
 
        if err := os.Stdout.Close(); err != nil {
index fa85d262efea47f767548ec31f4deae692bccca0..afedad50b215fb03aed2f6dd4578fd88346b99bd 100644 (file)
@@ -70,6 +70,9 @@ func main_main()
 
 var buildVersion = sys.TheVersion
 
+// set using cmd/go/internal/modload.ModInfoProg
+var modinfo string
+
 // Goroutine scheduler
 // The scheduler's job is to distribute ready-to-run goroutines over worker threads.
 //
@@ -134,8 +137,9 @@ var buildVersion = sys.TheVersion
 // for nmspinning manipulation.
 
 var (
-       m0 m
-       g0 g
+       m0           m
+       g0           g
+       raceprocctx0 uintptr
 )
 
 // main_init_done is a signal used by cgocallbackg that initialization
@@ -187,6 +191,10 @@ func main(unsafe.Pointer) {
                throw("runtime.main not on m0")
        }
 
+       if nanotime() == 0 {
+               throw("nanotime returning zero")
+       }
+
        // Defer unlock so that runtime.Goexit during init does the unlock too.
        needUnlock := true
        defer func() {
@@ -211,13 +219,13 @@ func main(unsafe.Pointer) {
        createGcRootsIndex()
        close(main_init_done)
 
-       needUnlock = false
-       unlockOSThread()
-
        // For gccgo we have to wait until after main is initialized
        // to enable GC, because initializing main registers the GC roots.
        gcenable()
 
+       needUnlock = false
+       unlockOSThread()
+
        if isarchive || islibrary {
                // A program compiled with -buildmode=c-archive or c-shared
                // has a main, but it is not executed.
@@ -322,7 +330,7 @@ func gopark(unlockf func(*g, unsafe.Pointer) bool, lock unsafe.Pointer, reason w
                throw("gopark: bad g status")
        }
        mp.waitlock = lock
-       mp.waitunlockf = *(*unsafe.Pointer)(unsafe.Pointer(&unlockf))
+       mp.waitunlockf = unlockf
        gp.waitreason = reason
        mp.waittraceev = traceEv
        mp.waittraceskip = traceskip
@@ -491,7 +499,7 @@ func cpuinit() {
        var env string
 
        switch GOOS {
-       case "aix", "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "solaris", "linux":
+       case "aix", "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "illumos", "solaris", "linux":
                cpu.DebugOptions = true
 
                // Similar to goenv_unix but extracts the environment value for
@@ -577,6 +585,11 @@ func schedinit() {
                // to ensure runtime·buildVersion is kept in the resulting binary.
                buildVersion = "unknown"
        }
+       if len(modinfo) == 1 {
+               // Condition should never trigger. This code just serves
+               // to ensure runtime·modinfo is kept in the resulting binary.
+               modinfo = ""
+       }
 }
 
 func dumpgstatus(gp *g) {
@@ -637,7 +650,7 @@ func ready(gp *g, traceskip int, next bool) {
 
        // Mark runnable.
        _g_ := getg()
-       _g_.m.locks++ // disable preemption because it can be holding p in a local var
+       mp := acquirem() // disable preemption because it can be holding p in a local var
        if status&^_Gscan != _Gwaiting {
                dumpgstatus(gp)
                throw("bad g->status in ready")
@@ -649,7 +662,7 @@ func ready(gp *g, traceskip int, next bool) {
        if atomic.Load(&sched.npidle) != 0 && atomic.Load(&sched.nmspinning) == 0 {
                wakep()
        }
-       _g_.m.locks--
+       releasem(mp)
 }
 
 // freezeStopWait is a large value that freezetheworld sets
@@ -684,13 +697,6 @@ func freezetheworld() {
        usleep(1000)
 }
 
-func isscanstatus(status uint32) bool {
-       if status == _Gscan {
-               throw("isscanstatus: Bad status Gscan")
-       }
-       return status&_Gscan == _Gscan
-}
-
 // All reads and writes of g's status go through readgstatus, casgstatus
 // castogscanstatus, casfrom_Gscanstatus.
 //go:nosplit
@@ -1111,9 +1117,7 @@ func stopTheWorldWithSema() {
 }
 
 func startTheWorldWithSema(emitTraceEvent bool) int64 {
-       _g_ := getg()
-
-       _g_.m.locks++ // disable preemption because it can be holding p in a local var
+       mp := acquirem() // disable preemption because it can be holding p in a local var
        if netpollinited() {
                list := netpoll(false) // non-blocking
                injectglist(&list)
@@ -1163,7 +1167,7 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 {
                wakep()
        }
 
-       _g_.m.locks--
+       releasem(mp)
 
        return startTime
 }
@@ -1477,7 +1481,7 @@ func runSafePointFn() {
 //go:yeswritebarrierrec
 func allocm(_p_ *p, fn func(), allocatestack bool) (mp *m, g0Stack unsafe.Pointer, g0StackSize uintptr) {
        _g_ := getg()
-       _g_.m.locks++ // disable GC because it can be called from sysmon
+       acquirem() // disable GC because it can be called from sysmon
        if _g_.m.p == 0 {
                acquirep(_p_) // temporarily borrow p for mallocs in this function
        }
@@ -1512,7 +1516,7 @@ func allocm(_p_ *p, fn func(), allocatestack bool) (mp *m, g0Stack unsafe.Pointe
        if _p_ == _g_.m.p.ptr() {
                releasep()
        }
-       _g_.m.locks--
+       releasem(_g_.m)
 
        return mp, g0Stack, g0StackSize
 }
@@ -2480,15 +2484,22 @@ top:
 
        var gp *g
        var inheritTime bool
+
+       // Normal goroutines will check for need to wakeP in ready,
+       // but GCworkers and tracereaders will not, so the check must
+       // be done here instead.
+       tryWakeP := false
        if trace.enabled || trace.shutdown {
                gp = traceReader()
                if gp != nil {
                        casgstatus(gp, _Gwaiting, _Grunnable)
                        traceGoUnpark(gp, 0)
+                       tryWakeP = true
                }
        }
        if gp == nil && gcBlackenEnabled != 0 {
                gp = gcController.findRunnableGCWorker(_g_.m.p.ptr())
+               tryWakeP = tryWakeP || gp != nil
        }
        if gp == nil {
                // Check the global runnable queue once in a while to ensure fairness.
@@ -2549,6 +2560,13 @@ top:
                }
        }
 
+       // If about to schedule a not-normal goroutine (a GCworker or tracereader),
+       // wake a P if there is one.
+       if tryWakeP {
+               if atomic.Load(&sched.npidle) != 0 && atomic.Load(&sched.nmspinning) == 0 {
+                       wakep()
+               }
+       }
        if gp.lockedm != 0 {
                // Hands off own p to the locked m,
                // then blocks waiting for a new p.
@@ -2589,8 +2607,7 @@ func park_m(gp *g) {
        dropg()
        casgstatus(gp, _Grunning, _Gwaiting)
 
-       if _g_.m.waitunlockf != nil {
-               fn := *(*func(*g, unsafe.Pointer) bool)(unsafe.Pointer(&_g_.m.waitunlockf))
+       if fn := _g_.m.waitunlockf; fn != nil {
                ok := fn(gp, _g_.m.waitlock)
                _g_.m.waitunlockf = nil
                _g_.m.waitlock = nil
@@ -3151,7 +3168,7 @@ func newproc(fn uintptr, arg unsafe.Pointer) *g {
                _g_.m.throwing = -1 // do not dump full stacks
                throw("go of nil func value")
        }
-       _g_.m.locks++ // disable preemption because it can be holding p in a local var
+       acquirem() // disable preemption because it can be holding p in a local var
 
        _p_ := _g_.m.p.ptr()
        newg := gfget(_p_)
@@ -3214,7 +3231,7 @@ func newproc(fn uintptr, arg unsafe.Pointer) *g {
        if atomic.Load(&sched.npidle) != 0 && atomic.Load(&sched.nmspinning) == 0 && mainStarted {
                wakep()
        }
-       _g_.m.locks--
+       releasem(_g_.m)
        return newg
 }
 
@@ -3673,6 +3690,88 @@ func setcpuprofilerate(hz int32) {
        _g_.m.locks--
 }
 
+// init initializes pp, which may be a freshly allocated p or a
+// previously destroyed p, and transitions it to status _Pgcstop.
+func (pp *p) init(id int32) {
+       pp.id = id
+       pp.status = _Pgcstop
+       pp.sudogcache = pp.sudogbuf[:0]
+       pp.deferpool = pp.deferpoolbuf[:0]
+       pp.wbBuf.reset()
+       if pp.mcache == nil {
+               if id == 0 {
+                       if getg().m.mcache == nil {
+                               throw("missing mcache?")
+                       }
+                       pp.mcache = getg().m.mcache // bootstrap
+               } else {
+                       pp.mcache = allocmcache()
+               }
+       }
+       if raceenabled && pp.raceprocctx == 0 {
+               if id == 0 {
+                       pp.raceprocctx = raceprocctx0
+                       raceprocctx0 = 0 // bootstrap
+               } else {
+                       pp.raceprocctx = raceproccreate()
+               }
+       }
+}
+
+// destroy releases all of the resources associated with pp and
+// transitions it to status _Pdead.
+//
+// sched.lock must be held and the world must be stopped.
+func (pp *p) destroy() {
+       // Move all runnable goroutines to the global queue
+       for pp.runqhead != pp.runqtail {
+               // Pop from tail of local queue
+               pp.runqtail--
+               gp := pp.runq[pp.runqtail%uint32(len(pp.runq))].ptr()
+               // Push onto head of global queue
+               globrunqputhead(gp)
+       }
+       if pp.runnext != 0 {
+               globrunqputhead(pp.runnext.ptr())
+               pp.runnext = 0
+       }
+       // If there's a background worker, make it runnable and put
+       // it on the global queue so it can clean itself up.
+       if gp := pp.gcBgMarkWorker.ptr(); gp != nil {
+               casgstatus(gp, _Gwaiting, _Grunnable)
+               if trace.enabled {
+                       traceGoUnpark(gp, 0)
+               }
+               globrunqput(gp)
+               // This assignment doesn't race because the
+               // world is stopped.
+               pp.gcBgMarkWorker.set(nil)
+       }
+       // Flush p's write barrier buffer.
+       if gcphase != _GCoff {
+               wbBufFlush1(pp)
+               pp.gcw.dispose()
+       }
+       for i := range pp.sudogbuf {
+               pp.sudogbuf[i] = nil
+       }
+       pp.sudogcache = pp.sudogbuf[:0]
+       for i := range pp.deferpoolbuf {
+               pp.deferpoolbuf[i] = nil
+       }
+       pp.deferpool = pp.deferpoolbuf[:0]
+       freemcache(pp.mcache)
+       pp.mcache = nil
+       gfpurge(pp)
+       traceProcFree(pp)
+       if raceenabled {
+               raceprocdestroy(pp.raceprocctx)
+               pp.raceprocctx = 0
+       }
+       pp.gcAssistTime = 0
+       pp.status = _Pdead
+}
+
 // Change number of processors. The world is stopped, sched is locked.
 // gcworkbufs are not being modified by either the GC or
 // the write barrier code.
@@ -3711,89 +3810,13 @@ func procresize(nprocs int32) *p {
        }
 
        // initialize new P's
-       for i := int32(0); i < nprocs; i++ {
+       for i := old; i < nprocs; i++ {
                pp := allp[i]
                if pp == nil {
                        pp = new(p)
-                       pp.id = i
-                       pp.status = _Pgcstop
-                       pp.sudogcache = pp.sudogbuf[:0]
-                       pp.deferpool = pp.deferpoolbuf[:0]
-                       pp.wbBuf.reset()
-                       atomicstorep(unsafe.Pointer(&allp[i]), unsafe.Pointer(pp))
-               }
-               if pp.mcache == nil {
-                       if old == 0 && i == 0 {
-                               if getg().m.mcache == nil {
-                                       throw("missing mcache?")
-                               }
-                               pp.mcache = getg().m.mcache // bootstrap
-                       } else {
-                               pp.mcache = allocmcache()
-                       }
                }
-       }
-
-       // free unused P's
-       for i := nprocs; i < old; i++ {
-               p := allp[i]
-               if trace.enabled && p == getg().m.p.ptr() {
-                       // moving to p[0], pretend that we were descheduled
-                       // and then scheduled again to keep the trace sane.
-                       traceGoSched()
-                       traceProcStop(p)
-               }
-               // move all runnable goroutines to the global queue
-               for p.runqhead != p.runqtail {
-                       // pop from tail of local queue
-                       p.runqtail--
-                       gp := p.runq[p.runqtail%uint32(len(p.runq))].ptr()
-                       // push onto head of global queue
-                       globrunqputhead(gp)
-               }
-               if p.runnext != 0 {
-                       globrunqputhead(p.runnext.ptr())
-                       p.runnext = 0
-               }
-               // if there's a background worker, make it runnable and put
-               // it on the global queue so it can clean itself up
-               if gp := p.gcBgMarkWorker.ptr(); gp != nil {
-                       casgstatus(gp, _Gwaiting, _Grunnable)
-                       if trace.enabled {
-                               traceGoUnpark(gp, 0)
-                       }
-                       globrunqput(gp)
-                       // This assignment doesn't race because the
-                       // world is stopped.
-                       p.gcBgMarkWorker.set(nil)
-               }
-               // Flush p's write barrier buffer.
-               if gcphase != _GCoff {
-                       wbBufFlush1(p)
-                       p.gcw.dispose()
-               }
-               for i := range p.sudogbuf {
-                       p.sudogbuf[i] = nil
-               }
-               p.sudogcache = p.sudogbuf[:0]
-               for i := range p.deferpoolbuf {
-                       p.deferpoolbuf[i] = nil
-               }
-               p.deferpool = p.deferpoolbuf[:0]
-               freemcache(p.mcache)
-               p.mcache = nil
-               gfpurge(p)
-               traceProcFree(p)
-               p.gcAssistTime = 0
-               p.status = _Pdead
-               // can't free P itself because it can be referenced by an M in syscall
-       }
-
-       // Trim allp.
-       if int32(len(allp)) != nprocs {
-               lock(&allpLock)
-               allp = allp[:nprocs]
-               unlock(&allpLock)
+               pp.init(i)
+               atomicstorep(unsafe.Pointer(&allp[i]), unsafe.Pointer(pp))
        }
 
        _g_ := getg()
@@ -3802,8 +3825,19 @@ func procresize(nprocs int32) *p {
                _g_.m.p.ptr().status = _Prunning
                _g_.m.p.ptr().mcache.prepareForSweep()
        } else {
-               // release the current P and acquire allp[0]
+               // release the current P and acquire allp[0].
+               //
+               // We must do this before destroying our current P
+               // because p.destroy itself has write barriers, so we
+               // need to do that from a valid P.
                if _g_.m.p != 0 {
+                       if trace.enabled {
+                               // Pretend that we were descheduled
+                               // and then scheduled again to keep
+                               // the trace sane.
+                               traceGoSched()
+                               traceProcStop(_g_.m.p.ptr())
+                       }
                        _g_.m.p.ptr().m = 0
                }
                _g_.m.p = 0
@@ -3816,6 +3850,21 @@ func procresize(nprocs int32) *p {
                        traceGoStart()
                }
        }
+
+       // release resources from unused P's
+       for i := nprocs; i < old; i++ {
+               p := allp[i]
+               p.destroy()
+               // can't free P itself because it can be referenced by an M in syscall
+       }
+
+       // Trim allp.
+       if int32(len(allp)) != nprocs {
+               lock(&allpLock)
+               allp = allp[:nprocs]
+               unlock(&allpLock)
+       }
+
        var runnablePs *p
        for i := nprocs - 1; i >= 0; i-- {
                p := allp[i]
@@ -3893,7 +3942,7 @@ func releasep() *p {
        }
        _p_ := _g_.m.p.ptr()
        if _p_.m.ptr() != _g_.m || _p_.mcache != _g_.m.mcache || _p_.status != _Prunning {
-               print("releasep: m=", _g_.m, " m->p=", _g_.m.p.ptr(), " p->m=", _p_.m, " m->mcache=", _g_.m.mcache, " p->mcache=", _p_.mcache, " p->status=", _p_.status, "\n")
+               print("releasep: m=", _g_.m, " m->p=", _g_.m.p.ptr(), " p->m=", hex(_p_.m), " m->mcache=", _g_.m.mcache, " p->mcache=", _p_.mcache, " p->status=", _p_.status, "\n")
                throw("releasep: invalid p state")
        }
        if trace.enabled {
@@ -3940,7 +3989,12 @@ func checkdead() {
        // for details.)
        var run0 int32
        if !iscgo && cgoHasExtraM {
-               run0 = 1
+               mp := lockextra(true)
+               haveExtraM := extraMCount > 0
+               unlockextra(mp)
+               if haveExtraM {
+                       run0 = 1
+               }
        }
 
        run := mcount() - sched.nmidle - sched.nmidlelocked - sched.nmsys
@@ -4016,19 +4070,6 @@ func sysmon() {
        checkdead()
        unlock(&sched.lock)
 
-       // If a heap span goes unused for 5 minutes after a garbage collection,
-       // we hand it back to the operating system.
-       scavengelimit := int64(5 * 60 * 1e9)
-
-       if debug.scavenge > 0 {
-               // Scavenge-a-lot for testing.
-               forcegcperiod = 10 * 1e6
-               scavengelimit = 20 * 1e6
-       }
-
-       lastscavenge := nanotime()
-       nscavenge := 0
-
        lasttrace := int64(0)
        idle := 0 // how many cycles in succession we had not wokeup somebody
        delay := uint32(0)
@@ -4050,9 +4091,6 @@ func sysmon() {
                                // Make wake-up period small enough
                                // for the sampling to be correct.
                                maxsleep := forcegcperiod / 2
-                               if scavengelimit < forcegcperiod {
-                                       maxsleep = scavengelimit / 2
-                               }
                                shouldRelax := true
                                if osRelaxMinNS > 0 {
                                        next := timeSleepUntil()
@@ -4115,12 +4153,6 @@ func sysmon() {
                        injectglist(&list)
                        unlock(&forcegc.lock)
                }
-               // scavenge heap once in a while
-               if lastscavenge+scavengelimit/2 < now {
-                       mheap_.scavenge(int32(nscavenge), uint64(now), uint64(scavengelimit))
-                       lastscavenge = now
-                       nscavenge++
-               }
                if debug.schedtrace > 0 && lasttrace+int64(debug.schedtrace)*1000000 <= now {
                        lasttrace = now
                        schedtrace(debug.scheddetail > 0)
@@ -4156,10 +4188,24 @@ func retake(now int64) uint32 {
                }
                pd := &_p_.sysmontick
                s := _p_.status
+               sysretake := false
+               if s == _Prunning || s == _Psyscall {
+                       // Preempt G if it's running for too long.
+                       t := int64(_p_.schedtick)
+                       if int64(pd.schedtick) != t {
+                               pd.schedtick = uint32(t)
+                               pd.schedwhen = now
+                       } else if pd.schedwhen+forcePreemptNS <= now {
+                               preemptone(_p_)
+                               // In case of syscall, preemptone() doesn't
+                               // work, because there is no M wired to P.
+                               sysretake = true
+                       }
+               }
                if s == _Psyscall {
                        // Retake P from syscall if it's there for more than 1 sysmon tick (at least 20us).
                        t := int64(_p_.syscalltick)
-                       if int64(pd.syscalltick) != t {
+                       if !sysretake && int64(pd.syscalltick) != t {
                                pd.syscalltick = uint32(t)
                                pd.syscallwhen = now
                                continue
@@ -4188,18 +4234,6 @@ func retake(now int64) uint32 {
                        }
                        incidlelocked(1)
                        lock(&allpLock)
-               } else if s == _Prunning {
-                       // Preempt G if it's running for too long.
-                       t := int64(_p_.schedtick)
-                       if int64(pd.schedtick) != t {
-                               pd.schedtick = uint32(t)
-                               pd.schedwhen = now
-                               continue
-                       }
-                       if pd.schedwhen+forcePreemptNS > now {
-                               continue
-                       }
-                       preemptone(_p_)
                }
        }
        unlock(&allpLock)
index da5ffbbdee27018e6c125f13477eb227f511681a..b9be3387dbdf43e8a4ecde3233015df24df32a69 100644 (file)
@@ -5,6 +5,7 @@
 package runtime_test
 
 import (
+       "fmt"
        "math"
        "net"
        "runtime"
@@ -917,3 +918,69 @@ func TestLockOSThreadAvoidsStatePropagation(t *testing.T) {
                t.Errorf("want %q, got %q", want, output)
        }
 }
+
+// fakeSyscall emulates a system call.
+//go:nosplit
+func fakeSyscall(duration time.Duration) {
+       runtime.Entersyscall()
+       for start := runtime.Nanotime(); runtime.Nanotime()-start < int64(duration); {
+       }
+       runtime.Exitsyscall()
+}
+
+// Check that a goroutine will be preempted if it is calling short system calls.
+func testPreemptionAfterSyscall(t *testing.T, syscallDuration time.Duration) {
+       if runtime.GOARCH == "wasm" {
+               t.Skip("no preemption on wasm yet")
+       }
+
+       defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
+
+       interations := 10
+       if testing.Short() {
+               interations = 1
+       }
+       const (
+               maxDuration = 3 * time.Second
+               nroutines   = 8
+       )
+
+       for i := 0; i < interations; i++ {
+               c := make(chan bool, nroutines)
+               stop := uint32(0)
+
+               start := time.Now()
+               for g := 0; g < nroutines; g++ {
+                       go func(stop *uint32) {
+                               c <- true
+                               for atomic.LoadUint32(stop) == 0 {
+                                       fakeSyscall(syscallDuration)
+                               }
+                               c <- true
+                       }(&stop)
+               }
+               // wait until all goroutines have started.
+               for g := 0; g < nroutines; g++ {
+                       <-c
+               }
+               atomic.StoreUint32(&stop, 1)
+               // wait until all goroutines have finished.
+               for g := 0; g < nroutines; g++ {
+                       <-c
+               }
+               duration := time.Since(start)
+
+               if duration > maxDuration {
+                       t.Errorf("timeout exceeded: %v (%v)", duration, maxDuration)
+               }
+       }
+}
+
+func TestPreemptionAfterSyscall(t *testing.T) {
+       for _, i := range []time.Duration{10, 100, 1000} {
+               d := i * time.Microsecond
+               t.Run(fmt.Sprint(d), func(t *testing.T) {
+                       testPreemptionAfterSyscall(t, d)
+               })
+       }
+}
index 08d6a34f50c669a3ce4e13307a09915ab21eed84..1e2e5d5be9345d2f73a496edb95586ca5575f25b 100644 (file)
@@ -152,13 +152,20 @@ func TestLldbPython(t *testing.T) {
        src := filepath.Join(dir, "main.go")
        err = ioutil.WriteFile(src, []byte(lldbHelloSource), 0644)
        if err != nil {
-               t.Fatalf("failed to create file: %v", err)
+               t.Fatalf("failed to create src file: %v", err)
+       }
+
+       mod := filepath.Join(dir, "go.mod")
+       err = ioutil.WriteFile(mod, []byte("module lldbtest"), 0644)
+       if err != nil {
+               t.Fatalf("failed to create mod file: %v", err)
        }
 
        // As of 2018-07-17, lldb doesn't support compressed DWARF, so
        // disable it for this test.
        cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-ldflags=-compressdwarf=false", "-o", "a.exe")
        cmd.Dir = dir
+       cmd.Env = append(os.Environ(), "GOPATH=") // issue 31100
        out, err := cmd.CombinedOutput()
        if err != nil {
                t.Fatalf("building source %v\n%s", err, out)
index d9309cca771cdff75f0308443d46b7297c2ce527..c64549cd2550259d87872c91aca854bccb9e8539 100644 (file)
@@ -429,6 +429,7 @@ func setTraceback(level string) {
 // This is a very special function, do not use it if you are not sure what you are doing.
 // int64 division is lowered into _divv() call on 386, which does not fit into nosplit functions.
 // Handles overflow in a time-specific manner.
+// This keeps us within no-split stack limits on 32-bit processors.
 //go:nosplit
 func timediv(v int64, div int32, rem *int32) int32 {
        res := int32(0)
index fd77c4ca84e048b9a391d0cf376d471ab8f9b058..77648c2477a68bca90c986359d77cc570a56e340 100644 (file)
@@ -22,6 +22,13 @@ const (
        // If you add to this list, add to the list
        // of "okay during garbage collection" status
        // in mgcmark.go too.
+       //
+       // TODO(austin): The _Gscan bit could be much lighter-weight.
+       // For example, we could choose not to run _Gscanrunnable
+       // goroutines found in the run queue, rather than CAS-looping
+       // until they become _Grunnable. And transitions like
+       // _Gscanwaiting -> _Gscanrunnable are actually okay because
+       // they don't affect stack ownership.
 
        // _Gidle means this goroutine was just allocated and has not
        // yet been initialized.
@@ -97,10 +104,51 @@ const (
 
 const (
        // P status
-       _Pidle    = iota
-       _Prunning // Only this P is allowed to change from _Prunning.
+
+       // _Pidle means a P is not being used to run user code or the
+       // scheduler. Typically, it's on the idle P list and available
+       // to the scheduler, but it may just be transitioning between
+       // other states.
+       //
+       // The P is owned by the idle list or by whatever is
+       // transitioning its state. Its run queue is empty.
+       _Pidle = iota
+
+       // _Prunning means a P is owned by an M and is being used to
+       // run user code or the scheduler. Only the M that owns this P
+       // is allowed to change the P's status from _Prunning. The M
+       // may transition the P to _Pidle (if it has no more work to
+       // do), _Psyscall (when entering a syscall), or _Pgcstop (to
+       // halt for the GC). The M may also hand ownership of the P
+       // off directly to another M (e.g., to schedule a locked G).
+       _Prunning
+
+       // _Psyscall means a P is not running user code. It has
+       // affinity to an M in a syscall but is not owned by it and
+       // may be stolen by another M. This is similar to _Pidle but
+       // uses lightweight transitions and maintains M affinity.
+       //
+       // Leaving _Psyscall must be done with a CAS, either to steal
+       // or retake the P. Note that there's an ABA hazard: even if
+       // an M successfully CASes its original P back to _Prunning
+       // after a syscall, it must understand the P may have been
+       // used by another M in the interim.
        _Psyscall
+
+       // _Pgcstop means a P is halted for STW and owned by the M
+       // that stopped the world. The M that stopped the world
+       // continues to use its P, even in _Pgcstop. Transitioning
+       // from _Prunning to _Pgcstop causes an M to release its P and
+       // park.
+       //
+       // The P retains its run queue and startTheWorld will restart
+       // the scheduler on Ps with non-empty run queues.
        _Pgcstop
+
+       // _Pdead means a P is no longer used (GOMAXPROCS shrank). We
+       // reuse Ps if GOMAXPROCS increases. A dead P is mostly
+       // stripped of its resources, though a few things remain
+       // (e.g., trace buffers).
        _Pdead
 )
 
@@ -481,7 +529,6 @@ type m struct {
        profilehz   int32
        spinning    bool // m is out of work and is actively looking for work
        blocked     bool // m is blocked on a note
-       inwb        bool // m is executing a write barrier
        newSigstack bool // minit on C thread called sigaltstack
        printlock   int8
        incgo       bool   // m is executing a cgo call
@@ -498,11 +545,11 @@ type m struct {
        schedlink     muintptr
        mcache        *mcache
        lockedg       guintptr
-       createstack   [32]location   // stack that created this thread.
-       lockedExt     uint32         // tracking for external LockOSThread
-       lockedInt     uint32         // tracking for internal lockOSThread
-       nextwaitm     muintptr       // next m waiting for lock
-       waitunlockf   unsafe.Pointer // todo go func(*g, unsafe.pointer) bool
+       createstack   [32]location // stack that created this thread.
+       lockedExt     uint32       // tracking for external LockOSThread
+       lockedInt     uint32       // tracking for internal lockOSThread
+       nextwaitm     muintptr     // next m waiting for lock
+       waitunlockf   func(*g, unsafe.Pointer) bool
        waitlock      unsafe.Pointer
        waittraceev   byte
        waittraceskip int
@@ -519,7 +566,9 @@ type m struct {
        // Not for gccgo: libcallg  guintptr
        // Not for gccgo: syscall   libcall // stores syscall parameters on windows
 
-       mos mOS
+       dlogPerM
+
+       mOS
 
        // Remaining fields are specific to gccgo.
 
@@ -529,14 +578,10 @@ type m struct {
        dropextram bool // drop after call is done
        exiting    bool // thread is exiting
 
-       gcing int32
-
        scannote note // synchonization for signal-based stack scanning
 }
 
 type p struct {
-       lock mutex
-
        id          int32
        status      uint32 // one of pidle/prunning/...
        link        puintptr
@@ -545,7 +590,7 @@ type p struct {
        sysmontick  sysmontick // last tick observed by sysmon
        m           muintptr   // back-link to associated m (nil if idle)
        mcache      *mcache
-       racectx     uintptr
+       raceprocctx uintptr
 
        // gccgo has only one size of defer.
        deferpool    []*_defer
@@ -591,10 +636,12 @@ type p struct {
 
        palloc persistentAlloc // per-P to avoid mutex
 
+       _ uint32 // Alignment for atomic fields below
+
        // Per-P GC state
-       gcAssistTime         int64 // Nanoseconds in assistAlloc
-       gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker
-       gcBgMarkWorker       guintptr
+       gcAssistTime         int64    // Nanoseconds in assistAlloc
+       gcFractionalMarkTime int64    // Nanoseconds in fractional mark worker (atomic)
+       gcBgMarkWorker       guintptr // (atomic)
        gcMarkWorkerMode     gcMarkWorkerMode
 
        // gcMarkWorkerStartTime is the nanotime() at which this mark
@@ -707,7 +754,7 @@ const (
 )
 
 // Lock-free stack node.
-// // Also known to export_test.go.
+// Also known to export_test.go.
 type lfnode struct {
        next    uint64
        pushcnt uintptr
@@ -847,6 +894,7 @@ const (
        waitReasonSelectNoCases                           // "select (no cases)"
        waitReasonGCAssistWait                            // "GC assist wait"
        waitReasonGCSweepWait                             // "GC sweep wait"
+       waitReasonGCScavengeWait                          // "GC scavenge wait"
        waitReasonChanReceive                             // "chan receive"
        waitReasonChanSend                                // "chan send"
        waitReasonFinalizerWait                           // "finalizer wait"
@@ -874,6 +922,7 @@ var waitReasonStrings = [...]string{
        waitReasonSelectNoCases:         "select (no cases)",
        waitReasonGCAssistWait:          "GC assist wait",
        waitReasonGCSweepWait:           "GC sweep wait",
+       waitReasonGCScavengeWait:        "GC scavenge wait",
        waitReasonChanReceive:           "chan receive",
        waitReasonChanSend:              "chan send",
        waitReasonFinalizerWait:         "finalizer wait",
index 188fd5d0f0c18abcda5186bab45706dd5741c1b0..c7703f47053528b0ff74d162b9d24a8084994d25 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build aix darwin dragonfly freebsd hurd linux nacl netbsd openbsd solaris
+
 package runtime_test
 
 import (
index 222679e048d847b073168489d65f3afeeeaa25e6..e60786804d0470dd6322b9e999923975e79e7b4b 100644 (file)
@@ -70,6 +70,18 @@ func BenchmarkEfaceCmpDiff(b *testing.B) {
        }
 }
 
+func BenchmarkEfaceCmpDiffIndirect(b *testing.B) {
+       efaceCmp1 = [2]int{1, 2}
+       efaceCmp2 = [2]int{1, 2}
+       for i := 0; i < b.N; i++ {
+               for j := 0; j < 100; j++ {
+                       if efaceCmp1 != efaceCmp2 {
+                               b.Fatal("bad comparison")
+                       }
+               }
+       }
+}
+
 func BenchmarkDefer(b *testing.B) {
        for i := 0; i < b.N; i++ {
                defer1()
index 2c7ad32966214a701dbb144a50336ff3e4aecbae..c002e2930be020e7b9ab40d9fc0269e601b19b85 100644 (file)
@@ -53,22 +53,22 @@ var semtable [semTabSize]struct {
 
 //go:linkname sync_runtime_Semacquire sync.runtime_Semacquire
 func sync_runtime_Semacquire(addr *uint32) {
-       semacquire1(addr, false, semaBlockProfile)
+       semacquire1(addr, false, semaBlockProfile, 0)
 }
 
 //go:linkname poll_runtime_Semacquire internal..z2fpoll.runtime_Semacquire
 func poll_runtime_Semacquire(addr *uint32) {
-       semacquire1(addr, false, semaBlockProfile)
+       semacquire1(addr, false, semaBlockProfile, 0)
 }
 
 //go:linkname sync_runtime_Semrelease sync.runtime_Semrelease
-func sync_runtime_Semrelease(addr *uint32, handoff bool) {
-       semrelease1(addr, handoff)
+func sync_runtime_Semrelease(addr *uint32, handoff bool, skipframes int) {
+       semrelease1(addr, handoff, skipframes)
 }
 
 //go:linkname sync_runtime_SemacquireMutex sync.runtime_SemacquireMutex
-func sync_runtime_SemacquireMutex(addr *uint32, lifo bool) {
-       semacquire1(addr, lifo, semaBlockProfile|semaMutexProfile)
+func sync_runtime_SemacquireMutex(addr *uint32, lifo bool, skipframes int) {
+       semacquire1(addr, lifo, semaBlockProfile|semaMutexProfile, skipframes)
 }
 
 //go:linkname poll_runtime_Semrelease internal..z2fpoll.runtime_Semrelease
@@ -92,10 +92,10 @@ const (
 
 // Called from runtime.
 func semacquire(addr *uint32) {
-       semacquire1(addr, false, 0)
+       semacquire1(addr, false, 0, 0)
 }
 
-func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags) {
+func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags, skipframes int) {
        gp := getg()
        if gp != gp.m.curg {
                throw("semacquire not on the G stack")
@@ -141,22 +141,22 @@ func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags) {
                // Any semrelease after the cansemacquire knows we're waiting
                // (we set nwait above), so go to sleep.
                root.queue(addr, s, lifo)
-               goparkunlock(&root.lock, waitReasonSemacquire, traceEvGoBlockSync, 4)
+               goparkunlock(&root.lock, waitReasonSemacquire, traceEvGoBlockSync, 4+skipframes)
                if s.ticket != 0 || cansemacquire(addr) {
                        break
                }
        }
        if s.releasetime > 0 {
-               blockevent(s.releasetime-t0, 3)
+               blockevent(s.releasetime-t0, 3+skipframes)
        }
        releaseSudog(s)
 }
 
 func semrelease(addr *uint32) {
-       semrelease1(addr, false)
+       semrelease1(addr, false, 0)
 }
 
-func semrelease1(addr *uint32, handoff bool) {
+func semrelease1(addr *uint32, handoff bool, skipframes int) {
        root := semroot(addr)
        atomic.Xadd(addr, 1)
 
@@ -183,7 +183,7 @@ func semrelease1(addr *uint32, handoff bool) {
        if s != nil { // May be slow, so unlock first
                acquiretime := s.acquiretime
                if acquiretime != 0 {
-                       mutexevent(t0-acquiretime, 3)
+                       mutexevent(t0-acquiretime, 3+skipframes)
                }
                if s.ticket != 0 {
                        throw("corrupted semaphore ticket")
@@ -191,7 +191,7 @@ func semrelease1(addr *uint32, handoff bool) {
                if handoff && cansemacquire(addr) {
                        s.ticket = 1
                }
-               readyWithTime(s, 5)
+               readyWithTime(s, 5+skipframes)
        }
 }
 
index 5b2cc64483f950ce6e12dee3f6c2a694f135efba..f5b4a50697205948022081de7ba20933670c28ef 100644 (file)
@@ -7,11 +7,7 @@
 package runtime_test
 
 import (
-       "internal/testenv"
-       "io/ioutil"
-       "os"
        "os/exec"
-       "path/filepath"
        "syscall"
        "testing"
        "time"
@@ -21,39 +17,17 @@ import (
 // shouldn't cause semasleep to retry with the same timeout which would
 // cause indefinite spinning.
 func TestSpuriousWakeupsNeverHangSemasleep(t *testing.T) {
-       testenv.MustHaveGoBuild(t)
-       tempDir, err := ioutil.TempDir("", "issue-27250")
-       if err != nil {
-               t.Fatalf("Failed to create the temp directory: %v", err)
+       if *flagQuick {
+               t.Skip("-quick")
        }
-       defer os.RemoveAll(tempDir)
-
-       repro := `
-    package main
 
-    import "time"
-
-    func main() {
-        <-time.After(1 * time.Second)
-    }
-    `
-       mainPath := filepath.Join(tempDir, "main.go")
-       if err := ioutil.WriteFile(mainPath, []byte(repro), 0644); err != nil {
-               t.Fatalf("Failed to create temp file for repro.go: %v", err)
-       }
-       binaryPath := filepath.Join(tempDir, "binary")
-
-       // Build the binary so that we can send the signal to its PID.
-       out, err := exec.Command(testenv.GoToolPath(t), "build", "-o", binaryPath, mainPath).CombinedOutput()
+       exe, err := buildTestProg(t, "testprog")
        if err != nil {
-               t.Fatalf("Failed to compile the binary: err: %v\nOutput: %s\n", err, out)
-       }
-       if err := os.Chmod(binaryPath, 0755); err != nil {
-               t.Fatalf("Failed to chmod binary: %v", err)
+               t.Fatal(err)
        }
 
-       // Now run the binary.
-       cmd := exec.Command(binaryPath)
+       start := time.Now()
+       cmd := exec.Command(exe, "After1")
        if err := cmd.Start(); err != nil {
                t.Fatalf("Failed to start command: %v", err)
        }
@@ -82,6 +56,9 @@ func TestSpuriousWakeupsNeverHangSemasleep(t *testing.T) {
                        if err != nil {
                                t.Fatalf("The program returned but unfortunately with an error: %v", err)
                        }
+                       if time.Since(start) < 100*time.Millisecond {
+                               t.Fatalf("The program stopped too quickly.")
+                       }
                        return
                }
        }
index 4f11877a29763e23889d4e5eaa14965d689bc878..3583c7b98a031daf6b01bc2997901812c3487595 100644 (file)
@@ -170,5 +170,7 @@ func sighandler(sig uint32, info *_siginfo_t, ctxt unsafe.Pointer, gp *g) {
                crash()
        }
 
+       printDebugLog()
+
        exit(2)
 }
index e1bab8caba39e09d24ae0608048b16753e38adb8..365f5dd0ad6811e119efb78118ba4a94f90c16ce 100644 (file)
@@ -277,7 +277,7 @@ func setThreadCPUProfiler(hz int32) {
 }
 
 func sigpipe() {
-       if sigsend(_SIGPIPE) {
+       if signal_ignored(_SIGPIPE) || sigsend(_SIGPIPE) {
                return
        }
        dieFromSignal(_SIGPIPE)
@@ -328,6 +328,9 @@ func sigtrampgo(sig uint32, info *_siginfo_t, ctx unsafe.Pointer) {
 //
 // The signal handler must not inject a call to sigpanic if
 // getg().throwsplit, since sigpanic may need to grow the stack.
+//
+// This is exported via linkname to assembly in runtime/cgo.
+//go:linkname sigpanic
 func sigpanic() {
        g := getg()
        if !canpanic(g) {
@@ -466,16 +469,14 @@ func raisebadsignal(sig uint32, c *sigctxt) {
 
 //go:nosplit
 func crash() {
-       if GOOS == "darwin" {
-               // OS X core dumps are linear dumps of the mapped memory,
-               // from the first virtual byte to the last, with zeros in the gaps.
-               // Because of the way we arrange the address space on 64-bit systems,
-               // this means the OS X core file will be >128 GB and even on a zippy
-               // workstation can take OS X well over an hour to write (uninterruptible).
-               // Save users from making that mistake.
-               if GOARCH == "amd64" {
-                       return
-               }
+       // OS X core dumps are linear dumps of the mapped memory,
+       // from the first virtual byte to the last, with zeros in the gaps.
+       // Because of the way we arrange the address space on 64-bit systems,
+       // this means the OS X core file will be >128 GB and even on a zippy
+       // workstation can take OS X well over an hour to write (uninterruptible).
+       // Save users from making that mistake.
+       if GOOS == "darwin" && GOARCH == "amd64" {
+               return
        }
 
        dieFromSignal(_SIGABRT)
index 9e17b001d3e0d36987baf0b088e71b04124b21ac..9c1b44fe0b22b2ec4f667b03efd4f0c7d94e0b07 100644 (file)
@@ -90,6 +90,6 @@ type divMagic struct {
        baseMask uint16
 }
 
-var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 9, 171, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 9, 57, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 7, 43, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 6, 13, 0}, {6, 11, 187, 0}, {8, 5, 11, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}}
+var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 11, 683, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 13, 911, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 9, 171, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 9, 103, 0}, {6, 11, 187, 0}, {8, 7, 43, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}}
 var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}
 var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{31, 32, 33, 34, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 47, 47, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}
index 4b15f82a54ef18b72fe80c0ac2cc4f8d63b67f39..c258ebd2bd09fb2c1422628e74b0c9bf3cd03469 100644 (file)
@@ -174,7 +174,7 @@ func growslice(et *_type, oldarray unsafe.Pointer, oldlen, oldcap, cap int) slic
        }
 
        var p unsafe.Pointer
-       if et.kind&kindNoPointers != 0 {
+       if et.ptrdata == 0 {
                p = mallocgc(capmem, nil, false)
                // The append() that calls growslice is going to overwrite from oldlen to cap (which will be the new length).
                // Only clear the part that will not be overwritten.
@@ -182,8 +182,8 @@ func growslice(et *_type, oldarray unsafe.Pointer, oldlen, oldcap, cap int) slic
        } else {
                // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory.
                p = mallocgc(capmem, et, true)
-               if writeBarrier.enabled {
-                       // Only shade the pointers in oldarray since we know the destination slice p
+               if lenmem > 0 && writeBarrier.enabled {
+                       // Only shade the pointers in old.array since we know the destination slice p
                        // only contains nil pointers because it has been cleared during alloc.
                        bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(oldarray), lenmem)
                }
index b6962532ffd36f09982311f9a1fe6ba9394c3d28..6ed65e8285f1fad7c3c4844bdd388f10dff05adf 100644 (file)
-// Copyright 2019 The Go Authors. All rights reserved.
+// Copyright 2012 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
 package runtime_test
 
-import "testing"
+import (
+       "bytes"
+       "fmt"
+       "os"
+       "reflect"
+       "regexp"
+       . "runtime"
+       "strconv"
+       "strings"
+       "sync"
+       "sync/atomic"
+       "testing"
+       "time"
+)
+
+// TestStackMem measures per-thread stack segment cache behavior.
+// The test consumed up to 500MB in the past.
+func TestStackMem(t *testing.T) {
+       const (
+               BatchSize      = 32
+               BatchCount     = 256
+               ArraySize      = 1024
+               RecursionDepth = 128
+       )
+       if testing.Short() {
+               return
+       }
+       defer GOMAXPROCS(GOMAXPROCS(BatchSize))
+       s0 := new(MemStats)
+       ReadMemStats(s0)
+       for b := 0; b < BatchCount; b++ {
+               c := make(chan bool, BatchSize)
+               for i := 0; i < BatchSize; i++ {
+                       go func() {
+                               var f func(k int, a [ArraySize]byte)
+                               f = func(k int, a [ArraySize]byte) {
+                                       if k == 0 {
+                                               time.Sleep(time.Millisecond)
+                                               return
+                                       }
+                                       f(k-1, a)
+                               }
+                               f(RecursionDepth, [ArraySize]byte{})
+                               c <- true
+                       }()
+               }
+               for i := 0; i < BatchSize; i++ {
+                       <-c
+               }
+
+               // The goroutines have signaled via c that they are ready to exit.
+               // Give them a chance to exit by sleeping. If we don't wait, we
+               // might not reuse them on the next batch.
+               time.Sleep(10 * time.Millisecond)
+       }
+       s1 := new(MemStats)
+       ReadMemStats(s1)
+       consumed := int64(s1.StackSys - s0.StackSys)
+       t.Logf("Consumed %vMB for stack mem", consumed>>20)
+       estimate := int64(8 * BatchSize * ArraySize * RecursionDepth) // 8 is to reduce flakiness.
+       if consumed > estimate {
+               t.Fatalf("Stack mem: want %v, got %v", estimate, consumed)
+       }
+       // Due to broken stack memory accounting (https://golang.org/issue/7468),
+       // StackInuse can decrease during function execution, so we cast the values to int64.
+       inuse := int64(s1.StackInuse) - int64(s0.StackInuse)
+       t.Logf("Inuse %vMB for stack mem", inuse>>20)
+       if inuse > 4<<20 {
+               t.Fatalf("Stack inuse: want %v, got %v", 4<<20, inuse)
+       }
+}
+
+// Test stack growing in different contexts.
+func TestStackGrowth(t *testing.T) {
+       if *flagQuick {
+               t.Skip("-quick")
+       }
+
+       if GOARCH == "wasm" {
+               t.Skip("fails on wasm (too slow?)")
+       }
+
+       // Don't make this test parallel as this makes the 20 second
+       // timeout unreliable on slow builders. (See issue #19381.)
+
+       var wg sync.WaitGroup
+
+       // in a normal goroutine
+       var growDuration time.Duration // For debugging failures
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               start := time.Now()
+               growStack(nil)
+               growDuration = time.Since(start)
+       }()
+       wg.Wait()
+
+       // in locked goroutine
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               LockOSThread()
+               growStack(nil)
+               UnlockOSThread()
+       }()
+       wg.Wait()
+
+       // in finalizer
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               done := make(chan bool)
+               var startTime time.Time
+               var started, progress uint32
+               go func() {
+                       s := new(string)
+                       SetFinalizer(s, func(ss *string) {
+                               startTime = time.Now()
+                               atomic.StoreUint32(&started, 1)
+                               growStack(&progress)
+                               done <- true
+                       })
+                       s = nil
+                       done <- true
+               }()
+               <-done
+               GC()
+
+               timeout := 20 * time.Second
+               if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
+                       scale, err := strconv.Atoi(s)
+                       if err == nil {
+                               timeout *= time.Duration(scale)
+                       }
+               }
+
+               select {
+               case <-done:
+               case <-time.After(timeout):
+                       if atomic.LoadUint32(&started) == 0 {
+                               t.Log("finalizer did not start")
+                       } else {
+                               t.Logf("finalizer started %s ago and finished %d iterations", time.Since(startTime), atomic.LoadUint32(&progress))
+                       }
+                       t.Log("first growStack took", growDuration)
+                       t.Error("finalizer did not run")
+                       return
+               }
+       }()
+       wg.Wait()
+}
+
+// ... and in init
+//func init() {
+//     growStack()
+//}
+
+func growStack(progress *uint32) {
+       n := 1 << 10
+       if testing.Short() {
+               n = 1 << 8
+       }
+       for i := 0; i < n; i++ {
+               x := 0
+               growStackIter(&x, i)
+               if x != i+1 {
+                       panic("stack is corrupted")
+               }
+               if progress != nil {
+                       atomic.StoreUint32(progress, uint32(i))
+               }
+       }
+       GC()
+}
+
+// This function is not an anonymous func, so that the compiler can do escape
+// analysis and place x on stack (and subsequently stack growth update the pointer).
+func growStackIter(p *int, n int) {
+       if n == 0 {
+               *p = n + 1
+               GC()
+               return
+       }
+       *p = n + 1
+       x := 0
+       growStackIter(&x, n-1)
+       if x != n {
+               panic("stack is corrupted")
+       }
+}
+
+func TestStackGrowthCallback(t *testing.T) {
+       t.Parallel()
+       var wg sync.WaitGroup
+
+       // test stack growth at chan op
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               c := make(chan int, 1)
+               growStackWithCallback(func() {
+                       c <- 1
+                       <-c
+               })
+       }()
+
+       // test stack growth at map op
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               m := make(map[int]int)
+               growStackWithCallback(func() {
+                       _, _ = m[1]
+                       m[1] = 1
+               })
+       }()
+
+       // test stack growth at goroutine creation
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               growStackWithCallback(func() {
+                       done := make(chan bool)
+                       go func() {
+                               done <- true
+                       }()
+                       <-done
+               })
+       }()
+       wg.Wait()
+}
+
+func growStackWithCallback(cb func()) {
+       var f func(n int)
+       f = func(n int) {
+               if n == 0 {
+                       cb()
+                       return
+               }
+               f(n - 1)
+       }
+       for i := 0; i < 1<<10; i++ {
+               f(i)
+       }
+}
+
+// TestDeferPtrs tests the adjustment of Defer's argument pointers (p aka &y)
+// during a stack copy.
+func set(p *int, x int) {
+       *p = x
+}
+func TestDeferPtrs(t *testing.T) {
+       var y int
+
+       defer func() {
+               if y != 42 {
+                       t.Errorf("defer's stack references were not adjusted appropriately")
+               }
+       }()
+       defer set(&y, 42)
+       growStack(nil)
+}
+
+type bigBuf [4 * 1024]byte
+
+// TestDeferPtrsGoexit is like TestDeferPtrs but exercises the possibility that the
+// stack grows as part of starting the deferred function. It calls Goexit at various
+// stack depths, forcing the deferred function (with >4kB of args) to be run at
+// the bottom of the stack. The goal is to find a stack depth less than 4kB from
+// the end of the stack. Each trial runs in a different goroutine so that an earlier
+// stack growth does not invalidate a later attempt.
+func TestDeferPtrsGoexit(t *testing.T) {
+       for i := 0; i < 100; i++ {
+               c := make(chan int, 1)
+               go testDeferPtrsGoexit(c, i)
+               if n := <-c; n != 42 {
+                       t.Fatalf("defer's stack references were not adjusted appropriately (i=%d n=%d)", i, n)
+               }
+       }
+}
+
+func testDeferPtrsGoexit(c chan int, i int) {
+       var y int
+       defer func() {
+               c <- y
+       }()
+       defer setBig(&y, 42, bigBuf{})
+       useStackAndCall(i, Goexit)
+}
+
+func setBig(p *int, x int, b bigBuf) {
+       *p = x
+}
+
+// TestDeferPtrsPanic is like TestDeferPtrsGoexit, but it's using panic instead
+// of Goexit to run the Defers. Those two are different execution paths
+// in the runtime.
+func TestDeferPtrsPanic(t *testing.T) {
+       for i := 0; i < 100; i++ {
+               c := make(chan int, 1)
+               go testDeferPtrsGoexit(c, i)
+               if n := <-c; n != 42 {
+                       t.Fatalf("defer's stack references were not adjusted appropriately (i=%d n=%d)", i, n)
+               }
+       }
+}
+
+func testDeferPtrsPanic(c chan int, i int) {
+       var y int
+       defer func() {
+               if recover() == nil {
+                       c <- -1
+                       return
+               }
+               c <- y
+       }()
+       defer setBig(&y, 42, bigBuf{})
+       useStackAndCall(i, func() { panic(1) })
+}
+
+//go:noinline
+func testDeferLeafSigpanic1() {
+       // Cause a sigpanic to be injected in this frame.
+       //
+       // This function has to be declared before
+       // TestDeferLeafSigpanic so the runtime will crash if we think
+       // this function's continuation PC is in
+       // TestDeferLeafSigpanic.
+       *(*int)(nil) = 0
+}
+
+// TestDeferLeafSigpanic tests defer matching around leaf functions
+// that sigpanic. This is tricky because on LR machines the outer
+// function and the inner function have the same SP, but it's critical
+// that we match up the defer correctly to get the right liveness map.
+// See issue #25499.
+func TestDeferLeafSigpanic(t *testing.T) {
+       // Push a defer that will walk the stack.
+       defer func() {
+               if err := recover(); err == nil {
+                       t.Fatal("expected panic from nil pointer")
+               }
+               GC()
+       }()
+       // Call a leaf function. We must set up the exact call stack:
+       //
+       //  defering function -> leaf function -> sigpanic
+       //
+       // On LR machines, the leaf function will have the same SP as
+       // the SP pushed for the defer frame.
+       testDeferLeafSigpanic1()
+}
+
+// TestPanicUseStack checks that a chain of Panic structs on the stack are
+// updated correctly if the stack grows during the deferred execution that
+// happens as a result of the panic.
+func TestPanicUseStack(t *testing.T) {
+       pc := make([]uintptr, 10000)
+       defer func() {
+               recover()
+               Callers(0, pc) // force stack walk
+               useStackAndCall(100, func() {
+                       defer func() {
+                               recover()
+                               Callers(0, pc) // force stack walk
+                               useStackAndCall(200, func() {
+                                       defer func() {
+                                               recover()
+                                               Callers(0, pc) // force stack walk
+                                       }()
+                                       panic(3)
+                               })
+                       }()
+                       panic(2)
+               })
+       }()
+       panic(1)
+}
+
+func TestPanicFar(t *testing.T) {
+       var xtree *xtreeNode
+       pc := make([]uintptr, 10000)
+       defer func() {
+               // At this point we created a large stack and unwound
+               // it via recovery. Force a stack walk, which will
+               // check the stack's consistency.
+               Callers(0, pc)
+       }()
+       defer func() {
+               recover()
+       }()
+       useStackAndCall(100, func() {
+               // Kick off the GC and make it do something nontrivial.
+               // (This used to force stack barriers to stick around.)
+               xtree = makeTree(18)
+               // Give the GC time to start scanning stacks.
+               time.Sleep(time.Millisecond)
+               panic(1)
+       })
+       _ = xtree
+}
+
+type xtreeNode struct {
+       l, r *xtreeNode
+}
+
+func makeTree(d int) *xtreeNode {
+       if d == 0 {
+               return new(xtreeNode)
+       }
+       return &xtreeNode{makeTree(d - 1), makeTree(d - 1)}
+}
+
+// use about n KB of stack and call f
+func useStackAndCall(n int, f func()) {
+       if n == 0 {
+               f()
+               return
+       }
+       var b [1024]byte // makes frame about 1KB
+       useStackAndCall(n-1+int(b[99]), f)
+}
+
+func useStack(n int) {
+       useStackAndCall(n, func() {})
+}
+
+func growing(c chan int, done chan struct{}) {
+       for n := range c {
+               useStack(n)
+               done <- struct{}{}
+       }
+       done <- struct{}{}
+}
+
+func TestStackCache(t *testing.T) {
+       // Allocate a bunch of goroutines and grow their stacks.
+       // Repeat a few times to test the stack cache.
+       const (
+               R = 4
+               G = 200
+               S = 5
+       )
+       for i := 0; i < R; i++ {
+               var reqchans [G]chan int
+               done := make(chan struct{})
+               for j := 0; j < G; j++ {
+                       reqchans[j] = make(chan int)
+                       go growing(reqchans[j], done)
+               }
+               for s := 0; s < S; s++ {
+                       for j := 0; j < G; j++ {
+                               reqchans[j] <- 1 << uint(s)
+                       }
+                       for j := 0; j < G; j++ {
+                               <-done
+                       }
+               }
+               for j := 0; j < G; j++ {
+                       close(reqchans[j])
+               }
+               for j := 0; j < G; j++ {
+                       <-done
+               }
+       }
+}
+
+func TestStackOutput(t *testing.T) {
+       b := make([]byte, 1024)
+       stk := string(b[:Stack(b, false)])
+       if !strings.HasPrefix(stk, "goroutine ") {
+               t.Errorf("Stack (len %d):\n%s", len(stk), stk)
+               t.Errorf("Stack output should begin with \"goroutine \"")
+       }
+}
+
+func TestStackAllOutput(t *testing.T) {
+       b := make([]byte, 1024)
+       stk := string(b[:Stack(b, true)])
+       if !strings.HasPrefix(stk, "goroutine ") {
+               t.Errorf("Stack (len %d):\n%s", len(stk), stk)
+               t.Errorf("Stack output should begin with \"goroutine \"")
+       }
+}
+
+func TestStackPanic(t *testing.T) {
+       // Test that stack copying copies panics correctly. This is difficult
+       // to test because it is very unlikely that the stack will be copied
+       // in the middle of gopanic. But it can happen.
+       // To make this test effective, edit panic.go:gopanic and uncomment
+       // the GC() call just before freedefer(d).
+       defer func() {
+               if x := recover(); x == nil {
+                       t.Errorf("recover failed")
+               }
+       }()
+       useStack(32)
+       panic("test panic")
+}
+
+func BenchmarkStackCopyPtr(b *testing.B) {
+       c := make(chan bool)
+       for i := 0; i < b.N; i++ {
+               go func() {
+                       i := 1000000
+                       countp(&i)
+                       c <- true
+               }()
+               <-c
+       }
+}
+
+func countp(n *int) {
+       if *n == 0 {
+               return
+       }
+       *n--
+       countp(n)
+}
+
+func BenchmarkStackCopy(b *testing.B) {
+       c := make(chan bool)
+       for i := 0; i < b.N; i++ {
+               go func() {
+                       count(1000000)
+                       c <- true
+               }()
+               <-c
+       }
+}
+
+func count(n int) int {
+       if n == 0 {
+               return 0
+       }
+       return 1 + count(n-1)
+}
+
+func BenchmarkStackCopyNoCache(b *testing.B) {
+       c := make(chan bool)
+       for i := 0; i < b.N; i++ {
+               go func() {
+                       count1(1000000)
+                       c <- true
+               }()
+               <-c
+       }
+}
+
+func count1(n int) int {
+       if n <= 0 {
+               return 0
+       }
+       return 1 + count2(n-1)
+}
+
+func count2(n int) int  { return 1 + count3(n-1) }
+func count3(n int) int  { return 1 + count4(n-1) }
+func count4(n int) int  { return 1 + count5(n-1) }
+func count5(n int) int  { return 1 + count6(n-1) }
+func count6(n int) int  { return 1 + count7(n-1) }
+func count7(n int) int  { return 1 + count8(n-1) }
+func count8(n int) int  { return 1 + count9(n-1) }
+func count9(n int) int  { return 1 + count10(n-1) }
+func count10(n int) int { return 1 + count11(n-1) }
+func count11(n int) int { return 1 + count12(n-1) }
+func count12(n int) int { return 1 + count13(n-1) }
+func count13(n int) int { return 1 + count14(n-1) }
+func count14(n int) int { return 1 + count15(n-1) }
+func count15(n int) int { return 1 + count16(n-1) }
+func count16(n int) int { return 1 + count17(n-1) }
+func count17(n int) int { return 1 + count18(n-1) }
+func count18(n int) int { return 1 + count19(n-1) }
+func count19(n int) int { return 1 + count20(n-1) }
+func count20(n int) int { return 1 + count21(n-1) }
+func count21(n int) int { return 1 + count22(n-1) }
+func count22(n int) int { return 1 + count23(n-1) }
+func count23(n int) int { return 1 + count1(n-1) }
+
+type structWithMethod struct{}
+
+func (s structWithMethod) caller() string {
+       _, file, line, ok := Caller(1)
+       if !ok {
+               panic("Caller failed")
+       }
+       return fmt.Sprintf("%s:%d", file, line)
+}
+
+func (s structWithMethod) callers() []uintptr {
+       pc := make([]uintptr, 16)
+       return pc[:Callers(0, pc)]
+}
+
+// The noinline prevents this function from being inlined
+// into a wrapper. TODO: remove this when issue 28640 is fixed.
+//go:noinline
+func (s structWithMethod) stack() string {
+       buf := make([]byte, 4<<10)
+       return string(buf[:Stack(buf, false)])
+}
+
+func (s structWithMethod) nop() {}
+
+func TestStackWrapperCaller(t *testing.T) {
+       var d structWithMethod
+       // Force the compiler to construct a wrapper method.
+       wrapper := (*structWithMethod).caller
+       // Check that the wrapper doesn't affect the stack trace.
+       if dc, ic := d.caller(), wrapper(&d); dc != ic {
+               t.Fatalf("direct caller %q != indirect caller %q", dc, ic)
+       }
+}
+
+func TestStackWrapperCallers(t *testing.T) {
+       var d structWithMethod
+       wrapper := (*structWithMethod).callers
+       // Check that <autogenerated> doesn't appear in the stack trace.
+       pcs := wrapper(&d)
+       frames := CallersFrames(pcs)
+       for {
+               fr, more := frames.Next()
+               if fr.File == "<autogenerated>" {
+                       t.Fatalf("<autogenerated> appears in stack trace: %+v", fr)
+               }
+               if !more {
+                       break
+               }
+       }
+}
+
+func TestStackWrapperStack(t *testing.T) {
+       var d structWithMethod
+       wrapper := (*structWithMethod).stack
+       // Check that <autogenerated> doesn't appear in the stack trace.
+       stk := wrapper(&d)
+       if strings.Contains(stk, "<autogenerated>") {
+               t.Fatalf("<autogenerated> appears in stack trace:\n%s", stk)
+       }
+}
+
+type I interface {
+       M()
+}
+
+func TestStackWrapperStackPanic(t *testing.T) {
+       if Compiler == "gccgo" {
+               t.Skip("gccgo currently uses different, meaningless, wrapper names")
+       }
+
+       t.Run("sigpanic", func(t *testing.T) {
+               // nil calls to interface methods cause a sigpanic.
+               testStackWrapperPanic(t, func() { I.M(nil) }, "runtime_test.I.M")
+       })
+       t.Run("panicwrap", func(t *testing.T) {
+               // Nil calls to value method wrappers call panicwrap.
+               wrapper := (*structWithMethod).nop
+               testStackWrapperPanic(t, func() { wrapper(nil) }, "runtime_test.(*structWithMethod).nop")
+       })
+}
+
+func testStackWrapperPanic(t *testing.T, cb func(), expect string) {
+       // Test that the stack trace from a panicking wrapper includes
+       // the wrapper, even though elide these when they don't panic.
+       t.Run("CallersFrames", func(t *testing.T) {
+               defer func() {
+                       err := recover()
+                       if err == nil {
+                               t.Fatalf("expected panic")
+                       }
+                       pcs := make([]uintptr, 10)
+                       n := Callers(0, pcs)
+                       frames := CallersFrames(pcs[:n])
+                       for {
+                               frame, more := frames.Next()
+                               t.Log(frame.Function)
+                               if frame.Function == expect {
+                                       return
+                               }
+                               if !more {
+                                       break
+                               }
+                       }
+                       t.Fatalf("panicking wrapper %s missing from stack trace", expect)
+               }()
+               cb()
+       })
+       t.Run("Stack", func(t *testing.T) {
+               defer func() {
+                       err := recover()
+                       if err == nil {
+                               t.Fatalf("expected panic")
+                       }
+                       buf := make([]byte, 4<<10)
+                       stk := string(buf[:Stack(buf, false)])
+                       if !strings.Contains(stk, "\n"+expect) {
+                               t.Fatalf("panicking wrapper %s missing from stack trace:\n%s", expect, stk)
+                       }
+               }()
+               cb()
+       })
+}
+
+func TestCallersFromWrapper(t *testing.T) {
+       if Compiler == "gccgo" {
+               t.Skip("gccgo currently uses different, meaningless, wrapper names")
+       }
+       // Test that invoking CallersFrames on a stack where the first
+       // PC is an autogenerated wrapper keeps the wrapper in the
+       // trace. Normally we elide these, assuming that the wrapper
+       // calls the thing you actually wanted to see, but in this
+       // case we need to keep it.
+       pc := reflect.ValueOf(I.M).Pointer()
+       frames := CallersFrames([]uintptr{pc})
+       frame, more := frames.Next()
+       if frame.Function != "runtime_test.I.M" {
+               t.Fatalf("want function %s, got %s", "runtime_test.I.M", frame.Function)
+       }
+       if more {
+               t.Fatalf("want 1 frame, got > 1")
+       }
+}
+
+func TestTracebackSystemstack(t *testing.T) {
+       if Compiler == "gccgo" {
+               t.Skip("test currently fails with gccgo")
+       }
+       if GOARCH == "ppc64" || GOARCH == "ppc64le" {
+               t.Skip("systemstack tail call not implemented on ppc64x")
+       }
+
+       // Test that profiles correctly jump over systemstack,
+       // including nested systemstack calls.
+       pcs := make([]uintptr, 20)
+       pcs = pcs[:TracebackSystemstack(pcs, 5)]
+       // Check that runtime.TracebackSystemstack appears five times
+       // and that we see TestTracebackSystemstack.
+       countIn, countOut := 0, 0
+       frames := CallersFrames(pcs)
+       var tb bytes.Buffer
+       for {
+               frame, more := frames.Next()
+               fmt.Fprintf(&tb, "\n%s+0x%x %s:%d", frame.Function, frame.PC-frame.Entry, frame.File, frame.Line)
+               switch frame.Function {
+               case "runtime.TracebackSystemstack":
+                       countIn++
+               case "runtime_test.TestTracebackSystemstack":
+                       countOut++
+               }
+               if !more {
+                       break
+               }
+       }
+       if countIn != 5 || countOut != 1 {
+               t.Fatalf("expected 5 calls to TracebackSystemstack and 1 call to TestTracebackSystemstack, got:%s", tb.String())
+       }
+}
+
+func TestTracebackAncestors(t *testing.T) {
+       if Compiler == "gccgo" {
+               t.Skip("gccgo currently doesn't generate full ancestor tracebacks")
+       }
+       goroutineRegex := regexp.MustCompile(`goroutine [0-9]+ \[`)
+       for _, tracebackDepth := range []int{0, 1, 5, 50} {
+               output := runTestProg(t, "testprog", "TracebackAncestors", fmt.Sprintf("GODEBUG=tracebackancestors=%d", tracebackDepth))
+
+               numGoroutines := 3
+               numFrames := 2
+               ancestorsExpected := numGoroutines
+               if numGoroutines > tracebackDepth {
+                       ancestorsExpected = tracebackDepth
+               }
+
+               matches := goroutineRegex.FindAllStringSubmatch(output, -1)
+               if len(matches) != 2 {
+                       t.Fatalf("want 2 goroutines, got:\n%s", output)
+               }
+
+               // Check functions in the traceback.
+               fns := []string{"main.recurseThenCallGo", "main.main", "main.printStack", "main.TracebackAncestors"}
+               for _, fn := range fns {
+                       if !strings.Contains(output, "\n"+fn+"(") {
+                               t.Fatalf("expected %q function in traceback:\n%s", fn, output)
+                       }
+               }
+
+               if want, count := "originating from goroutine", ancestorsExpected; strings.Count(output, want) != count {
+                       t.Errorf("output does not contain %d instances of %q:\n%s", count, want, output)
+               }
+
+               if want, count := "main.recurseThenCallGo(...)", ancestorsExpected*(numFrames+1); strings.Count(output, want) != count {
+                       t.Errorf("output does not contain %d instances of %q:\n%s", count, want, output)
+               }
+
+               if want, count := "main.recurseThenCallGo(0x", 1; strings.Count(output, want) != count {
+                       t.Errorf("output does not contain %d instances of %q:\n%s", count, want, output)
+               }
+       }
+}
+
+// Test that defer closure is correctly scanned when the stack is scanned.
+func TestDeferLiveness(t *testing.T) {
+       output := runTestProg(t, "testprog", "DeferLiveness", "GODEBUG=clobberfree=1")
+       if output != "" {
+               t.Errorf("output:\n%s\n\nwant no output", output)
+       }
+}
 
 func TestDeferHeapAndStack(t *testing.T) {
        P := 4     // processors
-       N := 10000 // iterations
+       N := 10000 //iterations
        D := 200   // stack depth
 
        if testing.Short() {
index d225dc3a6437fbdbc1637a1ffc019786cdde905e..741b6b4ca2fd8159e63cbd3623d6451824e2101b 100644 (file)
@@ -302,6 +302,8 @@ func gobytes(p *byte, n int) (b []byte) {
        return
 }
 
+// This is exported via linkname to assembly in syscall (for Plan9).
+//go:linkname gostring
 func gostring(p *byte) string {
        l := findnull(p)
        if l == 0 {
index 4662251da7f2265a9b72135011b6e2bf8c9b985f..a2e1530d107e52eccabf49b71d5e159cb11ec595 100644 (file)
@@ -240,28 +240,6 @@ func asmcgocall(fn, arg unsafe.Pointer) int32 {
        return 0
 }
 
-// argp used in Defer structs when there is no argp.
-const _NoArgs = ^uintptr(0)
-
-//extern __builtin_prefetch
-func prefetch(addr unsafe.Pointer, rw int32, locality int32)
-
-func prefetcht0(addr uintptr) {
-       prefetch(unsafe.Pointer(addr), 0, 3)
-}
-
-func prefetcht1(addr uintptr) {
-       prefetch(unsafe.Pointer(addr), 0, 2)
-}
-
-func prefetcht2(addr uintptr) {
-       prefetch(unsafe.Pointer(addr), 0, 1)
-}
-
-func prefetchnta(addr uintptr) {
-       prefetch(unsafe.Pointer(addr), 0, 0)
-}
-
 // round n up to a multiple of a.  a must be a power of 2.
 func round(n, a uintptr) uintptr {
        return (n + a - 1) &^ (a - 1)
index 8f3c843a78b1e6f0e5b52e37acd7a9d27e23a3bc..a2ecf388fea00585a9e2a6f5beab35458ecff8e3 100644 (file)
@@ -120,37 +120,6 @@ type Func struct {
        entry uintptr
 }
 
-// A FuncID identifies particular functions that need to be treated
-// specially by the runtime.
-// Note that in some situations involving plugins, there may be multiple
-// copies of a particular special runtime function.
-// Note: this list must match the list in cmd/internal/objabi/funcid.go.
-type funcID uint8
-
-const (
-       funcID_normal funcID = iota // not a special function
-       funcID_runtime_main
-       funcID_goexit
-       funcID_jmpdefer
-       funcID_mcall
-       funcID_morestack
-       funcID_mstart
-       funcID_rt0_go
-       funcID_asmcgocall
-       funcID_sigpanic
-       funcID_runfinq
-       funcID_gcBgMarkWorker
-       funcID_systemstack_switch
-       funcID_systemstack
-       funcID_cgocallback_gofunc
-       funcID_gogo
-       funcID_externalthreadhandler
-       funcID_debugCallV1
-       funcID_gopanic
-       funcID_panicwrap
-       funcID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.)
-)
-
 // FuncForPC returns a *Func describing the function that contains the
 // given program counter address, or else nil.
 //
index ca2be579114a0757193c786218f7b75636ec983d..5f0d1200047e0c34fc6a2cf65bbe351d199f9500 100644 (file)
@@ -112,12 +112,16 @@ func RecursivePanic() {
 }
 
 func GoexitExit() {
+       println("t1")
        go func() {
                time.Sleep(time.Millisecond)
        }()
        i := 0
+       println("t2")
        runtime.SetFinalizer(&i, func(p *int) {})
+       println("t3")
        runtime.GC()
+       println("t4")
        runtime.Goexit()
 }
 
index 629cf2f04fbe6a36bca17c52c30478f93fc27f56..3fd1cd8a1ff15a296e119ec1f525634bb6916308 100644 (file)
@@ -130,59 +130,58 @@ func GCFairness2() {
        fmt.Println("OK")
 }
 
-var maybeSaved []byte
-
 func GCPhys() {
-       // In this test, we construct a very specific scenario. We first
-       // allocate N objects and drop half of their pointers on the floor,
-       // effectively creating N/2 'holes' in our allocated arenas. We then
-       // try to allocate objects twice as big. At the end, we measure the
-       // physical memory overhead of large objects.
+       // This test ensures that heap-growth scavenging is working as intended.
        //
-       // The purpose of this test is to ensure that the GC scavenges free
-       // spans eagerly to ensure high physical memory utilization even
-       // during fragmentation.
+       // It sets up a specific scenario: it allocates two pairs of objects whose
+       // sizes sum to size. One object in each pair is "small" (though must be
+       // large enough to be considered a large object by the runtime) and one is
+       // large. The small objects are kept while the large objects are freed,
+       // creating two large unscavenged holes in the heap. The heap goal should
+       // also be small as a result (so size must be at least as large as the
+       // minimum heap size). We then allocate one large object, bigger than both
+       // pairs of objects combined. This allocation, because it will tip
+       // HeapSys-HeapReleased well above the heap goal, should trigger heap-growth
+       // scavenging and scavenge most, if not all, of the large holes we created
+       // earlier.
        const (
-               // Unfortunately, measuring actual used physical pages is
-               // difficult because HeapReleased doesn't include the parts
-               // of an arena that haven't yet been touched. So, we just
-               // make objects and size sufficiently large such that even
-               // 64 MB overhead is relatively small in the final
-               // calculation.
-               //
-               // Currently, we target 480MiB worth of memory for our test,
-               // computed as size * objects + (size*2) * (objects/2)
-               // = 2 * size * objects
-               //
                // Size must be also large enough to be considered a large
                // object (not in any size-segregated span).
-               size    = 1 << 20
-               objects = 240
+               size    = 4 << 20
+               split   = 64 << 10
+               objects = 2
        )
+       // Set GOGC so that this test operates under consistent assumptions.
+       debug.SetGCPercent(100)
        // Save objects which we want to survive, and condemn objects which we don't.
        // Note that we condemn objects in this way and release them all at once in
        // order to avoid having the GC start freeing up these objects while the loop
        // is still running and filling in the holes we intend to make.
-       saved := make([][]byte, 0, objects)
-       condemned := make([][]byte, 0, objects/2+1)
-       for i := 0; i < objects; i++ {
-               // Write into a global, to prevent this from being optimized away by
-               // the compiler in the future.
-               maybeSaved = make([]byte, size)
+       saved := make([][]byte, 0, objects+1)
+       condemned := make([][]byte, 0, objects)
+       for i := 0; i < 2*objects; i++ {
                if i%2 == 0 {
-                       saved = append(saved, maybeSaved)
+                       saved = append(saved, make([]byte, split))
                } else {
-                       condemned = append(condemned, maybeSaved)
+                       condemned = append(condemned, make([]byte, size-split))
                }
        }
        condemned = nil
        // Clean up the heap. This will free up every other object created above
        // (i.e. everything in condemned) creating holes in the heap.
+       // Also, if the condemned objects are still being swept, its possible that
+       // the scavenging that happens as a result of the next allocation won't see
+       // the holes at all. We call runtime.GC() twice here so that when we allocate
+       // our large object there's no race with sweeping.
        runtime.GC()
-       // Allocate many new objects of 2x size.
-       for i := 0; i < objects/2; i++ {
-               saved = append(saved, make([]byte, size*2))
-       }
+       runtime.GC()
+       // Perform one big allocation which should also scavenge any holes.
+       //
+       // The heap goal will rise after this object is allocated, so it's very
+       // important that we try to do all the scavenging in a single allocation
+       // that exceeds the heap goal. Otherwise the rising heap goal could foil our
+       // test.
+       saved = append(saved, make([]byte, objects*size))
        // Clean up the heap again just to put it in a known state.
        runtime.GC()
        // heapBacked is an estimate of the amount of physical memory used by
@@ -194,21 +193,29 @@ func GCPhys() {
        var stats runtime.MemStats
        runtime.ReadMemStats(&stats)
        heapBacked := stats.HeapSys - stats.HeapReleased
-       // If heapBacked exceeds the amount of memory actually used for heap
-       // allocated objects by 10% (post-GC HeapAlloc should be quite close to
-       // the size of the working set), then fail.
+       // If heapBacked does not exceed the heap goal by more than retainExtraPercent
+       // then the scavenger is working as expected; the newly-created holes have been
+       // scavenged immediately as part of the allocations which cannot fit in the holes.
        //
-       // In the context of this test, that indicates a large amount of
-       // fragmentation with physical pages that are otherwise unused but not
-       // returned to the OS.
+       // Since the runtime should scavenge the entirety of the remaining holes,
+       // theoretically there should be no more free and unscavenged memory. However due
+       // to other allocations that happen during this test we may still see some physical
+       // memory over-use. 10% here is an arbitrary but very conservative threshold which
+       // should easily account for any other allocations this test may have done.
        overuse := (float64(heapBacked) - float64(stats.HeapAlloc)) / float64(stats.HeapAlloc)
-       if overuse > 0.1 {
-               fmt.Printf("exceeded physical memory overuse threshold of 10%%: %3.2f%%\n"+
-                       "(alloc: %d, sys: %d, rel: %d, objs: %d)\n", overuse*100, stats.HeapAlloc,
-                       stats.HeapSys, stats.HeapReleased, len(saved))
+       if overuse <= 0.10 {
+               fmt.Println("OK")
                return
        }
-       fmt.Println("OK")
+       // Physical memory utilization exceeds the threshold, so heap-growth scavenging
+       // did not operate as expected.
+       //
+       // In the context of this test, this indicates a large amount of
+       // fragmentation with physical pages that are otherwise unused but not
+       // returned to the OS.
+       fmt.Printf("exceeded physical memory overuse threshold of 10%%: %3.2f%%\n"+
+               "(alloc: %d, goal: %d, sys: %d, rel: %d, objs: %d)\n", overuse*100,
+               stats.HeapAlloc, stats.NextGC, stats.HeapSys, stats.HeapReleased, len(saved))
        runtime.KeepAlive(saved)
 }
 
diff --git a/libgo/go/runtime/testdata/testprog/sleep.go b/libgo/go/runtime/testdata/testprog/sleep.go
new file mode 100644 (file)
index 0000000..86e2f6c
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "time"
+
+// for golang.org/issue/27250
+
+func init() {
+       register("After1", After1)
+}
+
+func After1() {
+       <-time.After(1 * time.Second)
+}
index aed2410a456941b35ba886f8be77e0592a76e637..25380fb2175df2eaa685f4ee99963064d424a5ee 100644 (file)
@@ -12,7 +12,7 @@ DWORD getthread() {
 }
 */
 import "C"
-import "./windows"
+import "runtime/testdata/testprogcgo/windows"
 
 func init() {
        register("CgoDLLImportsMain", CgoDLLImportsMain)
index 492dfeff7f5628c02f462e9e223de1b134cc08b6..21b668d6c0096510ab9527bd4943a635b471fe92 100644 (file)
@@ -17,11 +17,18 @@ package main
 #include <stdlib.h>
 #include <sys/mman.h>
 
+#ifdef _AIX
+// On AIX, SIGSTKSZ is too small to handle Go sighandler.
+#define CSIGSTKSZ 0x4000
+#else
+#define CSIGSTKSZ SIGSTKSZ
+#endif
+
 extern void SigStackCallback();
 
 static void* WithSigStack(void* arg __attribute__((unused))) {
        // Set up an alternate system stack.
-       void* base = mmap(0, SIGSTKSZ, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+       void* base = mmap(0, CSIGSTKSZ, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
        if (base == MAP_FAILED) {
                perror("mmap failed");
                abort();
@@ -29,7 +36,7 @@ static void* WithSigStack(void* arg __attribute__((unused))) {
        stack_t st = {}, ost = {};
        st.ss_sp = (char*)base;
        st.ss_flags = 0;
-       st.ss_size = SIGSTKSZ;
+       st.ss_size = CSIGSTKSZ;
        if (sigaltstack(&st, &ost) < 0) {
                perror("sigaltstack failed");
                abort();
@@ -42,13 +49,13 @@ static void* WithSigStack(void* arg __attribute__((unused))) {
        if (ost.ss_flags & SS_DISABLE) {
                // Darwin libsystem has a bug where it checks ss_size
                // even if SS_DISABLE is set. (The kernel gets it right.)
-               ost.ss_size = SIGSTKSZ;
+               ost.ss_size = CSIGSTKSZ;
        }
        if (sigaltstack(&ost, NULL) < 0) {
                perror("sigaltstack restore failed");
                abort();
        }
-       mprotect(base, SIGSTKSZ, PROT_NONE);
+       mprotect(base, CSIGSTKSZ, PROT_NONE);
        return NULL;
 }
 
index fc81abc30ff25ac026bfe0546f2593dc972e08d9..235845df4e217b1d19d384cb18135e4c6b021ed5 100644 (file)
@@ -186,6 +186,10 @@ func TestTraceStress(t *testing.T) {
        if IsEnabled() {
                t.Skip("skipping because -test.trace is set")
        }
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
+
        var wg sync.WaitGroup
        done := make(chan bool)
 
@@ -237,7 +241,7 @@ func TestTraceStress(t *testing.T) {
        runtime.GC()
        // Trigger GC from malloc.
        n := int(1e3)
-       if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm" {
+       if isMemoryConstrained() {
                // Reduce allocation to avoid running out of
                // memory on the builder - see issue/12032.
                n = 512
@@ -322,6 +326,21 @@ func TestTraceStress(t *testing.T) {
        testBrokenTimestamps(t, trace)
 }
 
+// isMemoryConstrained reports whether the current machine is likely
+// to be memory constrained.
+// This was originally for the openbsd/arm builder (Issue 12032).
+// TODO: move this to testenv? Make this look at memory? Look at GO_BUILDER_NAME?
+func isMemoryConstrained() bool {
+       if runtime.GOOS == "plan9" {
+               return true
+       }
+       switch runtime.GOARCH {
+       case "arm", "mips", "mipsle":
+               return true
+       }
+       return false
+}
+
 // Do a bunch of various stuff (timers, GC, network, etc) in a separate goroutine.
 // And concurrently with all that start/stop trace 3 times.
 func TestTraceStressStartStop(t *testing.T) {
@@ -381,9 +400,9 @@ func TestTraceStressStartStop(t *testing.T) {
                runtime.GC()
                // Trigger GC from malloc.
                n := int(1e3)
-               if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm" {
+               if isMemoryConstrained() {
                        // Reduce allocation to avoid running out of
-                       // memory on the builder - see issue/12032.
+                       // memory on the builder.
                        n = 512
                }
                for i := 0; i < n; i++ {
diff --git a/libgo/go/runtime/treap_test.go b/libgo/go/runtime/treap_test.go
new file mode 100644 (file)
index 0000000..110f51c
--- /dev/null
@@ -0,0 +1,270 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package runtime_test
+
+import (
+       "fmt"
+       "runtime"
+       "testing"
+)
+
+var spanDesc = map[uintptr]struct {
+       pages uintptr
+       scav  bool
+}{
+       0xc0000000: {2, false},
+       0xc0006000: {1, false},
+       0xc0010000: {8, false},
+       0xc0022000: {7, false},
+       0xc0034000: {4, true},
+       0xc0040000: {5, false},
+       0xc0050000: {5, true},
+       0xc0060000: {5000, false},
+}
+
+// Wrap the Treap one more time because go:notinheap doesn't
+// actually follow a structure across package boundaries.
+//
+//go:notinheap
+type treap struct {
+       runtime.Treap
+}
+
+func maskMatchName(mask, match runtime.TreapIterType) string {
+       return fmt.Sprintf("%0*b-%0*b", runtime.TreapIterBits, uint8(mask), runtime.TreapIterBits, uint8(match))
+}
+
+func TestTreapFilter(t *testing.T) {
+       var iterTypes = [...]struct {
+               mask, match runtime.TreapIterType
+               filter      runtime.TreapIterFilter // expected filter
+       }{
+               {0, 0, 0xf},
+               {runtime.TreapIterScav, 0, 0x5},
+               {runtime.TreapIterScav, runtime.TreapIterScav, 0xa},
+               {runtime.TreapIterScav | runtime.TreapIterHuge, runtime.TreapIterHuge, 0x4},
+               {runtime.TreapIterScav | runtime.TreapIterHuge, 0, 0x1},
+               {0, runtime.TreapIterScav, 0x0},
+       }
+       for _, it := range iterTypes {
+               t.Run(maskMatchName(it.mask, it.match), func(t *testing.T) {
+                       if f := runtime.TreapFilter(it.mask, it.match); f != it.filter {
+                               t.Fatalf("got %#x, want %#x", f, it.filter)
+                       }
+               })
+       }
+}
+
+// This test ensures that the treap implementation in the runtime
+// maintains all stated invariants after different sequences of
+// insert, removeSpan, find, and erase. Invariants specific to the
+// treap data structure are checked implicitly: after each mutating
+// operation, treap-related invariants are checked for the entire
+// treap.
+func TestTreap(t *testing.T) {
+       // Set up a bunch of spans allocated into mheap_.
+       // Also, derive a set of typeCounts of each type of span
+       // according to runtime.TreapIterType so we can verify against
+       // them later.
+       spans := make([]runtime.Span, 0, len(spanDesc))
+       typeCounts := [1 << runtime.TreapIterBits][1 << runtime.TreapIterBits]int{}
+       for base, de := range spanDesc {
+               s := runtime.AllocSpan(base, de.pages, de.scav)
+               defer s.Free()
+               spans = append(spans, s)
+
+               for i := runtime.TreapIterType(0); i < 1<<runtime.TreapIterBits; i++ {
+                       for j := runtime.TreapIterType(0); j < 1<<runtime.TreapIterBits; j++ {
+                               if s.MatchesIter(i, j) {
+                                       typeCounts[i][j]++
+                               }
+                       }
+               }
+       }
+       t.Run("TypeCountsSanity", func(t *testing.T) {
+               // Just sanity check type counts for a few values.
+               check := func(mask, match runtime.TreapIterType, count int) {
+                       tc := typeCounts[mask][match]
+                       if tc != count {
+                               name := maskMatchName(mask, match)
+                               t.Fatalf("failed a sanity check for mask/match %s counts: got %d, wanted %d", name, tc, count)
+                       }
+               }
+               check(0, 0, len(spanDesc))
+               check(runtime.TreapIterScav, 0, 6)
+               check(runtime.TreapIterScav, runtime.TreapIterScav, 2)
+       })
+       t.Run("Insert", func(t *testing.T) {
+               tr := treap{}
+               // Test just a very basic insert/remove for sanity.
+               tr.Insert(spans[0])
+               tr.RemoveSpan(spans[0])
+       })
+       t.Run("FindTrivial", func(t *testing.T) {
+               tr := treap{}
+               // Test just a very basic find operation for sanity.
+               tr.Insert(spans[0])
+               i := tr.Find(1)
+               if i.Span() != spans[0] {
+                       t.Fatal("found unknown span in treap")
+               }
+               tr.RemoveSpan(spans[0])
+       })
+       t.Run("FindFirstFit", func(t *testing.T) {
+               // Run this 10 times, recreating the treap each time.
+               // Because of the non-deterministic structure of a treap,
+               // we'll be able to test different structures this way.
+               for i := 0; i < 10; i++ {
+                       tr := runtime.Treap{}
+                       for _, s := range spans {
+                               tr.Insert(s)
+                       }
+                       i := tr.Find(5)
+                       if i.Span().Base() != 0xc0010000 {
+                               t.Fatalf("expected span at lowest address which could fit 5 pages, instead found span at %x", i.Span().Base())
+                       }
+                       for _, s := range spans {
+                               tr.RemoveSpan(s)
+                       }
+               }
+       })
+       t.Run("Iterate", func(t *testing.T) {
+               for mask := runtime.TreapIterType(0); mask < 1<<runtime.TreapIterBits; mask++ {
+                       for match := runtime.TreapIterType(0); match < 1<<runtime.TreapIterBits; match++ {
+                               iterName := maskMatchName(mask, match)
+                               t.Run(iterName, func(t *testing.T) {
+                                       t.Run("StartToEnd", func(t *testing.T) {
+                                               // Ensure progressing an iterator actually goes over the whole treap
+                                               // from the start and that it iterates over the elements in order.
+                                               // Furthermore, ensure that it only iterates over the relevant parts
+                                               // of the treap.
+                                               // Finally, ensures that Start returns a valid iterator.
+                                               tr := treap{}
+                                               for _, s := range spans {
+                                                       tr.Insert(s)
+                                               }
+                                               nspans := 0
+                                               lastBase := uintptr(0)
+                                               for i := tr.Start(mask, match); i.Valid(); i = i.Next() {
+                                                       nspans++
+                                                       if lastBase > i.Span().Base() {
+                                                               t.Fatalf("not iterating in correct order: encountered base %x before %x", lastBase, i.Span().Base())
+                                                       }
+                                                       lastBase = i.Span().Base()
+                                                       if !i.Span().MatchesIter(mask, match) {
+                                                               t.Fatalf("found non-matching span while iteration over mask/match %s: base %x", iterName, i.Span().Base())
+                                                       }
+                                               }
+                                               if nspans != typeCounts[mask][match] {
+                                                       t.Fatal("failed to iterate forwards over full treap")
+                                               }
+                                               for _, s := range spans {
+                                                       tr.RemoveSpan(s)
+                                               }
+                                       })
+                                       t.Run("EndToStart", func(t *testing.T) {
+                                               // See StartToEnd tests.
+                                               tr := treap{}
+                                               for _, s := range spans {
+                                                       tr.Insert(s)
+                                               }
+                                               nspans := 0
+                                               lastBase := ^uintptr(0)
+                                               for i := tr.End(mask, match); i.Valid(); i = i.Prev() {
+                                                       nspans++
+                                                       if lastBase < i.Span().Base() {
+                                                               t.Fatalf("not iterating in correct order: encountered base %x before %x", lastBase, i.Span().Base())
+                                                       }
+                                                       lastBase = i.Span().Base()
+                                                       if !i.Span().MatchesIter(mask, match) {
+                                                               t.Fatalf("found non-matching span while iteration over mask/match %s: base %x", iterName, i.Span().Base())
+                                                       }
+                                               }
+                                               if nspans != typeCounts[mask][match] {
+                                                       t.Fatal("failed to iterate backwards over full treap")
+                                               }
+                                               for _, s := range spans {
+                                                       tr.RemoveSpan(s)
+                                               }
+                                       })
+                               })
+                       }
+               }
+               t.Run("Prev", func(t *testing.T) {
+                       // Test the iterator invariant that i.prev().next() == i.
+                       tr := treap{}
+                       for _, s := range spans {
+                               tr.Insert(s)
+                       }
+                       i := tr.Start(0, 0).Next().Next()
+                       p := i.Prev()
+                       if !p.Valid() {
+                               t.Fatal("i.prev() is invalid")
+                       }
+                       if p.Next().Span() != i.Span() {
+                               t.Fatal("i.prev().next() != i")
+                       }
+                       for _, s := range spans {
+                               tr.RemoveSpan(s)
+                       }
+               })
+               t.Run("Next", func(t *testing.T) {
+                       // Test the iterator invariant that i.next().prev() == i.
+                       tr := treap{}
+                       for _, s := range spans {
+                               tr.Insert(s)
+                       }
+                       i := tr.Start(0, 0).Next().Next()
+                       n := i.Next()
+                       if !n.Valid() {
+                               t.Fatal("i.next() is invalid")
+                       }
+                       if n.Prev().Span() != i.Span() {
+                               t.Fatal("i.next().prev() != i")
+                       }
+                       for _, s := range spans {
+                               tr.RemoveSpan(s)
+                       }
+               })
+       })
+       t.Run("EraseOne", func(t *testing.T) {
+               // Test that erasing one iterator correctly retains
+               // all relationships between elements.
+               tr := treap{}
+               for _, s := range spans {
+                       tr.Insert(s)
+               }
+               i := tr.Start(0, 0).Next().Next().Next()
+               s := i.Span()
+               n := i.Next()
+               p := i.Prev()
+               tr.Erase(i)
+               if n.Prev().Span() != p.Span() {
+                       t.Fatal("p, n := i.Prev(), i.Next(); n.prev() != p after i was erased")
+               }
+               if p.Next().Span() != n.Span() {
+                       t.Fatal("p, n := i.Prev(), i.Next(); p.next() != n after i was erased")
+               }
+               tr.Insert(s)
+               for _, s := range spans {
+                       tr.RemoveSpan(s)
+               }
+       })
+       t.Run("EraseAll", func(t *testing.T) {
+               // Test that erasing iterators actually removes nodes from the treap.
+               tr := treap{}
+               for _, s := range spans {
+                       tr.Insert(s)
+               }
+               for i := tr.Start(0, 0); i.Valid(); {
+                       n := i.Next()
+                       tr.Erase(i)
+                       i = n
+               }
+               if size := tr.Size(); size != 0 {
+                       t.Fatalf("should have emptied out treap, %d spans left", size)
+               }
+       })
+}
index 13905353f83ad78cb3304c0c0f3d1ce198820473..63ad310355d6fddae01f168c007b21d18fe8ed3c 100644 (file)
@@ -79,7 +79,7 @@ type maptype struct {
        elem       *_type
        bucket     *_type // internal type representing a hash bucket
        keysize    uint8  // size of key slot
-       valuesize  uint8  // size of value slot
+       elemsize   uint8  // size of elem slot
        bucketsize uint16 // size of bucket
        flags      uint32
 }
@@ -89,7 +89,7 @@ type maptype struct {
 func (mt *maptype) indirectkey() bool { // store ptr to key instead of key itself
        return mt.flags&1 != 0
 }
-func (mt *maptype) indirectvalue() bool { // store ptr to value instead of value itself
+func (mt *maptype) indirectelem() bool { // store ptr to elem instead of elem itself
        return mt.flags&2 != 0
 }
 func (mt *maptype) reflexivekey() bool { // true if k==k for all keys
index abb27777fe9a601911c3c8cc3d91720dd0263bc1..7087a9b0468088dbbeb4290558bd48b60f168672 100644 (file)
@@ -34,7 +34,6 @@ const (
 
        kindDirectIface = 1 << 5
        kindGCProg      = 1 << 6
-       kindNoPointers  = 1 << 7
        kindMask        = (1 << 5) - 1
 )
 
diff --git a/libgo/go/runtime/unaligned1.go b/libgo/go/runtime/unaligned1.go
deleted file mode 100644 (file)
index 86e0df0..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build 386 amd64 amd64p32 arm64 ppc64 ppc64le s390x wasm ppc s390 arm64be riscv64
-
-package runtime
-
-import "unsafe"
-
-func readUnaligned32(p unsafe.Pointer) uint32 {
-       return *(*uint32)(p)
-}
-
-func readUnaligned64(p unsafe.Pointer) uint64 {
-       return *(*uint64)(p)
-}
diff --git a/libgo/go/runtime/unaligned2.go b/libgo/go/runtime/unaligned2.go
deleted file mode 100644 (file)
index 9f52e8d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build alpha arm armbe ia64 m68k mips mipsle mips64 mips64le mips64p32 mips64p32le nios2 sh shbe sparc sparc64
-
-package runtime
-
-import "unsafe"
-
-// Note: These routines perform the read with an unspecified endianness.
-func readUnaligned32(p unsafe.Pointer) uint32 {
-       q := (*[4]byte)(p)
-       return uint32(q[0]) + uint32(q[1])<<8 + uint32(q[2])<<16 + uint32(q[3])<<24
-}
-
-func readUnaligned64(p unsafe.Pointer) uint64 {
-       q := (*[8]byte)(p)
-       return uint64(q[0]) + uint64(q[1])<<8 + uint64(q[2])<<16 + uint64(q[3])<<24 + uint64(q[4])<<32 + uint64(q[5])<<40 + uint64(q[6])<<48 + uint64(q[7])<<56
-}
index bf99b5f6c5b57dc5eb5e4d13d30b822a48591678..2419fc8663e4cdb501094b99a2aadd06ede6e0cb 100644 (file)
@@ -21,7 +21,7 @@ var (
 // in kernel ring buffers. In Android-L, those /dev/log files are no longer
 // accessible and logging is done through a centralized user-mode logger, logd.
 //
-// https://android.googlesource.com/platform/system/core/+/master/liblog/logd_write.c
+// https://android.googlesource.com/platform/system/core/+/refs/tags/android-6.0.1_r78/liblog/logd_write.c
 type loggerType int32
 
 const (
index 206f12173de11301c740b39e7c0c7c2a897b3850..1f42c2a3fdc20318a582620274e3d7ee4050522b 100644 (file)
@@ -2,12 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build !compiler_bootstrap go1.8
-
 package sort
 
-import "reflect"
-
 // Slice sorts the provided slice given the provided less function.
 //
 // The sort is not guaranteed to be stable. For a stable sort, use
@@ -15,8 +11,8 @@ import "reflect"
 //
 // The function panics if the provided interface is not a slice.
 func Slice(slice interface{}, less func(i, j int) bool) {
-       rv := reflect.ValueOf(slice)
-       swap := reflect.Swapper(slice)
+       rv := reflectValueOf(slice)
+       swap := reflectSwapper(slice)
        length := rv.Len()
        quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
 }
@@ -26,8 +22,8 @@ func Slice(slice interface{}, less func(i, j int) bool) {
 //
 // The function panics if the provided interface is not a slice.
 func SliceStable(slice interface{}, less func(i, j int) bool) {
-       rv := reflect.ValueOf(slice)
-       swap := reflect.Swapper(slice)
+       rv := reflectValueOf(slice)
+       swap := reflectSwapper(slice)
        stable_func(lessSwap{less, swap}, rv.Len())
 }
 
@@ -35,7 +31,7 @@ func SliceStable(slice interface{}, less func(i, j int) bool) {
 //
 // The function panics if the provided interface is not a slice.
 func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool {
-       rv := reflect.ValueOf(slice)
+       rv := reflectValueOf(slice)
        n := rv.Len()
        for i := n - 1; i > 0; i-- {
                if less(i, i-1) {
diff --git a/libgo/go/sort/slice_go113.go b/libgo/go/sort/slice_go113.go
new file mode 100644 (file)
index 0000000..bf24db7
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.13
+
+package sort
+
+import "internal/reflectlite"
+
+var reflectValueOf = reflectlite.ValueOf
+var reflectSwapper = reflectlite.Swapper
diff --git a/libgo/go/sort/slice_go14.go b/libgo/go/sort/slice_go14.go
new file mode 100644 (file)
index 0000000..3bf5cbc
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.8
+
+package sort
+
+import "reflect"
+
+var reflectValueOf = reflect.ValueOf
+
+func reflectSwapper(x interface{}) func(int, int) {
+       v := reflectValueOf(x)
+       tmp := reflect.New(v.Type().Elem()).Elem()
+       return func(i, j int) {
+               a, b := v.Index(i), v.Index(j)
+               tmp.Set(a)
+               a.Set(b)
+               b.Set(tmp)
+       }
+}
diff --git a/libgo/go/sort/slice_go18.go b/libgo/go/sort/slice_go18.go
new file mode 100644 (file)
index 0000000..e176604
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.8,!go1.13
+
+package sort
+
+import "reflect"
+
+var reflectValueOf = reflect.ValueOf
+var reflectSwapper = reflect.Swapper
index 3b31143a74570a422040691be5aebb1dc6c79ea0..bfff3528d3ff57cab4f6b1b3b0994a85e577f16a 100644 (file)
@@ -323,8 +323,7 @@ func (d *testingData) Less(i, j int) bool {
 }
 func (d *testingData) Swap(i, j int) {
        if d.nswap >= d.maxswap {
-               d.t.Errorf("%s: used %d swaps sorting slice of %d", d.desc, d.nswap, len(d.data))
-               d.t.FailNow()
+               d.t.Fatalf("%s: used %d swaps sorting slice of %d", d.desc, d.nswap, len(d.data))
        }
        d.nswap++
        d.data[i], d.data[j] = d.data[j], d.data[i]
@@ -433,9 +432,7 @@ func testBentleyMcIlroy(t *testing.T, sort func(Interface), maxswap func(int) in
                                        // mutating method Sort can call is TestingData.swap,
                                        // it suffices here just to check that the final slice is sorted.
                                        if !IntsAreSorted(mdata) {
-                                               t.Errorf("%s: ints not sorted", desc)
-                                               t.Errorf("\t%v", mdata)
-                                               t.FailNow()
+                                               t.Fatalf("%s: ints not sorted\n\t%v", desc, mdata)
                                        }
                                }
                        }
@@ -517,8 +514,7 @@ func TestAdversary(t *testing.T) {
        // Check data is fully populated and sorted.
        for i, v := range d.data {
                if v != i {
-                       t.Errorf("adversary data not fully sorted")
-                       t.FailNow()
+                       t.Fatalf("adversary data not fully sorted")
                }
        }
 }
index fdcb8b3d7a5c2a074332145ed53eeb7a60d1f842..eff1379b97eccf21bd0b10f3793bd47305a0eca2 100644 (file)
@@ -13,7 +13,7 @@ package strconv
 import "math"
 import "runtime"
 
-var optimize = true // can change for testing
+var optimize = true // set to false to force slow-path conversions for testing
 
 func equalIgnoreCase(s1, s2 string) bool {
        if len(s1) != len(s2) {
@@ -84,6 +84,9 @@ func (b *decimal) set(s string) (ok bool) {
        sawdigits := false
        for ; i < len(s); i++ {
                switch {
+               case s[i] == '_':
+                       // underscoreOK already called
+                       continue
                case s[i] == '.':
                        if sawdot {
                                return
@@ -120,7 +123,7 @@ func (b *decimal) set(s string) (ok bool) {
        // just be sure to move the decimal point by
        // a lot (say, 100000).  it doesn't matter if it's
        // not the exact number.
-       if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
+       if i < len(s) && lower(s[i]) == 'e' {
                i++
                if i >= len(s) {
                        return
@@ -136,7 +139,11 @@ func (b *decimal) set(s string) (ok bool) {
                        return
                }
                e := 0
-               for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+               for ; i < len(s) && ('0' <= s[i] && s[i] <= '9' || s[i] == '_'); i++ {
+                       if s[i] == '_' {
+                               // underscoreOK already called
+                               continue
+                       }
                        if e < 10000 {
                                e = e*10 + int(s[i]) - '0'
                        }
@@ -153,10 +160,9 @@ func (b *decimal) set(s string) (ok bool) {
 }
 
 // readFloat reads a decimal mantissa and exponent from a float
-// string representation. It sets ok to false if the number could
+// string representation. It returns ok==false if the number could
 // not fit return types or is invalid.
-func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
-       const uint64digits = 19
+func readFloat(s string) (mantissa uint64, exp int, neg, trunc, hex, ok bool) {
        i := 0
 
        // optional sign
@@ -172,6 +178,16 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
        }
 
        // digits
+       base := uint64(10)
+       maxMantDigits := 19 // 10^19 fits in uint64
+       expChar := byte('e')
+       if i+2 < len(s) && s[i] == '0' && lower(s[i+1]) == 'x' {
+               base = 16
+               maxMantDigits = 16 // 16^16 fits in uint64
+               i += 2
+               expChar = 'p'
+               hex = true
+       }
        sawdot := false
        sawdigits := false
        nd := 0
@@ -179,6 +195,10 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
        dp := 0
        for ; i < len(s); i++ {
                switch c := s[i]; true {
+               case c == '_':
+                       // underscoreOK already called
+                       continue
+
                case c == '.':
                        if sawdot {
                                return
@@ -194,11 +214,23 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
                                continue
                        }
                        nd++
-                       if ndMant < uint64digits {
-                               mantissa *= 10
+                       if ndMant < maxMantDigits {
+                               mantissa *= base
                                mantissa += uint64(c - '0')
                                ndMant++
-                       } else if s[i] != '0' {
+                       } else if c != '0' {
+                               trunc = true
+                       }
+                       continue
+
+               case base == 16 && 'a' <= lower(c) && lower(c) <= 'f':
+                       sawdigits = true
+                       nd++
+                       if ndMant < maxMantDigits {
+                               mantissa *= 16
+                               mantissa += uint64(lower(c) - 'a' + 10)
+                               ndMant++
+                       } else {
                                trunc = true
                        }
                        continue
@@ -212,12 +244,17 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
                dp = nd
        }
 
+       if base == 16 {
+               dp *= 4
+               ndMant *= 4
+       }
+
        // optional exponent moves decimal point.
        // if we read a very large, very long number,
        // just be sure to move the decimal point by
        // a lot (say, 100000).  it doesn't matter if it's
        // not the exact number.
-       if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
+       if i < len(s) && lower(s[i]) == expChar {
                i++
                if i >= len(s) {
                        return
@@ -233,12 +270,19 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
                        return
                }
                e := 0
-               for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+               for ; i < len(s) && ('0' <= s[i] && s[i] <= '9' || s[i] == '_'); i++ {
+                       if s[i] == '_' {
+                               // underscoreOK already called
+                               continue
+                       }
                        if e < 10000 {
                                e = e*10 + int(s[i]) - '0'
                        }
                }
                dp += e * esign
+       } else if base == 16 {
+               // Must have exponent.
+               return
        }
 
        if i != len(s) {
@@ -250,7 +294,6 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
        }
        ok = true
        return
-
 }
 
 // decimal power of ten to binary power of two.
@@ -439,6 +482,76 @@ func atof32exact(mantissa uint64, exp int, neg bool) (f float32, ok bool) {
        return
 }
 
+// atofHex converts the hex floating-point string s
+// to a rounded float32 or float64 value (depending on flt==&float32info or flt==&float64info)
+// and returns it as a float64.
+// The string s has already been parsed into a mantissa, exponent, and sign (neg==true for negative).
+// If trunc is true, trailing non-zero bits have been omitted from the mantissa.
+func atofHex(s string, flt *floatInfo, mantissa uint64, exp int, neg, trunc bool) (float64, error) {
+       maxExp := 1<<flt.expbits + flt.bias - 2
+       minExp := flt.bias + 1
+       exp += int(flt.mantbits) // mantissa now implicitly divided by 2^mantbits.
+
+       // Shift mantissa and exponent to bring representation into float range.
+       // Eventually we want a mantissa with a leading 1-bit followed by mantbits other bits.
+       // For rounding, we need two more, where the bottom bit represents
+       // whether that bit or any later bit was non-zero.
+       // (If the mantissa has already lost non-zero bits, trunc is true,
+       // and we OR in a 1 below after shifting left appropriately.)
+       for mantissa != 0 && mantissa>>(flt.mantbits+2) == 0 {
+               mantissa <<= 1
+               exp--
+       }
+       if trunc {
+               mantissa |= 1
+       }
+       for mantissa>>(1+flt.mantbits+2) != 0 {
+               mantissa = mantissa>>1 | mantissa&1
+               exp++
+       }
+
+       // If exponent is too negative,
+       // denormalize in hopes of making it representable.
+       // (The -2 is for the rounding bits.)
+       for mantissa > 1 && exp < minExp-2 {
+               mantissa = mantissa>>1 | mantissa&1
+               exp++
+       }
+
+       // Round using two bottom bits.
+       round := mantissa & 3
+       mantissa >>= 2
+       round |= mantissa & 1 // round to even (round up if mantissa is odd)
+       exp += 2
+       if round == 3 {
+               mantissa++
+               if mantissa == 1<<(1+flt.mantbits) {
+                       mantissa >>= 1
+                       exp++
+               }
+       }
+
+       if mantissa>>flt.mantbits == 0 { // Denormal or zero.
+               exp = flt.bias
+       }
+       var err error
+       if exp > maxExp { // infinity and range error
+               mantissa = 1 << flt.mantbits
+               exp = maxExp + 1
+               err = rangeError(fnParseFloat, s)
+       }
+
+       bits := mantissa & (1<<flt.mantbits - 1)
+       bits |= uint64((exp-flt.bias)&(1<<flt.expbits-1)) << flt.mantbits
+       if neg {
+               bits |= 1 << flt.mantbits << flt.expbits
+       }
+       if flt == &float32info {
+               return float64(math.Float32frombits(uint32(bits))), err
+       }
+       return math.Float64frombits(bits), err
+}
+
 const fnParseFloat = "ParseFloat"
 
 func atof32(s string) (f float32, err error) {
@@ -446,28 +559,32 @@ func atof32(s string) (f float32, err error) {
                return float32(val), nil
        }
 
-       if optimize {
-               // Parse mantissa and exponent.
-               mantissa, exp, neg, trunc, ok := readFloat(s)
-               if ok {
-                       // Try pure floating-point arithmetic conversion.
-                       if !trunc {
-                               if f, ok := atof32exact(mantissa, exp, neg); ok {
-                                       return f, nil
-                               }
+       mantissa, exp, neg, trunc, hex, ok := readFloat(s)
+       if hex && ok {
+               f, err := atofHex(s, &float32info, mantissa, exp, neg, trunc)
+               return float32(f), err
+       }
+
+       if optimize && ok {
+               // Try pure floating-point arithmetic conversion.
+               if !trunc {
+                       if f, ok := atof32exact(mantissa, exp, neg); ok {
+                               return f, nil
                        }
-                       // Try another fast path.
-                       ext := new(extFloat)
-                       if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float32info); ok {
-                               b, ovf := ext.floatBits(&float32info)
-                               f = math.Float32frombits(uint32(b))
-                               if ovf {
-                                       err = rangeError(fnParseFloat, s)
-                               }
-                               return f, err
+               }
+               // Try another fast path.
+               ext := new(extFloat)
+               if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float32info); ok {
+                       b, ovf := ext.floatBits(&float32info)
+                       f = math.Float32frombits(uint32(b))
+                       if ovf {
+                               err = rangeError(fnParseFloat, s)
                        }
+                       return f, err
                }
        }
+
+       // Slow fallback.
        var d decimal
        if !d.set(s) {
                return 0, syntaxError(fnParseFloat, s)
@@ -485,28 +602,31 @@ func atof64(s string) (f float64, err error) {
                return val, nil
        }
 
-       if optimize {
-               // Parse mantissa and exponent.
-               mantissa, exp, neg, trunc, ok := readFloat(s)
-               if ok {
-                       // Try pure floating-point arithmetic conversion.
-                       if !trunc {
-                               if f, ok := atof64exact(mantissa, exp, neg); ok {
-                                       return f, nil
-                               }
+       mantissa, exp, neg, trunc, hex, ok := readFloat(s)
+       if hex && ok {
+               return atofHex(s, &float64info, mantissa, exp, neg, trunc)
+       }
+
+       if optimize && ok {
+               // Try pure floating-point arithmetic conversion.
+               if !trunc {
+                       if f, ok := atof64exact(mantissa, exp, neg); ok {
+                               return f, nil
                        }
-                       // Try another fast path.
-                       ext := new(extFloat)
-                       if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float64info); ok {
-                               b, ovf := ext.floatBits(&float64info)
-                               f = math.Float64frombits(b)
-                               if ovf {
-                                       err = rangeError(fnParseFloat, s)
-                               }
-                               return f, err
+               }
+               // Try another fast path.
+               ext := new(extFloat)
+               if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float64info); ok {
+                       b, ovf := ext.floatBits(&float64info)
+                       f = math.Float64frombits(b)
+                       if ovf {
+                               err = rangeError(fnParseFloat, s)
                        }
+                       return f, err
                }
        }
+
+       // Slow fallback.
        var d decimal
        if !d.set(s) {
                return 0, syntaxError(fnParseFloat, s)
@@ -524,9 +644,13 @@ func atof64(s string) (f float64, err error) {
 // When bitSize=32, the result still has type float64, but it will be
 // convertible to float32 without changing its value.
 //
-// If s is well-formed and near a valid floating point number,
-// ParseFloat returns the nearest floating point number rounded
+// ParseFloat accepts decimal and hexadecimal floating-point number syntax.
+// If s is well-formed and near a valid floating-point number,
+// ParseFloat returns the nearest floating-point number rounded
 // using IEEE754 unbiased rounding.
+// (Parsing a hexadecimal floating-point value only rounds when
+// there are more bits in the hexadecimal representatiton than
+// will fit in the mantissa.)
 //
 // The errors that ParseFloat returns have concrete type *NumError
 // and include err.Num = s.
@@ -536,7 +660,13 @@ func atof64(s string) (f float64, err error) {
 // If s is syntactically well-formed but is more than 1/2 ULP
 // away from the largest floating point number of the given size,
 // ParseFloat returns f = ±Inf, err.Err = ErrRange.
+//
+// ParseFloat recognizes the strings "NaN", "+Inf", and "-Inf" as their
+// respective special floating point values. It ignores case when matching.
 func ParseFloat(s string, bitSize int) (float64, error) {
+       if !underscoreOK(s) {
+               return 0, syntaxError(fnParseFloat, s)
+       }
        if bitSize == 32 {
                f, err := atof32(s)
                return float64(f), err
index cf4d47c8b9e38bfdfd00f970c0b110a7366293c5..abe6c644661378fe4dd15f8a2ab2d79fd83757b0 100644 (file)
@@ -43,6 +43,23 @@ var atoftests = []atofTest{
        {"1e-20", "1e-20", nil},
        {"625e-3", "0.625", nil},
 
+       // Hexadecimal floating-point.
+       {"0x1p0", "1", nil},
+       {"0x1p1", "2", nil},
+       {"0x1p-1", "0.5", nil},
+       {"0x1ep-1", "15", nil},
+       {"-0x1ep-1", "-15", nil},
+       {"-0x1_ep-1", "-15", nil},
+       {"0x1p-200", "6.223015277861142e-61", nil},
+       {"0x1p200", "1.6069380442589903e+60", nil},
+       {"0x1fFe2.p0", "131042", nil},
+       {"0x1fFe2.P0", "131042", nil},
+       {"-0x2p3", "-16", nil},
+       {"0x0.fp4", "15", nil},
+       {"0x0.fp0", "0.9375", nil},
+       {"0x1e2", "0", ErrSyntax},
+       {"1p2", "0", ErrSyntax},
+
        // zeros
        {"0", "0", nil},
        {"0e0", "0", nil},
@@ -58,6 +75,11 @@ var atoftests = []atofTest{
        {"0.00e-01234567890123456789", "0", nil},
        {"-0e+01234567890123456789", "-0", nil},
        {"-0.00e-01234567890123456789", "-0", nil},
+       {"0x0p+01234567890123456789", "0", nil},
+       {"0x0.00p-01234567890123456789", "0", nil},
+       {"-0x0p+01234567890123456789", "-0", nil},
+       {"-0x0.00p-01234567890123456789", "-0", nil},
+
        {"0e291", "0", nil}, // issue 15364
        {"0e292", "0", nil}, // issue 15364
        {"0e347", "0", nil}, // issue 15364
@@ -66,6 +88,26 @@ var atoftests = []atofTest{
        {"-0e292", "-0", nil},
        {"-0e347", "-0", nil},
        {"-0e348", "-0", nil},
+       {"0x0p126", "0", nil},
+       {"0x0p127", "0", nil},
+       {"0x0p128", "0", nil},
+       {"0x0p129", "0", nil},
+       {"0x0p130", "0", nil},
+       {"0x0p1022", "0", nil},
+       {"0x0p1023", "0", nil},
+       {"0x0p1024", "0", nil},
+       {"0x0p1025", "0", nil},
+       {"0x0p1026", "0", nil},
+       {"-0x0p126", "-0", nil},
+       {"-0x0p127", "-0", nil},
+       {"-0x0p128", "-0", nil},
+       {"-0x0p129", "-0", nil},
+       {"-0x0p130", "-0", nil},
+       {"-0x0p1022", "-0", nil},
+       {"-0x0p1023", "-0", nil},
+       {"-0x0p1024", "-0", nil},
+       {"-0x0p1025", "-0", nil},
+       {"-0x0p1026", "-0", nil},
 
        // NaNs
        {"nan", "NaN", nil},
@@ -83,21 +125,46 @@ var atoftests = []atofTest{
        // largest float64
        {"1.7976931348623157e308", "1.7976931348623157e+308", nil},
        {"-1.7976931348623157e308", "-1.7976931348623157e+308", nil},
+       {"0x1.fffffffffffffp1023", "1.7976931348623157e+308", nil},
+       {"-0x1.fffffffffffffp1023", "-1.7976931348623157e+308", nil},
+       {"0x1fffffffffffffp+971", "1.7976931348623157e+308", nil},
+       {"-0x1fffffffffffffp+971", "-1.7976931348623157e+308", nil},
+       {"0x.1fffffffffffffp1027", "1.7976931348623157e+308", nil},
+       {"-0x.1fffffffffffffp1027", "-1.7976931348623157e+308", nil},
+
        // next float64 - too large
        {"1.7976931348623159e308", "+Inf", ErrRange},
        {"-1.7976931348623159e308", "-Inf", ErrRange},
+       {"0x1p1024", "+Inf", ErrRange},
+       {"-0x1p1024", "-Inf", ErrRange},
+       {"0x2p1023", "+Inf", ErrRange},
+       {"-0x2p1023", "-Inf", ErrRange},
+       {"0x.1p1028", "+Inf", ErrRange},
+       {"-0x.1p1028", "-Inf", ErrRange},
+       {"0x.2p1027", "+Inf", ErrRange},
+       {"-0x.2p1027", "-Inf", ErrRange},
+
        // the border is ...158079
        // borderline - okay
        {"1.7976931348623158e308", "1.7976931348623157e+308", nil},
        {"-1.7976931348623158e308", "-1.7976931348623157e+308", nil},
+       {"0x1.fffffffffffff7fffp1023", "1.7976931348623157e+308", nil},
+       {"-0x1.fffffffffffff7fffp1023", "-1.7976931348623157e+308", nil},
        // borderline - too large
        {"1.797693134862315808e308", "+Inf", ErrRange},
        {"-1.797693134862315808e308", "-Inf", ErrRange},
+       {"0x1.fffffffffffff8p1023", "+Inf", ErrRange},
+       {"-0x1.fffffffffffff8p1023", "-Inf", ErrRange},
+       {"0x1fffffffffffff.8p+971", "+Inf", ErrRange},
+       {"-0x1fffffffffffff8p+967", "-Inf", ErrRange},
+       {"0x.1fffffffffffff8p1027", "+Inf", ErrRange},
+       {"-0x.1fffffffffffff9p1027", "-Inf", ErrRange},
 
        // a little too large
        {"1e308", "1e+308", nil},
        {"2e308", "+Inf", ErrRange},
        {"1e309", "+Inf", ErrRange},
+       {"0x1p1025", "+Inf", ErrRange},
 
        // way too large
        {"1e310", "+Inf", ErrRange},
@@ -106,6 +173,12 @@ var atoftests = []atofTest{
        {"-1e400", "-Inf", ErrRange},
        {"1e400000", "+Inf", ErrRange},
        {"-1e400000", "-Inf", ErrRange},
+       {"0x1p1030", "+Inf", ErrRange},
+       {"0x1p2000", "+Inf", ErrRange},
+       {"0x1p2000000000", "+Inf", ErrRange},
+       {"-0x1p1030", "-Inf", ErrRange},
+       {"-0x1p2000", "-Inf", ErrRange},
+       {"-0x1p2000000000", "-Inf", ErrRange},
 
        // denormalized
        {"1e-305", "1e-305", nil},
@@ -125,17 +198,75 @@ var atoftests = []atofTest{
        {"1e-350", "0", nil},
        {"1e-400000", "0", nil},
 
+       // Near denormals and denormals.
+       {"0x2.00000000000000p-1010", "1.8227805048890994e-304", nil}, // 0x00e0000000000000
+       {"0x1.fffffffffffff0p-1010", "1.8227805048890992e-304", nil}, // 0x00dfffffffffffff
+       {"0x1.fffffffffffff7p-1010", "1.8227805048890992e-304", nil}, // rounded down
+       {"0x1.fffffffffffff8p-1010", "1.8227805048890994e-304", nil}, // rounded up
+       {"0x1.fffffffffffff9p-1010", "1.8227805048890994e-304", nil}, // rounded up
+
+       {"0x2.00000000000000p-1022", "4.450147717014403e-308", nil},  // 0x0020000000000000
+       {"0x1.fffffffffffff0p-1022", "4.4501477170144023e-308", nil}, // 0x001fffffffffffff
+       {"0x1.fffffffffffff7p-1022", "4.4501477170144023e-308", nil}, // rounded down
+       {"0x1.fffffffffffff8p-1022", "4.450147717014403e-308", nil},  // rounded up
+       {"0x1.fffffffffffff9p-1022", "4.450147717014403e-308", nil},  // rounded up
+
+       {"0x1.00000000000000p-1022", "2.2250738585072014e-308", nil}, // 0x0010000000000000
+       {"0x0.fffffffffffff0p-1022", "2.225073858507201e-308", nil},  // 0x000fffffffffffff
+       {"0x0.ffffffffffffe0p-1022", "2.2250738585072004e-308", nil}, // 0x000ffffffffffffe
+       {"0x0.ffffffffffffe7p-1022", "2.2250738585072004e-308", nil}, // rounded down
+       {"0x1.ffffffffffffe8p-1023", "2.225073858507201e-308", nil},  // rounded up
+       {"0x1.ffffffffffffe9p-1023", "2.225073858507201e-308", nil},  // rounded up
+
+       {"0x0.00000003fffff0p-1022", "2.072261e-317", nil},  // 0x00000000003fffff
+       {"0x0.00000003456780p-1022", "1.694649e-317", nil},  // 0x0000000000345678
+       {"0x0.00000003456787p-1022", "1.694649e-317", nil},  // rounded down
+       {"0x0.00000003456788p-1022", "1.694649e-317", nil},  // rounded down (half to even)
+       {"0x0.00000003456790p-1022", "1.6946496e-317", nil}, // 0x0000000000345679
+       {"0x0.00000003456789p-1022", "1.6946496e-317", nil}, // rounded up
+
+       {"0x0.0000000345678800000000000000000000000001p-1022", "1.6946496e-317", nil}, // rounded up
+
+       {"0x0.000000000000f0p-1022", "7.4e-323", nil}, // 0x000000000000000f
+       {"0x0.00000000000060p-1022", "3e-323", nil},   // 0x0000000000000006
+       {"0x0.00000000000058p-1022", "3e-323", nil},   // rounded up
+       {"0x0.00000000000057p-1022", "2.5e-323", nil}, // rounded down
+       {"0x0.00000000000050p-1022", "2.5e-323", nil}, // 0x0000000000000005
+
+       {"0x0.00000000000010p-1022", "5e-324", nil},  // 0x0000000000000001
+       {"0x0.000000000000081p-1022", "5e-324", nil}, // rounded up
+       {"0x0.00000000000008p-1022", "0", nil},       // rounded down
+       {"0x0.00000000000007fp-1022", "0", nil},      // rounded down
+
        // try to overflow exponent
        {"1e-4294967296", "0", nil},
        {"1e+4294967296", "+Inf", ErrRange},
        {"1e-18446744073709551616", "0", nil},
        {"1e+18446744073709551616", "+Inf", ErrRange},
+       {"0x1p-4294967296", "0", nil},
+       {"0x1p+4294967296", "+Inf", ErrRange},
+       {"0x1p-18446744073709551616", "0", nil},
+       {"0x1p+18446744073709551616", "+Inf", ErrRange},
 
        // Parse errors
        {"1e", "0", ErrSyntax},
        {"1e-", "0", ErrSyntax},
        {".e-1", "0", ErrSyntax},
        {"1\x00.2", "0", ErrSyntax},
+       {"0x", "0", ErrSyntax},
+       {"0x.", "0", ErrSyntax},
+       {"0x1", "0", ErrSyntax},
+       {"0x.1", "0", ErrSyntax},
+       {"0x1p", "0", ErrSyntax},
+       {"0x.1p", "0", ErrSyntax},
+       {"0x1p+", "0", ErrSyntax},
+       {"0x.1p+", "0", ErrSyntax},
+       {"0x1p-", "0", ErrSyntax},
+       {"0x.1p-", "0", ErrSyntax},
+       {"0x1p+2", "4", nil},
+       {"0x.1p+2", "0.25", nil},
+       {"0x1p-2", "0.25", nil},
+       {"0x.1p-2", "0.015625", nil},
 
        // https://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
        {"2.2250738585072012e-308", "2.2250738585072014e-308", nil},
@@ -148,42 +279,109 @@ var atoftests = []atofTest{
        // A different kind of very large number.
        {"22.222222222222222", "22.22222222222222", nil},
        {"2." + strings.Repeat("2", 4000) + "e+1", "22.22222222222222", nil},
+       {"0x1.1111111111111p222", "7.18931911124017e+66", nil},
+       {"0x2.2222222222222p221", "7.18931911124017e+66", nil},
+       {"0x2." + strings.Repeat("2", 4000) + "p221", "7.18931911124017e+66", nil},
 
        // Exactly halfway between 1 and math.Nextafter(1, 2).
        // Round to even (down).
        {"1.00000000000000011102230246251565404236316680908203125", "1", nil},
+       {"0x1.00000000000008p0", "1", nil},
        // Slightly lower; still round down.
        {"1.00000000000000011102230246251565404236316680908203124", "1", nil},
+       {"0x1.00000000000007Fp0", "1", nil},
        // Slightly higher; round up.
        {"1.00000000000000011102230246251565404236316680908203126", "1.0000000000000002", nil},
+       {"0x1.000000000000081p0", "1.0000000000000002", nil},
+       {"0x1.00000000000009p0", "1.0000000000000002", nil},
        // Slightly higher, but you have to read all the way to the end.
        {"1.00000000000000011102230246251565404236316680908203125" + strings.Repeat("0", 10000) + "1", "1.0000000000000002", nil},
+       {"0x1.00000000000008" + strings.Repeat("0", 10000) + "1p0", "1.0000000000000002", nil},
+
+       // Halfway between x := math.Nextafter(1, 2) and math.Nextafter(x, 2)
+       // Round to even (up).
+       {"1.00000000000000033306690738754696212708950042724609375", "1.0000000000000004", nil},
+       {"0x1.00000000000018p0", "1.0000000000000004", nil},
+
+       // Underscores.
+       {"1_23.50_0_0e+1_2", "1.235e+14", nil},
+       {"-_123.5e+12", "0", ErrSyntax},
+       {"+_123.5e+12", "0", ErrSyntax},
+       {"_123.5e+12", "0", ErrSyntax},
+       {"1__23.5e+12", "0", ErrSyntax},
+       {"123_.5e+12", "0", ErrSyntax},
+       {"123._5e+12", "0", ErrSyntax},
+       {"123.5_e+12", "0", ErrSyntax},
+       {"123.5__0e+12", "0", ErrSyntax},
+       {"123.5e_+12", "0", ErrSyntax},
+       {"123.5e+_12", "0", ErrSyntax},
+       {"123.5e_-12", "0", ErrSyntax},
+       {"123.5e-_12", "0", ErrSyntax},
+       {"123.5e+1__2", "0", ErrSyntax},
+       {"123.5e+12_", "0", ErrSyntax},
+
+       {"0x_1_2.3_4_5p+1_2", "74565", nil},
+       {"-_0x12.345p+12", "0", ErrSyntax},
+       {"+_0x12.345p+12", "0", ErrSyntax},
+       {"_0x12.345p+12", "0", ErrSyntax},
+       {"0x__12.345p+12", "0", ErrSyntax},
+       {"0x1__2.345p+12", "0", ErrSyntax},
+       {"0x12_.345p+12", "0", ErrSyntax},
+       {"0x12._345p+12", "0", ErrSyntax},
+       {"0x12.3__45p+12", "0", ErrSyntax},
+       {"0x12.345_p+12", "0", ErrSyntax},
+       {"0x12.345p_+12", "0", ErrSyntax},
+       {"0x12.345p+_12", "0", ErrSyntax},
+       {"0x12.345p_-12", "0", ErrSyntax},
+       {"0x12.345p-_12", "0", ErrSyntax},
+       {"0x12.345p+1__2", "0", ErrSyntax},
+       {"0x12.345p+12_", "0", ErrSyntax},
 }
 
 var atof32tests = []atofTest{
+       // Hex
+       {"0x1p-100", "7.888609e-31", nil},
+       {"0x1p100", "1.2676506e+30", nil},
+
        // Exactly halfway between 1 and the next float32.
        // Round to even (down).
        {"1.000000059604644775390625", "1", nil},
+       {"0x1.000001p0", "1", nil},
        // Slightly lower.
        {"1.000000059604644775390624", "1", nil},
+       {"0x1.0000008p0", "1", nil},
+       {"0x1.000000fp0", "1", nil},
        // Slightly higher.
        {"1.000000059604644775390626", "1.0000001", nil},
+       {"0x1.000002p0", "1.0000001", nil},
+       {"0x1.0000018p0", "1.0000001", nil},
+       {"0x1.0000011p0", "1.0000001", nil},
        // Slightly higher, but you have to read all the way to the end.
        {"1.000000059604644775390625" + strings.Repeat("0", 10000) + "1", "1.0000001", nil},
+       {"0x1.000001" + strings.Repeat("0", 10000) + "1p0", "1.0000001", nil},
 
        // largest float32: (1<<128) * (1 - 2^-24)
        {"340282346638528859811704183484516925440", "3.4028235e+38", nil},
        {"-340282346638528859811704183484516925440", "-3.4028235e+38", nil},
+       {"0x.ffffffp128", "3.4028235e+38", nil},
+       {"-340282346638528859811704183484516925440", "-3.4028235e+38", nil},
+       {"-0x.ffffffp128", "-3.4028235e+38", nil},
        // next float32 - too large
        {"3.4028236e38", "+Inf", ErrRange},
        {"-3.4028236e38", "-Inf", ErrRange},
+       {"0x1.0p128", "+Inf", ErrRange},
+       {"-0x1.0p128", "-Inf", ErrRange},
        // the border is 3.40282356779...e+38
        // borderline - okay
        {"3.402823567e38", "3.4028235e+38", nil},
        {"-3.402823567e38", "-3.4028235e+38", nil},
+       {"0x.ffffff7fp128", "3.4028235e+38", nil},
+       {"-0x.ffffff7fp128", "-3.4028235e+38", nil},
        // borderline - too large
        {"3.4028235678e38", "+Inf", ErrRange},
        {"-3.4028235678e38", "-Inf", ErrRange},
+       {"0x.ffffff8p128", "+Inf", ErrRange},
+       {"-0x.ffffff8p128", "-Inf", ErrRange},
 
        // Denormals: less than 2^-126
        {"1e-38", "1e-38", nil},
@@ -195,9 +393,24 @@ var atof32tests = []atofTest{
        {"1e-44", "1e-44", nil},
        {"6e-45", "6e-45", nil}, // 4p-149 = 5.6e-45
        {"5e-45", "6e-45", nil},
+
        // Smallest denormal
        {"1e-45", "1e-45", nil}, // 1p-149 = 1.4e-45
        {"2e-45", "1e-45", nil},
+       {"3e-45", "3e-45", nil},
+
+       // Near denormals and denormals.
+       {"0x0.89aBcDp-125", "1.2643093e-38", nil},  // 0x0089abcd
+       {"0x0.8000000p-125", "1.1754944e-38", nil}, // 0x00800000
+       {"0x0.1234560p-125", "1.671814e-39", nil},  // 0x00123456
+       {"0x0.1234567p-125", "1.671814e-39", nil},  // rounded down
+       {"0x0.1234568p-125", "1.671814e-39", nil},  // rounded down
+       {"0x0.1234569p-125", "1.671815e-39", nil},  // rounded up
+       {"0x0.1234570p-125", "1.671815e-39", nil},  // 0x00123457
+       {"0x0.0000010p-125", "1e-45", nil},         // 0x00000001
+       {"0x0.00000081p-125", "1e-45", nil},        // rounded up
+       {"0x0.0000008p-125", "0", nil},             // rounded down
+       {"0x0.0000007p-125", "0", nil},             // rounded down
 
        // 2^92 = 8388608p+69 = 4951760157141521099596496896 (4.9517602e27)
        // is an exact power of two that needs 8 decimal digits to be correctly
index ff33d555e49830d343cfb51d9747f94a935c501d..31774d0c9a383dd05499a039924ba31a6670df8e 100644 (file)
@@ -6,6 +6,14 @@ package strconv
 
 import "errors"
 
+// lower(c) is a lower-case letter if and only if
+// c is either that lower-case letter or the equivalent upper-case letter.
+// Instead of writing c == 'x' || c == 'X' one can write lower(c) == 'x'.
+// Note that lower of non-letters can produce other non-letters.
+func lower(c byte) byte {
+       return c | ('x' - 'X')
+}
+
 // ErrRange indicates that a value is out of range for the target type.
 var ErrRange = errors.New("value out of range")
 
@@ -50,10 +58,12 @@ const maxUint64 = 1<<64 - 1
 func ParseUint(s string, base int, bitSize int) (uint64, error) {
        const fnParseUint = "ParseUint"
 
-       if len(s) == 0 {
+       if s == "" || !underscoreOK(s) {
                return 0, syntaxError(fnParseUint, s)
        }
 
+       base0 := base == 0
+
        s0 := s
        switch {
        case 2 <= base && base <= 36:
@@ -61,18 +71,22 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) {
 
        case base == 0:
                // Look for octal, hex prefix.
-               switch {
-               case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'):
-                       if len(s) < 3 {
-                               return 0, syntaxError(fnParseUint, s0)
+               base = 10
+               if s[0] == '0' {
+                       switch {
+                       case len(s) >= 3 && lower(s[1]) == 'b':
+                               base = 2
+                               s = s[2:]
+                       case len(s) >= 3 && lower(s[1]) == 'o':
+                               base = 8
+                               s = s[2:]
+                       case len(s) >= 3 && lower(s[1]) == 'x':
+                               base = 16
+                               s = s[2:]
+                       default:
+                               base = 8
+                               s = s[1:]
                        }
-                       base = 16
-                       s = s[2:]
-               case s[0] == '0':
-                       base = 8
-                       s = s[1:]
-               default:
-                       base = 10
                }
 
        default:
@@ -103,12 +117,13 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) {
        for _, c := range []byte(s) {
                var d byte
                switch {
+               case c == '_' && base0:
+                       // underscoreOK already called
+                       continue
                case '0' <= c && c <= '9':
                        d = c - '0'
-               case 'a' <= c && c <= 'z':
-                       d = c - 'a' + 10
-               case 'A' <= c && c <= 'Z':
-                       d = c - 'A' + 10
+               case 'a' <= lower(c) && lower(c) <= 'z':
+                       d = lower(c) - 'a' + 10
                default:
                        return 0, syntaxError(fnParseUint, s0)
                }
@@ -138,13 +153,14 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) {
 // bit size (0 to 64) and returns the corresponding value i.
 //
 // If base == 0, the base is implied by the string's prefix:
-// base 16 for "0x", base 8 for "0", and base 10 otherwise.
-// For bases 1, below 0 or above 36 an error is returned.
+// base 2 for "0b", base 8 for "0" or "0o", base 16 for "0x",
+// and base 10 otherwise.
+// If base is below 0, is 1, or is above 36, an error is returned.
 //
 // The bitSize argument specifies the integer type
 // that the result must fit into. Bit sizes 0, 8, 16, 32, and 64
 // correspond to int, int8, int16, int32, and int64.
-// For a bitSize below 0 or above 64 an error is returned.
+// If bitSize is below 0 or above 64, an error is returned.
 //
 // The errors that ParseInt returns have concrete type *NumError
 // and include err.Num = s. If s is empty or contains invalid
@@ -156,8 +172,7 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) {
 func ParseInt(s string, base int, bitSize int) (i int64, err error) {
        const fnParseInt = "ParseInt"
 
-       // Empty string bad.
-       if len(s) == 0 {
+       if s == "" {
                return 0, syntaxError(fnParseInt, s)
        }
 
@@ -228,10 +243,60 @@ func Atoi(s string) (int, error) {
                return n, nil
        }
 
-       // Slow path for invalid or big integers.
+       // Slow path for invalid, big, or underscored integers.
        i64, err := ParseInt(s, 10, 0)
        if nerr, ok := err.(*NumError); ok {
                nerr.Func = fnAtoi
        }
        return int(i64), err
 }
+
+// underscoreOK reports whether the underscores in s are allowed.
+// Checking them in this one function lets all the parsers skip over them simply.
+// Underscore must appear only between digits or between a base prefix and a digit.
+func underscoreOK(s string) bool {
+       // saw tracks the last character (class) we saw:
+       // ^ for beginning of number,
+       // 0 for a digit or base prefix,
+       // _ for an underscore,
+       // ! for none of the above.
+       saw := '^'
+       i := 0
+
+       // Optional sign.
+       if len(s) >= 1 && (s[0] == '-' || s[0] == '+') {
+               s = s[1:]
+       }
+
+       // Optional base prefix.
+       hex := false
+       if len(s) >= 2 && s[0] == '0' && (lower(s[1]) == 'b' || lower(s[1]) == 'o' || lower(s[1]) == 'x') {
+               i = 2
+               saw = '0' // base prefix counts as a digit for "underscore as digit separator"
+               hex = lower(s[1]) == 'x'
+       }
+
+       // Number proper.
+       for ; i < len(s); i++ {
+               // Digits are always okay.
+               if '0' <= s[i] && s[i] <= '9' || hex && 'a' <= lower(s[i]) && lower(s[i]) <= 'f' {
+                       saw = '0'
+                       continue
+               }
+               // Underscore must follow digit.
+               if s[i] == '_' {
+                       if saw != '0' {
+                               return false
+                       }
+                       saw = '_'
+                       continue
+               }
+               // Underscore must also be followed by digit.
+               if saw == '_' {
+                       return false
+               }
+               // Saw non-digit, non-underscore.
+               saw = '!'
+       }
+       return saw != '_'
+}
index e2f505a66516c8019acf90608e7bd159cccd8210..b167c96833c0738618d1cf33441db8249ea19e06 100644 (file)
@@ -29,6 +29,10 @@ var parseUint64Tests = []parseUint64Test{
        {"18446744073709551615", 1<<64 - 1, nil},
        {"18446744073709551616", 1<<64 - 1, ErrRange},
        {"18446744073709551620", 1<<64 - 1, ErrRange},
+       {"1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed
+       {"_12345", 0, ErrSyntax},
+       {"1__2345", 0, ErrSyntax},
+       {"12345_", 0, ErrSyntax},
 }
 
 type parseUint64BaseTest struct {
@@ -61,6 +65,69 @@ var parseUint64BaseTests = []parseUint64BaseTest{
        {"01777777777777777777778", 0, 0, ErrSyntax},
        {"02000000000000000000000", 0, 1<<64 - 1, ErrRange},
        {"0200000000000000000000", 0, 1 << 61, nil},
+       {"0b", 0, 0, ErrSyntax},
+       {"0B", 0, 0, ErrSyntax},
+       {"0b101", 0, 5, nil},
+       {"0B101", 0, 5, nil},
+       {"0o", 0, 0, ErrSyntax},
+       {"0O", 0, 0, ErrSyntax},
+       {"0o377", 0, 255, nil},
+       {"0O377", 0, 255, nil},
+
+       // underscores allowed with base == 0 only
+       {"1_2_3_4_5", 0, 12345, nil}, // base 0 => 10
+       {"_12345", 0, 0, ErrSyntax},
+       {"1__2345", 0, 0, ErrSyntax},
+       {"12345_", 0, 0, ErrSyntax},
+
+       {"1_2_3_4_5", 10, 0, ErrSyntax}, // base 10
+       {"_12345", 10, 0, ErrSyntax},
+       {"1__2345", 10, 0, ErrSyntax},
+       {"12345_", 10, 0, ErrSyntax},
+
+       {"0x_1_2_3_4_5", 0, 0x12345, nil}, // base 0 => 16
+       {"_0x12345", 0, 0, ErrSyntax},
+       {"0x__12345", 0, 0, ErrSyntax},
+       {"0x1__2345", 0, 0, ErrSyntax},
+       {"0x1234__5", 0, 0, ErrSyntax},
+       {"0x12345_", 0, 0, ErrSyntax},
+
+       {"1_2_3_4_5", 16, 0, ErrSyntax}, // base 16
+       {"_12345", 16, 0, ErrSyntax},
+       {"1__2345", 16, 0, ErrSyntax},
+       {"1234__5", 16, 0, ErrSyntax},
+       {"12345_", 16, 0, ErrSyntax},
+
+       {"0_1_2_3_4_5", 0, 012345, nil}, // base 0 => 8 (0377)
+       {"_012345", 0, 0, ErrSyntax},
+       {"0__12345", 0, 0, ErrSyntax},
+       {"01234__5", 0, 0, ErrSyntax},
+       {"012345_", 0, 0, ErrSyntax},
+
+       {"0o_1_2_3_4_5", 0, 012345, nil}, // base 0 => 8 (0o377)
+       {"_0o12345", 0, 0, ErrSyntax},
+       {"0o__12345", 0, 0, ErrSyntax},
+       {"0o1234__5", 0, 0, ErrSyntax},
+       {"0o12345_", 0, 0, ErrSyntax},
+
+       {"0_1_2_3_4_5", 8, 0, ErrSyntax}, // base 8
+       {"_012345", 8, 0, ErrSyntax},
+       {"0__12345", 8, 0, ErrSyntax},
+       {"01234__5", 8, 0, ErrSyntax},
+       {"012345_", 8, 0, ErrSyntax},
+
+       {"0b_1_0_1", 0, 5, nil}, // base 0 => 2 (0b101)
+       {"_0b101", 0, 0, ErrSyntax},
+       {"0b__101", 0, 0, ErrSyntax},
+       {"0b1__01", 0, 0, ErrSyntax},
+       {"0b10__1", 0, 0, ErrSyntax},
+       {"0b101_", 0, 0, ErrSyntax},
+
+       {"1_0_1", 2, 0, ErrSyntax}, // base 2
+       {"_101", 2, 0, ErrSyntax},
+       {"1_01", 2, 0, ErrSyntax},
+       {"10_1", 2, 0, ErrSyntax},
+       {"101_", 2, 0, ErrSyntax},
 }
 
 type parseInt64Test struct {
@@ -87,6 +154,11 @@ var parseInt64Tests = []parseInt64Test{
        {"-9223372036854775808", -1 << 63, nil},
        {"9223372036854775809", 1<<63 - 1, ErrRange},
        {"-9223372036854775809", -1 << 63, ErrRange},
+       {"-1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed
+       {"-_12345", 0, ErrSyntax},
+       {"_12345", 0, ErrSyntax},
+       {"1__2345", 0, ErrSyntax},
+       {"12345_", 0, ErrSyntax},
 }
 
 type parseInt64BaseTest struct {
@@ -144,6 +216,26 @@ var parseInt64BaseTests = []parseInt64BaseTest{
        {"10", 16, 16, nil},
        {"-123456789abcdef", 16, -0x123456789abcdef, nil},
        {"7fffffffffffffff", 16, 1<<63 - 1, nil},
+
+       // underscores
+       {"-0x_1_2_3_4_5", 0, -0x12345, nil},
+       {"0x_1_2_3_4_5", 0, 0x12345, nil},
+       {"-_0x12345", 0, 0, ErrSyntax},
+       {"_-0x12345", 0, 0, ErrSyntax},
+       {"_0x12345", 0, 0, ErrSyntax},
+       {"0x__12345", 0, 0, ErrSyntax},
+       {"0x1__2345", 0, 0, ErrSyntax},
+       {"0x1234__5", 0, 0, ErrSyntax},
+       {"0x12345_", 0, 0, ErrSyntax},
+
+       {"-0_1_2_3_4_5", 0, -012345, nil}, // octal
+       {"0_1_2_3_4_5", 0, 012345, nil},   // octal
+       {"-_012345", 0, 0, ErrSyntax},
+       {"_-012345", 0, 0, ErrSyntax},
+       {"_012345", 0, 0, ErrSyntax},
+       {"0__12345", 0, 0, ErrSyntax},
+       {"01234__5", 0, 0, ErrSyntax},
+       {"012345_", 0, 0, ErrSyntax},
 }
 
 type parseUint32Test struct {
@@ -162,6 +254,11 @@ var parseUint32Tests = []parseUint32Test{
        {"987654321", 987654321, nil},
        {"4294967295", 1<<32 - 1, nil},
        {"4294967296", 1<<32 - 1, ErrRange},
+       {"1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed
+       {"_12345", 0, ErrSyntax},
+       {"_12345", 0, ErrSyntax},
+       {"1__2345", 0, ErrSyntax},
+       {"12345_", 0, ErrSyntax},
 }
 
 type parseInt32Test struct {
@@ -190,6 +287,11 @@ var parseInt32Tests = []parseInt32Test{
        {"-2147483648", -1 << 31, nil},
        {"2147483649", 1<<31 - 1, ErrRange},
        {"-2147483649", -1 << 31, ErrRange},
+       {"-1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed
+       {"-_12345", 0, ErrSyntax},
+       {"_12345", 0, ErrSyntax},
+       {"1__2345", 0, ErrSyntax},
+       {"12345_", 0, ErrSyntax},
 }
 
 type numErrorTest struct {
@@ -419,12 +521,22 @@ var parseBaseTests = []parseErrorTest{
        {37, baseErrStub},
 }
 
+func equalError(a, b error) bool {
+       if a == nil {
+               return b == nil
+       }
+       if b == nil {
+               return a == nil
+       }
+       return a.Error() == b.Error()
+}
+
 func TestParseIntBitSize(t *testing.T) {
        for i := range parseBitSizeTests {
                test := &parseBitSizeTests[i]
                testErr := test.errStub("ParseInt", test.arg)
                _, err := ParseInt("0", 0, test.arg)
-               if !reflect.DeepEqual(testErr, err) {
+               if !equalError(testErr, err) {
                        t.Errorf("ParseInt(\"0\", 0, %v) = 0, %v want 0, %v",
                                test.arg, err, testErr)
                }
@@ -436,7 +548,7 @@ func TestParseUintBitSize(t *testing.T) {
                test := &parseBitSizeTests[i]
                testErr := test.errStub("ParseUint", test.arg)
                _, err := ParseUint("0", 0, test.arg)
-               if !reflect.DeepEqual(testErr, err) {
+               if !equalError(testErr, err) {
                        t.Errorf("ParseUint(\"0\", 0, %v) = 0, %v want 0, %v",
                                test.arg, err, testErr)
                }
@@ -448,7 +560,7 @@ func TestParseIntBase(t *testing.T) {
                test := &parseBaseTests[i]
                testErr := test.errStub("ParseInt", test.arg)
                _, err := ParseInt("0", test.arg, 0)
-               if !reflect.DeepEqual(testErr, err) {
+               if !equalError(testErr, err) {
                        t.Errorf("ParseInt(\"0\", %v, 0) = 0, %v want 0, %v",
                                test.arg, err, testErr)
                }
@@ -460,7 +572,7 @@ func TestParseUintBase(t *testing.T) {
                test := &parseBaseTests[i]
                testErr := test.errStub("ParseUint", test.arg)
                _, err := ParseUint("0", test.arg, 0)
-               if !reflect.DeepEqual(testErr, err) {
+               if !equalError(testErr, err) {
                        t.Errorf("ParseUint(\"0\", %v, 0) = 0, %v want 0, %v",
                                test.arg, err, testErr)
                }
index 2d1a2a9dbfd506eaaa55f46e2be56b4bec3984b9..50f6b20fee22547f3d8dca92f457b15158e886a3 100644 (file)
@@ -222,10 +222,39 @@ func ExampleParseFloat() {
        if s, err := strconv.ParseFloat(v, 64); err == nil {
                fmt.Printf("%T, %v\n", s, s)
        }
+       if s, err := strconv.ParseFloat("NaN", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       // ParseFloat is case insensitive
+       if s, err := strconv.ParseFloat("nan", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       if s, err := strconv.ParseFloat("inf", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       if s, err := strconv.ParseFloat("+Inf", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       if s, err := strconv.ParseFloat("-Inf", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       if s, err := strconv.ParseFloat("-0", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
+       if s, err := strconv.ParseFloat("+0", 32); err == nil {
+               fmt.Printf("%T, %v\n", s, s)
+       }
 
        // Output:
        // float64, 3.1415927410125732
        // float64, 3.1415926535
+       // float64, NaN
+       // float64, NaN
+       // float64, +Inf
+       // float64, +Inf
+       // float64, -Inf
+       // float64, -0
+       // float64, 0
 }
 
 func ExampleParseInt() {
index 32d3340f5f8c33e44f700fa65be6b057e5c9cb4b..2a2dd7a4084457f18bdf4cf5e3cf6a8e78b990dd 100644 (file)
@@ -214,20 +214,9 @@ func (f *extFloat) Normalize() uint {
 // Multiply sets f to the product f*g: the result is correctly rounded,
 // but not normalized.
 func (f *extFloat) Multiply(g extFloat) {
-       fhi, flo := f.mant>>32, uint64(uint32(f.mant))
-       ghi, glo := g.mant>>32, uint64(uint32(g.mant))
-
-       // Cross products.
-       cross1 := fhi * glo
-       cross2 := flo * ghi
-
-       // f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo
-       f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32)
-       rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32)
+       hi, lo := bits.Mul64(f.mant, g.mant)
        // Round up.
-       rem += (1 << 31)
-
-       f.mant += (rem >> 32)
+       f.mant = hi + (lo >> 63)
        f.exp = f.exp + g.exp + 64
 }
 
index a7ccbe6727fdb20991ff1c055af2068e1539da20..8ce6ef30b44b5d7631d4ad1f1db64e753fe596cd 100644 (file)
@@ -32,12 +32,14 @@ var float64info = floatInfo{52, 11, -1023}
 // 'e' (-d.dddde±dd, a decimal exponent),
 // 'E' (-d.ddddE±dd, a decimal exponent),
 // 'f' (-ddd.dddd, no exponent),
-// 'g' ('e' for large exponents, 'f' otherwise), or
-// 'G' ('E' for large exponents, 'f' otherwise).
+// 'g' ('e' for large exponents, 'f' otherwise),
+// 'G' ('E' for large exponents, 'f' otherwise),
+// 'x' (-0xd.ddddp±ddd, a hexadecimal fraction and binary exponent), or
+// 'X' (-0Xd.ddddP±ddd, a hexadecimal fraction and binary exponent).
 //
 // The precision prec controls the number of digits (excluding the exponent)
-// printed by the 'e', 'E', 'f', 'g', and 'G' formats.
-// For 'e', 'E', and 'f' it is the number of digits after the decimal point.
+// printed by the 'e', 'E', 'f', 'g', 'G', 'x', and 'X' formats.
+// For 'e', 'E', 'f', 'x', and 'X', it is the number of digits after the decimal point.
 // For 'g' and 'G' it is the maximum number of significant digits (trailing
 // zeros are removed).
 // The special precision -1 uses the smallest number of digits
@@ -94,10 +96,13 @@ func genericFtoa(dst []byte, val float64, fmt byte, prec, bitSize int) []byte {
        }
        exp += flt.bias
 
-       // Pick off easy binary format.
+       // Pick off easy binary, hex formats.
        if fmt == 'b' {
                return fmtB(dst, neg, mant, exp, flt)
        }
+       if fmt == 'x' || fmt == 'X' {
+               return fmtX(dst, prec, fmt, neg, mant, exp, flt)
+       }
 
        if !optimize {
                return bigFtoa(dst, prec, fmt, neg, mant, exp, flt)
@@ -284,39 +289,80 @@ func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) {
        // would round to the original mantissa and not the neighbors.
        inclusive := mant%2 == 0
 
+       // As we walk the digits we want to know whether rounding up would fall
+       // within the upper bound. This is tracked by upperdelta:
+       //
+       // If upperdelta == 0, the digits of d and upper are the same so far.
+       //
+       // If upperdelta == 1, we saw a difference of 1 between d and upper on a
+       // previous digit and subsequently only 9s for d and 0s for upper.
+       // (Thus rounding up may fall outside the bound, if it is exclusive.)
+       //
+       // If upperdelta == 2, then the difference is greater than 1
+       // and we know that rounding up falls within the bound.
+       var upperdelta uint8
+
        // Now we can figure out the minimum number of digits required.
        // Walk along until d has distinguished itself from upper and lower.
-       for i := 0; i < d.nd; i++ {
+       for ui := 0; ; ui++ {
+               // lower, d, and upper may have the decimal points at different
+               // places. In this case upper is the longest, so we iterate from
+               // ui==0 and start li and mi at (possibly) -1.
+               mi := ui - upper.dp + d.dp
+               if mi >= d.nd {
+                       break
+               }
+               li := ui - upper.dp + lower.dp
                l := byte('0') // lower digit
-               if i < lower.nd {
-                       l = lower.d[i]
+               if li >= 0 && li < lower.nd {
+                       l = lower.d[li]
+               }
+               m := byte('0') // middle digit
+               if mi >= 0 {
+                       m = d.d[mi]
                }
-               m := d.d[i]    // middle digit
                u := byte('0') // upper digit
-               if i < upper.nd {
-                       u = upper.d[i]
+               if ui < upper.nd {
+                       u = upper.d[ui]
                }
 
                // Okay to round down (truncate) if lower has a different digit
                // or if lower is inclusive and is exactly the result of rounding
                // down (i.e., and we have reached the final digit of lower).
-               okdown := l != m || inclusive && i+1 == lower.nd
+               okdown := l != m || inclusive && li+1 == lower.nd
 
+               switch {
+               case upperdelta == 0 && m+1 < u:
+                       // Example:
+                       // m = 12345xxx
+                       // u = 12347xxx
+                       upperdelta = 2
+               case upperdelta == 0 && m != u:
+                       // Example:
+                       // m = 12345xxx
+                       // u = 12346xxx
+                       upperdelta = 1
+               case upperdelta == 1 && (m != '9' || u != '0'):
+                       // Example:
+                       // m = 1234598x
+                       // u = 1234600x
+                       upperdelta = 2
+               }
                // Okay to round up if upper has a different digit and either upper
                // is inclusive or upper is bigger than the result of rounding up.
-               okup := m != u && (inclusive || m+1 < u || i+1 < upper.nd)
+               okup := upperdelta > 0 && (inclusive || upperdelta > 1 || ui+1 < upper.nd)
 
                // If it's okay to do either, then round to the nearest one.
                // If it's okay to do only one, do it.
                switch {
                case okdown && okup:
-                       d.Round(i + 1)
+                       d.Round(mi + 1)
                        return
                case okdown:
-                       d.RoundDown(i + 1)
+                       d.RoundDown(mi + 1)
                        return
                case okup:
-                       d.RoundUp(i + 1)
+                       d.RoundUp(mi + 1)
                        return
                }
        }
@@ -439,6 +485,89 @@ func fmtB(dst []byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte {
        return dst
 }
 
+// %x: -0x1.yyyyyyyyp±ddd or -0x0p+0. (y is hex digit, d is decimal digit)
+func fmtX(dst []byte, prec int, fmt byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte {
+       if mant == 0 {
+               exp = 0
+       }
+
+       // Shift digits so leading 1 (if any) is at bit 1<<60.
+       mant <<= 60 - flt.mantbits
+       for mant != 0 && mant&(1<<60) == 0 {
+               mant <<= 1
+               exp--
+       }
+
+       // Round if requested.
+       if prec >= 0 && prec < 15 {
+               shift := uint(prec * 4)
+               extra := (mant << shift) & (1<<60 - 1)
+               mant >>= 60 - shift
+               if extra|(mant&1) > 1<<59 {
+                       mant++
+               }
+               mant <<= 60 - shift
+               if mant&(1<<61) != 0 {
+                       // Wrapped around.
+                       mant >>= 1
+                       exp++
+               }
+       }
+
+       hex := lowerhex
+       if fmt == 'X' {
+               hex = upperhex
+       }
+
+       // sign, 0x, leading digit
+       if neg {
+               dst = append(dst, '-')
+       }
+       dst = append(dst, '0', fmt, '0'+byte((mant>>60)&1))
+
+       // .fraction
+       mant <<= 4 // remove leading 0 or 1
+       if prec < 0 && mant != 0 {
+               dst = append(dst, '.')
+               for mant != 0 {
+                       dst = append(dst, hex[(mant>>60)&15])
+                       mant <<= 4
+               }
+       } else if prec > 0 {
+               dst = append(dst, '.')
+               for i := 0; i < prec; i++ {
+                       dst = append(dst, hex[(mant>>60)&15])
+                       mant <<= 4
+               }
+       }
+
+       // p±
+       ch := byte('P')
+       if fmt == lower(fmt) {
+               ch = 'p'
+       }
+       dst = append(dst, ch)
+       if exp < 0 {
+               ch = '-'
+               exp = -exp
+       } else {
+               ch = '+'
+       }
+       dst = append(dst, ch)
+
+       // dd or ddd or dddd
+       switch {
+       case exp < 100:
+               dst = append(dst, byte(exp/10)+'0', byte(exp%10)+'0')
+       case exp < 1000:
+               dst = append(dst, byte(exp/100)+'0', byte((exp/10)%10)+'0', byte(exp%10)+'0')
+       default:
+               dst = append(dst, byte(exp/1000)+'0', byte(exp/100)%10+'0', byte((exp/10)%10)+'0', byte(exp%10)+'0')
+       }
+
+       return dst
+}
+
 func min(a, b int) int {
        if a < b {
                return a
index 1d3030be81932a02aefdcf807769cb0464fdb23b..755c986b86e4c3ef7fed82680686c8bc8b0d4203 100644 (file)
@@ -30,9 +30,15 @@ var ftoatests = []ftoaTest{
        {1, 'f', 5, "1.00000"},
        {1, 'g', 5, "1"},
        {1, 'g', -1, "1"},
+       {1, 'x', -1, "0x1p+00"},
+       {1, 'x', 5, "0x1.00000p+00"},
        {20, 'g', -1, "20"},
+       {20, 'x', -1, "0x1.4p+04"},
        {1234567.8, 'g', -1, "1.2345678e+06"},
+       {1234567.8, 'x', -1, "0x1.2d687cccccccdp+20"},
        {200000, 'g', -1, "200000"},
+       {200000, 'x', -1, "0x1.86ap+17"},
+       {200000, 'X', -1, "0X1.86AP+17"},
        {2000000, 'g', -1, "2e+06"},
 
        // g conversion and zero suppression
@@ -50,6 +56,7 @@ var ftoatests = []ftoaTest{
        {0, 'f', 5, "0.00000"},
        {0, 'g', 5, "0"},
        {0, 'g', -1, "0"},
+       {0, 'x', 5, "0x0.00000p+00"},
 
        {-1, 'e', 5, "-1.00000e+00"},
        {-1, 'f', 5, "-1.00000"},
@@ -100,7 +107,8 @@ var ftoatests = []ftoaTest{
        {32, 'g', -1, "32"},
        {32, 'g', 0, "3e+01"},
 
-       {100, 'x', -1, "%x"},
+       {100, 'x', -1, "0x1.9p+06"},
+       {100, 'y', -1, "%y"},
 
        {math.NaN(), 'g', -1, "NaN"},
        {-math.NaN(), 'g', -1, "NaN"},
@@ -128,6 +136,27 @@ var ftoatests = []ftoaTest{
        // Issue 2625.
        {383260575764816448, 'f', 0, "383260575764816448"},
        {383260575764816448, 'g', -1, "3.8326057576481645e+17"},
+
+       // Issue 29491.
+       {498484681984085570, 'f', -1, "498484681984085570"},
+       {-5.8339553793802237e+23, 'g', -1, "-5.8339553793802237e+23"},
+
+       // rounding
+       {2.275555555555555, 'x', -1, "0x1.23456789abcdep+01"},
+       {2.275555555555555, 'x', 0, "0x1p+01"},
+       {2.275555555555555, 'x', 2, "0x1.23p+01"},
+       {2.275555555555555, 'x', 16, "0x1.23456789abcde000p+01"},
+       {2.275555555555555, 'x', 21, "0x1.23456789abcde00000000p+01"},
+       {2.2755555510520935, 'x', -1, "0x1.2345678p+01"},
+       {2.2755555510520935, 'x', 6, "0x1.234568p+01"},
+       {2.275555431842804, 'x', -1, "0x1.2345668p+01"},
+       {2.275555431842804, 'x', 6, "0x1.234566p+01"},
+       {3.999969482421875, 'x', -1, "0x1.ffffp+01"},
+       {3.999969482421875, 'x', 4, "0x1.ffffp+01"},
+       {3.999969482421875, 'x', 3, "0x1.000p+02"},
+       {3.999969482421875, 'x', 2, "0x1.00p+02"},
+       {3.999969482421875, 'x', 1, "0x1.0p+02"},
+       {3.999969482421875, 'x', 0, "0x1p+02"},
 }
 
 func TestFtoa(t *testing.T) {
index f537ba4f4a3dff19c66463d8d4af50a5ef2e771d..a8dfdb2d9b5a6973d29c333720db60023c2e7a6c 100644 (file)
@@ -6,7 +6,7 @@
 
 package strconv
 
-// (456+140+86)*2 + (396)*4 = 2948 bytes
+// (448+137+90)*2 + (418)*4 = 3022 bytes
 
 var isPrint16 = []uint16{
        0x0020, 0x007e,
@@ -16,17 +16,17 @@ var isPrint16 = []uint16{
        0x0559, 0x058a,
        0x058d, 0x05c7,
        0x05d0, 0x05ea,
-       0x05f0, 0x05f4,
+       0x05ef, 0x05f4,
        0x0606, 0x061b,
        0x061e, 0x070d,
        0x0710, 0x074a,
        0x074d, 0x07b1,
        0x07c0, 0x07fa,
-       0x0800, 0x082d,
+       0x07fd, 0x082d,
        0x0830, 0x085b,
        0x085e, 0x086a,
        0x08a0, 0x08bd,
-       0x08d4, 0x098c,
+       0x08d3, 0x098c,
        0x098f, 0x0990,
        0x0993, 0x09b2,
        0x09b6, 0x09b9,
@@ -35,7 +35,7 @@ var isPrint16 = []uint16{
        0x09cb, 0x09ce,
        0x09d7, 0x09d7,
        0x09dc, 0x09e3,
-       0x09e6, 0x09fd,
+       0x09e6, 0x09fe,
        0x0a01, 0x0a0a,
        0x0a0f, 0x0a10,
        0x0a13, 0x0a39,
@@ -44,7 +44,7 @@ var isPrint16 = []uint16{
        0x0a4b, 0x0a4d,
        0x0a51, 0x0a51,
        0x0a59, 0x0a5e,
-       0x0a66, 0x0a75,
+       0x0a66, 0x0a76,
        0x0a81, 0x0ab9,
        0x0abc, 0x0acd,
        0x0ad0, 0x0ad0,
@@ -126,7 +126,7 @@ var isPrint16 = []uint16{
        0x17f0, 0x17f9,
        0x1800, 0x180d,
        0x1810, 0x1819,
-       0x1820, 0x1877,
+       0x1820, 0x1878,
        0x1880, 0x18aa,
        0x18b0, 0x18f5,
        0x1900, 0x192b,
@@ -149,7 +149,8 @@ var isPrint16 = []uint16{
        0x1bfc, 0x1c37,
        0x1c3b, 0x1c49,
        0x1c4d, 0x1c88,
-       0x1cc0, 0x1cc7,
+       0x1c90, 0x1cba,
+       0x1cbd, 0x1cc7,
        0x1cd0, 0x1cf9,
        0x1d00, 0x1f15,
        0x1f18, 0x1f1d,
@@ -170,38 +171,33 @@ var isPrint16 = []uint16{
        0x2440, 0x244a,
        0x2460, 0x2b73,
        0x2b76, 0x2b95,
-       0x2b98, 0x2bb9,
-       0x2bbd, 0x2bd2,
-       0x2bec, 0x2bef,
-       0x2c00, 0x2cf3,
+       0x2b98, 0x2cf3,
        0x2cf9, 0x2d27,
        0x2d2d, 0x2d2d,
        0x2d30, 0x2d67,
        0x2d6f, 0x2d70,
        0x2d7f, 0x2d96,
-       0x2da0, 0x2e49,
+       0x2da0, 0x2e4e,
        0x2e80, 0x2ef3,
        0x2f00, 0x2fd5,
        0x2ff0, 0x2ffb,
        0x3001, 0x3096,
        0x3099, 0x30ff,
-       0x3105, 0x312e,
-       0x3131, 0x31ba,
+       0x3105, 0x31ba,
        0x31c0, 0x31e3,
        0x31f0, 0x4db5,
-       0x4dc0, 0x9fea,
+       0x4dc0, 0x9fef,
        0xa000, 0xa48c,
        0xa490, 0xa4c6,
        0xa4d0, 0xa62b,
        0xa640, 0xa6f7,
-       0xa700, 0xa7b7,
+       0xa700, 0xa7b9,
        0xa7f7, 0xa82b,
        0xa830, 0xa839,
        0xa840, 0xa877,
        0xa880, 0xa8c5,
        0xa8ce, 0xa8d9,
-       0xa8e0, 0xa8fd,
-       0xa900, 0xa953,
+       0xa8e0, 0xa953,
        0xa95f, 0xa97c,
        0xa980, 0xa9d9,
        0xa9de, 0xaa36,
@@ -245,8 +241,6 @@ var isNotPrint16 = []uint16{
        0x038d,
        0x03a2,
        0x0530,
-       0x0560,
-       0x0588,
        0x0590,
        0x06dd,
        0x083f,
@@ -283,14 +277,12 @@ var isNotPrint16 = []uint16{
        0x0b9b,
        0x0b9d,
        0x0bc9,
-       0x0c04,
        0x0c0d,
        0x0c11,
        0x0c29,
        0x0c45,
        0x0c49,
        0x0c57,
-       0x0c84,
        0x0c8d,
        0x0c91,
        0x0ca9,
@@ -350,6 +342,7 @@ var isNotPrint16 = []uint16{
        0x1ff5,
        0x208f,
        0x2bc9,
+       0x2bff,
        0x2c2f,
        0x2c5f,
        0x2d26,
@@ -363,10 +356,10 @@ var isNotPrint16 = []uint16{
        0x2ddf,
        0x2e9a,
        0x3040,
+       0x3130,
        0x318f,
        0x321f,
        0x32ff,
-       0xa7af,
        0xa9ce,
        0xa9ff,
        0xab27,
@@ -421,9 +414,9 @@ var isPrint32 = []uint32{
        0x010980, 0x0109b7,
        0x0109bc, 0x0109cf,
        0x0109d2, 0x010a06,
-       0x010a0c, 0x010a33,
+       0x010a0c, 0x010a35,
        0x010a38, 0x010a3a,
-       0x010a3f, 0x010a47,
+       0x010a3f, 0x010a48,
        0x010a50, 0x010a58,
        0x010a60, 0x010a9f,
        0x010ac0, 0x010ae6,
@@ -437,14 +430,17 @@ var isPrint32 = []uint32{
        0x010c00, 0x010c48,
        0x010c80, 0x010cb2,
        0x010cc0, 0x010cf2,
-       0x010cfa, 0x010cff,
+       0x010cfa, 0x010d27,
+       0x010d30, 0x010d39,
        0x010e60, 0x010e7e,
+       0x010f00, 0x010f27,
+       0x010f30, 0x010f59,
        0x011000, 0x01104d,
        0x011052, 0x01106f,
        0x01107f, 0x0110c1,
        0x0110d0, 0x0110e8,
        0x0110f0, 0x0110f9,
-       0x011100, 0x011143,
+       0x011100, 0x011146,
        0x011150, 0x011176,
        0x011180, 0x0111cd,
        0x0111d0, 0x0111f4,
@@ -454,8 +450,7 @@ var isPrint32 = []uint32{
        0x0112f0, 0x0112f9,
        0x011300, 0x01130c,
        0x01130f, 0x011310,
-       0x011313, 0x011339,
-       0x01133c, 0x011344,
+       0x011313, 0x011344,
        0x011347, 0x011348,
        0x01134b, 0x01134d,
        0x011350, 0x011350,
@@ -463,7 +458,7 @@ var isPrint32 = []uint32{
        0x01135d, 0x011363,
        0x011366, 0x01136c,
        0x011370, 0x011374,
-       0x011400, 0x01145d,
+       0x011400, 0x01145e,
        0x011480, 0x0114c7,
        0x0114d0, 0x0114d9,
        0x011580, 0x0115b5,
@@ -473,9 +468,10 @@ var isPrint32 = []uint32{
        0x011660, 0x01166c,
        0x011680, 0x0116b7,
        0x0116c0, 0x0116c9,
-       0x011700, 0x011719,
+       0x011700, 0x01171a,
        0x01171d, 0x01172b,
        0x011730, 0x01173f,
+       0x011800, 0x01183b,
        0x0118a0, 0x0118f2,
        0x0118ff, 0x0118ff,
        0x011a00, 0x011a47,
@@ -489,6 +485,9 @@ var isPrint32 = []uint32{
        0x011d00, 0x011d36,
        0x011d3a, 0x011d47,
        0x011d50, 0x011d59,
+       0x011d60, 0x011d98,
+       0x011da0, 0x011da9,
+       0x011ee0, 0x011ef8,
        0x012000, 0x012399,
        0x012400, 0x012474,
        0x012480, 0x012543,
@@ -502,11 +501,12 @@ var isPrint32 = []uint32{
        0x016b00, 0x016b45,
        0x016b50, 0x016b77,
        0x016b7d, 0x016b8f,
+       0x016e40, 0x016e9a,
        0x016f00, 0x016f44,
        0x016f50, 0x016f7e,
        0x016f8f, 0x016f9f,
        0x016fe0, 0x016fe1,
-       0x017000, 0x0187ec,
+       0x017000, 0x0187f1,
        0x018800, 0x018af2,
        0x01b000, 0x01b11e,
        0x01b170, 0x01b2fb,
@@ -520,8 +520,9 @@ var isPrint32 = []uint32{
        0x01d129, 0x01d172,
        0x01d17b, 0x01d1e8,
        0x01d200, 0x01d245,
+       0x01d2e0, 0x01d2f3,
        0x01d300, 0x01d356,
-       0x01d360, 0x01d371,
+       0x01d360, 0x01d378,
        0x01d400, 0x01d49f,
        0x01d4a2, 0x01d4a2,
        0x01d4a5, 0x01d4a6,
@@ -538,6 +539,7 @@ var isPrint32 = []uint32{
        0x01e900, 0x01e94a,
        0x01e950, 0x01e959,
        0x01e95e, 0x01e95f,
+       0x01ec71, 0x01ecb4,
        0x01ee00, 0x01ee24,
        0x01ee27, 0x01ee3b,
        0x01ee42, 0x01ee42,
@@ -560,20 +562,22 @@ var isPrint32 = []uint32{
        0x01f260, 0x01f265,
        0x01f300, 0x01f6d4,
        0x01f6e0, 0x01f6ec,
-       0x01f6f0, 0x01f6f8,
+       0x01f6f0, 0x01f6f9,
        0x01f700, 0x01f773,
-       0x01f780, 0x01f7d4,
+       0x01f780, 0x01f7d8,
        0x01f800, 0x01f80b,
        0x01f810, 0x01f847,
        0x01f850, 0x01f859,
        0x01f860, 0x01f887,
        0x01f890, 0x01f8ad,
        0x01f900, 0x01f90b,
-       0x01f910, 0x01f94c,
-       0x01f950, 0x01f96b,
-       0x01f980, 0x01f997,
-       0x01f9c0, 0x01f9c0,
-       0x01f9d0, 0x01f9e6,
+       0x01f910, 0x01f970,
+       0x01f973, 0x01f976,
+       0x01f97a, 0x01f9a2,
+       0x01f9b0, 0x01f9b9,
+       0x01f9c0, 0x01f9c2,
+       0x01f9d0, 0x01f9ff,
+       0x01fa60, 0x01fa6d,
        0x020000, 0x02a6d6,
        0x02a700, 0x02b734,
        0x02b740, 0x02b81d,
@@ -609,9 +613,9 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry
        0x1329,
        0x1331,
        0x1334,
+       0x133a,
        0x145a,
        0x145c,
-       0x1a9d,
        0x1c09,
        0x1c37,
        0x1ca8,
@@ -619,6 +623,10 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry
        0x1d0a,
        0x1d3b,
        0x1d3e,
+       0x1d66,
+       0x1d69,
+       0x1d8f,
+       0x1d92,
        0x246f,
        0x6a5f,
        0x6b5a,
@@ -668,8 +676,8 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry
        0xeeaa,
        0xf0c0,
        0xf0d0,
-       0xf12f,
        0xf93f,
+       0xf97b,
 }
 
 // isGraphic lists the graphic runes not matched by IsPrint.
index 6cd2f93068c03c36af8a48fdfc356be629b81360..b50496a0ffbbc3098ed3331dcb849b1f971952dd 100644 (file)
@@ -11,7 +11,10 @@ import (
        "unicode/utf8"
 )
 
-const lowerhex = "0123456789abcdef"
+const (
+       lowerhex = "0123456789abcdef"
+       upperhex = "0123456789ABCDEF"
+)
 
 func quoteWith(s string, quote byte, ASCIIonly, graphicOnly bool) string {
        return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, ASCIIonly, graphicOnly))
@@ -22,6 +25,13 @@ func quoteRuneWith(r rune, quote byte, ASCIIonly, graphicOnly bool) string {
 }
 
 func appendQuotedWith(buf []byte, s string, quote byte, ASCIIonly, graphicOnly bool) []byte {
+       // Often called with big strings, so preallocate. If there's quoting,
+       // this is conservative but still helps a lot.
+       if cap(buf)-len(buf) < len(s) {
+               nBuf := make([]byte, len(buf), len(buf)+1+len(s)+1)
+               copy(nBuf, buf)
+               buf = nBuf
+       }
        buf = append(buf, quote)
        for width := 0; len(s) > 0; s = s[width:] {
                r := rune(s[0])
index ebec0cc9e84bf7ae0cdee704a9f73b9b37b05641..7619f90d62b5d855ea5a7c8af71713a8802920b6 100644 (file)
@@ -30,6 +30,9 @@ var (
                        AppendFloat(localBuf[:0], 1.23, 'g', 5, 64)
                }},
                {0, `AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64)`, func() { AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64) }},
+               // In practice we see 7 for the next one, but allow some slop.
+               // Before pre-allocation in appendQuotedWith, we saw 39.
+               {10, `AppendQuoteToASCII(nil, oneMB)`, func() { AppendQuoteToASCII(nil, string(oneMB)) }},
                {0, `ParseFloat("123.45", 64)`, func() { ParseFloat("123.45", 64) }},
                {0, `ParseFloat("123.456789123456789", 64)`, func() { ParseFloat("123.456789123456789", 64) }},
                {0, `ParseFloat("1.000000000000000111022302462515654042363166809082031251", 64)`, func() {
@@ -41,6 +44,8 @@ var (
        }
 )
 
+var oneMB []byte // Will be allocated to 1MB of random data by TestCountMallocs.
+
 func TestCountMallocs(t *testing.T) {
        if runtime.Compiler == "gccgo" {
                t.Skip("skipping on gccgo until escape analysis is turned on")
@@ -51,6 +56,11 @@ func TestCountMallocs(t *testing.T) {
        if runtime.GOMAXPROCS(0) > 1 {
                t.Skip("skipping; GOMAXPROCS>1")
        }
+       // Allocate a big messy buffer for AppendQuoteToASCII's test.
+       oneMB = make([]byte, 1e6)
+       for i := range oneMB {
+               oneMB[i] = byte(i)
+       }
        for _, mt := range mallocTest {
                allocs := testing.AllocsPerRun(100, mt.fn)
                if max := float64(mt.count); allocs > max {
index e31054a4e0b31355e51ed3d2f904d785bc688503..4f3a1ce8c6fdf869eb20b383d6a8ab98102a62b4 100644 (file)
@@ -47,12 +47,16 @@ func ExampleContains() {
 
 func ExampleContainsAny() {
        fmt.Println(strings.ContainsAny("team", "i"))
-       fmt.Println(strings.ContainsAny("failure", "u & i"))
+       fmt.Println(strings.ContainsAny("fail", "ui"))
+       fmt.Println(strings.ContainsAny("ure", "ui"))
+       fmt.Println(strings.ContainsAny("failure", "ui"))
        fmt.Println(strings.ContainsAny("foo", ""))
        fmt.Println(strings.ContainsAny("", ""))
        // Output:
        // false
        // true
+       // true
+       // true
        // false
        // false
 }
index ace0b8d646e38493d836e5d4b46ee09a78d4be69..ccab1fb861d3b3b07406b1f86a57931f5419f2ce 100644 (file)
@@ -26,6 +26,8 @@ type replacer interface {
 // NewReplacer returns a new Replacer from a list of old, new string
 // pairs. Replacements are performed in the order they appear in the
 // target string, without overlapping matches.
+//
+// NewReplacer panics if given an odd number of arguments.
 func NewReplacer(oldnew ...string) *Replacer {
        if len(oldnew)%2 == 1 {
                panic("strings.NewReplacer: odd argument count")
index a98f5d8ff13946380086722aa9b45939b0498fcd..73374813809192d0a1f9df7e4b70cec4ed8e5a74 100644 (file)
@@ -341,38 +341,38 @@ func Fields(s string) []string {
                wasSpace = isSpace
        }
 
-       if setBits < utf8.RuneSelf { // ASCII fast path
-               a := make([]string, n)
-               na := 0
-               fieldStart := 0
-               i := 0
-               // Skip spaces in the front of the input.
-               for i < len(s) && asciiSpace[s[i]] != 0 {
+       if setBits >= utf8.RuneSelf {
+               // Some runes in the input string are not ASCII.
+               return FieldsFunc(s, unicode.IsSpace)
+       }
+       // ASCII fast path
+       a := make([]string, n)
+       na := 0
+       fieldStart := 0
+       i := 0
+       // Skip spaces in the front of the input.
+       for i < len(s) && asciiSpace[s[i]] != 0 {
+               i++
+       }
+       fieldStart = i
+       for i < len(s) {
+               if asciiSpace[s[i]] == 0 {
                        i++
+                       continue
                }
-               fieldStart = i
-               for i < len(s) {
-                       if asciiSpace[s[i]] == 0 {
-                               i++
-                               continue
-                       }
-                       a[na] = s[fieldStart:i]
-                       na++
+               a[na] = s[fieldStart:i]
+               na++
+               i++
+               // Skip spaces in between fields.
+               for i < len(s) && asciiSpace[s[i]] != 0 {
                        i++
-                       // Skip spaces in between fields.
-                       for i < len(s) && asciiSpace[s[i]] != 0 {
-                               i++
-                       }
-                       fieldStart = i
                }
-               if fieldStart < len(s) { // Last field might end at EOF.
-                       a[na] = s[fieldStart:]
-               }
-               return a
+               fieldStart = i
        }
-
-       // Some runes in the input string are not ASCII.
-       return FieldsFunc(s, unicode.IsSpace)
+       if fieldStart < len(s) { // Last field might end at EOF.
+               a[na] = s[fieldStart:]
+       }
+       return a
 }
 
 // FieldsFunc splits the string s at each run of Unicode code points c satisfying f(c)
@@ -550,7 +550,7 @@ func Repeat(s string, count int) string {
        return b.String()
 }
 
-// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case.
+// ToUpper returns s with all Unicode letters mapped to their upper case.
 func ToUpper(s string) string {
        isASCII, hasLower := true, false
        for i := 0; i < len(s); i++ {
@@ -559,7 +559,7 @@ func ToUpper(s string) string {
                        isASCII = false
                        break
                }
-               hasLower = hasLower || (c >= 'a' && c <= 'z')
+               hasLower = hasLower || ('a' <= c && c <= 'z')
        }
 
        if isASCII { // optimize for ASCII-only strings.
@@ -570,7 +570,7 @@ func ToUpper(s string) string {
                b.Grow(len(s))
                for i := 0; i < len(s); i++ {
                        c := s[i]
-                       if c >= 'a' && c <= 'z' {
+                       if 'a' <= c && c <= 'z' {
                                c -= 'a' - 'A'
                        }
                        b.WriteByte(c)
@@ -580,7 +580,7 @@ func ToUpper(s string) string {
        return Map(unicode.ToUpper, s)
 }
 
-// ToLower returns a copy of the string s with all Unicode letters mapped to their lower case.
+// ToLower returns s with all Unicode letters mapped to their lower case.
 func ToLower(s string) string {
        isASCII, hasUpper := true, false
        for i := 0; i < len(s); i++ {
@@ -589,7 +589,7 @@ func ToLower(s string) string {
                        isASCII = false
                        break
                }
-               hasUpper = hasUpper || (c >= 'A' && c <= 'Z')
+               hasUpper = hasUpper || ('A' <= c && c <= 'Z')
        }
 
        if isASCII { // optimize for ASCII-only strings.
@@ -600,7 +600,7 @@ func ToLower(s string) string {
                b.Grow(len(s))
                for i := 0; i < len(s); i++ {
                        c := s[i]
-                       if c >= 'A' && c <= 'Z' {
+                       if 'A' <= c && c <= 'Z' {
                                c += 'a' - 'A'
                        }
                        b.WriteByte(c)
@@ -631,6 +631,56 @@ func ToTitleSpecial(c unicode.SpecialCase, s string) string {
        return Map(c.ToTitle, s)
 }
 
+// ToValidUTF8 returns a copy of the string s with each run of invalid UTF-8 byte sequences
+// replaced by the replacement string, which may be empty.
+func ToValidUTF8(s, replacement string) string {
+       var b Builder
+
+       for i, c := range s {
+               if c != utf8.RuneError {
+                       continue
+               }
+
+               _, wid := utf8.DecodeRuneInString(s[i:])
+               if wid == 1 {
+                       b.Grow(len(s) + len(replacement))
+                       b.WriteString(s[:i])
+                       s = s[i:]
+                       break
+               }
+       }
+
+       // Fast path for unchanged input
+       if b.Cap() == 0 { // didn't call b.Grow above
+               return s
+       }
+
+       invalid := false // previous byte was from an invalid UTF-8 sequence
+       for i := 0; i < len(s); {
+               c := s[i]
+               if c < utf8.RuneSelf {
+                       i++
+                       invalid = false
+                       b.WriteByte(c)
+                       continue
+               }
+               _, wid := utf8.DecodeRuneInString(s[i:])
+               if wid == 1 {
+                       i++
+                       if !invalid {
+                               invalid = true
+                               b.WriteString(replacement)
+                       }
+                       continue
+               }
+               invalid = false
+               b.WriteString(s[i : i+wid])
+               i += wid
+       }
+
+       return b.String()
+}
+
 // isSeparator reports whether the rune could mark a word boundary.
 // TODO: update when package unicode captures more of the properties.
 func isSeparator(r rune) bool {
@@ -818,7 +868,36 @@ func TrimRight(s string, cutset string) string {
 // TrimSpace returns a slice of the string s, with all leading
 // and trailing white space removed, as defined by Unicode.
 func TrimSpace(s string) string {
-       return TrimFunc(s, unicode.IsSpace)
+       // Fast path for ASCII: look for the first ASCII non-space byte
+       start := 0
+       for ; start < len(s); start++ {
+               c := s[start]
+               if c >= utf8.RuneSelf {
+                       // If we run into a non-ASCII byte, fall back to the
+                       // slower unicode-aware method on the remaining bytes
+                       return TrimFunc(s[start:], unicode.IsSpace)
+               }
+               if asciiSpace[c] == 0 {
+                       break
+               }
+       }
+
+       // Now look for the first ASCII non-space byte from the end
+       stop := len(s)
+       for ; stop > start; stop-- {
+               c := s[stop-1]
+               if c >= utf8.RuneSelf {
+                       return TrimFunc(s[start:stop], unicode.IsSpace)
+               }
+               if asciiSpace[c] == 0 {
+                       break
+               }
+       }
+
+       // At this point s[start:stop] starts and ends with an ASCII
+       // non-space bytes, so we're done. Non-ASCII cases have already
+       // been handled above.
+       return s[start:stop]
 }
 
 // TrimPrefix returns s without the provided leading prefix string.
index ae17eba8c93eab18102f930929a4767810792bae..76d827b47fae54a944f8dfc5c137bd1741420ded 100644 (file)
@@ -200,6 +200,18 @@ func TestLastIndex(t *testing.T)    { runIndexTests(t, LastIndex, "LastIndex", l
 func TestIndexAny(t *testing.T)     { runIndexTests(t, IndexAny, "IndexAny", indexAnyTests) }
 func TestLastIndexAny(t *testing.T) { runIndexTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests) }
 
+func TestIndexByte(t *testing.T) {
+       for _, tt := range indexTests {
+               if len(tt.sep) != 1 {
+                       continue
+               }
+               pos := IndexByte(tt.s, tt.sep[0])
+               if pos != tt.out {
+                       t.Errorf(`IndexByte(%q, %q) = %v; want %v`, tt.s, tt.sep[0], pos, tt.out)
+               }
+       }
+}
+
 func TestLastIndexByte(t *testing.T) {
        testCases := []IndexTest{
                {"", "q", -1},
@@ -697,6 +709,36 @@ func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTest
 
 func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) }
 
+var toValidUTF8Tests = []struct {
+       in   string
+       repl string
+       out  string
+}{
+       {"", "\uFFFD", ""},
+       {"abc", "\uFFFD", "abc"},
+       {"\uFDDD", "\uFFFD", "\uFDDD"},
+       {"a\xffb", "\uFFFD", "a\uFFFDb"},
+       {"a\xffb\uFFFD", "X", "aXb\uFFFD"},
+       {"a☺\xffb☺\xC0\xAFc☺\xff", "", "a☺b☺c☺"},
+       {"a☺\xffb☺\xC0\xAFc☺\xff", "日本語", "a☺日本語b☺日本語c☺日本語"},
+       {"\xC0\xAF", "\uFFFD", "\uFFFD"},
+       {"\xE0\x80\xAF", "\uFFFD", "\uFFFD"},
+       {"\xed\xa0\x80", "abc", "abc"},
+       {"\xed\xbf\xbf", "\uFFFD", "\uFFFD"},
+       {"\xF0\x80\x80\xaf", "☺", "☺"},
+       {"\xF8\x80\x80\x80\xAF", "\uFFFD", "\uFFFD"},
+       {"\xFC\x80\x80\x80\x80\xAF", "\uFFFD", "\uFFFD"},
+}
+
+func TestToValidUTF8(t *testing.T) {
+       for _, tc := range toValidUTF8Tests {
+               got := ToValidUTF8(tc.in, tc.repl)
+               if got != tc.out {
+                       t.Errorf("ToValidUTF8(%q, %q) = %q; want %q", tc.in, tc.repl, got, tc.out)
+               }
+       }
+}
+
 func BenchmarkToUpper(b *testing.B) {
        for _, tc := range upperTests {
                b.Run(tc.in, func(b *testing.B) {
@@ -843,6 +885,26 @@ func BenchmarkTrim(b *testing.B) {
        }
 }
 
+func BenchmarkToValidUTF8(b *testing.B) {
+       tests := []struct {
+               name  string
+               input string
+       }{
+               {"Valid", "typical"},
+               {"InvalidASCII", "foo\xffbar"},
+               {"InvalidNonASCII", "日本語\xff日本語"},
+       }
+       replacement := "\uFFFD"
+       b.ResetTimer()
+       for _, test := range tests {
+               b.Run(test.name, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               ToValidUTF8(test.input, replacement)
+                       }
+               })
+       }
+}
+
 type predicate struct {
        f    func(rune) bool
        name string
@@ -868,23 +930,66 @@ func not(p predicate) predicate {
 }
 
 var trimFuncTests = []struct {
-       f       predicate
-       in, out string
+       f        predicate
+       in       string
+       trimOut  string
+       leftOut  string
+       rightOut string
 }{
-       {isSpace, space + " hello " + space, "hello"},
-       {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"},
-       {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"},
-       {not(isSpace), "hello" + space + "hello", space},
-       {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"},
-       {isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"},
-       {not(isValidRune), "\xc0a\xc0", "a"},
+       {isSpace, space + " hello " + space,
+               "hello",
+               "hello " + space,
+               space + " hello"},
+       {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51",
+               "hello",
+               "hello34\u0e50\u0e51",
+               "\u0e50\u0e5212hello"},
+       {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F",
+               "hello",
+               "helloEF\u2C6F\u2C6FGH\u2C6F\u2C6F",
+               "\u2C6F\u2C6F\u2C6F\u2C6FABCDhello"},
+       {not(isSpace), "hello" + space + "hello",
+               space,
+               space + "hello",
+               "hello" + space},
+       {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo",
+               "\u0e50\u0e521234\u0e50\u0e51",
+               "\u0e50\u0e521234\u0e50\u0e51helo",
+               "hello\u0e50\u0e521234\u0e50\u0e51"},
+       {isValidRune, "ab\xc0a\xc0cd",
+               "\xc0a\xc0",
+               "\xc0a\xc0cd",
+               "ab\xc0a\xc0"},
+       {not(isValidRune), "\xc0a\xc0",
+               "a",
+               "a\xc0",
+               "\xc0a"},
+       {isSpace, "",
+               "",
+               "",
+               ""},
+       {isSpace, " ",
+               "",
+               "",
+               ""},
 }
 
 func TestTrimFunc(t *testing.T) {
        for _, tc := range trimFuncTests {
-               actual := TrimFunc(tc.in, tc.f.f)
-               if actual != tc.out {
-                       t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out)
+               trimmers := []struct {
+                       name string
+                       trim func(s string, f func(r rune) bool) string
+                       out  string
+               }{
+                       {"TrimFunc", TrimFunc, tc.trimOut},
+                       {"TrimLeftFunc", TrimLeftFunc, tc.leftOut},
+                       {"TrimRightFunc", TrimRightFunc, tc.rightOut},
+               }
+               for _, trimmer := range trimmers {
+                       actual := trimmer.trim(tc.in, tc.f.f)
+                       if actual != trimmer.out {
+                               t.Errorf("%s(%q, %q) = %q; want %q", trimmer.name, tc.in, tc.f.name, actual, trimmer.out)
+                       }
                }
        }
 }
@@ -1735,3 +1840,19 @@ func BenchmarkJoin(b *testing.B) {
                })
        }
 }
+
+func BenchmarkTrimSpace(b *testing.B) {
+       tests := []struct{ name, input string }{
+               {"NoTrim", "typical"},
+               {"ASCII", "  foo bar  "},
+               {"SomeNonASCII", "    \u2000\t\r\n x\t\t\r\r\ny\n \u3000    "},
+               {"JustNonASCII", "\u2000\u2000\u2000☺☺☺☺\u3000\u3000\u3000"},
+       }
+       for _, test := range tests {
+               b.Run(test.name, func(b *testing.B) {
+                       for i := 0; i < b.N; i++ {
+                               TrimSpace(test.input)
+                       }
+               })
+       }
+}
index 669076efad3f12c5f27c8d408da923c58099eb28..10d3599f476550c7a7240a3f20036f87b09dd392 100644 (file)
@@ -9,3 +9,45 @@ var Runtime_Semacquire = runtime_Semacquire
 var Runtime_Semrelease = runtime_Semrelease
 var Runtime_procPin = runtime_procPin
 var Runtime_procUnpin = runtime_procUnpin
+
+// poolDequeue testing.
+type PoolDequeue interface {
+       PushHead(val interface{}) bool
+       PopHead() (interface{}, bool)
+       PopTail() (interface{}, bool)
+}
+
+func NewPoolDequeue(n int) PoolDequeue {
+       return &poolDequeue{
+               vals: make([]eface, n),
+       }
+}
+
+func (d *poolDequeue) PushHead(val interface{}) bool {
+       return d.pushHead(val)
+}
+
+func (d *poolDequeue) PopHead() (interface{}, bool) {
+       return d.popHead()
+}
+
+func (d *poolDequeue) PopTail() (interface{}, bool) {
+       return d.popTail()
+}
+
+func NewPoolChain() PoolDequeue {
+       return new(poolChain)
+}
+
+func (c *poolChain) PushHead(val interface{}) bool {
+       c.pushHead(val)
+       return true
+}
+
+func (c *poolChain) PopHead() (interface{}, bool) {
+       return c.popHead()
+}
+
+func (c *poolChain) PopTail() (interface{}, bool) {
+       return c.popTail()
+}
index 4c5582c809457a9689f336695e3c3220de714bfc..11ad20c9757346026a48eeeb07c4326239793ceb 100644 (file)
@@ -77,7 +77,11 @@ func (m *Mutex) Lock() {
                }
                return
        }
+       // Slow path (outlined so that the fast path can be inlined)
+       m.lockSlow()
+}
 
+func (m *Mutex) lockSlow() {
        var waitStartTime int64
        starving := false
        awoke := false
@@ -131,7 +135,7 @@ func (m *Mutex) Lock() {
                        if waitStartTime == 0 {
                                waitStartTime = runtime_nanotime()
                        }
-                       runtime_SemacquireMutex(&m.sema, queueLifo)
+                       runtime_SemacquireMutex(&m.sema, queueLifo, 1)
                        starving = starving || runtime_nanotime()-waitStartTime > starvationThresholdNs
                        old = m.state
                        if old&mutexStarving != 0 {
@@ -180,6 +184,14 @@ func (m *Mutex) Unlock() {
 
        // Fast path: drop lock bit.
        new := atomic.AddInt32(&m.state, -mutexLocked)
+       if new != 0 {
+               // Outlined slow path to allow inlining the fast path.
+               // To hide unlockSlow during tracing we skip one extra frame when tracing GoUnblock.
+               m.unlockSlow(new)
+       }
+}
+
+func (m *Mutex) unlockSlow(new int32) {
        if (new+mutexLocked)&mutexLocked == 0 {
                throw("sync: unlock of unlocked mutex")
        }
@@ -198,7 +210,7 @@ func (m *Mutex) Unlock() {
                        // Grab the right to wake someone.
                        new = (old - 1<<mutexWaiterShift) | mutexWoken
                        if atomic.CompareAndSwapInt32(&m.state, old, new) {
-                               runtime_Semrelease(&m.sema, false)
+                               runtime_Semrelease(&m.sema, false, 1)
                                return
                        }
                        old = m.state
@@ -208,6 +220,6 @@ func (m *Mutex) Unlock() {
                // Note: mutexLocked is not set, the waiter will set it after wakeup.
                // But mutex is still considered locked if mutexStarving is set,
                // so new coming goroutines won't acquire it.
-               runtime_Semrelease(&m.sema, true)
+               runtime_Semrelease(&m.sema, true, 1)
        }
 }
index 521468439abc2b5a5f4d7a73856edbbb509381d2..e61a853642fdd4a79e6e1e79e187853fbe6e28df 100644 (file)
@@ -21,7 +21,7 @@ import (
 func HammerSemaphore(s *uint32, loops int, cdone chan bool) {
        for i := 0; i < loops; i++ {
                Runtime_Semacquire(s)
-               Runtime_Semrelease(s, false)
+               Runtime_Semrelease(s, false, 0)
        }
        cdone <- true
 }
index d8ef952ea5489762cdf17712b321668dfdc8da32..84761970dd87df766951e58f1915842c2f2c14b8 100644 (file)
@@ -10,8 +10,13 @@ import (
 
 // Once is an object that will perform exactly one action.
 type Once struct {
-       m    Mutex
+       // done indicates whether the action has been performed.
+       // It is first in the struct because it is used in the hot path.
+       // The hot path is inlined at every call site.
+       // Placing done first allows more compact instructions on some architectures (amd64/x86),
+       // and fewer instructions (to calculate offset) on other architectures.
        done uint32
+       m    Mutex
 }
 
 // Do calls the function f if and only if Do is being called for the
@@ -33,10 +38,13 @@ type Once struct {
 // without calling f.
 //
 func (o *Once) Do(f func()) {
-       if atomic.LoadUint32(&o.done) == 1 {
-               return
+       if atomic.LoadUint32(&o.done) == 0 {
+               // Outlined slow-path to allow inlining of the fast-path.
+               o.doSlow(f)
        }
-       // Slow-path.
+}
+
+func (o *Once) doSlow(f func()) {
        o.m.Lock()
        defer o.m.Unlock()
        if o.done == 0 {
index e54f917225b3f912badb10b4ae5b726eaa2e936d..ca7afdb12ff780d5d25e8046ac2c02fd38f25277 100644 (file)
@@ -47,6 +47,9 @@ type Pool struct {
        local     unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal
        localSize uintptr        // size of the local array
 
+       victim     unsafe.Pointer // local from previous cycle
+       victimSize uintptr        // size of victims array
+
        // New optionally specifies a function to generate
        // a value when Get would otherwise return nil.
        // It may not be changed concurrently with calls to Get.
@@ -55,9 +58,8 @@ type Pool struct {
 
 // Local per-P Pool appendix.
 type poolLocalInternal struct {
-       private interface{}   // Can be used only by the respective P.
-       shared  []interface{} // Can be used by any P.
-       Mutex                 // Protects shared.
+       private interface{} // Can be used only by the respective P.
+       shared  poolChain   // Local P can pushHead/popHead; any P can popTail.
 }
 
 type poolLocal struct {
@@ -97,17 +99,15 @@ func (p *Pool) Put(x interface{}) {
                race.ReleaseMerge(poolRaceAddr(x))
                race.Disable()
        }
-       l := p.pin()
+       l, _ := p.pin()
        if l.private == nil {
                l.private = x
                x = nil
        }
-       runtime_procUnpin()
        if x != nil {
-               l.Lock()
-               l.shared = append(l.shared, x)
-               l.Unlock()
+               l.shared.pushHead(x)
        }
+       runtime_procUnpin()
        if race.Enabled {
                race.Enable()
        }
@@ -125,22 +125,19 @@ func (p *Pool) Get() interface{} {
        if race.Enabled {
                race.Disable()
        }
-       l := p.pin()
+       l, pid := p.pin()
        x := l.private
        l.private = nil
-       runtime_procUnpin()
        if x == nil {
-               l.Lock()
-               last := len(l.shared) - 1
-               if last >= 0 {
-                       x = l.shared[last]
-                       l.shared = l.shared[:last]
-               }
-               l.Unlock()
+               // Try to pop the head of the local shard. We prefer
+               // the head over the tail for temporal locality of
+               // reuse.
+               x, _ = l.shared.popHead()
                if x == nil {
-                       x = p.getSlow()
+                       x = p.getSlow(pid)
                }
        }
+       runtime_procUnpin()
        if race.Enabled {
                race.Enable()
                if x != nil {
@@ -153,45 +150,63 @@ func (p *Pool) Get() interface{} {
        return x
 }
 
-func (p *Pool) getSlow() (x interface{}) {
+func (p *Pool) getSlow(pid int) interface{} {
        // See the comment in pin regarding ordering of the loads.
        size := atomic.LoadUintptr(&p.localSize) // load-acquire
-       local := p.local                         // load-consume
+       locals := p.local                        // load-consume
        // Try to steal one element from other procs.
-       pid := runtime_procPin()
-       runtime_procUnpin()
        for i := 0; i < int(size); i++ {
-               l := indexLocal(local, (pid+i+1)%int(size))
-               l.Lock()
-               last := len(l.shared) - 1
-               if last >= 0 {
-                       x = l.shared[last]
-                       l.shared = l.shared[:last]
-                       l.Unlock()
-                       break
+               l := indexLocal(locals, (pid+i+1)%int(size))
+               if x, _ := l.shared.popTail(); x != nil {
+                       return x
                }
-               l.Unlock()
        }
-       return x
+
+       // Try the victim cache. We do this after attempting to steal
+       // from all primary caches because we want objects in the
+       // victim cache to age out if at all possible.
+       size = atomic.LoadUintptr(&p.victimSize)
+       if uintptr(pid) >= size {
+               return nil
+       }
+       locals = p.victim
+       l := indexLocal(locals, pid)
+       if x := l.private; x != nil {
+               l.private = nil
+               return x
+       }
+       for i := 0; i < int(size); i++ {
+               l := indexLocal(locals, (pid+i)%int(size))
+               if x, _ := l.shared.popTail(); x != nil {
+                       return x
+               }
+       }
+
+       // Mark the victim cache as empty for future gets don't bother
+       // with it.
+       atomic.StoreUintptr(&p.victimSize, 0)
+
+       return nil
 }
 
-// pin pins the current goroutine to P, disables preemption and returns poolLocal pool for the P.
+// pin pins the current goroutine to P, disables preemption and
+// returns poolLocal pool for the P and the P's id.
 // Caller must call runtime_procUnpin() when done with the pool.
-func (p *Pool) pin() *poolLocal {
+func (p *Pool) pin() (*poolLocal, int) {
        pid := runtime_procPin()
-       // In pinSlow we store to localSize and then to local, here we load in opposite order.
+       // In pinSlow we store to local and then to localSize, here we load in opposite order.
        // Since we've disabled preemption, GC cannot happen in between.
        // Thus here we must observe local at least as large localSize.
        // We can observe a newer/larger local, it is fine (we must observe its zero-initialized-ness).
        s := atomic.LoadUintptr(&p.localSize) // load-acquire
        l := p.local                          // load-consume
        if uintptr(pid) < s {
-               return indexLocal(l, pid)
+               return indexLocal(l, pid), pid
        }
        return p.pinSlow()
 }
 
-func (p *Pool) pinSlow() *poolLocal {
+func (p *Pool) pinSlow() (*poolLocal, int) {
        // Retry under the mutex.
        // Can not lock the mutex while pinned.
        runtime_procUnpin()
@@ -202,7 +217,7 @@ func (p *Pool) pinSlow() *poolLocal {
        s := p.localSize
        l := p.local
        if uintptr(pid) < s {
-               return indexLocal(l, pid)
+               return indexLocal(l, pid), pid
        }
        if p.local == nil {
                allPools = append(allPools, p)
@@ -212,35 +227,46 @@ func (p *Pool) pinSlow() *poolLocal {
        local := make([]poolLocal, size)
        atomic.StorePointer(&p.local, unsafe.Pointer(&local[0])) // store-release
        atomic.StoreUintptr(&p.localSize, uintptr(size))         // store-release
-       return &local[pid]
+       return &local[pid], pid
 }
 
 func poolCleanup() {
        // This function is called with the world stopped, at the beginning of a garbage collection.
        // It must not allocate and probably should not call any runtime functions.
-       // Defensively zero out everything, 2 reasons:
-       // 1. To prevent false retention of whole Pools.
-       // 2. If GC happens while a goroutine works with l.shared in Put/Get,
-       //    it will retain whole Pool. So next cycle memory consumption would be doubled.
-       for i, p := range allPools {
-               allPools[i] = nil
-               for i := 0; i < int(p.localSize); i++ {
-                       l := indexLocal(p.local, i)
-                       l.private = nil
-                       for j := range l.shared {
-                               l.shared[j] = nil
-                       }
-                       l.shared = nil
-               }
+
+       // Because the world is stopped, no pool user can be in a
+       // pinned section (in effect, this has all Ps pinned).
+
+       // Drop victim caches from all pools.
+       for _, p := range oldPools {
+               p.victim = nil
+               p.victimSize = 0
+       }
+
+       // Move primary cache to victim cache.
+       for _, p := range allPools {
+               p.victim = p.local
+               p.victimSize = p.localSize
                p.local = nil
                p.localSize = 0
        }
-       allPools = []*Pool{}
+
+       // The pools with non-empty primary caches now have non-empty
+       // victim caches and no pools have primary caches.
+       oldPools, allPools = allPools, nil
 }
 
 var (
        allPoolsMu Mutex
-       allPools   []*Pool
+
+       // allPools is the set of pools that have non-empty primary
+       // caches. Protected by either 1) allPoolsMu and pinning or 2)
+       // STW.
+       allPools []*Pool
+
+       // oldPools is the set of pools that may have non-empty victim
+       // caches. Protected by STW.
+       oldPools []*Pool
 )
 
 func init() {
index dad2f992e7c7600576c9026bfb36d58ffdf57ec0..7e175a91cdd4279f4afb941c5c3487a5622be35d 100644 (file)
@@ -10,6 +10,7 @@ package sync_test
 import (
        "runtime"
        "runtime/debug"
+       "sort"
        . "sync"
        "sync/atomic"
        "testing"
@@ -40,11 +41,20 @@ func TestPool(t *testing.T) {
        }
        Runtime_procUnpin()
 
-       p.Put("c")
-       debug.SetGCPercent(100) // to allow following GC to actually run
+       // Put in a large number of objects so they spill into
+       // stealable space.
+       for i := 0; i < 100; i++ {
+               p.Put("c")
+       }
+       // After one GC, the victim cache should keep them alive.
+       runtime.GC()
+       if g := p.Get(); g != "c" {
+               t.Fatalf("got %#v; want c after GC", g)
+       }
+       // A second GC should drop the victim cache.
        runtime.GC()
        if g := p.Get(); g != nil {
-               t.Fatalf("got %#v; want nil after GC", g)
+               t.Fatalf("got %#v; want nil after second GC", g)
        }
 }
 
@@ -96,6 +106,9 @@ func testPool(t *testing.T, drain bool) {
        const N = 100
 loop:
        for try := 0; try < 3; try++ {
+               if try == 1 && testing.Short() {
+                       break
+               }
                var fin, fin1 uint32
                for i := 0; i < N; i++ {
                        v := new(string)
@@ -151,6 +164,86 @@ func TestPoolStress(t *testing.T) {
        }
 }
 
+func TestPoolDequeue(t *testing.T) {
+       testPoolDequeue(t, NewPoolDequeue(16))
+}
+
+func TestPoolChain(t *testing.T) {
+       testPoolDequeue(t, NewPoolChain())
+}
+
+func testPoolDequeue(t *testing.T, d PoolDequeue) {
+       const P = 10
+       // In long mode, do enough pushes to wrap around the 21-bit
+       // indexes.
+       N := 1<<21 + 1000
+       if testing.Short() {
+               N = 1e3
+       }
+       have := make([]int32, N)
+       var stop int32
+       var wg WaitGroup
+
+       // Start P-1 consumers.
+       for i := 1; i < P; i++ {
+               wg.Add(1)
+               go func() {
+                       fail := 0
+                       for atomic.LoadInt32(&stop) == 0 {
+                               val, ok := d.PopTail()
+                               if ok {
+                                       fail = 0
+                                       atomic.AddInt32(&have[val.(int)], 1)
+                                       if val.(int) == N-1 {
+                                               atomic.StoreInt32(&stop, 1)
+                                       }
+                               } else {
+                                       // Speed up the test by
+                                       // allowing the pusher to run.
+                                       if fail++; fail%100 == 0 {
+                                               runtime.Gosched()
+                                       }
+                               }
+                       }
+                       wg.Done()
+               }()
+       }
+
+       // Start 1 producer.
+       nPopHead := 0
+       wg.Add(1)
+       go func() {
+               for j := 0; j < N; j++ {
+                       for !d.PushHead(j) {
+                               // Allow a popper to run.
+                               runtime.Gosched()
+                       }
+                       if j%10 == 0 {
+                               val, ok := d.PopHead()
+                               if ok {
+                                       nPopHead++
+                                       atomic.AddInt32(&have[val.(int)], 1)
+                               }
+                       }
+               }
+               wg.Done()
+       }()
+       wg.Wait()
+
+       // Check results.
+       for i, count := range have {
+               if count != 1 {
+                       t.Errorf("expected have[%d] = 1, got %d", i, count)
+               }
+       }
+       if nPopHead == 0 {
+               // In theory it's possible in a valid schedule for
+               // popHead to never succeed, but in practice it almost
+               // always succeeds, so this is unlikely to flake.
+               t.Errorf("popHead never succeeded")
+       }
+}
+
 func BenchmarkPool(b *testing.B) {
        var p Pool
        b.RunParallel(func(pb *testing.PB) {
@@ -174,3 +267,84 @@ func BenchmarkPoolOverflow(b *testing.B) {
                }
        })
 }
+
+var globalSink interface{}
+
+func BenchmarkPoolSTW(b *testing.B) {
+       // Take control of GC.
+       defer debug.SetGCPercent(debug.SetGCPercent(-1))
+
+       var mstats runtime.MemStats
+       var pauses []uint64
+
+       var p Pool
+       for i := 0; i < b.N; i++ {
+               // Put a large number of items into a pool.
+               const N = 100000
+               var item interface{} = 42
+               for i := 0; i < N; i++ {
+                       p.Put(item)
+               }
+               // Do a GC.
+               runtime.GC()
+               // Record pause time.
+               runtime.ReadMemStats(&mstats)
+               pauses = append(pauses, mstats.PauseNs[(mstats.NumGC+255)%256])
+       }
+
+       // Get pause time stats.
+       sort.Slice(pauses, func(i, j int) bool { return pauses[i] < pauses[j] })
+       var total uint64
+       for _, ns := range pauses {
+               total += ns
+       }
+       // ns/op for this benchmark is average STW time.
+       b.ReportMetric(float64(total)/float64(b.N), "ns/op")
+       b.ReportMetric(float64(pauses[len(pauses)*95/100]), "p95-ns/STW")
+       b.ReportMetric(float64(pauses[len(pauses)*50/100]), "p50-ns/STW")
+}
+
+func BenchmarkPoolExpensiveNew(b *testing.B) {
+       // Populate a pool with items that are expensive to construct
+       // to stress pool cleanup and subsequent reconstruction.
+
+       // Create a ballast so the GC has a non-zero heap size and
+       // runs at reasonable times.
+       globalSink = make([]byte, 8<<20)
+       defer func() { globalSink = nil }()
+
+       // Create a pool that's "expensive" to fill.
+       var p Pool
+       var nNew uint64
+       p.New = func() interface{} {
+               atomic.AddUint64(&nNew, 1)
+               time.Sleep(time.Millisecond)
+               return 42
+       }
+       var mstats1, mstats2 runtime.MemStats
+       runtime.ReadMemStats(&mstats1)
+       b.RunParallel(func(pb *testing.PB) {
+               // Simulate 100X the number of goroutines having items
+               // checked out from the Pool simultaneously.
+               items := make([]interface{}, 100)
+               var sink []byte
+               for pb.Next() {
+                       // Stress the pool.
+                       for i := range items {
+                               items[i] = p.Get()
+                               // Simulate doing some work with this
+                               // item checked out.
+                               sink = make([]byte, 32<<10)
+                       }
+                       for i, v := range items {
+                               p.Put(v)
+                               items[i] = nil
+                       }
+               }
+               _ = sink
+       })
+       runtime.ReadMemStats(&mstats2)
+
+       b.ReportMetric(float64(mstats2.NumGC-mstats1.NumGC)/float64(b.N), "GCs/op")
+       b.ReportMetric(float64(nNew)/float64(b.N), "New/op")
+}
diff --git a/libgo/go/sync/poolqueue.go b/libgo/go/sync/poolqueue.go
new file mode 100644 (file)
index 0000000..22f7496
--- /dev/null
@@ -0,0 +1,309 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sync
+
+import (
+       "sync/atomic"
+       "unsafe"
+)
+
+// poolDequeue is a lock-free fixed-size single-producer,
+// multi-consumer queue. The single producer can both push and pop
+// from the head, and consumers can pop from the tail.
+//
+// It has the added feature that it nils out unused slots to avoid
+// unnecessary retention of objects. This is important for sync.Pool,
+// but not typically a property considered in the literature.
+type poolDequeue struct {
+       // headTail packs together a 32-bit head index and a 32-bit
+       // tail index. Both are indexes into vals modulo len(vals)-1.
+       //
+       // tail = index of oldest data in queue
+       // head = index of next slot to fill
+       //
+       // Slots in the range [tail, head) are owned by consumers.
+       // A consumer continues to own a slot outside this range until
+       // it nils the slot, at which point ownership passes to the
+       // producer.
+       //
+       // The head index is stored in the most-significant bits so
+       // that we can atomically add to it and the overflow is
+       // harmless.
+       headTail uint64
+
+       // vals is a ring buffer of interface{} values stored in this
+       // dequeue. The size of this must be a power of 2.
+       //
+       // vals[i].typ is nil if the slot is empty and non-nil
+       // otherwise. A slot is still in use until *both* the tail
+       // index has moved beyond it and typ has been set to nil. This
+       // is set to nil atomically by the consumer and read
+       // atomically by the producer.
+       vals []eface
+}
+
+type eface struct {
+       typ, val unsafe.Pointer
+}
+
+const dequeueBits = 32
+
+// dequeueLimit is the maximum size of a poolDequeue.
+//
+// This must be at most (1<<dequeueBits)/2 because detecting fullness
+// depends on wrapping around the ring buffer without wrapping around
+// the index. We divide by 4 so this fits in an int on 32-bit.
+const dequeueLimit = (1 << dequeueBits) / 4
+
+// dequeueNil is used in poolDeqeue to represent interface{}(nil).
+// Since we use nil to represent empty slots, we need a sentinel value
+// to represent nil.
+type dequeueNil *struct{}
+
+func (d *poolDequeue) unpack(ptrs uint64) (head, tail uint32) {
+       const mask = 1<<dequeueBits - 1
+       head = uint32((ptrs >> dequeueBits) & mask)
+       tail = uint32(ptrs & mask)
+       return
+}
+
+func (d *poolDequeue) pack(head, tail uint32) uint64 {
+       const mask = 1<<dequeueBits - 1
+       return (uint64(head) << dequeueBits) |
+               uint64(tail&mask)
+}
+
+// pushHead adds val at the head of the queue. It returns false if the
+// queue is full. It must only be called by a single producer.
+func (d *poolDequeue) pushHead(val interface{}) bool {
+       ptrs := atomic.LoadUint64(&d.headTail)
+       head, tail := d.unpack(ptrs)
+       if (tail+uint32(len(d.vals)))&(1<<dequeueBits-1) == head {
+               // Queue is full.
+               return false
+       }
+       slot := &d.vals[head&uint32(len(d.vals)-1)]
+
+       // Check if the head slot has been released by popTail.
+       typ := atomic.LoadPointer(&slot.typ)
+       if typ != nil {
+               // Another goroutine is still cleaning up the tail, so
+               // the queue is actually still full.
+               return false
+       }
+
+       // The head slot is free, so we own it.
+       if val == nil {
+               val = dequeueNil(nil)
+       }
+       *(*interface{})(unsafe.Pointer(slot)) = val
+
+       // Increment head. This passes ownership of slot to popTail
+       // and acts as a store barrier for writing the slot.
+       atomic.AddUint64(&d.headTail, 1<<dequeueBits)
+       return true
+}
+
+// popHead removes and returns the element at the head of the queue.
+// It returns false if the queue is empty. It must only be called by a
+// single producer.
+func (d *poolDequeue) popHead() (interface{}, bool) {
+       var slot *eface
+       for {
+               ptrs := atomic.LoadUint64(&d.headTail)
+               head, tail := d.unpack(ptrs)
+               if tail == head {
+                       // Queue is empty.
+                       return nil, false
+               }
+
+               // Confirm tail and decrement head. We do this before
+               // reading the value to take back ownership of this
+               // slot.
+               head--
+               ptrs2 := d.pack(head, tail)
+               if atomic.CompareAndSwapUint64(&d.headTail, ptrs, ptrs2) {
+                       // We successfully took back slot.
+                       slot = &d.vals[head&uint32(len(d.vals)-1)]
+                       break
+               }
+       }
+
+       val := *(*interface{})(unsafe.Pointer(slot))
+       if val == dequeueNil(nil) {
+               val = nil
+       }
+       // Zero the slot. Unlike popTail, this isn't racing with
+       // pushHead, so we don't need to be careful here.
+       *slot = eface{}
+       return val, true
+}
+
+// popTail removes and returns the element at the tail of the queue.
+// It returns false if the queue is empty. It may be called by any
+// number of consumers.
+func (d *poolDequeue) popTail() (interface{}, bool) {
+       var slot *eface
+       for {
+               ptrs := atomic.LoadUint64(&d.headTail)
+               head, tail := d.unpack(ptrs)
+               if tail == head {
+                       // Queue is empty.
+                       return nil, false
+               }
+
+               // Confirm head and tail (for our speculative check
+               // above) and increment tail. If this succeeds, then
+               // we own the slot at tail.
+               ptrs2 := d.pack(head, tail+1)
+               if atomic.CompareAndSwapUint64(&d.headTail, ptrs, ptrs2) {
+                       // Success.
+                       slot = &d.vals[tail&uint32(len(d.vals)-1)]
+                       break
+               }
+       }
+
+       // We now own slot.
+       val := *(*interface{})(unsafe.Pointer(slot))
+       if val == dequeueNil(nil) {
+               val = nil
+       }
+
+       // Tell pushHead that we're done with this slot. Zeroing the
+       // slot is also important so we don't leave behind references
+       // that could keep this object live longer than necessary.
+       //
+       // We write to val first and then publish that we're done with
+       // this slot by atomically writing to typ.
+       slot.val = nil
+       atomic.StorePointer(&slot.typ, nil)
+       // At this point pushHead owns the slot.
+
+       return val, true
+}
+
+// poolChain is a dynamically-sized version of poolDequeue.
+//
+// This is implemented as a doubly-linked list queue of poolDequeues
+// where each dequeue is double the size of the previous one. Once a
+// dequeue fills up, this allocates a new one and only ever pushes to
+// the latest dequeue. Pops happen from the other end of the list and
+// once a dequeue is exhausted, it gets removed from the list.
+type poolChain struct {
+       // head is the poolDequeue to push to. This is only accessed
+       // by the producer, so doesn't need to be synchronized.
+       head *poolChainElt
+
+       // tail is the poolDequeue to popTail from. This is accessed
+       // by consumers, so reads and writes must be atomic.
+       tail *poolChainElt
+}
+
+type poolChainElt struct {
+       poolDequeue
+
+       // next and prev link to the adjacent poolChainElts in this
+       // poolChain.
+       //
+       // next is written atomically by the producer and read
+       // atomically by the consumer. It only transitions from nil to
+       // non-nil.
+       //
+       // prev is written atomically by the consumer and read
+       // atomically by the producer. It only transitions from
+       // non-nil to nil.
+       next, prev *poolChainElt
+}
+
+func storePoolChainElt(pp **poolChainElt, v *poolChainElt) {
+       atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(pp)), unsafe.Pointer(v))
+}
+
+func loadPoolChainElt(pp **poolChainElt) *poolChainElt {
+       return (*poolChainElt)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(pp))))
+}
+
+func (c *poolChain) pushHead(val interface{}) {
+       d := c.head
+       if d == nil {
+               // Initialize the chain.
+               const initSize = 8 // Must be a power of 2
+               d = new(poolChainElt)
+               d.vals = make([]eface, initSize)
+               c.head = d
+               storePoolChainElt(&c.tail, d)
+       }
+
+       if d.pushHead(val) {
+               return
+       }
+
+       // The current dequeue is full. Allocate a new one of twice
+       // the size.
+       newSize := len(d.vals) * 2
+       if newSize >= dequeueLimit {
+               // Can't make it any bigger.
+               newSize = dequeueLimit
+       }
+
+       d2 := &poolChainElt{prev: d}
+       d2.vals = make([]eface, newSize)
+       c.head = d2
+       storePoolChainElt(&d.next, d2)
+       d2.pushHead(val)
+}
+
+func (c *poolChain) popHead() (interface{}, bool) {
+       d := c.head
+       for d != nil {
+               if val, ok := d.popHead(); ok {
+                       return val, ok
+               }
+               // There may still be unconsumed elements in the
+               // previous dequeue, so try backing up.
+               d = loadPoolChainElt(&d.prev)
+       }
+       return nil, false
+}
+
+func (c *poolChain) popTail() (interface{}, bool) {
+       d := loadPoolChainElt(&c.tail)
+       if d == nil {
+               return nil, false
+       }
+
+       for {
+               // It's important that we load the next pointer
+               // *before* popping the tail. In general, d may be
+               // transiently empty, but if next is non-nil before
+               // the pop and the pop fails, then d is permanently
+               // empty, which is the only condition under which it's
+               // safe to drop d from the chain.
+               d2 := loadPoolChainElt(&d.next)
+
+               if val, ok := d.popTail(); ok {
+                       return val, ok
+               }
+
+               if d2 == nil {
+                       // This is the only dequeue. It's empty right
+                       // now, but could be pushed to in the future.
+                       return nil, false
+               }
+
+               // The tail of the chain has been drained, so move on
+               // to the next dequeue. Try to drop it from the chain
+               // so the next pop doesn't have to look at the empty
+               // dequeue again.
+               if atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(&c.tail)), unsafe.Pointer(d), unsafe.Pointer(d2)) {
+                       // We won the race. Clear the prev pointer so
+                       // the garbage collector can collect the empty
+                       // dequeue and so popHead doesn't back up
+                       // further than necessary.
+                       storePoolChainElt(&d2.prev, nil)
+               }
+               d = d2
+       }
+}
index b6b9e480a4eab8cb7446b534b38d982044652334..3ad44e786fb6c457d83922b01038b791ef933e12 100644 (file)
@@ -15,14 +15,18 @@ func runtime_Semacquire(s *uint32)
 
 // SemacquireMutex is like Semacquire, but for profiling contended Mutexes.
 // If lifo is true, queue waiter at the head of wait queue.
-func runtime_SemacquireMutex(s *uint32, lifo bool)
+// skipframes is the number of frames to omit during tracing, counting from
+// runtime_SemacquireMutex's caller.
+func runtime_SemacquireMutex(s *uint32, lifo bool, skipframes int)
 
 // Semrelease atomically increments *s and notifies a waiting goroutine
 // if one is blocked in Semacquire.
 // It is intended as a simple wakeup primitive for use by the synchronization
 // library and should not be used directly.
 // If handoff is true, pass count directly to the first waiter.
-func runtime_Semrelease(s *uint32, handoff bool)
+// skipframes is the number of frames to omit during tracing, counting from
+// runtime_Semrelease's caller.
+func runtime_Semrelease(s *uint32, handoff bool, skipframes int)
 
 // Approximation of notifyList in runtime/sema.go. Size and alignment must
 // agree.
index a680847edf87a310aeeefd52e1b86e8a0d71e5c8..152cf0e94a6bc91e57985836de364c7fe73a607a 100644 (file)
@@ -18,7 +18,7 @@ func BenchmarkSemaUncontended(b *testing.B) {
        b.RunParallel(func(pb *testing.PB) {
                sem := new(PaddedSem)
                for pb.Next() {
-                       Runtime_Semrelease(&sem.sem, false)
+                       Runtime_Semrelease(&sem.sem, false, 0)
                        Runtime_Semacquire(&sem.sem)
                }
        })
@@ -44,7 +44,7 @@ func benchmarkSema(b *testing.B, block, work bool) {
        b.RunParallel(func(pb *testing.PB) {
                foo := 0
                for pb.Next() {
-                       Runtime_Semrelease(&sem, false)
+                       Runtime_Semrelease(&sem, false, 0)
                        if work {
                                for i := 0; i < 100; i++ {
                                        foo *= 2
@@ -54,7 +54,7 @@ func benchmarkSema(b *testing.B, block, work bool) {
                        Runtime_Semacquire(&sem)
                }
                _ = foo
-               Runtime_Semrelease(&sem, false)
+               Runtime_Semrelease(&sem, false, 0)
        })
 }
 
index 16a2f9227c04249f4f2b47255ce62b57d478a8b4..dc0faf6a604d96f3278fb18b45d39296115545b0 100644 (file)
@@ -47,7 +47,7 @@ func (rw *RWMutex) RLock() {
        }
        if atomic.AddInt32(&rw.readerCount, 1) < 0 {
                // A writer is pending, wait for it.
-               runtime_SemacquireMutex(&rw.readerSem, false)
+               runtime_SemacquireMutex(&rw.readerSem, false, 0)
        }
        if race.Enabled {
                race.Enable()
@@ -66,21 +66,26 @@ func (rw *RWMutex) RUnlock() {
                race.Disable()
        }
        if r := atomic.AddInt32(&rw.readerCount, -1); r < 0 {
-               if r+1 == 0 || r+1 == -rwmutexMaxReaders {
-                       race.Enable()
-                       throw("sync: RUnlock of unlocked RWMutex")
-               }
-               // A writer is pending.
-               if atomic.AddInt32(&rw.readerWait, -1) == 0 {
-                       // The last reader unblocks the writer.
-                       runtime_Semrelease(&rw.writerSem, false)
-               }
+               // Outlined slow-path to allow the fast-path to be inlined
+               rw.rUnlockSlow(r)
        }
        if race.Enabled {
                race.Enable()
        }
 }
 
+func (rw *RWMutex) rUnlockSlow(r int32) {
+       if r+1 == 0 || r+1 == -rwmutexMaxReaders {
+               race.Enable()
+               throw("sync: RUnlock of unlocked RWMutex")
+       }
+       // A writer is pending.
+       if atomic.AddInt32(&rw.readerWait, -1) == 0 {
+               // The last reader unblocks the writer.
+               runtime_Semrelease(&rw.writerSem, false, 1)
+       }
+}
+
 // Lock locks rw for writing.
 // If the lock is already locked for reading or writing,
 // Lock blocks until the lock is available.
@@ -95,7 +100,7 @@ func (rw *RWMutex) Lock() {
        r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
        // Wait for active readers.
        if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
-               runtime_SemacquireMutex(&rw.writerSem, false)
+               runtime_SemacquireMutex(&rw.writerSem, false, 0)
        }
        if race.Enabled {
                race.Enable()
@@ -125,7 +130,7 @@ func (rw *RWMutex) Unlock() {
        }
        // Unblock blocked readers, if any.
        for i := 0; i < int(r); i++ {
-               runtime_Semrelease(&rw.readerSem, false)
+               runtime_Semrelease(&rw.readerSem, false, 0)
        }
        // Allow other writers to proceed.
        rw.w.Unlock()
index 99dd40000665f3d9dc933edd9175c5f17f3206d2..e81a493dea21d5a8053c6c899e1808ae7b88cecc 100644 (file)
@@ -90,7 +90,7 @@ func (wg *WaitGroup) Add(delta int) {
        // Reset waiters count to 0.
        *statep = 0
        for ; w != 0; w-- {
-               runtime_Semrelease(semap, false)
+               runtime_Semrelease(semap, false, 0)
        }
 }
 
index e5f5eb3f8aa1dc612cb520645ad9b1ffea1959ed..43b667b6b62ab16a72330417e6a299ba2c5e851b 100644 (file)
@@ -2,20 +2,23 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin,!arm,!arm64 dragonfly freebsd netbsd openbsd
+// +build darwin dragonfly freebsd netbsd openbsd
 
 package syscall_test
 
 import (
        "bytes"
+       "fmt"
        "io/ioutil"
        "os"
        "path/filepath"
+       "runtime"
        "sort"
        "strconv"
        "strings"
        "syscall"
        "testing"
+       "unsafe"
 )
 
 func TestDirent(t *testing.T) {
@@ -41,10 +44,10 @@ func TestDirent(t *testing.T) {
 
        buf := bytes.Repeat([]byte("DEADBEAF"), direntBufSize/8)
        fd, err := syscall.Open(d, syscall.O_RDONLY, 0)
-       defer syscall.Close(fd)
        if err != nil {
                t.Fatalf("syscall.open: %v", err)
        }
+       defer syscall.Close(fd)
        n, err := syscall.ReadDirent(fd, buf)
        if err != nil {
                t.Fatalf("syscall.readdir: %v", err)
@@ -74,3 +77,67 @@ func TestDirent(t *testing.T) {
                }
        }
 }
+
+func TestDirentRepeat(t *testing.T) {
+       const N = 100
+       // Note: the size of the buffer is small enough that the loop
+       // below will need to execute multiple times. See issue #31368.
+       size := N * unsafe.Offsetof(syscall.Dirent{}.Name) / 4
+       if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" {
+               if size < 1024 {
+                       size = 1024 // DIRBLKSIZ, see issue 31403.
+               }
+               if runtime.GOOS == "freebsd" {
+                       t.Skip("need to fix issue 31416 first")
+               }
+       }
+
+       // Make a directory containing N files
+       d, err := ioutil.TempDir("", "direntRepeat-test")
+       if err != nil {
+               t.Fatalf("tempdir: %v", err)
+       }
+       defer os.RemoveAll(d)
+
+       var files []string
+       for i := 0; i < N; i++ {
+               files = append(files, fmt.Sprintf("file%d", i))
+       }
+       for _, file := range files {
+               err = ioutil.WriteFile(filepath.Join(d, file), []byte("contents"), 0644)
+               if err != nil {
+                       t.Fatalf("writefile: %v", err)
+               }
+       }
+
+       // Read the directory entries using ReadDirent.
+       fd, err := syscall.Open(d, syscall.O_RDONLY, 0)
+       if err != nil {
+               t.Fatalf("syscall.open: %v", err)
+       }
+       defer syscall.Close(fd)
+       var files2 []string
+       for {
+               buf := make([]byte, size)
+               n, err := syscall.ReadDirent(fd, buf)
+               if err != nil {
+                       t.Fatalf("syscall.readdir: %v", err)
+               }
+               if n == 0 {
+                       break
+               }
+               buf = buf[:n]
+               for len(buf) > 0 {
+                       var consumed int
+                       consumed, _, files2 = syscall.ParseDirent(buf, -1, files2)
+                       buf = buf[consumed:]
+               }
+       }
+
+       // Check results
+       sort.Strings(files)
+       sort.Strings(files2)
+       if strings.Join(files, "|") != strings.Join(files2, "|") {
+               t.Errorf("bad file list: want\n%q\ngot\n%q", files, files2)
+       }
+}
index a241e2101f4521b932adc2e9647ff16ef54ea811..3a4db044e5ceef5b89d485f485dbff42da7fcb01 100644 (file)
@@ -168,6 +168,26 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                }
        }
 
+       // Detach fd 0 from tty
+       if sys.Noctty {
+               _, err1 = raw_ioctl(0, TIOCNOTTY, 0)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
+       // Set the controlling TTY to Ctty
+       if sys.Setctty {
+               if TIOCSCTTY == 0 {
+                       err1 = ENOSYS
+                       goto childerror
+               }
+               _, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, 0)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
        // Pass 1: look for fd[i] < i and move those up above len(fd)
        // so that pass 2 won't stomp on an fd it needs later.
        if pipe < nextfd {
@@ -225,26 +245,6 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                raw_close(i)
        }
 
-       // Detach fd 0 from tty
-       if sys.Noctty {
-               _, err1 = raw_ioctl(0, TIOCNOTTY, 0)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
-       // Set the controlling TTY to Ctty
-       if sys.Setctty {
-               if TIOCSCTTY == 0 {
-                       err1 = ENOSYS
-                       goto childerror
-               }
-               _, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, 0)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
        // Time to exec.
        err1 = raw_execve(argv0, &argv[0], &envv[0])
 
index f860f4628ebe2ce700b31927471970e308ddf44c..9f7bf67d2c3c541d2b237fcf3bdcf7a55976c509 100644 (file)
@@ -80,8 +80,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
 
        // Enable tracing if requested.
        if sys.Ptrace {
-               _, _, err1 = rawSyscall(funcPC(libc_ptrace_trampoline), uintptr(PTRACE_TRACEME), 0, 0)
-               if err1 != 0 {
+               if err := ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil {
+                       err1 = err.(Errno)
                        goto childerror
                }
        }
@@ -160,6 +160,22 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                }
        }
 
+       // Detach fd 0 from tty
+       if sys.Noctty {
+               _, _, err1 = rawSyscall(funcPC(libc_ioctl_trampoline), 0, uintptr(TIOCNOTTY), 0)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
+       // Set the controlling TTY to Ctty
+       if sys.Setctty {
+               _, _, err1 = rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(sys.Ctty), uintptr(TIOCSCTTY), 0)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
        // Pass 1: look for fd[i] < i and move those up above len(fd)
        // so that pass 2 won't stomp on an fd it needs later.
        if pipe < nextfd {
@@ -217,22 +233,6 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                rawSyscall(funcPC(libc_close_trampoline), uintptr(i), 0, 0)
        }
 
-       // Detach fd 0 from tty
-       if sys.Noctty {
-               _, _, err1 = rawSyscall(funcPC(libc_ioctl_trampoline), 0, uintptr(TIOCNOTTY), 0)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
-       // Set the controlling TTY to Ctty
-       if sys.Setctty {
-               _, _, err1 = rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(sys.Ctty), uintptr(TIOCSCTTY), 0)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
        // Time to exec.
        _, _, err1 = rawSyscall(funcPC(libc_execve_trampoline),
                uintptr(unsafe.Pointer(argv0)),
index f035e6b07e1bb4c21907bc27d38969d2f83be5d6..215ecc23393ea4dc759777b12da4ae7af9c10db8 100644 (file)
@@ -19,6 +19,9 @@ import (
 //sysnb rawMount(source *byte, target *byte, fstype *byte, flags uintptr, data *byte) (err Errno)
 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) _C_int
 
+//sysnb rawOpenat(dirfd int, pathname *byte, flags int, perm uint32) (fd int, err Errno)
+//openat(dirfd _C_int, pathname *byte, flags _C_int, perm Mode_t) _C_int
+
 // SysProcIDMap holds Container ID to Host ID mappings used for User Namespaces in Linux.
 // See user_namespaces(7).
 type SysProcIDMap struct {
@@ -94,18 +97,44 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
 
        if sys.UidMappings != nil || sys.GidMappings != nil {
                Close(p[0])
-               err := writeUidGidMappings(pid, sys)
                var err2 Errno
-               if err != nil {
-                       err2 = err.(Errno)
+               // uid/gid mappings will be written after fork and unshare(2) for user
+               // namespaces.
+               if sys.Unshareflags&CLONE_NEWUSER == 0 {
+                       if err := writeUidGidMappings(pid, sys); err != nil {
+                               err2 = err.(Errno)
+                       }
                }
-               RawSyscall(SYS_WRITE, uintptr(p[1]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
+               raw_write(p[1], (*byte)(unsafe.Pointer(&err2)), int(unsafe.Sizeof(err2)))
                Close(p[1])
        }
 
        return pid, 0
 }
 
+const _LINUX_CAPABILITY_VERSION_3 = 0x20080522
+
+type capHeader struct {
+       version uint32
+       pid     int32
+}
+
+type capData struct {
+       effective   uint32
+       permitted   uint32
+       inheritable uint32
+}
+type caps struct {
+       hdr  capHeader
+       data [2]capData
+}
+
+// See CAP_TO_INDEX in linux/capability.h:
+func capToIndex(cap uintptr) uintptr { return cap >> 5 }
+
+// See CAP_TO_MASK in linux/capability.h:
+func capToMask(cap uintptr) uint32 { return 1 << uint(cap&31) }
+
 // forkAndExecInChild1 implements the body of forkAndExecInChild up to
 // the parent's post-fork path. This is a separate function so we can
 // separate the child's and parent's stack frames if we're using
@@ -131,12 +160,33 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
        // Declare all variables at top in case any
        // declarations require heap allocation (e.g., err1).
        var (
-               err2   Errno
-               nextfd int
-               i      int
-               r2     int
+               err2                      Errno
+               nextfd                    int
+               i                         int
+               r2                        int
+               caps                      caps
+               fd1                       int
+               puid, psetgroups, pgid    []byte
+               uidmap, setgroups, gidmap []byte
        )
 
+       if sys.UidMappings != nil {
+               puid = []byte("/proc/self/uid_map\000")
+               uidmap = formatIDMappings(sys.UidMappings)
+       }
+
+       if sys.GidMappings != nil {
+               psetgroups = []byte("/proc/self/setgroups\000")
+               pgid = []byte("/proc/self/gid_map\000")
+
+               if sys.GidMappingsEnableSetgroups {
+                       setgroups = []byte("allow\000")
+               } else {
+                       setgroups = []byte("deny\000")
+               }
+               gidmap = formatIDMappings(sys.GidMappings)
+       }
+
        // Record parent PID so child can test if it has died.
        ppid := raw_getpid()
 
@@ -187,7 +237,7 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
 
        // Enable the "keep capabilities" flag to set ambient capabilities later.
        if len(sys.AmbientCaps) > 0 {
-               _, _, err1 = RawSyscall6(SYS_PRCTL, PR_SET_KEEPCAPS, 1, 0, 0, 0, 0)
+               _, err1 = raw_prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0)
                if err1 != 0 {
                        goto childerror
                }
@@ -195,14 +245,14 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
 
        // Wait for User ID/Group ID mappings to be written.
        if sys.UidMappings != nil || sys.GidMappings != nil {
-               if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(p[1]), 0, 0); err1 != 0 {
+               if err1 = raw_close(p[1]); err1 != 0 {
                        goto childerror
                }
-               r1, _, err1 = RawSyscall(SYS_READ, uintptr(p[0]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
+               r2, err1 = raw_read(p[0], (*byte)(unsafe.Pointer(&err2)), int(unsafe.Sizeof(err2)))
                if err1 != 0 {
                        goto childerror
                }
-               if r1 != unsafe.Sizeof(err2) {
+               if r2 != int(unsafe.Sizeof(err2)) {
                        err1 = EINVAL
                        goto childerror
                }
@@ -248,6 +298,46 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
                if err1 != 0 {
                        goto childerror
                }
+
+               if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.GidMappings != nil {
+                       dirfd := int(_AT_FDCWD)
+                       if fd1, err1 = rawOpenat(dirfd, &psetgroups[0], O_WRONLY, 0); err1 != 0 {
+                               goto childerror
+                       }
+                       _, err1 = raw_write(fd1, &setgroups[0], len(setgroups))
+                       if err1 != 0 {
+                               goto childerror
+                       }
+                       if err1 = raw_close(fd1); err1 != 0 {
+                               goto childerror
+                       }
+
+                       if fd1, err1 = rawOpenat(dirfd, &pgid[0], O_WRONLY, 0); err1 != 0 {
+                               goto childerror
+                       }
+                       _, err1 = raw_write(fd1, &gidmap[0], len(gidmap))
+                       if err1 != 0 {
+                               goto childerror
+                       }
+                       if err1 = raw_close(fd1); err1 != 0 {
+                               goto childerror
+                       }
+               }
+
+               if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.UidMappings != nil {
+                       dirfd := int(_AT_FDCWD)
+                       if fd1, err1 = rawOpenat(dirfd, &puid[0], O_WRONLY, 0); err1 != 0 {
+                               goto childerror
+                       }
+                       _, err1 = raw_write(fd1, &uidmap[0], len(uidmap))
+                       if err1 != 0 {
+                               goto childerror
+                       }
+                       if err1 = raw_close(fd1); err1 != 0 {
+                               goto childerror
+                       }
+               }
+
                // The unshare system call in Linux doesn't unshare mount points
                // mounted with --shared. Systemd mounts / with --shared. For a
                // long discussion of the pros and cons of this see debian bug 739593.
@@ -294,11 +384,32 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
                }
        }
 
-       for _, c := range sys.AmbientCaps {
-               _, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0)
-               if err1 != 0 {
+       if len(sys.AmbientCaps) != 0 {
+               // Ambient capabilities were added in the 4.3 kernel,
+               // so it is safe to always use _LINUX_CAPABILITY_VERSION_3.
+               caps.hdr.version = _LINUX_CAPABILITY_VERSION_3
+
+               if _, _, err1 = RawSyscall(SYS_CAPGET, uintptr(unsafe.Pointer(&caps.hdr)), uintptr(unsafe.Pointer(&caps.data[0])), 0); err1 != 0 {
+                       goto childerror
+               }
+
+               for _, c := range sys.AmbientCaps {
+                       // Add the c capability to the permitted and inheritable capability mask,
+                       // otherwise we will not be able to add it to the ambient capability mask.
+                       caps.data[capToIndex(c)].permitted |= capToMask(c)
+                       caps.data[capToIndex(c)].inheritable |= capToMask(c)
+               }
+
+               if _, _, err1 = RawSyscall(SYS_CAPSET, uintptr(unsafe.Pointer(&caps.hdr)), uintptr(unsafe.Pointer(&caps.data[0])), 0); err1 != 0 {
                        goto childerror
                }
+
+               for _, c := range sys.AmbientCaps {
+                       _, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0)
+                       if err1 != 0 {
+                               goto childerror
+                       }
+               }
        }
 
        // Chdir
@@ -329,6 +440,22 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
                }
        }
 
+       // Detach fd 0 from tty
+       if sys.Noctty {
+               _, err1 = raw_ioctl(0, TIOCNOTTY, 0)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
+       // Set the controlling TTY to Ctty
+       if sys.Setctty {
+               _, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, 1)
+               if err1 != 0 {
+                       goto childerror
+               }
+       }
+
        // Pass 1: look for fd[i] < i and move those up above len(fd)
        // so that pass 2 won't stomp on an fd it needs later.
        if pipe < nextfd {
@@ -386,22 +513,6 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
                raw_close(i)
        }
 
-       // Detach fd 0 from tty
-       if sys.Noctty {
-               _, err1 = raw_ioctl(0, TIOCNOTTY, 0)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
-       // Set the controlling TTY to Ctty
-       if sys.Setctty {
-               _, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, sys.Ctty)
-               if err1 != 0 {
-                       goto childerror
-               }
-       }
-
        // Enable tracing if requested.
        // Do this right before exec so that we don't unnecessarily trace the runtime
        // setting up after the fork. See issue #21428.
@@ -440,25 +551,22 @@ func forkExecPipe(p []int) (err error) {
        return
 }
 
-// writeIDMappings writes the user namespace User ID or Group ID mappings to the specified path.
-func writeIDMappings(path string, idMap []SysProcIDMap) error {
-       fd, err := Open(path, O_RDWR, 0)
-       if err != nil {
-               return err
-       }
-
-       data := ""
+func formatIDMappings(idMap []SysProcIDMap) []byte {
+       var data []byte
        for _, im := range idMap {
-               data = data + itoa(im.ContainerID) + " " + itoa(im.HostID) + " " + itoa(im.Size) + "\n"
+               data = append(data, []byte(itoa(im.ContainerID)+" "+itoa(im.HostID)+" "+itoa(im.Size)+"\n")...)
        }
+       return data
+}
 
-       bytes, err := ByteSliceFromString(data)
+// writeIDMappings writes the user namespace User ID or Group ID mappings to the specified path.
+func writeIDMappings(path string, idMap []SysProcIDMap) error {
+       fd, err := Open(path, O_RDWR, 0)
        if err != nil {
-               Close(fd)
                return err
        }
 
-       if _, err := Write(fd, bytes); err != nil {
+       if _, err := Write(fd, formatIDMappings(idMap)); err != nil {
                Close(fd)
                return err
        }
index ac5745bc80bca5f9dc41efdc06fdeb4045bf316b..7bd3910063265ddb056545ce00702061caf9beac 100644 (file)
@@ -42,6 +42,15 @@ func skipInContainer(t *testing.T) {
        }
 }
 
+func skipUnprivilegedUserClone(t *testing.T) {
+       // Skip the test if the sysctl that prevents unprivileged user
+       // from creating user namespaces is enabled.
+       data, errRead := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
+       if errRead != nil || len(data) < 1 || data[0] == '0' {
+               t.Skip("kernel prohibits user namespace in unprivileged process")
+       }
+}
+
 // Check if we are in a chroot by checking if the inode of / is
 // different from 2 (there is no better test available to non-root on
 // linux).
@@ -72,10 +81,7 @@ func checkUserNS(t *testing.T) {
        }
        // On some systems, there is a sysctl setting.
        if os.Getuid() != 0 {
-               data, errRead := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
-               if errRead == nil && data[0] == '0' {
-                       t.Skip("kernel prohibits user namespace in unprivileged process")
-               }
+               skipUnprivilegedUserClone(t)
        }
        // On Centos 7 make sure they set the kernel parameter user_namespace=1
        // See issue 16283 and 20796.
@@ -163,7 +169,7 @@ func TestCloneNEWUSERAndRemapNoRootSetgroupsEnableSetgroups(t *testing.T) {
                t.Skip("probably old kernel without security fix")
        }
        if !os.IsPermission(err) {
-               t.Fatalf("Unprivileged gid_map rewriting with GidMappingsEnableSetgroups must fail")
+               t.Fatalf("Unprivileged gid_map rewriting with GidMappingsEnableSetgroups must fail with permission error; got %v", err)
        }
 }
 
@@ -344,7 +350,7 @@ func TestUnshareMountNameSpace(t *testing.T) {
        }
 
        cmd := exec.Command(os.Args[0], "-test.run=TestUnshareMountNameSpaceHelper", d)
-       cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
+       cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
        cmd.SysProcAttr = &syscall.SysProcAttr{Unshareflags: syscall.CLONE_NEWNS}
 
        o, err := cmd.CombinedOutput()
@@ -403,7 +409,7 @@ func TestUnshareMountNameSpaceChroot(t *testing.T) {
        }
 
        cmd = exec.Command("/syscall.test", "-test.run=TestUnshareMountNameSpaceHelper", "/")
-       cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
+       cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
        cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: d, Unshareflags: syscall.CLONE_NEWNS}
 
        o, err := cmd.CombinedOutput()
@@ -434,9 +440,52 @@ func TestUnshareMountNameSpaceChroot(t *testing.T) {
        }
 }
 
+func TestUnshareUidGidMappingHelper(*testing.T) {
+       if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
+               return
+       }
+       defer os.Exit(0)
+       if err := syscall.Chroot(os.TempDir()); err != nil {
+               fmt.Fprintln(os.Stderr, err)
+               os.Exit(2)
+       }
+}
+
+// Test for Issue 29789: unshare fails when uid/gid mapping is specified
+func TestUnshareUidGidMapping(t *testing.T) {
+       if os.Getuid() == 0 {
+               t.Skip("test exercises unprivileged user namespace, fails with privileges")
+       }
+       checkUserNS(t)
+       cmd := exec.Command(os.Args[0], "-test.run=TestUnshareUidGidMappingHelper")
+       cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+       cmd.SysProcAttr = &syscall.SysProcAttr{
+               Unshareflags:               syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER,
+               GidMappingsEnableSetgroups: false,
+               UidMappings: []syscall.SysProcIDMap{
+                       {
+                               ContainerID: 0,
+                               HostID:      syscall.Getuid(),
+                               Size:        1,
+                       },
+               },
+               GidMappings: []syscall.SysProcIDMap{
+                       {
+                               ContainerID: 0,
+                               HostID:      syscall.Getgid(),
+                               Size:        1,
+                       },
+               },
+       }
+       out, err := cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("Cmd failed with err %v, output: %s", err, out)
+       }
+}
+
 type capHeader struct {
        version uint32
-       pid     int
+       pid     int32
 }
 
 type capData struct {
@@ -446,6 +495,7 @@ type capData struct {
 }
 
 const CAP_SYS_TIME = 25
+const CAP_SYSLOG = 34
 
 type caps struct {
        hdr  capHeader
@@ -506,15 +556,28 @@ func TestAmbientCapsHelper(*testing.T) {
                fmt.Fprintln(os.Stderr, "CAP_SYS_TIME unexpectedly not in the effective capability mask")
                os.Exit(2)
        }
+       if caps.data[1].effective&(1<<uint(CAP_SYSLOG&31)) == 0 {
+               fmt.Fprintln(os.Stderr, "CAP_SYSLOG unexpectedly not in the effective capability mask")
+               os.Exit(2)
+       }
 }
 
 func TestAmbientCaps(t *testing.T) {
-       skipInContainer(t)
        // Make sure we are running as root so we have permissions to use unshare
        // and create a network namespace.
        if os.Getuid() != 0 {
                t.Skip("kernel prohibits unshare in unprivileged process, unless using user namespace")
        }
+
+       testAmbientCaps(t, false)
+}
+
+func TestAmbientCapsUserns(t *testing.T) {
+       testAmbientCaps(t, true)
+}
+
+func testAmbientCaps(t *testing.T, userns bool) {
+       skipInContainer(t)
        mustSupportAmbientCaps(t)
 
        // When running under the Go continuous build, skip tests for
@@ -525,25 +588,13 @@ func TestAmbientCaps(t *testing.T) {
                t.Skip("skipping test on Kubernetes-based builders; see Issue 12815")
        }
 
+       skipUnprivilegedUserClone(t)
+
        // skip on android, due to lack of lookup support
        if runtime.GOOS == "android" {
                t.Skip("skipping test on android; see Issue 27327")
        }
 
-       caps, err := getCaps()
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       // Add CAP_SYS_TIME to the permitted and inheritable capability mask,
-       // otherwise we will not be able to add it to the ambient capability mask.
-       caps.data[0].permitted |= 1 << uint(CAP_SYS_TIME)
-       caps.data[0].inheritable |= 1 << uint(CAP_SYS_TIME)
-
-       if _, _, errno := syscall.Syscall(syscall.SYS_CAPSET, uintptr(unsafe.Pointer(&caps.hdr)), uintptr(unsafe.Pointer(&caps.data[0])), 0); errno != 0 {
-               t.Fatalf("SYS_CAPSET: %v", errno)
-       }
-
        u, err := user.Lookup("nobody")
        if err != nil {
                t.Fatal(err)
@@ -580,7 +631,7 @@ func TestAmbientCaps(t *testing.T) {
        }
 
        cmd := exec.Command(f.Name(), "-test.run=TestAmbientCapsHelper")
-       cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
+       cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        cmd.SysProcAttr = &syscall.SysProcAttr{
@@ -588,7 +639,29 @@ func TestAmbientCaps(t *testing.T) {
                        Uid: uint32(uid),
                        Gid: uint32(gid),
                },
-               AmbientCaps: []uintptr{CAP_SYS_TIME},
+               AmbientCaps: []uintptr{CAP_SYS_TIME, CAP_SYSLOG},
+       }
+       if userns {
+               cmd.SysProcAttr.Cloneflags = syscall.CLONE_NEWUSER
+               const nobody = 65534
+               uid := os.Getuid()
+               gid := os.Getgid()
+               cmd.SysProcAttr.UidMappings = []syscall.SysProcIDMap{{
+                       ContainerID: int(nobody),
+                       HostID:      int(uid),
+                       Size:        int(1),
+               }}
+               cmd.SysProcAttr.GidMappings = []syscall.SysProcIDMap{{
+                       ContainerID: int(nobody),
+                       HostID:      int(gid),
+                       Size:        int(1),
+               }}
+
+               // Set credentials to run as user and group nobody.
+               cmd.SysProcAttr.Credential = &syscall.Credential{
+                       Uid: nobody,
+                       Gid: nobody,
+               }
        }
        if err := cmd.Run(); err != nil {
                t.Fatal(err.Error())
index ec21f8014dda06faf41c9bcbb41d515e1247805c..e6e4ae2b06b22b92ede6ddadae35bcd264dd739c 100644 (file)
@@ -9,6 +9,7 @@
 package syscall
 
 import (
+       "internal/bytealg"
        "runtime"
        "sync"
        "unsafe"
@@ -50,7 +51,10 @@ import (
 //sysnb        raw_execve(argv0 *byte, argv **byte, envv **byte) (err Errno)
 //execve(argv0 *byte, argv **byte, envv **byte) _C_int
 
-//sysnb        raw_write(fd int, buf *byte, count int) (err Errno)
+//sysnb raw_read(fd int, buf *byte, count int) (c int, err Errno)
+//read(fd _C_int, buf *byte, count Size_t) Ssize_t
+
+//sysnb        raw_write(fd int, buf *byte, count int) (c int, err Errno)
 //write(fd _C_int, buf *byte, count Size_t) Ssize_t
 
 //sysnb        raw_exit(status int)
@@ -132,15 +136,21 @@ func StringSlicePtr(ss []string) []*byte {
 // pointers to NUL-terminated byte arrays. If any string contains
 // a NUL byte, it returns (nil, EINVAL).
 func SlicePtrFromStrings(ss []string) ([]*byte, error) {
-       var err error
-       bb := make([]*byte, len(ss)+1)
-       for i := 0; i < len(ss); i++ {
-               bb[i], err = BytePtrFromString(ss[i])
-               if err != nil {
-                       return nil, err
+       n := 0
+       for _, s := range ss {
+               if bytealg.IndexByteString(s, 0) != -1 {
+                       return nil, EINVAL
                }
+               n += len(s) + 1 // +1 for NUL
+       }
+       bb := make([]*byte, len(ss)+1)
+       b := make([]byte, n)
+       n = 0
+       for i, s := range ss {
+               bb[i] = &b[n]
+               copy(b[n:], s)
+               n += len(s) + 1
        }
-       bb[len(ss)] = nil
        return bb, nil
 }
 
@@ -318,7 +328,7 @@ func Exec(argv0 string, argv []string, envv []string) (err error) {
        runtime_BeforeExec()
 
        var err1 error
-       if runtime.GOOS == "solaris" || runtime.GOOS == "aix" || runtime.GOOS == "hurd" {
+       if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "aix" || runtime.GOOS == "hurd" {
                // RawSyscall should never be used on Solaris or AIX.
                err1 = raw_execve(argv0p, &argvp[0], &envvp[0])
        } else if runtime.GOOS == "darwin" {
index c78bad8e00680912c08fb4047aeab12fe31edbac..8d6141c0ca6f3914ddb222d8126136739fcedcc7 100644 (file)
@@ -219,10 +219,12 @@ type ProcAttr struct {
 }
 
 type SysProcAttr struct {
-       HideWindow    bool
-       CmdLine       string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
-       CreationFlags uint32
-       Token         Token // if set, runs new process in the security context represented by the token
+       HideWindow        bool
+       CmdLine           string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
+       CreationFlags     uint32
+       Token             Token               // if set, runs new process in the security context represented by the token
+       ProcessAttributes *SecurityAttributes // if set, applies these security attributes as the descriptor for the new process
+       ThreadAttributes  *SecurityAttributes // if set, applies these security attributes as the descriptor for the main thread of the new process
 }
 
 var zeroProcAttr ProcAttr
@@ -323,9 +325,9 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
 
        flags := sys.CreationFlags | CREATE_UNICODE_ENVIRONMENT
        if sys.Token != 0 {
-               err = CreateProcessAsUser(sys.Token, argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
+               err = CreateProcessAsUser(sys.Token, argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
        } else {
-               err = CreateProcess(argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
+               err = CreateProcess(argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
        }
        if err != nil {
                return 0, 0, err
index fcc5f038b823c10d481a3e835976b2d8bbedc859..1b835c50484033a55f06a53cfd55905dd9797fd0 100644 (file)
@@ -20,6 +20,8 @@ var jsProcess = js.Global().Get("process")
 var jsFS = js.Global().Get("fs")
 var constants = jsFS.Get("constants")
 
+var uint8Array = js.Global().Get("Uint8Array")
+
 var (
        nodeWRONLY = constants.Get("O_WRONLY").Int()
        nodeRDWR   = constants.Get("O_RDWR").Int()
@@ -38,9 +40,9 @@ type jsFile struct {
 
 var filesMu sync.Mutex
 var files = map[int]*jsFile{
-       0: &jsFile{},
-       1: &jsFile{},
-       2: &jsFile{},
+       0: {},
+       1: {},
+       2: {},
 }
 
 func fdToFile(fd int) (*jsFile, error) {
@@ -244,18 +246,26 @@ func Chown(path string, uid, gid int) error {
        if err := checkPath(path); err != nil {
                return err
        }
-       return ENOSYS
+       _, err := fsCall("chown", path, uint32(uid), uint32(gid))
+       return err
 }
 
 func Fchown(fd int, uid, gid int) error {
-       return ENOSYS
+       _, err := fsCall("fchown", fd, uint32(uid), uint32(gid))
+       return err
 }
 
 func Lchown(path string, uid, gid int) error {
        if err := checkPath(path); err != nil {
                return err
        }
-       return ENOSYS
+       if jsFS.Get("lchown") == js.Undefined() {
+               // fs.lchown is unavailable on Linux until Node.js 10.6.0
+               // TODO(neelance): remove when we require at least this Node.js version
+               return ENOSYS
+       }
+       _, err := fsCall("lchown", path, uint32(uid), uint32(gid))
+       return err
 }
 
 func UtimesNano(path string, ts []Timespec) error {
@@ -370,12 +380,13 @@ func Read(fd int, b []byte) (int, error) {
                return n, err
        }
 
-       a := js.TypedArrayOf(b)
-       n, err := fsCall("read", fd, a, 0, len(b), nil)
-       a.Release()
+       buf := uint8Array.New(len(b))
+       n, err := fsCall("read", fd, buf, 0, len(b), nil)
        if err != nil {
                return 0, err
        }
+       js.CopyBytesToGo(b, buf)
+
        n2 := n.Int()
        f.pos += int64(n2)
        return n2, err
@@ -393,9 +404,9 @@ func Write(fd int, b []byte) (int, error) {
                return n, err
        }
 
-       a := js.TypedArrayOf(b)
-       n, err := fsCall("write", fd, a, 0, len(b), nil)
-       a.Release()
+       buf := uint8Array.New(len(b))
+       js.CopyBytesToJS(buf, b)
+       n, err := fsCall("write", fd, buf, 0, len(b), nil)
        if err != nil {
                return 0, err
        }
@@ -405,19 +416,19 @@ func Write(fd int, b []byte) (int, error) {
 }
 
 func Pread(fd int, b []byte, offset int64) (int, error) {
-       a := js.TypedArrayOf(b)
-       n, err := fsCall("read", fd, a, 0, len(b), offset)
-       a.Release()
+       buf := uint8Array.New(len(b))
+       n, err := fsCall("read", fd, buf, 0, len(b), offset)
        if err != nil {
                return 0, err
        }
+       js.CopyBytesToGo(b, buf)
        return n.Int(), nil
 }
 
 func Pwrite(fd int, b []byte, offset int64) (int, error) {
-       a := js.TypedArrayOf(b)
-       n, err := fsCall("write", fd, a, 0, len(b), offset)
-       a.Release()
+       buf := uint8Array.New(len(b))
+       js.CopyBytesToJS(buf, b)
+       n, err := fsCall("write", fd, buf, 0, len(b), offset)
        if err != nil {
                return 0, err
        }
diff --git a/libgo/go/syscall/getdirentries_test.go b/libgo/go/syscall/getdirentries_test.go
new file mode 100644 (file)
index 0000000..8505a0b
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd netbsd openbsd
+
+package syscall_test
+
+import (
+       "fmt"
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "sort"
+       "strings"
+       "syscall"
+       "testing"
+       "unsafe"
+)
+
+func TestGetdirentries(t *testing.T) {
+       for _, count := range []int{10, 1000} {
+               t.Run(fmt.Sprintf("n=%d", count), func(t *testing.T) {
+                       testGetdirentries(t, count)
+               })
+       }
+}
+func testGetdirentries(t *testing.T, count int) {
+       if count > 100 && testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+               t.Skip("skipping in -short mode")
+       }
+       d, err := ioutil.TempDir("", "getdirentries-test")
+       if err != nil {
+               t.Fatalf("Tempdir: %v", err)
+       }
+       defer os.RemoveAll(d)
+       var names []string
+       for i := 0; i < count; i++ {
+               names = append(names, fmt.Sprintf("file%03d", i))
+       }
+
+       // Make files in the temp directory
+       for _, name := range names {
+               err := ioutil.WriteFile(filepath.Join(d, name), []byte("data"), 0)
+               if err != nil {
+                       t.Fatalf("WriteFile: %v", err)
+               }
+       }
+
+       // Read files using Getdirentries
+       var names2 []string
+       fd, err := syscall.Open(d, syscall.O_RDONLY, 0)
+       if err != nil {
+               t.Fatalf("Open: %v", err)
+       }
+       defer syscall.Close(fd)
+       var base uintptr
+       var buf [2048]byte
+       for {
+               n, err := syscall.Getdirentries(fd, buf[:], &base)
+               if err != nil {
+                       t.Fatalf("Getdirentries: %v", err)
+               }
+               if n == 0 {
+                       break
+               }
+               data := buf[:n]
+               for len(data) > 0 {
+                       dirent := (*syscall.Dirent)(unsafe.Pointer(&data[0]))
+                       data = data[dirent.Reclen:]
+                       name := make([]byte, dirent.Namlen)
+                       for i := 0; i < int(dirent.Namlen); i++ {
+                               name[i] = byte(dirent.Name[i])
+                       }
+                       names2 = append(names2, string(name))
+               }
+       }
+
+       names = append(names, ".", "..") // Getdirentries returns these also
+       sort.Strings(names)
+       sort.Strings(names2)
+       if strings.Join(names, ":") != strings.Join(names2, ":") {
+               t.Errorf("names don't match\n names: %q\nnames2: %q", names, names2)
+       }
+}
index 0893db022d356255ea86f5fc1b11e02e77ed6b92..7300d2c7695fc902b809f46bebb5c1122274333e 100644 (file)
@@ -79,8 +79,7 @@ var (
        valueTrue      = predefValue(3)
        valueFalse     = predefValue(4)
        valueGlobal    = predefValue(5)
-       memory         = predefValue(6) // WebAssembly linear memory
-       jsGo           = predefValue(7) // instance of the Go class in JavaScript
+       jsGo           = predefValue(6) // instance of the Go class in JavaScript
 
        objectConstructor = valueGlobal.Get("Object")
        arrayConstructor  = valueGlobal.Get("Array")
@@ -106,7 +105,6 @@ func Global() Value {
 //  | Go                     | JavaScript             |
 //  | ---------------------- | ---------------------- |
 //  | js.Value               | [its value]            |
-//  | js.TypedArray          | typed array            |
 //  | js.Func                | function               |
 //  | nil                    | null                   |
 //  | bool                   | boolean                |
@@ -216,6 +214,10 @@ func (t Type) String() string {
        }
 }
 
+func (t Type) isObject() bool {
+       return t == TypeObject || t == TypeFunction
+}
+
 // Type returns the JavaScript type of the value v. It is similar to JavaScript's typeof operator,
 // except that it returns TypeNull instead of TypeObject for null.
 func (v Value) Type() Type {
@@ -244,28 +246,44 @@ func (v Value) Type() Type {
 }
 
 // Get returns the JavaScript property p of value v.
+// It panics if v is not a JavaScript object.
 func (v Value) Get(p string) Value {
+       if vType := v.Type(); !vType.isObject() {
+               panic(&ValueError{"Value.Get", vType})
+       }
        return makeValue(valueGet(v.ref, p))
 }
 
 func valueGet(v ref, p string) ref
 
 // Set sets the JavaScript property p of value v to ValueOf(x).
+// It panics if v is not a JavaScript object.
 func (v Value) Set(p string, x interface{}) {
+       if vType := v.Type(); !vType.isObject() {
+               panic(&ValueError{"Value.Set", vType})
+       }
        valueSet(v.ref, p, ValueOf(x).ref)
 }
 
 func valueSet(v ref, p string, x ref)
 
 // Index returns JavaScript index i of value v.
+// It panics if v is not a JavaScript object.
 func (v Value) Index(i int) Value {
+       if vType := v.Type(); !vType.isObject() {
+               panic(&ValueError{"Value.Index", vType})
+       }
        return makeValue(valueIndex(v.ref, i))
 }
 
 func valueIndex(v ref, i int) ref
 
 // SetIndex sets the JavaScript index i of value v to ValueOf(x).
+// It panics if v is not a JavaScript object.
 func (v Value) SetIndex(i int, x interface{}) {
+       if vType := v.Type(); !vType.isObject() {
+               panic(&ValueError{"Value.SetIndex", vType})
+       }
        valueSetIndex(v.ref, i, ValueOf(x).ref)
 }
 
@@ -280,7 +298,11 @@ func makeArgs(args []interface{}) []ref {
 }
 
 // Length returns the JavaScript property "length" of v.
+// It panics if v is not a JavaScript object.
 func (v Value) Length() int {
+       if vType := v.Type(); !vType.isObject() {
+               panic(&ValueError{"Value.SetIndex", vType})
+       }
        return valueLength(v.ref)
 }
 
@@ -292,7 +314,7 @@ func valueLength(v ref) int
 func (v Value) Call(m string, args ...interface{}) Value {
        res, ok := valueCall(v.ref, m, makeArgs(args))
        if !ok {
-               if vType := v.Type(); vType != TypeObject && vType != TypeFunction { // check here to avoid overhead in success case
+               if vType := v.Type(); !vType.isObject() { // check here to avoid overhead in success case
                        panic(&ValueError{"Value.Call", vType})
                }
                if propType := v.Get(m).Type(); propType != TypeFunction {
@@ -306,7 +328,7 @@ func (v Value) Call(m string, args ...interface{}) Value {
 func valueCall(v ref, m string, args []ref) (ref, bool)
 
 // Invoke does a JavaScript call of the value v with the given arguments.
-// It panics if v is not a function.
+// It panics if v is not a JavaScript function.
 // The arguments get mapped to JavaScript values according to the ValueOf function.
 func (v Value) Invoke(args ...interface{}) Value {
        res, ok := valueInvoke(v.ref, makeArgs(args))
@@ -322,11 +344,14 @@ func (v Value) Invoke(args ...interface{}) Value {
 func valueInvoke(v ref, args []ref) (ref, bool)
 
 // New uses JavaScript's "new" operator with value v as constructor and the given arguments.
-// It panics if v is not a function.
+// It panics if v is not a JavaScript function.
 // The arguments get mapped to JavaScript values according to the ValueOf function.
 func (v Value) New(args ...interface{}) Value {
        res, ok := valueNew(v.ref, makeArgs(args))
        if !ok {
+               if vType := v.Type(); vType != TypeFunction { // check here to avoid overhead in success case
+                       panic(&ValueError{"Value.Invoke", vType})
+               }
                panic(Error{makeValue(res)})
        }
        return makeValue(res)
@@ -350,17 +375,20 @@ func (v Value) float(method string) float64 {
        return *(*float64)(unsafe.Pointer(&v.ref))
 }
 
-// Float returns the value v as a float64. It panics if v is not a JavaScript number.
+// Float returns the value v as a float64.
+// It panics if v is not a JavaScript number.
 func (v Value) Float() float64 {
        return v.float("Value.Float")
 }
 
-// Int returns the value v truncated to an int. It panics if v is not a JavaScript number.
+// Int returns the value v truncated to an int.
+// It panics if v is not a JavaScript number.
 func (v Value) Int() int {
        return int(v.float("Value.Int"))
 }
 
-// Bool returns the value v as a bool. It panics if v is not a JavaScript boolean.
+// Bool returns the value v as a bool.
+// It panics if v is not a JavaScript boolean.
 func (v Value) Bool() bool {
        switch v.ref {
        case valueTrue.ref:
@@ -392,9 +420,35 @@ func (v Value) Truthy() bool {
        }
 }
 
-// String returns the value v converted to string according to JavaScript type conversions.
+// String returns the value v as a string.
+// String is a special case because of Go's String method convention. Unlike the other getters,
+// it does not panic if v's Type is not TypeString. Instead, it returns a string of the form "<T>"
+// or "<T: V>" where T is v's type and V is a string representation of v's value.
 func (v Value) String() string {
-       str, length := valuePrepareString(v.ref)
+       switch v.Type() {
+       case TypeString:
+               return jsString(v.ref)
+       case TypeUndefined:
+               return "<undefined>"
+       case TypeNull:
+               return "<null>"
+       case TypeBoolean:
+               return "<boolean: " + jsString(v.ref) + ">"
+       case TypeNumber:
+               return "<number: " + jsString(v.ref) + ">"
+       case TypeSymbol:
+               return "<symbol>"
+       case TypeObject:
+               return "<object>"
+       case TypeFunction:
+               return "<function>"
+       default:
+               panic("bad type")
+       }
+}
+
+func jsString(v ref) string {
+       str, length := valuePrepareString(v)
        b := make([]byte, length)
        valueLoadString(str, b)
        return string(b)
@@ -422,3 +476,29 @@ type ValueError struct {
 func (e *ValueError) Error() string {
        return "syscall/js: call of " + e.Method + " on " + e.Type.String()
 }
+
+// CopyBytesToGo copies bytes from the Uint8Array src to dst.
+// It returns the number of bytes copied, which will be the minimum of the lengths of src and dst.
+// CopyBytesToGo panics if src is not an Uint8Array.
+func CopyBytesToGo(dst []byte, src Value) int {
+       n, ok := copyBytesToGo(dst, src.ref)
+       if !ok {
+               panic("syscall/js: CopyBytesToGo: expected src to be an Uint8Array")
+       }
+       return n
+}
+
+func copyBytesToGo(dst []byte, src ref) (int, bool)
+
+// CopyBytesToJS copies bytes from src to the Uint8Array dst.
+// It returns the number of bytes copied, which will be the minimum of the lengths of src and dst.
+// CopyBytesToJS panics if dst is not an Uint8Array.
+func CopyBytesToJS(dst Value, src []byte) int {
+       n, ok := copyBytesToJS(dst.ref, src)
+       if !ok {
+               panic("syscall/js: CopyBytesToJS: expected dst to be an Uint8Array")
+       }
+       return n
+}
+
+func copyBytesToJS(dst ref, src []byte) (int, bool)
index c14d2cc24c90b8c5d08fe29db33218bc5e00975c..7a1e346f55f6ee10d04a2aad96797874135fd837 100644 (file)
@@ -72,10 +72,26 @@ func TestString(t *testing.T) {
                t.Errorf("same value not equal")
        }
 
-       wantInt := "42"
-       o = dummys.Get("someInt")
-       if got := o.String(); got != wantInt {
-               t.Errorf("got %#v, want %#v", got, wantInt)
+       if got, want := js.Undefined().String(), "<undefined>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.Null().String(), "<null>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.ValueOf(true).String(), "<boolean: true>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.ValueOf(42.5).String(), "<number: 42.5>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.Global().Call("Symbol").String(), "<symbol>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.Global().String(), "<object>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := js.Global().Get("setTimeout").String(), "<function>"; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
        }
 }
 
@@ -151,28 +167,6 @@ func TestFrozenObject(t *testing.T) {
        }
 }
 
-func TestTypedArrayOf(t *testing.T) {
-       testTypedArrayOf(t, "[]int8", []int8{0, -42, 0}, -42)
-       testTypedArrayOf(t, "[]int16", []int16{0, -42, 0}, -42)
-       testTypedArrayOf(t, "[]int32", []int32{0, -42, 0}, -42)
-       testTypedArrayOf(t, "[]uint8", []uint8{0, 42, 0}, 42)
-       testTypedArrayOf(t, "[]uint16", []uint16{0, 42, 0}, 42)
-       testTypedArrayOf(t, "[]uint32", []uint32{0, 42, 0}, 42)
-       testTypedArrayOf(t, "[]float32", []float32{0, -42.5, 0}, -42.5)
-       testTypedArrayOf(t, "[]float64", []float64{0, -42.5, 0}, -42.5)
-}
-
-func testTypedArrayOf(t *testing.T, name string, slice interface{}, want float64) {
-       t.Run(name, func(t *testing.T) {
-               a := js.TypedArrayOf(slice)
-               got := a.Index(1).Float()
-               a.Release()
-               if got != want {
-                       t.Errorf("got %#v, want %#v", got, want)
-               }
-       })
-}
-
 func TestNaN(t *testing.T) {
        want := js.ValueOf(math.NaN())
        got := dummys.Get("NaN")
@@ -202,10 +196,30 @@ func TestLength(t *testing.T) {
        }
 }
 
+func TestGet(t *testing.T) {
+       // positive cases get tested per type
+
+       expectValueError(t, func() {
+               dummys.Get("zero").Get("badField")
+       })
+}
+
+func TestSet(t *testing.T) {
+       // positive cases get tested per type
+
+       expectValueError(t, func() {
+               dummys.Get("zero").Set("badField", 42)
+       })
+}
+
 func TestIndex(t *testing.T) {
        if got := dummys.Get("someArray").Index(1).Int(); got != 42 {
                t.Errorf("got %#v, want %#v", got, 42)
        }
+
+       expectValueError(t, func() {
+               dummys.Get("zero").Index(1)
+       })
 }
 
 func TestSetIndex(t *testing.T) {
@@ -213,6 +227,10 @@ func TestSetIndex(t *testing.T) {
        if got := dummys.Get("someArray").Index(2).Int(); got != 99 {
                t.Errorf("got %#v, want %#v", got, 99)
        }
+
+       expectValueError(t, func() {
+               dummys.Get("zero").SetIndex(2, 99)
+       })
 }
 
 func TestCall(t *testing.T) {
@@ -223,6 +241,13 @@ func TestCall(t *testing.T) {
        if got := dummys.Call("add", js.Global().Call("eval", "40"), 2).Int(); got != 42 {
                t.Errorf("got %#v, want %#v", got, 42)
        }
+
+       expectPanic(t, func() {
+               dummys.Call("zero")
+       })
+       expectValueError(t, func() {
+               dummys.Get("zero").Call("badMethod")
+       })
 }
 
 func TestInvoke(t *testing.T) {
@@ -230,12 +255,20 @@ func TestInvoke(t *testing.T) {
        if got := dummys.Get("add").Invoke(i, 2).Int(); got != 42 {
                t.Errorf("got %#v, want %#v", got, 42)
        }
+
+       expectValueError(t, func() {
+               dummys.Get("zero").Invoke()
+       })
 }
 
 func TestNew(t *testing.T) {
        if got := js.Global().Get("Array").New(42).Length(); got != 42 {
                t.Errorf("got %#v, want %#v", got, 42)
        }
+
+       expectValueError(t, func() {
+               dummys.Get("zero").New()
+       })
 }
 
 func TestInstanceOf(t *testing.T) {
@@ -379,3 +412,75 @@ func TestTruthy(t *testing.T) {
                t.Errorf("got %#v, want %#v", got, want)
        }
 }
+
+func expectValueError(t *testing.T, fn func()) {
+       defer func() {
+               err := recover()
+               if _, ok := err.(*js.ValueError); !ok {
+                       t.Errorf("expected *js.ValueError, got %T", err)
+               }
+       }()
+       fn()
+}
+
+func expectPanic(t *testing.T, fn func()) {
+       defer func() {
+               err := recover()
+               if err == nil {
+                       t.Errorf("expected panic")
+               }
+       }()
+       fn()
+}
+
+var copyTests = []struct {
+       srcLen  int
+       dstLen  int
+       copyLen int
+}{
+       {5, 3, 3},
+       {3, 5, 3},
+       {0, 0, 0},
+}
+
+func TestCopyBytesToGo(t *testing.T) {
+       for _, tt := range copyTests {
+               t.Run(fmt.Sprintf("%d-to-%d", tt.srcLen, tt.dstLen), func(t *testing.T) {
+                       src := js.Global().Get("Uint8Array").New(tt.srcLen)
+                       if tt.srcLen >= 2 {
+                               src.SetIndex(1, 42)
+                       }
+                       dst := make([]byte, tt.dstLen)
+
+                       if got, want := js.CopyBytesToGo(dst, src), tt.copyLen; got != want {
+                               t.Errorf("copied %d, want %d", got, want)
+                       }
+                       if tt.dstLen >= 2 {
+                               if got, want := int(dst[1]), 42; got != want {
+                                       t.Errorf("got %d, want %d", got, want)
+                               }
+                       }
+               })
+       }
+}
+
+func TestCopyBytesToJS(t *testing.T) {
+       for _, tt := range copyTests {
+               t.Run(fmt.Sprintf("%d-to-%d", tt.srcLen, tt.dstLen), func(t *testing.T) {
+                       src := make([]byte, tt.srcLen)
+                       if tt.srcLen >= 2 {
+                               src[1] = 42
+                       }
+                       dst := js.Global().Get("Uint8Array").New(tt.dstLen)
+
+                       if got, want := js.CopyBytesToJS(dst, src), tt.copyLen; got != want {
+                               t.Errorf("copied %d, want %d", got, want)
+                       }
+                       if tt.dstLen >= 2 {
+                               if got, want := dst.Index(1).Int(), 42; got != want {
+                                       t.Errorf("got %d, want %d", got, want)
+                               }
+                       }
+               })
+       }
+}
diff --git a/libgo/go/syscall/js/typedarray.go b/libgo/go/syscall/js/typedarray.go
deleted file mode 100644 (file)
index aa56cf6..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build js,wasm
-
-package js
-
-import (
-       "sync"
-       "unsafe"
-)
-
-var (
-       int8Array    = Global().Get("Int8Array")
-       int16Array   = Global().Get("Int16Array")
-       int32Array   = Global().Get("Int32Array")
-       uint8Array   = Global().Get("Uint8Array")
-       uint16Array  = Global().Get("Uint16Array")
-       uint32Array  = Global().Get("Uint32Array")
-       float32Array = Global().Get("Float32Array")
-       float64Array = Global().Get("Float64Array")
-)
-
-var _ Wrapper = TypedArray{} // TypedArray must implement Wrapper
-
-// TypedArray represents a JavaScript typed array.
-type TypedArray struct {
-       Value
-}
-
-// Release frees up resources allocated for the typed array.
-// The typed array and its buffer must not be accessed after calling Release.
-func (a TypedArray) Release() {
-       openTypedArraysMutex.Lock()
-       delete(openTypedArrays, a)
-       openTypedArraysMutex.Unlock()
-}
-
-var (
-       openTypedArraysMutex sync.Mutex
-       openTypedArrays      = make(map[TypedArray]interface{})
-)
-
-// TypedArrayOf returns a JavaScript typed array backed by the slice's underlying array.
-//
-// The supported types are []int8, []int16, []int32, []uint8, []uint16, []uint32, []float32 and []float64.
-// Passing an unsupported value causes a panic.
-//
-// TypedArray.Release must be called to free up resources when the typed array will not be used any more.
-func TypedArrayOf(slice interface{}) TypedArray {
-       a := TypedArray{typedArrayOf(slice)}
-       openTypedArraysMutex.Lock()
-       openTypedArrays[a] = slice
-       openTypedArraysMutex.Unlock()
-       return a
-}
-
-func typedArrayOf(slice interface{}) Value {
-       switch slice := slice.(type) {
-       case []int8:
-               if len(slice) == 0 {
-                       return int8Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return int8Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []int16:
-               if len(slice) == 0 {
-                       return int16Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return int16Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []int32:
-               if len(slice) == 0 {
-                       return int32Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return int32Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []uint8:
-               if len(slice) == 0 {
-                       return uint8Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return uint8Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []uint16:
-               if len(slice) == 0 {
-                       return uint16Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return uint16Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []uint32:
-               if len(slice) == 0 {
-                       return uint32Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return uint32Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []float32:
-               if len(slice) == 0 {
-                       return float32Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return float32Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       case []float64:
-               if len(slice) == 0 {
-                       return float64Array.New(memory.Get("buffer"), 0, 0)
-               }
-               return float64Array.New(memory.Get("buffer"), unsafe.Pointer(&slice[0]), len(slice))
-       default:
-               panic("TypedArrayOf: not a supported slice")
-       }
-}
index 75273e338c08e94722f1f014d6ea89c7171e241d..dd74417708ec2c9983fe1e8a02282547bd279608 100644 (file)
@@ -18,15 +18,18 @@ func cmsgAlignOf(salen int) int {
        salign := int(sizeofPtr)
 
        switch runtime.GOOS {
-       case "darwin", "dragonfly", "solaris":
+       case "aix":
+               // There is no alignment on AIX.
+               salign = 1
+       case "darwin", "dragonfly", "illumos", "solaris":
                // NOTE: It seems like 64-bit Darwin, DragonFly BSD and
                // Solaris kernels still require 32-bit aligned access to
                // network subsystem.
                if sizeofPtr == 8 {
                        salign = 4
                }
-       case "openbsd":
-               // OpenBSD armv7 requires 64-bit alignment.
+       case "netbsd", "openbsd":
+               // NetBSD and OpenBSD armv7 require 64-bit alignment.
                if runtime.GOARCH == "arm" {
                        salign = 8
                }
index d3ff6363ae42d5a51840dc7d8b1a983a867a9560..f42679d2e197431cb5e3619bbd6a035a94661890 100644 (file)
@@ -310,7 +310,11 @@ func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
 }
 
 func SetsockoptString(fd, level, opt int, s string) (err error) {
-       return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), Socklen_t(len(s)))
+       var p unsafe.Pointer
+       if len(s) > 0 {
+               p = unsafe.Pointer(&[]byte(s)[0])
+       }
+       return setsockopt(fd, level, opt, p, Socklen_t(len(s)))
 }
 
 //sys  recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *Socklen_t) (n int, err error)
index 810572f58a9ac51d2a4002870430d3dbe75bcbee..b0f5c46bfc041e886a446721c3541b77a94c9243 100644 (file)
@@ -4,6 +4,8 @@
 
 package syscall
 
+import "internal/oserror"
+
 // An Errno is an unsigned number describing an error condition.
 // It implements the error interface.  The zero Errno is by convention
 // a non-error, so code to convert from Errno to error should use:
@@ -17,6 +19,22 @@ func (e Errno) Error() string {
        return Errstr(int(e))
 }
 
+func (e Errno) Is(target error) bool {
+       switch target {
+       case oserror.ErrTemporary:
+               return e.Temporary()
+       case oserror.ErrTimeout:
+               return e.Timeout()
+       case oserror.ErrPermission:
+               return e == EACCES || e == EPERM
+       case oserror.ErrExist:
+               return e == EEXIST || e == ENOTEMPTY
+       case oserror.ErrNotExist:
+               return e == ENOENT
+       }
+       return false
+}
+
 func (e Errno) Temporary() bool {
        return e == EINTR || e == EMFILE || e.Timeout()
 }
index 2e1a9ec9f1fef01cdd7019844986a1f153577a66..99f9a935fe5ff9b1d782d956daad5b9ac0af19a5 100644 (file)
@@ -7,6 +7,7 @@
 package syscall
 
 import (
+       "internal/oserror"
        "sync"
        "unsafe"
 )
@@ -55,6 +56,22 @@ func (e Errno) Error() string {
        return "errno " + itoa(int(e))
 }
 
+func (e Errno) Is(target error) bool {
+       switch target {
+       case oserror.ErrTemporary:
+               return e.Temporary()
+       case oserror.ErrTimeout:
+               return e.Timeout()
+       case oserror.ErrPermission:
+               return e == EACCES || e == EPERM
+       case oserror.ErrExist:
+               return e == EEXIST || e == ENOTEMPTY
+       case oserror.ErrNotExist:
+               return e == ENOENT
+       }
+       return false
+}
+
 func (e Errno) Temporary() bool {
        return e == EINTR || e == EMFILE || e.Timeout()
 }
@@ -268,14 +285,45 @@ func Getwd() (wd string, err error) {
        return string(buf[:n]), nil
 }
 
-func Getegid() int                      { return 1 }
-func Geteuid() int                      { return 1 }
-func Getgid() int                       { return 1 }
-func Getgroups() ([]int, error)         { return []int{1}, nil }
-func Getppid() int                      { return 2 }
-func Getpid() int                       { return 3 }
-func Gettimeofday(tv *Timeval) error    { return ENOSYS }
-func Getuid() int                       { return 1 }
+func Getuid() int {
+       return jsProcess.Call("getuid").Int()
+}
+
+func Getgid() int {
+       return jsProcess.Call("getgid").Int()
+}
+
+func Geteuid() int {
+       return jsProcess.Call("geteuid").Int()
+}
+
+func Getegid() int {
+       return jsProcess.Call("getegid").Int()
+}
+
+func Getgroups() ([]int, error) {
+       array := jsProcess.Call("getgroups")
+       groups := make([]int, array.Length())
+       for i := range groups {
+               groups[i] = array.Index(i).Int()
+       }
+       return groups, nil
+}
+
+func Getpid() int {
+       return jsProcess.Get("pid").Int()
+}
+
+func Getppid() int {
+       return jsProcess.Get("ppid").Int()
+}
+
+func Umask(mask int) (oldmask int) {
+       return jsProcess.Call("umask", mask).Int()
+}
+
+func Gettimeofday(tv *Timeval) error { return ENOSYS }
+
 func Kill(pid int, signum Signal) error { return ENOSYS }
 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
        return 0, ENOSYS
index fa3bb30c99215cfc595fb17cc86c13b153fe18ce..70b3467b32490b3f92f3a673ece5ba854ca2867a 100644 (file)
@@ -47,6 +47,4 @@ func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
        return ptrace(PTRACE_POKEUSR_AREA, pid, uintptr(unsafe.Pointer(&parea)), 0)
 }
 
-func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
-       panic("not implemented")
-}
+func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
diff --git a/libgo/go/syscall/syscall_netbsd_arm64.go b/libgo/go/syscall/syscall_netbsd_arm64.go
new file mode 100644 (file)
index 0000000..d15b762
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+func setTimespec(sec, nsec int64) Timespec {
+       return Timespec{Sec: sec, Nsec: nsec}
+}
+
+func setTimeval(sec, usec int64) Timeval {
+       return Timeval{Sec: sec, Usec: int32(usec)}
+}
+
+func SetKevent(k *Kevent_t, fd, mode, flags int) {
+       k.Ident = uint64(fd)
+       k.Filter = uint32(mode)
+       k.Flags = uint32(flags)
+}
+
+func (iov *Iovec) SetLen(length int) {
+       iov.Len = uint64(length)
+}
+
+func (msghdr *Msghdr) SetControllen(length int) {
+       msghdr.Controllen = uint32(length)
+}
+
+func (cmsg *Cmsghdr) SetLen(length int) {
+       cmsg.Len = uint32(length)
+}
diff --git a/libgo/go/syscall/syscall_openbsd_arm64.go b/libgo/go/syscall/syscall_openbsd_arm64.go
new file mode 100644 (file)
index 0000000..46e0193
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+func setTimespec(sec, nsec int64) Timespec {
+       return Timespec{Sec: sec, Nsec: nsec}
+}
+
+func setTimeval(sec, usec int64) Timeval {
+       return Timeval{Sec: sec, Usec: usec}
+}
+
+func SetKevent(k *Kevent_t, fd, mode, flags int) {
+       k.Ident = uint64(fd)
+       k.Filter = int16(mode)
+       k.Flags = uint16(flags)
+}
+
+func (iov *Iovec) SetLen(length int) {
+       iov.Len = uint64(length)
+}
+
+func (msghdr *Msghdr) SetControllen(length int) {
+       msghdr.Controllen = uint32(length)
+}
+
+func (cmsg *Cmsghdr) SetLen(length int) {
+       cmsg.Len = uint32(length)
+}
+
+// RTM_LOCK only exists in OpenBSD 6.3 and earlier.
+const RTM_LOCK = 0x8
+
+// SYS___SYSCTL only exists in OpenBSD 5.8 and earlier, when it was
+// was renamed to SYS_SYSCTL.
+const SYS___SYSCTL = SYS_SYSCTL
diff --git a/libgo/go/syscall/syscall_ptrace_test.go b/libgo/go/syscall/syscall_ptrace_test.go
new file mode 100644 (file)
index 0000000..6b7f54d
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
+package syscall_test
+
+import (
+       "internal/testenv"
+       "os"
+       "os/exec"
+       "syscall"
+       "testing"
+)
+
+func TestExecPtrace(t *testing.T) {
+       testenv.MustHaveExec(t)
+
+       bin, err := exec.LookPath("sh")
+       if err != nil {
+               t.Skipf("skipped because sh is not available")
+       }
+
+       attr := &os.ProcAttr{
+               Sys: &syscall.SysProcAttr{
+                       Ptrace: true,
+               },
+       }
+       proc, err := os.StartProcess(bin, []string{bin}, attr)
+       if err == nil {
+               proc.Kill()
+       }
+       if err != nil && !os.IsPermission(err) {
+               t.Fatalf("StartProcess with ptrace enabled failed: %v", err)
+       }
+}
index ec8f343dccd0bed8aa962561db262281fb3cd49a..37999a2d83d5135288c632b4521d3837c82e7d2a 100644 (file)
@@ -20,10 +20,8 @@ var (
 )
 
 const (
-       darwin64Bit    = runtime.GOOS == "darwin" && sizeofPtr == 8
-       dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8
-       netbsd32Bit    = runtime.GOOS == "netbsd" && sizeofPtr == 4
-       solaris64Bit   = runtime.GOOS == "solaris" && sizeofPtr == 8
+       darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8
+       netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4
 )
 
 // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
index 0341948619486819779abd26b84b1e421ade1f54..da259b997f9763a30a7b78d2aedc4ee5d10b6aa7 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package syscall_test
 
@@ -17,6 +17,7 @@ import (
        "os/exec"
        "path/filepath"
        "runtime"
+       "strconv"
        "syscall"
        "testing"
        "time"
@@ -138,6 +139,26 @@ func TestPassFD(t *testing.T) {
                return
        }
 
+       if runtime.GOOS == "aix" {
+               // Unix network isn't properly working on AIX 7.2 with Technical Level < 2
+               out, err := exec.Command("oslevel", "-s").Output()
+               if err != nil {
+                       t.Skipf("skipping on AIX because oslevel -s failed: %v", err)
+               }
+               if len(out) < len("7200-XX-ZZ-YYMM") { // AIX 7.2, Tech Level XX, Service Pack ZZ, date YYMM
+                       t.Skip("skipping on AIX because oslevel -s hasn't the right length")
+               }
+               aixVer := string(out[:4])
+               tl, err := strconv.Atoi(string(out[5:7]))
+               if err != nil {
+                       t.Skipf("skipping on AIX because oslevel -s output cannot be parsed: %v", err)
+               }
+               if aixVer < "7200" || (aixVer == "7200" && tl < 2) {
+                       t.Skip("skipped on AIX versions previous to 7.2 TL 2")
+               }
+
+       }
+
        tempDir, err := ioutil.TempDir("", "TestPassFD")
        if err != nil {
                t.Fatal(err)
@@ -357,3 +378,11 @@ func TestSeekFailure(t *testing.T) {
                t.Fatalf("Seek(-1, 0, 0) return error with empty message")
        }
 }
+
+func TestSetsockoptString(t *testing.T) {
+       // should not panic on empty string, see issue #31277
+       err := syscall.SetsockoptString(-1, 0, 0, "")
+       if err == nil {
+               t.Fatalf("SetsockoptString: did not fail")
+       }
+}
index 8dd8cbc17e267212925c1c3d875dc6a11cc80acd..0e348be358360f7513e33ec1c62d4d6205a9519f 100644 (file)
@@ -8,23 +8,32 @@ import (
        "flag"
        "fmt"
        "internal/race"
+       "io"
+       "math"
        "os"
        "runtime"
+       "sort"
        "strconv"
        "strings"
        "sync"
        "sync/atomic"
        "time"
+       "unicode"
 )
 
-var matchBenchmarks = flag.String("test.bench", "", "run only benchmarks matching `regexp`")
-var benchTime = benchTimeFlag{d: 1 * time.Second}
-var benchmarkMemory = flag.Bool("test.benchmem", false, "print memory allocations for benchmarks")
-
-func init() {
+func initBenchmarkFlags() {
+       matchBenchmarks = flag.String("test.bench", "", "run only benchmarks matching `regexp`")
+       benchmarkMemory = flag.Bool("test.benchmem", false, "print memory allocations for benchmarks")
        flag.Var(&benchTime, "test.benchtime", "run each benchmark for duration `d`")
 }
 
+var (
+       matchBenchmarks *string
+       benchmarkMemory *bool
+
+       benchTime = benchTimeFlag{d: 1 * time.Second} // changed during test of testing package
+)
+
 type benchTimeFlag struct {
        d time.Duration
        n int
@@ -101,10 +110,12 @@ type B struct {
        // The net total of this test after being run.
        netAllocs uint64
        netBytes  uint64
+       // Extra metrics collected by ReportMetric.
+       extra map[string]float64
 }
 
 // StartTimer starts timing a test. This function is called automatically
-// before a benchmark starts, but it can also used to resume timing after
+// before a benchmark starts, but it can also be used to resume timing after
 // a call to StopTimer.
 func (b *B) StartTimer() {
        if !b.timerOn {
@@ -129,9 +140,19 @@ func (b *B) StopTimer() {
        }
 }
 
-// ResetTimer zeros the elapsed benchmark time and memory allocation counters.
+// ResetTimer zeroes the elapsed benchmark time and memory allocation counters
+// and deletes user-reported metrics.
 // It does not affect whether the timer is running.
 func (b *B) ResetTimer() {
+       if b.extra == nil {
+               // Allocate the extra map before reading memory stats.
+               // Pre-size it to make more allocation unlikely.
+               b.extra = make(map[string]float64, 16)
+       } else {
+               for k := range b.extra {
+                       delete(b.extra, k)
+               }
+       }
        if b.timerOn {
                runtime.ReadMemStats(&memStats)
                b.startAllocs = memStats.Mallocs
@@ -154,13 +175,6 @@ func (b *B) ReportAllocs() {
        b.showAllocResult = true
 }
 
-func (b *B) nsPerOp() int64 {
-       if b.N <= 0 {
-               return 0
-       }
-       return b.duration.Nanoseconds() / int64(b.N)
-}
-
 // runN runs a single benchmark for the specified number of iterations.
 func (b *B) runN(n int) {
        benchmarkLock.Lock()
@@ -183,53 +197,20 @@ func (b *B) runN(n int) {
        }
 }
 
-func min(x, y int) int {
+func min(x, y int64) int64 {
        if x > y {
                return y
        }
        return x
 }
 
-func max(x, y int) int {
+func max(x, y int64) int64 {
        if x < y {
                return y
        }
        return x
 }
 
-// roundDown10 rounds a number down to the nearest power of 10.
-func roundDown10(n int) int {
-       var tens = 0
-       // tens = floor(log_10(n))
-       for n >= 10 {
-               n = n / 10
-               tens++
-       }
-       // result = 10^tens
-       result := 1
-       for i := 0; i < tens; i++ {
-               result *= 10
-       }
-       return result
-}
-
-// roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX].
-func roundUp(n int) int {
-       base := roundDown10(n)
-       switch {
-       case n <= base:
-               return base
-       case n <= (2 * base):
-               return 2 * base
-       case n <= (3 * base):
-               return 3 * base
-       case n <= (5 * base):
-               return 5 * base
-       default:
-               return 10 * base
-       }
-}
-
 // run1 runs the first iteration of benchFunc. It reports whether more
 // iterations of this benchmarks should be run.
 func (b *B) run1() bool {
@@ -312,23 +293,53 @@ func (b *B) launch() {
                b.runN(b.benchTime.n)
        } else {
                d := b.benchTime.d
-               for n := 1; !b.failed && b.duration < d && n < 1e9; {
+               for n := int64(1); !b.failed && b.duration < d && n < 1e9; {
                        last := n
                        // Predict required iterations.
-                       n = int(d.Nanoseconds())
-                       if nsop := b.nsPerOp(); nsop != 0 {
-                               n /= int(nsop)
+                       goalns := d.Nanoseconds()
+                       prevIters := int64(b.N)
+                       prevns := b.duration.Nanoseconds()
+                       if prevns <= 0 {
+                               // Round up, to avoid div by zero.
+                               prevns = 1
                        }
+                       // Order of operations matters.
+                       // For very fast benchmarks, prevIters ~= prevns.
+                       // If you divide first, you get 0 or 1,
+                       // which can hide an order of magnitude in execution time.
+                       // So multiply first, then divide.
+                       n = goalns * prevIters / prevns
                        // Run more iterations than we think we'll need (1.2x).
+                       n += n / 5
                        // Don't grow too fast in case we had timing errors previously.
+                       n = min(n, 100*last)
                        // Be sure to run at least one more than last time.
-                       n = max(min(n+n/5, 100*last), last+1)
-                       // Round up to something easy to read.
-                       n = roundUp(n)
-                       b.runN(n)
+                       n = max(n, last+1)
+                       // Don't run more than 1e9 times. (This also keeps n in int range on 32 bit platforms.)
+                       n = min(n, 1e9)
+                       b.runN(int(n))
                }
        }
-       b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes}
+       b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes, b.extra}
+}
+
+// ReportMetric adds "n unit" to the reported benchmark results.
+// If the metric is per-iteration, the caller should divide by b.N,
+// and by convention units should end in "/op".
+// ReportMetric overrides any previously reported value for the same unit.
+// ReportMetric panics if unit is the empty string or if unit contains
+// any whitespace.
+// If unit is a unit normally reported by the benchmark framework itself
+// (such as "allocs/op"), ReportMetric will override that metric.
+// Setting "ns/op" to 0 will suppress that built-in metric.
+func (b *B) ReportMetric(n float64, unit string) {
+       if unit == "" {
+               panic("metric unit must not be empty")
+       }
+       if strings.IndexFunc(unit, unicode.IsSpace) >= 0 {
+               panic("metric unit must not contain whitespace")
+       }
+       b.extra[unit] = n
 }
 
 // The results of a benchmark run.
@@ -338,56 +349,122 @@ type BenchmarkResult struct {
        Bytes     int64         // Bytes processed in one iteration.
        MemAllocs uint64        // The total number of memory allocations.
        MemBytes  uint64        // The total number of bytes allocated.
+
+       // Extra records additional metrics reported by ReportMetric.
+       Extra map[string]float64
 }
 
+// NsPerOp returns the "ns/op" metric.
 func (r BenchmarkResult) NsPerOp() int64 {
+       if v, ok := r.Extra["ns/op"]; ok {
+               return int64(v)
+       }
        if r.N <= 0 {
                return 0
        }
        return r.T.Nanoseconds() / int64(r.N)
 }
 
+// mbPerSec returns the "MB/s" metric.
 func (r BenchmarkResult) mbPerSec() float64 {
+       if v, ok := r.Extra["MB/s"]; ok {
+               return v
+       }
        if r.Bytes <= 0 || r.T <= 0 || r.N <= 0 {
                return 0
        }
        return (float64(r.Bytes) * float64(r.N) / 1e6) / r.T.Seconds()
 }
 
-// AllocsPerOp returns r.MemAllocs / r.N.
+// AllocsPerOp returns the "allocs/op" metric,
+// which is calculated as r.MemAllocs / r.N.
 func (r BenchmarkResult) AllocsPerOp() int64 {
+       if v, ok := r.Extra["allocs/op"]; ok {
+               return int64(v)
+       }
        if r.N <= 0 {
                return 0
        }
        return int64(r.MemAllocs) / int64(r.N)
 }
 
-// AllocedBytesPerOp returns r.MemBytes / r.N.
+// AllocedBytesPerOp returns the "B/op" metric,
+// which is calculated as r.MemBytes / r.N.
 func (r BenchmarkResult) AllocedBytesPerOp() int64 {
+       if v, ok := r.Extra["B/op"]; ok {
+               return int64(v)
+       }
        if r.N <= 0 {
                return 0
        }
        return int64(r.MemBytes) / int64(r.N)
 }
 
+// String returns a summary of the benchmark results.
+// It follows the benchmark result line format from
+// https://golang.org/design/14313-benchmark-format, not including the
+// benchmark name.
+// Extra metrics override built-in metrics of the same name.
+// String does not include allocs/op or B/op, since those are reported
+// by MemString.
 func (r BenchmarkResult) String() string {
-       mbs := r.mbPerSec()
-       mb := ""
-       if mbs != 0 {
-               mb = fmt.Sprintf("\t%7.2f MB/s", mbs)
-       }
-       nsop := r.NsPerOp()
-       ns := fmt.Sprintf("%10d ns/op", nsop)
-       if r.N > 0 && nsop < 100 {
-               // The format specifiers here make sure that
-               // the ones digits line up for all three possible formats.
-               if nsop < 10 {
-                       ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
-               } else {
-                       ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
+       buf := new(strings.Builder)
+       fmt.Fprintf(buf, "%8d", r.N)
+
+       // Get ns/op as a float.
+       ns, ok := r.Extra["ns/op"]
+       if !ok {
+               ns = float64(r.T.Nanoseconds()) / float64(r.N)
+       }
+       if ns != 0 {
+               buf.WriteByte('\t')
+               prettyPrint(buf, ns, "ns/op")
+       }
+
+       if mbs := r.mbPerSec(); mbs != 0 {
+               fmt.Fprintf(buf, "\t%7.2f MB/s", mbs)
+       }
+
+       // Print extra metrics that aren't represented in the standard
+       // metrics.
+       var extraKeys []string
+       for k := range r.Extra {
+               switch k {
+               case "ns/op", "MB/s", "B/op", "allocs/op":
+                       // Built-in metrics reported elsewhere.
+                       continue
                }
+               extraKeys = append(extraKeys, k)
+       }
+       sort.Strings(extraKeys)
+       for _, k := range extraKeys {
+               buf.WriteByte('\t')
+               prettyPrint(buf, r.Extra[k], k)
+       }
+       return buf.String()
+}
+
+func prettyPrint(w io.Writer, x float64, unit string) {
+       // Print all numbers with 10 places before the decimal point
+       // and small numbers with three sig figs.
+       var format string
+       switch y := math.Abs(x); {
+       case y == 0 || y >= 99.95:
+               format = "%10.0f %s"
+       case y >= 9.995:
+               format = "%12.1f %s"
+       case y >= 0.9995:
+               format = "%13.2f %s"
+       case y >= 0.09995:
+               format = "%14.3f %s"
+       case y >= 0.009995:
+               format = "%15.4f %s"
+       case y >= 0.0009995:
+               format = "%16.5f %s"
+       default:
+               format = "%17.6f %s"
        }
-       return fmt.Sprintf("%8d\t%s%s", r.N, ns, mb)
+       fmt.Fprintf(w, format, x, unit)
 }
 
 // MemString returns r.AllocedBytesPerOp and r.AllocsPerOp in the same format as 'go test'.
@@ -680,9 +757,12 @@ func (b *B) SetParallelism(p int) {
        }
 }
 
-// Benchmark benchmarks a single function. Useful for creating
+// Benchmark benchmarks a single function. It is useful for creating
 // custom benchmarks that do not use the "go test" command.
 //
+// If f depends on testing flags, then Init must be used to register
+// those flags before calling Benchmark and before calling flag.Parse.
+//
 // If f calls Run, the result will be an estimate of running all its
 // subbenchmarks that don't call Run in sequence in a single benchmark.
 func Benchmark(f func(b *B)) BenchmarkResult {
index 431bb537bd5b1b321dca8d843e8fbd28281aec5d..1434c2613f138cc5ce00b0830f15a4ac6b13dc51 100644 (file)
@@ -7,63 +7,70 @@ package testing_test
 import (
        "bytes"
        "runtime"
+       "sort"
+       "strings"
        "sync/atomic"
        "testing"
        "text/template"
+       "time"
 )
 
-var roundDownTests = []struct {
-       v, expected int
+var prettyPrintTests = []struct {
+       v        float64
+       expected string
 }{
-       {1, 1},
-       {9, 1},
-       {10, 10},
-       {11, 10},
-       {100, 100},
-       {101, 100},
-       {999, 100},
-       {1000, 1000},
-       {1001, 1000},
+       {0, "         0 x"},
+       {1234.1, "      1234 x"},
+       {-1234.1, "     -1234 x"},
+       {99.950001, "       100 x"},
+       {99.949999, "        99.9 x"},
+       {9.9950001, "        10.0 x"},
+       {9.9949999, "         9.99 x"},
+       {-9.9949999, "        -9.99 x"},
+       {0.0099950001, "         0.0100 x"},
+       {0.0099949999, "         0.00999 x"},
 }
 
-func TestRoundDown10(t *testing.T) {
-       for _, tt := range roundDownTests {
-               actual := testing.RoundDown10(tt.v)
-               if tt.expected != actual {
-                       t.Errorf("roundDown10(%d): expected %d, actual %d", tt.v, tt.expected, actual)
+func TestPrettyPrint(t *testing.T) {
+       for _, tt := range prettyPrintTests {
+               buf := new(strings.Builder)
+               testing.PrettyPrint(buf, tt.v, "x")
+               if tt.expected != buf.String() {
+                       t.Errorf("prettyPrint(%v): expected %q, actual %q", tt.v, tt.expected, buf.String())
                }
        }
 }
 
-var roundUpTests = []struct {
-       v, expected int
-}{
-       {0, 1},
-       {1, 1},
-       {2, 2},
-       {3, 3},
-       {5, 5},
-       {9, 10},
-       {999, 1000},
-       {1000, 1000},
-       {1400, 2000},
-       {1700, 2000},
-       {2700, 3000},
-       {4999, 5000},
-       {5000, 5000},
-       {5001, 10000},
-}
+func TestResultString(t *testing.T) {
+       // Test fractional ns/op handling
+       r := testing.BenchmarkResult{
+               N: 100,
+               T: 240 * time.Nanosecond,
+       }
+       if r.NsPerOp() != 2 {
+               t.Errorf("NsPerOp: expected 2, actual %v", r.NsPerOp())
+       }
+       if want, got := "     100\t         2.40 ns/op", r.String(); want != got {
+               t.Errorf("String: expected %q, actual %q", want, got)
+       }
 
-func TestRoundUp(t *testing.T) {
-       for _, tt := range roundUpTests {
-               actual := testing.RoundUp(tt.v)
-               if tt.expected != actual {
-                       t.Errorf("roundUp(%d): expected %d, actual %d", tt.v, tt.expected, actual)
-               }
+       // Test sub-1 ns/op (issue #31005)
+       r.T = 40 * time.Nanosecond
+       if want, got := "     100\t         0.400 ns/op", r.String(); want != got {
+               t.Errorf("String: expected %q, actual %q", want, got)
+       }
+
+       // Test 0 ns/op
+       r.T = 0
+       if want, got := "     100", r.String(); want != got {
+               t.Errorf("String: expected %q, actual %q", want, got)
        }
 }
 
 func TestRunParallel(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in short mode")
+       }
        testing.Benchmark(func(b *testing.B) {
                procs := uint32(0)
                iters := uint64(0)
@@ -111,3 +118,38 @@ func ExampleB_RunParallel() {
                })
        })
 }
+
+func TestReportMetric(t *testing.T) {
+       res := testing.Benchmark(func(b *testing.B) {
+               b.ReportMetric(12345, "ns/op")
+               b.ReportMetric(0.2, "frobs/op")
+       })
+       // Test built-in overriding.
+       if res.NsPerOp() != 12345 {
+               t.Errorf("NsPerOp: expected %v, actual %v", 12345, res.NsPerOp())
+       }
+       // Test stringing.
+       res.N = 1 // Make the output stable
+       want := "       1\t     12345 ns/op\t         0.200 frobs/op"
+       if want != res.String() {
+               t.Errorf("expected %q, actual %q", want, res.String())
+       }
+}
+
+func ExampleB_ReportMetric() {
+       // This reports a custom benchmark metric relevant to a
+       // specific algorithm (in this case, sorting).
+       testing.Benchmark(func(b *testing.B) {
+               var compares int64
+               for i := 0; i < b.N; i++ {
+                       s := []int{5, 4, 3, 2, 1}
+                       sort.Slice(s, func(i, j int) bool {
+                               compares++
+                               return s[i] < s[j]
+                       })
+               }
+               // This metric is per-operation, so divide by b.N and
+               // report it as a "/op" unit.
+               b.ReportMetric(float64(compares)/float64(b.N), "compares/op")
+       })
+}
index 17c03f5e5ef69fac5202c0306270e958e23be6ef..62ee5ac9c0fb05394968f0589fa8054dcd2c0853 100644 (file)
@@ -109,7 +109,8 @@ func coverReport() {
                }
        }
        if total == 0 {
-               total = 1
+               fmt.Println("coverage: [no statements]")
+               return
        }
        fmt.Printf("coverage: %.1f%% of statements%s\n", 100*float64(active)/float64(total), cover.CoveredPackages)
 }
index f4beb76f5f0d1f42bfffdc630d480940d4170fa0..c122121289d3799982f349c123ba42a61aa5f9f1 100644 (file)
@@ -6,7 +6,6 @@ package testing
 
 import (
        "fmt"
-       "io"
        "os"
        "sort"
        "strings"
@@ -56,68 +55,39 @@ func sortLines(output string) string {
        return strings.Join(lines, "\n")
 }
 
-func runExample(eg InternalExample) (ok bool) {
-       if *chatty {
-               fmt.Printf("=== RUN   %s\n", eg.Name)
-       }
-
-       // Capture stdout.
-       stdout := os.Stdout
-       r, w, err := os.Pipe()
-       if err != nil {
-               fmt.Fprintln(os.Stderr, err)
-               os.Exit(1)
-       }
-       os.Stdout = w
-       outC := make(chan string)
-       go func() {
-               var buf strings.Builder
-               _, err := io.Copy(&buf, r)
-               r.Close()
-               if err != nil {
-                       fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err)
-                       os.Exit(1)
+// processRunResult computes a summary and status of the result of running an example test.
+// stdout is the captured output from stdout of the test.
+// recovered is the result of invoking recover after running the test, in case it panicked.
+//
+// If stdout doesn't match the expected output or if recovered is non-nil, it'll print the cause of failure to stdout.
+// If the test is chatty/verbose, it'll print a success message to stdout.
+// If recovered is non-nil, it'll panic with that value.
+func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, recovered interface{}) (passed bool) {
+       passed = true
+
+       dstr := fmtDuration(timeSpent)
+       var fail string
+       got := strings.TrimSpace(stdout)
+       want := strings.TrimSpace(eg.Output)
+       if eg.Unordered {
+               if sortLines(got) != sortLines(want) && recovered == nil {
+                       fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", stdout, eg.Output)
                }
-               outC <- buf.String()
-       }()
-
-       start := time.Now()
-       ok = true
-
-       // Clean up in a deferred call so we can recover if the example panics.
-       defer func() {
-               dstr := fmtDuration(time.Since(start))
-
-               // Close pipe, restore stdout, get output.
-               w.Close()
-               os.Stdout = stdout
-               out := <-outC
-
-               var fail string
-               err := recover()
-               got := strings.TrimSpace(out)
-               want := strings.TrimSpace(eg.Output)
-               if eg.Unordered {
-                       if sortLines(got) != sortLines(want) && err == nil {
-                               fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", out, eg.Output)
-                       }
-               } else {
-                       if got != want && err == nil {
-                               fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want)
-                       }
-               }
-               if fail != "" || err != nil {
-                       fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
-                       ok = false
-               } else if *chatty {
-                       fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
-               }
-               if err != nil {
-                       panic(err)
+       } else {
+               if got != want && recovered == nil {
+                       fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want)
                }
-       }()
+       }
+       if fail != "" || recovered != nil {
+               fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
+               passed = false
+       } else if *chatty {
+               fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
+       }
+       if recovered != nil {
+               // Propagate the previously recovered result, by panicking.
+               panic(recovered)
+       }
 
-       // Run example.
-       eg.F()
        return
 }
index 89781b439f42328915480b55c1de9e0ffb65ddea..0022491ecd9e479b96ebaea62f3707dfd409fee2 100644 (file)
@@ -4,7 +4,4 @@
 
 package testing
 
-var (
-       RoundDown10 = roundDown10
-       RoundUp     = roundUp
-)
+var PrettyPrint = prettyPrint
index 14512e963244bf07b1d09d945af5689a5be3756b..af08dd768a5284f91c149861dff2ecd329de525d 100644 (file)
@@ -98,7 +98,6 @@ func (l *testLog) add(op, name string) {
 }
 
 var log testLog
-var didSetLogger bool
 
 func (TestDeps) StartTestLog(w io.Writer) {
        log.mu.Lock()
index 0457fc7571b9cec554b7ae6c9e84d96d1b38c709..c01647ecf0c911cdffbebe601975455dd94f6953 100644 (file)
@@ -180,7 +180,8 @@ type Config struct {
        MaxCount int
        // MaxCountScale is a non-negative scale factor applied to the
        // default maximum.
-       // If zero, the default is unchanged.
+       // A count of zero implies the default, which is usually 100
+       // but can be set by the -quickchecks flag.
        MaxCountScale float64
        // Rand specifies a source of random numbers.
        // If nil, a default pseudo-random source will be used.
index 4246cd1d3ba7fa927f1871350be9f1dd5b714f71..9df6dd46791b85f0e2eb9dd769b008f0717e2785 100644 (file)
@@ -319,7 +319,7 @@ func TestInt64(t *testing.T) {
                }
                return true
        }
-       cfg := &Config{MaxCount: 100000}
+       cfg := &Config{MaxCount: 10000}
        Check(f, cfg)
        if uint64(lo)>>62 == 0 || uint64(hi)>>62 == 0 {
                t.Errorf("int64 returned range %#016x,%#016x; does not look like full range", lo, hi)
diff --git a/libgo/go/testing/run_example.go b/libgo/go/testing/run_example.go
new file mode 100644 (file)
index 0000000..10bde49
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !js
+
+// TODO(@musiol, @odeke-em): re-unify this entire file back into
+// example.go when js/wasm gets an os.Pipe implementation
+// and no longer needs this separation.
+
+package testing
+
+import (
+       "fmt"
+       "io"
+       "os"
+       "strings"
+       "time"
+)
+
+func runExample(eg InternalExample) (ok bool) {
+       if *chatty {
+               fmt.Printf("=== RUN   %s\n", eg.Name)
+       }
+
+       // Capture stdout.
+       stdout := os.Stdout
+       r, w, err := os.Pipe()
+       if err != nil {
+               fmt.Fprintln(os.Stderr, err)
+               os.Exit(1)
+       }
+       os.Stdout = w
+       outC := make(chan string)
+       go func() {
+               var buf strings.Builder
+               _, err := io.Copy(&buf, r)
+               r.Close()
+               if err != nil {
+                       fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err)
+                       os.Exit(1)
+               }
+               outC <- buf.String()
+       }()
+
+       start := time.Now()
+
+       // Clean up in a deferred call so we can recover if the example panics.
+       defer func() {
+               timeSpent := time.Since(start)
+
+               // Close pipe, restore stdout, get output.
+               w.Close()
+               os.Stdout = stdout
+               out := <-outC
+
+               err := recover()
+               ok = eg.processRunResult(out, timeSpent, err)
+       }()
+
+       // Run example.
+       eg.F()
+       return
+}
diff --git a/libgo/go/testing/run_example_js.go b/libgo/go/testing/run_example_js.go
new file mode 100644 (file)
index 0000000..472e0c5
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build js
+
+package testing
+
+import (
+       "fmt"
+       "io"
+       "os"
+       "strings"
+       "time"
+)
+
+// TODO(@musiol, @odeke-em): unify this code back into
+// example.go when js/wasm gets an os.Pipe implementation.
+func runExample(eg InternalExample) (ok bool) {
+       if *chatty {
+               fmt.Printf("=== RUN   %s\n", eg.Name)
+       }
+
+       // Capture stdout to temporary file. We're not using
+       // os.Pipe because it is not supported on js/wasm.
+       stdout := os.Stdout
+       f := createTempFile(eg.Name)
+       os.Stdout = f
+       start := time.Now()
+
+       // Clean up in a deferred call so we can recover if the example panics.
+       defer func() {
+               timeSpent := time.Since(start)
+
+               // Restore stdout, get output and remove temporary file.
+               os.Stdout = stdout
+               var buf strings.Builder
+               _, seekErr := f.Seek(0, os.SEEK_SET)
+               _, readErr := io.Copy(&buf, f)
+               out := buf.String()
+               f.Close()
+               os.Remove(f.Name())
+               if seekErr != nil {
+                       fmt.Fprintf(os.Stderr, "testing: seek temp file: %v\n", seekErr)
+                       os.Exit(1)
+               }
+               if readErr != nil {
+                       fmt.Fprintf(os.Stderr, "testing: read temp file: %v\n", readErr)
+                       os.Exit(1)
+               }
+
+               err := recover()
+               ok = eg.processRunResult(out, timeSpent, err)
+       }()
+
+       // Run example.
+       eg.F()
+       return
+}
+
+func createTempFile(exampleName string) *os.File {
+       for i := 0; ; i++ {
+               name := fmt.Sprintf("%s/go-example-stdout-%s-%d.txt", os.TempDir(), exampleName, i)
+               f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
+               if err != nil {
+                       if os.IsExist(err) {
+                               continue
+                       }
+                       fmt.Fprintf(os.Stderr, "testing: open temp file: %v\n", err)
+                       os.Exit(1)
+               }
+               return f
+       }
+}
index 5a6d51be592f99dfad5cae94fe445715b375597f..cc5dd2f3cfbfc2144cc15eddb32e338cb1528da7 100644 (file)
@@ -16,7 +16,7 @@ import (
 )
 
 func init() {
-       // Make benchmark tests run 10* faster.
+       // Make benchmark tests run 10x faster.
        benchTime.d = 100 * time.Millisecond
 }
 
@@ -756,6 +756,9 @@ func TestLogAfterComplete(t *T) {
 }
 
 func TestBenchmark(t *T) {
+       if Short() {
+               t.Skip("skipping in short mode")
+       }
        res := Benchmark(func(b *B) {
                for i := 0; i < 5; i++ {
                        b.Run("", func(b *B) {
index 3068630e8a97685c686ca988913d58d9693ec308..339df13f439ada9cae4df878f3e664607128626a 100644 (file)
@@ -249,7 +249,18 @@ import (
        "time"
 )
 
-var (
+var initRan bool
+
+// Init registers testing flags. These flags are automatically registered by
+// the "go test" command before running test functions, so Init is only needed
+// when calling functions such as Benchmark without using "go test".
+//
+// Init has no effect if it was already called.
+func Init() {
+       if initRan {
+               return
+       }
+       initRan = true
        // The short flag requests that tests run more quickly, but its functionality
        // is provided by test writers themselves. The testing package is just its
        // home. The all.bash installation script sets it to make installation more
@@ -265,25 +276,50 @@ var (
        // this flag lets "go test" tell the binary to write the files in the directory where
        // the "go test" command is run.
        outputDir = flag.String("test.outputdir", "", "write profiles to `dir`")
-
        // Report as tests are run; default is silent for success.
-       chatty               = flag.Bool("test.v", false, "verbose: print additional output")
-       count                = flag.Uint("test.count", 1, "run tests and benchmarks `n` times")
-       coverProfile         = flag.String("test.coverprofile", "", "write a coverage profile to `file`")
-       matchList            = flag.String("test.list", "", "list tests, examples, and benchmarks matching `regexp` then exit")
-       match                = flag.String("test.run", "", "run only tests and examples matching `regexp`")
-       memProfile           = flag.String("test.memprofile", "", "write an allocation profile to `file`")
-       memProfileRate       = flag.Int("test.memprofilerate", 0, "set memory allocation profiling `rate` (see runtime.MemProfileRate)")
-       cpuProfile           = flag.String("test.cpuprofile", "", "write a cpu profile to `file`")
-       blockProfile         = flag.String("test.blockprofile", "", "write a goroutine blocking profile to `file`")
-       blockProfileRate     = flag.Int("test.blockprofilerate", 1, "set blocking profile `rate` (see runtime.SetBlockProfileRate)")
-       mutexProfile         = flag.String("test.mutexprofile", "", "write a mutex contention profile to the named file after execution")
+       chatty = flag.Bool("test.v", false, "verbose: print additional output")
+       count = flag.Uint("test.count", 1, "run tests and benchmarks `n` times")
+       coverProfile = flag.String("test.coverprofile", "", "write a coverage profile to `file`")
+       matchList = flag.String("test.list", "", "list tests, examples, and benchmarks matching `regexp` then exit")
+       match = flag.String("test.run", "", "run only tests and examples matching `regexp`")
+       memProfile = flag.String("test.memprofile", "", "write an allocation profile to `file`")
+       memProfileRate = flag.Int("test.memprofilerate", 0, "set memory allocation profiling `rate` (see runtime.MemProfileRate)")
+       cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to `file`")
+       blockProfile = flag.String("test.blockprofile", "", "write a goroutine blocking profile to `file`")
+       blockProfileRate = flag.Int("test.blockprofilerate", 1, "set blocking profile `rate` (see runtime.SetBlockProfileRate)")
+       mutexProfile = flag.String("test.mutexprofile", "", "write a mutex contention profile to the named file after execution")
        mutexProfileFraction = flag.Int("test.mutexprofilefraction", 1, "if >= 0, calls runtime.SetMutexProfileFraction()")
-       traceFile            = flag.String("test.trace", "", "write an execution trace to `file`")
-       timeout              = flag.Duration("test.timeout", 0, "panic test binary after duration `d` (default 0, timeout disabled)")
-       cpuListStr           = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with")
-       parallel             = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel")
-       testlog              = flag.String("test.testlogfile", "", "write test action log to `file` (for use only by cmd/go)")
+       traceFile = flag.String("test.trace", "", "write an execution trace to `file`")
+       timeout = flag.Duration("test.timeout", 0, "panic test binary after duration `d` (default 0, timeout disabled)")
+       cpuListStr = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with")
+       parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel")
+       testlog = flag.String("test.testlogfile", "", "write test action log to `file` (for use only by cmd/go)")
+
+       initBenchmarkFlags()
+}
+
+var (
+       // Flags, registered during Init.
+       short                *bool
+       failFast             *bool
+       outputDir            *string
+       chatty               *bool
+       count                *uint
+       coverProfile         *string
+       matchList            *string
+       match                *string
+       memProfile           *string
+       memProfileRate       *int
+       cpuProfile           *string
+       blockProfile         *string
+       blockProfileRate     *int
+       mutexProfile         *string
+       mutexProfileFraction *int
+       traceFile            *string
+       timeout              *time.Duration
+       cpuListStr           *string
+       parallel             *int
+       testlog              *string
 
        haveExamples bool // are there examples?
 
@@ -328,11 +364,12 @@ type common struct {
 
 // Short reports whether the -test.short flag is set.
 func Short() bool {
-       // Catch code that calls this from TestMain without first
-       // calling flag.Parse. This shouldn't really be a panic
+       if short == nil {
+               panic("testing: Short called before Init")
+       }
+       // Catch code that calls this from TestMain without first calling flag.Parse.
        if !flag.Parsed() {
-               fmt.Fprintf(os.Stderr, "testing: testing.Short called before flag.Parse\n")
-               os.Exit(2)
+               panic("testing: Short called before Parse")
        }
 
        return *short
@@ -347,6 +384,13 @@ func CoverMode() string {
 
 // Verbose reports whether the -test.v flag is set.
 func Verbose() bool {
+       // Same as in Short.
+       if chatty == nil {
+               panic("testing: Verbose called before Init")
+       }
+       if !flag.Parsed() {
+               panic("testing: Verbose called before Parse")
+       }
        return *chatty
 }
 
@@ -614,7 +658,7 @@ func (c *common) log(s string) {
        c.logDepth(s, 3) // logDepth + log + public function
 }
 
-// logDepth generates the output. At an arbitary stack depth
+// logDepth generates the output at an arbitrary stack depth.
 func (c *common) logDepth(s string, depth int) {
        c.mu.Lock()
        defer c.mu.Unlock()
@@ -727,7 +771,7 @@ func (c *common) Helper() {
 // for the caller after skip frames (where 0 means the current function).
 func callerName(skip int) string {
        // Make room for the skip PC.
-       var pc [2]uintptr
+       var pc [1]uintptr
        n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName
        if n == 0 {
                panic("testing: zero callers found")
@@ -1031,6 +1075,12 @@ type testDeps interface {
 // It is not meant to be called directly and is not subject to the Go 1 compatibility document.
 // It may change signature from release to release.
 func MainStart(deps testDeps, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
+       // In most cases, Init has already been called by the testinginit code
+       // that 'go test' injects into test packages.
+       // Call it again here to handle cases such as:
+       // - test packages that don't import "testing" (such as example-only packages)
+       // - direct use of MainStart (though that isn't well-supported)
+       Init()
        return &M{
                deps:       deps,
                tests:      tests,
@@ -1287,7 +1337,7 @@ func (m *M) writeProfiles() {
                        os.Exit(2)
                }
                if err = m.deps.WriteProfileTo("mutex", f, 0); err != nil {
-                       fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *blockProfile, err)
+                       fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *mutexProfile, err)
                        os.Exit(2)
                }
                f.Close()
@@ -1303,20 +1353,18 @@ func toOutputDir(path string) string {
        if *outputDir == "" || path == "" {
                return path
        }
-       if runtime.GOOS == "windows" {
-               // On Windows, it's clumsy, but we can be almost always correct
-               // by just looking for a drive letter and a colon.
-               // Absolute paths always have a drive letter (ignoring UNC).
-               // Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear
-               // what to do, but even then path/filepath doesn't help.
-               // TODO: Worth doing better? Probably not, because we're here only
-               // under the management of go test.
-               if len(path) >= 2 {
-                       letter, colon := path[0], path[1]
-                       if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' {
-                               // If path starts with a drive letter we're stuck with it regardless.
-                               return path
-                       }
+       // On Windows, it's clumsy, but we can be almost always correct
+       // by just looking for a drive letter and a colon.
+       // Absolute paths always have a drive letter (ignoring UNC).
+       // Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear
+       // what to do, but even then path/filepath doesn't help.
+       // TODO: Worth doing better? Probably not, because we're here only
+       // under the management of go test.
+       if runtime.GOOS == "windows" && len(path) >= 2 {
+               letter, colon := path[0], path[1]
+               if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' {
+                       // If path starts with a drive letter we're stuck with it regardless.
+                       return path
                }
        }
        if os.IsPathSeparator(path[0]) {
index 893a4edbaf92f1bd5b5e070b98075ed16f17740f..fa5a0cd70de80ebd7978a064bdf21ad3a3381d38 100644 (file)
@@ -59,15 +59,16 @@ func (pos Position) String() string {
 // "foo" is scanned as the token sequence '"' Ident '"'.
 //
 const (
-       ScanIdents     = 1 << -Ident
-       ScanInts       = 1 << -Int
-       ScanFloats     = 1 << -Float // includes Ints
-       ScanChars      = 1 << -Char
-       ScanStrings    = 1 << -String
-       ScanRawStrings = 1 << -RawString
-       ScanComments   = 1 << -Comment
-       SkipComments   = 1 << -skipComment // if set with ScanComments, comments become white space
-       GoTokens       = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments
+       ScanIdents           = 1 << -Ident
+       ScanInts             = 1 << -Int
+       ScanFloats           = 1 << -Float // includes Ints and hexadecimal floats
+       ScanChars            = 1 << -Char
+       ScanStrings          = 1 << -String
+       ScanRawStrings       = 1 << -RawString
+       ScanComments         = 1 << -Comment
+       SkipComments         = 1 << -skipComment          // if set with ScanComments, comments become white space
+       AllowDigitSeparators = 1 << -allowDigitSeparators // if set, number literals may contain underscores as digit separators
+       GoTokens             = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments | AllowDigitSeparators
 )
 
 // The result of Scan is one of these tokens or a Unicode character.
@@ -80,7 +81,10 @@ const (
        String
        RawString
        Comment
+
+       // internal use only
        skipComment
+       allowDigitSeparators
 )
 
 var tokenString = map[rune]string{
@@ -266,7 +270,7 @@ func (s *Scanner) next() rune {
                                s.srcPos += width
                                s.lastCharLen = width
                                s.column++
-                               s.error("illegal UTF-8 encoding")
+                               s.error("invalid UTF-8 encoding")
                                return ch
                        }
                }
@@ -281,7 +285,7 @@ func (s *Scanner) next() rune {
        switch ch {
        case 0:
                // for compatibility with other tools
-               s.error("illegal character NUL")
+               s.error("invalid character NUL")
        case '\n':
                s.line++
                s.lastLineLen = s.column
@@ -322,6 +326,7 @@ func (s *Scanner) Peek() rune {
 }
 
 func (s *Scanner) error(msg string) {
+       s.tokEnd = s.srcPos - s.lastCharLen // make sure token text is terminated
        s.ErrorCount++
        if s.Error != nil {
                s.Error(s, msg)
@@ -334,6 +339,10 @@ func (s *Scanner) error(msg string) {
        fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg)
 }
 
+func (s *Scanner) errorf(format string, args ...interface{}) {
+       s.error(fmt.Sprintf(format, args...))
+}
+
 func (s *Scanner) isIdentRune(ch rune, i int) bool {
        if s.IsIdentRune != nil {
                return s.IsIdentRune(ch, i)
@@ -350,95 +359,191 @@ func (s *Scanner) scanIdentifier() rune {
        return ch
 }
 
-func digitVal(ch rune) int {
-       switch {
-       case '0' <= ch && ch <= '9':
-               return int(ch - '0')
-       case 'a' <= ch && ch <= 'f':
-               return int(ch - 'a' + 10)
-       case 'A' <= ch && ch <= 'F':
-               return int(ch - 'A' + 10)
+func lower(ch rune) rune     { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter
+func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' }
+func isHex(ch rune) bool     { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' }
+
+// digits accepts the sequence { digit } (if AllowDigitSeparators is not set)
+// or { digit | '_' } (if AllowDigitSeparators is set), starting with ch0.
+// If base <= 10, digits accepts any decimal digit but records
+// the first invalid digit >= base in *invalid if *invalid == 0.
+// digits returns the first rune that is not part of the sequence
+// anymore, and a bitset describing whether the sequence contained
+// digits (bit 0 is set), or separators '_' (bit 1 is set).
+func (s *Scanner) digits(ch0 rune, base int, invalid *rune) (ch rune, digsep int) {
+       ch = ch0
+       if base <= 10 {
+               max := rune('0' + base)
+               for isDecimal(ch) || ch == '_' && s.Mode&AllowDigitSeparators != 0 {
+                       ds := 1
+                       if ch == '_' {
+                               ds = 2
+                       } else if ch >= max && *invalid == 0 {
+                               *invalid = ch
+                       }
+                       digsep |= ds
+                       ch = s.next()
+               }
+       } else {
+               for isHex(ch) || ch == '_' && s.Mode&AllowDigitSeparators != 0 {
+                       ds := 1
+                       if ch == '_' {
+                               ds = 2
+                       }
+                       digsep |= ds
+                       ch = s.next()
+               }
        }
-       return 16 // larger than any legal digit val
+       return
 }
 
-func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' }
+func (s *Scanner) scanNumber(ch rune, seenDot bool) (rune, rune) {
+       base := 10         // number base
+       prefix := rune(0)  // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b'
+       digsep := 0        // bit 0: digit present, bit 1: '_' present
+       invalid := rune(0) // invalid digit in literal, or 0
+
+       // integer part
+       var tok rune
+       var ds int
+       if !seenDot {
+               tok = Int
+               if ch == '0' {
+                       ch = s.next()
+                       switch lower(ch) {
+                       case 'x':
+                               ch = s.next()
+                               base, prefix = 16, 'x'
+                       case 'o':
+                               ch = s.next()
+                               base, prefix = 8, 'o'
+                       case 'b':
+                               ch = s.next()
+                               base, prefix = 2, 'b'
+                       default:
+                               base, prefix = 8, '0'
+                               digsep = 1 // leading 0
+                       }
+               }
+               ch, ds = s.digits(ch, base, &invalid)
+               digsep |= ds
+               if ch == '.' && s.Mode&ScanFloats != 0 {
+                       ch = s.next()
+                       seenDot = true
+               }
+       }
 
-func (s *Scanner) scanMantissa(ch rune) rune {
-       for isDecimal(ch) {
-               ch = s.next()
+       // fractional part
+       if seenDot {
+               tok = Float
+               if prefix == 'o' || prefix == 'b' {
+                       s.error("invalid radix point in " + litname(prefix))
+               }
+               ch, ds = s.digits(ch, base, &invalid)
+               digsep |= ds
        }
-       return ch
-}
 
-func (s *Scanner) scanFraction(ch rune) rune {
-       if ch == '.' {
-               ch = s.scanMantissa(s.next())
+       if digsep&1 == 0 {
+               s.error(litname(prefix) + " has no digits")
        }
-       return ch
-}
 
-func (s *Scanner) scanExponent(ch rune) rune {
-       if ch == 'e' || ch == 'E' {
+       // exponent
+       if e := lower(ch); (e == 'e' || e == 'p') && s.Mode&ScanFloats != 0 {
+               switch {
+               case e == 'e' && prefix != 0 && prefix != '0':
+                       s.errorf("%q exponent requires decimal mantissa", ch)
+               case e == 'p' && prefix != 'x':
+                       s.errorf("%q exponent requires hexadecimal mantissa", ch)
+               }
                ch = s.next()
-               if ch == '-' || ch == '+' {
+               tok = Float
+               if ch == '+' || ch == '-' {
                        ch = s.next()
                }
-               if !isDecimal(ch) {
-                       s.error("illegal exponent")
+               ch, ds = s.digits(ch, 10, nil)
+               digsep |= ds
+               if ds&1 == 0 {
+                       s.error("exponent has no digits")
                }
-               ch = s.scanMantissa(ch)
+       } else if prefix == 'x' && tok == Float {
+               s.error("hexadecimal mantissa requires a 'p' exponent")
        }
-       return ch
+
+       if tok == Int && invalid != 0 {
+               s.errorf("invalid digit %q in %s", invalid, litname(prefix))
+       }
+
+       if digsep&2 != 0 {
+               s.tokEnd = s.srcPos - s.lastCharLen // make sure token text is terminated
+               if i := invalidSep(s.TokenText()); i >= 0 {
+                       s.error("'_' must separate successive digits")
+               }
+       }
+
+       return tok, ch
 }
 
-func (s *Scanner) scanNumber(ch rune) (rune, rune) {
-       // isDecimal(ch)
-       if ch == '0' {
-               // int or float
-               ch = s.next()
-               if ch == 'x' || ch == 'X' {
-                       // hexadecimal int
-                       ch = s.next()
-                       hasMantissa := false
-                       for digitVal(ch) < 16 {
-                               ch = s.next()
-                               hasMantissa = true
-                       }
-                       if !hasMantissa {
-                               s.error("illegal hexadecimal number")
-                       }
-               } else {
-                       // octal int or float
-                       has8or9 := false
-                       for isDecimal(ch) {
-                               if ch > '7' {
-                                       has8or9 = true
-                               }
-                               ch = s.next()
-                       }
-                       if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') {
-                               // float
-                               ch = s.scanFraction(ch)
-                               ch = s.scanExponent(ch)
-                               return Float, ch
+func litname(prefix rune) string {
+       switch prefix {
+       default:
+               return "decimal literal"
+       case 'x':
+               return "hexadecimal literal"
+       case 'o', '0':
+               return "octal literal"
+       case 'b':
+               return "binary literal"
+       }
+}
+
+// invalidSep returns the index of the first invalid separator in x, or -1.
+func invalidSep(x string) int {
+       x1 := ' ' // prefix char, we only care if it's 'x'
+       d := '.'  // digit, one of '_', '0' (a digit), or '.' (anything else)
+       i := 0
+
+       // a prefix counts as a digit
+       if len(x) >= 2 && x[0] == '0' {
+               x1 = lower(rune(x[1]))
+               if x1 == 'x' || x1 == 'o' || x1 == 'b' {
+                       d = '0'
+                       i = 2
+               }
+       }
+
+       // mantissa and exponent
+       for ; i < len(x); i++ {
+               p := d // previous digit
+               d = rune(x[i])
+               switch {
+               case d == '_':
+                       if p != '0' {
+                               return i
                        }
-                       // octal int
-                       if has8or9 {
-                               s.error("illegal octal number")
+               case isDecimal(d) || x1 == 'x' && isHex(d):
+                       d = '0'
+               default:
+                       if p == '_' {
+                               return i - 1
                        }
+                       d = '.'
                }
-               return Int, ch
        }
-       // decimal int or float
-       ch = s.scanMantissa(ch)
-       if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') {
-               // float
-               ch = s.scanFraction(ch)
-               ch = s.scanExponent(ch)
-               return Float, ch
+       if d == '_' {
+               return len(x) - 1
        }
-       return Int, ch
+
+       return -1
+}
+
+func digitVal(ch rune) int {
+       switch {
+       case '0' <= ch && ch <= '9':
+               return int(ch - '0')
+       case 'a' <= lower(ch) && lower(ch) <= 'f':
+               return int(lower(ch) - 'a' + 10)
+       }
+       return 16 // larger than any legal digit val
 }
 
 func (s *Scanner) scanDigits(ch rune, base, n int) rune {
@@ -447,7 +552,7 @@ func (s *Scanner) scanDigits(ch rune, base, n int) rune {
                n--
        }
        if n > 0 {
-               s.error("illegal char escape")
+               s.error("invalid char escape")
        }
        return ch
 }
@@ -467,7 +572,7 @@ func (s *Scanner) scanEscape(quote rune) rune {
        case 'U':
                ch = s.scanDigits(s.next(), 16, 8)
        default:
-               s.error("illegal char escape")
+               s.error("invalid char escape")
        }
        return ch
 }
@@ -502,7 +607,7 @@ func (s *Scanner) scanRawString() {
 
 func (s *Scanner) scanChar() {
        if s.scanString('\'') != 1 {
-               s.error("illegal char literal")
+               s.error("invalid char literal")
        }
 }
 
@@ -583,7 +688,7 @@ redo:
                }
        case isDecimal(ch):
                if s.Mode&(ScanInts|ScanFloats) != 0 {
-                       tok, ch = s.scanNumber(ch)
+                       tok, ch = s.scanNumber(ch, false)
                } else {
                        ch = s.next()
                }
@@ -606,9 +711,7 @@ redo:
                case '.':
                        ch = s.next()
                        if isDecimal(ch) && s.Mode&ScanFloats != 0 {
-                               tok = Float
-                               ch = s.scanMantissa(ch)
-                               ch = s.scanExponent(ch)
+                               tok, ch = s.scanNumber(ch, true)
                        }
                case '/':
                        ch = s.next()
@@ -664,17 +767,18 @@ func (s *Scanner) Pos() (pos Position) {
 }
 
 // TokenText returns the string corresponding to the most recently scanned token.
-// Valid after calling Scan().
+// Valid after calling Scan and in calls of Scanner.Error.
 func (s *Scanner) TokenText() string {
        if s.tokPos < 0 {
                // no token text
                return ""
        }
 
-       if s.tokEnd < 0 {
+       if s.tokEnd < s.tokPos {
                // if EOF was reached, s.tokEnd is set to -1 (s.srcPos == 0)
                s.tokEnd = s.tokPos
        }
+       // s.tokEnd >= s.tokPos
 
        if s.tokBuf.Len() == 0 {
                // common case: the entire token text is still in srcBuf
index e26e816f519894ae0cb6d6d25cca25da2430122a..fb68106c169cfd13c51e7c5a6d562a032d9d25ed 100644 (file)
@@ -290,9 +290,15 @@ func TestScan(t *testing.T) {
        testScan(t, GoTokens&^SkipComments)
 }
 
-func TestIllegalExponent(t *testing.T) {
+func TestInvalidExponent(t *testing.T) {
        const src = "1.5e 1.5E 1e+ 1e- 1.5z"
        s := new(Scanner).Init(strings.NewReader(src))
+       s.Error = func(s *Scanner, msg string) {
+               const want = "exponent has no digits"
+               if msg != want {
+                       t.Errorf("%s: got error %q; want %q", s.TokenText(), msg, want)
+               }
+       }
        checkTokErr(t, s, 1, Float, "1.5e")
        checkTokErr(t, s, 1, Float, "1.5E")
        checkTokErr(t, s, 1, Float, "1e+")
@@ -372,7 +378,7 @@ func TestScanSelectedMask(t *testing.T) {
        testScanSelectedMode(t, 0, 0)
        testScanSelectedMode(t, ScanIdents, Ident)
        // Don't test ScanInts and ScanNumbers since some parts of
-       // the floats in the source look like (illegal) octal ints
+       // the floats in the source look like (invalid) octal ints
        // and ScanNumbers may return either Int or Float.
        testScanSelectedMode(t, ScanChars, Char)
        testScanSelectedMode(t, ScanStrings, String)
@@ -474,34 +480,34 @@ func testError(t *testing.T, src, pos, msg string, tok rune) {
 }
 
 func TestError(t *testing.T) {
-       testError(t, "\x00", "<input>:1:1", "illegal character NUL", 0)
-       testError(t, "\x80", "<input>:1:1", "illegal UTF-8 encoding", utf8.RuneError)
-       testError(t, "\xff", "<input>:1:1", "illegal UTF-8 encoding", utf8.RuneError)
-
-       testError(t, "a\x00", "<input>:1:2", "illegal character NUL", Ident)
-       testError(t, "ab\x80", "<input>:1:3", "illegal UTF-8 encoding", Ident)
-       testError(t, "abc\xff", "<input>:1:4", "illegal UTF-8 encoding", Ident)
-
-       testError(t, `"a`+"\x00", "<input>:1:3", "illegal character NUL", String)
-       testError(t, `"ab`+"\x80", "<input>:1:4", "illegal UTF-8 encoding", String)
-       testError(t, `"abc`+"\xff", "<input>:1:5", "illegal UTF-8 encoding", String)
-
-       testError(t, "`a"+"\x00", "<input>:1:3", "illegal character NUL", RawString)
-       testError(t, "`ab"+"\x80", "<input>:1:4", "illegal UTF-8 encoding", RawString)
-       testError(t, "`abc"+"\xff", "<input>:1:5", "illegal UTF-8 encoding", RawString)
-
-       testError(t, `'\"'`, "<input>:1:3", "illegal char escape", Char)
-       testError(t, `"\'"`, "<input>:1:3", "illegal char escape", String)
-
-       testError(t, `01238`, "<input>:1:6", "illegal octal number", Int)
-       testError(t, `01238123`, "<input>:1:9", "illegal octal number", Int)
-       testError(t, `0x`, "<input>:1:3", "illegal hexadecimal number", Int)
-       testError(t, `0xg`, "<input>:1:3", "illegal hexadecimal number", Int)
-       testError(t, `'aa'`, "<input>:1:4", "illegal char literal", Char)
-       testError(t, `1.5e`, "<input>:1:5", "illegal exponent", Float)
-       testError(t, `1.5E`, "<input>:1:5", "illegal exponent", Float)
-       testError(t, `1.5e+`, "<input>:1:6", "illegal exponent", Float)
-       testError(t, `1.5e-`, "<input>:1:6", "illegal exponent", Float)
+       testError(t, "\x00", "<input>:1:1", "invalid character NUL", 0)
+       testError(t, "\x80", "<input>:1:1", "invalid UTF-8 encoding", utf8.RuneError)
+       testError(t, "\xff", "<input>:1:1", "invalid UTF-8 encoding", utf8.RuneError)
+
+       testError(t, "a\x00", "<input>:1:2", "invalid character NUL", Ident)
+       testError(t, "ab\x80", "<input>:1:3", "invalid UTF-8 encoding", Ident)
+       testError(t, "abc\xff", "<input>:1:4", "invalid UTF-8 encoding", Ident)
+
+       testError(t, `"a`+"\x00", "<input>:1:3", "invalid character NUL", String)
+       testError(t, `"ab`+"\x80", "<input>:1:4", "invalid UTF-8 encoding", String)
+       testError(t, `"abc`+"\xff", "<input>:1:5", "invalid UTF-8 encoding", String)
+
+       testError(t, "`a"+"\x00", "<input>:1:3", "invalid character NUL", RawString)
+       testError(t, "`ab"+"\x80", "<input>:1:4", "invalid UTF-8 encoding", RawString)
+       testError(t, "`abc"+"\xff", "<input>:1:5", "invalid UTF-8 encoding", RawString)
+
+       testError(t, `'\"'`, "<input>:1:3", "invalid char escape", Char)
+       testError(t, `"\'"`, "<input>:1:3", "invalid char escape", String)
+
+       testError(t, `01238`, "<input>:1:6", "invalid digit '8' in octal literal", Int)
+       testError(t, `01238123`, "<input>:1:9", "invalid digit '8' in octal literal", Int)
+       testError(t, `0x`, "<input>:1:3", "hexadecimal literal has no digits", Int)
+       testError(t, `0xg`, "<input>:1:3", "hexadecimal literal has no digits", Int)
+       testError(t, `'aa'`, "<input>:1:4", "invalid char literal", Char)
+       testError(t, `1.5e`, "<input>:1:5", "exponent has no digits", Float)
+       testError(t, `1.5E`, "<input>:1:5", "exponent has no digits", Float)
+       testError(t, `1.5e+`, "<input>:1:6", "exponent has no digits", Float)
+       testError(t, `1.5e-`, "<input>:1:6", "exponent has no digits", Float)
 
        testError(t, `'`, "<input>:1:2", "literal not terminated", Char)
        testError(t, `'`+"\n", "<input>:1:2", "literal not terminated", Char)
@@ -692,3 +698,219 @@ func TestScanEOFHandling(t *testing.T) {
                t.Errorf("scanner called Read %d times, not once", r)
        }
 }
+
+func TestIssue29723(t *testing.T) {
+       s := new(Scanner).Init(strings.NewReader(`x "`))
+       s.Error = func(s *Scanner, _ string) {
+               got := s.TokenText() // this call shouldn't panic
+               const want = `"`
+               if got != want {
+                       t.Errorf("got %q; want %q", got, want)
+               }
+       }
+       for r := s.Scan(); r != EOF; r = s.Scan() {
+       }
+}
+
+func TestNumbers(t *testing.T) {
+       for _, test := range []struct {
+               tok              rune
+               src, tokens, err string
+       }{
+               // binaries
+               {Int, "0b0", "0b0", ""},
+               {Int, "0b1010", "0b1010", ""},
+               {Int, "0B1110", "0B1110", ""},
+
+               {Int, "0b", "0b", "binary literal has no digits"},
+               {Int, "0b0190", "0b0190", "invalid digit '9' in binary literal"},
+               {Int, "0b01a0", "0b01 a0", ""}, // only accept 0-9
+
+               // binary floats (invalid)
+               {Float, "0b.", "0b.", "invalid radix point in binary literal"},
+               {Float, "0b.1", "0b.1", "invalid radix point in binary literal"},
+               {Float, "0b1.0", "0b1.0", "invalid radix point in binary literal"},
+               {Float, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"},
+               {Float, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"},
+
+               // octals
+               {Int, "0o0", "0o0", ""},
+               {Int, "0o1234", "0o1234", ""},
+               {Int, "0O1234", "0O1234", ""},
+
+               {Int, "0o", "0o", "octal literal has no digits"},
+               {Int, "0o8123", "0o8123", "invalid digit '8' in octal literal"},
+               {Int, "0o1293", "0o1293", "invalid digit '9' in octal literal"},
+               {Int, "0o12a3", "0o12 a3", ""}, // only accept 0-9
+
+               // octal floats (invalid)
+               {Float, "0o.", "0o.", "invalid radix point in octal literal"},
+               {Float, "0o.2", "0o.2", "invalid radix point in octal literal"},
+               {Float, "0o1.2", "0o1.2", "invalid radix point in octal literal"},
+               {Float, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"},
+               {Float, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"},
+
+               // 0-octals
+               {Int, "0", "0", ""},
+               {Int, "0123", "0123", ""},
+
+               {Int, "08123", "08123", "invalid digit '8' in octal literal"},
+               {Int, "01293", "01293", "invalid digit '9' in octal literal"},
+               {Int, "0F.", "0 F .", ""}, // only accept 0-9
+               {Int, "0123F.", "0123 F .", ""},
+               {Int, "0123456x", "0123456 x", ""},
+
+               // decimals
+               {Int, "1", "1", ""},
+               {Int, "1234", "1234", ""},
+
+               {Int, "1f", "1 f", ""}, // only accept 0-9
+
+               // decimal floats
+               {Float, "0.", "0.", ""},
+               {Float, "123.", "123.", ""},
+               {Float, "0123.", "0123.", ""},
+
+               {Float, ".0", ".0", ""},
+               {Float, ".123", ".123", ""},
+               {Float, ".0123", ".0123", ""},
+
+               {Float, "0.0", "0.0", ""},
+               {Float, "123.123", "123.123", ""},
+               {Float, "0123.0123", "0123.0123", ""},
+
+               {Float, "0e0", "0e0", ""},
+               {Float, "123e+0", "123e+0", ""},
+               {Float, "0123E-1", "0123E-1", ""},
+
+               {Float, "0.e+1", "0.e+1", ""},
+               {Float, "123.E-10", "123.E-10", ""},
+               {Float, "0123.e123", "0123.e123", ""},
+
+               {Float, ".0e-1", ".0e-1", ""},
+               {Float, ".123E+10", ".123E+10", ""},
+               {Float, ".0123E123", ".0123E123", ""},
+
+               {Float, "0.0e1", "0.0e1", ""},
+               {Float, "123.123E-10", "123.123E-10", ""},
+               {Float, "0123.0123e+456", "0123.0123e+456", ""},
+
+               {Float, "0e", "0e", "exponent has no digits"},
+               {Float, "0E+", "0E+", "exponent has no digits"},
+               {Float, "1e+f", "1e+ f", "exponent has no digits"},
+               {Float, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"},
+               {Float, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"},
+
+               // hexadecimals
+               {Int, "0x0", "0x0", ""},
+               {Int, "0x1234", "0x1234", ""},
+               {Int, "0xcafef00d", "0xcafef00d", ""},
+               {Int, "0XCAFEF00D", "0XCAFEF00D", ""},
+
+               {Int, "0x", "0x", "hexadecimal literal has no digits"},
+               {Int, "0x1g", "0x1 g", ""},
+
+               // hexadecimal floats
+               {Float, "0x0p0", "0x0p0", ""},
+               {Float, "0x12efp-123", "0x12efp-123", ""},
+               {Float, "0xABCD.p+0", "0xABCD.p+0", ""},
+               {Float, "0x.0189P-0", "0x.0189P-0", ""},
+               {Float, "0x1.ffffp+1023", "0x1.ffffp+1023", ""},
+
+               {Float, "0x.", "0x.", "hexadecimal literal has no digits"},
+               {Float, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"},
+               {Float, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"},
+               {Float, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"},
+               {Float, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"},
+               {Float, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"},
+               {Float, "0x0p", "0x0p", "exponent has no digits"},
+               {Float, "0xeP-", "0xeP-", "exponent has no digits"},
+               {Float, "0x1234PAB", "0x1234P AB", "exponent has no digits"},
+               {Float, "0x1.2p1a", "0x1.2p1 a", ""},
+
+               // separators
+               {Int, "0b_1000_0001", "0b_1000_0001", ""},
+               {Int, "0o_600", "0o_600", ""},
+               {Int, "0_466", "0_466", ""},
+               {Int, "1_000", "1_000", ""},
+               {Float, "1_000.000_1", "1_000.000_1", ""},
+               {Int, "0x_f00d", "0x_f00d", ""},
+               {Float, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""},
+
+               {Int, "0b__1000", "0b__1000", "'_' must separate successive digits"},
+               {Int, "0o60___0", "0o60___0", "'_' must separate successive digits"},
+               {Int, "0466_", "0466_", "'_' must separate successive digits"},
+               {Float, "1_.", "1_.", "'_' must separate successive digits"},
+               {Float, "0._1", "0._1", "'_' must separate successive digits"},
+               {Float, "2.7_e0", "2.7_e0", "'_' must separate successive digits"},
+               {Int, "0x___0", "0x___0", "'_' must separate successive digits"},
+               {Float, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"},
+       } {
+               s := new(Scanner).Init(strings.NewReader(test.src))
+               var err string
+               s.Error = func(s *Scanner, msg string) {
+                       if err == "" {
+                               err = msg
+                       }
+               }
+
+               for i, want := range strings.Split(test.tokens, " ") {
+                       err = ""
+                       tok := s.Scan()
+                       lit := s.TokenText()
+                       if i == 0 {
+                               if tok != test.tok {
+                                       t.Errorf("%q: got token %s; want %s", test.src, TokenString(tok), TokenString(test.tok))
+                               }
+                               if err != test.err {
+                                       t.Errorf("%q: got error %q; want %q", test.src, err, test.err)
+                               }
+                       }
+                       if lit != want {
+                               t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, TokenString(tok), want)
+                       }
+               }
+
+               // make sure we read all
+               if tok := s.Scan(); tok != EOF {
+                       t.Errorf("%q: got %s; want EOF", test.src, TokenString(tok))
+               }
+       }
+}
+
+func TestIssue30320(t *testing.T) {
+       for _, test := range []struct {
+               in, want string
+               mode     uint
+       }{
+               {"foo01.bar31.xx-0-1-1-0", "01 31 0 1 1 0", ScanInts},
+               {"foo0/12/0/5.67", "0 12 0 5 67", ScanInts},
+               {"xxx1e0yyy", "1 0", ScanInts},
+               {"1_2", "1 2", ScanInts}, // don't consume _ as part of a number if not explicitly enabled
+               {"1_2", "1_2", ScanInts | AllowDigitSeparators},
+               {"xxx1.0yyy2e3ee", "1 0 2 3", ScanInts},
+               {"xxx1.0yyy2e3ee", "1.0 2e3", ScanFloats},
+       } {
+               got := extractInts(test.in, test.mode)
+               if got != test.want {
+                       t.Errorf("%q: got %q; want %q", test.in, got, test.want)
+               }
+       }
+}
+
+func extractInts(t string, mode uint) (res string) {
+       var s Scanner
+       s.Init(strings.NewReader(t))
+       s.Mode = mode
+       for {
+               switch tok := s.Scan(); tok {
+               case Int, Float:
+                       if len(res) > 0 {
+                               res += " "
+                       }
+                       res += s.TokenText()
+               case EOF:
+                       return
+               }
+       }
+}
index 36d999b411ee0bea1d6f5287f90abcefe83763c3..76dec7b358011abdc175784aae9337ab62bcec6d 100644 (file)
@@ -473,8 +473,12 @@ func (b *Writer) terminateCell(htab bool) int {
        return len(*line)
 }
 
-func handlePanic(err *error, op string) {
+func (b *Writer) handlePanic(err *error, op string) {
        if e := recover(); e != nil {
+               if op == "Flush" {
+                       // If Flush ran into a panic, we still need to reset.
+                       b.reset()
+               }
                if nerr, ok := e.(osError); ok {
                        *err = nerr.err
                        return
@@ -491,10 +495,18 @@ func (b *Writer) Flush() error {
        return b.flush()
 }
 
+// flush is the internal version of Flush, with a named return value which we
+// don't want to expose.
 func (b *Writer) flush() (err error) {
-       defer b.reset() // even in the presence of errors
-       defer handlePanic(&err, "Flush")
+       defer b.handlePanic(&err, "Flush")
+       b.flushNoDefers()
+       return nil
+}
 
+// flushNoDefers is like flush, but without a deferred handlePanic call. This
+// can be called from other methods which already have their own deferred
+// handlePanic calls, such as Write, and avoid the extra defer work.
+func (b *Writer) flushNoDefers() {
        // add current cell if not empty
        if b.cell.size > 0 {
                if b.endChar != 0 {
@@ -506,7 +518,7 @@ func (b *Writer) flush() (err error) {
 
        // format contents of buffer
        b.format(0, 0, len(b.lines))
-       return nil
+       b.reset()
 }
 
 var hbar = []byte("---\n")
@@ -516,7 +528,7 @@ var hbar = []byte("---\n")
 // while writing to the underlying output stream.
 //
 func (b *Writer) Write(buf []byte) (n int, err error) {
-       defer handlePanic(&err, "Write")
+       defer b.handlePanic(&err, "Write")
 
        // split text into cells
        n = 0
@@ -539,9 +551,7 @@ func (b *Writer) Write(buf []byte) (n int, err error) {
                                                // the formatting of the following lines (the last cell per
                                                // line is ignored by format()), thus we can flush the
                                                // Writer contents.
-                                               if err = b.Flush(); err != nil {
-                                                       return
-                                               }
+                                               b.flushNoDefers()
                                                if ch == '\f' && b.flags&Debug != 0 {
                                                        // indicate section break
                                                        b.write0(hbar)
index 07bae0ca0b2bf673d28a2510f3b122803e3dce0f..6a97d4c4273d4248e6886955fd0f82b0a105c4ff 100644 (file)
@@ -729,3 +729,27 @@ func BenchmarkRagged(b *testing.B) {
                })
        }
 }
+
+const codeSnippet = `
+some command
+
+foo    # aligned
+barbaz # comments
+
+but
+mostly
+single
+cell
+lines
+`
+
+func BenchmarkCode(b *testing.B) {
+       b.ReportAllocs()
+       for i := 0; i < b.N; i++ {
+               w := NewWriter(ioutil.Discard, 4, 4, 1, ' ', 0) // no particular reason for these settings
+               // The code is small, so it's reasonable for the tabwriter user
+               // to write it all at once, or buffer the writes.
+               w.Write([]byte(codeSnippet))
+               w.Flush()
+       }
+}
index 0179dec5c33de6ec9714a8311324d5dd5ca23f86..dbffaa4958001de16712cff31dc7a909f3181483 100644 (file)
@@ -328,6 +328,11 @@ Predefined global functions are named as follows.
                Returns the result of indexing its first argument by the
                following arguments. Thus "index x 1 2 3" is, in Go syntax,
                x[1][2][3]. Each indexed item must be a map, slice, or array.
+       slice
+               slice returns the result of slicing its first argument by the
+               remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2],
+               while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3"
+               is x[1:2:3]. The first argument must be a string, slice, or array.
        js
                Returns the escaped JavaScript equivalent of the textual
                representation of its arguments.
index 8d39e3478d7e839a07fbd2df97bad8096fe433b4..6d2e5ec47622ec842bbda78ea978142358b07172 100644 (file)
@@ -123,6 +123,10 @@ func (e ExecError) Error() string {
        return e.Err.Error()
 }
 
+func (e ExecError) Unwrap() error {
+       return e.Err
+}
+
 // errorf records an ExecError and terminates processing.
 func (s *state) errorf(format string, args ...interface{}) {
        name := doublePercent(s.tmpl.Name())
@@ -283,7 +287,7 @@ func (s *state) walk(dot reflect.Value, node parse.Node) {
 func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.PipeNode, list, elseList *parse.ListNode) {
        defer s.pop(s.mark())
        val := s.evalPipeline(dot, pipe)
-       truth, ok := isTrue(val)
+       truth, ok := isTrue(indirectInterface(val))
        if !ok {
                s.errorf("if/with can't use %v", val)
        }
@@ -497,7 +501,7 @@ func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value {
        switch {
        case constant.IsComplex:
                return reflect.ValueOf(constant.Complex128) // incontrovertible.
-       case constant.IsFloat && !isHexConstant(constant.Text) && strings.ContainsAny(constant.Text, ".eE"):
+       case constant.IsFloat && !isHexInt(constant.Text) && strings.ContainsAny(constant.Text, ".eEpP"):
                return reflect.ValueOf(constant.Float64)
        case constant.IsInt:
                n := int(constant.Int64)
@@ -511,8 +515,8 @@ func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value {
        return zero
 }
 
-func isHexConstant(s string) bool {
-       return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')
+func isHexInt(s string) bool {
+       return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') && !strings.ContainsAny(s, "pP")
 }
 
 func (s *state) evalFieldNode(dot reflect.Value, field *parse.FieldNode, args []parse.Node, final reflect.Value) reflect.Value {
@@ -600,9 +604,6 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node,
        case reflect.Struct:
                tField, ok := receiver.Type().FieldByName(fieldName)
                if ok {
-                       if isNil {
-                               s.errorf("nil pointer evaluating %s.%s", typ, fieldName)
-                       }
                        field := receiver.FieldByIndex(tField.Index)
                        if tField.PkgPath != "" { // field is unexported
                                s.errorf("%s is an unexported field of struct type %s", fieldName, typ)
@@ -614,9 +615,6 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node,
                        return field
                }
        case reflect.Map:
-               if isNil {
-                       s.errorf("nil pointer evaluating %s.%s", typ, fieldName)
-               }
                // If it's a map, attempt to use the field name as a key.
                nameVal := reflect.ValueOf(fieldName)
                if nameVal.Type().AssignableTo(receiver.Type().Key()) {
@@ -636,6 +634,18 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node,
                        }
                        return result
                }
+       case reflect.Ptr:
+               etyp := receiver.Type().Elem()
+               if etyp.Kind() == reflect.Struct {
+                       if _, ok := etyp.FieldByName(fieldName); !ok {
+                               // If there's no such field, say "can't evaluate"
+                               // instead of "nil pointer evaluating".
+                               break
+                       }
+               }
+               if isNil {
+                       s.errorf("nil pointer evaluating %s.%s", typ, fieldName)
+               }
        }
        s.errorf("can't evaluate field %s in type %s", fieldName, typ)
        panic("not reached")
@@ -908,7 +918,9 @@ func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Valu
        panic("not reached")
 }
 
-// indirect returns the item at the end of indirection, and a bool to indicate if it's nil.
+// indirect returns the item at the end of indirection, and a bool to indicate
+// if it's nil. If the returned bool is true, the returned value's kind will be
+// either a pointer or interface.
 func indirect(v reflect.Value) (rv reflect.Value, isNil bool) {
        for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() {
                if v.IsNil() {
index 3cf9496db45c53a17ef9777052a193f08b9a9312..a7d3f39f9aba3ff91833f3c3da2232ee63526e73 100644 (file)
@@ -23,7 +23,7 @@ type T struct {
        True        bool
        I           int
        U16         uint16
-       X           string
+       X, S        string
        FloatZero   float64
        ComplexZero complex128
        // Nested structs.
@@ -36,8 +36,11 @@ type T struct {
        W1, W2 *W
        // Slices
        SI      []int
+       SICap   []int
        SIEmpty []int
        SB      []bool
+       // Arrays
+       AI [3]int
        // Maps
        MSI      map[string]int
        MSIone   map[string]int // one element, for deterministic output
@@ -122,12 +125,15 @@ var tVal = &T{
        I:      17,
        U16:    16,
        X:      "x",
+       S:      "xyz",
        U:      &U{"v"},
        V0:     V{6666},
        V1:     &V{7777}, // leave V2 as nil
        W0:     W{888},
        W1:     &W{999}, // leave W2 as nil
        SI:     []int{3, 4, 5},
+       SICap:  make([]int, 5, 10),
+       AI:     [3]int{3, 4, 5},
        SB:     []bool{true, false},
        MSI:    map[string]int{"one": 1, "two": 2, "three": 3},
        MSIone: map[string]int{"one": 1},
@@ -413,6 +419,7 @@ var execTests = []execTest{
        {"if true", "{{if true}}TRUE{{end}}", "TRUE", tVal, true},
        {"if false", "{{if false}}TRUE{{else}}FALSE{{end}}", "FALSE", tVal, true},
        {"if nil", "{{if nil}}TRUE{{end}}", "", tVal, false},
+       {"if on typed nil interface value", "{{if .NonEmptyInterfaceTypedNil}}TRUE{{ end }}", "", tVal, true},
        {"if 1", "{{if 1}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true},
        {"if 0", "{{if 0}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true},
        {"if 1.5", "{{if 1.5}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true},
@@ -490,6 +497,31 @@ var execTests = []execTest{
        {"map MI8S", "{{index .MI8S 3}}", "i83", tVal, true},
        {"map MUI8S", "{{index .MUI8S 2}}", "u82", tVal, true},
 
+       // Slicing.
+       {"slice[:]", "{{slice .SI}}", "[3 4 5]", tVal, true},
+       {"slice[1:]", "{{slice .SI 1}}", "[4 5]", tVal, true},
+       {"slice[1:2]", "{{slice .SI 1 2}}", "[4]", tVal, true},
+       {"slice[-1:]", "{{slice .SI -1}}", "", tVal, false},
+       {"slice[1:-2]", "{{slice .SI 1 -2}}", "", tVal, false},
+       {"slice[1:2:-1]", "{{slice .SI 1 2 -1}}", "", tVal, false},
+       {"slice[2:1]", "{{slice .SI 2 1}}", "", tVal, false},
+       {"slice[2:2:1]", "{{slice .SI 2 2 1}}", "", tVal, false},
+       {"out of range", "{{slice .SI 4 5}}", "", tVal, false},
+       {"out of range", "{{slice .SI 2 2 5}}", "", tVal, false},
+       {"len(s) < indexes < cap(s)", "{{slice .SICap 6 10}}", "[0 0 0 0]", tVal, true},
+       {"len(s) < indexes < cap(s)", "{{slice .SICap 6 10 10}}", "[0 0 0 0]", tVal, true},
+       {"indexes > cap(s)", "{{slice .SICap 10 11}}", "", tVal, false},
+       {"indexes > cap(s)", "{{slice .SICap 6 10 11}}", "", tVal, false},
+       {"array[:]", "{{slice .AI}}", "[3 4 5]", tVal, true},
+       {"array[1:]", "{{slice .AI 1}}", "[4 5]", tVal, true},
+       {"array[1:2]", "{{slice .AI 1 2}}", "[4]", tVal, true},
+       {"string[:]", "{{slice .S}}", "xyz", tVal, true},
+       {"string[0:1]", "{{slice .S 0 1}}", "x", tVal, true},
+       {"string[1:]", "{{slice .S 1}}", "yz", tVal, true},
+       {"string[1:2]", "{{slice .S 1 2}}", "y", tVal, true},
+       {"out of range", "{{slice .S 1 5}}", "", tVal, false},
+       {"3-index slice of string", "{{slice .S 1 2 2}}", "", tVal, false},
+
        // Len.
        {"slice", "{{len .SI}}", "3", tVal, true},
        {"map", "{{len .MSI }}", "3", tVal, true},
@@ -515,6 +547,7 @@ var execTests = []execTest{
        {"with $x int", "{{with $x := .I}}{{$x}}{{end}}", "17", tVal, true},
        {"with $x struct.U.V", "{{with $x := $}}{{$x.U.V}}{{end}}", "v", tVal, true},
        {"with variable and action", "{{with $x := $}}{{$y := $.U.V}}{{$y}}{{end}}", "v", tVal, true},
+       {"with on typed nil interface value", "{{with .NonEmptyInterfaceTypedNil}}TRUE{{ end }}", "", tVal, true},
 
        // Range.
        {"range []int", "{{range .SI}}-{{.}}-{{end}}", "-3--4--5-", tVal, true},
@@ -546,6 +579,27 @@ var execTests = []execTest{
        {"error method, error", "{{.MyError true}}", "", tVal, false},
        {"error method, no error", "{{.MyError false}}", "false", tVal, true},
 
+       // Numbers
+       {"decimal", "{{print 1234}}", "1234", tVal, true},
+       {"decimal _", "{{print 12_34}}", "1234", tVal, true},
+       {"binary", "{{print 0b101}}", "5", tVal, true},
+       {"binary _", "{{print 0b_1_0_1}}", "5", tVal, true},
+       {"BINARY", "{{print 0B101}}", "5", tVal, true},
+       {"octal0", "{{print 0377}}", "255", tVal, true},
+       {"octal", "{{print 0o377}}", "255", tVal, true},
+       {"octal _", "{{print 0o_3_7_7}}", "255", tVal, true},
+       {"OCTAL", "{{print 0O377}}", "255", tVal, true},
+       {"hex", "{{print 0x123}}", "291", tVal, true},
+       {"hex _", "{{print 0x1_23}}", "291", tVal, true},
+       {"HEX", "{{print 0X123ABC}}", "1194684", tVal, true},
+       {"float", "{{print 123.4}}", "123.4", tVal, true},
+       {"float _", "{{print 0_0_1_2_3.4}}", "123.4", tVal, true},
+       {"hex float", "{{print +0x1.ep+2}}", "7.5", tVal, true},
+       {"hex float _", "{{print +0x_1.e_0p+0_2}}", "7.5", tVal, true},
+       {"HEX float", "{{print +0X1.EP+2}}", "7.5", tVal, true},
+       {"print multi", "{{print 1_2_3_4 7.5_00_00_00}}", "1234 7.5", tVal, true},
+       {"print multi2", "{{print 1234 0x0_1.e_0p+02}}", "1234 7.5", tVal, true},
+
        // Fixed bugs.
        // Must separate dot and receiver; otherwise args are evaluated with dot set to variable.
        {"bug0", "{{range .MSIone}}{{if $.Method1 .}}X{{end}}{{end}}", "X", tVal, true},
@@ -1332,24 +1386,71 @@ func TestBlock(t *testing.T) {
        }
 }
 
-// Check that calling an invalid field on nil pointer prints
-// a field error instead of a distracting nil pointer error.
-// https://golang.org/issue/15125
-func TestMissingFieldOnNil(t *testing.T) {
-       tmpl := Must(New("tmpl").Parse("{{.MissingField}}"))
-       var d *T
-       err := tmpl.Execute(ioutil.Discard, d)
-       got := "<nil>"
-       if err != nil {
-               got = err.Error()
+func TestEvalFieldErrors(t *testing.T) {
+       tests := []struct {
+               name, src string
+               value     interface{}
+               want      string
+       }{
+               {
+                       // Check that calling an invalid field on nil pointer
+                       // prints a field error instead of a distracting nil
+                       // pointer error. https://golang.org/issue/15125
+                       "MissingFieldOnNil",
+                       "{{.MissingField}}",
+                       (*T)(nil),
+                       "can't evaluate field MissingField in type *template.T",
+               },
+               {
+                       "MissingFieldOnNonNil",
+                       "{{.MissingField}}",
+                       &T{},
+                       "can't evaluate field MissingField in type *template.T",
+               },
+               {
+                       "ExistingFieldOnNil",
+                       "{{.X}}",
+                       (*T)(nil),
+                       "nil pointer evaluating *template.T.X",
+               },
+               {
+                       "MissingKeyOnNilMap",
+                       "{{.MissingKey}}",
+                       (*map[string]string)(nil),
+                       "nil pointer evaluating *map[string]string.MissingKey",
+               },
+               {
+                       "MissingKeyOnNilMapPtr",
+                       "{{.MissingKey}}",
+                       (*map[string]string)(nil),
+                       "nil pointer evaluating *map[string]string.MissingKey",
+               },
+               {
+                       "MissingKeyOnMapPtrToNil",
+                       "{{.MissingKey}}",
+                       &map[string]string{},
+                       "<nil>",
+               },
        }
-       want := "can't evaluate field MissingField in type *template.T"
-       if !strings.HasSuffix(got, want) {
-               t.Errorf("got error %q, want %q", got, want)
+       for _, tc := range tests {
+               t.Run(tc.name, func(t *testing.T) {
+                       tmpl := Must(New("tmpl").Parse(tc.src))
+                       err := tmpl.Execute(ioutil.Discard, tc.value)
+                       got := "<nil>"
+                       if err != nil {
+                               got = err.Error()
+                       }
+                       if !strings.HasSuffix(got, tc.want) {
+                               t.Fatalf("got error %q, want %q", got, tc.want)
+                       }
+               })
        }
 }
 
 func TestMaxExecDepth(t *testing.T) {
+       if testing.Short() {
+               t.Skip("skipping in -short mode")
+       }
        tmpl := Must(New("tmpl").Parse(`{{template "tmpl" .}}`))
        err := tmpl.Execute(ioutil.Discard, nil)
        got := "<nil>"
index 72d3f666918d6569aa8b3cb9d207d1d42e22169d..248dbcf22ed99c098a7ad7081e7fc3f9f33fabe8 100644 (file)
@@ -34,6 +34,7 @@ var builtins = FuncMap{
        "call":     call,
        "html":     HTMLEscaper,
        "index":    index,
+       "slice":    slice,
        "js":       JSEscaper,
        "len":      length,
        "not":      not,
@@ -159,17 +160,36 @@ func intLike(typ reflect.Kind) bool {
        return false
 }
 
+// indexArg checks if a reflect.Value can be used as an index, and converts it to int if possible.
+func indexArg(index reflect.Value, cap int) (int, error) {
+       var x int64
+       switch index.Kind() {
+       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               x = index.Int()
+       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+               x = int64(index.Uint())
+       case reflect.Invalid:
+               return 0, fmt.Errorf("cannot index slice/array with nil")
+       default:
+               return 0, fmt.Errorf("cannot index slice/array with type %s", index.Type())
+       }
+       if x < 0 || int(x) < 0 || int(x) > cap {
+               return 0, fmt.Errorf("index out of range: %d", x)
+       }
+       return int(x), nil
+}
+
 // Indexing.
 
 // index returns the result of indexing its first argument by the following
 // arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each
 // indexed item must be a map, slice, or array.
-func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
+func index(item reflect.Value, indexes ...reflect.Value) (reflect.Value, error) {
        v := indirectInterface(item)
        if !v.IsValid() {
                return reflect.Value{}, fmt.Errorf("index of untyped nil")
        }
-       for _, i := range indices {
+       for _, i := range indexes {
                index := indirectInterface(i)
                var isNil bool
                if v, isNil = indirect(v); isNil {
@@ -177,21 +197,11 @@ func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error)
                }
                switch v.Kind() {
                case reflect.Array, reflect.Slice, reflect.String:
-                       var x int64
-                       switch index.Kind() {
-                       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-                               x = index.Int()
-                       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-                               x = int64(index.Uint())
-                       case reflect.Invalid:
-                               return reflect.Value{}, fmt.Errorf("cannot index slice/array with nil")
-                       default:
-                               return reflect.Value{}, fmt.Errorf("cannot index slice/array with type %s", index.Type())
-                       }
-                       if x < 0 || x >= int64(v.Len()) {
-                               return reflect.Value{}, fmt.Errorf("index out of range: %d", x)
+                       x, err := indexArg(index, v.Len())
+                       if err != nil {
+                               return reflect.Value{}, err
                        }
-                       v = v.Index(int(x))
+                       v = v.Index(x)
                case reflect.Map:
                        index, err := prepareArg(index, v.Type().Key())
                        if err != nil {
@@ -212,6 +222,57 @@ func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error)
        return v, nil
 }
 
+// Slicing.
+
+// slice returns the result of slicing its first argument by the remaining
+// arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2], while "slice x"
+// is x[:], "slice x 1" is x[1:], and "slice x 1 2 3" is x[1:2:3]. The first
+// argument must be a string, slice, or array.
+func slice(item reflect.Value, indexes ...reflect.Value) (reflect.Value, error) {
+       var (
+               cap int
+               v   = indirectInterface(item)
+       )
+       if !v.IsValid() {
+               return reflect.Value{}, fmt.Errorf("slice of untyped nil")
+       }
+       if len(indexes) > 3 {
+               return reflect.Value{}, fmt.Errorf("too many slice indexes: %d", len(indexes))
+       }
+       switch v.Kind() {
+       case reflect.String:
+               if len(indexes) == 3 {
+                       return reflect.Value{}, fmt.Errorf("cannot 3-index slice a string")
+               }
+               cap = v.Len()
+       case reflect.Array, reflect.Slice:
+               cap = v.Cap()
+       default:
+               return reflect.Value{}, fmt.Errorf("can't slice item of type %s", v.Type())
+       }
+       // set default values for cases item[:], item[i:].
+       idx := [3]int{0, v.Len()}
+       for i, index := range indexes {
+               x, err := indexArg(index, cap)
+               if err != nil {
+                       return reflect.Value{}, err
+               }
+               idx[i] = x
+       }
+       // given item[i:j], make sure i <= j.
+       if idx[0] > idx[1] {
+               return reflect.Value{}, fmt.Errorf("invalid slice index: %d > %d", idx[0], idx[1])
+       }
+       if len(indexes) < 3 {
+               return item.Slice(idx[0], idx[1]), nil
+       }
+       // given item[i:j:k], make sure i <= j <= k.
+       if idx[1] > idx[2] {
+               return reflect.Value{}, fmt.Errorf("invalid slice index: %d > %d", idx[1], idx[2])
+       }
+       return item.Slice3(idx[0], idx[1], idx[2]), nil
+}
+
 // Length
 
 // length returns the length of the item, with an error if it has no defined length.
@@ -263,11 +324,9 @@ func call(fn reflect.Value, args ...reflect.Value) (reflect.Value, error) {
        for i, arg := range args {
                value := indirectInterface(arg)
                // Compute the expected type. Clumsy because of variadics.
-               var argType reflect.Type
+               argType := dddType
                if !typ.IsVariadic() || i < numIn-1 {
                        argType = typ.In(i)
-               } else {
-                       argType = dddType
                }
 
                var err error
index 9e0200c3525433155c0cc0bf7e085e270d8b043b..c9e890078c4ea03c002ae7b5449273e4da384685 100644 (file)
@@ -91,9 +91,10 @@ func parseFiles(t *Template, filenames ...string) (*Template, error) {
        return t, nil
 }
 
-// ParseGlob creates a new Template and parses the template definitions from the
-// files identified by the pattern, which must match at least one file. The
-// returned template will have the (base) name and (parsed) contents of the
+// ParseGlob creates a new Template and parses the template definitions from
+// the files identified by the pattern. The files are matched according to the
+// semantics of filepath.Match, and the pattern must match at least one file.
+// The returned template will have the (base) name and (parsed) contents of the
 // first file matched by the pattern. ParseGlob is equivalent to calling
 // ParseFiles with the list of files matched by the pattern.
 //
@@ -104,10 +105,10 @@ func ParseGlob(pattern string) (*Template, error) {
 }
 
 // ParseGlob parses the template definitions in the files identified by the
-// pattern and associates the resulting templates with t. The pattern is
-// processed by filepath.Glob and must match at least one file. ParseGlob is
-// equivalent to calling t.ParseFiles with the list of files matched by the
-// pattern.
+// pattern and associates the resulting templates with t. The files are matched
+// according to the semantics of filepath.Match, and the pattern must match at
+// least one file. ParseGlob is equivalent to calling t.ParseFiles with the
+// list of files matched by the pattern.
 //
 // When parsing multiple files with the same name in different directories,
 // the last one mentioned will be the one that results.
index 94a676c579cb48c7b33b3dbba03dae80341ea632..3d57708796ca795ef0c485ad5e630f3a8f5a09c1 100644 (file)
@@ -107,17 +107,18 @@ type stateFn func(*lexer) stateFn
 
 // lexer holds the state of the scanner.
 type lexer struct {
-       name       string    // the name of the input; used only for error reports
-       input      string    // the string being scanned
-       leftDelim  string    // start of action
-       rightDelim string    // end of action
-       pos        Pos       // current position in the input
-       start      Pos       // start position of this item
-       width      Pos       // width of last rune read from input
-       items      chan item // channel of scanned items
-       parenDepth int       // nesting depth of ( ) exprs
-       line       int       // 1+number of newlines seen
-       startLine  int       // start line of this item
+       name           string    // the name of the input; used only for error reports
+       input          string    // the string being scanned
+       leftDelim      string    // start of action
+       rightDelim     string    // end of action
+       trimRightDelim string    // end of action with trim marker
+       pos            Pos       // current position in the input
+       start          Pos       // start position of this item
+       width          Pos       // width of last rune read from input
+       items          chan item // channel of scanned items
+       parenDepth     int       // nesting depth of ( ) exprs
+       line           int       // 1+number of newlines seen
+       startLine      int       // start line of this item
 }
 
 // next returns the next rune in the input.
@@ -210,13 +211,14 @@ func lex(name, input, left, right string) *lexer {
                right = rightDelim
        }
        l := &lexer{
-               name:       name,
-               input:      input,
-               leftDelim:  left,
-               rightDelim: right,
-               items:      make(chan item),
-               line:       1,
-               startLine:  1,
+               name:           name,
+               input:          input,
+               leftDelim:      left,
+               rightDelim:     right,
+               trimRightDelim: rightTrimMarker + right,
+               items:          make(chan item),
+               line:           1,
+               startLine:      1,
        }
        go l.run()
        return l
@@ -275,14 +277,12 @@ func rightTrimLength(s string) Pos {
 
 // atRightDelim reports whether the lexer is at a right delimiter, possibly preceded by a trim marker.
 func (l *lexer) atRightDelim() (delim, trimSpaces bool) {
-       if strings.HasPrefix(l.input[l.pos:], l.rightDelim) {
-               return true, false
-       }
-       // The right delim might have the marker before.
-       if strings.HasPrefix(l.input[l.pos:], rightTrimMarker) &&
-               strings.HasPrefix(l.input[l.pos+trimMarkerLen:], l.rightDelim) {
+       if strings.HasPrefix(l.input[l.pos:], l.trimRightDelim) { // With trim marker.
                return true, true
        }
+       if strings.HasPrefix(l.input[l.pos:], l.rightDelim) { // Without trim marker.
+               return true, false
+       }
        return false, false
 }
 
@@ -366,6 +366,7 @@ func lexInsideAction(l *lexer) stateFn {
        case r == eof || isEndOfLine(r):
                return l.errorf("unclosed action")
        case isSpace(r):
+               l.backup() // Put space back in case we have " -}}".
                return lexSpace
        case r == '=':
                l.emit(itemAssign)
@@ -418,10 +419,26 @@ func lexInsideAction(l *lexer) stateFn {
 }
 
 // lexSpace scans a run of space characters.
-// One space has already been seen.
+// We have not consumed the first space, which is known to be present.
+// Take care if there is a trim-marked right delimiter, which starts with a space.
 func lexSpace(l *lexer) stateFn {
-       for isSpace(l.peek()) {
+       var r rune
+       var numSpaces int
+       for {
+               r = l.peek()
+               if !isSpace(r) {
+                       break
+               }
                l.next()
+               numSpaces++
+       }
+       // Be careful about a trim-marked closing delimiter, which has a minus
+       // after a space. We know there is a space, so check for the '-' that might follow.
+       if strings.HasPrefix(l.input[l.pos-1:], l.trimRightDelim) {
+               l.backup() // Before the space.
+               if numSpaces == 1 {
+                       return lexRightDelim // On the delim, so go right to that.
+               }
        }
        l.emit(itemSpace)
        return lexInsideAction
@@ -565,17 +582,28 @@ func (l *lexer) scanNumber() bool {
        // Optional leading sign.
        l.accept("+-")
        // Is it hex?
-       digits := "0123456789"
-       if l.accept("0") && l.accept("xX") {
-               digits = "0123456789abcdefABCDEF"
+       digits := "0123456789_"
+       if l.accept("0") {
+               // Note: Leading 0 does not mean octal in floats.
+               if l.accept("xX") {
+                       digits = "0123456789abcdefABCDEF_"
+               } else if l.accept("oO") {
+                       digits = "01234567_"
+               } else if l.accept("bB") {
+                       digits = "01_"
+               }
        }
        l.acceptRun(digits)
        if l.accept(".") {
                l.acceptRun(digits)
        }
-       if l.accept("eE") {
+       if len(digits) == 10+1 && l.accept("eE") {
+               l.accept("+-")
+               l.acceptRun("0123456789_")
+       }
+       if len(digits) == 16+6+1 && l.accept("pP") {
                l.accept("+-")
-               l.acceptRun("0123456789")
+               l.acceptRun("0123456789_")
        }
        // Is it imaginary?
        l.accept("i")
index 6e7ece9db3e66f1071279b5c5231e6363120f5c4..563c4fc1cbe4d3db7215ef126534e78df47d1f66 100644 (file)
@@ -120,7 +120,7 @@ var lexTests = []lexTest{
        {"quote", `{{"abc \n\t\" "}}`, []item{tLeft, tQuote, tRight, tEOF}},
        {"raw quote", "{{" + raw + "}}", []item{tLeft, tRawQuote, tRight, tEOF}},
        {"raw quote with newline", "{{" + rawNL + "}}", []item{tLeft, tRawQuoteNL, tRight, tEOF}},
-       {"numbers", "{{1 02 0x14 -7.2i 1e3 +1.2e-4 4.2i 1+2i}}", []item{
+       {"numbers", "{{1 02 0x14 0X14 -7.2i 1e3 1E3 +1.2e-4 4.2i 1+2i 1_2 0x1.e_fp4 0X1.E_FP4}}", []item{
                tLeft,
                mkItem(itemNumber, "1"),
                tSpace,
@@ -128,15 +128,25 @@ var lexTests = []lexTest{
                tSpace,
                mkItem(itemNumber, "0x14"),
                tSpace,
+               mkItem(itemNumber, "0X14"),
+               tSpace,
                mkItem(itemNumber, "-7.2i"),
                tSpace,
                mkItem(itemNumber, "1e3"),
                tSpace,
+               mkItem(itemNumber, "1E3"),
+               tSpace,
                mkItem(itemNumber, "+1.2e-4"),
                tSpace,
                mkItem(itemNumber, "4.2i"),
                tSpace,
                mkItem(itemComplex, "1+2i"),
+               tSpace,
+               mkItem(itemNumber, "1_2"),
+               tSpace,
+               mkItem(itemNumber, "0x1.e_fp4"),
+               tSpace,
+               mkItem(itemNumber, "0X1.E_FP4"),
                tRight,
                tEOF,
        }},
index dca83dacceb4a032dd7b1cddc53cdfd9e8713afc..1174a4b970673ae6e4936e1def036238a45d46a6 100644 (file)
@@ -596,7 +596,7 @@ func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error
                if err == nil {
                        // If we parsed it as a float but it looks like an integer,
                        // it's a huge number too large to fit in an int. Reject it.
-                       if !strings.ContainsAny(text, ".eE") {
+                       if !strings.ContainsAny(text, ".eEpP") {
                                return nil, fmt.Errorf("integer overflow: %q", text)
                        }
                        n.IsFloat = true
index 15cc65670adbb9b5dadcfc51287b821e4af34817..6932cf232ea4a4e5f7a7d41def31a263786b96bc 100644 (file)
@@ -30,8 +30,15 @@ var numberTests = []numberTest{
        {"0", true, true, true, false, 0, 0, 0, 0},
        {"-0", true, true, true, false, 0, 0, 0, 0}, // check that -0 is a uint.
        {"73", true, true, true, false, 73, 73, 73, 0},
+       {"7_3", true, true, true, false, 73, 73, 73, 0},
+       {"0b10_010_01", true, true, true, false, 73, 73, 73, 0},
+       {"0B10_010_01", true, true, true, false, 73, 73, 73, 0},
        {"073", true, true, true, false, 073, 073, 073, 0},
+       {"0o73", true, true, true, false, 073, 073, 073, 0},
+       {"0O73", true, true, true, false, 073, 073, 073, 0},
        {"0x73", true, true, true, false, 0x73, 0x73, 0x73, 0},
+       {"0X73", true, true, true, false, 0x73, 0x73, 0x73, 0},
+       {"0x7_3", true, true, true, false, 0x73, 0x73, 0x73, 0},
        {"-73", true, false, true, false, -73, 0, -73, 0},
        {"+73", true, false, true, false, 73, 0, 73, 0},
        {"100", true, true, true, false, 100, 100, 100, 0},
@@ -39,7 +46,12 @@ var numberTests = []numberTest{
        {"-1e9", true, false, true, false, -1e9, 0, -1e9, 0},
        {"-1.2", false, false, true, false, 0, 0, -1.2, 0},
        {"1e19", false, true, true, false, 0, 1e19, 1e19, 0},
+       {"1e1_9", false, true, true, false, 0, 1e19, 1e19, 0},
+       {"1E19", false, true, true, false, 0, 1e19, 1e19, 0},
        {"-1e19", false, false, true, false, 0, 0, -1e19, 0},
+       {"0x_1p4", true, true, true, false, 16, 16, 16, 0},
+       {"0X_1P4", true, true, true, false, 16, 16, 16, 0},
+       {"0x_1p-4", false, false, true, false, 0, 0, 1 / 16., 0},
        {"4i", false, false, false, true, 0, 0, 0, 4i},
        {"-1.2+4.2i", false, false, false, true, 0, 0, 0, -1.2 + 4.2i},
        {"073i", false, false, false, true, 0, 0, 0, 73i}, // not octal!
@@ -232,6 +244,7 @@ var parseTests = []parseTest{
        {"trim left", "x \r\n\t{{- 3}}", noError, `"x"{{3}}`},
        {"trim right", "{{3 -}}\n\n\ty", noError, `{{3}}"y"`},
        {"trim left and right", "x \r\n\t{{- 3 -}}\n\n\ty", noError, `"x"{{3}}"y"`},
+       {"trim with extra spaces", "x\n{{-  3   -}}\ny", noError, `"x"{{3}}"y"`},
        {"comment trim left", "x \r\n\t{{- /* hi */}}", noError, `"x"`},
        {"comment trim right", "{{/* hi */ -}}\n\n\ty", noError, `"y"`},
        {"comment trim left and right", "x \r\n\t{{- /* */ -}}\n\n\ty", noError, `"x""y"`},
index 41cdd5682c165c8ee2099dcdfdef7e65bc836112..1135d819b99ae91d492b127e4e81159822e6481a 100644 (file)
@@ -50,6 +50,10 @@ func (t *Template) Name() string {
 // New allocates a new, undefined template associated with the given one and with the same
 // delimiters. The association, which is transitive, allows one template to
 // invoke another with a {{template}} action.
+//
+// Because associated templates share underlying data, template construction
+// cannot be done safely in parallel. Once the templates are constructed, they
+// can be executed in parallel.
 func (t *Template) New(name string) *Template {
        t.init()
        nt := &Template{
index 0fd325f2e4f02f77f3274ee39a1b75bee1f09e71..25c34ebc1cbd1fdbe7a328e040241e1d4f8b3065 100644 (file)
@@ -90,14 +90,21 @@ func ExampleDuration_Truncate() {
 func ExampleParseDuration() {
        hours, _ := time.ParseDuration("10h")
        complex, _ := time.ParseDuration("1h10m10s")
+       micro, _ := time.ParseDuration("1µs")
+       // The package also accepts the incorrect but common prefix u for micro.
+       micro2, _ := time.ParseDuration("1us")
 
        fmt.Println(hours)
        fmt.Println(complex)
-       fmt.Printf("there are %.0f seconds in %v\n", complex.Seconds(), complex)
+       fmt.Printf("There are %.0f seconds in %v.\n", complex.Seconds(), complex)
+       fmt.Printf("There are %d nanoseconds in %v.\n", micro.Nanoseconds(), micro)
+       fmt.Printf("There are %6.2e seconds in %v.\n", micro2.Seconds(), micro)
        // Output:
        // 10h0m0s
        // 1h10m10s
-       // there are 4210 seconds in 1h10m10s
+       // There are 4210 seconds in 1h10m10s.
+       // There are 1000 nanoseconds in 1µs.
+       // There are 1.00e-06 seconds in 1µs.
 }
 
 func ExampleDuration_Hours() {
@@ -113,15 +120,16 @@ func ExampleDuration_Minutes() {
 }
 
 func ExampleDuration_Nanoseconds() {
-       ns, _ := time.ParseDuration("1000ns")
-       fmt.Printf("one microsecond has %d nanoseconds.", ns.Nanoseconds())
-       // Output: one microsecond has 1000 nanoseconds.
+       u, _ := time.ParseDuration("1µs")
+       fmt.Printf("One microsecond is %d nanoseconds.\n", u.Nanoseconds())
+       // Output:
+       // One microsecond is 1000 nanoseconds.
 }
 
 func ExampleDuration_Seconds() {
        m, _ := time.ParseDuration("1m30s")
-       fmt.Printf("take off in t-%.0f seconds.", m.Seconds())
-       // Output: take off in t-90 seconds.
+       fmt.Printf("Take off in t-%.0f seconds.", m.Seconds())
+       // Output: Take off in t-90 seconds.
 }
 
 var c chan int
index ae24ceb99abd580c7d1512b7ad8a96b47bf471db..442c8da4a6e0a031fc6b943af63f26139f4c15c3 100644 (file)
@@ -35,4 +35,61 @@ var (
        ErrLocation            = errLocation
        ReadFile               = readFile
        LoadTzinfo             = loadTzinfo
+       NextStdChunk           = nextStdChunk
 )
+
+// StdChunkNames maps from nextStdChunk results to the matched strings.
+var StdChunkNames = map[int]string{
+       0:                               "",
+       stdLongMonth:                    "January",
+       stdMonth:                        "Jan",
+       stdNumMonth:                     "1",
+       stdZeroMonth:                    "01",
+       stdLongWeekDay:                  "Monday",
+       stdWeekDay:                      "Mon",
+       stdDay:                          "2",
+       stdUnderDay:                     "_2",
+       stdZeroDay:                      "02",
+       stdUnderYearDay:                 "__2",
+       stdZeroYearDay:                  "002",
+       stdHour:                         "15",
+       stdHour12:                       "3",
+       stdZeroHour12:                   "03",
+       stdMinute:                       "4",
+       stdZeroMinute:                   "04",
+       stdSecond:                       "5",
+       stdZeroSecond:                   "05",
+       stdLongYear:                     "2006",
+       stdYear:                         "06",
+       stdPM:                           "PM",
+       stdpm:                           "pm",
+       stdTZ:                           "MST",
+       stdISO8601TZ:                    "Z0700",
+       stdISO8601SecondsTZ:             "Z070000",
+       stdISO8601ShortTZ:               "Z07",
+       stdISO8601ColonTZ:               "Z07:00",
+       stdISO8601ColonSecondsTZ:        "Z07:00:00",
+       stdNumTZ:                        "-0700",
+       stdNumSecondsTz:                 "-070000",
+       stdNumShortTZ:                   "-07",
+       stdNumColonTZ:                   "-07:00",
+       stdNumColonSecondsTZ:            "-07:00:00",
+       stdFracSecond0 | 1<<stdArgShift: ".0",
+       stdFracSecond0 | 2<<stdArgShift: ".00",
+       stdFracSecond0 | 3<<stdArgShift: ".000",
+       stdFracSecond0 | 4<<stdArgShift: ".0000",
+       stdFracSecond0 | 5<<stdArgShift: ".00000",
+       stdFracSecond0 | 6<<stdArgShift: ".000000",
+       stdFracSecond0 | 7<<stdArgShift: ".0000000",
+       stdFracSecond0 | 8<<stdArgShift: ".00000000",
+       stdFracSecond0 | 9<<stdArgShift: ".000000000",
+       stdFracSecond9 | 1<<stdArgShift: ".9",
+       stdFracSecond9 | 2<<stdArgShift: ".99",
+       stdFracSecond9 | 3<<stdArgShift: ".999",
+       stdFracSecond9 | 4<<stdArgShift: ".9999",
+       stdFracSecond9 | 5<<stdArgShift: ".99999",
+       stdFracSecond9 | 6<<stdArgShift: ".999999",
+       stdFracSecond9 | 7<<stdArgShift: ".9999999",
+       stdFracSecond9 | 8<<stdArgShift: ".99999999",
+       stdFracSecond9 | 9<<stdArgShift: ".999999999",
+}
index 2adbbe07706d8edad93285e4c5b1ed4ef022ae67..b531cb47604f04a83399d8cbd22e96c8126af140 100644 (file)
@@ -48,6 +48,10 @@ import "errors"
 // The recognized day of week formats are "Mon" and "Monday".
 // The recognized month formats are "Jan" and "January".
 //
+// The formats 2, _2, and 02 are unpadded, space-padded, and zero-padded
+// day of month. The formats __2 and 002 are space-padded and zero-padded
+// three-character day of year; there is no unpadded day of year format.
+//
 // Text in the format string that is not recognized as part of the reference
 // time is echoed verbatim during Format and expected to appear verbatim
 // in the input to Parse.
@@ -96,6 +100,8 @@ const (
        stdDay                                         // "2"
        stdUnderDay                                    // "_2"
        stdZeroDay                                     // "02"
+       stdUnderYearDay                                // "__2"
+       stdZeroYearDay                                 // "002"
        stdHour                  = iota + stdNeedClock // "15"
        stdHour12                                      // "3"
        stdZeroHour12                                  // "03"
@@ -170,10 +176,13 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) {
                                }
                        }
 
-               case '0': // 01, 02, 03, 04, 05, 06
+               case '0': // 01, 02, 03, 04, 05, 06, 002
                        if len(layout) >= i+2 && '1' <= layout[i+1] && layout[i+1] <= '6' {
                                return layout[0:i], std0x[layout[i+1]-'1'], layout[i+2:]
                        }
+                       if len(layout) >= i+3 && layout[i+1] == '0' && layout[i+2] == '2' {
+                               return layout[0:i], stdZeroYearDay, layout[i+3:]
+                       }
 
                case '1': // 15, 1
                        if len(layout) >= i+2 && layout[i+1] == '5' {
@@ -187,7 +196,7 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) {
                        }
                        return layout[0:i], stdDay, layout[i+1:]
 
-               case '_': // _2, _2006
+               case '_': // _2, _2006, __2
                        if len(layout) >= i+2 && layout[i+1] == '2' {
                                //_2006 is really a literal _, followed by stdLongYear
                                if len(layout) >= i+5 && layout[i+1:i+5] == "2006" {
@@ -195,6 +204,9 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) {
                                }
                                return layout[0:i], stdUnderDay, layout[i+2:]
                        }
+                       if len(layout) >= i+3 && layout[i+1] == '_' && layout[i+2] == '2' {
+                               return layout[0:i], stdUnderYearDay, layout[i+3:]
+                       }
 
                case '3':
                        return layout[0:i], stdHour12, layout[i+1:]
@@ -503,6 +515,7 @@ func (t Time) AppendFormat(b []byte, layout string) []byte {
                year  int = -1
                month Month
                day   int
+               yday  int
                hour  int = -1
                min   int
                sec   int
@@ -520,7 +533,8 @@ func (t Time) AppendFormat(b []byte, layout string) []byte {
 
                // Compute year, month, day if needed.
                if year < 0 && std&stdNeedDate != 0 {
-                       year, month, day, _ = absDate(abs, true)
+                       year, month, day, yday = absDate(abs, true)
+                       yday++
                }
 
                // Compute hour, minute, second if needed.
@@ -560,6 +574,16 @@ func (t Time) AppendFormat(b []byte, layout string) []byte {
                        b = appendInt(b, day, 0)
                case stdZeroDay:
                        b = appendInt(b, day, 2)
+               case stdUnderYearDay:
+                       if yday < 100 {
+                               b = append(b, ' ')
+                               if yday < 10 {
+                                       b = append(b, ' ')
+                               }
+                       }
+                       b = appendInt(b, yday, 0)
+               case stdZeroYearDay:
+                       b = appendInt(b, yday, 3)
                case stdHour:
                        b = appendInt(b, hour, 2)
                case stdHour12:
@@ -688,7 +712,7 @@ func isDigit(s string, i int) bool {
        return '0' <= c && c <= '9'
 }
 
-// getnum parses s[0:1] or s[0:2] (fixed forces the latter)
+// getnum parses s[0:1] or s[0:2] (fixed forces s[0:2])
 // as a decimal integer and returns the integer and the
 // remainder of the string.
 func getnum(s string, fixed bool) (int, string, error) {
@@ -704,6 +728,20 @@ func getnum(s string, fixed bool) (int, string, error) {
        return int(s[0]-'0')*10 + int(s[1]-'0'), s[2:], nil
 }
 
+// getnum3 parses s[0:1], s[0:2], or s[0:3] (fixed forces s[0:3])
+// as a decimal integer and returns the integer and the remainder
+// of the string.
+func getnum3(s string, fixed bool) (int, string, error) {
+       var n, i int
+       for i = 0; i < 3 && isDigit(s, i); i++ {
+               n = n*10 + int(s[i]-'0')
+       }
+       if i == 0 || fixed && i != 3 {
+               return 0, s, errBad
+       }
+       return n, s[i:], nil
+}
+
 func cutspace(s string) string {
        for len(s) > 0 && s[0] == ' ' {
                s = s[1:]
@@ -792,8 +830,9 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
        // Time being constructed.
        var (
                year       int
-               month      int = 1 // January
-               day        int = 1
+               month      int = -1
+               day        int = -1
+               yday       int = -1
                hour       int
                min        int
                sec        int
@@ -826,9 +865,12 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
                                err = errBad
                                break
                        }
+                       hold := value
                        p, value = value[0:2], value[2:]
                        year, err = atoi(p)
-                       if year >= 69 { // Unix time starts Dec 31 1969 in some time zones
+                       if err != nil {
+                               value = hold
+                       } else if year >= 69 { // Unix time starts Dec 31 1969 in some time zones
                                year += 1900
                        } else {
                                year += 2000
@@ -848,7 +890,7 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
                        month++
                case stdNumMonth, stdZeroMonth:
                        month, value, err = getnum(value, std == stdZeroMonth)
-                       if month <= 0 || 12 < month {
+                       if err == nil && (month <= 0 || 12 < month) {
                                rangeErrString = "month"
                        }
                case stdWeekDay:
@@ -861,10 +903,17 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
                                value = value[1:]
                        }
                        day, value, err = getnum(value, std == stdZeroDay)
-                       if day < 0 {
-                               // Note that we allow any one- or two-digit day here.
-                               rangeErrString = "day"
+                       // Note that we allow any one- or two-digit day here.
+                       // The month, day, year combination is validated after we've completed parsing.
+               case stdUnderYearDay, stdZeroYearDay:
+                       for i := 0; i < 2; i++ {
+                               if std == stdUnderYearDay && len(value) > 0 && value[0] == ' ' {
+                                       value = value[1:]
+                               }
                        }
+                       yday, value, err = getnum3(value, std == stdZeroYearDay)
+                       // Note that we allow any one-, two-, or three-digit year-day here.
+                       // The year-day, year combination is validated after we've completed parsing.
                case stdHour:
                        hour, value, err = getnum(value, false)
                        if hour < 0 || 24 <= hour {
@@ -1044,6 +1093,47 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
                hour = 0
        }
 
+       // Convert yday to day, month.
+       if yday >= 0 {
+               var d int
+               var m int
+               if isLeap(year) {
+                       if yday == 31+29 {
+                               m = int(February)
+                               d = 29
+                       } else if yday > 31+29 {
+                               yday--
+                       }
+               }
+               if yday < 1 || yday > 365 {
+                       return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year out of range"}
+               }
+               if m == 0 {
+                       m = yday/31 + 1
+                       if int(daysBefore[m]) < yday {
+                               m++
+                       }
+                       d = yday - int(daysBefore[m-1])
+               }
+               // If month, day already seen, yday's m, d must match.
+               // Otherwise, set them from m, d.
+               if month >= 0 && month != m {
+                       return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year does not match month"}
+               }
+               month = m
+               if day >= 0 && day != d {
+                       return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year does not match day"}
+               }
+               day = d
+       } else {
+               if month < 0 {
+                       month = int(January)
+               }
+               if day < 0 {
+                       day = 1
+               }
+       }
+
        // Validate the day of the month.
        if day < 1 || day > daysIn(Month(month), year) {
                return Time{}, &ParseError{alayout, avalue, "", value, ": day out of range"}
index 0b9f3f4944789275532ff624b1813e729207e4d4..ac215706e1564bfa3b3ebdc9aa8c5e90f5f4bb3b 100644 (file)
@@ -13,6 +13,60 @@ import (
        . "time"
 )
 
+var nextStdChunkTests = []string{
+       "(2006)-(01)-(02)T(15):(04):(05)(Z07:00)",
+       "(2006)-(01)-(02) (002) (15):(04):(05)",
+       "(2006)-(01) (002) (15):(04):(05)",
+       "(2006)-(002) (15):(04):(05)",
+       "(2006)(002)(01) (15):(04):(05)",
+       "(2006)(002)(04) (15):(04):(05)",
+}
+
+func TestNextStdChunk(t *testing.T) {
+       // Most bugs in Parse or Format boil down to problems with
+       // the exact detection of format chunk boundaries in the
+       // helper function nextStdChunk (here called as NextStdChunk).
+       // This test checks nextStdChunk's behavior directly,
+       // instead of needing to test it only indirectly through Parse/Format.
+
+       // markChunks returns format with each detected
+       // 'format chunk' parenthesized.
+       // For example showChunks("2006-01-02") == "(2006)-(01)-(02)".
+       markChunks := func(format string) string {
+               // Note that NextStdChunk and StdChunkNames
+               // are not part of time's public API.
+               // They are exported in export_test for this test.
+               out := ""
+               for s := format; s != ""; {
+                       prefix, std, suffix := NextStdChunk(s)
+                       out += prefix
+                       if std > 0 {
+                               out += "(" + StdChunkNames[std] + ")"
+                       }
+                       s = suffix
+               }
+               return out
+       }
+
+       noParens := func(r rune) rune {
+               if r == '(' || r == ')' {
+                       return -1
+               }
+               return r
+       }
+
+       for _, marked := range nextStdChunkTests {
+               // marked is an expected output from markChunks.
+               // If we delete the parens and pass it through markChunks,
+               // we should get the original back.
+               format := strings.Map(noParens, marked)
+               out := markChunks(format)
+               if out != marked {
+                       t.Errorf("nextStdChunk parses %q as %q, want %q", format, out, marked)
+               }
+       }
+}
+
 type TimeFormatTest struct {
        time           Time
        formattedValue string
@@ -61,6 +115,7 @@ var formatTests = []FormatTest{
        {"StampMilli", StampMilli, "Feb  4 21:00:57.012"},
        {"StampMicro", StampMicro, "Feb  4 21:00:57.012345"},
        {"StampNano", StampNano, "Feb  4 21:00:57.012345600"},
+       {"YearDay", "Jan  2 002 __2 2", "Feb  4 035  35 4"},
 }
 
 func TestFormat(t *testing.T) {
@@ -180,6 +235,13 @@ var parseTests = []ParseTest{
        {"", "Jan _2 15:04:05.999", "Feb  4 21:00:57.012345678", false, false, -1, 9},
        {"", "Jan _2 15:04:05.999999999", "Feb  4 21:00:57.0123", false, false, -1, 4},
        {"", "Jan _2 15:04:05.999999999", "Feb  4 21:00:57.012345678", false, false, -1, 9},
+
+       // Day of year.
+       {"", "2006-01-02 002 15:04:05", "2010-02-04 035 21:00:57", false, false, 1, 0},
+       {"", "2006-01 002 15:04:05", "2010-02 035 21:00:57", false, false, 1, 0},
+       {"", "2006-002 15:04:05", "2010-035 21:00:57", false, false, 1, 0},
+       {"", "200600201 15:04:05", "201003502 21:00:57", false, false, 1, 0},
+       {"", "200600204 15:04:05", "201003504 21:00:57", false, false, 1, 0},
 }
 
 func TestParse(t *testing.T) {
@@ -487,6 +549,10 @@ var parseErrorTests = []ParseErrorTest{
        // issue 21113
        {"_2 Jan 06 15:04 MST", "4 --- 00 00:00 GMT", "cannot parse"},
        {"_2 January 06 15:04 MST", "4 --- 00 00:00 GMT", "cannot parse"},
+
+       // invalid or mismatched day-of-year
+       {"Jan _2 002 2006", "Feb  4 034 2006", "day-of-year does not match day"},
+       {"Jan _2 002 2006", "Feb  4 004 2006", "day-of-year does not match month"},
 }
 
 func TestParseErrors(t *testing.T) {
@@ -646,3 +712,49 @@ func TestUnderscoreTwoThousand(t *testing.T) {
                t.Errorf("Incorrect minute, got %d", m)
        }
 }
+
+// Issue 29918, 29916
+func TestStd0xParseError(t *testing.T) {
+       tests := []struct {
+               format, value, valueElemPrefix string
+       }{
+               {"01 MST", "0 MST", "0"},
+               {"01 MST", "1 MST", "1"},
+               {RFC850, "Thursday, 04-Feb-1 21:00:57 PST", "1"},
+       }
+       for _, tt := range tests {
+               _, err := Parse(tt.format, tt.value)
+               if err == nil {
+                       t.Errorf("Parse(%q, %q) did not fail as expected", tt.format, tt.value)
+               } else if perr, ok := err.(*ParseError); !ok {
+                       t.Errorf("Parse(%q, %q) returned error type %T, expected ParseError", tt.format, tt.value, perr)
+               } else if !strings.Contains(perr.Error(), "cannot parse") || !strings.HasPrefix(perr.ValueElem, tt.valueElemPrefix) {
+                       t.Errorf("Parse(%q, %q) returned wrong parsing error message: %v", tt.format, tt.value, perr)
+               }
+       }
+}
+
+var monthOutOfRangeTests = []struct {
+       value string
+       ok    bool
+}{
+       {"00-01", false},
+       {"13-01", false},
+       {"01-01", true},
+}
+
+func TestParseMonthOutOfRange(t *testing.T) {
+       for _, test := range monthOutOfRangeTests {
+               _, err := Parse("01-02", test.value)
+               switch {
+               case !test.ok && err != nil:
+                       if !strings.Contains(err.Error(), "month out of range") {
+                               t.Errorf("%q: expected 'month' error, got %v", test.value, err)
+                       }
+               case test.ok && err != nil:
+                       t.Errorf("%q: unexpected error: %v", test.value, err)
+               case !test.ok && err == nil:
+                       t.Errorf("%q: expected 'month' error, got none", test.value)
+               }
+       }
+}
index d0d780fd6ca8354a9349d2f45e32fee83c86a18d..c8116a74f43b78ff51d9a8843d0656a2561b7d2c 100644 (file)
@@ -783,6 +783,12 @@ func fmtInt(buf []byte, v uint64) int {
 // Nanoseconds returns the duration as an integer nanosecond count.
 func (d Duration) Nanoseconds() int64 { return int64(d) }
 
+// Microseconds returns the duration as an integer microsecond count.
+func (d Duration) Microseconds() int64 { return int64(d) / 1e3 }
+
+// Milliseconds returns the duration as an integer millisecond count.
+func (d Duration) Milliseconds() int64 { return int64(d) / 1e6 }
+
 // These methods return float64 because the dominant
 // use case is for printing a floating point number like 1.5s, and
 // a truncation to integer would make them not useful in those cases.
@@ -900,16 +906,33 @@ func (t Time) Sub(u Time) Duration {
                }
                return d
        }
-       d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec())
-       // Check for overflow or underflow.
-       switch {
-       case u.Add(d).Equal(t):
-               return d // d is correct
-       case t.Before(u):
+
+       ts, us := t.sec(), u.sec()
+
+       var sec, nsec, d int64
+
+       ssub := ts - us
+       if (ssub < ts) != (us > 0) {
+               goto overflow
+       }
+
+       if ssub < int64(minDuration/Second) || ssub > int64(maxDuration/Second) {
+               goto overflow
+       }
+       sec = ssub * int64(Second)
+
+       nsec = int64(t.nsec() - u.nsec())
+       d = sec + nsec
+       if (d > sec) != (nsec > 0) {
+               goto overflow
+       }
+       return Duration(d)
+
+overflow:
+       if t.Before(u) {
                return minDuration // t - u is negative out of range
-       default:
-               return maxDuration // t - u is positive out of range
        }
+       return maxDuration // t - u is positive out of range
 }
 
 // Since returns the time elapsed since t.
@@ -917,7 +940,7 @@ func (t Time) Sub(u Time) Duration {
 func Since(t Time) Duration {
        var now Time
        if t.wall&hasMonotonic != 0 {
-               // Common case optimization: if t has monotomic time, then Sub will use only it.
+               // Common case optimization: if t has monotonic time, then Sub will use only it.
                now = Time{hasMonotonic, runtimeNano() - startNano, nil}
        } else {
                now = Now()
@@ -930,7 +953,7 @@ func Since(t Time) Duration {
 func Until(t Time) Duration {
        var now Time
        if t.wall&hasMonotonic != 0 {
-               // Common case optimization: if t has monotomic time, then Sub will use only it.
+               // Common case optimization: if t has monotonic time, then Sub will use only it.
                now = Time{hasMonotonic, runtimeNano() - startNano, nil}
        } else {
                now = Now()
index 432a67dec3c5d7bd2658d6fd68dd1465187d2d43..dd3a8160cd86d7c706d9ad5d462c0db210c08f4c 100644 (file)
@@ -522,13 +522,28 @@ var yearDayLocations = []*Location{
 }
 
 func TestYearDay(t *testing.T) {
-       for _, loc := range yearDayLocations {
+       for i, loc := range yearDayLocations {
                for _, ydt := range yearDayTests {
                        dt := Date(ydt.year, Month(ydt.month), ydt.day, 0, 0, 0, 0, loc)
                        yday := dt.YearDay()
                        if yday != ydt.yday {
-                               t.Errorf("got %d, expected %d for %d-%02d-%02d in %v",
-                                       yday, ydt.yday, ydt.year, ydt.month, ydt.day, loc)
+                               t.Errorf("Date(%d-%02d-%02d in %v).YearDay() = %d, want %d",
+                                       ydt.year, ydt.month, ydt.day, loc, yday, ydt.yday)
+                               continue
+                       }
+
+                       if ydt.year < 0 || ydt.year > 9999 {
+                               continue
+                       }
+                       f := fmt.Sprintf("%04d-%02d-%02d %03d %+.2d00",
+                               ydt.year, ydt.month, ydt.day, ydt.yday, (i-2)*4)
+                       dt1, err := Parse("2006-01-02 002 -0700", f)
+                       if err != nil {
+                               t.Errorf(`Parse("2006-01-02 002 -0700", %q): %v`, f, err)
+                               continue
+                       }
+                       if !dt1.Equal(dt) {
+                               t.Errorf(`Parse("2006-01-02 002 -0700", %q) = %v, want %v`, f, dt1, dt)
                        }
                }
        }
@@ -993,6 +1008,14 @@ func TestSub(t *testing.T) {
        }
 }
 
+func BenchmarkSub(b *testing.B) {
+       for i := 0; i < b.N; i++ {
+               for _, st := range subTests {
+                       st.t.Sub(st.u)
+               }
+       }
+}
+
 var nsDurationTests = []struct {
        d    Duration
        want int64
@@ -1006,7 +1029,39 @@ var nsDurationTests = []struct {
 func TestDurationNanoseconds(t *testing.T) {
        for _, tt := range nsDurationTests {
                if got := tt.d.Nanoseconds(); got != tt.want {
-                       t.Errorf("d.Nanoseconds() = %d; want: %d", got, tt.want)
+                       t.Errorf("Duration(%s).Nanoseconds() = %d; want: %d", tt.d, got, tt.want)
+               }
+       }
+}
+
+var usDurationTests = []struct {
+       d    Duration
+       want int64
+}{
+       {Duration(-1000), -1},
+       {Duration(1000), 1},
+}
+
+func TestDurationMicroseconds(t *testing.T) {
+       for _, tt := range usDurationTests {
+               if got := tt.d.Microseconds(); got != tt.want {
+                       t.Errorf("Duration(%s).Microseconds() = %d; want: %d", tt.d, got, tt.want)
+               }
+       }
+}
+
+var msDurationTests = []struct {
+       d    Duration
+       want int64
+}{
+       {Duration(-1000000), -1},
+       {Duration(1000000), 1},
+}
+
+func TestDurationMilliseconds(t *testing.T) {
+       for _, tt := range msDurationTests {
+               if got := tt.d.Milliseconds(); got != tt.want {
+                       t.Errorf("Duration(%s).Milliseconds() = %d; want: %d", tt.d, got, tt.want)
                }
        }
 }
@@ -1021,7 +1076,7 @@ var secDurationTests = []struct {
 func TestDurationSeconds(t *testing.T) {
        for _, tt := range secDurationTests {
                if got := tt.d.Seconds(); got != tt.want {
-                       t.Errorf("d.Seconds() = %g; want: %g", got, tt.want)
+                       t.Errorf("Duration(%s).Seconds() = %g; want: %g", tt.d, got, tt.want)
                }
        }
 }
@@ -1040,7 +1095,7 @@ var minDurationTests = []struct {
 func TestDurationMinutes(t *testing.T) {
        for _, tt := range minDurationTests {
                if got := tt.d.Minutes(); got != tt.want {
-                       t.Errorf("d.Minutes() = %g; want: %g", got, tt.want)
+                       t.Errorf("Duration(%s).Minutes() = %g; want: %g", tt.d, got, tt.want)
                }
        }
 }
@@ -1059,7 +1114,7 @@ var hourDurationTests = []struct {
 func TestDurationHours(t *testing.T) {
        for _, tt := range hourDurationTests {
                if got := tt.d.Hours(); got != tt.want {
-                       t.Errorf("d.Hours() = %g; want: %g", got, tt.want)
+                       t.Errorf("Duration(%s).Hours() = %g; want: %g", tt.d, got, tt.want)
                }
        }
 }
index 6d7f975a11443060b6f83ea99afce81fd76c6d29..f5a97befd899cc9fff5658fa956317b4f1724f10 100644 (file)
@@ -7,22 +7,37 @@
 
 package time
 
-import "syscall"
+import (
+       "runtime"
+       "syscall"
+)
 
 var zoneSources = []string{
-       getZipParent() + "/zoneinfo.zip",
+       getZoneRoot() + "/zoneinfo.zip",
 }
 
-func getZipParent() string {
-       wd, err := syscall.Getwd()
-       if err != nil {
-               return "/XXXNOEXIST"
-       }
-
+func getZoneRoot() string {
        // The working directory at initialization is the root of the
        // app bundle: "/private/.../bundlename.app". That's where we
-       // keep zoneinfo.zip.
-       return wd
+       // keep zoneinfo.zip for tethered iOS builds.
+       // For self-hosted iOS builds, the zoneinfo.zip is in GOROOT.
+       roots := []string{runtime.GOROOT() + "/lib/time"}
+       wd, err := syscall.Getwd()
+       if err == nil {
+               roots = append(roots, wd)
+       }
+       for _, r := range roots {
+               var st syscall.Stat_t
+               fd, err := syscall.Open(r, syscall.O_RDONLY, 0)
+               if err != nil {
+                       continue
+               }
+               defer syscall.Close(fd)
+               if err := syscall.Fstat(fd, &st); err == nil {
+                       return r
+               }
+       }
+       return "/XXXNOEXIST"
 }
 
 func initLocal() {
index d8d4070d5b51a1661344c11cf0e0fa0df39c920d..1e559a62cc291cec68e560b98eabe0275ec85083 100644 (file)
@@ -59,6 +59,16 @@ func (d *dataIO) big4() (n uint32, ok bool) {
        return uint32(p[3]) | uint32(p[2])<<8 | uint32(p[1])<<16 | uint32(p[0])<<24, true
 }
 
+func (d *dataIO) big8() (n uint64, ok bool) {
+       n1, ok1 := d.big4()
+       n2, ok2 := d.big4()
+       if !ok1 || !ok2 {
+               d.error = true
+               return 0, false
+       }
+       return (uint64(n1) << 32) | uint64(n2), true
+}
+
 func (d *dataIO) byte() (n byte, ok bool) {
        p := d.read(1)
        if len(p) < 1 {
@@ -93,9 +103,21 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) {
        }
 
        // 1-byte version, then 15 bytes of padding
+       var version int
        var p []byte
-       if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' && p[0] != '3' {
+       if p = d.read(16); len(p) != 16 {
                return nil, badData
+       } else {
+               switch p[0] {
+               case 0:
+                       version = 1
+               case '2':
+                       version = 2
+               case '3':
+                       version = 3
+               default:
+                       return nil, badData
+               }
        }
 
        // six big-endian 32-bit integers:
@@ -119,11 +141,53 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) {
                if !ok {
                        return nil, badData
                }
+               if uint32(int(nn)) != nn {
+                       return nil, badData
+               }
                n[i] = int(nn)
        }
 
+       // If we have version 2 or 3, then the data is first written out
+       // in a 32-bit format, then written out again in a 64-bit format.
+       // Skip the 32-bit format and read the 64-bit one, as it can
+       // describe a broader range of dates.
+
+       is64 := false
+       if version > 1 {
+               // Skip the 32-bit data.
+               skip := n[NTime]*4 +
+                       n[NTime] +
+                       n[NZone]*6 +
+                       n[NChar] +
+                       n[NLeap]*8 +
+                       n[NStdWall] +
+                       n[NUTCLocal]
+               // Skip the version 2 header that we just read.
+               skip += 4 + 16
+               d.read(skip)
+
+               is64 = true
+
+               // Read the counts again, they can differ.
+               for i := 0; i < 6; i++ {
+                       nn, ok := d.big4()
+                       if !ok {
+                               return nil, badData
+                       }
+                       if uint32(int(nn)) != nn {
+                               return nil, badData
+                       }
+                       n[i] = int(nn)
+               }
+       }
+
+       size := 4
+       if is64 {
+               size = 8
+       }
+
        // Transition times.
-       txtimes := dataIO{d.read(n[NTime] * 4), false}
+       txtimes := dataIO{d.read(n[NTime] * size), false}
 
        // Time zone indices for transition times.
        txzones := d.read(n[NTime])
@@ -135,7 +199,7 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) {
        abbrev := d.read(n[NChar])
 
        // Leap-second time pairs
-       d.read(n[NLeap] * 8)
+       d.read(n[NLeap] * (size + 4))
 
        // Whether tx times associated with local time types
        // are specified as standard time or wall time.
@@ -149,20 +213,25 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) {
                return nil, badData
        }
 
-       // If version == 2 or 3, the entire file repeats, this time using
-       // 8-byte ints for txtimes and leap seconds.
-       // We won't need those until 2106.
-
        // Now we can build up a useful data structure.
        // First the zone information.
        //      utcoff[4] isdst[1] nameindex[1]
-       zone := make([]zone, n[NZone])
+       nzone := n[NZone]
+       if nzone == 0 {
+               // Reject tzdata files with no zones. There's nothing useful in them.
+               // This also avoids a panic later when we add and then use a fake transition (golang.org/issue/29437).
+               return nil, badData
+       }
+       zone := make([]zone, nzone)
        for i := range zone {
                var ok bool
                var n uint32
                if n, ok = zonedata.big4(); !ok {
                        return nil, badData
                }
+               if uint32(int(n)) != n {
+                       return nil, badData
+               }
                zone[i].offset = int(int32(n))
                var b byte
                if b, ok = zonedata.byte(); !ok {
@@ -186,12 +255,21 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) {
        // Now the transition time info.
        tx := make([]zoneTrans, n[NTime])
        for i := range tx {
-               var ok bool
-               var n uint32
-               if n, ok = txtimes.big4(); !ok {
-                       return nil, badData
+               var n int64
+               if !is64 {
+                       if n4, ok := txtimes.big4(); !ok {
+                               return nil, badData
+                       } else {
+                               n = int64(int32(n4))
+                       }
+               } else {
+                       if n8, ok := txtimes.big8(); !ok {
+                               return nil, badData
+                       } else {
+                               n = int64(n8)
+                       }
                }
-               tx[i].when = int64(int32(n))
+               tx[i].when = n
                if int(txzones[i]) >= len(zone) {
                        return nil, badData
                }
index 2f7612d018f39bb1e3fefcb741babce1cce987bf..9ef64def10442ed2ecb42c6b10617b9d04207855 100644 (file)
@@ -157,3 +157,34 @@ func TestLoadLocationFromTZData(t *testing.T) {
                t.Errorf("return values of LoadLocationFromTZData and LoadLocation don't match")
        }
 }
+
+// Issue 30099.
+func TestEarlyLocation(t *testing.T) {
+       t.Skip("gccgo does not use the zip file")
+       time.ForceZipFileForTesting(true)
+       defer time.ForceZipFileForTesting(false)
+
+       const locName = "America/New_York"
+       loc, err := time.LoadLocation(locName)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       d := time.Date(1900, time.January, 1, 0, 0, 0, 0, loc)
+       tzName, tzOffset := d.Zone()
+       if want := "EST"; tzName != want {
+               t.Errorf("Zone name == %s, want %s", tzName, want)
+       }
+       if want := -18000; tzOffset != want {
+               t.Errorf("Zone offset == %d, want %d", tzOffset, want)
+       }
+}
+
+func TestMalformedTZData(t *testing.T) {
+       // The goal here is just that malformed tzdata results in an error, not a panic.
+       issue29437 := "TZif\x00000000000000000\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000"
+       _, err := time.LoadLocationFromTZData("abc", []byte(issue29437))
+       if err == nil {
+               t.Error("expected error, got none")
+       }
+}
index 8be9a7b7c96a4ffc7c4d10d7051e1835099c432e..a57566f0a527cf7132f52ea1bd99caf02087dfab 100644 (file)
@@ -6,9 +6,6 @@
 // Unicode code points.
 package unicode
 
-// Tables are regenerated each time we update the Unicode version.
-//go:generate go run maketables.go -tables=all -output tables.go
-
 const (
        MaxRune         = '\U0010FFFF' // Maximum valid Unicode code point.
        ReplacementChar = '\uFFFD'     // Represents invalid code points.
index 7d760fc5e301a57663c02ac06b93e5d12d71c62f..66bfa3cb9e95d0fb716670c26ed643dd2508b30b 100644 (file)
@@ -14,162 +14,6 @@ type T struct {
        script string
 }
 
-// Hand-chosen tests from Unicode 5.1.0, 6.0.0, 6.2.0, 6.3.0, 7.0.0, 8.0.0,
-// 9.0.0, 10.0.0.
-// mostly to discover when new scripts and categories arise.
-// If this tests fails, add the missing scripts to the test and add entries
-// of the form
-//     pkg unicode, var <new script> *RangeTable
-// to api/next.txt.
-var inTest = []T{
-       {0x11711, "Ahom"},
-       {0x1e900, "Adlam"},
-       {0x14646, "Anatolian_Hieroglyphs"},
-       {0x06e2, "Arabic"},
-       {0x0567, "Armenian"},
-       {0x10b20, "Avestan"},
-       {0x11c00, "Bhaiksuki"},
-       {0x1b37, "Balinese"},
-       {0xa6af, "Bamum"},
-       {0x16ada, "Bassa_Vah"},
-       {0x1be1, "Batak"},
-       {0x09c2, "Bengali"},
-       {0x3115, "Bopomofo"},
-       {0x282d, "Braille"},
-       {0x1a1a, "Buginese"},
-       {0x1747, "Buhid"},
-       {0x11011, "Brahmi"},
-       {0x156d, "Canadian_Aboriginal"},
-       {0x102a9, "Carian"},
-       {0x10563, "Caucasian_Albanian"},
-       {0x11111, "Chakma"},
-       {0xaa4d, "Cham"},
-       {0x13c2, "Cherokee"},
-       {0x0020, "Common"},
-       {0x1d4a5, "Common"},
-       {0x2cfc, "Coptic"},
-       {0x12420, "Cuneiform"},
-       {0x1080c, "Cypriot"},
-       {0xa663, "Cyrillic"},
-       {0x10430, "Deseret"},
-       {0x094a, "Devanagari"},
-       {0x1BC00, "Duployan"},
-       {0x13001, "Egyptian_Hieroglyphs"},
-       {0x10500, "Elbasan"},
-       {0x1271, "Ethiopic"},
-       {0x10fc, "Georgian"},
-       {0x2c40, "Glagolitic"},
-       {0x10347, "Gothic"},
-       {0x11303, "Grantha"},
-       {0x03ae, "Greek"},
-       {0x0abf, "Gujarati"},
-       {0x0a24, "Gurmukhi"},
-       {0x3028, "Han"},
-       {0x11b8, "Hangul"},
-       {0x1727, "Hanunoo"},
-       {0x108FF, "Hatran"},
-       {0x05a0, "Hebrew"},
-       {0x3058, "Hiragana"},
-       {0x10841, "Imperial_Aramaic"},
-       {0x20e6, "Inherited"},
-       {0x10b70, "Inscriptional_Pahlavi"},
-       {0x10b5a, "Inscriptional_Parthian"},
-       {0xa9d0, "Javanese"},
-       {0x1109f, "Kaithi"},
-       {0x0cbd, "Kannada"},
-       {0x30a6, "Katakana"},
-       {0xa928, "Kayah_Li"},
-       {0x10a11, "Kharoshthi"},
-       {0x17c6, "Khmer"},
-       {0x11211, "Khojki"},
-       {0x112df, "Khudawadi"},
-       {0x0eaa, "Lao"},
-       {0x1d79, "Latin"},
-       {0x1c10, "Lepcha"},
-       {0x1930, "Limbu"},
-       {0x10755, "Linear_A"},
-       {0x1003c, "Linear_B"},
-       {0xa4e1, "Lisu"},
-       {0x10290, "Lycian"},
-       {0x10930, "Lydian"},
-       {0x11173, "Mahajani"},
-       {0x0d42, "Malayalam"},
-       {0x0843, "Mandaic"},
-       {0x10ac8, "Manichaean"},
-       {0x11cB6, "Marchen"},
-       {0x11d59, "Masaram_Gondi"},
-       {0xabd0, "Meetei_Mayek"},
-       {0x1e800, "Mende_Kikakui"},
-       {0x1099f, "Meroitic_Hieroglyphs"},
-       {0x109a0, "Meroitic_Cursive"},
-       {0x16f00, "Miao"},
-       {0x11611, "Modi"},
-       {0x1822, "Mongolian"},
-       {0x16a60, "Mro"},
-       {0x11293, "Multani"},
-       {0x104c, "Myanmar"},
-       {0x10880, "Nabataean"},
-       {0x11400, "Newa"},
-       {0x19c3, "New_Tai_Lue"},
-       {0x07f8, "Nko"},
-       {0x1b170, "Nushu"},
-       {0x169b, "Ogham"},
-       {0x1c6a, "Ol_Chiki"},
-       {0x10C80, "Old_Hungarian"},
-       {0x10310, "Old_Italic"},
-       {0x10a80, "Old_North_Arabian"},
-       {0x10350, "Old_Permic"},
-       {0x103c9, "Old_Persian"},
-       {0x10a6f, "Old_South_Arabian"},
-       {0x10c20, "Old_Turkic"},
-       {0x0b3e, "Oriya"},
-       {0x104d9, "Osage"},
-       {0x10491, "Osmanya"},
-       {0x16b2b, "Pahawh_Hmong"},
-       {0x10876, "Palmyrene"},
-       {0x11ACE, "Pau_Cin_Hau"},
-       {0xa860, "Phags_Pa"},
-       {0x10918, "Phoenician"},
-       {0x10baf, "Psalter_Pahlavi"},
-       {0xa949, "Rejang"},
-       {0x16c0, "Runic"},
-       {0x081d, "Samaritan"},
-       {0xa892, "Saurashtra"},
-       {0x111a0, "Sharada"},
-       {0x10463, "Shavian"},
-       {0x115c1, "Siddham"},
-       {0x1D920, "SignWriting"},
-       {0x0dbd, "Sinhala"},
-       {0x110d0, "Sora_Sompeng"},
-       {0x11a99, "Soyombo"},
-       {0x1ba3, "Sundanese"},
-       {0xa803, "Syloti_Nagri"},
-       {0x070f, "Syriac"},
-       {0x170f, "Tagalog"},
-       {0x176f, "Tagbanwa"},
-       {0x1972, "Tai_Le"},
-       {0x1a62, "Tai_Tham"},
-       {0xaadc, "Tai_Viet"},
-       {0x116c9, "Takri"},
-       {0x0bbf, "Tamil"},
-       {0x17000, "Tangut"},
-       {0x0c55, "Telugu"},
-       {0x07a7, "Thaana"},
-       {0x0e46, "Thai"},
-       {0x0f36, "Tibetan"},
-       {0x2d55, "Tifinagh"},
-       {0x114d9, "Tirhuta"},
-       {0x10388, "Ugaritic"},
-       {0xa60e, "Vai"},
-       {0x118ff, "Warang_Citi"},
-       {0xa216, "Yi"},
-       {0x11a0a, "Zanabazar_Square"},
-}
-
-var outTest = []T{ // not really worth being thorough
-       {0x20, "Telugu"},
-}
-
 var inCategoryTest = []T{
        {0x0081, "Cc"},
        {0x200B, "Cf"},
@@ -248,30 +92,6 @@ var inPropTest = []T{
        {0x0020, "White_Space"},
 }
 
-func TestScripts(t *testing.T) {
-       notTested := make(map[string]bool)
-       for k := range Scripts {
-               notTested[k] = true
-       }
-       for _, test := range inTest {
-               if _, ok := Scripts[test.script]; !ok {
-                       t.Fatal(test.script, "not a known script")
-               }
-               if !Is(Scripts[test.script], test.rune) {
-                       t.Errorf("IsScript(%U, %s) = false, want true", test.rune, test.script)
-               }
-               delete(notTested, test.script)
-       }
-       for _, test := range outTest {
-               if Is(Scripts[test.script], test.rune) {
-                       t.Errorf("IsScript(%U, %s) = true, want false", test.rune, test.script)
-               }
-       }
-       for k := range notTested {
-               t.Error("script not tested:", k)
-       }
-}
-
 func TestCategories(t *testing.T) {
        notTested := make(map[string]bool)
        for k := range Categories {
index ce85b128ca4dc866515d2303e858b13d60c2371f..ba7631b6d81b1f504d9471dba641f4350693fded 100644 (file)
@@ -1,15 +1,9 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Code generated by maketables; DO NOT EDIT.
-// To regenerate, run:
-//     maketables --tables=all --data=http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt --casefolding=http://www.unicode.org/Public/10.0.0/ucd/CaseFolding.txt
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
 
 package unicode
 
 // Version is the Unicode edition from which the tables are derived.
-const Version = "10.0.0"
+const Version = "11.0.0"
 
 // Categories is the set of Unicode category tables.
 var Categories = map[string]*RangeTable{
@@ -69,8 +63,8 @@ var _C = &RangeTable{
                {0xfffa, 0xfffb, 1},
        },
        R32: []Range32{
-               {0x110bd, 0x1bca0, 44003},
-               {0x1bca1, 0x1bca3, 1},
+               {0x110bd, 0x110cd, 16},
+               {0x1bca0, 0x1bca3, 1},
                {0x1d173, 0x1d17a, 1},
                {0xe0001, 0xe0020, 31},
                {0xe0021, 0xe007f, 1},
@@ -103,8 +97,8 @@ var _Cf = &RangeTable{
                {0xfffa, 0xfffb, 1},
        },
        R32: []Range32{
-               {0x110bd, 0x1bca0, 44003},
-               {0x1bca1, 0x1bca3, 1},
+               {0x110bd, 0x110cd, 16},
+               {0x1bca0, 0x1bca3, 1},
                {0x1d173, 0x1d17a, 1},
                {0xe0001, 0xe0020, 31},
                {0xe0021, 0xe007f, 1},
@@ -150,10 +144,10 @@ var _L = &RangeTable{
                {0x03f7, 0x0481, 1},
                {0x048a, 0x052f, 1},
                {0x0531, 0x0556, 1},
-               {0x0559, 0x0561, 8},
-               {0x0562, 0x0587, 1},
+               {0x0559, 0x0560, 7},
+               {0x0561, 0x0588, 1},
                {0x05d0, 0x05ea, 1},
-               {0x05f0, 0x05f2, 1},
+               {0x05ef, 0x05f2, 1},
                {0x0620, 0x064a, 1},
                {0x066e, 0x066f, 1},
                {0x0671, 0x06d3, 1},
@@ -323,7 +317,7 @@ var _L = &RangeTable{
                {0x176e, 0x1770, 1},
                {0x1780, 0x17b3, 1},
                {0x17d7, 0x17dc, 5},
-               {0x1820, 0x1877, 1},
+               {0x1820, 0x1878, 1},
                {0x1880, 0x1884, 1},
                {0x1887, 0x18a8, 1},
                {0x18aa, 0x18b0, 6},
@@ -345,6 +339,8 @@ var _L = &RangeTable{
                {0x1c4d, 0x1c4f, 1},
                {0x1c5a, 0x1c7d, 1},
                {0x1c80, 0x1c88, 1},
+               {0x1c90, 0x1cba, 1},
+               {0x1cbd, 0x1cbf, 1},
                {0x1ce9, 0x1cec, 1},
                {0x1cee, 0x1cf1, 1},
                {0x1cf5, 0x1cf6, 1},
@@ -405,12 +401,12 @@ var _L = &RangeTable{
                {0x309d, 0x309f, 1},
                {0x30a1, 0x30fa, 1},
                {0x30fc, 0x30ff, 1},
-               {0x3105, 0x312e, 1},
+               {0x3105, 0x312f, 1},
                {0x3131, 0x318e, 1},
                {0x31a0, 0x31ba, 1},
                {0x31f0, 0x31ff, 1},
                {0x3400, 0x4db5, 1},
-               {0x4e00, 0x9fea, 1},
+               {0x4e00, 0x9fef, 1},
                {0xa000, 0xa48c, 1},
                {0xa4d0, 0xa4fd, 1},
                {0xa500, 0xa60c, 1},
@@ -421,8 +417,7 @@ var _L = &RangeTable{
                {0xa6a0, 0xa6e5, 1},
                {0xa717, 0xa71f, 1},
                {0xa722, 0xa788, 1},
-               {0xa78b, 0xa7ae, 1},
-               {0xa7b0, 0xa7b7, 1},
+               {0xa78b, 0xa7b9, 1},
                {0xa7f7, 0xa801, 1},
                {0xa803, 0xa805, 1},
                {0xa807, 0xa80a, 1},
@@ -431,7 +426,8 @@ var _L = &RangeTable{
                {0xa882, 0xa8b3, 1},
                {0xa8f2, 0xa8f7, 1},
                {0xa8fb, 0xa8fd, 2},
-               {0xa90a, 0xa925, 1},
+               {0xa8fe, 0xa90a, 12},
+               {0xa90b, 0xa925, 1},
                {0xa930, 0xa946, 1},
                {0xa960, 0xa97c, 1},
                {0xa984, 0xa9b2, 1},
@@ -531,7 +527,7 @@ var _L = &RangeTable{
                {0x10a00, 0x10a10, 16},
                {0x10a11, 0x10a13, 1},
                {0x10a15, 0x10a17, 1},
-               {0x10a19, 0x10a33, 1},
+               {0x10a19, 0x10a35, 1},
                {0x10a60, 0x10a7c, 1},
                {0x10a80, 0x10a9c, 1},
                {0x10ac0, 0x10ac7, 1},
@@ -543,11 +539,16 @@ var _L = &RangeTable{
                {0x10c00, 0x10c48, 1},
                {0x10c80, 0x10cb2, 1},
                {0x10cc0, 0x10cf2, 1},
+               {0x10d00, 0x10d23, 1},
+               {0x10f00, 0x10f1c, 1},
+               {0x10f27, 0x10f30, 9},
+               {0x10f31, 0x10f45, 1},
                {0x11003, 0x11037, 1},
                {0x11083, 0x110af, 1},
                {0x110d0, 0x110e8, 1},
                {0x11103, 0x11126, 1},
-               {0x11150, 0x11172, 1},
+               {0x11144, 0x11150, 12},
+               {0x11151, 0x11172, 1},
                {0x11176, 0x11183, 13},
                {0x11184, 0x111b2, 1},
                {0x111c1, 0x111c4, 1},
@@ -578,14 +579,16 @@ var _L = &RangeTable{
                {0x11600, 0x1162f, 1},
                {0x11644, 0x11680, 60},
                {0x11681, 0x116aa, 1},
-               {0x11700, 0x11719, 1},
+               {0x11700, 0x1171a, 1},
+               {0x11800, 0x1182b, 1},
                {0x118a0, 0x118df, 1},
                {0x118ff, 0x11a00, 257},
                {0x11a0b, 0x11a32, 1},
                {0x11a3a, 0x11a50, 22},
                {0x11a5c, 0x11a83, 1},
                {0x11a86, 0x11a89, 1},
-               {0x11ac0, 0x11af8, 1},
+               {0x11a9d, 0x11ac0, 35},
+               {0x11ac1, 0x11af8, 1},
                {0x11c00, 0x11c08, 1},
                {0x11c0a, 0x11c2e, 1},
                {0x11c40, 0x11c72, 50},
@@ -593,8 +596,13 @@ var _L = &RangeTable{
                {0x11d00, 0x11d06, 1},
                {0x11d08, 0x11d09, 1},
                {0x11d0b, 0x11d30, 1},
-               {0x11d46, 0x12000, 698},
-               {0x12001, 0x12399, 1},
+               {0x11d46, 0x11d60, 26},
+               {0x11d61, 0x11d65, 1},
+               {0x11d67, 0x11d68, 1},
+               {0x11d6a, 0x11d89, 1},
+               {0x11d98, 0x11ee0, 328},
+               {0x11ee1, 0x11ef2, 1},
+               {0x12000, 0x12399, 1},
                {0x12480, 0x12543, 1},
                {0x13000, 0x1342e, 1},
                {0x14400, 0x14646, 1},
@@ -605,11 +613,12 @@ var _L = &RangeTable{
                {0x16b40, 0x16b43, 1},
                {0x16b63, 0x16b77, 1},
                {0x16b7d, 0x16b8f, 1},
+               {0x16e40, 0x16e7f, 1},
                {0x16f00, 0x16f44, 1},
                {0x16f50, 0x16f93, 67},
                {0x16f94, 0x16f9f, 1},
                {0x16fe0, 0x16fe1, 1},
-               {0x17000, 0x187ec, 1},
+               {0x17000, 0x187f1, 1},
                {0x18800, 0x18af2, 1},
                {0x1b000, 0x1b11e, 1},
                {0x1b170, 0x1b2fb, 1},
@@ -735,7 +744,9 @@ var _Ll = &RangeTable{
                {0x048b, 0x04bf, 2},
                {0x04c2, 0x04ce, 2},
                {0x04cf, 0x052f, 2},
-               {0x0561, 0x0587, 1},
+               {0x0560, 0x0588, 1},
+               {0x10d0, 0x10fa, 1},
+               {0x10fd, 0x10ff, 1},
                {0x13f8, 0x13fd, 1},
                {0x1c80, 0x1c88, 1},
                {0x1d00, 0x1d2b, 1},
@@ -794,7 +805,8 @@ var _Ll = &RangeTable{
                {0xa791, 0xa793, 2},
                {0xa794, 0xa795, 1},
                {0xa797, 0xa7a9, 2},
-               {0xa7b5, 0xa7b7, 2},
+               {0xa7af, 0xa7b5, 6},
+               {0xa7b7, 0xa7b9, 2},
                {0xa7fa, 0xab30, 822},
                {0xab31, 0xab5a, 1},
                {0xab60, 0xab65, 1},
@@ -808,6 +820,7 @@ var _Ll = &RangeTable{
                {0x104d8, 0x104fb, 1},
                {0x10cc0, 0x10cf2, 1},
                {0x118c0, 0x118df, 1},
+               {0x16e60, 0x16e7f, 1},
                {0x1d41a, 0x1d433, 1},
                {0x1d44e, 0x1d454, 1},
                {0x1d456, 0x1d467, 1},
@@ -885,8 +898,7 @@ var _Lm = &RangeTable{
                {0xff9f, 0xff9f, 1},
        },
        R32: []Range32{
-               {0x16b40, 0x16b40, 1},
-               {0x16b41, 0x16b43, 1},
+               {0x16b40, 0x16b43, 1},
                {0x16f93, 0x16f9f, 1},
                {0x16fe0, 0x16fe1, 1},
        },
@@ -899,7 +911,7 @@ var _Lo = &RangeTable{
                {0x01c1, 0x01c3, 1},
                {0x0294, 0x05d0, 828},
                {0x05d1, 0x05ea, 1},
-               {0x05f0, 0x05f2, 1},
+               {0x05ef, 0x05f2, 1},
                {0x0620, 0x063f, 1},
                {0x0641, 0x064a, 1},
                {0x066e, 0x066f, 1},
@@ -1028,9 +1040,8 @@ var _Lo = &RangeTable{
                {0x1066, 0x106e, 8},
                {0x106f, 0x1070, 1},
                {0x1075, 0x1081, 1},
-               {0x108e, 0x10d0, 66},
-               {0x10d1, 0x10fa, 1},
-               {0x10fd, 0x1248, 1},
+               {0x108e, 0x1100, 114},
+               {0x1101, 0x1248, 1},
                {0x124a, 0x124d, 1},
                {0x1250, 0x1256, 1},
                {0x1258, 0x125a, 2},
@@ -1061,7 +1072,7 @@ var _Lo = &RangeTable{
                {0x1780, 0x17b3, 1},
                {0x17dc, 0x1820, 68},
                {0x1821, 0x1842, 1},
-               {0x1844, 0x1877, 1},
+               {0x1844, 0x1878, 1},
                {0x1880, 0x1884, 1},
                {0x1887, 0x18a8, 1},
                {0x18aa, 0x18b0, 6},
@@ -1100,12 +1111,12 @@ var _Lo = &RangeTable{
                {0x309f, 0x30a1, 2},
                {0x30a2, 0x30fa, 1},
                {0x30ff, 0x3105, 6},
-               {0x3106, 0x312e, 1},
+               {0x3106, 0x312f, 1},
                {0x3131, 0x318e, 1},
                {0x31a0, 0x31ba, 1},
                {0x31f0, 0x31ff, 1},
                {0x3400, 0x4db5, 1},
-               {0x4e00, 0x9fea, 1},
+               {0x4e00, 0x9fef, 1},
                {0xa000, 0xa014, 1},
                {0xa016, 0xa48c, 1},
                {0xa4d0, 0xa4f7, 1},
@@ -1123,7 +1134,8 @@ var _Lo = &RangeTable{
                {0xa882, 0xa8b3, 1},
                {0xa8f2, 0xa8f7, 1},
                {0xa8fb, 0xa8fd, 2},
-               {0xa90a, 0xa925, 1},
+               {0xa8fe, 0xa90a, 12},
+               {0xa90b, 0xa925, 1},
                {0xa930, 0xa946, 1},
                {0xa960, 0xa97c, 1},
                {0xa984, 0xa9b2, 1},
@@ -1217,7 +1229,7 @@ var _Lo = &RangeTable{
                {0x10a00, 0x10a10, 16},
                {0x10a11, 0x10a13, 1},
                {0x10a15, 0x10a17, 1},
-               {0x10a19, 0x10a33, 1},
+               {0x10a19, 0x10a35, 1},
                {0x10a60, 0x10a7c, 1},
                {0x10a80, 0x10a9c, 1},
                {0x10ac0, 0x10ac7, 1},
@@ -1227,11 +1239,16 @@ var _Lo = &RangeTable{
                {0x10b60, 0x10b72, 1},
                {0x10b80, 0x10b91, 1},
                {0x10c00, 0x10c48, 1},
+               {0x10d00, 0x10d23, 1},
+               {0x10f00, 0x10f1c, 1},
+               {0x10f27, 0x10f30, 9},
+               {0x10f31, 0x10f45, 1},
                {0x11003, 0x11037, 1},
                {0x11083, 0x110af, 1},
                {0x110d0, 0x110e8, 1},
                {0x11103, 0x11126, 1},
-               {0x11150, 0x11172, 1},
+               {0x11144, 0x11150, 12},
+               {0x11151, 0x11172, 1},
                {0x11176, 0x11183, 13},
                {0x11184, 0x111b2, 1},
                {0x111c1, 0x111c4, 1},
@@ -1262,13 +1279,15 @@ var _Lo = &RangeTable{
                {0x11600, 0x1162f, 1},
                {0x11644, 0x11680, 60},
                {0x11681, 0x116aa, 1},
-               {0x11700, 0x11719, 1},
+               {0x11700, 0x1171a, 1},
+               {0x11800, 0x1182b, 1},
                {0x118ff, 0x11a00, 257},
                {0x11a0b, 0x11a32, 1},
                {0x11a3a, 0x11a50, 22},
                {0x11a5c, 0x11a83, 1},
                {0x11a86, 0x11a89, 1},
-               {0x11ac0, 0x11af8, 1},
+               {0x11a9d, 0x11ac0, 35},
+               {0x11ac1, 0x11af8, 1},
                {0x11c00, 0x11c08, 1},
                {0x11c0a, 0x11c2e, 1},
                {0x11c40, 0x11c72, 50},
@@ -1276,8 +1295,13 @@ var _Lo = &RangeTable{
                {0x11d00, 0x11d06, 1},
                {0x11d08, 0x11d09, 1},
                {0x11d0b, 0x11d30, 1},
-               {0x11d46, 0x12000, 698},
-               {0x12001, 0x12399, 1},
+               {0x11d46, 0x11d60, 26},
+               {0x11d61, 0x11d65, 1},
+               {0x11d67, 0x11d68, 1},
+               {0x11d6a, 0x11d89, 1},
+               {0x11d98, 0x11ee0, 328},
+               {0x11ee1, 0x11ef2, 1},
+               {0x12000, 0x12399, 1},
                {0x12480, 0x12543, 1},
                {0x13000, 0x1342e, 1},
                {0x14400, 0x14646, 1},
@@ -1289,7 +1313,7 @@ var _Lo = &RangeTable{
                {0x16b7d, 0x16b8f, 1},
                {0x16f00, 0x16f44, 1},
                {0x16f50, 0x17000, 176},
-               {0x17001, 0x187ec, 1},
+               {0x17001, 0x187f1, 1},
                {0x18800, 0x18af2, 1},
                {0x1b000, 0x1b11e, 1},
                {0x1b170, 0x1b2fb, 1},
@@ -1402,6 +1426,8 @@ var _Lu = &RangeTable{
                {0x10a0, 0x10c5, 1},
                {0x10c7, 0x10cd, 6},
                {0x13a0, 0x13f5, 1},
+               {0x1c90, 0x1cba, 1},
+               {0x1cbd, 0x1cbf, 1},
                {0x1e00, 0x1e94, 2},
                {0x1e9e, 0x1efe, 2},
                {0x1f08, 0x1f0f, 1},
@@ -1447,14 +1473,15 @@ var _Lu = &RangeTable{
                {0xa796, 0xa7aa, 2},
                {0xa7ab, 0xa7ae, 1},
                {0xa7b0, 0xa7b4, 1},
-               {0xa7b6, 0xff21, 22379},
-               {0xff22, 0xff3a, 1},
+               {0xa7b6, 0xa7b8, 2},
+               {0xff21, 0xff3a, 1},
        },
        R32: []Range32{
                {0x10400, 0x10427, 1},
                {0x104b0, 0x104d3, 1},
                {0x10c80, 0x10cb2, 1},
                {0x118a0, 0x118bf, 1},
+               {0x16e40, 0x16e5f, 1},
                {0x1d400, 0x1d419, 1},
                {0x1d434, 0x1d44d, 1},
                {0x1d468, 0x1d481, 1},
@@ -1509,12 +1536,13 @@ var _M = &RangeTable{
                {0x0731, 0x074a, 1},
                {0x07a6, 0x07b0, 1},
                {0x07eb, 0x07f3, 1},
-               {0x0816, 0x0819, 1},
+               {0x07fd, 0x0816, 25},
+               {0x0817, 0x0819, 1},
                {0x081b, 0x0823, 1},
                {0x0825, 0x0827, 1},
                {0x0829, 0x082d, 1},
                {0x0859, 0x085b, 1},
-               {0x08d4, 0x08e1, 1},
+               {0x08d3, 0x08e1, 1},
                {0x08e3, 0x0903, 1},
                {0x093a, 0x093c, 1},
                {0x093e, 0x094f, 1},
@@ -1526,8 +1554,8 @@ var _M = &RangeTable{
                {0x09c7, 0x09c8, 1},
                {0x09cb, 0x09cd, 1},
                {0x09d7, 0x09e2, 11},
-               {0x09e3, 0x0a01, 30},
-               {0x0a02, 0x0a03, 1},
+               {0x09e3, 0x09fe, 27},
+               {0x0a01, 0x0a03, 1},
                {0x0a3c, 0x0a3e, 2},
                {0x0a3f, 0x0a42, 1},
                {0x0a47, 0x0a48, 1},
@@ -1553,7 +1581,7 @@ var _M = &RangeTable{
                {0x0bc6, 0x0bc8, 1},
                {0x0bca, 0x0bcd, 1},
                {0x0bd7, 0x0c00, 41},
-               {0x0c01, 0x0c03, 1},
+               {0x0c01, 0x0c04, 1},
                {0x0c3e, 0x0c44, 1},
                {0x0c46, 0x0c48, 1},
                {0x0c4a, 0x0c4d, 1},
@@ -1649,7 +1677,8 @@ var _M = &RangeTable{
                {0xa880, 0xa881, 1},
                {0xa8b4, 0xa8c5, 1},
                {0xa8e0, 0xa8f1, 1},
-               {0xa926, 0xa92d, 1},
+               {0xa8ff, 0xa926, 39},
+               {0xa927, 0xa92d, 1},
                {0xa947, 0xa953, 1},
                {0xa980, 0xa983, 1},
                {0xa9b3, 0xa9c0, 1},
@@ -1679,23 +1708,26 @@ var _M = &RangeTable{
                {0x10a0c, 0x10a0f, 1},
                {0x10a38, 0x10a3a, 1},
                {0x10a3f, 0x10ae5, 166},
-               {0x10ae6, 0x11000, 1306},
-               {0x11001, 0x11002, 1},
+               {0x10ae6, 0x10d24, 574},
+               {0x10d25, 0x10d27, 1},
+               {0x10f46, 0x10f50, 1},
+               {0x11000, 0x11002, 1},
                {0x11038, 0x11046, 1},
                {0x1107f, 0x11082, 1},
                {0x110b0, 0x110ba, 1},
                {0x11100, 0x11102, 1},
                {0x11127, 0x11134, 1},
+               {0x11145, 0x11146, 1},
                {0x11173, 0x11180, 13},
                {0x11181, 0x11182, 1},
                {0x111b3, 0x111c0, 1},
-               {0x111ca, 0x111cc, 1},
+               {0x111c9, 0x111cc, 1},
                {0x1122c, 0x11237, 1},
                {0x1123e, 0x112df, 161},
                {0x112e0, 0x112ea, 1},
                {0x11300, 0x11303, 1},
-               {0x1133c, 0x1133e, 2},
-               {0x1133f, 0x11344, 1},
+               {0x1133b, 0x1133c, 1},
+               {0x1133e, 0x11344, 1},
                {0x11347, 0x11348, 1},
                {0x1134b, 0x1134d, 1},
                {0x11357, 0x11362, 11},
@@ -1703,13 +1735,15 @@ var _M = &RangeTable{
                {0x11367, 0x1136c, 1},
                {0x11370, 0x11374, 1},
                {0x11435, 0x11446, 1},
-               {0x114b0, 0x114c3, 1},
+               {0x1145e, 0x114b0, 82},
+               {0x114b1, 0x114c3, 1},
                {0x115af, 0x115b5, 1},
                {0x115b8, 0x115c0, 1},
                {0x115dc, 0x115dd, 1},
                {0x11630, 0x11640, 1},
                {0x116ab, 0x116b7, 1},
                {0x1171d, 0x1172b, 1},
+               {0x1182c, 0x1183a, 1},
                {0x11a01, 0x11a0a, 1},
                {0x11a33, 0x11a39, 1},
                {0x11a3b, 0x11a3e, 1},
@@ -1724,8 +1758,12 @@ var _M = &RangeTable{
                {0x11d3a, 0x11d3c, 2},
                {0x11d3d, 0x11d3f, 2},
                {0x11d40, 0x11d45, 1},
-               {0x11d47, 0x16af0, 19881},
-               {0x16af1, 0x16af4, 1},
+               {0x11d47, 0x11d8a, 67},
+               {0x11d8b, 0x11d8e, 1},
+               {0x11d90, 0x11d91, 1},
+               {0x11d93, 0x11d97, 1},
+               {0x11ef3, 0x11ef6, 1},
+               {0x16af0, 0x16af4, 1},
                {0x16b30, 0x16b36, 1},
                {0x16f51, 0x16f7e, 1},
                {0x16f8f, 0x16f92, 1},
@@ -1857,7 +1895,8 @@ var _Mc = &RangeTable{
                {0x11082, 0x110b0, 46},
                {0x110b1, 0x110b2, 1},
                {0x110b7, 0x110b8, 1},
-               {0x1112c, 0x11182, 86},
+               {0x1112c, 0x11145, 25},
+               {0x11146, 0x11182, 60},
                {0x111b3, 0x111b5, 1},
                {0x111bf, 0x111c0, 1},
                {0x1122c, 0x1122e, 1},
@@ -1887,12 +1926,16 @@ var _Mc = &RangeTable{
                {0x116ae, 0x116af, 1},
                {0x116b6, 0x11720, 106},
                {0x11721, 0x11726, 5},
-               {0x11a07, 0x11a08, 1},
-               {0x11a39, 0x11a57, 30},
-               {0x11a58, 0x11a97, 63},
-               {0x11c2f, 0x11c3e, 15},
-               {0x11ca9, 0x11cb1, 8},
-               {0x11cb4, 0x16f51, 21149},
+               {0x1182c, 0x1182e, 1},
+               {0x11838, 0x11a39, 513},
+               {0x11a57, 0x11a58, 1},
+               {0x11a97, 0x11c2f, 408},
+               {0x11c3e, 0x11ca9, 107},
+               {0x11cb1, 0x11cb4, 3},
+               {0x11d8a, 0x11d8e, 1},
+               {0x11d93, 0x11d94, 1},
+               {0x11d96, 0x11ef5, 351},
+               {0x11ef6, 0x16f51, 20571},
                {0x16f52, 0x16f7e, 1},
                {0x1d165, 0x1d166, 1},
                {0x1d16d, 0x1d172, 1},
@@ -1928,12 +1971,13 @@ var _Mn = &RangeTable{
                {0x0731, 0x074a, 1},
                {0x07a6, 0x07b0, 1},
                {0x07eb, 0x07f3, 1},
-               {0x0816, 0x0819, 1},
+               {0x07fd, 0x0816, 25},
+               {0x0817, 0x0819, 1},
                {0x081b, 0x0823, 1},
                {0x0825, 0x0827, 1},
                {0x0829, 0x082d, 1},
                {0x0859, 0x085b, 1},
-               {0x08d4, 0x08e1, 1},
+               {0x08d3, 0x08e1, 1},
                {0x08e3, 0x0902, 1},
                {0x093a, 0x093c, 2},
                {0x0941, 0x0948, 1},
@@ -1943,11 +1987,12 @@ var _Mn = &RangeTable{
                {0x0981, 0x09bc, 59},
                {0x09c1, 0x09c4, 1},
                {0x09cd, 0x09e2, 21},
-               {0x09e3, 0x0a01, 30},
-               {0x0a02, 0x0a3c, 58},
-               {0x0a41, 0x0a42, 1},
-               {0x0a47, 0x0a48, 1},
-               {0x0a4b, 0x0a4d, 1},
+               {0x09e3, 0x09fe, 27},
+               {0x0a01, 0x0a02, 1},
+               {0x0a3c, 0x0a41, 5},
+               {0x0a42, 0x0a47, 5},
+               {0x0a48, 0x0a4b, 3},
+               {0x0a4c, 0x0a4d, 1},
                {0x0a51, 0x0a70, 31},
                {0x0a71, 0x0a75, 4},
                {0x0a81, 0x0a82, 1},
@@ -1964,7 +2009,8 @@ var _Mn = &RangeTable{
                {0x0b62, 0x0b63, 1},
                {0x0b82, 0x0bc0, 62},
                {0x0bcd, 0x0c00, 51},
-               {0x0c3e, 0x0c40, 1},
+               {0x0c04, 0x0c3e, 58},
+               {0x0c3f, 0x0c40, 1},
                {0x0c46, 0x0c48, 1},
                {0x0c4a, 0x0c4d, 1},
                {0x0c55, 0x0c56, 1},
@@ -2067,7 +2113,8 @@ var _Mn = &RangeTable{
                {0xa826, 0xa8c4, 158},
                {0xa8c5, 0xa8e0, 27},
                {0xa8e1, 0xa8f1, 1},
-               {0xa926, 0xa92d, 1},
+               {0xa8ff, 0xa926, 39},
+               {0xa927, 0xa92d, 1},
                {0xa947, 0xa951, 1},
                {0xa980, 0xa982, 1},
                {0xa9b3, 0xa9b6, 3},
@@ -2096,8 +2143,11 @@ var _Mn = &RangeTable{
                {0x10a0c, 0x10a0f, 1},
                {0x10a38, 0x10a3a, 1},
                {0x10a3f, 0x10ae5, 166},
-               {0x10ae6, 0x11001, 1307},
-               {0x11038, 0x11046, 1},
+               {0x10ae6, 0x10d24, 574},
+               {0x10d25, 0x10d27, 1},
+               {0x10f46, 0x10f50, 1},
+               {0x11001, 0x11038, 55},
+               {0x11039, 0x11046, 1},
                {0x1107f, 0x11081, 1},
                {0x110b3, 0x110b6, 1},
                {0x110b9, 0x110ba, 1},
@@ -2107,20 +2157,21 @@ var _Mn = &RangeTable{
                {0x11173, 0x11180, 13},
                {0x11181, 0x111b6, 53},
                {0x111b7, 0x111be, 1},
-               {0x111ca, 0x111cc, 1},
+               {0x111c9, 0x111cc, 1},
                {0x1122f, 0x11231, 1},
                {0x11234, 0x11236, 2},
                {0x11237, 0x1123e, 7},
                {0x112df, 0x112e3, 4},
                {0x112e4, 0x112ea, 1},
                {0x11300, 0x11301, 1},
-               {0x1133c, 0x11340, 4},
-               {0x11366, 0x1136c, 1},
+               {0x1133b, 0x1133c, 1},
+               {0x11340, 0x11366, 38},
+               {0x11367, 0x1136c, 1},
                {0x11370, 0x11374, 1},
                {0x11438, 0x1143f, 1},
                {0x11442, 0x11444, 1},
-               {0x11446, 0x114b3, 109},
-               {0x114b4, 0x114b8, 1},
+               {0x11446, 0x1145e, 24},
+               {0x114b3, 0x114b8, 1},
                {0x114ba, 0x114bf, 5},
                {0x114c0, 0x114c2, 2},
                {0x114c3, 0x115b2, 239},
@@ -2137,8 +2188,9 @@ var _Mn = &RangeTable{
                {0x1171e, 0x1171f, 1},
                {0x11722, 0x11725, 1},
                {0x11727, 0x1172b, 1},
-               {0x11a01, 0x11a06, 1},
-               {0x11a09, 0x11a0a, 1},
+               {0x1182f, 0x11837, 1},
+               {0x11839, 0x1183a, 1},
+               {0x11a01, 0x11a0a, 1},
                {0x11a33, 0x11a38, 1},
                {0x11a3b, 0x11a3e, 1},
                {0x11a47, 0x11a51, 10},
@@ -2157,7 +2209,10 @@ var _Mn = &RangeTable{
                {0x11d3a, 0x11d3c, 2},
                {0x11d3d, 0x11d3f, 2},
                {0x11d40, 0x11d45, 1},
-               {0x11d47, 0x16af0, 19881},
+               {0x11d47, 0x11d90, 73},
+               {0x11d91, 0x11d95, 4},
+               {0x11d97, 0x11ef3, 348},
+               {0x11ef4, 0x16af0, 19452},
                {0x16af1, 0x16af4, 1},
                {0x16b30, 0x16b36, 1},
                {0x16f8f, 0x16f92, 1},
@@ -2269,7 +2324,7 @@ var _N = &RangeTable{
                {0x109bc, 0x109bd, 1},
                {0x109c0, 0x109cf, 1},
                {0x109d2, 0x109ff, 1},
-               {0x10a40, 0x10a47, 1},
+               {0x10a40, 0x10a48, 1},
                {0x10a7d, 0x10a7e, 1},
                {0x10a9d, 0x10a9f, 1},
                {0x10aeb, 0x10aef, 1},
@@ -2277,7 +2332,10 @@ var _N = &RangeTable{
                {0x10b78, 0x10b7f, 1},
                {0x10ba9, 0x10baf, 1},
                {0x10cfa, 0x10cff, 1},
+               {0x10d30, 0x10d39, 1},
                {0x10e60, 0x10e7e, 1},
+               {0x10f1d, 0x10f26, 1},
+               {0x10f51, 0x10f54, 1},
                {0x11052, 0x1106f, 1},
                {0x110f0, 0x110f9, 1},
                {0x11136, 0x1113f, 1},
@@ -2292,14 +2350,20 @@ var _N = &RangeTable{
                {0x118e0, 0x118f2, 1},
                {0x11c50, 0x11c6c, 1},
                {0x11d50, 0x11d59, 1},
+               {0x11da0, 0x11da9, 1},
                {0x12400, 0x1246e, 1},
                {0x16a60, 0x16a69, 1},
                {0x16b50, 0x16b59, 1},
                {0x16b5b, 0x16b61, 1},
-               {0x1d360, 0x1d371, 1},
+               {0x16e80, 0x16e96, 1},
+               {0x1d2e0, 0x1d2f3, 1},
+               {0x1d360, 0x1d378, 1},
                {0x1d7ce, 0x1d7ff, 1},
                {0x1e8c7, 0x1e8cf, 1},
                {0x1e950, 0x1e959, 1},
+               {0x1ec71, 0x1ecab, 1},
+               {0x1ecad, 0x1ecaf, 1},
+               {0x1ecb1, 0x1ecb4, 1},
                {0x1f100, 0x1f10c, 1},
        },
        LatinOffset: 4,
@@ -2347,6 +2411,7 @@ var _Nd = &RangeTable{
        },
        R32: []Range32{
                {0x104a0, 0x104a9, 1},
+               {0x10d30, 0x10d39, 1},
                {0x11066, 0x1106f, 1},
                {0x110f0, 0x110f9, 1},
                {0x11136, 0x1113f, 1},
@@ -2360,6 +2425,7 @@ var _Nd = &RangeTable{
                {0x118e0, 0x118e9, 1},
                {0x11c50, 0x11c59, 1},
                {0x11d50, 0x11d59, 1},
+               {0x11da0, 0x11da9, 1},
                {0x16a60, 0x16a69, 1},
                {0x16b50, 0x16b59, 1},
                {0x1d7ce, 0x1d7ff, 1},
@@ -2431,7 +2497,7 @@ var _No = &RangeTable{
                {0x109bc, 0x109bd, 1},
                {0x109c0, 0x109cf, 1},
                {0x109d2, 0x109ff, 1},
-               {0x10a40, 0x10a47, 1},
+               {0x10a40, 0x10a48, 1},
                {0x10a7d, 0x10a7e, 1},
                {0x10a9d, 0x10a9f, 1},
                {0x10aeb, 0x10aef, 1},
@@ -2440,14 +2506,21 @@ var _No = &RangeTable{
                {0x10ba9, 0x10baf, 1},
                {0x10cfa, 0x10cff, 1},
                {0x10e60, 0x10e7e, 1},
+               {0x10f1d, 0x10f26, 1},
+               {0x10f51, 0x10f54, 1},
                {0x11052, 0x11065, 1},
                {0x111e1, 0x111f4, 1},
                {0x1173a, 0x1173b, 1},
                {0x118ea, 0x118f2, 1},
                {0x11c5a, 0x11c6c, 1},
                {0x16b5b, 0x16b61, 1},
-               {0x1d360, 0x1d371, 1},
+               {0x16e80, 0x16e96, 1},
+               {0x1d2e0, 0x1d2f3, 1},
+               {0x1d360, 0x1d378, 1},
                {0x1e8c7, 0x1e8cf, 1},
+               {0x1ec71, 0x1ecab, 1},
+               {0x1ecad, 0x1ecaf, 1},
+               {0x1ecb1, 0x1ecb4, 1},
                {0x1f100, 0x1f10c, 1},
        },
        LatinOffset: 3,
@@ -2483,7 +2556,8 @@ var _P = &RangeTable{
                {0x0830, 0x083e, 1},
                {0x085e, 0x0964, 262},
                {0x0965, 0x0970, 11},
-               {0x09fd, 0x0af0, 243},
+               {0x09fd, 0x0a76, 121},
+               {0x0af0, 0x0c84, 404},
                {0x0df4, 0x0e4f, 91},
                {0x0e5a, 0x0e5b, 1},
                {0x0f04, 0x0f12, 1},
@@ -2531,7 +2605,7 @@ var _P = &RangeTable{
                {0x2cfe, 0x2cff, 1},
                {0x2d70, 0x2e00, 144},
                {0x2e01, 0x2e2e, 1},
-               {0x2e30, 0x2e49, 1},
+               {0x2e30, 0x2e4e, 1},
                {0x3001, 0x3003, 1},
                {0x3008, 0x3011, 1},
                {0x3014, 0x301f, 1},
@@ -2578,12 +2652,13 @@ var _P = &RangeTable{
                {0x10af1, 0x10af6, 1},
                {0x10b39, 0x10b3f, 1},
                {0x10b99, 0x10b9c, 1},
+               {0x10f55, 0x10f59, 1},
                {0x11047, 0x1104d, 1},
                {0x110bb, 0x110bc, 1},
                {0x110be, 0x110c1, 1},
                {0x11140, 0x11143, 1},
                {0x11174, 0x11175, 1},
-               {0x111c5, 0x111c9, 1},
+               {0x111c5, 0x111c8, 1},
                {0x111cd, 0x111db, 14},
                {0x111dd, 0x111df, 1},
                {0x11238, 0x1123d, 1},
@@ -2595,17 +2670,21 @@ var _P = &RangeTable{
                {0x11641, 0x11643, 1},
                {0x11660, 0x1166c, 1},
                {0x1173c, 0x1173e, 1},
-               {0x11a3f, 0x11a46, 1},
+               {0x1183b, 0x11a3f, 516},
+               {0x11a40, 0x11a46, 1},
                {0x11a9a, 0x11a9c, 1},
                {0x11a9e, 0x11aa2, 1},
                {0x11c41, 0x11c45, 1},
                {0x11c70, 0x11c71, 1},
+               {0x11ef7, 0x11ef8, 1},
                {0x12470, 0x12474, 1},
                {0x16a6e, 0x16a6f, 1},
                {0x16af5, 0x16b37, 66},
                {0x16b38, 0x16b3b, 1},
-               {0x16b44, 0x1bc9f, 20827},
-               {0x1da87, 0x1da8b, 1},
+               {0x16b44, 0x16e97, 851},
+               {0x16e98, 0x16e9a, 1},
+               {0x1bc9f, 0x1da87, 7656},
+               {0x1da88, 0x1da8b, 1},
                {0x1e95e, 0x1e95f, 1},
        },
        LatinOffset: 11,
@@ -2713,7 +2792,8 @@ var _Po = &RangeTable{
                {0x0830, 0x083e, 1},
                {0x085e, 0x0964, 262},
                {0x0965, 0x0970, 11},
-               {0x09fd, 0x0af0, 243},
+               {0x09fd, 0x0a76, 121},
+               {0x0af0, 0x0c84, 404},
                {0x0df4, 0x0e4f, 91},
                {0x0e5a, 0x0e5b, 1},
                {0x0f04, 0x0f12, 1},
@@ -2762,7 +2842,7 @@ var _Po = &RangeTable{
                {0x2e30, 0x2e39, 1},
                {0x2e3c, 0x2e3f, 1},
                {0x2e41, 0x2e43, 2},
-               {0x2e44, 0x2e49, 1},
+               {0x2e44, 0x2e4e, 1},
                {0x3001, 0x3003, 1},
                {0x303d, 0x30fb, 190},
                {0xa4fe, 0xa4ff, 1},
@@ -2799,8 +2879,7 @@ var _Po = &RangeTable{
                {0xff65, 0xff65, 1},
        },
        R32: []Range32{
-               {0x10100, 0x10100, 1},
-               {0x10101, 0x10102, 1},
+               {0x10100, 0x10102, 1},
                {0x1039f, 0x103d0, 49},
                {0x1056f, 0x10857, 744},
                {0x1091f, 0x1093f, 32},
@@ -2809,12 +2888,13 @@ var _Po = &RangeTable{
                {0x10af1, 0x10af6, 1},
                {0x10b39, 0x10b3f, 1},
                {0x10b99, 0x10b9c, 1},
+               {0x10f55, 0x10f59, 1},
                {0x11047, 0x1104d, 1},
                {0x110bb, 0x110bc, 1},
                {0x110be, 0x110c1, 1},
                {0x11140, 0x11143, 1},
                {0x11174, 0x11175, 1},
-               {0x111c5, 0x111c9, 1},
+               {0x111c5, 0x111c8, 1},
                {0x111cd, 0x111db, 14},
                {0x111dd, 0x111df, 1},
                {0x11238, 0x1123d, 1},
@@ -2826,17 +2906,21 @@ var _Po = &RangeTable{
                {0x11641, 0x11643, 1},
                {0x11660, 0x1166c, 1},
                {0x1173c, 0x1173e, 1},
-               {0x11a3f, 0x11a46, 1},
+               {0x1183b, 0x11a3f, 516},
+               {0x11a40, 0x11a46, 1},
                {0x11a9a, 0x11a9c, 1},
                {0x11a9e, 0x11aa2, 1},
                {0x11c41, 0x11c45, 1},
                {0x11c70, 0x11c71, 1},
+               {0x11ef7, 0x11ef8, 1},
                {0x12470, 0x12474, 1},
                {0x16a6e, 0x16a6f, 1},
                {0x16af5, 0x16b37, 66},
                {0x16b38, 0x16b3b, 1},
-               {0x16b44, 0x1bc9f, 20827},
-               {0x1da87, 0x1da8b, 1},
+               {0x16b44, 0x16e97, 851},
+               {0x16e98, 0x16e9a, 1},
+               {0x1bc9f, 0x1da87, 7656},
+               {0x1da88, 0x1da8b, 1},
                {0x1e95e, 0x1e95f, 1},
        },
        LatinOffset: 8,
@@ -2899,6 +2983,7 @@ var _S = &RangeTable{
                {0x060f, 0x06de, 207},
                {0x06e9, 0x06fd, 20},
                {0x06fe, 0x07f6, 248},
+               {0x07fe, 0x07ff, 1},
                {0x09f2, 0x09f3, 1},
                {0x09fa, 0x09fb, 1},
                {0x0af1, 0x0b70, 127},
@@ -2956,10 +3041,8 @@ var _S = &RangeTable{
                {0x29dc, 0x29fb, 1},
                {0x29fe, 0x2b73, 1},
                {0x2b76, 0x2b95, 1},
-               {0x2b98, 0x2bb9, 1},
-               {0x2bbd, 0x2bc8, 1},
-               {0x2bca, 0x2bd2, 1},
-               {0x2bec, 0x2bef, 1},
+               {0x2b98, 0x2bc8, 1},
+               {0x2bca, 0x2bfe, 1},
                {0x2ce5, 0x2cea, 1},
                {0x2e80, 0x2e99, 1},
                {0x2e9b, 0x2ef3, 1},
@@ -3033,6 +3116,7 @@ var _S = &RangeTable{
                {0x1da6d, 0x1da74, 1},
                {0x1da76, 0x1da83, 1},
                {0x1da85, 0x1da86, 1},
+               {0x1ecac, 0x1ecb0, 4},
                {0x1eef0, 0x1eef1, 1},
                {0x1f000, 0x1f02b, 1},
                {0x1f030, 0x1f093, 1},
@@ -3040,8 +3124,7 @@ var _S = &RangeTable{
                {0x1f0b1, 0x1f0bf, 1},
                {0x1f0c1, 0x1f0cf, 1},
                {0x1f0d1, 0x1f0f5, 1},
-               {0x1f110, 0x1f12e, 1},
-               {0x1f130, 0x1f16b, 1},
+               {0x1f110, 0x1f16b, 1},
                {0x1f170, 0x1f1ac, 1},
                {0x1f1e6, 0x1f202, 1},
                {0x1f210, 0x1f23b, 1},
@@ -3050,9 +3133,9 @@ var _S = &RangeTable{
                {0x1f260, 0x1f265, 1},
                {0x1f300, 0x1f6d4, 1},
                {0x1f6e0, 0x1f6ec, 1},
-               {0x1f6f0, 0x1f6f8, 1},
+               {0x1f6f0, 0x1f6f9, 1},
                {0x1f700, 0x1f773, 1},
-               {0x1f780, 0x1f7d4, 1},
+               {0x1f780, 0x1f7d8, 1},
                {0x1f800, 0x1f80b, 1},
                {0x1f810, 0x1f847, 1},
                {0x1f850, 0x1f859, 1},
@@ -3060,11 +3143,14 @@ var _S = &RangeTable{
                {0x1f890, 0x1f8ad, 1},
                {0x1f900, 0x1f90b, 1},
                {0x1f910, 0x1f93e, 1},
-               {0x1f940, 0x1f94c, 1},
-               {0x1f950, 0x1f96b, 1},
-               {0x1f980, 0x1f997, 1},
-               {0x1f9c0, 0x1f9d0, 16},
-               {0x1f9d1, 0x1f9e6, 1},
+               {0x1f940, 0x1f970, 1},
+               {0x1f973, 0x1f976, 1},
+               {0x1f97a, 0x1f97c, 2},
+               {0x1f97d, 0x1f9a2, 1},
+               {0x1f9b0, 0x1f9b9, 1},
+               {0x1f9c0, 0x1f9c2, 1},
+               {0x1f9d0, 0x1f9ff, 1},
+               {0x1fa60, 0x1fa6d, 1},
        },
        LatinOffset: 10,
 }
@@ -3074,6 +3160,7 @@ var _Sc = &RangeTable{
                {0x0024, 0x00a2, 126},
                {0x00a3, 0x00a5, 1},
                {0x058f, 0x060b, 124},
+               {0x07fe, 0x07ff, 1},
                {0x09f2, 0x09f3, 1},
                {0x09fb, 0x0af1, 246},
                {0x0bf9, 0x0e3f, 582},
@@ -3084,6 +3171,9 @@ var _Sc = &RangeTable{
                {0xffe0, 0xffe1, 1},
                {0xffe5, 0xffe6, 1},
        },
+       R32: []Range32{
+               {0x1ecb0, 0x1ecb0, 1},
+       },
        LatinOffset: 2,
 }
 
@@ -3114,8 +3204,7 @@ var _Sk = &RangeTable{
                {0xffe3, 0xffe3, 1},
        },
        R32: []Range32{
-               {0x1f3fb, 0x1f3fb, 1},
-               {0x1f3fc, 0x1f3ff, 1},
+               {0x1f3fb, 0x1f3ff, 1},
        },
        LatinOffset: 3,
 }
@@ -3246,10 +3335,8 @@ var _So = &RangeTable{
                {0x2b45, 0x2b46, 1},
                {0x2b4d, 0x2b73, 1},
                {0x2b76, 0x2b95, 1},
-               {0x2b98, 0x2bb9, 1},
-               {0x2bbd, 0x2bc8, 1},
-               {0x2bca, 0x2bd2, 1},
-               {0x2bec, 0x2bef, 1},
+               {0x2b98, 0x2bc8, 1},
+               {0x2bca, 0x2bfe, 1},
                {0x2ce5, 0x2cea, 1},
                {0x2e80, 0x2e99, 1},
                {0x2e9b, 0x2ef3, 1},
@@ -3281,8 +3368,7 @@ var _So = &RangeTable{
                {0xfffd, 0xfffd, 1},
        },
        R32: []Range32{
-               {0x10137, 0x10137, 1},
-               {0x10138, 0x1013f, 1},
+               {0x10137, 0x1013f, 1},
                {0x10179, 0x10189, 1},
                {0x1018c, 0x1018e, 1},
                {0x10190, 0x1019b, 1},
@@ -3307,14 +3393,14 @@ var _So = &RangeTable{
                {0x1da6d, 0x1da74, 1},
                {0x1da76, 0x1da83, 1},
                {0x1da85, 0x1da86, 1},
-               {0x1f000, 0x1f02b, 1},
+               {0x1ecac, 0x1f000, 852},
+               {0x1f001, 0x1f02b, 1},
                {0x1f030, 0x1f093, 1},
                {0x1f0a0, 0x1f0ae, 1},
                {0x1f0b1, 0x1f0bf, 1},
                {0x1f0c1, 0x1f0cf, 1},
                {0x1f0d1, 0x1f0f5, 1},
-               {0x1f110, 0x1f12e, 1},
-               {0x1f130, 0x1f16b, 1},
+               {0x1f110, 0x1f16b, 1},
                {0x1f170, 0x1f1ac, 1},
                {0x1f1e6, 0x1f202, 1},
                {0x1f210, 0x1f23b, 1},
@@ -3324,9 +3410,9 @@ var _So = &RangeTable{
                {0x1f300, 0x1f3fa, 1},
                {0x1f400, 0x1f6d4, 1},
                {0x1f6e0, 0x1f6ec, 1},
-               {0x1f6f0, 0x1f6f8, 1},
+               {0x1f6f0, 0x1f6f9, 1},
                {0x1f700, 0x1f773, 1},
-               {0x1f780, 0x1f7d4, 1},
+               {0x1f780, 0x1f7d8, 1},
                {0x1f800, 0x1f80b, 1},
                {0x1f810, 0x1f847, 1},
                {0x1f850, 0x1f859, 1},
@@ -3334,11 +3420,14 @@ var _So = &RangeTable{
                {0x1f890, 0x1f8ad, 1},
                {0x1f900, 0x1f90b, 1},
                {0x1f910, 0x1f93e, 1},
-               {0x1f940, 0x1f94c, 1},
-               {0x1f950, 0x1f96b, 1},
-               {0x1f980, 0x1f997, 1},
-               {0x1f9c0, 0x1f9d0, 16},
-               {0x1f9d1, 0x1f9e6, 1},
+               {0x1f940, 0x1f970, 1},
+               {0x1f973, 0x1f976, 1},
+               {0x1f97a, 0x1f97c, 2},
+               {0x1f97d, 0x1f9a2, 1},
+               {0x1f9b0, 0x1f9b9, 1},
+               {0x1f9c0, 0x1f9c2, 1},
+               {0x1f9d0, 0x1f9ff, 1},
+               {0x1fa60, 0x1fa6d, 1},
        },
        LatinOffset: 2,
 }
@@ -3429,10 +3518,6 @@ var (
        Zs     = _Zs // Zs is the set of Unicode characters in category Zs (Separator, space).
 )
 
-// Generated by running
-//     maketables --scripts=all --url=http://www.unicode.org/Public/10.0.0/ucd/
-// DO NOT EDIT
-
 // Scripts is the set of Unicode script tables.
 var Scripts = map[string]*RangeTable{
        "Adlam":                  Adlam,
@@ -3465,6 +3550,7 @@ var Scripts = map[string]*RangeTable{
        "Cyrillic":               Cyrillic,
        "Deseret":                Deseret,
        "Devanagari":             Devanagari,
+       "Dogra":                  Dogra,
        "Duployan":               Duployan,
        "Egyptian_Hieroglyphs":   Egyptian_Hieroglyphs,
        "Elbasan":                Elbasan,
@@ -3475,9 +3561,11 @@ var Scripts = map[string]*RangeTable{
        "Grantha":                Grantha,
        "Greek":                  Greek,
        "Gujarati":               Gujarati,
+       "Gunjala_Gondi":          Gunjala_Gondi,
        "Gurmukhi":               Gurmukhi,
        "Han":                    Han,
        "Hangul":                 Hangul,
+       "Hanifi_Rohingya":        Hanifi_Rohingya,
        "Hanunoo":                Hanunoo,
        "Hatran":                 Hatran,
        "Hebrew":                 Hebrew,
@@ -3505,11 +3593,13 @@ var Scripts = map[string]*RangeTable{
        "Lycian":                 Lycian,
        "Lydian":                 Lydian,
        "Mahajani":               Mahajani,
+       "Makasar":                Makasar,
        "Malayalam":              Malayalam,
        "Mandaic":                Mandaic,
        "Manichaean":             Manichaean,
        "Marchen":                Marchen,
        "Masaram_Gondi":          Masaram_Gondi,
+       "Medefaidrin":            Medefaidrin,
        "Meetei_Mayek":           Meetei_Mayek,
        "Mende_Kikakui":          Mende_Kikakui,
        "Meroitic_Cursive":       Meroitic_Cursive,
@@ -3532,6 +3622,7 @@ var Scripts = map[string]*RangeTable{
        "Old_North_Arabian":      Old_North_Arabian,
        "Old_Permic":             Old_Permic,
        "Old_Persian":            Old_Persian,
+       "Old_Sogdian":            Old_Sogdian,
        "Old_South_Arabian":      Old_South_Arabian,
        "Old_Turkic":             Old_Turkic,
        "Oriya":                  Oriya,
@@ -3552,6 +3643,7 @@ var Scripts = map[string]*RangeTable{
        "Siddham":                Siddham,
        "SignWriting":            SignWriting,
        "Sinhala":                Sinhala,
+       "Sogdian":                Sogdian,
        "Sora_Sompeng":           Sora_Sompeng,
        "Soyombo":                Soyombo,
        "Sundanese":              Sundanese,
@@ -3590,7 +3682,7 @@ var _Adlam = &RangeTable{
 var _Ahom = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
-               {0x11700, 0x11719, 1},
+               {0x11700, 0x1171a, 1},
                {0x1171d, 0x1172b, 1},
                {0x11730, 0x1173f, 1},
        },
@@ -3608,9 +3700,8 @@ var _Arabic = &RangeTable{
                {0x0600, 0x0604, 1},
                {0x0606, 0x060b, 1},
                {0x060d, 0x061a, 1},
-               {0x061c, 0x061c, 1},
-               {0x061e, 0x061e, 1},
-               {0x0620, 0x063f, 1},
+               {0x061c, 0x0620, 2},
+               {0x0621, 0x063f, 1},
                {0x0641, 0x064a, 1},
                {0x0656, 0x066f, 1},
                {0x0671, 0x06dc, 1},
@@ -3618,7 +3709,7 @@ var _Arabic = &RangeTable{
                {0x0750, 0x077f, 1},
                {0x08a0, 0x08b4, 1},
                {0x08b6, 0x08bd, 1},
-               {0x08d4, 0x08e1, 1},
+               {0x08d3, 0x08e1, 1},
                {0x08e3, 0x08ff, 1},
                {0xfb50, 0xfbc1, 1},
                {0xfbd3, 0xfd3d, 1},
@@ -3633,32 +3724,23 @@ var _Arabic = &RangeTable{
                {0x1ee00, 0x1ee03, 1},
                {0x1ee05, 0x1ee1f, 1},
                {0x1ee21, 0x1ee22, 1},
-               {0x1ee24, 0x1ee24, 1},
-               {0x1ee27, 0x1ee27, 1},
+               {0x1ee24, 0x1ee27, 3},
                {0x1ee29, 0x1ee32, 1},
                {0x1ee34, 0x1ee37, 1},
-               {0x1ee39, 0x1ee39, 1},
-               {0x1ee3b, 0x1ee3b, 1},
-               {0x1ee42, 0x1ee42, 1},
-               {0x1ee47, 0x1ee47, 1},
-               {0x1ee49, 0x1ee49, 1},
-               {0x1ee4b, 0x1ee4b, 1},
-               {0x1ee4d, 0x1ee4f, 1},
+               {0x1ee39, 0x1ee3b, 2},
+               {0x1ee42, 0x1ee47, 5},
+               {0x1ee49, 0x1ee4d, 2},
+               {0x1ee4e, 0x1ee4f, 1},
                {0x1ee51, 0x1ee52, 1},
-               {0x1ee54, 0x1ee54, 1},
-               {0x1ee57, 0x1ee57, 1},
-               {0x1ee59, 0x1ee59, 1},
-               {0x1ee5b, 0x1ee5b, 1},
-               {0x1ee5d, 0x1ee5d, 1},
-               {0x1ee5f, 0x1ee5f, 1},
-               {0x1ee61, 0x1ee62, 1},
-               {0x1ee64, 0x1ee64, 1},
+               {0x1ee54, 0x1ee57, 3},
+               {0x1ee59, 0x1ee61, 2},
+               {0x1ee62, 0x1ee64, 2},
                {0x1ee67, 0x1ee6a, 1},
                {0x1ee6c, 0x1ee72, 1},
                {0x1ee74, 0x1ee77, 1},
                {0x1ee79, 0x1ee7c, 1},
-               {0x1ee7e, 0x1ee7e, 1},
-               {0x1ee80, 0x1ee89, 1},
+               {0x1ee7e, 0x1ee80, 2},
+               {0x1ee81, 0x1ee89, 1},
                {0x1ee8b, 0x1ee9b, 1},
                {0x1eea1, 0x1eea3, 1},
                {0x1eea5, 0x1eea9, 1},
@@ -3670,10 +3752,9 @@ var _Arabic = &RangeTable{
 var _Armenian = &RangeTable{
        R16: []Range16{
                {0x0531, 0x0556, 1},
-               {0x0559, 0x055f, 1},
-               {0x0561, 0x0587, 1},
-               {0x058a, 0x058a, 1},
-               {0x058d, 0x058f, 1},
+               {0x0559, 0x0588, 1},
+               {0x058a, 0x058d, 3},
+               {0x058e, 0x058f, 1},
                {0xfb13, 0xfb17, 1},
        },
 }
@@ -3724,15 +3805,15 @@ var _Bengali = &RangeTable{
                {0x098f, 0x0990, 1},
                {0x0993, 0x09a8, 1},
                {0x09aa, 0x09b0, 1},
-               {0x09b2, 0x09b2, 1},
-               {0x09b6, 0x09b9, 1},
+               {0x09b2, 0x09b6, 4},
+               {0x09b7, 0x09b9, 1},
                {0x09bc, 0x09c4, 1},
                {0x09c7, 0x09c8, 1},
                {0x09cb, 0x09ce, 1},
-               {0x09d7, 0x09d7, 1},
-               {0x09dc, 0x09dd, 1},
-               {0x09df, 0x09e3, 1},
-               {0x09e6, 0x09fd, 1},
+               {0x09d7, 0x09dc, 5},
+               {0x09dd, 0x09df, 2},
+               {0x09e0, 0x09e3, 1},
+               {0x09e6, 0x09fe, 1},
        },
 }
 
@@ -3749,7 +3830,7 @@ var _Bhaiksuki = &RangeTable{
 var _Bopomofo = &RangeTable{
        R16: []Range16{
                {0x02ea, 0x02eb, 1},
-               {0x3105, 0x312e, 1},
+               {0x3105, 0x312f, 1},
                {0x31a0, 0x31ba, 1},
        },
 }
@@ -3808,7 +3889,7 @@ var _Chakma = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x11100, 0x11134, 1},
-               {0x11136, 0x11143, 1},
+               {0x11136, 0x11146, 1},
        },
 }
 
@@ -3836,34 +3917,26 @@ var _Common = &RangeTable{
                {0x007b, 0x00a9, 1},
                {0x00ab, 0x00b9, 1},
                {0x00bb, 0x00bf, 1},
-               {0x00d7, 0x00d7, 1},
-               {0x00f7, 0x00f7, 1},
+               {0x00d7, 0x00f7, 32},
                {0x02b9, 0x02df, 1},
                {0x02e5, 0x02e9, 1},
                {0x02ec, 0x02ff, 1},
-               {0x0374, 0x0374, 1},
-               {0x037e, 0x037e, 1},
-               {0x0385, 0x0385, 1},
-               {0x0387, 0x0387, 1},
-               {0x0589, 0x0589, 1},
-               {0x0605, 0x0605, 1},
-               {0x060c, 0x060c, 1},
-               {0x061b, 0x061b, 1},
-               {0x061f, 0x061f, 1},
-               {0x0640, 0x0640, 1},
-               {0x06dd, 0x06dd, 1},
-               {0x08e2, 0x08e2, 1},
+               {0x0374, 0x037e, 10},
+               {0x0385, 0x0387, 2},
+               {0x0589, 0x0605, 124},
+               {0x060c, 0x061b, 15},
+               {0x061f, 0x0640, 33},
+               {0x06dd, 0x08e2, 517},
                {0x0964, 0x0965, 1},
-               {0x0e3f, 0x0e3f, 1},
-               {0x0fd5, 0x0fd8, 1},
-               {0x10fb, 0x10fb, 1},
-               {0x16eb, 0x16ed, 1},
+               {0x0e3f, 0x0fd5, 406},
+               {0x0fd6, 0x0fd8, 1},
+               {0x10fb, 0x16eb, 1520},
+               {0x16ec, 0x16ed, 1},
                {0x1735, 0x1736, 1},
                {0x1802, 0x1803, 1},
-               {0x1805, 0x1805, 1},
-               {0x1cd3, 0x1cd3, 1},
-               {0x1ce1, 0x1ce1, 1},
-               {0x1ce9, 0x1cec, 1},
+               {0x1805, 0x1cd3, 1230},
+               {0x1ce1, 0x1ce9, 8},
+               {0x1cea, 0x1cec, 1},
                {0x1cee, 0x1cf3, 1},
                {0x1cf5, 0x1cf7, 1},
                {0x2000, 0x200b, 1},
@@ -3883,21 +3956,19 @@ var _Common = &RangeTable{
                {0x2460, 0x27ff, 1},
                {0x2900, 0x2b73, 1},
                {0x2b76, 0x2b95, 1},
-               {0x2b98, 0x2bb9, 1},
-               {0x2bbd, 0x2bc8, 1},
-               {0x2bca, 0x2bd2, 1},
-               {0x2bec, 0x2bef, 1},
-               {0x2e00, 0x2e49, 1},
+               {0x2b98, 0x2bc8, 1},
+               {0x2bca, 0x2bfe, 1},
+               {0x2e00, 0x2e4e, 1},
                {0x2ff0, 0x2ffb, 1},
                {0x3000, 0x3004, 1},
-               {0x3006, 0x3006, 1},
-               {0x3008, 0x3020, 1},
+               {0x3006, 0x3008, 2},
+               {0x3009, 0x3020, 1},
                {0x3030, 0x3037, 1},
                {0x303c, 0x303f, 1},
                {0x309b, 0x309c, 1},
-               {0x30a0, 0x30a0, 1},
-               {0x30fb, 0x30fc, 1},
-               {0x3190, 0x319f, 1},
+               {0x30a0, 0x30fb, 91},
+               {0x30fc, 0x3190, 148},
+               {0x3191, 0x319f, 1},
                {0x31c0, 0x31e3, 1},
                {0x3220, 0x325f, 1},
                {0x327f, 0x32cf, 1},
@@ -3906,21 +3977,20 @@ var _Common = &RangeTable{
                {0xa700, 0xa721, 1},
                {0xa788, 0xa78a, 1},
                {0xa830, 0xa839, 1},
-               {0xa92e, 0xa92e, 1},
-               {0xa9cf, 0xa9cf, 1},
-               {0xab5b, 0xab5b, 1},
-               {0xfd3e, 0xfd3f, 1},
-               {0xfe10, 0xfe19, 1},
+               {0xa92e, 0xa9cf, 161},
+               {0xab5b, 0xfd3e, 20963},
+               {0xfd3f, 0xfe10, 209},
+               {0xfe11, 0xfe19, 1},
                {0xfe30, 0xfe52, 1},
                {0xfe54, 0xfe66, 1},
                {0xfe68, 0xfe6b, 1},
-               {0xfeff, 0xfeff, 1},
-               {0xff01, 0xff20, 1},
+               {0xfeff, 0xff01, 2},
+               {0xff02, 0xff20, 1},
                {0xff3b, 0xff40, 1},
                {0xff5b, 0xff65, 1},
-               {0xff70, 0xff70, 1},
-               {0xff9e, 0xff9f, 1},
-               {0xffe0, 0xffe6, 1},
+               {0xff70, 0xff9e, 46},
+               {0xff9f, 0xffe0, 65},
+               {0xffe1, 0xffe6, 1},
                {0xffe8, 0xffee, 1},
                {0xfff9, 0xfffd, 1},
        },
@@ -3939,17 +4009,18 @@ var _Common = &RangeTable{
                {0x1d183, 0x1d184, 1},
                {0x1d18c, 0x1d1a9, 1},
                {0x1d1ae, 0x1d1e8, 1},
+               {0x1d2e0, 0x1d2f3, 1},
                {0x1d300, 0x1d356, 1},
-               {0x1d360, 0x1d371, 1},
+               {0x1d360, 0x1d378, 1},
                {0x1d400, 0x1d454, 1},
                {0x1d456, 0x1d49c, 1},
                {0x1d49e, 0x1d49f, 1},
-               {0x1d4a2, 0x1d4a2, 1},
-               {0x1d4a5, 0x1d4a6, 1},
-               {0x1d4a9, 0x1d4ac, 1},
+               {0x1d4a2, 0x1d4a5, 3},
+               {0x1d4a6, 0x1d4a9, 3},
+               {0x1d4aa, 0x1d4ac, 1},
                {0x1d4ae, 0x1d4b9, 1},
-               {0x1d4bb, 0x1d4bb, 1},
-               {0x1d4bd, 0x1d4c3, 1},
+               {0x1d4bb, 0x1d4bd, 2},
+               {0x1d4be, 0x1d4c3, 1},
                {0x1d4c5, 0x1d505, 1},
                {0x1d507, 0x1d50a, 1},
                {0x1d50d, 0x1d514, 1},
@@ -3957,11 +4028,12 @@ var _Common = &RangeTable{
                {0x1d51e, 0x1d539, 1},
                {0x1d53b, 0x1d53e, 1},
                {0x1d540, 0x1d544, 1},
-               {0x1d546, 0x1d546, 1},
-               {0x1d54a, 0x1d550, 1},
+               {0x1d546, 0x1d54a, 4},
+               {0x1d54b, 0x1d550, 1},
                {0x1d552, 0x1d6a5, 1},
                {0x1d6a8, 0x1d7cb, 1},
                {0x1d7ce, 0x1d7ff, 1},
+               {0x1ec71, 0x1ecb4, 1},
                {0x1f000, 0x1f02b, 1},
                {0x1f030, 0x1f093, 1},
                {0x1f0a0, 0x1f0ae, 1},
@@ -3969,8 +4041,7 @@ var _Common = &RangeTable{
                {0x1f0c1, 0x1f0cf, 1},
                {0x1f0d1, 0x1f0f5, 1},
                {0x1f100, 0x1f10c, 1},
-               {0x1f110, 0x1f12e, 1},
-               {0x1f130, 0x1f16b, 1},
+               {0x1f110, 0x1f16b, 1},
                {0x1f170, 0x1f1ac, 1},
                {0x1f1e6, 0x1f1ff, 1},
                {0x1f201, 0x1f202, 1},
@@ -3980,9 +4051,9 @@ var _Common = &RangeTable{
                {0x1f260, 0x1f265, 1},
                {0x1f300, 0x1f6d4, 1},
                {0x1f6e0, 0x1f6ec, 1},
-               {0x1f6f0, 0x1f6f8, 1},
+               {0x1f6f0, 0x1f6f9, 1},
                {0x1f700, 0x1f773, 1},
-               {0x1f780, 0x1f7d4, 1},
+               {0x1f780, 0x1f7d8, 1},
                {0x1f800, 0x1f80b, 1},
                {0x1f810, 0x1f847, 1},
                {0x1f850, 0x1f859, 1},
@@ -3990,15 +4061,18 @@ var _Common = &RangeTable{
                {0x1f890, 0x1f8ad, 1},
                {0x1f900, 0x1f90b, 1},
                {0x1f910, 0x1f93e, 1},
-               {0x1f940, 0x1f94c, 1},
-               {0x1f950, 0x1f96b, 1},
-               {0x1f980, 0x1f997, 1},
-               {0x1f9c0, 0x1f9c0, 1},
-               {0x1f9d0, 0x1f9e6, 1},
-               {0xe0001, 0xe0001, 1},
-               {0xe0020, 0xe007f, 1},
+               {0x1f940, 0x1f970, 1},
+               {0x1f973, 0x1f976, 1},
+               {0x1f97a, 0x1f97c, 2},
+               {0x1f97d, 0x1f9a2, 1},
+               {0x1f9b0, 0x1f9b9, 1},
+               {0x1f9c0, 0x1f9c2, 1},
+               {0x1f9d0, 0x1f9ff, 1},
+               {0x1fa60, 0x1fa6d, 1},
+               {0xe0001, 0xe0020, 31},
+               {0xe0021, 0xe007f, 1},
        },
-       LatinOffset: 7,
+       LatinOffset: 6,
 }
 
 var _Coptic = &RangeTable{
@@ -4023,11 +4097,10 @@ var _Cypriot = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x10800, 0x10805, 1},
-               {0x10808, 0x10808, 1},
-               {0x1080a, 0x10835, 1},
+               {0x10808, 0x1080a, 2},
+               {0x1080b, 0x10835, 1},
                {0x10837, 0x10838, 1},
-               {0x1083c, 0x1083c, 1},
-               {0x1083f, 0x1083f, 1},
+               {0x1083c, 0x1083f, 3},
        },
 }
 
@@ -4036,8 +4109,7 @@ var _Cyrillic = &RangeTable{
                {0x0400, 0x0484, 1},
                {0x0487, 0x052f, 1},
                {0x1c80, 0x1c88, 1},
-               {0x1d2b, 0x1d2b, 1},
-               {0x1d78, 0x1d78, 1},
+               {0x1d2b, 0x1d78, 77},
                {0x2de0, 0x2dff, 1},
                {0xa640, 0xa69f, 1},
                {0xfe2e, 0xfe2f, 1},
@@ -4056,7 +4128,14 @@ var _Devanagari = &RangeTable{
                {0x0900, 0x0950, 1},
                {0x0953, 0x0963, 1},
                {0x0966, 0x097f, 1},
-               {0xa8e0, 0xa8fd, 1},
+               {0xa8e0, 0xa8ff, 1},
+       },
+}
+
+var _Dogra = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x11800, 0x1183b, 1},
        },
 }
 
@@ -4090,15 +4169,15 @@ var _Ethiopic = &RangeTable{
                {0x1200, 0x1248, 1},
                {0x124a, 0x124d, 1},
                {0x1250, 0x1256, 1},
-               {0x1258, 0x1258, 1},
-               {0x125a, 0x125d, 1},
+               {0x1258, 0x125a, 2},
+               {0x125b, 0x125d, 1},
                {0x1260, 0x1288, 1},
                {0x128a, 0x128d, 1},
                {0x1290, 0x12b0, 1},
                {0x12b2, 0x12b5, 1},
                {0x12b8, 0x12be, 1},
-               {0x12c0, 0x12c0, 1},
-               {0x12c2, 0x12c5, 1},
+               {0x12c0, 0x12c2, 2},
+               {0x12c3, 0x12c5, 1},
                {0x12c8, 0x12d6, 1},
                {0x12d8, 0x1310, 1},
                {0x1312, 0x1315, 1},
@@ -4125,13 +4204,13 @@ var _Ethiopic = &RangeTable{
 var _Georgian = &RangeTable{
        R16: []Range16{
                {0x10a0, 0x10c5, 1},
-               {0x10c7, 0x10c7, 1},
-               {0x10cd, 0x10cd, 1},
+               {0x10c7, 0x10cd, 6},
                {0x10d0, 0x10fa, 1},
                {0x10fc, 0x10ff, 1},
+               {0x1c90, 0x1cba, 1},
+               {0x1cbd, 0x1cbf, 1},
                {0x2d00, 0x2d25, 1},
-               {0x2d27, 0x2d27, 1},
-               {0x2d2d, 0x2d2d, 1},
+               {0x2d27, 0x2d2d, 6},
        },
 }
 
@@ -4169,8 +4248,7 @@ var _Grantha = &RangeTable{
                {0x1133c, 0x11344, 1},
                {0x11347, 0x11348, 1},
                {0x1134b, 0x1134d, 1},
-               {0x11350, 0x11350, 1},
-               {0x11357, 0x11357, 1},
+               {0x11350, 0x11357, 7},
                {0x1135d, 0x11363, 1},
                {0x11366, 0x1136c, 1},
                {0x11370, 0x11374, 1},
@@ -4182,27 +4260,24 @@ var _Greek = &RangeTable{
                {0x0370, 0x0373, 1},
                {0x0375, 0x0377, 1},
                {0x037a, 0x037d, 1},
-               {0x037f, 0x037f, 1},
-               {0x0384, 0x0384, 1},
-               {0x0386, 0x0386, 1},
-               {0x0388, 0x038a, 1},
-               {0x038c, 0x038c, 1},
-               {0x038e, 0x03a1, 1},
+               {0x037f, 0x0384, 5},
+               {0x0386, 0x0388, 2},
+               {0x0389, 0x038a, 1},
+               {0x038c, 0x038e, 2},
+               {0x038f, 0x03a1, 1},
                {0x03a3, 0x03e1, 1},
                {0x03f0, 0x03ff, 1},
                {0x1d26, 0x1d2a, 1},
                {0x1d5d, 0x1d61, 1},
                {0x1d66, 0x1d6a, 1},
-               {0x1dbf, 0x1dbf, 1},
-               {0x1f00, 0x1f15, 1},
+               {0x1dbf, 0x1f00, 321},
+               {0x1f01, 0x1f15, 1},
                {0x1f18, 0x1f1d, 1},
                {0x1f20, 0x1f45, 1},
                {0x1f48, 0x1f4d, 1},
                {0x1f50, 0x1f57, 1},
-               {0x1f59, 0x1f59, 1},
-               {0x1f5b, 0x1f5b, 1},
-               {0x1f5d, 0x1f5d, 1},
-               {0x1f5f, 0x1f7d, 1},
+               {0x1f59, 0x1f5f, 2},
+               {0x1f60, 0x1f7d, 1},
                {0x1f80, 0x1fb4, 1},
                {0x1fb6, 0x1fc4, 1},
                {0x1fc6, 0x1fd3, 1},
@@ -4210,13 +4285,12 @@ var _Greek = &RangeTable{
                {0x1fdd, 0x1fef, 1},
                {0x1ff2, 0x1ff4, 1},
                {0x1ff6, 0x1ffe, 1},
-               {0x2126, 0x2126, 1},
-               {0xab65, 0xab65, 1},
+               {0x2126, 0xab65, 35391},
        },
        R32: []Range32{
                {0x10140, 0x1018e, 1},
-               {0x101a0, 0x101a0, 1},
-               {0x1d200, 0x1d245, 1},
+               {0x101a0, 0x1d200, 53344},
+               {0x1d201, 0x1d245, 1},
        },
 }
 
@@ -4232,13 +4306,25 @@ var _Gujarati = &RangeTable{
                {0x0abc, 0x0ac5, 1},
                {0x0ac7, 0x0ac9, 1},
                {0x0acb, 0x0acd, 1},
-               {0x0ad0, 0x0ad0, 1},
-               {0x0ae0, 0x0ae3, 1},
+               {0x0ad0, 0x0ae0, 16},
+               {0x0ae1, 0x0ae3, 1},
                {0x0ae6, 0x0af1, 1},
                {0x0af9, 0x0aff, 1},
        },
 }
 
+var _Gunjala_Gondi = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x11d60, 0x11d65, 1},
+               {0x11d67, 0x11d68, 1},
+               {0x11d6a, 0x11d8e, 1},
+               {0x11d90, 0x11d91, 1},
+               {0x11d93, 0x11d98, 1},
+               {0x11da0, 0x11da9, 1},
+       },
+}
+
 var _Gurmukhi = &RangeTable{
        R16: []Range16{
                {0x0a01, 0x0a03, 1},
@@ -4249,14 +4335,14 @@ var _Gurmukhi = &RangeTable{
                {0x0a32, 0x0a33, 1},
                {0x0a35, 0x0a36, 1},
                {0x0a38, 0x0a39, 1},
-               {0x0a3c, 0x0a3c, 1},
-               {0x0a3e, 0x0a42, 1},
+               {0x0a3c, 0x0a3e, 2},
+               {0x0a3f, 0x0a42, 1},
                {0x0a47, 0x0a48, 1},
                {0x0a4b, 0x0a4d, 1},
-               {0x0a51, 0x0a51, 1},
-               {0x0a59, 0x0a5c, 1},
-               {0x0a5e, 0x0a5e, 1},
-               {0x0a66, 0x0a75, 1},
+               {0x0a51, 0x0a59, 8},
+               {0x0a5a, 0x0a5c, 1},
+               {0x0a5e, 0x0a66, 8},
+               {0x0a67, 0x0a76, 1},
        },
 }
 
@@ -4265,12 +4351,11 @@ var _Han = &RangeTable{
                {0x2e80, 0x2e99, 1},
                {0x2e9b, 0x2ef3, 1},
                {0x2f00, 0x2fd5, 1},
-               {0x3005, 0x3005, 1},
-               {0x3007, 0x3007, 1},
+               {0x3005, 0x3007, 2},
                {0x3021, 0x3029, 1},
                {0x3038, 0x303b, 1},
                {0x3400, 0x4db5, 1},
-               {0x4e00, 0x9fea, 1},
+               {0x4e00, 0x9fef, 1},
                {0xf900, 0xfa6d, 1},
                {0xfa70, 0xfad9, 1},
        },
@@ -4303,6 +4388,14 @@ var _Hangul = &RangeTable{
        },
 }
 
+var _Hanifi_Rohingya = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x10d00, 0x10d27, 1},
+               {0x10d30, 0x10d39, 1},
+       },
+}
+
 var _Hanunoo = &RangeTable{
        R16: []Range16{
                {0x1720, 0x1734, 1},
@@ -4322,13 +4415,13 @@ var _Hebrew = &RangeTable{
        R16: []Range16{
                {0x0591, 0x05c7, 1},
                {0x05d0, 0x05ea, 1},
-               {0x05f0, 0x05f4, 1},
+               {0x05ef, 0x05f4, 1},
                {0xfb1d, 0xfb36, 1},
                {0xfb38, 0xfb3c, 1},
-               {0xfb3e, 0xfb3e, 1},
-               {0xfb40, 0xfb41, 1},
-               {0xfb43, 0xfb44, 1},
-               {0xfb46, 0xfb4f, 1},
+               {0xfb3e, 0xfb40, 2},
+               {0xfb41, 0xfb43, 2},
+               {0xfb44, 0xfb46, 2},
+               {0xfb47, 0xfb4f, 1},
        },
 }
 
@@ -4356,14 +4449,13 @@ var _Inherited = &RangeTable{
                {0x0300, 0x036f, 1},
                {0x0485, 0x0486, 1},
                {0x064b, 0x0655, 1},
-               {0x0670, 0x0670, 1},
-               {0x0951, 0x0952, 1},
-               {0x1ab0, 0x1abe, 1},
+               {0x0670, 0x0951, 737},
+               {0x0952, 0x1ab0, 4446},
+               {0x1ab1, 0x1abe, 1},
                {0x1cd0, 0x1cd2, 1},
                {0x1cd4, 0x1ce0, 1},
                {0x1ce2, 0x1ce8, 1},
-               {0x1ced, 0x1ced, 1},
-               {0x1cf4, 0x1cf4, 1},
+               {0x1ced, 0x1cf4, 7},
                {0x1cf8, 0x1cf9, 1},
                {0x1dc0, 0x1df9, 1},
                {0x1dfb, 0x1dff, 1},
@@ -4375,9 +4467,9 @@ var _Inherited = &RangeTable{
                {0xfe20, 0xfe2d, 1},
        },
        R32: []Range32{
-               {0x101fd, 0x101fd, 1},
-               {0x102e0, 0x102e0, 1},
-               {0x1d167, 0x1d169, 1},
+               {0x101fd, 0x102e0, 227},
+               {0x1133b, 0x1d167, 48684},
+               {0x1d168, 0x1d169, 1},
                {0x1d17b, 0x1d182, 1},
                {0x1d185, 0x1d18b, 1},
                {0x1d1aa, 0x1d1ad, 1},
@@ -4413,13 +4505,13 @@ var _Kaithi = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x11080, 0x110c1, 1},
+               {0x110cd, 0x110cd, 1},
        },
 }
 
 var _Kannada = &RangeTable{
        R16: []Range16{
-               {0x0c80, 0x0c83, 1},
-               {0x0c85, 0x0c8c, 1},
+               {0x0c80, 0x0c8c, 1},
                {0x0c8e, 0x0c90, 1},
                {0x0c92, 0x0ca8, 1},
                {0x0caa, 0x0cb3, 1},
@@ -4428,8 +4520,8 @@ var _Kannada = &RangeTable{
                {0x0cc6, 0x0cc8, 1},
                {0x0cca, 0x0ccd, 1},
                {0x0cd5, 0x0cd6, 1},
-               {0x0cde, 0x0cde, 1},
-               {0x0ce0, 0x0ce3, 1},
+               {0x0cde, 0x0ce0, 2},
+               {0x0ce1, 0x0ce3, 1},
                {0x0ce6, 0x0cef, 1},
                {0x0cf1, 0x0cf2, 1},
        },
@@ -4464,9 +4556,9 @@ var _Kharoshthi = &RangeTable{
                {0x10a05, 0x10a06, 1},
                {0x10a0c, 0x10a13, 1},
                {0x10a15, 0x10a17, 1},
-               {0x10a19, 0x10a33, 1},
+               {0x10a19, 0x10a35, 1},
                {0x10a38, 0x10a3a, 1},
-               {0x10a3f, 0x10a47, 1},
+               {0x10a3f, 0x10a48, 1},
                {0x10a50, 0x10a58, 1},
        },
 }
@@ -4499,21 +4591,19 @@ var _Khudawadi = &RangeTable{
 var _Lao = &RangeTable{
        R16: []Range16{
                {0x0e81, 0x0e82, 1},
-               {0x0e84, 0x0e84, 1},
-               {0x0e87, 0x0e88, 1},
-               {0x0e8a, 0x0e8a, 1},
-               {0x0e8d, 0x0e8d, 1},
-               {0x0e94, 0x0e97, 1},
+               {0x0e84, 0x0e87, 3},
+               {0x0e88, 0x0e8a, 2},
+               {0x0e8d, 0x0e94, 7},
+               {0x0e95, 0x0e97, 1},
                {0x0e99, 0x0e9f, 1},
                {0x0ea1, 0x0ea3, 1},
-               {0x0ea5, 0x0ea5, 1},
-               {0x0ea7, 0x0ea7, 1},
+               {0x0ea5, 0x0ea7, 2},
                {0x0eaa, 0x0eab, 1},
                {0x0ead, 0x0eb9, 1},
                {0x0ebb, 0x0ebd, 1},
                {0x0ec0, 0x0ec4, 1},
-               {0x0ec6, 0x0ec6, 1},
-               {0x0ec8, 0x0ecd, 1},
+               {0x0ec6, 0x0ec8, 2},
+               {0x0ec9, 0x0ecd, 1},
                {0x0ed0, 0x0ed9, 1},
                {0x0edc, 0x0edf, 1},
        },
@@ -4523,8 +4613,7 @@ var _Latin = &RangeTable{
        R16: []Range16{
                {0x0041, 0x005a, 1},
                {0x0061, 0x007a, 1},
-               {0x00aa, 0x00aa, 1},
-               {0x00ba, 0x00ba, 1},
+               {0x00aa, 0x00ba, 16},
                {0x00c0, 0x00d6, 1},
                {0x00d8, 0x00f6, 1},
                {0x00f8, 0x02b8, 1},
@@ -4535,17 +4624,14 @@ var _Latin = &RangeTable{
                {0x1d6b, 0x1d77, 1},
                {0x1d79, 0x1dbe, 1},
                {0x1e00, 0x1eff, 1},
-               {0x2071, 0x2071, 1},
-               {0x207f, 0x207f, 1},
+               {0x2071, 0x207f, 14},
                {0x2090, 0x209c, 1},
                {0x212a, 0x212b, 1},
-               {0x2132, 0x2132, 1},
-               {0x214e, 0x214e, 1},
+               {0x2132, 0x214e, 28},
                {0x2160, 0x2188, 1},
                {0x2c60, 0x2c7f, 1},
                {0xa722, 0xa787, 1},
-               {0xa78b, 0xa7ae, 1},
-               {0xa7b0, 0xa7b7, 1},
+               {0xa78b, 0xa7b9, 1},
                {0xa7f7, 0xa7ff, 1},
                {0xab30, 0xab5a, 1},
                {0xab5c, 0xab64, 1},
@@ -4553,7 +4639,7 @@ var _Latin = &RangeTable{
                {0xff21, 0xff3a, 1},
                {0xff41, 0xff5a, 1},
        },
-       LatinOffset: 6,
+       LatinOffset: 5,
 }
 
 var _Lepcha = &RangeTable{
@@ -4569,8 +4655,8 @@ var _Limbu = &RangeTable{
                {0x1900, 0x191e, 1},
                {0x1920, 0x192b, 1},
                {0x1930, 0x193b, 1},
-               {0x1940, 0x1940, 1},
-               {0x1944, 0x194f, 1},
+               {0x1940, 0x1944, 4},
+               {0x1945, 0x194f, 1},
        },
 }
 
@@ -4624,6 +4710,13 @@ var _Mahajani = &RangeTable{
        },
 }
 
+var _Makasar = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x11ee0, 0x11ef8, 1},
+       },
+}
+
 var _Malayalam = &RangeTable{
        R16: []Range16{
                {0x0d00, 0x0d03, 1},
@@ -4667,13 +4760,20 @@ var _Masaram_Gondi = &RangeTable{
                {0x11d00, 0x11d06, 1},
                {0x11d08, 0x11d09, 1},
                {0x11d0b, 0x11d36, 1},
-               {0x11d3a, 0x11d3a, 1},
-               {0x11d3c, 0x11d3d, 1},
-               {0x11d3f, 0x11d47, 1},
+               {0x11d3a, 0x11d3c, 2},
+               {0x11d3d, 0x11d3f, 2},
+               {0x11d40, 0x11d47, 1},
                {0x11d50, 0x11d59, 1},
        },
 }
 
+var _Medefaidrin = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x16e40, 0x16e9a, 1},
+       },
+}
+
 var _Meetei_Mayek = &RangeTable{
        R16: []Range16{
                {0xaae0, 0xaaf6, 1},
@@ -4726,10 +4826,10 @@ var _Modi = &RangeTable{
 var _Mongolian = &RangeTable{
        R16: []Range16{
                {0x1800, 0x1801, 1},
-               {0x1804, 0x1804, 1},
-               {0x1806, 0x180e, 1},
+               {0x1804, 0x1806, 2},
+               {0x1807, 0x180e, 1},
                {0x1810, 0x1819, 1},
-               {0x1820, 0x1877, 1},
+               {0x1820, 0x1878, 1},
                {0x1880, 0x18aa, 1},
        },
        R32: []Range32{
@@ -4750,8 +4850,8 @@ var _Multani = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x11280, 0x11286, 1},
-               {0x11288, 0x11288, 1},
-               {0x1128a, 0x1128d, 1},
+               {0x11288, 0x1128a, 2},
+               {0x1128b, 0x1128d, 1},
                {0x1128f, 0x1129d, 1},
                {0x1129f, 0x112a9, 1},
        },
@@ -4786,22 +4886,23 @@ var _Newa = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x11400, 0x11459, 1},
-               {0x1145b, 0x1145b, 1},
-               {0x1145d, 0x1145d, 1},
+               {0x1145b, 0x1145d, 2},
+               {0x1145e, 0x1145e, 1},
        },
 }
 
 var _Nko = &RangeTable{
        R16: []Range16{
                {0x07c0, 0x07fa, 1},
+               {0x07fd, 0x07ff, 1},
        },
 }
 
 var _Nushu = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
-               {0x16fe1, 0x16fe1, 1},
-               {0x1b170, 0x1b2fb, 1},
+               {0x16fe1, 0x1b170, 16783},
+               {0x1b171, 0x1b2fb, 1},
        },
 }
 
@@ -4856,6 +4957,13 @@ var _Old_Persian = &RangeTable{
        },
 }
 
+var _Old_Sogdian = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x10f00, 0x10f27, 1},
+       },
+}
+
 var _Old_South_Arabian = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
@@ -5019,12 +5127,12 @@ var _Sinhala = &RangeTable{
                {0x0d85, 0x0d96, 1},
                {0x0d9a, 0x0db1, 1},
                {0x0db3, 0x0dbb, 1},
-               {0x0dbd, 0x0dbd, 1},
-               {0x0dc0, 0x0dc6, 1},
-               {0x0dca, 0x0dca, 1},
-               {0x0dcf, 0x0dd4, 1},
-               {0x0dd6, 0x0dd6, 1},
-               {0x0dd8, 0x0ddf, 1},
+               {0x0dbd, 0x0dc0, 3},
+               {0x0dc1, 0x0dc6, 1},
+               {0x0dca, 0x0dcf, 5},
+               {0x0dd0, 0x0dd4, 1},
+               {0x0dd6, 0x0dd8, 2},
+               {0x0dd9, 0x0ddf, 1},
                {0x0de6, 0x0def, 1},
                {0x0df2, 0x0df4, 1},
        },
@@ -5033,6 +5141,13 @@ var _Sinhala = &RangeTable{
        },
 }
 
+var _Sogdian = &RangeTable{
+       R16: []Range16{},
+       R32: []Range32{
+               {0x10f30, 0x10f59, 1},
+       },
+}
+
 var _Sora_Sompeng = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
@@ -5045,8 +5160,7 @@ var _Soyombo = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
                {0x11a50, 0x11a83, 1},
-               {0x11a86, 0x11a9c, 1},
-               {0x11a9e, 0x11aa2, 1},
+               {0x11a86, 0x11aa2, 1},
        },
 }
 
@@ -5126,16 +5240,15 @@ var _Tamil = &RangeTable{
                {0x0b8e, 0x0b90, 1},
                {0x0b92, 0x0b95, 1},
                {0x0b99, 0x0b9a, 1},
-               {0x0b9c, 0x0b9c, 1},
-               {0x0b9e, 0x0b9f, 1},
-               {0x0ba3, 0x0ba4, 1},
-               {0x0ba8, 0x0baa, 1},
+               {0x0b9c, 0x0b9e, 2},
+               {0x0b9f, 0x0ba3, 4},
+               {0x0ba4, 0x0ba8, 4},
+               {0x0ba9, 0x0baa, 1},
                {0x0bae, 0x0bb9, 1},
                {0x0bbe, 0x0bc2, 1},
                {0x0bc6, 0x0bc8, 1},
                {0x0bca, 0x0bcd, 1},
-               {0x0bd0, 0x0bd0, 1},
-               {0x0bd7, 0x0bd7, 1},
+               {0x0bd0, 0x0bd7, 7},
                {0x0be6, 0x0bfa, 1},
        },
 }
@@ -5143,16 +5256,15 @@ var _Tamil = &RangeTable{
 var _Tangut = &RangeTable{
        R16: []Range16{},
        R32: []Range32{
-               {0x16fe0, 0x16fe0, 1},
-               {0x17000, 0x187ec, 1},
+               {0x16fe0, 0x17000, 32},
+               {0x17001, 0x187f1, 1},
                {0x18800, 0x18af2, 1},
        },
 }
 
 var _Telugu = &RangeTable{
        R16: []Range16{
-               {0x0c00, 0x0c03, 1},
-               {0x0c05, 0x0c0c, 1},
+               {0x0c00, 0x0c0c, 1},
                {0x0c0e, 0x0c10, 1},
                {0x0c12, 0x0c28, 1},
                {0x0c2a, 0x0c39, 1},
@@ -5276,6 +5388,7 @@ var (
        Cyrillic               = _Cyrillic               // Cyrillic is the set of Unicode characters in script Cyrillic.
        Deseret                = _Deseret                // Deseret is the set of Unicode characters in script Deseret.
        Devanagari             = _Devanagari             // Devanagari is the set of Unicode characters in script Devanagari.
+       Dogra                  = _Dogra                  // Dogra is the set of Unicode characters in script Dogra.
        Duployan               = _Duployan               // Duployan is the set of Unicode characters in script Duployan.
        Egyptian_Hieroglyphs   = _Egyptian_Hieroglyphs   // Egyptian_Hieroglyphs is the set of Unicode characters in script Egyptian_Hieroglyphs.
        Elbasan                = _Elbasan                // Elbasan is the set of Unicode characters in script Elbasan.
@@ -5286,9 +5399,11 @@ var (
        Grantha                = _Grantha                // Grantha is the set of Unicode characters in script Grantha.
        Greek                  = _Greek                  // Greek is the set of Unicode characters in script Greek.
        Gujarati               = _Gujarati               // Gujarati is the set of Unicode characters in script Gujarati.
+       Gunjala_Gondi          = _Gunjala_Gondi          // Gunjala_Gondi is the set of Unicode characters in script Gunjala_Gondi.
        Gurmukhi               = _Gurmukhi               // Gurmukhi is the set of Unicode characters in script Gurmukhi.
        Han                    = _Han                    // Han is the set of Unicode characters in script Han.
        Hangul                 = _Hangul                 // Hangul is the set of Unicode characters in script Hangul.
+       Hanifi_Rohingya        = _Hanifi_Rohingya        // Hanifi_Rohingya is the set of Unicode characters in script Hanifi_Rohingya.
        Hanunoo                = _Hanunoo                // Hanunoo is the set of Unicode characters in script Hanunoo.
        Hatran                 = _Hatran                 // Hatran is the set of Unicode characters in script Hatran.
        Hebrew                 = _Hebrew                 // Hebrew is the set of Unicode characters in script Hebrew.
@@ -5316,11 +5431,13 @@ var (
        Lycian                 = _Lycian                 // Lycian is the set of Unicode characters in script Lycian.
        Lydian                 = _Lydian                 // Lydian is the set of Unicode characters in script Lydian.
        Mahajani               = _Mahajani               // Mahajani is the set of Unicode characters in script Mahajani.
+       Makasar                = _Makasar                // Makasar is the set of Unicode characters in script Makasar.
        Malayalam              = _Malayalam              // Malayalam is the set of Unicode characters in script Malayalam.
        Mandaic                = _Mandaic                // Mandaic is the set of Unicode characters in script Mandaic.
        Manichaean             = _Manichaean             // Manichaean is the set of Unicode characters in script Manichaean.
        Marchen                = _Marchen                // Marchen is the set of Unicode characters in script Marchen.
        Masaram_Gondi          = _Masaram_Gondi          // Masaram_Gondi is the set of Unicode characters in script Masaram_Gondi.
+       Medefaidrin            = _Medefaidrin            // Medefaidrin is the set of Unicode characters in script Medefaidrin.
        Meetei_Mayek           = _Meetei_Mayek           // Meetei_Mayek is the set of Unicode characters in script Meetei_Mayek.
        Mende_Kikakui          = _Mende_Kikakui          // Mende_Kikakui is the set of Unicode characters in script Mende_Kikakui.
        Meroitic_Cursive       = _Meroitic_Cursive       // Meroitic_Cursive is the set of Unicode characters in script Meroitic_Cursive.
@@ -5343,6 +5460,7 @@ var (
        Old_North_Arabian      = _Old_North_Arabian      // Old_North_Arabian is the set of Unicode characters in script Old_North_Arabian.
        Old_Permic             = _Old_Permic             // Old_Permic is the set of Unicode characters in script Old_Permic.
        Old_Persian            = _Old_Persian            // Old_Persian is the set of Unicode characters in script Old_Persian.
+       Old_Sogdian            = _Old_Sogdian            // Old_Sogdian is the set of Unicode characters in script Old_Sogdian.
        Old_South_Arabian      = _Old_South_Arabian      // Old_South_Arabian is the set of Unicode characters in script Old_South_Arabian.
        Old_Turkic             = _Old_Turkic             // Old_Turkic is the set of Unicode characters in script Old_Turkic.
        Oriya                  = _Oriya                  // Oriya is the set of Unicode characters in script Oriya.
@@ -5363,6 +5481,7 @@ var (
        Siddham                = _Siddham                // Siddham is the set of Unicode characters in script Siddham.
        SignWriting            = _SignWriting            // SignWriting is the set of Unicode characters in script SignWriting.
        Sinhala                = _Sinhala                // Sinhala is the set of Unicode characters in script Sinhala.
+       Sogdian                = _Sogdian                // Sogdian is the set of Unicode characters in script Sogdian.
        Sora_Sompeng           = _Sora_Sompeng           // Sora_Sompeng is the set of Unicode characters in script Sora_Sompeng.
        Soyombo                = _Soyombo                // Soyombo is the set of Unicode characters in script Soyombo.
        Sundanese              = _Sundanese              // Sundanese is the set of Unicode characters in script Sundanese.
@@ -5389,10 +5508,6 @@ var (
        Zanabazar_Square       = _Zanabazar_Square       // Zanabazar_Square is the set of Unicode characters in script Zanabazar_Square.
 )
 
-// Generated by running
-//     maketables --props=all --url=http://www.unicode.org/Public/10.0.0/ucd/
-// DO NOT EDIT
-
 // Properties is the set of Unicode property tables.
 var Properties = map[string]*RangeTable{
        "ASCII_Hex_Digit":                    ASCII_Hex_Digit,
@@ -5443,46 +5558,35 @@ var _ASCII_Hex_Digit = &RangeTable{
 
 var _Bidi_Control = &RangeTable{
        R16: []Range16{
-               {0x061c, 0x061c, 1},
-               {0x200e, 0x200f, 1},
-               {0x202a, 0x202e, 1},
+               {0x061c, 0x200e, 6642},
+               {0x200f, 0x202a, 27},
+               {0x202b, 0x202e, 1},
                {0x2066, 0x2069, 1},
        },
 }
 
 var _Dash = &RangeTable{
        R16: []Range16{
-               {0x002d, 0x002d, 1},
-               {0x058a, 0x058a, 1},
-               {0x05be, 0x05be, 1},
-               {0x1400, 0x1400, 1},
-               {0x1806, 0x1806, 1},
-               {0x2010, 0x2015, 1},
-               {0x2053, 0x2053, 1},
-               {0x207b, 0x207b, 1},
-               {0x208b, 0x208b, 1},
-               {0x2212, 0x2212, 1},
-               {0x2e17, 0x2e17, 1},
-               {0x2e1a, 0x2e1a, 1},
+               {0x002d, 0x058a, 1373},
+               {0x05be, 0x1400, 3650},
+               {0x1806, 0x2010, 2058},
+               {0x2011, 0x2015, 1},
+               {0x2053, 0x207b, 40},
+               {0x208b, 0x2212, 391},
+               {0x2e17, 0x2e1a, 3},
                {0x2e3a, 0x2e3b, 1},
-               {0x2e40, 0x2e40, 1},
-               {0x301c, 0x301c, 1},
-               {0x3030, 0x3030, 1},
-               {0x30a0, 0x30a0, 1},
+               {0x2e40, 0x301c, 476},
+               {0x3030, 0x30a0, 112},
                {0xfe31, 0xfe32, 1},
-               {0xfe58, 0xfe58, 1},
-               {0xfe63, 0xfe63, 1},
+               {0xfe58, 0xfe63, 11},
                {0xff0d, 0xff0d, 1},
        },
-       LatinOffset: 1,
 }
 
 var _Deprecated = &RangeTable{
        R16: []Range16{
-               {0x0149, 0x0149, 1},
-               {0x0673, 0x0673, 1},
-               {0x0f77, 0x0f77, 1},
-               {0x0f79, 0x0f79, 1},
+               {0x0149, 0x0673, 1322},
+               {0x0f77, 0x0f79, 2},
                {0x17a3, 0x17a4, 1},
                {0x206a, 0x206f, 1},
                {0x2329, 0x232a, 1},
@@ -5494,25 +5598,22 @@ var _Deprecated = &RangeTable{
 
 var _Diacritic = &RangeTable{
        R16: []Range16{
-               {0x005e, 0x005e, 1},
-               {0x0060, 0x0060, 1},
-               {0x00a8, 0x00a8, 1},
-               {0x00af, 0x00af, 1},
-               {0x00b4, 0x00b4, 1},
-               {0x00b7, 0x00b8, 1},
-               {0x02b0, 0x034e, 1},
+               {0x005e, 0x0060, 2},
+               {0x00a8, 0x00af, 7},
+               {0x00b4, 0x00b7, 3},
+               {0x00b8, 0x02b0, 504},
+               {0x02b1, 0x034e, 1},
                {0x0350, 0x0357, 1},
                {0x035d, 0x0362, 1},
                {0x0374, 0x0375, 1},
-               {0x037a, 0x037a, 1},
-               {0x0384, 0x0385, 1},
-               {0x0483, 0x0487, 1},
-               {0x0559, 0x0559, 1},
-               {0x0591, 0x05a1, 1},
+               {0x037a, 0x0384, 10},
+               {0x0385, 0x0483, 254},
+               {0x0484, 0x0487, 1},
+               {0x0559, 0x0591, 56},
+               {0x0592, 0x05a1, 1},
                {0x05a3, 0x05bd, 1},
-               {0x05bf, 0x05bf, 1},
-               {0x05c1, 0x05c2, 1},
-               {0x05c4, 0x05c4, 1},
+               {0x05bf, 0x05c1, 2},
+               {0x05c2, 0x05c4, 2},
                {0x064b, 0x0652, 1},
                {0x0657, 0x0658, 1},
                {0x06df, 0x06e0, 1},
@@ -5523,128 +5624,106 @@ var _Diacritic = &RangeTable{
                {0x07eb, 0x07f5, 1},
                {0x0818, 0x0819, 1},
                {0x08e3, 0x08fe, 1},
-               {0x093c, 0x093c, 1},
-               {0x094d, 0x094d, 1},
+               {0x093c, 0x094d, 17},
                {0x0951, 0x0954, 1},
-               {0x0971, 0x0971, 1},
-               {0x09bc, 0x09bc, 1},
-               {0x09cd, 0x09cd, 1},
-               {0x0a3c, 0x0a3c, 1},
-               {0x0a4d, 0x0a4d, 1},
-               {0x0abc, 0x0abc, 1},
-               {0x0acd, 0x0acd, 1},
-               {0x0afd, 0x0aff, 1},
-               {0x0b3c, 0x0b3c, 1},
-               {0x0b4d, 0x0b4d, 1},
-               {0x0bcd, 0x0bcd, 1},
-               {0x0c4d, 0x0c4d, 1},
-               {0x0cbc, 0x0cbc, 1},
-               {0x0ccd, 0x0ccd, 1},
+               {0x0971, 0x09bc, 75},
+               {0x09cd, 0x0a3c, 111},
+               {0x0a4d, 0x0abc, 111},
+               {0x0acd, 0x0afd, 48},
+               {0x0afe, 0x0aff, 1},
+               {0x0b3c, 0x0b4d, 17},
+               {0x0bcd, 0x0c4d, 128},
+               {0x0cbc, 0x0ccd, 17},
                {0x0d3b, 0x0d3c, 1},
-               {0x0d4d, 0x0d4d, 1},
-               {0x0dca, 0x0dca, 1},
-               {0x0e47, 0x0e4c, 1},
-               {0x0e4e, 0x0e4e, 1},
-               {0x0ec8, 0x0ecc, 1},
+               {0x0d4d, 0x0e47, 125},
+               {0x0e48, 0x0e4c, 1},
+               {0x0e4e, 0x0ec8, 122},
+               {0x0ec9, 0x0ecc, 1},
                {0x0f18, 0x0f19, 1},
-               {0x0f35, 0x0f35, 1},
-               {0x0f37, 0x0f37, 1},
-               {0x0f39, 0x0f39, 1},
+               {0x0f35, 0x0f39, 2},
                {0x0f3e, 0x0f3f, 1},
                {0x0f82, 0x0f84, 1},
                {0x0f86, 0x0f87, 1},
-               {0x0fc6, 0x0fc6, 1},
-               {0x1037, 0x1037, 1},
+               {0x0fc6, 0x1037, 113},
                {0x1039, 0x103a, 1},
                {0x1087, 0x108d, 1},
-               {0x108f, 0x108f, 1},
-               {0x109a, 0x109b, 1},
-               {0x17c9, 0x17d3, 1},
-               {0x17dd, 0x17dd, 1},
-               {0x1939, 0x193b, 1},
+               {0x108f, 0x109a, 11},
+               {0x109b, 0x17c9, 1838},
+               {0x17ca, 0x17d3, 1},
+               {0x17dd, 0x1939, 348},
+               {0x193a, 0x193b, 1},
                {0x1a75, 0x1a7c, 1},
-               {0x1a7f, 0x1a7f, 1},
-               {0x1ab0, 0x1abd, 1},
-               {0x1b34, 0x1b34, 1},
-               {0x1b44, 0x1b44, 1},
+               {0x1a7f, 0x1ab0, 49},
+               {0x1ab1, 0x1abd, 1},
+               {0x1b34, 0x1b44, 16},
                {0x1b6b, 0x1b73, 1},
                {0x1baa, 0x1bab, 1},
                {0x1c36, 0x1c37, 1},
                {0x1c78, 0x1c7d, 1},
                {0x1cd0, 0x1ce8, 1},
-               {0x1ced, 0x1ced, 1},
-               {0x1cf4, 0x1cf4, 1},
+               {0x1ced, 0x1cf4, 7},
                {0x1cf7, 0x1cf9, 1},
                {0x1d2c, 0x1d6a, 1},
                {0x1dc4, 0x1dcf, 1},
                {0x1df5, 0x1df9, 1},
                {0x1dfd, 0x1dff, 1},
-               {0x1fbd, 0x1fbd, 1},
-               {0x1fbf, 0x1fc1, 1},
+               {0x1fbd, 0x1fbf, 2},
+               {0x1fc0, 0x1fc1, 1},
                {0x1fcd, 0x1fcf, 1},
                {0x1fdd, 0x1fdf, 1},
                {0x1fed, 0x1fef, 1},
                {0x1ffd, 0x1ffe, 1},
                {0x2cef, 0x2cf1, 1},
-               {0x2e2f, 0x2e2f, 1},
-               {0x302a, 0x302f, 1},
+               {0x2e2f, 0x302a, 507},
+               {0x302b, 0x302f, 1},
                {0x3099, 0x309c, 1},
-               {0x30fc, 0x30fc, 1},
-               {0xa66f, 0xa66f, 1},
+               {0x30fc, 0xa66f, 30067},
                {0xa67c, 0xa67d, 1},
-               {0xa67f, 0xa67f, 1},
-               {0xa69c, 0xa69d, 1},
-               {0xa6f0, 0xa6f1, 1},
-               {0xa717, 0xa721, 1},
-               {0xa788, 0xa788, 1},
-               {0xa7f8, 0xa7f9, 1},
-               {0xa8c4, 0xa8c4, 1},
+               {0xa67f, 0xa69c, 29},
+               {0xa69d, 0xa6f0, 83},
+               {0xa6f1, 0xa717, 38},
+               {0xa718, 0xa721, 1},
+               {0xa788, 0xa7f8, 112},
+               {0xa7f9, 0xa8c4, 203},
                {0xa8e0, 0xa8f1, 1},
                {0xa92b, 0xa92e, 1},
-               {0xa953, 0xa953, 1},
-               {0xa9b3, 0xa9b3, 1},
-               {0xa9c0, 0xa9c0, 1},
-               {0xa9e5, 0xa9e5, 1},
+               {0xa953, 0xa9b3, 96},
+               {0xa9c0, 0xa9e5, 37},
                {0xaa7b, 0xaa7d, 1},
                {0xaabf, 0xaac2, 1},
-               {0xaaf6, 0xaaf6, 1},
-               {0xab5b, 0xab5f, 1},
+               {0xaaf6, 0xab5b, 101},
+               {0xab5c, 0xab5f, 1},
                {0xabec, 0xabed, 1},
-               {0xfb1e, 0xfb1e, 1},
-               {0xfe20, 0xfe2f, 1},
-               {0xff3e, 0xff3e, 1},
-               {0xff40, 0xff40, 1},
-               {0xff70, 0xff70, 1},
-               {0xff9e, 0xff9f, 1},
-               {0xffe3, 0xffe3, 1},
+               {0xfb1e, 0xfe20, 770},
+               {0xfe21, 0xfe2f, 1},
+               {0xff3e, 0xff40, 2},
+               {0xff70, 0xff9e, 46},
+               {0xff9f, 0xffe3, 68},
        },
        R32: []Range32{
-               {0x102e0, 0x102e0, 1},
-               {0x10ae5, 0x10ae6, 1},
+               {0x102e0, 0x10ae5, 2053},
+               {0x10ae6, 0x10d22, 572},
+               {0x10d23, 0x10d27, 1},
+               {0x10f46, 0x10f50, 1},
                {0x110b9, 0x110ba, 1},
                {0x11133, 0x11134, 1},
-               {0x11173, 0x11173, 1},
-               {0x111c0, 0x111c0, 1},
+               {0x11173, 0x111c0, 77},
                {0x111ca, 0x111cc, 1},
                {0x11235, 0x11236, 1},
                {0x112e9, 0x112ea, 1},
-               {0x1133c, 0x1133c, 1},
-               {0x1134d, 0x1134d, 1},
+               {0x1133c, 0x1134d, 17},
                {0x11366, 0x1136c, 1},
                {0x11370, 0x11374, 1},
-               {0x11442, 0x11442, 1},
-               {0x11446, 0x11446, 1},
+               {0x11442, 0x11446, 4},
                {0x114c2, 0x114c3, 1},
                {0x115bf, 0x115c0, 1},
-               {0x1163f, 0x1163f, 1},
-               {0x116b6, 0x116b7, 1},
-               {0x1172b, 0x1172b, 1},
-               {0x11a34, 0x11a34, 1},
-               {0x11a47, 0x11a47, 1},
-               {0x11a99, 0x11a99, 1},
-               {0x11c3f, 0x11c3f, 1},
-               {0x11d42, 0x11d42, 1},
-               {0x11d44, 0x11d45, 1},
+               {0x1163f, 0x116b6, 119},
+               {0x116b7, 0x1172b, 116},
+               {0x11839, 0x1183a, 1},
+               {0x11a34, 0x11a47, 19},
+               {0x11a99, 0x11c3f, 422},
+               {0x11d42, 0x11d44, 2},
+               {0x11d45, 0x11d97, 82},
                {0x16af0, 0x16af4, 1},
                {0x16f8f, 0x16f9f, 1},
                {0x1d167, 0x1d169, 1},
@@ -5656,44 +5735,35 @@ var _Diacritic = &RangeTable{
                {0x1e944, 0x1e946, 1},
                {0x1e948, 0x1e94a, 1},
        },
-       LatinOffset: 6,
+       LatinOffset: 3,
 }
 
 var _Extender = &RangeTable{
        R16: []Range16{
-               {0x00b7, 0x00b7, 1},
-               {0x02d0, 0x02d1, 1},
-               {0x0640, 0x0640, 1},
-               {0x07fa, 0x07fa, 1},
-               {0x0e46, 0x0e46, 1},
-               {0x0ec6, 0x0ec6, 1},
-               {0x180a, 0x180a, 1},
-               {0x1843, 0x1843, 1},
-               {0x1aa7, 0x1aa7, 1},
-               {0x1c36, 0x1c36, 1},
-               {0x1c7b, 0x1c7b, 1},
-               {0x3005, 0x3005, 1},
-               {0x3031, 0x3035, 1},
+               {0x00b7, 0x02d0, 537},
+               {0x02d1, 0x0640, 879},
+               {0x07fa, 0x0e46, 1612},
+               {0x0ec6, 0x180a, 2372},
+               {0x1843, 0x1aa7, 612},
+               {0x1c36, 0x1c7b, 69},
+               {0x3005, 0x3031, 44},
+               {0x3032, 0x3035, 1},
                {0x309d, 0x309e, 1},
                {0x30fc, 0x30fe, 1},
-               {0xa015, 0xa015, 1},
-               {0xa60c, 0xa60c, 1},
-               {0xa9cf, 0xa9cf, 1},
-               {0xa9e6, 0xa9e6, 1},
-               {0xaa70, 0xaa70, 1},
-               {0xaadd, 0xaadd, 1},
+               {0xa015, 0xa60c, 1527},
+               {0xa9cf, 0xa9e6, 23},
+               {0xaa70, 0xaadd, 109},
                {0xaaf3, 0xaaf4, 1},
                {0xff70, 0xff70, 1},
        },
        R32: []Range32{
-               {0x1135d, 0x1135d, 1},
-               {0x115c6, 0x115c8, 1},
-               {0x11a98, 0x11a98, 1},
-               {0x16b42, 0x16b43, 1},
-               {0x16fe0, 0x16fe1, 1},
-               {0x1e944, 0x1e946, 1},
+               {0x1135d, 0x115c6, 617},
+               {0x115c7, 0x115c8, 1},
+               {0x11a98, 0x16b42, 20650},
+               {0x16b43, 0x16fe0, 1181},
+               {0x16fe1, 0x1e944, 31075},
+               {0x1e945, 0x1e946, 1},
        },
-       LatinOffset: 1,
 }
 
 var _Hex_Digit = &RangeTable{
@@ -5710,18 +5780,14 @@ var _Hex_Digit = &RangeTable{
 
 var _Hyphen = &RangeTable{
        R16: []Range16{
-               {0x002d, 0x002d, 1},
-               {0x00ad, 0x00ad, 1},
-               {0x058a, 0x058a, 1},
-               {0x1806, 0x1806, 1},
+               {0x002d, 0x00ad, 128},
+               {0x058a, 0x1806, 4732},
                {0x2010, 0x2011, 1},
-               {0x2e17, 0x2e17, 1},
-               {0x30fb, 0x30fb, 1},
-               {0xfe63, 0xfe63, 1},
-               {0xff0d, 0xff0d, 1},
+               {0x2e17, 0x30fb, 740},
+               {0xfe63, 0xff0d, 170},
                {0xff65, 0xff65, 1},
        },
-       LatinOffset: 2,
+       LatinOffset: 1,
 }
 
 var _IDS_Binary_Operator = &RangeTable{
@@ -5743,12 +5809,12 @@ var _Ideographic = &RangeTable{
                {0x3021, 0x3029, 1},
                {0x3038, 0x303a, 1},
                {0x3400, 0x4db5, 1},
-               {0x4e00, 0x9fea, 1},
+               {0x4e00, 0x9fef, 1},
                {0xf900, 0xfa6d, 1},
                {0xfa70, 0xfad9, 1},
        },
        R32: []Range32{
-               {0x17000, 0x187ec, 1},
+               {0x17000, 0x187f1, 1},
                {0x18800, 0x18af2, 1},
                {0x1b170, 0x1b2fb, 1},
                {0x20000, 0x2a6d6, 1},
@@ -5771,9 +5837,8 @@ var _Logical_Order_Exception = &RangeTable{
                {0x0e40, 0x0e44, 1},
                {0x0ec0, 0x0ec4, 1},
                {0x19b5, 0x19b7, 1},
-               {0x19ba, 0x19ba, 1},
-               {0xaab5, 0xaab6, 1},
-               {0xaab9, 0xaab9, 1},
+               {0x19ba, 0xaab5, 37115},
+               {0xaab6, 0xaab9, 3},
                {0xaabb, 0xaabc, 1},
        },
 }
@@ -5805,21 +5870,19 @@ var _Noncharacter_Code_Point = &RangeTable{
 
 var _Other_Alphabetic = &RangeTable{
        R16: []Range16{
-               {0x0345, 0x0345, 1},
-               {0x05b0, 0x05bd, 1},
-               {0x05bf, 0x05bf, 1},
-               {0x05c1, 0x05c2, 1},
-               {0x05c4, 0x05c5, 1},
-               {0x05c7, 0x05c7, 1},
+               {0x0345, 0x05b0, 619},
+               {0x05b1, 0x05bd, 1},
+               {0x05bf, 0x05c1, 2},
+               {0x05c2, 0x05c4, 2},
+               {0x05c5, 0x05c7, 2},
                {0x0610, 0x061a, 1},
                {0x064b, 0x0657, 1},
                {0x0659, 0x065f, 1},
-               {0x0670, 0x0670, 1},
-               {0x06d6, 0x06dc, 1},
+               {0x0670, 0x06d6, 102},
+               {0x06d7, 0x06dc, 1},
                {0x06e1, 0x06e4, 1},
                {0x06e7, 0x06e8, 1},
-               {0x06ed, 0x06ed, 1},
-               {0x0711, 0x0711, 1},
+               {0x06ed, 0x0711, 36},
                {0x0730, 0x073f, 1},
                {0x07a6, 0x07b0, 1},
                {0x0816, 0x0817, 1},
@@ -5838,15 +5901,14 @@ var _Other_Alphabetic = &RangeTable{
                {0x09be, 0x09c4, 1},
                {0x09c7, 0x09c8, 1},
                {0x09cb, 0x09cc, 1},
-               {0x09d7, 0x09d7, 1},
-               {0x09e2, 0x09e3, 1},
-               {0x0a01, 0x0a03, 1},
+               {0x09d7, 0x09e2, 11},
+               {0x09e3, 0x0a01, 30},
+               {0x0a02, 0x0a03, 1},
                {0x0a3e, 0x0a42, 1},
                {0x0a47, 0x0a48, 1},
                {0x0a4b, 0x0a4c, 1},
-               {0x0a51, 0x0a51, 1},
-               {0x0a70, 0x0a71, 1},
-               {0x0a75, 0x0a75, 1},
+               {0x0a51, 0x0a70, 31},
+               {0x0a71, 0x0a75, 4},
                {0x0a81, 0x0a83, 1},
                {0x0abe, 0x0ac5, 1},
                {0x0ac7, 0x0ac9, 1},
@@ -5859,12 +5921,12 @@ var _Other_Alphabetic = &RangeTable{
                {0x0b4b, 0x0b4c, 1},
                {0x0b56, 0x0b57, 1},
                {0x0b62, 0x0b63, 1},
-               {0x0b82, 0x0b82, 1},
-               {0x0bbe, 0x0bc2, 1},
+               {0x0b82, 0x0bbe, 60},
+               {0x0bbf, 0x0bc2, 1},
                {0x0bc6, 0x0bc8, 1},
                {0x0bca, 0x0bcc, 1},
-               {0x0bd7, 0x0bd7, 1},
-               {0x0c00, 0x0c03, 1},
+               {0x0bd7, 0x0c00, 41},
+               {0x0c01, 0x0c03, 1},
                {0x0c3e, 0x0c44, 1},
                {0x0c46, 0x0c48, 1},
                {0x0c4a, 0x0c4c, 1},
@@ -5880,42 +5942,41 @@ var _Other_Alphabetic = &RangeTable{
                {0x0d3e, 0x0d44, 1},
                {0x0d46, 0x0d48, 1},
                {0x0d4a, 0x0d4c, 1},
-               {0x0d57, 0x0d57, 1},
-               {0x0d62, 0x0d63, 1},
-               {0x0d82, 0x0d83, 1},
-               {0x0dcf, 0x0dd4, 1},
-               {0x0dd6, 0x0dd6, 1},
-               {0x0dd8, 0x0ddf, 1},
+               {0x0d57, 0x0d62, 11},
+               {0x0d63, 0x0d82, 31},
+               {0x0d83, 0x0dcf, 76},
+               {0x0dd0, 0x0dd4, 1},
+               {0x0dd6, 0x0dd8, 2},
+               {0x0dd9, 0x0ddf, 1},
                {0x0df2, 0x0df3, 1},
-               {0x0e31, 0x0e31, 1},
-               {0x0e34, 0x0e3a, 1},
-               {0x0e4d, 0x0e4d, 1},
-               {0x0eb1, 0x0eb1, 1},
+               {0x0e31, 0x0e34, 3},
+               {0x0e35, 0x0e3a, 1},
+               {0x0e4d, 0x0eb1, 100},
                {0x0eb4, 0x0eb9, 1},
                {0x0ebb, 0x0ebc, 1},
-               {0x0ecd, 0x0ecd, 1},
-               {0x0f71, 0x0f81, 1},
+               {0x0ecd, 0x0f71, 164},
+               {0x0f72, 0x0f81, 1},
                {0x0f8d, 0x0f97, 1},
                {0x0f99, 0x0fbc, 1},
                {0x102b, 0x1036, 1},
-               {0x1038, 0x1038, 1},
-               {0x103b, 0x103e, 1},
+               {0x1038, 0x103b, 3},
+               {0x103c, 0x103e, 1},
                {0x1056, 0x1059, 1},
                {0x105e, 0x1060, 1},
-               {0x1062, 0x1062, 1},
-               {0x1067, 0x1068, 1},
-               {0x1071, 0x1074, 1},
+               {0x1062, 0x1067, 5},
+               {0x1068, 0x1071, 9},
+               {0x1072, 0x1074, 1},
                {0x1082, 0x1086, 1},
                {0x109c, 0x109d, 1},
-               {0x135f, 0x135f, 1},
-               {0x1712, 0x1713, 1},
-               {0x1732, 0x1733, 1},
-               {0x1752, 0x1753, 1},
-               {0x1772, 0x1773, 1},
-               {0x17b6, 0x17c8, 1},
+               {0x135f, 0x1712, 947},
+               {0x1713, 0x1732, 31},
+               {0x1733, 0x1752, 31},
+               {0x1753, 0x1772, 31},
+               {0x1773, 0x17b6, 67},
+               {0x17b7, 0x17c8, 1},
                {0x1885, 0x1886, 1},
-               {0x18a9, 0x18a9, 1},
-               {0x1920, 0x192b, 1},
+               {0x18a9, 0x1920, 119},
+               {0x1921, 0x192b, 1},
                {0x1930, 0x1938, 1},
                {0x1a17, 0x1a1b, 1},
                {0x1a55, 0x1a5e, 1},
@@ -5936,21 +5997,20 @@ var _Other_Alphabetic = &RangeTable{
                {0xa823, 0xa827, 1},
                {0xa880, 0xa881, 1},
                {0xa8b4, 0xa8c3, 1},
-               {0xa8c5, 0xa8c5, 1},
-               {0xa926, 0xa92a, 1},
+               {0xa8c5, 0xa926, 97},
+               {0xa927, 0xa92a, 1},
                {0xa947, 0xa952, 1},
                {0xa980, 0xa983, 1},
                {0xa9b4, 0xa9bf, 1},
                {0xaa29, 0xaa36, 1},
-               {0xaa43, 0xaa43, 1},
-               {0xaa4c, 0xaa4d, 1},
-               {0xaab0, 0xaab0, 1},
+               {0xaa43, 0xaa4c, 9},
+               {0xaa4d, 0xaab0, 99},
                {0xaab2, 0xaab4, 1},
                {0xaab7, 0xaab8, 1},
-               {0xaabe, 0xaabe, 1},
-               {0xaaeb, 0xaaef, 1},
-               {0xaaf5, 0xaaf5, 1},
-               {0xabe3, 0xabea, 1},
+               {0xaabe, 0xaaeb, 45},
+               {0xaaec, 0xaaef, 1},
+               {0xaaf5, 0xabe3, 238},
+               {0xabe4, 0xabea, 1},
                {0xfb1e, 0xfb1e, 1},
        },
        R32: []Range32{
@@ -5958,34 +6018,36 @@ var _Other_Alphabetic = &RangeTable{
                {0x10a01, 0x10a03, 1},
                {0x10a05, 0x10a06, 1},
                {0x10a0c, 0x10a0f, 1},
+               {0x10d24, 0x10d27, 1},
                {0x11000, 0x11002, 1},
                {0x11038, 0x11045, 1},
-               {0x11082, 0x11082, 1},
-               {0x110b0, 0x110b8, 1},
+               {0x11082, 0x110b0, 46},
+               {0x110b1, 0x110b8, 1},
                {0x11100, 0x11102, 1},
                {0x11127, 0x11132, 1},
+               {0x11145, 0x11146, 1},
                {0x11180, 0x11182, 1},
                {0x111b3, 0x111bf, 1},
                {0x1122c, 0x11234, 1},
-               {0x11237, 0x11237, 1},
-               {0x1123e, 0x1123e, 1},
+               {0x11237, 0x1123e, 7},
                {0x112df, 0x112e8, 1},
                {0x11300, 0x11303, 1},
                {0x1133e, 0x11344, 1},
                {0x11347, 0x11348, 1},
                {0x1134b, 0x1134c, 1},
-               {0x11357, 0x11357, 1},
-               {0x11362, 0x11363, 1},
-               {0x11435, 0x11441, 1},
+               {0x11357, 0x11362, 11},
+               {0x11363, 0x11435, 210},
+               {0x11436, 0x11441, 1},
                {0x11443, 0x11445, 1},
                {0x114b0, 0x114c1, 1},
                {0x115af, 0x115b5, 1},
                {0x115b8, 0x115be, 1},
                {0x115dc, 0x115dd, 1},
                {0x11630, 0x1163e, 1},
-               {0x11640, 0x11640, 1},
-               {0x116ab, 0x116b5, 1},
+               {0x11640, 0x116ab, 107},
+               {0x116ac, 0x116b5, 1},
                {0x1171d, 0x1172a, 1},
+               {0x1182c, 0x11838, 1},
                {0x11a01, 0x11a0a, 1},
                {0x11a35, 0x11a39, 1},
                {0x11a3b, 0x11a3e, 1},
@@ -5996,21 +6058,24 @@ var _Other_Alphabetic = &RangeTable{
                {0x11c92, 0x11ca7, 1},
                {0x11ca9, 0x11cb6, 1},
                {0x11d31, 0x11d36, 1},
-               {0x11d3a, 0x11d3a, 1},
-               {0x11d3c, 0x11d3d, 1},
-               {0x11d3f, 0x11d41, 1},
-               {0x11d43, 0x11d43, 1},
-               {0x11d47, 0x11d47, 1},
+               {0x11d3a, 0x11d3c, 2},
+               {0x11d3d, 0x11d3f, 2},
+               {0x11d40, 0x11d41, 1},
+               {0x11d43, 0x11d47, 4},
+               {0x11d8a, 0x11d8e, 1},
+               {0x11d90, 0x11d91, 1},
+               {0x11d93, 0x11d96, 1},
+               {0x11ef3, 0x11ef6, 1},
                {0x16b30, 0x16b36, 1},
                {0x16f51, 0x16f7e, 1},
-               {0x1bc9e, 0x1bc9e, 1},
-               {0x1e000, 0x1e006, 1},
+               {0x1bc9e, 0x1e000, 9058},
+               {0x1e001, 0x1e006, 1},
                {0x1e008, 0x1e018, 1},
                {0x1e01b, 0x1e021, 1},
                {0x1e023, 0x1e024, 1},
                {0x1e026, 0x1e02a, 1},
-               {0x1e947, 0x1e947, 1},
-               {0x1f130, 0x1f149, 1},
+               {0x1e947, 0x1f130, 2025},
+               {0x1f131, 0x1f149, 1},
                {0x1f150, 0x1f169, 1},
                {0x1f170, 0x1f189, 1},
        },
@@ -6018,17 +6083,15 @@ var _Other_Alphabetic = &RangeTable{
 
 var _Other_Default_Ignorable_Code_Point = &RangeTable{
        R16: []Range16{
-               {0x034f, 0x034f, 1},
-               {0x115f, 0x1160, 1},
-               {0x17b4, 0x17b5, 1},
-               {0x2065, 0x2065, 1},
-               {0x3164, 0x3164, 1},
-               {0xffa0, 0xffa0, 1},
+               {0x034f, 0x115f, 3600},
+               {0x1160, 0x17b4, 1620},
+               {0x17b5, 0x2065, 2224},
+               {0x3164, 0xffa0, 52796},
                {0xfff0, 0xfff8, 1},
        },
        R32: []Range32{
-               {0xe0000, 0xe0000, 1},
-               {0xe0002, 0xe001f, 1},
+               {0xe0000, 0xe0002, 2},
+               {0xe0003, 0xe001f, 1},
                {0xe0080, 0xe00ff, 1},
                {0xe01f0, 0xe0fff, 1},
        },
@@ -6036,29 +6099,20 @@ var _Other_Default_Ignorable_Code_Point = &RangeTable{
 
 var _Other_Grapheme_Extend = &RangeTable{
        R16: []Range16{
-               {0x09be, 0x09be, 1},
-               {0x09d7, 0x09d7, 1},
-               {0x0b3e, 0x0b3e, 1},
-               {0x0b57, 0x0b57, 1},
-               {0x0bbe, 0x0bbe, 1},
-               {0x0bd7, 0x0bd7, 1},
-               {0x0cc2, 0x0cc2, 1},
-               {0x0cd5, 0x0cd6, 1},
-               {0x0d3e, 0x0d3e, 1},
-               {0x0d57, 0x0d57, 1},
-               {0x0dcf, 0x0dcf, 1},
-               {0x0ddf, 0x0ddf, 1},
-               {0x200c, 0x200c, 1},
+               {0x09be, 0x09d7, 25},
+               {0x0b3e, 0x0b57, 25},
+               {0x0bbe, 0x0bd7, 25},
+               {0x0cc2, 0x0cd5, 19},
+               {0x0cd6, 0x0d3e, 104},
+               {0x0d57, 0x0dcf, 120},
+               {0x0ddf, 0x200c, 4653},
                {0x302e, 0x302f, 1},
                {0xff9e, 0xff9f, 1},
        },
        R32: []Range32{
-               {0x1133e, 0x1133e, 1},
-               {0x11357, 0x11357, 1},
-               {0x114b0, 0x114b0, 1},
-               {0x114bd, 0x114bd, 1},
-               {0x115af, 0x115af, 1},
-               {0x1d165, 0x1d165, 1},
+               {0x1133e, 0x11357, 25},
+               {0x114b0, 0x114bd, 13},
+               {0x115af, 0x1d165, 48054},
                {0x1d16e, 0x1d172, 1},
                {0xe0020, 0xe007f, 1},
        },
@@ -6066,75 +6120,67 @@ var _Other_Grapheme_Extend = &RangeTable{
 
 var _Other_ID_Continue = &RangeTable{
        R16: []Range16{
-               {0x00b7, 0x00b7, 1},
-               {0x0387, 0x0387, 1},
+               {0x00b7, 0x0387, 720},
                {0x1369, 0x1371, 1},
                {0x19da, 0x19da, 1},
        },
-       LatinOffset: 1,
 }
 
 var _Other_ID_Start = &RangeTable{
        R16: []Range16{
                {0x1885, 0x1886, 1},
-               {0x2118, 0x2118, 1},
-               {0x212e, 0x212e, 1},
+               {0x2118, 0x212e, 22},
                {0x309b, 0x309c, 1},
        },
 }
 
 var _Other_Lowercase = &RangeTable{
        R16: []Range16{
-               {0x00aa, 0x00aa, 1},
-               {0x00ba, 0x00ba, 1},
+               {0x00aa, 0x00ba, 16},
                {0x02b0, 0x02b8, 1},
                {0x02c0, 0x02c1, 1},
                {0x02e0, 0x02e4, 1},
-               {0x0345, 0x0345, 1},
-               {0x037a, 0x037a, 1},
+               {0x0345, 0x037a, 53},
                {0x1d2c, 0x1d6a, 1},
-               {0x1d78, 0x1d78, 1},
-               {0x1d9b, 0x1dbf, 1},
-               {0x2071, 0x2071, 1},
-               {0x207f, 0x207f, 1},
+               {0x1d78, 0x1d9b, 35},
+               {0x1d9c, 0x1dbf, 1},
+               {0x2071, 0x207f, 14},
                {0x2090, 0x209c, 1},
                {0x2170, 0x217f, 1},
                {0x24d0, 0x24e9, 1},
                {0x2c7c, 0x2c7d, 1},
                {0xa69c, 0xa69d, 1},
-               {0xa770, 0xa770, 1},
-               {0xa7f8, 0xa7f9, 1},
-               {0xab5c, 0xab5f, 1},
+               {0xa770, 0xa7f8, 136},
+               {0xa7f9, 0xab5c, 867},
+               {0xab5d, 0xab5f, 1},
        },
-       LatinOffset: 2,
+       LatinOffset: 1,
 }
 
 var _Other_Math = &RangeTable{
        R16: []Range16{
-               {0x005e, 0x005e, 1},
-               {0x03d0, 0x03d2, 1},
-               {0x03d5, 0x03d5, 1},
-               {0x03f0, 0x03f1, 1},
-               {0x03f4, 0x03f5, 1},
-               {0x2016, 0x2016, 1},
+               {0x005e, 0x03d0, 882},
+               {0x03d1, 0x03d2, 1},
+               {0x03d5, 0x03f0, 27},
+               {0x03f1, 0x03f4, 3},
+               {0x03f5, 0x2016, 7201},
                {0x2032, 0x2034, 1},
-               {0x2040, 0x2040, 1},
-               {0x2061, 0x2064, 1},
+               {0x2040, 0x2061, 33},
+               {0x2062, 0x2064, 1},
                {0x207d, 0x207e, 1},
                {0x208d, 0x208e, 1},
                {0x20d0, 0x20dc, 1},
-               {0x20e1, 0x20e1, 1},
-               {0x20e5, 0x20e6, 1},
-               {0x20eb, 0x20ef, 1},
-               {0x2102, 0x2102, 1},
-               {0x2107, 0x2107, 1},
+               {0x20e1, 0x20e5, 4},
+               {0x20e6, 0x20eb, 5},
+               {0x20ec, 0x20ef, 1},
+               {0x2102, 0x2107, 5},
                {0x210a, 0x2113, 1},
-               {0x2115, 0x2115, 1},
-               {0x2119, 0x211d, 1},
-               {0x2124, 0x2124, 1},
-               {0x2128, 0x2129, 1},
-               {0x212c, 0x212d, 1},
-               {0x212f, 0x2131, 1},
+               {0x2115, 0x2119, 4},
+               {0x211a, 0x211d, 1},
+               {0x2124, 0x2128, 4},
+               {0x2129, 0x212c, 3},
+               {0x212d, 0x212f, 2},
+               {0x2130, 0x2131, 1},
                {0x2133, 0x2138, 1},
                {0x213c, 0x213f, 1},
                {0x2145, 0x2149, 1},
@@ -6142,33 +6188,30 @@ var _Other_Math = &RangeTable{
                {0x219c, 0x219f, 1},
                {0x21a1, 0x21a2, 1},
                {0x21a4, 0x21a5, 1},
-               {0x21a7, 0x21a7, 1},
-               {0x21a9, 0x21ad, 1},
+               {0x21a7, 0x21a9, 2},
+               {0x21aa, 0x21ad, 1},
                {0x21b0, 0x21b1, 1},
                {0x21b6, 0x21b7, 1},
                {0x21bc, 0x21cd, 1},
                {0x21d0, 0x21d1, 1},
-               {0x21d3, 0x21d3, 1},
-               {0x21d5, 0x21db, 1},
-               {0x21dd, 0x21dd, 1},
-               {0x21e4, 0x21e5, 1},
-               {0x2308, 0x230b, 1},
+               {0x21d3, 0x21d5, 2},
+               {0x21d6, 0x21db, 1},
+               {0x21dd, 0x21e4, 7},
+               {0x21e5, 0x2308, 291},
+               {0x2309, 0x230b, 1},
                {0x23b4, 0x23b5, 1},
-               {0x23b7, 0x23b7, 1},
-               {0x23d0, 0x23d0, 1},
-               {0x23e2, 0x23e2, 1},
-               {0x25a0, 0x25a1, 1},
-               {0x25ae, 0x25b6, 1},
+               {0x23b7, 0x23d0, 25},
+               {0x23e2, 0x25a0, 446},
+               {0x25a1, 0x25ae, 13},
+               {0x25af, 0x25b6, 1},
                {0x25bc, 0x25c0, 1},
                {0x25c6, 0x25c7, 1},
                {0x25ca, 0x25cb, 1},
                {0x25cf, 0x25d3, 1},
-               {0x25e2, 0x25e2, 1},
-               {0x25e4, 0x25e4, 1},
+               {0x25e2, 0x25e4, 2},
                {0x25e7, 0x25ec, 1},
                {0x2605, 0x2606, 1},
-               {0x2640, 0x2640, 1},
-               {0x2642, 0x2642, 1},
+               {0x2640, 0x2642, 2},
                {0x2660, 0x2663, 1},
                {0x266d, 0x266e, 1},
                {0x27c5, 0x27c6, 1},
@@ -6176,22 +6219,20 @@ var _Other_Math = &RangeTable{
                {0x2983, 0x2998, 1},
                {0x29d8, 0x29db, 1},
                {0x29fc, 0x29fd, 1},
-               {0xfe61, 0xfe61, 1},
-               {0xfe63, 0xfe63, 1},
-               {0xfe68, 0xfe68, 1},
-               {0xff3c, 0xff3c, 1},
+               {0xfe61, 0xfe63, 2},
+               {0xfe68, 0xff3c, 212},
                {0xff3e, 0xff3e, 1},
        },
        R32: []Range32{
                {0x1d400, 0x1d454, 1},
                {0x1d456, 0x1d49c, 1},
                {0x1d49e, 0x1d49f, 1},
-               {0x1d4a2, 0x1d4a2, 1},
-               {0x1d4a5, 0x1d4a6, 1},
-               {0x1d4a9, 0x1d4ac, 1},
+               {0x1d4a2, 0x1d4a5, 3},
+               {0x1d4a6, 0x1d4a9, 3},
+               {0x1d4aa, 0x1d4ac, 1},
                {0x1d4ae, 0x1d4b9, 1},
-               {0x1d4bb, 0x1d4bb, 1},
-               {0x1d4bd, 0x1d4c3, 1},
+               {0x1d4bb, 0x1d4bd, 2},
+               {0x1d4be, 0x1d4c3, 1},
                {0x1d4c5, 0x1d505, 1},
                {0x1d507, 0x1d50a, 1},
                {0x1d50d, 0x1d514, 1},
@@ -6199,8 +6240,8 @@ var _Other_Math = &RangeTable{
                {0x1d51e, 0x1d539, 1},
                {0x1d53b, 0x1d53e, 1},
                {0x1d540, 0x1d544, 1},
-               {0x1d546, 0x1d546, 1},
-               {0x1d54a, 0x1d550, 1},
+               {0x1d546, 0x1d54a, 4},
+               {0x1d54b, 0x1d550, 1},
                {0x1d552, 0x1d6a5, 1},
                {0x1d6a8, 0x1d6c0, 1},
                {0x1d6c2, 0x1d6da, 1},
@@ -6217,38 +6258,28 @@ var _Other_Math = &RangeTable{
                {0x1ee00, 0x1ee03, 1},
                {0x1ee05, 0x1ee1f, 1},
                {0x1ee21, 0x1ee22, 1},
-               {0x1ee24, 0x1ee24, 1},
-               {0x1ee27, 0x1ee27, 1},
+               {0x1ee24, 0x1ee27, 3},
                {0x1ee29, 0x1ee32, 1},
                {0x1ee34, 0x1ee37, 1},
-               {0x1ee39, 0x1ee39, 1},
-               {0x1ee3b, 0x1ee3b, 1},
-               {0x1ee42, 0x1ee42, 1},
-               {0x1ee47, 0x1ee47, 1},
-               {0x1ee49, 0x1ee49, 1},
-               {0x1ee4b, 0x1ee4b, 1},
-               {0x1ee4d, 0x1ee4f, 1},
+               {0x1ee39, 0x1ee3b, 2},
+               {0x1ee42, 0x1ee47, 5},
+               {0x1ee49, 0x1ee4d, 2},
+               {0x1ee4e, 0x1ee4f, 1},
                {0x1ee51, 0x1ee52, 1},
-               {0x1ee54, 0x1ee54, 1},
-               {0x1ee57, 0x1ee57, 1},
-               {0x1ee59, 0x1ee59, 1},
-               {0x1ee5b, 0x1ee5b, 1},
-               {0x1ee5d, 0x1ee5d, 1},
-               {0x1ee5f, 0x1ee5f, 1},
-               {0x1ee61, 0x1ee62, 1},
-               {0x1ee64, 0x1ee64, 1},
+               {0x1ee54, 0x1ee57, 3},
+               {0x1ee59, 0x1ee61, 2},
+               {0x1ee62, 0x1ee64, 2},
                {0x1ee67, 0x1ee6a, 1},
                {0x1ee6c, 0x1ee72, 1},
                {0x1ee74, 0x1ee77, 1},
                {0x1ee79, 0x1ee7c, 1},
-               {0x1ee7e, 0x1ee7e, 1},
-               {0x1ee80, 0x1ee89, 1},
+               {0x1ee7e, 0x1ee80, 2},
+               {0x1ee81, 0x1ee89, 1},
                {0x1ee8b, 0x1ee9b, 1},
                {0x1eea1, 0x1eea3, 1},
                {0x1eea5, 0x1eea9, 1},
                {0x1eeab, 0x1eebb, 1},
        },
-       LatinOffset: 1,
 }
 
 var _Other_Uppercase = &RangeTable{
@@ -6268,19 +6299,15 @@ var _Pattern_Syntax = &RangeTable{
                {0x0021, 0x002f, 1},
                {0x003a, 0x0040, 1},
                {0x005b, 0x005e, 1},
-               {0x0060, 0x0060, 1},
-               {0x007b, 0x007e, 1},
+               {0x0060, 0x007b, 27},
+               {0x007c, 0x007e, 1},
                {0x00a1, 0x00a7, 1},
-               {0x00a9, 0x00a9, 1},
-               {0x00ab, 0x00ac, 1},
-               {0x00ae, 0x00ae, 1},
-               {0x00b0, 0x00b1, 1},
-               {0x00b6, 0x00b6, 1},
-               {0x00bb, 0x00bb, 1},
-               {0x00bf, 0x00bf, 1},
-               {0x00d7, 0x00d7, 1},
-               {0x00f7, 0x00f7, 1},
-               {0x2010, 0x2027, 1},
+               {0x00a9, 0x00ab, 2},
+               {0x00ac, 0x00b0, 2},
+               {0x00b1, 0x00bb, 5},
+               {0x00bf, 0x00d7, 24},
+               {0x00f7, 0x2010, 7961},
+               {0x2011, 0x2027, 1},
                {0x2030, 0x203e, 1},
                {0x2041, 0x2053, 1},
                {0x2055, 0x205e, 1},
@@ -6290,53 +6317,48 @@ var _Pattern_Syntax = &RangeTable{
                {0x2e00, 0x2e7f, 1},
                {0x3001, 0x3003, 1},
                {0x3008, 0x3020, 1},
-               {0x3030, 0x3030, 1},
-               {0xfd3e, 0xfd3f, 1},
-               {0xfe45, 0xfe46, 1},
+               {0x3030, 0xfd3e, 52494},
+               {0xfd3f, 0xfe45, 262},
+               {0xfe46, 0xfe46, 1},
        },
-       LatinOffset: 15,
+       LatinOffset: 10,
 }
 
 var _Pattern_White_Space = &RangeTable{
        R16: []Range16{
                {0x0009, 0x000d, 1},
-               {0x0020, 0x0020, 1},
-               {0x0085, 0x0085, 1},
+               {0x0020, 0x0085, 101},
                {0x200e, 0x200f, 1},
                {0x2028, 0x2029, 1},
        },
-       LatinOffset: 3,
+       LatinOffset: 2,
 }
 
 var _Prepended_Concatenation_Mark = &RangeTable{
        R16: []Range16{
                {0x0600, 0x0605, 1},
-               {0x06dd, 0x06dd, 1},
-               {0x070f, 0x070f, 1},
+               {0x06dd, 0x070f, 50},
                {0x08e2, 0x08e2, 1},
        },
        R32: []Range32{
-               {0x110bd, 0x110bd, 1},
+               {0x110bd, 0x110cd, 16},
        },
 }
 
 var _Quotation_Mark = &RangeTable{
        R16: []Range16{
-               {0x0022, 0x0022, 1},
-               {0x0027, 0x0027, 1},
-               {0x00ab, 0x00ab, 1},
-               {0x00bb, 0x00bb, 1},
+               {0x0022, 0x0027, 5},
+               {0x00ab, 0x00bb, 16},
                {0x2018, 0x201f, 1},
                {0x2039, 0x203a, 1},
-               {0x2e42, 0x2e42, 1},
-               {0x300c, 0x300f, 1},
+               {0x2e42, 0x300c, 458},
+               {0x300d, 0x300f, 1},
                {0x301d, 0x301f, 1},
                {0xfe41, 0xfe44, 1},
-               {0xff02, 0xff02, 1},
-               {0xff07, 0xff07, 1},
+               {0xff02, 0xff07, 5},
                {0xff62, 0xff63, 1},
        },
-       LatinOffset: 4,
+       LatinOffset: 2,
 }
 
 var _Radical = &RangeTable{
@@ -6356,62 +6378,54 @@ var _Regional_Indicator = &RangeTable{
 
 var _Sentence_Terminal = &RangeTable{
        R16: []Range16{
-               {0x0021, 0x0021, 1},
-               {0x002e, 0x002e, 1},
-               {0x003f, 0x003f, 1},
-               {0x0589, 0x0589, 1},
-               {0x061f, 0x061f, 1},
-               {0x06d4, 0x06d4, 1},
-               {0x0700, 0x0702, 1},
-               {0x07f9, 0x07f9, 1},
-               {0x0964, 0x0965, 1},
-               {0x104a, 0x104b, 1},
-               {0x1362, 0x1362, 1},
+               {0x0021, 0x002e, 13},
+               {0x003f, 0x0589, 1354},
+               {0x061e, 0x061f, 1},
+               {0x06d4, 0x0700, 44},
+               {0x0701, 0x0702, 1},
+               {0x07f9, 0x0837, 62},
+               {0x0839, 0x083d, 4},
+               {0x083e, 0x0964, 294},
+               {0x0965, 0x104a, 1765},
+               {0x104b, 0x1362, 791},
                {0x1367, 0x1368, 1},
-               {0x166e, 0x166e, 1},
-               {0x1735, 0x1736, 1},
-               {0x1803, 0x1803, 1},
-               {0x1809, 0x1809, 1},
-               {0x1944, 0x1945, 1},
-               {0x1aa8, 0x1aab, 1},
+               {0x166e, 0x1735, 199},
+               {0x1736, 0x1803, 205},
+               {0x1809, 0x1944, 315},
+               {0x1945, 0x1aa8, 355},
+               {0x1aa9, 0x1aab, 1},
                {0x1b5a, 0x1b5b, 1},
                {0x1b5e, 0x1b5f, 1},
                {0x1c3b, 0x1c3c, 1},
                {0x1c7e, 0x1c7f, 1},
                {0x203c, 0x203d, 1},
                {0x2047, 0x2049, 1},
-               {0x2e2e, 0x2e2e, 1},
-               {0x2e3c, 0x2e3c, 1},
-               {0x3002, 0x3002, 1},
-               {0xa4ff, 0xa4ff, 1},
+               {0x2e2e, 0x2e3c, 14},
+               {0x3002, 0xa4ff, 29949},
                {0xa60e, 0xa60f, 1},
-               {0xa6f3, 0xa6f3, 1},
-               {0xa6f7, 0xa6f7, 1},
+               {0xa6f3, 0xa6f7, 4},
                {0xa876, 0xa877, 1},
                {0xa8ce, 0xa8cf, 1},
-               {0xa92f, 0xa92f, 1},
-               {0xa9c8, 0xa9c9, 1},
-               {0xaa5d, 0xaa5f, 1},
+               {0xa92f, 0xa9c8, 153},
+               {0xa9c9, 0xaa5d, 148},
+               {0xaa5e, 0xaa5f, 1},
                {0xaaf0, 0xaaf1, 1},
-               {0xabeb, 0xabeb, 1},
-               {0xfe52, 0xfe52, 1},
+               {0xabeb, 0xfe52, 21095},
                {0xfe56, 0xfe57, 1},
-               {0xff01, 0xff01, 1},
-               {0xff0e, 0xff0e, 1},
-               {0xff1f, 0xff1f, 1},
-               {0xff61, 0xff61, 1},
+               {0xff01, 0xff0e, 13},
+               {0xff1f, 0xff61, 66},
        },
        R32: []Range32{
                {0x10a56, 0x10a57, 1},
+               {0x10f55, 0x10f59, 1},
                {0x11047, 0x11048, 1},
                {0x110be, 0x110c1, 1},
                {0x11141, 0x11143, 1},
                {0x111c5, 0x111c6, 1},
-               {0x111cd, 0x111cd, 1},
-               {0x111de, 0x111df, 1},
-               {0x11238, 0x11239, 1},
-               {0x1123b, 0x1123c, 1},
-               {0x112a9, 0x112a9, 1},
+               {0x111cd, 0x111de, 17},
+               {0x111df, 0x11238, 89},
+               {0x11239, 0x1123b, 2},
+               {0x1123c, 0x112a9, 109},
                {0x1144b, 0x1144c, 1},
                {0x115c2, 0x115c3, 1},
                {0x115c9, 0x115d7, 1},
@@ -6420,36 +6434,28 @@ var _Sentence_Terminal = &RangeTable{
                {0x11a42, 0x11a43, 1},
                {0x11a9b, 0x11a9c, 1},
                {0x11c41, 0x11c42, 1},
+               {0x11ef7, 0x11ef8, 1},
                {0x16a6e, 0x16a6f, 1},
-               {0x16af5, 0x16af5, 1},
-               {0x16b37, 0x16b38, 1},
-               {0x16b44, 0x16b44, 1},
-               {0x1bc9f, 0x1bc9f, 1},
+               {0x16af5, 0x16b37, 66},
+               {0x16b38, 0x16b44, 12},
+               {0x16e98, 0x1bc9f, 19975},
                {0x1da88, 0x1da88, 1},
        },
-       LatinOffset: 3,
+       LatinOffset: 1,
 }
 
 var _Soft_Dotted = &RangeTable{
        R16: []Range16{
                {0x0069, 0x006a, 1},
-               {0x012f, 0x012f, 1},
-               {0x0249, 0x0249, 1},
-               {0x0268, 0x0268, 1},
-               {0x029d, 0x029d, 1},
-               {0x02b2, 0x02b2, 1},
-               {0x03f3, 0x03f3, 1},
-               {0x0456, 0x0456, 1},
-               {0x0458, 0x0458, 1},
-               {0x1d62, 0x1d62, 1},
-               {0x1d96, 0x1d96, 1},
-               {0x1da4, 0x1da4, 1},
-               {0x1da8, 0x1da8, 1},
-               {0x1e2d, 0x1e2d, 1},
-               {0x1ecb, 0x1ecb, 1},
-               {0x2071, 0x2071, 1},
-               {0x2148, 0x2149, 1},
-               {0x2c7c, 0x2c7c, 1},
+               {0x012f, 0x0249, 282},
+               {0x0268, 0x029d, 53},
+               {0x02b2, 0x03f3, 321},
+               {0x0456, 0x0458, 2},
+               {0x1d62, 0x1d96, 52},
+               {0x1da4, 0x1da8, 4},
+               {0x1e2d, 0x1ecb, 158},
+               {0x2071, 0x2148, 215},
+               {0x2149, 0x2c7c, 2867},
        },
        R32: []Range32{
                {0x1d422, 0x1d423, 1},
@@ -6471,27 +6477,21 @@ var _Soft_Dotted = &RangeTable{
 
 var _Terminal_Punctuation = &RangeTable{
        R16: []Range16{
-               {0x0021, 0x0021, 1},
-               {0x002c, 0x002c, 1},
-               {0x002e, 0x002e, 1},
-               {0x003a, 0x003b, 1},
-               {0x003f, 0x003f, 1},
-               {0x037e, 0x037e, 1},
-               {0x0387, 0x0387, 1},
-               {0x0589, 0x0589, 1},
-               {0x05c3, 0x05c3, 1},
-               {0x060c, 0x060c, 1},
-               {0x061b, 0x061b, 1},
-               {0x061f, 0x061f, 1},
-               {0x06d4, 0x06d4, 1},
-               {0x0700, 0x070a, 1},
-               {0x070c, 0x070c, 1},
-               {0x07f8, 0x07f9, 1},
-               {0x0830, 0x083e, 1},
-               {0x085e, 0x085e, 1},
-               {0x0964, 0x0965, 1},
-               {0x0e5a, 0x0e5b, 1},
-               {0x0f08, 0x0f08, 1},
+               {0x0021, 0x002c, 11},
+               {0x002e, 0x003a, 12},
+               {0x003b, 0x003f, 4},
+               {0x037e, 0x0387, 9},
+               {0x0589, 0x05c3, 58},
+               {0x060c, 0x061b, 15},
+               {0x061e, 0x061f, 1},
+               {0x06d4, 0x0700, 44},
+               {0x0701, 0x070a, 1},
+               {0x070c, 0x07f8, 236},
+               {0x07f9, 0x0830, 55},
+               {0x0831, 0x083e, 1},
+               {0x085e, 0x0964, 262},
+               {0x0965, 0x0e5a, 1269},
+               {0x0e5b, 0x0f08, 173},
                {0x0f0d, 0x0f12, 1},
                {0x104a, 0x104b, 1},
                {0x1361, 0x1368, 1},
@@ -6499,8 +6499,8 @@ var _Terminal_Punctuation = &RangeTable{
                {0x16eb, 0x16ed, 1},
                {0x1735, 0x1736, 1},
                {0x17d4, 0x17d6, 1},
-               {0x17da, 0x17da, 1},
-               {0x1802, 0x1805, 1},
+               {0x17da, 0x1802, 40},
+               {0x1803, 0x1805, 1},
                {0x1808, 0x1809, 1},
                {0x1944, 0x1945, 1},
                {0x1aa8, 0x1aab, 1},
@@ -6510,51 +6510,46 @@ var _Terminal_Punctuation = &RangeTable{
                {0x1c7e, 0x1c7f, 1},
                {0x203c, 0x203d, 1},
                {0x2047, 0x2049, 1},
-               {0x2e2e, 0x2e2e, 1},
-               {0x2e3c, 0x2e3c, 1},
-               {0x2e41, 0x2e41, 1},
-               {0x3001, 0x3002, 1},
-               {0xa4fe, 0xa4ff, 1},
-               {0xa60d, 0xa60f, 1},
+               {0x2e2e, 0x2e3c, 14},
+               {0x2e41, 0x2e4c, 11},
+               {0x2e4e, 0x3001, 435},
+               {0x3002, 0xa4fe, 29948},
+               {0xa4ff, 0xa60d, 270},
+               {0xa60e, 0xa60f, 1},
                {0xa6f3, 0xa6f7, 1},
                {0xa876, 0xa877, 1},
                {0xa8ce, 0xa8cf, 1},
-               {0xa92f, 0xa92f, 1},
-               {0xa9c7, 0xa9c9, 1},
+               {0xa92f, 0xa9c7, 152},
+               {0xa9c8, 0xa9c9, 1},
                {0xaa5d, 0xaa5f, 1},
-               {0xaadf, 0xaadf, 1},
-               {0xaaf0, 0xaaf1, 1},
-               {0xabeb, 0xabeb, 1},
+               {0xaadf, 0xaaf0, 17},
+               {0xaaf1, 0xabeb, 250},
                {0xfe50, 0xfe52, 1},
                {0xfe54, 0xfe57, 1},
-               {0xff01, 0xff01, 1},
-               {0xff0c, 0xff0c, 1},
-               {0xff0e, 0xff0e, 1},
-               {0xff1a, 0xff1b, 1},
-               {0xff1f, 0xff1f, 1},
-               {0xff61, 0xff61, 1},
-               {0xff64, 0xff64, 1},
+               {0xff01, 0xff0c, 11},
+               {0xff0e, 0xff1a, 12},
+               {0xff1b, 0xff1f, 4},
+               {0xff61, 0xff64, 3},
        },
        R32: []Range32{
-               {0x1039f, 0x1039f, 1},
-               {0x103d0, 0x103d0, 1},
-               {0x10857, 0x10857, 1},
-               {0x1091f, 0x1091f, 1},
+               {0x1039f, 0x103d0, 49},
+               {0x10857, 0x1091f, 200},
                {0x10a56, 0x10a57, 1},
                {0x10af0, 0x10af5, 1},
                {0x10b3a, 0x10b3f, 1},
                {0x10b99, 0x10b9c, 1},
+               {0x10f55, 0x10f59, 1},
                {0x11047, 0x1104d, 1},
                {0x110be, 0x110c1, 1},
                {0x11141, 0x11143, 1},
                {0x111c5, 0x111c6, 1},
-               {0x111cd, 0x111cd, 1},
-               {0x111de, 0x111df, 1},
-               {0x11238, 0x1123c, 1},
-               {0x112a9, 0x112a9, 1},
-               {0x1144b, 0x1144d, 1},
-               {0x1145b, 0x1145b, 1},
-               {0x115c2, 0x115c5, 1},
+               {0x111cd, 0x111de, 17},
+               {0x111df, 0x11238, 89},
+               {0x11239, 0x1123c, 1},
+               {0x112a9, 0x1144b, 418},
+               {0x1144c, 0x1144d, 1},
+               {0x1145b, 0x115c2, 359},
+               {0x115c3, 0x115c5, 1},
                {0x115c9, 0x115d7, 1},
                {0x11641, 0x11642, 1},
                {0x1173c, 0x1173e, 1},
@@ -6562,29 +6557,29 @@ var _Terminal_Punctuation = &RangeTable{
                {0x11a9b, 0x11a9c, 1},
                {0x11aa1, 0x11aa2, 1},
                {0x11c41, 0x11c43, 1},
-               {0x11c71, 0x11c71, 1},
-               {0x12470, 0x12474, 1},
+               {0x11c71, 0x11ef7, 646},
+               {0x11ef8, 0x12470, 1400},
+               {0x12471, 0x12474, 1},
                {0x16a6e, 0x16a6f, 1},
-               {0x16af5, 0x16af5, 1},
-               {0x16b37, 0x16b39, 1},
-               {0x16b44, 0x16b44, 1},
-               {0x1bc9f, 0x1bc9f, 1},
+               {0x16af5, 0x16b37, 66},
+               {0x16b38, 0x16b39, 1},
+               {0x16b44, 0x16e97, 851},
+               {0x16e98, 0x1bc9f, 19975},
                {0x1da87, 0x1da8a, 1},
        },
-       LatinOffset: 5,
+       LatinOffset: 3,
 }
 
 var _Unified_Ideograph = &RangeTable{
        R16: []Range16{
                {0x3400, 0x4db5, 1},
-               {0x4e00, 0x9fea, 1},
+               {0x4e00, 0x9fef, 1},
                {0xfa0e, 0xfa0f, 1},
-               {0xfa11, 0xfa11, 1},
-               {0xfa13, 0xfa14, 1},
-               {0xfa1f, 0xfa1f, 1},
-               {0xfa21, 0xfa21, 1},
-               {0xfa23, 0xfa24, 1},
-               {0xfa27, 0xfa29, 1},
+               {0xfa11, 0xfa13, 2},
+               {0xfa14, 0xfa1f, 11},
+               {0xfa21, 0xfa23, 2},
+               {0xfa24, 0xfa27, 3},
+               {0xfa28, 0xfa29, 1},
        },
        R32: []Range32{
                {0x20000, 0x2a6d6, 1},
@@ -6608,17 +6603,14 @@ var _Variation_Selector = &RangeTable{
 var _White_Space = &RangeTable{
        R16: []Range16{
                {0x0009, 0x000d, 1},
-               {0x0020, 0x0020, 1},
-               {0x0085, 0x0085, 1},
-               {0x00a0, 0x00a0, 1},
-               {0x1680, 0x1680, 1},
+               {0x0020, 0x0085, 101},
+               {0x00a0, 0x1680, 5600},
                {0x2000, 0x200a, 1},
                {0x2028, 0x2029, 1},
-               {0x202f, 0x202f, 1},
-               {0x205f, 0x205f, 1},
+               {0x202f, 0x205f, 48},
                {0x3000, 0x3000, 1},
        },
-       LatinOffset: 4,
+       LatinOffset: 2,
 }
 
 // These variables have type *RangeTable.
@@ -6660,10 +6652,6 @@ var (
        White_Space                        = _White_Space                        // White_Space is the set of Unicode characters with property White_Space.
 )
 
-// Generated by running
-//     maketables --data=http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt --casefolding=http://www.unicode.org/Public/10.0.0/ucd/CaseFolding.txt
-// DO NOT EDIT
-
 // CaseRanges is the table describing case mappings for all letters with
 // non-self mappings.
 var CaseRanges = _CaseRanges
@@ -6835,6 +6823,8 @@ var _CaseRanges = []CaseRange{
        {0x10A0, 0x10C5, d{0, 7264, 0}},
        {0x10C7, 0x10C7, d{0, 7264, 0}},
        {0x10CD, 0x10CD, d{0, 7264, 0}},
+       {0x10D0, 0x10FA, d{3008, 0, 0}},
+       {0x10FD, 0x10FF, d{3008, 0, 0}},
        {0x13A0, 0x13EF, d{0, 38864, 0}},
        {0x13F0, 0x13F5, d{0, 8, 0}},
        {0x13F8, 0x13FD, d{-8, 0, -8}},
@@ -6846,6 +6836,8 @@ var _CaseRanges = []CaseRange{
        {0x1C86, 0x1C86, d{-6236, 0, -6236}},
        {0x1C87, 0x1C87, d{-6181, 0, -6181}},
        {0x1C88, 0x1C88, d{35266, 0, 35266}},
+       {0x1C90, 0x1CBA, d{0, -3008, 0}},
+       {0x1CBD, 0x1CBF, d{0, -3008, 0}},
        {0x1D79, 0x1D79, d{35332, 0, 35332}},
        {0x1D7D, 0x1D7D, d{3814, 0, 3814}},
        {0x1E00, 0x1E95, d{UpperLower, UpperLower, UpperLower}},
@@ -6957,7 +6949,7 @@ var _CaseRanges = []CaseRange{
        {0xA7B1, 0xA7B1, d{0, -42282, 0}},
        {0xA7B2, 0xA7B2, d{0, -42261, 0}},
        {0xA7B3, 0xA7B3, d{0, 928, 0}},
-       {0xA7B4, 0xA7B7, d{UpperLower, UpperLower, UpperLower}},
+       {0xA7B4, 0xA7B9, d{UpperLower, UpperLower, UpperLower}},
        {0xAB53, 0xAB53, d{-928, 0, -928}},
        {0xAB70, 0xABBF, d{-38864, 0, -38864}},
        {0xFF21, 0xFF3A, d{0, 32, 0}},
@@ -6970,6 +6962,8 @@ var _CaseRanges = []CaseRange{
        {0x10CC0, 0x10CF2, d{-64, 0, -64}},
        {0x118A0, 0x118BF, d{0, 32, 0}},
        {0x118C0, 0x118DF, d{-32, 0, -32}},
+       {0x16E40, 0x16E5F, d{0, 32, 0}},
+       {0x16E60, 0x16E7F, d{-32, 0, -32}},
        {0x1E900, 0x1E921, d{0, 34, 0}},
        {0x1E922, 0x1E943, d{-34, 0, -34}},
 }
@@ -7534,6 +7528,8 @@ var foldLl = &RangeTable{
                {0x10a0, 0x10c5, 1},
                {0x10c7, 0x10cd, 6},
                {0x13a0, 0x13f5, 1},
+               {0x1c90, 0x1cba, 1},
+               {0x1cbd, 0x1cbf, 1},
                {0x1e00, 0x1e94, 2},
                {0x1e9e, 0x1efe, 2},
                {0x1f08, 0x1f0f, 1},
@@ -7575,14 +7571,15 @@ var foldLl = &RangeTable{
                {0xa796, 0xa7aa, 2},
                {0xa7ab, 0xa7ae, 1},
                {0xa7b0, 0xa7b4, 1},
-               {0xa7b6, 0xff21, 22379},
-               {0xff22, 0xff3a, 1},
+               {0xa7b6, 0xa7b8, 2},
+               {0xff21, 0xff3a, 1},
        },
        R32: []Range32{
                {0x10400, 0x10427, 1},
                {0x104b0, 0x104d3, 1},
                {0x10c80, 0x10cb2, 1},
                {0x118a0, 0x118bf, 1},
+               {0x16e40, 0x16e5f, 1},
                {0x1e900, 0x1e921, 1},
        },
        LatinOffset: 3,
@@ -7665,6 +7662,8 @@ var foldLu = &RangeTable{
                {0x04c2, 0x04ce, 2},
                {0x04cf, 0x052f, 2},
                {0x0561, 0x0586, 1},
+               {0x10d0, 0x10fa, 1},
+               {0x10fd, 0x10ff, 1},
                {0x13f8, 0x13fd, 1},
                {0x1c80, 0x1c88, 1},
                {0x1d79, 0x1d7d, 4},
@@ -7702,7 +7701,7 @@ var foldLu = &RangeTable{
                {0xa78c, 0xa791, 5},
                {0xa793, 0xa797, 4},
                {0xa799, 0xa7a9, 2},
-               {0xa7b5, 0xa7b7, 2},
+               {0xa7b5, 0xa7b9, 2},
                {0xab53, 0xab70, 29},
                {0xab71, 0xabbf, 1},
                {0xff41, 0xff5a, 1},
@@ -7712,6 +7711,7 @@ var foldLu = &RangeTable{
                {0x104d8, 0x104fb, 1},
                {0x10cc0, 0x10cf2, 1},
                {0x118c0, 0x118df, 1},
+               {0x16e60, 0x16e7f, 1},
                {0x1e922, 0x1e943, 1},
        },
        LatinOffset: 4,
@@ -7760,7 +7760,7 @@ var foldInherited = &RangeTable{
        },
 }
 
-// Range entries: 3587 16-bit, 1554 32-bit, 5141 total.
-// Range bytes: 21522 16-bit, 18648 32-bit, 40170 total.
+// Range entries: 3480 16-bit, 1632 32-bit, 5112 total.
+// Range bytes: 20880 16-bit, 19584 32-bit, 40464 total.
 
 // Fold orbit bytes: 88 pairs, 352 bytes
index db845ab2f2d321822d029ba2495f1b727232d544..eae4ead0dae09e446879c6418ad4a02809247523 100644 (file)
@@ -25,25 +25,25 @@ const (
 )
 
 const (
-       t1 = 0x00 // 0000 0000
-       tx = 0x80 // 1000 0000
-       t2 = 0xC0 // 1100 0000
-       t3 = 0xE0 // 1110 0000
-       t4 = 0xF0 // 1111 0000
-       t5 = 0xF8 // 1111 1000
+       t1 = 0b00000000
+       tx = 0b10000000
+       t2 = 0b11000000
+       t3 = 0b11100000
+       t4 = 0b11110000
+       t5 = 0b11111000
 
-       maskx = 0x3F // 0011 1111
-       mask2 = 0x1F // 0001 1111
-       mask3 = 0x0F // 0000 1111
-       mask4 = 0x07 // 0000 0111
+       maskx = 0b00111111
+       mask2 = 0b00011111
+       mask3 = 0b00001111
+       mask4 = 0b00000111
 
        rune1Max = 1<<7 - 1
        rune2Max = 1<<11 - 1
        rune3Max = 1<<16 - 1
 
        // The default lowest and highest continuation byte.
-       locb = 0x80 // 1000 0000
-       hicb = 0xBF // 1011 1111
+       locb = 0b10000000
+       hicb = 0b10111111
 
        // These names of these constants are chosen to give nice alignment in the
        // table below. The first nibble is an index into acceptRanges or F for
@@ -89,7 +89,8 @@ type acceptRange struct {
        hi uint8 // highest value for second byte.
 }
 
-var acceptRanges = [...]acceptRange{
+// acceptRanges has size 16 to avoid bounds checks in the code that uses it.
+var acceptRanges = [16]acceptRange{
        0: {locb, hicb},
        1: {0xA0, hicb},
        2: {locb, 0x9F},
@@ -160,23 +161,23 @@ func DecodeRune(p []byte) (r rune, size int) {
                mask := rune(x) << 31 >> 31 // Create 0x0000 or 0xFFFF.
                return rune(p[0])&^mask | RuneError&mask, 1
        }
-       sz := x & 7
+       sz := int(x & 7)
        accept := acceptRanges[x>>4]
-       if n < int(sz) {
+       if n < sz {
                return RuneError, 1
        }
        b1 := p[1]
        if b1 < accept.lo || accept.hi < b1 {
                return RuneError, 1
        }
-       if sz == 2 {
+       if sz <= 2 { // <= instead of == to help the compiler eliminate some bounds checks
                return rune(p0&mask2)<<6 | rune(b1&maskx), 2
        }
        b2 := p[2]
        if b2 < locb || hicb < b2 {
                return RuneError, 1
        }
-       if sz == 3 {
+       if sz <= 3 {
                return rune(p0&mask3)<<12 | rune(b1&maskx)<<6 | rune(b2&maskx), 3
        }
        b3 := p[3]
@@ -208,23 +209,23 @@ func DecodeRuneInString(s string) (r rune, size int) {
                mask := rune(x) << 31 >> 31 // Create 0x0000 or 0xFFFF.
                return rune(s[0])&^mask | RuneError&mask, 1
        }
-       sz := x & 7
+       sz := int(x & 7)
        accept := acceptRanges[x>>4]
-       if n < int(sz) {
+       if n < sz {
                return RuneError, 1
        }
        s1 := s[1]
        if s1 < accept.lo || accept.hi < s1 {
                return RuneError, 1
        }
-       if sz == 2 {
+       if sz <= 2 { // <= instead of == to help the compiler eliminate some bounds checks
                return rune(s0&mask2)<<6 | rune(s1&maskx), 2
        }
        s2 := s[2]
        if s2 < locb || hicb < s2 {
                return RuneError, 1
        }
-       if sz == 3 {
+       if sz <= 3 {
                return rune(s0&mask3)<<12 | rune(s1&maskx)<<6 | rune(s2&maskx), 3
        }
        s3 := s[3]
index f7aef9d7ddeb4f677dbcc7b18637a68477e9ed9c..a5b6217c931193f4cda5bac1f3577682b99035fc 100755 (executable)
@@ -14,9 +14,6 @@
 # - defaultphyspagesize: the default physical page size in bytes
 #      (not currently used, but maybe some day)
 # - family: the processor family, from ALLGOARCHFAMILY in configure.ac
-# - hugepagesize: size of a huge page in bytes
-#      (used only to decide when to use madvise with MADV_[NO]HUGEPAGE)
-#      (set to 0 if there are no huge pages)
 # - int64align: alignment of int64 type in bytes
 # - maxalign: maximum alignment of values of Go types in bytes
 # - minframesize: size of smallest possible function frame in bytes
@@ -37,7 +34,6 @@ bigendian=false
 cachelinesize=64
 defaultphyspagesize=4096
 family=unknown
-hugepagesize=0
 int64align=8
 maxalign=8
 minframesize=0
@@ -47,7 +43,6 @@ ptrsize=8
 case $goarch in
     386)
        family=I386
-       hugepagesize="1 << 21"
        int64align=4
        maxalign=4
        ptrsize=4
@@ -59,11 +54,9 @@ case $goarch in
        ;;
     amd64)
        family=AMD64
-       hugepagesize="1 << 21"
        ;;
     amd64p32)
        family=AMD64
-       hugepagesize="1 << 21"
        ptrsize=4
        ;;
     arm | armbe)
@@ -236,9 +229,6 @@ case $keyword in
     family)
        echo $family
        ;;
-    hugepagesize)
-       echo $hugepagesize
-       ;;
     int64align)
        echo $int64align
        ;;
index 72eef3bd4c9fec518613dcd0f7495bb6c366cede..b5a3bbda3b8009e95ca0f454fcfd00e4d4cdaf3f 100644 (file)
@@ -1,3 +1,4 @@
+cmd/go/internal/auth
 cmd/go/internal/base
 cmd/go/internal/bug
 cmd/go/internal/cache
@@ -27,20 +28,22 @@ cmd/go/internal/modinfo
 cmd/go/internal/modload
 cmd/go/internal/module
 cmd/go/internal/mvs
+cmd/go/internal/note
 cmd/go/internal/par
 cmd/go/internal/renameio
+cmd/go/internal/robustio
 cmd/go/internal/run
 cmd/go/internal/search
 cmd/go/internal/semver
 cmd/go/internal/str
+cmd/go/internal/sumweb
 cmd/go/internal/test
+cmd/go/internal/tlog
 cmd/go/internal/tool
 cmd/go/internal/txtar
 cmd/go/internal/version
 cmd/go/internal/vet
 cmd/go/internal/web
-cmd/go/internal/web2
-cmd/go/internal/webtest
 cmd/go/internal/work
 cmd/internal/browser
 cmd/internal/buildid
@@ -60,6 +63,7 @@ golang.org/x/tools/go/analysis/passes/cgocall
 golang.org/x/tools/go/analysis/passes/composite
 golang.org/x/tools/go/analysis/passes/copylock
 golang.org/x/tools/go/analysis/passes/ctrlflow
+golang.org/x/tools/go/analysis/passes/errorsas
 golang.org/x/tools/go/analysis/passes/httpresponse
 golang.org/x/tools/go/analysis/passes/inspect
 golang.org/x/tools/go/analysis/passes/internal/analysisutil
index f7c0007bfa46fc8d037d08d938a3bcdc790e0c36..28fdc17fce6daf5a1c8487d37a90d332434bafbb 100644 (file)
@@ -17,6 +17,8 @@ crypto/cipher
 crypto/des
 crypto/dsa
 crypto/ecdsa
+crypto/ed25519
+crypto/ed25519/internal/edwards25519
 crypto/elliptic
 crypto/hmac
 crypto/internal/randutil
@@ -70,6 +72,25 @@ go/printer
 go/scanner
 go/token
 go/types
+golang.org/x/crypto/chacha20poly1305
+golang.org/x/crypto/cryptobyte
+golang.org/x/crypto/cryptobyte/asn1
+golang.org/x/crypto/curve25519
+golang.org/x/crypto/hkdf
+golang.org/x/crypto/internal/chacha20
+golang.org/x/crypto/internal/subtle
+golang.org/x/crypto/poly1305
+golang.org/x/net/dns/dnsmessage
+golang.org/x/net/http/httpguts
+golang.org/x/net/http/httpproxy
+golang.org/x/net/http2/hpack
+golang.org/x/net/idna
+golang.org/x/net/nettest
+golang.org/x/sys/cpu
+golang.org/x/text/secure/bidirule
+golang.org/x/text/transform
+golang.org/x/text/unicode/bidi
+golang.org/x/text/unicode/norm
 hash
 hash/adler32
 hash/crc32
@@ -90,32 +111,19 @@ internal/bytealg
 internal/cpu
 internal/fmtsort
 internal/goroot
+internal/goversion
+internal/lazyregexp
+internal/lazytemplate
 internal/nettrace
+internal/oserror
 internal/poll
 internal/race
+internal/reflectlite
 internal/singleflight
 internal/syscall/unix
 internal/testenv
 internal/testlog
 internal/trace
-internal/x/crypto/chacha20poly1305
-internal/x/crypto/cryptobyte
-internal/x/crypto/cryptobyte/asn1
-internal/x/crypto/curve25519
-internal/x/crypto/hkdf
-internal/x/crypto/internal/chacha20
-internal/x/crypto/poly1305
-internal/x/net/dns/dnsmessage
-internal/x/net/http/httpguts
-internal/x/net/http/httpproxy
-internal/x/net/http2/hpack
-internal/x/net/idna
-internal/x/net/internal/nettest
-internal/x/net/nettest
-internal/x/text/secure/bidirule
-internal/x/text/transform
-internal/x/text/unicode/bidi
-internal/x/text/unicode/norm
 internal/xcoff
 io
 io/ioutil
index 79d4275f7cdcb03cbbf33bd5000adc84693bb76f..c8fb960514fb6e9f76fe6828e9c884d0e515aa46 100755 (executable)
@@ -135,7 +135,7 @@ for f in $gofiles; do
 
     if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
        # Pipe through cat so that `set -e` doesn't affect fgrep.
-       tags=`sed '/^package /q' < $f | grep '^// +build ' | cat`
+       tags=`sed '/^package /q' < $f | grep '^// \?+build ' | cat`
        omatch=true
        first=true
        match=false
@@ -143,7 +143,7 @@ for f in $gofiles; do
            case $tag in
                "//")
                    ;;
-               "+build")
+               "+build" | "//+build")
                    if test "$first" = "true"; then
                        first=false
                    elif test "$match" = "false"; then
index 59054f4703a492fab0f6ed6339152c3757e50867..e6bac0fff4572ac3f71ca1dd17c288c88bb860b1 100644 (file)
@@ -18,7 +18,7 @@ import (
 )
 
 func path(file string) string {
-       return filepath.Join("src", file)
+       return filepath.Join("testdata", file)
 }
 
 func check(t *testing.T, file string) {
@@ -63,7 +63,7 @@ func expect(t *testing.T, file string, errors []*regexp.Regexp) {
        defer os.RemoveAll(dir)
 
        dst := filepath.Join(dir, strings.TrimSuffix(file, ".go"))
-       cmd := exec.Command("go", "build", "-gcflags=-L", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
+       cmd := exec.Command("go", "build", "-gcflags=-L -e", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
        out, err := cmd.CombinedOutput()
        if err == nil {
                t.Errorf("expected cgo to fail but it succeeded")
@@ -107,21 +107,10 @@ func TestReportsTypeErrors(t *testing.T) {
        for _, file := range []string{
                "err1.go",
                "err2.go",
-               "err3.go",
-               "issue7757.go",
-               "issue8442.go",
                "issue11097a.go",
                "issue11097b.go",
-               "issue13129.go",
-               "issue13423.go",
-               "issue13467.go",
-               "issue13635.go",
-               "issue13830.go",
-               "issue16116.go",
-               "issue16591.go",
                "issue18452.go",
                "issue18889.go",
-               "issue26745.go",
                "issue28721.go",
        } {
                check(t, file)
index 254671f179eb7a690263fac51ffaa395b586c5f7..d1ef191bf545b43fa3ba120f7c1f4ffa440b45b4 100644 (file)
@@ -7,21 +7,25 @@
 package errorstest
 
 import (
-       "bufio"
        "bytes"
+       "flag"
        "fmt"
        "io/ioutil"
        "os"
        "os/exec"
        "path/filepath"
        "strings"
+       "sync/atomic"
        "testing"
 )
 
+var tmp = flag.String("tmp", "", "use `dir` for temporary files and do not clean up")
+
 // ptrTest is the tests without the boilerplate.
 type ptrTest struct {
        name      string   // for reporting
        c         string   // the cgo comment
+       c1        string   // cgo comment forced into non-export cgo file
        imports   []string // a list of imports
        support   string   // supporting functions
        body      string   // the body of the main function
@@ -39,253 +43,248 @@ var ptrTests = []ptrTest{
        {
                // Passing a pointer to a struct that contains a Go pointer.
                name: "ptr1",
-               c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-               body: `C.f(&C.s{new(C.int)})`,
+               c:    `typedef struct s1 { int *p; } s1; void f1(s1 *ps) {}`,
+               body: `C.f1(&C.s1{new(C.int)})`,
                fail: true,
        },
        {
                // Passing a pointer to a struct that contains a Go pointer.
                name: "ptr2",
-               c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-               body: `p := &C.s{new(C.int)}; C.f(p)`,
+               c:    `typedef struct s2 { int *p; } s2; void f2(s2 *ps) {}`,
+               body: `p := &C.s2{new(C.int)}; C.f2(p)`,
                fail: true,
        },
        {
                // Passing a pointer to an int field of a Go struct
                // that (irrelevantly) contains a Go pointer.
                name: "ok1",
-               c:    `struct s { int i; int *p; }; void f(int *p) {}`,
-               body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.i)`,
+               c:    `struct s3 { int i; int *p; }; void f3(int *p) {}`,
+               body: `p := &C.struct_s3{i: 0, p: new(C.int)}; C.f3(&p.i)`,
                fail: false,
        },
        {
                // Passing a pointer to a pointer field of a Go struct.
-               name: "ptr-field",
-               c:    `struct s { int i; int *p; }; void f(int **p) {}`,
-               body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.p)`,
+               name: "ptrfield",
+               c:    `struct s4 { int i; int *p; }; void f4(int **p) {}`,
+               body: `p := &C.struct_s4{i: 0, p: new(C.int)}; C.f4(&p.p)`,
                fail: true,
        },
        {
                // Passing a pointer to a pointer field of a Go
                // struct, where the field does not contain a Go
                // pointer, but another field (irrelevantly) does.
-               name: "ptr-field-ok",
-               c:    `struct s { int *p1; int *p2; }; void f(int **p) {}`,
-               body: `p := &C.struct_s{p1: nil, p2: new(C.int)}; C.f(&p.p1)`,
+               name: "ptrfieldok",
+               c:    `struct s5 { int *p1; int *p2; }; void f5(int **p) {}`,
+               body: `p := &C.struct_s5{p1: nil, p2: new(C.int)}; C.f5(&p.p1)`,
                fail: false,
        },
        {
                // Passing the address of a slice with no Go pointers.
-               name:    "slice-ok-1",
-               c:       `void f(void **p) {}`,
+               name:    "sliceok1",
+               c:       `void f6(void **p) {}`,
                imports: []string{"unsafe"},
-               body:    `s := []unsafe.Pointer{nil}; C.f(&s[0])`,
+               body:    `s := []unsafe.Pointer{nil}; C.f6(&s[0])`,
                fail:    false,
        },
        {
                // Passing the address of a slice with a Go pointer.
-               name:    "slice-ptr-1",
-               c:       `void f(void **p) {}`,
+               name:    "sliceptr1",
+               c:       `void f7(void **p) {}`,
                imports: []string{"unsafe"},
-               body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f(&s[0])`,
+               body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f7(&s[0])`,
                fail:    true,
        },
        {
                // Passing the address of a slice with a Go pointer,
                // where we are passing the address of an element that
                // is not a Go pointer.
-               name:    "slice-ptr-2",
-               c:       `void f(void **p) {}`,
+               name:    "sliceptr2",
+               c:       `void f8(void **p) {}`,
                imports: []string{"unsafe"},
-               body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f(&s[0])`,
+               body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f8(&s[0])`,
                fail:    true,
        },
        {
                // Passing the address of a slice that is an element
                // in a struct only looks at the slice.
-               name:    "slice-ok-2",
-               c:       `void f(void **p) {}`,
+               name:    "sliceok2",
+               c:       `void f9(void **p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; s []unsafe.Pointer }`,
-               body:    `i := 0; p := &S{p:&i, s:[]unsafe.Pointer{nil}}; C.f(&p.s[0])`,
+               support: `type S9 struct { p *int; s []unsafe.Pointer }`,
+               body:    `i := 0; p := &S9{p:&i, s:[]unsafe.Pointer{nil}}; C.f9(&p.s[0])`,
                fail:    false,
        },
        {
                // Passing the address of a slice of an array that is
                // an element in a struct, with a type conversion.
-               name:    "slice-ok-3",
-               c:       `void f(void* p) {}`,
+               name:    "sliceok3",
+               c:       `void f10(void* p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; a [4]byte }`,
-               body:    `i := 0; p := &S{p:&i}; s := p.a[:]; C.f(unsafe.Pointer(&s[0]))`,
+               support: `type S10 struct { p *int; a [4]byte }`,
+               body:    `i := 0; p := &S10{p:&i}; s := p.a[:]; C.f10(unsafe.Pointer(&s[0]))`,
                fail:    false,
        },
        {
                // Passing the address of a slice of an array that is
                // an element in a struct, with a type conversion.
-               name:    "slice-ok-4",
-               c:       `typedef void* PV; void f(PV p) {}`,
+               name:    "sliceok4",
+               c:       `typedef void* PV11; void f11(PV11 p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; a [4]byte }`,
-               body:    `i := 0; p := &S{p:&i}; C.f(C.PV(unsafe.Pointer(&p.a[0])))`,
+               support: `type S11 struct { p *int; a [4]byte }`,
+               body:    `i := 0; p := &S11{p:&i}; C.f11(C.PV11(unsafe.Pointer(&p.a[0])))`,
                fail:    false,
        },
        {
                // Passing the address of a static variable with no
                // pointers doesn't matter.
                name:    "varok",
-               c:       `void f(char** parg) {}`,
-               support: `var hello = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
-               body:    `parg := [1]*C.char{&hello[0]}; C.f(&parg[0])`,
+               c:       `void f12(char** parg) {}`,
+               support: `var hello12 = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
+               body:    `parg := [1]*C.char{&hello12[0]}; C.f12(&parg[0])`,
                fail:    false,
        },
        {
                // Passing the address of a static variable with
                // pointers does matter.
-               name:    "var",
-               c:       `void f(char*** parg) {}`,
-               support: `var hello = [...]*C.char{new(C.char)}`,
-               body:    `parg := [1]**C.char{&hello[0]}; C.f(&parg[0])`,
+               name:    "var1",
+               c:       `void f13(char*** parg) {}`,
+               support: `var hello13 = [...]*C.char{new(C.char)}`,
+               body:    `parg := [1]**C.char{&hello13[0]}; C.f13(&parg[0])`,
                fail:    true,
        },
        {
                // Storing a Go pointer into C memory should fail.
                name: "barrier",
                c: `#include <stdlib.h>
-                    char **f1() { return malloc(sizeof(char*)); }
-                    void f2(char **p) {}`,
-               body:      `p := C.f1(); *p = new(C.char); C.f2(p)`,
+                    char **f14a() { return malloc(sizeof(char*)); }
+                    void f14b(char **p) {}`,
+               body:      `p := C.f14a(); *p = new(C.char); C.f14b(p)`,
                fail:      true,
                expensive: true,
        },
        {
                // Storing a Go pointer into C memory by assigning a
                // large value should fail.
-               name: "barrier-struct",
+               name: "barrierstruct",
                c: `#include <stdlib.h>
-                    struct s { char *a[10]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-               body:      `p := C.f1(); p.a = [10]*C.char{new(C.char)}; C.f2(p)`,
+                    struct s15 { char *a[10]; };
+                    struct s15 *f15() { return malloc(sizeof(struct s15)); }
+                    void f15b(struct s15 *p) {}`,
+               body:      `p := C.f15(); p.a = [10]*C.char{new(C.char)}; C.f15b(p)`,
                fail:      true,
                expensive: true,
        },
        {
                // Storing a Go pointer into C memory using a slice
                // copy should fail.
-               name: "barrier-slice",
+               name: "barrierslice",
                c: `#include <stdlib.h>
-                    struct s { char *a[10]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-               body:      `p := C.f1(); copy(p.a[:], []*C.char{new(C.char)}); C.f2(p)`,
+                    struct s16 { char *a[10]; };
+                    struct s16 *f16() { return malloc(sizeof(struct s16)); }
+                    void f16b(struct s16 *p) {}`,
+               body:      `p := C.f16(); copy(p.a[:], []*C.char{new(C.char)}); C.f16b(p)`,
                fail:      true,
                expensive: true,
        },
        {
                // A very large value uses a GC program, which is a
                // different code path.
-               name: "barrier-gcprog-array",
+               name: "barriergcprogarray",
                c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-               body:      `p := C.f1(); p.a = [32769]*C.char{new(C.char)}; C.f2(p)`,
+                    struct s17 { char *a[32769]; };
+                    struct s17 *f17() { return malloc(sizeof(struct s17)); }
+                    void f17b(struct s17 *p) {}`,
+               body:      `p := C.f17(); p.a = [32769]*C.char{new(C.char)}; C.f17b(p)`,
                fail:      true,
                expensive: true,
        },
        {
                // Similar case, with a source on the heap.
-               name: "barrier-gcprog-array-heap",
+               name: "barriergcprogarrayheap",
                c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}
-                    void f3(void *p) {}`,
+                    struct s18 { char *a[32769]; };
+                    struct s18 *f18() { return malloc(sizeof(struct s18)); }
+                    void f18b(struct s18 *p) {}
+                    void f18c(void *p) {}`,
                imports:   []string{"unsafe"},
-               body:      `p := C.f1(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f2(p); n[0] = nil; C.f3(unsafe.Pointer(n))`,
+               body:      `p := C.f18(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f18b(p); n[0] = nil; C.f18c(unsafe.Pointer(n))`,
                fail:      true,
                expensive: true,
        },
        {
                // A GC program with a struct.
-               name: "barrier-gcprog-struct",
+               name: "barriergcprogstruct",
                c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s2 { struct s f; };
-                    struct s2 *f1() { return malloc(sizeof(struct s2)); }
-                    void f2(struct s2 *p) {}`,
-               body:      `p := C.f1(); p.f = C.struct_s{[32769]*C.char{new(C.char)}}; C.f2(p)`,
+                    struct s19a { char *a[32769]; };
+                    struct s19b { struct s19a f; };
+                    struct s19b *f19() { return malloc(sizeof(struct s19b)); }
+                    void f19b(struct s19b *p) {}`,
+               body:      `p := C.f19(); p.f = C.struct_s19a{[32769]*C.char{new(C.char)}}; C.f19b(p)`,
                fail:      true,
                expensive: true,
        },
        {
                // Similar case, with a source on the heap.
-               name: "barrier-gcprog-struct-heap",
+               name: "barriergcprogstructheap",
                c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s2 { struct s f; };
-                    struct s2 *f1() { return malloc(sizeof(struct s2)); }
-                    void f2(struct s2 *p) {}
-                    void f3(void *p) {}`,
+                    struct s20a { char *a[32769]; };
+                    struct s20b { struct s20a f; };
+                    struct s20b *f20() { return malloc(sizeof(struct s20b)); }
+                    void f20b(struct s20b *p) {}
+                    void f20c(void *p) {}`,
                imports:   []string{"unsafe"},
-               body:      `p := C.f1(); n := &C.struct_s{[32769]*C.char{new(C.char)}}; p.f = *n; C.f2(p); n.a[0] = nil; C.f3(unsafe.Pointer(n))`,
+               body:      `p := C.f20(); n := &C.struct_s20a{[32769]*C.char{new(C.char)}}; p.f = *n; C.f20b(p); n.a[0] = nil; C.f20c(unsafe.Pointer(n))`,
                fail:      true,
                expensive: true,
        },
        {
                // Exported functions may not return Go pointers.
                name: "export1",
-               c:    `extern unsigned char *GoFn();`,
-               support: `//export GoFn
-                          func GoFn() *byte { return new(byte) }`,
-               body: `C.GoFn()`,
+               c:    `extern unsigned char *GoFn21();`,
+               support: `//export GoFn21
+                          func GoFn21() *byte { return new(byte) }`,
+               body: `C.GoFn21()`,
                fail: true,
        },
        {
                // Returning a C pointer is fine.
                name: "exportok",
                c: `#include <stdlib.h>
-                    extern unsigned char *GoFn();`,
-               support: `//export GoFn
-                          func GoFn() *byte { return (*byte)(C.malloc(1)) }`,
-               body: `C.GoFn()`,
+                    extern unsigned char *GoFn22();`,
+               support: `//export GoFn22
+                          func GoFn22() *byte { return (*byte)(C.malloc(1)) }`,
+               body: `C.GoFn22()`,
        },
        {
                // Passing a Go string is fine.
-               name: "pass-string",
+               name: "passstring",
                c: `#include <stddef.h>
-                    typedef struct { const char *p; ptrdiff_t n; } gostring;
-                    gostring f(gostring s) { return s; }`,
+                    typedef struct { const char *p; ptrdiff_t n; } gostring23;
+                    gostring23 f23(gostring23 s) { return s; }`,
                imports: []string{"unsafe"},
-               body:    `s := "a"; r := C.f(*(*C.gostring)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
+               body:    `s := "a"; r := C.f23(*(*C.gostring23)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
        },
        {
                // Passing a slice of Go strings fails.
-               name:    "pass-string-slice",
-               c:       `void f(void *p) {}`,
+               name:    "passstringslice",
+               c:       `void f24(void *p) {}`,
                imports: []string{"strings", "unsafe"},
-               support: `type S struct { a [1]string }`,
-               body:    `s := S{a:[1]string{strings.Repeat("a", 2)}}; C.f(unsafe.Pointer(&s.a[0]))`,
+               support: `type S24 struct { a [1]string }`,
+               body:    `s := S24{a:[1]string{strings.Repeat("a", 2)}}; C.f24(unsafe.Pointer(&s.a[0]))`,
                fail:    true,
        },
        {
                // Exported functions may not return strings.
-               name:    "ret-string",
-               c:       `extern void f();`,
+               name:    "retstring",
+               c:       `extern void f25();`,
                imports: []string{"strings"},
-               support: `//export GoStr
-                          func GoStr() string { return strings.Repeat("a", 2) }`,
-               body: `C.f()`,
-               extra: []extra{
-                       {
-                               "call.c",
-                               `#include <stddef.h>
-                                 typedef struct { const char *p; ptrdiff_t n; } gostring;
-                                 extern gostring GoStr();
-                                 void f() { GoStr(); }`,
-                       },
-               },
+               support: `//export GoStr25
+                          func GoStr25() string { return strings.Repeat("a", 2) }`,
+               body: `C.f25()`,
+               c1: `#include <stddef.h>
+                                 typedef struct { const char *p; ptrdiff_t n; } gostring25;
+                                 extern gostring25 GoStr25();
+                                 void f25() { GoStr25(); }`,
                fail: true,
        },
        {
@@ -296,37 +295,37 @@ var ptrTests = []ptrTest{
                // that is, we are testing something that is not unsafe.
                name: "ptrdata1",
                c: `#include <stdlib.h>
-                    void f(void* p) {}`,
+                    void f26(void* p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; a [8*8]byte; u uintptr }`,
-               body:    `i := 0; p := &S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f(unsafe.Pointer(q))`,
+               support: `type S26 struct { p *int; a [8*8]byte; u uintptr }`,
+               body:    `i := 0; p := &S26{u:uintptr(unsafe.Pointer(&i))}; q := (*S26)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f26(unsafe.Pointer(q))`,
                fail:    false,
        },
        {
                // Like ptrdata1, but with a type that uses a GC program.
                name: "ptrdata2",
                c: `#include <stdlib.h>
-                    void f(void* p) {}`,
+                    void f27(void* p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
-               body:    `i := 0; p := S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f(unsafe.Pointer(q))`,
+               support: `type S27 struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
+               body:    `i := 0; p := S27{u:uintptr(unsafe.Pointer(&i))}; q := (*S27)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f27(unsafe.Pointer(q))`,
                fail:    false,
        },
        {
                // Check deferred pointers when they are used, not
                // when the defer statement is run.
-               name: "defer",
-               c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-               body: `p := &C.s{}; defer C.f(p); p.p = new(C.int)`,
+               name: "defer1",
+               c:    `typedef struct s28 { int *p; } s28; void f28(s28 *ps) {}`,
+               body: `p := &C.s28{}; defer C.f28(p); p.p = new(C.int)`,
                fail: true,
        },
        {
                // Check a pointer to a union if the union has any
                // pointer fields.
                name:    "union1",
-               c:       `typedef union { char **p; unsigned long i; } u; void f(u *pu) {}`,
+               c:       `typedef union { char **p; unsigned long i; } u29; void f29(u29 *pu) {}`,
                imports: []string{"unsafe"},
-               body:    `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+               body:    `var b C.char; p := &b; C.f29((*C.u29)(unsafe.Pointer(&p)))`,
                fail:    true,
        },
        {
@@ -336,55 +335,55 @@ var ptrTests = []ptrTest{
                // integer that happens to have the same
                // representation as a pointer.
                name:    "union2",
-               c:       `typedef union { unsigned long i; } u; void f(u *pu) {}`,
+               c:       `typedef union { unsigned long i; } u39; void f39(u39 *pu) {}`,
                imports: []string{"unsafe"},
-               body:    `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+               body:    `var b C.char; p := &b; C.f39((*C.u39)(unsafe.Pointer(&p)))`,
                fail:    false,
        },
        {
                // Test preemption while entering a cgo call. Issue #21306.
-               name:    "preempt-during-call",
-               c:       `void f() {}`,
+               name:    "preemptduringcall",
+               c:       `void f30() {}`,
                imports: []string{"runtime", "sync"},
-               body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
+               body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f30(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
                fail:    false,
        },
        {
                // Test poller deadline with cgocheck=2.  Issue #23435.
                name:    "deadline",
-               c:       `#define US 10`,
+               c:       `#define US31 10`,
                imports: []string{"os", "time"},
-               body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US * time.Microsecond))`,
+               body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US31 * time.Microsecond))`,
                fail:    false,
        },
        {
                // Test for double evaluation of channel receive.
-               name:    "chan-recv",
-               c:       `void f(char** p) {}`,
+               name:    "chanrecv",
+               c:       `void f32(char** p) {}`,
                imports: []string{"time"},
-               body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f(&(<-c)[0]);`,
+               body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f32(&(<-c)[0]);`,
                fail:    false,
        },
        {
                // Test that converting the address of a struct field
                // to unsafe.Pointer still just checks that field.
                // Issue #25941.
-               name:    "struct-field",
-               c:       `void f(void* p) {}`,
+               name:    "structfield",
+               c:       `void f33(void* p) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { p *int; a [8]byte; u uintptr }`,
-               body:    `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a))`,
+               support: `type S33 struct { p *int; a [8]byte; u uintptr }`,
+               body:    `s := &S33{p: new(int)}; C.f33(unsafe.Pointer(&s.a))`,
                fail:    false,
        },
        {
                // Test that converting multiple struct field
                // addresses to unsafe.Pointer still just checks those
                // fields. Issue #25941.
-               name:    "struct-field-2",
-               c:       `void f(void* p, int r, void* s) {}`,
+               name:    "structfield2",
+               c:       `void f34(void* p, int r, void* s) {}`,
                imports: []string{"unsafe"},
-               support: `type S struct { a [8]byte; p *int; b int64; }`,
-               body:    `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
+               support: `type S34 struct { a [8]byte; p *int; b int64; }`,
+               body:    `s := &S34{p: new(int)}; C.f34(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
                fail:    false,
        },
        {
@@ -392,18 +391,18 @@ var ptrTests = []ptrTest{
                // evaluated when a deferred function is deferred, not
                // when it is run.
                name:    "defer2",
-               c:       `void f(char **pc) {}`,
-               support: `type S1 struct { s []*C.char }; type S2 struct { ps *S1 }`,
-               body:    `p := &S2{&S1{[]*C.char{nil}}}; defer C.f(&p.ps.s[0]); p.ps = nil`,
+               c:       `void f35(char **pc) {}`,
+               support: `type S35a struct { s []*C.char }; type S35b struct { ps *S35a }`,
+               body:    `p := &S35b{&S35a{[]*C.char{nil}}}; defer C.f35(&p.ps.s[0]); p.ps = nil`,
                fail:    false,
        },
        {
                // Test that indexing into a function call still
                // examines only the slice being indexed.
                name:    "buffer",
-               c:       `void f(void *p) {}`,
+               c:       `void f36(void *p) {}`,
                imports: []string{"bytes", "unsafe"},
-               body:    `var b bytes.Buffer; b.WriteString("a"); C.f(unsafe.Pointer(&b.Bytes()[0]))`,
+               body:    `var b bytes.Buffer; b.WriteString("a"); C.f36(unsafe.Pointer(&b.Bytes()[0]))`,
                fail:    false,
        },
        {
@@ -411,8 +410,8 @@ var ptrTests = []ptrTest{
                name:    "finalizer",
                c:       `// Nothing to declare.`,
                imports: []string{"os"},
-               support: `func open() { os.Open(os.Args[0]) }; var G [][]byte`,
-               body:    `for i := 0; i < 10000; i++ { G = append(G, make([]byte, 4096)); if i % 100 == 0 { G = nil; open() } }`,
+               support: `func open37() { os.Open(os.Args[0]) }; var G37 [][]byte`,
+               body:    `for i := 0; i < 10000; i++ { G37 = append(G37, make([]byte, 4096)); if i % 100 == 0 { G37 = nil; open37() } }`,
                fail:    false,
        },
        {
@@ -420,98 +419,159 @@ var ptrTests = []ptrTest{
                name:    "structof",
                c:       `// Nothing to declare.`,
                imports: []string{"reflect"},
-               support: `type MyInt int; func (i MyInt) Get() int { return int(i) }; type Getter interface { Get() int }`,
-               body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt", Type: reflect.TypeOf(MyInt(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter).Get()`,
+               support: `type MyInt38 int; func (i MyInt38) Get() int { return int(i) }; type Getter38 interface { Get() int }`,
+               body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt38", Type: reflect.TypeOf(MyInt38(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter38).Get()`,
                fail:    false,
        },
 }
 
 func TestPointerChecks(t *testing.T) {
+       dir, exe := buildPtrTests(t)
+
+       // We (TestPointerChecks) return before the parallel subtest functions do,
+       // so we can't just defer os.RemoveAll(dir). Instead we have to wait for
+       // the parallel subtests to finish. This code looks racy but is not:
+       // the add +1 run in serial before testOne blocks. The -1 run in parallel
+       // after testOne finishes.
+       var pending int32
        for _, pt := range ptrTests {
                pt := pt
                t.Run(pt.name, func(t *testing.T) {
-                       testOne(t, pt)
+                       atomic.AddInt32(&pending, +1)
+                       defer func() {
+                               if atomic.AddInt32(&pending, -1) == 0 {
+                                       os.RemoveAll(dir)
+                               }
+                       }()
+                       testOne(t, pt, exe)
                })
        }
 }
 
-func testOne(t *testing.T, pt ptrTest) {
-       t.Parallel()
-
-       gopath, err := ioutil.TempDir("", filepath.Base(t.Name()))
-       if err != nil {
-               t.Fatal(err)
+func buildPtrTests(t *testing.T) (dir, exe string) {
+       var gopath string
+       if *tmp != "" {
+               gopath = *tmp
+               dir = ""
+       } else {
+               d, err := ioutil.TempDir("", filepath.Base(t.Name()))
+               if err != nil {
+                       t.Fatal(err)
+               }
+               dir = d
+               gopath = d
        }
-       defer os.RemoveAll(gopath)
 
-       src := filepath.Join(gopath, "src")
-       if err := os.Mkdir(src, 0777); err != nil {
+       src := filepath.Join(gopath, "src", "ptrtest")
+       if err := os.MkdirAll(src, 0777); err != nil {
                t.Fatal(err)
        }
 
-       name := filepath.Join(src, fmt.Sprintf("%s.go", filepath.Base(t.Name())))
-       f, err := os.Create(name)
-       if err != nil {
-               t.Fatal(err)
-       }
+       // Prepare two cgo inputs: one for standard cgo and one for //export cgo.
+       // (The latter cannot have C definitions, only declarations.)
+       var cgo1, cgo2 bytes.Buffer
+       fmt.Fprintf(&cgo1, "package main\n\n/*\n")
+       fmt.Fprintf(&cgo2, "package main\n\n/*\n")
 
-       b := bufio.NewWriter(f)
-       fmt.Fprintln(b, `package main`)
-       fmt.Fprintln(b)
-       fmt.Fprintln(b, `/*`)
-       fmt.Fprintln(b, pt.c)
-       fmt.Fprintln(b, `*/`)
-       fmt.Fprintln(b, `import "C"`)
-       fmt.Fprintln(b)
-       for _, imp := range pt.imports {
-               fmt.Fprintln(b, `import "`+imp+`"`)
-       }
-       if len(pt.imports) > 0 {
-               fmt.Fprintln(b)
-       }
-       if len(pt.support) > 0 {
-               fmt.Fprintln(b, pt.support)
-               fmt.Fprintln(b)
+       // C code
+       for _, pt := range ptrTests {
+               cgo := &cgo1
+               if strings.Contains(pt.support, "//export") {
+                       cgo = &cgo2
+               }
+               fmt.Fprintf(cgo, "%s\n", pt.c)
+               fmt.Fprintf(&cgo1, "%s\n", pt.c1)
        }
-       fmt.Fprintln(b, `func main() {`)
-       fmt.Fprintln(b, pt.body)
-       fmt.Fprintln(b, `}`)
+       fmt.Fprintf(&cgo1, "*/\nimport \"C\"\n\n")
+       fmt.Fprintf(&cgo2, "*/\nimport \"C\"\n\n")
 
-       if err := b.Flush(); err != nil {
-               t.Fatalf("flushing %s: %v", name, err)
-       }
-       if err := f.Close(); err != nil {
-               t.Fatalf("closing %s: %v", name, err)
+       // Imports
+       did1 := make(map[string]bool)
+       did2 := make(map[string]bool)
+       did1["os"] = true // for ptrTestMain
+       fmt.Fprintf(&cgo1, "import \"os\"\n")
+
+       for _, pt := range ptrTests {
+               did := did1
+               cgo := &cgo1
+               if strings.Contains(pt.support, "//export") {
+                       did = did2
+                       cgo = &cgo2
+               }
+               for _, imp := range pt.imports {
+                       if !did[imp] {
+                               did[imp] = true
+                               fmt.Fprintf(cgo, "import %q\n", imp)
+                       }
+               }
        }
 
-       for _, e := range pt.extra {
-               if err := ioutil.WriteFile(filepath.Join(src, e.name), []byte(e.contents), 0644); err != nil {
-                       t.Fatalf("writing %s: %v", e.name, err)
+       // Func support and bodies.
+       for _, pt := range ptrTests {
+               cgo := &cgo1
+               if strings.Contains(pt.support, "//export") {
+                       cgo = &cgo2
                }
+               fmt.Fprintf(cgo, "%s\nfunc %s() {\n%s\n}\n", pt.support, pt.name, pt.body)
        }
 
-       args := func(cmd *exec.Cmd) string {
-               return strings.Join(cmd.Args, " ")
+       // Func list and main dispatch.
+       fmt.Fprintf(&cgo1, "var funcs = map[string]func() {\n")
+       for _, pt := range ptrTests {
+               fmt.Fprintf(&cgo1, "\t%q: %s,\n", pt.name, pt.name)
        }
+       fmt.Fprintf(&cgo1, "}\n\n")
+       fmt.Fprintf(&cgo1, "%s\n", ptrTestMain)
 
-       cmd := exec.Command("go", "build")
+       if err := ioutil.WriteFile(filepath.Join(src, "cgo1.go"), cgo1.Bytes(), 0666); err != nil {
+               t.Fatal(err)
+       }
+       if err := ioutil.WriteFile(filepath.Join(src, "cgo2.go"), cgo2.Bytes(), 0666); err != nil {
+               t.Fatal(err)
+       }
+
+       cmd := exec.Command("go", "build", "-o", "ptrtest.exe")
        cmd.Dir = src
        cmd.Env = append(os.Environ(), "GOPATH="+gopath)
-       buf, err := cmd.CombinedOutput()
+       out, err := cmd.CombinedOutput()
        if err != nil {
-               t.Logf("%#q:\n%s", args(cmd), buf)
-               t.Fatalf("failed to build: %v", err)
+               t.Fatalf("go build: %v\n%s", err, out)
        }
 
-       exe := filepath.Join(src, filepath.Base(src))
-       cmd = exec.Command(exe)
-       cmd.Dir = src
+       return dir, filepath.Join(src, "ptrtest.exe")
+}
+
+const ptrTestMain = `
+func main() {
+       for _, arg := range os.Args[1:] {
+               f := funcs[arg]
+               if f == nil {
+                       panic("missing func "+arg)
+               }
+               f()
+       }
+}
+`
+
+var csem = make(chan bool, 16)
+
+func testOne(t *testing.T, pt ptrTest, exe string) {
+       t.Parallel()
+
+       // Run the tests in parallel, but don't run too many
+       // executions in parallel, to avoid overloading the system.
+       runcmd := func(cgocheck string) ([]byte, error) {
+               csem <- true
+               defer func() { <-csem }()
+               cmd := exec.Command(exe, pt.name)
+               cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
+               return cmd.CombinedOutput()
+       }
 
        if pt.expensive {
-               cmd.Env = cgocheckEnv("1")
-               buf, err := cmd.CombinedOutput()
+               buf, err := runcmd("1")
                if err != nil {
-                       t.Logf("%#q:\n%s", args(cmd), buf)
+                       t.Logf("%s", buf)
                        if pt.fail {
                                t.Fatalf("test marked expensive, but failed when not expensive: %v", err)
                        } else {
@@ -519,54 +579,43 @@ func testOne(t *testing.T, pt ptrTest) {
                        }
                }
 
-               cmd = exec.Command(exe)
-               cmd.Dir = src
        }
 
+       cgocheck := ""
        if pt.expensive {
-               cmd.Env = cgocheckEnv("2")
+               cgocheck = "2"
        }
 
-       buf, err = cmd.CombinedOutput()
+       buf, err := runcmd(cgocheck)
        if pt.fail {
                if err == nil {
-                       t.Logf("%#q:\n%s", args(cmd), buf)
+                       t.Logf("%s", buf)
                        t.Fatalf("did not fail as expected")
                } else if !bytes.Contains(buf, []byte("Go pointer")) {
-                       t.Logf("%#q:\n%s", args(cmd), buf)
+                       t.Logf("%s", buf)
                        t.Fatalf("did not print expected error (failed with %v)", err)
                }
        } else {
                if err != nil {
-                       t.Logf("%#q:\n%s", args(cmd), buf)
+                       t.Logf("%s", buf)
                        t.Fatalf("failed unexpectedly: %v", err)
                }
 
                if !pt.expensive {
                        // Make sure it passes with the expensive checks.
-                       cmd := exec.Command(exe)
-                       cmd.Dir = src
-                       cmd.Env = cgocheckEnv("2")
-                       buf, err := cmd.CombinedOutput()
+                       buf, err := runcmd("2")
                        if err != nil {
-                               t.Logf("%#q:\n%s", args(cmd), buf)
+                               t.Logf("%s", buf)
                                t.Fatalf("failed unexpectedly with expensive checks: %v", err)
                        }
                }
        }
 
        if pt.fail {
-               cmd = exec.Command(exe)
-               cmd.Dir = src
-               cmd.Env = cgocheckEnv("0")
-               buf, err := cmd.CombinedOutput()
+               buf, err := runcmd("0")
                if err != nil {
-                       t.Logf("%#q:\n%s", args(cmd), buf)
+                       t.Logf("%s", buf)
                        t.Fatalf("failed unexpectedly with GODEBUG=cgocheck=0: %v", err)
                }
        }
 }
-
-func cgocheckEnv(val string) []string {
-       return append(os.Environ(), "GODEBUG=cgocheck="+val)
-}
diff --git a/libgo/misc/cgo/errors/src/err1.go b/libgo/misc/cgo/errors/src/err1.go
deleted file mode 100644 (file)
index 2c232cf..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#cgo LDFLAGS: -L/nonexist
-
-void test() {
-       xxx;            // ERROR HERE
-}
-*/
-import "C"
-
-func main() {
-       C.test()
-}
diff --git a/libgo/misc/cgo/errors/src/err2.go b/libgo/misc/cgo/errors/src/err2.go
deleted file mode 100644 (file)
index 3ab410b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-func main() {
-       s := ""
-       _ = s
-       C.malloc(s) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/err3.go b/libgo/misc/cgo/errors/src/err3.go
deleted file mode 100644 (file)
index 609e1a0..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-typedef struct foo foo_t;
-typedef struct bar bar_t;
-
-foo_t *foop;
-*/
-import "C"
-
-func main() {
-       x := (*C.bar_t)(nil)
-       C.foop = x // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/err4.go b/libgo/misc/cgo/errors/src/err4.go
deleted file mode 100644 (file)
index 8e5f78e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-long double x = 0;
-*/
-import "C"
-
-func main() {
-       _ = C.x // ERROR HERE
-       _ = C.x
-}
diff --git a/libgo/misc/cgo/errors/src/issue11097a.go b/libgo/misc/cgo/errors/src/issue11097a.go
deleted file mode 100644 (file)
index 028d10c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-//enum test { foo, bar };
-*/
-import "C"
-
-func main() {
-       var a = C.enum_test(1) // ERROR HERE
-       _ = a
-}
diff --git a/libgo/misc/cgo/errors/src/issue11097b.go b/libgo/misc/cgo/errors/src/issue11097b.go
deleted file mode 100644 (file)
index b00f24f..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-//enum test { foo, bar };
-*/
-import "C"
-
-func main() {
-       p := new(C.enum_test) // ERROR HERE
-       _ = p
-}
diff --git a/libgo/misc/cgo/errors/src/issue13129.go b/libgo/misc/cgo/errors/src/issue13129.go
deleted file mode 100644 (file)
index 057bce4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// issue 13129: used to output error about C.unsignedshort with CC=clang
-
-package main
-
-import "C"
-
-func main() {
-       var x C.ushort
-       x = int(0) // ERROR HERE: C\.ushort
-}
diff --git a/libgo/misc/cgo/errors/src/issue13423.go b/libgo/misc/cgo/errors/src/issue13423.go
deleted file mode 100644 (file)
index fc19157..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// #include <stdio.h>
-import "C"
-
-func main() {
-       _ = C.fopen() // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue13467.go b/libgo/misc/cgo/errors/src/issue13467.go
deleted file mode 100644 (file)
index e061880..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-/*
-static int transform(int x) { return x; }
-*/
-import "C"
-
-func F() {
-       var x rune = '✈'
-       var _ rune = C.transform(x) // ERROR HERE: C\.int
-}
diff --git a/libgo/misc/cgo/errors/src/issue13635.go b/libgo/misc/cgo/errors/src/issue13635.go
deleted file mode 100644 (file)
index 3f38f5d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// issue 13635: used to output error about C.unsignedchar.
-// This test tests all such types.
-
-package pkg
-
-import "C"
-
-func main() {
-       var (
-               _ C.uchar         = "uc"  // ERROR HERE: C\.uchar
-               _ C.schar         = "sc"  // ERROR HERE: C\.schar
-               _ C.ushort        = "us"  // ERROR HERE: C\.ushort
-               _ C.uint          = "ui"  // ERROR HERE: C\.uint
-               _ C.ulong         = "ul"  // ERROR HERE: C\.ulong
-               _ C.longlong      = "ll"  // ERROR HERE: C\.longlong
-               _ C.ulonglong     = "ull" // ERROR HERE: C\.ulonglong
-               _ C.complexfloat  = "cf"  // ERROR HERE: C\.complexfloat
-               _ C.complexdouble = "cd"  // ERROR HERE: C\.complexdouble
-       )
-}
diff --git a/libgo/misc/cgo/errors/src/issue13830.go b/libgo/misc/cgo/errors/src/issue13830.go
deleted file mode 100644 (file)
index ac20c82..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
-// void** is Go *unsafe.Pointer. This test verifies that we detect the
-// problem at build time.
-
-package main
-
-// typedef void v;
-// void F(v** p) {}
-import "C"
-
-import "unsafe"
-
-type v [0]byte
-
-func f(p **v) {
-       C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
-}
-
-func main() {
-       var p *v
-       f(&p)
-}
diff --git a/libgo/misc/cgo/errors/src/issue14669.go b/libgo/misc/cgo/errors/src/issue14669.go
deleted file mode 100644 (file)
index 04d2bcb..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 14669: test that fails when build with CGO_CFLAGS selecting
-// optimization.
-
-package p
-
-/*
-const int E = 1;
-
-typedef struct s {
-       int       c;
-} s;
-*/
-import "C"
-
-func F() {
-       _ = C.s{
-               c: C.E,
-       }
-}
diff --git a/libgo/misc/cgo/errors/src/issue16116.go b/libgo/misc/cgo/errors/src/issue16116.go
deleted file mode 100644 (file)
index 1e01cab..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// void f(void *p, int x) {}
-import "C"
-
-func main() {
-       _ = C.f(1) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue16591.go b/libgo/misc/cgo/errors/src/issue16591.go
deleted file mode 100644 (file)
index 10eb840..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 16591: Test that we detect an invalid call that was being
-// hidden by a type conversion inserted by cgo checking.
-
-package p
-
-// void f(int** p) { }
-import "C"
-
-type x *C.int
-
-func F(p *x) {
-       C.f(p) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue18452.go b/libgo/misc/cgo/errors/src/issue18452.go
deleted file mode 100644 (file)
index 0386d76..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 18452: show pos info in undefined name errors
-
-package p
-
-import (
-       "C"
-       "fmt"
-)
-
-func a() {
-       fmt.Println("Hello, world!")
-       C.function_that_does_not_exist() // ERROR HERE
-       C.pi                             // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue18889.go b/libgo/misc/cgo/errors/src/issue18889.go
deleted file mode 100644 (file)
index bba6b8f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import "C"
-
-func main() {
-       _ = C.malloc // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue26745.go b/libgo/misc/cgo/errors/src/issue26745.go
deleted file mode 100644 (file)
index 0e22453..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// int a;
-// void CF(int i) {}
-import "C"
-
-func F1(i int) int {
-       return C.a + 1 // ERROR HERE: :13
-}
-
-func F2(i int) {
-       C.CF(i) // ERROR HERE: :6
-}
diff --git a/libgo/misc/cgo/errors/src/issue28069.go b/libgo/misc/cgo/errors/src/issue28069.go
deleted file mode 100644 (file)
index e19a3b4..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that the error message for an unrepresentable typedef in a
-// union appears on the right line. This test is only run if the size
-// of long double is larger than 64.
-
-package main
-
-/*
-typedef long double             Float128;
-
-typedef struct SV {
-    union {
-        Float128         float128;
-    } value;
-} SV;
-*/
-import "C"
-
-type ts struct {
-       tv *C.SV // ERROR HERE
-}
-
-func main() {}
diff --git a/libgo/misc/cgo/errors/src/issue28721.go b/libgo/misc/cgo/errors/src/issue28721.go
deleted file mode 100644 (file)
index 0eb2a92..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo should reject the use of mangled C names.
-
-package main
-
-/*
-typedef struct a {
-       int i;
-} a;
-void fn(void) {}
-*/
-import "C"
-
-type B _Ctype_struct_a // ERROR HERE
-
-var a _Ctype_struct_a // ERROR HERE
-
-type A struct {
-       a *_Ctype_struct_a // ERROR HERE
-}
-
-var notExist _Ctype_NotExist // ERROR HERE
-
-func main() {
-       _Cfunc_fn() // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue7757.go b/libgo/misc/cgo/errors/src/issue7757.go
deleted file mode 100644 (file)
index 0426e9f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-void foo() {}
-*/
-import "C"
-
-func main() {
-       C.foo = C.foo // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue8442.go b/libgo/misc/cgo/errors/src/issue8442.go
deleted file mode 100644 (file)
index 60477ad..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Issue 8442.  Cgo output unhelpful error messages for
-// invalid C preambles.
-
-/*
-void issue8442foo(UNDEF*); // ERROR HERE
-*/
-import "C"
-
-func main() {
-       C.issue8442foo(nil)
-}
diff --git a/libgo/misc/cgo/errors/src/long_double_size.go b/libgo/misc/cgo/errors/src/long_double_size.go
deleted file mode 100644 (file)
index 8b797f8..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-const int sizeofLongDouble = sizeof(long double);
-*/
-import "C"
-
-import "fmt"
-
-func main() {
-       fmt.Println(C.sizeofLongDouble)
-}
diff --git a/libgo/misc/cgo/errors/src/malloc.go b/libgo/misc/cgo/errors/src/malloc.go
deleted file mode 100644 (file)
index 65da020..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that C.malloc does not return nil.
-
-package main
-
-// #include <stdlib.h>
-import "C"
-
-import (
-       "fmt"
-       "runtime"
-)
-
-func main() {
-       var size C.size_t
-       size--
-
-       // The Dragonfly libc succeeds when asked to allocate
-       // 0xffffffffffffffff bytes, so pass a different value that
-       // causes it to fail.
-       if runtime.GOOS == "dragonfly" {
-               size = C.size_t(0x7fffffff << (32 * (^uintptr(0) >> 63)))
-       }
-
-       p := C.malloc(size)
-       if p == nil {
-               fmt.Println("malloc: C.malloc returned nil")
-               // Just exit normally--the test script expects this
-               // program to crash, so exiting normally indicates failure.
-       }
-}
diff --git a/libgo/misc/cgo/errors/testdata/err1.go b/libgo/misc/cgo/errors/testdata/err1.go
new file mode 100644 (file)
index 0000000..ced7443
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#cgo LDFLAGS: -L/nonexist
+
+void test() {
+       xxx;            // ERROR HERE
+}
+
+// Issue 8442.  Cgo output unhelpful error messages for
+// invalid C preambles.
+void issue8442foo(UNDEF*); // ERROR HERE
+*/
+import "C"
+
+func main() {
+       C.test()
+}
diff --git a/libgo/misc/cgo/errors/testdata/err2.go b/libgo/misc/cgo/errors/testdata/err2.go
new file mode 100644 (file)
index 0000000..1d22401
--- /dev/null
@@ -0,0 +1,102 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdio.h>
+
+typedef struct foo foo_t;
+typedef struct bar bar_t;
+
+foo_t *foop;
+
+long double x = 0;
+
+static int transform(int x) { return x; }
+
+typedef void v;
+void F(v** p) {}
+
+void fvi(void *p, int x) {}
+
+void fppi(int** p) {}
+
+int i;
+void fi(int i) {}
+*/
+import "C"
+import (
+       "unsafe"
+)
+
+func main() {
+       s := ""
+       _ = s
+       C.malloc(s) // ERROR HERE
+
+       x := (*C.bar_t)(nil)
+       C.foop = x // ERROR HERE
+
+       // issue 13129: used to output error about C.unsignedshort with CC=clang
+       var x C.ushort
+       x = int(0) // ERROR HERE: C\.ushort
+
+       // issue 13423
+       _ = C.fopen() // ERROR HERE
+
+       // issue 13467
+       var x rune = '✈'
+       var _ rune = C.transform(x) // ERROR HERE: C\.int
+
+       // issue 13635: used to output error about C.unsignedchar.
+       // This test tests all such types.
+       var (
+               _ C.uchar         = "uc"  // ERROR HERE: C\.uchar
+               _ C.schar         = "sc"  // ERROR HERE: C\.schar
+               _ C.ushort        = "us"  // ERROR HERE: C\.ushort
+               _ C.uint          = "ui"  // ERROR HERE: C\.uint
+               _ C.ulong         = "ul"  // ERROR HERE: C\.ulong
+               _ C.longlong      = "ll"  // ERROR HERE: C\.longlong
+               _ C.ulonglong     = "ull" // ERROR HERE: C\.ulonglong
+               _ C.complexfloat  = "cf"  // ERROR HERE: C\.complexfloat
+               _ C.complexdouble = "cd"  // ERROR HERE: C\.complexdouble
+       )
+
+       // issue 13830
+       // cgo converts C void* to Go unsafe.Pointer, so despite appearances C
+       // void** is Go *unsafe.Pointer. This test verifies that we detect the
+       // problem at build time.
+       {
+               type v [0]byte
+
+               f := func(p **v) {
+                       C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
+               }
+               var p *v
+               f(&p)
+       }
+
+       // issue 16116
+       _ = C.fvi(1) // ERROR HERE
+
+       // Issue 16591: Test that we detect an invalid call that was being
+       // hidden by a type conversion inserted by cgo checking.
+       {
+               type x *C.int
+               var p *x
+               C.fppi(p) // ERROR HERE
+       }
+
+       // issue 26745
+       _ = func(i int) int {
+               return C.i + 1 // ERROR HERE: :13
+       }
+       _ = func(i int) {
+               C.fi(i) // ERROR HERE: :6
+       }
+
+       C.fi = C.fi // ERROR HERE
+
+}
diff --git a/libgo/misc/cgo/errors/testdata/err4.go b/libgo/misc/cgo/errors/testdata/err4.go
new file mode 100644 (file)
index 0000000..8e5f78e
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+long double x = 0;
+*/
+import "C"
+
+func main() {
+       _ = C.x // ERROR HERE
+       _ = C.x
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue11097a.go b/libgo/misc/cgo/errors/testdata/issue11097a.go
new file mode 100644 (file)
index 0000000..028d10c
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+//enum test { foo, bar };
+*/
+import "C"
+
+func main() {
+       var a = C.enum_test(1) // ERROR HERE
+       _ = a
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue11097b.go b/libgo/misc/cgo/errors/testdata/issue11097b.go
new file mode 100644 (file)
index 0000000..b00f24f
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+//enum test { foo, bar };
+*/
+import "C"
+
+func main() {
+       p := new(C.enum_test) // ERROR HERE
+       _ = p
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue14669.go b/libgo/misc/cgo/errors/testdata/issue14669.go
new file mode 100644 (file)
index 0000000..04d2bcb
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 14669: test that fails when build with CGO_CFLAGS selecting
+// optimization.
+
+package p
+
+/*
+const int E = 1;
+
+typedef struct s {
+       int       c;
+} s;
+*/
+import "C"
+
+func F() {
+       _ = C.s{
+               c: C.E,
+       }
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue18452.go b/libgo/misc/cgo/errors/testdata/issue18452.go
new file mode 100644 (file)
index 0000000..0386d76
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 18452: show pos info in undefined name errors
+
+package p
+
+import (
+       "C"
+       "fmt"
+)
+
+func a() {
+       fmt.Println("Hello, world!")
+       C.function_that_does_not_exist() // ERROR HERE
+       C.pi                             // ERROR HERE
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue18889.go b/libgo/misc/cgo/errors/testdata/issue18889.go
new file mode 100644 (file)
index 0000000..bba6b8f
--- /dev/null
@@ -0,0 +1,7 @@
+package main
+
+import "C"
+
+func main() {
+       _ = C.malloc // ERROR HERE
+}
diff --git a/libgo/misc/cgo/errors/testdata/issue28069.go b/libgo/misc/cgo/errors/testdata/issue28069.go
new file mode 100644 (file)
index 0000000..e19a3b4
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that the error message for an unrepresentable typedef in a
+// union appears on the right line. This test is only run if the size
+// of long double is larger than 64.
+
+package main
+
+/*
+typedef long double             Float128;
+
+typedef struct SV {
+    union {
+        Float128         float128;
+    } value;
+} SV;
+*/
+import "C"
+
+type ts struct {
+       tv *C.SV // ERROR HERE
+}
+
+func main() {}
diff --git a/libgo/misc/cgo/errors/testdata/issue28721.go b/libgo/misc/cgo/errors/testdata/issue28721.go
new file mode 100644 (file)
index 0000000..0eb2a92
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// cgo should reject the use of mangled C names.
+
+package main
+
+/*
+typedef struct a {
+       int i;
+} a;
+void fn(void) {}
+*/
+import "C"
+
+type B _Ctype_struct_a // ERROR HERE
+
+var a _Ctype_struct_a // ERROR HERE
+
+type A struct {
+       a *_Ctype_struct_a // ERROR HERE
+}
+
+var notExist _Ctype_NotExist // ERROR HERE
+
+func main() {
+       _Cfunc_fn() // ERROR HERE
+}
diff --git a/libgo/misc/cgo/errors/testdata/long_double_size.go b/libgo/misc/cgo/errors/testdata/long_double_size.go
new file mode 100644 (file)
index 0000000..8b797f8
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+const int sizeofLongDouble = sizeof(long double);
+*/
+import "C"
+
+import "fmt"
+
+func main() {
+       fmt.Println(C.sizeofLongDouble)
+}
diff --git a/libgo/misc/cgo/errors/testdata/malloc.go b/libgo/misc/cgo/errors/testdata/malloc.go
new file mode 100644 (file)
index 0000000..65da020
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that C.malloc does not return nil.
+
+package main
+
+// #include <stdlib.h>
+import "C"
+
+import (
+       "fmt"
+       "runtime"
+)
+
+func main() {
+       var size C.size_t
+       size--
+
+       // The Dragonfly libc succeeds when asked to allocate
+       // 0xffffffffffffffff bytes, so pass a different value that
+       // causes it to fail.
+       if runtime.GOOS == "dragonfly" {
+               size = C.size_t(0x7fffffff << (32 * (^uintptr(0) >> 63)))
+       }
+
+       p := C.malloc(size)
+       if p == nil {
+               fmt.Println("malloc: C.malloc returned nil")
+               // Just exit normally--the test script expects this
+               // program to crash, so exiting normally indicates failure.
+       }
+}
index 1e0d59ea1c6a9f88bc3d59f3769e6ef8002164b6..9498da0208f87807d0505ba226926b22b682303a 100644 (file)
@@ -14,12 +14,17 @@ goos=$(go env GOOS)
 libext="so"
 if [ "$goos" = "darwin" ]; then
        libext="dylib"
+elif [ "$goos" = "aix" ]; then
+       libtext="a"
 fi
 
 case "$FC" in
 *gfortran*)
   libpath=$(dirname $($FC -print-file-name=libgfortran.$libext))
-  export CGO_LDFLAGS="$CGO_LDFLAGS -Wl,-rpath,$libpath -L $libpath"
+  if [ "$goos" != "aix" ]; then
+         RPATH_FLAG="-Wl,-rpath,$libpath"
+  fi
+  export CGO_LDFLAGS="$CGO_LDFLAGS $RPATH_FLAG -L $libpath"
   ;;
 esac
 
diff --git a/libgo/misc/cgo/life/c-life.c b/libgo/misc/cgo/life/c-life.c
deleted file mode 100644 (file)
index f853163..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <assert.h>
-#include "life.h"
-#include "_cgo_export.h"
-
-const int MYCONST = 0;
-
-// Do the actual manipulation of the life board in C.  This could be
-// done easily in Go, we are just using C for demonstration
-// purposes.
-void
-Step(int x, int y, int *a, int *n)
-{
-       struct GoStart_return r;
-
-       // Use Go to start 4 goroutines each of which handles 1/4 of the
-       // board.
-       r = GoStart(0, x, y, 0, x / 2, 0, y / 2, a, n);
-       assert(r.r0 == 0 && r.r1 == 100);       // test multiple returns
-       r = GoStart(1, x, y, x / 2, x, 0, y / 2, a, n);
-       assert(r.r0 == 1 && r.r1 == 101);       // test multiple returns
-       GoStart(2, x, y, 0, x / 2, y / 2, y, a, n);
-       GoStart(3, x, y, x / 2, x, y / 2, y, a, n);
-       GoWait(0);
-       GoWait(1);
-       GoWait(2);
-       GoWait(3);
-}
-
-// The actual computation.  This is called in parallel.
-void
-DoStep(int xdim, int ydim, int xstart, int xend, int ystart, int yend, int *a, int *n)
-{
-       int x, y, c, i, j;
-
-       for(x = xstart; x < xend; x++) {
-               for(y = ystart; y < yend; y++) {
-                       c = 0;
-                       for(i = -1; i <= 1; i++) {
-                               for(j = -1; j <= 1; j++) {
-                                 if(x+i >= 0 && x+i < xdim &&
-                                       y+j >= 0 && y+j < ydim &&
-                                       (i != 0 || j != 0))
-                                   c += a[(x+i)*xdim + (y+j)] != 0;
-                               }
-                       }
-                       if(c == 3 || (c == 2 && a[x*xdim + y] != 0))
-                               n[x*xdim + y] = 1;
-                       else
-                               n[x*xdim + y] = 0;
-               }
-       }
-}
diff --git a/libgo/misc/cgo/life/life.go b/libgo/misc/cgo/life/life.go
deleted file mode 100644 (file)
index 170a620..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// skip
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package life
-
-// #include "life.h"
-import "C"
-
-import "unsafe"
-
-func Run(gen, x, y int, a []int32) {
-       n := make([]int32, x*y)
-       for i := 0; i < gen; i++ {
-               C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
-               copy(a, n)
-       }
-}
-
-// Keep the channels visible from Go.
-var chans [4]chan bool
-
-//export GoStart
-// Double return value is just for testing.
-func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
-       c := make(chan bool, int(C.MYCONST))
-       go func() {
-               C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
-               c <- true
-       }()
-       chans[i] = c
-       return int(i), int(i + 100)
-}
-
-//export GoWait
-func GoWait(i C.int) {
-       <-chans[i]
-       chans[i] = nil
-}
diff --git a/libgo/misc/cgo/life/life.h b/libgo/misc/cgo/life/life.h
deleted file mode 100644 (file)
index 11d2b97..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-extern void Step(int, int, int *, int *);
-extern void DoStep(int, int, int, int, int, int, int *, int *);
-extern const int MYCONST;
diff --git a/libgo/misc/cgo/life/life_test.go b/libgo/misc/cgo/life/life_test.go
new file mode 100644 (file)
index 0000000..3c95d87
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package life_test
+
+import (
+       "bytes"
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "strings"
+       "testing"
+)
+
+func TestMain(m *testing.M) {
+       log.SetFlags(log.Lshortfile)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       GOPATH, err := ioutil.TempDir("", "cgolife")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+       os.Setenv("GOPATH", GOPATH)
+
+       // Copy testdata into GOPATH/src/cgolife, along with a go.mod file
+       // declaring the same path.
+       modRoot := filepath.Join(GOPATH, "src", "cgolife")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", modRoot)
+       if err := ioutil.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       return m.Run()
+}
+
+func TestTestRun(t *testing.T) {
+       if os.Getenv("GOOS") == "android" {
+               t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
+       }
+       out, err := exec.Command("go", "env", "GOROOT").Output()
+       if err != nil {
+               t.Fatal(err)
+       }
+       GOROOT := string(bytes.TrimSpace(out))
+
+       cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/life/main.go b/libgo/misc/cgo/life/main.go
deleted file mode 100644 (file)
index 145a273..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build test_run
-
-// Run the game of life in C using Go for parallelization.
-
-package main
-
-import (
-       "flag"
-       "fmt"
-
-       "."
-)
-
-const MAXDIM = 100
-
-var dim = flag.Int("dim", 16, "board dimensions")
-var gen = flag.Int("gen", 10, "generations")
-
-func main() {
-       flag.Parse()
-
-       var a [MAXDIM * MAXDIM]int32
-       for i := 2; i < *dim; i += 8 {
-               for j := 2; j < *dim-3; j += 8 {
-                       for y := 0; y < 3; y++ {
-                               a[i**dim+j+y] = 1
-                       }
-               }
-       }
-
-       life.Run(*gen, *dim, *dim, a[:])
-
-       for i := 0; i < *dim; i++ {
-               for j := 0; j < *dim; j++ {
-                       if a[i**dim+j] == 0 {
-                               fmt.Print(" ")
-                       } else {
-                               fmt.Print("X")
-                       }
-               }
-               fmt.Print("\n")
-       }
-}
diff --git a/libgo/misc/cgo/life/main.out b/libgo/misc/cgo/life/main.out
deleted file mode 100644 (file)
index 26fc9c6..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-                
-                
-  XXX     XXX   
-                
-                
-                
-                
-                
-                
-                
-  XXX     XXX   
-                
-                
-                
-                
-                
diff --git a/libgo/misc/cgo/life/overlaydir_test.go b/libgo/misc/cgo/life/overlaydir_test.go
new file mode 100644 (file)
index 0000000..f381ea6
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package life_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/life/testdata/c-life.c b/libgo/misc/cgo/life/testdata/c-life.c
new file mode 100644 (file)
index 0000000..f853163
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <assert.h>
+#include "life.h"
+#include "_cgo_export.h"
+
+const int MYCONST = 0;
+
+// Do the actual manipulation of the life board in C.  This could be
+// done easily in Go, we are just using C for demonstration
+// purposes.
+void
+Step(int x, int y, int *a, int *n)
+{
+       struct GoStart_return r;
+
+       // Use Go to start 4 goroutines each of which handles 1/4 of the
+       // board.
+       r = GoStart(0, x, y, 0, x / 2, 0, y / 2, a, n);
+       assert(r.r0 == 0 && r.r1 == 100);       // test multiple returns
+       r = GoStart(1, x, y, x / 2, x, 0, y / 2, a, n);
+       assert(r.r0 == 1 && r.r1 == 101);       // test multiple returns
+       GoStart(2, x, y, 0, x / 2, y / 2, y, a, n);
+       GoStart(3, x, y, x / 2, x, y / 2, y, a, n);
+       GoWait(0);
+       GoWait(1);
+       GoWait(2);
+       GoWait(3);
+}
+
+// The actual computation.  This is called in parallel.
+void
+DoStep(int xdim, int ydim, int xstart, int xend, int ystart, int yend, int *a, int *n)
+{
+       int x, y, c, i, j;
+
+       for(x = xstart; x < xend; x++) {
+               for(y = ystart; y < yend; y++) {
+                       c = 0;
+                       for(i = -1; i <= 1; i++) {
+                               for(j = -1; j <= 1; j++) {
+                                 if(x+i >= 0 && x+i < xdim &&
+                                       y+j >= 0 && y+j < ydim &&
+                                       (i != 0 || j != 0))
+                                   c += a[(x+i)*xdim + (y+j)] != 0;
+                               }
+                       }
+                       if(c == 3 || (c == 2 && a[x*xdim + y] != 0))
+                               n[x*xdim + y] = 1;
+                       else
+                               n[x*xdim + y] = 0;
+               }
+       }
+}
diff --git a/libgo/misc/cgo/life/testdata/life.go b/libgo/misc/cgo/life/testdata/life.go
new file mode 100644 (file)
index 0000000..2e0af81
--- /dev/null
@@ -0,0 +1,41 @@
+// skip
+
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgolife
+
+// #include "life.h"
+import "C"
+
+import "unsafe"
+
+func Run(gen, x, y int, a []int32) {
+       n := make([]int32, x*y)
+       for i := 0; i < gen; i++ {
+               C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
+               copy(a, n)
+       }
+}
+
+// Keep the channels visible from Go.
+var chans [4]chan bool
+
+//export GoStart
+// Double return value is just for testing.
+func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
+       c := make(chan bool, int(C.MYCONST))
+       go func() {
+               C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
+               c <- true
+       }()
+       chans[i] = c
+       return int(i), int(i + 100)
+}
+
+//export GoWait
+func GoWait(i C.int) {
+       <-chans[i]
+       chans[i] = nil
+}
diff --git a/libgo/misc/cgo/life/testdata/life.h b/libgo/misc/cgo/life/testdata/life.h
new file mode 100644 (file)
index 0000000..11d2b97
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+extern void Step(int, int, int *, int *);
+extern void DoStep(int, int, int, int, int, int, int *, int *);
+extern const int MYCONST;
diff --git a/libgo/misc/cgo/life/testdata/main.go b/libgo/misc/cgo/life/testdata/main.go
new file mode 100644 (file)
index 0000000..cc2ca7c
--- /dev/null
@@ -0,0 +1,49 @@
+// run -tags=use_go_run
+
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build test_run
+
+// Run the game of life in C using Go for parallelization.
+
+package main
+
+import (
+       "flag"
+       "fmt"
+
+       "cgolife"
+)
+
+const MAXDIM = 100
+
+var dim = flag.Int("dim", 16, "board dimensions")
+var gen = flag.Int("gen", 10, "generations")
+
+func main() {
+       flag.Parse()
+
+       var a [MAXDIM * MAXDIM]int32
+       for i := 2; i < *dim; i += 8 {
+               for j := 2; j < *dim-3; j += 8 {
+                       for y := 0; y < 3; y++ {
+                               a[i**dim+j+y] = 1
+                       }
+               }
+       }
+
+       cgolife.Run(*gen, *dim, *dim, a[:])
+
+       for i := 0; i < *dim; i++ {
+               for j := 0; j < *dim; j++ {
+                       if a[i**dim+j] == 0 {
+                               fmt.Print(" ")
+                       } else {
+                               fmt.Print("X")
+                       }
+               }
+               fmt.Print("\n")
+       }
+}
diff --git a/libgo/misc/cgo/life/testdata/main.out b/libgo/misc/cgo/life/testdata/main.out
new file mode 100644 (file)
index 0000000..26fc9c6
--- /dev/null
@@ -0,0 +1,16 @@
+                
+                
+  XXX     XXX   
+                
+                
+                
+                
+                
+                
+                
+  XXX     XXX   
+                
+                
+                
+                
+                
diff --git a/libgo/misc/cgo/stdio/chain.go b/libgo/misc/cgo/stdio/chain.go
deleted file mode 100644 (file)
index cdc3852..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build test_run
-
-// Pass numbers along a chain of threads.
-
-package main
-
-import (
-       "runtime"
-       "strconv"
-
-       "../stdio"
-)
-
-const N = 10
-const R = 5
-
-func link(left chan<- int, right <-chan int) {
-       // Keep the links in dedicated operating system
-       // threads, so that this program tests coordination
-       // between pthreads and not just goroutines.
-       runtime.LockOSThread()
-       for {
-               v := <-right
-               stdio.Stdout.WriteString(strconv.Itoa(v) + "\n")
-               left <- 1 + v
-       }
-}
-
-func main() {
-       leftmost := make(chan int)
-       var left chan int
-       right := leftmost
-       for i := 0; i < N; i++ {
-               left, right = right, make(chan int)
-               go link(left, right)
-       }
-       for i := 0; i < R; i++ {
-               right <- 0
-               x := <-leftmost
-               stdio.Stdout.WriteString(strconv.Itoa(x) + "\n")
-       }
-}
diff --git a/libgo/misc/cgo/stdio/chain.out b/libgo/misc/cgo/stdio/chain.out
deleted file mode 100644 (file)
index 963cf9b..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
diff --git a/libgo/misc/cgo/stdio/fib.go b/libgo/misc/cgo/stdio/fib.go
deleted file mode 100644 (file)
index 58f185c..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build test_run
-
-// Compute Fibonacci numbers with two goroutines
-// that pass integers back and forth.  No actual
-// concurrency, just threads and synchronization
-// and foreign code on multiple pthreads.
-
-package main
-
-import (
-       "runtime"
-       "strconv"
-
-       "../stdio"
-)
-
-func fibber(c, out chan int64, i int64) {
-       // Keep the fibbers in dedicated operating system
-       // threads, so that this program tests coordination
-       // between pthreads and not just goroutines.
-       runtime.LockOSThread()
-
-       if i == 0 {
-               c <- i
-       }
-       for {
-               j := <-c
-               stdio.Stdout.WriteString(strconv.FormatInt(j, 10) + "\n")
-               out <- j
-               <-out
-               i += j
-               c <- i
-       }
-}
-
-func main() {
-       c := make(chan int64)
-       out := make(chan int64)
-       go fibber(c, out, 0)
-       go fibber(c, out, 1)
-       <-out
-       for i := 0; i < 90; i++ {
-               out <- 1
-               <-out
-       }
-}
diff --git a/libgo/misc/cgo/stdio/fib.out b/libgo/misc/cgo/stdio/fib.out
deleted file mode 100644 (file)
index 17ff503..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-0
-1
-1
-2
-3
-5
-8
-13
-21
-34
-55
-89
-144
-233
-377
-610
-987
-1597
-2584
-4181
-6765
-10946
-17711
-28657
-46368
-75025
-121393
-196418
-317811
-514229
-832040
-1346269
-2178309
-3524578
-5702887
-9227465
-14930352
-24157817
-39088169
-63245986
-102334155
-165580141
-267914296
-433494437
-701408733
-1134903170
-1836311903
-2971215073
-4807526976
-7778742049
-12586269025
-20365011074
-32951280099
-53316291173
-86267571272
-139583862445
-225851433717
-365435296162
-591286729879
-956722026041
-1548008755920
-2504730781961
-4052739537881
-6557470319842
-10610209857723
-17167680177565
-27777890035288
-44945570212853
-72723460248141
-117669030460994
-190392490709135
-308061521170129
-498454011879264
-806515533049393
-1304969544928657
-2111485077978050
-3416454622906707
-5527939700884757
-8944394323791464
-14472334024676221
-23416728348467685
-37889062373143906
-61305790721611591
-99194853094755497
-160500643816367088
-259695496911122585
-420196140727489673
-679891637638612258
-1100087778366101931
-1779979416004714189
-2880067194370816120
diff --git a/libgo/misc/cgo/stdio/file.go b/libgo/misc/cgo/stdio/file.go
deleted file mode 100644 (file)
index a024f2c..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// skip
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-A trivial example of wrapping a C library in Go.
-For a more complex example and explanation,
-see ../gmp/gmp.go.
-*/
-
-package stdio
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-char* greeting = "hello, world";
-*/
-import "C"
-import "unsafe"
-
-type File C.FILE
-
-// Test reference to library symbol.
-// Stdout and stderr are too special to be a reliable test.
-//var  = C.environ
-
-func (f *File) WriteString(s string) {
-       p := C.CString(s)
-       C.fputs(p, (*C.FILE)(f))
-       C.free(unsafe.Pointer(p))
-       f.Flush()
-}
-
-func (f *File) Flush() {
-       C.fflush((*C.FILE)(f))
-}
-
-var Greeting = C.GoString(C.greeting)
-var Gbytes = C.GoBytes(unsafe.Pointer(C.greeting), C.int(len(Greeting)))
diff --git a/libgo/misc/cgo/stdio/hello.go b/libgo/misc/cgo/stdio/hello.go
deleted file mode 100644 (file)
index 56220d3..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build test_run
-
-package main
-
-import "../stdio"
-
-func main() {
-       stdio.Stdout.WriteString(stdio.Greeting + "\n")
-}
diff --git a/libgo/misc/cgo/stdio/hello.out b/libgo/misc/cgo/stdio/hello.out
deleted file mode 100644 (file)
index 4b5fa63..0000000
+++ /dev/null
@@ -1 +0,0 @@
-hello, world
diff --git a/libgo/misc/cgo/stdio/overlaydir_test.go b/libgo/misc/cgo/stdio/overlaydir_test.go
new file mode 100644 (file)
index 0000000..8a8dcdb
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package stdio_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/stdio/run.out b/libgo/misc/cgo/stdio/run.out
deleted file mode 100644 (file)
index c0e4965..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-* hello
-hello, world
-* fib
-0
-1
-1
-2
-3
-5
-8
-13
-21
-34
-55
-89
-144
-233
-377
-610
-987
-1597
-2584
-4181
-6765
-10946
-17711
-28657
-46368
-75025
-121393
-196418
-317811
-514229
-832040
-1346269
-2178309
-3524578
-5702887
-9227465
-14930352
-24157817
-39088169
-63245986
-102334155
-165580141
-267914296
-433494437
-701408733
-1134903170
-1836311903
-2971215073
-4807526976
-7778742049
-12586269025
-20365011074
-32951280099
-53316291173
-86267571272
-139583862445
-225851433717
-365435296162
-591286729879
-956722026041
-1548008755920
-2504730781961
-4052739537881
-6557470319842
-10610209857723
-17167680177565
-27777890035288
-44945570212853
-72723460248141
-117669030460994
-190392490709135
-308061521170129
-498454011879264
-806515533049393
-1304969544928657
-2111485077978050
-3416454622906707
-5527939700884757
-8944394323791464
-14472334024676221
-23416728348467685
-37889062373143906
-61305790721611591
-99194853094755497
-160500643816367088
-259695496911122585
-420196140727489673
-679891637638612258
-1100087778366101931
-1779979416004714189
-2880067194370816120
-* chain
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
diff --git a/libgo/misc/cgo/stdio/stdio.go b/libgo/misc/cgo/stdio/stdio.go
deleted file mode 100644 (file)
index d216e44..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// skip
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package stdio
-
-/*
-#include <stdio.h>
-
-// on mingw, stderr and stdout are defined as &_iob[FILENO]
-// on netbsd, they are defined as &__sF[FILENO]
-// and cgo doesn't recognize them, so write a function to get them,
-// instead of depending on internals of libc implementation.
-FILE *getStdout(void) { return stdout; }
-FILE *getStderr(void) { return stderr; }
-*/
-import "C"
-
-var Stdout = (*File)(C.getStdout())
-var Stderr = (*File)(C.getStderr())
diff --git a/libgo/misc/cgo/stdio/stdio_test.go b/libgo/misc/cgo/stdio/stdio_test.go
new file mode 100644 (file)
index 0000000..ab5d328
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package stdio_test
+
+import (
+       "bytes"
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "strings"
+       "testing"
+)
+
+func TestMain(m *testing.M) {
+       log.SetFlags(log.Lshortfile)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       GOPATH, err := ioutil.TempDir("", "cgostdio")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+       os.Setenv("GOPATH", GOPATH)
+
+       // Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
+       // declaring the same path.
+       modRoot := filepath.Join(GOPATH, "src", "cgostdio")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", modRoot)
+       if err := ioutil.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       return m.Run()
+}
+
+func TestTestRun(t *testing.T) {
+       if os.Getenv("GOOS") == "android" {
+               t.Skip("subpackage stdio is not available on android")
+       }
+       out, err := exec.Command("go", "env", "GOROOT").Output()
+       if err != nil {
+               t.Fatal(err)
+       }
+       GOROOT := string(bytes.TrimSpace(out))
+
+       cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/stdio/testdata/chain.go b/libgo/misc/cgo/stdio/testdata/chain.go
new file mode 100644 (file)
index 0000000..6c3f406
--- /dev/null
@@ -0,0 +1,48 @@
+// run -tags=use_go_run
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build test_run
+
+// Pass numbers along a chain of threads.
+
+package main
+
+import (
+       "runtime"
+       "strconv"
+
+       "cgostdio/stdio"
+)
+
+const N = 10
+const R = 5
+
+func link(left chan<- int, right <-chan int) {
+       // Keep the links in dedicated operating system
+       // threads, so that this program tests coordination
+       // between pthreads and not just goroutines.
+       runtime.LockOSThread()
+       for {
+               v := <-right
+               stdio.Stdout.WriteString(strconv.Itoa(v) + "\n")
+               left <- 1 + v
+       }
+}
+
+func main() {
+       leftmost := make(chan int)
+       var left chan int
+       right := leftmost
+       for i := 0; i < N; i++ {
+               left, right = right, make(chan int)
+               go link(left, right)
+       }
+       for i := 0; i < R; i++ {
+               right <- 0
+               x := <-leftmost
+               stdio.Stdout.WriteString(strconv.Itoa(x) + "\n")
+       }
+}
diff --git a/libgo/misc/cgo/stdio/testdata/chain.out b/libgo/misc/cgo/stdio/testdata/chain.out
new file mode 100644 (file)
index 0000000..963cf9b
--- /dev/null
@@ -0,0 +1,55 @@
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/libgo/misc/cgo/stdio/testdata/fib.go b/libgo/misc/cgo/stdio/testdata/fib.go
new file mode 100644 (file)
index 0000000..49cb0ea
--- /dev/null
@@ -0,0 +1,52 @@
+// run -tags=use_go_run
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build test_run
+
+// Compute Fibonacci numbers with two goroutines
+// that pass integers back and forth.  No actual
+// concurrency, just threads and synchronization
+// and foreign code on multiple pthreads.
+
+package main
+
+import (
+       "runtime"
+       "strconv"
+
+       "cgostdio/stdio"
+)
+
+func fibber(c, out chan int64, i int64) {
+       // Keep the fibbers in dedicated operating system
+       // threads, so that this program tests coordination
+       // between pthreads and not just goroutines.
+       runtime.LockOSThread()
+
+       if i == 0 {
+               c <- i
+       }
+       for {
+               j := <-c
+               stdio.Stdout.WriteString(strconv.FormatInt(j, 10) + "\n")
+               out <- j
+               <-out
+               i += j
+               c <- i
+       }
+}
+
+func main() {
+       c := make(chan int64)
+       out := make(chan int64)
+       go fibber(c, out, 0)
+       go fibber(c, out, 1)
+       <-out
+       for i := 0; i < 90; i++ {
+               out <- 1
+               <-out
+       }
+}
diff --git a/libgo/misc/cgo/stdio/testdata/fib.out b/libgo/misc/cgo/stdio/testdata/fib.out
new file mode 100644 (file)
index 0000000..17ff503
--- /dev/null
@@ -0,0 +1,91 @@
+0
+1
+1
+2
+3
+5
+8
+13
+21
+34
+55
+89
+144
+233
+377
+610
+987
+1597
+2584
+4181
+6765
+10946
+17711
+28657
+46368
+75025
+121393
+196418
+317811
+514229
+832040
+1346269
+2178309
+3524578
+5702887
+9227465
+14930352
+24157817
+39088169
+63245986
+102334155
+165580141
+267914296
+433494437
+701408733
+1134903170
+1836311903
+2971215073
+4807526976
+7778742049
+12586269025
+20365011074
+32951280099
+53316291173
+86267571272
+139583862445
+225851433717
+365435296162
+591286729879
+956722026041
+1548008755920
+2504730781961
+4052739537881
+6557470319842
+10610209857723
+17167680177565
+27777890035288
+44945570212853
+72723460248141
+117669030460994
+190392490709135
+308061521170129
+498454011879264
+806515533049393
+1304969544928657
+2111485077978050
+3416454622906707
+5527939700884757
+8944394323791464
+14472334024676221
+23416728348467685
+37889062373143906
+61305790721611591
+99194853094755497
+160500643816367088
+259695496911122585
+420196140727489673
+679891637638612258
+1100087778366101931
+1779979416004714189
+2880067194370816120
diff --git a/libgo/misc/cgo/stdio/testdata/hello.go b/libgo/misc/cgo/stdio/testdata/hello.go
new file mode 100644 (file)
index 0000000..046bfee
--- /dev/null
@@ -0,0 +1,15 @@
+// run -tags=use_go_run
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build test_run
+
+package main
+
+import "cgostdio/stdio"
+
+func main() {
+       stdio.Stdout.WriteString(stdio.Greeting + "\n")
+}
diff --git a/libgo/misc/cgo/stdio/testdata/hello.out b/libgo/misc/cgo/stdio/testdata/hello.out
new file mode 100644 (file)
index 0000000..4b5fa63
--- /dev/null
@@ -0,0 +1 @@
+hello, world
diff --git a/libgo/misc/cgo/stdio/testdata/run.out b/libgo/misc/cgo/stdio/testdata/run.out
new file mode 100644 (file)
index 0000000..c0e4965
--- /dev/null
@@ -0,0 +1,150 @@
+* hello
+hello, world
+* fib
+0
+1
+1
+2
+3
+5
+8
+13
+21
+34
+55
+89
+144
+233
+377
+610
+987
+1597
+2584
+4181
+6765
+10946
+17711
+28657
+46368
+75025
+121393
+196418
+317811
+514229
+832040
+1346269
+2178309
+3524578
+5702887
+9227465
+14930352
+24157817
+39088169
+63245986
+102334155
+165580141
+267914296
+433494437
+701408733
+1134903170
+1836311903
+2971215073
+4807526976
+7778742049
+12586269025
+20365011074
+32951280099
+53316291173
+86267571272
+139583862445
+225851433717
+365435296162
+591286729879
+956722026041
+1548008755920
+2504730781961
+4052739537881
+6557470319842
+10610209857723
+17167680177565
+27777890035288
+44945570212853
+72723460248141
+117669030460994
+190392490709135
+308061521170129
+498454011879264
+806515533049393
+1304969544928657
+2111485077978050
+3416454622906707
+5527939700884757
+8944394323791464
+14472334024676221
+23416728348467685
+37889062373143906
+61305790721611591
+99194853094755497
+160500643816367088
+259695496911122585
+420196140727489673
+679891637638612258
+1100087778366101931
+1779979416004714189
+2880067194370816120
+* chain
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/libgo/misc/cgo/stdio/testdata/stdio/file.go b/libgo/misc/cgo/stdio/testdata/stdio/file.go
new file mode 100644 (file)
index 0000000..a024f2c
--- /dev/null
@@ -0,0 +1,44 @@
+// skip
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+A trivial example of wrapping a C library in Go.
+For a more complex example and explanation,
+see ../gmp/gmp.go.
+*/
+
+package stdio
+
+/*
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+char* greeting = "hello, world";
+*/
+import "C"
+import "unsafe"
+
+type File C.FILE
+
+// Test reference to library symbol.
+// Stdout and stderr are too special to be a reliable test.
+//var  = C.environ
+
+func (f *File) WriteString(s string) {
+       p := C.CString(s)
+       C.fputs(p, (*C.FILE)(f))
+       C.free(unsafe.Pointer(p))
+       f.Flush()
+}
+
+func (f *File) Flush() {
+       C.fflush((*C.FILE)(f))
+}
+
+var Greeting = C.GoString(C.greeting)
+var Gbytes = C.GoBytes(unsafe.Pointer(C.greeting), C.int(len(Greeting)))
diff --git a/libgo/misc/cgo/stdio/testdata/stdio/stdio.go b/libgo/misc/cgo/stdio/testdata/stdio/stdio.go
new file mode 100644 (file)
index 0000000..d216e44
--- /dev/null
@@ -0,0 +1,22 @@
+// skip
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package stdio
+
+/*
+#include <stdio.h>
+
+// on mingw, stderr and stdout are defined as &_iob[FILENO]
+// on netbsd, they are defined as &__sF[FILENO]
+// and cgo doesn't recognize them, so write a function to get them,
+// instead of depending on internals of libc implementation.
+FILE *getStdout(void) { return stdout; }
+FILE *getStderr(void) { return stderr; }
+*/
+import "C"
+
+var Stdout = (*File)(C.getStdout())
+var Stderr = (*File)(C.getStderr())
diff --git a/libgo/misc/cgo/test/align.go b/libgo/misc/cgo/test/align.go
deleted file mode 100644 (file)
index a23b44f..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdio.h>
-
-typedef unsigned char Uint8;
-typedef unsigned short Uint16;
-
-typedef enum {
- MOD1 = 0x0000,
- MODX = 0x8000
-} SDLMod;
-
-typedef enum {
- A = 1,
- B = 322,
- SDLK_LAST
-} SDLKey;
-
-typedef struct SDL_keysym {
-       Uint8 scancode;
-       SDLKey sym;
-       SDLMod mod;
-       Uint16 unicode;
-} SDL_keysym;
-
-typedef struct SDL_KeyboardEvent {
-       Uint8 typ;
-       Uint8 which;
-       Uint8 state;
-       SDL_keysym keysym;
-} SDL_KeyboardEvent;
-
-void makeEvent(SDL_KeyboardEvent *event) {
- unsigned char *p;
- int i;
-
- p = (unsigned char*)event;
- for (i=0; i<sizeof *event; i++) {
-   p[i] = i;
- }
-}
-
-int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
-  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
-}
-
-void cTest(SDL_KeyboardEvent *event) {
- printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
-   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
- fflush(stdout);
-}
-
-*/
-import "C"
-
-import (
-       "testing"
-)
-
-func testAlign(t *testing.T) {
-       var evt C.SDL_KeyboardEvent
-       C.makeEvent(&evt)
-       if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
-               t.Error("*** bad alignment")
-               C.cTest(&evt)
-               t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
-                       evt.typ, evt.which, evt.state, evt.keysym.scancode,
-                       evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
-               t.Error(evt)
-       }
-}
diff --git a/libgo/misc/cgo/test/api.go b/libgo/misc/cgo/test/api.go
deleted file mode 100644 (file)
index d2b09cb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// API Compatibility Checks for cgo
-
-package cgotest
-
-// #include <stdlib.h>
-//
-// // Test for issue 17723.
-// typedef char *cstring_pointer;
-// static void cstring_pointer_fun(cstring_pointer dummy) { }
-//
-// const char *api_hello = "hello!";
-import "C"
-import "unsafe"
-
-func testAPI() {
-       var cs *C.char
-       cs = C.CString("hello")
-       defer C.free(unsafe.Pointer(cs))
-       var s string
-       s = C.GoString((*C.char)(C.api_hello))
-       s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
-       var b []byte
-       b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
-       _, _ = s, b
-       C.cstring_pointer_fun(nil)
-}
diff --git a/libgo/misc/cgo/test/basic.go b/libgo/misc/cgo/test/basic.go
deleted file mode 100644 (file)
index 2655a66..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Basic test cases for cgo.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define SHIFT(x, y)  ((x)<<(y))
-#define KILO SHIFT(1, 10)
-#define UINT32VAL 0xc008427bU
-
-enum E {
-       Enum1 = 1,
-       Enum2 = 2,
-};
-
-typedef unsigned char cgo_uuid_t[20];
-
-void uuid_generate(cgo_uuid_t x) {
-       x[0] = 0;
-}
-
-struct S {
-       int x;
-};
-
-const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
-
-enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
-
-// issue 1222
-typedef union {
-       long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
-       union {
-               int x;
-       } element;
-};
-
-struct ibv_context {
-       xxpthread_mutex_t mutex;
-};
-
-int add(int x, int y) {
-       return x+y;
-};
-*/
-import "C"
-import (
-       "runtime"
-       "syscall"
-       "testing"
-       "unsafe"
-)
-
-const EINVAL = C.EINVAL /* test #define */
-
-var KILO = C.KILO
-
-func uuidgen() {
-       var uuid C.cgo_uuid_t
-       C.uuid_generate(&uuid[0])
-}
-
-func Strtol(s string, base int) (int, error) {
-       p := C.CString(s)
-       n, err := C.strtol(p, nil, C.int(base))
-       C.free(unsafe.Pointer(p))
-       return int(n), err
-}
-
-func Atol(s string) int {
-       p := C.CString(s)
-       n := C.atol(p)
-       C.free(unsafe.Pointer(p))
-       return int(n)
-}
-
-func testConst(t *testing.T) {
-       C.myConstFunc(nil, 0, nil)
-}
-
-func testEnum(t *testing.T) {
-       if C.Enum1 != 1 || C.Enum2 != 2 {
-               t.Error("bad enum", C.Enum1, C.Enum2)
-       }
-}
-
-func testAtol(t *testing.T) {
-       l := Atol("123")
-       if l != 123 {
-               t.Error("Atol 123: ", l)
-       }
-}
-
-func testErrno(t *testing.T) {
-       p := C.CString("no-such-file")
-       m := C.CString("r")
-       f, err := C.fopen(p, m)
-       C.free(unsafe.Pointer(p))
-       C.free(unsafe.Pointer(m))
-       if err == nil {
-               C.fclose(f)
-               t.Fatalf("C.fopen: should fail")
-       }
-       if err != syscall.ENOENT {
-               t.Fatalf("C.fopen: unexpected error: %v", err)
-       }
-}
-
-func testMultipleAssign(t *testing.T) {
-       p := C.CString("234")
-       n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
-       if runtime.GOOS == "openbsd" {
-               // Bug in OpenBSD strtol(3) - base > 36 succeeds.
-               if (n != 0 && n != 239089) || m != 234 {
-                       t.Fatal("Strtol x2: ", n, m)
-               }
-       } else if n != 0 || m != 234 {
-               t.Fatal("Strtol x2: ", n, m)
-       }
-       C.free(unsafe.Pointer(p))
-}
-
-var (
-       cuint  = (C.uint)(0)
-       culong C.ulong
-       cchar  C.char
-)
-
-type Context struct {
-       ctx *C.struct_ibv_context
-}
-
-func benchCgoCall(b *testing.B) {
-       const x = C.int(2)
-       const y = C.int(3)
-       for i := 0; i < b.N; i++ {
-               C.add(x, y)
-       }
-}
-
-var sinkString string
-
-func benchGoString(b *testing.B) {
-       for i := 0; i < b.N; i++ {
-               sinkString = C.GoString(C.cstr)
-       }
-       const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
-       if sinkString != want {
-               b.Fatalf("%q != %q", sinkString, want)
-       }
-}
-
-// Issue 2470.
-func testUnsignedInt(t *testing.T) {
-       a := (int64)(C.UINT32VAL)
-       b := (int64)(0xc008427b)
-       if a != b {
-               t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
-       }
-}
-
-// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
-func sliceOperands(array [2000]int) {
-       _ = array[C.KILO:C.KILO:C.KILO] // no type error
-}
-
-// set in cgo_thread_lock.go init
-var testThreadLockFunc = func(*testing.T) {}
index 4fc6b39ffa6272fc1ed1e3a78b2a983c1ed18e6d..e749650293148ac715354c850f7c1371f17302c8 100644 (file)
@@ -199,7 +199,7 @@ func testCallbackCallers(t *testing.T) {
                t.Errorf("expected %d frames, got %d", len(name), n)
        }
        for i := 0; i < n; i++ {
-               f := runtime.FuncForPC(pc[i])
+               f := runtime.FuncForPC(pc[i] - 1) // TODO: use runtime.CallersFrames
                if f == nil {
                        t.Fatalf("expected non-nil Func for pc %d", pc[i])
                }
@@ -209,6 +209,10 @@ func testCallbackCallers(t *testing.T) {
                if strings.HasPrefix(fname, "_") {
                        fname = path.Base(f.Name()[1:])
                }
+               // In module mode, this package has a fully-qualified import path.
+               // Remove it if present.
+               fname = strings.TrimPrefix(fname, "misc/cgo/")
+
                namei := ""
                if i < len(name) {
                        namei = name[i]
diff --git a/libgo/misc/cgo/test/cflags.go b/libgo/misc/cgo/test/cflags.go
deleted file mode 100644 (file)
index bc290bf..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that the #cgo CFLAGS directive works,
-// with and without platform filters.
-// See https://golang.org/issue/5224 for details.
-package cgotest
-
-/*
-#cgo CFLAGS: -DCOMMON_VALUE=123
-#cgo windows CFLAGS: -DIS_WINDOWS=1
-#cgo !windows CFLAGS: -DIS_WINDOWS=0
-int common = COMMON_VALUE;
-int is_windows = IS_WINDOWS;
-*/
-import "C"
-
-import (
-       "runtime"
-       "testing"
-)
-
-func testCflags(t *testing.T) {
-       is_windows := C.is_windows == 1
-       if is_windows != (runtime.GOOS == "windows") {
-               t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
-       }
-       if C.common != 123 {
-               t.Errorf("common: %v (expected 123)", C.common)
-       }
-}
index 9c15f69e4015733c8ca95992196092f50368d0cd..7b56e11a27df3b7d9717c1849d09565706c9d61a 100644 (file)
@@ -4,9 +4,16 @@
 
 package cgotest
 
-import "testing"
+import (
+       "runtime"
+       "testing"
+)
 
-func TestSetgid(t *testing.T)  { testSetgid(t) }
+func TestSetgid(t *testing.T) {
+       if runtime.GOOS == "android" {
+               t.Skip("unsupported on Android")
+       }
+       testSetgid(t)
+}
 func Test6997(t *testing.T)    { test6997(t) }
 func TestBuildID(t *testing.T) { testBuildID(t) }
-func Test9400(t *testing.T)    { test9400(t) }
index 710e094cf77c1d942b9d3986cdea3a13c512b0ed..a1c2482ab8def9123c0138cfe0eb07492c6afc66 100644 (file)
@@ -8,6 +8,5 @@ import "testing"
 
 // Stubs for tests that fails to build on Android
 func test6997(t *testing.T)        {}
-func test3775(t *testing.T)        {}
 func test8694(t *testing.T)        {}
 func testSigaltstack(t *testing.T) {}
index 2cb93d9c2eb283555bbe486a65d177e021e9e0c0..c66df2cd46120772828cb709d801a80959d8387d 100644 (file)
@@ -10,91 +10,86 @@ import "testing"
 // so that they can use cgo (import "C").
 // These wrappers are here for gotest to find.
 
-func TestAlign(t *testing.T)                 { testAlign(t) }
-func TestConst(t *testing.T)                 { testConst(t) }
-func TestEnum(t *testing.T)                  { testEnum(t) }
-func TestAtol(t *testing.T)                  { testAtol(t) }
-func TestErrno(t *testing.T)                 { testErrno(t) }
-func TestMultipleAssign(t *testing.T)        { testMultipleAssign(t) }
-func TestUnsignedInt(t *testing.T)           { testUnsignedInt(t) }
-func TestCallback(t *testing.T)              { testCallback(t) }
-func TestCallbackGC(t *testing.T)            { testCallbackGC(t) }
-func TestCallbackPanic(t *testing.T)         { testCallbackPanic(t) }
-func TestCallbackPanicLoop(t *testing.T)     { testCallbackPanicLoop(t) }
-func TestCallbackPanicLocked(t *testing.T)   { testCallbackPanicLocked(t) }
-func TestPanicFromC(t *testing.T)            { testPanicFromC(t) }
-func TestZeroArgCallback(t *testing.T)       { testZeroArgCallback(t) }
-func TestBlocking(t *testing.T)              { testBlocking(t) }
 func Test1328(t *testing.T)                  { test1328(t) }
-func TestParallelSleep(t *testing.T)         { testParallelSleep(t) }
-func TestSetEnv(t *testing.T)                { testSetEnv(t) }
-func TestHelpers(t *testing.T)               { testHelpers(t) }
-func TestLibgcc(t *testing.T)                { testLibgcc(t) }
 func Test1635(t *testing.T)                  { test1635(t) }
-func TestPrintf(t *testing.T)                { testPrintf(t) }
-func Test4029(t *testing.T)                  { test4029(t) }
-func TestBoolAlign(t *testing.T)             { testBoolAlign(t) }
+func Test3250(t *testing.T)                  { test3250(t) }
 func Test3729(t *testing.T)                  { test3729(t) }
 func Test3775(t *testing.T)                  { test3775(t) }
-func TestCthread(t *testing.T)               { testCthread(t) }
-func TestCallbackCallers(t *testing.T)       { testCallbackCallers(t) }
+func Test4029(t *testing.T)                  { test4029(t) }
+func Test4339(t *testing.T)                  { test4339(t) }
 func Test5227(t *testing.T)                  { test5227(t) }
-func TestCflags(t *testing.T)                { testCflags(t) }
+func Test5242(t *testing.T)                  { test5242(t) }
 func Test5337(t *testing.T)                  { test5337(t) }
 func Test5548(t *testing.T)                  { test5548(t) }
 func Test5603(t *testing.T)                  { test5603(t) }
-func Test6833(t *testing.T)                  { test6833(t) }
-func Test3250(t *testing.T)                  { test3250(t) }
-func TestCallbackStack(t *testing.T)         { testCallbackStack(t) }
-func TestFpVar(t *testing.T)                 { testFpVar(t) }
-func Test4339(t *testing.T)                  { test4339(t) }
-func Test6390(t *testing.T)                  { test6390(t) }
 func Test5986(t *testing.T)                  { test5986(t) }
-func Test7665(t *testing.T)                  { test7665(t) }
-func TestNaming(t *testing.T)                { testNaming(t) }
+func Test6390(t *testing.T)                  { test6390(t) }
+func Test6833(t *testing.T)                  { test6833(t) }
+func Test6907(t *testing.T)                  { test6907(t) }
+func Test6907Go(t *testing.T)                { test6907Go(t) }
 func Test7560(t *testing.T)                  { test7560(t) }
-func Test5242(t *testing.T)                  { test5242(t) }
-func Test8092(t *testing.T)                  { test8092(t) }
+func Test7665(t *testing.T)                  { test7665(t) }
 func Test7978(t *testing.T)                  { test7978(t) }
-func Test8694(t *testing.T)                  { test8694(t) }
+func Test8092(t *testing.T)                  { test8092(t) }
 func Test8517(t *testing.T)                  { test8517(t) }
+func Test8694(t *testing.T)                  { test8694(t) }
 func Test8811(t *testing.T)                  { test8811(t) }
-func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
-func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
-func Test9026(t *testing.T)                  { test9026(t) }
-func Test9510(t *testing.T)                  { test9510(t) }
 func Test9557(t *testing.T)                  { test9557(t) }
 func Test10303(t *testing.T)                 { test10303(t, 10) }
 func Test11925(t *testing.T)                 { test11925(t) }
 func Test12030(t *testing.T)                 { test12030(t) }
-func TestGCC68255(t *testing.T)              { testGCC68255(t) }
-func TestCallGoWithString(t *testing.T)      { testCallGoWithString(t) }
 func Test14838(t *testing.T)                 { test14838(t) }
-func Test8756(t *testing.T)                  { test8756(t) }
 func Test17065(t *testing.T)                 { test17065(t) }
-func TestThreadLock(t *testing.T)            { testThreadLockFunc(t) }
-func TestCheckConst(t *testing.T)            { testCheckConst(t) }
 func Test17537(t *testing.T)                 { test17537(t) }
 func Test18126(t *testing.T)                 { test18126(t) }
-func Test20369(t *testing.T)                 { test20369(t) }
 func Test18720(t *testing.T)                 { test18720(t) }
-func Test20266(t *testing.T)                 { test20266(t) }
 func Test20129(t *testing.T)                 { test20129(t) }
+func Test20369(t *testing.T)                 { test20369(t) }
 func Test20910(t *testing.T)                 { test20910(t) }
 func Test21708(t *testing.T)                 { test21708(t) }
 func Test21809(t *testing.T)                 { test21809(t) }
-func Test6907(t *testing.T)                  { test6907(t) }
-func Test6907Go(t *testing.T)                { test6907Go(t) }
 func Test21897(t *testing.T)                 { test21897(t) }
 func Test22906(t *testing.T)                 { test22906(t) }
+func Test23356(t *testing.T)                 { test23356(t) }
 func Test24206(t *testing.T)                 { test24206(t) }
 func Test25143(t *testing.T)                 { test25143(t) }
-func Test23356(t *testing.T)                 { test23356(t) }
 func Test26066(t *testing.T)                 { test26066(t) }
-func Test26213(t *testing.T)                 { test26213(t) }
 func Test27660(t *testing.T)                 { test27660(t) }
 func Test28896(t *testing.T)                 { test28896(t) }
 func Test30065(t *testing.T)                 { test30065(t) }
+func Test32579(t *testing.T)                 { test32579(t) }
+func TestAlign(t *testing.T)                 { testAlign(t) }
+func TestAtol(t *testing.T)                  { testAtol(t) }
+func TestBlocking(t *testing.T)              { testBlocking(t) }
+func TestBoolAlign(t *testing.T)             { testBoolAlign(t) }
+func TestCallGoWithString(t *testing.T)      { testCallGoWithString(t) }
+func TestCallback(t *testing.T)              { testCallback(t) }
+func TestCallbackCallers(t *testing.T)       { testCallbackCallers(t) }
+func TestCallbackGC(t *testing.T)            { testCallbackGC(t) }
+func TestCallbackPanic(t *testing.T)         { testCallbackPanic(t) }
+func TestCallbackPanicLocked(t *testing.T)   { testCallbackPanicLocked(t) }
+func TestCallbackPanicLoop(t *testing.T)     { testCallbackPanicLoop(t) }
+func TestCallbackStack(t *testing.T)         { testCallbackStack(t) }
+func TestCflags(t *testing.T)                { testCflags(t) }
+func TestCheckConst(t *testing.T)            { testCheckConst(t) }
+func TestConst(t *testing.T)                 { testConst(t) }
+func TestCthread(t *testing.T)               { testCthread(t) }
+func TestEnum(t *testing.T)                  { testEnum(t) }
+func TestErrno(t *testing.T)                 { testErrno(t) }
+func TestFpVar(t *testing.T)                 { testFpVar(t) }
+func TestHelpers(t *testing.T)               { testHelpers(t) }
+func TestLibgcc(t *testing.T)                { testLibgcc(t) }
+func TestMultipleAssign(t *testing.T)        { testMultipleAssign(t) }
+func TestNaming(t *testing.T)                { testNaming(t) }
+func TestPanicFromC(t *testing.T)            { testPanicFromC(t) }
+func TestParallelSleep(t *testing.T)         { testParallelSleep(t) }
+func TestPrintf(t *testing.T)                { testPrintf(t) }
+func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
+func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
+func TestSetEnv(t *testing.T)                { testSetEnv(t) }
+func TestThreadLock(t *testing.T)            { testThreadLockFunc(t) }
+func TestUnsignedInt(t *testing.T)           { testUnsignedInt(t) }
+func TestZeroArgCallback(t *testing.T)       { testZeroArgCallback(t) }
 
 func BenchmarkCgoCall(b *testing.B)  { benchCgoCall(b) }
 func BenchmarkGoString(b *testing.B) { benchGoString(b) }
diff --git a/libgo/misc/cgo/test/checkconst.go b/libgo/misc/cgo/test/checkconst.go
deleted file mode 100644 (file)
index 0160c1e..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test a constant in conjunction with pointer checking.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-#define CheckConstVal 0
-
-typedef struct {
-       int *p;
-} CheckConstStruct;
-
-static void CheckConstFunc(CheckConstStruct *p, int e) {
-}
-*/
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func testCheckConst(t *testing.T) {
-       // The test is that this compiles successfully.
-       p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
-       defer C.free(p)
-       C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
-}
diff --git a/libgo/misc/cgo/test/complex.go b/libgo/misc/cgo/test/complex.go
deleted file mode 100644 (file)
index ca0a97d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-struct {
-       float x;
-       _Complex float y;
-} cplxAlign = { 3.14, 2.17 };
-*/
-import "C"
-
-import "testing"
-
-func TestComplexAlign(t *testing.T) {
-       if C.cplxAlign.x != 3.14 {
-               t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
-       }
-       if C.cplxAlign.y != 2.17 {
-               t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
-       }
-}
diff --git a/libgo/misc/cgo/test/cthread.go b/libgo/misc/cgo/test/cthread.go
deleted file mode 100644 (file)
index af44911..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// extern void doAdd(int, int);
-import "C"
-
-import (
-       "runtime"
-       "sync"
-       "testing"
-)
-
-var sum struct {
-       sync.Mutex
-       i int
-}
-
-//export Add
-func Add(x int) {
-       defer func() {
-               recover()
-       }()
-       sum.Lock()
-       sum.i += x
-       sum.Unlock()
-       var p *int
-       *p = 2
-}
-
-func testCthread(t *testing.T) {
-       if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-               t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
-       }
-       sum.i = 0
-       C.doAdd(10, 6)
-
-       want := 10 * (10 - 1) / 2 * 6
-       if sum.i != want {
-               t.Fatalf("sum=%d, want %d", sum.i, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/duplicate_symbol.go b/libgo/misc/cgo/test/duplicate_symbol.go
deleted file mode 100644 (file)
index 6144271..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-int base_symbol = 0;
-
-#define alias_one base_symbol
-#define alias_two base_symbol
-*/
-import "C"
-
-import "fmt"
-
-func duplicateSymbols() {
-       fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
-}
diff --git a/libgo/misc/cgo/test/env.go b/libgo/misc/cgo/test/env.go
deleted file mode 100644 (file)
index b2081b7..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-*/
-import "C"
-import (
-       "os"
-       "runtime"
-       "testing"
-       "unsafe"
-)
-
-// This is really an os package test but here for convenience.
-func testSetEnv(t *testing.T) {
-       if runtime.GOOS == "windows" {
-               // Go uses SetEnvironmentVariable on windows. Howerver,
-               // C runtime takes a *copy* at process startup of thei
-               // OS environment, and stores it in environ/envp.
-               // It is this copy that getenv/putenv manipulate.
-               t.Logf("skipping test")
-               return
-       }
-       const key = "CGO_OS_TEST_KEY"
-       const val = "CGO_OS_TEST_VALUE"
-       os.Setenv(key, val)
-       keyc := C.CString(key)
-       defer C.free(unsafe.Pointer(keyc))
-       v := C.getenv(keyc)
-       if uintptr(unsafe.Pointer(v)) == 0 {
-               t.Fatal("getenv returned NULL")
-       }
-       vs := C.GoString(v)
-       if vs != val {
-               t.Fatalf("getenv() = %q; want %q", vs, val)
-       }
-}
diff --git a/libgo/misc/cgo/test/exports.go b/libgo/misc/cgo/test/exports.go
deleted file mode 100644 (file)
index 71e5dcd..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-import "runtime"
-
-//export ReturnIntLong
-func ReturnIntLong() (int, C.long) {
-       return 1, 2
-}
-
-//export gc
-func gc() {
-       runtime.GC()
-}
diff --git a/libgo/misc/cgo/test/fpvar.go b/libgo/misc/cgo/test/fpvar.go
deleted file mode 100644 (file)
index 7aab8ca..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo with function pointer variables.
-
-package cgotest
-
-/*
-typedef int (*intFunc) ();
-
-int
-bridge_int_func(intFunc f)
-{
-       return f();
-}
-
-int fortytwo()
-{
-       return 42;
-}
-
-*/
-import "C"
-import "testing"
-
-func callBridge(f C.intFunc) int {
-       return int(C.bridge_int_func(f))
-}
-
-func callCBridge(f C.intFunc) C.int {
-       return C.bridge_int_func(f)
-}
-
-func testFpVar(t *testing.T) {
-       const expected = 42
-       f := C.intFunc(C.fortytwo)
-       res1 := C.bridge_int_func(f)
-       if r1 := int(res1); r1 != expected {
-               t.Errorf("got %d, want %d", r1, expected)
-       }
-       res2 := callCBridge(f)
-       if r2 := int(res2); r2 != expected {
-               t.Errorf("got %d, want %d", r2, expected)
-       }
-       r3 := callBridge(f)
-       if r3 != expected {
-               t.Errorf("got %d, want %d", r3, expected)
-       }
-}
diff --git a/libgo/misc/cgo/test/gcc68255.go b/libgo/misc/cgo/test/gcc68255.go
deleted file mode 100644 (file)
index 23e103d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-       "testing"
-
-       "./gcc68255"
-)
-
-func testGCC68255(t *testing.T) {
-       if !gcc68255.F() {
-               t.Error("C global variable was not initialized")
-       }
-}
diff --git a/libgo/misc/cgo/test/gcc68255/a.go b/libgo/misc/cgo/test/gcc68255/a.go
deleted file mode 100644 (file)
index e106dee..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that it's OK to have C code that does nothing other than
-// initialize a global variable.  This used to fail with gccgo.
-
-package gcc68255
-
-/*
-#include "c.h"
-*/
-import "C"
-
-func F() bool {
-       return C.v != nil
-}
diff --git a/libgo/misc/cgo/test/gcc68255/c.c b/libgo/misc/cgo/test/gcc68255/c.c
deleted file mode 100644 (file)
index a4fe193..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-static void f(void) {
-}
-
-void (*v)(void) = f;
diff --git a/libgo/misc/cgo/test/gcc68255/c.h b/libgo/misc/cgo/test/gcc68255/c.h
deleted file mode 100644 (file)
index 05ecd81..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-extern void (*v)(void);
diff --git a/libgo/misc/cgo/test/helpers.go b/libgo/misc/cgo/test/helpers.go
deleted file mode 100644 (file)
index f6a822a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// const char *greeting = "hello, world";
-import "C"
-
-import (
-       "reflect"
-       "testing"
-       "unsafe"
-)
-
-const greeting = "hello, world"
-
-type testPair struct {
-       Name      string
-       Got, Want interface{}
-}
-
-var testPairs = []testPair{
-       {"GoString", C.GoString(C.greeting), greeting},
-       {"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
-       {"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
-}
-
-func testHelpers(t *testing.T) {
-       for _, pair := range testPairs {
-               if !reflect.DeepEqual(pair.Got, pair.Want) {
-                       t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue10303.go b/libgo/misc/cgo/test/issue10303.go
deleted file mode 100644 (file)
index 66e2644..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 10303. Pointers passed to C were not marked as escaping (bug in cgo).
-
-package cgotest
-
-import "runtime"
-
-/*
-typedef int *intptr;
-
-void setintstar(int *x) {
-       *x = 1;
-}
-
-void setintptr(intptr x) {
-       *x = 1;
-}
-
-void setvoidptr(void *x) {
-       *(int*)x = 1;
-}
-
-typedef struct Struct Struct;
-struct Struct {
-       int *P;
-};
-
-void setstruct(Struct s) {
-       *s.P = 1;
-}
-
-*/
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func test10303(t *testing.T, n int) {
-       if runtime.Compiler == "gccgo" {
-               t.Skip("gccgo permits C pointers on the stack")
-       }
-
-       // Run at a few different stack depths just to avoid an unlucky pass
-       // due to variables ending up on different pages.
-       if n > 0 {
-               test10303(t, n-1)
-       }
-       if t.Failed() {
-               return
-       }
-       var x, y, z, v, si C.int
-       var s C.Struct
-       C.setintstar(&x)
-       C.setintptr(&y)
-       C.setvoidptr(unsafe.Pointer(&v))
-       s.P = &si
-       C.setstruct(s)
-
-       if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-               t.Error("C int* argument on stack")
-       }
-       if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-               t.Error("C intptr argument on stack")
-       }
-       if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-               t.Error("C void* argument on stack")
-       }
-       if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-               t.Error("C struct field pointer on stack")
-       }
-}
diff --git a/libgo/misc/cgo/test/issue11925.go b/libgo/misc/cgo/test/issue11925.go
deleted file mode 100644 (file)
index c5c8a26..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 11925.  Structs with zero-length trailing fields are now
-// padded by the Go compiler.
-
-package cgotest
-
-/*
-struct a11925 {
-       int i;
-       char a[0];
-       char b[0];
-};
-
-struct b11925 {
-       int i;
-       char a[0];
-       char b[];
-};
-*/
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func test11925(t *testing.T) {
-       if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
-               t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
-       }
-       if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
-               t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
-       }
-}
diff --git a/libgo/misc/cgo/test/issue12030.go b/libgo/misc/cgo/test/issue12030.go
deleted file mode 100644 (file)
index f863c58..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 12030. sprintf is defined in both ntdll and msvcrt,
-// Normally we want the one in the msvcrt.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-void issue12030conv(char *buf, double x) {
-       sprintf(buf, "d=%g", x);
-}
-*/
-import "C"
-
-import (
-       "fmt"
-       "testing"
-       "unsafe"
-)
-
-func test12030(t *testing.T) {
-       buf := (*C.char)(C.malloc(256))
-       defer C.free(unsafe.Pointer(buf))
-       for _, f := range []float64{1.0, 2.0, 3.14} {
-               C.issue12030conv(buf, C.double(f))
-               got := C.GoString(buf)
-               if want := fmt.Sprintf("d=%g", f); got != want {
-                       t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue1222.go b/libgo/misc/cgo/test/issue1222.go
deleted file mode 100644 (file)
index 4868da8..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-// issue 1222
-typedef union {
-       long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
-       union {
-               int x;
-       } element;
-};
-
-struct ibv_context {
-       xxpthread_mutex_t mutex;
-};
-*/
-import "C"
-
-type AsyncEvent struct {
-       event C.struct_ibv_async_event
-}
diff --git a/libgo/misc/cgo/test/issue1328.go b/libgo/misc/cgo/test/issue1328.go
deleted file mode 100644 (file)
index 2401c10..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-// extern void BackIntoGo(void);
-// void IntoC(void);
-import "C"
-
-//export BackIntoGo
-func BackIntoGo() {
-       x := 1
-
-       for i := 0; i < 10000; i++ {
-               xvariadic(x)
-               if x != 1 {
-                       panic("x is not 1?")
-               }
-       }
-}
-
-func xvariadic(x ...interface{}) {
-}
-
-func test1328(t *testing.T) {
-       C.IntoC()
-}
diff --git a/libgo/misc/cgo/test/issue13402.go b/libgo/misc/cgo/test/issue13402.go
deleted file mode 100644 (file)
index 3af24c2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-var _ C.complexfloat
-var _ C.complexdouble
diff --git a/libgo/misc/cgo/test/issue13930.go b/libgo/misc/cgo/test/issue13930.go
deleted file mode 100644 (file)
index c4a08ee..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 13930.  Test that cgo's multiple-value special form for
-// C function calls works in variable declaration statements.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-var _, _ = C.abs(0)
diff --git a/libgo/misc/cgo/test/issue14838.go b/libgo/misc/cgo/test/issue14838.go
deleted file mode 100644 (file)
index c8e1681..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 14838. add CBytes function
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-int check_cbytes(char *b, size_t l) {
-       int i;
-       for (i = 0; i < l; i++) {
-               if (b[i] != i) {
-                       return 0;
-               }
-       }
-       return 1;
-}
-*/
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func test14838(t *testing.T) {
-       data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-       cData := C.CBytes(data)
-       defer C.free(cData)
-
-       if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
-               t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
-       }
-}
diff --git a/libgo/misc/cgo/test/issue1560.go b/libgo/misc/cgo/test/issue1560.go
deleted file mode 100644 (file)
index 30f6152..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// mysleep returns the absolute start time in ms.
-long long mysleep(int seconds);
-
-// twoSleep returns the absolute start time of the first sleep
-// in ms.
-long long twoSleep(int);
-*/
-import "C"
-
-import (
-       "testing"
-       "time"
-)
-
-var sleepDone = make(chan int64)
-
-// parallelSleep returns the absolute difference between the start time
-// of the two sleeps.
-func parallelSleep(n int) int64 {
-       t := int64(C.twoSleep(C.int(n))) - <-sleepDone
-       if t < 0 {
-               return -t
-       }
-       return t
-}
-
-//export BackgroundSleep
-func BackgroundSleep(n int32) {
-       go func() {
-               sleepDone <- int64(C.mysleep(C.int(n)))
-       }()
-}
-
-func testParallelSleep(t *testing.T) {
-       sleepSec := 1
-       dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
-       t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
-       // bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
-       // we detect if the start times of those sleeps are > 0.5*sleepSec-second.
-       if dt >= time.Duration(sleepSec)*time.Second/2 {
-               t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
-       }
-}
diff --git a/libgo/misc/cgo/test/issue1635.go b/libgo/misc/cgo/test/issue1635.go
deleted file mode 100644 (file)
index 2589927..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// Mac OS X's gcc will generate scattered relocation 2/1 for
-// this function on Darwin/386, and 8l couldn't handle it.
-// this example is in issue 1635
-#include <stdio.h>
-void scatter() {
-       void *p = scatter;
-       printf("scatter = %p\n", p);
-}
-
-// Adding this explicit extern declaration makes this a test for
-// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
-// It used to cause a cgo error when building with GCC 6.
-extern int hola;
-
-// this example is in issue 3253
-int hola = 0;
-int testHola() { return hola; }
-*/
-import "C"
-
-import "testing"
-
-func test1635(t *testing.T) {
-       C.scatter()
-       if v := C.hola; v != 0 {
-               t.Fatalf("C.hola is %d, should be 0", v)
-       }
-       if v := C.testHola(); v != 0 {
-               t.Fatalf("C.testHola() is %d, should be 0", v)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue17065.go b/libgo/misc/cgo/test/issue17065.go
deleted file mode 100644 (file)
index ede30bc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// Test that C symbols larger than a page play nicely with the race detector.
-// See issue 17065.
-
-int ii[65537];
-*/
-import "C"
-
-import (
-       "runtime"
-       "testing"
-)
-
-var sink C.int
-
-func test17065(t *testing.T) {
-       if runtime.GOOS == "darwin" {
-               t.Skip("broken on darwin; issue 17065")
-       }
-       for i := range C.ii {
-               sink = C.ii[i]
-       }
-}
diff --git a/libgo/misc/cgo/test/issue17537.go b/libgo/misc/cgo/test/issue17537.go
deleted file mode 100644 (file)
index 777104e..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 17537.  The void* cast introduced by cgo to avoid problems
-// with const/volatile qualifiers breaks C preprocessor macros that
-// emulate functions.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-typedef struct {
-       int i;
-} S17537;
-
-int I17537(S17537 *p);
-
-#define I17537(p) ((p)->i)
-
-// Calling this function used to fail without the cast.
-const int F17537(const char **p) {
-       return **p;
-}
-
-// Calling this function used to trigger an error from the C compiler
-// (issue 18298).
-void F18298(const void *const *p) {
-}
-
-// Test that conversions between typedefs work as they used to.
-typedef const void *T18298_1;
-struct S18298 { int i; };
-typedef const struct S18298 *T18298_2;
-void G18298(T18298_1 t) {
-}
-*/
-import "C"
-
-import "testing"
-
-func test17537(t *testing.T) {
-       v := C.S17537{i: 17537}
-       if got, want := C.I17537(&v), C.int(17537); got != want {
-               t.Errorf("got %d, want %d", got, want)
-       }
-
-       p := (*C.char)(C.malloc(1))
-       *p = 17
-       if got, want := C.F17537(&p), C.int(17); got != want {
-               t.Errorf("got %d, want %d", got, want)
-       }
-
-       C.F18298(nil)
-       var v18298 C.T18298_2
-       C.G18298(C.T18298_1(v18298))
-}
diff --git a/libgo/misc/cgo/test/issue18126.go b/libgo/misc/cgo/test/issue18126.go
deleted file mode 100644 (file)
index ac94a66..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 18126: cgo check of void function returning errno.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-void Issue18126C(void **p) {
-}
-*/
-import "C"
-
-import (
-       "testing"
-)
-
-func test18126(t *testing.T) {
-       p := C.malloc(1)
-       _, err := C.Issue18126C(&p)
-       C.free(p)
-       _ = err
-}
index 8b7bb77b63b6d713436772f341c520bfc8ca93f3..196d98f507982fa1dfce9fbc6c11e08073e0ac35 100644 (file)
@@ -8,8 +8,6 @@
 
 package cgotest
 
-import "C"
-
 import (
        "bytes"
        "crypto/md5"
@@ -46,12 +44,12 @@ func test18146(t *testing.T) {
        switch runtime.GOOS {
        default:
                setNproc = false
+       case "aix":
+               nproc = 9
        case "linux":
                nproc = 6
        case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
                nproc = 7
-       case "aix":
-               nproc = 9
        }
        if setNproc {
                var rlim syscall.Rlimit
diff --git a/libgo/misc/cgo/test/issue18720.go b/libgo/misc/cgo/test/issue18720.go
deleted file mode 100644 (file)
index 3d64003..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#define HELLO "hello"
-#define WORLD "world"
-#define HELLO_WORLD HELLO "\000" WORLD
-
-struct foo { char c; };
-#define SIZE_OF(x) sizeof(x)
-#define SIZE_OF_FOO SIZE_OF(struct foo)
-#define VAR1 VAR
-#define VAR var
-int var = 5;
-
-#define ADDR &var
-
-#define CALL fn()
-int fn(void) {
-       return ++var;
-}
-*/
-import "C"
-import "testing"
-
-func test18720(t *testing.T) {
-       if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
-               t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
-       }
-
-       if got, want := C.VAR1, C.int(5); got != want {
-               t.Errorf("C.VAR1 == %v, expected %v", got, want)
-       }
-
-       if got, want := *C.ADDR, C.int(5); got != want {
-               t.Errorf("*C.ADDR == %v, expected %v", got, want)
-       }
-
-       if got, want := C.CALL, C.int(6); got != want {
-               t.Errorf("C.CALL == %v, expected %v", got, want)
-       }
-
-       if got, want := C.CALL, C.int(7); got != want {
-               t.Errorf("C.CALL == %v, expected %v", got, want)
-       }
-
-       // Issue 20125.
-       if got, want := C.SIZE_OF_FOO, 1; got != want {
-               t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue20129.go b/libgo/misc/cgo/test/issue20129.go
deleted file mode 100644 (file)
index e69e0e1..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-int issue20129 = 0;
-typedef void issue20129Void;
-issue20129Void issue20129Foo() {
-       issue20129 = 1;
-}
-typedef issue20129Void issue20129Void2;
-issue20129Void2 issue20129Bar() {
-       issue20129 = 2;
-}
-*/
-import "C"
-import "testing"
-
-func test20129(t *testing.T) {
-       if C.issue20129 != 0 {
-               t.Fatal("test is broken")
-       }
-       C.issue20129Foo()
-       if C.issue20129 != 1 {
-               t.Errorf("got %v but expected %v", C.issue20129, 1)
-       }
-       C.issue20129Bar()
-       if C.issue20129 != 2 {
-               t.Errorf("got %v but expected %v", C.issue20129, 2)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue20266.go b/libgo/misc/cgo/test/issue20266.go
deleted file mode 100644 (file)
index 9f95086..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 20266: use -I with a relative path.
-
-package cgotest
-
-/*
-#cgo CFLAGS: -I issue20266 -Iissue20266 -Ddef20266
-#include "issue20266.h"
-*/
-import "C"
-
-import "testing"
-
-func test20266(t *testing.T) {
-       if got, want := C.issue20266, 20266; got != want {
-               t.Errorf("got %d, want %d", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue20266/issue20266.h b/libgo/misc/cgo/test/issue20266/issue20266.h
deleted file mode 100644 (file)
index 8d3258e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#define issue20266 20266
-
-#ifndef def20266
-#error "expected def20266 to be defined"
-#endif
diff --git a/libgo/misc/cgo/test/issue20369.go b/libgo/misc/cgo/test/issue20369.go
deleted file mode 100644 (file)
index 37b4b78..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#define UINT64_MAX        18446744073709551615ULL
-*/
-import "C"
-import (
-       "math"
-       "testing"
-)
-
-func test20369(t *testing.T) {
-       if C.UINT64_MAX != math.MaxUint64 {
-               t.Fatalf("got %v, want %v", uint64(C.UINT64_MAX), uint64(math.MaxUint64))
-       }
-}
diff --git a/libgo/misc/cgo/test/issue20910.go b/libgo/misc/cgo/test/issue20910.go
deleted file mode 100644 (file)
index 69d7d92..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-//void callMulti(void);
-import "C"
-
-import "testing"
-
-//export multi
-func multi() (*C.char, C.int) {
-       return C.CString("multi"), 0
-}
-
-func test20910(t *testing.T) {
-       C.callMulti()
-}
diff --git a/libgo/misc/cgo/test/issue21668.go b/libgo/misc/cgo/test/issue21668.go
deleted file mode 100644 (file)
index f15b920..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Fail to guess the kind of the constant "x".
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-// const int x = 42;
-import "C"
-
-var issue21668_X = C.x
diff --git a/libgo/misc/cgo/test/issue21708.go b/libgo/misc/cgo/test/issue21708.go
deleted file mode 100644 (file)
index d413e3c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// #include <stdint.h>
-// #define CAST_TO_INT64 (int64_t)(-1)
-import "C"
-import "testing"
-
-func test21708(t *testing.T) {
-       if got, want := C.CAST_TO_INT64, -1; got != want {
-               t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue21809.go b/libgo/misc/cgo/test/issue21809.go
deleted file mode 100644 (file)
index a3a6b88..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Issue 21809.  Compile C `typedef` to go type aliases.
-
-// typedef long MySigned_t;
-// /* tests alias-to-alias */
-// typedef MySigned_t MySigned2_t;
-//
-// long takes_long(long x) { return x * x; }
-// MySigned_t takes_typedef(MySigned_t x) { return x * x; }
-import "C"
-
-import "testing"
-
-func test21809(t *testing.T) {
-       longVar := C.long(3)
-       typedefVar := C.MySigned_t(4)
-       typedefTypedefVar := C.MySigned2_t(5)
-
-       // all three should be considered identical to `long`
-       if ret := C.takes_long(longVar); ret != 9 {
-               t.Errorf("got %v but expected %v", ret, 9)
-       }
-       if ret := C.takes_long(typedefVar); ret != 16 {
-               t.Errorf("got %v but expected %v", ret, 16)
-       }
-       if ret := C.takes_long(typedefTypedefVar); ret != 25 {
-               t.Errorf("got %v but expected %v", ret, 25)
-       }
-
-       // They should also be identical to the typedef'd type
-       if ret := C.takes_typedef(longVar); ret != 9 {
-               t.Errorf("got %v but expected %v", ret, 9)
-       }
-       if ret := C.takes_typedef(typedefVar); ret != 16 {
-               t.Errorf("got %v but expected %v", ret, 16)
-       }
-       if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
-               t.Errorf("got %v but expected %v", ret, 25)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue22958.go b/libgo/misc/cgo/test/issue22958.go
deleted file mode 100644 (file)
index a5f058f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of bitfields.
-
-/*
-typedef struct {
-       unsigned long long f8  : 8;
-       unsigned long long f16 : 16;
-       unsigned long long f24 : 24;
-       unsigned long long f32 : 32;
-       unsigned long long f40 : 40;
-       unsigned long long f48 : 48;
-       unsigned long long f56 : 56;
-       unsigned long long f64 : 64;
-} issue22958Type;
-*/
-import "C"
-
-// Nothing to run, just make sure this compiles.
-var Vissue22958 C.issue22958Type
diff --git a/libgo/misc/cgo/test/issue23356.go b/libgo/misc/cgo/test/issue23356.go
deleted file mode 100644 (file)
index 1c39012..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// int a(void) { return 5; };
-// int r(void) { return 3; };
-import "C"
-import "testing"
-
-func test23356(t *testing.T) {
-       if got, want := C.a(), C.int(5); got != want {
-               t.Errorf("C.a() == %v, expected %v", got, want)
-       }
-       if got, want := C.r(), C.int(3); got != want {
-               t.Errorf("C.r() == %v, expected %v", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue23555.go b/libgo/misc/cgo/test/issue23555.go
deleted file mode 100644 (file)
index 5fa44e6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that we can have two identical cgo packages in a single binary.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "./issue23555a"
-import _ "./issue23555b"
diff --git a/libgo/misc/cgo/test/issue23555a/a.go b/libgo/misc/cgo/test/issue23555a/a.go
deleted file mode 100644 (file)
index cb6626b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue23555
-
-// #include <stdlib.h>
-import "C"
-
-func X() {
-       C.free(C.malloc(10))
-}
diff --git a/libgo/misc/cgo/test/issue23555b/a.go b/libgo/misc/cgo/test/issue23555b/a.go
deleted file mode 100644 (file)
index cb6626b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue23555
-
-// #include <stdlib.h>
-import "C"
-
-func X() {
-       C.free(C.malloc(10))
-}
diff --git a/libgo/misc/cgo/test/issue23720.go b/libgo/misc/cgo/test/issue23720.go
deleted file mode 100644 (file)
index 934fff3..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that we can pass compatible typedefs.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef int *issue23720A;
-
-typedef const int *issue23720B;
-
-void issue23720F(issue23720B a) {}
-*/
-import "C"
-
-func Issue23720F() {
-       var x C.issue23720A
-       C.issue23720F(x)
-}
diff --git a/libgo/misc/cgo/test/issue24161_darwin_test.go b/libgo/misc/cgo/test/issue24161_darwin_test.go
deleted file mode 100644 (file)
index 48072ff..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// See issue21897.go and golang.org/issue/26475 for why this is
-// skipped in race mode.
-//
-// TODO(austin): Once support for macOS 10.10 is dropped, remove the
-// race constraint. See golang.org/issue/26513.
-
-// +build !race
-
-package cgotest
-
-import (
-       "testing"
-
-       "./issue24161arg"
-       "./issue24161e0"
-       "./issue24161e1"
-       "./issue24161e2"
-       "./issue24161res"
-)
-
-func Test24161Arg(t *testing.T) {
-       issue24161arg.Test(t)
-}
-func Test24161Res(t *testing.T) {
-       issue24161res.Test(t)
-}
-func Test24161Example0(t *testing.T) {
-       issue24161e0.Test(t)
-}
-func Test24161Example1(t *testing.T) {
-       issue24161e1.Test(t)
-}
-func Test24161Example2(t *testing.T) {
-       issue24161e2.Test(t)
-}
diff --git a/libgo/misc/cgo/test/issue24161arg/def.go b/libgo/misc/cgo/test/issue24161arg/def.go
deleted file mode 100644 (file)
index d33479a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161arg
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-
-func test24161array() C.CFArrayRef {
-       return C.CFArrayCreate(0, nil, 0, nil)
-}
diff --git a/libgo/misc/cgo/test/issue24161arg/use.go b/libgo/misc/cgo/test/issue24161arg/use.go
deleted file mode 100644 (file)
index 3e74944..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161arg
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-import "testing"
-
-func Test(t *testing.T) {
-       a := test24161array()
-       C.CFArrayCreateCopy(0, a)
-}
diff --git a/libgo/misc/cgo/test/issue24161e0/main.go b/libgo/misc/cgo/test/issue24161e0/main.go
deleted file mode 100644 (file)
index cbc1dee..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161e0
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import "testing"
-
-func f1() {
-       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue24161e1/main.go b/libgo/misc/cgo/test/issue24161e1/main.go
deleted file mode 100644 (file)
index eb48fc0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161e1
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import (
-       "fmt"
-       "testing"
-)
-
-func f1() {
-       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func f2(e C.CFErrorRef) {
-       if desc := C.CFErrorCopyDescription(e); desc != 0 {
-               fmt.Println(desc)
-       }
-}
-
-func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue24161e2/main.go b/libgo/misc/cgo/test/issue24161e2/main.go
deleted file mode 100644 (file)
index 1951c86..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161e2
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import (
-       "fmt"
-       "testing"
-)
-
-var _ C.CFStringRef
-
-func f1() {
-       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func f2(e C.CFErrorRef) {
-       if desc := C.CFErrorCopyDescription(e); desc != 0 {
-               fmt.Println(desc)
-       }
-}
-
-func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue24161res/restype.go b/libgo/misc/cgo/test/issue24161res/restype.go
deleted file mode 100644 (file)
index e5719f2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package issue24161res
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-import (
-       "reflect"
-       "testing"
-)
-
-func Test(t *testing.T) {
-       if k := reflect.TypeOf(C.CFArrayCreate(0, nil, 0, nil)).Kind(); k != reflect.Uintptr {
-               t.Fatalf("bad kind %s\n", k)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue24206.go b/libgo/misc/cgo/test/issue24206.go
deleted file mode 100644 (file)
index 5fec68e..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build amd64,linux
-
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test that C.GoString uses IndexByte in safe manner.
-
-/*
-#include <sys/mman.h>
-
-// Returns string with null byte at the last valid address
-char* dangerousString1() {
-       int pageSize = 4096;
-       char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-       mprotect(data + pageSize,pageSize,PROT_NONE);
-       int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-       int i = start;
-       for (; i < pageSize; i++) {
-       data[i] = 'x';
-       }
-       data[pageSize -1 ] = 0;
-       return data+start;
-}
-
-char* dangerousString2() {
-       int pageSize = 4096;
-       char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-       mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
-       int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-       int i = start;
-       for (; i < 2 * pageSize; i++) {
-       data[i] = 'x';
-       }
-       data[2*pageSize -1 ] = 0;
-       return data+start;
-}
-*/
-import "C"
-
-import (
-       "testing"
-)
-
-func test24206(t *testing.T) {
-       if l := len(C.GoString(C.dangerousString1())); l != 123 {
-               t.Errorf("Incorrect string length - got %d, want 123", l)
-       }
-       if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
-               t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue24206_generic.go b/libgo/misc/cgo/test/issue24206_generic.go
deleted file mode 100644 (file)
index 27c4d65..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !amd64 !linux
-
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-func test24206(t *testing.T) {
-       t.Skip("Skipping on non-amd64 or non-linux system")
-}
diff --git a/libgo/misc/cgo/test/issue2462.go b/libgo/misc/cgo/test/issue2462.go
deleted file mode 100644 (file)
index febca1e..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-//export exportbyte
-func exportbyte() byte {
-       return 0
-}
-
-//export exportbool
-func exportbool() bool {
-       return false
-}
-
-//export exportrune
-func exportrune() rune {
-       return 0
-}
-
-//export exporterror
-func exporterror() error {
-       return nil
-}
-
-//export exportint
-func exportint() int {
-       return 0
-}
-
-//export exportuint
-func exportuint() uint {
-       return 0
-}
-
-//export exportuintptr
-func exportuintptr() uintptr {
-       return (uintptr)(0)
-}
-
-//export exportint8
-func exportint8() int8 {
-       return 0
-}
-
-//export exportuint8
-func exportuint8() uint8 {
-       return 0
-}
-
-//export exportint16
-func exportint16() int16 {
-       return 0
-}
-
-//export exportuint16
-func exportuint16() uint16 {
-       return 0
-}
-
-//export exportint32
-func exportint32() int32 {
-       return 0
-}
-
-//export exportuint32
-func exportuint32() uint32 {
-       return 0
-}
-
-//export exportint64
-func exportint64() int64 {
-       return 0
-}
-
-//export exportuint64
-func exportuint64() uint64 {
-       return 0
-}
-
-//export exportfloat32
-func exportfloat32() float32 {
-       return 0
-}
-
-//export exportfloat64
-func exportfloat64() float64 {
-       return 0
-}
-
-//export exportcomplex64
-func exportcomplex64() complex64 {
-       return 0
-}
-
-//export exportcomplex128
-func exportcomplex128() complex128 {
-       return 0
-}
diff --git a/libgo/misc/cgo/test/issue25143.go b/libgo/misc/cgo/test/issue25143.go
deleted file mode 100644 (file)
index 607bfe4..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-import "testing"
-
-func issue25143sum(ns ...C.int) C.int {
-       total := C.int(0)
-       for _, n := range ns {
-               total += n
-       }
-       return total
-}
-
-func test25143(t *testing.T) {
-       if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
-               t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue26066.go b/libgo/misc/cgo/test/issue26066.go
deleted file mode 100644 (file)
index 21028e7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Wrong type of constant with GCC 8 and newer.
-
-package cgotest
-
-// const unsigned long long int issue26066 = (const unsigned long long) -1;
-import "C"
-
-import "testing"
-
-func test26066(t *testing.T) {
-       var i = int64(C.issue26066)
-       if i != -1 {
-               t.Errorf("got %d, want -1", i)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue26213/jni.h b/libgo/misc/cgo/test/issue26213/jni.h
deleted file mode 100644 (file)
index 0c76979..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// It's going to be hard to include a whole real JVM to test this.
-// So we'll simulate a really easy JVM using just the parts we need.
-
-// This is the relevant part of jni.h.
-
-// On Android NDK16, jobject is defined like this in C and C++
-typedef void* jobject;
-
-typedef jobject jclass;
-typedef jobject jthrowable;
-typedef jobject jstring;
-typedef jobject jarray;
-typedef jarray jbooleanArray;
-typedef jarray jbyteArray;
-typedef jarray jcharArray;
-typedef jarray jshortArray;
-typedef jarray jintArray;
-typedef jarray jlongArray;
-typedef jarray jfloatArray;
-typedef jarray jdoubleArray;
-typedef jarray jobjectArray;
-
-typedef jobject jweak;
-
-// Note: jvalue is already a non-pointer type due to it being a C union.
diff --git a/libgo/misc/cgo/test/issue26213/test26213.go b/libgo/misc/cgo/test/issue26213/test26213.go
deleted file mode 100644 (file)
index 5d1f637..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue26213
-
-/*
-#include "jni.h"
-*/
-import "C"
-import (
-       "testing"
-)
-
-func Test26213(t *testing.T) {
-       var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
-       _ = x1
-       var x2 C.jclass = 0
-       _ = x2
-       var x3 C.jthrowable = 0
-       _ = x3
-       var x4 C.jstring = 0
-       _ = x4
-       var x5 C.jarray = 0
-       _ = x5
-       var x6 C.jbooleanArray = 0
-       _ = x6
-       var x7 C.jbyteArray = 0
-       _ = x7
-       var x8 C.jcharArray = 0
-       _ = x8
-       var x9 C.jshortArray = 0
-       _ = x9
-       var x10 C.jintArray = 0
-       _ = x10
-       var x11 C.jlongArray = 0
-       _ = x11
-       var x12 C.jfloatArray = 0
-       _ = x12
-       var x13 C.jdoubleArray = 0
-       _ = x13
-       var x14 C.jobjectArray = 0
-       _ = x14
-       var x15 C.jweak = 0
-       _ = x15
-}
diff --git a/libgo/misc/cgo/test/issue26430.go b/libgo/misc/cgo/test/issue26430.go
deleted file mode 100644 (file)
index 3ad5420..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 26430: incomplete typedef leads to inconsistent typedefs error.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "./issue26430"
diff --git a/libgo/misc/cgo/test/issue26430/a.go b/libgo/misc/cgo/test/issue26430/a.go
deleted file mode 100644 (file)
index fbaa46b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package a
-
-// typedef struct S ST;
-// static ST* F() { return 0; }
-import "C"
-
-func F1() {
-       C.F()
-}
diff --git a/libgo/misc/cgo/test/issue26430/b.go b/libgo/misc/cgo/test/issue26430/b.go
deleted file mode 100644 (file)
index a7c527c..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package a
-
-// typedef struct S ST;
-// struct S { int f; };
-import "C"
-
-func F2(p *C.ST) {
-       p.f = 1
-}
diff --git a/libgo/misc/cgo/test/issue26517.go b/libgo/misc/cgo/test/issue26517.go
deleted file mode 100644 (file)
index c1bf1c9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Introduce two pointer types which are distinct, but have the same
-// base type. Make sure that both of those pointer types get resolved
-// correctly. Before the fix for 26517 if one of these pointer types
-// was resolved before the other one was processed, the second one
-// would never be resolved.
-// Before this issue was fixed this test failed on Windows,
-// where va_list expands to a named char* type.
-
-/*
-#include <stdarg.h>
-typedef va_list TypeOne;
-typedef char *TypeTwo;
-*/
-import "C"
-
-var a C.TypeOne
-var b C.TypeTwo
diff --git a/libgo/misc/cgo/test/issue26743.go b/libgo/misc/cgo/test/issue26743.go
deleted file mode 100644 (file)
index 35c8473..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 26743: typedef of uint leads to inconsistent typedefs error.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "./issue26743"
diff --git a/libgo/misc/cgo/test/issue26743/a.go b/libgo/misc/cgo/test/issue26743/a.go
deleted file mode 100644 (file)
index a3df179..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue26743
-
-// typedef unsigned int uint;
-// int C1(uint x) { return x; }
-import "C"
-
-var V1 = C.C1(0)
diff --git a/libgo/misc/cgo/test/issue26743/b.go b/libgo/misc/cgo/test/issue26743/b.go
deleted file mode 100644 (file)
index c5f1ae4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue26743
-
-import "C"
-
-var V2 C.uint
diff --git a/libgo/misc/cgo/test/issue27054/egl.h b/libgo/misc/cgo/test/issue27054/egl.h
deleted file mode 100644 (file)
index 33a759e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is the relevant part of EGL/egl.h.
-
-typedef void *EGLDisplay;
diff --git a/libgo/misc/cgo/test/issue27054/test27054.go b/libgo/misc/cgo/test/issue27054/test27054.go
deleted file mode 100644 (file)
index 186f5bd..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issue27054
-
-/*
-#include "egl.h"
-*/
-import "C"
-import (
-       "testing"
-)
-
-func Test27054(t *testing.T) {
-       var _ C.EGLDisplay = 0 // Note: 0, not nil. That makes sure we use uintptr for this type.
-}
diff --git a/libgo/misc/cgo/test/issue27340.go b/libgo/misc/cgo/test/issue27340.go
deleted file mode 100644 (file)
index f8c8a87..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Failed to resolve typedefs consistently.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import "./issue27340"
-
-var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/libgo/misc/cgo/test/issue27340/a.go b/libgo/misc/cgo/test/issue27340/a.go
deleted file mode 100644 (file)
index f5b120c..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Failed to resolve typedefs consistently.
-// No runtime test; just make sure it compiles.
-// In separate directory to isolate #pragma GCC diagnostic.
-
-package issue27340
-
-// We use the #pragma to avoid a compiler warning about incompatible
-// pointer types, because we generate code passing a struct ptr rather
-// than using the typedef. This warning is expected and does not break
-// a normal build.
-// We can only disable -Wincompatible-pointer-types starting with GCC 5.
-
-// #if __GNU_MAJOR__ >= 5
-//
-// #pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
-//
-// typedef struct {
-//     int a;
-// } issue27340Struct, *issue27340Ptr;
-//
-// static void issue27340CFunc(issue27340Ptr p) {}
-//
-// #else /* _GNU_MAJOR_ < 5 */
-//
-// typedef struct {
-//     int a;
-// } issue27340Struct;
-//
-// static issue27340Struct* issue27340Ptr(issue27340Struct* p) { return p; }
-//
-// static void issue27340CFunc(issue27340Struct *p) {}
-// #endif /* _GNU_MAJOR_ < 5 */
-import "C"
-
-func Issue27340GoFunc() {
-       var s C.issue27340Struct
-       C.issue27340CFunc(C.issue27340Ptr(&s))
-}
diff --git a/libgo/misc/cgo/test/issue28545.go b/libgo/misc/cgo/test/issue28545.go
deleted file mode 100644 (file)
index 8419b89..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Failed to add type conversion for negative constant.
-// Issue 28772: Failed to add type conversion for Go constant set to C constant.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-#include <complex.h>
-
-#define issue28772Constant 1
-
-static void issue28545F(char **p, int n, complex double a) {}
-*/
-import "C"
-
-const issue28772Constant = C.issue28772Constant
-
-func issue28545G(p **C.char) {
-       C.issue28545F(p, -1, (0))
-       C.issue28545F(p, 2+3, complex(1, 1))
-       C.issue28545F(p, issue28772Constant, issue28772Constant2)
-}
diff --git a/libgo/misc/cgo/test/issue28772.go b/libgo/misc/cgo/test/issue28772.go
deleted file mode 100644 (file)
index bed786b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Constants didn't work if defined in different source file.
-
-// #define issue28772Constant2 2
-import "C"
-
-const issue28772Constant2 = C.issue28772Constant2
diff --git a/libgo/misc/cgo/test/issue28896.go b/libgo/misc/cgo/test/issue28896.go
deleted file mode 100644 (file)
index 8796040..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo was incorrectly adding padding after a packed struct.
-
-package cgotest
-
-/*
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-typedef struct {
-       void *f1;
-       uint32_t f2;
-} __attribute__((__packed__)) innerPacked;
-
-typedef struct {
-       innerPacked g1;
-       uint64_t g2;
-} outerPacked;
-
-typedef struct {
-       void *f1;
-       uint32_t f2;
-} innerUnpacked;
-
-typedef struct {
-       innerUnpacked g1;
-       uint64_t g2;
-} outerUnpacked;
-
-size_t offset(int x) {
-       switch (x) {
-       case 0:
-               return offsetof(innerPacked, f2);
-       case 1:
-               return offsetof(outerPacked, g2);
-       case 2:
-               return offsetof(innerUnpacked, f2);
-       case 3:
-               return offsetof(outerUnpacked, g2);
-       default:
-               abort();
-       }
-}
-*/
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func offset(i int) uintptr {
-       var pi C.innerPacked
-       var po C.outerPacked
-       var ui C.innerUnpacked
-       var uo C.outerUnpacked
-       switch i {
-       case 0:
-               return unsafe.Offsetof(pi.f2)
-       case 1:
-               return unsafe.Offsetof(po.g2)
-       case 2:
-               return unsafe.Offsetof(ui.f2)
-       case 3:
-               return unsafe.Offsetof(uo.g2)
-       default:
-               panic("can't happen")
-       }
-}
-
-func test28896(t *testing.T) {
-       for i := 0; i < 4; i++ {
-               c := uintptr(C.offset(C.int(i)))
-               g := offset(i)
-               if c != g {
-                       t.Errorf("%d: C: %d != Go %d", i, c, g)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue29383.go b/libgo/misc/cgo/test/issue29383.go
deleted file mode 100644 (file)
index 462c9a3..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo's /*line*/ comments failed when inserted after '/',
-// because the result looked like a "//" comment.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include <stddef.h>
-import "C"
-
-func Issue29383(n, size uint) int {
-       if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
-               return 0
-       }
-       return 0
-}
diff --git a/libgo/misc/cgo/test/issue29748.go b/libgo/misc/cgo/test/issue29748.go
deleted file mode 100644 (file)
index 8229b3b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Error handling a struct initializer that requires pointer checking.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// typedef struct { char **p; } S29748;
-// static int f29748(S29748 *p) { return 0; }
-import "C"
-
-var Vissue29748 = C.f29748(&C.S29748{
-       nil,
-})
-
-func Fissue299748() {
-       C.f29748(&C.S29748{
-               nil,
-       })
-}
diff --git a/libgo/misc/cgo/test/issue29781.go b/libgo/misc/cgo/test/issue29781.go
deleted file mode 100644 (file)
index 0fd8c08..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Error with newline inserted into constant expression.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// static void issue29781F(char **p, int n) {}
-// #define ISSUE29781C 0
-import "C"
-
-func issue29781G() {
-       var p *C.char
-       C.issue29781F(&p, C.ISSUE29781C+1)
-}
diff --git a/libgo/misc/cgo/test/issue30065.go b/libgo/misc/cgo/test/issue30065.go
deleted file mode 100644 (file)
index 396d437..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Don't make a private copy of an array when taking the address of an
-// element.
-
-package cgotest
-
-// #include <string.h>
-import "C"
-
-import (
-       "testing"
-       "unsafe"
-)
-
-func test30065(t *testing.T) {
-       var a [256]byte
-       b := []byte("a")
-       C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
-       if a[0] != 'a' {
-               t.Errorf("&a failed: got %c, want %c", a[0], 'a')
-       }
-
-       b = []byte("b")
-       C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
-       if a[0] != 'b' {
-               t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
-       }
-
-       d := make([]byte, 256)
-       b = []byte("c")
-       C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
-       if d[0] != 'c' {
-               t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
-       }
-}
diff --git a/libgo/misc/cgo/test/issue3250.go b/libgo/misc/cgo/test/issue3250.go
deleted file mode 100644 (file)
index f85c16b..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-static void *thread(void *p) {
-       const int M = 100;
-       int i;
-       (void)p;
-       for (i = 0; i < M; i++) {
-               pthread_kill(pthread_self(), SIGCHLD);
-               usleep(rand() % 20 + 5);
-       }
-       return NULL;
-}
-void testSendSIG() {
-       const int N = 20;
-       int i;
-       pthread_t tid[N];
-       for (i = 0; i < N; i++) {
-               usleep(rand() % 200 + 100);
-               pthread_create(&tid[i], 0, thread, NULL);
-       }
-       for (i = 0; i < N; i++)
-               pthread_join(tid[i], 0);
-}
-*/
-import "C"
-
-import (
-       "os"
-       "os/signal"
-       "syscall"
-       "testing"
-       "time"
-)
-
-func test3250(t *testing.T) {
-       t.Skip("skipped, see golang.org/issue/5885")
-       const (
-               thres = 1
-               sig   = syscall.SIGCHLD
-       )
-       type result struct {
-               n   int
-               sig os.Signal
-       }
-       var (
-               sigCh     = make(chan os.Signal, 10)
-               waitStart = make(chan struct{})
-               waitDone  = make(chan result)
-       )
-
-       signal.Notify(sigCh, sig)
-
-       go func() {
-               n := 0
-               alarm := time.After(time.Second * 3)
-               for {
-                       select {
-                       case <-waitStart:
-                               waitStart = nil
-                       case v := <-sigCh:
-                               n++
-                               if v != sig || n > thres {
-                                       waitDone <- result{n, v}
-                                       return
-                               }
-                       case <-alarm:
-                               waitDone <- result{n, sig}
-                               return
-                       }
-               }
-       }()
-
-       waitStart <- struct{}{}
-       C.testSendSIG()
-       r := <-waitDone
-       if r.sig != sig {
-               t.Fatalf("received signal %v, but want %v", r.sig, sig)
-       }
-       t.Logf("got %d signals\n", r.n)
-       if r.n <= thres {
-               t.Fatalf("expected more than %d", thres)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue3250w.go b/libgo/misc/cgo/test/issue3250w.go
deleted file mode 100644 (file)
index c2193aa..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test3250(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue3261.go b/libgo/misc/cgo/test/issue3261.go
deleted file mode 100644 (file)
index 7137569..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// libgcc on ARM might be compiled as thumb code, but our 5l
-// can't handle that, so we have to disable this test on arm.
-#ifdef __ARMEL__
-#include <stdio.h>
-int vabs(int x) {
-       puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
-       return (x < 0) ? -x : x;
-}
-#elif defined(__arm64__) && defined(__clang__)
-#include <stdio.h>
-int vabs(int x) {
-       puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
-       return (x < 0) ? -x : x;
-}
-#else
-int __absvsi2(int); // dummy prototype for libgcc function
-// we shouldn't name the function abs, as gcc might use
-// the builtin one.
-int vabs(int x) { return __absvsi2(x); }
-#endif
-*/
-import "C"
-
-import "testing"
-
-func testLibgcc(t *testing.T) {
-       var table = []struct {
-               in, out C.int
-       }{
-               {0, 0},
-               {1, 1},
-               {-42, 42},
-               {1000300, 1000300},
-               {1 - 1<<31, 1<<31 - 1},
-       }
-       for _, v := range table {
-               if o := C.vabs(v.in); o != v.out {
-                       t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
-                       return
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue3729.go b/libgo/misc/cgo/test/issue3729.go
deleted file mode 100644 (file)
index 947b90a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 3729: cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <errno.h>
-
-void g(void) {
-       errno = E2BIG;
-}
-
-// try to pass some non-trivial arguments to function g2
-const char _expA = 0x42;
-const float _expB = 3.14159;
-const short _expC = 0x55aa;
-const int _expD = 0xdeadbeef;
-void g2(int x, char a, float b, short c, int d) {
-       if (a == _expA && b == _expB && c == _expC && d == _expD)
-               errno = x;
-       else
-               errno = -1;
-}
-*/
-import "C"
-
-import (
-       "syscall"
-       "testing"
-)
-
-func test3729(t *testing.T) {
-       _, e := C.g()
-       if e != syscall.E2BIG {
-               t.Errorf("got %q, expect %q", e, syscall.E2BIG)
-       }
-       _, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
-       if e != syscall.EINVAL {
-               t.Errorf("got %q, expect %q", e, syscall.EINVAL)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue3729w.go b/libgo/misc/cgo/test/issue3729w.go
deleted file mode 100644 (file)
index 69296b5..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 3729: cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test3729(t *testing.T) {
-       t.Log("skip errno test on Windows")
-}
diff --git a/libgo/misc/cgo/test/issue3741.go b/libgo/misc/cgo/test/issue3741.go
deleted file mode 100644 (file)
index 314038c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-//export exportSliceIn
-func exportSliceIn(s []byte) bool {
-       return len(s) == cap(s)
-}
-
-//export exportSliceOut
-func exportSliceOut() []byte {
-       return []byte{1}
-}
-
-//export exportSliceInOut
-func exportSliceInOut(s []byte) []byte {
-       return s
-}
diff --git a/libgo/misc/cgo/test/issue3775.go b/libgo/misc/cgo/test/issue3775.go
deleted file mode 100644 (file)
index 5aca760..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build !android
-
-package cgotest
-
-/*
-void lockOSThreadCallback(void);
-inline static void lockOSThreadC(void)
-{
-        lockOSThreadCallback();
-}
-int usleep(unsigned usec);
-*/
-import "C"
-
-import (
-       "runtime"
-       "testing"
-)
-
-func init() {
-       // Same as test3775 but run during init so that
-       // there are two levels of internal runtime lock
-       // (1 for init, 1 for cgo).
-       // This would have been broken by CL 11663043.
-       C.lockOSThreadC()
-}
-
-func test3775(t *testing.T) {
-       // Used to panic because of the UnlockOSThread below.
-       C.lockOSThreadC()
-}
-
-//export lockOSThreadCallback
-func lockOSThreadCallback() {
-       runtime.LockOSThread()
-       runtime.UnlockOSThread()
-       go C.usleep(10000)
-       runtime.Gosched()
-}
diff --git a/libgo/misc/cgo/test/issue3945.go b/libgo/misc/cgo/test/issue3945.go
deleted file mode 100644 (file)
index 2f9fe23..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test that cgo reserves enough stack space during cgo call.
-// See https://golang.org/issue/3945 for details.
-
-// #include <stdio.h>
-//
-// void say() {
-//    printf("%s from C\n", "hello");
-// }
-//
-import "C"
-
-import "testing"
-
-func testPrintf(t *testing.T) {
-       C.say()
-}
diff --git a/libgo/misc/cgo/test/issue4054a.go b/libgo/misc/cgo/test/issue4054a.go
deleted file mode 100644 (file)
index 2abdac5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef enum {
-       A = 0,
-       B,
-       C,
-       D,
-       E,
-       F,
-       G,
-       H,
-       I,
-       J,
-} issue4054a;
-*/
-import "C"
-
-var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/libgo/misc/cgo/test/issue4054b.go b/libgo/misc/cgo/test/issue4054b.go
deleted file mode 100644 (file)
index 048964c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef enum {
-       A = 0,
-       B,
-       C,
-       D,
-       E,
-       F,
-       G,
-       H,
-       I,
-       J,
-} issue4054b;
-*/
-import "C"
-
-var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/libgo/misc/cgo/test/issue4339.go b/libgo/misc/cgo/test/issue4339.go
deleted file mode 100644 (file)
index 3715fde..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// We've historically permitted #include <>, so test it here.  Issue 29333.
-#include <issue4339.h>
-*/
-import "C"
-
-import "testing"
-
-func test4339(t *testing.T) {
-       C.handle4339(&C.exported4339)
-}
diff --git a/libgo/misc/cgo/test/issue4417.go b/libgo/misc/cgo/test/issue4417.go
deleted file mode 100644 (file)
index 9b18287..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 4417: cmd/cgo: bool alignment/padding issue.
-// bool alignment is wrong and causing wrong arguments when calling functions.
-//
-
-package cgotest
-
-/*
-#include <stdbool.h>
-
-static int c_bool(bool a, bool b, int c, bool d, bool e)  {
-   return c;
-}
-*/
-import "C"
-import "testing"
-
-func testBoolAlign(t *testing.T) {
-       b := C.c_bool(true, true, 10, true, false)
-       if b != 10 {
-               t.Fatalf("found %d expected 10\n", b)
-       }
-       b = C.c_bool(true, true, 5, true, true)
-       if b != 5 {
-               t.Fatalf("found %d expected 5\n", b)
-       }
-       b = C.c_bool(true, true, 3, true, false)
-       if b != 3 {
-               t.Fatalf("found %d expected 3\n", b)
-       }
-       b = C.c_bool(false, false, 1, true, false)
-       if b != 1 {
-               t.Fatalf("found %d expected 1\n", b)
-       }
-       b = C.c_bool(false, true, 200, true, false)
-       if b != 200 {
-               t.Fatalf("found %d expected 200\n", b)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue4857.go b/libgo/misc/cgo/test/issue4857.go
deleted file mode 100644 (file)
index b18979b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#cgo CFLAGS: -Werror
-const struct { int a; } *issue4857() { return (void *)0; }
-*/
-import "C"
-
-func test4857() {
-       _ = C.issue4857()
-}
diff --git a/libgo/misc/cgo/test/issue5227.go b/libgo/misc/cgo/test/issue5227.go
deleted file mode 100644 (file)
index 53c3bf1..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 5227: linker incorrectly treats common symbols and
-// leaves them undefined.
-
-package cgotest
-
-/*
-typedef struct {
-        int Count;
-} Fontinfo;
-
-Fontinfo SansTypeface;
-
-extern void init();
-
-Fontinfo loadfont() {
-        Fontinfo f = {0};
-        return f;
-}
-
-void init() {
-        SansTypeface = loadfont();
-}
-*/
-import "C"
-
-import "testing"
-
-func test5227(t *testing.T) {
-       C.init()
-}
-
-func selectfont() C.Fontinfo {
-       return C.SansTypeface
-}
diff --git a/libgo/misc/cgo/test/issue5242.go b/libgo/misc/cgo/test/issue5242.go
deleted file mode 100644 (file)
index c81cd40..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 5242.  Cgo incorrectly computed the alignment of structs
-// with no Go accessible fields as 0, and then panicked on
-// modulo-by-zero computations.
-
-package cgotest
-
-/*
-typedef struct {
-} foo;
-
-typedef struct {
-       int x : 1;
-} bar;
-
-int issue5242(foo f, bar b) {
-       return 5242;
-}
-*/
-import "C"
-
-import "testing"
-
-func test5242(t *testing.T) {
-       if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
-               t.Errorf("got %v", got)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue5337.go b/libgo/misc/cgo/test/issue5337.go
deleted file mode 100644 (file)
index 9041d95..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-
-static void *thread1(void *p) {
-       (void)p;
-       pthread_kill(pthread_self(), SIGPROF);
-       return NULL;
-}
-void test5337() {
-       pthread_t tid;
-       pthread_create(&tid, 0, thread1, NULL);
-       pthread_join(tid, 0);
-}
-*/
-import "C"
-
-import "testing"
-
-// Verify that we can withstand SIGPROF received on foreign threads
-func test5337(t *testing.T) {
-       C.test5337()
-}
diff --git a/libgo/misc/cgo/test/issue5337w.go b/libgo/misc/cgo/test/issue5337w.go
deleted file mode 100644 (file)
index 7b46757..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test5337(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue5548.go b/libgo/misc/cgo/test/issue5548.go
deleted file mode 100644 (file)
index 0710da7..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-/*
-extern int issue5548_in_c(void);
-*/
-import "C"
-
-//export issue5548FromC
-func issue5548FromC(s string, i int) int {
-       if len(s) == 4 && s == "test" && i == 42 {
-               return 12345
-       }
-       println("got", len(s), i)
-       return 9876
-}
-
-func test5548(t *testing.T) {
-       if x := C.issue5548_in_c(); x != 12345 {
-               t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue5603.go b/libgo/misc/cgo/test/issue5603.go
deleted file mode 100644 (file)
index ab84339..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-const long long issue5603exp = 0x12345678;
-long long issue5603foo0() { return issue5603exp; }
-long long issue5603foo1(void *p) { return issue5603exp; }
-long long issue5603foo2(void *p, void *q) { return issue5603exp; }
-long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
-long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
-*/
-import "C"
-
-import "testing"
-
-func test5603(t *testing.T) {
-       var x [5]int64
-       exp := int64(C.issue5603exp)
-       x[0] = int64(C.issue5603foo0())
-       x[1] = int64(C.issue5603foo1(nil))
-       x[2] = int64(C.issue5603foo2(nil, nil))
-       x[3] = int64(C.issue5603foo3(nil, nil, nil))
-       x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
-       for i, v := range x {
-               if v != exp {
-                       t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue5740.go b/libgo/misc/cgo/test/issue5740.go
deleted file mode 100644 (file)
index 059e316..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// int test5740a(void), test5740b(void);
-import "C"
-import "testing"
-
-func test5740(t *testing.T) {
-       if v := C.test5740a() + C.test5740b(); v != 5 {
-               t.Errorf("expected 5, got %v", v)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue5986.go b/libgo/misc/cgo/test/issue5986.go
deleted file mode 100644 (file)
index 9be1614..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#cgo LDFLAGS: -lm
-#include <stdio.h>
-#include <math.h>
-
-static void output5986()
-{
-    int current_row = 0, row_count = 0;
-    double sum_squares = 0;
-    double d;
-    do {
-        if (current_row == 10) {
-            current_row = 0;
-        }
-        ++row_count;
-    }
-    while (current_row++ != 1);
-    d =  sqrt(sum_squares / row_count);
-    printf("sqrt is: %g\n", d);
-}
-*/
-import "C"
-import "testing"
-
-func test5986(t *testing.T) {
-       C.output5986()
-}
diff --git a/libgo/misc/cgo/test/issue6128.go b/libgo/misc/cgo/test/issue6128.go
deleted file mode 100644 (file)
index 9832d79..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of #defined names in clang.
-// golang.org/issue/6128.
-
-/*
-// NOTE: Must use hex, or else a shortcut for decimals
-// in cgo avoids trying to pass this to clang.
-#define X 0x1
-*/
-import "C"
-
-func test6128() {
-       // nothing to run, just make sure this compiles.
-       _ = C.X
-}
diff --git a/libgo/misc/cgo/test/issue6390.go b/libgo/misc/cgo/test/issue6390.go
deleted file mode 100644 (file)
index 5642899..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-import "testing"
-
-func test6390(t *testing.T) {
-       p1 := C.malloc(1024)
-       if p1 == nil {
-               t.Fatalf("C.malloc(1024) returned nil")
-       }
-       p2 := C.malloc(0)
-       if p2 == nil {
-               t.Fatalf("C.malloc(0) returned nil")
-       }
-       C.free(p1)
-       C.free(p2)
-}
diff --git a/libgo/misc/cgo/test/issue6472.go b/libgo/misc/cgo/test/issue6472.go
deleted file mode 100644 (file)
index d416a05..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef struct
-{
-        struct
-        {
-            int x;
-        } y[16];
-} z;
-*/
-import "C"
-
-func test6472() {
-       // nothing to run, just make sure this compiles
-       s := new(C.z)
-       println(s.y[0].x)
-}
diff --git a/libgo/misc/cgo/test/issue6506.go b/libgo/misc/cgo/test/issue6506.go
deleted file mode 100644 (file)
index c54b54b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of size_t in the face of incorrect clang debug information.
-// golang.org/issue/6506.
-
-/*
-#include <stdlib.h>
-#include <string.h>
-*/
-import "C"
-
-func test6506() {
-       // nothing to run, just make sure this compiles
-       var x C.size_t
-
-       C.calloc(x, x)
-       C.malloc(x)
-       C.realloc(nil, x)
-       C.memcpy(nil, nil, x)
-       C.memcmp(nil, nil, x)
-       C.memmove(nil, nil, x)
-       C.strncpy(nil, nil, x)
-       C.strncmp(nil, nil, x)
-       C.strncat(nil, nil, x)
-       x = C.strxfrm(nil, nil, x)
-       C.memchr(nil, 0, x)
-       x = C.strcspn(nil, nil)
-       x = C.strspn(nil, nil)
-       C.memset(nil, 0, x)
-       x = C.strlen(nil)
-       _ = x
-}
diff --git a/libgo/misc/cgo/test/issue6612.go b/libgo/misc/cgo/test/issue6612.go
deleted file mode 100644 (file)
index 15a12fa..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// golang.org/issue/6612
-// Test new scheme for deciding whether C.name is an expression, type, constant.
-// Clang silences some warnings when the name is a #defined macro, so test those too
-// (even though we now use errors exclusively, not warnings).
-
-package cgotest
-
-/*
-void myfunc(void) {}
-int myvar = 5;
-const char *mytext = "abcdef";
-typedef int mytype;
-enum {
-       myenum = 1234,
-};
-
-#define myfunc_def myfunc
-#define myvar_def myvar
-#define mytext_def mytext
-#define mytype_def mytype
-#define myenum_def myenum
-#define myint_def 12345
-#define myfloat_def 1.5
-#define mystring_def "hello"
-*/
-import "C"
-
-import "testing"
-
-func testNaming(t *testing.T) {
-       C.myfunc()
-       C.myfunc_def()
-       if v := C.myvar; v != 5 {
-               t.Errorf("C.myvar = %d, want 5", v)
-       }
-       if v := C.myvar_def; v != 5 {
-               t.Errorf("C.myvar_def = %d, want 5", v)
-       }
-       if s := C.GoString(C.mytext); s != "abcdef" {
-               t.Errorf("C.mytext = %q, want %q", s, "abcdef")
-       }
-       if s := C.GoString(C.mytext_def); s != "abcdef" {
-               t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
-       }
-       if c := C.myenum; c != 1234 {
-               t.Errorf("C.myenum = %v, want 1234", c)
-       }
-       if c := C.myenum_def; c != 1234 {
-               t.Errorf("C.myenum_def = %v, want 1234", c)
-       }
-       {
-               const c = C.myenum
-               if c != 1234 {
-                       t.Errorf("C.myenum as const = %v, want 1234", c)
-               }
-       }
-       {
-               const c = C.myenum_def
-               if c != 1234 {
-                       t.Errorf("C.myenum as const = %v, want 1234", c)
-               }
-       }
-       if c := C.myint_def; c != 12345 {
-               t.Errorf("C.myint_def = %v, want 12345", c)
-       }
-       {
-               const c = C.myint_def
-               if c != 12345 {
-                       t.Errorf("C.myint as const = %v, want 12345", c)
-               }
-       }
-
-       if c := C.myfloat_def; c != 1.5 {
-               t.Errorf("C.myint_def = %v, want 1.5", c)
-       }
-       {
-               const c = C.myfloat_def
-               if c != 1.5 {
-                       t.Errorf("C.myint as const = %v, want 1.5", c)
-               }
-       }
-
-       if s := C.mystring_def; s != "hello" {
-               t.Errorf("C.mystring_def = %q, want %q", s, "hello")
-       }
-}
diff --git a/libgo/misc/cgo/test/issue6833.go b/libgo/misc/cgo/test/issue6833.go
deleted file mode 100644 (file)
index de60dbf..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern unsigned long long issue6833Func(unsigned int, unsigned long long);
-*/
-import "C"
-
-import "testing"
-
-//export GoIssue6833Func
-func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
-       return aui64 + uint64(aui)
-}
-
-func test6833(t *testing.T) {
-       ui := 7
-       ull := uint64(0x4000300020001000)
-       v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
-       exp := uint64(ui) + ull
-       if v != exp {
-               t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue6907.go b/libgo/misc/cgo/test/issue6907.go
deleted file mode 100644 (file)
index 00495ab..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-#include <string.h>
-
-char* Issue6907CopyString(_GoString_ s) {
-       size_t n;
-       const char *p;
-       char *r;
-
-       n = _GoStringLen(s);
-       p = _GoStringPtr(s);
-       r = malloc(n + 1);
-       memmove(r, p, n);
-       r[n] = '\0';
-       return r;
-}
-*/
-import "C"
-
-import "testing"
-
-func test6907(t *testing.T) {
-       want := "yarn"
-       if got := C.GoString(C.Issue6907CopyString(want)); got != want {
-               t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue6907export.go b/libgo/misc/cgo/test/issue6907export.go
deleted file mode 100644 (file)
index d41899e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern int CheckIssue6907C(_GoString_);
-*/
-import "C"
-
-import (
-       "testing"
-)
-
-const CString = "C string"
-
-//export CheckIssue6907Go
-func CheckIssue6907Go(s string) C.int {
-       if s == CString {
-               return 1
-       }
-       return 0
-}
-
-func test6907Go(t *testing.T) {
-       if got := C.CheckIssue6907C(CString); got != 1 {
-               t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue7560.go b/libgo/misc/cgo/test/issue7560.go
deleted file mode 100644 (file)
index f36d8a1..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-typedef struct {
-       char x;
-       long y;
-} __attribute__((__packed__)) misaligned;
-
-int
-offset7560(void)
-{
-       return (uintptr_t)&((misaligned*)0)->y;
-}
-*/
-import "C"
-
-import (
-       "reflect"
-       "testing"
-)
-
-func test7560(t *testing.T) {
-       // some mingw don't implement __packed__ correctly.
-       if C.offset7560() != 1 {
-               t.Skip("C compiler did not pack struct")
-       }
-
-       // C.misaligned should have x but then a padding field to get to the end of the struct.
-       // There should not be a field named 'y'.
-       var v C.misaligned
-       rt := reflect.TypeOf(&v).Elem()
-       if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
-               t.Errorf("unexpected fields in C.misaligned:\n")
-               for i := 0; i < rt.NumField(); i++ {
-                       t.Logf("%+v\n", rt.Field(i))
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue7665.go b/libgo/misc/cgo/test/issue7665.go
deleted file mode 100644 (file)
index ce03458..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-       "testing"
-       "unsafe"
-)
-
-// extern void f7665(void);
-import "C"
-
-//export f7665
-func f7665() {}
-
-var bad7665 unsafe.Pointer = C.f7665
-var good7665 uintptr = uintptr(C.f7665)
-
-func test7665(t *testing.T) {
-       if bad7665 == nil || uintptr(bad7665) != good7665 {
-               t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue7786.go b/libgo/misc/cgo/test/issue7786.go
deleted file mode 100644 (file)
index 1344e9e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 7786. No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
-
-package cgotest
-
-// struct test7786;
-// typedef struct test7786 typedef_test7786;
-// void f7786(struct test7786 *ctx) {}
-// void g7786(typedef_test7786 *ctx) {}
-//
-// typedef struct body7786 typedef_body7786;
-// struct body7786 { int x; };
-// void b7786(struct body7786 *ctx) {}
-// void c7786(typedef_body7786 *ctx) {}
-//
-// typedef union union7786 typedef_union7786;
-// void u7786(union union7786 *ctx) {}
-// void v7786(typedef_union7786 *ctx) {}
-import "C"
-
-func f() {
-       var x1 *C.typedef_test7786
-       var x2 *C.struct_test7786
-       x1 = x2
-       x2 = x1
-       C.f7786(x1)
-       C.f7786(x2)
-       C.g7786(x1)
-       C.g7786(x2)
-
-       var b1 *C.typedef_body7786
-       var b2 *C.struct_body7786
-       b1 = b2
-       b2 = b1
-       C.b7786(b1)
-       C.b7786(b2)
-       C.c7786(b1)
-       C.c7786(b2)
-
-       var u1 *C.typedef_union7786
-       var u2 *C.union_union7786
-       u1 = u2
-       u2 = u1
-       C.u7786(u1)
-       C.u7786(u2)
-       C.v7786(u1)
-       C.v7786(u2)
-}
diff --git a/libgo/misc/cgo/test/issue7978.go b/libgo/misc/cgo/test/issue7978.go
deleted file mode 100644 (file)
index f0809d3..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 7978.  Stack tracing didn't work during cgo code after calling a Go
-// callback.  Make sure GC works and the stack trace is correct.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-void issue7978cb(void);
-
-// use ugly atomic variable sync since that doesn't require calling back into
-// Go code or OS dependencies
-static void issue7978c(uint32_t *sync) {
-       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 0)
-               ;
-       __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
-       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 2)
-               ;
-       issue7978cb();
-       __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
-       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 6)
-               ;
-}
-*/
-import "C"
-
-import (
-       "runtime"
-       "runtime/debug"
-       "strings"
-       "sync/atomic"
-       "testing"
-)
-
-var issue7978sync uint32
-
-func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
-       runtime.GC()
-       buf := make([]byte, 65536)
-       trace := string(buf[:runtime.Stack(buf, true)])
-       for _, goroutine := range strings.Split(trace, "\n\n") {
-               if strings.Contains(goroutine, "test.issue7978go") {
-                       trace := strings.Split(goroutine, "\n")
-                       // look for the expected function in the stack
-                       for i := 0; i < depth; i++ {
-                               if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
-                                       t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
-                                       return
-                               }
-                               if strings.Contains(trace[1+2*i], wantFunc) {
-                                       return
-                               }
-                       }
-                       t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
-                       return
-               }
-       }
-       t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
-}
-
-func issue7978wait(store uint32, wait uint32) {
-       if store != 0 {
-               atomic.StoreUint32(&issue7978sync, store)
-       }
-       for atomic.LoadUint32(&issue7978sync) != wait {
-               runtime.Gosched()
-       }
-}
-
-//export issue7978cb
-func issue7978cb() {
-       // Force a stack growth from the callback to put extra
-       // pressure on the runtime. See issue #17785.
-       growStack(64)
-       issue7978wait(3, 4)
-}
-
-func growStack(n int) int {
-       var buf [128]int
-       if n == 0 {
-               return 0
-       }
-       return buf[growStack(n-1)]
-}
-
-func issue7978go() {
-       C.issue7978c((*C.uint32_t)(&issue7978sync))
-       issue7978wait(7, 8)
-}
-
-func test7978(t *testing.T) {
-       if runtime.Compiler == "gccgo" {
-               t.Skip("gccgo can not do stack traces of C code")
-       }
-       debug.SetTraceback("2")
-       issue7978sync = 0
-       go issue7978go()
-       // test in c code, before callback
-       issue7978wait(0, 1)
-       issue7978check(t, "_Cfunc_issue7978c(", "", 1)
-       // test in go code, during callback
-       issue7978wait(2, 3)
-       issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
-       // test in c code, after callback
-       issue7978wait(4, 5)
-       issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
-       // test in go code, after return from cgo
-       issue7978wait(6, 7)
-       issue7978check(t, "test.issue7978go(", "", 3)
-       atomic.StoreUint32(&issue7978sync, 8)
-}
diff --git a/libgo/misc/cgo/test/issue8092.go b/libgo/misc/cgo/test/issue8092.go
deleted file mode 100644 (file)
index 19123e7..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8092. Test that linker defined symbols (e.g., text, data) don't
-// conflict with C symbols.
-
-package cgotest
-
-/*
-char text[] = "text";
-char data[] = "data";
-char *ctext(void) { return text; }
-char *cdata(void) { return data; }
-*/
-import "C"
-
-import "testing"
-
-func test8092(t *testing.T) {
-       tests := []struct {
-               s    string
-               a, b *C.char
-       }{
-               {"text", &C.text[0], C.ctext()},
-               {"data", &C.data[0], C.cdata()},
-       }
-       for _, test := range tests {
-               if test.a != test.b {
-                       t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
-               }
-               if got := C.GoString(test.a); got != test.s {
-                       t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue8331a.go b/libgo/misc/cgo/test/issue8331a.go
deleted file mode 100644 (file)
index 92e2579..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8331.  A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-func issue8331a() C.issue8331 {
-       return issue8331Var
-}
diff --git a/libgo/misc/cgo/test/issue8331b.go b/libgo/misc/cgo/test/issue8331b.go
deleted file mode 100644 (file)
index 5324aa2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8331.  A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-var issue8331Var C.issue8331
diff --git a/libgo/misc/cgo/test/issue8428.go b/libgo/misc/cgo/test/issue8428.go
deleted file mode 100644 (file)
index 2e5a555..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This test fails on older versions of OS X because they use older buggy
-// versions of Clang that emit ambiguous DWARF info.  See issue 8611.
-// +build !darwin
-
-package cgotest
-
-// Issue 8428.  Cgo inconsistently translated zero size arrays.
-
-/*
-struct issue8428one {
-       char b;
-       char rest[];
-};
-
-struct issue8428two {
-       void *p;
-       char b;
-       char rest[0];
-       char pad;
-};
-
-struct issue8428three {
-       char w[1][2][3][0];
-       char x[2][3][0][1];
-       char y[3][0][1][2];
-       char z[0][1][2][3];
-};
-*/
-import "C"
-
-import "unsafe"
-
-var _ = C.struct_issue8428one{
-       b: C.char(0),
-       // The trailing rest field is not available in cgo.
-       // See issue 11925.
-       // rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428two{
-       p:    unsafe.Pointer(nil),
-       b:    C.char(0),
-       rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428three{
-       w: [1][2][3][0]C.char{},
-       x: [2][3][0][1]C.char{},
-       y: [3][0][1][2]C.char{},
-       z: [0][1][2][3]C.char{},
-}
diff --git a/libgo/misc/cgo/test/issue8441.go b/libgo/misc/cgo/test/issue8441.go
deleted file mode 100644 (file)
index 4489ca9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8368 and 8441.  Recursive struct definitions didn't work.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef struct one one;
-typedef struct two two;
-struct one {
-       two *x;
-};
-struct two {
-       one *x;
-};
-*/
-import "C"
-
-func issue8368(one *C.struct_one, two *C.struct_two) {
-}
-
-func issue8441(one *C.one, two *C.two) {
-       issue8441(two.x, one.x)
-}
diff --git a/libgo/misc/cgo/test/issue8756.go b/libgo/misc/cgo/test/issue8756.go
deleted file mode 100644 (file)
index d8ee3b8..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-package cgotest
-
-/*
-#cgo LDFLAGS: -lm
-#include <math.h>
-*/
-import "C"
-import (
-       "testing"
-
-       "./issue8756"
-)
-
-func test8756(t *testing.T) {
-       issue8756.Pow()
-       C.pow(1, 2)
-}
diff --git a/libgo/misc/cgo/test/issue8756/issue8756.go b/libgo/misc/cgo/test/issue8756/issue8756.go
deleted file mode 100644 (file)
index 5f6b777..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-package issue8756
-
-/*
-#cgo LDFLAGS: -lm
-#include <math.h>
-*/
-import "C"
-
-func Pow() {
-       C.pow(1, 2)
-}
diff --git a/libgo/misc/cgo/test/issue8811.go b/libgo/misc/cgo/test/issue8811.go
deleted file mode 100644 (file)
index f812732..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern int issue8811Initialized;
-extern void issue8811Init();
-
-void issue8811Execute() {
-       if(!issue8811Initialized)
-               issue8811Init();
-}
-*/
-import "C"
-
-import "testing"
-
-func test8811(t *testing.T) {
-       C.issue8811Execute()
-}
diff --git a/libgo/misc/cgo/test/issue8828.go b/libgo/misc/cgo/test/issue8828.go
deleted file mode 100644 (file)
index 304797c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// compile
-
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8828: compiling a file with -compiler=gccgo fails if a .c file
-// has the same name as compiled directory.
-
-package cgotest
-
-import "./issue8828"
-
-func p() {
-       issue8828.Bar()
-}
diff --git a/libgo/misc/cgo/test/issue8828/issue8828.c b/libgo/misc/cgo/test/issue8828/issue8828.c
deleted file mode 100644 (file)
index 27ec23a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-void foo()
-{
-}
diff --git a/libgo/misc/cgo/test/issue8828/trivial.go b/libgo/misc/cgo/test/issue8828/trivial.go
deleted file mode 100644 (file)
index e7b9a4e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package issue8828
-
-//void foo();
-import "C"
-
-func Bar() {
-       C.foo()
-}
diff --git a/libgo/misc/cgo/test/issue9026.go b/libgo/misc/cgo/test/issue9026.go
deleted file mode 100644 (file)
index 8848d0e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package cgotest
-
-import (
-       "testing"
-
-       "./issue9026"
-)
-
-func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/libgo/misc/cgo/test/issue9026/issue9026.go b/libgo/misc/cgo/test/issue9026/issue9026.go
deleted file mode 100644 (file)
index 149c265..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package issue9026
-
-// This file appears in its own package since the assertion tests the
-// per-package counter used to create fresh identifiers.
-
-/*
-typedef struct {} git_merge_file_input;
-
-typedef struct {} git_merge_file_options;
-
-void git_merge_file(
-        git_merge_file_input *in,
-        git_merge_file_options *opts) {}
-*/
-import "C"
-import (
-       "fmt"
-       "testing"
-)
-
-func Test(t *testing.T) {
-       var in C.git_merge_file_input
-       var opts *C.git_merge_file_options
-       C.git_merge_file(&in, opts)
-
-       // Test that the generated type names are deterministic.
-       // (Previously this would fail about 10% of the time.)
-       //
-       // Brittle: the assertion may fail spuriously when the algorithm
-       // changes, but should remain stable otherwise.
-       got := fmt.Sprintf("%T %T", in, opts)
-       want := "issue9026._Ctype_struct___0 *issue9026._Ctype_struct___0"
-       if got != want {
-               t.Errorf("Non-deterministic type names: got %s, want %s", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/test/issue9400/asm_386.s b/libgo/misc/cgo/test/issue9400/asm_386.s
deleted file mode 100644 (file)
index 7f158b5..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-       MOVL    $·Baton(SB), BX
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADDL    $(1024 * 8), SP
-
-       // Ask signaller to setgid
-       MOVL    $1, (BX)
-
-       // Wait for setgid completion
-loop:
-       PAUSE
-       MOVL    (BX), AX
-       CMPL    AX, $0
-       JNE     loop
-
-       // Restore stack
-       SUBL    $(1024 * 8), SP
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_amd64x.s b/libgo/misc/cgo/test/issue9400/asm_amd64x.s
deleted file mode 100644 (file)
index 48b8619..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64 amd64p32
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADDQ    $(1024 * 8), SP
-
-       // Ask signaller to setgid
-       MOVL    $1, ·Baton(SB)
-
-       // Wait for setgid completion
-loop:
-       PAUSE
-       MOVL    ·Baton(SB), AX
-       CMPL    AX, $0
-       JNE     loop
-
-       // Restore stack
-       SUBQ    $(1024 * 8), SP
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_arm.s b/libgo/misc/cgo/test/issue9400/asm_arm.s
deleted file mode 100644 (file)
index 96c2785..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT cas<>(SB),NOSPLIT,$0
-       MOVW    $0xffff0fc0, R15 // R15 is PC
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-       // Save link register
-       MOVW    R14, R4
-
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADD     $(1024 * 8), R13
-
-       // Ask signaller to setgid
-       MOVW    $·Baton(SB), R2
-storeloop:
-       MOVW    0(R2), R0
-       MOVW    $1, R1
-       BL      cas<>(SB)
-       BCC     storeloop
-
-       // Wait for setgid completion
-loop:
-       MOVW    $0, R0
-       MOVW    $0, R1
-       BL      cas<>(SB)
-       BCC     loop
-
-       // Restore stack
-       SUB     $(1024 * 8), R13
-
-       MOVW    R4, R14
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_arm64.s b/libgo/misc/cgo/test/issue9400/asm_arm64.s
deleted file mode 100644 (file)
index 2ebbfcc..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-       // Save link register
-       MOVD    R30, R9
-
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADD     $(1024 * 8), RSP
-
-       // Ask signaller to setgid
-       MOVD    $·Baton(SB), R0
-       MOVD    $1, R1
-storeloop:
-       LDAXRW  (R0), R2
-       STLXRW  R1, (R0), R3
-       CBNZ    R3, storeloop
-
-       // Wait for setgid completion
-       MOVW    $0, R1
-       MOVW    $0, R2
-loop:
-       LDAXRW  (R0), R3
-       CMPW    R1, R3
-       BNE     loop
-       STLXRW  R2, (R0), R3
-       CBNZ    R3, loop
-
-       // Restore stack
-       SUB     $(1024 * 8), RSP
-
-       MOVD    R9, R30
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_mips64x.s b/libgo/misc/cgo/test/issue9400/asm_mips64x.s
deleted file mode 100644 (file)
index 63dc906..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build mips64 mips64le
-// +build !gccgo
-
-#include "textflag.h"
-
-#define SYNC   WORD $0xf
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADDV    $(1024*8), R29
-
-       // Ask signaller to setgid
-       MOVW    $1, R1
-       SYNC
-       MOVW    R1, ·Baton(SB)
-       SYNC
-
-       // Wait for setgid completion
-loop:
-       SYNC
-       MOVW    ·Baton(SB), R1
-       OR      R2, R2, R2      // hint that we're in a spin loop
-       BNE     R1, loop
-       SYNC
-
-       // Restore stack
-       ADDV    $(-1024*8), R29
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_mipsx.s b/libgo/misc/cgo/test/issue9400/asm_mipsx.s
deleted file mode 100644 (file)
index 7a92735..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build mips mipsle
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADDU    $(1024*8), R29
-
-       // Ask signaller to setgid
-       MOVW    $1, R1
-       SYNC
-       MOVW    R1, ·Baton(SB)
-       SYNC
-
-       // Wait for setgid completion
-loop:
-       SYNC
-       MOVW    ·Baton(SB), R1
-       OR      R2, R2, R2      // hint that we're in a spin loop
-       BNE     R1, loop
-       SYNC
-
-       // Restore stack
-       ADDU    $(-1024*8), R29
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_ppc64x.s b/libgo/misc/cgo/test/issue9400/asm_ppc64x.s
deleted file mode 100644 (file)
index c88ec3b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ppc64 ppc64le
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADD     $(1024 * 8), R1
-
-       // Ask signaller to setgid
-       MOVW    $1, R3
-       SYNC
-       MOVW    R3, ·Baton(SB)
-
-       // Wait for setgid completion
-loop:
-       SYNC
-       MOVW    ·Baton(SB), R3
-       CMP     R3, $0
-       // Hint that we're in a spin loop
-       OR      R1, R1, R1
-       BNE     loop
-       ISYNC
-
-       // Restore stack
-       SUB     $(1024 * 8), R1
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/asm_s390x.s b/libgo/misc/cgo/test/issue9400/asm_s390x.s
deleted file mode 100644 (file)
index fc9ad72..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-       // Rewind stack pointer so anything that happens on the stack
-       // will clobber the test pattern created by the caller
-       ADD     $(1024 * 8), R15
-
-       // Ask signaller to setgid
-       MOVD    $·Baton(SB), R5
-       MOVW    $1, 0(R5)
-
-       // Wait for setgid completion
-loop:
-       SYNC
-       MOVW    ·Baton(SB), R3
-       CMPBNE  R3, $0, loop
-
-       // Restore stack
-       SUB     $(1024 * 8), R15
-       RET
diff --git a/libgo/misc/cgo/test/issue9400/gccgo.go b/libgo/misc/cgo/test/issue9400/gccgo.go
deleted file mode 100644 (file)
index a9b62b0..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-package issue9400
-
-import (
-       "runtime"
-       "sync/atomic"
-)
-
-// The test for the gc compiler resets the stack pointer so that the
-// stack gets modified.  We don't have a way to do that for gccgo
-// without writing more assembly code, which we haven't bothered to
-// do.  So this is not much of a test.
-
-var Baton int32
-
-func RewindAndSetgid() {
-       atomic.StoreInt32(&Baton, 1)
-       for atomic.LoadInt32(&Baton) != 0 {
-               runtime.Gosched()
-       }
-}
diff --git a/libgo/misc/cgo/test/issue9400/stubs.go b/libgo/misc/cgo/test/issue9400/stubs.go
deleted file mode 100644 (file)
index e431c5a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gc
-
-package issue9400
-
-var Baton int32
-
-func RewindAndSetgid()
diff --git a/libgo/misc/cgo/test/issue9400_linux.go b/libgo/misc/cgo/test/issue9400_linux.go
deleted file mode 100644 (file)
index 7719535..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that SIGSETXID runs on signal stack, since it's likely to
-// overflow if it runs on the Go stack.
-
-package cgotest
-
-/*
-#include <sys/types.h>
-#include <unistd.h>
-*/
-import "C"
-
-import (
-       "runtime"
-       "sync/atomic"
-       "testing"
-
-       "./issue9400"
-)
-
-func test9400(t *testing.T) {
-       // We synchronize through a shared variable, so we need two procs
-       defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-
-       // Start signaller
-       atomic.StoreInt32(&issue9400.Baton, 0)
-       go func() {
-               // Wait for RewindAndSetgid
-               for atomic.LoadInt32(&issue9400.Baton) == 0 {
-                       runtime.Gosched()
-               }
-               // Broadcast SIGSETXID
-               runtime.LockOSThread()
-               C.setgid(0)
-               // Indicate that signalling is done
-               atomic.StoreInt32(&issue9400.Baton, 0)
-       }()
-
-       // Grow the stack and put down a test pattern
-       const pattern = 0x123456789abcdef
-       var big [1024]uint64 // len must match assembly
-       for i := range big {
-               big[i] = pattern
-       }
-
-       // Temporarily rewind the stack and trigger SIGSETXID
-       issue9400.RewindAndSetgid()
-
-       // Check test pattern
-       for i := range big {
-               if big[i] != pattern {
-                       t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
-               }
-       }
-}
diff --git a/libgo/misc/cgo/test/issue9510.go b/libgo/misc/cgo/test/issue9510.go
deleted file mode 100644 (file)
index efd3f77..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that we can link together two different cgo packages that both
-// use the same libgcc function.
-
-package cgotest
-
-import (
-       "runtime"
-       "testing"
-
-       "./issue9510a"
-       "./issue9510b"
-)
-
-func test9510(t *testing.T) {
-       if runtime.GOARCH == "arm" {
-               t.Skip("skipping because libgcc may be a Thumb library")
-       }
-       issue9510a.F(1, 1)
-       issue9510b.F(1, 1)
-}
diff --git a/libgo/misc/cgo/test/issue9510a/a.go b/libgo/misc/cgo/test/issue9510a/a.go
deleted file mode 100644 (file)
index 1a5224b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package issue9510a
-
-/*
-static double csquare(double a, double b) {
-       __complex__ double d;
-       __real__ d = a;
-       __imag__ d = b;
-       return __real__ (d * d);
-}
-*/
-import "C"
-
-func F(a, b float64) float64 {
-       return float64(C.csquare(C.double(a), C.double(b)))
-}
diff --git a/libgo/misc/cgo/test/issue9510b/b.go b/libgo/misc/cgo/test/issue9510b/b.go
deleted file mode 100644 (file)
index 5016b39..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package issue9510b
-
-/*
-static double csquare(double a, double b) {
-       __complex__ double d;
-       __real__ d = a;
-       __imag__ d = b;
-       return __real__ (d * d);
-}
-*/
-import "C"
-
-func F(a, b float64) float64 {
-       return float64(C.csquare(C.double(a), C.double(b)))
-}
diff --git a/libgo/misc/cgo/test/issue9557.go b/libgo/misc/cgo/test/issue9557.go
deleted file mode 100644 (file)
index 4e8922a..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo rewrote C.var to *_Cvar_var, but left
-// C.var.field as _Cvar.var.field.  It now rewrites
-// the latter as (*_Cvar_var).field.
-// See https://golang.org/issue/9557.
-
-package cgotest
-
-// struct issue9557_t {
-//   int a;
-// } test9557bar = { 42 };
-//
-// struct issue9557_t *issue9557foo = &test9557bar;
-import "C"
-import "testing"
-
-func test9557(t *testing.T) {
-       // implicitly dereference a Go variable
-       foo := C.issue9557foo
-       if v := foo.a; v != 42 {
-               t.Fatalf("foo.a expected 42, but got %d", v)
-       }
-
-       // explicitly dereference a C variable
-       if v := (*C.issue9557foo).a; v != 42 {
-               t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
-       }
-
-       // implicitly dereference a C variable
-       if v := C.issue9557foo.a; v != 42 {
-               t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
-       }
-}
diff --git a/libgo/misc/cgo/test/overlaydir_test.go b/libgo/misc/cgo/test/overlaydir_test.go
new file mode 100644 (file)
index 0000000..1b5c67d
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/test/pkg_test.go b/libgo/misc/cgo/test/pkg_test.go
new file mode 100644 (file)
index 0000000..08e075c
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import (
+       "io/ioutil"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "testing"
+)
+
+// TestCrossPackageTests compiles and runs tests that depend on imports of other
+// local packages, using source code stored in the testdata directory.
+//
+// The tests in the misc directory tree do not have a valid import path in
+// GOPATH mode, so they previously used relative imports. However, relative
+// imports do not work in module mode. In order to make the test work in both
+// modes, we synthesize a GOPATH in which the module paths are equivalent, and
+// run the tests as a subprocess.
+//
+// If and when we no longer support these tests in GOPATH mode, we can remove
+// this shim and move the tests currently located in testdata back into the
+// parent directory.
+func TestCrossPackageTests(t *testing.T) {
+       switch runtime.GOOS {
+       case "android":
+               t.Skip("Can't exec cmd/go subprocess on Android.")
+       case "darwin":
+               switch runtime.GOARCH {
+               case "arm", "arm64":
+                       t.Skip("Can't exec cmd/go subprocess on iOS.")
+               }
+       }
+
+       GOPATH, err := ioutil.TempDir("", "cgotest")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.RemoveAll(GOPATH)
+
+       modRoot := filepath.Join(GOPATH, "src", "cgotest")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               t.Fatal(err)
+       }
+       if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgotest\n"), 0666); err != nil {
+               t.Fatal(err)
+       }
+
+       cmd := exec.Command("go", "test")
+       if testing.Verbose() {
+               cmd.Args = append(cmd.Args, "-v")
+       }
+       if testing.Short() {
+               cmd.Args = append(cmd.Args, "-short")
+       }
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH, "PWD="+cmd.Dir)
+       out, err := cmd.CombinedOutput()
+       if err == nil {
+               t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+       } else {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+}
index 2b7a1ec9ad0a01e0dcb34f37ca756afbc94011c3..2c9b81ced7a9b550eabf2ff3f545efb098de8689 100644 (file)
@@ -55,7 +55,7 @@ import (
 
 func testSigaltstack(t *testing.T) {
        switch {
-       case runtime.GOOS == "solaris", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
+       case runtime.GOOS == "solaris", runtime.GOOS == "illumos", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
                t.Skipf("switching signal stack not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
        case runtime.GOOS == "darwin" && runtime.GOARCH == "386":
                t.Skipf("sigaltstack fails on darwin/386")
diff --git a/libgo/misc/cgo/test/test.go b/libgo/misc/cgo/test/test.go
new file mode 100644 (file)
index 0000000..2d060bf
--- /dev/null
@@ -0,0 +1,2104 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains C definitions (not just declarations)
+// and so it must NOT contain any //export directives on Go functions.
+// See testx.go for exports.
+
+package cgotest
+
+/*
+#include <complex.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+#cgo LDFLAGS: -lm
+
+#ifndef WIN32
+#include <pthread.h>
+#include <signal.h>
+#endif
+
+// alignment tests
+
+typedef unsigned char Uint8;
+typedef unsigned short Uint16;
+
+typedef enum {
+ MOD1 = 0x0000,
+ MODX = 0x8000
+} SDLMod;
+
+typedef enum {
+ A1 = 1,
+ B1 = 322,
+ SDLK_LAST
+} SDLKey;
+
+typedef struct SDL_keysym {
+       Uint8 scancode;
+       SDLKey sym;
+       SDLMod mod;
+       Uint16 unicode;
+} SDL_keysym;
+
+typedef struct SDL_KeyboardEvent {
+       Uint8 typ;
+       Uint8 which;
+       Uint8 state;
+       SDL_keysym keysym;
+} SDL_KeyboardEvent;
+
+void makeEvent(SDL_KeyboardEvent *event) {
+ unsigned char *p;
+ int i;
+
+ p = (unsigned char*)event;
+ for (i=0; i<sizeof *event; i++) {
+   p[i] = i;
+ }
+}
+
+int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
+  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
+}
+
+void cTest(SDL_KeyboardEvent *event) {
+ printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
+   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
+ fflush(stdout);
+}
+
+// api
+
+const char *greeting = "hello, world";
+
+// basic test cases
+
+#define SHIFT(x, y)  ((x)<<(y))
+#define KILO SHIFT(1, 10)
+#define UINT32VAL 0xc008427bU
+
+enum E {
+       Enum1 = 1,
+       Enum2 = 2,
+};
+
+typedef unsigned char cgo_uuid_t[20];
+
+void uuid_generate(cgo_uuid_t x) {
+       x[0] = 0;
+}
+
+struct S {
+       int x;
+};
+
+const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+int add(int x, int y) {
+       return x+y;
+};
+
+// complex alignment
+
+struct {
+       float x;
+       _Complex float y;
+} cplxAlign = { 3.14, 2.17 };
+
+// constants and pointer checking
+
+#define CheckConstVal 0
+
+typedef struct {
+       int *p;
+} CheckConstStruct;
+
+static void CheckConstFunc(CheckConstStruct *p, int e) {}
+
+// duplicate symbol
+
+int base_symbol = 0;
+#define alias_one base_symbol
+#define alias_two base_symbol
+
+// function pointer variables
+
+typedef int (*intFunc) ();
+
+int
+bridge_int_func(intFunc f)
+{
+       return f();
+}
+
+int fortytwo()
+{
+       return 42;
+}
+
+// issue 1222
+typedef union {
+       long align;
+} xxpthread_mutex_t;
+struct ibv_async_event {
+       union {
+               int x;
+       } element;
+};
+struct ibv_context {
+       xxpthread_mutex_t mutex;
+};
+
+// issue 1635
+// Mac OS X's gcc will generate scattered relocation 2/1 for
+// this function on Darwin/386, and 8l couldn't handle it.
+// this example is in issue 1635
+void scatter() {
+       void *p = scatter;
+       printf("scatter = %p\n", p);
+}
+
+// Adding this explicit extern declaration makes this a test for
+// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
+// It used to cause a cgo error when building with GCC 6.
+extern int hola;
+
+// this example is in issue 3253
+int hola = 0;
+int testHola() { return hola; }
+
+// issue 3250
+#ifdef WIN32
+void testSendSIG() {}
+#else
+static void *thread(void *p) {
+       const int M = 100;
+       int i;
+       (void)p;
+       for (i = 0; i < M; i++) {
+               pthread_kill(pthread_self(), SIGCHLD);
+               usleep(rand() % 20 + 5);
+       }
+       return NULL;
+}
+void testSendSIG() {
+       const int N = 20;
+       int i;
+       pthread_t tid[N];
+       for (i = 0; i < N; i++) {
+               usleep(rand() % 200 + 100);
+               pthread_create(&tid[i], 0, thread, NULL);
+       }
+       for (i = 0; i < N; i++)
+               pthread_join(tid[i], 0);
+}
+#endif
+
+// issue 3261
+// libgcc on ARM might be compiled as thumb code, but our 5l
+// can't handle that, so we have to disable this test on arm.
+#ifdef __ARMEL__
+int vabs(int x) {
+       puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
+       return (x < 0) ? -x : x;
+}
+#elif defined(__arm64__) && defined(__clang__)
+int vabs(int x) {
+       puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
+       return (x < 0) ? -x : x;
+}
+#else
+int __absvsi2(int); // dummy prototype for libgcc function
+// we shouldn't name the function abs, as gcc might use
+// the builtin one.
+int vabs(int x) { return __absvsi2(x); }
+#endif
+
+
+// issue 3729
+// access errno from void C function
+const char _expA = 0x42;
+const float _expB = 3.14159;
+const short _expC = 0x55aa;
+const int _expD = 0xdeadbeef;
+
+#ifdef WIN32
+void g(void) {}
+void g2(int x, char a, float b, short c, int d) {}
+#else
+
+void g(void) {
+       errno = E2BIG;
+}
+
+// try to pass some non-trivial arguments to function g2
+void g2(int x, char a, float b, short c, int d) {
+       if (a == _expA && b == _expB && c == _expC && d == _expD)
+               errno = x;
+       else
+               errno = -1;
+}
+#endif
+
+// issue 3945
+// Test that cgo reserves enough stack space during cgo call.
+// See https://golang.org/issue/3945 for details.
+void say() {
+       printf("%s from C\n", "hello");
+}
+
+// issue 4054 part 1 - other half in testx.go
+
+typedef enum {
+       A = 0,
+       B,
+       C,
+       D,
+       E,
+       F,
+       G,
+       H,
+       II,
+       J,
+} issue4054a;
+
+// issue 4339
+// We've historically permitted #include <>, so test it here.  Issue 29333.
+#include <issue4339.h>
+
+// issue 4417
+// cmd/cgo: bool alignment/padding issue.
+// bool alignment is wrong and causing wrong arguments when calling functions.
+static int c_bool(bool a, bool b, int c, bool d, bool e)  {
+   return c;
+}
+
+// issue 4857
+#cgo CFLAGS: -Werror
+const struct { int a; } *issue4857() { return (void *)0; }
+
+// issue 5224
+// Test that the #cgo CFLAGS directive works,
+// with and without platform filters.
+#cgo CFLAGS: -DCOMMON_VALUE=123
+#cgo windows CFLAGS: -DIS_WINDOWS=1
+#cgo !windows CFLAGS: -DIS_WINDOWS=0
+int common = COMMON_VALUE;
+int is_windows = IS_WINDOWS;
+
+// issue 5227
+// linker incorrectly treats common symbols and
+// leaves them undefined.
+
+typedef struct {
+        int Count;
+} Fontinfo;
+
+Fontinfo SansTypeface;
+
+extern void init();
+
+Fontinfo loadfont() {
+        Fontinfo f = {0};
+        return f;
+}
+
+void init() {
+        SansTypeface = loadfont();
+}
+
+// issue 5242
+// Cgo incorrectly computed the alignment of structs
+// with no Go accessible fields as 0, and then panicked on
+// modulo-by-zero computations.
+typedef struct {
+} foo;
+
+typedef struct {
+       int x : 1;
+} bar;
+
+int issue5242(foo f, bar b) {
+       return 5242;
+}
+
+// issue 5337
+// Verify that we can withstand SIGPROF received on foreign threads
+
+#ifdef WIN32
+void test5337() {}
+#else
+static void *thread1(void *p) {
+       (void)p;
+       pthread_kill(pthread_self(), SIGPROF);
+       return NULL;
+}
+void test5337() {
+       pthread_t tid;
+       pthread_create(&tid, 0, thread1, NULL);
+       pthread_join(tid, 0);
+}
+#endif
+
+// issue 5603
+
+const long long issue5603exp = 0x12345678;
+long long issue5603foo0() { return issue5603exp; }
+long long issue5603foo1(void *p) { return issue5603exp; }
+long long issue5603foo2(void *p, void *q) { return issue5603exp; }
+long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
+long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
+
+// issue 5740
+
+int test5740a(void), test5740b(void);
+
+// issue 5986
+static void output5986()
+{
+    int current_row = 0, row_count = 0;
+    double sum_squares = 0;
+    double d;
+    do {
+        if (current_row == 10) {
+            current_row = 0;
+        }
+        ++row_count;
+    }
+    while (current_row++ != 1);
+    d =  sqrt(sum_squares / row_count);
+    printf("sqrt is: %g\n", d);
+}
+
+// issue 6128
+// Test handling of #defined names in clang.
+// NOTE: Must use hex, or else a shortcut for decimals
+// in cgo avoids trying to pass this to clang.
+#define X 0x1
+
+// issue 6472
+typedef struct
+{
+        struct
+        {
+            int x;
+        } y[16];
+} z;
+
+// issue 6612
+// Test new scheme for deciding whether C.name is an expression, type, constant.
+// Clang silences some warnings when the name is a #defined macro, so test those too
+// (even though we now use errors exclusively, not warnings).
+
+void myfunc(void) {}
+int myvar = 5;
+const char *mytext = "abcdef";
+typedef int mytype;
+enum {
+       myenum = 1234,
+};
+
+#define myfunc_def myfunc
+#define myvar_def myvar
+#define mytext_def mytext
+#define mytype_def mytype
+#define myenum_def myenum
+#define myint_def 12345
+#define myfloat_def 1.5
+#define mystring_def "hello"
+
+// issue 6907
+char* Issue6907CopyString(_GoString_ s) {
+       size_t n;
+       const char *p;
+       char *r;
+
+       n = _GoStringLen(s);
+       p = _GoStringPtr(s);
+       r = malloc(n + 1);
+       memmove(r, p, n);
+       r[n] = '\0';
+       return r;
+}
+
+// issue 7560
+typedef struct {
+       char x;
+       long y;
+} __attribute__((__packed__)) misaligned;
+
+int
+offset7560(void)
+{
+       return (uintptr_t)&((misaligned*)0)->y;
+}
+
+// issue 7786
+// No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
+
+struct test7786;
+typedef struct test7786 typedef_test7786;
+void f7786(struct test7786 *ctx) {}
+void g7786(typedef_test7786 *ctx) {}
+
+typedef struct body7786 typedef_body7786;
+struct body7786 { int x; };
+void b7786(struct body7786 *ctx) {}
+void c7786(typedef_body7786 *ctx) {}
+
+typedef union union7786 typedef_union7786;
+void u7786(union union7786 *ctx) {}
+void v7786(typedef_union7786 *ctx) {}
+
+// issue 8092
+// Test that linker defined symbols (e.g., text, data) don't
+// conflict with C symbols.
+char text[] = "text";
+char data[] = "data";
+char *ctext(void) { return text; }
+char *cdata(void) { return data; }
+
+// issue 8428
+// Cgo inconsistently translated zero size arrays.
+
+struct issue8428one {
+       char b;
+       char rest[];
+};
+
+struct issue8428two {
+       void *p;
+       char b;
+       char rest[0];
+       char pad;
+};
+
+struct issue8428three {
+       char w[1][2][3][0];
+       char x[2][3][0][1];
+       char y[3][0][1][2];
+       char z[0][1][2][3];
+};
+
+// issue 8331 part 1 - part 2 in testx.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 8368 and 8441
+// Recursive struct definitions didn't work.
+// No runtime test; just make sure it compiles.
+typedef struct one one;
+typedef struct two two;
+struct one {
+       two *x;
+};
+struct two {
+       one *x;
+};
+
+// issue 8811
+
+extern int issue8811Initialized;
+extern void issue8811Init();
+
+void issue8811Execute() {
+       if(!issue8811Initialized)
+               issue8811Init();
+}
+
+// issue 9557
+
+struct issue9557_t {
+  int a;
+} test9557bar = { 42 };
+struct issue9557_t *issue9557foo = &test9557bar;
+
+// issue 10303
+// Pointers passed to C were not marked as escaping (bug in cgo).
+
+typedef int *intptr;
+
+void setintstar(int *x) {
+       *x = 1;
+}
+
+void setintptr(intptr x) {
+       *x = 1;
+}
+
+void setvoidptr(void *x) {
+       *(int*)x = 1;
+}
+
+typedef struct Struct Struct;
+struct Struct {
+       int *P;
+};
+
+void setstruct(Struct s) {
+       *s.P = 1;
+}
+
+// issue 11925
+// Structs with zero-length trailing fields are now padded by the Go compiler.
+
+struct a11925 {
+       int i;
+       char a[0];
+       char b[0];
+};
+
+struct b11925 {
+       int i;
+       char a[0];
+       char b[];
+};
+
+// issue 12030
+void issue12030conv(char *buf, double x) {
+       sprintf(buf, "d=%g", x);
+}
+
+// issue 14838
+
+int check_cbytes(char *b, size_t l) {
+       int i;
+       for (i = 0; i < l; i++) {
+               if (b[i] != i) {
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+// issue 17065
+// Test that C symbols larger than a page play nicely with the race detector.
+int ii[65537];
+
+// issue 17537
+// The void* cast introduced by cgo to avoid problems
+// with const/volatile qualifiers breaks C preprocessor macros that
+// emulate functions.
+
+typedef struct {
+       int i;
+} S17537;
+
+int I17537(S17537 *p);
+
+#define I17537(p) ((p)->i)
+
+// Calling this function used to fail without the cast.
+const int F17537(const char **p) {
+       return **p;
+}
+
+// issue 17723
+// API compatibility checks
+
+typedef char *cstring_pointer;
+static void cstring_pointer_fun(cstring_pointer dummy) { }
+const char *api_hello = "hello!";
+
+// Calling this function used to trigger an error from the C compiler
+// (issue 18298).
+void F18298(const void *const *p) {
+}
+
+// Test that conversions between typedefs work as they used to.
+typedef const void *T18298_1;
+struct S18298 { int i; };
+typedef const struct S18298 *T18298_2;
+void G18298(T18298_1 t) {
+}
+
+// issue 18126
+// cgo check of void function returning errno.
+void Issue18126C(void **p) {}
+
+// issue 18720
+
+#define HELLO "hello"
+#define WORLD "world"
+#define HELLO_WORLD HELLO "\000" WORLD
+
+struct foo { char c; };
+#define SIZE_OF(x) sizeof(x)
+#define SIZE_OF_FOO SIZE_OF(struct foo)
+#define VAR1 VAR
+#define VAR var
+int var = 5;
+
+#define ADDR &var
+
+#define CALL fn()
+int fn(void) {
+       return ++var;
+}
+
+// issue 20129
+
+int issue20129 = 0;
+typedef void issue20129Void;
+issue20129Void issue20129Foo() {
+       issue20129 = 1;
+}
+typedef issue20129Void issue20129Void2;
+issue20129Void2 issue20129Bar() {
+       issue20129 = 2;
+}
+
+// issue 20369
+#define XUINT64_MAX        18446744073709551615ULL
+
+// issue 21668
+// Fail to guess the kind of the constant "x".
+// No runtime test; just make sure it compiles.
+const int x21668 = 42;
+
+// issue 21708
+#define CAST_TO_INT64 (int64_t)(-1)
+
+// issue 21809
+// Compile C `typedef` to go type aliases.
+
+typedef long MySigned_t;
+// tests alias-to-alias
+typedef MySigned_t MySigned2_t;
+long takes_long(long x) { return x * x; }
+MySigned_t takes_typedef(MySigned_t x) { return x * x; }
+
+// issue 22906
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+// This is the relevant part of jni.h.
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
+
+// issue 22958
+
+typedef struct {
+       unsigned long long f8  : 8;
+       unsigned long long f16 : 16;
+       unsigned long long f24 : 24;
+       unsigned long long f32 : 32;
+       unsigned long long f40 : 40;
+       unsigned long long f48 : 48;
+       unsigned long long f56 : 56;
+       unsigned long long f64 : 64;
+} issue22958Type;
+
+// issue 23356
+int a(void) { return 5; };
+int r(void) { return 3; };
+
+// issue 23720
+typedef int *issue23720A;
+typedef const int *issue23720B;
+void issue23720F(issue23720B a) {}
+
+// issue 24206
+#if defined(__linux__) && defined(__x86_64__)
+#include <sys/mman.h>
+// Returns string with null byte at the last valid address
+char* dangerousString1() {
+       int pageSize = 4096;
+       char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+       mprotect(data + pageSize,pageSize,PROT_NONE);
+       int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+       int i = start;
+       for (; i < pageSize; i++) {
+       data[i] = 'x';
+       }
+       data[pageSize -1 ] = 0;
+       return data+start;
+}
+
+char* dangerousString2() {
+       int pageSize = 4096;
+       char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+       mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
+       int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+       int i = start;
+       for (; i < 2 * pageSize; i++) {
+       data[i] = 'x';
+       }
+       data[2*pageSize -1 ] = 0;
+       return data+start;
+}
+#else
+char *dangerousString1() { return NULL; }
+char *dangerousString2() { return NULL; }
+#endif
+
+// issue 26066
+const unsigned long long int issue26066 = (const unsigned long long) -1;
+
+// issue 26517
+// Introduce two pointer types which are distinct, but have the same
+// base type. Make sure that both of those pointer types get resolved
+// correctly. Before the fix for 26517 if one of these pointer types
+// was resolved before the other one was processed, the second one
+// would never be resolved.
+// Before this issue was fixed this test failed on Windows,
+// where va_list expands to a named char* type.
+typedef va_list TypeOne;
+typedef char *TypeTwo;
+
+// issue 28540
+
+static void twoargs1(void *p, int n) {}
+static void *twoargs2() { return 0; }
+static int twoargs3(void * p) { return 0; }
+
+// issue 28545
+// Failed to add type conversion for negative constant.
+
+static void issue28545F(char **p, int n, complex double a) {}
+
+// issue 28772 part 1 - part 2 in testx.go
+// Failed to add type conversion for Go constant set to C constant.
+// No runtime test; just make sure it compiles.
+
+#define issue28772Constant 1
+
+// issue 28896
+// cgo was incorrectly adding padding after a packed struct.
+typedef struct {
+       void *f1;
+       uint32_t f2;
+} __attribute__((__packed__)) innerPacked;
+
+typedef struct {
+       innerPacked g1;
+       uint64_t g2;
+} outerPacked;
+
+typedef struct {
+       void *f1;
+       uint32_t f2;
+} innerUnpacked;
+
+typedef struct {
+       innerUnpacked g1;
+       uint64_t g2;
+} outerUnpacked;
+
+size_t offset(int x) {
+       switch (x) {
+       case 0:
+               return offsetof(innerPacked, f2);
+       case 1:
+               return offsetof(outerPacked, g2);
+       case 2:
+               return offsetof(innerUnpacked, f2);
+       case 3:
+               return offsetof(outerUnpacked, g2);
+       default:
+               abort();
+       }
+}
+
+// issue 29748
+
+typedef struct { char **p; } S29748;
+static int f29748(S29748 *p) { return 0; }
+
+// issue 29781
+// Error with newline inserted into constant expression.
+// Compilation test only, nothing to run.
+
+static void issue29781F(char **p, int n) {}
+#define ISSUE29781C 0
+
+// issue 31093
+static uint16_t issue31093F(uint16_t v) { return v; }
+
+// issue 32579
+typedef struct S32579 { unsigned char data[1]; } S32579;
+*/
+import "C"
+
+import (
+       "context"
+       "fmt"
+       "math"
+       "math/rand"
+       "os"
+       "os/signal"
+       "reflect"
+       "runtime"
+       "sync"
+       "syscall"
+       "testing"
+       "time"
+       "unsafe"
+)
+
+// alignment
+
+func testAlign(t *testing.T) {
+       var evt C.SDL_KeyboardEvent
+       C.makeEvent(&evt)
+       if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
+               t.Error("*** bad alignment")
+               C.cTest(&evt)
+               t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
+                       evt.typ, evt.which, evt.state, evt.keysym.scancode,
+                       evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
+               t.Error(evt)
+       }
+}
+
+// api
+
+const greeting = "hello, world"
+
+type testPair struct {
+       Name      string
+       Got, Want interface{}
+}
+
+var testPairs = []testPair{
+       {"GoString", C.GoString(C.greeting), greeting},
+       {"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
+       {"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
+}
+
+func testHelpers(t *testing.T) {
+       for _, pair := range testPairs {
+               if !reflect.DeepEqual(pair.Got, pair.Want) {
+                       t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
+               }
+       }
+}
+
+// basic test cases
+
+const EINVAL = C.EINVAL /* test #define */
+
+var KILO = C.KILO
+
+func uuidgen() {
+       var uuid C.cgo_uuid_t
+       C.uuid_generate(&uuid[0])
+}
+
+func Strtol(s string, base int) (int, error) {
+       p := C.CString(s)
+       n, err := C.strtol(p, nil, C.int(base))
+       C.free(unsafe.Pointer(p))
+       return int(n), err
+}
+
+func Atol(s string) int {
+       p := C.CString(s)
+       n := C.atol(p)
+       C.free(unsafe.Pointer(p))
+       return int(n)
+}
+
+func testConst(t *testing.T) {
+       C.myConstFunc(nil, 0, nil)
+}
+
+func testEnum(t *testing.T) {
+       if C.Enum1 != 1 || C.Enum2 != 2 {
+               t.Error("bad enum", C.Enum1, C.Enum2)
+       }
+}
+
+func testAtol(t *testing.T) {
+       l := Atol("123")
+       if l != 123 {
+               t.Error("Atol 123: ", l)
+       }
+}
+
+func testErrno(t *testing.T) {
+       p := C.CString("no-such-file")
+       m := C.CString("r")
+       f, err := C.fopen(p, m)
+       C.free(unsafe.Pointer(p))
+       C.free(unsafe.Pointer(m))
+       if err == nil {
+               C.fclose(f)
+               t.Fatalf("C.fopen: should fail")
+       }
+       if err != syscall.ENOENT {
+               t.Fatalf("C.fopen: unexpected error: %v", err)
+       }
+}
+
+func testMultipleAssign(t *testing.T) {
+       p := C.CString("234")
+       n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
+       if runtime.GOOS == "openbsd" {
+               // Bug in OpenBSD strtol(3) - base > 36 succeeds.
+               if (n != 0 && n != 239089) || m != 234 {
+                       t.Fatal("Strtol x2: ", n, m)
+               }
+       } else if n != 0 || m != 234 {
+               t.Fatal("Strtol x2: ", n, m)
+       }
+       C.free(unsafe.Pointer(p))
+}
+
+var (
+       cuint  = (C.uint)(0)
+       culong C.ulong
+       cchar  C.char
+)
+
+type Context struct {
+       ctx *C.struct_ibv_context
+}
+
+func benchCgoCall(b *testing.B) {
+       const x = C.int(2)
+       const y = C.int(3)
+       for i := 0; i < b.N; i++ {
+               C.add(x, y)
+       }
+}
+
+var sinkString string
+
+func benchGoString(b *testing.B) {
+       for i := 0; i < b.N; i++ {
+               sinkString = C.GoString(C.cstr)
+       }
+       const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+       if sinkString != want {
+               b.Fatalf("%q != %q", sinkString, want)
+       }
+}
+
+// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
+func sliceOperands(array [2000]int) {
+       _ = array[C.KILO:C.KILO:C.KILO] // no type error
+}
+
+// set in cgo_thread_lock.go init
+var testThreadLockFunc = func(*testing.T) {}
+
+// complex alignment
+
+func TestComplexAlign(t *testing.T) {
+       if C.cplxAlign.x != 3.14 {
+               t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
+       }
+       if C.cplxAlign.y != 2.17 {
+               t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
+       }
+}
+
+// constants and pointer checking
+
+func testCheckConst(t *testing.T) {
+       // The test is that this compiles successfully.
+       p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
+       defer C.free(p)
+       C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
+}
+
+// duplicate symbol
+
+func duplicateSymbols() {
+       fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
+}
+
+// environment
+
+// This is really an os package test but here for convenience.
+func testSetEnv(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               // Go uses SetEnvironmentVariable on windows. However,
+               // C runtime takes a *copy* at process startup of the
+               // OS environment, and stores it in environ/envp.
+               // It is this copy that getenv/putenv manipulate.
+               t.Logf("skipping test")
+               return
+       }
+       const key = "CGO_OS_TEST_KEY"
+       const val = "CGO_OS_TEST_VALUE"
+       os.Setenv(key, val)
+       keyc := C.CString(key)
+       defer C.free(unsafe.Pointer(keyc))
+       v := C.getenv(keyc)
+       if uintptr(unsafe.Pointer(v)) == 0 {
+               t.Fatal("getenv returned NULL")
+       }
+       vs := C.GoString(v)
+       if vs != val {
+               t.Fatalf("getenv() = %q; want %q", vs, val)
+       }
+}
+
+// function pointer variables
+
+func callBridge(f C.intFunc) int {
+       return int(C.bridge_int_func(f))
+}
+
+func callCBridge(f C.intFunc) C.int {
+       return C.bridge_int_func(f)
+}
+
+func testFpVar(t *testing.T) {
+       const expected = 42
+       f := C.intFunc(C.fortytwo)
+       res1 := C.bridge_int_func(f)
+       if r1 := int(res1); r1 != expected {
+               t.Errorf("got %d, want %d", r1, expected)
+       }
+       res2 := callCBridge(f)
+       if r2 := int(res2); r2 != expected {
+               t.Errorf("got %d, want %d", r2, expected)
+       }
+       r3 := callBridge(f)
+       if r3 != expected {
+               t.Errorf("got %d, want %d", r3, expected)
+       }
+}
+
+// issue 1222
+type AsyncEvent struct {
+       event C.struct_ibv_async_event
+}
+
+// issue 1635
+
+func test1635(t *testing.T) {
+       C.scatter()
+       if v := C.hola; v != 0 {
+               t.Fatalf("C.hola is %d, should be 0", v)
+       }
+       if v := C.testHola(); v != 0 {
+               t.Fatalf("C.testHola() is %d, should be 0", v)
+       }
+}
+
+// issue 2470
+
+func testUnsignedInt(t *testing.T) {
+       a := (int64)(C.UINT32VAL)
+       b := (int64)(0xc008427b)
+       if a != b {
+               t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
+       }
+}
+
+// issue 3250
+
+func test3250(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               t.Skip("not applicable on windows")
+       }
+
+       t.Skip("skipped, see golang.org/issue/5885")
+       var (
+               thres = 1
+               sig   = syscall_dot_SIGCHLD
+       )
+       type result struct {
+               n   int
+               sig os.Signal
+       }
+       var (
+               sigCh     = make(chan os.Signal, 10)
+               waitStart = make(chan struct{})
+               waitDone  = make(chan result)
+       )
+
+       signal.Notify(sigCh, sig)
+
+       go func() {
+               n := 0
+               alarm := time.After(time.Second * 3)
+               for {
+                       select {
+                       case <-waitStart:
+                               waitStart = nil
+                       case v := <-sigCh:
+                               n++
+                               if v != sig || n > thres {
+                                       waitDone <- result{n, v}
+                                       return
+                               }
+                       case <-alarm:
+                               waitDone <- result{n, sig}
+                               return
+                       }
+               }
+       }()
+
+       waitStart <- struct{}{}
+       C.testSendSIG()
+       r := <-waitDone
+       if r.sig != sig {
+               t.Fatalf("received signal %v, but want %v", r.sig, sig)
+       }
+       t.Logf("got %d signals\n", r.n)
+       if r.n <= thres {
+               t.Fatalf("expected more than %d", thres)
+       }
+}
+
+// issue 3261
+
+func testLibgcc(t *testing.T) {
+       var table = []struct {
+               in, out C.int
+       }{
+               {0, 0},
+               {1, 1},
+               {-42, 42},
+               {1000300, 1000300},
+               {1 - 1<<31, 1<<31 - 1},
+       }
+       for _, v := range table {
+               if o := C.vabs(v.in); o != v.out {
+                       t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
+                       return
+               }
+       }
+}
+
+// issue 3729
+
+func test3729(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               t.Skip("skipping on windows")
+       }
+
+       _, e := C.g()
+       if e != syscall.E2BIG {
+               t.Errorf("got %q, expect %q", e, syscall.E2BIG)
+       }
+       _, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
+       if e != syscall.EINVAL {
+               t.Errorf("got %q, expect %q", e, syscall.EINVAL)
+       }
+}
+
+// issue 3945
+
+func testPrintf(t *testing.T) {
+       C.say()
+}
+
+// issue 4054
+
+var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
+
+// issue 4339
+
+func test4339(t *testing.T) {
+       C.handle4339(&C.exported4339)
+}
+
+// issue 4417
+
+func testBoolAlign(t *testing.T) {
+       b := C.c_bool(true, true, 10, true, false)
+       if b != 10 {
+               t.Fatalf("found %d expected 10\n", b)
+       }
+       b = C.c_bool(true, true, 5, true, true)
+       if b != 5 {
+               t.Fatalf("found %d expected 5\n", b)
+       }
+       b = C.c_bool(true, true, 3, true, false)
+       if b != 3 {
+               t.Fatalf("found %d expected 3\n", b)
+       }
+       b = C.c_bool(false, false, 1, true, false)
+       if b != 1 {
+               t.Fatalf("found %d expected 1\n", b)
+       }
+       b = C.c_bool(false, true, 200, true, false)
+       if b != 200 {
+               t.Fatalf("found %d expected 200\n", b)
+       }
+}
+
+// issue 4857
+
+func test4857() {
+       _ = C.issue4857()
+}
+
+// issue 5224
+
+func testCflags(t *testing.T) {
+       is_windows := C.is_windows == 1
+       if is_windows != (runtime.GOOS == "windows") {
+               t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
+       }
+       if C.common != 123 {
+               t.Errorf("common: %v (expected 123)", C.common)
+       }
+}
+
+// issue 5227
+
+func test5227(t *testing.T) {
+       C.init()
+}
+
+func selectfont() C.Fontinfo {
+       return C.SansTypeface
+}
+
+// issue 5242
+
+func test5242(t *testing.T) {
+       if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
+               t.Errorf("got %v", got)
+       }
+}
+
+func test5603(t *testing.T) {
+       var x [5]int64
+       exp := int64(C.issue5603exp)
+       x[0] = int64(C.issue5603foo0())
+       x[1] = int64(C.issue5603foo1(nil))
+       x[2] = int64(C.issue5603foo2(nil, nil))
+       x[3] = int64(C.issue5603foo3(nil, nil, nil))
+       x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
+       for i, v := range x {
+               if v != exp {
+                       t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
+               }
+       }
+}
+
+// issue 5337
+
+func test5337(t *testing.T) {
+       C.test5337()
+}
+
+// issue 5740
+
+func test5740(t *testing.T) {
+       if v := C.test5740a() + C.test5740b(); v != 5 {
+               t.Errorf("expected 5, got %v", v)
+       }
+}
+
+// issue 5986
+
+func test5986(t *testing.T) {
+       C.output5986()
+}
+
+// issue 6128
+
+func test6128() {
+       // nothing to run, just make sure this compiles.
+       _ = C.X
+}
+
+// issue 6390
+
+func test6390(t *testing.T) {
+       p1 := C.malloc(1024)
+       if p1 == nil {
+               t.Fatalf("C.malloc(1024) returned nil")
+       }
+       p2 := C.malloc(0)
+       if p2 == nil {
+               t.Fatalf("C.malloc(0) returned nil")
+       }
+       C.free(p1)
+       C.free(p2)
+}
+
+func test6472() {
+       // nothing to run, just make sure this compiles
+       s := new(C.z)
+       println(s.y[0].x)
+}
+
+// issue 6506
+
+func test6506() {
+       // nothing to run, just make sure this compiles
+       var x C.size_t
+
+       C.calloc(x, x)
+       C.malloc(x)
+       C.realloc(nil, x)
+       C.memcpy(nil, nil, x)
+       C.memcmp(nil, nil, x)
+       C.memmove(nil, nil, x)
+       C.strncpy(nil, nil, x)
+       C.strncmp(nil, nil, x)
+       C.strncat(nil, nil, x)
+       x = C.strxfrm(nil, nil, x)
+       C.memchr(nil, 0, x)
+       x = C.strcspn(nil, nil)
+       x = C.strspn(nil, nil)
+       C.memset(nil, 0, x)
+       x = C.strlen(nil)
+       _ = x
+}
+
+// issue 6612
+
+func testNaming(t *testing.T) {
+       C.myfunc()
+       C.myfunc_def()
+       if v := C.myvar; v != 5 {
+               t.Errorf("C.myvar = %d, want 5", v)
+       }
+       if v := C.myvar_def; v != 5 {
+               t.Errorf("C.myvar_def = %d, want 5", v)
+       }
+       if s := C.GoString(C.mytext); s != "abcdef" {
+               t.Errorf("C.mytext = %q, want %q", s, "abcdef")
+       }
+       if s := C.GoString(C.mytext_def); s != "abcdef" {
+               t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
+       }
+       if c := C.myenum; c != 1234 {
+               t.Errorf("C.myenum = %v, want 1234", c)
+       }
+       if c := C.myenum_def; c != 1234 {
+               t.Errorf("C.myenum_def = %v, want 1234", c)
+       }
+       {
+               const c = C.myenum
+               if c != 1234 {
+                       t.Errorf("C.myenum as const = %v, want 1234", c)
+               }
+       }
+       {
+               const c = C.myenum_def
+               if c != 1234 {
+                       t.Errorf("C.myenum as const = %v, want 1234", c)
+               }
+       }
+       if c := C.myint_def; c != 12345 {
+               t.Errorf("C.myint_def = %v, want 12345", c)
+       }
+       {
+               const c = C.myint_def
+               if c != 12345 {
+                       t.Errorf("C.myint as const = %v, want 12345", c)
+               }
+       }
+
+       if c := C.myfloat_def; c != 1.5 {
+               t.Errorf("C.myint_def = %v, want 1.5", c)
+       }
+       {
+               const c = C.myfloat_def
+               if c != 1.5 {
+                       t.Errorf("C.myint as const = %v, want 1.5", c)
+               }
+       }
+
+       if s := C.mystring_def; s != "hello" {
+               t.Errorf("C.mystring_def = %q, want %q", s, "hello")
+       }
+}
+
+// issue 6907
+
+func test6907(t *testing.T) {
+       want := "yarn"
+       if got := C.GoString(C.Issue6907CopyString(want)); got != want {
+               t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
+       }
+}
+
+// issue 7560
+
+func test7560(t *testing.T) {
+       // some mingw don't implement __packed__ correctly.
+       if C.offset7560() != 1 {
+               t.Skip("C compiler did not pack struct")
+       }
+
+       // C.misaligned should have x but then a padding field to get to the end of the struct.
+       // There should not be a field named 'y'.
+       var v C.misaligned
+       rt := reflect.TypeOf(&v).Elem()
+       if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
+               t.Errorf("unexpected fields in C.misaligned:\n")
+               for i := 0; i < rt.NumField(); i++ {
+                       t.Logf("%+v\n", rt.Field(i))
+               }
+       }
+}
+
+// issue 7786
+
+func f() {
+       var x1 *C.typedef_test7786
+       var x2 *C.struct_test7786
+       x1 = x2
+       x2 = x1
+       C.f7786(x1)
+       C.f7786(x2)
+       C.g7786(x1)
+       C.g7786(x2)
+
+       var b1 *C.typedef_body7786
+       var b2 *C.struct_body7786
+       b1 = b2
+       b2 = b1
+       C.b7786(b1)
+       C.b7786(b2)
+       C.c7786(b1)
+       C.c7786(b2)
+
+       var u1 *C.typedef_union7786
+       var u2 *C.union_union7786
+       u1 = u2
+       u2 = u1
+       C.u7786(u1)
+       C.u7786(u2)
+       C.v7786(u1)
+       C.v7786(u2)
+}
+
+// issue 8092
+
+func test8092(t *testing.T) {
+       tests := []struct {
+               s    string
+               a, b *C.char
+       }{
+               {"text", &C.text[0], C.ctext()},
+               {"data", &C.data[0], C.cdata()},
+       }
+       for _, test := range tests {
+               if test.a != test.b {
+                       t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
+               }
+               if got := C.GoString(test.a); got != test.s {
+                       t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
+               }
+       }
+}
+
+// issues 8368 and 8441
+
+func issue8368(one *C.struct_one, two *C.struct_two) {
+}
+
+func issue8441(one *C.one, two *C.two) {
+       issue8441(two.x, one.x)
+}
+
+// issue 8428
+
+var _ = C.struct_issue8428one{
+       b: C.char(0),
+       // The trailing rest field is not available in cgo.
+       // See issue 11925.
+       // rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428two{
+       p:    unsafe.Pointer(nil),
+       b:    C.char(0),
+       rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428three{
+       w: [1][2][3][0]C.char{},
+       x: [2][3][0][1]C.char{},
+       y: [3][0][1][2]C.char{},
+       z: [0][1][2][3]C.char{},
+}
+
+// issue 8811
+
+func test8811(t *testing.T) {
+       C.issue8811Execute()
+}
+
+// issue 9557
+
+func test9557(t *testing.T) {
+       // implicitly dereference a Go variable
+       foo := C.issue9557foo
+       if v := foo.a; v != 42 {
+               t.Fatalf("foo.a expected 42, but got %d", v)
+       }
+
+       // explicitly dereference a C variable
+       if v := (*C.issue9557foo).a; v != 42 {
+               t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
+       }
+
+       // implicitly dereference a C variable
+       if v := C.issue9557foo.a; v != 42 {
+               t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
+       }
+}
+
+// issue 8331 part 1
+
+func issue8331a() C.issue8331 {
+       return issue8331Var
+}
+
+// issue 10303
+
+func test10303(t *testing.T, n int) {
+       if runtime.Compiler == "gccgo" {
+               t.Skip("gccgo permits C pointers on the stack")
+       }
+
+       // Run at a few different stack depths just to avoid an unlucky pass
+       // due to variables ending up on different pages.
+       if n > 0 {
+               test10303(t, n-1)
+       }
+       if t.Failed() {
+               return
+       }
+       var x, y, z, v, si C.int
+       var s C.Struct
+       C.setintstar(&x)
+       C.setintptr(&y)
+       C.setvoidptr(unsafe.Pointer(&v))
+       s.P = &si
+       C.setstruct(s)
+
+       if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+               t.Error("C int* argument on stack")
+       }
+       if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+               t.Error("C intptr argument on stack")
+       }
+       if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+               t.Error("C void* argument on stack")
+       }
+       if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+               t.Error("C struct field pointer on stack")
+       }
+}
+
+// issue 11925
+
+func test11925(t *testing.T) {
+       if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
+               t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
+       }
+       if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
+               t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
+       }
+}
+
+// issue 12030
+
+func test12030(t *testing.T) {
+       buf := (*C.char)(C.malloc(256))
+       defer C.free(unsafe.Pointer(buf))
+       for _, f := range []float64{1.0, 2.0, 3.14} {
+               C.issue12030conv(buf, C.double(f))
+               got := C.GoString(buf)
+               if want := fmt.Sprintf("d=%g", f); got != want {
+                       t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
+               }
+       }
+}
+
+// issue 13402
+
+var _ C.complexfloat
+var _ C.complexdouble
+
+// issue 13930
+// Test that cgo's multiple-value special form for
+// C function calls works in variable declaration statements.
+
+var _, _ = C.abs(0)
+
+// issue 14838
+
+func test14838(t *testing.T) {
+       data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+       cData := C.CBytes(data)
+       defer C.free(cData)
+
+       if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
+               t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
+       }
+}
+
+// issue 17065
+
+var sink C.int
+
+func test17065(t *testing.T) {
+       if runtime.GOOS == "darwin" {
+               t.Skip("broken on darwin; issue 17065")
+       }
+       for i := range C.ii {
+               sink = C.ii[i]
+       }
+}
+
+// issue 17537
+
+func test17537(t *testing.T) {
+       v := C.S17537{i: 17537}
+       if got, want := C.I17537(&v), C.int(17537); got != want {
+               t.Errorf("got %d, want %d", got, want)
+       }
+
+       p := (*C.char)(C.malloc(1))
+       *p = 17
+       if got, want := C.F17537(&p), C.int(17); got != want {
+               t.Errorf("got %d, want %d", got, want)
+       }
+
+       C.F18298(nil)
+       var v18298 C.T18298_2
+       C.G18298(C.T18298_1(v18298))
+}
+
+// issue 17723
+
+func testAPI() {
+       var cs *C.char
+       cs = C.CString("hello")
+       defer C.free(unsafe.Pointer(cs))
+       var s string
+       s = C.GoString((*C.char)(C.api_hello))
+       s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
+       var b []byte
+       b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
+       _, _ = s, b
+       C.cstring_pointer_fun(nil)
+}
+
+// issue 18126
+
+func test18126(t *testing.T) {
+       p := C.malloc(1)
+       _, err := C.Issue18126C(&p)
+       C.free(p)
+       _ = err
+}
+
+// issue 18720
+
+func test18720(t *testing.T) {
+       if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
+               t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
+       }
+
+       if got, want := C.VAR1, C.int(5); got != want {
+               t.Errorf("C.VAR1 == %v, expected %v", got, want)
+       }
+
+       if got, want := *C.ADDR, C.int(5); got != want {
+               t.Errorf("*C.ADDR == %v, expected %v", got, want)
+       }
+
+       if got, want := C.CALL, C.int(6); got != want {
+               t.Errorf("C.CALL == %v, expected %v", got, want)
+       }
+
+       if got, want := C.CALL, C.int(7); got != want {
+               t.Errorf("C.CALL == %v, expected %v", got, want)
+       }
+
+       // Issue 20125.
+       if got, want := C.SIZE_OF_FOO, 1; got != want {
+               t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
+       }
+}
+
+// issue 20129
+
+func test20129(t *testing.T) {
+       if C.issue20129 != 0 {
+               t.Fatal("test is broken")
+       }
+       C.issue20129Foo()
+       if C.issue20129 != 1 {
+               t.Errorf("got %v but expected %v", C.issue20129, 1)
+       }
+       C.issue20129Bar()
+       if C.issue20129 != 2 {
+               t.Errorf("got %v but expected %v", C.issue20129, 2)
+       }
+}
+
+// issue 20369
+
+func test20369(t *testing.T) {
+       if C.XUINT64_MAX != math.MaxUint64 {
+               t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
+       }
+}
+
+// issue 21668
+
+var issue21668_X = C.x21668
+
+// issue 21708
+
+func test21708(t *testing.T) {
+       if got, want := C.CAST_TO_INT64, -1; got != want {
+               t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
+       }
+}
+
+// issue 21809
+
+func test21809(t *testing.T) {
+       longVar := C.long(3)
+       typedefVar := C.MySigned_t(4)
+       typedefTypedefVar := C.MySigned2_t(5)
+
+       // all three should be considered identical to `long`
+       if ret := C.takes_long(longVar); ret != 9 {
+               t.Errorf("got %v but expected %v", ret, 9)
+       }
+       if ret := C.takes_long(typedefVar); ret != 16 {
+               t.Errorf("got %v but expected %v", ret, 16)
+       }
+       if ret := C.takes_long(typedefTypedefVar); ret != 25 {
+               t.Errorf("got %v but expected %v", ret, 25)
+       }
+
+       // They should also be identical to the typedef'd type
+       if ret := C.takes_typedef(longVar); ret != 9 {
+               t.Errorf("got %v but expected %v", ret, 9)
+       }
+       if ret := C.takes_typedef(typedefVar); ret != 16 {
+               t.Errorf("got %v but expected %v", ret, 16)
+       }
+       if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
+               t.Errorf("got %v but expected %v", ret, 25)
+       }
+}
+
+// issue 22906
+
+func test22906(t *testing.T) {
+       var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+       _ = x1
+       var x2 C.jclass = 0
+       _ = x2
+       var x3 C.jthrowable = 0
+       _ = x3
+       var x4 C.jstring = 0
+       _ = x4
+       var x5 C.jarray = 0
+       _ = x5
+       var x6 C.jbooleanArray = 0
+       _ = x6
+       var x7 C.jbyteArray = 0
+       _ = x7
+       var x8 C.jcharArray = 0
+       _ = x8
+       var x9 C.jshortArray = 0
+       _ = x9
+       var x10 C.jintArray = 0
+       _ = x10
+       var x11 C.jlongArray = 0
+       _ = x11
+       var x12 C.jfloatArray = 0
+       _ = x12
+       var x13 C.jdoubleArray = 0
+       _ = x13
+       var x14 C.jobjectArray = 0
+       _ = x14
+       var x15 C.jweak = 0
+       _ = x15
+}
+
+// issue 22958
+// Nothing to run, just make sure this compiles.
+var Vissue22958 C.issue22958Type
+
+func test23356(t *testing.T) {
+       if got, want := C.a(), C.int(5); got != want {
+               t.Errorf("C.a() == %v, expected %v", got, want)
+       }
+       if got, want := C.r(), C.int(3); got != want {
+               t.Errorf("C.r() == %v, expected %v", got, want)
+       }
+}
+
+// issue 23720
+
+func Issue23720F() {
+       var x C.issue23720A
+       C.issue23720F(x)
+}
+
+// issue 24206
+
+func test24206(t *testing.T) {
+       if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
+               t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
+       }
+
+       if l := len(C.GoString(C.dangerousString1())); l != 123 {
+               t.Errorf("Incorrect string length - got %d, want 123", l)
+       }
+       if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
+               t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
+       }
+}
+
+// issue 25143
+
+func issue25143sum(ns ...C.int) C.int {
+       total := C.int(0)
+       for _, n := range ns {
+               total += n
+       }
+       return total
+}
+
+func test25143(t *testing.T) {
+       if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
+               t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
+       }
+}
+
+// issue 26066
+// Wrong type of constant with GCC 8 and newer.
+
+func test26066(t *testing.T) {
+       var i = int64(C.issue26066)
+       if i != -1 {
+               t.Errorf("got %d, want -1", i)
+       }
+}
+
+// issue 26517
+var a C.TypeOne
+var b C.TypeTwo
+
+// issue 27660
+// Stress the interaction between the race detector and cgo in an
+// attempt to reproduce the memory corruption described in #27660.
+// The bug was very timing sensitive; at the time of writing this
+// test would only trigger the bug about once out of every five runs.
+
+func test27660(t *testing.T) {
+       ctx, cancel := context.WithCancel(context.Background())
+       defer cancel()
+       ints := make([]int, 100)
+       locks := make([]sync.Mutex, 100)
+       // Slowly create threads so that ThreadSanitizer is forced to
+       // frequently resize its SyncClocks.
+       for i := 0; i < 100; i++ {
+               go func() {
+                       for ctx.Err() == nil {
+                               // Sleep in C for long enough that it is likely that the runtime
+                               // will retake this goroutine's currently wired P.
+                               C.usleep(1000 /* 1ms */)
+                               runtime.Gosched() // avoid starvation (see #28701)
+                       }
+               }()
+               go func() {
+                       // Trigger lots of synchronization and memory reads/writes to
+                       // increase the likelihood that the race described in #27660
+                       // results in corruption of ThreadSanitizer's internal state
+                       // and thus an assertion failure or segfault.
+                       i := 0
+                       for ctx.Err() == nil {
+                               j := rand.Intn(100)
+                               locks[j].Lock()
+                               ints[j]++
+                               locks[j].Unlock()
+                               // Avoid making the loop unpreemptible
+                               // for gccgo.
+                               if i%0x1000000 == 0 {
+                                       runtime.Gosched()
+                               }
+                               i++
+                       }
+               }()
+               time.Sleep(time.Millisecond)
+       }
+}
+
+// issue 28540
+
+func twoargsF() {
+       v := []string{}
+       C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
+}
+
+// issue 28545
+
+func issue28545G(p **C.char) {
+       C.issue28545F(p, -1, (0))
+       C.issue28545F(p, 2+3, complex(1, 1))
+       C.issue28545F(p, issue28772Constant, issue28772Constant2)
+}
+
+// issue 28772 part 1 - part 2 in testx.go
+
+const issue28772Constant = C.issue28772Constant
+
+// issue 28896
+
+func offset(i int) uintptr {
+       var pi C.innerPacked
+       var po C.outerPacked
+       var ui C.innerUnpacked
+       var uo C.outerUnpacked
+       switch i {
+       case 0:
+               return unsafe.Offsetof(pi.f2)
+       case 1:
+               return unsafe.Offsetof(po.g2)
+       case 2:
+               return unsafe.Offsetof(ui.f2)
+       case 3:
+               return unsafe.Offsetof(uo.g2)
+       default:
+               panic("can't happen")
+       }
+}
+
+func test28896(t *testing.T) {
+       for i := 0; i < 4; i++ {
+               c := uintptr(C.offset(C.int(i)))
+               g := offset(i)
+               if c != g {
+                       t.Errorf("%d: C: %d != Go %d", i, c, g)
+               }
+       }
+}
+
+// issue 29383
+// cgo's /*line*/ comments failed when inserted after '/',
+// because the result looked like a "//" comment.
+// No runtime test; just make sure it compiles.
+
+func Issue29383(n, size uint) int {
+       if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
+               return 0
+       }
+       return 0
+}
+
+// issue 29748
+// Error handling a struct initializer that requires pointer checking.
+// Compilation test only, nothing to run.
+
+var Vissue29748 = C.f29748(&C.S29748{
+       nil,
+})
+
+func Fissue299748() {
+       C.f29748(&C.S29748{
+               nil,
+       })
+}
+
+// issue 29781
+
+var issue29781X struct{ X int }
+
+func issue29781F(...int) int { return 0 }
+
+func issue29781G() {
+       var p *C.char
+       C.issue29781F(&p, C.ISSUE29781C+1)
+       C.issue29781F(nil, (C.int)(
+               0))
+       C.issue29781F(&p, (C.int)(0))
+       C.issue29781F(&p, (C.int)(
+               0))
+       C.issue29781F(&p, (C.int)(issue29781X.
+               X))
+}
+
+// issue 30065
+
+func test30065(t *testing.T) {
+       var a [256]byte
+       b := []byte("a")
+       C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
+       if a[0] != 'a' {
+               t.Errorf("&a failed: got %c, want %c", a[0], 'a')
+       }
+
+       b = []byte("b")
+       C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
+       if a[0] != 'b' {
+               t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
+       }
+
+       d := make([]byte, 256)
+       b = []byte("c")
+       C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
+       if d[0] != 'c' {
+               t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
+       }
+}
+
+// issue 31093
+// No runtime test; just make sure it compiles.
+
+func Issue31093() {
+       C.issue31093F(C.ushort(0))
+}
+
+// issue 32579
+
+func test32579(t *testing.T) {
+       var s [1]C.struct_S32579
+       C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
+       if s[0].data[0] != 1 {
+               t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
+       }
+}
diff --git a/libgo/misc/cgo/test/test22906.go b/libgo/misc/cgo/test/test22906.go
deleted file mode 100644 (file)
index 02bae9c..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-
-package cgotest
-
-/*
-
-// It's going to be hard to include a whole real JVM to test this.
-// So we'll simulate a really easy JVM using just the parts we need.
-
-// This is the relevant part of jni.h.
-
-struct _jobject;
-
-typedef struct _jobject *jobject;
-typedef jobject jclass;
-typedef jobject jthrowable;
-typedef jobject jstring;
-typedef jobject jarray;
-typedef jarray jbooleanArray;
-typedef jarray jbyteArray;
-typedef jarray jcharArray;
-typedef jarray jshortArray;
-typedef jarray jintArray;
-typedef jarray jlongArray;
-typedef jarray jfloatArray;
-typedef jarray jdoubleArray;
-typedef jarray jobjectArray;
-
-typedef jobject jweak;
-
-// Note: jvalue is already a non-pointer type due to it being a C union.
-
-*/
-import "C"
-import (
-       "testing"
-)
-
-func test22906(t *testing.T) {
-       var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
-       _ = x1
-       var x2 C.jclass = 0
-       _ = x2
-       var x3 C.jthrowable = 0
-       _ = x3
-       var x4 C.jstring = 0
-       _ = x4
-       var x5 C.jarray = 0
-       _ = x5
-       var x6 C.jbooleanArray = 0
-       _ = x6
-       var x7 C.jbyteArray = 0
-       _ = x7
-       var x8 C.jcharArray = 0
-       _ = x8
-       var x9 C.jshortArray = 0
-       _ = x9
-       var x10 C.jintArray = 0
-       _ = x10
-       var x11 C.jlongArray = 0
-       _ = x11
-       var x12 C.jfloatArray = 0
-       _ = x12
-       var x13 C.jdoubleArray = 0
-       _ = x13
-       var x14 C.jobjectArray = 0
-       _ = x14
-       var x15 C.jweak = 0
-       _ = x15
-}
diff --git a/libgo/misc/cgo/test/test26213.go b/libgo/misc/cgo/test/test26213.go
deleted file mode 100644 (file)
index 176a7ec..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-       "testing"
-
-       "./issue26213"
-)
-
-func test26213(t *testing.T) {
-       issue26213.Test26213(t)
-}
diff --git a/libgo/misc/cgo/test/test27660.go b/libgo/misc/cgo/test/test27660.go
deleted file mode 100644 (file)
index 0345aa7..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Stress the interaction between the race detector and cgo in an
-// attempt to reproduce the memory corruption described in #27660.
-// The bug was very timing sensitive; at the time of writing this
-// test would only trigger the bug about once out of every five runs.
-
-package cgotest
-
-// #include <unistd.h>
-import "C"
-
-import (
-       "context"
-       "math/rand"
-       "runtime"
-       "sync"
-       "testing"
-       "time"
-)
-
-func test27660(t *testing.T) {
-       ctx, cancel := context.WithCancel(context.Background())
-       defer cancel()
-       ints := make([]int, 100)
-       locks := make([]sync.Mutex, 100)
-       // Slowly create threads so that ThreadSanitizer is forced to
-       // frequently resize its SyncClocks.
-       for i := 0; i < 100; i++ {
-               go func() {
-                       for ctx.Err() == nil {
-                               // Sleep in C for long enough that it is likely that the runtime
-                               // will retake this goroutine's currently wired P.
-                               C.usleep(1000 /* 1ms */)
-                               runtime.Gosched() // avoid starvation (see #28701)
-                       }
-               }()
-               go func() {
-                       // Trigger lots of synchronization and memory reads/writes to
-                       // increase the likelihood that the race described in #27660
-                       // results in corruption of ThreadSanitizer's internal state
-                       // and thus an assertion failure or segfault.
-                       i := 0
-                       for ctx.Err() == nil {
-                               j := rand.Intn(100)
-                               locks[j].Lock()
-                               ints[j]++
-                               locks[j].Unlock()
-                               // Avoid making the loop unpreemptible
-                               // for gccgo.
-                               if i%0x1000000 == 0 {
-                                       runtime.Gosched()
-                               }
-                               i++
-                       }
-               }()
-               time.Sleep(time.Millisecond)
-       }
-}
diff --git a/libgo/misc/cgo/test/test_unix.go b/libgo/misc/cgo/test/test_unix.go
new file mode 100644 (file)
index 0000000..4a23446
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !windows
+
+package cgotest
+
+import "syscall"
+
+var syscall_dot_SIGCHLD = syscall.SIGCHLD
diff --git a/libgo/misc/cgo/test/test_windows.go b/libgo/misc/cgo/test/test_windows.go
new file mode 100644 (file)
index 0000000..7bfb33a
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import "syscall"
+
+var syscall_dot_SIGCHLD syscall.Signal
diff --git a/libgo/misc/cgo/test/testdata/cgo_linux_test.go b/libgo/misc/cgo/test/testdata/cgo_linux_test.go
new file mode 100644 (file)
index 0000000..5cef09f
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import "testing"
+
+func Test9400(t *testing.T) { test9400(t) }
diff --git a/libgo/misc/cgo/test/testdata/cgo_test.go b/libgo/misc/cgo/test/testdata/cgo_test.go
new file mode 100644 (file)
index 0000000..ffa076f
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import "testing"
+
+// The actual test functions are in non-_test.go files
+// so that they can use cgo (import "C").
+// These wrappers are here for gotest to find.
+
+func Test8756(t *testing.T)     { test8756(t) }
+func Test9026(t *testing.T)     { test9026(t) }
+func Test9510(t *testing.T)     { test9510(t) }
+func Test20266(t *testing.T)    { test20266(t) }
+func Test26213(t *testing.T)    { test26213(t) }
+func TestGCC68255(t *testing.T) { testGCC68255(t) }
diff --git a/libgo/misc/cgo/test/testdata/gcc68255.go b/libgo/misc/cgo/test/testdata/gcc68255.go
new file mode 100644 (file)
index 0000000..b431462
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import (
+       "testing"
+
+       "cgotest/gcc68255"
+)
+
+func testGCC68255(t *testing.T) {
+       if !gcc68255.F() {
+               t.Error("C global variable was not initialized")
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/gcc68255/a.go b/libgo/misc/cgo/test/testdata/gcc68255/a.go
new file mode 100644 (file)
index 0000000..e106dee
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that it's OK to have C code that does nothing other than
+// initialize a global variable.  This used to fail with gccgo.
+
+package gcc68255
+
+/*
+#include "c.h"
+*/
+import "C"
+
+func F() bool {
+       return C.v != nil
+}
diff --git a/libgo/misc/cgo/test/testdata/gcc68255/c.c b/libgo/misc/cgo/test/testdata/gcc68255/c.c
new file mode 100644 (file)
index 0000000..a4fe193
--- /dev/null
@@ -0,0 +1,8 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+static void f(void) {
+}
+
+void (*v)(void) = f;
diff --git a/libgo/misc/cgo/test/testdata/gcc68255/c.h b/libgo/misc/cgo/test/testdata/gcc68255/c.h
new file mode 100644 (file)
index 0000000..05ecd81
--- /dev/null
@@ -0,0 +1,5 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+extern void (*v)(void);
diff --git a/libgo/misc/cgo/test/testdata/issue20266.go b/libgo/misc/cgo/test/testdata/issue20266.go
new file mode 100644 (file)
index 0000000..9f95086
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 20266: use -I with a relative path.
+
+package cgotest
+
+/*
+#cgo CFLAGS: -I issue20266 -Iissue20266 -Ddef20266
+#include "issue20266.h"
+*/
+import "C"
+
+import "testing"
+
+func test20266(t *testing.T) {
+       if got, want := C.issue20266, 20266; got != want {
+               t.Errorf("got %d, want %d", got, want)
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/issue20266/issue20266.h b/libgo/misc/cgo/test/testdata/issue20266/issue20266.h
new file mode 100644 (file)
index 0000000..8d3258e
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#define issue20266 20266
+
+#ifndef def20266
+#error "expected def20266 to be defined"
+#endif
diff --git a/libgo/misc/cgo/test/testdata/issue23555.go b/libgo/misc/cgo/test/testdata/issue23555.go
new file mode 100644 (file)
index 0000000..4e944b5
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that we can have two identical cgo packages in a single binary.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue23555a"
+import _ "cgotest/issue23555b"
diff --git a/libgo/misc/cgo/test/testdata/issue23555a/a.go b/libgo/misc/cgo/test/testdata/issue23555a/a.go
new file mode 100644 (file)
index 0000000..cb6626b
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue23555
+
+// #include <stdlib.h>
+import "C"
+
+func X() {
+       C.free(C.malloc(10))
+}
diff --git a/libgo/misc/cgo/test/testdata/issue23555b/a.go b/libgo/misc/cgo/test/testdata/issue23555b/a.go
new file mode 100644 (file)
index 0000000..cb6626b
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue23555
+
+// #include <stdlib.h>
+import "C"
+
+func X() {
+       C.free(C.malloc(10))
+}
diff --git a/libgo/misc/cgo/test/testdata/issue24161_darwin_test.go b/libgo/misc/cgo/test/testdata/issue24161_darwin_test.go
new file mode 100644 (file)
index 0000000..64f4442
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// See issue21897.go and golang.org/issue/26475 for why this is
+// skipped in race mode.
+//
+// TODO(austin): Once support for macOS 10.10 is dropped, remove the
+// race constraint. See golang.org/issue/26513.
+
+// +build !race
+
+package cgotest
+
+import (
+       "testing"
+
+       "cgotest/issue24161arg"
+       "cgotest/issue24161e0"
+       "cgotest/issue24161e1"
+       "cgotest/issue24161e2"
+       "cgotest/issue24161res"
+)
+
+func Test24161Arg(t *testing.T) {
+       issue24161arg.Test(t)
+}
+func Test24161Res(t *testing.T) {
+       issue24161res.Test(t)
+}
+func Test24161Example0(t *testing.T) {
+       issue24161e0.Test(t)
+}
+func Test24161Example1(t *testing.T) {
+       issue24161e1.Test(t)
+}
+func Test24161Example2(t *testing.T) {
+       issue24161e2.Test(t)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue24161arg/def.go b/libgo/misc/cgo/test/testdata/issue24161arg/def.go
new file mode 100644 (file)
index 0000000..d33479a
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+
+func test24161array() C.CFArrayRef {
+       return C.CFArrayCreate(0, nil, 0, nil)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue24161arg/use.go b/libgo/misc/cgo/test/testdata/issue24161arg/use.go
new file mode 100644 (file)
index 0000000..3e74944
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import "testing"
+
+func Test(t *testing.T) {
+       a := test24161array()
+       C.CFArrayCreateCopy(0, a)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue24161e0/main.go b/libgo/misc/cgo/test/testdata/issue24161e0/main.go
new file mode 100644 (file)
index 0000000..cbc1dee
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161e0
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import "testing"
+
+func f1() {
+       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/testdata/issue24161e1/main.go b/libgo/misc/cgo/test/testdata/issue24161e1/main.go
new file mode 100644 (file)
index 0000000..eb48fc0
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161e1
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+       "fmt"
+       "testing"
+)
+
+func f1() {
+       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+       if desc := C.CFErrorCopyDescription(e); desc != 0 {
+               fmt.Println(desc)
+       }
+}
+
+func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/testdata/issue24161e2/main.go b/libgo/misc/cgo/test/testdata/issue24161e2/main.go
new file mode 100644 (file)
index 0000000..1951c86
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161e2
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+       "fmt"
+       "testing"
+)
+
+var _ C.CFStringRef
+
+func f1() {
+       C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+       if desc := C.CFErrorCopyDescription(e); desc != 0 {
+               fmt.Println(desc)
+       }
+}
+
+func Test(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/testdata/issue24161res/restype.go b/libgo/misc/cgo/test/testdata/issue24161res/restype.go
new file mode 100644 (file)
index 0000000..e5719f2
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package issue24161res
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import (
+       "reflect"
+       "testing"
+)
+
+func Test(t *testing.T) {
+       if k := reflect.TypeOf(C.CFArrayCreate(0, nil, 0, nil)).Kind(); k != reflect.Uintptr {
+               t.Fatalf("bad kind %s\n", k)
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/issue26213/jni.h b/libgo/misc/cgo/test/testdata/issue26213/jni.h
new file mode 100644 (file)
index 0000000..0c76979
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+
+// This is the relevant part of jni.h.
+
+// On Android NDK16, jobject is defined like this in C and C++
+typedef void* jobject;
+
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
diff --git a/libgo/misc/cgo/test/testdata/issue26213/test26213.go b/libgo/misc/cgo/test/testdata/issue26213/test26213.go
new file mode 100644 (file)
index 0000000..5d1f637
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue26213
+
+/*
+#include "jni.h"
+*/
+import "C"
+import (
+       "testing"
+)
+
+func Test26213(t *testing.T) {
+       var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+       _ = x1
+       var x2 C.jclass = 0
+       _ = x2
+       var x3 C.jthrowable = 0
+       _ = x3
+       var x4 C.jstring = 0
+       _ = x4
+       var x5 C.jarray = 0
+       _ = x5
+       var x6 C.jbooleanArray = 0
+       _ = x6
+       var x7 C.jbyteArray = 0
+       _ = x7
+       var x8 C.jcharArray = 0
+       _ = x8
+       var x9 C.jshortArray = 0
+       _ = x9
+       var x10 C.jintArray = 0
+       _ = x10
+       var x11 C.jlongArray = 0
+       _ = x11
+       var x12 C.jfloatArray = 0
+       _ = x12
+       var x13 C.jdoubleArray = 0
+       _ = x13
+       var x14 C.jobjectArray = 0
+       _ = x14
+       var x15 C.jweak = 0
+       _ = x15
+}
diff --git a/libgo/misc/cgo/test/testdata/issue26430.go b/libgo/misc/cgo/test/testdata/issue26430.go
new file mode 100644 (file)
index 0000000..14c7a7c
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 26430: incomplete typedef leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue26430"
diff --git a/libgo/misc/cgo/test/testdata/issue26430/a.go b/libgo/misc/cgo/test/testdata/issue26430/a.go
new file mode 100644 (file)
index 0000000..fbaa46b
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+// typedef struct S ST;
+// static ST* F() { return 0; }
+import "C"
+
+func F1() {
+       C.F()
+}
diff --git a/libgo/misc/cgo/test/testdata/issue26430/b.go b/libgo/misc/cgo/test/testdata/issue26430/b.go
new file mode 100644 (file)
index 0000000..a7c527c
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+// typedef struct S ST;
+// struct S { int f; };
+import "C"
+
+func F2(p *C.ST) {
+       p.f = 1
+}
diff --git a/libgo/misc/cgo/test/testdata/issue26743.go b/libgo/misc/cgo/test/testdata/issue26743.go
new file mode 100644 (file)
index 0000000..000fb2b
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 26743: typedef of uint leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue26743"
diff --git a/libgo/misc/cgo/test/testdata/issue26743/a.go b/libgo/misc/cgo/test/testdata/issue26743/a.go
new file mode 100644 (file)
index 0000000..a3df179
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue26743
+
+// typedef unsigned int uint;
+// int C1(uint x) { return x; }
+import "C"
+
+var V1 = C.C1(0)
diff --git a/libgo/misc/cgo/test/testdata/issue26743/b.go b/libgo/misc/cgo/test/testdata/issue26743/b.go
new file mode 100644 (file)
index 0000000..c5f1ae4
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue26743
+
+import "C"
+
+var V2 C.uint
diff --git a/libgo/misc/cgo/test/testdata/issue27054/egl.h b/libgo/misc/cgo/test/testdata/issue27054/egl.h
new file mode 100644 (file)
index 0000000..33a759e
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This is the relevant part of EGL/egl.h.
+
+typedef void *EGLDisplay;
diff --git a/libgo/misc/cgo/test/testdata/issue27054/test27054.go b/libgo/misc/cgo/test/testdata/issue27054/test27054.go
new file mode 100644 (file)
index 0000000..186f5bd
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue27054
+
+/*
+#include "egl.h"
+*/
+import "C"
+import (
+       "testing"
+)
+
+func Test27054(t *testing.T) {
+       var _ C.EGLDisplay = 0 // Note: 0, not nil. That makes sure we use uintptr for this type.
+}
diff --git a/libgo/misc/cgo/test/testdata/issue27340.go b/libgo/misc/cgo/test/testdata/issue27340.go
new file mode 100644 (file)
index 0000000..337550f
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Failed to resolve typedefs consistently.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import "cgotest/issue27340"
+
+var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/libgo/misc/cgo/test/testdata/issue27340/a.go b/libgo/misc/cgo/test/testdata/issue27340/a.go
new file mode 100644 (file)
index 0000000..f5b120c
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Failed to resolve typedefs consistently.
+// No runtime test; just make sure it compiles.
+// In separate directory to isolate #pragma GCC diagnostic.
+
+package issue27340
+
+// We use the #pragma to avoid a compiler warning about incompatible
+// pointer types, because we generate code passing a struct ptr rather
+// than using the typedef. This warning is expected and does not break
+// a normal build.
+// We can only disable -Wincompatible-pointer-types starting with GCC 5.
+
+// #if __GNU_MAJOR__ >= 5
+//
+// #pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
+//
+// typedef struct {
+//     int a;
+// } issue27340Struct, *issue27340Ptr;
+//
+// static void issue27340CFunc(issue27340Ptr p) {}
+//
+// #else /* _GNU_MAJOR_ < 5 */
+//
+// typedef struct {
+//     int a;
+// } issue27340Struct;
+//
+// static issue27340Struct* issue27340Ptr(issue27340Struct* p) { return p; }
+//
+// static void issue27340CFunc(issue27340Struct *p) {}
+// #endif /* _GNU_MAJOR_ < 5 */
+import "C"
+
+func Issue27340GoFunc() {
+       var s C.issue27340Struct
+       C.issue27340CFunc(C.issue27340Ptr(&s))
+}
diff --git a/libgo/misc/cgo/test/testdata/issue29563.go b/libgo/misc/cgo/test/testdata/issue29563.go
new file mode 100644 (file)
index 0000000..84def3c
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !windows
+
+// Issue 29563: internal linker fails on duplicate weak symbols.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue29563"
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak.go b/libgo/misc/cgo/test/testdata/issue29563/weak.go
new file mode 100644 (file)
index 0000000..21cf635
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue29563
+
+//int foo1();
+//int foo2();
+import "C"
+
+func Bar() int {
+       return int(C.foo1()) + int(C.foo2())
+}
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak1.c b/libgo/misc/cgo/test/testdata/issue29563/weak1.c
new file mode 100644 (file)
index 0000000..86a2273
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo1()
+{
+       return weaksym;
+}
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak2.c b/libgo/misc/cgo/test/testdata/issue29563/weak2.c
new file mode 100644 (file)
index 0000000..e01eae8
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo2()
+{
+       return weaksym;
+}
diff --git a/libgo/misc/cgo/test/testdata/issue8756.go b/libgo/misc/cgo/test/testdata/issue8756.go
new file mode 100644 (file)
index 0000000..406c64c
--- /dev/null
@@ -0,0 +1,17 @@
+package cgotest
+
+/*
+#cgo LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+import (
+       "testing"
+
+       "cgotest/issue8756"
+)
+
+func test8756(t *testing.T) {
+       issue8756.Pow()
+       C.pow(1, 2)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue8756/issue8756.go b/libgo/misc/cgo/test/testdata/issue8756/issue8756.go
new file mode 100644 (file)
index 0000000..5f6b777
--- /dev/null
@@ -0,0 +1,11 @@
+package issue8756
+
+/*
+#cgo LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+
+func Pow() {
+       C.pow(1, 2)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue8828.go b/libgo/misc/cgo/test/testdata/issue8828.go
new file mode 100644 (file)
index 0000000..0bca0f2
--- /dev/null
@@ -0,0 +1,16 @@
+// compile
+
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 8828: compiling a file with -compiler=gccgo fails if a .c file
+// has the same name as compiled directory.
+
+package cgotest
+
+import "cgotest/issue8828"
+
+func p() {
+       issue8828.Bar()
+}
diff --git a/libgo/misc/cgo/test/testdata/issue8828/issue8828.c b/libgo/misc/cgo/test/testdata/issue8828/issue8828.c
new file mode 100644 (file)
index 0000000..27ec23a
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+void foo()
+{
+}
diff --git a/libgo/misc/cgo/test/testdata/issue8828/trivial.go b/libgo/misc/cgo/test/testdata/issue8828/trivial.go
new file mode 100644 (file)
index 0000000..e7b9a4e
--- /dev/null
@@ -0,0 +1,8 @@
+package issue8828
+
+//void foo();
+import "C"
+
+func Bar() {
+       C.foo()
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9026.go b/libgo/misc/cgo/test/testdata/issue9026.go
new file mode 100644 (file)
index 0000000..3f48881
--- /dev/null
@@ -0,0 +1,9 @@
+package cgotest
+
+import (
+       "testing"
+
+       "cgotest/issue9026"
+)
+
+func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/libgo/misc/cgo/test/testdata/issue9026/issue9026.go b/libgo/misc/cgo/test/testdata/issue9026/issue9026.go
new file mode 100644 (file)
index 0000000..149c265
--- /dev/null
@@ -0,0 +1,36 @@
+package issue9026
+
+// This file appears in its own package since the assertion tests the
+// per-package counter used to create fresh identifiers.
+
+/*
+typedef struct {} git_merge_file_input;
+
+typedef struct {} git_merge_file_options;
+
+void git_merge_file(
+        git_merge_file_input *in,
+        git_merge_file_options *opts) {}
+*/
+import "C"
+import (
+       "fmt"
+       "testing"
+)
+
+func Test(t *testing.T) {
+       var in C.git_merge_file_input
+       var opts *C.git_merge_file_options
+       C.git_merge_file(&in, opts)
+
+       // Test that the generated type names are deterministic.
+       // (Previously this would fail about 10% of the time.)
+       //
+       // Brittle: the assertion may fail spuriously when the algorithm
+       // changes, but should remain stable otherwise.
+       got := fmt.Sprintf("%T %T", in, opts)
+       want := "issue9026._Ctype_struct___0 *issue9026._Ctype_struct___0"
+       if got != want {
+               t.Errorf("Non-deterministic type names: got %s, want %s", got, want)
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_386.s b/libgo/misc/cgo/test/testdata/issue9400/asm_386.s
new file mode 100644 (file)
index 0000000..7f158b5
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+       MOVL    $·Baton(SB), BX
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADDL    $(1024 * 8), SP
+
+       // Ask signaller to setgid
+       MOVL    $1, (BX)
+
+       // Wait for setgid completion
+loop:
+       PAUSE
+       MOVL    (BX), AX
+       CMPL    AX, $0
+       JNE     loop
+
+       // Restore stack
+       SUBL    $(1024 * 8), SP
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s
new file mode 100644 (file)
index 0000000..48b8619
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64 amd64p32
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADDQ    $(1024 * 8), SP
+
+       // Ask signaller to setgid
+       MOVL    $1, ·Baton(SB)
+
+       // Wait for setgid completion
+loop:
+       PAUSE
+       MOVL    ·Baton(SB), AX
+       CMPL    AX, $0
+       JNE     loop
+
+       // Restore stack
+       SUBQ    $(1024 * 8), SP
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_arm.s b/libgo/misc/cgo/test/testdata/issue9400/asm_arm.s
new file mode 100644 (file)
index 0000000..96c2785
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT cas<>(SB),NOSPLIT,$0
+       MOVW    $0xffff0fc0, R15 // R15 is PC
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+       // Save link register
+       MOVW    R14, R4
+
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADD     $(1024 * 8), R13
+
+       // Ask signaller to setgid
+       MOVW    $·Baton(SB), R2
+storeloop:
+       MOVW    0(R2), R0
+       MOVW    $1, R1
+       BL      cas<>(SB)
+       BCC     storeloop
+
+       // Wait for setgid completion
+loop:
+       MOVW    $0, R0
+       MOVW    $0, R1
+       BL      cas<>(SB)
+       BCC     loop
+
+       // Restore stack
+       SUB     $(1024 * 8), R13
+
+       MOVW    R4, R14
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s b/libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s
new file mode 100644 (file)
index 0000000..2ebbfcc
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+       // Save link register
+       MOVD    R30, R9
+
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADD     $(1024 * 8), RSP
+
+       // Ask signaller to setgid
+       MOVD    $·Baton(SB), R0
+       MOVD    $1, R1
+storeloop:
+       LDAXRW  (R0), R2
+       STLXRW  R1, (R0), R3
+       CBNZ    R3, storeloop
+
+       // Wait for setgid completion
+       MOVW    $0, R1
+       MOVW    $0, R2
+loop:
+       LDAXRW  (R0), R3
+       CMPW    R1, R3
+       BNE     loop
+       STLXRW  R2, (R0), R3
+       CBNZ    R3, loop
+
+       // Restore stack
+       SUB     $(1024 * 8), RSP
+
+       MOVD    R9, R30
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s
new file mode 100644 (file)
index 0000000..63dc906
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2016 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips64 mips64le
+// +build !gccgo
+
+#include "textflag.h"
+
+#define SYNC   WORD $0xf
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADDV    $(1024*8), R29
+
+       // Ask signaller to setgid
+       MOVW    $1, R1
+       SYNC
+       MOVW    R1, ·Baton(SB)
+       SYNC
+
+       // Wait for setgid completion
+loop:
+       SYNC
+       MOVW    ·Baton(SB), R1
+       OR      R2, R2, R2      // hint that we're in a spin loop
+       BNE     R1, loop
+       SYNC
+
+       // Restore stack
+       ADDV    $(-1024*8), R29
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s b/libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s
new file mode 100644 (file)
index 0000000..7a92735
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips mipsle
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADDU    $(1024*8), R29
+
+       // Ask signaller to setgid
+       MOVW    $1, R1
+       SYNC
+       MOVW    R1, ·Baton(SB)
+       SYNC
+
+       // Wait for setgid completion
+loop:
+       SYNC
+       MOVW    ·Baton(SB), R1
+       OR      R2, R2, R2      // hint that we're in a spin loop
+       BNE     R1, loop
+       SYNC
+
+       // Restore stack
+       ADDU    $(-1024*8), R29
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s
new file mode 100644 (file)
index 0000000..c88ec3b
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ppc64 ppc64le
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADD     $(1024 * 8), R1
+
+       // Ask signaller to setgid
+       MOVW    $1, R3
+       SYNC
+       MOVW    R3, ·Baton(SB)
+
+       // Wait for setgid completion
+loop:
+       SYNC
+       MOVW    ·Baton(SB), R3
+       CMP     R3, $0
+       // Hint that we're in a spin loop
+       OR      R1, R1, R1
+       BNE     loop
+       ISYNC
+
+       // Restore stack
+       SUB     $(1024 * 8), R1
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s
new file mode 100644 (file)
index 0000000..fc9ad72
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+       // Rewind stack pointer so anything that happens on the stack
+       // will clobber the test pattern created by the caller
+       ADD     $(1024 * 8), R15
+
+       // Ask signaller to setgid
+       MOVD    $·Baton(SB), R5
+       MOVW    $1, 0(R5)
+
+       // Wait for setgid completion
+loop:
+       SYNC
+       MOVW    ·Baton(SB), R3
+       CMPBNE  R3, $0, loop
+
+       // Restore stack
+       SUB     $(1024 * 8), R15
+       RET
diff --git a/libgo/misc/cgo/test/testdata/issue9400/gccgo.go b/libgo/misc/cgo/test/testdata/issue9400/gccgo.go
new file mode 100644 (file)
index 0000000..a9b62b0
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gccgo
+
+package issue9400
+
+import (
+       "runtime"
+       "sync/atomic"
+)
+
+// The test for the gc compiler resets the stack pointer so that the
+// stack gets modified.  We don't have a way to do that for gccgo
+// without writing more assembly code, which we haven't bothered to
+// do.  So this is not much of a test.
+
+var Baton int32
+
+func RewindAndSetgid() {
+       atomic.StoreInt32(&Baton, 1)
+       for atomic.LoadInt32(&Baton) != 0 {
+               runtime.Gosched()
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9400/stubs.go b/libgo/misc/cgo/test/testdata/issue9400/stubs.go
new file mode 100644 (file)
index 0000000..e431c5a
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gc
+
+package issue9400
+
+var Baton int32
+
+func RewindAndSetgid()
diff --git a/libgo/misc/cgo/test/testdata/issue9400_linux.go b/libgo/misc/cgo/test/testdata/issue9400_linux.go
new file mode 100644 (file)
index 0000000..e94a9bb
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that SIGSETXID runs on signal stack, since it's likely to
+// overflow if it runs on the Go stack.
+
+package cgotest
+
+/*
+#include <sys/types.h>
+#include <unistd.h>
+*/
+import "C"
+
+import (
+       "runtime"
+       "sync/atomic"
+       "testing"
+
+       "cgotest/issue9400"
+)
+
+func test9400(t *testing.T) {
+       // We synchronize through a shared variable, so we need two procs
+       defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
+
+       // Start signaller
+       atomic.StoreInt32(&issue9400.Baton, 0)
+       go func() {
+               // Wait for RewindAndSetgid
+               for atomic.LoadInt32(&issue9400.Baton) == 0 {
+                       runtime.Gosched()
+               }
+               // Broadcast SIGSETXID
+               runtime.LockOSThread()
+               C.setgid(0)
+               // Indicate that signalling is done
+               atomic.StoreInt32(&issue9400.Baton, 0)
+       }()
+
+       // Grow the stack and put down a test pattern
+       const pattern = 0x123456789abcdef
+       var big [1024]uint64 // len must match assembly
+       for i := range big {
+               big[i] = pattern
+       }
+
+       // Temporarily rewind the stack and trigger SIGSETXID
+       issue9400.RewindAndSetgid()
+
+       // Check test pattern
+       for i := range big {
+               if big[i] != pattern {
+                       t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
+               }
+       }
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9510.go b/libgo/misc/cgo/test/testdata/issue9510.go
new file mode 100644 (file)
index 0000000..2c79fab
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that we can link together two different cgo packages that both
+// use the same libgcc function.
+
+package cgotest
+
+import (
+       "runtime"
+       "testing"
+
+       "cgotest/issue9510a"
+       "cgotest/issue9510b"
+)
+
+func test9510(t *testing.T) {
+       if runtime.GOARCH == "arm" {
+               t.Skip("skipping because libgcc may be a Thumb library")
+       }
+       issue9510a.F(1, 1)
+       issue9510b.F(1, 1)
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9510a/a.go b/libgo/misc/cgo/test/testdata/issue9510a/a.go
new file mode 100644 (file)
index 0000000..1a5224b
--- /dev/null
@@ -0,0 +1,15 @@
+package issue9510a
+
+/*
+static double csquare(double a, double b) {
+       __complex__ double d;
+       __real__ d = a;
+       __imag__ d = b;
+       return __real__ (d * d);
+}
+*/
+import "C"
+
+func F(a, b float64) float64 {
+       return float64(C.csquare(C.double(a), C.double(b)))
+}
diff --git a/libgo/misc/cgo/test/testdata/issue9510b/b.go b/libgo/misc/cgo/test/testdata/issue9510b/b.go
new file mode 100644 (file)
index 0000000..5016b39
--- /dev/null
@@ -0,0 +1,15 @@
+package issue9510b
+
+/*
+static double csquare(double a, double b) {
+       __complex__ double d;
+       __real__ d = a;
+       __imag__ d = b;
+       return __real__ (d * d);
+}
+*/
+import "C"
+
+func F(a, b float64) float64 {
+       return float64(C.csquare(C.double(a), C.double(b)))
+}
diff --git a/libgo/misc/cgo/test/testdata/test26213.go b/libgo/misc/cgo/test/testdata/test26213.go
new file mode 100644 (file)
index 0000000..c80032c
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import (
+       "testing"
+
+       "cgotest/issue26213"
+)
+
+func test26213(t *testing.T) {
+       issue26213.Test26213(t)
+}
diff --git a/libgo/misc/cgo/test/testx.go b/libgo/misc/cgo/test/testx.go
new file mode 100644 (file)
index 0000000..67def90
--- /dev/null
@@ -0,0 +1,519 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains //export directives on Go functions
+// and so it must NOT contain C definitions (only declarations).
+// See test.go for C definitions.
+
+package cgotest
+
+import (
+       "runtime"
+       "runtime/debug"
+       "strings"
+       "sync"
+       "sync/atomic"
+       "testing"
+       "time"
+       "unsafe"
+)
+
+/*
+// threads
+extern void doAdd(int, int);
+
+// issue 1328
+extern void BackIntoGo(void);
+void IntoC(void);
+
+// issue 1560
+// mysleep returns the absolute start time in ms.
+long long mysleep(int seconds);
+
+// twoSleep returns the absolute start time of the first sleep
+// in ms.
+long long twoSleep(int);
+
+// issue 3775
+void lockOSThreadCallback(void);
+inline static void lockOSThreadC(void)
+{
+        lockOSThreadCallback();
+}
+int usleep(unsigned usec);
+
+// issue 4054 part 2 - part 1 in test.go
+typedef enum {
+       A = 0,
+       B,
+       C,
+       D,
+       E,
+       F,
+       G,
+       H,
+       II,
+       J,
+} issue4054b;
+
+// issue 5548
+
+extern int issue5548_in_c(void);
+
+// issue 6833
+
+extern unsigned long long issue6833Func(unsigned int, unsigned long long);
+
+// issue 6907
+
+extern int CheckIssue6907C(_GoString_);
+
+// issue 7665
+
+extern void f7665(void);
+
+// issue 7978
+// Stack tracing didn't work during cgo code after calling a Go
+// callback.  Make sure GC works and the stack trace is correct.
+
+#include <stdint.h>
+
+void issue7978cb(void);
+
+// use ugly atomic variable sync since that doesn't require calling back into
+// Go code or OS dependencies
+static void issue7978c(uint32_t *sync) {
+       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 0)
+               ;
+       __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
+       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 2)
+               ;
+       issue7978cb();
+       __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
+       while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 6)
+               ;
+}
+
+// issue 8331 part 2 - part 1 in test.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 20910
+void callMulti(void);
+
+// issue 28772 part 2 - part 1 in issuex.go
+#define issue28772Constant2 2
+
+*/
+import "C"
+
+// exports
+
+//export ReturnIntLong
+func ReturnIntLong() (int, C.long) {
+       return 1, 2
+}
+
+//export gc
+func gc() {
+       runtime.GC()
+}
+
+// threads
+
+var sum struct {
+       sync.Mutex
+       i int
+}
+
+//export Add
+func Add(x int) {
+       defer func() {
+               recover()
+       }()
+       sum.Lock()
+       sum.i += x
+       sum.Unlock()
+       var p *int
+       *p = 2
+}
+
+func testCthread(t *testing.T) {
+       if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+               t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
+       }
+       sum.i = 0
+       C.doAdd(10, 6)
+
+       want := 10 * (10 - 1) / 2 * 6
+       if sum.i != want {
+               t.Fatalf("sum=%d, want %d", sum.i, want)
+       }
+}
+
+// issue 1328
+
+//export BackIntoGo
+func BackIntoGo() {
+       x := 1
+
+       for i := 0; i < 10000; i++ {
+               xvariadic(x)
+               if x != 1 {
+                       panic("x is not 1?")
+               }
+       }
+}
+
+func xvariadic(x ...interface{}) {
+}
+
+func test1328(t *testing.T) {
+       C.IntoC()
+}
+
+// issue 1560
+
+var sleepDone = make(chan int64)
+
+// parallelSleep returns the absolute difference between the start time
+// of the two sleeps.
+func parallelSleep(n int) int64 {
+       t := int64(C.twoSleep(C.int(n))) - <-sleepDone
+       if t < 0 {
+               return -t
+       }
+       return t
+}
+
+//export BackgroundSleep
+func BackgroundSleep(n int32) {
+       go func() {
+               sleepDone <- int64(C.mysleep(C.int(n)))
+       }()
+}
+
+func testParallelSleep(t *testing.T) {
+       sleepSec := 1
+       dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
+       t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
+       // bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
+       // we detect if the start times of those sleeps are > 0.5*sleepSec-second.
+       if dt >= time.Duration(sleepSec)*time.Second/2 {
+               t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
+       }
+}
+
+// issue 2462
+
+//export exportbyte
+func exportbyte() byte {
+       return 0
+}
+
+//export exportbool
+func exportbool() bool {
+       return false
+}
+
+//export exportrune
+func exportrune() rune {
+       return 0
+}
+
+//export exporterror
+func exporterror() error {
+       return nil
+}
+
+//export exportint
+func exportint() int {
+       return 0
+}
+
+//export exportuint
+func exportuint() uint {
+       return 0
+}
+
+//export exportuintptr
+func exportuintptr() uintptr {
+       return (uintptr)(0)
+}
+
+//export exportint8
+func exportint8() int8 {
+       return 0
+}
+
+//export exportuint8
+func exportuint8() uint8 {
+       return 0
+}
+
+//export exportint16
+func exportint16() int16 {
+       return 0
+}
+
+//export exportuint16
+func exportuint16() uint16 {
+       return 0
+}
+
+//export exportint32
+func exportint32() int32 {
+       return 0
+}
+
+//export exportuint32
+func exportuint32() uint32 {
+       return 0
+}
+
+//export exportint64
+func exportint64() int64 {
+       return 0
+}
+
+//export exportuint64
+func exportuint64() uint64 {
+       return 0
+}
+
+//export exportfloat32
+func exportfloat32() float32 {
+       return 0
+}
+
+//export exportfloat64
+func exportfloat64() float64 {
+       return 0
+}
+
+//export exportcomplex64
+func exportcomplex64() complex64 {
+       return 0
+}
+
+//export exportcomplex128
+func exportcomplex128() complex128 {
+       return 0
+}
+
+// issue 3741
+
+//export exportSliceIn
+func exportSliceIn(s []byte) bool {
+       return len(s) == cap(s)
+}
+
+//export exportSliceOut
+func exportSliceOut() []byte {
+       return []byte{1}
+}
+
+//export exportSliceInOut
+func exportSliceInOut(s []byte) []byte {
+       return s
+}
+
+// issue 3775
+
+func init() {
+       if runtime.GOOS == "android" {
+               return
+       }
+       // Same as test3775 but run during init so that
+       // there are two levels of internal runtime lock
+       // (1 for init, 1 for cgo).
+       // This would have been broken by CL 11663043.
+       C.lockOSThreadC()
+}
+
+func test3775(t *testing.T) {
+       if runtime.GOOS == "android" {
+               return
+       }
+       // Used to panic because of the UnlockOSThread below.
+       C.lockOSThreadC()
+}
+
+//export lockOSThreadCallback
+func lockOSThreadCallback() {
+       runtime.LockOSThread()
+       runtime.UnlockOSThread()
+       go C.usleep(10000)
+       runtime.Gosched()
+}
+
+// issue 4054 part 2 - part 1 in test.go
+
+var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.II, C.J}
+
+//export issue5548FromC
+func issue5548FromC(s string, i int) int {
+       if len(s) == 4 && s == "test" && i == 42 {
+               return 12345
+       }
+       println("got", len(s), i)
+       return 9876
+}
+
+func test5548(t *testing.T) {
+       if x := C.issue5548_in_c(); x != 12345 {
+               t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
+       }
+}
+
+// issue 6833
+
+//export GoIssue6833Func
+func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
+       return aui64 + uint64(aui)
+}
+
+func test6833(t *testing.T) {
+       ui := 7
+       ull := uint64(0x4000300020001000)
+       v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
+       exp := uint64(ui) + ull
+       if v != exp {
+               t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
+       }
+}
+
+// issue 6907
+
+const CString = "C string"
+
+//export CheckIssue6907Go
+func CheckIssue6907Go(s string) C.int {
+       if s == CString {
+               return 1
+       }
+       return 0
+}
+
+func test6907Go(t *testing.T) {
+       if got := C.CheckIssue6907C(CString); got != 1 {
+               t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
+       }
+}
+
+// issue 7665
+
+//export f7665
+func f7665() {}
+
+var bad7665 unsafe.Pointer = C.f7665
+var good7665 uintptr = uintptr(C.f7665)
+
+func test7665(t *testing.T) {
+       if bad7665 == nil || uintptr(bad7665) != good7665 {
+               t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
+       }
+}
+
+// issue 7978
+
+var issue7978sync uint32
+
+func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
+       runtime.GC()
+       buf := make([]byte, 65536)
+       trace := string(buf[:runtime.Stack(buf, true)])
+       for _, goroutine := range strings.Split(trace, "\n\n") {
+               if strings.Contains(goroutine, "test.issue7978go") {
+                       trace := strings.Split(goroutine, "\n")
+                       // look for the expected function in the stack
+                       for i := 0; i < depth; i++ {
+                               if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
+                                       t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
+                                       return
+                               }
+                               if strings.Contains(trace[1+2*i], wantFunc) {
+                                       return
+                               }
+                       }
+                       t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
+                       return
+               }
+       }
+       t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
+}
+
+func issue7978wait(store uint32, wait uint32) {
+       if store != 0 {
+               atomic.StoreUint32(&issue7978sync, store)
+       }
+       for atomic.LoadUint32(&issue7978sync) != wait {
+               runtime.Gosched()
+       }
+}
+
+//export issue7978cb
+func issue7978cb() {
+       // Force a stack growth from the callback to put extra
+       // pressure on the runtime. See issue #17785.
+       growStack(64)
+       issue7978wait(3, 4)
+}
+
+func growStack(n int) int {
+       var buf [128]int
+       if n == 0 {
+               return 0
+       }
+       return buf[growStack(n-1)]
+}
+
+func issue7978go() {
+       C.issue7978c((*C.uint32_t)(&issue7978sync))
+       issue7978wait(7, 8)
+}
+
+func test7978(t *testing.T) {
+       if runtime.Compiler == "gccgo" {
+               t.Skip("gccgo can not do stack traces of C code")
+       }
+       debug.SetTraceback("2")
+       issue7978sync = 0
+       go issue7978go()
+       // test in c code, before callback
+       issue7978wait(0, 1)
+       issue7978check(t, "_Cfunc_issue7978c(", "", 1)
+       // test in go code, during callback
+       issue7978wait(2, 3)
+       issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
+       // test in c code, after callback
+       issue7978wait(4, 5)
+       issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
+       // test in go code, after return from cgo
+       issue7978wait(6, 7)
+       issue7978check(t, "test.issue7978go(", "", 3)
+       atomic.StoreUint32(&issue7978sync, 8)
+}
+
+// issue 8331 part 2
+
+var issue8331Var C.issue8331
+
+// issue 20910
+
+//export multi
+func multi() (*C.char, C.int) {
+       return C.CString("multi"), 0
+}
+
+func test20910(t *testing.T) {
+       C.callMulti()
+}
+
+// issue 28772 part 2
+
+const issue28772Constant2 = C.issue28772Constant2
diff --git a/libgo/misc/cgo/test/twoargs.go b/libgo/misc/cgo/test/twoargs.go
deleted file mode 100644 (file)
index ca0534c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Crash from call with two arguments that need pointer checking.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-static void twoargs1(void *p, int n) {}
-static void *twoargs2() { return 0; }
-static int twoargs3(void * p) { return 0; }
-*/
-import "C"
-
-import "unsafe"
-
-func twoargsF() {
-       v := []string{}
-       C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
-}
index 457ac0db091af1e5a1815e1da6843501fbd4b7aa..70516703d96041072c2ab75c17b17f9543aa3c94 100644 (file)
@@ -8,8 +8,10 @@ import (
        "bufio"
        "bytes"
        "debug/elf"
+       "flag"
        "fmt"
        "io/ioutil"
+       "log"
        "os"
        "os/exec"
        "path/filepath"
@@ -28,16 +30,47 @@ var bin []string
 // C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
 var cc []string
 
-// An environment with GOPATH=$(pwd).
-var gopathEnv []string
-
 // ".exe" on Windows.
 var exeSuffix string
 
-var GOOS, GOARCH string
+var GOOS, GOARCH, GOPATH string
 var libgodir string
 
-func init() {
+func TestMain(m *testing.M) {
+       flag.Parse()
+       if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+               fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+               os.Exit(0)
+       }
+       log.SetFlags(log.Lshortfile)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       // We need a writable GOPATH in which to run the tests.
+       // Construct one in a temporary directory.
+       var err error
+       GOPATH, err = ioutil.TempDir("", "carchive_test")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+       os.Setenv("GOPATH", GOPATH)
+
+       // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+       // declaring the same path.
+       modRoot := filepath.Join(GOPATH, "src", "testcarchive")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", modRoot)
+       if err := ioutil.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
        GOOS = goEnv("GOOS")
        GOARCH = goEnv("GOARCH")
        bin = cmdToRun("./testp")
@@ -83,50 +116,41 @@ func init() {
                // TODO(crawshaw): can we do better?
                cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
        }
-       libgodir = GOOS + "_" + GOARCH
+       if GOOS == "aix" {
+               // -Wl,-bnoobjreorder is mandatory to keep the same layout
+               // in .text section.
+               cc = append(cc, "-Wl,-bnoobjreorder")
+       }
+       libbase := GOOS + "_" + GOARCH
        if runtime.Compiler == "gccgo" {
-               libgodir = "gccgo_" + libgodir + "_fPIC"
+               libbase = "gccgo_" + libbase + "_fPIC"
        } else {
                switch GOOS {
                case "darwin":
                        if GOARCH == "arm" || GOARCH == "arm64" {
-                               libgodir += "_shared"
+                               libbase += "_shared"
                        }
-               case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
-                       libgodir += "_shared"
+               case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
+                       libbase += "_shared"
                }
        }
-       cc = append(cc, "-I", filepath.Join("pkg", libgodir))
-
-       // Build an environment with GOPATH=$(pwd)
-       env := os.Environ()
-       var n []string
-       for _, e := range env {
-               if !strings.HasPrefix(e, "GOPATH=") {
-                       n = append(n, e)
-               }
-       }
-       dir, err := os.Getwd()
-       if err != nil {
-               fmt.Fprintln(os.Stderr, err)
-               os.Exit(2)
-       }
-       n = append(n, "GOPATH="+dir)
-       gopathEnv = n
+       libgodir = filepath.Join(GOPATH, "pkg", libbase, "testcarchive")
+       cc = append(cc, "-I", libgodir)
 
        if GOOS == "windows" {
                exeSuffix = ".exe"
        }
+
+       return m.Run()
 }
 
 func goEnv(key string) string {
        out, err := exec.Command("go", "env", key).Output()
        if err != nil {
-               fmt.Fprintf(os.Stderr, "go env %s failed:\n%s\n", key, err)
                if ee, ok := err.(*exec.ExitError); ok {
                        fmt.Fprintf(os.Stderr, "%s", ee.Stderr)
                }
-               os.Exit(2)
+               log.Panicf("go env %s failed:\n%s\n", key, err)
        }
        return strings.TrimSpace(string(out))
 }
@@ -143,7 +167,6 @@ func cmdToRun(name string) []string {
 func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
        t.Helper()
        cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
-       cmd.Env = gopathEnv
        t.Log(buildcmd)
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
@@ -204,7 +227,7 @@ func checkLineComments(t *testing.T, hdrname string) {
 }
 
 func TestInstall(t *testing.T) {
-       defer os.RemoveAll("pkg")
+       defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
 
        libgoa := "libgo.a"
        if runtime.Compiler == "gccgo" {
@@ -212,17 +235,17 @@ func TestInstall(t *testing.T) {
        }
 
        testInstall(t, "./testp1"+exeSuffix,
-               filepath.Join("pkg", libgodir, libgoa),
-               filepath.Join("pkg", libgodir, "libgo.h"),
-               "go", "install", "-i", "-buildmode=c-archive", "libgo")
+               filepath.Join(libgodir, libgoa),
+               filepath.Join(libgodir, "libgo.h"),
+               "go", "install", "-i", "-buildmode=c-archive", "./libgo")
 
        // Test building libgo other than installing it.
        // Header files are now present.
        testInstall(t, "./testp2"+exeSuffix, "libgo.a", "libgo.h",
-               "go", "build", "-buildmode=c-archive", filepath.Join("src", "libgo", "libgo.go"))
+               "go", "build", "-buildmode=c-archive", filepath.Join(".", "libgo", "libgo.go"))
 
        testInstall(t, "./testp3"+exeSuffix, "libgo.a", "libgo.h",
-               "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "libgo")
+               "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "./libgo")
 }
 
 func TestEarlySignalHandler(t *testing.T) {
@@ -240,11 +263,10 @@ func TestEarlySignalHandler(t *testing.T) {
                os.Remove("libgo2.a")
                os.Remove("libgo2.h")
                os.Remove("testp")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -273,11 +295,10 @@ func TestSignalForwarding(t *testing.T) {
                os.Remove("libgo2.a")
                os.Remove("libgo2.h")
                os.Remove("testp")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -308,8 +329,10 @@ func TestSignalForwarding(t *testing.T) {
 }
 
 func TestSignalForwardingExternal(t *testing.T) {
-       if GOOS == "freebsd" {
+       if GOOS == "freebsd" || GOOS == "aix" {
                t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
+       } else if GOOS == "darwin" && GOARCH == "amd64" {
+               t.Skipf("skipping on %s/%s: runtime does not permit SI_USER SIGSEGV", GOOS, GOARCH)
        }
        checkSignalForwardingTest(t)
 
@@ -317,11 +340,10 @@ func TestSignalForwardingExternal(t *testing.T) {
                os.Remove("libgo2.a")
                os.Remove("libgo2.h")
                os.Remove("testp")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -433,11 +455,10 @@ func TestOsSignal(t *testing.T) {
                os.Remove("libgo3.a")
                os.Remove("libgo3.h")
                os.Remove("testp")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "libgo3")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -469,11 +490,10 @@ func TestSigaltstack(t *testing.T) {
                os.Remove("libgo4.a")
                os.Remove("libgo4.h")
                os.Remove("testp")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "libgo4")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -511,13 +531,16 @@ func TestExtar(t *testing.T) {
        if runtime.Compiler == "gccgo" {
                t.Skip("skipping -extar test when using gccgo")
        }
+       if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+               t.Skip("shell scripts are not executable on iOS hosts")
+       }
 
        defer func() {
                os.Remove("libgo4.a")
                os.Remove("libgo4.h")
                os.Remove("testar")
                os.Remove("testar.ran")
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
        os.Remove("testar")
@@ -530,8 +553,7 @@ func TestExtar(t *testing.T) {
                t.Fatal(err)
        }
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "libgo4")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "./libgo4")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -555,11 +577,10 @@ func TestPIE(t *testing.T) {
 
        defer func() {
                os.Remove("testp" + exeSuffix)
-               os.RemoveAll("pkg")
+               os.RemoveAll(filepath.Join(GOPATH, "pkg"))
        }()
 
-       cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "libgo")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "./libgo")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -570,7 +591,7 @@ func TestPIE(t *testing.T) {
                libgoa = "liblibgo.a"
        }
 
-       ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join("pkg", libgodir, libgoa))
+       ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa))
        if runtime.Compiler == "gccgo" {
                ccArgs = append(ccArgs, "-lgo")
        }
@@ -589,13 +610,15 @@ func TestPIE(t *testing.T) {
                t.Fatal(err)
        }
 
-       f, err := elf.Open("testp" + exeSuffix)
-       if err != nil {
-               t.Fatal("elf.Open failed: ", err)
-       }
-       defer f.Close()
-       if hasDynTag(t, f, elf.DT_TEXTREL) {
-               t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+       if GOOS != "aix" {
+               f, err := elf.Open("testp" + exeSuffix)
+               if err != nil {
+                       t.Fatal("elf.Open failed: ", err)
+               }
+               defer f.Close()
+               if hasDynTag(t, f, elf.DT_TEXTREL) {
+                       t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+               }
        }
 }
 
@@ -643,8 +666,7 @@ func TestSIGPROF(t *testing.T) {
                os.Remove("libgo6.h")
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "libgo6")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
                t.Fatal(err)
@@ -683,8 +705,7 @@ func TestCompileWithoutShared(t *testing.T) {
                os.Remove("libgo2.h")
        }()
 
-       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "libgo2")
-       cmd.Env = gopathEnv
+       cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
        t.Log(cmd.Args)
        out, err := cmd.CombinedOutput()
        t.Logf("%s", out)
@@ -732,15 +753,14 @@ func TestCompileWithoutShared(t *testing.T) {
 
 // Test that installing a second time recreates the header files.
 func TestCachedInstall(t *testing.T) {
-       defer os.RemoveAll("pkg")
+       defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
 
-       h1 := filepath.Join("pkg", libgodir, "libgo.h")
-       h2 := filepath.Join("pkg", libgodir, "p.h")
+       h1 := filepath.Join(libgodir, "libgo.h")
+       h2 := filepath.Join(libgodir, "p.h")
 
-       buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "libgo"}
+       buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "./libgo"}
 
        cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
-       cmd.Env = gopathEnv
        t.Log(buildcmd)
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
@@ -762,7 +782,6 @@ func TestCachedInstall(t *testing.T) {
        }
 
        cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
-       cmd.Env = gopathEnv
        t.Log(buildcmd)
        if out, err := cmd.CombinedOutput(); err != nil {
                t.Logf("%s", out)
diff --git a/libgo/misc/cgo/testcarchive/main.c b/libgo/misc/cgo/testcarchive/main.c
deleted file mode 100644 (file)
index 163b539..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "p.h"
-#include "libgo.h"
-
-extern int install_handler();
-extern int check_handler();
-
-int main(void) {
-       int32_t res;
-
-       int r1 = install_handler();
-       if (r1!=0) {
-               return r1;
-       }
-
-       if (!DidInitRun()) {
-               fprintf(stderr, "ERROR: buildmode=c-archive init should run\n");
-               return 2;
-       }
-
-       if (DidMainRun()) {
-               fprintf(stderr, "ERROR: buildmode=c-archive should not run main\n");
-               return 2;
-       }
-
-       int r2 = check_handler();
-       if (r2!=0) {
-               return r2;
-       }
-
-       res = FromPkg();
-       if (res != 1024) {
-               fprintf(stderr, "ERROR: FromPkg()=%d, want 1024\n", res);
-               return 2;
-       }
-
-       CheckArgs();
-
-       fprintf(stderr, "PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main2.c b/libgo/misc/cgo/testcarchive/main2.c
deleted file mode 100644 (file)
index 769cd49..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test installing a signal handler before the Go code starts.
-// This is a lot like misc/cgo/testcshared/main4.c.
-
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sched.h>
-#include <time.h>
-#include <errno.h>
-
-#include "libgo2.h"
-
-static void die(const char* msg) {
-       perror(msg);
-       exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-static volatile sig_atomic_t sigpipeSeen;
-
-// Use up some stack space.
-static void recur(int i, char *p) {
-       char a[1024];
-
-       *p = '\0';
-       if (i > 0) {
-               recur(i - 1, a);
-       }
-}
-
-static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigpipeSeen = 1;
-}
-
-// Signal handler that uses up more stack space than a goroutine will have.
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-       char a[1024];
-
-       recur(4, a);
-       sigioSeen = 1;
-}
-
-static jmp_buf jmp;
-static char* nullPointer;
-
-// An arbitrary function which requires proper stack alignment; see
-// http://golang.org/issue/17641.
-static void callWithVarargs(void* dummy, ...) {
-       va_list args;
-       va_start(args, dummy);
-       va_end(args);
-}
-
-// Signal handler for SIGSEGV on a C thread.
-static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigset_t mask;
-       int i;
-
-       // Call an arbitrary function that requires the stack to be properly aligned.
-       callWithVarargs("dummy arg", 3.1415);
-
-       if (sigemptyset(&mask) < 0) {
-               die("sigemptyset");
-       }
-       if (sigaddset(&mask, SIGSEGV) < 0) {
-               die("sigaddset");
-       }
-       i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
-       if (i != 0) {
-               fprintf(stderr, "sigprocmask: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       // Don't try this at home.
-       longjmp(jmp, signo);
-
-       // We should never get here.
-       abort();
-}
-
-// Set up the signal handlers in a high priority constructor,
-// so that they are installed before the Go code starts.
-
-static void init(void) __attribute__ ((constructor (200)));
-
-static void init() {
-       struct sigaction sa;
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = ioHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO;
-       if (sigaction(SIGIO, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       sa.sa_sigaction = segvHandler;
-       if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       sa.sa_sigaction = pipeHandler;
-       if (sigaction(SIGPIPE, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-}
-
-int main(int argc, char** argv) {
-       int verbose;
-       sigset_t mask;
-       int i;
-       struct timespec ts;
-
-       verbose = argc > 1;
-       setvbuf(stdout, NULL, _IONBF, 0);
-
-       // Call setsid so that we can use kill(0, SIGIO) below.
-       // Don't check the return value so that this works both from
-       // a job control shell and from a shell script.
-       setsid();
-
-       if (verbose) {
-               printf("calling RunGoroutines\n");
-       }
-
-       RunGoroutines();
-
-       // Block SIGIO in this thread to make it more likely that it
-       // will be delivered to a goroutine.
-
-       if (verbose) {
-               printf("calling pthread_sigmask\n");
-       }
-
-       if (sigemptyset(&mask) < 0) {
-               die("sigemptyset");
-       }
-       if (sigaddset(&mask, SIGIO) < 0) {
-               die("sigaddset");
-       }
-       i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling kill\n");
-       }
-
-       if (kill(0, SIGIO) < 0) {
-               die("kill");
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for SIGIO\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       if (verbose) {
-               printf("provoking SIGPIPE\n");
-       }
-
-       GoRaiseSIGPIPE();
-
-       if (verbose) {
-               printf("waiting for sigpipeSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigpipeSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for SIGPIPE\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       if (verbose) {
-               printf("calling setjmp\n");
-       }
-
-       // Test that a SIGSEGV on this thread is delivered to us.
-       if (setjmp(jmp) == 0) {
-               if (verbose) {
-                       printf("triggering SIGSEGV\n");
-               }
-
-               *nullPointer = '\0';
-
-               fprintf(stderr, "continued after address error\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling TestSEGV\n");
-       }
-
-       TestSEGV();
-
-       printf("PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main3.c b/libgo/misc/cgo/testcarchive/main3.c
deleted file mode 100644 (file)
index 60a16cf..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test os/signal.Notify and os/signal.Reset.
-// This is a lot like misc/cgo/testcshared/main5.c.
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sched.h>
-#include <unistd.h>
-
-#include "libgo3.h"
-
-static void die(const char* msg) {
-       perror(msg);
-       exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigioSeen = 1;
-}
-
-// Set up the SIGPIPE signal handler in a high priority constructor, so
-// that it is installed before the Go code starts.
-
-static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
-       const char *s = "unexpected SIGPIPE\n";
-       write(2, s, strlen(s));
-       exit(EXIT_FAILURE);
-}
-
-static void init(void) __attribute__ ((constructor (200)));
-
-static void init() {
-    struct sigaction sa;
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = pipeHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO;
-       if (sigaction(SIGPIPE, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-}
-
-int main(int argc, char** argv) {
-       int verbose;
-       struct sigaction sa;
-       int i;
-       struct timespec ts;
-
-       verbose = argc > 2;
-       setvbuf(stdout, NULL, _IONBF, 0);
-
-       if (verbose) {
-               printf("raising SIGPIPE\n");
-       }
-
-       // Test that the Go runtime handles SIGPIPE, even if we installed
-       // a non-default SIGPIPE handler before the runtime initializes.
-       ProvokeSIGPIPE();
-
-       if (verbose) {
-               printf("calling sigaction\n");
-       }
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = ioHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO;
-       if (sigaction(SIGIO, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       // At this point there should not be a Go signal handler
-       // installed for SIGIO.
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       sigioSeen = 0;
-
-       // Tell the Go code to catch SIGIO.
-
-       if (verbose) {
-               printf("calling CatchSIGIO\n");
-       }
-
-       CatchSIGIO();
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("calling SawSIGIO\n");
-       }
-
-       if (!SawSIGIO()) {
-               fprintf(stderr, "Go handler did not see SIGIO\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (sigioSeen != 0) {
-               fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
-               exit(EXIT_FAILURE);
-       }
-
-       // Tell the Go code to stop catching SIGIO.
-
-       if (verbose) {
-               printf("calling ResetSIGIO\n");
-       }
-
-       ResetSIGIO();
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("calling SawSIGIO\n");
-       }
-
-       if (SawSIGIO()) {
-               fprintf(stderr, "Go handler saw SIGIO after Reset\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       printf("PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main4.c b/libgo/misc/cgo/testcarchive/main4.c
deleted file mode 100644 (file)
index 4fd55e7..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test a C thread that calls sigaltstack and then calls Go code.
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sched.h>
-#include <pthread.h>
-
-#include "libgo4.h"
-
-static void die(const char* msg) {
-       perror(msg);
-       exit(EXIT_FAILURE);
-}
-
-static int ok = 1;
-
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-}
-
-// Set up the SIGIO signal handler in a high priority constructor, so
-// that it is installed before the Go code starts.
-
-static void init(void) __attribute__ ((constructor (200)));
-
-static void init() {
-       struct sigaction sa;
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = ioHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
-       if (sigaction(SIGIO, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-}
-
-// Test raising SIGIO on a C thread with an alternate signal stack
-// when there is a Go signal handler for SIGIO.
-static void* thread1(void* arg __attribute__ ((unused))) {
-       stack_t ss;
-       int i;
-       stack_t nss;
-       struct timespec ts;
-
-       // Set up an alternate signal stack for this thread.
-       memset(&ss, 0, sizeof ss);
-       ss.ss_sp = malloc(SIGSTKSZ);
-       if (ss.ss_sp == NULL) {
-               die("malloc");
-       }
-       ss.ss_flags = 0;
-       ss.ss_size = SIGSTKSZ;
-       if (sigaltstack(&ss, NULL) < 0) {
-               die("sigaltstack");
-       }
-
-       // Send ourselves a SIGIO.  This will be caught by the Go
-       // signal handler which should forward to the C signal
-       // handler.
-       i = pthread_kill(pthread_self(), SIGIO);
-       if (i != 0) {
-               fprintf(stderr, "pthread_kill: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (SIGIOCount() == 0) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       // We should still be on the same signal stack.
-       if (sigaltstack(NULL, &nss) < 0) {
-               die("sigaltstack check");
-       }
-       if ((nss.ss_flags & SS_DISABLE) != 0) {
-               fprintf(stderr, "sigaltstack disabled on return from Go\n");
-               ok = 0;
-       } else if (nss.ss_sp != ss.ss_sp) {
-               fprintf(stderr, "sigalstack changed on return from Go\n");
-               ok = 0;
-       }
-
-       return NULL;
-}
-
-// Test calling a Go function to raise SIGIO on a C thread with an
-// alternate signal stack when there is a Go signal handler for SIGIO.
-static void* thread2(void* arg __attribute__ ((unused))) {
-       stack_t ss;
-       int i;
-       int oldcount;
-       pthread_t tid;
-       struct timespec ts;
-       stack_t nss;
-
-       // Set up an alternate signal stack for this thread.
-       memset(&ss, 0, sizeof ss);
-       ss.ss_sp = malloc(SIGSTKSZ);
-       if (ss.ss_sp == NULL) {
-               die("malloc");
-       }
-       ss.ss_flags = 0;
-       ss.ss_size = SIGSTKSZ;
-       if (sigaltstack(&ss, NULL) < 0) {
-               die("sigaltstack");
-       }
-
-       oldcount = SIGIOCount();
-
-       // Call a Go function that will call a C function to send us a
-       // SIGIO.
-       tid = pthread_self();
-       GoRaiseSIGIO(&tid);
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (SIGIOCount() == oldcount) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       // We should still be on the same signal stack.
-       if (sigaltstack(NULL, &nss) < 0) {
-               die("sigaltstack check");
-       }
-       if ((nss.ss_flags & SS_DISABLE) != 0) {
-               fprintf(stderr, "sigaltstack disabled on return from Go\n");
-               ok = 0;
-       } else if (nss.ss_sp != ss.ss_sp) {
-               fprintf(stderr, "sigalstack changed on return from Go\n");
-               ok = 0;
-       }
-
-       return NULL;
-}
-
-int main(int argc, char **argv) {
-       pthread_t tid;
-       int i;
-
-       // Tell the Go library to start looking for SIGIO.
-       GoCatchSIGIO();
-
-       i = pthread_create(&tid, NULL, thread1, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_create: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       i = pthread_join(tid, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_join: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       i = pthread_create(&tid, NULL, thread2, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_create: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       i = pthread_join(tid, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_join: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       if (!ok) {
-               exit(EXIT_FAILURE);
-       }
-
-       printf("PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main5.c b/libgo/misc/cgo/testcarchive/main5.c
deleted file mode 100644 (file)
index 897b70d..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test for verifying that the Go runtime properly forwards
-// signals when non-Go signals are raised.
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/select.h>
-
-#include "libgo2.h"
-
-int main(int argc, char** argv) {
-       int verbose;
-       int test;
-
-       if (argc < 2) {
-               printf("Missing argument\n");
-               return 1;
-       }
-
-       test = atoi(argv[1]);
-
-       verbose = (argc > 2);
-
-       if (verbose) {
-               printf("calling RunGoroutines\n");
-       }
-
-       Noop();
-
-       switch (test) {
-               case 1: {
-                       if (verbose) {
-                               printf("attempting segfault\n");
-                       }
-
-                       volatile int crash = *(int *) 0;
-                       break;
-               }
-
-               case 2: {
-                       struct timeval tv;
-
-                       if (verbose) {
-                               printf("attempting external signal test\n");
-                       }
-
-                       fprintf(stderr, "OK\n");
-                       fflush(stderr);
-
-                       // The program should be interrupted before
-                       // this sleep finishes. We use select rather
-                       // than sleep because in older versions of
-                       // glibc the sleep function does some signal
-                       // fiddling to handle SIGCHLD.  If this
-                       // program is fiddling signals just when the
-                       // test program sends the signal, the signal
-                       // may be delivered to a Go thread which will
-                       // break this test.
-                       tv.tv_sec = 60;
-                       tv.tv_usec = 0;
-                       select(0, NULL, NULL, NULL, &tv);
-
-                       break;
-               }
-               case 3: {
-                       if (verbose) {
-                               printf("attempting SIGPIPE\n");
-                       }
-
-                       int fd[2];
-                       if (pipe(fd) != 0) {
-                               printf("pipe(2) failed\n");
-                               return 0;
-                       }
-                       // Close the reading end.
-                       close(fd[0]);
-                       // Expect that write(2) fails (EPIPE)
-                       if (write(fd[1], "some data", 9) != -1) {
-                               printf("write(2) unexpectedly succeeded\n");
-                               return 0;
-                       }
-                       printf("did not receieve SIGPIPE\n");
-                       return 0;
-               }
-               default:
-                       printf("Unknown test: %d\n", test);
-                       return 0;
-       }
-
-       printf("FAIL\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main6.c b/libgo/misc/cgo/testcarchive/main6.c
deleted file mode 100644 (file)
index 2745eb9..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that using the Go profiler in a C program does not crash.
-
-#include <stddef.h>
-#include <sys/time.h>
-
-#include "libgo6.h"
-
-int main(int argc, char **argv) {
-       struct timeval tvstart, tvnow;
-       int diff;
-
-       gettimeofday(&tvstart, NULL);
-
-       go_start_profile();
-
-       // Busy wait so we have something to profile.
-       // If we just sleep the profiling signal will never fire.
-       while (1) {
-               gettimeofday(&tvnow, NULL);
-               diff = (tvnow.tv_sec - tvstart.tv_sec) * 1000 * 1000 + (tvnow.tv_usec - tvstart.tv_usec);
-
-               // Profile frequency is 100Hz so we should definitely
-               // get a signal in 50 milliseconds.
-               if (diff > 50 * 1000)
-                       break;
-       }
-
-       go_stop_profile();
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/main_unix.c b/libgo/misc/cgo/testcarchive/main_unix.c
deleted file mode 100644 (file)
index b23ac1c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-struct sigaction sa;
-struct sigaction osa;
-
-static void (*oldHandler)(int, siginfo_t*, void*);
-
-static void handler(int signo, siginfo_t* info, void* ctxt) {
-       if (oldHandler) {
-               oldHandler(signo, info, ctxt);
-       }
-}
-
-int install_handler() {
-       // Install our own signal handler.
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = handler;
-       sigemptyset(&sa.sa_mask);
-       sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
-       memset(&osa, 0, sizeof osa);
-       sigemptyset(&osa.sa_mask);
-       if (sigaction(SIGSEGV, &sa, &osa) < 0) {
-               perror("sigaction");
-               return 2;
-       }
-       if (osa.sa_handler == SIG_DFL) {
-               fprintf(stderr, "Go runtime did not install signal handler\n");
-               return 2;
-       }
-       // gccgo does not set SA_ONSTACK for SIGSEGV.
-       if (getenv("GCCGO") == "" && (osa.sa_flags&SA_ONSTACK) == 0) {
-               fprintf(stderr, "Go runtime did not install signal handler\n");
-               return 2;
-       }
-       oldHandler = osa.sa_sigaction;
-
-       return 0;
-}
-
-int check_handler() {
-       if (sigaction(SIGSEGV, NULL, &sa) < 0) {
-               perror("sigaction check");
-               return 2;
-       }
-       if (sa.sa_sigaction != handler) {
-               fprintf(stderr, "ERROR: wrong signal handler: %p != %p\n", sa.sa_sigaction, handler);
-               return 2;
-       }
-       return 0;
-}
-
diff --git a/libgo/misc/cgo/testcarchive/main_windows.c b/libgo/misc/cgo/testcarchive/main_windows.c
deleted file mode 100644 (file)
index eded8af..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
- * Dummy implementations for Windows, because Windows doesn't
- * support Unix-style signal handling.
- */
-
-int install_handler() {
-       return 0;
-}
-
-
-int check_handler() {
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcarchive/overlaydir_test.go b/libgo/misc/cgo/testcarchive/overlaydir_test.go
new file mode 100644 (file)
index 0000000..68878e4
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package carchive_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo/libgo.go b/libgo/misc/cgo/testcarchive/src/libgo/libgo.go
deleted file mode 100644 (file)
index 45958a5..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "os"
-       "syscall"
-       "time"
-
-       _ "p"
-)
-
-import "C"
-
-var initCh = make(chan int, 1)
-var ranMain bool
-
-func init() {
-       // emulate an exceedingly slow package initialization function
-       time.Sleep(100 * time.Millisecond)
-       initCh <- 42
-}
-
-func main() { ranMain = true }
-
-//export DidInitRun
-func DidInitRun() bool {
-       select {
-       case x := <-initCh:
-               if x != 42 {
-                       // Just in case initCh was not correctly made.
-                       println("want init value of 42, got: ", x)
-                       syscall.Exit(2)
-               }
-               return true
-       default:
-               return false
-       }
-}
-
-//export DidMainRun
-func DidMainRun() bool { return ranMain }
-
-//export CheckArgs
-func CheckArgs() {
-       if len(os.Args) != 3 || os.Args[1] != "arg1" || os.Args[2] != "arg2" {
-               fmt.Printf("CheckArgs: want [_, arg1, arg2], got: %v\n", os.Args)
-               os.Exit(2)
-       }
-}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go b/libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go
deleted file mode 100644 (file)
index 19c8e1a..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#include <signal.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-// Raise SIGPIPE.
-static void CRaiseSIGPIPE() {
-       int fds[2];
-
-       if (pipe(fds) == -1) {
-               perror("pipe");
-               exit(EXIT_FAILURE);
-       }
-       // Close the reader end
-       close(fds[0]);
-       // Write to the writer end to provoke a SIGPIPE
-       if (write(fds[1], "some data", 9) != -1) {
-               fprintf(stderr, "write to a closed pipe succeeded\n");
-               exit(EXIT_FAILURE);
-       }
-       close(fds[1]);
-}
-*/
-import "C"
-
-import (
-       "fmt"
-       "os"
-       "runtime"
-)
-
-// RunGoroutines starts some goroutines that don't do anything.
-// The idea is to get some threads going, so that a signal will be delivered
-// to a thread started by Go.
-//export RunGoroutines
-func RunGoroutines() {
-       for i := 0; i < 4; i++ {
-               go func() {
-                       runtime.LockOSThread()
-                       select {}
-               }()
-       }
-}
-
-var P *byte
-
-// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
-//export TestSEGV
-func TestSEGV() {
-       defer func() {
-               if recover() == nil {
-                       fmt.Fprintln(os.Stderr, "no panic from segv")
-                       os.Exit(1)
-               }
-       }()
-       *P = 0
-       fmt.Fprintln(os.Stderr, "continued after segv")
-       os.Exit(1)
-}
-
-// Noop ensures that the Go runtime is initialized.
-//export Noop
-func Noop() {
-}
-
-// Raise SIGPIPE.
-//export GoRaiseSIGPIPE
-func GoRaiseSIGPIPE() {
-       C.CRaiseSIGPIPE()
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go b/libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go
deleted file mode 100644 (file)
index 3725f7a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-import (
-       "os"
-       "os/signal"
-       "syscall"
-       "time"
-)
-
-// The channel used to read SIGIO signals.
-var sigioChan chan os.Signal
-
-// CatchSIGIO starts catching SIGIO signals.
-//export CatchSIGIO
-func CatchSIGIO() {
-       sigioChan = make(chan os.Signal, 1)
-       signal.Notify(sigioChan, syscall.SIGIO)
-}
-
-// ResetSIGIO stops catching SIGIO signals.
-//export ResetSIGIO
-func ResetSIGIO() {
-       signal.Reset(syscall.SIGIO)
-}
-
-// SawSIGIO reports whether we saw a SIGIO.
-//export SawSIGIO
-func SawSIGIO() C.int {
-       select {
-       case <-sigioChan:
-               return 1
-       case <-time.After(5 * time.Second):
-               return 0
-       }
-}
-
-// ProvokeSIGPIPE provokes a kernel-initiated SIGPIPE.
-//export ProvokeSIGPIPE
-func ProvokeSIGPIPE() {
-       r, w, err := os.Pipe()
-       if err != nil {
-               panic(err)
-       }
-       r.Close()
-       defer w.Close()
-       w.Write([]byte("some data"))
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go b/libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go
deleted file mode 100644 (file)
index 8cc1895..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#include <signal.h>
-#include <pthread.h>
-
-// Raise SIGIO.
-static void CRaiseSIGIO(pthread_t* p) {
-       pthread_kill(*p, SIGIO);
-}
-*/
-import "C"
-
-import (
-       "os"
-       "os/signal"
-       "sync/atomic"
-       "syscall"
-)
-
-var sigioCount int32
-
-// Catch SIGIO.
-//export GoCatchSIGIO
-func GoCatchSIGIO() {
-       c := make(chan os.Signal, 1)
-       signal.Notify(c, syscall.SIGIO)
-       go func() {
-               for range c {
-                       atomic.AddInt32(&sigioCount, 1)
-               }
-       }()
-}
-
-// Raise SIGIO.
-//export GoRaiseSIGIO
-func GoRaiseSIGIO(p *C.pthread_t) {
-       C.CRaiseSIGIO(p)
-}
-
-// Return the number of SIGIO signals seen.
-//export SIGIOCount
-func SIGIOCount() C.int {
-       return C.int(atomic.LoadInt32(&sigioCount))
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go b/libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go
deleted file mode 100644 (file)
index 4cb05dc..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "io/ioutil"
-       "runtime/pprof"
-)
-
-import "C"
-
-//export go_start_profile
-func go_start_profile() {
-       pprof.StartCPUProfile(ioutil.Discard)
-}
-
-//export go_stop_profile
-func go_stop_profile() {
-       pprof.StopCPUProfile()
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcarchive/src/p/p.go b/libgo/misc/cgo/testcarchive/src/p/p.go
deleted file mode 100644 (file)
index 82b445c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-import "C"
-
-//export FromPkg
-func FromPkg() int32 { return 1024 }
diff --git a/libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go b/libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go
new file mode 100644 (file)
index 0000000..37b30c1
--- /dev/null
@@ -0,0 +1,53 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "fmt"
+       "os"
+       "syscall"
+       "time"
+
+       _ "testcarchive/p"
+)
+
+import "C"
+
+var initCh = make(chan int, 1)
+var ranMain bool
+
+func init() {
+       // emulate an exceedingly slow package initialization function
+       time.Sleep(100 * time.Millisecond)
+       initCh <- 42
+}
+
+func main() { ranMain = true }
+
+//export DidInitRun
+func DidInitRun() bool {
+       select {
+       case x := <-initCh:
+               if x != 42 {
+                       // Just in case initCh was not correctly made.
+                       println("want init value of 42, got: ", x)
+                       syscall.Exit(2)
+               }
+               return true
+       default:
+               return false
+       }
+}
+
+//export DidMainRun
+func DidMainRun() bool { return ranMain }
+
+//export CheckArgs
+func CheckArgs() {
+       if len(os.Args) != 3 || os.Args[1] != "arg1" || os.Args[2] != "arg2" {
+               fmt.Printf("CheckArgs: want [_, arg1, arg2], got: %v\n", os.Args)
+               os.Exit(2)
+       }
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go b/libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go
new file mode 100644 (file)
index 0000000..19c8e1a
--- /dev/null
@@ -0,0 +1,80 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+// Raise SIGPIPE.
+static void CRaiseSIGPIPE() {
+       int fds[2];
+
+       if (pipe(fds) == -1) {
+               perror("pipe");
+               exit(EXIT_FAILURE);
+       }
+       // Close the reader end
+       close(fds[0]);
+       // Write to the writer end to provoke a SIGPIPE
+       if (write(fds[1], "some data", 9) != -1) {
+               fprintf(stderr, "write to a closed pipe succeeded\n");
+               exit(EXIT_FAILURE);
+       }
+       close(fds[1]);
+}
+*/
+import "C"
+
+import (
+       "fmt"
+       "os"
+       "runtime"
+)
+
+// RunGoroutines starts some goroutines that don't do anything.
+// The idea is to get some threads going, so that a signal will be delivered
+// to a thread started by Go.
+//export RunGoroutines
+func RunGoroutines() {
+       for i := 0; i < 4; i++ {
+               go func() {
+                       runtime.LockOSThread()
+                       select {}
+               }()
+       }
+}
+
+var P *byte
+
+// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
+//export TestSEGV
+func TestSEGV() {
+       defer func() {
+               if recover() == nil {
+                       fmt.Fprintln(os.Stderr, "no panic from segv")
+                       os.Exit(1)
+               }
+       }()
+       *P = 0
+       fmt.Fprintln(os.Stderr, "continued after segv")
+       os.Exit(1)
+}
+
+// Noop ensures that the Go runtime is initialized.
+//export Noop
+func Noop() {
+}
+
+// Raise SIGPIPE.
+//export GoRaiseSIGPIPE
+func GoRaiseSIGPIPE() {
+       C.CRaiseSIGPIPE()
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go b/libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go
new file mode 100644 (file)
index 0000000..3725f7a
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "C"
+
+import (
+       "os"
+       "os/signal"
+       "syscall"
+       "time"
+)
+
+// The channel used to read SIGIO signals.
+var sigioChan chan os.Signal
+
+// CatchSIGIO starts catching SIGIO signals.
+//export CatchSIGIO
+func CatchSIGIO() {
+       sigioChan = make(chan os.Signal, 1)
+       signal.Notify(sigioChan, syscall.SIGIO)
+}
+
+// ResetSIGIO stops catching SIGIO signals.
+//export ResetSIGIO
+func ResetSIGIO() {
+       signal.Reset(syscall.SIGIO)
+}
+
+// SawSIGIO reports whether we saw a SIGIO.
+//export SawSIGIO
+func SawSIGIO() C.int {
+       select {
+       case <-sigioChan:
+               return 1
+       case <-time.After(5 * time.Second):
+               return 0
+       }
+}
+
+// ProvokeSIGPIPE provokes a kernel-initiated SIGPIPE.
+//export ProvokeSIGPIPE
+func ProvokeSIGPIPE() {
+       r, w, err := os.Pipe()
+       if err != nil {
+               panic(err)
+       }
+       r.Close()
+       defer w.Close()
+       w.Write([]byte("some data"))
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go b/libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go
new file mode 100644 (file)
index 0000000..8cc1895
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <signal.h>
+#include <pthread.h>
+
+// Raise SIGIO.
+static void CRaiseSIGIO(pthread_t* p) {
+       pthread_kill(*p, SIGIO);
+}
+*/
+import "C"
+
+import (
+       "os"
+       "os/signal"
+       "sync/atomic"
+       "syscall"
+)
+
+var sigioCount int32
+
+// Catch SIGIO.
+//export GoCatchSIGIO
+func GoCatchSIGIO() {
+       c := make(chan os.Signal, 1)
+       signal.Notify(c, syscall.SIGIO)
+       go func() {
+               for range c {
+                       atomic.AddInt32(&sigioCount, 1)
+               }
+       }()
+}
+
+// Raise SIGIO.
+//export GoRaiseSIGIO
+func GoRaiseSIGIO(p *C.pthread_t) {
+       C.CRaiseSIGIO(p)
+}
+
+// Return the number of SIGIO signals seen.
+//export SIGIOCount
+func SIGIOCount() C.int {
+       return C.int(atomic.LoadInt32(&sigioCount))
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go b/libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go
new file mode 100644 (file)
index 0000000..4cb05dc
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "io/ioutil"
+       "runtime/pprof"
+)
+
+import "C"
+
+//export go_start_profile
+func go_start_profile() {
+       pprof.StartCPUProfile(ioutil.Discard)
+}
+
+//export go_stop_profile
+func go_stop_profile() {
+       pprof.StopCPUProfile()
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main.c b/libgo/misc/cgo/testcarchive/testdata/main.c
new file mode 100644 (file)
index 0000000..163b539
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "p.h"
+#include "libgo.h"
+
+extern int install_handler();
+extern int check_handler();
+
+int main(void) {
+       int32_t res;
+
+       int r1 = install_handler();
+       if (r1!=0) {
+               return r1;
+       }
+
+       if (!DidInitRun()) {
+               fprintf(stderr, "ERROR: buildmode=c-archive init should run\n");
+               return 2;
+       }
+
+       if (DidMainRun()) {
+               fprintf(stderr, "ERROR: buildmode=c-archive should not run main\n");
+               return 2;
+       }
+
+       int r2 = check_handler();
+       if (r2!=0) {
+               return r2;
+       }
+
+       res = FromPkg();
+       if (res != 1024) {
+               fprintf(stderr, "ERROR: FromPkg()=%d, want 1024\n", res);
+               return 2;
+       }
+
+       CheckArgs();
+
+       fprintf(stderr, "PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main2.c b/libgo/misc/cgo/testcarchive/testdata/main2.c
new file mode 100644 (file)
index 0000000..769cd49
--- /dev/null
@@ -0,0 +1,232 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test installing a signal handler before the Go code starts.
+// This is a lot like misc/cgo/testcshared/main4.c.
+
+#include <setjmp.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sched.h>
+#include <time.h>
+#include <errno.h>
+
+#include "libgo2.h"
+
+static void die(const char* msg) {
+       perror(msg);
+       exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+static volatile sig_atomic_t sigpipeSeen;
+
+// Use up some stack space.
+static void recur(int i, char *p) {
+       char a[1024];
+
+       *p = '\0';
+       if (i > 0) {
+               recur(i - 1, a);
+       }
+}
+
+static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
+       sigpipeSeen = 1;
+}
+
+// Signal handler that uses up more stack space than a goroutine will have.
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+       char a[1024];
+
+       recur(4, a);
+       sigioSeen = 1;
+}
+
+static jmp_buf jmp;
+static char* nullPointer;
+
+// An arbitrary function which requires proper stack alignment; see
+// http://golang.org/issue/17641.
+static void callWithVarargs(void* dummy, ...) {
+       va_list args;
+       va_start(args, dummy);
+       va_end(args);
+}
+
+// Signal handler for SIGSEGV on a C thread.
+static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
+       sigset_t mask;
+       int i;
+
+       // Call an arbitrary function that requires the stack to be properly aligned.
+       callWithVarargs("dummy arg", 3.1415);
+
+       if (sigemptyset(&mask) < 0) {
+               die("sigemptyset");
+       }
+       if (sigaddset(&mask, SIGSEGV) < 0) {
+               die("sigaddset");
+       }
+       i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+       if (i != 0) {
+               fprintf(stderr, "sigprocmask: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       // Don't try this at home.
+       longjmp(jmp, signo);
+
+       // We should never get here.
+       abort();
+}
+
+// Set up the signal handlers in a high priority constructor,
+// so that they are installed before the Go code starts.
+
+static void init(void) __attribute__ ((constructor (200)));
+
+static void init() {
+       struct sigaction sa;
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = ioHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGIO, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       sa.sa_sigaction = segvHandler;
+       if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       sa.sa_sigaction = pipeHandler;
+       if (sigaction(SIGPIPE, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+}
+
+int main(int argc, char** argv) {
+       int verbose;
+       sigset_t mask;
+       int i;
+       struct timespec ts;
+
+       verbose = argc > 1;
+       setvbuf(stdout, NULL, _IONBF, 0);
+
+       // Call setsid so that we can use kill(0, SIGIO) below.
+       // Don't check the return value so that this works both from
+       // a job control shell and from a shell script.
+       setsid();
+
+       if (verbose) {
+               printf("calling RunGoroutines\n");
+       }
+
+       RunGoroutines();
+
+       // Block SIGIO in this thread to make it more likely that it
+       // will be delivered to a goroutine.
+
+       if (verbose) {
+               printf("calling pthread_sigmask\n");
+       }
+
+       if (sigemptyset(&mask) < 0) {
+               die("sigemptyset");
+       }
+       if (sigaddset(&mask, SIGIO) < 0) {
+               die("sigaddset");
+       }
+       i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling kill\n");
+       }
+
+       if (kill(0, SIGIO) < 0) {
+               die("kill");
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for SIGIO\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       if (verbose) {
+               printf("provoking SIGPIPE\n");
+       }
+
+       GoRaiseSIGPIPE();
+
+       if (verbose) {
+               printf("waiting for sigpipeSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigpipeSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for SIGPIPE\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       if (verbose) {
+               printf("calling setjmp\n");
+       }
+
+       // Test that a SIGSEGV on this thread is delivered to us.
+       if (setjmp(jmp) == 0) {
+               if (verbose) {
+                       printf("triggering SIGSEGV\n");
+               }
+
+               *nullPointer = '\0';
+
+               fprintf(stderr, "continued after address error\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling TestSEGV\n");
+       }
+
+       TestSEGV();
+
+       printf("PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main3.c b/libgo/misc/cgo/testcarchive/testdata/main3.c
new file mode 100644 (file)
index 0000000..60a16cf
--- /dev/null
@@ -0,0 +1,189 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test os/signal.Notify and os/signal.Reset.
+// This is a lot like misc/cgo/testcshared/main5.c.
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sched.h>
+#include <unistd.h>
+
+#include "libgo3.h"
+
+static void die(const char* msg) {
+       perror(msg);
+       exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+       sigioSeen = 1;
+}
+
+// Set up the SIGPIPE signal handler in a high priority constructor, so
+// that it is installed before the Go code starts.
+
+static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
+       const char *s = "unexpected SIGPIPE\n";
+       write(2, s, strlen(s));
+       exit(EXIT_FAILURE);
+}
+
+static void init(void) __attribute__ ((constructor (200)));
+
+static void init() {
+    struct sigaction sa;
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = pipeHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGPIPE, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+}
+
+int main(int argc, char** argv) {
+       int verbose;
+       struct sigaction sa;
+       int i;
+       struct timespec ts;
+
+       verbose = argc > 2;
+       setvbuf(stdout, NULL, _IONBF, 0);
+
+       if (verbose) {
+               printf("raising SIGPIPE\n");
+       }
+
+       // Test that the Go runtime handles SIGPIPE, even if we installed
+       // a non-default SIGPIPE handler before the runtime initializes.
+       ProvokeSIGPIPE();
+
+       if (verbose) {
+               printf("calling sigaction\n");
+       }
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = ioHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGIO, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       // At this point there should not be a Go signal handler
+       // installed for SIGIO.
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       sigioSeen = 0;
+
+       // Tell the Go code to catch SIGIO.
+
+       if (verbose) {
+               printf("calling CatchSIGIO\n");
+       }
+
+       CatchSIGIO();
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("calling SawSIGIO\n");
+       }
+
+       if (!SawSIGIO()) {
+               fprintf(stderr, "Go handler did not see SIGIO\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (sigioSeen != 0) {
+               fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
+               exit(EXIT_FAILURE);
+       }
+
+       // Tell the Go code to stop catching SIGIO.
+
+       if (verbose) {
+               printf("calling ResetSIGIO\n");
+       }
+
+       ResetSIGIO();
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("calling SawSIGIO\n");
+       }
+
+       if (SawSIGIO()) {
+               fprintf(stderr, "Go handler saw SIGIO after Reset\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       printf("PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main4.c b/libgo/misc/cgo/testcarchive/testdata/main4.c
new file mode 100644 (file)
index 0000000..04f7740
--- /dev/null
@@ -0,0 +1,204 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test a C thread that calls sigaltstack and then calls Go code.
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sched.h>
+#include <pthread.h>
+
+#include "libgo4.h"
+
+#ifdef _AIX
+// On AIX, CSIGSTKSZ is too small to handle Go sighandler.
+#define CSIGSTKSZ 0x4000
+#else
+#define CSIGSTKSZ SIGSTKSZ
+#endif
+
+static void die(const char* msg) {
+       perror(msg);
+       exit(EXIT_FAILURE);
+}
+
+static int ok = 1;
+
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+}
+
+// Set up the SIGIO signal handler in a high priority constructor, so
+// that it is installed before the Go code starts.
+
+static void init(void) __attribute__ ((constructor (200)));
+
+static void init() {
+       struct sigaction sa;
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = ioHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
+       if (sigaction(SIGIO, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+}
+
+// Test raising SIGIO on a C thread with an alternate signal stack
+// when there is a Go signal handler for SIGIO.
+static void* thread1(void* arg __attribute__ ((unused))) {
+       stack_t ss;
+       int i;
+       stack_t nss;
+       struct timespec ts;
+
+       // Set up an alternate signal stack for this thread.
+       memset(&ss, 0, sizeof ss);
+       ss.ss_sp = malloc(CSIGSTKSZ);
+       if (ss.ss_sp == NULL) {
+               die("malloc");
+       }
+       ss.ss_flags = 0;
+       ss.ss_size = CSIGSTKSZ;
+       if (sigaltstack(&ss, NULL) < 0) {
+               die("sigaltstack");
+       }
+
+       // Send ourselves a SIGIO.  This will be caught by the Go
+       // signal handler which should forward to the C signal
+       // handler.
+       i = pthread_kill(pthread_self(), SIGIO);
+       if (i != 0) {
+               fprintf(stderr, "pthread_kill: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (SIGIOCount() == 0) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       // We should still be on the same signal stack.
+       if (sigaltstack(NULL, &nss) < 0) {
+               die("sigaltstack check");
+       }
+       if ((nss.ss_flags & SS_DISABLE) != 0) {
+               fprintf(stderr, "sigaltstack disabled on return from Go\n");
+               ok = 0;
+       } else if (nss.ss_sp != ss.ss_sp) {
+               fprintf(stderr, "sigaltstack changed on return from Go\n");
+               ok = 0;
+       }
+
+       return NULL;
+}
+
+// Test calling a Go function to raise SIGIO on a C thread with an
+// alternate signal stack when there is a Go signal handler for SIGIO.
+static void* thread2(void* arg __attribute__ ((unused))) {
+       stack_t ss;
+       int i;
+       int oldcount;
+       pthread_t tid;
+       struct timespec ts;
+       stack_t nss;
+
+       // Set up an alternate signal stack for this thread.
+       memset(&ss, 0, sizeof ss);
+       ss.ss_sp = malloc(CSIGSTKSZ);
+       if (ss.ss_sp == NULL) {
+               die("malloc");
+       }
+       ss.ss_flags = 0;
+       ss.ss_size = CSIGSTKSZ;
+       if (sigaltstack(&ss, NULL) < 0) {
+               die("sigaltstack");
+       }
+
+       oldcount = SIGIOCount();
+
+       // Call a Go function that will call a C function to send us a
+       // SIGIO.
+       tid = pthread_self();
+       GoRaiseSIGIO(&tid);
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (SIGIOCount() == oldcount) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       // We should still be on the same signal stack.
+       if (sigaltstack(NULL, &nss) < 0) {
+               die("sigaltstack check");
+       }
+       if ((nss.ss_flags & SS_DISABLE) != 0) {
+               fprintf(stderr, "sigaltstack disabled on return from Go\n");
+               ok = 0;
+       } else if (nss.ss_sp != ss.ss_sp) {
+               fprintf(stderr, "sigaltstack changed on return from Go\n");
+               ok = 0;
+       }
+
+       return NULL;
+}
+
+int main(int argc, char **argv) {
+       pthread_t tid;
+       int i;
+
+       // Tell the Go library to start looking for SIGIO.
+       GoCatchSIGIO();
+
+       i = pthread_create(&tid, NULL, thread1, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_create: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       i = pthread_join(tid, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_join: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       i = pthread_create(&tid, NULL, thread2, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_create: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       i = pthread_join(tid, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_join: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       if (!ok) {
+               exit(EXIT_FAILURE);
+       }
+
+       printf("PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main5.c b/libgo/misc/cgo/testcarchive/testdata/main5.c
new file mode 100644 (file)
index 0000000..d431ce0
--- /dev/null
@@ -0,0 +1,100 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test for verifying that the Go runtime properly forwards
+// signals when non-Go signals are raised.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/select.h>
+
+#include "libgo2.h"
+
+int *nilp;
+
+int main(int argc, char** argv) {
+       int verbose;
+       int test;
+
+       if (argc < 2) {
+               printf("Missing argument\n");
+               return 1;
+       }
+
+       test = atoi(argv[1]);
+
+       verbose = (argc > 2);
+
+       if (verbose) {
+               printf("calling RunGoroutines\n");
+       }
+
+       Noop();
+
+       switch (test) {
+               case 1: {
+                       if (verbose) {
+                               printf("attempting segfault\n");
+                       }
+
+                       *nilp = 0;
+                       break;
+               }
+
+               case 2: {
+                       struct timeval tv;
+
+                       if (verbose) {
+                               printf("attempting external signal test\n");
+                       }
+
+                       fprintf(stderr, "OK\n");
+                       fflush(stderr);
+
+                       // The program should be interrupted before
+                       // this sleep finishes. We use select rather
+                       // than sleep because in older versions of
+                       // glibc the sleep function does some signal
+                       // fiddling to handle SIGCHLD.  If this
+                       // program is fiddling signals just when the
+                       // test program sends the signal, the signal
+                       // may be delivered to a Go thread which will
+                       // break this test.
+                       tv.tv_sec = 60;
+                       tv.tv_usec = 0;
+                       select(0, NULL, NULL, NULL, &tv);
+
+                       break;
+               }
+               case 3: {
+                       if (verbose) {
+                               printf("attempting SIGPIPE\n");
+                       }
+
+                       int fd[2];
+                       if (pipe(fd) != 0) {
+                               printf("pipe(2) failed\n");
+                               return 0;
+                       }
+                       // Close the reading end.
+                       close(fd[0]);
+                       // Expect that write(2) fails (EPIPE)
+                       if (write(fd[1], "some data", 9) != -1) {
+                               printf("write(2) unexpectedly succeeded\n");
+                               return 0;
+                       }
+                       printf("did not receive SIGPIPE\n");
+                       return 0;
+               }
+               default:
+                       printf("Unknown test: %d\n", test);
+                       return 0;
+       }
+
+       printf("FAIL\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main6.c b/libgo/misc/cgo/testcarchive/testdata/main6.c
new file mode 100644 (file)
index 0000000..2745eb9
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that using the Go profiler in a C program does not crash.
+
+#include <stddef.h>
+#include <sys/time.h>
+
+#include "libgo6.h"
+
+int main(int argc, char **argv) {
+       struct timeval tvstart, tvnow;
+       int diff;
+
+       gettimeofday(&tvstart, NULL);
+
+       go_start_profile();
+
+       // Busy wait so we have something to profile.
+       // If we just sleep the profiling signal will never fire.
+       while (1) {
+               gettimeofday(&tvnow, NULL);
+               diff = (tvnow.tv_sec - tvstart.tv_sec) * 1000 * 1000 + (tvnow.tv_usec - tvstart.tv_usec);
+
+               // Profile frequency is 100Hz so we should definitely
+               // get a signal in 50 milliseconds.
+               if (diff > 50 * 1000)
+                       break;
+       }
+
+       go_stop_profile();
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/main_unix.c b/libgo/misc/cgo/testcarchive/testdata/main_unix.c
new file mode 100644 (file)
index 0000000..b23ac1c
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <signal.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct sigaction sa;
+struct sigaction osa;
+
+static void (*oldHandler)(int, siginfo_t*, void*);
+
+static void handler(int signo, siginfo_t* info, void* ctxt) {
+       if (oldHandler) {
+               oldHandler(signo, info, ctxt);
+       }
+}
+
+int install_handler() {
+       // Install our own signal handler.
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = handler;
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
+       memset(&osa, 0, sizeof osa);
+       sigemptyset(&osa.sa_mask);
+       if (sigaction(SIGSEGV, &sa, &osa) < 0) {
+               perror("sigaction");
+               return 2;
+       }
+       if (osa.sa_handler == SIG_DFL) {
+               fprintf(stderr, "Go runtime did not install signal handler\n");
+               return 2;
+       }
+       // gccgo does not set SA_ONSTACK for SIGSEGV.
+       if (getenv("GCCGO") == "" && (osa.sa_flags&SA_ONSTACK) == 0) {
+               fprintf(stderr, "Go runtime did not install signal handler\n");
+               return 2;
+       }
+       oldHandler = osa.sa_sigaction;
+
+       return 0;
+}
+
+int check_handler() {
+       if (sigaction(SIGSEGV, NULL, &sa) < 0) {
+               perror("sigaction check");
+               return 2;
+       }
+       if (sa.sa_sigaction != handler) {
+               fprintf(stderr, "ERROR: wrong signal handler: %p != %p\n", sa.sa_sigaction, handler);
+               return 2;
+       }
+       return 0;
+}
+
diff --git a/libgo/misc/cgo/testcarchive/testdata/main_windows.c b/libgo/misc/cgo/testcarchive/testdata/main_windows.c
new file mode 100644 (file)
index 0000000..eded8af
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+ * Dummy implementations for Windows, because Windows doesn't
+ * support Unix-style signal handling.
+ */
+
+int install_handler() {
+       return 0;
+}
+
+
+int check_handler() {
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcarchive/testdata/p/p.go b/libgo/misc/cgo/testcarchive/testdata/p/p.go
new file mode 100644 (file)
index 0000000..82b445c
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import "C"
+
+//export FromPkg
+func FromPkg() int32 { return 1024 }
index e5b90ff194ce147ef27fc72b5854c630c149cd73..daef3a9e54644d322212fd7bdd0d9f27147f189a 100644 (file)
@@ -5,14 +5,16 @@
 package cshared_test
 
 import (
+       "bytes"
        "debug/elf"
+       "flag"
        "fmt"
        "io/ioutil"
        "log"
        "os"
        "os/exec"
-       "path"
        "path/filepath"
+       "runtime"
        "strings"
        "sync"
        "testing"
@@ -22,9 +24,6 @@ import (
 // C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
 var cc []string
 
-// An environment with GOPATH=$(pwd).
-var gopathEnv []string
-
 // ".exe" on Windows.
 var exeSuffix string
 
@@ -33,6 +32,17 @@ var installdir, androiddir string
 var libSuffix, libgoname string
 
 func TestMain(m *testing.M) {
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       log.SetFlags(log.Lshortfile)
+       flag.Parse()
+       if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+               fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+               os.Exit(0)
+       }
+
        GOOS = goEnv("GOOS")
        GOARCH = goEnv("GOARCH")
        GOROOT = goEnv("GOROOT")
@@ -41,31 +51,17 @@ func TestMain(m *testing.M) {
                log.Fatalf("Unable able to find GOROOT at '%s'", GOROOT)
        }
 
-       // Directory where cgo headers and outputs will be installed.
-       // The installation directory format varies depending on the platform.
-       installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared", GOOS, GOARCH))
-       switch GOOS {
-       case "darwin":
-               libSuffix = "dylib"
-       case "windows":
-               libSuffix = "dll"
-       default:
-               libSuffix = "so"
-               installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared_shared", GOOS, GOARCH))
-       }
-
        androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid())
-       if GOOS == "android" {
-               args := append(adbCmd(), "shell", "mkdir", "-p", androiddir)
+       if runtime.GOOS != GOOS && GOOS == "android" {
+               args := append(adbCmd(), "exec-out", "mkdir", "-p", androiddir)
                cmd := exec.Command(args[0], args[1:]...)
                out, err := cmd.CombinedOutput()
                if err != nil {
                        log.Fatalf("setupAndroid failed: %v\n%s\n", err, out)
                }
+               defer cleanupAndroid()
        }
 
-       libgoname = "libgo." + libSuffix
-
        cc = []string{goEnv("CC")}
 
        out := goEnv("GOGCCFLAGS")
@@ -115,39 +111,62 @@ func TestMain(m *testing.M) {
                if GOARCH == "arm" || GOARCH == "arm64" {
                        libgodir += "_shared"
                }
-       case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+       case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
                libgodir += "_shared"
        }
        cc = append(cc, "-I", filepath.Join("pkg", libgodir))
 
-       // Build an environment with GOPATH=$(pwd)
-       dir, err := os.Getwd()
-       if err != nil {
-               fmt.Fprintln(os.Stderr, err)
-               os.Exit(2)
-       }
-       gopathEnv = append(os.Environ(), "GOPATH="+dir)
-
        if GOOS == "windows" {
                exeSuffix = ".exe"
        }
 
-       st := m.Run()
+       // Copy testdata into GOPATH/src/testcshared, along with a go.mod file
+       // declaring the same path.
 
-       os.Remove(libgoname)
-       os.RemoveAll("pkg")
-       cleanupHeaders()
-       cleanupAndroid()
+       GOPATH, err := ioutil.TempDir("", "cshared_test")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+       os.Setenv("GOPATH", GOPATH)
 
-       os.Exit(st)
+       // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+       // declaring the same path.
+       modRoot := filepath.Join(GOPATH, "src", "testcshared")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", modRoot)
+       if err := ioutil.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       // Directory where cgo headers and outputs will be installed.
+       // The installation directory format varies depending on the platform.
+       output, err := exec.Command("go", "list",
+               "-buildmode=c-shared",
+               "-installsuffix", "testcshared",
+               "-f", "{{.Target}}",
+               "./libgo").CombinedOutput()
+       if err != nil {
+               log.Panicf("go list failed: %v\n%s", err, output)
+       }
+       target := string(bytes.TrimSpace(output))
+       libgoname = filepath.Base(target)
+       installdir = filepath.Dir(target)
+       libSuffix = strings.TrimPrefix(filepath.Ext(target), ".")
+
+       return m.Run()
 }
 
 func goEnv(key string) string {
        out, err := exec.Command("go", "env", key).Output()
        if err != nil {
-               fmt.Fprintf(os.Stderr, "go env %s failed:\n%s", key, err)
-               fmt.Fprintf(os.Stderr, "%s", err.(*exec.ExitError).Stderr)
-               os.Exit(2)
+               log.Printf("go env %s failed:\n%s", key, err)
+               log.Panicf("%s", err.(*exec.ExitError).Stderr)
        }
        return strings.TrimSpace(string(out))
 }
@@ -165,7 +184,7 @@ func adbCmd() []string {
 }
 
 func adbPush(t *testing.T, filename string) {
-       if GOOS != "android" {
+       if runtime.GOOS == GOOS || GOOS != "android" {
                return
        }
        args := append(adbCmd(), "push", filename, fmt.Sprintf("%s/%s", androiddir, filename))
@@ -179,7 +198,7 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string {
        if GOOS != "android" {
                t.Fatalf("trying to run adb command when operating system is not android.")
        }
-       args := append(adbCmd(), "shell")
+       args := append(adbCmd(), "exec-out")
        // Propagate LD_LIBRARY_PATH to the adb shell invocation.
        for _, e := range env {
                if strings.Index(e, "LD_LIBRARY_PATH=") != -1 {
@@ -197,10 +216,12 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string {
        return strings.Replace(string(out), "\r", "", -1)
 }
 
-func run(t *testing.T, env []string, args ...string) string {
+func run(t *testing.T, extraEnv []string, args ...string) string {
        t.Helper()
        cmd := exec.Command(args[0], args[1:]...)
-       cmd.Env = env
+       if len(extraEnv) > 0 {
+               cmd.Env = append(os.Environ(), extraEnv...)
+       }
 
        if GOOS != "windows" {
                // TestUnexportedSymbols relies on file descriptor 30
@@ -220,12 +241,12 @@ func run(t *testing.T, env []string, args ...string) string {
        return string(out)
 }
 
-func runExe(t *testing.T, env []string, args ...string) string {
+func runExe(t *testing.T, extraEnv []string, args ...string) string {
        t.Helper()
-       if GOOS == "android" {
-               return adbRun(t, env, args...)
+       if runtime.GOOS != GOOS && GOOS == "android" {
+               return adbRun(t, append(os.Environ(), extraEnv...), args...)
        }
-       return run(t, env, args...)
+       return run(t, extraEnv, args...)
 }
 
 func runCC(t *testing.T, args ...string) string {
@@ -237,9 +258,8 @@ func runCC(t *testing.T, args ...string) string {
 
 func createHeaders() error {
        args := []string{"go", "install", "-i", "-buildmode=c-shared",
-               "-installsuffix", "testcshared", "libgo"}
+               "-installsuffix", "testcshared", "./libgo"}
        cmd := exec.Command(args[0], args[1:]...)
-       cmd.Env = gopathEnv
        out, err := cmd.CombinedOutput()
        if err != nil {
                return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
@@ -248,15 +268,14 @@ func createHeaders() error {
        args = []string{"go", "build", "-buildmode=c-shared",
                "-installsuffix", "testcshared",
                "-o", libgoname,
-               filepath.Join("src", "libgo", "libgo.go")}
+               filepath.Join(".", "libgo", "libgo.go")}
        cmd = exec.Command(args[0], args[1:]...)
-       cmd.Env = gopathEnv
        out, err = cmd.CombinedOutput()
        if err != nil {
                return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
        }
 
-       if GOOS == "android" {
+       if runtime.GOOS != GOOS && GOOS == "android" {
                args = append(adbCmd(), "push", libgoname, fmt.Sprintf("%s/%s", androiddir, libgoname))
                cmd = exec.Command(args[0], args[1:]...)
                out, err = cmd.CombinedOutput()
@@ -282,19 +301,15 @@ func createHeadersOnce(t *testing.T) {
        }
 }
 
-func cleanupHeaders() {
-       os.Remove("libgo.h")
-}
-
 func cleanupAndroid() {
        if GOOS != "android" {
                return
        }
-       args := append(adbCmd(), "shell", "rm", "-rf", androiddir)
+       args := append(adbCmd(), "exec-out", "rm", "-rf", androiddir)
        cmd := exec.Command(args[0], args[1:]...)
        out, err := cmd.CombinedOutput()
        if err != nil {
-               log.Fatalf("cleanupAndroid failed: %v\n%s\n", err, out)
+               log.Panicf("cleanupAndroid failed: %v\n%s\n", err, out)
        }
 }
 
@@ -312,7 +327,7 @@ func TestExportedSymbols(t *testing.T) {
 
        defer os.Remove(bin)
 
-       out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin)
+       out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
        if strings.TrimSpace(out) != "PASS" {
                t.Error(out)
        }
@@ -361,11 +376,11 @@ func TestUnexportedSymbols(t *testing.T) {
        libname := "libgo2." + libSuffix
 
        run(t,
-               gopathEnv,
+               nil,
                "go", "build",
                "-buildmode=c-shared",
                "-installsuffix", "testcshared",
-               "-o", libname, "libgo2",
+               "-o", libname, "./libgo2",
        )
        adbPush(t, libname)
 
@@ -380,7 +395,7 @@ func TestUnexportedSymbols(t *testing.T) {
        defer os.Remove(libname)
        defer os.Remove(bin)
 
-       out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin)
+       out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
 
        if strings.TrimSpace(out) != "PASS" {
                t.Error(out)
@@ -418,7 +433,7 @@ func TestMainExportedOnAndroid(t *testing.T) {
 func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
        libname := pkgname + "." + libSuffix
        run(t,
-               gopathEnv,
+               nil,
                "go", "build",
                "-buildmode=c-shared",
                "-installsuffix", "testcshared",
@@ -451,7 +466,7 @@ func TestSignalHandlers(t *testing.T) {
                t.Logf("Skipping on %s", GOOS)
                return
        }
-       testSignalHandlers(t, "libgo4", "main4.c", "testp4")
+       testSignalHandlers(t, "./libgo4", "main4.c", "testp4")
 }
 
 // test5: test signal handlers with os/signal.Notify
@@ -461,7 +476,7 @@ func TestSignalHandlersWithNotify(t *testing.T) {
                t.Logf("Skipping on %s", GOOS)
                return
        }
-       testSignalHandlers(t, "libgo5", "main5.c", "testp5")
+       testSignalHandlers(t, "./libgo5", "main5.c", "testp5")
 }
 
 func TestPIE(t *testing.T) {
@@ -513,16 +528,18 @@ func TestCachedInstall(t *testing.T) {
        if err != nil {
                t.Fatal(err)
        }
-       // defer os.RemoveAll(tmpdir)
+       defer os.RemoveAll(tmpdir)
 
-       copyFile(t, filepath.Join(tmpdir, "src", "libgo", "libgo.go"), filepath.Join("src", "libgo", "libgo.go"))
-       copyFile(t, filepath.Join(tmpdir, "src", "p", "p.go"), filepath.Join("src", "p", "p.go"))
+       copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod")
+       copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
+       copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
 
-       env := append(os.Environ(), "GOPATH="+tmpdir)
+       env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
 
-       buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "libgo"}
+       buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
 
        cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
        cmd.Env = env
        t.Log(buildcmd)
        out, err := cmd.CombinedOutput()
@@ -572,6 +589,7 @@ func TestCachedInstall(t *testing.T) {
        }
 
        cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
        cmd.Env = env
        t.Log(buildcmd)
        out, err = cmd.CombinedOutput()
@@ -621,8 +639,8 @@ func TestGo2C2Go(t *testing.T) {
        }
        defer os.RemoveAll(tmpdir)
 
-       shlib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix)
-       run(t, gopathEnv, "go", "build", "-buildmode=c-shared", "-o", shlib, "go2c2go/go")
+       lib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix)
+       run(t, nil, "go", "build", "-buildmode=c-shared", "-o", lib, "./go2c2go/go")
 
        cgoCflags := os.Getenv("CGO_CFLAGS")
        if cgoCflags != "" {
@@ -636,7 +654,7 @@ func TestGo2C2Go(t *testing.T) {
        }
        cgoLdflags += "-L" + tmpdir + " -ltestgo2c2go"
 
-       goenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "CGO_CFLAGS="+cgoCflags, "CGO_LDFLAGS="+cgoLdflags)
+       goenv := []string{"CGO_CFLAGS=" + cgoCflags, "CGO_LDFLAGS=" + cgoLdflags}
 
        ldLibPath := os.Getenv("LD_LIBRARY_PATH")
        if ldLibPath != "" {
@@ -644,13 +662,13 @@ func TestGo2C2Go(t *testing.T) {
        }
        ldLibPath += tmpdir
 
-       runenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "LD_LIBRARY_PATH="+ldLibPath)
+       runenv := []string{"LD_LIBRARY_PATH=" + ldLibPath}
 
        bin := filepath.Join(tmpdir, "m1") + exeSuffix
-       run(t, goenv, "go", "build", "-o", bin, "go2c2go/m1")
+       run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m1")
        runExe(t, runenv, bin)
 
        bin = filepath.Join(tmpdir, "m2") + exeSuffix
-       run(t, goenv, "go", "build", "-o", bin, "go2c2go/m2")
+       run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
        runExe(t, runenv, bin)
 }
diff --git a/libgo/misc/cgo/testcshared/main0.c b/libgo/misc/cgo/testcshared/main0.c
deleted file mode 100644 (file)
index 39ef7e3..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-
-#include "p.h"
-#include "libgo.h"
-
-// Tests libgo.so to export the following functions.
-//   int8_t DidInitRun();
-//   int8_t DidMainRun();
-//   int32_t FromPkg();
-//   uint32_t Divu(uint32_t, uint32_t);
-int main(void) {
-  int8_t ran_init = DidInitRun();
-  if (!ran_init) {
-    fprintf(stderr, "ERROR: DidInitRun returned unexpected results: %d\n",
-            ran_init);
-    return 1;
-  }
-  int8_t ran_main = DidMainRun();
-  if (ran_main) {
-    fprintf(stderr, "ERROR: DidMainRun returned unexpected results: %d\n",
-            ran_main);
-    return 1;
-  }
-  int32_t from_pkg = FromPkg();
-  if (from_pkg != 1024) {
-    fprintf(stderr, "ERROR: FromPkg=%d, want %d\n", from_pkg, 1024);
-    return 1;
-  }
-  uint32_t divu = Divu(2264, 31);
-  if (divu != 73) {
-    fprintf(stderr, "ERROR: Divu(2264, 31)=%d, want %d\n", divu, 73);
-    return 1;
-  }
-  // test.bash looks for "PASS" to ensure this program has reached the end. 
-  printf("PASS\n");
-  return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/main1.c b/libgo/misc/cgo/testcshared/main1.c
deleted file mode 100644 (file)
index 420dd1e..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-#include <dlfcn.h>
-
-int check_int8(void* handle, const char* fname, int8_t want) {
-  int8_t (*fn)();
-  fn = (int8_t (*)())dlsym(handle, fname);
-  if (!fn) {
-    fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
-    return 1;
-  }
-  signed char ret = fn();
-  if (ret != want) {
-    fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
-    return 1;
-  }
-  return 0;
-}
-
-int check_int32(void* handle, const char* fname, int32_t want) {
-  int32_t (*fn)();
-  fn = (int32_t (*)())dlsym(handle, fname);
-  if (!fn) {
-    fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
-    return 1;
-  }
-  int32_t ret = fn();
-  if (ret != want) {
-    fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
-    return 1;
-  }
-  return 0;
-}
-
-// Tests libgo.so to export the following functions.
-//   int8_t DidInitRun() // returns true
-//   int8_t DidMainRun() // returns true
-//   int32_t FromPkg() // returns 1024
-int main(int argc, char** argv) {
-  void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
-  if (!handle) {
-    fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
-                   dlerror());
-    return 2;
-  }
-
-  int ret = 0;
-  ret = check_int8(handle, "DidInitRun", 1);
-  if (ret != 0) {
-    return ret;
-  }
-
-  ret = check_int8(handle, "DidMainRun", 0);
-  if (ret != 0) {
-    return ret;
-  }
-
-  ret = check_int32(handle, "FromPkg", 1024);
-  if (ret != 0) {
-   return ret;
-  }
-  // test.bash looks for "PASS" to ensure this program has reached the end. 
-  printf("PASS\n");
-  return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/main2.c b/libgo/misc/cgo/testcshared/main2.c
deleted file mode 100644 (file)
index f89bcca..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#define fd (30)
-
-// Tests libgo2.so, which does not export any functions.
-// Read a string from the file descriptor and print it.
-int main(void) {
-  int i;
-  ssize_t n;
-  char buf[20];
-  struct timespec ts;
-
-  // The descriptor will be initialized in a thread, so we have to
-  // give a chance to get opened.
-  for (i = 0; i < 200; i++) {
-    n = read(fd, buf, sizeof buf);
-    if (n >= 0)
-      break;
-    if (errno != EBADF && errno != EINVAL) {
-      fprintf(stderr, "BUG: read: %s\n", strerror(errno));
-      return 2;
-    }
-
-    // An EBADF error means that the shared library has not opened the
-    // descriptor yet.
-    ts.tv_sec = 0;
-    ts.tv_nsec = 10000000;
-    nanosleep(&ts, NULL);
-  }
-
-  if (n < 0) {
-    fprintf(stderr, "BUG: failed to read any data from pipe\n");
-    return 2;
-  }
-
-  if (n == 0) {
-    fprintf(stderr, "BUG: unexpected EOF\n");
-    return 2;
-  }
-
-  if (n == sizeof buf) {
-    n--;
-  }
-  buf[n] = '\0';
-  printf("%s\n", buf);
-  return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/main3.c b/libgo/misc/cgo/testcshared/main3.c
deleted file mode 100644 (file)
index 49cc055..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-#include <dlfcn.h>
-
-// Tests "main.main" is exported on android/arm,
-// which golang.org/x/mobile/app depends on.
-int main(int argc, char** argv) {
-  void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
-  if (!handle) {
-    fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
-            dlerror());
-    return 2;
-  }
-
-  uintptr_t main_fn = (uintptr_t)dlsym(handle, "main.main");
-  if (!main_fn) {
-    fprintf(stderr, "ERROR: missing main.main: %s\n", dlerror());
-    return 2;
-  }
-
-  // TODO(hyangah): check that main.main can run.
-
-  printf("PASS\n");
-  return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/main4.c b/libgo/misc/cgo/testcshared/main4.c
deleted file mode 100644 (file)
index 355cdef..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that a signal handler that uses up stack space does not crash
-// if the signal is delivered to a thread running a goroutine.
-// This is a lot like misc/cgo/testcarchive/main2.c.
-
-#include <setjmp.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sched.h>
-#include <time.h>
-#include <dlfcn.h>
-
-static void die(const char* msg) {
-       perror(msg);
-       exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-// Use up some stack space.
-static void recur(int i, char *p) {
-       char a[1024];
-
-       *p = '\0';
-       if (i > 0) {
-               recur(i - 1, a);
-       }
-}
-
-// Signal handler that uses up more stack space than a goroutine will have.
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-       char a[1024];
-
-       recur(4, a);
-       sigioSeen = 1;
-}
-
-static jmp_buf jmp;
-static char* nullPointer;
-
-// Signal handler for SIGSEGV on a C thread.
-static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigset_t mask;
-       int i;
-
-       if (sigemptyset(&mask) < 0) {
-               die("sigemptyset");
-       }
-       if (sigaddset(&mask, SIGSEGV) < 0) {
-               die("sigaddset");
-       }
-       i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
-       if (i != 0) {
-               fprintf(stderr, "sigprocmask: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       // Don't try this at home.
-       longjmp(jmp, signo);
-
-       // We should never get here.
-       abort();
-}
-
-int main(int argc, char** argv) {
-       int verbose;
-       struct sigaction sa;
-       void* handle;
-       void (*fn)(void);
-       sigset_t mask;
-       int i;
-       struct timespec ts;
-
-       verbose = argc > 2;
-       setvbuf(stdout, NULL, _IONBF, 0);
-
-       // Call setsid so that we can use kill(0, SIGIO) below.
-       // Don't check the return value so that this works both from
-       // a job control shell and from a shell script.
-       setsid();
-
-       if (verbose) {
-               printf("calling sigaction\n");
-       }
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = ioHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO;
-       if (sigaction(SIGIO, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       sa.sa_sigaction = segvHandler;
-       if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       if (verbose) {
-               printf("calling dlopen\n");
-       }
-
-       handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
-       if (handle == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling dlsym\n");
-       }
-
-       // Start some goroutines.
-       fn = (void(*)(void))dlsym(handle, "RunGoroutines");
-       if (fn == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling RunGoroutines\n");
-       }
-
-       fn();
-
-       // Block SIGIO in this thread to make it more likely that it
-       // will be delivered to a goroutine.
-
-       if (verbose) {
-               printf("calling pthread_sigmask\n");
-       }
-
-       if (sigemptyset(&mask) < 0) {
-               die("sigemptyset");
-       }
-       if (sigaddset(&mask, SIGIO) < 0) {
-               die("sigaddset");
-       }
-       i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
-       if (i != 0) {
-               fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling kill\n");
-       }
-
-       if (kill(0, SIGIO) < 0) {
-               die("kill");
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       if (verbose) {
-               printf("calling setjmp\n");
-       }
-
-       // Test that a SIGSEGV on this thread is delivered to us.
-       if (setjmp(jmp) == 0) {
-               if (verbose) {
-                       printf("triggering SIGSEGV\n");
-               }
-
-               *nullPointer = '\0';
-
-               fprintf(stderr, "continued after address error\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling dlsym\n");
-       }
-
-       // Make sure that a SIGSEGV in Go causes a run-time panic.
-       fn = (void (*)(void))dlsym(handle, "TestSEGV");
-       if (fn == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling TestSEGV\n");
-       }
-
-       fn();
-
-       printf("PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/main5.c b/libgo/misc/cgo/testcshared/main5.c
deleted file mode 100644 (file)
index 1bc9910..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that a signal handler works in non-Go code when using
-// os/signal.Notify.
-// This is a lot like misc/cgo/testcarchive/main3.c.
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sched.h>
-#include <dlfcn.h>
-
-static void die(const char* msg) {
-       perror(msg);
-       exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigioSeen = 1;
-}
-
-int main(int argc, char** argv) {
-       int verbose;
-       struct sigaction sa;
-       void* handle;
-       void (*fn1)(void);
-       int (*sawSIGIO)(void);
-       int i;
-       struct timespec ts;
-
-       verbose = argc > 2;
-       setvbuf(stdout, NULL, _IONBF, 0);
-
-       if (verbose) {
-               printf("calling sigaction\n");
-       }
-
-       memset(&sa, 0, sizeof sa);
-       sa.sa_sigaction = ioHandler;
-       if (sigemptyset(&sa.sa_mask) < 0) {
-               die("sigemptyset");
-       }
-       sa.sa_flags = SA_SIGINFO;
-       if (sigaction(SIGIO, &sa, NULL) < 0) {
-               die("sigaction");
-       }
-
-       if (verbose) {
-               printf("calling dlopen\n");
-       }
-
-       handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
-       if (handle == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       // At this point there should not be a Go signal handler
-       // installed for SIGIO.
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       sigioSeen = 0;
-
-       // Tell the Go code to catch SIGIO.
-
-       if (verbose) {
-               printf("calling dlsym\n");
-       }
-
-       fn1 = (void(*)(void))dlsym(handle, "CatchSIGIO");
-       if (fn1 == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling CatchSIGIO\n");
-       }
-
-       fn1();
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("calling dlsym\n");
-       }
-
-       // Check that the Go code saw SIGIO.
-       sawSIGIO = (int (*)(void))dlsym(handle, "SawSIGIO");
-       if (sawSIGIO == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling SawSIGIO\n");
-       }
-
-       if (!sawSIGIO()) {
-               fprintf(stderr, "Go handler did not see SIGIO\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (sigioSeen != 0) {
-               fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
-               exit(EXIT_FAILURE);
-       }
-
-       // Tell the Go code to stop catching SIGIO.
-
-       if (verbose) {
-               printf("calling dlsym\n");
-       }
-
-       fn1 = (void(*)(void))dlsym(handle, "ResetSIGIO");
-       if (fn1 == NULL) {
-               fprintf(stderr, "%s\n", dlerror());
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("calling ResetSIGIO\n");
-       }
-
-       fn1();
-
-       if (verbose) {
-               printf("raising SIGIO\n");
-       }
-
-       if (raise(SIGIO) < 0) {
-               die("raise");
-       }
-
-       if (verbose) {
-               printf("calling SawSIGIO\n");
-       }
-
-       if (sawSIGIO()) {
-               fprintf(stderr, "Go handler saw SIGIO after Reset\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (verbose) {
-               printf("waiting for sigioSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigioSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for signal\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       printf("PASS\n");
-       return 0;
-}
diff --git a/libgo/misc/cgo/testcshared/overlaydir_test.go b/libgo/misc/cgo/testcshared/overlaydir_test.go
new file mode 100644 (file)
index 0000000..1eaabf6
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cshared_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go b/libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go
deleted file mode 100644 (file)
index 76a5323..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-//export GoFunc
-func GoFunc() int { return 1 }
-
-func main() {}
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c b/libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c
deleted file mode 100644 (file)
index 0e8fac4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "libtestgo2c2go.h"
-
-int CFunc(void) {
-       return (GoFunc() << 8) + 2;
-}
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go b/libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go
deleted file mode 100644 (file)
index 17ba1eb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// extern int CFunc(void);
-import "C"
-
-import (
-       "fmt"
-       "os"
-)
-
-func main() {
-       got := C.CFunc()
-       const want = (1 << 8) | 2
-       if got != want {
-               fmt.Printf("got %#x, want %#x\n", got, want)
-               os.Exit(1)
-       }
-}
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go b/libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go
deleted file mode 100644 (file)
index 91bf308..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// #include "libtestgo2c2go.h"
-import "C"
-
-import (
-       "fmt"
-       "os"
-)
-
-func main() {
-       got := C.GoFunc()
-       const want = 1
-       if got != want {
-               fmt.Printf("got %#x, want %#x\n", got, want)
-               os.Exit(1)
-       }
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo/libgo.go b/libgo/misc/cgo/testcshared/src/libgo/libgo.go
deleted file mode 100644 (file)
index 8a4bf79..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       _ "p"
-       "syscall"
-       "time"
-)
-
-import "C"
-
-var initCh = make(chan int, 1)
-var ranMain bool
-
-func init() {
-       // emulate an exceedingly slow package initialization function
-       time.Sleep(100 * time.Millisecond)
-       initCh <- 42
-}
-
-func main() {
-       ranMain = true
-}
-
-//export DidInitRun
-func DidInitRun() bool {
-       select {
-       case x := <-initCh:
-               if x != 42 {
-                       // Just in case initCh was not correctly made.
-                       println("want init value of 42, got: ", x)
-                       syscall.Exit(2)
-               }
-               return true
-       default:
-               return false
-       }
-}
-
-//export DidMainRun
-func DidMainRun() bool {
-       return ranMain
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/dup2.go b/libgo/misc/cgo/testcshared/src/libgo2/dup2.go
deleted file mode 100644 (file)
index d343aa5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux,!arm64,!riscv64 netbsd openbsd
-
-package main
-
-import "syscall"
-
-func dup2(oldfd, newfd int) error {
-       return syscall.Dup2(oldfd, newfd)
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/dup3.go b/libgo/misc/cgo/testcshared/src/libgo2/dup3.go
deleted file mode 100644 (file)
index 459f0dc..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux,arm64 linux,riscv64
-
-package main
-
-import "syscall"
-
-func dup2(oldfd, newfd int) error {
-       return syscall.Dup3(oldfd, newfd, 0)
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/libgo2.go b/libgo/misc/cgo/testcshared/src/libgo2/libgo2.go
deleted file mode 100644 (file)
index e57c93b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package main
-
-// Test a shared library created by -buildmode=c-shared that does not
-// export anything.
-
-import (
-       "fmt"
-       "os"
-       "syscall"
-)
-
-// To test this we want to communicate between the main program and
-// the shared library without using any exported symbols.  The init
-// function creates a pipe and Dups the read end to a known number
-// that the C code can also use.
-
-const (
-       fd = 30
-)
-
-func init() {
-       var p [2]int
-       if e := syscall.Pipe(p[0:]); e != nil {
-               fmt.Fprintf(os.Stderr, "pipe: %v\n", e)
-               os.Exit(2)
-       }
-
-       if e := dup2(p[0], fd); e != nil {
-               fmt.Fprintf(os.Stderr, "dup2: %v\n", e)
-               os.Exit(2)
-       }
-
-       const str = "PASS"
-       if n, e := syscall.Write(p[1], []byte(str)); e != nil || n != len(str) {
-               fmt.Fprintf(os.Stderr, "write: %d %v\n", n, e)
-               os.Exit(2)
-       }
-
-       if e := syscall.Close(p[1]); e != nil {
-               fmt.Fprintf(os.Stderr, "close: %v\n", e)
-               os.Exit(2)
-       }
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo4/libgo4.go b/libgo/misc/cgo/testcshared/src/libgo4/libgo4.go
deleted file mode 100644 (file)
index ab40b75..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-import (
-       "fmt"
-       "os"
-       "runtime"
-)
-
-// RunGoroutines starts some goroutines that don't do anything.
-// The idea is to get some threads going, so that a signal will be delivered
-// to a thread started by Go.
-//export RunGoroutines
-func RunGoroutines() {
-       for i := 0; i < 4; i++ {
-               go func() {
-                       runtime.LockOSThread()
-                       select {}
-               }()
-       }
-}
-
-var P *byte
-
-// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
-//export TestSEGV
-func TestSEGV() {
-       defer func() {
-               if recover() == nil {
-                       fmt.Fprintln(os.Stderr, "no panic from segv")
-                       os.Exit(1)
-               }
-       }()
-       *P = 0
-       fmt.Fprintln(os.Stderr, "continued after segv")
-       os.Exit(1)
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcshared/src/libgo5/libgo5.go b/libgo/misc/cgo/testcshared/src/libgo5/libgo5.go
deleted file mode 100644 (file)
index 94e5d21..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-import (
-       "os"
-       "os/signal"
-       "syscall"
-       "time"
-)
-
-// The channel used to read SIGIO signals.
-var sigioChan chan os.Signal
-
-// CatchSIGIO starts catching SIGIO signals.
-//export CatchSIGIO
-func CatchSIGIO() {
-       sigioChan = make(chan os.Signal, 1)
-       signal.Notify(sigioChan, syscall.SIGIO)
-}
-
-// ResetSIGIO stops catching SIGIO signals.
-//export ResetSIGIO
-func ResetSIGIO() {
-       signal.Reset(syscall.SIGIO)
-}
-
-// SawSIGIO returns whether we saw a SIGIO within a brief pause.
-//export SawSIGIO
-func SawSIGIO() C.int {
-       select {
-       case <-sigioChan:
-               return 1
-       case <-time.After(100 * time.Millisecond):
-               return 0
-       }
-}
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testcshared/src/p/p.go b/libgo/misc/cgo/testcshared/src/p/p.go
deleted file mode 100644 (file)
index 0f02cf3..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-import "C"
-
-//export FromPkg
-func FromPkg() int32 { return 1024 }
-
-//export Divu
-func Divu(a, b uint32) uint32 { return a / b }
diff --git a/libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go
new file mode 100644 (file)
index 0000000..76a5323
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "C"
+
+//export GoFunc
+func GoFunc() int { return 1 }
+
+func main() {}
diff --git a/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c
new file mode 100644 (file)
index 0000000..0e8fac4
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "libtestgo2c2go.h"
+
+int CFunc(void) {
+       return (GoFunc() << 8) + 2;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go
new file mode 100644 (file)
index 0000000..17ba1eb
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// extern int CFunc(void);
+import "C"
+
+import (
+       "fmt"
+       "os"
+)
+
+func main() {
+       got := C.CFunc()
+       const want = (1 << 8) | 2
+       if got != want {
+               fmt.Printf("got %#x, want %#x\n", got, want)
+               os.Exit(1)
+       }
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go
new file mode 100644 (file)
index 0000000..91bf308
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// #include "libtestgo2c2go.h"
+import "C"
+
+import (
+       "fmt"
+       "os"
+)
+
+func main() {
+       got := C.GoFunc()
+       const want = 1
+       if got != want {
+               fmt.Printf("got %#x, want %#x\n", got, want)
+               os.Exit(1)
+       }
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo/libgo.go b/libgo/misc/cgo/testcshared/testdata/libgo/libgo.go
new file mode 100644 (file)
index 0000000..0634417
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "syscall"
+       _ "testcshared/p"
+       "time"
+)
+
+import "C"
+
+var initCh = make(chan int, 1)
+var ranMain bool
+
+func init() {
+       // emulate an exceedingly slow package initialization function
+       time.Sleep(100 * time.Millisecond)
+       initCh <- 42
+}
+
+func main() {
+       ranMain = true
+}
+
+//export DidInitRun
+func DidInitRun() bool {
+       select {
+       case x := <-initCh:
+               if x != 42 {
+                       // Just in case initCh was not correctly made.
+                       println("want init value of 42, got: ", x)
+                       syscall.Exit(2)
+               }
+               return true
+       default:
+               return false
+       }
+}
+
+//export DidMainRun
+func DidMainRun() bool {
+       return ranMain
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go b/libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go
new file mode 100644 (file)
index 0000000..d18f0b1
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux,!arm64 netbsd openbsd
+
+package main
+
+import "syscall"
+
+func dup2(oldfd, newfd int) error {
+       return syscall.Dup2(oldfd, newfd)
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go b/libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go
new file mode 100644 (file)
index 0000000..c9c65a6
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux,arm64
+
+package main
+
+import "syscall"
+
+func dup2(oldfd, newfd int) error {
+       return syscall.Dup3(oldfd, newfd, 0)
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go b/libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go
new file mode 100644 (file)
index 0000000..e57c93b
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package main
+
+// Test a shared library created by -buildmode=c-shared that does not
+// export anything.
+
+import (
+       "fmt"
+       "os"
+       "syscall"
+)
+
+// To test this we want to communicate between the main program and
+// the shared library without using any exported symbols.  The init
+// function creates a pipe and Dups the read end to a known number
+// that the C code can also use.
+
+const (
+       fd = 30
+)
+
+func init() {
+       var p [2]int
+       if e := syscall.Pipe(p[0:]); e != nil {
+               fmt.Fprintf(os.Stderr, "pipe: %v\n", e)
+               os.Exit(2)
+       }
+
+       if e := dup2(p[0], fd); e != nil {
+               fmt.Fprintf(os.Stderr, "dup2: %v\n", e)
+               os.Exit(2)
+       }
+
+       const str = "PASS"
+       if n, e := syscall.Write(p[1], []byte(str)); e != nil || n != len(str) {
+               fmt.Fprintf(os.Stderr, "write: %d %v\n", n, e)
+               os.Exit(2)
+       }
+
+       if e := syscall.Close(p[1]); e != nil {
+               fmt.Fprintf(os.Stderr, "close: %v\n", e)
+               os.Exit(2)
+       }
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go b/libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go
new file mode 100644 (file)
index 0000000..ab40b75
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "C"
+
+import (
+       "fmt"
+       "os"
+       "runtime"
+)
+
+// RunGoroutines starts some goroutines that don't do anything.
+// The idea is to get some threads going, so that a signal will be delivered
+// to a thread started by Go.
+//export RunGoroutines
+func RunGoroutines() {
+       for i := 0; i < 4; i++ {
+               go func() {
+                       runtime.LockOSThread()
+                       select {}
+               }()
+       }
+}
+
+var P *byte
+
+// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
+//export TestSEGV
+func TestSEGV() {
+       defer func() {
+               if recover() == nil {
+                       fmt.Fprintln(os.Stderr, "no panic from segv")
+                       os.Exit(1)
+               }
+       }()
+       *P = 0
+       fmt.Fprintln(os.Stderr, "continued after segv")
+       os.Exit(1)
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go b/libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go
new file mode 100644 (file)
index 0000000..94e5d21
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "C"
+
+import (
+       "os"
+       "os/signal"
+       "syscall"
+       "time"
+)
+
+// The channel used to read SIGIO signals.
+var sigioChan chan os.Signal
+
+// CatchSIGIO starts catching SIGIO signals.
+//export CatchSIGIO
+func CatchSIGIO() {
+       sigioChan = make(chan os.Signal, 1)
+       signal.Notify(sigioChan, syscall.SIGIO)
+}
+
+// ResetSIGIO stops catching SIGIO signals.
+//export ResetSIGIO
+func ResetSIGIO() {
+       signal.Reset(syscall.SIGIO)
+}
+
+// SawSIGIO returns whether we saw a SIGIO within a brief pause.
+//export SawSIGIO
+func SawSIGIO() C.int {
+       select {
+       case <-sigioChan:
+               return 1
+       case <-time.After(100 * time.Millisecond):
+               return 0
+       }
+}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main0.c b/libgo/misc/cgo/testcshared/testdata/main0.c
new file mode 100644 (file)
index 0000000..39ef7e3
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <stdint.h>
+#include <stdio.h>
+
+#include "p.h"
+#include "libgo.h"
+
+// Tests libgo.so to export the following functions.
+//   int8_t DidInitRun();
+//   int8_t DidMainRun();
+//   int32_t FromPkg();
+//   uint32_t Divu(uint32_t, uint32_t);
+int main(void) {
+  int8_t ran_init = DidInitRun();
+  if (!ran_init) {
+    fprintf(stderr, "ERROR: DidInitRun returned unexpected results: %d\n",
+            ran_init);
+    return 1;
+  }
+  int8_t ran_main = DidMainRun();
+  if (ran_main) {
+    fprintf(stderr, "ERROR: DidMainRun returned unexpected results: %d\n",
+            ran_main);
+    return 1;
+  }
+  int32_t from_pkg = FromPkg();
+  if (from_pkg != 1024) {
+    fprintf(stderr, "ERROR: FromPkg=%d, want %d\n", from_pkg, 1024);
+    return 1;
+  }
+  uint32_t divu = Divu(2264, 31);
+  if (divu != 73) {
+    fprintf(stderr, "ERROR: Divu(2264, 31)=%d, want %d\n", divu, 73);
+    return 1;
+  }
+  // test.bash looks for "PASS" to ensure this program has reached the end. 
+  printf("PASS\n");
+  return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main1.c b/libgo/misc/cgo/testcshared/testdata/main1.c
new file mode 100644 (file)
index 0000000..420dd1e
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <dlfcn.h>
+
+int check_int8(void* handle, const char* fname, int8_t want) {
+  int8_t (*fn)();
+  fn = (int8_t (*)())dlsym(handle, fname);
+  if (!fn) {
+    fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
+    return 1;
+  }
+  signed char ret = fn();
+  if (ret != want) {
+    fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
+    return 1;
+  }
+  return 0;
+}
+
+int check_int32(void* handle, const char* fname, int32_t want) {
+  int32_t (*fn)();
+  fn = (int32_t (*)())dlsym(handle, fname);
+  if (!fn) {
+    fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
+    return 1;
+  }
+  int32_t ret = fn();
+  if (ret != want) {
+    fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
+    return 1;
+  }
+  return 0;
+}
+
+// Tests libgo.so to export the following functions.
+//   int8_t DidInitRun() // returns true
+//   int8_t DidMainRun() // returns true
+//   int32_t FromPkg() // returns 1024
+int main(int argc, char** argv) {
+  void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
+  if (!handle) {
+    fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
+                   dlerror());
+    return 2;
+  }
+
+  int ret = 0;
+  ret = check_int8(handle, "DidInitRun", 1);
+  if (ret != 0) {
+    return ret;
+  }
+
+  ret = check_int8(handle, "DidMainRun", 0);
+  if (ret != 0) {
+    return ret;
+  }
+
+  ret = check_int32(handle, "FromPkg", 1024);
+  if (ret != 0) {
+   return ret;
+  }
+  // test.bash looks for "PASS" to ensure this program has reached the end. 
+  printf("PASS\n");
+  return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main2.c b/libgo/misc/cgo/testcshared/testdata/main2.c
new file mode 100644 (file)
index 0000000..f89bcca
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define fd (30)
+
+// Tests libgo2.so, which does not export any functions.
+// Read a string from the file descriptor and print it.
+int main(void) {
+  int i;
+  ssize_t n;
+  char buf[20];
+  struct timespec ts;
+
+  // The descriptor will be initialized in a thread, so we have to
+  // give a chance to get opened.
+  for (i = 0; i < 200; i++) {
+    n = read(fd, buf, sizeof buf);
+    if (n >= 0)
+      break;
+    if (errno != EBADF && errno != EINVAL) {
+      fprintf(stderr, "BUG: read: %s\n", strerror(errno));
+      return 2;
+    }
+
+    // An EBADF error means that the shared library has not opened the
+    // descriptor yet.
+    ts.tv_sec = 0;
+    ts.tv_nsec = 10000000;
+    nanosleep(&ts, NULL);
+  }
+
+  if (n < 0) {
+    fprintf(stderr, "BUG: failed to read any data from pipe\n");
+    return 2;
+  }
+
+  if (n == 0) {
+    fprintf(stderr, "BUG: unexpected EOF\n");
+    return 2;
+  }
+
+  if (n == sizeof buf) {
+    n--;
+  }
+  buf[n] = '\0';
+  printf("%s\n", buf);
+  return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main3.c b/libgo/misc/cgo/testcshared/testdata/main3.c
new file mode 100644 (file)
index 0000000..49cc055
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <dlfcn.h>
+
+// Tests "main.main" is exported on android/arm,
+// which golang.org/x/mobile/app depends on.
+int main(int argc, char** argv) {
+  void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
+  if (!handle) {
+    fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
+            dlerror());
+    return 2;
+  }
+
+  uintptr_t main_fn = (uintptr_t)dlsym(handle, "main.main");
+  if (!main_fn) {
+    fprintf(stderr, "ERROR: missing main.main: %s\n", dlerror());
+    return 2;
+  }
+
+  // TODO(hyangah): check that main.main can run.
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main4.c b/libgo/misc/cgo/testcshared/testdata/main4.c
new file mode 100644 (file)
index 0000000..355cdef
--- /dev/null
@@ -0,0 +1,215 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that a signal handler that uses up stack space does not crash
+// if the signal is delivered to a thread running a goroutine.
+// This is a lot like misc/cgo/testcarchive/main2.c.
+
+#include <setjmp.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sched.h>
+#include <time.h>
+#include <dlfcn.h>
+
+static void die(const char* msg) {
+       perror(msg);
+       exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+// Use up some stack space.
+static void recur(int i, char *p) {
+       char a[1024];
+
+       *p = '\0';
+       if (i > 0) {
+               recur(i - 1, a);
+       }
+}
+
+// Signal handler that uses up more stack space than a goroutine will have.
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+       char a[1024];
+
+       recur(4, a);
+       sigioSeen = 1;
+}
+
+static jmp_buf jmp;
+static char* nullPointer;
+
+// Signal handler for SIGSEGV on a C thread.
+static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
+       sigset_t mask;
+       int i;
+
+       if (sigemptyset(&mask) < 0) {
+               die("sigemptyset");
+       }
+       if (sigaddset(&mask, SIGSEGV) < 0) {
+               die("sigaddset");
+       }
+       i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+       if (i != 0) {
+               fprintf(stderr, "sigprocmask: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       // Don't try this at home.
+       longjmp(jmp, signo);
+
+       // We should never get here.
+       abort();
+}
+
+int main(int argc, char** argv) {
+       int verbose;
+       struct sigaction sa;
+       void* handle;
+       void (*fn)(void);
+       sigset_t mask;
+       int i;
+       struct timespec ts;
+
+       verbose = argc > 2;
+       setvbuf(stdout, NULL, _IONBF, 0);
+
+       // Call setsid so that we can use kill(0, SIGIO) below.
+       // Don't check the return value so that this works both from
+       // a job control shell and from a shell script.
+       setsid();
+
+       if (verbose) {
+               printf("calling sigaction\n");
+       }
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = ioHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGIO, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       sa.sa_sigaction = segvHandler;
+       if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       if (verbose) {
+               printf("calling dlopen\n");
+       }
+
+       handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
+       if (handle == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling dlsym\n");
+       }
+
+       // Start some goroutines.
+       fn = (void(*)(void))dlsym(handle, "RunGoroutines");
+       if (fn == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling RunGoroutines\n");
+       }
+
+       fn();
+
+       // Block SIGIO in this thread to make it more likely that it
+       // will be delivered to a goroutine.
+
+       if (verbose) {
+               printf("calling pthread_sigmask\n");
+       }
+
+       if (sigemptyset(&mask) < 0) {
+               die("sigemptyset");
+       }
+       if (sigaddset(&mask, SIGIO) < 0) {
+               die("sigaddset");
+       }
+       i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
+       if (i != 0) {
+               fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling kill\n");
+       }
+
+       if (kill(0, SIGIO) < 0) {
+               die("kill");
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       if (verbose) {
+               printf("calling setjmp\n");
+       }
+
+       // Test that a SIGSEGV on this thread is delivered to us.
+       if (setjmp(jmp) == 0) {
+               if (verbose) {
+                       printf("triggering SIGSEGV\n");
+               }
+
+               *nullPointer = '\0';
+
+               fprintf(stderr, "continued after address error\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling dlsym\n");
+       }
+
+       // Make sure that a SIGSEGV in Go causes a run-time panic.
+       fn = (void (*)(void))dlsym(handle, "TestSEGV");
+       if (fn == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling TestSEGV\n");
+       }
+
+       fn();
+
+       printf("PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/main5.c b/libgo/misc/cgo/testcshared/testdata/main5.c
new file mode 100644 (file)
index 0000000..1bc9910
--- /dev/null
@@ -0,0 +1,199 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that a signal handler works in non-Go code when using
+// os/signal.Notify.
+// This is a lot like misc/cgo/testcarchive/main3.c.
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sched.h>
+#include <dlfcn.h>
+
+static void die(const char* msg) {
+       perror(msg);
+       exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+       sigioSeen = 1;
+}
+
+int main(int argc, char** argv) {
+       int verbose;
+       struct sigaction sa;
+       void* handle;
+       void (*fn1)(void);
+       int (*sawSIGIO)(void);
+       int i;
+       struct timespec ts;
+
+       verbose = argc > 2;
+       setvbuf(stdout, NULL, _IONBF, 0);
+
+       if (verbose) {
+               printf("calling sigaction\n");
+       }
+
+       memset(&sa, 0, sizeof sa);
+       sa.sa_sigaction = ioHandler;
+       if (sigemptyset(&sa.sa_mask) < 0) {
+               die("sigemptyset");
+       }
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGIO, &sa, NULL) < 0) {
+               die("sigaction");
+       }
+
+       if (verbose) {
+               printf("calling dlopen\n");
+       }
+
+       handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
+       if (handle == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       // At this point there should not be a Go signal handler
+       // installed for SIGIO.
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       sigioSeen = 0;
+
+       // Tell the Go code to catch SIGIO.
+
+       if (verbose) {
+               printf("calling dlsym\n");
+       }
+
+       fn1 = (void(*)(void))dlsym(handle, "CatchSIGIO");
+       if (fn1 == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling CatchSIGIO\n");
+       }
+
+       fn1();
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("calling dlsym\n");
+       }
+
+       // Check that the Go code saw SIGIO.
+       sawSIGIO = (int (*)(void))dlsym(handle, "SawSIGIO");
+       if (sawSIGIO == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling SawSIGIO\n");
+       }
+
+       if (!sawSIGIO()) {
+               fprintf(stderr, "Go handler did not see SIGIO\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (sigioSeen != 0) {
+               fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
+               exit(EXIT_FAILURE);
+       }
+
+       // Tell the Go code to stop catching SIGIO.
+
+       if (verbose) {
+               printf("calling dlsym\n");
+       }
+
+       fn1 = (void(*)(void))dlsym(handle, "ResetSIGIO");
+       if (fn1 == NULL) {
+               fprintf(stderr, "%s\n", dlerror());
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("calling ResetSIGIO\n");
+       }
+
+       fn1();
+
+       if (verbose) {
+               printf("raising SIGIO\n");
+       }
+
+       if (raise(SIGIO) < 0) {
+               die("raise");
+       }
+
+       if (verbose) {
+               printf("calling SawSIGIO\n");
+       }
+
+       if (sawSIGIO()) {
+               fprintf(stderr, "Go handler saw SIGIO after Reset\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (verbose) {
+               printf("waiting for sigioSeen\n");
+       }
+
+       // Wait until the signal has been delivered.
+       i = 0;
+       while (!sigioSeen) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 1000000;
+               nanosleep(&ts, NULL);
+               i++;
+               if (i > 5000) {
+                       fprintf(stderr, "looping too long waiting for signal\n");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       printf("PASS\n");
+       return 0;
+}
diff --git a/libgo/misc/cgo/testcshared/testdata/p/p.go b/libgo/misc/cgo/testcshared/testdata/p/p.go
new file mode 100644 (file)
index 0000000..0f02cf3
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import "C"
+
+//export FromPkg
+func FromPkg() int32 { return 1024 }
+
+//export Divu
+func Divu(a, b uint32) uint32 { return a / b }
diff --git a/libgo/misc/cgo/testgodefs/anonunion.go b/libgo/misc/cgo/testgodefs/anonunion.go
deleted file mode 100644 (file)
index 18840f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// +build ignore
-
-package main
-
-// This file tests that when cgo -godefs sees a struct with a field
-// that is an anonymous union, the first field in the union is
-// promoted to become a field of the struct.  See issue 6677 for
-// background.
-
-/*
-typedef struct {
-       union {
-               long l;
-               int c;
-       };
-} t;
-*/
-import "C"
-
-// Input for cgo -godefs.
-
-type T C.t
diff --git a/libgo/misc/cgo/testgodefs/fieldtypedef.go b/libgo/misc/cgo/testgodefs/fieldtypedef.go
deleted file mode 100644 (file)
index 45c0bf8..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserve d.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// +build ignore
-
-package main
-
-/*
-struct S1 { int f1; };
-struct S2 { struct S1 s1; };
-typedef struct S1 S1Type;
-typedef struct S2 S2Type;
-*/
-import "C"
-
-type S1 C.S1Type
-type S2 C.S2Type
diff --git a/libgo/misc/cgo/testgodefs/issue8478.go b/libgo/misc/cgo/testgodefs/issue8478.go
deleted file mode 100644 (file)
index 2321446..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// +build ignore
-
-package main
-
-// Issue 8478.  Test that void* is consistently mapped to *byte.
-
-/*
-typedef struct {
-       void *p;
-       void **q;
-       void ***r;
-} s;
-*/
-import "C"
-
-type Issue8478 C.s
diff --git a/libgo/misc/cgo/testgodefs/main.go b/libgo/misc/cgo/testgodefs/main.go
deleted file mode 100644 (file)
index 1ce0fd0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Test that the struct field in anonunion.go was promoted.
-var v1 T
-var v2 = v1.L
-
-// Test that P, Q, and R all point to byte.
-var v3 = Issue8478{P: (*byte)(nil), Q: (**byte)(nil), R: (***byte)(nil)}
-
-func main() {
-}
index 012d007fc3e4fb27d277e2ac97ebff5ac3cc1ba5..e4ce2ee7a86c70d8b16179338284d60bd87d3181 100644 (file)
@@ -9,6 +9,8 @@
 # import "C" block.  Add more tests here.
 FILE_PREFIXES="anonunion issue8478 fieldtypedef"
 
+cd testdata
+
 RM=
 for FP in $FILE_PREFIXES
 do
@@ -16,7 +18,7 @@ do
   RM="${RM} ${FP}_defs.go"
 done
 
-go build . && ./testgodefs
+go build -o testgodefs . && ./testgodefs
 EXIT=$?
 rm -rf _obj testgodefs ${RM}
 exit $EXIT
diff --git a/libgo/misc/cgo/testgodefs/testdata/anonunion.go b/libgo/misc/cgo/testgodefs/testdata/anonunion.go
new file mode 100644 (file)
index 0000000..18840f2
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+//
+// +build ignore
+
+package main
+
+// This file tests that when cgo -godefs sees a struct with a field
+// that is an anonymous union, the first field in the union is
+// promoted to become a field of the struct.  See issue 6677 for
+// background.
+
+/*
+typedef struct {
+       union {
+               long l;
+               int c;
+       };
+} t;
+*/
+import "C"
+
+// Input for cgo -godefs.
+
+type T C.t
diff --git a/libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go b/libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go
new file mode 100644 (file)
index 0000000..45c0bf8
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserve d.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+//
+// +build ignore
+
+package main
+
+/*
+struct S1 { int f1; };
+struct S2 { struct S1 s1; };
+typedef struct S1 S1Type;
+typedef struct S2 S2Type;
+*/
+import "C"
+
+type S1 C.S1Type
+type S2 C.S2Type
diff --git a/libgo/misc/cgo/testgodefs/testdata/issue8478.go b/libgo/misc/cgo/testgodefs/testdata/issue8478.go
new file mode 100644 (file)
index 0000000..2321446
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+//
+// +build ignore
+
+package main
+
+// Issue 8478.  Test that void* is consistently mapped to *byte.
+
+/*
+typedef struct {
+       void *p;
+       void **q;
+       void ***r;
+} s;
+*/
+import "C"
+
+type Issue8478 C.s
diff --git a/libgo/misc/cgo/testgodefs/testdata/main.go b/libgo/misc/cgo/testgodefs/testdata/main.go
new file mode 100644 (file)
index 0000000..1ce0fd0
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Test that the struct field in anonunion.go was promoted.
+var v1 T
+var v2 = v1.L
+
+// Test that P, Q, and R all point to byte.
+var v3 = Issue8478{P: (*byte)(nil), Q: (**byte)(nil), R: (***byte)(nil)}
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testplugin/altpath/src/common/common.go b/libgo/misc/cgo/testplugin/altpath/src/common/common.go
deleted file mode 100644 (file)
index 505ba02..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package common
-
-var X int
-
-func init() {
-       X = 4
-}
diff --git a/libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go b/libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go
deleted file mode 100644 (file)
index 8aacafc..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// // No C code required.
-import "C"
-
-// The common package imported here does not match the common package
-// imported by plugin1. A program that attempts to load plugin1 and
-// plugin-mismatch should produce an error.
-import "common"
-
-func ReadCommonX() int {
-       return common.X
-}
diff --git a/libgo/misc/cgo/testplugin/altpath/testdata/common/common.go b/libgo/misc/cgo/testplugin/altpath/testdata/common/common.go
new file mode 100644 (file)
index 0000000..505ba02
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package common
+
+var X int
+
+func init() {
+       X = 4
+}
diff --git a/libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go b/libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go
new file mode 100644 (file)
index 0000000..bfb4ba4
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// // No C code required.
+import "C"
+
+// The common package imported here does not match the common package
+// imported by plugin1. A program that attempts to load plugin1 and
+// plugin-mismatch should produce an error.
+import "testplugin/common"
+
+func ReadCommonX() int {
+       return common.X
+}
diff --git a/libgo/misc/cgo/testplugin/overlaydir_test.go b/libgo/misc/cgo/testplugin/overlaydir_test.go
new file mode 100644 (file)
index 0000000..b68436a
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package plugin_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/testplugin/plugin_test.go b/libgo/misc/cgo/testplugin/plugin_test.go
new file mode 100644 (file)
index 0000000..7e2b6eb
--- /dev/null
@@ -0,0 +1,203 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package plugin_test
+
+import (
+       "bytes"
+       "context"
+       "flag"
+       "fmt"
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "testing"
+       "time"
+)
+
+var gcflags string = os.Getenv("GO_GCFLAGS")
+
+func TestMain(m *testing.M) {
+       flag.Parse()
+       if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+               fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+               os.Exit(0)
+       }
+       log.SetFlags(log.Lshortfile)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+       // declaring the same path.
+
+       GOPATH, err := ioutil.TempDir("", "plugin_test")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+
+       modRoot := filepath.Join(GOPATH, "src", "testplugin")
+       altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin")
+       for srcRoot, dstRoot := range map[string]string{
+               "testdata":                           modRoot,
+               filepath.Join("altpath", "testdata"): altRoot,
+       } {
+               if err := overlayDir(dstRoot, srcRoot); err != nil {
+                       log.Panic(err)
+               }
+               if err := ioutil.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil {
+                       log.Panic(err)
+               }
+       }
+
+       os.Setenv("GOPATH", filepath.Join(GOPATH, "alt"))
+       if err := os.Chdir(altRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", altRoot)
+       goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch")
+
+       os.Setenv("GOPATH", GOPATH)
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       os.Setenv("PWD", modRoot)
+
+       os.Setenv("LD_LIBRARY_PATH", modRoot)
+
+       goCmd(nil, "build", "-i", "-buildmode=plugin", "./plugin1")
+       goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
+       so, err := ioutil.ReadFile("plugin2.so")
+       if err != nil {
+               log.Panic(err)
+       }
+       if err := ioutil.WriteFile("plugin2-dup.so", so, 0444); err != nil {
+               log.Panic(err)
+       }
+
+       goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1")
+       goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go")
+       goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go")
+       goCmd(nil, "build", "-o", "host.exe", "./host")
+
+       return m.Run()
+}
+
+func goCmd(t *testing.T, op string, args ...string) {
+       if t != nil {
+               t.Helper()
+       }
+       run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...)
+}
+
+func run(t *testing.T, bin string, args ...string) string {
+       cmd := exec.Command(bin, args...)
+       cmd.Stderr = new(strings.Builder)
+       out, err := cmd.Output()
+       if err != nil {
+               if t == nil {
+                       log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+               } else {
+                       t.Helper()
+                       t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+               }
+       }
+
+       return string(bytes.TrimSpace(out))
+}
+
+func TestDWARFSections(t *testing.T) {
+       // test that DWARF sections are emitted for plugins and programs importing "plugin"
+       if runtime.GOOS != "darwin" {
+               // On macOS, for some reason, the linker doesn't add debug sections to .so,
+               // see issue #27502.
+               goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse")
+       }
+       goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main")
+}
+
+func TestRunHost(t *testing.T) {
+       run(t, "./host.exe")
+}
+
+func TestUniqueTypesAndItabs(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "./iface_a")
+       goCmd(t, "build", "-buildmode=plugin", "./iface_b")
+       goCmd(t, "build", "-o", "iface.exe", "./iface")
+       run(t, "./iface.exe")
+}
+
+func TestIssue18676(t *testing.T) {
+       // make sure we don't add the same itab twice.
+       // The buggy code hangs forever, so use a timeout to check for that.
+       goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go")
+       goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go")
+
+       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+       defer cancel()
+       cmd := exec.CommandContext(ctx, "./issue18676.exe")
+       out, err := cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+}
+
+func TestIssue19534(t *testing.T) {
+       // Test that we can load a plugin built in a path with non-alpha characters.
+       goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go")
+       goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
+       run(t, "./issue19534.exe")
+}
+
+func TestIssue18584(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go")
+       goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go")
+       run(t, "./issue18584.exe")
+}
+
+func TestIssue19418(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go")
+       goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go")
+       run(t, "./issue19418.exe")
+}
+
+func TestIssue19529(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go")
+}
+
+func TestIssue22175(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go")
+       goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go")
+       goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go")
+       run(t, "./issue22175.exe")
+}
+
+func TestIssue22295(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg")
+       goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go")
+       run(t, "./issue22295.exe")
+}
+
+func TestIssue24351(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go")
+       goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go")
+       run(t, "./issue24351.exe")
+}
+
+func TestIssue25756(t *testing.T) {
+       goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
+       goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go")
+       // Fails intermittently, but 20 runs should cause the failure
+       for n := 20; n > 0; n-- {
+               t.Run(fmt.Sprint(n), func(t *testing.T) {
+                       t.Parallel()
+                       run(t, "./issue25756.exe")
+               })
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/src/checkdwarf/main.go b/libgo/misc/cgo/testplugin/src/checkdwarf/main.go
deleted file mode 100644 (file)
index 7886c83..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Usage:
-//
-//  checkdwarf <exe> <suffix>
-//
-// Opens <exe>, which must be an executable or a library and checks that
-// there is an entry in .debug_info whose name ends in <suffix>
-
-package main
-
-import (
-       "debug/dwarf"
-       "debug/elf"
-       "debug/macho"
-       "debug/pe"
-       "fmt"
-       "os"
-       "strings"
-)
-
-func usage() {
-       fmt.Fprintf(os.Stderr, "checkdwarf executable-or-library DIE-suffix\n")
-}
-
-type dwarfer interface {
-       DWARF() (*dwarf.Data, error)
-}
-
-func openElf(path string) dwarfer {
-       exe, err := elf.Open(path)
-       if err != nil {
-               return nil
-       }
-       return exe
-}
-
-func openMacho(path string) dwarfer {
-       exe, err := macho.Open(path)
-       if err != nil {
-               return nil
-       }
-       return exe
-}
-
-func openPE(path string) dwarfer {
-       exe, err := pe.Open(path)
-       if err != nil {
-               return nil
-       }
-       return exe
-}
-
-func main() {
-       if len(os.Args) != 3 {
-               usage()
-       }
-
-       exePath := os.Args[1]
-       dieSuffix := os.Args[2]
-
-       var exe dwarfer
-
-       for _, openfn := range []func(string) dwarfer{openMacho, openPE, openElf} {
-               exe = openfn(exePath)
-               if exe != nil {
-                       break
-               }
-       }
-
-       if exe == nil {
-               fmt.Fprintf(os.Stderr, "could not open %s\n", exePath)
-               os.Exit(1)
-       }
-
-       data, err := exe.DWARF()
-       if err != nil {
-               fmt.Fprintf(os.Stderr, "%s: error opening DWARF: %v\n", exePath, err)
-               os.Exit(1)
-       }
-
-       rdr := data.Reader()
-       for {
-               e, err := rdr.Next()
-               if err != nil {
-                       fmt.Fprintf(os.Stderr, "%s: error reading DWARF: %v\n", exePath, err)
-                       os.Exit(1)
-               }
-               if e == nil {
-                       break
-               }
-               name, hasname := e.Val(dwarf.AttrName).(string)
-               if !hasname {
-                       continue
-               }
-               if strings.HasSuffix(name, dieSuffix) {
-                       // found
-                       os.Exit(0)
-               }
-       }
-
-       fmt.Fprintf(os.Stderr, "%s: no entry with a name ending in %q was found\n", exePath, dieSuffix)
-       os.Exit(1)
-}
diff --git a/libgo/misc/cgo/testplugin/src/common/common.go b/libgo/misc/cgo/testplugin/src/common/common.go
deleted file mode 100644 (file)
index b064e6b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package common
-
-var X int
-
-func init() {
-       X = 3
-}
diff --git a/libgo/misc/cgo/testplugin/src/host/host.go b/libgo/misc/cgo/testplugin/src/host/host.go
deleted file mode 100644 (file)
index 0ca17da..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "log"
-       "path/filepath"
-       "plugin"
-       "strings"
-
-       "common"
-)
-
-func init() {
-       common.X *= 5
-}
-
-// testUnnamed tests that two plugins built with .go files passed on
-// the command line do not have overlapping symbols. That is,
-// unnamed1.so/FuncInt and unnamed2.so/FuncInt should be distinct functions.
-func testUnnamed() {
-       p, err := plugin.Open("unnamed1.so")
-       if err != nil {
-               log.Fatalf(`plugin.Open("unnamed1.so"): %v`, err)
-       }
-       fn, err := p.Lookup("FuncInt")
-       if err != nil {
-               log.Fatalf(`unnamed1.so: Lookup("FuncInt") failed: %v`, err)
-       }
-       if got, want := fn.(func() int)(), 1; got != want {
-               log.Fatalf("unnamed1.so: FuncInt()=%d, want %d", got, want)
-       }
-
-       p, err = plugin.Open("unnamed2.so")
-       if err != nil {
-               log.Fatalf(`plugin.Open("unnamed2.so"): %v`, err)
-       }
-       fn, err = p.Lookup("FuncInt")
-       if err != nil {
-               log.Fatalf(`unnamed2.so: Lookup("FuncInt") failed: %v`, err)
-       }
-       if got, want := fn.(func() int)(), 2; got != want {
-               log.Fatalf("unnamed2.so: FuncInt()=%d, want %d", got, want)
-       }
-}
-
-func main() {
-       if got, want := common.X, 3*5; got != want {
-               log.Fatalf("before plugin load common.X=%d, want %d", got, want)
-       }
-
-       p, err := plugin.Open("plugin1.so")
-       if err != nil {
-               log.Fatalf("plugin.Open failed: %v", err)
-       }
-
-       const wantX = 3 * 5 * 7
-       if got := common.X; got != wantX {
-               log.Fatalf("after plugin load common.X=%d, want %d", got, wantX)
-       }
-
-       seven, err := p.Lookup("Seven")
-       if err != nil {
-               log.Fatalf(`Lookup("Seven") failed: %v`, err)
-       }
-       if got, want := *seven.(*int), 7; got != want {
-               log.Fatalf("plugin1.Seven=%d, want %d", got, want)
-       }
-
-       readFunc, err := p.Lookup("ReadCommonX")
-       if err != nil {
-               log.Fatalf(`plugin1.Lookup("ReadCommonX") failed: %v`, err)
-       }
-       if got := readFunc.(func() int)(); got != wantX {
-               log.Fatalf("plugin1.ReadCommonX()=%d, want %d", got, wantX)
-       }
-
-       // sub/plugin1.so is a different plugin with the same name as
-       // the already loaded plugin. It also depends on common. Test
-       // that we can load the different plugin, it is actually
-       // different, and that it sees the same common package.
-       subpPath, err := filepath.Abs("sub/plugin1.so")
-       if err != nil {
-               log.Fatalf("filepath.Abs(%q) failed: %v", subpPath, err)
-       }
-       subp, err := plugin.Open(subpPath)
-       if err != nil {
-               log.Fatalf("plugin.Open(%q) failed: %v", subpPath, err)
-       }
-
-       funcVar, err := subp.Lookup("FuncVar")
-       if err != nil {
-               log.Fatalf(`sub/plugin1.Lookup("FuncVar") failed: %v`, err)
-       }
-       called := false
-       *funcVar.(*func()) = func() {
-               called = true
-       }
-
-       readFunc, err = subp.Lookup("ReadCommonX")
-       if err != nil {
-               log.Fatalf(`sub/plugin1.Lookup("ReadCommonX") failed: %v`, err)
-       }
-       if got := readFunc.(func() int)(); got != wantX {
-               log.Fatalf("sub/plugin1.ReadCommonX()=%d, want %d", got, wantX)
-       }
-       if !called {
-               log.Fatal("calling ReadCommonX did not call FuncVar")
-       }
-
-       subf, err := subp.Lookup("F")
-       if err != nil {
-               log.Fatalf(`sub/plugin1.Lookup("F") failed: %v`, err)
-       }
-       if gotf := subf.(func() int)(); gotf != 17 {
-               log.Fatalf(`sub/plugin1.F()=%d, want 17`, gotf)
-       }
-       f, err := p.Lookup("F")
-       if err != nil {
-               log.Fatalf(`plugin1.Lookup("F") failed: %v`, err)
-       }
-       if gotf := f.(func() int)(); gotf != 3 {
-               log.Fatalf(`plugin1.F()=%d, want 17`, gotf)
-       }
-
-       p2, err := plugin.Open("plugin2.so")
-       if err != nil {
-               log.Fatalf("plugin.Open failed: %v", err)
-       }
-       // Check that plugin2's init function was called, and
-       // that it modifies the same global variable as the host.
-       if got, want := common.X, 2; got != want {
-               log.Fatalf("after loading plugin2, common.X=%d, want %d", got, want)
-       }
-
-       _, err = plugin.Open("plugin2-dup.so")
-       if err == nil {
-               log.Fatal(`plugin.Open("plugin2-dup.so"): duplicate open should have failed`)
-       }
-       if s := err.Error(); !strings.Contains(s, "already loaded") {
-               log.Fatal(`plugin.Open("plugin2.so"): error does not mention "already loaded"`)
-       }
-
-       _, err = plugin.Open("plugin-mismatch.so")
-       if err == nil {
-               log.Fatal(`plugin.Open("plugin-mismatch.so"): should have failed`)
-       }
-       if s := err.Error(); !strings.Contains(s, "different version") {
-               log.Fatalf(`plugin.Open("plugin-mismatch.so"): error does not mention "different version": %v`, s)
-       }
-
-       _, err = plugin.Open("plugin2-dup.so")
-       if err == nil {
-               log.Fatal(`plugin.Open("plugin2-dup.so"): duplicate open after bad plugin should have failed`)
-       }
-       _, err = plugin.Open("plugin2.so")
-       if err != nil {
-               log.Fatalf(`plugin.Open("plugin2.so"): second open with same name failed: %v`, err)
-       }
-
-       // Test that unexported types with the same names in
-       // different plugins do not interfere with each other.
-       //
-       // See Issue #21386.
-       UnexportedNameReuse, _ := p.Lookup("UnexportedNameReuse")
-       UnexportedNameReuse.(func())()
-       UnexportedNameReuse, _ = p2.Lookup("UnexportedNameReuse")
-       UnexportedNameReuse.(func())()
-
-       testUnnamed()
-
-       fmt.Println("PASS")
-}
diff --git a/libgo/misc/cgo/testplugin/src/iface/main.go b/libgo/misc/cgo/testplugin/src/iface/main.go
deleted file mode 100644 (file)
index 5e7e4d8..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "iface_i"
-       "log"
-       "plugin"
-)
-
-func main() {
-       a, err := plugin.Open("iface_a.so")
-       if err != nil {
-               log.Fatalf(`plugin.Open("iface_a.so"): %v`, err)
-       }
-       b, err := plugin.Open("iface_b.so")
-       if err != nil {
-               log.Fatalf(`plugin.Open("iface_b.so"): %v`, err)
-       }
-
-       af, err := a.Lookup("F")
-       if err != nil {
-               log.Fatalf(`a.Lookup("F") failed: %v`, err)
-       }
-       bf, err := b.Lookup("F")
-       if err != nil {
-               log.Fatalf(`b.Lookup("F") failed: %v`, err)
-       }
-       if af.(func() interface{})() != bf.(func() interface{})() {
-               panic("empty interfaces not equal")
-       }
-
-       ag, err := a.Lookup("G")
-       if err != nil {
-               log.Fatalf(`a.Lookup("G") failed: %v`, err)
-       }
-       bg, err := b.Lookup("G")
-       if err != nil {
-               log.Fatalf(`b.Lookup("G") failed: %v`, err)
-       }
-       if ag.(func() iface_i.I)() != bg.(func() iface_i.I)() {
-               panic("nonempty interfaces not equal")
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/iface_a/a.go b/libgo/misc/cgo/testplugin/src/iface_a/a.go
deleted file mode 100644 (file)
index 29d2e27..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "iface_i"
-
-//go:noinline
-func F() interface{} {
-       return (*iface_i.T)(nil)
-}
-
-//go:noinline
-func G() iface_i.I {
-       return (*iface_i.T)(nil)
-}
diff --git a/libgo/misc/cgo/testplugin/src/iface_b/b.go b/libgo/misc/cgo/testplugin/src/iface_b/b.go
deleted file mode 100644 (file)
index 29d2e27..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "iface_i"
-
-//go:noinline
-func F() interface{} {
-       return (*iface_i.T)(nil)
-}
-
-//go:noinline
-func G() iface_i.I {
-       return (*iface_i.T)(nil)
-}
diff --git a/libgo/misc/cgo/testplugin/src/iface_i/i.go b/libgo/misc/cgo/testplugin/src/iface_i/i.go
deleted file mode 100644 (file)
index 31c8038..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iface_i
-
-type I interface {
-       M()
-}
-
-type T struct {
-}
-
-func (t *T) M() {
-}
-
-// *T implements I
diff --git a/libgo/misc/cgo/testplugin/src/issue18584/main.go b/libgo/misc/cgo/testplugin/src/issue18584/main.go
deleted file mode 100644 (file)
index c280fd4..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "plugin"
-
-func main() {
-       p, err := plugin.Open("plugin.so")
-       if err != nil {
-               panic(err)
-       }
-
-       sym, err := p.Lookup("G")
-       if err != nil {
-               panic(err)
-       }
-       g := sym.(func() bool)
-       if !g() {
-               panic("expected types to match, Issue #18584")
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue18584/plugin.go b/libgo/misc/cgo/testplugin/src/issue18584/plugin.go
deleted file mode 100644 (file)
index be0868d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "reflect"
-
-type C struct {
-}
-
-func F(c *C) *C {
-       return nil
-}
-
-func G() bool {
-       var c *C
-       return reflect.TypeOf(F).Out(0) == reflect.TypeOf(c)
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go b/libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go
deleted file mode 100644 (file)
index 70fd054..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dynamodbstreamsevt
-
-import "encoding/json"
-
-var foo json.RawMessage
-
-type Event struct{}
-
-func (e *Event) Dummy() {}
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/main.go b/libgo/misc/cgo/testplugin/src/issue18676/main.go
deleted file mode 100644 (file)
index c75409d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The bug happened like this:
-// 1) The main binary adds an itab for *json.UnsupportedValueError / error
-//    (concrete type / interface type).  This itab goes in hash bucket 0x111.
-// 2) The plugin adds that same itab again.  That makes a cycle in the itab
-//    chain rooted at hash bucket 0x111.
-// 3) The main binary then asks for the itab for *dynamodbstreamsevt.Event /
-//    json.Unmarshaler.  This itab happens to also live in bucket 0x111.
-//    The lookup code goes into an infinite loop searching for this itab.
-// The code is carefully crafted so that the two itabs are both from the
-// same bucket, and so that the second itab doesn't exist in
-// the itab hashmap yet (so the entire linked list must be searched).
-package main
-
-import (
-       "encoding/json"
-       "issue18676/dynamodbstreamsevt"
-       "plugin"
-)
-
-func main() {
-       plugin.Open("plugin.so")
-
-       var x interface{} = (*dynamodbstreamsevt.Event)(nil)
-       if _, ok := x.(json.Unmarshaler); !ok {
-               println("something")
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/plugin.go b/libgo/misc/cgo/testplugin/src/issue18676/plugin.go
deleted file mode 100644 (file)
index 8a3b85a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "C"
-
-import "issue18676/dynamodbstreamsevt"
-
-func F(evt *dynamodbstreamsevt.Event) {}
diff --git a/libgo/misc/cgo/testplugin/src/issue19418/main.go b/libgo/misc/cgo/testplugin/src/issue19418/main.go
deleted file mode 100644 (file)
index 2ec9f9a..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "os"
-       "plugin"
-)
-
-func main() {
-       p, err := plugin.Open("plugin.so")
-       if err != nil {
-               panic(err)
-       }
-
-       val, err := p.Lookup("Val")
-       if err != nil {
-               panic(err)
-       }
-       got := *val.(*string)
-       const want = "linkstr"
-       if got != want {
-               fmt.Fprintf(os.Stderr, "issue19418 value is %q, want %q\n", got, want)
-               os.Exit(2)
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue19418/plugin.go b/libgo/misc/cgo/testplugin/src/issue19418/plugin.go
deleted file mode 100644 (file)
index fe93b16..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-var Val = "val-unset"
diff --git a/libgo/misc/cgo/testplugin/src/issue19529/plugin.go b/libgo/misc/cgo/testplugin/src/issue19529/plugin.go
deleted file mode 100644 (file)
index ad2df6c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package main
-
-import (
-       "reflect"
-)
-
-type Foo struct {
-       Bar string `json:"Bar@baz,omitempty"`
-}
-
-func F() {
-       println(reflect.TypeOf(Foo{}).Field(0).Tag)
-}
-
-func main() {}
diff --git a/libgo/misc/cgo/testplugin/src/issue19534/main.go b/libgo/misc/cgo/testplugin/src/issue19534/main.go
deleted file mode 100644 (file)
index de263b6..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "plugin"
-
-func main() {
-       p, err := plugin.Open("plugin.so")
-       if err != nil {
-               panic(err)
-       }
-
-       sym, err := p.Lookup("Foo")
-       if err != nil {
-               panic(err)
-       }
-       f := sym.(func() int)
-       if f() != 42 {
-               panic("expected f() == 42")
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue19534/plugin.go b/libgo/misc/cgo/testplugin/src/issue19534/plugin.go
deleted file mode 100644 (file)
index 582d333..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func Foo() int {
-       return 42
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/main.go b/libgo/misc/cgo/testplugin/src/issue22175/main.go
deleted file mode 100644 (file)
index 9be9bab..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "os"
-       "plugin"
-)
-
-func main() {
-       p2, err := plugin.Open("issue22175_plugin1.so")
-       if err != nil {
-               panic(err)
-       }
-       f, err := p2.Lookup("F")
-       if err != nil {
-               panic(err)
-       }
-       got := f.(func() int)()
-       const want = 971
-       if got != want {
-               fmt.Fprintf(os.Stderr, "issue22175: F()=%d, want %d", got, want)
-               os.Exit(1)
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/plugin1.go b/libgo/misc/cgo/testplugin/src/issue22175/plugin1.go
deleted file mode 100644 (file)
index 5ae6cb6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "plugin"
-
-func F() int {
-       p2, err := plugin.Open("issue22175_plugin2.so")
-       if err != nil {
-               panic(err)
-       }
-       g, err := p2.Lookup("G")
-       if err != nil {
-               panic(err)
-       }
-       return g.(func() int)()
-}
-
-func main() {}
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/plugin2.go b/libgo/misc/cgo/testplugin/src/issue22175/plugin2.go
deleted file mode 100644 (file)
index f387a19..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func G() int { return 971 }
-
-func main() {}
diff --git a/libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go b/libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go
deleted file mode 100644 (file)
index 6cb186e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import (
-       "log"
-       "plugin"
-)
-
-func main() {
-       p, err := plugin.Open("issue.22295.so")
-       if err != nil {
-               log.Fatal(err)
-       }
-       f, err := p.Lookup("F")
-       if err != nil {
-               log.Fatal(err)
-       }
-       const want = 2503
-       got := f.(func() int)()
-       if got != want {
-               log.Fatalf("got %d, want %d", got, want)
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go b/libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go
deleted file mode 100644 (file)
index 46b08a4..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-var f *int
-
-func init() {
-       f = new(int)
-       *f = 2503
-}
-
-func F() int { return *f }
-
-func main() {}
diff --git a/libgo/misc/cgo/testplugin/src/issue24351/main.go b/libgo/misc/cgo/testplugin/src/issue24351/main.go
deleted file mode 100644 (file)
index 4107adf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "plugin"
-
-func main() {
-       p, err := plugin.Open("issue24351.so")
-       if err != nil {
-               panic(err)
-       }
-       f, err := p.Lookup("B")
-       if err != nil {
-               panic(err)
-       }
-       c := make(chan bool)
-       f.(func(chan bool))(c)
-       <-c
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue24351/plugin.go b/libgo/misc/cgo/testplugin/src/issue24351/plugin.go
deleted file mode 100644 (file)
index db17e0a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "fmt"
-
-func B(c chan bool) {
-       go func() {
-               fmt.Println(1.5)
-               c <- true
-       }()
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/main.go b/libgo/misc/cgo/testplugin/src/issue25756/main.go
deleted file mode 100644 (file)
index 817daf4..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Run the game of life in C using Go for parallelization.
-
-package main
-
-import (
-       "flag"
-       "fmt"
-       "plugin"
-)
-
-const MAXDIM = 100
-
-var dim = flag.Int("dim", 16, "board dimensions")
-var gen = flag.Int("gen", 10, "generations")
-
-func main() {
-       flag.Parse()
-
-       var a [MAXDIM * MAXDIM]int32
-       for i := 2; i < *dim; i += 8 {
-               for j := 2; j < *dim-3; j += 8 {
-                       for y := 0; y < 3; y++ {
-                               a[i**dim+j+y] = 1
-                       }
-               }
-       }
-
-       p, err := plugin.Open("life.so")
-       if err != nil {
-               panic(err)
-       }
-       f, err := p.Lookup("Run")
-       if err != nil {
-               panic(err)
-       }
-       f.(func(int, int, int, []int32))(*gen, *dim, *dim, a[:])
-
-       for i := 0; i < *dim; i++ {
-               for j := 0; j < *dim; j++ {
-                       if a[i**dim+j] == 0 {
-                               fmt.Print(" ")
-                       } else {
-                               fmt.Print("X")
-                       }
-               }
-               fmt.Print("\n")
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c b/libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c
deleted file mode 100644 (file)
index f853163..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <assert.h>
-#include "life.h"
-#include "_cgo_export.h"
-
-const int MYCONST = 0;
-
-// Do the actual manipulation of the life board in C.  This could be
-// done easily in Go, we are just using C for demonstration
-// purposes.
-void
-Step(int x, int y, int *a, int *n)
-{
-       struct GoStart_return r;
-
-       // Use Go to start 4 goroutines each of which handles 1/4 of the
-       // board.
-       r = GoStart(0, x, y, 0, x / 2, 0, y / 2, a, n);
-       assert(r.r0 == 0 && r.r1 == 100);       // test multiple returns
-       r = GoStart(1, x, y, x / 2, x, 0, y / 2, a, n);
-       assert(r.r0 == 1 && r.r1 == 101);       // test multiple returns
-       GoStart(2, x, y, 0, x / 2, y / 2, y, a, n);
-       GoStart(3, x, y, x / 2, x, y / 2, y, a, n);
-       GoWait(0);
-       GoWait(1);
-       GoWait(2);
-       GoWait(3);
-}
-
-// The actual computation.  This is called in parallel.
-void
-DoStep(int xdim, int ydim, int xstart, int xend, int ystart, int yend, int *a, int *n)
-{
-       int x, y, c, i, j;
-
-       for(x = xstart; x < xend; x++) {
-               for(y = ystart; y < yend; y++) {
-                       c = 0;
-                       for(i = -1; i <= 1; i++) {
-                               for(j = -1; j <= 1; j++) {
-                                 if(x+i >= 0 && x+i < xdim &&
-                                       y+j >= 0 && y+j < ydim &&
-                                       (i != 0 || j != 0))
-                                   c += a[(x+i)*xdim + (y+j)] != 0;
-                               }
-                       }
-                       if(c == 3 || (c == 2 && a[x*xdim + y] != 0))
-                               n[x*xdim + y] = 1;
-                       else
-                               n[x*xdim + y] = 0;
-               }
-       }
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go b/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go
deleted file mode 100644 (file)
index 675a192..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// #include "life.h"
-import "C"
-
-import "unsafe"
-
-func Run(gen, x, y int, a []int32) {
-       n := make([]int32, x*y)
-       for i := 0; i < gen; i++ {
-               C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
-               copy(a, n)
-       }
-}
-
-// Keep the channels visible from Go.
-var chans [4]chan bool
-
-//export GoStart
-// Double return value is just for testing.
-func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
-       c := make(chan bool, int(C.MYCONST))
-       go func() {
-               C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
-               c <- true
-       }()
-       chans[i] = c
-       return int(i), int(i + 100)
-}
-
-//export GoWait
-func GoWait(i C.int) {
-       <-chans[i]
-       chans[i] = nil
-}
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h b/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h
deleted file mode 100644 (file)
index 11d2b97..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-extern void Step(int, int, int *, int *);
-extern void DoStep(int, int, int, int, int, int, int *, int *);
-extern const int MYCONST;
diff --git a/libgo/misc/cgo/testplugin/src/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/src/plugin1/plugin1.go
deleted file mode 100644 (file)
index 0a9fa2f..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// // No C code required.
-import "C"
-
-import (
-       "common"
-       "reflect"
-)
-
-func F() int {
-       _ = make([]byte, 1<<21) // trigger stack unwind, Issue #18190.
-       return 3
-}
-
-func ReadCommonX() int {
-       return common.X
-}
-
-var Seven int
-
-func call(fn func()) {
-       fn()
-}
-
-func g() {
-       common.X *= Seven
-}
-
-func init() {
-       Seven = 7
-       call(g)
-}
-
-type sameNameReusedInPlugins struct {
-       X string
-}
-
-type sameNameHolder struct {
-       F *sameNameReusedInPlugins
-}
-
-func UnexportedNameReuse() {
-       h := sameNameHolder{}
-       v := reflect.ValueOf(&h).Elem().Field(0)
-       newval := reflect.New(v.Type().Elem())
-       v.Set(newval)
-}
-
-func main() {
-       panic("plugin1.main called")
-}
diff --git a/libgo/misc/cgo/testplugin/src/plugin2/plugin2.go b/libgo/misc/cgo/testplugin/src/plugin2/plugin2.go
deleted file mode 100644 (file)
index a67f2de..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-//#include <errno.h>
-//#include <string.h>
-import "C"
-
-// #include
-// void cfunc() {} // uses cgo_topofstack
-
-import (
-       "common"
-       "reflect"
-       "strings"
-)
-
-func init() {
-       _ = strings.NewReplacer() // trigger stack unwind, Issue #18190.
-       C.strerror(C.EIO)         // uses cgo_topofstack
-       common.X = 2
-}
-
-type sameNameReusedInPlugins struct {
-       X string
-}
-
-type sameNameHolder struct {
-       F *sameNameReusedInPlugins
-}
-
-func UnexportedNameReuse() {
-       h := sameNameHolder{}
-       v := reflect.ValueOf(&h).Elem().Field(0)
-       newval := reflect.New(v.Type().Elem())
-       v.Set(newval)
-}
-
-func main() {
-       panic("plugin1.main called")
-}
diff --git a/libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go
deleted file mode 100644 (file)
index cf9000c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// // No C code required.
-import "C"
-
-import "common"
-
-func F() int { return 17 }
-
-var FuncVar = func() {}
-
-func ReadCommonX() int {
-       FuncVar()
-       return common.X
-}
-
-func main() {
-       panic("plugin1.main called")
-}
diff --git a/libgo/misc/cgo/testplugin/test.bash b/libgo/misc/cgo/testplugin/test.bash
deleted file mode 100644 (file)
index 1b94bc4..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2016 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-set -e
-
-if [ ! -f src/host/host.go ]; then
-       cwd=$(pwd)
-       echo "misc/cgo/testplugin/test.bash is running in $cwd" 1>&2
-       exit 1
-fi
-
-goos=$(go env GOOS)
-goarch=$(go env GOARCH)
-
-function cleanup() {
-       rm -f plugin*.so unnamed*.so iface*.so life.so issue*
-       rm -rf host pkg sub iface
-}
-trap cleanup EXIT
-
-rm -rf pkg sub
-mkdir sub
-
-GOPATH=$(pwd) go build -i -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin1
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin2
-cp plugin2.so plugin2-dup.so
-GOPATH=$(pwd)/altpath go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin-mismatch
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=sub/plugin1.so sub/plugin1
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed1.so unnamed1/main.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed2.so unnamed2/main.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" host
-
-# test that DWARF sections are emitted for plugins and programs importing "plugin"
-if [ $GOOS != "darwin" ]; then
-       # On macOS, for some reason, the linker doesn't add debug sections to .so,
-       # see issue #27502.
-       go run src/checkdwarf/main.go plugin2.so plugin2.UnexportedNameReuse
-fi
-go run src/checkdwarf/main.go host main.main
-
-LD_LIBRARY_PATH=$(pwd) ./host
-
-# Test that types and itabs get properly uniqified.
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_a
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_b
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" iface
-LD_LIBRARY_PATH=$(pwd) ./iface
-
-function _timeout() (
-       set -e
-       $2 &
-       p=$!
-       (sleep $1; kill $p 2>/dev/null) &
-       p2=$!
-       wait $p 2>/dev/null
-       kill -0 $p2 2>/dev/null
-)
-
-# Test for issue 18676 - make sure we don't add the same itab twice.
-# The buggy code hangs forever, so use a timeout to check for that.
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18676/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18676 src/issue18676/main.go
-_timeout 10s ./issue18676
-
-# Test for issue 19534 - that we can load a plugin built in a path with non-alpha
-# characters
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -ldflags='-pluginpath=issue.19534' -o plugin.so src/issue19534/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19534 src/issue19534/main.go
-./issue19534
-
-# Test for issue 18584
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18584/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18584 src/issue18584/main.go
-./issue18584
-
-# Test for issue 19418
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin "-ldflags=-X main.Val=linkstr" -o plugin.so src/issue19418/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19418 src/issue19418/main.go
-./issue19418
-
-# Test for issue 19529
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue19529/plugin.go
-
-# Test for issue 22175
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin1.so src/issue22175/plugin1.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin2.so src/issue22175/plugin2.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22175 src/issue22175/main.go
-./issue22175
-
-# Test for issue 22295
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue.22295.so issue22295.pkg
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22295 src/issue22295.pkg/main.go
-./issue22295
-
-# Test for issue 24351
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue24351.so src/issue24351/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue24351 src/issue24351/main.go
-./issue24351
-
-# Test for issue 25756
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o life.so issue25756/plugin
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue25756 src/issue25756/main.go
-# Fails intermittently, but 20 runs should cause the failure
-for i in `seq 1 20`;
-do
-  ./issue25756 > /dev/null
-done
diff --git a/libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go b/libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go
new file mode 100644 (file)
index 0000000..7886c83
--- /dev/null
@@ -0,0 +1,106 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Usage:
+//
+//  checkdwarf <exe> <suffix>
+//
+// Opens <exe>, which must be an executable or a library and checks that
+// there is an entry in .debug_info whose name ends in <suffix>
+
+package main
+
+import (
+       "debug/dwarf"
+       "debug/elf"
+       "debug/macho"
+       "debug/pe"
+       "fmt"
+       "os"
+       "strings"
+)
+
+func usage() {
+       fmt.Fprintf(os.Stderr, "checkdwarf executable-or-library DIE-suffix\n")
+}
+
+type dwarfer interface {
+       DWARF() (*dwarf.Data, error)
+}
+
+func openElf(path string) dwarfer {
+       exe, err := elf.Open(path)
+       if err != nil {
+               return nil
+       }
+       return exe
+}
+
+func openMacho(path string) dwarfer {
+       exe, err := macho.Open(path)
+       if err != nil {
+               return nil
+       }
+       return exe
+}
+
+func openPE(path string) dwarfer {
+       exe, err := pe.Open(path)
+       if err != nil {
+               return nil
+       }
+       return exe
+}
+
+func main() {
+       if len(os.Args) != 3 {
+               usage()
+       }
+
+       exePath := os.Args[1]
+       dieSuffix := os.Args[2]
+
+       var exe dwarfer
+
+       for _, openfn := range []func(string) dwarfer{openMacho, openPE, openElf} {
+               exe = openfn(exePath)
+               if exe != nil {
+                       break
+               }
+       }
+
+       if exe == nil {
+               fmt.Fprintf(os.Stderr, "could not open %s\n", exePath)
+               os.Exit(1)
+       }
+
+       data, err := exe.DWARF()
+       if err != nil {
+               fmt.Fprintf(os.Stderr, "%s: error opening DWARF: %v\n", exePath, err)
+               os.Exit(1)
+       }
+
+       rdr := data.Reader()
+       for {
+               e, err := rdr.Next()
+               if err != nil {
+                       fmt.Fprintf(os.Stderr, "%s: error reading DWARF: %v\n", exePath, err)
+                       os.Exit(1)
+               }
+               if e == nil {
+                       break
+               }
+               name, hasname := e.Val(dwarf.AttrName).(string)
+               if !hasname {
+                       continue
+               }
+               if strings.HasSuffix(name, dieSuffix) {
+                       // found
+                       os.Exit(0)
+               }
+       }
+
+       fmt.Fprintf(os.Stderr, "%s: no entry with a name ending in %q was found\n", exePath, dieSuffix)
+       os.Exit(1)
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/common/common.go b/libgo/misc/cgo/testplugin/testdata/common/common.go
new file mode 100644 (file)
index 0000000..b064e6b
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package common
+
+var X int
+
+func init() {
+       X = 3
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/host/host.go b/libgo/misc/cgo/testplugin/testdata/host/host.go
new file mode 100644 (file)
index 0000000..a379932
--- /dev/null
@@ -0,0 +1,176 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "fmt"
+       "log"
+       "path/filepath"
+       "plugin"
+       "strings"
+
+       "testplugin/common"
+)
+
+func init() {
+       common.X *= 5
+}
+
+// testUnnamed tests that two plugins built with .go files passed on
+// the command line do not have overlapping symbols. That is,
+// unnamed1.so/FuncInt and unnamed2.so/FuncInt should be distinct functions.
+func testUnnamed() {
+       p, err := plugin.Open("unnamed1.so")
+       if err != nil {
+               log.Fatalf(`plugin.Open("unnamed1.so"): %v`, err)
+       }
+       fn, err := p.Lookup("FuncInt")
+       if err != nil {
+               log.Fatalf(`unnamed1.so: Lookup("FuncInt") failed: %v`, err)
+       }
+       if got, want := fn.(func() int)(), 1; got != want {
+               log.Fatalf("unnamed1.so: FuncInt()=%d, want %d", got, want)
+       }
+
+       p, err = plugin.Open("unnamed2.so")
+       if err != nil {
+               log.Fatalf(`plugin.Open("unnamed2.so"): %v`, err)
+       }
+       fn, err = p.Lookup("FuncInt")
+       if err != nil {
+               log.Fatalf(`unnamed2.so: Lookup("FuncInt") failed: %v`, err)
+       }
+       if got, want := fn.(func() int)(), 2; got != want {
+               log.Fatalf("unnamed2.so: FuncInt()=%d, want %d", got, want)
+       }
+}
+
+func main() {
+       if got, want := common.X, 3*5; got != want {
+               log.Fatalf("before plugin load common.X=%d, want %d", got, want)
+       }
+
+       p, err := plugin.Open("plugin1.so")
+       if err != nil {
+               log.Fatalf("plugin.Open failed: %v", err)
+       }
+
+       const wantX = 3 * 5 * 7
+       if got := common.X; got != wantX {
+               log.Fatalf("after plugin load common.X=%d, want %d", got, wantX)
+       }
+
+       seven, err := p.Lookup("Seven")
+       if err != nil {
+               log.Fatalf(`Lookup("Seven") failed: %v`, err)
+       }
+       if got, want := *seven.(*int), 7; got != want {
+               log.Fatalf("plugin1.Seven=%d, want %d", got, want)
+       }
+
+       readFunc, err := p.Lookup("ReadCommonX")
+       if err != nil {
+               log.Fatalf(`plugin1.Lookup("ReadCommonX") failed: %v`, err)
+       }
+       if got := readFunc.(func() int)(); got != wantX {
+               log.Fatalf("plugin1.ReadCommonX()=%d, want %d", got, wantX)
+       }
+
+       // sub/plugin1.so is a different plugin with the same name as
+       // the already loaded plugin. It also depends on common. Test
+       // that we can load the different plugin, it is actually
+       // different, and that it sees the same common package.
+       subpPath, err := filepath.Abs("sub/plugin1.so")
+       if err != nil {
+               log.Fatalf("filepath.Abs(%q) failed: %v", subpPath, err)
+       }
+       subp, err := plugin.Open(subpPath)
+       if err != nil {
+               log.Fatalf("plugin.Open(%q) failed: %v", subpPath, err)
+       }
+
+       funcVar, err := subp.Lookup("FuncVar")
+       if err != nil {
+               log.Fatalf(`sub/plugin1.Lookup("FuncVar") failed: %v`, err)
+       }
+       called := false
+       *funcVar.(*func()) = func() {
+               called = true
+       }
+
+       readFunc, err = subp.Lookup("ReadCommonX")
+       if err != nil {
+               log.Fatalf(`sub/plugin1.Lookup("ReadCommonX") failed: %v`, err)
+       }
+       if got := readFunc.(func() int)(); got != wantX {
+               log.Fatalf("sub/plugin1.ReadCommonX()=%d, want %d", got, wantX)
+       }
+       if !called {
+               log.Fatal("calling ReadCommonX did not call FuncVar")
+       }
+
+       subf, err := subp.Lookup("F")
+       if err != nil {
+               log.Fatalf(`sub/plugin1.Lookup("F") failed: %v`, err)
+       }
+       if gotf := subf.(func() int)(); gotf != 17 {
+               log.Fatalf(`sub/plugin1.F()=%d, want 17`, gotf)
+       }
+       f, err := p.Lookup("F")
+       if err != nil {
+               log.Fatalf(`plugin1.Lookup("F") failed: %v`, err)
+       }
+       if gotf := f.(func() int)(); gotf != 3 {
+               log.Fatalf(`plugin1.F()=%d, want 17`, gotf)
+       }
+
+       p2, err := plugin.Open("plugin2.so")
+       if err != nil {
+               log.Fatalf("plugin.Open failed: %v", err)
+       }
+       // Check that plugin2's init function was called, and
+       // that it modifies the same global variable as the host.
+       if got, want := common.X, 2; got != want {
+               log.Fatalf("after loading plugin2, common.X=%d, want %d", got, want)
+       }
+
+       _, err = plugin.Open("plugin2-dup.so")
+       if err == nil {
+               log.Fatal(`plugin.Open("plugin2-dup.so"): duplicate open should have failed`)
+       }
+       if s := err.Error(); !strings.Contains(s, "already loaded") {
+               log.Fatal(`plugin.Open("plugin2.so"): error does not mention "already loaded"`)
+       }
+
+       _, err = plugin.Open("plugin-mismatch.so")
+       if err == nil {
+               log.Fatal(`plugin.Open("plugin-mismatch.so"): should have failed`)
+       }
+       if s := err.Error(); !strings.Contains(s, "different version") {
+               log.Fatalf(`plugin.Open("plugin-mismatch.so"): error does not mention "different version": %v`, s)
+       }
+
+       _, err = plugin.Open("plugin2-dup.so")
+       if err == nil {
+               log.Fatal(`plugin.Open("plugin2-dup.so"): duplicate open after bad plugin should have failed`)
+       }
+       _, err = plugin.Open("plugin2.so")
+       if err != nil {
+               log.Fatalf(`plugin.Open("plugin2.so"): second open with same name failed: %v`, err)
+       }
+
+       // Test that unexported types with the same names in
+       // different plugins do not interfere with each other.
+       //
+       // See Issue #21386.
+       UnexportedNameReuse, _ := p.Lookup("UnexportedNameReuse")
+       UnexportedNameReuse.(func())()
+       UnexportedNameReuse, _ = p2.Lookup("UnexportedNameReuse")
+       UnexportedNameReuse.(func())()
+
+       testUnnamed()
+
+       fmt.Println("PASS")
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/iface/main.go b/libgo/misc/cgo/testplugin/testdata/iface/main.go
new file mode 100644 (file)
index 0000000..c04f288
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "log"
+       "plugin"
+
+       "testplugin/iface_i"
+)
+
+func main() {
+       a, err := plugin.Open("iface_a.so")
+       if err != nil {
+               log.Fatalf(`plugin.Open("iface_a.so"): %v`, err)
+       }
+       b, err := plugin.Open("iface_b.so")
+       if err != nil {
+               log.Fatalf(`plugin.Open("iface_b.so"): %v`, err)
+       }
+
+       af, err := a.Lookup("F")
+       if err != nil {
+               log.Fatalf(`a.Lookup("F") failed: %v`, err)
+       }
+       bf, err := b.Lookup("F")
+       if err != nil {
+               log.Fatalf(`b.Lookup("F") failed: %v`, err)
+       }
+       if af.(func() interface{})() != bf.(func() interface{})() {
+               panic("empty interfaces not equal")
+       }
+
+       ag, err := a.Lookup("G")
+       if err != nil {
+               log.Fatalf(`a.Lookup("G") failed: %v`, err)
+       }
+       bg, err := b.Lookup("G")
+       if err != nil {
+               log.Fatalf(`b.Lookup("G") failed: %v`, err)
+       }
+       if ag.(func() iface_i.I)() != bg.(func() iface_i.I)() {
+               panic("nonempty interfaces not equal")
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/iface_a/a.go b/libgo/misc/cgo/testplugin/testdata/iface_a/a.go
new file mode 100644 (file)
index 0000000..357f7e8
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "testplugin/iface_i"
+
+//go:noinline
+func F() interface{} {
+       return (*iface_i.T)(nil)
+}
+
+//go:noinline
+func G() iface_i.I {
+       return (*iface_i.T)(nil)
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/iface_b/b.go b/libgo/misc/cgo/testplugin/testdata/iface_b/b.go
new file mode 100644 (file)
index 0000000..357f7e8
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "testplugin/iface_i"
+
+//go:noinline
+func F() interface{} {
+       return (*iface_i.T)(nil)
+}
+
+//go:noinline
+func G() iface_i.I {
+       return (*iface_i.T)(nil)
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/iface_i/i.go b/libgo/misc/cgo/testplugin/testdata/iface_i/i.go
new file mode 100644 (file)
index 0000000..31c8038
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package iface_i
+
+type I interface {
+       M()
+}
+
+type T struct {
+}
+
+func (t *T) M() {
+}
+
+// *T implements I
diff --git a/libgo/misc/cgo/testplugin/testdata/issue18584/main.go b/libgo/misc/cgo/testplugin/testdata/issue18584/main.go
new file mode 100644 (file)
index 0000000..c280fd4
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "plugin"
+
+func main() {
+       p, err := plugin.Open("plugin.so")
+       if err != nil {
+               panic(err)
+       }
+
+       sym, err := p.Lookup("G")
+       if err != nil {
+               panic(err)
+       }
+       g := sym.(func() bool)
+       if !g() {
+               panic("expected types to match, Issue #18584")
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go
new file mode 100644 (file)
index 0000000..be0868d
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "reflect"
+
+type C struct {
+}
+
+func F(c *C) *C {
+       return nil
+}
+
+func G() bool {
+       var c *C
+       return reflect.TypeOf(F).Out(0) == reflect.TypeOf(c)
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go b/libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
new file mode 100644 (file)
index 0000000..70fd054
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package dynamodbstreamsevt
+
+import "encoding/json"
+
+var foo json.RawMessage
+
+type Event struct{}
+
+func (e *Event) Dummy() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue18676/main.go b/libgo/misc/cgo/testplugin/testdata/issue18676/main.go
new file mode 100644 (file)
index 0000000..b1dadbe
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// The bug happened like this:
+// 1) The main binary adds an itab for *json.UnsupportedValueError / error
+//    (concrete type / interface type).  This itab goes in hash bucket 0x111.
+// 2) The plugin adds that same itab again.  That makes a cycle in the itab
+//    chain rooted at hash bucket 0x111.
+// 3) The main binary then asks for the itab for *dynamodbstreamsevt.Event /
+//    json.Unmarshaler.  This itab happens to also live in bucket 0x111.
+//    The lookup code goes into an infinite loop searching for this itab.
+// The code is carefully crafted so that the two itabs are both from the
+// same bucket, and so that the second itab doesn't exist in
+// the itab hashmap yet (so the entire linked list must be searched).
+package main
+
+import (
+       "encoding/json"
+       "plugin"
+       "testplugin/issue18676/dynamodbstreamsevt"
+)
+
+func main() {
+       plugin.Open("plugin.so")
+
+       var x interface{} = (*dynamodbstreamsevt.Event)(nil)
+       if _, ok := x.(json.Unmarshaler); !ok {
+               println("something")
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go
new file mode 100644 (file)
index 0000000..e7fc74f
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "C"
+
+import "testplugin/issue18676/dynamodbstreamsevt"
+
+func F(evt *dynamodbstreamsevt.Event) {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue19418/main.go b/libgo/misc/cgo/testplugin/testdata/issue19418/main.go
new file mode 100644 (file)
index 0000000..2ec9f9a
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "fmt"
+       "os"
+       "plugin"
+)
+
+func main() {
+       p, err := plugin.Open("plugin.so")
+       if err != nil {
+               panic(err)
+       }
+
+       val, err := p.Lookup("Val")
+       if err != nil {
+               panic(err)
+       }
+       got := *val.(*string)
+       const want = "linkstr"
+       if got != want {
+               fmt.Fprintf(os.Stderr, "issue19418 value is %q, want %q\n", got, want)
+               os.Exit(2)
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go
new file mode 100644 (file)
index 0000000..fe93b16
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+var Val = "val-unset"
diff --git a/libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go
new file mode 100644 (file)
index 0000000..ad2df6c
--- /dev/null
@@ -0,0 +1,15 @@
+package main
+
+import (
+       "reflect"
+)
+
+type Foo struct {
+       Bar string `json:"Bar@baz,omitempty"`
+}
+
+func F() {
+       println(reflect.TypeOf(Foo{}).Field(0).Tag)
+}
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue19534/main.go b/libgo/misc/cgo/testplugin/testdata/issue19534/main.go
new file mode 100644 (file)
index 0000000..de263b6
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "plugin"
+
+func main() {
+       p, err := plugin.Open("plugin.so")
+       if err != nil {
+               panic(err)
+       }
+
+       sym, err := p.Lookup("Foo")
+       if err != nil {
+               panic(err)
+       }
+       f := sym.(func() int)
+       if f() != 42 {
+               panic("expected f() == 42")
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go
new file mode 100644 (file)
index 0000000..582d333
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func Foo() int {
+       return 42
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue22175/main.go b/libgo/misc/cgo/testplugin/testdata/issue22175/main.go
new file mode 100644 (file)
index 0000000..9be9bab
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "fmt"
+       "os"
+       "plugin"
+)
+
+func main() {
+       p2, err := plugin.Open("issue22175_plugin1.so")
+       if err != nil {
+               panic(err)
+       }
+       f, err := p2.Lookup("F")
+       if err != nil {
+               panic(err)
+       }
+       got := f.(func() int)()
+       const want = 971
+       if got != want {
+               fmt.Fprintf(os.Stderr, "issue22175: F()=%d, want %d", got, want)
+               os.Exit(1)
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go
new file mode 100644 (file)
index 0000000..5ae6cb6
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "plugin"
+
+func F() int {
+       p2, err := plugin.Open("issue22175_plugin2.so")
+       if err != nil {
+               panic(err)
+       }
+       g, err := p2.Lookup("G")
+       if err != nil {
+               panic(err)
+       }
+       return g.(func() int)()
+}
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go
new file mode 100644 (file)
index 0000000..f387a19
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func G() int { return 971 }
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go
new file mode 100644 (file)
index 0000000..6cb186e
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+import (
+       "log"
+       "plugin"
+)
+
+func main() {
+       p, err := plugin.Open("issue.22295.so")
+       if err != nil {
+               log.Fatal(err)
+       }
+       f, err := p.Lookup("F")
+       if err != nil {
+               log.Fatal(err)
+       }
+       const want = 2503
+       got := f.(func() int)()
+       if got != want {
+               log.Fatalf("got %d, want %d", got, want)
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go
new file mode 100644 (file)
index 0000000..46b08a4
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+var f *int
+
+func init() {
+       f = new(int)
+       *f = 2503
+}
+
+func F() int { return *f }
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue24351/main.go b/libgo/misc/cgo/testplugin/testdata/issue24351/main.go
new file mode 100644 (file)
index 0000000..4107adf
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "plugin"
+
+func main() {
+       p, err := plugin.Open("issue24351.so")
+       if err != nil {
+               panic(err)
+       }
+       f, err := p.Lookup("B")
+       if err != nil {
+               panic(err)
+       }
+       c := make(chan bool)
+       f.(func(chan bool))(c)
+       <-c
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go
new file mode 100644 (file)
index 0000000..db17e0a
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "fmt"
+
+func B(c chan bool) {
+       go func() {
+               fmt.Println(1.5)
+               c <- true
+       }()
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue25756/main.go b/libgo/misc/cgo/testplugin/testdata/issue25756/main.go
new file mode 100644 (file)
index 0000000..817daf4
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Run the game of life in C using Go for parallelization.
+
+package main
+
+import (
+       "flag"
+       "fmt"
+       "plugin"
+)
+
+const MAXDIM = 100
+
+var dim = flag.Int("dim", 16, "board dimensions")
+var gen = flag.Int("gen", 10, "generations")
+
+func main() {
+       flag.Parse()
+
+       var a [MAXDIM * MAXDIM]int32
+       for i := 2; i < *dim; i += 8 {
+               for j := 2; j < *dim-3; j += 8 {
+                       for y := 0; y < 3; y++ {
+                               a[i**dim+j+y] = 1
+                       }
+               }
+       }
+
+       p, err := plugin.Open("life.so")
+       if err != nil {
+               panic(err)
+       }
+       f, err := p.Lookup("Run")
+       if err != nil {
+               panic(err)
+       }
+       f.(func(int, int, int, []int32))(*gen, *dim, *dim, a[:])
+
+       for i := 0; i < *dim; i++ {
+               for j := 0; j < *dim; j++ {
+                       if a[i**dim+j] == 0 {
+                               fmt.Print(" ")
+                       } else {
+                               fmt.Print("X")
+                       }
+               }
+               fmt.Print("\n")
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c
new file mode 100644 (file)
index 0000000..f853163
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <assert.h>
+#include "life.h"
+#include "_cgo_export.h"
+
+const int MYCONST = 0;
+
+// Do the actual manipulation of the life board in C.  This could be
+// done easily in Go, we are just using C for demonstration
+// purposes.
+void
+Step(int x, int y, int *a, int *n)
+{
+       struct GoStart_return r;
+
+       // Use Go to start 4 goroutines each of which handles 1/4 of the
+       // board.
+       r = GoStart(0, x, y, 0, x / 2, 0, y / 2, a, n);
+       assert(r.r0 == 0 && r.r1 == 100);       // test multiple returns
+       r = GoStart(1, x, y, x / 2, x, 0, y / 2, a, n);
+       assert(r.r0 == 1 && r.r1 == 101);       // test multiple returns
+       GoStart(2, x, y, 0, x / 2, y / 2, y, a, n);
+       GoStart(3, x, y, x / 2, x, y / 2, y, a, n);
+       GoWait(0);
+       GoWait(1);
+       GoWait(2);
+       GoWait(3);
+}
+
+// The actual computation.  This is called in parallel.
+void
+DoStep(int xdim, int ydim, int xstart, int xend, int ystart, int yend, int *a, int *n)
+{
+       int x, y, c, i, j;
+
+       for(x = xstart; x < xend; x++) {
+               for(y = ystart; y < yend; y++) {
+                       c = 0;
+                       for(i = -1; i <= 1; i++) {
+                               for(j = -1; j <= 1; j++) {
+                                 if(x+i >= 0 && x+i < xdim &&
+                                       y+j >= 0 && y+j < ydim &&
+                                       (i != 0 || j != 0))
+                                   c += a[(x+i)*xdim + (y+j)] != 0;
+                               }
+                       }
+                       if(c == 3 || (c == 2 && a[x*xdim + y] != 0))
+                               n[x*xdim + y] = 1;
+                       else
+                               n[x*xdim + y] = 0;
+               }
+       }
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go
new file mode 100644 (file)
index 0000000..675a192
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// #include "life.h"
+import "C"
+
+import "unsafe"
+
+func Run(gen, x, y int, a []int32) {
+       n := make([]int32, x*y)
+       for i := 0; i < gen; i++ {
+               C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
+               copy(a, n)
+       }
+}
+
+// Keep the channels visible from Go.
+var chans [4]chan bool
+
+//export GoStart
+// Double return value is just for testing.
+func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
+       c := make(chan bool, int(C.MYCONST))
+       go func() {
+               C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
+               c <- true
+       }()
+       chans[i] = c
+       return int(i), int(i + 100)
+}
+
+//export GoWait
+func GoWait(i C.int) {
+       <-chans[i]
+       chans[i] = nil
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h
new file mode 100644 (file)
index 0000000..11d2b97
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+extern void Step(int, int, int *, int *);
+extern void DoStep(int, int, int, int, int, int, int *, int *);
+extern const int MYCONST;
diff --git a/libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go
new file mode 100644 (file)
index 0000000..d29d674
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// // No C code required.
+import "C"
+
+import (
+       "reflect"
+
+       "testplugin/common"
+)
+
+func F() int {
+       _ = make([]byte, 1<<21) // trigger stack unwind, Issue #18190.
+       return 3
+}
+
+func ReadCommonX() int {
+       return common.X
+}
+
+var Seven int
+
+func call(fn func()) {
+       fn()
+}
+
+func g() {
+       common.X *= Seven
+}
+
+func init() {
+       Seven = 7
+       call(g)
+}
+
+type sameNameReusedInPlugins struct {
+       X string
+}
+
+type sameNameHolder struct {
+       F *sameNameReusedInPlugins
+}
+
+func UnexportedNameReuse() {
+       h := sameNameHolder{}
+       v := reflect.ValueOf(&h).Elem().Field(0)
+       newval := reflect.New(v.Type().Elem())
+       v.Set(newval)
+}
+
+func main() {
+       panic("plugin1.main called")
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go b/libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go
new file mode 100644 (file)
index 0000000..31ed642
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+//#include <errno.h>
+//#include <string.h>
+import "C"
+
+// #include
+// void cfunc() {} // uses cgo_topofstack
+
+import (
+       "reflect"
+       "strings"
+
+       "testplugin/common"
+)
+
+func init() {
+       _ = strings.NewReplacer() // trigger stack unwind, Issue #18190.
+       C.strerror(C.EIO)         // uses cgo_topofstack
+       common.X = 2
+}
+
+type sameNameReusedInPlugins struct {
+       X string
+}
+
+type sameNameHolder struct {
+       F *sameNameReusedInPlugins
+}
+
+func UnexportedNameReuse() {
+       h := sameNameHolder{}
+       v := reflect.ValueOf(&h).Elem().Field(0)
+       newval := reflect.New(v.Type().Elem())
+       v.Set(newval)
+}
+
+func main() {
+       panic("plugin1.main called")
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go
new file mode 100644 (file)
index 0000000..5f891b0
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// // No C code required.
+import "C"
+
+import "testplugin/common"
+
+func F() int { return 17 }
+
+var FuncVar = func() {}
+
+func ReadCommonX() int {
+       FuncVar()
+       return common.X
+}
+
+func main() {
+       panic("plugin1.main called")
+}
diff --git a/libgo/misc/cgo/testplugin/testdata/unnamed1/main.go b/libgo/misc/cgo/testplugin/testdata/unnamed1/main.go
new file mode 100644 (file)
index 0000000..dd1777b
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+// // No C code required.
+import "C"
+
+func FuncInt() int { return 1 }
+
+// Add a recursive type to check that type equality across plugins doesn't
+// crash. See https://golang.org/issues/19258
+func FuncRecursive() X { return X{} }
+
+type Y struct {
+       X *X
+}
+type X struct {
+       Y Y
+}
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/testdata/unnamed2/main.go b/libgo/misc/cgo/testplugin/testdata/unnamed2/main.go
new file mode 100644 (file)
index 0000000..757436f
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+// // No C code required.
+import "C"
+
+func FuncInt() int { return 2 }
+
+func FuncRecursive() X { return X{} }
+
+type Y struct {
+       X *X
+}
+type X struct {
+       Y Y
+}
+
+func main() {}
diff --git a/libgo/misc/cgo/testplugin/unnamed1/main.go b/libgo/misc/cgo/testplugin/unnamed1/main.go
deleted file mode 100644 (file)
index caf09c9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// // No C code required.
-import "C"
-
-func FuncInt() int { return 1 }
-
-// Add a recursive type to check that type equality across plugins doesn't
-// crash. See https://golang.org/issues/19258
-func FuncRecursive() X { return X{} }
-
-type Y struct {
-       X *X
-}
-type X struct {
-       Y Y
-}
-
-func main() {}
diff --git a/libgo/misc/cgo/testplugin/unnamed2/main.go b/libgo/misc/cgo/testplugin/unnamed2/main.go
deleted file mode 100644 (file)
index 7ef6610..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// // No C code required.
-import "C"
-
-func FuncInt() int { return 2 }
-
-func FuncRecursive() X { return X{} }
-
-type Y struct {
-       X *X
-}
-type X struct {
-       Y Y
-}
-
-func main() {}
index 218e2254295ba5792daa1eae14fb446060b1bbec..0192a663dddabe58ea68c34f010e09fdfa552d04 100644 (file)
@@ -394,7 +394,7 @@ func (c *config) checkRuntime() (skip bool, err error) {
 
 // srcPath returns the path to the given file relative to this test's source tree.
 func srcPath(path string) string {
-       return filepath.Join("src", path)
+       return filepath.Join("testdata", path)
 }
 
 // A tempDir manages a temporary directory within a test.
diff --git a/libgo/misc/cgo/testsanitizers/src/msan.go b/libgo/misc/cgo/testsanitizers/src/msan.go
deleted file mode 100644 (file)
index 7915fa8..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#include <stdint.h>
-
-void f(int32_t *p, int n) {
-  int i;
-
-  for (i = 0; i < n; i++) {
-    p[i] = (int32_t)i;
-  }
-}
-*/
-import "C"
-
-import (
-       "fmt"
-       "os"
-       "unsafe"
-)
-
-func main() {
-       a := make([]int32, 10)
-       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-       for i, v := range a {
-               if i != int(v) {
-                       fmt.Println("bad %d: %v\n", i, a)
-                       os.Exit(1)
-               }
-       }
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan2.go b/libgo/misc/cgo/testsanitizers/src/msan2.go
deleted file mode 100644 (file)
index 6690cb0..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-void f(int32_t *p, int n) {
-  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
-  memcpy(p, q, n * sizeof(*p));
-  free(q);
-}
-
-void g(int32_t *p, int n) {
-  if (p[4] != 1) {
-    abort();
-  }
-}
-*/
-import "C"
-
-import (
-       "unsafe"
-)
-
-func main() {
-       a := make([]int32, 10)
-       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-       a[4] = 1
-       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go b/libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go
deleted file mode 100644 (file)
index 8fdaea9..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#cgo LDFLAGS: -fsanitize=memory
-#cgo CPPFLAGS: -fsanitize=memory
-
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-void f(int32_t *p, int n) {
-  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
-  memcpy(p, q, n * sizeof(*p));
-  free(q);
-}
-
-void g(int32_t *p, int n) {
-  if (p[4] != 1) {
-    abort();
-  }
-}
-*/
-import "C"
-
-import (
-       "unsafe"
-)
-
-func main() {
-       a := make([]int32, 10)
-       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-       a[4] = 1
-       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan3.go b/libgo/misc/cgo/testsanitizers/src/msan3.go
deleted file mode 100644 (file)
index 61a9c29..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-extern int *GoFn(int *);
-
-// Yes, you can have definitions if you use //export, as long as they are weak.
-int f(void) __attribute__ ((weak));
-
-int f() {
-  int i;
-  int *p = GoFn(&i);
-  if (*p != 12345)
-    return 0;
-  return 1;
-}
-*/
-import "C"
-
-//export GoFn
-func GoFn(p *C.int) *C.int {
-       *p = C.int(12345)
-       return p
-}
-
-func main() {
-       if r := C.f(); r != 1 {
-               panic(r)
-       }
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan4.go b/libgo/misc/cgo/testsanitizers/src/msan4.go
deleted file mode 100644 (file)
index 6c91ff5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// The memory profiler can call copy from a slice on the system stack,
-// which msan used to think meant a reference to uninitialized memory.
-
-/*
-#include <time.h>
-#include <unistd.h>
-
-extern void Nop(char*);
-
-// Use weak as a hack to permit defining a function even though we use export.
-void poison() __attribute__ ((weak));
-
-// Poison the stack.
-void poison() {
-       char a[1024];
-       Nop(&a[0]);
-}
-
-*/
-import "C"
-
-import (
-       "runtime"
-)
-
-func main() {
-       runtime.MemProfileRate = 1
-       start(100)
-}
-
-func start(i int) {
-       if i == 0 {
-               return
-       }
-       C.poison()
-       // Tie up a thread.
-       // We won't actually wait for this sleep to complete.
-       go func() { C.sleep(1) }()
-       start(i - 1)
-}
-
-//export Nop
-func Nop(*C.char) {
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan5.go b/libgo/misc/cgo/testsanitizers/src/msan5.go
deleted file mode 100644 (file)
index f1479eb..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Using reflect to set a value was not seen by msan.
-
-/*
-#include <stdlib.h>
-
-extern void Go1(int*);
-extern void Go2(char*);
-
-// Use weak as a hack to permit defining a function even though we use export.
-void C1() __attribute__ ((weak));
-void C2() __attribute__ ((weak));
-
-void C1() {
-       int i;
-       Go1(&i);
-       if (i != 42) {
-               abort();
-       }
-}
-
-void C2() {
-       char a[2];
-       a[1] = 42;
-       Go2(a);
-       if (a[0] != 42) {
-               abort();
-       }
-}
-*/
-import "C"
-
-import (
-       "reflect"
-       "unsafe"
-)
-
-//export Go1
-func Go1(p *C.int) {
-       reflect.ValueOf(p).Elem().Set(reflect.ValueOf(C.int(42)))
-}
-
-//export Go2
-func Go2(p *C.char) {
-       a := (*[2]byte)(unsafe.Pointer(p))
-       reflect.Copy(reflect.ValueOf(a[:1]), reflect.ValueOf(a[1:]))
-}
-
-func main() {
-       C.C1()
-       C.C2()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan6.go b/libgo/misc/cgo/testsanitizers/src/msan6.go
deleted file mode 100644 (file)
index 003989c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// A C function returning a value on the Go stack could leave the Go
-// stack marked as uninitialized, potentially causing a later error
-// when the stack is used for something else. Issue 26209.
-
-/*
-#cgo LDFLAGS: -fsanitize=memory
-#cgo CPPFLAGS: -fsanitize=memory
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-typedef struct {
-       uintptr_t a[20];
-} S;
-
-S f() {
-       S *p;
-
-       p = (S *)(malloc(sizeof(S)));
-       p->a[0] = 0;
-       return *p;
-}
-*/
-import "C"
-
-// allocateStack extends the stack so that stack copying doesn't
-// confuse the msan data structures.
-//go:noinline
-func allocateStack(i int) int {
-       if i == 0 {
-               return i
-       }
-       return allocateStack(i - 1)
-}
-
-// F1 marks a chunk of stack as uninitialized.
-// C.f returns an uninitialized struct on the stack, so msan will mark
-// the stack as uninitialized.
-//go:noinline
-func F1() uintptr {
-       s := C.f()
-       return uintptr(s.a[0])
-}
-
-// F2 allocates a struct on the stack and converts it to an empty interface,
-// which will call msanread and see that the data appears uninitialized.
-//go:noinline
-func F2() interface{} {
-       return C.S{}
-}
-
-func poisonStack(i int) int {
-       if i == 0 {
-               return int(F1())
-       }
-       F1()
-       r := poisonStack(i - 1)
-       F2()
-       return r
-}
-
-func main() {
-       allocateStack(16384)
-       poisonStack(128)
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan_fail.go b/libgo/misc/cgo/testsanitizers/src/msan_fail.go
deleted file mode 100644 (file)
index 4c8dab3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-void f(int32_t *p, int n) {
-  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
-  memcpy(p, q, n * sizeof(*p));
-  free(q);
-}
-
-void g(int32_t *p, int n) {
-  if (p[4] != 1) {
-    // We shouldn't get here; msan should stop us first.
-    exit(0);
-  }
-}
-*/
-import "C"
-
-import (
-       "unsafe"
-)
-
-func main() {
-       a := make([]int32, 10)
-       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-       a[3] = 1
-       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/msan_shared.go b/libgo/misc/cgo/testsanitizers/src/msan_shared.go
deleted file mode 100644 (file)
index 966947c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This program segfaulted during libpreinit when built with -msan:
-// http://golang.org/issue/18707
-
-package main
-
-import "C"
-
-func main() {}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan.go b/libgo/misc/cgo/testsanitizers/src/tsan.go
deleted file mode 100644 (file)
index 6c377a7..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program produced false race reports when run under the C/C++
-// ThreadSanitizer, as it did not understand the synchronization in
-// the Go code.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-int val;
-
-int getVal() {
-       return val;
-}
-
-void setVal(int i) {
-       val = i;
-}
-*/
-import "C"
-
-import (
-       "runtime"
-)
-
-func main() {
-       runtime.LockOSThread()
-       C.setVal(1)
-       c := make(chan bool)
-       go func() {
-               runtime.LockOSThread()
-               C.setVal(2)
-               c <- true
-       }()
-       <-c
-       if v := C.getVal(); v != 2 {
-               panic(v)
-       }
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan10.go b/libgo/misc/cgo/testsanitizers/src/tsan10.go
deleted file mode 100644 (file)
index a40f245..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program hung when run under the C/C++ ThreadSanitizer.
-// TSAN defers asynchronous signals until the signaled thread calls into libc.
-// Since the Go runtime makes direct futex syscalls, Go runtime threads could
-// run for an arbitrarily long time without triggering the libc interceptors.
-// See https://golang.org/issue/18717.
-
-import (
-       "os"
-       "os/signal"
-       "syscall"
-)
-
-/*
-#cgo CFLAGS: -g -fsanitize=thread
-#cgo LDFLAGS: -g -fsanitize=thread
-*/
-import "C"
-
-func main() {
-       c := make(chan os.Signal, 1)
-       signal.Notify(c, syscall.SIGUSR1)
-       defer signal.Stop(c)
-       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
-       <-c
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan11.go b/libgo/misc/cgo/testsanitizers/src/tsan11.go
deleted file mode 100644 (file)
index 70ac9c8..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program hung when run under the C/C++ ThreadSanitizer. TSAN defers
-// asynchronous signals until the signaled thread calls into libc. The runtime's
-// sysmon goroutine idles itself using direct usleep syscalls, so it could
-// run for an arbitrarily long time without triggering the libc interceptors.
-// See https://golang.org/issue/18717.
-
-import (
-       "os"
-       "os/signal"
-       "syscall"
-)
-
-/*
-#cgo CFLAGS: -g -fsanitize=thread
-#cgo LDFLAGS: -g -fsanitize=thread
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static void raise_usr2(int signo) {
-       raise(SIGUSR2);
-}
-
-static void register_handler(int signo) {
-       struct sigaction sa;
-       memset(&sa, 0, sizeof(sa));
-       sigemptyset(&sa.sa_mask);
-       sa.sa_flags = SA_ONSTACK;
-       sa.sa_handler = raise_usr2;
-
-       if (sigaction(SIGUSR1, &sa, NULL) != 0) {
-               perror("failed to register SIGUSR1 handler");
-               exit(EXIT_FAILURE);
-       }
-}
-*/
-import "C"
-
-func main() {
-       ch := make(chan os.Signal)
-       signal.Notify(ch, syscall.SIGUSR2)
-
-       C.register_handler(C.int(syscall.SIGUSR1))
-       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
-
-       <-ch
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan12.go b/libgo/misc/cgo/testsanitizers/src/tsan12.go
deleted file mode 100644 (file)
index 3e767ee..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program hung when run under the C/C++ ThreadSanitizer. TSAN installs a
-// libc interceptor that writes signal handlers to a global variable within the
-// TSAN runtime instead of making a sigaction system call. A bug in
-// syscall.runtime_AfterForkInChild corrupted TSAN's signal forwarding table
-// during calls to (*os/exec.Cmd).Run, causing the parent process to fail to
-// invoke signal handlers.
-
-import (
-       "fmt"
-       "os"
-       "os/exec"
-       "os/signal"
-       "syscall"
-)
-
-import "C"
-
-func main() {
-       ch := make(chan os.Signal)
-       signal.Notify(ch, syscall.SIGUSR1)
-
-       if err := exec.Command("true").Run(); err != nil {
-               fmt.Fprintf(os.Stderr, "Unexpected error from `true`: %v", err)
-               os.Exit(1)
-       }
-
-       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
-       <-ch
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan2.go b/libgo/misc/cgo/testsanitizers/src/tsan2.go
deleted file mode 100644 (file)
index 5018a19..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program produced false race reports when run under the C/C++
-// ThreadSanitizer, as it did not understand the synchronization in
-// the Go code.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-extern void GoRun(void);
-
-// Yes, you can have definitions if you use //export, as long as they are weak.
-
-int val __attribute__ ((weak));
-
-int run(void) __attribute__ ((weak));
-
-int run() {
-       val = 1;
-       GoRun();
-       return val;
-}
-
-void setVal(int) __attribute__ ((weak));
-
-void setVal(int i) {
-       val = i;
-}
-*/
-import "C"
-
-import "runtime"
-
-//export GoRun
-func GoRun() {
-       runtime.LockOSThread()
-       c := make(chan bool)
-       go func() {
-               runtime.LockOSThread()
-               C.setVal(2)
-               c <- true
-       }()
-       <-c
-}
-
-func main() {
-       if v := C.run(); v != 2 {
-               panic(v)
-       }
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan3.go b/libgo/misc/cgo/testsanitizers/src/tsan3.go
deleted file mode 100644 (file)
index 87f6c80..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// The stubs for the C functions read and write the same slot on the
-// g0 stack when copying arguments in and out.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-int Func1() {
-       return 0;
-}
-
-void Func2(int x) {
-       (void)x;
-}
-*/
-import "C"
-
-func main() {
-       const N = 10000
-       done := make(chan bool, N)
-       for i := 0; i < N; i++ {
-               go func() {
-                       C.Func1()
-                       done <- true
-               }()
-               go func() {
-                       C.Func2(0)
-                       done <- true
-               }()
-       }
-       for i := 0; i < 2*N; i++ {
-               <-done
-       }
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan4.go b/libgo/misc/cgo/testsanitizers/src/tsan4.go
deleted file mode 100644 (file)
index f0c76d8..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Check that calls to C.malloc/C.free do not trigger TSAN false
-// positive reports.
-
-// #cgo CFLAGS: -fsanitize=thread
-// #cgo LDFLAGS: -fsanitize=thread
-// #include <stdlib.h>
-import "C"
-
-import (
-       "runtime"
-       "sync"
-)
-
-func main() {
-       var wg sync.WaitGroup
-       for i := 0; i < 10; i++ {
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
-                       for i := 0; i < 100; i++ {
-                               p := C.malloc(C.size_t(i * 10))
-                               runtime.Gosched()
-                               C.free(p)
-                       }
-               }()
-       }
-       wg.Wait()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan5.go b/libgo/misc/cgo/testsanitizers/src/tsan5.go
deleted file mode 100644 (file)
index 1214a77..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Check that calls to C.malloc/C.free do not collide with the calls
-// made by the os/user package.
-
-// #cgo CFLAGS: -fsanitize=thread
-// #cgo LDFLAGS: -fsanitize=thread
-// #include <stdlib.h>
-import "C"
-
-import (
-       "fmt"
-       "os"
-       "os/user"
-       "runtime"
-       "sync"
-)
-
-func main() {
-       u, err := user.Current()
-       if err != nil {
-               fmt.Fprintln(os.Stderr, err)
-               // Let the test pass.
-               os.Exit(0)
-       }
-
-       var wg sync.WaitGroup
-       for i := 0; i < 20; i++ {
-               wg.Add(2)
-               go func() {
-                       defer wg.Done()
-                       for i := 0; i < 1000; i++ {
-                               user.Lookup(u.Username)
-                               runtime.Gosched()
-                       }
-               }()
-               go func() {
-                       defer wg.Done()
-                       for i := 0; i < 1000; i++ {
-                               p := C.malloc(C.size_t(len(u.Username) + 1))
-                               runtime.Gosched()
-                               C.free(p)
-                       }
-               }()
-       }
-       wg.Wait()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan6.go b/libgo/misc/cgo/testsanitizers/src/tsan6.go
deleted file mode 100644 (file)
index c96f08d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Check that writes to Go allocated memory, with Go synchronization,
-// do not look like a race.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-void f(char *p) {
-       *p = 1;
-}
-*/
-import "C"
-
-import (
-       "runtime"
-       "sync"
-)
-
-func main() {
-       var wg sync.WaitGroup
-       var mu sync.Mutex
-       c := make(chan []C.char, 100)
-       for i := 0; i < 10; i++ {
-               wg.Add(2)
-               go func() {
-                       defer wg.Done()
-                       for i := 0; i < 100; i++ {
-                               c <- make([]C.char, 4096)
-                               runtime.Gosched()
-                       }
-               }()
-               go func() {
-                       defer wg.Done()
-                       for i := 0; i < 100; i++ {
-                               p := &(<-c)[0]
-                               mu.Lock()
-                               C.f(p)
-                               mu.Unlock()
-                       }
-               }()
-       }
-       wg.Wait()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan7.go b/libgo/misc/cgo/testsanitizers/src/tsan7.go
deleted file mode 100644 (file)
index 2fb9e45..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Setting an environment variable in a cgo program changes the C
-// environment. Test that this does not confuse the race detector.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-*/
-import "C"
-
-import (
-       "fmt"
-       "os"
-       "sync"
-       "time"
-)
-
-func main() {
-       var wg sync.WaitGroup
-       var mu sync.Mutex
-       f := func() {
-               defer wg.Done()
-               for i := 0; i < 100; i++ {
-                       time.Sleep(time.Microsecond)
-                       mu.Lock()
-                       s := fmt.Sprint(i)
-                       os.Setenv("TSAN_TEST"+s, s)
-                       mu.Unlock()
-               }
-       }
-       wg.Add(2)
-       go f()
-       go f()
-       wg.Wait()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan8.go b/libgo/misc/cgo/testsanitizers/src/tsan8.go
deleted file mode 100644 (file)
index 88d82a6..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program failed when run under the C/C++ ThreadSanitizer.  The TSAN
-// sigaction function interceptor returned SIG_DFL instead of the Go runtime's
-// handler in registerSegvForwarder.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-struct sigaction prev_sa;
-
-void forwardSignal(int signo, siginfo_t *info, void *context) {
-       // One of sa_sigaction and/or sa_handler
-       if ((prev_sa.sa_flags&SA_SIGINFO) != 0) {
-               prev_sa.sa_sigaction(signo, info, context);
-               return;
-       }
-       if (prev_sa.sa_handler != SIG_IGN && prev_sa.sa_handler != SIG_DFL) {
-               prev_sa.sa_handler(signo);
-               return;
-       }
-
-       fprintf(stderr, "No Go handler to forward to!\n");
-       abort();
-}
-
-void registerSegvFowarder() {
-       struct sigaction sa;
-       memset(&sa, 0, sizeof(sa));
-       sigemptyset(&sa.sa_mask);
-       sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
-       sa.sa_sigaction = forwardSignal;
-
-       if (sigaction(SIGSEGV, &sa, &prev_sa) != 0) {
-               perror("failed to register SEGV forwarder");
-               exit(EXIT_FAILURE);
-       }
-}
-*/
-import "C"
-
-func main() {
-       C.registerSegvFowarder()
-
-       defer func() {
-               recover()
-       }()
-       var nilp *int
-       *nilp = 42
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan9.go b/libgo/misc/cgo/testsanitizers/src/tsan9.go
deleted file mode 100644 (file)
index f166d8b..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program failed when run under the C/C++ ThreadSanitizer. The
-// TSAN library was not keeping track of whether signals should be
-// delivered on the alternate signal stack, and the Go signal handler
-// was not preserving callee-saved registers from C callers.
-
-/*
-#cgo CFLAGS: -g -fsanitize=thread
-#cgo LDFLAGS: -g -fsanitize=thread
-
-#include <stdlib.h>
-#include <sys/time.h>
-
-void spin() {
-       size_t n;
-       struct timeval tvstart, tvnow;
-       int diff;
-       void *prev = NULL, *cur;
-
-       gettimeofday(&tvstart, NULL);
-       for (n = 0; n < 1<<20; n++) {
-               cur = malloc(n);
-               free(prev);
-               prev = cur;
-
-               gettimeofday(&tvnow, NULL);
-               diff = (tvnow.tv_sec - tvstart.tv_sec) * 1000 * 1000 + (tvnow.tv_usec - tvstart.tv_usec);
-
-               // Profile frequency is 100Hz so we should definitely
-               // get a signal in 50 milliseconds.
-               if (diff > 50 * 1000) {
-                       break;
-               }
-       }
-
-       free(prev);
-}
-*/
-import "C"
-
-import (
-       "io/ioutil"
-       "runtime/pprof"
-       "time"
-)
-
-func goSpin() {
-       start := time.Now()
-       for n := 0; n < 1<<20; n++ {
-               _ = make([]byte, n)
-               if time.Since(start) > 50*time.Millisecond {
-                       break
-               }
-       }
-}
-
-func main() {
-       pprof.StartCPUProfile(ioutil.Discard)
-       go C.spin()
-       goSpin()
-       pprof.StopCPUProfile()
-}
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan_shared.go b/libgo/misc/cgo/testsanitizers/src/tsan_shared.go
deleted file mode 100644 (file)
index 55ff67e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This program failed with SIGSEGV when run under the C/C++ ThreadSanitizer.
-// The Go runtime had re-registered the C handler with the wrong flags due to a
-// typo, resulting in null pointers being passed for the info and context
-// parameters to the handler.
-
-/*
-#cgo CFLAGS: -fsanitize=thread
-#cgo LDFLAGS: -fsanitize=thread
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ucontext.h>
-
-void check_params(int signo, siginfo_t *info, void *context) {
-       ucontext_t* uc = (ucontext_t*)(context);
-
-       if (info->si_signo != signo) {
-               fprintf(stderr, "info->si_signo does not match signo.\n");
-               abort();
-       }
-
-       if (uc->uc_stack.ss_size == 0) {
-               fprintf(stderr, "uc_stack has size 0.\n");
-               abort();
-       }
-}
-
-
-// Set up the signal handler in a high priority constructor, so
-// that it is installed before the Go code starts.
-
-static void register_handler(void) __attribute__ ((constructor (200)));
-
-static void register_handler() {
-       struct sigaction sa;
-       memset(&sa, 0, sizeof(sa));
-       sigemptyset(&sa.sa_mask);
-       sa.sa_flags = SA_SIGINFO;
-       sa.sa_sigaction = check_params;
-
-       if (sigaction(SIGUSR1, &sa, NULL) != 0) {
-               perror("failed to register SIGUSR1 handler");
-               exit(EXIT_FAILURE);
-       }
-}
-*/
-import "C"
-
-import "syscall"
-
-func init() {
-       C.raise(C.int(syscall.SIGUSR1))
-}
-
-func main() {}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan.go b/libgo/misc/cgo/testsanitizers/testdata/msan.go
new file mode 100644 (file)
index 0000000..7915fa8
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdint.h>
+
+void f(int32_t *p, int n) {
+  int i;
+
+  for (i = 0; i < n; i++) {
+    p[i] = (int32_t)i;
+  }
+}
+*/
+import "C"
+
+import (
+       "fmt"
+       "os"
+       "unsafe"
+)
+
+func main() {
+       a := make([]int32, 10)
+       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+       for i, v := range a {
+               if i != int(v) {
+                       fmt.Println("bad %d: %v\n", i, a)
+                       os.Exit(1)
+               }
+       }
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan2.go b/libgo/misc/cgo/testsanitizers/testdata/msan2.go
new file mode 100644 (file)
index 0000000..6690cb0
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+void f(int32_t *p, int n) {
+  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
+  memcpy(p, q, n * sizeof(*p));
+  free(q);
+}
+
+void g(int32_t *p, int n) {
+  if (p[4] != 1) {
+    abort();
+  }
+}
+*/
+import "C"
+
+import (
+       "unsafe"
+)
+
+func main() {
+       a := make([]int32, 10)
+       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+       a[4] = 1
+       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go b/libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go
new file mode 100644 (file)
index 0000000..8fdaea9
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#cgo LDFLAGS: -fsanitize=memory
+#cgo CPPFLAGS: -fsanitize=memory
+
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+void f(int32_t *p, int n) {
+  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
+  memcpy(p, q, n * sizeof(*p));
+  free(q);
+}
+
+void g(int32_t *p, int n) {
+  if (p[4] != 1) {
+    abort();
+  }
+}
+*/
+import "C"
+
+import (
+       "unsafe"
+)
+
+func main() {
+       a := make([]int32, 10)
+       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+       a[4] = 1
+       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan3.go b/libgo/misc/cgo/testsanitizers/testdata/msan3.go
new file mode 100644 (file)
index 0000000..61a9c29
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+extern int *GoFn(int *);
+
+// Yes, you can have definitions if you use //export, as long as they are weak.
+int f(void) __attribute__ ((weak));
+
+int f() {
+  int i;
+  int *p = GoFn(&i);
+  if (*p != 12345)
+    return 0;
+  return 1;
+}
+*/
+import "C"
+
+//export GoFn
+func GoFn(p *C.int) *C.int {
+       *p = C.int(12345)
+       return p
+}
+
+func main() {
+       if r := C.f(); r != 1 {
+               panic(r)
+       }
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan4.go b/libgo/misc/cgo/testsanitizers/testdata/msan4.go
new file mode 100644 (file)
index 0000000..6c91ff5
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// The memory profiler can call copy from a slice on the system stack,
+// which msan used to think meant a reference to uninitialized memory.
+
+/*
+#include <time.h>
+#include <unistd.h>
+
+extern void Nop(char*);
+
+// Use weak as a hack to permit defining a function even though we use export.
+void poison() __attribute__ ((weak));
+
+// Poison the stack.
+void poison() {
+       char a[1024];
+       Nop(&a[0]);
+}
+
+*/
+import "C"
+
+import (
+       "runtime"
+)
+
+func main() {
+       runtime.MemProfileRate = 1
+       start(100)
+}
+
+func start(i int) {
+       if i == 0 {
+               return
+       }
+       C.poison()
+       // Tie up a thread.
+       // We won't actually wait for this sleep to complete.
+       go func() { C.sleep(1) }()
+       start(i - 1)
+}
+
+//export Nop
+func Nop(*C.char) {
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan5.go b/libgo/misc/cgo/testsanitizers/testdata/msan5.go
new file mode 100644 (file)
index 0000000..f1479eb
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Using reflect to set a value was not seen by msan.
+
+/*
+#include <stdlib.h>
+
+extern void Go1(int*);
+extern void Go2(char*);
+
+// Use weak as a hack to permit defining a function even though we use export.
+void C1() __attribute__ ((weak));
+void C2() __attribute__ ((weak));
+
+void C1() {
+       int i;
+       Go1(&i);
+       if (i != 42) {
+               abort();
+       }
+}
+
+void C2() {
+       char a[2];
+       a[1] = 42;
+       Go2(a);
+       if (a[0] != 42) {
+               abort();
+       }
+}
+*/
+import "C"
+
+import (
+       "reflect"
+       "unsafe"
+)
+
+//export Go1
+func Go1(p *C.int) {
+       reflect.ValueOf(p).Elem().Set(reflect.ValueOf(C.int(42)))
+}
+
+//export Go2
+func Go2(p *C.char) {
+       a := (*[2]byte)(unsafe.Pointer(p))
+       reflect.Copy(reflect.ValueOf(a[:1]), reflect.ValueOf(a[1:]))
+}
+
+func main() {
+       C.C1()
+       C.C2()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan6.go b/libgo/misc/cgo/testsanitizers/testdata/msan6.go
new file mode 100644 (file)
index 0000000..003989c
--- /dev/null
@@ -0,0 +1,72 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// A C function returning a value on the Go stack could leave the Go
+// stack marked as uninitialized, potentially causing a later error
+// when the stack is used for something else. Issue 26209.
+
+/*
+#cgo LDFLAGS: -fsanitize=memory
+#cgo CPPFLAGS: -fsanitize=memory
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct {
+       uintptr_t a[20];
+} S;
+
+S f() {
+       S *p;
+
+       p = (S *)(malloc(sizeof(S)));
+       p->a[0] = 0;
+       return *p;
+}
+*/
+import "C"
+
+// allocateStack extends the stack so that stack copying doesn't
+// confuse the msan data structures.
+//go:noinline
+func allocateStack(i int) int {
+       if i == 0 {
+               return i
+       }
+       return allocateStack(i - 1)
+}
+
+// F1 marks a chunk of stack as uninitialized.
+// C.f returns an uninitialized struct on the stack, so msan will mark
+// the stack as uninitialized.
+//go:noinline
+func F1() uintptr {
+       s := C.f()
+       return uintptr(s.a[0])
+}
+
+// F2 allocates a struct on the stack and converts it to an empty interface,
+// which will call msanread and see that the data appears uninitialized.
+//go:noinline
+func F2() interface{} {
+       return C.S{}
+}
+
+func poisonStack(i int) int {
+       if i == 0 {
+               return int(F1())
+       }
+       F1()
+       r := poisonStack(i - 1)
+       F2()
+       return r
+}
+
+func main() {
+       allocateStack(16384)
+       poisonStack(128)
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan_fail.go b/libgo/misc/cgo/testsanitizers/testdata/msan_fail.go
new file mode 100644 (file)
index 0000000..4c8dab3
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+void f(int32_t *p, int n) {
+  int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
+  memcpy(p, q, n * sizeof(*p));
+  free(q);
+}
+
+void g(int32_t *p, int n) {
+  if (p[4] != 1) {
+    // We shouldn't get here; msan should stop us first.
+    exit(0);
+  }
+}
+*/
+import "C"
+
+import (
+       "unsafe"
+)
+
+func main() {
+       a := make([]int32, 10)
+       C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+       a[3] = 1
+       C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/msan_shared.go b/libgo/misc/cgo/testsanitizers/testdata/msan_shared.go
new file mode 100644 (file)
index 0000000..966947c
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This program segfaulted during libpreinit when built with -msan:
+// http://golang.org/issue/18707
+
+package main
+
+import "C"
+
+func main() {}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan.go b/libgo/misc/cgo/testsanitizers/testdata/tsan.go
new file mode 100644 (file)
index 0000000..6c377a7
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program produced false race reports when run under the C/C++
+// ThreadSanitizer, as it did not understand the synchronization in
+// the Go code.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+int val;
+
+int getVal() {
+       return val;
+}
+
+void setVal(int i) {
+       val = i;
+}
+*/
+import "C"
+
+import (
+       "runtime"
+)
+
+func main() {
+       runtime.LockOSThread()
+       C.setVal(1)
+       c := make(chan bool)
+       go func() {
+               runtime.LockOSThread()
+               C.setVal(2)
+               c <- true
+       }()
+       <-c
+       if v := C.getVal(); v != 2 {
+               panic(v)
+       }
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan10.go b/libgo/misc/cgo/testsanitizers/testdata/tsan10.go
new file mode 100644 (file)
index 0000000..a40f245
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program hung when run under the C/C++ ThreadSanitizer.
+// TSAN defers asynchronous signals until the signaled thread calls into libc.
+// Since the Go runtime makes direct futex syscalls, Go runtime threads could
+// run for an arbitrarily long time without triggering the libc interceptors.
+// See https://golang.org/issue/18717.
+
+import (
+       "os"
+       "os/signal"
+       "syscall"
+)
+
+/*
+#cgo CFLAGS: -g -fsanitize=thread
+#cgo LDFLAGS: -g -fsanitize=thread
+*/
+import "C"
+
+func main() {
+       c := make(chan os.Signal, 1)
+       signal.Notify(c, syscall.SIGUSR1)
+       defer signal.Stop(c)
+       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
+       <-c
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan11.go b/libgo/misc/cgo/testsanitizers/testdata/tsan11.go
new file mode 100644 (file)
index 0000000..70ac9c8
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program hung when run under the C/C++ ThreadSanitizer. TSAN defers
+// asynchronous signals until the signaled thread calls into libc. The runtime's
+// sysmon goroutine idles itself using direct usleep syscalls, so it could
+// run for an arbitrarily long time without triggering the libc interceptors.
+// See https://golang.org/issue/18717.
+
+import (
+       "os"
+       "os/signal"
+       "syscall"
+)
+
+/*
+#cgo CFLAGS: -g -fsanitize=thread
+#cgo LDFLAGS: -g -fsanitize=thread
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static void raise_usr2(int signo) {
+       raise(SIGUSR2);
+}
+
+static void register_handler(int signo) {
+       struct sigaction sa;
+       memset(&sa, 0, sizeof(sa));
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_ONSTACK;
+       sa.sa_handler = raise_usr2;
+
+       if (sigaction(SIGUSR1, &sa, NULL) != 0) {
+               perror("failed to register SIGUSR1 handler");
+               exit(EXIT_FAILURE);
+       }
+}
+*/
+import "C"
+
+func main() {
+       ch := make(chan os.Signal)
+       signal.Notify(ch, syscall.SIGUSR2)
+
+       C.register_handler(C.int(syscall.SIGUSR1))
+       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
+
+       <-ch
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan12.go b/libgo/misc/cgo/testsanitizers/testdata/tsan12.go
new file mode 100644 (file)
index 0000000..3e767ee
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program hung when run under the C/C++ ThreadSanitizer. TSAN installs a
+// libc interceptor that writes signal handlers to a global variable within the
+// TSAN runtime instead of making a sigaction system call. A bug in
+// syscall.runtime_AfterForkInChild corrupted TSAN's signal forwarding table
+// during calls to (*os/exec.Cmd).Run, causing the parent process to fail to
+// invoke signal handlers.
+
+import (
+       "fmt"
+       "os"
+       "os/exec"
+       "os/signal"
+       "syscall"
+)
+
+import "C"
+
+func main() {
+       ch := make(chan os.Signal)
+       signal.Notify(ch, syscall.SIGUSR1)
+
+       if err := exec.Command("true").Run(); err != nil {
+               fmt.Fprintf(os.Stderr, "Unexpected error from `true`: %v", err)
+               os.Exit(1)
+       }
+
+       syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
+       <-ch
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan2.go b/libgo/misc/cgo/testsanitizers/testdata/tsan2.go
new file mode 100644 (file)
index 0000000..5018a19
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program produced false race reports when run under the C/C++
+// ThreadSanitizer, as it did not understand the synchronization in
+// the Go code.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+extern void GoRun(void);
+
+// Yes, you can have definitions if you use //export, as long as they are weak.
+
+int val __attribute__ ((weak));
+
+int run(void) __attribute__ ((weak));
+
+int run() {
+       val = 1;
+       GoRun();
+       return val;
+}
+
+void setVal(int) __attribute__ ((weak));
+
+void setVal(int i) {
+       val = i;
+}
+*/
+import "C"
+
+import "runtime"
+
+//export GoRun
+func GoRun() {
+       runtime.LockOSThread()
+       c := make(chan bool)
+       go func() {
+               runtime.LockOSThread()
+               C.setVal(2)
+               c <- true
+       }()
+       <-c
+}
+
+func main() {
+       if v := C.run(); v != 2 {
+               panic(v)
+       }
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan3.go b/libgo/misc/cgo/testsanitizers/testdata/tsan3.go
new file mode 100644 (file)
index 0000000..87f6c80
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// The stubs for the C functions read and write the same slot on the
+// g0 stack when copying arguments in and out.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+int Func1() {
+       return 0;
+}
+
+void Func2(int x) {
+       (void)x;
+}
+*/
+import "C"
+
+func main() {
+       const N = 10000
+       done := make(chan bool, N)
+       for i := 0; i < N; i++ {
+               go func() {
+                       C.Func1()
+                       done <- true
+               }()
+               go func() {
+                       C.Func2(0)
+                       done <- true
+               }()
+       }
+       for i := 0; i < 2*N; i++ {
+               <-done
+       }
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan4.go b/libgo/misc/cgo/testsanitizers/testdata/tsan4.go
new file mode 100644 (file)
index 0000000..f0c76d8
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Check that calls to C.malloc/C.free do not trigger TSAN false
+// positive reports.
+
+// #cgo CFLAGS: -fsanitize=thread
+// #cgo LDFLAGS: -fsanitize=thread
+// #include <stdlib.h>
+import "C"
+
+import (
+       "runtime"
+       "sync"
+)
+
+func main() {
+       var wg sync.WaitGroup
+       for i := 0; i < 10; i++ {
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       for i := 0; i < 100; i++ {
+                               p := C.malloc(C.size_t(i * 10))
+                               runtime.Gosched()
+                               C.free(p)
+                       }
+               }()
+       }
+       wg.Wait()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan5.go b/libgo/misc/cgo/testsanitizers/testdata/tsan5.go
new file mode 100644 (file)
index 0000000..1214a77
--- /dev/null
@@ -0,0 +1,51 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Check that calls to C.malloc/C.free do not collide with the calls
+// made by the os/user package.
+
+// #cgo CFLAGS: -fsanitize=thread
+// #cgo LDFLAGS: -fsanitize=thread
+// #include <stdlib.h>
+import "C"
+
+import (
+       "fmt"
+       "os"
+       "os/user"
+       "runtime"
+       "sync"
+)
+
+func main() {
+       u, err := user.Current()
+       if err != nil {
+               fmt.Fprintln(os.Stderr, err)
+               // Let the test pass.
+               os.Exit(0)
+       }
+
+       var wg sync.WaitGroup
+       for i := 0; i < 20; i++ {
+               wg.Add(2)
+               go func() {
+                       defer wg.Done()
+                       for i := 0; i < 1000; i++ {
+                               user.Lookup(u.Username)
+                               runtime.Gosched()
+                       }
+               }()
+               go func() {
+                       defer wg.Done()
+                       for i := 0; i < 1000; i++ {
+                               p := C.malloc(C.size_t(len(u.Username) + 1))
+                               runtime.Gosched()
+                               C.free(p)
+                       }
+               }()
+       }
+       wg.Wait()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan6.go b/libgo/misc/cgo/testsanitizers/testdata/tsan6.go
new file mode 100644 (file)
index 0000000..c96f08d
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Check that writes to Go allocated memory, with Go synchronization,
+// do not look like a race.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+void f(char *p) {
+       *p = 1;
+}
+*/
+import "C"
+
+import (
+       "runtime"
+       "sync"
+)
+
+func main() {
+       var wg sync.WaitGroup
+       var mu sync.Mutex
+       c := make(chan []C.char, 100)
+       for i := 0; i < 10; i++ {
+               wg.Add(2)
+               go func() {
+                       defer wg.Done()
+                       for i := 0; i < 100; i++ {
+                               c <- make([]C.char, 4096)
+                               runtime.Gosched()
+                       }
+               }()
+               go func() {
+                       defer wg.Done()
+                       for i := 0; i < 100; i++ {
+                               p := &(<-c)[0]
+                               mu.Lock()
+                               C.f(p)
+                               mu.Unlock()
+                       }
+               }()
+       }
+       wg.Wait()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan7.go b/libgo/misc/cgo/testsanitizers/testdata/tsan7.go
new file mode 100644 (file)
index 0000000..2fb9e45
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// Setting an environment variable in a cgo program changes the C
+// environment. Test that this does not confuse the race detector.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+*/
+import "C"
+
+import (
+       "fmt"
+       "os"
+       "sync"
+       "time"
+)
+
+func main() {
+       var wg sync.WaitGroup
+       var mu sync.Mutex
+       f := func() {
+               defer wg.Done()
+               for i := 0; i < 100; i++ {
+                       time.Sleep(time.Microsecond)
+                       mu.Lock()
+                       s := fmt.Sprint(i)
+                       os.Setenv("TSAN_TEST"+s, s)
+                       mu.Unlock()
+               }
+       }
+       wg.Add(2)
+       go f()
+       go f()
+       wg.Wait()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan8.go b/libgo/misc/cgo/testsanitizers/testdata/tsan8.go
new file mode 100644 (file)
index 0000000..88d82a6
--- /dev/null
@@ -0,0 +1,60 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program failed when run under the C/C++ ThreadSanitizer.  The TSAN
+// sigaction function interceptor returned SIG_DFL instead of the Go runtime's
+// handler in registerSegvForwarder.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct sigaction prev_sa;
+
+void forwardSignal(int signo, siginfo_t *info, void *context) {
+       // One of sa_sigaction and/or sa_handler
+       if ((prev_sa.sa_flags&SA_SIGINFO) != 0) {
+               prev_sa.sa_sigaction(signo, info, context);
+               return;
+       }
+       if (prev_sa.sa_handler != SIG_IGN && prev_sa.sa_handler != SIG_DFL) {
+               prev_sa.sa_handler(signo);
+               return;
+       }
+
+       fprintf(stderr, "No Go handler to forward to!\n");
+       abort();
+}
+
+void registerSegvFowarder() {
+       struct sigaction sa;
+       memset(&sa, 0, sizeof(sa));
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
+       sa.sa_sigaction = forwardSignal;
+
+       if (sigaction(SIGSEGV, &sa, &prev_sa) != 0) {
+               perror("failed to register SEGV forwarder");
+               exit(EXIT_FAILURE);
+       }
+}
+*/
+import "C"
+
+func main() {
+       C.registerSegvFowarder()
+
+       defer func() {
+               recover()
+       }()
+       var nilp *int
+       *nilp = 42
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan9.go b/libgo/misc/cgo/testsanitizers/testdata/tsan9.go
new file mode 100644 (file)
index 0000000..f166d8b
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program failed when run under the C/C++ ThreadSanitizer. The
+// TSAN library was not keeping track of whether signals should be
+// delivered on the alternate signal stack, and the Go signal handler
+// was not preserving callee-saved registers from C callers.
+
+/*
+#cgo CFLAGS: -g -fsanitize=thread
+#cgo LDFLAGS: -g -fsanitize=thread
+
+#include <stdlib.h>
+#include <sys/time.h>
+
+void spin() {
+       size_t n;
+       struct timeval tvstart, tvnow;
+       int diff;
+       void *prev = NULL, *cur;
+
+       gettimeofday(&tvstart, NULL);
+       for (n = 0; n < 1<<20; n++) {
+               cur = malloc(n);
+               free(prev);
+               prev = cur;
+
+               gettimeofday(&tvnow, NULL);
+               diff = (tvnow.tv_sec - tvstart.tv_sec) * 1000 * 1000 + (tvnow.tv_usec - tvstart.tv_usec);
+
+               // Profile frequency is 100Hz so we should definitely
+               // get a signal in 50 milliseconds.
+               if (diff > 50 * 1000) {
+                       break;
+               }
+       }
+
+       free(prev);
+}
+*/
+import "C"
+
+import (
+       "io/ioutil"
+       "runtime/pprof"
+       "time"
+)
+
+func goSpin() {
+       start := time.Now()
+       for n := 0; n < 1<<20; n++ {
+               _ = make([]byte, n)
+               if time.Since(start) > 50*time.Millisecond {
+                       break
+               }
+       }
+}
+
+func main() {
+       pprof.StartCPUProfile(ioutil.Discard)
+       go C.spin()
+       goSpin()
+       pprof.StopCPUProfile()
+}
diff --git a/libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go b/libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go
new file mode 100644 (file)
index 0000000..55ff67e
--- /dev/null
@@ -0,0 +1,63 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program failed with SIGSEGV when run under the C/C++ ThreadSanitizer.
+// The Go runtime had re-registered the C handler with the wrong flags due to a
+// typo, resulting in null pointers being passed for the info and context
+// parameters to the handler.
+
+/*
+#cgo CFLAGS: -fsanitize=thread
+#cgo LDFLAGS: -fsanitize=thread
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ucontext.h>
+
+void check_params(int signo, siginfo_t *info, void *context) {
+       ucontext_t* uc = (ucontext_t*)(context);
+
+       if (info->si_signo != signo) {
+               fprintf(stderr, "info->si_signo does not match signo.\n");
+               abort();
+       }
+
+       if (uc->uc_stack.ss_size == 0) {
+               fprintf(stderr, "uc_stack has size 0.\n");
+               abort();
+       }
+}
+
+
+// Set up the signal handler in a high priority constructor, so
+// that it is installed before the Go code starts.
+
+static void register_handler(void) __attribute__ ((constructor (200)));
+
+static void register_handler() {
+       struct sigaction sa;
+       memset(&sa, 0, sizeof(sa));
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_SIGINFO;
+       sa.sa_sigaction = check_params;
+
+       if (sigaction(SIGUSR1, &sa, NULL) != 0) {
+               perror("failed to register SIGUSR1 handler");
+               exit(EXIT_FAILURE);
+       }
+}
+*/
+import "C"
+
+import "syscall"
+
+func init() {
+       C.raise(C.int(syscall.SIGUSR1))
+}
+
+func main() {}
index 1d769a98b6e26c7c50473ad8373da45db92d22b5..ec4e0033fb43a4bef1c8f39782e9d8397739325e 100644 (file)
@@ -5,15 +5,11 @@
 package sanitizers_test
 
 import (
-       "runtime"
        "strings"
        "testing"
 )
 
 func TestTSAN(t *testing.T) {
-       if runtime.GOARCH == "arm64" {
-               t.Skip("skipping test; see https://golang.org/issue/25682")
-       }
        t.Parallel()
        requireOvercommit(t)
        config := configure("thread")
diff --git a/libgo/misc/cgo/testshared/overlaydir_test.go b/libgo/misc/cgo/testshared/overlaydir_test.go
new file mode 100644 (file)
index 0000000..68be056
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package shared_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
index 41a24efe22c0ed97cdb9f13cb99ad79dce9dc9a2..ac1a1c7f1a8cca20da9448ad244eb529e1a8fce7 100644 (file)
@@ -44,31 +44,35 @@ func run(t *testing.T, msg string, args ...string) {
 
 // goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
 // t.Fatalf if the command fails.
-func goCmd(t *testing.T, args ...string) {
+func goCmd(t *testing.T, args ...string) string {
        newargs := []string{args[0], "-installsuffix=" + suffix}
        if testing.Verbose() {
                newargs = append(newargs, "-x")
        }
        newargs = append(newargs, args[1:]...)
        c := exec.Command("go", newargs...)
+
+       stderr := new(strings.Builder)
        var output []byte
        var err error
        if testing.Verbose() {
-               fmt.Printf("+ go %s\n", strings.Join(newargs, " "))
-               c.Stdout = os.Stdout
+               fmt.Printf("+ go %s\n", strings.Join(args, " "))
                c.Stderr = os.Stderr
-               err = c.Run()
-               output = []byte("(output above)")
+               stderr.WriteString("(output above)")
        } else {
-               output, err = c.CombinedOutput()
+               c.Stderr = stderr
        }
+       output, err = c.Output()
+
        if err != nil {
                if t != nil {
-                       t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output)
+                       t.Helper()
+                       t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
                } else {
-                       log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output)
+                       log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
                }
        }
+       return string(bytes.TrimSpace(output))
 }
 
 // TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
@@ -105,47 +109,33 @@ func testMain(m *testing.M) (int, error) {
 
        // Some tests need to edit the source in GOPATH, so copy this directory to a
        // temporary directory and chdir to that.
-       scratchDir, err := ioutil.TempDir("", "testshared")
+       gopath, err := ioutil.TempDir("", "testshared")
        if err != nil {
                return 0, fmt.Errorf("TempDir failed: %v", err)
        }
        if testing.Verbose() {
-               fmt.Printf("+ mkdir -p %s\n", scratchDir)
-       }
-       defer os.RemoveAll(scratchDir)
-       err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
-               scratchPath := filepath.Join(scratchDir, path)
-               if info.IsDir() {
-                       if path == "." {
-                               return nil
-                       }
-                       if testing.Verbose() {
-                               fmt.Printf("+ mkdir -p %s\n", scratchPath)
-                       }
-                       return os.Mkdir(scratchPath, info.Mode())
-               } else {
-                       fromBytes, err := ioutil.ReadFile(path)
-                       if err != nil {
-                               return err
-                       }
-                       if testing.Verbose() {
-                               fmt.Printf("+ cp %s %s\n", path, scratchPath)
-                       }
-                       return ioutil.WriteFile(scratchPath, fromBytes, info.Mode())
-               }
-       })
-       if err != nil {
-               return 0, fmt.Errorf("walk failed: %v", err)
+               fmt.Printf("+ mkdir -p %s\n", gopath)
+       }
+       defer os.RemoveAll(gopath)
+
+       modRoot := filepath.Join(gopath, "src", "testshared")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               return 0, err
        }
-       os.Setenv("GOPATH", scratchDir)
        if testing.Verbose() {
-               fmt.Printf("+ export GOPATH=%s\n", scratchDir)
+               fmt.Printf("+ cd %s\n", modRoot)
+       }
+       os.Chdir(modRoot)
+       os.Setenv("PWD", modRoot)
+       if err := ioutil.WriteFile("go.mod", []byte("module testshared\n"), 0666); err != nil {
+               return 0, err
        }
-       myContext.GOPATH = scratchDir
+
+       os.Setenv("GOPATH", gopath)
        if testing.Verbose() {
-               fmt.Printf("+ cd %s\n", scratchDir)
+               fmt.Printf("+ export GOPATH=%s\n", gopath)
        }
-       os.Chdir(scratchDir)
+       myContext.GOPATH = gopath
 
        // All tests depend on runtime being built into a shared library. Because
        // that takes a few seconds, do it here and have all tests use the version
@@ -154,15 +144,20 @@ func testMain(m *testing.M) (int, error) {
        goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
 
        myContext.InstallSuffix = suffix + "_dynlink"
-       depP, err := myContext.Import("depBase", ".", build.ImportComment)
+       depP, err := myContext.Import("./depBase", ".", build.ImportComment)
        if err != nil {
                return 0, fmt.Errorf("import failed: %v", err)
        }
-       gopathInstallDir = depP.PkgTargetRoot
+       if depP.PkgTargetRoot == "" {
+               gopathInstallDir = filepath.Dir(goCmd(nil, "list", "-buildmode=shared", "-f", "{{.Target}}", "./depBase"))
+       } else {
+               gopathInstallDir = filepath.Join(depP.PkgTargetRoot, "testshared")
+       }
        return m.Run(), nil
 }
 
 func TestMain(m *testing.M) {
+       log.SetFlags(log.Lshortfile)
        flag.Parse()
 
        // Some of the tests install binaries into a custom GOPATH.
@@ -350,6 +345,7 @@ func readNotes(f *elf.File) ([]*note, error) {
 }
 
 func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
+       t.Helper()
        f, err := elf.Open(path)
        if err != nil {
                t.Fatalf("elf.Open(%q) failed: %v", path, err)
@@ -363,6 +359,7 @@ func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
 }
 
 func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
+       t.Helper()
        for _, dynstring := range dynStrings(t, path, elf.DT_NEEDED) {
                if re.MatchString(dynstring) {
                        return
@@ -372,10 +369,12 @@ func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
 }
 
 func AssertIsLinkedTo(t *testing.T, path, lib string) {
+       t.Helper()
        AssertIsLinkedToRegexp(t, path, regexp.MustCompile(regexp.QuoteMeta(lib)))
 }
 
 func AssertHasRPath(t *testing.T, path, dir string) {
+       t.Helper()
        for _, tag := range []elf.DynTag{elf.DT_RPATH, elf.DT_RUNPATH} {
                for _, dynstring := range dynStrings(t, path, tag) {
                        for _, rpath := range strings.Split(dynstring, ":") {
@@ -390,15 +389,15 @@ func AssertHasRPath(t *testing.T, path, dir string) {
 
 // Build a trivial program that links against the shared runtime and check it runs.
 func TestTrivialExecutable(t *testing.T) {
-       goCmd(t, "install", "-linkshared", "trivial")
-       run(t, "trivial executable", "./bin/trivial")
-       AssertIsLinkedTo(t, "./bin/trivial", soname)
-       AssertHasRPath(t, "./bin/trivial", gorootInstallDir)
+       goCmd(t, "install", "-linkshared", "./trivial")
+       run(t, "trivial executable", "../../bin/trivial")
+       AssertIsLinkedTo(t, "../../bin/trivial", soname)
+       AssertHasRPath(t, "../../bin/trivial", gorootInstallDir)
 }
 
 // Build a trivial program in PIE mode that links against the shared runtime and check it runs.
 func TestTrivialExecutablePIE(t *testing.T) {
-       goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "trivial")
+       goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "./trivial")
        run(t, "trivial executable", "./trivial.pie")
        AssertIsLinkedTo(t, "./trivial.pie", soname)
        AssertHasRPath(t, "./trivial.pie", gorootInstallDir)
@@ -406,15 +405,15 @@ func TestTrivialExecutablePIE(t *testing.T) {
 
 // Build a division test program and check it runs.
 func TestDivisionExecutable(t *testing.T) {
-       goCmd(t, "install", "-linkshared", "division")
-       run(t, "division executable", "./bin/division")
+       goCmd(t, "install", "-linkshared", "./division")
+       run(t, "division executable", "../../bin/division")
 }
 
 // Build an executable that uses cgo linked against the shared runtime and check it
 // runs.
 func TestCgoExecutable(t *testing.T) {
-       goCmd(t, "install", "-linkshared", "execgo")
-       run(t, "cgo executable", "./bin/execgo")
+       goCmd(t, "install", "-linkshared", "./execgo")
+       run(t, "cgo executable", "../../bin/execgo")
 }
 
 func checkPIE(t *testing.T, name string) {
@@ -433,7 +432,7 @@ func checkPIE(t *testing.T, name string) {
 
 func TestTrivialPIE(t *testing.T) {
        name := "trivial_pie"
-       goCmd(t, "build", "-buildmode=pie", "-o="+name, "trivial")
+       goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial")
        defer os.Remove(name)
        run(t, name, "./"+name)
        checkPIE(t, name)
@@ -441,7 +440,7 @@ func TestTrivialPIE(t *testing.T) {
 
 func TestCgoPIE(t *testing.T) {
        name := "cgo_pie"
-       goCmd(t, "build", "-buildmode=pie", "-o="+name, "execgo")
+       goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo")
        defer os.Remove(name)
        run(t, name, "./"+name)
        checkPIE(t, name)
@@ -450,15 +449,16 @@ func TestCgoPIE(t *testing.T) {
 // Build a GOPATH package into a shared library that links against the goroot runtime
 // and an executable that links against both.
 func TestGopathShlib(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       AssertIsLinkedTo(t, filepath.Join(gopathInstallDir, "libdepBase.so"), soname)
-       goCmd(t, "install", "-linkshared", "exe")
-       AssertIsLinkedTo(t, "./bin/exe", soname)
-       AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so")
-       AssertHasRPath(t, "./bin/exe", gorootInstallDir)
-       AssertHasRPath(t, "./bin/exe", gopathInstallDir)
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+       AssertIsLinkedTo(t, shlib, soname)
+       goCmd(t, "install", "-linkshared", "./exe")
+       AssertIsLinkedTo(t, "../../bin/exe", soname)
+       AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+       AssertHasRPath(t, "../../bin/exe", gorootInstallDir)
+       AssertHasRPath(t, "../../bin/exe", filepath.Dir(gopathInstallDir))
        // And check it runs.
-       run(t, "executable linked to GOPATH library", "./bin/exe")
+       run(t, "executable linked to GOPATH library", "../../bin/exe")
 }
 
 // The shared library contains a note listing the packages it contains in a section
@@ -470,8 +470,8 @@ func testPkgListNote(t *testing.T, f *elf.File, note *note) {
        if isOffsetLoaded(f, note.section.Offset) {
                t.Errorf("package list section contained in PT_LOAD segment")
        }
-       if note.desc != "depBase\n" {
-               t.Errorf("incorrect package list %q, want %q", note.desc, "depBase\n")
+       if note.desc != "testshared/depBase\n" {
+               t.Errorf("incorrect package list %q, want %q", note.desc, "testshared/depBase\n")
        }
 }
 
@@ -528,8 +528,9 @@ func testDepsNote(t *testing.T, f *elf.File, note *note) {
 
 // The shared library contains notes with defined contents; see above.
 func TestNotes(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       f, err := elf.Open(filepath.Join(gopathInstallDir, "libdepBase.so"))
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+       f, err := elf.Open(shlib)
        if err != nil {
                t.Fatal(err)
        }
@@ -581,23 +582,24 @@ func TestNotes(t *testing.T) {
 // runtime, another package (dep2) that links against the first, and an
 // executable that links against dep2.
 func TestTwoGopathShlibs(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2")
-       goCmd(t, "install", "-linkshared", "exe2")
-       run(t, "executable linked to GOPATH library", "./bin/exe2")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+       goCmd(t, "install", "-linkshared", "./exe2")
+       run(t, "executable linked to GOPATH library", "../../bin/exe2")
 }
 
 func TestThreeGopathShlibs(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2")
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep3")
-       goCmd(t, "install", "-linkshared", "exe3")
-       run(t, "executable linked to GOPATH library", "./bin/exe3")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep3")
+       goCmd(t, "install", "-linkshared", "./exe3")
+       run(t, "executable linked to GOPATH library", "../../bin/exe3")
 }
 
-// If gccgo is not available or not new enough call t.Skip. Otherwise,
-// return a build.Context that is set up for gccgo.
-func prepGccgo(t *testing.T) build.Context {
+// If gccgo is not available or not new enough, call t.Skip.
+func requireGccgo(t *testing.T) {
+       t.Helper()
+
        gccgoName := os.Getenv("GCCGO")
        if gccgoName == "" {
                gccgoName = "gccgo"
@@ -614,61 +616,64 @@ func prepGccgo(t *testing.T) build.Context {
        if string(output) < "5" {
                t.Skipf("gccgo too old (%s)", strings.TrimSpace(string(output)))
        }
-       gccgoContext := build.Default
-       gccgoContext.InstallSuffix = suffix + "_fPIC"
-       gccgoContext.Compiler = "gccgo"
-       gccgoContext.GOPATH = os.Getenv("GOPATH")
-       return gccgoContext
+
+       gomod, err := exec.Command("go", "env", "GOMOD").Output()
+       if err != nil {
+               t.Fatalf("go env GOMOD: %v", err)
+       }
+       if len(bytes.TrimSpace(gomod)) > 0 {
+               t.Skipf("gccgo not supported in module mode; see golang.org/issue/30344")
+       }
 }
 
 // Build a GOPATH package into a shared library with gccgo and an executable that
 // links against it.
 func TestGoPathShlibGccgo(t *testing.T) {
-       gccgoContext := prepGccgo(t)
+       requireGccgo(t)
 
        libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
 
-       depP, err := gccgoContext.Import("depBase", ".", build.ImportComment)
-       if err != nil {
-               t.Fatalf("import failed: %v", err)
-       }
-       gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs")
-       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase")
-       AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE)
-       goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe")
-       AssertIsLinkedToRegexp(t, "./bin/exe", libgoRE)
-       AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so")
-       AssertHasRPath(t, "./bin/exe", gccgoInstallDir)
+       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+
+       // Run 'go list' after 'go install': with gccgo, we apparently don't know the
+       // shlib location until after we've installed it.
+       shlib := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
+
+       AssertIsLinkedToRegexp(t, shlib, libgoRE)
+       goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe")
+       AssertIsLinkedToRegexp(t, "../../bin/exe", libgoRE)
+       AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+       AssertHasRPath(t, "../../bin/exe", filepath.Dir(shlib))
        // And check it runs.
-       run(t, "gccgo-built", "./bin/exe")
+       run(t, "gccgo-built", "../../bin/exe")
 }
 
 // The gccgo version of TestTwoGopathShlibs: build a GOPATH package into a shared
 // library with gccgo, another GOPATH package that depends on the first and an
 // executable that links the second library.
 func TestTwoGopathShlibsGccgo(t *testing.T) {
-       gccgoContext := prepGccgo(t)
+       requireGccgo(t)
 
        libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
 
-       depP, err := gccgoContext.Import("depBase", ".", build.ImportComment)
-       if err != nil {
-               t.Fatalf("import failed: %v", err)
-       }
-       gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs")
-       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase")
-       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "dep2")
-       goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe2")
+       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+       goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./dep2")
+       goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe2")
+
+       // Run 'go list' after 'go install': with gccgo, we apparently don't know the
+       // shlib location until after we've installed it.
+       dep2 := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./dep2")
+       depBase := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
 
-       AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE)
-       AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdep2.so"), libgoRE)
-       AssertIsLinkedTo(t, filepath.Join(gccgoInstallDir, "libdep2.so"), "libdepBase.so")
-       AssertIsLinkedToRegexp(t, "./bin/exe2", libgoRE)
-       AssertIsLinkedTo(t, "./bin/exe2", "libdep2")
-       AssertIsLinkedTo(t, "./bin/exe2", "libdepBase.so")
+       AssertIsLinkedToRegexp(t, depBase, libgoRE)
+       AssertIsLinkedToRegexp(t, dep2, libgoRE)
+       AssertIsLinkedTo(t, dep2, filepath.Base(depBase))
+       AssertIsLinkedToRegexp(t, "../../bin/exe2", libgoRE)
+       AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(dep2))
+       AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(depBase))
 
        // And check it runs.
-       run(t, "gccgo-built", "./bin/exe2")
+       run(t, "gccgo-built", "../../bin/exe2")
 }
 
 // Testing rebuilding of shared libraries when they are stale is a bit more
@@ -694,9 +699,9 @@ func resetFileStamps() {
                }
 
        }
-       reset("bin")
-       reset("pkg")
-       reset("src")
+       reset("../../bin")
+       reset("../../pkg")
+       reset("../../src")
        reset(gorootInstallDir)
 }
 
@@ -746,6 +751,7 @@ func touch(t *testing.T, path string) (cleanup func()) {
 
 // isNew returns if the path is newer than the time stamp used by touch.
 func isNew(t *testing.T, path string) bool {
+       t.Helper()
        fi, err := os.Stat(path)
        if err != nil {
                t.Fatal(err)
@@ -771,40 +777,47 @@ func AssertNotRebuilt(t *testing.T, msg, path string) {
 }
 
 func TestRebuilding(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       goCmd(t, "install", "-linkshared", "exe")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       goCmd(t, "install", "-linkshared", "./exe")
+       info := strings.Fields(goCmd(t, "list", "-buildmode=shared", "-linkshared", "-f", "{{.Target}} {{.Shlib}}", "./depBase"))
+       if len(info) != 2 {
+               t.Fatalf("go list failed to report Target and/or Shlib")
+       }
+       target := info[0]
+       shlib := info[1]
 
        // If the source is newer than both the .a file and the .so, both are rebuilt.
        t.Run("newsource", func(t *testing.T) {
                resetFileStamps()
-               cleanup := touch(t, "src/depBase/dep.go")
+               cleanup := touch(t, "./depBase/dep.go")
                defer func() {
                        cleanup()
-                       goCmd(t, "install", "-linkshared", "exe")
+                       goCmd(t, "install", "-linkshared", "./exe")
                }()
-               goCmd(t, "install", "-linkshared", "exe")
-               AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "depBase.a"))
-               AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "libdepBase.so"))
+               goCmd(t, "install", "-linkshared", "./exe")
+               AssertRebuilt(t, "new source", target)
+               AssertRebuilt(t, "new source", shlib)
        })
 
        // If the .a file is newer than the .so, the .so is rebuilt (but not the .a)
        t.Run("newarchive", func(t *testing.T) {
                resetFileStamps()
-               AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a"))
-               goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "depBase")
-               AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a"))
-               cleanup := touch(t, filepath.Join(gopathInstallDir, "depBase.a"))
+               AssertNotRebuilt(t, "new .a file before build", target)
+               goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "./depBase")
+               AssertNotRebuilt(t, "new .a file before build", target)
+               cleanup := touch(t, target)
                defer func() {
                        cleanup()
-                       goCmd(t, "install", "-v", "-linkshared", "exe")
+                       goCmd(t, "install", "-v", "-linkshared", "./exe")
                }()
-               goCmd(t, "install", "-v", "-linkshared", "exe")
-               AssertNotRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "depBase.a"))
-               AssertRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "libdepBase.so"))
+               goCmd(t, "install", "-v", "-linkshared", "./exe")
+               AssertNotRebuilt(t, "new .a file", target)
+               AssertRebuilt(t, "new .a file", shlib)
        })
 }
 
 func appendFile(t *testing.T, path, content string) {
+       t.Helper()
        f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0660)
        if err != nil {
                t.Fatalf("os.OpenFile failed: %v", err)
@@ -821,16 +834,24 @@ func appendFile(t *testing.T, path, content string) {
        }
 }
 
-func writeFile(t *testing.T, path, content string) {
-       err := ioutil.WriteFile(path, []byte(content), 0644)
+func createFile(t *testing.T, path, content string) {
+       t.Helper()
+       f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
        if err != nil {
-               t.Fatalf("ioutil.WriteFile failed: %v", err)
+               t.Fatalf("os.OpenFile failed: %v", err)
+       }
+       _, err = f.WriteString(content)
+       if closeErr := f.Close(); err == nil {
+               err = closeErr
+       }
+       if err != nil {
+               t.Fatalf("WriteString failed: %v", err)
        }
 }
 
 func TestABIChecking(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       goCmd(t, "install", "-linkshared", "exe")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       goCmd(t, "install", "-linkshared", "./exe")
 
        // If we make an ABI-breaking change to depBase and rebuild libp.so but not exe,
        // exe will abort with a complaint on startup.
@@ -838,18 +859,21 @@ func TestABIChecking(t *testing.T) {
        // some senses but suffices for the narrow definition of ABI compatibility the
        // toolchain uses today.
        resetFileStamps()
-       appendFile(t, "src/depBase/dep.go", "func ABIBreak() {}\n")
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       c := exec.Command("./bin/exe")
+
+       createFile(t, "./depBase/break.go", "package depBase\nfunc ABIBreak() {}\n")
+       defer os.Remove("./depBase/break.go")
+
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       c := exec.Command("../../bin/exe")
        output, err := c.CombinedOutput()
        if err == nil {
                t.Fatal("executing exe did not fail after ABI break")
        }
        scanner := bufio.NewScanner(bytes.NewReader(output))
        foundMsg := false
-       const wantLine = "abi mismatch detected between the executable and libdepBase.so"
+       const wantPrefix = "abi mismatch detected between the executable and lib"
        for scanner.Scan() {
-               if scanner.Text() == wantLine {
+               if strings.HasPrefix(scanner.Text(), wantPrefix) {
                        foundMsg = true
                        break
                }
@@ -858,20 +882,20 @@ func TestABIChecking(t *testing.T) {
                t.Errorf("scanner encountered error: %v", err)
        }
        if !foundMsg {
-               t.Fatalf("exe failed, but without line %q; got output:\n%s", wantLine, output)
+               t.Fatalf("exe failed, but without line %q; got output:\n%s", wantPrefix, output)
        }
 
        // Rebuilding exe makes it work again.
-       goCmd(t, "install", "-linkshared", "exe")
-       run(t, "rebuilt exe", "./bin/exe")
+       goCmd(t, "install", "-linkshared", "./exe")
+       run(t, "rebuilt exe", "../../bin/exe")
 
        // If we make a change which does not break ABI (such as adding an unexported
        // function) and rebuild libdepBase.so, exe still works, even if new function
        // is in a file by itself.
        resetFileStamps()
-       writeFile(t, "src/depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
-       run(t, "after non-ABI breaking change", "./bin/exe")
+       createFile(t, "./depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+       run(t, "after non-ABI breaking change", "../../bin/exe")
 }
 
 // If a package 'explicit' imports a package 'implicit', building
@@ -881,29 +905,29 @@ func TestABIChecking(t *testing.T) {
 // executable rather than fetching it from the shared library. The
 // link still succeeds and the executable still runs though.
 func TestImplicitInclusion(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "explicit")
-       goCmd(t, "install", "-linkshared", "implicitcmd")
-       run(t, "running executable linked against library that contains same package as it", "./bin/implicitcmd")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./explicit")
+       goCmd(t, "install", "-linkshared", "./implicitcmd")
+       run(t, "running executable linked against library that contains same package as it", "../../bin/implicitcmd")
 }
 
 // Tests to make sure that the type fields of empty interfaces and itab
 // fields of nonempty interfaces are unique even across modules,
 // so that interface equality works correctly.
 func TestInterface(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_a")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_a")
        // Note: iface_i gets installed implicitly as a dependency of iface_a.
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_b")
-       goCmd(t, "install", "-linkshared", "iface")
-       run(t, "running type/itab uniqueness tester", "./bin/iface")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_b")
+       goCmd(t, "install", "-linkshared", "./iface")
+       run(t, "running type/itab uniqueness tester", "../../bin/iface")
 }
 
 // Access a global variable from a library.
 func TestGlobal(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "globallib")
-       goCmd(t, "install", "-linkshared", "global")
-       run(t, "global executable", "./bin/global")
-       AssertIsLinkedTo(t, "./bin/global", soname)
-       AssertHasRPath(t, "./bin/global", gorootInstallDir)
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./globallib")
+       goCmd(t, "install", "-linkshared", "./global")
+       run(t, "global executable", "../../bin/global")
+       AssertIsLinkedTo(t, "../../bin/global", soname)
+       AssertHasRPath(t, "../../bin/global", gorootInstallDir)
 }
 
 // Run a test using -linkshared of an installed shared package.
@@ -915,5 +939,5 @@ func TestTestInstalledShared(t *testing.T) {
 // Test generated pointer method with -linkshared.
 // Issue 25065.
 func TestGeneratedMethod(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "issue25065")
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue25065")
 }
diff --git a/libgo/misc/cgo/testshared/src/dep2/dep2.go b/libgo/misc/cgo/testshared/src/dep2/dep2.go
deleted file mode 100644 (file)
index c2c812a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package dep2
-
-import "depBase"
-
-var W int = 1
-
-var hasProg depBase.HasProg
-
-type Dep2 struct {
-       depBase.Dep
-}
-
-func G() int {
-       return depBase.F() + 1
-}
diff --git a/libgo/misc/cgo/testshared/src/dep3/dep3.go b/libgo/misc/cgo/testshared/src/dep3/dep3.go
deleted file mode 100644 (file)
index 7b7c9da..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package dep3
-
-// The point of this test file is that it references a type from
-// depBase that is also referenced in dep2, but dep2 is loaded by the
-// linker before depBase (because it is earlier in the import list).
-// There was a bug in the linker where it would not correctly read out
-// the type data in this case and later crash.
-
-import (
-       "dep2"
-       "depBase"
-)
-
-type Dep3 struct {
-       dep  depBase.Dep
-       dep2 dep2.Dep2
-}
-
-func D3() int {
-       var x Dep3
-       return x.dep.X + x.dep2.X
-}
diff --git a/libgo/misc/cgo/testshared/src/depBase/asm.s b/libgo/misc/cgo/testshared/src/depBase/asm.s
deleted file mode 100644 (file)
index a8acf77..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-#include "textflag.h"
-
-TEXT ·ImplementedInAsm(SB),NOSPLIT,$0-0
-       RET
diff --git a/libgo/misc/cgo/testshared/src/depBase/dep.go b/libgo/misc/cgo/testshared/src/depBase/dep.go
deleted file mode 100644 (file)
index e7cc7c8..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package depBase
-
-import (
-       "os"
-       "reflect"
-)
-
-var SlicePtr interface{} = &[]int{}
-
-var V int = 1
-
-var HasMask []string = []string{"hi"}
-
-type HasProg struct {
-       array [1024]*byte
-}
-
-type Dep struct {
-       X int
-}
-
-func (d *Dep) Method() int {
-       // This code below causes various go.itab.* symbols to be generated in
-       // the shared library. Similar code in ../exe/exe.go results in
-       // exercising https://golang.org/issues/17594
-       reflect.TypeOf(os.Stdout).Elem()
-       return 10
-}
-
-func F() int {
-       defer func() {}()
-       return V
-}
diff --git a/libgo/misc/cgo/testshared/src/depBase/gccgo.go b/libgo/misc/cgo/testshared/src/depBase/gccgo.go
deleted file mode 100644 (file)
index 2b02a1e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-package depBase
-
-func ImplementedInAsm() {}
diff --git a/libgo/misc/cgo/testshared/src/depBase/stubs.go b/libgo/misc/cgo/testshared/src/depBase/stubs.go
deleted file mode 100644 (file)
index 04534f3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gccgo
-
-package depBase
-
-func ImplementedInAsm()
diff --git a/libgo/misc/cgo/testshared/src/division/division.go b/libgo/misc/cgo/testshared/src/division/division.go
deleted file mode 100644 (file)
index bb5fc98..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-//go:noinline
-func div(x, y uint32) uint32 {
-       return x / y
-}
-
-func main() {
-       a := div(97, 11)
-       if a != 8 {
-               panic("FAIL")
-       }
-}
diff --git a/libgo/misc/cgo/testshared/src/exe/exe.go b/libgo/misc/cgo/testshared/src/exe/exe.go
deleted file mode 100644 (file)
index bd864d8..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package main
-
-import (
-       "depBase"
-       "os"
-       "reflect"
-       "runtime"
-)
-
-// Having a function declared in the main package triggered
-// golang.org/issue/18250
-func DeclaredInMain() {
-}
-
-type C struct {
-}
-
-func F() *C {
-       return nil
-}
-
-var slicePtr interface{} = &[]int{}
-
-func main() {
-       defer depBase.ImplementedInAsm()
-       // This code below causes various go.itab.* symbols to be generated in
-       // the executable. Similar code in ../depBase/dep.go results in
-       // exercising https://golang.org/issues/17594
-       reflect.TypeOf(os.Stdout).Elem()
-       runtime.GC()
-       depBase.V = depBase.F() + 1
-
-       var c *C
-       if reflect.TypeOf(F).Out(0) != reflect.TypeOf(c) {
-               panic("bad reflection results, see golang.org/issue/18252")
-       }
-
-       sp := reflect.New(reflect.TypeOf(slicePtr).Elem())
-       s := sp.Interface()
-
-       if reflect.TypeOf(s) != reflect.TypeOf(slicePtr) {
-               panic("bad reflection results, see golang.org/issue/18729")
-       }
-}
diff --git a/libgo/misc/cgo/testshared/src/exe2/exe2.go b/libgo/misc/cgo/testshared/src/exe2/exe2.go
deleted file mode 100644 (file)
index 675fd1f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package main
-
-import "dep2"
-
-func main() {
-       d := &dep2.Dep2{}
-       dep2.W = dep2.G() + 1 + d.Method()
-}
diff --git a/libgo/misc/cgo/testshared/src/exe3/exe3.go b/libgo/misc/cgo/testshared/src/exe3/exe3.go
deleted file mode 100644 (file)
index 643f260..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import "dep3"
-
-func main() {
-       dep3.D3()
-}
diff --git a/libgo/misc/cgo/testshared/src/execgo/exe.go b/libgo/misc/cgo/testshared/src/execgo/exe.go
deleted file mode 100644 (file)
index 0427be8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package main
-
-/*
- */
-import "C"
-
-func main() {
-}
diff --git a/libgo/misc/cgo/testshared/src/explicit/explicit.go b/libgo/misc/cgo/testshared/src/explicit/explicit.go
deleted file mode 100644 (file)
index 6a4453f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package explicit
-
-import (
-       "implicit"
-)
-
-func E() int {
-       return implicit.I()
-}
diff --git a/libgo/misc/cgo/testshared/src/global/main.go b/libgo/misc/cgo/testshared/src/global/main.go
deleted file mode 100644 (file)
index 94e7f24..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "globallib"
-)
-
-//go:noinline
-func testLoop() {
-       for i, s := range globallib.Data {
-               if s != int64(i) {
-                       panic("testLoop: mismatch")
-               }
-       }
-}
-
-//go:noinline
-func ptrData() *[1<<20 + 10]int64 {
-       return &globallib.Data
-}
-
-//go:noinline
-func testMediumOffset() {
-       for i, s := range globallib.Data[1<<16-2:] {
-               if s != int64(i)+1<<16-2 {
-                       panic("testMediumOffset: index mismatch")
-               }
-       }
-
-       x := globallib.Data[1<<16-1]
-       if x != 1<<16-1 {
-               panic("testMediumOffset: direct mismatch")
-       }
-
-       y := &globallib.Data[1<<16-3]
-       if y != &ptrData()[1<<16-3] {
-               panic("testMediumOffset: address mismatch")
-       }
-}
-
-//go:noinline
-func testLargeOffset() {
-       for i, s := range globallib.Data[1<<20:] {
-               if s != int64(i)+1<<20 {
-                       panic("testLargeOffset: index mismatch")
-               }
-       }
-
-       x := globallib.Data[1<<20+1]
-       if x != 1<<20+1 {
-               panic("testLargeOffset: direct mismatch")
-       }
-
-       y := &globallib.Data[1<<20+2]
-       if y != &ptrData()[1<<20+2] {
-               panic("testLargeOffset: address mismatch")
-       }
-}
-
-func main() {
-       testLoop()
-
-       // SSA rules commonly merge offsets into addresses. These
-       // tests access global data in different ways to try
-       // and exercise different SSA rules.
-       testMediumOffset()
-       testLargeOffset()
-}
diff --git a/libgo/misc/cgo/testshared/src/globallib/global.go b/libgo/misc/cgo/testshared/src/globallib/global.go
deleted file mode 100644 (file)
index b4372a2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package globallib
-
-// Data is large enough to that offsets into it do not fit into
-// 16-bit or 20-bit immediates. Ideally we'd also try and overrun
-// 32-bit immediates, but that requires the test machine to have
-// too much memory.
-var Data [1<<20 + 10]int64
-
-func init() {
-       for i := range Data {
-               Data[i] = int64(i)
-       }
-}
diff --git a/libgo/misc/cgo/testshared/src/iface/main.go b/libgo/misc/cgo/testshared/src/iface/main.go
deleted file mode 100644 (file)
index 3d5b54e..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "iface_a"
-import "iface_b"
-
-func main() {
-       if iface_a.F() != iface_b.F() {
-               panic("empty interfaces not equal")
-       }
-       if iface_a.G() != iface_b.G() {
-               panic("non-empty interfaces not equal")
-       }
-}
diff --git a/libgo/misc/cgo/testshared/src/iface_a/a.go b/libgo/misc/cgo/testshared/src/iface_a/a.go
deleted file mode 100644 (file)
index e11047c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iface_a
-
-import "iface_i"
-
-//go:noinline
-func F() interface{} {
-       return (*iface_i.T)(nil)
-}
-
-//go:noinline
-func G() iface_i.I {
-       return (*iface_i.T)(nil)
-}
diff --git a/libgo/misc/cgo/testshared/src/iface_b/b.go b/libgo/misc/cgo/testshared/src/iface_b/b.go
deleted file mode 100644 (file)
index 47aee2e..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iface_b
-
-import "iface_i"
-
-//go:noinline
-func F() interface{} {
-       return (*iface_i.T)(nil)
-}
-
-//go:noinline
-func G() iface_i.I {
-       return (*iface_i.T)(nil)
-}
diff --git a/libgo/misc/cgo/testshared/src/iface_i/i.go b/libgo/misc/cgo/testshared/src/iface_i/i.go
deleted file mode 100644 (file)
index 31c8038..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iface_i
-
-type I interface {
-       M()
-}
-
-type T struct {
-}
-
-func (t *T) M() {
-}
-
-// *T implements I
diff --git a/libgo/misc/cgo/testshared/src/implicit/implicit.go b/libgo/misc/cgo/testshared/src/implicit/implicit.go
deleted file mode 100644 (file)
index 5360188..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package implicit
-
-func I() int {
-       return 42
-}
diff --git a/libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go b/libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go
deleted file mode 100644 (file)
index f611293..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package main
-
-import (
-       "explicit"
-       "implicit"
-)
-
-func main() {
-       println(implicit.I() + explicit.E())
-}
diff --git a/libgo/misc/cgo/testshared/src/issue25065/a.go b/libgo/misc/cgo/testshared/src/issue25065/a.go
deleted file mode 100644 (file)
index 979350f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package issue25065 has a type with a method that is
-//  1) referenced in a method expression
-//  2) not called
-//  3) not converted to an interface
-//  4) is a value method but the reference is to the pointer method
-// These cases avoid the call to makefuncsym from typecheckfunc, but we
-// still need to call makefuncsym somehow or the symbol will not be defined.
-package issue25065
-
-type T int
-
-func (t T) M() {}
-
-func F() func(*T) {
-       return (*T).M
-}
diff --git a/libgo/misc/cgo/testshared/src/trivial/trivial.go b/libgo/misc/cgo/testshared/src/trivial/trivial.go
deleted file mode 100644 (file)
index 6ade47c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package main
-
-func main() {
-       // This is enough to make sure that the executable references
-       // a type descriptor, which was the cause of
-       // https://golang.org/issue/25970.
-       c := make(chan int)
-       _ = c
-}
diff --git a/libgo/misc/cgo/testshared/testdata/dep2/dep2.go b/libgo/misc/cgo/testshared/testdata/dep2/dep2.go
new file mode 100644 (file)
index 0000000..94f38cf
--- /dev/null
@@ -0,0 +1,15 @@
+package dep2
+
+import "testshared/depBase"
+
+var W int = 1
+
+var hasProg depBase.HasProg
+
+type Dep2 struct {
+       depBase.Dep
+}
+
+func G() int {
+       return depBase.F() + 1
+}
diff --git a/libgo/misc/cgo/testshared/testdata/dep3/dep3.go b/libgo/misc/cgo/testshared/testdata/dep3/dep3.go
new file mode 100644 (file)
index 0000000..6b02ad2
--- /dev/null
@@ -0,0 +1,22 @@
+package dep3
+
+// The point of this test file is that it references a type from
+// depBase that is also referenced in dep2, but dep2 is loaded by the
+// linker before depBase (because it is earlier in the import list).
+// There was a bug in the linker where it would not correctly read out
+// the type data in this case and later crash.
+
+import (
+       "testshared/dep2"
+       "testshared/depBase"
+)
+
+type Dep3 struct {
+       dep  depBase.Dep
+       dep2 dep2.Dep2
+}
+
+func D3() int {
+       var x Dep3
+       return x.dep.X + x.dep2.X
+}
diff --git a/libgo/misc/cgo/testshared/testdata/depBase/asm.s b/libgo/misc/cgo/testshared/testdata/depBase/asm.s
new file mode 100644 (file)
index 0000000..a8acf77
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+#include "textflag.h"
+
+TEXT ·ImplementedInAsm(SB),NOSPLIT,$0-0
+       RET
diff --git a/libgo/misc/cgo/testshared/testdata/depBase/dep.go b/libgo/misc/cgo/testshared/testdata/depBase/dep.go
new file mode 100644 (file)
index 0000000..e7cc7c8
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package depBase
+
+import (
+       "os"
+       "reflect"
+)
+
+var SlicePtr interface{} = &[]int{}
+
+var V int = 1
+
+var HasMask []string = []string{"hi"}
+
+type HasProg struct {
+       array [1024]*byte
+}
+
+type Dep struct {
+       X int
+}
+
+func (d *Dep) Method() int {
+       // This code below causes various go.itab.* symbols to be generated in
+       // the shared library. Similar code in ../exe/exe.go results in
+       // exercising https://golang.org/issues/17594
+       reflect.TypeOf(os.Stdout).Elem()
+       return 10
+}
+
+func F() int {
+       defer func() {}()
+       return V
+}
diff --git a/libgo/misc/cgo/testshared/testdata/depBase/gccgo.go b/libgo/misc/cgo/testshared/testdata/depBase/gccgo.go
new file mode 100644 (file)
index 0000000..2b02a1e
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gccgo
+
+package depBase
+
+func ImplementedInAsm() {}
diff --git a/libgo/misc/cgo/testshared/testdata/depBase/stubs.go b/libgo/misc/cgo/testshared/testdata/depBase/stubs.go
new file mode 100644 (file)
index 0000000..04534f3
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !gccgo
+
+package depBase
+
+func ImplementedInAsm()
diff --git a/libgo/misc/cgo/testshared/testdata/division/division.go b/libgo/misc/cgo/testshared/testdata/division/division.go
new file mode 100644 (file)
index 0000000..bb5fc98
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+//go:noinline
+func div(x, y uint32) uint32 {
+       return x / y
+}
+
+func main() {
+       a := div(97, 11)
+       if a != 8 {
+               panic("FAIL")
+       }
+}
diff --git a/libgo/misc/cgo/testshared/testdata/exe/exe.go b/libgo/misc/cgo/testshared/testdata/exe/exe.go
new file mode 100644 (file)
index 0000000..ee95f97
--- /dev/null
@@ -0,0 +1,45 @@
+package main
+
+import (
+       "os"
+       "reflect"
+       "runtime"
+
+       "testshared/depBase"
+)
+
+// Having a function declared in the main package triggered
+// golang.org/issue/18250
+func DeclaredInMain() {
+}
+
+type C struct {
+}
+
+func F() *C {
+       return nil
+}
+
+var slicePtr interface{} = &[]int{}
+
+func main() {
+       defer depBase.ImplementedInAsm()
+       // This code below causes various go.itab.* symbols to be generated in
+       // the executable. Similar code in ../depBase/dep.go results in
+       // exercising https://golang.org/issues/17594
+       reflect.TypeOf(os.Stdout).Elem()
+       runtime.GC()
+       depBase.V = depBase.F() + 1
+
+       var c *C
+       if reflect.TypeOf(F).Out(0) != reflect.TypeOf(c) {
+               panic("bad reflection results, see golang.org/issue/18252")
+       }
+
+       sp := reflect.New(reflect.TypeOf(slicePtr).Elem())
+       s := sp.Interface()
+
+       if reflect.TypeOf(s) != reflect.TypeOf(slicePtr) {
+               panic("bad reflection results, see golang.org/issue/18729")
+       }
+}
diff --git a/libgo/misc/cgo/testshared/testdata/exe2/exe2.go b/libgo/misc/cgo/testshared/testdata/exe2/exe2.go
new file mode 100644 (file)
index 0000000..433f331
--- /dev/null
@@ -0,0 +1,8 @@
+package main
+
+import "testshared/dep2"
+
+func main() {
+       d := &dep2.Dep2{}
+       dep2.W = dep2.G() + 1 + d.Method()
+}
diff --git a/libgo/misc/cgo/testshared/testdata/exe3/exe3.go b/libgo/misc/cgo/testshared/testdata/exe3/exe3.go
new file mode 100644 (file)
index 0000000..533e3a9
--- /dev/null
@@ -0,0 +1,7 @@
+package main
+
+import "testshared/dep3"
+
+func main() {
+       dep3.D3()
+}
diff --git a/libgo/misc/cgo/testshared/testdata/execgo/exe.go b/libgo/misc/cgo/testshared/testdata/execgo/exe.go
new file mode 100644 (file)
index 0000000..0427be8
--- /dev/null
@@ -0,0 +1,8 @@
+package main
+
+/*
+ */
+import "C"
+
+func main() {
+}
diff --git a/libgo/misc/cgo/testshared/testdata/explicit/explicit.go b/libgo/misc/cgo/testshared/testdata/explicit/explicit.go
new file mode 100644 (file)
index 0000000..af969fc
--- /dev/null
@@ -0,0 +1,9 @@
+package explicit
+
+import (
+       "testshared/implicit"
+)
+
+func E() int {
+       return implicit.I()
+}
diff --git a/libgo/misc/cgo/testshared/testdata/global/main.go b/libgo/misc/cgo/testshared/testdata/global/main.go
new file mode 100644 (file)
index 0000000..f43e7c3
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "testshared/globallib"
+)
+
+//go:noinline
+func testLoop() {
+       for i, s := range globallib.Data {
+               if s != int64(i) {
+                       panic("testLoop: mismatch")
+               }
+       }
+}
+
+//go:noinline
+func ptrData() *[1<<20 + 10]int64 {
+       return &globallib.Data
+}
+
+//go:noinline
+func testMediumOffset() {
+       for i, s := range globallib.Data[1<<16-2:] {
+               if s != int64(i)+1<<16-2 {
+                       panic("testMediumOffset: index mismatch")
+               }
+       }
+
+       x := globallib.Data[1<<16-1]
+       if x != 1<<16-1 {
+               panic("testMediumOffset: direct mismatch")
+       }
+
+       y := &globallib.Data[1<<16-3]
+       if y != &ptrData()[1<<16-3] {
+               panic("testMediumOffset: address mismatch")
+       }
+}
+
+//go:noinline
+func testLargeOffset() {
+       for i, s := range globallib.Data[1<<20:] {
+               if s != int64(i)+1<<20 {
+                       panic("testLargeOffset: index mismatch")
+               }
+       }
+
+       x := globallib.Data[1<<20+1]
+       if x != 1<<20+1 {
+               panic("testLargeOffset: direct mismatch")
+       }
+
+       y := &globallib.Data[1<<20+2]
+       if y != &ptrData()[1<<20+2] {
+               panic("testLargeOffset: address mismatch")
+       }
+}
+
+func main() {
+       testLoop()
+
+       // SSA rules commonly merge offsets into addresses. These
+       // tests access global data in different ways to try
+       // and exercise different SSA rules.
+       testMediumOffset()
+       testLargeOffset()
+}
diff --git a/libgo/misc/cgo/testshared/testdata/globallib/global.go b/libgo/misc/cgo/testshared/testdata/globallib/global.go
new file mode 100644 (file)
index 0000000..b4372a2
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package globallib
+
+// Data is large enough to that offsets into it do not fit into
+// 16-bit or 20-bit immediates. Ideally we'd also try and overrun
+// 32-bit immediates, but that requires the test machine to have
+// too much memory.
+var Data [1<<20 + 10]int64
+
+func init() {
+       for i := range Data {
+               Data[i] = int64(i)
+       }
+}
diff --git a/libgo/misc/cgo/testshared/testdata/iface/main.go b/libgo/misc/cgo/testshared/testdata/iface/main.go
new file mode 100644 (file)
index 0000000..d26ebbc
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "testshared/iface_a"
+import "testshared/iface_b"
+
+func main() {
+       if iface_a.F() != iface_b.F() {
+               panic("empty interfaces not equal")
+       }
+       if iface_a.G() != iface_b.G() {
+               panic("non-empty interfaces not equal")
+       }
+}
diff --git a/libgo/misc/cgo/testshared/testdata/iface_a/a.go b/libgo/misc/cgo/testshared/testdata/iface_a/a.go
new file mode 100644 (file)
index 0000000..e2cef1e
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package iface_a
+
+import "testshared/iface_i"
+
+//go:noinline
+func F() interface{} {
+       return (*iface_i.T)(nil)
+}
+
+//go:noinline
+func G() iface_i.I {
+       return (*iface_i.T)(nil)
+}
diff --git a/libgo/misc/cgo/testshared/testdata/iface_b/b.go b/libgo/misc/cgo/testshared/testdata/iface_b/b.go
new file mode 100644 (file)
index 0000000..dd3e027
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package iface_b
+
+import "testshared/iface_i"
+
+//go:noinline
+func F() interface{} {
+       return (*iface_i.T)(nil)
+}
+
+//go:noinline
+func G() iface_i.I {
+       return (*iface_i.T)(nil)
+}
diff --git a/libgo/misc/cgo/testshared/testdata/iface_i/i.go b/libgo/misc/cgo/testshared/testdata/iface_i/i.go
new file mode 100644 (file)
index 0000000..31c8038
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package iface_i
+
+type I interface {
+       M()
+}
+
+type T struct {
+}
+
+func (t *T) M() {
+}
+
+// *T implements I
diff --git a/libgo/misc/cgo/testshared/testdata/implicit/implicit.go b/libgo/misc/cgo/testshared/testdata/implicit/implicit.go
new file mode 100644 (file)
index 0000000..5360188
--- /dev/null
@@ -0,0 +1,5 @@
+package implicit
+
+func I() int {
+       return 42
+}
diff --git a/libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go b/libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go
new file mode 100644 (file)
index 0000000..4d42967
--- /dev/null
@@ -0,0 +1,10 @@
+package main
+
+import (
+       "testshared/explicit"
+       "testshared/implicit"
+)
+
+func main() {
+       println(implicit.I() + explicit.E())
+}
diff --git a/libgo/misc/cgo/testshared/testdata/issue25065/a.go b/libgo/misc/cgo/testshared/testdata/issue25065/a.go
new file mode 100644 (file)
index 0000000..979350f
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package issue25065 has a type with a method that is
+//  1) referenced in a method expression
+//  2) not called
+//  3) not converted to an interface
+//  4) is a value method but the reference is to the pointer method
+// These cases avoid the call to makefuncsym from typecheckfunc, but we
+// still need to call makefuncsym somehow or the symbol will not be defined.
+package issue25065
+
+type T int
+
+func (t T) M() {}
+
+func F() func(*T) {
+       return (*T).M
+}
diff --git a/libgo/misc/cgo/testshared/testdata/trivial/trivial.go b/libgo/misc/cgo/testshared/testdata/trivial/trivial.go
new file mode 100644 (file)
index 0000000..6ade47c
--- /dev/null
@@ -0,0 +1,9 @@
+package main
+
+func main() {
+       // This is enough to make sure that the executable references
+       // a type descriptor, which was the cause of
+       // https://golang.org/issue/25970.
+       c := make(chan int)
+       _ = c
+}
diff --git a/libgo/misc/cgo/testso/cgoso.c b/libgo/misc/cgo/testso/cgoso.c
deleted file mode 100644 (file)
index 917f472..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "_cgo_export.h"
-
-#ifdef WIN32
-extern void setCallback(void *);
-void init() {
-       setCallback(goCallback);
-}
-#else
-void init() {}
-#endif
diff --git a/libgo/misc/cgo/testso/cgoso.go b/libgo/misc/cgo/testso/cgoso.go
deleted file mode 100644 (file)
index 29814fa..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgosotest
-
-/*
-// intentionally write the same LDFLAGS differently
-// to test correct handling of LDFLAGS.
-#cgo linux LDFLAGS: -L. -lcgosotest
-#cgo dragonfly LDFLAGS: -L. -l cgosotest
-#cgo freebsd LDFLAGS: -L. -l cgosotest
-#cgo openbsd LDFLAGS: -L. -l cgosotest
-#cgo solaris LDFLAGS: -L. -lcgosotest
-#cgo netbsd LDFLAGS: -L. libcgosotest.so
-#cgo darwin LDFLAGS: -L. libcgosotest.dylib
-#cgo windows LDFLAGS: -L. libcgosotest.dll
-
-void init(void);
-void sofunc(void);
-*/
-import "C"
-
-func Test() {
-       C.init()
-       C.sofunc()
-}
-
-//export goCallback
-func goCallback() {
-}
diff --git a/libgo/misc/cgo/testso/cgoso_c.c b/libgo/misc/cgo/testso/cgoso_c.c
deleted file mode 100644 (file)
index 7a38022..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-#ifdef WIN32
-// A Windows DLL is unable to call an arbitrary function in
-// the main executable. Work around that by making the main
-// executable pass the callback function pointer to us.
-void (*goCallback)(void);
-__declspec(dllexport) void setCallback(void *f)
-{
-       goCallback = (void (*)())f;
-}
-__declspec(dllexport) void sofunc(void);
-#else
-extern void goCallback(void);
-void setCallback(void *f) { (void)f; }
-#endif
-
-// OpenBSD and older Darwin lack TLS support
-#if !defined(__OpenBSD__) && !defined(__APPLE__)
-__thread int tlsvar = 12345;
-#endif
-
-void sofunc(void)
-{
-       goCallback();
-}
diff --git a/libgo/misc/cgo/testso/cgoso_unix.go b/libgo/misc/cgo/testso/cgoso_unix.go
deleted file mode 100644 (file)
index 49cdeaa..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd linux netbsd solaris
-
-package cgosotest
-
-/*
-extern int __thread tlsvar;
-int *getTLS() { return &tlsvar; }
-*/
-import "C"
-
-func init() {
-       if v := *C.getTLS(); v != 12345 {
-               println("got", v)
-               panic("BAD TLS value")
-       }
-}
diff --git a/libgo/misc/cgo/testso/main.go b/libgo/misc/cgo/testso/main.go
deleted file mode 100644 (file)
index 88aa432..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import "."
-
-func main() {
-       cgosotest.Test()
-}
diff --git a/libgo/misc/cgo/testso/noso_test.go b/libgo/misc/cgo/testso/noso_test.go
new file mode 100644 (file)
index 0000000..c88aebf
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !cgo
+
+package so_test
+
+// Nothing to test.
diff --git a/libgo/misc/cgo/testso/overlaydir_test.go b/libgo/misc/cgo/testso/overlaydir_test.go
new file mode 100644 (file)
index 0000000..10c874d
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package so_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/testso/so_test.go b/libgo/misc/cgo/testso/so_test.go
new file mode 100644 (file)
index 0000000..9c7f272
--- /dev/null
@@ -0,0 +1,140 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build cgo
+
+package so_test
+
+import (
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "testing"
+)
+
+func requireTestSOSupported(t *testing.T) {
+       t.Helper()
+       switch runtime.GOARCH {
+       case "arm", "arm64":
+               if runtime.GOOS == "darwin" {
+                       t.Skip("No exec facility on iOS.")
+               }
+       case "ppc64":
+               if runtime.GOOS == "linux" {
+                       t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
+               }
+       case "mips64le", "mips64":
+               t.Skip("External linking not implemented on mips64.")
+       }
+       if runtime.GOOS == "android" {
+               t.Skip("No exec facility on Android.")
+       }
+}
+
+func TestSO(t *testing.T) {
+       requireTestSOSupported(t)
+
+       GOPATH, err := ioutil.TempDir("", "cgosotest")
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer os.RemoveAll(GOPATH)
+
+       modRoot := filepath.Join(GOPATH, "src", "cgosotest")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
+       cmd.Dir = modRoot
+       cmd.Stderr = new(strings.Builder)
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err := cmd.Output()
+       if err != nil {
+               t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+       }
+       lines := strings.Split(string(out), "\n")
+       if len(lines) != 3 || lines[2] != "" {
+               t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
+       }
+
+       cc := lines[0]
+       if cc == "" {
+               t.Fatal("CC environment variable (go env CC) cannot be empty")
+       }
+       gogccflags := strings.Split(lines[1], " ")
+
+       // build shared object
+       ext := "so"
+       args := append(gogccflags, "-shared")
+       switch runtime.GOOS {
+       case "darwin":
+               ext = "dylib"
+               args = append(args, "-undefined", "suppress", "-flat_namespace")
+       case "windows":
+               ext = "dll"
+               args = append(args, "-DEXPORT_DLL")
+       case "aix":
+               ext = "so.1"
+       }
+       sofname := "libcgosotest." + ext
+       args = append(args, "-o", sofname, "cgoso_c.c")
+
+       cmd = exec.Command(cc, args...)
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+       if runtime.GOOS == "aix" {
+               // Shared object must be wrapped by an archive
+               cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
+               cmd.Dir = modRoot
+               out, err = cmd.CombinedOutput()
+               if err != nil {
+                       t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+               }
+       }
+
+       cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+       cmd = exec.Command("./main.exe")
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       if runtime.GOOS != "windows" {
+               s := "LD_LIBRARY_PATH"
+               if runtime.GOOS == "darwin" {
+                       s = "DYLD_LIBRARY_PATH"
+               }
+               cmd.Env = append(os.Environ(), s+"=.")
+
+               // On FreeBSD 64-bit architectures, the 32-bit linker looks for
+               // different environment variables.
+               if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+                       cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
+               }
+       }
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/testso/testdata/cgoso.c b/libgo/misc/cgo/testso/testdata/cgoso.c
new file mode 100644 (file)
index 0000000..612e5d3
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "_cgo_export.h"
+
+#if defined(WIN32) || defined(_AIX)
+extern void setCallback(void *);
+void init() {
+       setCallback(goCallback);
+}
+#else
+void init() {}
+#endif
diff --git a/libgo/misc/cgo/testso/testdata/cgoso.go b/libgo/misc/cgo/testso/testdata/cgoso.go
new file mode 100644 (file)
index 0000000..bba5de3
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgosotest
+
+/*
+// intentionally write the same LDFLAGS differently
+// to test correct handling of LDFLAGS.
+#cgo linux LDFLAGS: -L. -lcgosotest
+#cgo dragonfly LDFLAGS: -L. -l cgosotest
+#cgo freebsd LDFLAGS: -L. -l cgosotest
+#cgo openbsd LDFLAGS: -L. -l cgosotest
+#cgo solaris LDFLAGS: -L. -lcgosotest
+#cgo netbsd LDFLAGS: -L. libcgosotest.so
+#cgo darwin LDFLAGS: -L. libcgosotest.dylib
+#cgo windows LDFLAGS: -L. libcgosotest.dll
+#cgo aix LDFLAGS: -L. -l cgosotest
+
+void init(void);
+void sofunc(void);
+*/
+import "C"
+
+func Test() {
+       C.init()
+       C.sofunc()
+}
+
+//export goCallback
+func goCallback() {
+}
diff --git a/libgo/misc/cgo/testso/testdata/cgoso_c.c b/libgo/misc/cgo/testso/testdata/cgoso_c.c
new file mode 100644 (file)
index 0000000..e5015ed
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+#ifdef WIN32
+// A Windows DLL is unable to call an arbitrary function in
+// the main executable. Work around that by making the main
+// executable pass the callback function pointer to us.
+void (*goCallback)(void);
+__declspec(dllexport) void setCallback(void *f)
+{
+       goCallback = (void (*)())f;
+}
+__declspec(dllexport) void sofunc(void);
+#elif defined(_AIX)
+// AIX doesn't allow the creation of a shared object with an
+// undefined symbol. It's possible to bypass this problem by
+// using -Wl,-G and -Wl,-brtl option which allows run-time linking.
+// However, that's not how most of AIX shared object works.
+// Therefore, it's better to consider goCallback as a pointer and
+// to set up during an init function.
+void (*goCallback)(void);
+void setCallback(void *f) { goCallback = f; }
+#else
+extern void goCallback(void);
+void setCallback(void *f) { (void)f; }
+#endif
+
+// OpenBSD and older Darwin lack TLS support
+#if !defined(__OpenBSD__) && !defined(__APPLE__)
+__thread int tlsvar = 12345;
+#endif
+
+void sofunc(void)
+{
+       goCallback();
+}
diff --git a/libgo/misc/cgo/testso/testdata/cgoso_unix.go b/libgo/misc/cgo/testso/testdata/cgoso_unix.go
new file mode 100644 (file)
index 0000000..1860694
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix dragonfly freebsd linux netbsd solaris
+
+package cgosotest
+
+/*
+extern int __thread tlsvar;
+int *getTLS() { return &tlsvar; }
+*/
+import "C"
+
+func init() {
+       if v := *C.getTLS(); v != 12345 {
+               println("got", v)
+               panic("BAD TLS value")
+       }
+}
diff --git a/libgo/misc/cgo/testso/testdata/main.go b/libgo/misc/cgo/testso/testdata/main.go
new file mode 100644 (file)
index 0000000..963d451
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+import "cgosotest"
+
+func main() {
+       cgosotest.Test()
+}
diff --git a/libgo/misc/cgo/testsovar/cgoso.go b/libgo/misc/cgo/testsovar/cgoso.go
deleted file mode 100644 (file)
index 88d44c2..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgosotest
-
-// This test verifies that Go can access C variables
-// in shared object file via cgo.
-
-/*
-// intentionally write the same LDFLAGS differently
-// to test correct handling of LDFLAGS.
-#cgo windows CFLAGS: -DIMPORT_DLL
-#cgo linux LDFLAGS: -L. -lcgosotest
-#cgo dragonfly LDFLAGS: -L. -l cgosotest
-#cgo freebsd LDFLAGS: -L. -l cgosotest
-#cgo openbsd LDFLAGS: -L. -l cgosotest
-#cgo solaris LDFLAGS: -L. -lcgosotest
-#cgo netbsd LDFLAGS: -L. libcgosotest.so
-#cgo darwin LDFLAGS: -L. libcgosotest.dylib
-#cgo windows LDFLAGS: -L. libcgosotest.dll
-
-#include "cgoso_c.h"
-
-const char* getVar() {
-           return exported_var;
-}
-*/
-import "C"
-
-import "fmt"
-
-func Test() {
-       const want = "Hello world"
-       got := C.GoString(C.getVar())
-       if got != want {
-               panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
-       }
-       got = C.GoString(C.exported_var)
-       if got != want {
-               panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
-       }
-}
diff --git a/libgo/misc/cgo/testsovar/cgoso_c.c b/libgo/misc/cgo/testsovar/cgoso_c.c
deleted file mode 100644 (file)
index a448c01..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-const char *exported_var = "Hello world";
diff --git a/libgo/misc/cgo/testsovar/cgoso_c.h b/libgo/misc/cgo/testsovar/cgoso_c.h
deleted file mode 100644 (file)
index 640db7b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-#ifdef WIN32
-#if defined(EXPORT_DLL)
-#    define VAR __declspec(dllexport)
-#elif defined(IMPORT_DLL)
-#    define VAR __declspec(dllimport)
-#endif
-#else
-#    define VAR extern
-#endif
-
-VAR const char *exported_var;
diff --git a/libgo/misc/cgo/testsovar/main.go b/libgo/misc/cgo/testsovar/main.go
deleted file mode 100644 (file)
index 9c8a1c4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import "."
-
-func main() {
-       cgosotest.Test()
-}
diff --git a/libgo/misc/cgo/testsovar/noso_test.go b/libgo/misc/cgo/testsovar/noso_test.go
new file mode 100644 (file)
index 0000000..c88aebf
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !cgo
+
+package so_test
+
+// Nothing to test.
diff --git a/libgo/misc/cgo/testsovar/overlaydir_test.go b/libgo/misc/cgo/testsovar/overlaydir_test.go
new file mode 100644 (file)
index 0000000..10c874d
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package so_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/libgo/misc/cgo/testsovar/so_test.go b/libgo/misc/cgo/testsovar/so_test.go
new file mode 100644 (file)
index 0000000..9c7f272
--- /dev/null
@@ -0,0 +1,140 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build cgo
+
+package so_test
+
+import (
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "testing"
+)
+
+func requireTestSOSupported(t *testing.T) {
+       t.Helper()
+       switch runtime.GOARCH {
+       case "arm", "arm64":
+               if runtime.GOOS == "darwin" {
+                       t.Skip("No exec facility on iOS.")
+               }
+       case "ppc64":
+               if runtime.GOOS == "linux" {
+                       t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
+               }
+       case "mips64le", "mips64":
+               t.Skip("External linking not implemented on mips64.")
+       }
+       if runtime.GOOS == "android" {
+               t.Skip("No exec facility on Android.")
+       }
+}
+
+func TestSO(t *testing.T) {
+       requireTestSOSupported(t)
+
+       GOPATH, err := ioutil.TempDir("", "cgosotest")
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer os.RemoveAll(GOPATH)
+
+       modRoot := filepath.Join(GOPATH, "src", "cgosotest")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
+       cmd.Dir = modRoot
+       cmd.Stderr = new(strings.Builder)
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err := cmd.Output()
+       if err != nil {
+               t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+       }
+       lines := strings.Split(string(out), "\n")
+       if len(lines) != 3 || lines[2] != "" {
+               t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
+       }
+
+       cc := lines[0]
+       if cc == "" {
+               t.Fatal("CC environment variable (go env CC) cannot be empty")
+       }
+       gogccflags := strings.Split(lines[1], " ")
+
+       // build shared object
+       ext := "so"
+       args := append(gogccflags, "-shared")
+       switch runtime.GOOS {
+       case "darwin":
+               ext = "dylib"
+               args = append(args, "-undefined", "suppress", "-flat_namespace")
+       case "windows":
+               ext = "dll"
+               args = append(args, "-DEXPORT_DLL")
+       case "aix":
+               ext = "so.1"
+       }
+       sofname := "libcgosotest." + ext
+       args = append(args, "-o", sofname, "cgoso_c.c")
+
+       cmd = exec.Command(cc, args...)
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+       if runtime.GOOS == "aix" {
+               // Shared object must be wrapped by an archive
+               cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
+               cmd.Dir = modRoot
+               out, err = cmd.CombinedOutput()
+               if err != nil {
+                       t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+               }
+       }
+
+       cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+       cmd = exec.Command("./main.exe")
+       cmd.Dir = modRoot
+       cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+       if runtime.GOOS != "windows" {
+               s := "LD_LIBRARY_PATH"
+               if runtime.GOOS == "darwin" {
+                       s = "DYLD_LIBRARY_PATH"
+               }
+               cmd.Env = append(os.Environ(), s+"=.")
+
+               // On FreeBSD 64-bit architectures, the 32-bit linker looks for
+               // different environment variables.
+               if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+                       cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
+               }
+       }
+       out, err = cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/testsovar/testdata/cgoso.go b/libgo/misc/cgo/testsovar/testdata/cgoso.go
new file mode 100644 (file)
index 0000000..9c7f95e
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgosotest
+
+// This test verifies that Go can access C variables
+// in shared object file via cgo.
+
+/*
+// intentionally write the same LDFLAGS differently
+// to test correct handling of LDFLAGS.
+#cgo windows CFLAGS: -DIMPORT_DLL
+#cgo linux LDFLAGS: -L. -lcgosotest
+#cgo dragonfly LDFLAGS: -L. -l cgosotest
+#cgo freebsd LDFLAGS: -L. -l cgosotest
+#cgo openbsd LDFLAGS: -L. -l cgosotest
+#cgo solaris LDFLAGS: -L. -lcgosotest
+#cgo netbsd LDFLAGS: -L. libcgosotest.so
+#cgo darwin LDFLAGS: -L. libcgosotest.dylib
+#cgo windows LDFLAGS: -L. libcgosotest.dll
+#cgo aix LDFLAGS: -L. -l cgosotest
+
+#include "cgoso_c.h"
+
+const char* getVar() {
+           return exported_var;
+}
+*/
+import "C"
+
+import "fmt"
+
+func Test() {
+       const want = "Hello world"
+       got := C.GoString(C.getVar())
+       if got != want {
+               panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
+       }
+       got = C.GoString(C.exported_var)
+       if got != want {
+               panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
+       }
+}
diff --git a/libgo/misc/cgo/testsovar/testdata/cgoso_c.c b/libgo/misc/cgo/testsovar/testdata/cgoso_c.c
new file mode 100644 (file)
index 0000000..a448c01
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+const char *exported_var = "Hello world";
diff --git a/libgo/misc/cgo/testsovar/testdata/cgoso_c.h b/libgo/misc/cgo/testsovar/testdata/cgoso_c.h
new file mode 100644 (file)
index 0000000..640db7b
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+#ifdef WIN32
+#if defined(EXPORT_DLL)
+#    define VAR __declspec(dllexport)
+#elif defined(IMPORT_DLL)
+#    define VAR __declspec(dllimport)
+#endif
+#else
+#    define VAR extern
+#endif
+
+VAR const char *exported_var;
diff --git a/libgo/misc/cgo/testsovar/testdata/main.go b/libgo/misc/cgo/testsovar/testdata/main.go
new file mode 100644 (file)
index 0000000..87b52ce
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+import "cgosotest"
+
+func main() {
+       cgosotest.Test()
+}
index f1aa7241cd6eb6f0d603e2c5b60078498a2ad109..0a5e29ed4ba40750fa840e309c6d8977ee81cf4c 100755 (executable)
@@ -86,13 +86,11 @@ echo $timespec | \
       -e 's/tv_sec *[a-zA-Z0-9_]*/tv_sec timespec_sec_t/' \
       -e 's/tv_nsec *[a-zA-Z0-9_]*/tv_nsec timespec_nsec_t/' >> ${OUT}
 echo >> ${OUT}
-echo "func (ts *timespec) set_sec(x int64) {" >> ${OUT}
-echo " ts.tv_sec = timespec_sec_t(x)" >> ${OUT}
+echo "func (ts *timespec) setNsec(ns int64) {" >> ${OUT}
+echo " ts.tv_sec = timespec_sec_t(ns / 1e9)" >> ${OUT}
+echo " ts.tv_nsec = timespec_nsec_t(ns % 1e9)" >> ${OUT}
 echo "}" >> ${OUT}
 echo >> ${OUT}
-echo "func (ts *timespec) set_nsec(x int32) {" >> ${OUT}
-echo " ts.tv_nsec = timespec_nsec_t(x)" >> ${OUT}
-echo "}" >> ${OUT}
 
 # Define the epollevent struct.  This needs special attention because
 # the C definition uses a union and is sometimes packed.
index 1d85050472318f701a60411a571c4646edc585ca..22f091be3f428625003745e420fbfd87c89c57ff 100644 (file)
@@ -25,21 +25,6 @@ __go_fieldtrack (byte *p __attribute__ ((unused)))
 /* A runtime function to add all the tracked fields to a
    map[string]bool.  */
 
-extern const char _etext[] __attribute__ ((weak));
-extern const char _edata[] __attribute__ ((weak));
-#ifdef _AIX
-// Following symbols do not exist on AIX
-const char *__etext = NULL;
-const char *__data_start = NULL;
-const char *__edata = NULL;
-const char *__bss_start = NULL;
-#else
-extern const char __etext[] __attribute__ ((weak));
-extern const char __data_start[] __attribute__ ((weak));
-extern const char __edata[] __attribute__ ((weak));
-extern const char __bss_start[] __attribute__ ((weak));
-#endif
-
 extern void *mapassign (const struct maptype *, void *hmap, const void *key)
   __asm__ (GOSYM_PREFIX "runtime.mapassign");
 
index 90255059fcc151a44dee494358e8abdd596d4506..48382194dfab61338adfa1d5fa8f5dd3015e341c 100644 (file)
@@ -16,23 +16,34 @@ runtime_throw(const char *s)
 void
 runtime_panicstring(const char *s)
 {
-       M* mp;
+       G *gp;
        Eface err;
 
-       mp = runtime_m();
-       if (mp != nil) {
-               if(mp->mallocing) {
-                       runtime_printf("panic: %s\n", s);
-                       runtime_throw("panic during malloc");
-               }
-               if(mp->gcing) {
-                       runtime_printf("panic: %s\n", s);
-                       runtime_throw("panic during gc");
-               }
-               if(mp->locks) {
-                       runtime_printf("panic: %s\n", s);
-                       runtime_throw("panic holding locks");
-               }
+       gp = runtime_g();
+       if (gp == nil) {
+               runtime_printf("panic: %s\n", s);
+               runtime_throw("panic with no g");
+       }
+       if (gp->m == nil) {
+               runtime_printf("panic: %s\n", s);
+               runtime_throw("panic with no m");
+       }
+       if (gp->m->curg != gp) {
+               runtime_printf("panic: %s\n", s);
+               runtime_throw("panic on system stack");
+       }
+       if (gp->m->mallocing != 0) {
+               runtime_printf("panic: %s\n", s);
+               runtime_throw("panic during malloc");
+       }
+       if (gp->m->preemptoff.len != 0) {
+               runtime_printf("panic: %s\n", s);
+               runtime_printf("preempt off reason: %S\n", gp->m->preemptoff);
+               runtime_throw("panic during preemptoff");
+       }
+       if (gp->m->locks != 0) {
+               runtime_printf("panic: %s\n", s);
+               runtime_throw("panic holding locks");
        }
        runtime_newErrorCString((uintptr) s, &err);
        runtime_panic(err);
index 8ff578ecf82598d827150da76ca5a71a8fb7b8e1..399df51014587abf8c664407aee756e781bce1a9 100644 (file)
@@ -502,3 +502,19 @@ void __go_makecontext(__go_context_t*, void (*)(), void*, size_t);
 #define __go_makecontext(c, fn, sp, size) \
        ((c)->uc_stack.ss_sp = sp, (c)->uc_stack.ss_size = size, makecontext(c, fn, 0))
 #endif
+
+// Symbols defined by the linker.
+extern const char _etext[] __attribute__ ((weak));
+extern const char _edata[] __attribute__ ((weak));
+#ifdef _AIX
+// Following symbols do not exist on AIX
+#define __etext nil
+#define __data_start nil
+#define __edata nil
+#define __bss_start nil
+#else
+extern const char __etext[] __attribute__ ((weak));
+extern const char __data_start[] __attribute__ ((weak));
+extern const char __edata[] __attribute__ ((weak));
+extern const char __bss_start[] __attribute__ ((weak));
+#endif
index 6d77af4b067f44249c7ae216ffdc98b0d8a5d0ce..7531431342c27a8a933ec726b27b386ea8fa3fcd 100644 (file)
@@ -186,6 +186,38 @@ getEnd()
   return end;
 }
 
+// Return an address that is before the read-only data section.
+// Unfortunately there is no standard symbol for this so we use a text
+// address.
+
+uintptr getText(void)
+  __asm__ (GOSYM_PREFIX "runtime.getText");
+
+uintptr
+getText(void)
+{
+  return (uintptr)(const void *)(getText);
+}
+
+// Return the end of the text segment, assumed to come after the
+// read-only data section.
+
+uintptr getEtext(void)
+  __asm__ (GOSYM_PREFIX "runtime.getEtext");
+
+uintptr
+getEtext(void)
+{
+  const void *p;
+
+  p = __data_start;
+  if (p == nil)
+    p = __etext;
+  if (p == nil)
+    p = _etext;
+  return (uintptr)(p);
+}
+
 // CPU-specific initialization.
 // Fetch CPUID info on x86.
 
index 5256bb6cb63ccbd753861de701cad0d6b3e6afb1..60bead5e7d6288619b47bdbb942f69d733cdd790 100755 (executable)
@@ -326,7 +326,7 @@ x)
            esac
 
            if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
-               tags=`sed '/^package /q' < $f | grep '^// +build '`
+               tags=`sed '/^package /q' < $f | grep '^// \?+build '`
                omatch=true
                first=true
                match=false
@@ -334,7 +334,7 @@ x)
                    case $tag in
                    "//")
                        ;;
-                   "+build")
+                   "+build" | "//+build")
                        if test "$first" = "true"; then
                            first=false
                        elif test "$match" = "false"; then